@homebound/beam 2.392.0 → 2.394.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/index.js CHANGED
@@ -13707,7 +13707,7 @@ var variantStyles2 = {
13707
13707
  };
13708
13708
 
13709
13709
  // src/components/BeamContext.tsx
13710
- import { createContext as createContext6, useContext as useContext15, useMemo as useMemo33, useReducer, useRef as useRef43 } from "react";
13710
+ import { createContext as createContext6, useContext as useContext15, useMemo as useMemo35, useReducer, useRef as useRef43 } from "react";
13711
13711
  import { OverlayProvider } from "react-aria";
13712
13712
 
13713
13713
  // src/components/Modal/Modal.tsx
@@ -15257,7 +15257,7 @@ import { AnimatePresence as AnimatePresence2, motion as motion2 } from "framer-m
15257
15257
  import { useState as useState31 } from "react";
15258
15258
  import { Fragment as Fragment21, jsx as jsx119, jsxs as jsxs57 } from "@emotion/react/jsx-runtime";
15259
15259
  var RIGHT_SIDEBAR_MIN_WIDTH = "250px";
15260
- function RightSidebar({ content }) {
15260
+ function RightSidebar({ content, headerHeightPx: headerHeightPx2 }) {
15261
15261
  const [selectedIcon, setSelectedIcon] = useState31(void 0);
15262
15262
  const tid = useTestIds({}, "rightSidebar");
15263
15263
  return /* @__PURE__ */ jsxs57(Fragment21, { children: [
@@ -15279,23 +15279,25 @@ function RightSidebar({ content }) {
15279
15279
  animate: { x: 0, opacity: 1 },
15280
15280
  transition: { delay: 0.2, ease: [0.51, 0.92, 0.24, 1], duration: 0.3 },
15281
15281
  exit: { transition: { ease: "linear", duration: 0.2 }, x: "100%" },
15282
- css: Css.w100.mw(RIGHT_SIDEBAR_MIN_WIDTH).z0.$,
15283
- children: /* @__PURE__ */ jsxs57("div", { css: Css.relative.z0.px3.$, children: [
15284
- /* @__PURE__ */ jsxs57("div", { css: Css.absolute.leftPx(-24).top0.$, children: [
15285
- /* @__PURE__ */ jsx119(
15286
- IconButton,
15287
- {
15288
- bgColor: "rgba(255,255,255,1)" /* White */,
15289
- circle: true,
15290
- onClick: () => setSelectedIcon(void 0),
15291
- icon: "x",
15292
- inc: 3.5
15293
- }
15294
- ),
15295
- /* @__PURE__ */ jsx119("div", { css: Css.absolute.topPx(48).leftPx(23).h("calc(100vh - 168px)").wPx(1).bgGray300.$ })
15282
+ css: Css.w100.mw(RIGHT_SIDEBAR_MIN_WIDTH).z0.maxh(`calc(100vh - ${headerHeightPx2}px)`).oya.pl4.pr3.$,
15283
+ children: /* @__PURE__ */ jsxs57(Fragment21, { children: [
15284
+ /* @__PURE__ */ jsxs57("div", { css: Css.sticky.top0.bgWhite.$, children: [
15285
+ /* @__PURE__ */ jsxs57("div", { css: Css.absolute.leftPx(-24).top0.df.fdc.aic.$, children: [
15286
+ /* @__PURE__ */ jsx119(
15287
+ IconButton,
15288
+ {
15289
+ bgColor: "rgba(255,255,255,1)" /* White */,
15290
+ circle: true,
15291
+ onClick: () => setSelectedIcon(void 0),
15292
+ icon: "x",
15293
+ inc: 3.5
15294
+ }
15295
+ ),
15296
+ /* @__PURE__ */ jsx119("div", { css: Css.absolute.topPx(48).h("calc(100vh - 168px)").wPx(1).bgGray300.$ })
15297
+ ] }),
15298
+ /* @__PURE__ */ jsx119("div", { css: Css.df.aic.jcfe.gap2.mb3.$, children: /* @__PURE__ */ jsx119(IconButtonList, { content, selectedIcon, onIconClick: setSelectedIcon }) })
15296
15299
  ] }),
15297
- /* @__PURE__ */ jsx119("div", { css: Css.df.aic.jcfe.gap2.mb3.$, children: /* @__PURE__ */ jsx119(IconButtonList, { content, selectedIcon, onIconClick: setSelectedIcon }) }),
15298
- selectedIcon && /* @__PURE__ */ jsx119("div", { ...tid.content, children: content.find((sidebar) => sidebar.icon === selectedIcon)?.render() })
15300
+ selectedIcon && /* @__PURE__ */ jsx119("div", { ...tid.content, css: Css.pl3.$, children: content.find((sidebar) => sidebar.icon === selectedIcon)?.render() })
15299
15301
  ] })
15300
15302
  },
15301
15303
  "rightSidebar"
@@ -15355,7 +15357,7 @@ function FormPageLayoutComponent(props) {
15355
15357
  /* @__PURE__ */ jsx121(PageHeader, { ...props, ...tids.pageHeader }),
15356
15358
  /* @__PURE__ */ jsx121(LeftNav, { sectionsWithRefs, ...tids }),
15357
15359
  /* @__PURE__ */ jsx121(FormSections, { sectionsWithRefs, formState, ...tids }),
15358
- rightSideBar && /* @__PURE__ */ jsx121("aside", { css: Css.gr(2).gc("3 / 4").sticky.topPx(headerHeightPx).$, children: /* @__PURE__ */ jsx121(RightSidebar, { content: rightSideBar }) })
15360
+ rightSideBar && /* @__PURE__ */ jsx121("aside", { css: Css.gr(2).gc("3 / 4").sticky.topPx(headerHeightPx).$, children: /* @__PURE__ */ jsx121(RightSidebar, { content: rightSideBar, headerHeightPx }) })
15359
15361
  ] }) })
15360
15362
  );
15361
15363
  }
@@ -15584,1336 +15586,1514 @@ function FullBleed({ children, omitPadding = false }) {
15584
15586
  });
15585
15587
  }
15586
15588
 
15587
- // src/components/Layout/PreventBrowserScroll.tsx
15588
- import { jsx as jsx123 } from "@emotion/react/jsx-runtime";
15589
- function PreventBrowserScroll({ children }) {
15590
- return (
15591
- // Take over the full viewport and hide any overflown content.
15592
- // Using `-webkit-fill-available`, otherwise `height: 100vh` includes the app bars in mobile Safari. See https://allthingssmitty.com/2020/05/11/css-fix-for-100vh-in-mobile-webkit/
15593
- // Setting the multiple "(min|max-)height" properties is necessary, as Truss will turn this into an object and there can only be one `height` property.
15594
- /* @__PURE__ */ jsx123("div", { css: Css.oh.vh100.mh("-webkit-fill-available").maxh("-webkit-fill-available").$, children: /* @__PURE__ */ jsx123("div", { css: Css.h100.df.fdc.mh0.oa.$, children }) })
15595
- );
15596
- }
15589
+ // src/components/Layout/GridTableLayout/GridTableLayout.tsx
15590
+ import React14, { useEffect as useEffect25, useState as useState35 } from "react";
15597
15591
 
15598
- // src/components/Layout/RightPaneLayout/RightPaneContext.tsx
15599
- import React14, { useCallback as useCallback18, useContext as useContext13, useMemo as useMemo31, useState as useState34 } from "react";
15600
- import { jsx as jsx124 } from "@emotion/react/jsx-runtime";
15601
- var RightPaneContext = React14.createContext({
15602
- openInPane: () => {
15603
- },
15604
- closePane: () => {
15605
- },
15606
- clearPane: () => {
15607
- },
15608
- isRightPaneOpen: false,
15609
- rightPaneContent: null
15610
- });
15611
- function RightPaneProvider({ children }) {
15612
- const [rightPaneContent, setRightPaneContent] = useState34(void 0);
15613
- const [isRightPaneOpen, setIsRightPaneOpen] = useState34(false);
15614
- const openInPane = useCallback18(
15615
- (opts) => {
15616
- setRightPaneContent(opts?.content);
15617
- setIsRightPaneOpen(true);
15618
- },
15619
- [setRightPaneContent]
15620
- );
15621
- const closePane = useCallback18(() => setIsRightPaneOpen(false), []);
15622
- const clearPane = useCallback18(() => setRightPaneContent(void 0), [setRightPaneContent]);
15623
- const context = useMemo31(
15624
- () => ({ openInPane, closePane, clearPane, rightPaneContent, isRightPaneOpen }),
15625
- [openInPane, closePane, rightPaneContent, clearPane, isRightPaneOpen]
15626
- );
15627
- return /* @__PURE__ */ jsx124(RightPaneContext.Provider, { value: context, children });
15628
- }
15629
- function useRightPaneContext() {
15630
- return useContext13(RightPaneContext);
15592
+ // src/components/Filters/Filters.tsx
15593
+ import { memo, useMemo as useMemo31 } from "react";
15594
+
15595
+ // src/components/Filters/BaseFilter.ts
15596
+ var BaseFilter = class {
15597
+ constructor(key, props) {
15598
+ this.key = key;
15599
+ this.props = props;
15600
+ }
15601
+ get label() {
15602
+ return this.props.label || defaultLabel(this.key);
15603
+ }
15604
+ get defaultValue() {
15605
+ return this.props.defaultValue;
15606
+ }
15607
+ testId(tid) {
15608
+ return tid[defaultTestId(this.label)];
15609
+ }
15610
+ };
15611
+
15612
+ // src/components/Filters/DateFilter.tsx
15613
+ import { Fragment as Fragment23, jsx as jsx123, jsxs as jsxs61 } from "@emotion/react/jsx-runtime";
15614
+ function dateFilter(props) {
15615
+ return (key) => new DateFilter(key, props);
15631
15616
  }
15617
+ var anyOption = {};
15618
+ var DateFilter = class extends BaseFilter {
15619
+ render(value, setValue, tid, inModal, vertical) {
15620
+ const { label, operations, getOperationValue, getOperationLabel } = this.props;
15621
+ return /* @__PURE__ */ jsxs61(Fragment23, { children: [
15622
+ vertical && /* @__PURE__ */ jsx123(Label, { label }),
15623
+ /* @__PURE__ */ jsxs61(CompoundField, { children: [
15624
+ /* @__PURE__ */ jsx123(
15625
+ SelectField,
15626
+ {
15627
+ compact: true,
15628
+ sizeToContent: true,
15629
+ options: [
15630
+ // Always show the 'Any' option
15631
+ anyOption,
15632
+ ...operations
15633
+ ],
15634
+ getOptionValue: (o) => o === anyOption ? void 0 : getOperationValue(o),
15635
+ getOptionLabel: (o) => o === anyOption ? "Any" : getOperationLabel(o),
15636
+ value: value?.op,
15637
+ onSelect: (op) => (
15638
+ // default the selected date to today if it doesn't exist in the filter's value
15639
+ setValue(op ? { op, value: value?.value ? new Date(value.value) : /* @__PURE__ */ new Date() } : void 0)
15640
+ ),
15641
+ label: inModal ? `${label} date filter operation` : label,
15642
+ labelStyle: !inModal && !vertical ? "inline" : inModal || vertical ? "hidden" : "above",
15643
+ nothingSelectedText: "Any",
15644
+ ...tid[`${defaultTestId(this.label)}_dateOperation`]
15645
+ }
15646
+ ),
15647
+ /* @__PURE__ */ jsx123(
15648
+ DateField,
15649
+ {
15650
+ compact: true,
15651
+ labelStyle: "inline",
15652
+ value: value?.value ? new Date(value.value) : /* @__PURE__ */ new Date(),
15653
+ label: "Date",
15654
+ onChange: (d) => setValue({ ...value, value: d }),
15655
+ disabled: !value,
15656
+ ...tid[`${defaultTestId(this.label)}_dateField`]
15657
+ }
15658
+ )
15659
+ ] })
15660
+ ] });
15661
+ }
15662
+ };
15632
15663
 
15633
- // src/components/Layout/RightPaneLayout/RightPaneLayout.tsx
15634
- import { AnimatePresence as AnimatePresence3, motion as motion3 } from "framer-motion";
15635
- import { useEffect as useEffect23 } from "react";
15636
- import { Fragment as Fragment23, jsx as jsx125, jsxs as jsxs61 } from "@emotion/react/jsx-runtime";
15637
- function RightPaneLayout(props) {
15638
- const { children, paneBgColor = "rgba(255,255,255,1)" /* White */, paneWidth = 450, defaultPaneContent } = props;
15639
- const { isRightPaneOpen, rightPaneContent, clearPane, closePane } = useRightPaneContext();
15640
- useEffect23(() => closePane, [closePane]);
15641
- return /* @__PURE__ */ jsx125("div", { css: Css.h100.df.oxh.$, children: /* @__PURE__ */ jsxs61(Fragment23, { children: [
15642
- /* @__PURE__ */ jsx125(
15643
- "div",
15644
- {
15645
- css: {
15646
- ...Css.w(`calc(100% - ${paneWidth + 24}px)`).add("transition", "width .2s linear").h100.mr3.oxa.$,
15647
- ...Css.if(!isRightPaneOpen).w100.mr0.$,
15648
- ...Css.if(!!defaultPaneContent).w(`calc(100% - ${paneWidth + 24}px)`).mr3.$
15649
- },
15650
- children
15651
- }
15652
- ),
15653
- /* @__PURE__ */ jsxs61("div", { css: Css.relative.if(!!defaultPaneContent).wPx(paneWidth).$, children: [
15654
- defaultPaneContent && /* @__PURE__ */ jsx125(
15655
- "div",
15664
+ // src/components/Filters/DateRangeFilter.tsx
15665
+ import { Fragment as Fragment24, jsx as jsx124, jsxs as jsxs62 } from "@emotion/react/jsx-runtime";
15666
+ function dateRangeFilter(props) {
15667
+ return (key) => new DateRangeFilter(key, props);
15668
+ }
15669
+ var DateRangeFilter = class extends BaseFilter {
15670
+ render(value, setValue, tid, inModal, vertical) {
15671
+ const { label, placeholderText, disabledDays, testFieldLabel, defaultValue } = this.props;
15672
+ return /* @__PURE__ */ jsxs62(Fragment24, { children: [
15673
+ vertical && /* @__PURE__ */ jsx124(Label, { label }),
15674
+ /* @__PURE__ */ jsx124(
15675
+ DateRangeField,
15656
15676
  {
15657
- css: Css.h100.wPx(paneWidth).left(0).absolute.add("transition", "all .3s ease-in-out").if(isRightPaneOpen).add("opacity", 0).left(100).$,
15658
- children: defaultPaneContent
15677
+ compact: true,
15678
+ labelStyle: "inline",
15679
+ isRangeFilterField: true,
15680
+ placeholder: placeholderText,
15681
+ label: testFieldLabel ?? "Date",
15682
+ value: value?.value ? { from: new Date(value.value.from), to: new Date(value.value.to) } : void 0,
15683
+ onChange: (d) => d ? setValue({ op: defaultValue?.op, value: d }) : setValue(void 0),
15684
+ disabledDays,
15685
+ ...tid[`${defaultTestId(this.label)}_dateField`]
15659
15686
  }
15660
- ),
15661
- /* @__PURE__ */ jsx125(AnimatePresence3, { children: isRightPaneOpen && /* @__PURE__ */ jsx125(
15662
- motion3.div,
15663
- {
15664
- layout: "position",
15665
- "data-testid": "rightPaneContent",
15666
- css: Css.bgColor(paneBgColor).h100.wPx(paneWidth).$,
15667
- initial: { x: paneWidth + 24, position: "absolute" },
15668
- animate: { x: 0 },
15669
- transition: { ease: "linear", duration: 0.2 },
15670
- exit: { transition: { ease: "linear", duration: 0.2 }, x: paneWidth },
15671
- onAnimationComplete: (definition) => definition.x !== 0 && clearPane(),
15672
- children: rightPaneContent
15673
- },
15674
- "rightPane"
15675
- ) })
15676
- ] })
15677
- ] }) });
15678
- }
15687
+ )
15688
+ ] });
15689
+ }
15690
+ };
15679
15691
 
15680
- // src/components/Layout/RightPaneLayout/useRightPane.tsx
15681
- function useRightPane() {
15682
- const { openInPane, closePane } = useRightPaneContext();
15683
- return {
15684
- openRightPane: openInPane,
15685
- closeRightPane: closePane
15686
- };
15692
+ // src/components/Filters/MultiFilter.tsx
15693
+ import { jsx as jsx125 } from "@emotion/react/jsx-runtime";
15694
+ function multiFilter(props) {
15695
+ return (key) => new MultiFilter(key, props);
15687
15696
  }
15688
-
15689
- // src/components/Layout/ScrollableContent.tsx
15690
- import { useEffect as useEffect24 } from "react";
15691
- import { createPortal as createPortal4 } from "react-dom";
15692
- import { Fragment as Fragment24, jsx as jsx126 } from "@emotion/react/jsx-runtime";
15693
- function ScrollableContent(props) {
15694
- const { children, virtualized = false, omitBottomPadding, bgColor } = props;
15695
- const { scrollableEl, setPortalTick, pl, pr } = useScrollableParent();
15696
- useEffect24(() => {
15697
- setPortalTick((prev) => prev + 1);
15698
- return () => setPortalTick((prev) => prev + 1);
15699
- }, [setPortalTick]);
15700
- if (!scrollableEl) {
15701
- return /* @__PURE__ */ jsx126(Fragment24, { children });
15702
- }
15703
- return createPortal4(
15704
- /* @__PURE__ */ jsx126(
15705
- "div",
15697
+ var MultiFilter = class extends BaseFilter {
15698
+ render(value, setValue, tid, inModal, vertical) {
15699
+ if (inModal && Array.isArray(this.props.options) && this.props.options.length > 0 && this.props.options.length <= 8) {
15700
+ const { disabledOptions } = this.props;
15701
+ const disabledOptionsWithReasons = Object.fromEntries(disabledOptions?.map(disabledOptionToKeyedTuple) ?? []);
15702
+ const disabledKeys = Object.keys(disabledOptionsWithReasons);
15703
+ return /* @__PURE__ */ jsx125(
15704
+ ToggleChipGroup,
15705
+ {
15706
+ label: this.label,
15707
+ options: this.props.options.map((o) => {
15708
+ const value2 = this.props.getOptionValue(o);
15709
+ const disabled = value2 && disabledKeys.includes(value2.toString());
15710
+ const disabledReason = disabled ? disabledOptionsWithReasons[value2.toString()] : void 0;
15711
+ return {
15712
+ label: this.props.getOptionLabel(o),
15713
+ value: value2,
15714
+ disabled: disabledReason ?? disabled
15715
+ };
15716
+ }),
15717
+ onChange: (values) => {
15718
+ setValue(values.length === 0 ? void 0 : values);
15719
+ },
15720
+ values: value || [],
15721
+ labelStyle: "hidden",
15722
+ ...tid[defaultTestId(this.label)]
15723
+ }
15724
+ );
15725
+ }
15726
+ const { defaultValue, nothingSelectedText, ...props } = this.props;
15727
+ return /* @__PURE__ */ jsx125(
15728
+ MultiSelectField,
15706
15729
  {
15707
- css: {
15708
- ...Css.h100.pr(pr).pl(pl).if(virtualized).pr0.$,
15709
- ...bgColor && Css.bgColor(bgColor).$,
15710
- ...!omitBottomPadding && !virtualized && scrollContainerBottomPadding
15730
+ ...props,
15731
+ compact: !vertical,
15732
+ label: this.label,
15733
+ values: value || [],
15734
+ labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
15735
+ sizeToContent: !inModal && !vertical,
15736
+ onSelect: (values) => {
15737
+ setValue(values.length === 0 ? void 0 : values);
15711
15738
  },
15712
- children
15739
+ nothingSelectedText: nothingSelectedText ?? "All",
15740
+ ...this.testId(tid)
15713
15741
  }
15714
- ),
15715
- scrollableEl
15716
- );
15717
- }
15742
+ );
15743
+ }
15744
+ };
15718
15745
 
15719
- // src/components/Toast/ToastContext.tsx
15720
- import { createContext as createContext5, useCallback as useCallback19, useContext as useContext14, useMemo as useMemo32, useState as useState35 } from "react";
15721
- import { jsx as jsx127 } from "@emotion/react/jsx-runtime";
15722
- var ToastContext = createContext5({
15723
- setNotice: () => {
15724
- throw new Error("Missing ToastProvider");
15725
- },
15726
- clear: () => {
15727
- },
15728
- notice: void 0
15729
- });
15730
- function ToastProvider(props) {
15731
- const [notice, setNotice] = useState35();
15732
- const clear = useCallback19(() => setNotice(void 0), [setNotice]);
15733
- const contextValue = useMemo32(() => ({ setNotice, notice, clear }), [notice, clear]);
15734
- return /* @__PURE__ */ jsx127(ToastContext.Provider, { value: contextValue, children: props.children });
15746
+ // src/components/Filters/NumberRangeFilter.tsx
15747
+ import { Fragment as Fragment25, jsx as jsx126, jsxs as jsxs63 } from "@emotion/react/jsx-runtime";
15748
+ function numberRangeFilter(props) {
15749
+ return (key) => new NumberRangeFilter(key, props);
15735
15750
  }
15736
- function useToastContext() {
15737
- return useContext14(ToastContext);
15738
- }
15739
-
15740
- // src/components/BeamContext.tsx
15741
- import { jsx as jsx128, jsxs as jsxs62 } from "@emotion/react/jsx-runtime";
15742
- var BeamContext = createContext6({
15743
- modalState: new EmptyRef(),
15744
- modalCanCloseChecks: new EmptyRef(),
15745
- modalHeaderDiv: void 0,
15746
- modalBodyDiv: void 0,
15747
- modalFooterDiv: void 0,
15748
- drawerContentStack: new EmptyRef(),
15749
- drawerCanCloseChecks: new EmptyRef(),
15750
- drawerCanCloseDetailsChecks: new EmptyRef(),
15751
- sdHeaderDiv: void 0
15752
- });
15753
- function BeamProvider({ children, ...presentationProps }) {
15754
- const [, tick] = useReducer((prev) => prev + 1, 0);
15755
- const modalRef = useRef43();
15756
- const modalHeaderDiv = useMemo33(() => document.createElement("div"), []);
15757
- const modalBodyDiv = useMemo33(() => {
15758
- const el = document.createElement("div");
15759
- el.style.height = "100%";
15760
- return el;
15761
- }, []);
15762
- const modalCanCloseChecksRef = useRef43([]);
15763
- const modalFooterDiv = useMemo33(() => document.createElement("div"), []);
15764
- const drawerContentStackRef = useRef43([]);
15765
- const drawerCanCloseChecks = useRef43([]);
15766
- const drawerCanCloseDetailsChecks = useRef43([]);
15767
- const sdHeaderDiv = useMemo33(() => document.createElement("div"), []);
15768
- const context = useMemo33(() => {
15769
- return {
15770
- // These two keys need to trigger re-renders on change
15771
- modalState: new PretendRefThatTicks(modalRef, tick),
15772
- drawerContentStack: new PretendRefThatTicks(drawerContentStackRef, tick),
15773
- // The rest we don't need to re-render when these are mutated, so just expose as-is
15774
- modalCanCloseChecks: modalCanCloseChecksRef,
15775
- modalHeaderDiv,
15776
- modalBodyDiv,
15777
- modalFooterDiv,
15778
- drawerCanCloseChecks,
15779
- drawerCanCloseDetailsChecks,
15780
- sdHeaderDiv
15781
- };
15782
- }, [modalBodyDiv, modalFooterDiv, modalHeaderDiv, sdHeaderDiv]);
15783
- return /* @__PURE__ */ jsx128(BeamContext.Provider, { value: { ...context }, children: /* @__PURE__ */ jsx128(PresentationProvider, { ...presentationProps, children: /* @__PURE__ */ jsx128(RightPaneProvider, { children: /* @__PURE__ */ jsx128(AutoSaveStatusProvider, { children: /* @__PURE__ */ jsx128(SnackbarProvider, { children: /* @__PURE__ */ jsxs62(ToastProvider, { children: [
15784
- /* @__PURE__ */ jsxs62(OverlayProvider, { children: [
15785
- children,
15786
- modalRef.current && /* @__PURE__ */ jsx128(Modal, { ...modalRef.current })
15787
- ] }),
15788
- /* @__PURE__ */ jsx128(SuperDrawer, {})
15789
- ] }) }) }) }) }) });
15790
- }
15791
- var PretendRefThatTicks = class {
15792
- constructor(ref, tick) {
15793
- this.ref = ref;
15794
- this.tick = tick;
15795
- }
15796
- get current() {
15797
- return this.ref.current;
15798
- }
15799
- set current(value) {
15800
- this.ref.current = value;
15801
- this.tick();
15751
+ var NumberRangeFilter = class extends BaseFilter {
15752
+ render(value, setValue, tid, inModal, vertical) {
15753
+ const { label, numberFieldType, numberFormatOptions } = this.props;
15754
+ const min = value?.min ?? void 0;
15755
+ const max = value?.max ?? void 0;
15756
+ return /* @__PURE__ */ jsxs63(Fragment25, { children: [
15757
+ vertical && /* @__PURE__ */ jsxs63("div", { ...tid, children: [
15758
+ /* @__PURE__ */ jsx126(Label, { label }),
15759
+ /* @__PURE__ */ jsx126("div", { css: Css.pb1.$, children: /* @__PURE__ */ jsx126(
15760
+ NumberField,
15761
+ {
15762
+ labelStyle: "inline",
15763
+ clearable: true,
15764
+ label: "Min",
15765
+ value: min,
15766
+ type: numberFieldType,
15767
+ numberFormatOptions,
15768
+ onChange: (minVal) => {
15769
+ const maxValue = max ? { max } : {};
15770
+ setValue(minVal || max ? { min: minVal, ...maxValue } : void 0);
15771
+ },
15772
+ ...tid[`${defaultTestId(label)}_min_vertical`]
15773
+ }
15774
+ ) }),
15775
+ /* @__PURE__ */ jsx126(
15776
+ NumberField,
15777
+ {
15778
+ labelStyle: "inline",
15779
+ clearable: true,
15780
+ label: "Max",
15781
+ value: max,
15782
+ type: numberFieldType,
15783
+ numberFormatOptions,
15784
+ onChange: (maxVal) => {
15785
+ const minValue = min ? { min } : {};
15786
+ setValue(maxVal || min ? { max: maxVal, ...minValue } : void 0);
15787
+ },
15788
+ ...tid[`${defaultTestId(label)}_max_vertical`]
15789
+ }
15790
+ )
15791
+ ] }),
15792
+ !vertical && /* @__PURE__ */ jsxs63(CompoundField, { ...tid, children: [
15793
+ /* @__PURE__ */ jsx126(
15794
+ NumberField,
15795
+ {
15796
+ compact: true,
15797
+ sizeToContent: !inModal,
15798
+ labelStyle: "inline",
15799
+ clearable: true,
15800
+ label: !inModal ? `${label} Min` : "Min",
15801
+ value: min,
15802
+ type: numberFieldType,
15803
+ numberFormatOptions,
15804
+ onChange: (minVal) => {
15805
+ const maxValue = max ? { max } : {};
15806
+ setValue(minVal || max ? { min: minVal, ...maxValue } : void 0);
15807
+ },
15808
+ ...tid[`${defaultTestId(label)}_min`]
15809
+ }
15810
+ ),
15811
+ /* @__PURE__ */ jsx126(
15812
+ NumberField,
15813
+ {
15814
+ compact: true,
15815
+ sizeToContent: !inModal,
15816
+ labelStyle: "inline",
15817
+ clearable: true,
15818
+ label: !inModal ? `${label} Max` : "Max",
15819
+ value: max,
15820
+ type: numberFieldType,
15821
+ numberFormatOptions,
15822
+ onChange: (maxVal) => {
15823
+ const minValue = min ? { min } : {};
15824
+ setValue(maxVal || min ? { max: maxVal, ...minValue } : void 0);
15825
+ },
15826
+ ...tid[`${defaultTestId(label)}_max`]
15827
+ }
15828
+ )
15829
+ ] })
15830
+ ] });
15802
15831
  }
15803
15832
  };
15804
- function useBeamContext() {
15805
- return useContext15(BeamContext);
15806
- }
15807
15833
 
15808
- // src/components/ButtonDatePicker.tsx
15809
- import { useRef as useRef44 } from "react";
15810
- import { useMenuTrigger as useMenuTrigger3 } from "react-aria";
15811
- import { useMenuTriggerState as useMenuTriggerState3 } from "react-stately";
15812
- import { jsx as jsx129 } from "@emotion/react/jsx-runtime";
15813
- function ButtonDatePicker(props) {
15814
- const { defaultOpen, disabled, trigger, onSelect, ...datePickerProps } = props;
15815
- const state = useMenuTriggerState3({ isOpen: defaultOpen });
15816
- const buttonRef = useRef44(null);
15817
- const { menuTriggerProps, menuProps } = useMenuTrigger3({ isDisabled: !!disabled }, state, buttonRef);
15818
- const tid = useTestIds(
15819
- props,
15820
- isTextButton(trigger) ? defaultTestId(labelOr(trigger, "buttonDatePicker")) : isNavLinkButton(trigger) ? defaultTestId(trigger.navLabel) : isIconButton(trigger) ? trigger.icon : trigger.name
15821
- );
15822
- return /* @__PURE__ */ jsx129(OverlayTrigger, { ...props, menuTriggerProps, state, buttonRef, ...tid, children: /* @__PURE__ */ jsx129(DatePickerOverlay, { overlayProps: menuProps, children: /* @__PURE__ */ jsx129(
15823
- DatePicker,
15824
- {
15825
- ...datePickerProps,
15826
- onSelect: (d) => {
15827
- onSelect(d);
15828
- state.close();
15829
- },
15830
- ...tid.datePicker
15831
- }
15832
- ) }) });
15834
+ // src/components/Filters/SingleFilter.tsx
15835
+ import { jsx as jsx127 } from "@emotion/react/jsx-runtime";
15836
+ function singleFilter(props) {
15837
+ return (key) => new SingleFilter(key, props);
15833
15838
  }
15839
+ var allOption = {};
15840
+ var SingleFilter = class extends BaseFilter {
15841
+ render(value, setValue, tid, inModal, vertical) {
15842
+ const {
15843
+ label,
15844
+ defaultValue,
15845
+ options: maybeOptions,
15846
+ getOptionLabel,
15847
+ getOptionValue,
15848
+ nothingSelectedText,
15849
+ ...props
15850
+ } = this.props;
15851
+ const options = Array.isArray(maybeOptions) ? [allOption, ...maybeOptions] : { ...maybeOptions, current: maybeOptions.current };
15852
+ return /* @__PURE__ */ jsx127(
15853
+ SelectField,
15854
+ {
15855
+ ...props,
15856
+ options,
15857
+ getOptionValue: (o) => o === allOption ? void 0 : getOptionValue(o),
15858
+ getOptionLabel: (o) => o === allOption ? nothingSelectedText ?? "All" : getOptionLabel(o),
15859
+ compact: !vertical,
15860
+ value,
15861
+ label: this.label,
15862
+ labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
15863
+ sizeToContent: !inModal && !vertical,
15864
+ nothingSelectedText: nothingSelectedText ?? "All",
15865
+ onSelect: (value2) => setValue(value2 || void 0),
15866
+ ...this.testId(tid)
15867
+ }
15868
+ );
15869
+ }
15870
+ };
15834
15871
 
15835
- // src/components/ButtonGroup.tsx
15836
- import { useRef as useRef45 } from "react";
15837
- import { useButton as useButton10, useFocusRing as useFocusRing12, useHover as useHover15 } from "react-aria";
15838
- import { jsx as jsx130, jsxs as jsxs63 } from "@emotion/react/jsx-runtime";
15839
- function ButtonGroup(props) {
15840
- const { buttons, disabled = false, size = "sm" } = props;
15841
- const tid = useTestIds(props, "buttonGroup");
15842
- return (
15843
- // Adding `line-height: 0` prevent inheriting line-heights that might throw off sizing within the button group.
15844
- /* @__PURE__ */ jsx130("div", { ...tid, css: Css.df.lh(0).add({ ...sizeStyles2[size] }).$, children: buttons.map(({ disabled: buttonDisabled, ...buttonProps }, i) => (
15845
- // Disable the button if the ButtonGroup is disabled or if the current button is disabled.
15846
- /* @__PURE__ */ jsx130(GroupButton, { ...buttonProps, disabled: disabled || buttonDisabled, size, ...tid }, i)
15847
- )) })
15848
- );
15872
+ // src/components/Filters/TreeFilter.tsx
15873
+ import { jsx as jsx128 } from "@emotion/react/jsx-runtime";
15874
+ function treeFilter(props) {
15875
+ return (key) => new TreeFilter(key, props);
15849
15876
  }
15850
- function GroupButton(props) {
15851
- const { icon, iconInc, iconColor, text, active, onClick: onPress, disabled, size, tooltip, ...otherProps } = props;
15852
- const ariaProps = { onPress, isDisabled: !!disabled, ...otherProps };
15853
- const ref = useRef45(null);
15854
- const { buttonProps, isPressed } = useButton10(ariaProps, ref);
15855
- const { isFocusVisible, focusProps } = useFocusRing12();
15856
- const { hoverProps, isHovered } = useHover15(ariaProps);
15857
- const tid = useTestIds(props);
15858
- return /* @__PURE__ */ jsx130("span", { css: getButtonStyles2(), children: maybeTooltip({
15859
- title: resolveTooltip(disabled, tooltip),
15860
- placement: "top",
15861
- children: /* @__PURE__ */ jsxs63(
15862
- "button",
15877
+ var TreeFilter = class extends BaseFilter {
15878
+ render(value, setValue, tid, inModal, vertical) {
15879
+ const { defaultValue, nothingSelectedText, filterBy = "root", ...props } = this.props;
15880
+ return /* @__PURE__ */ jsx128(
15881
+ TreeSelectField,
15863
15882
  {
15864
- ref,
15865
- ...buttonProps,
15866
- ...focusProps,
15867
- ...hoverProps,
15868
- css: {
15869
- ...Css.buttonBase.px2.br0.h100.$,
15870
- "&:disabled": Css.gray400.cursorNotAllowed.bcGray300.$,
15871
- ...isFocusVisible ? defaultFocusRingStyles2 : {},
15872
- ...active ? activeStyles3 : {},
15873
- ...isPressed ? pressedStyles2 : isHovered ? hoverStyles3 : {},
15874
- ...icon ? iconStyles2[size] : {}
15883
+ ...props,
15884
+ label: this.label,
15885
+ values: value,
15886
+ compact: !vertical,
15887
+ labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
15888
+ sizeToContent: !inModal && !vertical,
15889
+ onSelect: (options) => {
15890
+ const values = options[filterBy].values;
15891
+ setValue(values.length === 0 ? void 0 : values);
15875
15892
  },
15876
- ...tid[defaultTestId(typeof text === "string" && text || icon || "button")],
15877
- children: [
15878
- icon && /* @__PURE__ */ jsx130(Icon, { xss: Css.if(!!text).mrPx(4).$, icon, color: disabled ? void 0 : iconColor, inc: iconInc }),
15879
- text
15880
- ]
15893
+ nothingSelectedText: nothingSelectedText ?? "All",
15894
+ ...this.testId(tid)
15881
15895
  }
15882
- )
15883
- }) });
15896
+ );
15897
+ }
15898
+ };
15899
+
15900
+ // src/components/Filters/BooleanFilter.tsx
15901
+ import { jsx as jsx129 } from "@emotion/react/jsx-runtime";
15902
+ function booleanFilter(props) {
15903
+ return (key) => new BooleanFilter(key, props);
15884
15904
  }
15885
- var pressedStyles2 = Css.bgGray200.$;
15886
- var activeStyles3 = Css.bgGray300.$;
15887
- var hoverStyles3 = Css.bgGray100.$;
15888
- var defaultFocusRingStyles2 = Css.relative.z2.bshFocus.$;
15889
- function getButtonStyles2() {
15890
- return {
15891
- ...Css.z1.bgWhite.bcGray300.bw1.ba.gray900.br0.oh.$,
15892
- // Our first button should have a rounded left border
15893
- "&:first-of-type": Css.add("borderRadius", "4px 0 0 4px").$,
15894
- // Our last button should have a rounded right border
15895
- "&:last-of-type": Css.add("borderRadius", "0 4px 4px 0").$,
15896
- // Nudge buttons one pixel to the left so they visually share a border
15897
- "&:not(:first-of-type)": Css.mlPx(-1).$
15898
- };
15899
- }
15900
- var sizeStyles2 = {
15901
- xs: Css.hPx(28).$,
15902
- sm: Css.hPx(32).$,
15903
- md: Css.hPx(40).$
15905
+ var BooleanFilter = class extends BaseFilter {
15906
+ render(value, setValue, tid, inModal, vertical) {
15907
+ const { options = defaultBooleanOptions, label, defaultValue, ...props } = this.props;
15908
+ return /* @__PURE__ */ jsx129(
15909
+ SelectField,
15910
+ {
15911
+ ...props,
15912
+ compact: !vertical,
15913
+ label: this.label,
15914
+ value: String(value),
15915
+ labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
15916
+ sizeToContent: !inModal && !vertical,
15917
+ options,
15918
+ getOptionValue: (o) => String(o[0]),
15919
+ getOptionLabel: (o) => o[1],
15920
+ onSelect: (value2) => {
15921
+ const parsedValue = value2 === "undefined" ? void 0 : value2 === "true";
15922
+ setValue(parsedValue);
15923
+ },
15924
+ ...this.testId(tid)
15925
+ }
15926
+ );
15927
+ }
15904
15928
  };
15905
- var iconStyles2 = {
15906
- xs: Css.pxPx(2).$,
15907
- sm: Css.pxPx(4).$,
15908
- md: Css.px1.$
15929
+ var defaultBooleanOptions = [
15930
+ [void 0, "Any"],
15931
+ [true, "Yes"],
15932
+ [false, "No"]
15933
+ ];
15934
+
15935
+ // src/components/Filters/CheckboxFilter.tsx
15936
+ import { jsx as jsx130 } from "@emotion/react/jsx-runtime";
15937
+ function checkboxFilter(props) {
15938
+ return (key) => new CheckboxFilter(key, {
15939
+ // If the user has set the offValue, that should be the default b/c we're only a two-state
15940
+ defaultValue: props.offValue,
15941
+ ...props
15942
+ });
15943
+ }
15944
+ var CheckboxFilter = class extends BaseFilter {
15945
+ render(value, setValue, tid, inModal, vertical) {
15946
+ const { defaultValue, onValue = true, offValue = void 0, ...props } = this.props;
15947
+ return /* @__PURE__ */ jsx130(
15948
+ Checkbox,
15949
+ {
15950
+ ...props,
15951
+ selected: value === void 0 ? false : value === onValue,
15952
+ label: this.label,
15953
+ onChange: (on) => {
15954
+ setValue(on ? onValue : offValue);
15955
+ },
15956
+ ...this.testId(tid)
15957
+ }
15958
+ );
15959
+ }
15960
+ get hideLabelInModal() {
15961
+ return true;
15962
+ }
15909
15963
  };
15910
15964
 
15911
- // src/components/ButtonMenu.tsx
15912
- import { useRef as useRef46 } from "react";
15913
- import { useMenuTrigger as useMenuTrigger4 } from "react-aria";
15914
- import { useMenuTriggerState as useMenuTriggerState4 } from "react-stately";
15965
+ // src/components/Filters/FilterModal.tsx
15966
+ import { useState as useState34 } from "react";
15967
+
15968
+ // src/components/Modal/OpenModal.tsx
15969
+ import { useEffect as useEffect23 } from "react";
15915
15970
  import { jsx as jsx131 } from "@emotion/react/jsx-runtime";
15916
- function ButtonMenu(props) {
15917
- const { defaultOpen, disabled, items, persistentItems, trigger, searchable, contrast = false } = props;
15918
- let selectedItem, onChange;
15919
- if (isSelectionButtonMenuProps(props)) {
15920
- selectedItem = props.selectedItem;
15921
- onChange = props.onChange;
15971
+ function OpenModal(props) {
15972
+ const { openModal } = useModal();
15973
+ const { size, children, keepOpen } = props;
15974
+ useEffect23(() => {
15975
+ if (!keepOpen) {
15976
+ openModal({ size, content: children });
15977
+ }
15978
+ }, [keepOpen, openModal, size, children]);
15979
+ if (keepOpen) {
15980
+ return /* @__PURE__ */ jsx131(Modal, { size, content: children });
15981
+ } else {
15982
+ return /* @__PURE__ */ jsx131("div", { children: "dummy content" });
15922
15983
  }
15923
- const state = useMenuTriggerState4({ isOpen: defaultOpen });
15924
- const buttonRef = useRef46(null);
15925
- const { menuTriggerProps, menuProps } = useMenuTrigger4({ isDisabled: !!disabled }, state, buttonRef);
15926
- const tid = useTestIds(
15927
- props,
15928
- isTextButton(trigger) ? labelOr(trigger, "buttonMenu") : isNavLinkButton(trigger) ? defaultTestId(trigger.navLabel) : isIconButton(trigger) ? trigger.icon : trigger.name
15929
- );
15930
- return /* @__PURE__ */ jsx131(
15931
- OverlayTrigger,
15932
- {
15933
- ...props,
15934
- menuTriggerProps,
15935
- state,
15936
- buttonRef,
15937
- ...tid,
15938
- contrast,
15939
- children: /* @__PURE__ */ jsx131(
15940
- Menu,
15984
+ }
15985
+
15986
+ // src/components/Filters/FilterModal.tsx
15987
+ import { Fragment as Fragment26, jsx as jsx132, jsxs as jsxs64 } from "@emotion/react/jsx-runtime";
15988
+ function FilterModal(props) {
15989
+ const { filter, filters, onApply } = props;
15990
+ const testId = useTestIds(props, filterTestIdPrefix);
15991
+ const { closeModal } = useModal();
15992
+ const [modalFilter, setModalFilter] = useState34(filter);
15993
+ return /* @__PURE__ */ jsxs64(Fragment26, { children: [
15994
+ /* @__PURE__ */ jsx132(ModalHeader, { children: "More Filters" }),
15995
+ /* @__PURE__ */ jsx132(ModalBody, { children: /* @__PURE__ */ jsx132("div", { css: Css.df.fdc.$, children: safeEntries(filters).map(([key, f]) => /* @__PURE__ */ jsx132(ModalFilterItem, { label: f.hideLabelInModal ? void 0 : f.label, children: f.render(
15996
+ modalFilter[key],
15997
+ (value) => setModalFilter(updateFilter(modalFilter, key, value)),
15998
+ testId,
15999
+ true,
16000
+ false
16001
+ ) }, key)) }) }),
16002
+ /* @__PURE__ */ jsxs64(ModalFooter, { xss: Css.jcsb.$, children: [
16003
+ /* @__PURE__ */ jsx132(
16004
+ Button,
15941
16005
  {
15942
- ariaMenuProps: menuProps,
15943
- onClose: () => state.close(),
15944
- items,
15945
- persistentItems,
15946
- searchable,
15947
- contrast,
15948
- selectedItem,
15949
- onChange,
15950
- ...tid
16006
+ label: "Clear",
16007
+ variant: "tertiary",
16008
+ disabled: safeKeys(filters).filter((fk) => modalFilter[fk] !== void 0).length === 0,
16009
+ onClick: () => (
16010
+ // Only remove the filters keys that exist in the modal.
16011
+ setModalFilter(safeKeys(filters).reduce((acc, fk) => omitKey(fk, acc), modalFilter))
16012
+ ),
16013
+ ...testId.modalClear
15951
16014
  }
15952
- )
15953
- }
15954
- );
16015
+ ),
16016
+ /* @__PURE__ */ jsxs64("div", { css: Css.df.gap1.$, children: [
16017
+ /* @__PURE__ */ jsx132(Button, { label: "Cancel", variant: "tertiary", onClick: closeModal, ...testId.modalClose }),
16018
+ /* @__PURE__ */ jsx132(
16019
+ Button,
16020
+ {
16021
+ label: "Apply",
16022
+ onClick: () => {
16023
+ onApply(modalFilter);
16024
+ closeModal();
16025
+ },
16026
+ ...testId.modalApply
16027
+ }
16028
+ )
16029
+ ] })
16030
+ ] })
16031
+ ] });
15955
16032
  }
15956
- function isSelectionButtonMenuProps(props) {
15957
- return typeof props === "object" && "selectedItem" in props && "onChange" in props;
16033
+ function ModalFilterItem({ label, children }) {
16034
+ return /* @__PURE__ */ jsxs64("div", { css: Css.mb4.if(!label).bt.bcGray200.$, children: [
16035
+ label && /* @__PURE__ */ jsx132("h2", { css: Css.baseMd.mb2.$, children: label }),
16036
+ /* @__PURE__ */ jsx132("div", { css: Css.if(!label).pt3.$, children })
16037
+ ] });
15958
16038
  }
15959
16039
 
15960
- // src/components/Card.tsx
15961
- import { useMemo as useMemo34 } from "react";
15962
- import { useHover as useHover16 } from "react-aria";
15963
-
15964
- // src/components/Tag.tsx
15965
- import { useResizeObserver as useResizeObserver4 } from "@react-aria/utils";
15966
- import { useRef as useRef47, useState as useState36 } from "react";
15967
- import { jsx as jsx132, jsxs as jsxs64 } from "@emotion/react/jsx-runtime";
15968
- function Tag(props) {
15969
- const { text, type, xss, preventTooltip = false, ...otherProps } = props;
15970
- const typeStyles2 = getStyles(type);
15971
- const tid = useTestIds(otherProps);
15972
- const [showTooltip, setShowTooltip] = useState36(false);
15973
- const ref = useRef47(null);
15974
- useResizeObserver4({
15975
- ref,
15976
- onResize: () => {
15977
- if (ref.current) {
15978
- setShowTooltip(ref.current.offsetHeight < ref.current.scrollHeight);
15979
- }
15980
- }
15981
- });
15982
- return maybeTooltip({
15983
- title: !preventTooltip && showTooltip ? text : void 0,
15984
- children: /* @__PURE__ */ jsxs64("span", { ...tid, css: { ...Css.dif.tinySb.ttu.aic.gapPx(4).pxPx(6).pyPx(2).gray900.br4.$, ...typeStyles2, ...xss }, children: [
15985
- otherProps.icon && /* @__PURE__ */ jsx132("span", { css: Css.fs0.$, children: /* @__PURE__ */ jsx132(Icon, { icon: otherProps.icon, inc: 1.5 }) }),
15986
- /* @__PURE__ */ jsx132("span", { ref, css: Css.lineClamp1.wbba.$, children: text })
15987
- ] })
16040
+ // src/components/Filters/ToggleFilter.tsx
16041
+ import { jsx as jsx133 } from "@emotion/react/jsx-runtime";
16042
+ function toggleFilter(props) {
16043
+ return (key) => new ToggleFilter(key, {
16044
+ // If the user has set the offValue, that should be the default b/c we're only a two-state
16045
+ defaultValue: props.offValue,
16046
+ ...props
15988
16047
  });
15989
16048
  }
15990
- function getStyles(type) {
15991
- switch (type) {
15992
- case "info":
15993
- return Css.bgBlue100.$;
15994
- case "caution":
15995
- return Css.bgYellow200.$;
15996
- case "warning":
15997
- return Css.bgRed200.$;
15998
- case "success":
15999
- return Css.bgGreen200.$;
16000
- default:
16001
- return Css.bgGray200.$;
16002
- }
16003
- }
16004
-
16005
- // src/components/Card.tsx
16006
- import { jsx as jsx133, jsxs as jsxs65 } from "@emotion/react/jsx-runtime";
16007
- function Card(props) {
16008
- const {
16009
- title,
16010
- subtitle,
16011
- detailContent,
16012
- imgSrc,
16013
- imageFit = "contain",
16014
- type = "card",
16015
- bordered = false,
16016
- disabled: isDisabled = false,
16017
- buttonMenuItems,
16018
- tag
16019
- } = props;
16020
- const tid = useTestIds(props, "card");
16021
- const { hoverProps, isHovered } = useHover16({ isDisabled });
16022
- const isList = type === "list";
16023
- const imgHeight = isList ? 96 : bordered ? 224 : 256;
16024
- const styles = useMemo34(
16025
- () => ({
16026
- ...baseStyles4(type),
16027
- ...isList && listStyles,
16028
- ...bordered && borderedStyles,
16029
- ...isHovered && cardHoverStyles,
16030
- ...isDisabled && disabledStyles3
16031
- }),
16032
- [isDisabled, isHovered, bordered, type, isList]
16033
- );
16034
- return /* @__PURE__ */ jsxs65("div", { css: styles, ...hoverProps, ...tid, children: [
16035
- /* @__PURE__ */ jsx133(
16036
- "div",
16049
+ var ToggleFilter = class extends BaseFilter {
16050
+ render(value, setValue, tid, inModal, vertical) {
16051
+ const { defaultValue, onValue = true, offValue = void 0, ...props } = this.props;
16052
+ return /* @__PURE__ */ jsx133(
16053
+ Switch,
16037
16054
  {
16038
- css: {
16039
- ...Css.hPx(imgHeight).ba.br8.bcGray300.oh.df.asc.jsc.relative.add("filter", "brightness(1)").$,
16040
- ...isHovered && !isList && imageHoverStyles
16055
+ ...props,
16056
+ selected: value === void 0 ? false : value === onValue,
16057
+ label: this.label,
16058
+ labelStyle: inModal || vertical ? "filter" : "inline",
16059
+ onChange: (on) => {
16060
+ setValue(on ? onValue : offValue);
16041
16061
  },
16042
- children: /* @__PURE__ */ jsx133("img", { css: Css.w100.h100.objectFit(imageFit).$, src: imgSrc, alt: title, ...tid.img })
16043
- }
16044
- ),
16045
- isHovered && buttonMenuItems && /* @__PURE__ */ jsx133("div", { css: Css.absolute.right1.top1.if(bordered && !isList).right3.top3.$, children: /* @__PURE__ */ jsx133(
16046
- ButtonMenu,
16047
- {
16048
- trigger: { icon: "verticalDots", color: isList ? "rgba(100, 100, 100, 1)" /* Gray700 */ : "rgba(255,255,255,1)" /* White */ },
16049
- items: buttonMenuItems
16062
+ ...this.testId(tid)
16050
16063
  }
16051
- ) }),
16052
- tag && /* @__PURE__ */ jsx133("div", { css: Css.absolute.left1.topPx(4).$, children: /* @__PURE__ */ jsx133(Tag, { type: tag?.type, text: tag?.text, ...tid.tag }) }),
16053
- /* @__PURE__ */ jsxs65("div", { css: Css.df.fdc.aifs.gap1.$, children: [
16054
- /* @__PURE__ */ jsxs65("div", { children: [
16055
- /* @__PURE__ */ jsx133("div", { css: Css.xsMd.gray700.$, ...tid.subtitle, children: subtitle }),
16056
- /* @__PURE__ */ jsx133("div", { css: Css.smMd.gray900.if(isHovered).blue700.$, ...tid.title, children: title })
16057
- ] }),
16058
- /* @__PURE__ */ jsx133("div", { ...tid.details, children: detailContent })
16059
- ] })
16060
- ] });
16064
+ );
16065
+ }
16066
+ get hideLabelInModal() {
16067
+ return true;
16068
+ }
16069
+ };
16070
+
16071
+ // src/components/Filters/utils.tsx
16072
+ function updateFilter(currentFilter, key, value) {
16073
+ if (value === void 0) {
16074
+ return omitKey(key, currentFilter);
16075
+ } else {
16076
+ return { ...currentFilter, [key]: value };
16077
+ }
16061
16078
  }
16062
- var width = { card: 256, list: 520 };
16063
- var baseStyles4 = (type) => Css.wPx(width[type]).bgWhite.df.fdc.gap1.relative.$;
16064
- var listStyles = Css.df.fdr.gap2.$;
16065
- var borderedStyles = Css.ba.br8.bcGray300.p2.$;
16066
- var disabledStyles3 = Css.add("opacity", 0.5).add("transition", "opacity 0.3s ease").$;
16067
- var cardHoverStyles = Css.bcGray400.cursorPointer.$;
16068
- var imageHoverStyles = Css.bgWhite.add("filter", "brightness(0.3)").add("transition", "filter 0.3s ease").$;
16079
+ var filterTestIdPrefix = "filter";
16069
16080
 
16070
- // src/components/Copy.tsx
16071
- import { jsx as jsx134 } from "@emotion/react/jsx-runtime";
16072
- function Copy(props) {
16073
- return /* @__PURE__ */ jsx134(
16081
+ // src/components/Filters/Filters.tsx
16082
+ import { jsx as jsx134, jsxs as jsxs65 } from "@emotion/react/jsx-runtime";
16083
+ function Filters(props) {
16084
+ const { filter, onChange, filterDefs, groupBy, vertical = false, numberOfInlineFilters = groupBy ? 3 : 4 } = props;
16085
+ const testId = useTestIds(props, filterTestIdPrefix);
16086
+ const { openModal } = useModal();
16087
+ const [pageFilters, modalFilters] = useMemo31(() => {
16088
+ const impls = safeEntries(filterDefs).map(([key, fn]) => [key, fn(key)]);
16089
+ if (!vertical && impls.length > numberOfInlineFilters) {
16090
+ return [
16091
+ Object.fromEntries(impls.slice(0, numberOfInlineFilters - 1)),
16092
+ Object.fromEntries(impls.slice(numberOfInlineFilters - 1))
16093
+ ];
16094
+ }
16095
+ return [Object.fromEntries(impls), {}];
16096
+ }, [numberOfInlineFilters, vertical, filterDefs]);
16097
+ const numModalFilters = safeKeys(modalFilters).filter((fk) => filter[fk] !== void 0).length;
16098
+ const maybeGroupByField = groupBy ? /* @__PURE__ */ jsx134("div", { children: /* @__PURE__ */ jsx134(
16099
+ SelectField,
16100
+ {
16101
+ label: "Group by",
16102
+ compact: !vertical,
16103
+ labelStyle: !vertical ? "inline" : "above",
16104
+ sizeToContent: !vertical,
16105
+ options: groupBy.options,
16106
+ getOptionValue: (o) => o.id,
16107
+ getOptionLabel: (o) => o.name,
16108
+ value: groupBy.value,
16109
+ onSelect: (g) => g && groupBy.setValue(g)
16110
+ }
16111
+ ) }) : null;
16112
+ return /* @__PURE__ */ jsxs65(
16074
16113
  "div",
16075
16114
  {
16076
16115
  css: {
16077
- ...Css.sm.gray700.mt2.mb3.wPx(480).$,
16078
- "& > p": Css.my2.$
16116
+ ...vertical ? Css.df.fdc.gap2.$ : Css.df.aic.gap1.$
16079
16117
  },
16080
- children: props.children
16118
+ ...testId,
16119
+ children: [
16120
+ maybeGroupByField,
16121
+ safeEntries(pageFilters).map(([key, f]) => /* @__PURE__ */ jsx134("div", { children: f.render(filter[key], (value) => onChange(updateFilter(filter, key, value)), testId, false, vertical) }, key)),
16122
+ Object.keys(modalFilters).length > 0 && /* @__PURE__ */ jsx134(
16123
+ Button,
16124
+ {
16125
+ label: "More Filters",
16126
+ endAdornment: numModalFilters > 0 && /* @__PURE__ */ jsx134("span", { css: Css.wPx(16).hPx(16).fs0.br100.bgBlue700.white.tinySb.df.aic.jcc.$, children: numModalFilters }),
16127
+ variant: "secondary",
16128
+ onClick: () => openModal({
16129
+ // Spreading `props` to pass along `data-testid`
16130
+ content: /* @__PURE__ */ jsx134(FilterModal, { ...props, filter, onApply: onChange, filters: modalFilters })
16131
+ }),
16132
+ ...testId.moreFiltersBtn
16133
+ }
16134
+ ),
16135
+ Object.keys(filter).length > 0 && /* @__PURE__ */ jsx134("div", { children: /* @__PURE__ */ jsx134(Button, { label: "Clear", variant: "tertiary", onClick: () => onChange({}), ...testId.clearBtn }) })
16136
+ ]
16081
16137
  }
16082
16138
  );
16083
16139
  }
16140
+ var _Filters = memo(Filters);
16084
16141
 
16085
- // src/components/DnDGrid/DnDGrid.tsx
16086
- import equal2 from "fast-deep-equal";
16087
- import { useCallback as useCallback20, useRef as useRef48 } from "react";
16142
+ // src/components/Table/TableActions.tsx
16143
+ import { jsx as jsx135 } from "@emotion/react/jsx-runtime";
16144
+ function TableActions(props) {
16145
+ const { xss, children, onlyLeft, onlyRight } = props;
16146
+ const alignmentStyles = onlyLeft ? Css.jcfs.$ : onlyRight ? Css.jcfe.$ : Css.jcsb.$;
16147
+ return /* @__PURE__ */ jsx135("div", { css: { ...Css.df.aic.pb2.gap1.$, ...xss, ...alignmentStyles }, children });
16148
+ }
16088
16149
 
16089
- // src/components/DnDGrid/DnDGridContext.tsx
16090
- import { createContext as createContext7, useContext as useContext16 } from "react";
16091
- var DnDGridContext = createContext7({
16092
- dragEl: { current: void 0 },
16093
- onDragHandleKeyDown: () => {
16150
+ // src/components/Layout/GridTableLayout/GridTableLayout.tsx
16151
+ import { useDebounce as useDebounce2 } from "use-debounce";
16152
+ import { StringParam as StringParam2, useQueryParams as useQueryParams3 } from "use-query-params";
16153
+
16154
+ // src/components/Layout/ScrollableContent.tsx
16155
+ import { useEffect as useEffect24 } from "react";
16156
+ import { createPortal as createPortal4 } from "react-dom";
16157
+ import { Fragment as Fragment27, jsx as jsx136 } from "@emotion/react/jsx-runtime";
16158
+ function ScrollableContent(props) {
16159
+ const { children, virtualized = false, omitBottomPadding, bgColor } = props;
16160
+ const { scrollableEl, setPortalTick, pl, pr } = useScrollableParent();
16161
+ useEffect24(() => {
16162
+ setPortalTick((prev) => prev + 1);
16163
+ return () => setPortalTick((prev) => prev + 1);
16164
+ }, [setPortalTick]);
16165
+ if (!scrollableEl) {
16166
+ return /* @__PURE__ */ jsx136(Fragment27, { children });
16094
16167
  }
16095
- });
16096
- function useDnDGridContext() {
16097
- return useContext16(DnDGridContext);
16168
+ return createPortal4(
16169
+ /* @__PURE__ */ jsx136(
16170
+ "div",
16171
+ {
16172
+ css: {
16173
+ ...Css.h100.pr(pr).pl(pl).if(virtualized).pr0.$,
16174
+ ...bgColor && Css.bgColor(bgColor).$,
16175
+ ...!omitBottomPadding && !virtualized && scrollContainerBottomPadding
16176
+ },
16177
+ children
16178
+ }
16179
+ ),
16180
+ scrollableEl
16181
+ );
16098
16182
  }
16099
16183
 
16100
- // src/components/DnDGrid/DnDGrid.tsx
16101
- import { jsx as jsx135 } from "@emotion/react/jsx-runtime";
16102
- function DnDGrid(props) {
16103
- const { children, gridStyles, onReorder, activeItemStyles } = props;
16104
- const gridEl = useRef48(null);
16105
- const dragEl = useRef48();
16106
- const cloneEl = useRef48();
16107
- const initialOrder = useRef48();
16108
- const reorderViaKeyboard = useRef48(false);
16109
- const transformFrom = useRef48({ x: 0, y: 0 });
16110
- const tid = useTestIds(props, "dndGrid");
16111
- const getGridItems = useCallback20(() => {
16112
- return gridEl.current ? Array.from(gridEl.current.querySelectorAll(`[${gridItemIdKey}]`)) : [];
16113
- }, []);
16114
- const getGridItemIdOrder = useCallback20(() => {
16115
- return getGridItems().map((child) => child.getAttribute(gridItemIdKey)).filter(isDefined);
16116
- }, [getGridItems]);
16117
- const initReorder = useCallback20(() => {
16118
- if (gridEl.current && dragEl.current) {
16119
- initialOrder.current = getGridItemIdOrder();
16120
- dragEl.current.classList.add(activeGridItemClass);
16121
- }
16122
- }, [getGridItemIdOrder]);
16123
- const commitReorder = useCallback20(() => {
16124
- if (gridEl.current && dragEl.current) {
16125
- const currentOrder = getGridItemIdOrder();
16126
- if (!equal2(currentOrder, initialOrder.current)) onReorder(currentOrder);
16127
- dragEl.current.classList.remove(activeGridItemClass);
16128
- dragEl.current = void 0;
16129
- reorderViaKeyboard.current = false;
16130
- initialOrder.current = currentOrder;
16131
- }
16132
- }, [onReorder, getGridItemIdOrder]);
16133
- const cancelReorder = useCallback20(() => {
16134
- if (gridEl.current && dragEl.current && initialOrder.current) {
16135
- const currentOrder = getGridItemIdOrder();
16136
- if (!equal2(currentOrder, initialOrder.current)) {
16137
- const initialIndex = initialOrder.current.indexOf(dragEl.current.getAttribute(gridItemIdKey) ?? "");
16138
- if (initialIndex === initialOrder.current.length - 1) {
16139
- const gridItems = getGridItems();
16140
- const lastGridItem = gridItems[gridItems.length - 1];
16141
- gridEl.current.insertBefore(dragEl.current, lastGridItem.nextSibling);
16142
- } else {
16143
- const nextSiblingIndex = initialOrder.current[initialIndex + 1];
16144
- const nextSibling = gridEl.current.querySelector(`[${gridItemIdKey}="${nextSiblingIndex}"]`);
16145
- if (nextSibling) {
16146
- gridEl.current.insertBefore(dragEl.current, nextSibling);
16147
- }
16148
- }
16184
+ // src/components/Layout/GridTableLayout/QueryTable.tsx
16185
+ import { useMemo as useMemo32 } from "react";
16186
+
16187
+ // src/components/LoadingSkeleton.tsx
16188
+ import { jsx as jsx137 } from "@emotion/react/jsx-runtime";
16189
+ function LoadingSkeleton({
16190
+ rows = 1,
16191
+ columns = 1,
16192
+ size = "md",
16193
+ randomizeWidths = false,
16194
+ contrast = false
16195
+ }) {
16196
+ const cellArray = [...Array(columns)];
16197
+ const rowArray = [...Array(rows)];
16198
+ const rowHeight = sizeToPixels2[size];
16199
+ const rowCells = (rowNumber) => {
16200
+ const flexGrowForCell = randomizeWidths ? getRandomizedFlexBasisByRowIndex(rowNumber) : 1;
16201
+ return cellArray.map((_, i) => /* @__PURE__ */ jsx137(
16202
+ "div",
16203
+ {
16204
+ css: Css.br4.add("animation", "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite").add("flexGrow", flexGrowForCell).bgGray300.if(contrast).bgGray700.$
16205
+ },
16206
+ `row-${rowNumber}-cell-${i}`
16207
+ ));
16208
+ };
16209
+ return /* @__PURE__ */ jsx137("div", { "aria-label": "Loading", children: rowArray.map((_, i) => /* @__PURE__ */ jsx137("div", { css: Css.df.gap1.mb1.hPx(rowHeight).$, children: rowCells(i) }, `row-${i}`)) });
16210
+ }
16211
+ function getRandomizedFlexBasisByRowIndex(rowIndex) {
16212
+ const randomizedFlexBasisValues = [0.65, 0.8, 0.75, 0.9, 0.8, 0.85, 0.8, 0.95];
16213
+ const valueIndex = rowIndex % randomizedFlexBasisValues.length;
16214
+ return randomizedFlexBasisValues[valueIndex];
16215
+ }
16216
+ var sizeToPixels2 = {
16217
+ sm: 16,
16218
+ md: 24,
16219
+ lg: 32
16220
+ };
16221
+
16222
+ // src/components/Layout/GridTableLayout/QueryTable.tsx
16223
+ import { Fragment as Fragment28, jsx as jsx138, jsxs as jsxs66 } from "@emotion/react/jsx-runtime";
16224
+ function QueryTable(props) {
16225
+ const { emptyFallback, query, createRows, getPageInfo, columns, keepHeaderWhenLoading, ...others } = props;
16226
+ const data = query.loading || query.error ? void 0 : query.data;
16227
+ const rows = useMemo32(() => createRows(data), [createRows, data]);
16228
+ const hasNextPage = data && getPageInfo && getPageInfo(data).hasNextPage;
16229
+ const infoMessage = hasNextPage ? "Too many rows" : void 0;
16230
+ const fallbackMessage = query.loading ? "Loading\u2026" : query.error ? `Error: ${query.error.message}` : emptyFallback;
16231
+ const headers = rows.filter((row) => row.kind === "header");
16232
+ return query.loading ? /* @__PURE__ */ jsx138("div", { children: keepHeaderWhenLoading ? /* @__PURE__ */ jsx138(GridTable, { ...{ columns, ...others }, rows: headers, fallbackMessage }) : /* @__PURE__ */ jsx138(LoadingTable, { columns: columns.length }) }) : /* @__PURE__ */ jsx138(GridTable, { ...{ rows, columns, fallbackMessage, infoMessage, ...others } });
16233
+ }
16234
+ function LoadingTable(props) {
16235
+ const { columns } = props;
16236
+ return /* @__PURE__ */ jsxs66(Fragment28, { children: [
16237
+ /* @__PURE__ */ jsx138(LoadingSkeleton, { rows: 1, columns: 1 }),
16238
+ /* @__PURE__ */ jsx138(LoadingSkeleton, { rows: 5, columns: columns ?? 5 })
16239
+ ] });
16240
+ }
16241
+
16242
+ // src/components/Layout/GridTableLayout/GridTableLayout.tsx
16243
+ import { Fragment as Fragment29, jsx as jsx139, jsxs as jsxs67 } from "@emotion/react/jsx-runtime";
16244
+ function isGridTableProps(props) {
16245
+ return "rows" in props;
16246
+ }
16247
+ function GridTableLayoutComponent(props) {
16248
+ const { pageTitle, breadcrumb, tableProps, layoutState, primaryAction, secondaryAction, tertiaryAction } = props;
16249
+ const clientSearch = layoutState?.search === "client" ? layoutState.searchString : void 0;
16250
+ const showTableActions = layoutState?.filterDefs || layoutState?.search;
16251
+ const isVirtualized = tableProps.as === "virtual";
16252
+ const breakpoints = useBreakpoint();
16253
+ return /* @__PURE__ */ jsxs67(Fragment29, { children: [
16254
+ /* @__PURE__ */ jsx139(
16255
+ Header2,
16256
+ {
16257
+ pageTitle,
16258
+ breadcrumb,
16259
+ primaryAction,
16260
+ secondaryAction,
16261
+ tertiaryAction
16149
16262
  }
16150
- dragEl.current.classList.remove(activeGridItemClass);
16151
- dragEl.current = void 0;
16152
- reorderViaKeyboard.current = false;
16153
- }
16154
- }, [getGridItemIdOrder, getGridItems]);
16155
- const onMove = useCallback20((e) => {
16156
- if (!reorderViaKeyboard.current && dragEl.current && cloneEl.current && gridEl.current) {
16157
- const clientX = "clientX" in e ? e.clientX : e.touches[0].clientX;
16158
- const clientY = "clientY" in e ? e.clientY : e.touches[0].clientY;
16159
- const left = dragEl.current.style.left ? parseInt(dragEl.current.style.left) : 0;
16160
- const top = dragEl.current.style.top ? parseInt(dragEl.current.style.top) : 0;
16161
- const x = clientX - transformFrom.current.x - left;
16162
- const y = clientY - transformFrom.current.y - top;
16163
- dragEl.current.style.transform = `translate(${x}px, ${y}px)`;
16164
- const maybeTarget = "touches" in e ? document.elementFromPoint(clientX, clientY) : e.target;
16165
- const target = maybeTarget instanceof HTMLElement ? maybeTarget?.closest(`[${gridItemIdKey}]`) : void 0;
16166
- if (target instanceof HTMLElement && target !== cloneEl.current && target !== dragEl.current) {
16167
- const targetPos = target.getBoundingClientRect();
16168
- const isHalfwayPassedTarget = (clientY - targetPos.top) / (targetPos.bottom - targetPos.top) > 0.5 || (clientX - targetPos.left) / (targetPos.right - targetPos.left) > 0.5;
16169
- const shouldInsert = isHalfwayPassedTarget && target.nextSibling !== cloneEl.current || !isHalfwayPassedTarget && target.previousSibling !== cloneEl.current;
16170
- if (shouldInsert) {
16171
- gridEl.current.insertBefore(cloneEl.current, isHalfwayPassedTarget ? target.nextSibling : target);
16263
+ ),
16264
+ showTableActions && /* @__PURE__ */ jsxs67(TableActions, { onlyRight: !layoutState?.search, children: [
16265
+ layoutState?.search && /* @__PURE__ */ jsx139(SearchBox, { onSearch: layoutState.setSearchString }),
16266
+ layoutState?.filterDefs && /* @__PURE__ */ jsx139(
16267
+ _Filters,
16268
+ {
16269
+ filterDefs: layoutState.filterDefs,
16270
+ filter: layoutState.filter,
16271
+ onChange: layoutState.setFilter,
16272
+ groupBy: layoutState.groupBy,
16273
+ numberOfInlineFilters: breakpoints.mdAndDown ? 2 : void 0
16172
16274
  }
16275
+ )
16276
+ ] }),
16277
+ /* @__PURE__ */ jsx139(ScrollableContent, { virtualized: isVirtualized, children: isGridTableProps(tableProps) ? /* @__PURE__ */ jsx139(GridTable, { ...tableProps, filter: clientSearch, style: { allWhite: true }, stickyHeader: true }) : /* @__PURE__ */ jsx139(
16278
+ QueryTable,
16279
+ {
16280
+ ...tableProps,
16281
+ filter: clientSearch,
16282
+ style: { allWhite: true },
16283
+ stickyHeader: true
16173
16284
  }
16285
+ ) })
16286
+ ] });
16287
+ }
16288
+ var GridTableLayout = React14.memo(GridTableLayoutComponent);
16289
+ function useGridTableLayoutState({
16290
+ persistedFilter,
16291
+ search,
16292
+ groupBy: maybeGroupBy
16293
+ }) {
16294
+ const filterFallback = { filterDefs: {}, storageKey: "unset-filter" };
16295
+ const { filter, setFilter } = usePersistedFilter(persistedFilter ?? filterFallback);
16296
+ const groupBy = useGroupBy(maybeGroupBy ?? { none: "none" });
16297
+ const [searchString, setSearchString] = useState35("");
16298
+ return {
16299
+ filter,
16300
+ setFilter,
16301
+ filterDefs: persistedFilter?.filterDefs,
16302
+ searchString,
16303
+ setSearchString,
16304
+ search,
16305
+ groupBy: maybeGroupBy ? groupBy : void 0
16306
+ };
16307
+ }
16308
+ function Header2(props) {
16309
+ const { pageTitle, breadcrumb, primaryAction, secondaryAction, tertiaryAction } = props;
16310
+ const tids = useTestIds(props);
16311
+ return /* @__PURE__ */ jsx139(FullBleed, { children: /* @__PURE__ */ jsxs67("header", { css: { ...Css.p3.mb3.mhPx(50).bgWhite.df.jcsb.aic.$ }, ...tids.header, children: [
16312
+ /* @__PURE__ */ jsxs67("div", { children: [
16313
+ breadcrumb && /* @__PURE__ */ jsx139(PageHeaderBreadcrumbs, { breadcrumb }),
16314
+ /* @__PURE__ */ jsx139("h1", { css: Css.xl2Sb.mt1.$, ...tids.pageTitle, children: pageTitle })
16315
+ ] }),
16316
+ /* @__PURE__ */ jsxs67("div", { css: Css.df.fwr.jcfe.gap1.$, children: [
16317
+ tertiaryAction && /* @__PURE__ */ jsx139(Button, { ...tertiaryAction, variant: "tertiary" }),
16318
+ secondaryAction && /* @__PURE__ */ jsx139(Button, { ...secondaryAction, variant: "secondary" }),
16319
+ primaryAction && /* @__PURE__ */ jsx139(Button, { ...primaryAction })
16320
+ ] })
16321
+ ] }) });
16322
+ }
16323
+ function SearchBox({ onSearch }) {
16324
+ const [{ search: initialValue }, setQueryParams] = useQueryParams3({ search: StringParam2 });
16325
+ const [value, setValue] = useState35(initialValue || "");
16326
+ const [debouncedSearch] = useDebounce2(value, 300);
16327
+ useEffect25(() => {
16328
+ onSearch(debouncedSearch);
16329
+ setQueryParams({ search: debouncedSearch || void 0 }, "replaceIn");
16330
+ }, [debouncedSearch, onSearch, setQueryParams]);
16331
+ return /* @__PURE__ */ jsx139("div", { css: Css.wPx(244).$, children: /* @__PURE__ */ jsx139(
16332
+ TextField,
16333
+ {
16334
+ label: "Search",
16335
+ labelStyle: "hidden",
16336
+ value,
16337
+ onChange: (v) => setValue(v ?? ""),
16338
+ placeholder: "Search",
16339
+ clearable: true,
16340
+ startAdornment: /* @__PURE__ */ jsx139(Icon, { icon: "search", color: "rgba(100, 100, 100, 1)" /* Gray700 */ })
16174
16341
  }
16175
- }, []);
16176
- const onDragStart = useCallback20(
16177
- (e) => {
16178
- if (!reorderViaKeyboard.current && dragEl.current && gridEl.current) {
16179
- initReorder();
16180
- const gridRect = gridEl.current.getBoundingClientRect();
16181
- const rect = dragEl.current.getBoundingClientRect();
16182
- const clientX = "clientX" in e ? e.clientX : e.touches[0].clientX;
16183
- const clientY = "clientY" in e ? e.clientY : e.touches[0].clientY;
16184
- const top = rect.top - gridRect.top;
16185
- const left = rect.left - gridRect.left;
16186
- transformFrom.current = { x: clientX - left, y: clientY - top };
16187
- cloneEl.current = dragEl.current.cloneNode();
16188
- cloneEl.current?.setAttribute(
16189
- "style",
16190
- `border-width: 2px; border-color: ${"rgba(201, 201, 201, 1)" /* Gray400 */}; border-style: dashed; width:${rect.width}px; height:${rect.height}px;`
16191
- );
16192
- cloneEl.current?.setAttribute(gridCloneKey, "true");
16193
- cloneEl.current.removeAttribute("id");
16194
- cloneEl.current?.classList.remove(activeGridItemClass);
16195
- gridEl.current.insertBefore(cloneEl.current, dragEl.current.nextSibling);
16196
- dragEl.current.setAttribute(
16197
- "style",
16198
- `pointer-events: none; position:fixed; z-index: 9999; top:${top}px; left:${left}px; width:${rect.width}px; height:${rect.height}px;`
16199
- );
16200
- gridEl.current.style.cursor = "grabbing";
16201
- gridEl.current.addEventListener("mousemove", onMove);
16202
- gridEl.current.addEventListener("touchmove", onMove);
16203
- }
16204
- },
16205
- [initReorder, onMove]
16342
+ ) });
16343
+ }
16344
+
16345
+ // src/components/Layout/PreventBrowserScroll.tsx
16346
+ import { jsx as jsx140 } from "@emotion/react/jsx-runtime";
16347
+ function PreventBrowserScroll({ children }) {
16348
+ return (
16349
+ // Take over the full viewport and hide any overflown content.
16350
+ // Using `-webkit-fill-available`, otherwise `height: 100vh` includes the app bars in mobile Safari. See https://allthingssmitty.com/2020/05/11/css-fix-for-100vh-in-mobile-webkit/
16351
+ // Setting the multiple "(min|max-)height" properties is necessary, as Truss will turn this into an object and there can only be one `height` property.
16352
+ /* @__PURE__ */ jsx140("div", { css: Css.oh.vh100.mh("-webkit-fill-available").maxh("-webkit-fill-available").$, children: /* @__PURE__ */ jsx140("div", { css: Css.h100.df.fdc.mh0.oa.$, children }) })
16206
16353
  );
16207
- const onDragEnd = useCallback20(
16208
- (e) => {
16209
- if (!reorderViaKeyboard.current && dragEl.current && cloneEl.current && gridEl.current) {
16210
- e.preventDefault();
16211
- cloneEl.current.replaceWith(dragEl.current);
16212
- gridEl.current.querySelectorAll(`[${gridCloneKey}]`).forEach((el) => el.remove());
16213
- dragEl.current.removeAttribute("style");
16214
- gridEl.current.style.cursor = "auto";
16215
- cloneEl.current = void 0;
16216
- commitReorder();
16217
- gridEl.current.removeEventListener("mousemove", onMove);
16218
- gridEl.current.removeEventListener("touchmove", onMove);
16219
- }
16354
+ }
16355
+
16356
+ // src/components/Layout/RightPaneLayout/RightPaneContext.tsx
16357
+ import React15, { useCallback as useCallback18, useContext as useContext13, useMemo as useMemo33, useState as useState36 } from "react";
16358
+ import { jsx as jsx141 } from "@emotion/react/jsx-runtime";
16359
+ var RightPaneContext = React15.createContext({
16360
+ openInPane: () => {
16361
+ },
16362
+ closePane: () => {
16363
+ },
16364
+ clearPane: () => {
16365
+ },
16366
+ isRightPaneOpen: false,
16367
+ rightPaneContent: null
16368
+ });
16369
+ function RightPaneProvider({ children }) {
16370
+ const [rightPaneContent, setRightPaneContent] = useState36(void 0);
16371
+ const [isRightPaneOpen, setIsRightPaneOpen] = useState36(false);
16372
+ const openInPane = useCallback18(
16373
+ (opts) => {
16374
+ setRightPaneContent(opts?.content);
16375
+ setIsRightPaneOpen(true);
16220
16376
  },
16221
- [commitReorder, onMove]
16377
+ [setRightPaneContent]
16222
16378
  );
16223
- const onDragHandleKeyDown = useCallback20(
16224
- (e) => {
16225
- const moveHandle = e.target;
16226
- if (dragEl.current instanceof HTMLElement && moveHandle instanceof HTMLElement && gridEl.current) {
16227
- const isSpaceKey = e.key === " ";
16228
- if (isSpaceKey && !reorderViaKeyboard.current) {
16229
- e.preventDefault();
16230
- reorderViaKeyboard.current = true;
16231
- document.addEventListener("pointerdown", cancelReorder);
16232
- initReorder();
16233
- return;
16234
- }
16235
- if (!reorderViaKeyboard.current) {
16236
- return;
16237
- }
16238
- const isEnterKey = e.key === "Enter";
16239
- const isTabKey = e.key === "Tab";
16240
- if (isEnterKey || isSpaceKey || isTabKey) {
16241
- if (!isTabKey) {
16242
- e.preventDefault();
16243
- }
16244
- commitReorder();
16245
- if (isEnterKey) {
16246
- moveHandle.blur();
16247
- }
16248
- document.removeEventListener("pointerdown", cancelReorder);
16249
- return;
16250
- }
16251
- if (e.key === "Escape") {
16252
- e.preventDefault();
16253
- cancelReorder();
16254
- document.removeEventListener("pointerdown", cancelReorder);
16255
- return;
16256
- }
16257
- const movingLeft = ["ArrowLeft", "ArrowUp"].includes(e.key);
16258
- const movingRight = ["ArrowRight", "ArrowDown"].includes(e.key);
16259
- if (movingLeft || movingRight) {
16260
- e.preventDefault();
16261
- const gridItems = getGridItems();
16262
- const currentIndex = gridItems.map((child) => child.getAttribute(gridItemIdKey)).filter(isDefined).indexOf(dragEl.current.getAttribute(gridItemIdKey));
16263
- const newIndex = movingLeft ? currentIndex - 1 : currentIndex + 2;
16264
- const insertBeforeElement = gridItems[newIndex] ?? gridItems[gridItems.length - 1].nextSibling;
16265
- if (movingLeft && currentIndex > 0 || movingRight && currentIndex < gridItems.length - 1) {
16266
- gridEl.current.insertBefore(dragEl.current, insertBeforeElement);
16267
- }
16268
- moveHandle.focus();
16269
- }
16270
- }
16271
- },
16272
- [cancelReorder, commitReorder, initReorder, getGridItems]
16379
+ const closePane = useCallback18(() => setIsRightPaneOpen(false), []);
16380
+ const clearPane = useCallback18(() => setRightPaneContent(void 0), [setRightPaneContent]);
16381
+ const context = useMemo33(
16382
+ () => ({ openInPane, closePane, clearPane, rightPaneContent, isRightPaneOpen }),
16383
+ [openInPane, closePane, rightPaneContent, clearPane, isRightPaneOpen]
16273
16384
  );
16274
- return /* @__PURE__ */ jsx135(DnDGridContext.Provider, { value: { dragEl, onDragHandleKeyDown }, children: /* @__PURE__ */ jsx135(
16275
- "div",
16276
- {
16277
- ref: gridEl,
16278
- css: {
16279
- ...Css.ctis.dg.addIn(`& .${activeGridItemClass}`, activeItemStyles ?? Css.bshModal.$).$,
16280
- ...gridStyles
16281
- },
16282
- onTouchStart: onDragStart,
16283
- onMouseDown: onDragStart,
16284
- onTouchEnd: onDragEnd,
16285
- onMouseUp: onDragEnd,
16286
- ...tid,
16287
- children
16288
- }
16289
- ) });
16385
+ return /* @__PURE__ */ jsx141(RightPaneContext.Provider, { value: context, children });
16290
16386
  }
16291
- var gridItemIdKey = "dndgrid-itemid";
16292
- var gridCloneKey = "dndgrid-clone";
16293
- var activeGridItemClass = "dndgrid-active";
16294
-
16295
- // src/components/DnDGrid/DnDGridItemHandle.tsx
16296
- import { mergeProps as mergeProps12, useFocusRing as useFocusRing13, useHover as useHover17 } from "react-aria";
16297
- import { jsx as jsx136 } from "@emotion/react/jsx-runtime";
16298
- function DnDGridItemHandle(props) {
16299
- const { dragHandleProps, icon = "move", compact = false, color } = props;
16300
- const { focusProps, isFocusVisible } = useFocusRing13();
16301
- const { hoverProps, isHovered } = useHover17({});
16302
- const tid = useTestIds(props, "dragHandle");
16303
- const iconButtonNormal2 = Css.hPx(28).wPx(28).br8.bw2.$;
16304
- const iconButtonCompact2 = Css.hPx(18).wPx(18).br4.bw1.$;
16305
- return /* @__PURE__ */ jsx136(
16306
- "button",
16307
- {
16308
- css: {
16309
- ...compact ? iconButtonCompact2 : iconButtonNormal2,
16310
- ...Css.cursor("grab").bcTransparent.bss.bgTransparent.outline0.dif.aic.jcc.transition.if(isFocusVisible).bcBlue700.$,
16311
- ...isHovered && Css.bgGray200.$
16312
- },
16313
- ...mergeProps12(dragHandleProps, focusProps, hoverProps),
16314
- ...tid,
16315
- children: /* @__PURE__ */ jsx136(Icon, { icon, inc: compact ? 2 : void 0, color })
16316
- }
16317
- );
16387
+ function useRightPaneContext() {
16388
+ return useContext13(RightPaneContext);
16318
16389
  }
16319
16390
 
16320
- // src/components/DnDGrid/useDnDGridItem.tsx
16321
- import { useMemo as useMemo35 } from "react";
16322
- function useDnDGridItem(props) {
16323
- const { id, itemRef } = props;
16324
- const { dragEl, onDragHandleKeyDown } = useDnDGridContext();
16325
- const { dragItemProps, dragHandleProps } = useMemo35(
16326
- () => {
16327
- function initDraggable() {
16328
- if (itemRef.current) {
16329
- dragEl.current = itemRef.current;
16330
- }
16391
+ // src/components/Layout/RightPaneLayout/RightPaneLayout.tsx
16392
+ import { AnimatePresence as AnimatePresence3, motion as motion3 } from "framer-motion";
16393
+ import { useEffect as useEffect26 } from "react";
16394
+ import { Fragment as Fragment30, jsx as jsx142, jsxs as jsxs68 } from "@emotion/react/jsx-runtime";
16395
+ function RightPaneLayout(props) {
16396
+ const { children, paneBgColor = "rgba(255,255,255,1)" /* White */, paneWidth = 450, defaultPaneContent } = props;
16397
+ const { isRightPaneOpen, rightPaneContent, clearPane, closePane } = useRightPaneContext();
16398
+ useEffect26(() => closePane, [closePane]);
16399
+ return /* @__PURE__ */ jsx142("div", { css: Css.h100.df.oxh.$, children: /* @__PURE__ */ jsxs68(Fragment30, { children: [
16400
+ /* @__PURE__ */ jsx142(
16401
+ "div",
16402
+ {
16403
+ css: {
16404
+ ...Css.w(`calc(100% - ${paneWidth + 24}px)`).add("transition", "width .2s linear").h100.mr3.oxa.$,
16405
+ ...Css.if(!isRightPaneOpen).w100.mr0.$,
16406
+ ...Css.if(!!defaultPaneContent).w(`calc(100% - ${paneWidth + 24}px)`).mr3.$
16407
+ },
16408
+ children
16331
16409
  }
16332
- return {
16333
- dragItemProps: { [gridItemIdKey]: id },
16334
- dragHandleProps: {
16335
- onMouseDown: initDraggable,
16336
- onTouchStart: initDraggable,
16337
- onKeyDown: (e) => {
16338
- initDraggable();
16339
- onDragHandleKeyDown(e);
16340
- }
16410
+ ),
16411
+ /* @__PURE__ */ jsxs68("div", { css: Css.relative.if(!!defaultPaneContent).wPx(paneWidth).$, children: [
16412
+ defaultPaneContent && /* @__PURE__ */ jsx142(
16413
+ "div",
16414
+ {
16415
+ css: Css.h100.wPx(paneWidth).left(0).absolute.add("transition", "all .3s ease-in-out").if(isRightPaneOpen).add("opacity", 0).left(100).$,
16416
+ children: defaultPaneContent
16341
16417
  }
16342
- };
16343
- },
16344
- // TODO: validate this eslint-disable. It was automatically ignored as part of https://app.shortcut.com/homebound-team/story/40033/enable-react-hooks-exhaustive-deps-for-react-projects
16345
- // eslint-disable-next-line react-hooks/exhaustive-deps
16346
- [dragEl, id, itemRef]
16347
- );
16348
- return { dragHandleProps, dragItemProps };
16418
+ ),
16419
+ /* @__PURE__ */ jsx142(AnimatePresence3, { children: isRightPaneOpen && /* @__PURE__ */ jsx142(
16420
+ motion3.div,
16421
+ {
16422
+ layout: "position",
16423
+ "data-testid": "rightPaneContent",
16424
+ css: Css.bgColor(paneBgColor).h100.wPx(paneWidth).$,
16425
+ initial: { x: paneWidth + 24, position: "absolute" },
16426
+ animate: { x: 0 },
16427
+ transition: { ease: "linear", duration: 0.2 },
16428
+ exit: { transition: { ease: "linear", duration: 0.2 }, x: paneWidth },
16429
+ onAnimationComplete: (definition) => definition.x !== 0 && clearPane(),
16430
+ children: rightPaneContent
16431
+ },
16432
+ "rightPane"
16433
+ ) })
16434
+ ] })
16435
+ ] }) });
16349
16436
  }
16350
16437
 
16351
- // src/components/Filters/BaseFilter.ts
16352
- var BaseFilter = class {
16353
- constructor(key, props) {
16354
- this.key = key;
16355
- this.props = props;
16356
- }
16357
- get label() {
16358
- return this.props.label || defaultLabel(this.key);
16359
- }
16360
- get defaultValue() {
16361
- return this.props.defaultValue;
16362
- }
16363
- testId(tid) {
16364
- return tid[defaultTestId(this.label)];
16365
- }
16366
- };
16438
+ // src/components/Layout/RightPaneLayout/useRightPane.tsx
16439
+ function useRightPane() {
16440
+ const { openInPane, closePane } = useRightPaneContext();
16441
+ return {
16442
+ openRightPane: openInPane,
16443
+ closeRightPane: closePane
16444
+ };
16445
+ }
16367
16446
 
16368
- // src/components/Filters/DateFilter.tsx
16369
- import { Fragment as Fragment25, jsx as jsx137, jsxs as jsxs66 } from "@emotion/react/jsx-runtime";
16370
- function dateFilter(props) {
16371
- return (key) => new DateFilter(key, props);
16447
+ // src/components/Toast/ToastContext.tsx
16448
+ import { createContext as createContext5, useCallback as useCallback19, useContext as useContext14, useMemo as useMemo34, useState as useState37 } from "react";
16449
+ import { jsx as jsx143 } from "@emotion/react/jsx-runtime";
16450
+ var ToastContext = createContext5({
16451
+ setNotice: () => {
16452
+ throw new Error("Missing ToastProvider");
16453
+ },
16454
+ clear: () => {
16455
+ },
16456
+ notice: void 0
16457
+ });
16458
+ function ToastProvider(props) {
16459
+ const [notice, setNotice] = useState37();
16460
+ const clear = useCallback19(() => setNotice(void 0), [setNotice]);
16461
+ const contextValue = useMemo34(() => ({ setNotice, notice, clear }), [notice, clear]);
16462
+ return /* @__PURE__ */ jsx143(ToastContext.Provider, { value: contextValue, children: props.children });
16463
+ }
16464
+ function useToastContext() {
16465
+ return useContext14(ToastContext);
16372
16466
  }
16373
- var anyOption = {};
16374
- var DateFilter = class extends BaseFilter {
16375
- render(value, setValue, tid, inModal, vertical) {
16376
- const { label, operations, getOperationValue, getOperationLabel } = this.props;
16377
- return /* @__PURE__ */ jsxs66(Fragment25, { children: [
16378
- vertical && /* @__PURE__ */ jsx137(Label, { label }),
16379
- /* @__PURE__ */ jsxs66(CompoundField, { children: [
16380
- /* @__PURE__ */ jsx137(
16381
- SelectField,
16382
- {
16383
- compact: true,
16384
- sizeToContent: true,
16385
- options: [
16386
- // Always show the 'Any' option
16387
- anyOption,
16388
- ...operations
16389
- ],
16390
- getOptionValue: (o) => o === anyOption ? void 0 : getOperationValue(o),
16391
- getOptionLabel: (o) => o === anyOption ? "Any" : getOperationLabel(o),
16392
- value: value?.op,
16393
- onSelect: (op) => (
16394
- // default the selected date to today if it doesn't exist in the filter's value
16395
- setValue(op ? { op, value: value?.value ? new Date(value.value) : /* @__PURE__ */ new Date() } : void 0)
16396
- ),
16397
- label: inModal ? `${label} date filter operation` : label,
16398
- labelStyle: !inModal && !vertical ? "inline" : inModal || vertical ? "hidden" : "above",
16399
- nothingSelectedText: "Any",
16400
- ...tid[`${defaultTestId(this.label)}_dateOperation`]
16401
- }
16402
- ),
16403
- /* @__PURE__ */ jsx137(
16404
- DateField,
16405
- {
16406
- compact: true,
16407
- labelStyle: "inline",
16408
- value: value?.value ? new Date(value.value) : /* @__PURE__ */ new Date(),
16409
- label: "Date",
16410
- onChange: (d) => setValue({ ...value, value: d }),
16411
- disabled: !value,
16412
- ...tid[`${defaultTestId(this.label)}_dateField`]
16413
- }
16414
- )
16415
- ] })
16416
- ] });
16417
- }
16418
- };
16419
16467
 
16420
- // src/components/Filters/DateRangeFilter.tsx
16421
- import { Fragment as Fragment26, jsx as jsx138, jsxs as jsxs67 } from "@emotion/react/jsx-runtime";
16422
- function dateRangeFilter(props) {
16423
- return (key) => new DateRangeFilter(key, props);
16468
+ // src/components/BeamContext.tsx
16469
+ import { jsx as jsx144, jsxs as jsxs69 } from "@emotion/react/jsx-runtime";
16470
+ var BeamContext = createContext6({
16471
+ modalState: new EmptyRef(),
16472
+ modalCanCloseChecks: new EmptyRef(),
16473
+ modalHeaderDiv: void 0,
16474
+ modalBodyDiv: void 0,
16475
+ modalFooterDiv: void 0,
16476
+ drawerContentStack: new EmptyRef(),
16477
+ drawerCanCloseChecks: new EmptyRef(),
16478
+ drawerCanCloseDetailsChecks: new EmptyRef(),
16479
+ sdHeaderDiv: void 0
16480
+ });
16481
+ function BeamProvider({ children, ...presentationProps }) {
16482
+ const [, tick] = useReducer((prev) => prev + 1, 0);
16483
+ const modalRef = useRef43();
16484
+ const modalHeaderDiv = useMemo35(() => document.createElement("div"), []);
16485
+ const modalBodyDiv = useMemo35(() => {
16486
+ const el = document.createElement("div");
16487
+ el.style.height = "100%";
16488
+ return el;
16489
+ }, []);
16490
+ const modalCanCloseChecksRef = useRef43([]);
16491
+ const modalFooterDiv = useMemo35(() => document.createElement("div"), []);
16492
+ const drawerContentStackRef = useRef43([]);
16493
+ const drawerCanCloseChecks = useRef43([]);
16494
+ const drawerCanCloseDetailsChecks = useRef43([]);
16495
+ const sdHeaderDiv = useMemo35(() => document.createElement("div"), []);
16496
+ const context = useMemo35(() => {
16497
+ return {
16498
+ // These two keys need to trigger re-renders on change
16499
+ modalState: new PretendRefThatTicks(modalRef, tick),
16500
+ drawerContentStack: new PretendRefThatTicks(drawerContentStackRef, tick),
16501
+ // The rest we don't need to re-render when these are mutated, so just expose as-is
16502
+ modalCanCloseChecks: modalCanCloseChecksRef,
16503
+ modalHeaderDiv,
16504
+ modalBodyDiv,
16505
+ modalFooterDiv,
16506
+ drawerCanCloseChecks,
16507
+ drawerCanCloseDetailsChecks,
16508
+ sdHeaderDiv
16509
+ };
16510
+ }, [modalBodyDiv, modalFooterDiv, modalHeaderDiv, sdHeaderDiv]);
16511
+ return /* @__PURE__ */ jsx144(BeamContext.Provider, { value: { ...context }, children: /* @__PURE__ */ jsx144(PresentationProvider, { ...presentationProps, children: /* @__PURE__ */ jsx144(RightPaneProvider, { children: /* @__PURE__ */ jsx144(AutoSaveStatusProvider, { children: /* @__PURE__ */ jsx144(SnackbarProvider, { children: /* @__PURE__ */ jsxs69(ToastProvider, { children: [
16512
+ /* @__PURE__ */ jsxs69(OverlayProvider, { children: [
16513
+ children,
16514
+ modalRef.current && /* @__PURE__ */ jsx144(Modal, { ...modalRef.current })
16515
+ ] }),
16516
+ /* @__PURE__ */ jsx144(SuperDrawer, {})
16517
+ ] }) }) }) }) }) });
16424
16518
  }
16425
- var DateRangeFilter = class extends BaseFilter {
16426
- render(value, setValue, tid, inModal, vertical) {
16427
- const { label, placeholderText, disabledDays, testFieldLabel, defaultValue } = this.props;
16428
- return /* @__PURE__ */ jsxs67(Fragment26, { children: [
16429
- vertical && /* @__PURE__ */ jsx138(Label, { label }),
16430
- /* @__PURE__ */ jsx138(
16431
- DateRangeField,
16432
- {
16433
- compact: true,
16434
- labelStyle: "inline",
16435
- isRangeFilterField: true,
16436
- placeholder: placeholderText,
16437
- label: testFieldLabel ?? "Date",
16438
- value: value?.value ? { from: new Date(value.value.from), to: new Date(value.value.to) } : void 0,
16439
- onChange: (d) => d ? setValue({ op: defaultValue?.op, value: d }) : setValue(void 0),
16440
- disabledDays,
16441
- ...tid[`${defaultTestId(this.label)}_dateField`]
16442
- }
16443
- )
16444
- ] });
16519
+ var PretendRefThatTicks = class {
16520
+ constructor(ref, tick) {
16521
+ this.ref = ref;
16522
+ this.tick = tick;
16523
+ }
16524
+ get current() {
16525
+ return this.ref.current;
16526
+ }
16527
+ set current(value) {
16528
+ this.ref.current = value;
16529
+ this.tick();
16445
16530
  }
16446
16531
  };
16447
-
16448
- // src/components/Filters/MultiFilter.tsx
16449
- import { jsx as jsx139 } from "@emotion/react/jsx-runtime";
16450
- function multiFilter(props) {
16451
- return (key) => new MultiFilter(key, props);
16532
+ function useBeamContext() {
16533
+ return useContext15(BeamContext);
16452
16534
  }
16453
- var MultiFilter = class extends BaseFilter {
16454
- render(value, setValue, tid, inModal, vertical) {
16455
- if (inModal && Array.isArray(this.props.options) && this.props.options.length > 0 && this.props.options.length <= 8) {
16456
- const { disabledOptions } = this.props;
16457
- const disabledOptionsWithReasons = Object.fromEntries(disabledOptions?.map(disabledOptionToKeyedTuple) ?? []);
16458
- const disabledKeys = Object.keys(disabledOptionsWithReasons);
16459
- return /* @__PURE__ */ jsx139(
16460
- ToggleChipGroup,
16461
- {
16462
- label: this.label,
16463
- options: this.props.options.map((o) => {
16464
- const value2 = this.props.getOptionValue(o);
16465
- const disabled = value2 && disabledKeys.includes(value2.toString());
16466
- const disabledReason = disabled ? disabledOptionsWithReasons[value2.toString()] : void 0;
16467
- return {
16468
- label: this.props.getOptionLabel(o),
16469
- value: value2,
16470
- disabled: disabledReason ?? disabled
16471
- };
16472
- }),
16473
- onChange: (values) => {
16474
- setValue(values.length === 0 ? void 0 : values);
16475
- },
16476
- values: value || [],
16477
- labelStyle: "hidden",
16478
- ...tid[defaultTestId(this.label)]
16479
- }
16480
- );
16535
+
16536
+ // src/components/ButtonDatePicker.tsx
16537
+ import { useRef as useRef44 } from "react";
16538
+ import { useMenuTrigger as useMenuTrigger3 } from "react-aria";
16539
+ import { useMenuTriggerState as useMenuTriggerState3 } from "react-stately";
16540
+ import { jsx as jsx145 } from "@emotion/react/jsx-runtime";
16541
+ function ButtonDatePicker(props) {
16542
+ const { defaultOpen, disabled, trigger, onSelect, ...datePickerProps } = props;
16543
+ const state = useMenuTriggerState3({ isOpen: defaultOpen });
16544
+ const buttonRef = useRef44(null);
16545
+ const { menuTriggerProps, menuProps } = useMenuTrigger3({ isDisabled: !!disabled }, state, buttonRef);
16546
+ const tid = useTestIds(
16547
+ props,
16548
+ isTextButton(trigger) ? defaultTestId(labelOr(trigger, "buttonDatePicker")) : isNavLinkButton(trigger) ? defaultTestId(trigger.navLabel) : isIconButton(trigger) ? trigger.icon : trigger.name
16549
+ );
16550
+ return /* @__PURE__ */ jsx145(OverlayTrigger, { ...props, menuTriggerProps, state, buttonRef, ...tid, children: /* @__PURE__ */ jsx145(DatePickerOverlay, { overlayProps: menuProps, children: /* @__PURE__ */ jsx145(
16551
+ DatePicker,
16552
+ {
16553
+ ...datePickerProps,
16554
+ onSelect: (d) => {
16555
+ onSelect(d);
16556
+ state.close();
16557
+ },
16558
+ ...tid.datePicker
16481
16559
  }
16482
- const { defaultValue, nothingSelectedText, ...props } = this.props;
16483
- return /* @__PURE__ */ jsx139(
16484
- MultiSelectField,
16560
+ ) }) });
16561
+ }
16562
+
16563
+ // src/components/ButtonGroup.tsx
16564
+ import { useRef as useRef45 } from "react";
16565
+ import { useButton as useButton10, useFocusRing as useFocusRing12, useHover as useHover15 } from "react-aria";
16566
+ import { jsx as jsx146, jsxs as jsxs70 } from "@emotion/react/jsx-runtime";
16567
+ function ButtonGroup(props) {
16568
+ const { buttons, disabled = false, size = "sm" } = props;
16569
+ const tid = useTestIds(props, "buttonGroup");
16570
+ return (
16571
+ // Adding `line-height: 0` prevent inheriting line-heights that might throw off sizing within the button group.
16572
+ /* @__PURE__ */ jsx146("div", { ...tid, css: Css.df.lh(0).add({ ...sizeStyles2[size] }).$, children: buttons.map(({ disabled: buttonDisabled, ...buttonProps }, i) => (
16573
+ // Disable the button if the ButtonGroup is disabled or if the current button is disabled.
16574
+ /* @__PURE__ */ jsx146(GroupButton, { ...buttonProps, disabled: disabled || buttonDisabled, size, ...tid }, i)
16575
+ )) })
16576
+ );
16577
+ }
16578
+ function GroupButton(props) {
16579
+ const { icon, iconInc, iconColor, text, active, onClick: onPress, disabled, size, tooltip, ...otherProps } = props;
16580
+ const ariaProps = { onPress, isDisabled: !!disabled, ...otherProps };
16581
+ const ref = useRef45(null);
16582
+ const { buttonProps, isPressed } = useButton10(ariaProps, ref);
16583
+ const { isFocusVisible, focusProps } = useFocusRing12();
16584
+ const { hoverProps, isHovered } = useHover15(ariaProps);
16585
+ const tid = useTestIds(props);
16586
+ return /* @__PURE__ */ jsx146("span", { css: getButtonStyles2(), children: maybeTooltip({
16587
+ title: resolveTooltip(disabled, tooltip),
16588
+ placement: "top",
16589
+ children: /* @__PURE__ */ jsxs70(
16590
+ "button",
16485
16591
  {
16486
- ...props,
16487
- compact: !vertical,
16488
- label: this.label,
16489
- values: value || [],
16490
- labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
16491
- sizeToContent: !inModal && !vertical,
16492
- onSelect: (values) => {
16493
- setValue(values.length === 0 ? void 0 : values);
16592
+ ref,
16593
+ ...buttonProps,
16594
+ ...focusProps,
16595
+ ...hoverProps,
16596
+ css: {
16597
+ ...Css.buttonBase.px2.br0.h100.$,
16598
+ "&:disabled": Css.gray400.cursorNotAllowed.bcGray300.$,
16599
+ ...isFocusVisible ? defaultFocusRingStyles2 : {},
16600
+ ...active ? activeStyles3 : {},
16601
+ ...isPressed ? pressedStyles2 : isHovered ? hoverStyles3 : {},
16602
+ ...icon ? iconStyles2[size] : {}
16494
16603
  },
16495
- nothingSelectedText: nothingSelectedText ?? "All",
16496
- ...this.testId(tid)
16604
+ ...tid[defaultTestId(typeof text === "string" && text || icon || "button")],
16605
+ children: [
16606
+ icon && /* @__PURE__ */ jsx146(Icon, { xss: Css.if(!!text).mrPx(4).$, icon, color: disabled ? void 0 : iconColor, inc: iconInc }),
16607
+ text
16608
+ ]
16497
16609
  }
16498
- );
16499
- }
16500
- };
16501
-
16502
- // src/components/Filters/NumberRangeFilter.tsx
16503
- import { Fragment as Fragment27, jsx as jsx140, jsxs as jsxs68 } from "@emotion/react/jsx-runtime";
16504
- function numberRangeFilter(props) {
16505
- return (key) => new NumberRangeFilter(key, props);
16610
+ )
16611
+ }) });
16506
16612
  }
16507
- var NumberRangeFilter = class extends BaseFilter {
16508
- render(value, setValue, tid, inModal, vertical) {
16509
- const { label, numberFieldType, numberFormatOptions } = this.props;
16510
- const min = value?.min ?? void 0;
16511
- const max = value?.max ?? void 0;
16512
- return /* @__PURE__ */ jsxs68(Fragment27, { children: [
16513
- vertical && /* @__PURE__ */ jsxs68("div", { ...tid, children: [
16514
- /* @__PURE__ */ jsx140(Label, { label }),
16515
- /* @__PURE__ */ jsx140("div", { css: Css.pb1.$, children: /* @__PURE__ */ jsx140(
16516
- NumberField,
16517
- {
16518
- labelStyle: "inline",
16519
- clearable: true,
16520
- label: "Min",
16521
- value: min,
16522
- type: numberFieldType,
16523
- numberFormatOptions,
16524
- onChange: (minVal) => {
16525
- const maxValue = max ? { max } : {};
16526
- setValue(minVal || max ? { min: minVal, ...maxValue } : void 0);
16527
- },
16528
- ...tid[`${defaultTestId(label)}_min_vertical`]
16529
- }
16530
- ) }),
16531
- /* @__PURE__ */ jsx140(
16532
- NumberField,
16533
- {
16534
- labelStyle: "inline",
16535
- clearable: true,
16536
- label: "Max",
16537
- value: max,
16538
- type: numberFieldType,
16539
- numberFormatOptions,
16540
- onChange: (maxVal) => {
16541
- const minValue = min ? { min } : {};
16542
- setValue(maxVal || min ? { max: maxVal, ...minValue } : void 0);
16543
- },
16544
- ...tid[`${defaultTestId(label)}_max_vertical`]
16545
- }
16546
- )
16547
- ] }),
16548
- !vertical && /* @__PURE__ */ jsxs68(CompoundField, { ...tid, children: [
16549
- /* @__PURE__ */ jsx140(
16550
- NumberField,
16551
- {
16552
- compact: true,
16553
- sizeToContent: !inModal,
16554
- labelStyle: "inline",
16555
- clearable: true,
16556
- label: !inModal ? `${label} Min` : "Min",
16557
- value: min,
16558
- type: numberFieldType,
16559
- numberFormatOptions,
16560
- onChange: (minVal) => {
16561
- const maxValue = max ? { max } : {};
16562
- setValue(minVal || max ? { min: minVal, ...maxValue } : void 0);
16563
- },
16564
- ...tid[`${defaultTestId(label)}_min`]
16565
- }
16566
- ),
16567
- /* @__PURE__ */ jsx140(
16568
- NumberField,
16569
- {
16570
- compact: true,
16571
- sizeToContent: !inModal,
16572
- labelStyle: "inline",
16573
- clearable: true,
16574
- label: !inModal ? `${label} Max` : "Max",
16575
- value: max,
16576
- type: numberFieldType,
16577
- numberFormatOptions,
16578
- onChange: (maxVal) => {
16579
- const minValue = min ? { min } : {};
16580
- setValue(maxVal || min ? { max: maxVal, ...minValue } : void 0);
16581
- },
16582
- ...tid[`${defaultTestId(label)}_max`]
16583
- }
16584
- )
16585
- ] })
16586
- ] });
16587
- }
16613
+ var pressedStyles2 = Css.bgGray200.$;
16614
+ var activeStyles3 = Css.bgGray300.$;
16615
+ var hoverStyles3 = Css.bgGray100.$;
16616
+ var defaultFocusRingStyles2 = Css.relative.z2.bshFocus.$;
16617
+ function getButtonStyles2() {
16618
+ return {
16619
+ ...Css.z1.bgWhite.bcGray300.bw1.ba.gray900.br0.oh.$,
16620
+ // Our first button should have a rounded left border
16621
+ "&:first-of-type": Css.add("borderRadius", "4px 0 0 4px").$,
16622
+ // Our last button should have a rounded right border
16623
+ "&:last-of-type": Css.add("borderRadius", "0 4px 4px 0").$,
16624
+ // Nudge buttons one pixel to the left so they visually share a border
16625
+ "&:not(:first-of-type)": Css.mlPx(-1).$
16626
+ };
16627
+ }
16628
+ var sizeStyles2 = {
16629
+ xs: Css.hPx(28).$,
16630
+ sm: Css.hPx(32).$,
16631
+ md: Css.hPx(40).$
16632
+ };
16633
+ var iconStyles2 = {
16634
+ xs: Css.pxPx(2).$,
16635
+ sm: Css.pxPx(4).$,
16636
+ md: Css.px1.$
16588
16637
  };
16589
16638
 
16590
- // src/components/Filters/SingleFilter.tsx
16591
- import { jsx as jsx141 } from "@emotion/react/jsx-runtime";
16592
- function singleFilter(props) {
16593
- return (key) => new SingleFilter(key, props);
16639
+ // src/components/ButtonMenu.tsx
16640
+ import { useRef as useRef46 } from "react";
16641
+ import { useMenuTrigger as useMenuTrigger4 } from "react-aria";
16642
+ import { useMenuTriggerState as useMenuTriggerState4 } from "react-stately";
16643
+ import { jsx as jsx147 } from "@emotion/react/jsx-runtime";
16644
+ function ButtonMenu(props) {
16645
+ const { defaultOpen, disabled, items, persistentItems, trigger, searchable, contrast = false } = props;
16646
+ let selectedItem, onChange;
16647
+ if (isSelectionButtonMenuProps(props)) {
16648
+ selectedItem = props.selectedItem;
16649
+ onChange = props.onChange;
16650
+ }
16651
+ const state = useMenuTriggerState4({ isOpen: defaultOpen });
16652
+ const buttonRef = useRef46(null);
16653
+ const { menuTriggerProps, menuProps } = useMenuTrigger4({ isDisabled: !!disabled }, state, buttonRef);
16654
+ const tid = useTestIds(
16655
+ props,
16656
+ isTextButton(trigger) ? labelOr(trigger, "buttonMenu") : isNavLinkButton(trigger) ? defaultTestId(trigger.navLabel) : isIconButton(trigger) ? trigger.icon : trigger.name
16657
+ );
16658
+ return /* @__PURE__ */ jsx147(
16659
+ OverlayTrigger,
16660
+ {
16661
+ ...props,
16662
+ menuTriggerProps,
16663
+ state,
16664
+ buttonRef,
16665
+ ...tid,
16666
+ contrast,
16667
+ children: /* @__PURE__ */ jsx147(
16668
+ Menu,
16669
+ {
16670
+ ariaMenuProps: menuProps,
16671
+ onClose: () => state.close(),
16672
+ items,
16673
+ persistentItems,
16674
+ searchable,
16675
+ contrast,
16676
+ selectedItem,
16677
+ onChange,
16678
+ ...tid
16679
+ }
16680
+ )
16681
+ }
16682
+ );
16594
16683
  }
16595
- var allOption = {};
16596
- var SingleFilter = class extends BaseFilter {
16597
- render(value, setValue, tid, inModal, vertical) {
16598
- const {
16599
- label,
16600
- defaultValue,
16601
- options: maybeOptions,
16602
- getOptionLabel,
16603
- getOptionValue,
16604
- nothingSelectedText,
16605
- ...props
16606
- } = this.props;
16607
- const options = Array.isArray(maybeOptions) ? [allOption, ...maybeOptions] : { ...maybeOptions, current: maybeOptions.current };
16608
- return /* @__PURE__ */ jsx141(
16609
- SelectField,
16610
- {
16611
- ...props,
16612
- options,
16613
- getOptionValue: (o) => o === allOption ? void 0 : getOptionValue(o),
16614
- getOptionLabel: (o) => o === allOption ? nothingSelectedText ?? "All" : getOptionLabel(o),
16615
- compact: !vertical,
16616
- value,
16617
- label: this.label,
16618
- labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
16619
- sizeToContent: !inModal && !vertical,
16620
- nothingSelectedText: nothingSelectedText ?? "All",
16621
- onSelect: (value2) => setValue(value2 || void 0),
16622
- ...this.testId(tid)
16684
+ function isSelectionButtonMenuProps(props) {
16685
+ return typeof props === "object" && "selectedItem" in props && "onChange" in props;
16686
+ }
16687
+
16688
+ // src/components/Card.tsx
16689
+ import { useMemo as useMemo36 } from "react";
16690
+ import { useHover as useHover16 } from "react-aria";
16691
+
16692
+ // src/components/Tag.tsx
16693
+ import { useResizeObserver as useResizeObserver4 } from "@react-aria/utils";
16694
+ import { useRef as useRef47, useState as useState38 } from "react";
16695
+ import { jsx as jsx148, jsxs as jsxs71 } from "@emotion/react/jsx-runtime";
16696
+ function Tag(props) {
16697
+ const { text, type, xss, preventTooltip = false, ...otherProps } = props;
16698
+ const typeStyles2 = getStyles(type);
16699
+ const tid = useTestIds(otherProps);
16700
+ const [showTooltip, setShowTooltip] = useState38(false);
16701
+ const ref = useRef47(null);
16702
+ useResizeObserver4({
16703
+ ref,
16704
+ onResize: () => {
16705
+ if (ref.current) {
16706
+ setShowTooltip(ref.current.offsetHeight < ref.current.scrollHeight);
16623
16707
  }
16624
- );
16708
+ }
16709
+ });
16710
+ return maybeTooltip({
16711
+ title: !preventTooltip && showTooltip ? text : void 0,
16712
+ children: /* @__PURE__ */ jsxs71("span", { ...tid, css: { ...Css.dif.tinySb.ttu.aic.gapPx(4).pxPx(6).pyPx(2).gray900.br4.$, ...typeStyles2, ...xss }, children: [
16713
+ otherProps.icon && /* @__PURE__ */ jsx148("span", { css: Css.fs0.$, children: /* @__PURE__ */ jsx148(Icon, { icon: otherProps.icon, inc: 1.5 }) }),
16714
+ /* @__PURE__ */ jsx148("span", { ref, css: Css.lineClamp1.wbba.$, children: text })
16715
+ ] })
16716
+ });
16717
+ }
16718
+ function getStyles(type) {
16719
+ switch (type) {
16720
+ case "info":
16721
+ return Css.bgBlue100.$;
16722
+ case "caution":
16723
+ return Css.bgYellow200.$;
16724
+ case "warning":
16725
+ return Css.bgRed200.$;
16726
+ case "success":
16727
+ return Css.bgGreen200.$;
16728
+ default:
16729
+ return Css.bgGray200.$;
16625
16730
  }
16626
- };
16627
-
16628
- // src/components/Filters/TreeFilter.tsx
16629
- import { jsx as jsx142 } from "@emotion/react/jsx-runtime";
16630
- function treeFilter(props) {
16631
- return (key) => new TreeFilter(key, props);
16632
16731
  }
16633
- var TreeFilter = class extends BaseFilter {
16634
- render(value, setValue, tid, inModal, vertical) {
16635
- const { defaultValue, nothingSelectedText, filterBy = "root", ...props } = this.props;
16636
- return /* @__PURE__ */ jsx142(
16637
- TreeSelectField,
16638
- {
16639
- ...props,
16640
- label: this.label,
16641
- values: value,
16642
- compact: !vertical,
16643
- labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
16644
- sizeToContent: !inModal && !vertical,
16645
- onSelect: (options) => {
16646
- const values = options[filterBy].values;
16647
- setValue(values.length === 0 ? void 0 : values);
16732
+
16733
+ // src/components/Card.tsx
16734
+ import { jsx as jsx149, jsxs as jsxs72 } from "@emotion/react/jsx-runtime";
16735
+ function Card(props) {
16736
+ const {
16737
+ title,
16738
+ subtitle,
16739
+ detailContent,
16740
+ imgSrc,
16741
+ imageFit = "contain",
16742
+ type = "card",
16743
+ bordered = false,
16744
+ disabled: isDisabled = false,
16745
+ buttonMenuItems,
16746
+ tag
16747
+ } = props;
16748
+ const tid = useTestIds(props, "card");
16749
+ const { hoverProps, isHovered } = useHover16({ isDisabled });
16750
+ const isList = type === "list";
16751
+ const imgHeight = isList ? 96 : bordered ? 224 : 256;
16752
+ const styles = useMemo36(
16753
+ () => ({
16754
+ ...baseStyles4(type),
16755
+ ...isList && listStyles,
16756
+ ...bordered && borderedStyles,
16757
+ ...isHovered && cardHoverStyles,
16758
+ ...isDisabled && disabledStyles3
16759
+ }),
16760
+ [isDisabled, isHovered, bordered, type, isList]
16761
+ );
16762
+ return /* @__PURE__ */ jsxs72("div", { css: styles, ...hoverProps, ...tid, children: [
16763
+ /* @__PURE__ */ jsx149(
16764
+ "div",
16765
+ {
16766
+ css: {
16767
+ ...Css.hPx(imgHeight).ba.br8.bcGray300.oh.df.asc.jsc.relative.add("filter", "brightness(1)").$,
16768
+ ...isHovered && !isList && imageHoverStyles
16648
16769
  },
16649
- nothingSelectedText: nothingSelectedText ?? "All",
16650
- ...this.testId(tid)
16770
+ children: /* @__PURE__ */ jsx149("img", { css: Css.w100.h100.objectFit(imageFit).$, src: imgSrc, alt: title, ...tid.img })
16651
16771
  }
16652
- );
16653
- }
16654
- };
16655
-
16656
- // src/components/Filters/BooleanFilter.tsx
16657
- import { jsx as jsx143 } from "@emotion/react/jsx-runtime";
16658
- function booleanFilter(props) {
16659
- return (key) => new BooleanFilter(key, props);
16660
- }
16661
- var BooleanFilter = class extends BaseFilter {
16662
- render(value, setValue, tid, inModal, vertical) {
16663
- const { options = defaultBooleanOptions, label, defaultValue, ...props } = this.props;
16664
- return /* @__PURE__ */ jsx143(
16665
- SelectField,
16772
+ ),
16773
+ isHovered && buttonMenuItems && /* @__PURE__ */ jsx149("div", { css: Css.absolute.right1.top1.if(bordered && !isList).right3.top3.$, children: /* @__PURE__ */ jsx149(
16774
+ ButtonMenu,
16666
16775
  {
16667
- ...props,
16668
- compact: !vertical,
16669
- label: this.label,
16670
- value: String(value),
16671
- labelStyle: inModal ? "hidden" : !inModal && !vertical ? "inline" : "above",
16672
- sizeToContent: !inModal && !vertical,
16673
- options,
16674
- getOptionValue: (o) => String(o[0]),
16675
- getOptionLabel: (o) => o[1],
16676
- onSelect: (value2) => {
16677
- const parsedValue = value2 === "undefined" ? void 0 : value2 === "true";
16678
- setValue(parsedValue);
16679
- },
16680
- ...this.testId(tid)
16776
+ trigger: { icon: "verticalDots", color: isList ? "rgba(100, 100, 100, 1)" /* Gray700 */ : "rgba(255,255,255,1)" /* White */ },
16777
+ items: buttonMenuItems
16681
16778
  }
16682
- );
16683
- }
16684
- };
16685
- var defaultBooleanOptions = [
16686
- [void 0, "Any"],
16687
- [true, "Yes"],
16688
- [false, "No"]
16689
- ];
16779
+ ) }),
16780
+ tag && /* @__PURE__ */ jsx149("div", { css: Css.absolute.left1.topPx(4).$, children: /* @__PURE__ */ jsx149(Tag, { type: tag?.type, text: tag?.text, ...tid.tag }) }),
16781
+ /* @__PURE__ */ jsxs72("div", { css: Css.df.fdc.aifs.gap1.$, children: [
16782
+ /* @__PURE__ */ jsxs72("div", { children: [
16783
+ /* @__PURE__ */ jsx149("div", { css: Css.xsMd.gray700.$, ...tid.subtitle, children: subtitle }),
16784
+ /* @__PURE__ */ jsx149("div", { css: Css.smMd.gray900.if(isHovered).blue700.$, ...tid.title, children: title })
16785
+ ] }),
16786
+ /* @__PURE__ */ jsx149("div", { ...tid.details, children: detailContent })
16787
+ ] })
16788
+ ] });
16789
+ }
16790
+ var width = { card: 256, list: 520 };
16791
+ var baseStyles4 = (type) => Css.wPx(width[type]).bgWhite.df.fdc.gap1.relative.$;
16792
+ var listStyles = Css.df.fdr.gap2.$;
16793
+ var borderedStyles = Css.ba.br8.bcGray300.p2.$;
16794
+ var disabledStyles3 = Css.add("opacity", 0.5).add("transition", "opacity 0.3s ease").$;
16795
+ var cardHoverStyles = Css.bcGray400.cursorPointer.$;
16796
+ var imageHoverStyles = Css.bgWhite.add("filter", "brightness(0.3)").add("transition", "filter 0.3s ease").$;
16690
16797
 
16691
- // src/components/Filters/CheckboxFilter.tsx
16692
- import { jsx as jsx144 } from "@emotion/react/jsx-runtime";
16693
- function checkboxFilter(props) {
16694
- return (key) => new CheckboxFilter(key, {
16695
- // If the user has set the offValue, that should be the default b/c we're only a two-state
16696
- defaultValue: props.offValue,
16697
- ...props
16698
- });
16798
+ // src/components/Copy.tsx
16799
+ import { jsx as jsx150 } from "@emotion/react/jsx-runtime";
16800
+ function Copy(props) {
16801
+ return /* @__PURE__ */ jsx150(
16802
+ "div",
16803
+ {
16804
+ css: {
16805
+ ...Css.sm.gray700.mt2.mb3.wPx(480).$,
16806
+ "& > p": Css.my2.$
16807
+ },
16808
+ children: props.children
16809
+ }
16810
+ );
16699
16811
  }
16700
- var CheckboxFilter = class extends BaseFilter {
16701
- render(value, setValue, tid, inModal, vertical) {
16702
- const { defaultValue, onValue = true, offValue = void 0, ...props } = this.props;
16703
- return /* @__PURE__ */ jsx144(
16704
- Checkbox,
16705
- {
16706
- ...props,
16707
- selected: value === void 0 ? false : value === onValue,
16708
- label: this.label,
16709
- onChange: (on) => {
16710
- setValue(on ? onValue : offValue);
16711
- },
16712
- ...this.testId(tid)
16713
- }
16714
- );
16715
- }
16716
- get hideLabelInModal() {
16717
- return true;
16718
- }
16719
- };
16720
16812
 
16721
- // src/components/Filters/FilterModal.tsx
16722
- import { useState as useState37 } from "react";
16813
+ // src/components/DnDGrid/DnDGrid.tsx
16814
+ import equal2 from "fast-deep-equal";
16815
+ import { useCallback as useCallback20, useRef as useRef48 } from "react";
16723
16816
 
16724
- // src/components/Modal/OpenModal.tsx
16725
- import { useEffect as useEffect25 } from "react";
16726
- import { jsx as jsx145 } from "@emotion/react/jsx-runtime";
16727
- function OpenModal(props) {
16728
- const { openModal } = useModal();
16729
- const { size, children, keepOpen } = props;
16730
- useEffect25(() => {
16731
- if (!keepOpen) {
16732
- openModal({ size, content: children });
16733
- }
16734
- }, [keepOpen, openModal, size, children]);
16735
- if (keepOpen) {
16736
- return /* @__PURE__ */ jsx145(Modal, { size, content: children });
16737
- } else {
16738
- return /* @__PURE__ */ jsx145("div", { children: "dummy content" });
16817
+ // src/components/DnDGrid/DnDGridContext.tsx
16818
+ import { createContext as createContext7, useContext as useContext16 } from "react";
16819
+ var DnDGridContext = createContext7({
16820
+ dragEl: { current: void 0 },
16821
+ onDragHandleKeyDown: () => {
16739
16822
  }
16823
+ });
16824
+ function useDnDGridContext() {
16825
+ return useContext16(DnDGridContext);
16740
16826
  }
16741
16827
 
16742
- // src/components/Filters/FilterModal.tsx
16743
- import { Fragment as Fragment28, jsx as jsx146, jsxs as jsxs69 } from "@emotion/react/jsx-runtime";
16744
- function FilterModal(props) {
16745
- const { filter, filters, onApply } = props;
16746
- const testId = useTestIds(props, filterTestIdPrefix);
16747
- const { closeModal } = useModal();
16748
- const [modalFilter, setModalFilter] = useState37(filter);
16749
- return /* @__PURE__ */ jsxs69(Fragment28, { children: [
16750
- /* @__PURE__ */ jsx146(ModalHeader, { children: "More Filters" }),
16751
- /* @__PURE__ */ jsx146(ModalBody, { children: /* @__PURE__ */ jsx146("div", { css: Css.df.fdc.$, children: safeEntries(filters).map(([key, f]) => /* @__PURE__ */ jsx146(ModalFilterItem, { label: f.hideLabelInModal ? void 0 : f.label, children: f.render(
16752
- modalFilter[key],
16753
- (value) => setModalFilter(updateFilter(modalFilter, key, value)),
16754
- testId,
16755
- true,
16756
- false
16757
- ) }, key)) }) }),
16758
- /* @__PURE__ */ jsxs69(ModalFooter, { xss: Css.jcsb.$, children: [
16759
- /* @__PURE__ */ jsx146(
16760
- Button,
16761
- {
16762
- label: "Clear",
16763
- variant: "tertiary",
16764
- disabled: safeKeys(filters).filter((fk) => modalFilter[fk] !== void 0).length === 0,
16765
- onClick: () => (
16766
- // Only remove the filters keys that exist in the modal.
16767
- setModalFilter(safeKeys(filters).reduce((acc, fk) => omitKey(fk, acc), modalFilter))
16768
- ),
16769
- ...testId.modalClear
16828
+ // src/components/DnDGrid/DnDGrid.tsx
16829
+ import { jsx as jsx151 } from "@emotion/react/jsx-runtime";
16830
+ function DnDGrid(props) {
16831
+ const { children, gridStyles, onReorder, activeItemStyles } = props;
16832
+ const gridEl = useRef48(null);
16833
+ const dragEl = useRef48();
16834
+ const cloneEl = useRef48();
16835
+ const initialOrder = useRef48();
16836
+ const reorderViaKeyboard = useRef48(false);
16837
+ const transformFrom = useRef48({ x: 0, y: 0 });
16838
+ const tid = useTestIds(props, "dndGrid");
16839
+ const getGridItems = useCallback20(() => {
16840
+ return gridEl.current ? Array.from(gridEl.current.querySelectorAll(`[${gridItemIdKey}]`)) : [];
16841
+ }, []);
16842
+ const getGridItemIdOrder = useCallback20(() => {
16843
+ return getGridItems().map((child) => child.getAttribute(gridItemIdKey)).filter(isDefined);
16844
+ }, [getGridItems]);
16845
+ const initReorder = useCallback20(() => {
16846
+ if (gridEl.current && dragEl.current) {
16847
+ initialOrder.current = getGridItemIdOrder();
16848
+ dragEl.current.classList.add(activeGridItemClass);
16849
+ }
16850
+ }, [getGridItemIdOrder]);
16851
+ const commitReorder = useCallback20(() => {
16852
+ if (gridEl.current && dragEl.current) {
16853
+ const currentOrder = getGridItemIdOrder();
16854
+ if (!equal2(currentOrder, initialOrder.current)) onReorder(currentOrder);
16855
+ dragEl.current.classList.remove(activeGridItemClass);
16856
+ dragEl.current = void 0;
16857
+ reorderViaKeyboard.current = false;
16858
+ initialOrder.current = currentOrder;
16859
+ }
16860
+ }, [onReorder, getGridItemIdOrder]);
16861
+ const cancelReorder = useCallback20(() => {
16862
+ if (gridEl.current && dragEl.current && initialOrder.current) {
16863
+ const currentOrder = getGridItemIdOrder();
16864
+ if (!equal2(currentOrder, initialOrder.current)) {
16865
+ const initialIndex = initialOrder.current.indexOf(dragEl.current.getAttribute(gridItemIdKey) ?? "");
16866
+ if (initialIndex === initialOrder.current.length - 1) {
16867
+ const gridItems = getGridItems();
16868
+ const lastGridItem = gridItems[gridItems.length - 1];
16869
+ gridEl.current.insertBefore(dragEl.current, lastGridItem.nextSibling);
16870
+ } else {
16871
+ const nextSiblingIndex = initialOrder.current[initialIndex + 1];
16872
+ const nextSibling = gridEl.current.querySelector(`[${gridItemIdKey}="${nextSiblingIndex}"]`);
16873
+ if (nextSibling) {
16874
+ gridEl.current.insertBefore(dragEl.current, nextSibling);
16875
+ }
16876
+ }
16877
+ }
16878
+ dragEl.current.classList.remove(activeGridItemClass);
16879
+ dragEl.current = void 0;
16880
+ reorderViaKeyboard.current = false;
16881
+ }
16882
+ }, [getGridItemIdOrder, getGridItems]);
16883
+ const onMove = useCallback20((e) => {
16884
+ if (!reorderViaKeyboard.current && dragEl.current && cloneEl.current && gridEl.current) {
16885
+ const clientX = "clientX" in e ? e.clientX : e.touches[0].clientX;
16886
+ const clientY = "clientY" in e ? e.clientY : e.touches[0].clientY;
16887
+ const left = dragEl.current.style.left ? parseInt(dragEl.current.style.left) : 0;
16888
+ const top = dragEl.current.style.top ? parseInt(dragEl.current.style.top) : 0;
16889
+ const x = clientX - transformFrom.current.x - left;
16890
+ const y = clientY - transformFrom.current.y - top;
16891
+ dragEl.current.style.transform = `translate(${x}px, ${y}px)`;
16892
+ const maybeTarget = "touches" in e ? document.elementFromPoint(clientX, clientY) : e.target;
16893
+ const target = maybeTarget instanceof HTMLElement ? maybeTarget?.closest(`[${gridItemIdKey}]`) : void 0;
16894
+ if (target instanceof HTMLElement && target !== cloneEl.current && target !== dragEl.current) {
16895
+ const targetPos = target.getBoundingClientRect();
16896
+ const isHalfwayPassedTarget = (clientY - targetPos.top) / (targetPos.bottom - targetPos.top) > 0.5 || (clientX - targetPos.left) / (targetPos.right - targetPos.left) > 0.5;
16897
+ const shouldInsert = isHalfwayPassedTarget && target.nextSibling !== cloneEl.current || !isHalfwayPassedTarget && target.previousSibling !== cloneEl.current;
16898
+ if (shouldInsert) {
16899
+ gridEl.current.insertBefore(cloneEl.current, isHalfwayPassedTarget ? target.nextSibling : target);
16900
+ }
16901
+ }
16902
+ }
16903
+ }, []);
16904
+ const onDragStart = useCallback20(
16905
+ (e) => {
16906
+ if (!reorderViaKeyboard.current && dragEl.current && gridEl.current) {
16907
+ initReorder();
16908
+ const gridRect = gridEl.current.getBoundingClientRect();
16909
+ const rect = dragEl.current.getBoundingClientRect();
16910
+ const clientX = "clientX" in e ? e.clientX : e.touches[0].clientX;
16911
+ const clientY = "clientY" in e ? e.clientY : e.touches[0].clientY;
16912
+ const top = rect.top - gridRect.top;
16913
+ const left = rect.left - gridRect.left;
16914
+ transformFrom.current = { x: clientX - left, y: clientY - top };
16915
+ cloneEl.current = dragEl.current.cloneNode();
16916
+ cloneEl.current?.setAttribute(
16917
+ "style",
16918
+ `border-width: 2px; border-color: ${"rgba(201, 201, 201, 1)" /* Gray400 */}; border-style: dashed; width:${rect.width}px; height:${rect.height}px;`
16919
+ );
16920
+ cloneEl.current?.setAttribute(gridCloneKey, "true");
16921
+ cloneEl.current.removeAttribute("id");
16922
+ cloneEl.current?.classList.remove(activeGridItemClass);
16923
+ gridEl.current.insertBefore(cloneEl.current, dragEl.current.nextSibling);
16924
+ dragEl.current.setAttribute(
16925
+ "style",
16926
+ `pointer-events: none; position:fixed; z-index: 9999; top:${top}px; left:${left}px; width:${rect.width}px; height:${rect.height}px;`
16927
+ );
16928
+ gridEl.current.style.cursor = "grabbing";
16929
+ gridEl.current.addEventListener("mousemove", onMove);
16930
+ gridEl.current.addEventListener("touchmove", onMove);
16931
+ }
16932
+ },
16933
+ [initReorder, onMove]
16934
+ );
16935
+ const onDragEnd = useCallback20(
16936
+ (e) => {
16937
+ if (!reorderViaKeyboard.current && dragEl.current && cloneEl.current && gridEl.current) {
16938
+ e.preventDefault();
16939
+ cloneEl.current.replaceWith(dragEl.current);
16940
+ gridEl.current.querySelectorAll(`[${gridCloneKey}]`).forEach((el) => el.remove());
16941
+ dragEl.current.removeAttribute("style");
16942
+ gridEl.current.style.cursor = "auto";
16943
+ cloneEl.current = void 0;
16944
+ commitReorder();
16945
+ gridEl.current.removeEventListener("mousemove", onMove);
16946
+ gridEl.current.removeEventListener("touchmove", onMove);
16947
+ }
16948
+ },
16949
+ [commitReorder, onMove]
16950
+ );
16951
+ const onDragHandleKeyDown = useCallback20(
16952
+ (e) => {
16953
+ const moveHandle = e.target;
16954
+ if (dragEl.current instanceof HTMLElement && moveHandle instanceof HTMLElement && gridEl.current) {
16955
+ const isSpaceKey = e.key === " ";
16956
+ if (isSpaceKey && !reorderViaKeyboard.current) {
16957
+ e.preventDefault();
16958
+ reorderViaKeyboard.current = true;
16959
+ document.addEventListener("pointerdown", cancelReorder);
16960
+ initReorder();
16961
+ return;
16770
16962
  }
16771
- ),
16772
- /* @__PURE__ */ jsxs69("div", { css: Css.df.gap1.$, children: [
16773
- /* @__PURE__ */ jsx146(Button, { label: "Cancel", variant: "tertiary", onClick: closeModal, ...testId.modalClose }),
16774
- /* @__PURE__ */ jsx146(
16775
- Button,
16776
- {
16777
- label: "Apply",
16778
- onClick: () => {
16779
- onApply(modalFilter);
16780
- closeModal();
16781
- },
16782
- ...testId.modalApply
16963
+ if (!reorderViaKeyboard.current) {
16964
+ return;
16965
+ }
16966
+ const isEnterKey = e.key === "Enter";
16967
+ const isTabKey = e.key === "Tab";
16968
+ if (isEnterKey || isSpaceKey || isTabKey) {
16969
+ if (!isTabKey) {
16970
+ e.preventDefault();
16783
16971
  }
16784
- )
16785
- ] })
16786
- ] })
16787
- ] });
16788
- }
16789
- function ModalFilterItem({ label, children }) {
16790
- return /* @__PURE__ */ jsxs69("div", { css: Css.mb4.if(!label).bt.bcGray200.$, children: [
16791
- label && /* @__PURE__ */ jsx146("h2", { css: Css.baseMd.mb2.$, children: label }),
16792
- /* @__PURE__ */ jsx146("div", { css: Css.if(!label).pt3.$, children })
16793
- ] });
16794
- }
16795
-
16796
- // src/components/Filters/Filters.tsx
16797
- import { memo, useMemo as useMemo36 } from "react";
16798
- import { jsx as jsx147, jsxs as jsxs70 } from "@emotion/react/jsx-runtime";
16799
- function Filters(props) {
16800
- const { filter, onChange, filterDefs, groupBy, vertical = false, numberOfInlineFilters = groupBy ? 3 : 4 } = props;
16801
- const testId = useTestIds(props, filterTestIdPrefix);
16802
- const { openModal } = useModal();
16803
- const [pageFilters, modalFilters] = useMemo36(() => {
16804
- const impls = safeEntries(filterDefs).map(([key, fn]) => [key, fn(key)]);
16805
- if (!vertical && impls.length > numberOfInlineFilters) {
16806
- return [
16807
- Object.fromEntries(impls.slice(0, numberOfInlineFilters - 1)),
16808
- Object.fromEntries(impls.slice(numberOfInlineFilters - 1))
16809
- ];
16810
- }
16811
- return [Object.fromEntries(impls), {}];
16812
- }, [numberOfInlineFilters, vertical, filterDefs]);
16813
- const numModalFilters = safeKeys(modalFilters).filter((fk) => filter[fk] !== void 0).length;
16814
- const maybeGroupByField = groupBy ? /* @__PURE__ */ jsx147("div", { children: /* @__PURE__ */ jsx147(
16815
- SelectField,
16972
+ commitReorder();
16973
+ if (isEnterKey) {
16974
+ moveHandle.blur();
16975
+ }
16976
+ document.removeEventListener("pointerdown", cancelReorder);
16977
+ return;
16978
+ }
16979
+ if (e.key === "Escape") {
16980
+ e.preventDefault();
16981
+ cancelReorder();
16982
+ document.removeEventListener("pointerdown", cancelReorder);
16983
+ return;
16984
+ }
16985
+ const movingLeft = ["ArrowLeft", "ArrowUp"].includes(e.key);
16986
+ const movingRight = ["ArrowRight", "ArrowDown"].includes(e.key);
16987
+ if (movingLeft || movingRight) {
16988
+ e.preventDefault();
16989
+ const gridItems = getGridItems();
16990
+ const currentIndex = gridItems.map((child) => child.getAttribute(gridItemIdKey)).filter(isDefined).indexOf(dragEl.current.getAttribute(gridItemIdKey));
16991
+ const newIndex = movingLeft ? currentIndex - 1 : currentIndex + 2;
16992
+ const insertBeforeElement = gridItems[newIndex] ?? gridItems[gridItems.length - 1].nextSibling;
16993
+ if (movingLeft && currentIndex > 0 || movingRight && currentIndex < gridItems.length - 1) {
16994
+ gridEl.current.insertBefore(dragEl.current, insertBeforeElement);
16995
+ }
16996
+ moveHandle.focus();
16997
+ }
16998
+ }
16999
+ },
17000
+ [cancelReorder, commitReorder, initReorder, getGridItems]
17001
+ );
17002
+ return /* @__PURE__ */ jsx151(DnDGridContext.Provider, { value: { dragEl, onDragHandleKeyDown }, children: /* @__PURE__ */ jsx151(
17003
+ "div",
16816
17004
  {
16817
- label: "Group by",
16818
- compact: !vertical,
16819
- labelStyle: !vertical ? "inline" : "above",
16820
- sizeToContent: !vertical,
16821
- options: groupBy.options,
16822
- getOptionValue: (o) => o.id,
16823
- getOptionLabel: (o) => o.name,
16824
- value: groupBy.value,
16825
- onSelect: (g) => g && groupBy.setValue(g)
17005
+ ref: gridEl,
17006
+ css: {
17007
+ ...Css.ctis.dg.addIn(`& .${activeGridItemClass}`, activeItemStyles ?? Css.bshModal.$).$,
17008
+ ...gridStyles
17009
+ },
17010
+ onTouchStart: onDragStart,
17011
+ onMouseDown: onDragStart,
17012
+ onTouchEnd: onDragEnd,
17013
+ onMouseUp: onDragEnd,
17014
+ ...tid,
17015
+ children
16826
17016
  }
16827
- ) }) : null;
16828
- return /* @__PURE__ */ jsxs70(
16829
- "div",
17017
+ ) });
17018
+ }
17019
+ var gridItemIdKey = "dndgrid-itemid";
17020
+ var gridCloneKey = "dndgrid-clone";
17021
+ var activeGridItemClass = "dndgrid-active";
17022
+
17023
+ // src/components/DnDGrid/DnDGridItemHandle.tsx
17024
+ import { mergeProps as mergeProps12, useFocusRing as useFocusRing13, useHover as useHover17 } from "react-aria";
17025
+ import { jsx as jsx152 } from "@emotion/react/jsx-runtime";
17026
+ function DnDGridItemHandle(props) {
17027
+ const { dragHandleProps, icon = "move", compact = false, color } = props;
17028
+ const { focusProps, isFocusVisible } = useFocusRing13();
17029
+ const { hoverProps, isHovered } = useHover17({});
17030
+ const tid = useTestIds(props, "dragHandle");
17031
+ const iconButtonNormal2 = Css.hPx(28).wPx(28).br8.bw2.$;
17032
+ const iconButtonCompact2 = Css.hPx(18).wPx(18).br4.bw1.$;
17033
+ return /* @__PURE__ */ jsx152(
17034
+ "button",
16830
17035
  {
16831
17036
  css: {
16832
- ...vertical ? Css.df.fdc.gap2.$ : Css.df.aic.gap1.$
17037
+ ...compact ? iconButtonCompact2 : iconButtonNormal2,
17038
+ ...Css.cursor("grab").bcTransparent.bss.bgTransparent.outline0.dif.aic.jcc.transition.if(isFocusVisible).bcBlue700.$,
17039
+ ...isHovered && Css.bgGray200.$
16833
17040
  },
16834
- ...testId,
16835
- children: [
16836
- maybeGroupByField,
16837
- safeEntries(pageFilters).map(([key, f]) => /* @__PURE__ */ jsx147("div", { children: f.render(filter[key], (value) => onChange(updateFilter(filter, key, value)), testId, false, vertical) }, key)),
16838
- Object.keys(modalFilters).length > 0 && /* @__PURE__ */ jsx147(
16839
- Button,
16840
- {
16841
- label: "More Filters",
16842
- endAdornment: numModalFilters > 0 && /* @__PURE__ */ jsx147("span", { css: Css.wPx(16).hPx(16).fs0.br100.bgBlue700.white.tinySb.df.aic.jcc.$, children: numModalFilters }),
16843
- variant: "secondary",
16844
- onClick: () => openModal({
16845
- // Spreading `props` to pass along `data-testid`
16846
- content: /* @__PURE__ */ jsx147(FilterModal, { ...props, filter, onApply: onChange, filters: modalFilters })
16847
- }),
16848
- ...testId.moreFiltersBtn
16849
- }
16850
- ),
16851
- Object.keys(filter).length > 0 && /* @__PURE__ */ jsx147("div", { children: /* @__PURE__ */ jsx147(Button, { label: "Clear", variant: "tertiary", onClick: () => onChange({}), ...testId.clearBtn }) })
16852
- ]
17041
+ ...mergeProps12(dragHandleProps, focusProps, hoverProps),
17042
+ ...tid,
17043
+ children: /* @__PURE__ */ jsx152(Icon, { icon, inc: compact ? 2 : void 0, color })
16853
17044
  }
16854
17045
  );
16855
17046
  }
16856
- var _Filters = memo(Filters);
16857
17047
 
16858
- // src/components/Filters/ToggleFilter.tsx
16859
- import { jsx as jsx148 } from "@emotion/react/jsx-runtime";
16860
- function toggleFilter(props) {
16861
- return (key) => new ToggleFilter(key, {
16862
- // If the user has set the offValue, that should be the default b/c we're only a two-state
16863
- defaultValue: props.offValue,
16864
- ...props
16865
- });
16866
- }
16867
- var ToggleFilter = class extends BaseFilter {
16868
- render(value, setValue, tid, inModal, vertical) {
16869
- const { defaultValue, onValue = true, offValue = void 0, ...props } = this.props;
16870
- return /* @__PURE__ */ jsx148(
16871
- Switch,
16872
- {
16873
- ...props,
16874
- selected: value === void 0 ? false : value === onValue,
16875
- label: this.label,
16876
- labelStyle: inModal || vertical ? "filter" : "inline",
16877
- onChange: (on) => {
16878
- setValue(on ? onValue : offValue);
16879
- },
16880
- ...this.testId(tid)
17048
+ // src/components/DnDGrid/useDnDGridItem.tsx
17049
+ import { useMemo as useMemo37 } from "react";
17050
+ function useDnDGridItem(props) {
17051
+ const { id, itemRef } = props;
17052
+ const { dragEl, onDragHandleKeyDown } = useDnDGridContext();
17053
+ const { dragItemProps, dragHandleProps } = useMemo37(
17054
+ () => {
17055
+ function initDraggable() {
17056
+ if (itemRef.current) {
17057
+ dragEl.current = itemRef.current;
17058
+ }
16881
17059
  }
16882
- );
16883
- }
16884
- get hideLabelInModal() {
16885
- return true;
16886
- }
16887
- };
16888
-
16889
- // src/components/Filters/utils.tsx
16890
- function updateFilter(currentFilter, key, value) {
16891
- if (value === void 0) {
16892
- return omitKey(key, currentFilter);
16893
- } else {
16894
- return { ...currentFilter, [key]: value };
16895
- }
17060
+ return {
17061
+ dragItemProps: { [gridItemIdKey]: id },
17062
+ dragHandleProps: {
17063
+ onMouseDown: initDraggable,
17064
+ onTouchStart: initDraggable,
17065
+ onKeyDown: (e) => {
17066
+ initDraggable();
17067
+ onDragHandleKeyDown(e);
17068
+ }
17069
+ }
17070
+ };
17071
+ },
17072
+ // TODO: validate this eslint-disable. It was automatically ignored as part of https://app.shortcut.com/homebound-team/story/40033/enable-react-hooks-exhaustive-deps-for-react-projects
17073
+ // eslint-disable-next-line react-hooks/exhaustive-deps
17074
+ [dragEl, id, itemRef]
17075
+ );
17076
+ return { dragHandleProps, dragItemProps };
16896
17077
  }
16897
- var filterTestIdPrefix = "filter";
16898
17078
 
16899
17079
  // src/components/Grid/ResponsiveGrid.tsx
16900
- import { jsx as jsx149 } from "@emotion/react/jsx-runtime";
17080
+ import { jsx as jsx153 } from "@emotion/react/jsx-runtime";
16901
17081
  function ResponsiveGrid(props) {
16902
17082
  const { children, ...hookProps } = props;
16903
17083
  const { gridStyles } = useResponsiveGrid(hookProps);
16904
- return /* @__PURE__ */ jsx149("div", { css: { ...gridStyles }, children });
17084
+ return /* @__PURE__ */ jsx153("div", { css: { ...gridStyles }, children });
16905
17085
  }
16906
17086
 
16907
17087
  // src/components/Grid/ResponsiveGridItem.tsx
16908
- import { jsx as jsx150 } from "@emotion/react/jsx-runtime";
17088
+ import { jsx as jsx154 } from "@emotion/react/jsx-runtime";
16909
17089
  function ResponsiveGridItem(props) {
16910
17090
  const { colSpan, children } = props;
16911
17091
  const { gridItemProps } = useResponsiveGridItem({ colSpan });
16912
- return /* @__PURE__ */ jsx150("div", { ...gridItemProps, children });
17092
+ return /* @__PURE__ */ jsx154("div", { ...gridItemProps, children });
16913
17093
  }
16914
17094
 
16915
17095
  // src/components/Grid/useResponsiveGrid.ts
16916
- import { useMemo as useMemo37 } from "react";
17096
+ import { useMemo as useMemo38 } from "react";
16917
17097
 
16918
17098
  // src/components/Grid/utils.ts
16919
17099
  var gridItemDataAttribute = "data-grid-item-span";
@@ -16921,7 +17101,7 @@ var gridItemDataAttribute = "data-grid-item-span";
16921
17101
  // src/components/Grid/useResponsiveGrid.ts
16922
17102
  function useResponsiveGrid(props) {
16923
17103
  const { minColumnWidth, gap, columns } = props;
16924
- const gridStyles = useMemo37(() => {
17104
+ const gridStyles = useMemo38(() => {
16925
17105
  const gapCount = columns - 1;
16926
17106
  const totalGapWidth = gap * gapCount;
16927
17107
  const maxColumnWidth = `calc((100% - ${totalGapWidth}px) / ${columns})`;
@@ -16962,24 +17142,24 @@ function useResponsiveGridItem({ colSpan = 1 }) {
16962
17142
  }
16963
17143
 
16964
17144
  // src/components/HbLoadingSpinner.tsx
16965
- import React19, { useContext as useContext17, useMemo as useMemo38 } from "react";
17145
+ import React20, { useContext as useContext17, useMemo as useMemo39 } from "react";
16966
17146
 
16967
17147
  // src/components/HbLoadingSpinner.base64.ts
16968
17148
  var HbLoadingSpinner_base64_default = "data:image/gif,GIF89a%80%00%80%00%E7%00%00%00%00%00%0D%0D%0D%16%16%16%1C%1C%1C%22%22%22%26%26%26%2A%2A%2A...222555888%3B%3B%3B%3D%3D%3D%40%40%40BBBEEEGGGIIIKKKMMMOOOQQQSSSUUUVVVXXXZZZ%5C%5C%5C%5D%5D%5D___%60%60%60bbbccceeefffhhhiiijjjlllmmmnnnpppqqqrrrsssuuuvvvwwwxxxyyyzzz%7C%7C%7C%7D%7D%7D~~~%7F%7F%7F%80%80%80%81%81%81%82%82%82%83%83%83%84%84%84%85%85%85%86%86%86%87%87%87%88%88%88%89%89%89%8A%8A%8A%8B%8B%8B%8C%8C%8C%8D%8D%8D%8E%8E%8E%8F%8F%8F%90%90%90%91%91%91%92%92%92%93%93%93%94%94%94%95%95%95%96%96%96%97%97%97%98%98%98%99%99%99%9A%9A%9A%9B%9B%9B%9C%9C%9C%9D%9D%9D%9E%9E%9E%9F%9F%9F%A0%A0%A0%A1%A1%A1%A2%A2%A2%A3%A3%A3%A4%A4%A4%A5%A5%A5%A6%A6%A6%A7%A7%A7%A8%A8%A8%A9%A9%A9%AA%AA%AA%AB%AB%AB%AC%AC%AC%AD%AD%AD%AE%AE%AE%AF%AF%AF%B0%B0%B0%B1%B1%B1%B2%B2%B2%B3%B3%B3%B4%B4%B4%B5%B5%B5%B6%B6%B6%B7%B7%B7%B8%B8%B8%B9%B9%B9%BA%BA%BA%BB%BB%BB%BC%BC%BC%BD%BD%BD%BE%BE%BE%BF%BF%BF%C0%C0%C0%C1%C1%C1%C2%C2%C2%C3%C3%C3%C4%C4%C4%C5%C5%C5%C6%C6%C6%C7%C7%C7%C8%C8%C8%C9%C9%C9%CA%CA%CA%CB%CB%CB%CC%CC%CC%CD%CD%CD%CE%CE%CE%CF%CF%CF%D0%D0%D0%D1%D1%D1%D2%D2%D2%D3%D3%D3%D4%D4%D4%D5%D5%D5%D6%D6%D6%D7%D7%D7%D8%D8%D8%D9%D9%D9%DA%DA%DA%DB%DB%DB%DC%DC%DC%DD%DD%DD%DE%DE%DE%DF%DF%DF%E0%E0%E0%E1%E1%E1%E2%E2%E2%E3%E3%E3%E4%E4%E4%E5%E5%E5%E6%E6%E6%E7%E7%E7%E8%E8%E8%E9%E9%E9%EA%EA%EA%EB%EB%EB%EC%EC%EC%ED%ED%ED%EE%EE%EE%EF%EF%EF%F0%F0%F0%F1%F1%F1%F2%F2%F2%F3%F3%F3%F4%F4%F4%F5%F5%F5%F6%F6%F6%F7%F7%F7%F8%F8%F8%F9%F9%F9%FA%FA%FA%FB%FB%FB%FC%FC%FC%FD%FD%FD%FE%FE%FE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%21%FF%0BNETSCAPE2.0%03%01%00%00%00%21%FE%11Created%20with%20GIMP%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%DD%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%EC7%80%80%C7%02%02%EC%0D%40%99%F2%E4%CA%92%2F%5B%E6%5B%99%B1%E7%CF%A0C%8B%1EM%BA%B4%E9%D3%A8S%AB%5E%CD%BA%B5%EB%D7%B0c%CB%9EM%BB%B6%ED%DB%B8s%EB%DE%CD%BB%B7%EF%DF%C0%83%D7%0E%08%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FC%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF7%03%88%1E-Z%80%E9%01%04%0A%188p%00A%82%05%0D%1EH%A8%C0%964i%D3%02P%ABn%FD%9A%01%5C%DB%A3O%EB%5EM%17x%00%DC%A8%EF%1A%3F%0E%BA%B9%F3%E7%D0%A3K%9FN%BD%BA%F5%EB%D8%B3k%DF%CE%BD%3B%CA%80%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%20%03%88%160%80%40%81%03%09%16%40%B0%D0%A1%04%8C%1EK%B0%90%89%B3%87%D0%A2H%966y%0A5%AAT%29S%A7P%A5J%A5J%D5%AA%E3%C8Y%B1Z%15U%F4h%D2%04%0C%20X%F0%80B%06%11%2Cp%14%A1%22%06%0E%9FB%8D%2A%B7m%02E%EAT%AAU%AD%5C%BD%82%05%2B%96%AC%F7%B2f%C9%9FO%D5y%00%E8%A8%19%3C%60%5D%C2%05%8F%25Y%981%87%1F%88DrI%27%A2%94%82%8A%2A%E9%AD%D7%1E%7C%F1%CD7KU%F6A%27%9D%02%0EH%80%C1%07%29%D0%10%84%13%5D%ACq%C7%20%8CL%A2%09y%A7%A8%C2J%2B%EB%C5%E2%DE%7B%12NhU%85%A5I%B7%80%03%13l%20%C2%0A7%18AE%18o%ECQ%88%23%96p%12%8A%82%E8%B5%F8b%84%F2%7D%E5%9C%00%D0%15p%A1~%11P%60%01%06%1Al%D0A%07%1E%7C%00%C2%97%21%84%29f%08%A0%95i%E6%99h%A6%A9%E6%9Al%B6%E9%E6%9Bp%C6%29%E7%9Ctf%15%10%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%14%03%88%160%80%80%01%04%0D%26p%40%81C%89%965w%02%25z4%C9R%A6M%9D%3C%7D%FA%04%2AT%28Q%A3F%91%22U%AAxqS%A6N%9DB%C5%1CU%AA%E7%AA%A2%ABZE%FD%E8%E8%D2%06%124%A8%00%82%05%8F%27a%E4%D6%FCI%14%E9%12%A7O%A1%88%27_%0E%9D%3A%2BV%AD%E2%BB%9A%FF%EA%15%AC%FB%B0b%E9%8F%25%AB%BF%7F%A4%A2%05%20%80i%0A%3C%60%01%08-%F8%10%05%19t%00%B2%C8%24%99t%02%CA%28%A5%24%E7%5C%2A%D3%AD%F2%5E%7C%F2%D5g%1F~%FB%F1%E7%DF%7F%00%8A%86%5D%81%07%BA%F0%83%14%0C%06%C2%08%25%9Ax%22%0A%29%16b%E8%1E%7C%1C%D2W%1F%88%FB%8D%D8%DF%2C%B2%285%DA%80%D99%60A%08.%001E%19u%0C%D2H%25%9BLX%0A%7B%D3m%98%A3%2B%3B%F2%28%A2%8F%B3%00%F9T%80%A4%99%96%00%03%0FHP%C1%05%19l%C0A%07%1Dx%E0%C1%07p%C6%F9%01%08t%D6i%27%08%21%E4%A9%E7%9E%21%80%E6%E7%9F%80%06%2A%E8%A0%84%16j%E8%A1%88%26%AA%E8%A2%8C6%9AU%40%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%0E%03%88%1EP%E0%00%83%0A%20%60%0C%C1%82%A6%CE%9FC%8C%1EE%9AD%A9%92%25K%970e%CA%A4I%D3%A6M%9C8u%F2D%FC%D3%27P%A0B%29%17%25j%94sR%A4JI%9F%5E%CA%94%F5S%D8%7F%8A%0E0%80%80%01%05%116%EF%A4%E0%21%A5L%1DA%8B%22U%CA%04%7C%B8%F1%E4%A1%98%3F%9F~%1D%3B%2AT%A9R%A9%DA%BF%AA%3F%AB%FF%AD%04%18%A0%2B%04%BE%F2%8A%2BA%05%20%00i%08%9C%16%02%0CFl%E1%06%1F%88%3C%B2%1Ep%9E%1C%97%9C%7C%A3%40%27%5D%7D%F7%DD%A7%1F%7F%FE%01%28%60%2B%04%BAb%E0%2B%B0%BC%92%A0%82%DE%29%00%81%06%27%E8%10E%19v%0C%D2%C8%24%98l%D2%89%86%F1%3D%17%DD%87%D8%9D%22b~%24%AE%F2%1F%2B%27%A6X%E0%8A-%0A%25%9A%00%04%98FAjFh%E1%86%1F%89Dr%89%8F%C7q%E8au%A6%D8w%E4~%AA%94%C8%E4%89%28%3E%C9%22%2Cp%C2b%D4%94%0C.%E0%80%04%15%5C%90%81%06%1Bp%E0g%07%80%06%DA%81%07%84%16Z%E8%07%88%26%AA%28%A2%204%EA%E8%A3%8E%82%26%E9%A4%94Vj%E9%A5%98f%AA%E9%A6%9Cv%EA%E9%A7%A0%86%9AU%40%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%08%03%88%1EP%00%C1%03%0C%26t%40%19%23%87%8F%A0C%8A%185r%F4%A86%A4H%B8%25%E9%9E4%89%92%EFJ%C0%2BY%1An%E9%92qL%982e%D2%C4%5C%D3%A6%E7%9C6q%9A%DE%A9%BA%A7%EB%D8u%8E.%DD%E0B%89%1CQ%CC%F2%D4%09%94%C8%91%24J%C2%8D_J%BE%9C9t%EA%D5%3Ba%FFD%FF%13%28P%A1%F2%87%12%C5%7F%94%FFQ%A4%04X%CA%80%03%9Ab%E0%29%A6h%17%C0%00%04%1C%C0%40%05%22%D4%B0D%18s%FC%91%C8%23%93Tb%9Cr%ED9%27%1D%7C%D8yR%DF%7D%F8%E9%C7_%7F%FE%05%28%20%81%06%1Ex%CA%8B%A7%28%28%00%01%06%28%20%C1%070%18%D1%05%1C~%20%82aq%ED%3D%F7a%7C%F2%898%E2%7D%26%A2%F8%9F%8A%04%B2%E8%E2%8B%A8D%89%CAN%DB%25%00%C1%06%2A%00%81%05%1B%7C%F8H%89%25%CB%7D%C8I%7C%F3%D9%87d%89%FB%9D%B8%E4%8AN%3E%09%A5%94R%FA%24%9A%00%A4%21%B0%C0%03%12TpA%06%19h%A0%C1%06%80%06%1A%28%07%84%16j%28%A1%1D%24%AA%E8%A2%8Bz%E0%E8%A3%90F%EA%01h%94Vj%E9%A5%98f%AA%E9%A6%9Cv%EA%E9%A7%A0%86%2A%EA%A8Y%05%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%03%03%04%18P%E0%40%83%0B%25r%3C%11%03gO%A0B%87%10%25%9A%AD%A86%ED%DA%B8%15%CDN%A4%BB7%EE%DD%BAy%E7%BE%1D%5C%B8%EF%E0%BF%13%D1%0C%20%80t%82%07%1AR%F8%B0%92%06%8F%A0D%8D%1EE%92%C4%BD%BB%F7%EF%E0%C3%A7%8B%1FO%DE%FB%F2%D1%05%9EkX%01%C4%CA%9A%3C%83%149%8A4i%12%A5%FB%F8%F3%EB%DF%CF%1F%BF%FD%FE%00%F27%C9y%A4%21%F0%C0%06%ECa%B1%C6%1E%850%02%89%7D%95D%18%A1%25%14JXI%85%17Z%22%21%86%16%5E8%A1%86%19n%D8%21%85%20~%18%E1y%02%10%A0%9E%0A%40d%D1%06%1F%874%22%09%25%17%5Eb%E3%8D8%E6%A8%E3%8E%3C%F6%E8%E3%8D8%89%D6%1C%01%06%400%81%05%17%60%90A%06%1A4%E9%E4%93PF%29%E5%94TV%F9%24hXf%A9%E5%96%5Cv%E9%E5%97%60%86%29%E6%98d%96i%E6%99Y%05%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CD%01%02%08%20%60%40A%84%0E%2C~P13%87O%A0B%87b%CB%8Em%A8P%21B%84%06%09%DA%1D%A8%F7%9F%DF%7F%FC%F4%E9%C3%87%CF%9E%3Dz%F2%E0%C1s%E7%8E%9D%E7u%EA%D0%A13G%8E%9C8p%E0%BCq%D3%A6%3B%9B5%E0%D3%FE%88Gs%C6%8C%992%2CC%8B%1Ep%80%81%85%115%96%80%81%C3%A7%90%A2F%8F%20Az%C4%FF%91%23G%8D%04%C8%08%23%8B%2C%A2%88%22%89%24%82%C8%82%87%D4f%5Bn%BC%05%02%08%20%C1%F9a%21q%C7%21%97%87r%CDE7%1Du%D6e%97%DD%1B%DD%B5%14%DA%00%05%24%E0%00%06%27%EC%20%85%19u%00%82%08~%91Hbc%248%EE%E7%DF%7F%0062%20%81%08%2A%88%88l%0E%E2F%C8n%82%F4Fa%85%C3%19%A7%21%87%CEy%08%A2u%D8%C1a%A2%00%03%94%26%01%07%2C%04%91%C5%1Az%10%B2%C8%23%92L2%09%25fNrc%8E%FD%FD%17%A0%8F%05%1A%98%A0%82%B4%15%09%21oK%06G%9C%93%7Bl%98Gs%D0IG%5Du%E9%89F%40%7B%15%880%83%12_%C4%F1%07%22%8EHB%09%25%95T%3A%29%9Aj%AE%19%89%8En%0A8%A0%9C%092H%DB%83%10%2A%B9%E4%85%C5e%98%1Cs%80z%08ShNX%12P%C0%01%09%28%B0%00%03%0C4%D0%40%06%BC%F6%EA%2B%06%C0%06%8B%C1%05%C4%16k%EC%05%16%24%ABl%B2%154%EBl%B3%14D%2Bm%B4%13Tkm%B5%12d%AB%EDg%DCv%EB%ED%B7%E0%86%2B%EE%B8%E4%96k%EE%B9%E8%A6%AB%EE%BAj%05%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%C9%01%02%08%20%60%40%01%84%0C%25j%24%D1%92%A6N%1FA%87%10%25%9A%8D%08%D1%A1C%85%0A%0D%12%14%28%D0%9F%3F~%F8%F0%D9%93%07%CF%1D%3Bu%E8%CC%91%03%E7%8D%9B6m%D6%A8I%83%C6L%192c%C2%84%F9%E2e%8B%96%2CX%AC%FET%A1%22%25%0A%94%27M%98%2CY%92%C4H%91%21A%80%FC%F8%D1c%87%8E%1C7j%94%14%3D%A0%00%02%07%16%8C0%83%11Z%A8q%87%20%894%F2H%24%92H%12I%24%90%3C%E2H%23%8C0%B2%08m%B8%11B%08o%80%00%D7%C7py%E4q%5Crr0%F7%06t%D2Qg%1D%19bl%E7%05%17%DEeq%85%15TLQ%1E%14N%A8%97%04%12%EE%11%21%84%7C%3E%F00Rh%A2%11p%C0%02%12p%B0%82%0FR%94A%C7%1F%884%12%C9%24TR%E9%60%24%12Nh%E1%85%B6e%B8%5B%20%1D%06%07%A2q%C9-%17Gsm%B0%91%E2%19%2B%8A%01%06w%5Ch%F1%DD%8C5Jq%5Ez%EC%F1H%C4%10%3F%FE%20Rh%02%08%D0_%02%A7%95p%C3%12%5E%C0%D1%C7%21RRR%C9%A3%95Pb%25%84YR%B8%88%22%89%D8fH%21%84%7C%19%A6pz%14wG%99r%9C%F9%9C%9A%D3%B1%89%5D%18%60x%F1%E2w%B4%E1%D1xc%8EK%28%91%C4%11F%EC%19%C4%90%82%1A%C9%40%05%20%C0%40%04%16j%E4A%08%23%91Pb%C9%25%CC%5EbI%A4%92%3A%18%A1%23Z%5E%9A%E9%21%9Bn%D8%1Bp%C1%ED%11%EA%88%CA%99x%EA%1A%2A%5E%97%5D%AB%5D%C4%18%5E%156F%F1%04%AD%EC%E1J%C4I%80%0E%40%40%01%07%24%A0%C0%02%0C0%D0%C0%BF%00%03%DC%2F%06%04%13%7C%C1%C1%07%5B%A0%B0%05%154%5C%01%05%10S0%C1%C4%13K%60q%04%18G%00%C1%C6%1B%3F%E0%F1%03%0E%84%EC%40%C0%FD%96%BC%C0%C9%27%2B%A0%B2%02%09%7C%E6%F2%CB0%C7%2C%F3%CC4%D7l%F3%CD8%E7%AC%F3%CE%3C%F7%ACV%40%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%C3%01%02%0C%20%60%00A%83%09%1AH%C8%10%22%25L%9B%3B%7F%0A%25b%E4%E8%91mG%8E%1A1R%94%08%D1%A1B%84%06%05%02%F4%C7%0F%9F%3Dy%EE%D8%A13%27%CE%9B6m%D6%A49c%86%8C%980%5E%BAh%C1r%A5%CA%94%28P%9A%FE0Y%92%C4%08%91%20%40%7C%F0%D0%81%C3%06%0D%191%5E%B8%60%A1%02%C5%89%12%25F%8C%00%01%C2C%87%0D%1Ah%90%C1%05%16T%80Qh%02%90%A6%80%03%14t%90%C2%0DH%60qF%1D%7F%20%E2%88%24%95Xr%C9%86%97XR%09%25%93H%12%C9%23%B91%B2Ho%86%00%27%08q%7D%EC%A1Gru%D0%21%87s%D1MW%9D%18%60x%C1%C5vVP%21E%14O4%B1%04%12F%14%21Dz%EB%B5%F7%5E%7C-%AC%A0B%0A%27%98%40%C2%08%21%F4%E7%1F%07%01bPQh%01%080%9A%01%098PA%07%28%DC%90%84%16h%D4%11H%22%8FPrI%26%9A%C4%99I%26%1D~%18%E2%88%25%9E%E8%5B%21%83%08%12%C8%1F-%EA%81%C7%1D1%CA%01%C7s%D2%A1qc%8E%3Bb%D1%E3%8FN%8CW%1E%11G%AA%C7%9E%7B3%C47%DF%93QN%29%02%08%1F%5C%B9A%06%5B%22HZ%98%15x%90%02%0Eg%AAq%87%20%EB%8BDR%09%26%9Al%C2%C9%26%9B%C8%B9%A1%87w%92%A8%9B%9E%BF%11%B2%22%A0%7C%08J%A8%8C%87F%A7%86%A2%D61%CA%A3%8FPD%3A%A4y%95%26%89i%0C04%C9%A9%94T%82%EA%1F%80%14%21%F8%E5%82%A9%AA%80%83%12%5B%AC%91%07%21%8CHr%89%26%9Ct%22o%27%9C%DC%AAI%26%98%D4y%27%24y%F6%16%EC%B0%C6%BDx%AC%A1%88%DA%D8%AC%8E%CF%FE%18%E4%90G%18%89%E4%A54d%FA%82%B6Pr%FBi%A8%1Dp%90%11%97%5E%12P%40i%09%28%B0%00%03%0D%94%EC%C0%C9%27%97%AC%F2%CA%0C%B4%EC%F2%02%16%C4%5C%60%05%15P%60%F3%048K%A0s%04%3CC%E0%F3%03%40%A7%5C%F2%CB%0B%14%AD%C0%D1%09%24%9D%00%02L%1F%E0%B4%D3%06Dm%40%01TWM%C0%D5%04%7C%A6%F5%D6%5Cw%ED%F5%D7%60%87-%F6%D8d%97m%F6%D9h%A7%ADV%40%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9s%C4%00%01%F6%82%0E%20%20%B4%5E%D2%A4%09%188%80%80%01%84%0A%1AD%A8%A0%01%84%09%961m%EE%FC1%B4%E8%D1%24K%972i%D2%B4i%93%A6L%99.Y%B2T%89%D2%24I%90%1E9b%B4%28%11%A2C%85%06%05%FA%E3%87%CF%9E%3Cw%EA%FE%CC%89%F3%A6%CD%9A4f%C8%8C%09%E3%85K%96%2BU%A4%40q%C2D%C9%11%22B~%F4%D8%91%C3%06%8D%180%B8%C0%82%0A%28%98%40%C2%08%21%7C%E0A%07%1Ch%90%01%06%16T%40%C1%04%12D%00%C1%03%0F4%D0%C0%02%0B%28%E0a%02%08%20%20P%00%03%0CP%C0%01%09%B8F%81%06%21%AC%60%C3%10Pla%86%1C%7B%10%B2%88%24%97h%D2%09%28%A2%8C2%0A%29%3E%8E%22%8A%28%A0%80%F2I%27%9Cpr%1C%26%974%27I%24%D2Q%97%08v%84l%D7%9D%1Ex%D8A%87%1Cp%98%97%C6%19e%88%01%86%17%5BdaE%7CP4%B1D%12F%0C%01%84%0F%3C%E4p%03%0D3%048%60%81%07%86%00%C2%82%0DfpA%84%13Vx%A1%03%1A2%D0%E1%87%00%90%A8%1A%02%0B%3C%40A%06%20%A4%20%C3%0FKdA%06%1Cz%0C%B2H%24%96l%F2I%28%A2%90R%CA%A8%A3%92%02%A4%28%A1%18%E9%09%92%C6%25g%89s%FE%D09%D2%08%23%D6%19B%88%20%DBy%07%9Ex%E4y%99%5E%18_t%A1%05%16VL%21%05%7D%F6%E1%A7%9F%0E8%D80C%0C%2F%B4%B0B%0Ax%22%A8%60%07%1B%3C%F8g%A0%12%400h%03%86r%E8a%A2%27%26%D0%40%04%17x%60B%0C%3D%24aE%18m%E0%11H%22%9Cn%E2I%A8%A3%9Ar%8A%29%FC%9AR%AA%90%A9~%B2%AA%92%99%60%C2%1C%25OJ%D7Hu%88%14r%2B%20Wf%B9%25%1Cn%B0%A1%06%98c%8C%B9%85%16%F0%C9%E7%C4%9Am%02%D1%03%0F%CC%D6%20%83%9D%2A%A4pB%09%23%88%00%C2%07%0C%3A%08%A1%84%14Z%08%01%A1%E0%8A%AB%00%00%02%A4%F8%DA%06%23%B4%90%83%11S%7C%A1F%1D%7F%20%F2H%25%9E%E2%7B%CA%29%A8D%8D%CA%D3%FC%96r%2A%AAF%B2%BA%E4%AB%CFE%B7%B0%22%D7e%B7%5D%1F%DF%857%B1%AFd%00%DBE%99%C5J%F1D%13%C9%06%A1%DF%0E%CD%D2p%B2%B4%04%9AP%82w%08%09.%B8%81%06%18l%3BA%CD%DF%86%DB%E1%88%A4%090%00%01%04%14%B0Z%02%0A%2C%C0%00%03%0D8%E0%00%86%98g%AE9%86%96wn%B9%86%A0%83%3B%F9%E8%1C%96%EE%E1%E0%83KPa%046c%FE%B9%E8%86%7F%98%00%88%21%1E%60%FB%01%06%E4%5E%C0%EE%BB3%CEx%89%C0%03%2F%C0%F0%C4%97%06%9Ag%C8%27%AF%FC%F2%CC7%EF%FC%F3%D0G%2F%FD%F4%D4Wo%FD%F5%7B%05%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1c%AD%01%FAF%0E%40yo%00%01%98%23%E7%0D0%A03%01%02z%03%140p%E0%80%01%BD%02%12%28%60%E0%80%81%5E%02%0F%24P%B80A%EF%81%0C%1CB%94%F0%A0w%01%8A%163t%B8%D0%1B%C1%07%91%25R%84%E8%D5p%C5%0B%994V%F4%8ExC%27%8F%1F4z%5B%0CB%B4%E8Q%1D%BD6%26%FEY%CA%B4%E9%8F%5E%1F%9EB%89%22eH%AF%10S%A7R%A9Z%A4%D7%08%2BV%ADZ5%D2%9B%C4%D5%AB%FF%8E%E8%A5D%2C%04%C6%F2%88%80%B2%24%28%CB%2B%AA%A8%92%CA%83%A8%A0r%CA%84%A6%94ba%29%A4%8C2%8A%28%A1%80%02%8A%27%9Et%C2%89%26%99%60r%89%25%95L%22I%24%8F8%C2%C8%22%89%1Cb%08%21%82%FC%E1%07%1Fz%DCa%07%1Dr%C0%D1%C6%1Ai%98A%86%18_p%A1%05%16UH%F1%04%13K%20a%C4%10%40%F4%A0%03%0E5%CC%10%83%0B%2C%A4%80B%09%24%8C%10%C2%07%1Dp%A0A%06%17TP%01%05%13D%00%C1%03%0E%B4%C6%C0%02%0A%24%90%00%02%08%94V%9A%01%05%E4%F9%D9g%00%2C%A1%E0%9F%05%C2%02%CB%7F%AE%E4%97%1F%2B%AB4%98J%84%A7T%98%21%87%A0%7C%22%E2%26%99%9CH%C9%24%91%40%E2%22%8C%87%14%22H%207%EA%81%87%1Ds%C4%F1%06%1Bj%9C%21d%18%5E%1C%99%24%14%FEM4Y%84%10%3F%F0%A0%C3%0D4%C8%00C%0B%2B%A4p%82%09%24%7C%E9A%07%1Bh%80%81%05%15L%20%81%9A%0F%B0%D9%C0%9B%0AD%3Bg%9D%A6%E5Y%C0%9E%A0-1%CB%2C%7F%CA%12%A8%A0%AF%B8Rh%2B%F7%AD%92%28%84%8Db%B8a%87%9Fx%C2%C9%26%24%A2%A8%22%8B%8DpZ%08%21%81%FC%C1%C7%1E%A3%F2%E8%23%90%AB%B6%8A%85%15SD%E1%C4%12I%3C%19%E5%94U%C6%F0%02%0B%2A%FCJ%82%08%20%80%B9A%06%18%94%89%A6%9Ak%3A%F0%2C%B4q%D2Y%27%9Ez%EE%D9%E7%B6%DC%2A%F8%ED%A0%E1%8E%5B%AE%83%8B%A6%FB%28%BB%21%8EX%A9%25%94%AC%F8H%23%8C%28%82%C8%8C%F9%F6%B1G%1Ew%D4%D1%A3%1B%00%93%C1%2A%17YXA%85%92%08%1BAD%10%3E%EC%80%83%0D3%C8%F0B%0B%2A%A0%00%AC%08_%86i%EC%05%C8%A6%19A%04%CE2%00%B2%02t%DAi%ED%B5%7Cj%8B2%A0%04%82%DB%B2%A1%88%2A%2Aa%A0%85%18%8A%02i%CD%94Z%8Ai%8B%2F%C6%E8%29%207%12%5D%07%1D%A6%A2z%C6%90_t%A1%C5%15%AF2%A1%C4%11%B3%D6%9A%83%0D4%C4%00%83%0B%BD%9EP%82%97%1F%0C%7B1%D9%C9.%DBq%03%CF.%00%27%DBmW%5B2h%05%9C%CD1%04%B8%E7%AE%FB%EE%CD%F6%EE%3B%9Bm%06%EF1%EB%AC%ABm%BC%EB%AEG%AB%BC%9Cr%E6%DEl%9B%C4%AB%9D%BC%B4%D3Rk%9A%01%D8%BF%8Dmg%DC%0F%80%D9%F7%99Q%26%FE%F8%E4k%F6%D8%F9%E8%A7%AF%FE%FA%EC%B7%EF%FE%FB%F0%C7%2F%FF%FC%F4%D7o%FF%FD%F8%DF%14%10%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%85%06%000xo%80%C3%87%F5%06%18%C0X%40a%BC%02%0AH.%40%40%EF%80%04%98%13%18%D0%5B%00%82g%08%0C%F4%22%D0%B0%A1%F4%04%BD%0DV%B0%60%B1%E2%83%5E%0AB%86%C8%86%A1%D7%03%97%DB%5C%8A%E8EAg%8E%EF%2Czg%1C%1A~%28%8D%5E%1E%95%2AY%B2tG%AF%10P%D0A%01%D2k%E4%94%F5S%86%F4%26a%C5%9D%95%22%BDK%5E%FE%B9%1A%DF%08%3C%2CX%AF%5E9%D2%CB%24%96%7BX%EB%F32%91%25%CB%FD%23%F6%F4%EB%DF%97%9F%3F%D6~%BC%F3%D5%E7%1F~%F4%0D%C8_%81%FF%DD%15%A0~%04%DAG%20%83%07B%08%60%7F%09%DA%B5%04%85%E0a%98%D7%85%08f%D8%E1%86%05%C6%E2J%2A%A9%A0%82%8Au%A6%94%A2b%29%A4%8C%22J%28%A1%80%F2%89%27%9Dp%B2I%26%98%5CbI%25%94H%12%C9%23%8D0%A2%08%22%87%14BH%20%7F%F8%B1G%1Ev%D4%21%07%1Cm%AC%91%86%19d%88%01F%17Z%60Q%85%14O0%B1D%12E%08%F1C%0F%3A%D8%40C%0C0%B8%B0B%0A%26%900B%08%1Ft%C0%81%06%19%5C%60A%05%14H%10%81g%0E4%C0%C0%02%0B%28%A0%40%02%08%1C%60%E8%01%06%18%20%19%01%8C%12%C0%D8%A3%02D%0A%00%87%EE%BD%87%9Ex%ADd%CA%CA%2A%AB%A8R%E2%89%29%B6%F8%E2%8C5%DE%A8c%8F%3F%069%A4%21G%FE%D1%C7%1E%FEx%D8AG%1Co%B0%A1%C6%19f%8Cq%A5%16WP%21%05%14M%28q%04%11A%F4%B0%03%0E6%CC%10%83%9A%29%9CP%C2%08%22%80%E0%01%07%1Bh%80%C1%9D%13%E8%19%C1%03%0E%FC%09%A8%A0%98%15%8A%E8d%8D%3A%FA%E8%00%91%0A0i%7F%96%A6%E7J%A6%ADl%DA%E9%A7%A7%84%EAb%8C4r%A2I%26%A7%FA%08%24%23%89%20b%24%92%AF%C6J%87%1Co%B4%A1%06%1Ae%E8%8Ae%AF%5C2%21%2C%11%40%90%89C%0D%CA2%7B%82%09oJ%DB%C1%06%19%60pA%05%D9J%00%01%B7%0Cx%0B.%02%E2%2A%BAh%B9%E7%A6%BBn%88%B1%9C%E7.%BC%DC%CDkb%BD%2C%DEK%AA%BE%FCZ%82%EA%BFC%0E%EC%2A%AC%B2%3E%A90%C3b%7C%C1%85%16V%F8%DA%E5%C4%15%EBp%F1%0Ci%AE%E9%2C%B4%1E%83%7C-%C9z%9E%DC%A7%9F%81%0E%CA%B2%A1.S%D6h%CC2s%28%E0y%97%8E%A7%29%A7%9E%96%C8%B3%A8%A1%7C%F2I%87%A9A%0F%DD%C8%22%01%1B%5Dp%1D%07C%B9%C6%19e4%8De%D4%11%0B%3BD%C5%C7%26%9Bu%0A%28%3C%1BB%D7%21%8F%9C%ED%9E%DC%F6%A92%A1-%93%BB6%DB%EAv%F6%D9%E9%A8%7B%F6%C0%EA%AC%B3%EE%C0%EB%B07%20%FB%EC%29%A7%0C%E8%ED%82%82%9B%19%CBg%1B%2A%BB%ED%DF%0E%1A%AE%B8%88%26%3A%99%DA%A3C%9An%BA%885%EF%BC%F3%81E%2F%FD%F4%D4Wo%FD%F5%D8g%AF%FD%F6%DCw%EF%FD%F7%E0%87%2F%FE%F8%E4%8B%14%10%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%9F%06%0007nB%01%02%02%E8%B5k0%C0%00%02%80%07%E0%D5%5B7n%80%03%0A%10%208%60%A0%00%81%01%03%0A%C7%3DPA%C2%03%07%0C%16%24%40%60%40r%DC%05%23%3Ch%B8P%B9A%01%BE%04%25%D8%80%A1%A2%04%08%07%9E%F9jx%82%04%88%0E%13%A8%0D%8E0%03%26%8B%14%1C%B9%0B%B6%D8S%07N%9A%25%C1%09%D6%60%84h%90%1F%2F%C9%07%F2%D0tI%92%237%D1%05%0A%19%15%AA%D3%26%3D%D9%01%FE%14Iu%AA%D4%28A%E1%91%B4b%B5%2A%15%A2%F0J%5E%B9j%D5j%11%7CX%B0%E47%0A%BF%24V%2C%FC%8E%F0%27%8B%2C%FF%05%98%DD%12%03%FA%F7HxL%24%18%CB%82%07%3A%08at%08%12%F8%A0%80%16N%98%5C%83%192h%21%2C%1A%06%D7%A0%7F%17f7%A2%82%1E%92%18bnL%F8%07%20%83.%C2b%60t-%FE%27%23%8C.%CE%98%5C%7F6%EA%28b%8C%3E%B2%08%24%7FC%1Eh%E3%2B%FB%1D%88_~IR%B8%24%92%FC%3D%D9%E4%8E%F8%BD%02%A5%92%F9%5D%E9d%96S%06%B7D%96%AEt%99%5B%7CV%BA%C2%08%7CV%CAwfvd%BA%12%26%9A%F2%99%19%5E%12e%B6%B2J%29x%922%8A%28%A2%84%02%CA%27%9Ex%D2%09%27%9Bh%82%C9%25%96TB%89%24%91%3C%D2%08%23%8A%24r%88%21%84%04%F2%87%1F%7C%E8%81%87%1Dt%C8%01G%1Bk%A4a%06%19b%80%E1%85%16XT%21%C5%13L%2C%91%84%11%FEC%FC%D0%83%0E7%D4%20C%0C%2F%B0%A0%C2%09%25%8C%20B%08%1Ft%C0%81%06%19%90V%01%05%12D%00%C1e%0Dd%A6%80%02%9B%29%B6%18c%05T%EB%18%60%8FA%06%19%5E%DC%E2%05%40%9B%F4%AD%C7%9E%2A%A9%A0%82%CA%29%A6%E4%D9%E7%9F%82%16%9A%C9%25%95L%C2%A8%A3%8C%24%82H%21%84%08r%E9%1Ey%DC%D1%29%1Cn%84%3Aj%18_p%91%85%15SH%01E%13J%1CA%04%10%B3%E2P%C3%0C%B8%EA%8A%82%09%24%88%00B%B0%C3bp%81%05%15L%90%EC%B2%0E4%BB%C0%02%D0J%CBXc%D6b%9B%AD%B6%DDr%FBm%9C%E1%B22n%B9%A7%A0%5B%8A%9E%EB%02%EA%9D%A1%89%CA%0B%89%A3%8BH%8A%AF%A5%7D%F0%CB%A9%A7%A0%A2a%C6%18ax%B1%05%16%08G%C1%EA%ABC%40%AC%83%C42%C0%E0%C2%0A%29%F0%3AB%08%1Bw%B0%81%06%18X%60%01%05%22%2B%CB%AC%C9%29%2Bv%00%B5%D5b%AB%ED%DD%82%C5%0C%00%FE%9D%F3%D1g%F3%2A%AB%90%7B%AE%CE%3C%FB%F9%C9%A0%85b%12t%24%908%C2H%D1%87%14%22H%20%98jZG%A7o%80zF%19%A5v%A1%C5%15%AA.%BC%04%12E%08%F1%03%0F%B4%D2%D0%F5%D7a%F7J%F6%07%1Cl%90A%DA%21%27%ABl%C9%26%A3%1C%F7%DC%2C%D7m%F7%DD1%7B%CBw%CD%E3%0A%AE%F3%CE%3D%0BJ%E8%BB%96%2C%DA%A8%E3%8A%20rH%BE%80%60%DAo%1Ds%C4%E1%06%1B%A2%92A%B0%E7VP%B1%2A%13J%90%1E%84%0F%3B%E4p%83%EA%2F%B4%B0%C2%C5%19%03%EB%81%D9%C5%AE%DD%F6%B2%0F4%D0%C0%C9%28G%3B-%CB.%7B%D9%B6%82%27%00%00%14%00%02%08L%E0%03%16%C8%40%06%3A%E0%81%10%C4%9D%FE%F4%C7%80%0Af%86%7F%BA%7BV%026%E8%3F%B9%CDme%06%60%99%067%E8A%DE%85%D0Z%D7%0A%0C%DE%F2%D6-%C2%B8%F0%850%0C%8F%0CgH%C3%1A%DA%F0%868%CC%A1%0Ew%C8%C3%1E%FA%F0%87%0D%40%0C%A2%10%87H%C4%22%1Aq%25%01%01%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%ACY%89%01%02%9C%AD%18%40%40Z%B5%00%E0%AE%5D%18%A0%80%01%02%04%06%08p%9Bv%AE%C2%00%0B%228Pp%E0%EE%00%BDr%FD%16%0CP%21%C5%08%0E%15%200Hp%20%AFb%84%1D%964%09RC%05%88%0C%13%1E%28%18p%D9%A0%860x%DA%88%B1%B2%A4G%8C%13%1E%1A%24.%0D%21%8D%25H%88%FC%D0Q%F3EJ%11%12%05J%13%2C%E0%25%14%29P%9A%285%2A%C4G%0E%94%08%C2%07%06x%02%AA%D5%AAT%A5Du%C2%24i%8F%8C%E8%03k%FEX%82%05%EBU%2BV%AAN%91%CAD%854%F8%0E%85d%C9%8AE%FE%95%ABV%A8%E64%00%0F%E0A%1EX%F2%C9G_y%84t%C0%9F%40J%CC2K%80%F3%C5rI%0E%07%0E%94%C4%82%0C%8A%22%C5l%FC%25%C1%20%2Bi%1C%10aAJ0%08%C9%87%06%85%18%E0%88%24%12%B4%84%88%29%AA%18%60%2C%8F%B48%D0%8A%02%C6%28%23%00%26%CEg%A3%8C%26%C6%02%E3%8D%00%AC%E8%23%2C%8E%00%29%24%7DE%DE%B8%84%8F%F4%ED%D8%E2%92C%3A%99%22%94%E4%25%29%23%95D%1A9d%96J%0E%08K%23F%D6%F7%0A%98J%8AI%E6%95f%86%F9%8A%7Dg%3E%B9%A6%2B%AE0b%E4%9Bq%CE%09g%2Br%2Ay%27%9EF%DE%D7%0A%9Fz%FE%D9%CA%22%7D%0AJ%E8%8DJ%08%CA%CA%A1%3C%FE%C9%CA%A2%40%26z%1E%2B%8AD%EA%E8%2A%95%DE%88%C4%A3%AC%AC%92%08%90%9Bv%EA%29%A8%8F%AE%A2%CA%A7%9A%AEb%AA%2A%88%80%AA%AA%2A%FE%A9%B4%9A%AA%2A%B0%CA%2A%23%12%A6%A6%12%2B%90G%D0%9A%0A%2A%87%00i%84%AE%A8%00%2B%EC%AF%A8%9Cb%C8%B1%C5%2A%0Bd%11%BF%9EbJ%21%CF6k%0A%29%9Dp%B2%C9%26%9Adr%89%25%95P2%89%24%91%3C%E2H%23%8B%24%82%C8%21%86%10%22%08%20%7F%F4%B1G%1Ew%D8A%87%1Cp%B4%C1%86%1Ah%981F%18_p%A1%05%16VL%11%85%13L%2C%91%84%11C%00%E1%C3%0E9%DCP%83%0C1%BC%C0%82%0A%28%98P%C2%08%22%80%F0A%07%1Ch%90%01%06%17TP%C1%04%12D%00%C1%03%0E8%D0%C0%02%0A%24%90%00%02%07%14V%00%5Ez%F1%F5%16DE%24kJ%29%A5%902%8A%28%A1%80%F2%89%27%D9n%92%09%26%E0RB.%24%8E0%92.%22%ED%0A%F2%87%1F%7C%CCk%2F%BEn%EC%7BF%19%FFz%C1E%16VP%21%05%14O0%91%C4%11D8%0C%F1%0D4%C8%00%83%0B%17g%BCq%08%20x%00%B2%FE%C8%24W%40%01%CA%2A%B3%DC%00%030%2B%10%B3%CD7%E7%95%B3%CE%0F%15q%8A%B4%40%93Bt%D1%9F%24%DD%ED%B7%95%8C%5B.%BA%EA%1ER%88%20%81%F8%21%2F%BDu%CC%01%C7%1Bm%AC%91%86%19d%00%DC%85%16WTa0%C2J%1CQ%84%10%3F%F0%A0%03%0E5%C4%FDB%0B%2B%A4pB%09%24t%AC7%07%1Bh%40%B2%05%7F%A7%1C%B8%CB%2F%1B~%B8%01%D4%27%9E%D7%5E%D8c%88%90%E3%3F%07%3D4%E5Hk%AB%09%D3%E1%92k.%23%8A%24%E29%21%81%5C%CD%87%1Exl%0DG%D7i%A0%016%18%5DlA%B6%D9O4%A10%C3n%8BX%DC%E6%C6%82%14d%8C%04%23%08%C1%07%3C%80%BC%E4a%C0%02~s%DE%CAZ68%98%CD%8Cf53%40%016%A88%EC%F1%A5%21D%80%9C%D0D%21%0A%A3UN%7C%DE%0A%D7%24%CAu%AE%A9%19%E2s%A1%CB%1A%E9%E6%10%07%D4%A9%8Eu%00%13X%ECf%C7%04%25%20%A1%08%84A%C8%DD%EEj0%83%8A%01Ox%1B%EB%D8%02%917%B2%0B0%0Fp%13t%19%E1%2Cx%C1%0Cn%F0f%87Y%DC%CE%16B%80%07%B0%ACe%60%A4%60%03%C68F%06%98%D1%8C%0BHc%1A%A5g8%99%B9%11%01p%84c%CD%E6H%BD%3A%5E%91%83x%21%C0%1C%0BS%BD%3B%E6%11gY%CC%A2%07%B3%F7%96B%1A%B2%2F%40J%A4%22%17%C9%C8F%3A%F2%91%90%8C%A4%24%27I%C9JZ%F2%92%98%CC%A4%267%C9%C9N%C6%24%20%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%2B%C4%00%5E%3F%0A%18%1B%A0l%D8%8C%04%0E%14%180%40%80%D9%B3%15%0FP%90%C0%00%C1Z%B2p%27%2AX%21%A3%84%86%08u%0B%10%18%006%EF%C3%03A%C6P%19%22%83D%06%BA%07%06%18~8%60%C9%A0%40t%C8P%11%12%83%84%06%07%92%277%1C%22%89S%25F%81%E6%90%91%12D%C5%02%D1%0DO%28JeJ%94iF%7F%E4x9%21%00%F6%C2%0C%7DZ%B5Z%95%AA%94mJ%89%AC%28%F0%AD0%01%1AU%AF%5C%B5b%B5%0AU%29Py40O%28%C0J%29X%AF%A2%FE%0Bg%A5%2AR%8D%ED%09%81h%82%05%3E%BC%F4V%A0%B2%F4Fo%B0%04%22%F6%EC%DD%BBJ%15%E75%FD%82%12%E8%F1J%2C%F8%85%F7J%2B%81%5C%F0_A%06%90%A1J%2C%10%E6%17%DD%23%2B%2CHP%00Q%88B%20~%EDu%E2%84%85%04%D5%60%09%84%1B%B6w%8A%18%04%80%28P%07%84%90%18%21%7B%AD%E0%E1%80%8A%008%80%C7%2B%B2%90X%60%21%1E%D0%28P%12%B2%E4%A8%23%2C%97%E0%E0%E3%40H%08I%A2%28Q%14v%24%00H%E8%B8%0A%1A%07%3CIP%12%2F%3AbeAQn%A8%E5%96%03%25%C1%E1%97%60%02%20f~%8D%94%F9%A3%84i%AA%29%A6%81m%96%89%84~q%82%99Dt%D21%A2%A6%99%AE%BC%A7%A7%9B%7D%0A%F7%A7%9C%EF%B5%B2%C8%9EH%087%DD%A1n%8E%C7%0A%A3e%26%E1%A8%22%88%B2b%E9%2A%89T%BA%CA%A6%99%AA%89%04u%AB%A8%D2%A9%9C%A1%AA%A2%0A%22%88%86%9AJ%2A%A8z%AA%CA%AA%FE%A8%B4%2A%27%AC%A8%1C%B2%E7%11%A9%A0%82%CA%29%86%DC%AA%EB%29%A6%F4%AA%E6%11%BB%9AbJ%21%7B%1A%01%AC%29%A5%20%AB%A6%11%C6%96B%0A%21%7B%16%C1%2C%29%A4%0CR%AD%B4%A4%8C%22%C8%B6%DD%8A%F2%AD%9AD%84%1BJ%20%7B%0E1%CA%28%A1%9C%BB%A7%10%A2%88%12%0A%28%80%EC%19D%BB%A0%7C%F2%87%BD%F9~%E2%89%1F%7B%02%91%AF%27%9D%00%AC%26%10%FEz%C2%09%1F%01%7BB%F0%26%0C%AB%F9C%27%9Dp%B2%C9%1E%7B%F6%C0%89%C5%9A%E8%91%F1%26%9Bh%82I%1E%1Fk%92%C9%25x%EC%C9%83%C9%97Xr%C7%9E%3B%9ClI%25%920%B2H%22%88%1CbH%21%84%08%12%C8%1F~%F0%B1%87%1Ex%D8Q%C7%1Cr%C0%E1F%1Bk%A8%91%86%19d%8C%11%06%18%5El%A1%05%16VP%21%05%14N0%B1D%12G%14%21D%10%3F%F0%A0%03%0E7%D40C%0C0%BC%D0%C2%0A%29%9C%60B%09%24%8C%10%02%08%1Et%C0%81%FE%06%19%60%60A%05%15L%00A%03%0A%24p%80%01%83%B55%D2%0E-WB%C9%24%92%40%F2H%236%E3%7C%08%CF%3E%03%DD%C7%1Ey%DCQ%07%1DI%C3%D1%06%1BN%9F%11u%18%5ET%9D%C5%15UL%21%C5%13M%2C%A1%04%12E%0C%11%84%0Ff%A3M%C3%DA%2F%B8%C0%02%DC%28%CCM%82%08%20%7C%90%F7%06%7C%FB%1Dx%04%0F4%B0%80%E1%82%B5%E5%E4G%3A%CC%FCx%24%91%3C%E2%88%CD%8A%E4%8C%F9%CFAs%EE9%E8q%BC1%BA%D3f%94%21%F5%17%5Dh%B1z%EB%AF%7B%3D%BB%11%B6%E3%AEC%0Ei%F3%EE%BB%0A%29%04_%C2%08%22%08%C1%07%F4%B6%B7%BE%5D%A0%02%14%98%80%04%20%E0%00%06%28%00%01%06%88%9E%5BB%A2%03%C7ANr%8Eh%C4%CD%BC%D73%F0%09%ADs%9F%93C%1CDG%3A4%40m%7D%ED%C3%9A%15%A6%10%85%27x%0DlF%18%9B%FD%F0%A76%B6%ED%2Fns%03%A0%00%F3%C6%01%E4a%E0%02%B5%7FK%E0%02%1F%C0%80%E7A0q%13%FCH%0E%28%21%89HH%AE%11%1A%B4%DC%F7%80%264%3D%8CO%84%24%5C%C3%D3N%E7%85%14Z%A1u-%8C%1D%D8jw%3B%B3%D1pm0%B8%A1%DC%FEG%3C%E3%E9%0Dy%7D%0B%E2%04%26%10%01%066%80%01%09%40%C0%E1%06%E3%96%B7p%84%00%0C%08d%20%17%40%C8B%2A%E0%90%88L%80%22%15%89%80F%3A%F2%00%90%8C%A4%01%26I%C9%08%16%E0%92%98%24%80%267%998%B6%0C%C0%92%98%14%0C%27%3B%E9I%B6%8C%E5%94%7D%2C%CB%F4%F6%C4%CAV%BA%F2%95%B0%8C%A5%2CgI%CBZ%DA%F2%96%B8%CC%A5.w%C9%CB%5E%FA%F2%97%C0%E4I%40%00%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%95g%80%00UO%0E%18%20%00kV%91%01%10%280%40%80%EB%D5%AF%1F%1Dt%B8%E0%20A%01%B3%5E%D1j%BC%10%E4%07%8B%0E%12%16%1C%20%20%40%80%5C%8D%14%BA%C8%F9%B2%C4%06%09%0C%0F%DC%FA%FD%7B%D1A%99I%8A%F6%A4%B1%12%C4%C5%07%0A%08%E22%9EX%00%0B%A7P%9A%20%0D%A2%13%86%09%0E%0F%066W%0C%D0%A4%93%AAS%A3%3AUR%C4gM%93%0A%AA%2B%C6%90%D4%8A%D5%2AT%A5%40G%F2%E3c%40%EE%89%1B%02%B5Z%EE%3B%95%A9Q%9B%C8%2C8.qA%1BU%CB%7B77%D5g%03%F5%88%04%B6%FE%90%CA%CE%7C%95%2AH3%BEGD%D2%C9%15y%ED%9A%8E%A8%87x%82%91%2B%F7%E4Y%91%2A%93z~C%0C%7C%B4%82_v%AC%A4%A2%C7%04%FE5%94%C0%19%A8%BC%C7%CA%83%88%84%90%20C%02X1%CA%80%CC%B1BI%0E%132%F4C%26%18j%07J%16%8Bu%88%10%09%86%DC%97%1F%2B%A7%C01%9D%89%08Ip%87%80%2B%AE%F2%C7%050%22d%80%18%A7%84%F8%20%23%2B%E4xP%00N%7C%F2%9Ev%9B0%21%E4A3L%A2%22%81%FA%81A%C0%92%05q%A0%1C%86%0F%A6R%87%03T%12%E4%80%1D%AB%F8%B8%8A%20%1DtY%D0%11%3Ejh%83%99%06%19q%A4%27Nh%C6%A6%40Edh%0A%19%FD%CDY%90%9B%0F%B2%B2%88%9E%08%15%D1%E7%2A%8A%00z%90%11%AB%24%BAJ%22%86%B6i%9E%2A%AA0%DA%28AE%3C%9A%0A%22%93R%AAJ%2A%A9%A0%82i%A6tr%8A%8A%A7%A0%D29%2A%2A%A7%18R%2A%00E%A0z%8A%29%FE%AA%96J%C4%AB%A6%94R%C8%AAD%D4ZJ%29%84%AC%3A%C4%AE%A4%902%08%AE%A5%902%CA%28%82%F8j%AC%28%A2%24%5B%AA%10%A3%88%12J%28%81%AC%2A%84%B4%A1%80%02%C8%AAAd%0B%CA%27%7Fp%FB%C9%B8%9E%F8%21%AE%27%9Et%D2%C7%AA%40%A4%DB%09%27%7C%B0%FB%EE%26%9B%EC%B1%EA%0F%9Cl%A2%89%26z%AC%EA%83%BE%99%60%92%C7%AA%3D%04%7C%89%25w%10%7C%B0%25%95%D8%B1%2A%0F%0CSBI%1D%AB%EEP%09%25%93HB%C7%AA%3AL%92q%24s%AC%9A%83%24%91%40%F2%88%1C%AB%E2%10%C9%23%8F8%02%C7%AA7%B4%DC%08%23n%ACjC%233%2F%D2%C6%AA50%B2%88%22%89%AC%B1%2A%0D%40%23r%88%1A%AB%CE%60%F4%21%85%A4%B1%AA%0CL%13B%88%19%AB%C6P%08%21%82%08R%C6%AA0%0C%22H%20%80%90%B1%EA%0B%60%FF%E1%87%18%AB%BA%60%B6%1F%7C%80%B1j%0Bl%EF%A1%87%17%AB%B2%B0%C7%1Ey%E0%D1%C5%FE%AA%2A%E4%91%C7%1Dv%CC%D1F%1Bl%AC%91%06%1Af%94A%06%19c%84%01%86%17%5El%A1E%16X%5Ca%05%15RD%01%85%13M0%B1%84%12H%1CQ%C4%10A%00%F1%83%0F%3C%EC%90%03%0E6%D4%40%C3%0C1%C0%00%83%0B-%B0%B0%82%0A%28%A0p%82%09%24%8C0%82%08%20%7C%E0%01%07%1A%60P%81%04%0F%2C%80%C0%5E%5D%C9y%92%0A%80%D7A%C7%1Cr%C4%01%C7%1Bm%ACa8%E2f0%EE%B8%17%5Dp%219%16VT%81%B9%14P%3C%D1%C4%12K%24%81D%11D%90%0E%04%EA%3B%E8%80%C3%0D6%BC.%03%0C%2F%D0n%7B%0A%29%D0%9D%09J%F0%BB%10%80%C0%03%1D%D8%80%06.%40%81%084%40yo%B9%CAYR%92%02%E9Q%CFzopC%F6%D4%90%863t%8F%0Cbx%5C%F8%B4%A0%85%CA%5DN%0A%E8S%9F%E7%92p%04%23%10A%08B%A8%0B%0Fx%60%3F%FC%D5%60%062%88%DD%0Bjw%BB%00%EE%AE%04%F1%BD%03%9E%F0%3A%C0%81%0Dd%80%81%11p%80%F2%C82%80%09%A6%04%05t%A8%DE%F5%06%B7%06%0E%22nqb%08%C3%17%C0GB%13Va%0A%29%EC%DC%E7%90%60%84%D1%09%C1t%A8%D3%C1%EAn%E0%3A%1C%F2%CF%05%B6S%81%0F%07%18D%03%0E%B1%88%19%C0%00%12%1F%C0%00%04%18%E0-%5DY%C9%09%E4p%3D%0Dj%EFp%89%03%E1%F7%BA%20%B9%2CX%EE%8B%99%7B%82%13%3C%07%3A%D1%0D%21%86%F3%EBA%FDX%D7%3A%1C%C6%A0%7F-X%C1%0A%E6%08%C4%DF%89%20%04C%24%A2%02%8Fh%01%0A%20%8F%01%098%00%20%9DW%12%01%20%E0%96%B8%5C%DE%01v%C9%CB%03%18%E0%97%C0%FCe%01%86I%CCb%12%E0%98%C8L%E6V%96%C9Lf%F6%A5%2F%C9Tf3%B9%D2%17%09%D2rU%D8%CC%A66%B7%C9%CDnz%F3%9B%E0%0C%A78%C7I%CEr%9A%F3%9C%E8L%A7%3A%D7%C9%CE%A1%04%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5Dj1%80S%A6%2F%05%14%280%20%00T%96%02%1CDP%40%D5%EAU%94%02%3C%B8%F8%40%81%C1%01%02%02%9E~%25Y%E2%0A%14%1C%24.8%40%405%EDZ%91%27%E4%F8Yc%C5G%0A%0D%10%12%14%10p7%24%869%9A%22%09%82%B3%85%88%0B%0F%12%0Ex-%DCq%81%1AR%A4%3AQ2D%07%8C%92%19%18%08P%F6X%E0%0B%A9U%A8Hy%AA%94%28O%99%1E%0CF%7B%FC%A1%A9%15%2B%D4%A5%40%5Db%04%C7%84%EC%8E1%22%B5%B2%7D%3BU%A9P%93%A2%88%FE%ADqC%A0%E1%C3o%ABB5%AAMl%E6%19%21%C4Q%05%9D%D5%EDU%A9%02%FEu%C0%9E%B1%80%96Q%D1%BD%7F%8FT%83%3C%C6%00M%3A%A9%9F%BFJ%13%12%F7%18a%40R%BF%AA%7F%FFQd%18%80%9FE%1A%FC%E1%DF%81%A8%D1%E1%C0%80%15-%B0%06%2A%07%AA%22a%2A%82x%C0%20E%04d%11%8A%7F%12N%08%C9%0C%17RTD%26%1DN%98J%2A%98%18%11%E2D%26%20R%E2%89%27%862%86%80%2BBtA%1E%A8%A8%92%8A%89%A8%98r%87%045B%94%00%19%A4%C0%08%23%2A%A8%14%F2A%90%0F%09%20%C5%27G%22%89d%2470%F9%10%0F%93H%29%E5%29%A7pb%05aV24B%20Hri%E6%29%A2%B0%A1%40%98%0CE0%87%29eri%8A%29%A5%ECQ%01%9B%0B%15%E0E%28g%CE9%E7%21%28%E0%A9P%00Jd%22%A7%9FtR%92%84%A0%0A%C1%D0%08%A2t%96RJ%27Z%0C%C0%28B%1A%EC%E1%A7%A4%9C%8A%02G%03%97%1E%D4%00%1C%A4pZ%0Af%A4%8C%B2%C7%06%A1%22%14%84%A9%FE%98%8D2%0A%232%B4%9A%10%10%A8%A6%3A%0A%25HLf%ABA%3F%C8%2Ak%27%5E%D0%F8%2BB%3F%88%12J%28%A2%08r%ECB%3F%84%02%CA%B4%80%3C%AB%D0%0F%D3~%F2%C9%1F%D6%26%E4%83%B6%9Ex%E2G%B7%08%F9%10n%27%9D%8CK%AEA%3Dp%E2%EE%26%7C%ACk%10%0F%9B%D4%AB%C9%1E%F2%16%C4%83%26%9Ad%92%89%1E%F9%12%B4C%26%98%5Cr%09%1E%01%0F%A4%C3%25%96XR%C9%1D%09%0B%A4C%25%95PBI%1D%11%03%90%03%25%93L%22%09%1D%19%E3%20%89%24%91D2G%C67D%02%C9%23%8F%C8%91%B1%0D%8F8%E2H%23pd%5CC%23%8D0%B2%88%1B%19%D3%B0%C8%22%8A%24%D2F%CF%89%24%82%08%22kd%3C%C3%21L%1B%92F%C62%14R%08%21%84%A0%91q%0C%83%0C%22%88%20fd%0CC%20%81%00%F2%07%19%19%BF%F0%C7%1F~%F8%21F%C6.%F8%C1%07%1F%7B%80%91q%0B%7B%E8%A1G%1E%5Ed%BCB%FE%1Ex%DCq%07%17%19%AB%60G%1D%84k%91q%0At%D01%87%1CXd%8C%82%1Cr%C4%01%87%15%19%9F%00%C7%1Bo%B8QE%C6%25%B4%D1%06%1BlH%911%09k%AC%A1F%1AQd%3CB%1Ai%9Ca%86%13%19%8B%60F%19d%90%B1D%C6%21%901%86%18a%2C%1A1%08a%80%F1%85%17Gd%FC%81%17%5Et%C1E%11%19%7B%C0%C5%16Zh%21D%C6%1Cd%81%C5%15W%FC%40%BD%15VTAE%0F%19k0%85%14%E4%EF%90q%06Q%40%F1%C4%139d%8C%81%13M4%C1%C4%12F%14Q%C4%10C%08%11D%10%3F%F4%EFC%0F%3C%E0%C1%0Ev%A0%83%1C%E4%00%077%B0A%0Dh%C0%C0%19%C8%20%06%10%84%C1%0B%5E%E0%02%17%B4%80%05%2CX%81%0AT%90%02%14x%F0%04%26%08a%09H0%82%12%8A%20%04%1F%E8%00%070P%81%084%00%01%06%40%8BZb%82%81%25%D8P%09I%40%C2%11%EAW%04%22%E4O%7F%FE%40%F8%C1%FF%00%28%40%02%1E%F0%06%09%B4A%03g%E0%40%09R%D0%82%17%5C%81%069%D8A%14%9C%E0%8A%22%24%E1%09A%E0%01%0Eh%C0%02%13p%80%02b%98%16_%BD%E4%02I%C8%E1%0E%7B%F8%C3%20%00%21%88%3F%00%E0%00uP%40%1C%20P%81%0Bd%A2%0C%1E%18%03%09B%11%83R%A4%A2%15%B1h%82%12%8C%90%84%238a%08%40%90B%0Ed%C0%02%12%10%E3Y%CA8%13%0B%F0%D0%87%40%F4%DF%FF%04X%40%03%DE%11%8F5p%60%04%9DH%C1%28n0%05%A8%FC%60%21%0F%89%C8D%86%60%91%1F%F0%80%07T%B8%81GFR%01t%29%A3%19%5BR%816%BEq%88%014b%0E%90%98%C0%1A%2C%90%06%7B%7C%A0%13%2B%D8%82%28j0%95W%04%A1%21%5B%29%02E%C22%96%B3%E4%00%076%A0%01%16Fr%010%AC%CA%0C_%12%00%02%98%F3%9C%E8L%27%01%06%C0%CEv%BA%F3%9D%F0%7C%A7%00%E6I%CFz%DA%93%9E%E8%27t%E7%3C%9D%B2%CB%8C%F9%F3%9F%00%0D%A8%40%07J%D0%82%1A%F4%A0%08M%A8B%17%CA%D0%86%3A%F4%A1%10%8D%A8D%A1%12%10%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%3F%05%28%29%94%85%01R%99A%24u%8A%24h%8D%0B%01O%5B%9EH%94%8A%D4TAo%B2%E8%80%905e%06%3E%ACX%A1%1A%C5%89%EA%1B-AVP%18P%96%24%038%AB%5C%B5Z%B5v%13%A4%40o%E3j%80P%A0.H%02%5EJ%B9Z%BC%B7o%A2%3Fn%B2%C4%DD%00%21A%81%00%869%FE%D0%B4Xo%2BV%AANy%22%B3%C0%82%15%C9%2B%28%5B%1E%809%F3%C5%17%90Z%B5%F2%2C%5B%AD%1D%0A%04%3D%E8P%A1%BA%C0%00%01%AD%5DK%D4%C0G%B6q%E3%AB%06%7D8H%00C%EF%DF%C1%85%3B%5C%B0%26%D5%F1%E3%8CV%2C%2C%C0%605p%E9%0E%0B%FE%7C%21%95%B6%7CyH2%1E%12%F0%1D%20%3Ax%84%3E0%ADZ%C5j%3E%7DV%9B%98%B8o%18%E0%FB%7B%8408b%DF%80%AB%8CB%86%01%16%ED%F7%9F%06~%A8%E2%E0%83%0E%A2B%87%03%FFu%F4%C0%1B%A6%A4%A2%E1%86%1A%06%E2A%85%1C%11p%05%28%1A%A2%82%0A%87%8F%D0%00%E2F%01%2C%91%89%89%26%9E%02%E3%25F%AC%B8%91%0B%8C%9C%A2%E3%8E%3A%82%22%06%826b%94%C1%1E%A5%98b%E4%91%A6%90%22%07%85A%5E%A4%80%19%A2%94%22%E5%94R%FA%C1A%93%17%0D%40%C5%26%A4t%E9e%97%8C%C4%80%E5E%40H2%CA%99h%8EB%CA%24B%8Ci%D1%08%81%88%22%E7%9Crn%E2%05%90nJT%81%1C%A0%84%E2%E7%9F%A1%7C%22G%04yN%84%40%17%9B%80%A2%E8%A2%8A%FA%D1A%A1%12%09%B0%04%25%9FTji%A5%89%CC%00%A9D5%24%D2%C9%A7%9E%84%1A%AA%24P%60%B5%E9C%1F%D8%C1%C9%AA%AC%AE%8A%09%19%FE%09%9C%FA%D0%03hd%B2%C9%AD%B8n%A2%89%1C%13%C8%1A%DE%14%94h%22l%26%C4%0A%CB%07%09%BE%F2%07%C4%22%97%5C%82%89%B3%CF%5E%82%08%10%C96%94%82%1F%96d%ABm%B6%8EDAW%B5%0AY%C0%06%25%95%94K%C9%B9%94LB%1A%B8%0A-%00F%24%93%C4%2B%EF%24%92%B4q%01%BB%0B%D5%10%C9%BE%91H%C2%2F%1F%2A%E0%CB%10%0D%8F%14l%B0%20%3C%28%28pA34%E2%C8%C3%89%3CQ%D8%C2%0C%C9%C0%C8%C5%8C%C0A%B1C1%28%E2%B1%22ml%DCP%0C%88%94%8C%08%1B%223%04%83%21%85%18b%88%1A%29%2F%F4%02%214%13%82F%CC%0A%B9%20%C8%CE%82%98%81sB-%00%22%F4%1Fd%FC%8C%10%0B~%24%ED%C7%18F%1F%B4%02%1F%7BD%1DF%D3%06%A9%90%C7%D5yxAuA%29%D8%E1%F5%1D%5DlM%10%0At%94M%87%16b%0Ft%82%1Cl%CB%81E%DA%02%99%00%C7%DCpX%017%00%25%B4%A1w%FE%1BU%DCM%C2%1A%80%AF%21%C5%DD%23%A4ax%1AQ%DC-%82%19e%98a%86%13w%870%C6%18b%88%B1%C4%DD%20%80%A1%F9%17I%DC%FD%81%17%5Et%D1%C5%11w%7B%B0%85%16%A8%13qw%07X%5C%81%05%16m%C2%BD%81%15UTa%C5%0Fwk%20%C5%EER%F4pw%06P%04%0F%85%0Ewc%D0D%13L4%81C%F1K%28%A1%C4%125%DC%7D%C1%11%D4%1F%A1%29%DC%16%10%A1%3D%11b%C2MA%10%E0%07%F1%C2%DD%13%FC%E0%C3%F9-%DC-%01%0F%3B%B4%AF%1D%DC%12%E4%80C%0E9%A4pw%046%E4o%C3%09wC0%C3%FF30%C1%DD%1E%10%83%02%C6%60%04ws%80%0B%5C%F0%02%17%84%E0n%0D%60%81%04Y%00%02%08%AA%E0%82%29%F8%10%DC%18%80%82%0E%9E%E0Q%1B%2C%81%09LP%82%0D%DCm%01%24%18%81%0AE%C0B%16%86%E0%85%2F%14A%0C%5B%28%C3%19%CE%D0%854%8C%21%0CuH%C3%1A%86%00%04%F5%1F%E8%00%070P%81%084%20%01%07%20%00p%14%16%13%05%C8%B0%87-%84%A1%0BC%20%82%11D%91%8AP%CC%21%14m%B8%C5%17%02%D1%03%1C%C8%80%05%24pD%03%10%805L%84%89%02%40%C0%C6%1F%FE%90%8D%40%04%E2%07%E0%E8E8%CE%11%8Ex%CC%23%08%DE%18G6%DE%B1%8F%1F%08%E4%07%3C%D0%81%0D%10%D1%88%080%E3%12s%92%80Az%C0%91%81%F4%80%24%1F9IAF%B2%92%8E%AC%24%26%059IIv%A0%93%93%EC%80%289%B0%01%0D%5C%60%02%10%60%00%02%7C%B3H%9C%24%60%94B%14%A5%2Cg%09KZ%8A%92%90%1C%C8%E5%2C9%60KX%E6%92%97%B5%24%25%295%20F%09%3C%60%01%ABD%A3N%FA%23%80f%3A%F3%99%D0%8C%A64%A7I%CDj%3E%F37KL%E3%DD%B6%C9%CDnz%F3%9B%E0%0C%A78%C7I%CEr%9A%F3%9C%E8L%A7%3A%D7%C9%CEv%BA%F3%9D%C2%09%08%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%3F%05X%19%E5%07%03R%99E8%C1%9A%CA%AAM%82%A7-O0z%C5%F5%D5TX%A4%AC%04%C0%8A2%03%9FV%AE%5Cu%5D%FBJ%D2%0A%B2%24%19%BCI%856%AD%5D%B5k%5B%E1y%00%F7%23%01.%A3Z%09%1E%9C%D6%14%AB%BBi%5B%8D%922%B6%AFF%1F%97XIf5%B8U%2A9%0FF8r%85v%F0%AAT%89H8%BE%E8%A2%D1%AAU%93%27%AB%DAc%81%A0%13R%83Y%A9%3A5JS%18%04%A3%25f%C8%93J%95%AA%D3%C0U%11%02q%F0%81%1D%D4%9FK%85%CA%E4%A8%0E%8B%DC%0E%17%A4%29%95%AA%BA%EF%EB%8CT%2Cl1i6%29O%95%14%FE%E99%F3%E3%2At%84%04%B6%7CB%C5%BE%BA%7BG1%1C%0E%E8%02J%14%27I%85%E8%84YBCB%E3%F3%03%ED%40%89%29%A7%14%C8%DE%29%A8%60%B2%C4%7F%0EQ%60G%26%8F%04%F2%86%16E%C0%F0%01%04%03%00%08%40%0B%89%94%E2%A1%29%04%16%F8%89%18%06T%E4%C2%1E%7C%A4A%85%0F%2Ah%00A%02%04%40%87A%1E%A3%90B%8A%87%1F%92%22%87%03%18%0D%B0C%18O%E0P%C2%05%0E%20P%C0%00%0C%3E%E5%40%1A%9F%8C%E2d%8D6%92%E2G%07%1C5%40%C3%0C%22T%C0%C0%01%04%08%10%40%92E%11%20%C5%25%A1%84%22%CA%99%A28%B9%88%0C%209%90%81%04%0B%180%80%97O%05%40%04%24%9F%7C%02%CA%9Ee%86%12%89%10%23%05%90%40%02G%D2y%94%0A%83x%A2%A8%27y%E6%89I%17%25%96%14%C0%9C_%1Ae%81%1C%9Bp%A2i%27%9Cz%B2%C9%1A%0D%A8T%29Q%09ta%89%26%9Al%A2j%A6%9C%D8%A1%81%86%FE%1D%0D%B0%84%23%97%60%92%C9%AD%99%A0%3AH%0B%B0v%84%03%21%95Tb%C9%B0%97%D4%8A%08%0F%BDr%D4%C1%1C%92L2%09%25%D0%0A%FB%88%15%05%24%AB%91%04d%3C%12%C9%B6%92t%3B%89%24g%F0e-F%07%3C%81%88%23%8E%3C%A2.%24%90D%22%C7%AB%E3%5E%14%40%0F%81%2C%C2%08%23%8D%E4%8B%EE%1Eo%C5%7B%91%0Au%20%82H%22%8A%2Cb0%23%82%10%01%A6%BF%10a0F%21%86%18r%C8%21%02%27R%88%15%B81L%D1%02T%04%22%C8%20%84%10R%08%C4%86%84%01%81%C6%14%0D%00D%1E%7F%00%12%88%C7%82%7C%9C%06%95%28K%14%C0%0Bp%F0%D1%87%1F%3C%FF%D1%B2%1Cl%D6%2CQ%07c%E4%91%87%1E%7B%A0%C8%07%1Fv%FC%20%80%D0%11%3D%20E%1Du%D8q%C7%1Dx%18%8D%C7%13%19C%ED%D0%01F%C0%21%C7%1Ct%D0A%B5%1DuX%11%81%D7%11%91%F0%06%1Cp%C71%F6%1Ca%7C%C0%B6D%22%B0%D1%86%FE%1Bo%BC%5DF%BFwG%24B%1Ak%AC%C1F%1A8d%18%B8D%21%9C%81F%1AjH%B18E%20%94a%86%19g%401%F9D%1F%8CA%C6%E7Ml.%91%07%60%84%11%86%18K%88%1EQ%07%5E%B4%FEE%12%AAC%C4%C1%16%5Cp%D1%85%11%B1%3F%B4%01%16Yh%A1%05%11%B9%3B%B4A%15VXq%05%A0%C13%94%81%14SPQ%C5%0F%C93%84%01%14QH%21E%0F%D1%2F%84A%13N%3C%01%C5%0E%D9%2Bt%C1%12%E47%91C%F8%09Y%80%04%12I%2Ca%03%FA%08UP%84%11F%1CA%03%FC%07Q%20%C4%10C%10%114%FE%04%A1%C0%0F%80%10%84%20%C0%00%80%05%99%00%0Fz%E0%03%1F%F0%0A%81%03%91%80%0Et%B0%03%1E%3C%07%82%02%89%C0%0Dp%90%03%1Dh%07%83%00%80%00%0Dj%60%83%1B%A0%00%84%00x%80%0Cf0B%13%A0%F0%010%80A%0Cd%20%1A%10%3A%A0%05.p%01%0CF%80%C2%06%AC%80%05%FE%2ChA%08z%98%02%15%A8%60%05%C4%01%21%03N%80%02%14%A4%C0%03%28%5C%00%09L%60%82%13p%20%8A%23%20A%09J%B0%01%14%2A%40%04%22%18%C1%082%E0E%10%84%E0%8Cd%04a%02%3C%F0%816%5E%00%85%09%E8%40%07%3C%E0%81%D6%80%10%01%1B%E0%80%1E%2B%80B%04h%E0%8F%1B%98%00%0A%0F%80%01%0Cd%20%03%82%04%E1%01%2Cp%81%0B%60%40%02%83%AC%40%05%18%B96%10%1A%80%02%98%AC%80%B80h%80%09L%80%02%13%E0%11%08%0B%10%01%09x2T%A3%84%40%04V%89J%0C%16%E0%01%0F%80%00%04%18%80%C2%028%00%96%B8%C4%A5%2Ce%B9%CAR%9A%D2%93%99%94%A4%24-%40LF%16%B2%90%87%CC%00%207%90G%3Dr%40%8E%1C%D8%40%06.P%81%084%20%01%07%28%D4%C2pB%00%07x%D3%9B%B9%DC%A5%2A%7B%29%81r~2%98%C3ld%23%91y%C8e6S%8E%F0%EC%80%1E5p%01%0A%CC%12%01%06%B1%E8%D2%A8zB%00%064%E0%9F%0D%F8f.c%B9Kr%9A%F3%93%C0%1Cf1%D7%89%CC%3Fj%80%99%10%8D%E6%064%80%81%0AH%C0%01%0A%C8%26%A5%B6y%93%01%2C%80%01%FE%04%E87Gz%CB%82%1A%B4%9C%BF%3Cg%26%17zLej%C0%A5%7F%3C%A4%05%260%CB%04%E4%13I%1C%ED%E8GA%CA%D3%90%8A%14%9C%B0%14g%2FW%89RO%26T%A1%EA%3C%A6R%2F%60%01%0AD%C0%01%0B0%D2F%83%F2%A5%AAZ%F5%AAX%CD%AAV%B7%EA%A5%00%08%A0%ABXE%A1X%C7J%D6%B2%9A%F5%AChM%ABZ%D7%CA%D6%B6%BA%F5%ADp%8D%AB%5C%E7J%D7%BA%DA%95m%01%01%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%3F%05T%01%C5%E7%02R%99C2%B5%9A%9A%8A%0D%82%A7-M%20Z%C5%8A%D5%D4%A9%A1%AA%04%C0%8A%12C%9ET%AB%D2v%F5%FA%15%D2%0A%B2%24%17%AC%29%95J%95%DD%B4%5C%BB~eu%E7%01%DC%8F%03%B0%7CB%85%2A%95%E1%BB%A4R%AD%FD%DA%AA%94%D8%BF%1BuH2u%EA%14%E1%C2%AAJ%BDq%20%82%D1Z%B6S%25%A9%80%7Cq%C5%A1R%A8MQ%B6l%0AO%05%82LD%E5%05%CD%B7%01i%89%17%E4%88%1AE%8A%14%EAR%A6J%01%FAp%D0A%1DU%8B%BF%8A%AAr%DB%A1%021%9DB%89%DA%CD%DB%F7%A1%14%0B%5BH%9A%CD%F8%91%89%E6%09%09%FET%B1%F4%09%14%28%E9%D4%11%BDp8%C0%0B%A9%BC%8CU%B5%B9%0A%9E%60%8DE%9D%3Ay%F2T%FE%BC%A4%23cAd%81%1Fj%81%D6J%27D%D4%07%00%0A%7Fh%B2%09%27%9C%E8%C7%DF%25%5D%18PQ%0E%99%7C%B6%D6%2A%86pp%5B%05m%5C%92I%26%9A8%08%A1%26j%D8v%11%01_%98%82%D7%2A%AA%A4r%0A%28a%14%00%17%03%5EDR%89%25%97%88H%A2%26ul%C0%D1%07%88%D8%15%E3%29%A5%84%B2%09%21%2C%3C5%C0%11%89H2%C9%24%94X%C2%E3%25%81%B4%00R%11%9C%C8X%8A%28%9DT%B2%88%1FS%2CPT%009%00%F2%C8%23%90D%22%25%25%95%14%B2%C3H%0B%BCA%CA%28%9Fd%02%09%21u%90%C1%84%06%01%02%25%82%1C%8C0%D2%88%23l%BA%C9%C8%146%96%04%82%20%9AL%92%08%1Fk%60Q%84%0C%1C4%DA%93%04a%1C%92%88%22%8B%18%8Ah%23%60%98%89R%00E%10%12%88%1Ca4%91%03%0A%FE%1AD%60%E1N%070%11H%21%86%1C%82%C8%A7%8B%2C%92%86%05-%29%C0%C4%19V%08%F1%02%08%144%80%40%01%81%D6%24%C0%0Ew%04%22%C8%20%84%14r%88%AEt%7C%07%D3%04%3A%D8%60%82%06%10%28%60%00%01%034%2B%93%0Am%F8%E1%C7%1F%80H%5B%ED%1D2%D0%14%C0%04%1BL%C0%C0%01%E4%0A%60%EEK%16p%91%87%1E%7B%F0%D1%C7%BA%81%EC%81%04%017%09%A0%40%02%05%0C%A0%EF%BE%2C5%C0%C4%1Cu%DC%81%C7%BF%01%F3a%05%03%3B%090%80%C3%10%ABT%40%0Ek%C4%21%07%1Du%D8aq%1E%5EP%00T%C8%A7%AE%40F%1Bn%C0%01%87%1C%27%F7%19%82%82%1Eup%05%1Ai%A8%B1%06%CD6%A71%03%CC%3CO%F4%00%11c%90a%C6%19i%A4%B1%06%1Bi%041k%D2%19%1Dp%03%17_%84%21%06%19e%98%01t%12%A6b%8D%91%00%27T%A1%C5%16%5Dx%D1%F5%D7O%B8lvF%1C%2CQ%85%15Xd%A1%05%FE%17%5ExA%C5%08sg%14A%0FPH1%05%15V%5C%81%85%16V%A8%20%40%E0%17%21%F0%C2%12L4%F1D%14%86SA%C5%0C%9AB%3E%11%01%26%10%81D%12KP%EE%04%14Q%D8P%B6%E7%14M%10%C4%10E%18q%04%12J0%E1%C3%04%ACc%24%C1%0F%40%BC%1E%BB%0F%19%E4.8%0F%3E%F0%FE%C3%07%8F%0B%8FQ%04%3A%EC%D0%83%0FZ%2A%9F%11%048%E4%D0%7C%93%D2c%04A%0D6T%3FZ%F6%17%3D0%03%0D5%DC%80%1D%F8%169%10%83%0C%E3%9F%80~%FA.%C0%10%C3%0C%DA%BE%3FQ%03-%B8%F0%02%0C%24%D8OQ%03%2B%60A%FE%00%E7%3F%890%00%05%2A%08%20%08%0Ah%C0%13%A0%20%05%2AX%20%03%21%B2%00%12%98%C0%81%1E%98%20D%140%82%12%5C%D0C%1At%8E%08F%40%82%12%08%29%84%0DQ%40%08F8%02%0D%A0%B0%21%09%F8%00%08V%18%BC%17.%24%01%1E%F8%80%0C1%60%C3%85%20%80%03%FE%1D%F0%80%07%80%D5%C3%84%20%60%03%1B%00%22%11%8Bx%10%04d%40%03H%94%1B%13%0Dr%00%0C%3CQ%03%B8%9B%22%15%2F%60%C5%0CdQ%8B%041%80%05.%C0%C5%08%80%B1%20%06%A0%40%05%2C%60%013%9Eq%20%06%98%00%05%D4%08%817%C2Q%02%12%90%A3_%EC%08%80%02D%00%8F%13p%00%1F%FB%08%81%08%18REv%24%C0%03%20PH%8E%F1%91%00%0Ex%C0%22%1D%99%C8%068%20%92%AB%3B%23%01%1A%60I%07d%12%8C%04%60%00%03%2C%A9%80A%0E%60%01%0B%18e%02L%89%CAT%AE%92%8F%03P%80%02RI%1F%3B%0E%20%01%09%40e-%DFxKY.%60%97g%BC%25.%15p%80A%0A%00%01%B8L%401%F9xLd%26%E0jo%14%C0%01%0E%80%00%04%40%F3%8C%D2%9C%A65%8Di%00m%22%60%9A%DEL%E60%5B%99%CAQF2%92%8C%8C%40%21%F3%28%C7%0A%B8s%8Dc%24%A3%05%2A0%01%084%40%99%E3%C3%12%80%BE%8A%22%00%03t%13%9C%D4%AC%A63e9Kr%8A%B2%93%E8d%24%04%F0%98G5%BA3%9E%F2%A4g%04%3Ci%CD%7C%05%00i%1D%2B%40%01%FC%F9%CF%80%3A3%99%045%28%27-%29%C9E%1A%F2%8F%13H%E9%1A%DFY%01%0A%D4%D3%01%0Cx%A6E%2F%CAO%8D%DA%D4%9F%00%15%E8%40%7D%D9%CAQr%F2%92%095%24%20%E7%D8R%97J%00%020Uf%C3%1Ev%94%00%D8T%A3%1C%ED%A8GA%8A%CA%82%A2%D2%A7%24%5Dd%21%85%9A%D2%09H%40%9D0U%805AFS%05%5D%F4%AChM%ABZ%D7%CAV%8C%0E%F2%ADp%8D%AB%5C%E7J%D7%BA%DA%F5%AEx%CD%AB%5E%F7%CA%D7%BE%FA%F5%AF%80%0D%AC%60%07%AB%BC%80%00%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%3F%05D%D1t%C7%02R%99%3E%26%99%3Auj%14%1A%04O%5B%8E%08D%AA%94%A9%A9%A7Pq%92%12%20%2BJ%0BqB%89%1A%D5%D5%EBTT%A8%18%A50KR%01%99M%A0%D4%AEm%FB5%2C%AASt%1C%D0%FD8%20%0A%25O%9F%40%E5%5D%3B%AA%D3%28%AFT%E1%A6%02Ev%F0F%1A%876q%EA%84Xq%A8Ni%1A%800%04%D9o%2AU%8E%E6Z%B6Xb%0F%A6L%9A4s%FE%E4%29%0E%05%82H8%81E%95%EA4%AA%3A%0DVK%A4%60%86R%25K%AFcs%E2t%87%C3A%07qJ%99%3E%AD%0A%D4%14%E1%0E%11Xi%24i%92%F1K%C9%FB%FE%94X%B8%C2Q%E4%DE%AAT%ADj4%1E%3B%C2%01I%0C9z%14%A9%3B%25K%97%FC%A8p8%60K%28%D3%E9%AD%82%CA%1AX%B9G%D0%0Ax%2C%C2H%23%F3%D57%89%21%3E%94%05Q%05%7B%98%C2%1Bz%AB%AC%D2%09%11%06%02%00%02%1B%86%20%92%88%82%0CB%A2%88%14%05TtC%25%17%06%98a%22%1D%08%17%C1%16%81%0CR%C8%21%22%2A%C2%C8%22%5E%2C%80%11%01%5D%8C%82%5E%80%AC%9C%B2%86%01t%25%B0%84%1E~%00%22%08%217%22%82%C8%19%17p%E4%81%21C%AA%B7%0A%2B%9C%04%F1%D4%006%C0%A1%C7%1E%7D%FC%11%C8%93%85%C0%D1%9EGDl%82%E1%96%AC%B4%92%C8%06F%A9%60F%1Dw%E0%A1%07%1F~%98IG%0C%23-%00%C7%29%E9%A9%C7J%9C%A6%7C1%80P%19d%01%87%1Ct%E0%99%C7%1E%7C%DCQ%04%01%26%89%B0%88%8B%87%1Ez%C9%0C%3F5%80%C4%1Al%B8%F1%E8%1Ct%D8q%87%13%09%A4%14%80%14%FE%A0h%09%27%2B%AB%FC%11%C1N%05%D4%40%C6%19i%90j%AA%1CrTq%2BK%0E%D0qZ%86%19%AA%92%8A%27P%E0%24%C0%09Y%84A%86%19%BC%AE%D1%86%1B%5C%C4%08S%0B%91%14%9A%CA_%A5%88%12%C8%075m%D0%04%17%5E%80%21-%B5ix%B1fL%04x%21%24%2A%A6%90%12%0A%27%960%D2%04%A609%D0%83%15Xh%81%EE%17%D2~A%C3%A26Y%B0G%29%A3%80%C2I%25%8E%10%92%07%18t%B6%84%00%0CPHA%05%C0Yl%E1%85%17%3E%B4%AAS%0D%8DlRI%23%83%DC%A1%06%17L%A4%90bJ%03%88pD%13Od%BC%F1%15Z%0C%21XO%04%3C%91H%CAih%B1%04%0F-%7C%A0%00J%18%F4%60D%12K0%E1D%14%1A%1B%E1TP%14p%11%F4%12%3B%B4%10%C2%05%10%24%20%00I%10%C8%00%84%10D%1C%C1%B4%D3H%84%20%E1P%1C%08%A1%03%0B%20p%BD%C0%01%05%7C%0D%12%02%26%E8%C0%83%FE%0Fc%97%9D%04%12%29%F0k%94%00%16%7C%60%C1%03%0A%D0%3D%80%00koD%40%074%DC%80%83%DE%7C%0B%21%04%0B%07%D0E%00%03s%17%B0x%E3%19%05%40%01%0B1%CC%40%83%0D%93%F3%D0%83%0B%0C%087%40%01%040%DEQ%03%25%B0%D0%C2%0B1%C8p%3A%0E1%DCf%A0%00%B2k%84%00%07%27%A0%A0%82%ED%B8%CB%00%C3%05%A0w%F8%A3%05%22%8CPB%F1%C7%BB%E0%02%07%08%3B%AF%91%00%11x%00B%08%D2%9BP%7C%0A%1C%20%A9%3DG%08t%E0%C1%07%20DO%82%09%1F%88%7C%3E%FA%1C%A8%FFA%08%22x%D0%FA%FC%1E%1D%B0A%FD%1E%E8%C0%03%9A%C7%BF%8C%1C%40%03%1B%D8%40%07%A6V%C0%FEe%00%81%1C%A8%40%03%3Fr%80%0B%60%E0%81%13%98%A0G%0C%60%01%0Bf%20%83%1A%E4%88%01%2A%D0%C1%0F%86P%84%14%A8%80%05%25p%C2%8D%14%80%02%29%B4%C0%B0Z%88%11%03L%60%02%29%84%00%0D3R%00%09H%00%87%FE%0F%D8%21F%0A%00%01%1FN%60gB%AC%08%11%23%E0C%24%26q%22%04x%00%04%22%10%81%E0%3C%91%22%04p%80%14%23%B0%BF%2BJ%24%8BZ%84%40%17%BD%08%11%024%C0%01Z%1C%23%19%1D%B2%B93%3E%C0Gk%84%C8%00%16pF%07%1C-%8E%0F%99%23%03%1A%D0%00%F9%E1%91%21zd%00%03%FC%F8G%85%E8q%01%0B%20d%21%DF%83HD%2Ar%91%06%19%80%02%1AY%20H%26d%00%09%98%E4%02%2Ai%C9%83%60R%01%A0%CC%5C%27%DF%83%80%04dR%94%A3%8C%24%02J%99%00T%A6%92%20%03X%E5%2A%CD%F7J%82%08%40%96%08%A0e-%05%22%80%03%F82%97%BB%B4%A5%01~%A9%CB%5D%0A%C0%00%C3%3C%401kyLd%D2-%98%03%11%40%01%0A%80%CC%97AS%9A%D4%7C%264%01%80Md%0A.%98%01%20%00%01%A8%F9%CD%5D%86s%9C%B0%DB%26%00%CE9%CEr%D6%92%9D%E2T%27%3C%B3%07Nq%8A%93%9E%E6%BF%24%C0%00%EE%29%CF%01%EC%D3%9E%E8%9C%A63%7DI%D0%03%AC%D2%94%A0D%E4%1E%D1%A8%C5%07%A0%B1%01%9CS%40%02%10%407%7D2.%00%185K%00%FC%09Pq%C2n%9A%D94%E8AM%99IM%EE%B1%8E%0DEcD%27j%00%CF%5D%94%80G%D9%A8%3F%FF%09P%90%86%D4%A0%24E%E8%24%05%29H%3E%F2q%A5%14m%E9%E70%0AS%A3%C8%94%A3%1D%0D%285%939%D2%92%26T%A1%9C%5B%80Dg%09%BB%A1%165%A63EjRm%9AL%91%96T%A7%9A%9C%AA2%ABj%D5%ABj%90%A8hM%ABY%D5%C9%D6%B6%BA%F5%ADp%8D%AB%5C%E7J%D7%BA%DA%F5%AEx%CD%AB%5E%F7%CA%D7%BE%FA%F5%AF%80%5Dd%40%00%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%3F%05%20i%D4%86%02R%996%0Aa%CA%B4%E9%12%98%03O%5Bz%98S%C9%D2%A5L%9A6q%92%B4%24%40V%94%12%C8%3C%92D%A9%2B%A6%B0%9C%3Ay%22d%E2%2CI%04U%129%82%14i%12%25%AF%60%C5z%FA%E4%A9M%03%BB%1F%05%08%09%B4%88%91%A3G%91%D8Vzd%09%AE%DCO%A0.51%8BXc%8A9%87%10%25Z%D4ho%24G%5E%18p%E0c%193%A8P%87%EAv%B6%D8%C1L%A0A%85B7v%D4%88L%04%82A%24%C5%1D%FCZT%A87%0CfK%7C%20%85%CF%1F%40%82%08%15%12%BD%28%0D%86%83%0C%D2l%BA%5C%7CT%A6%27%CA%1D%FE%1A%10B%27%0F%9F%3E%7Fn%E7n%F3a%E1%89B%C4C%89%1AE%8A%14%A2%11%E1%13%0A%A8%B1%86%8E%1D%3Cz%F0%E1%07tm%88%E0%90%00U%60%82%99%7C%F4%952%0A%1A%08%E4W%D0%07%5E%BC%11%C7%1Cu%DC%91%C7%1E~%C8%21%03g%0FM%40%C7%27%0C6h%0A%26BH%08%80%05R%A4%B1F%1Bp%C8AG%1Dx%D01%04%01%15%CD%E0%08%83%A4%94R%8A%29%A7%14%C2%81r%0B%04A%86%19h%A8%C1%86%85r%C8%B1D%02%18%11%80%05%27%F3%F5%08%E4%29%A4%A4a%80%5D%06%CC%B0%05%18b%94q%86%8Bm%BC%21%C5o%1Bq%10H%83%3F%9E%82%0A%2A%99%FC%F0%94%00%23D%91%05%17%5E%84AF%19If1%E4G%40Xb%E5%29n%A6%92%CA%21%1A%18%B5%01%12TX%81%85%16%5D%7C%A1%A7%16%24%8C%A4%C0%1A%A3%B4Yh%2A%A4x1%80P%0F%E8%D0%04%14RTq%85%16xj%11%C3%A7%25%81pH%9B%FE%A8%18%AA%CA%2A%96%CC%F0%13%02%2B%1C%A1%04%13ND1%85%A3Z%DC%B0%25J%01%3C%D1%09%A1%B1%AA2%AB%2A%7F%A0%99%D3%00%1F%F80%84%11I%2C%C1%C4%13RP%B1Cr%2C9%20G%29o%A6%A2%EC%2A%AB%88B%05N%01XP%03%0F%3F%08A%84%AEK8%01%C4%041%B1%F0H%AC%E2%CE%CA%0A%2B%8F%C86%D3%03%2C%DC%90%C3%0E%3D%001m%12%40%5C7%D3%00%5D%8C%22%2B%B9%AC%B4%A2%0A%1BX%C1t%80%080%CCP%03%0E%3A%B0%1B%C4%0F%21%08p%93%05%7C%88%0Bq%2B%28%7B%92bK%04d%A0B%0B%2F%C4%40%83%0D%03%F3%60B%01%3B%E5p%89%BE%11%A3%EC%CA%22%89%A6%14%40%04%24%A0%A0%02%0B.%C0%20C%0D7%A4%10aO%04xa%CA%2A%FB%A2%8C%F2%29b%B0Z%12%03%1F%90P%C2%09%29%AC%D0%82%0B1%A8%E0%80P%1F%20Bu%CF%3E_%22%C3%5D%18%80%00%82%08%24%98%604%0B%29%D0%5BT%FE%11%9E%EC%CBv%2B%AB%E8q%D8G%04D%C0%81%07%1F%80%10%C2%08_%9Fp%81%C8G%25%A0F%2AT%93%BBJ%2A%A8l%E2DG%028%90%81%06%1Bt%80x%08tc%80%E3Y%230%A2%8A%A1%A7%982%0A%28%9D%F0%F1%27F%09P%60%01%06%19l%C0%81%E8%20%600%2Cb%01H%D1I%29%A4%84%D2I%26%948B%88%12%A7Sd%00%04%13T%60%C1%05%B8%87%9E%81%02%12%3A%C0F%27%9A%24%8FH%20x%BC%91E%D0%11%0D%C0%40%04%12L%40%81%F4%17d%80%01%B7%2A%02P%C2%1E%89%08%A2G%1Cgp%21%C5%11%274%CF%90%00%09p%C0%03%20%20%81%F4%D9%CE%02%0E%00Q%FC%00%20%00%1F%B8%21%0D_%A8B%12x0%83%14%7C%00~%09%09%C0%01%1A%D0%00%01B%20%02%E8%A3%80%03%B4%B6%40%82%2C%60%07K%00%82%0DV0%02%0E%5C%E0%01%0C1%1F%03%3A%E8%C1%088%C0%7F%254%88%03LP%02%0F%60%40%02%FE%23%8C%E1%02fHC%07%FC.%87%19d%C0%04%1E%C0%80%23%26d%00Cd%80%14%9D%88D%85%08%C0%00TD%C8%00%14%B0%80%21B%A9%8A%1F%D9%22%17%17%F0E0vD%8C%5D%2C%A3%1972%80%04%24%C0%8Bk%3Cc%02%B8%C8%80%A7%C5Q%23m%7C%E3%02%ECxG%8C%00p%8E%7B%EC%A3F%FE%C8E%3E%0A%B2%22%02%40%00%02%14%A0%80%8A%1D%D2%22%89D%80%1B%1D%F9H%8ADR%92%94%AC%A4D.%89%80%2Cj%F2%40%078%80%22%3D%F9%C9%FF%85R%94%A4%2C%A5%15%0D%10%CAN%AAr%93XD%E5%2B%23%22%80%02%B0%F2%008%9B%E5Cj%19%CB%5C%EA%B2%21W%BC%A5%2F%7F%B9%90%00%D8%12%8B%C3%24f%06%8Fi%00%1C%2A%F3%20%C6%2C%80-%9D%F9%CC%82%04%80%00%D2%2C%005%AB9%90kfs%9B%DC%04%C05%B1%A9%CDp%22d%9C%D2%04%277%C7%89MuV%93%9D%E54%A7A%E0%E9%CEg%B2%93%00%24%C1%94%A7%40%EE%99O%7D%F2S%9F%D6%1C%00%01%06%DAOy%06%60%00%02%C5%27%40%09r%D0%84%16%D4%9C%0D%15%E8C%C3%19Q%85.t%9F%08%CD%E8E1%9AQ%C8%5D4%A2%03%F0%E8B%03%20%80%8EnT%9C%25E%A8H%01J%D2%8C%BAt%A0%03%CD%A64%B1h%80c%CA%14%9F%2A%15%40%00v%AA%C0%05%924%A5%2F%85%299e%AAM%98%22%14%9F%02H%2AO%C5%C9%D4%1C%FE4%A9.M%A8P%C9i%D4%A4ZU%A7%3B%ED%E3S%A3%9AQ%82J%15%A9%21U%AAY%B2%AA%D5%ABv%94%ABQ%D5%A9Z%B1z%D2%B6%BA%F5%ADp%8D%AB%5C%E7J%D7%BA%DA%F5%AEx%CD%AB%5E%F7%CA%D7%BE%FA%F5%AF%80%0D%AC%60%B9%19%10%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%3F%03%DC%B8%A3%05%02R%99%28%DA%FC%11D%28%10%14%03O%5BZ%E0%B2%87%8F%9F%40%82%0A%1D%F2%E3%23%40V%94%0D%98%D0%B9%93%C7%2BXB%86%10%29%92%F3%E1%2CI%03%3F%DA%C8%A9%C3v%8F%1F%40T%E3%2Ab%C4%E8%CB%02%BB%1F%05%BC%20%D3%06%8E%9C%B5y%F6%F4%C9%F3g%90%D8D%8B%1A%3DB%24%C4%2Cb%8D%1C%AE%A0Q%D3%E6%CDc%3Bx%EC0I%60%01%8DXD%99%1DA%8A%A4%27%C4%E7%8B%13%96%88%21s%26%CD%1A7%8E%E7%40i%40%90%86%1F%D8%8C%1C%3D%8A4i%12%19%05%B7%25%2A%C0%B1%C5K%182f%7C%97%9E%22%E1%A0%82%2C%88%18%FEi%8E%24%89R%A5FG%A2%3B%24%B0b%0A%96%EAa%C6%98%19%5D%E5%C2B%10u%1A%C9%964%A9%D2%A5L~%80%A0%5EB%01%84%B0%C4%14U%5C%A1E%17%60%88Q%C6%14%198%24%40%12%88%2C7%09%25%96%60%A2%09%26%60%1C0%60A%13%F8%C0%C4%13R%24%A8%05%17%5EXA%82D%10%A0%C1%1C%86%FFm%C2%C9%23%3C%7C%08%40%032%1C%A1%C4%12NDA%85%15YX%E1%C2%00%15%B1%10%88y%FFi%22%A3%27%7Dh%10%DD%01%26%001D%11I%2C%D1%04%14RPA%03V%17%11%F0%04%24%19%2A%C9I%27%9Fp2%06%97Y%0D%D0%01%0E%3C%FC%20D%11HX%09%05%0E%0Cp%94%81%1D%97%88%D9%89%27%A0%84%22%89%0EO%05%40%C1%0B6%E4%C0%83%0FA%10%A1%23%0F%13%80%A4%03%23%9Bl%B2%E7%27%A0%882J%20%11%16%F5%00%0A0%CC%60%03%0E%3B%F8%20%E5%0E%F6%89%94%00%19%99p%E2%09%A5%A1X%EA%89%16%FED%06%85%C0%07%2B%B8%D0%E9%A7%3A%F4%B0%C3%07%02%98%E4%C1%1F%7B%F6i%29%29%A5D%12%C3O%04%5CpB%0A%B5%C2%20C%0D7%E0%20%02%01%29%05%A0D%25%AC%8EBl%29%A5%F0%11%C1N%01%40%10%02%09%26%A0%B0B%0B%2F%C40%03%09%1E%B2%D4%C0%1A%9F%B4%3A%0A%B7%A6%9C%E2%89%1491%C0A%08%22%90%8B%82%0A%2C%B8%60B%9D0%A5%A0%C8%B0%A5%D4%7B%0A%2A%8C%94P%13%02%17p%F0%01%BF%23%94p%82%0A%258%40%D3%00YtB%AC%C2%A8%A4b%8A%1Ah%BAD%40%04%19l%D0%81%07%20%88P1%09%13xVS%05x%24%7C%CA%C2%A9%A8%A2%0A%27A%B8%24%40%03%17%5C%80%81%06%1C%B0%CC%AF%05%B1%E6d%03%25%F5%86%9C%F3%2A%AC%24%E2d%B5%08H%40A%05Bk%A0%F2%07%16%14%E0%13%01%5C%88%E2%B4%2A%AB%40%5DJ%18I%DF%E5%40%04V%5B%20t%06%1AX%D0.P%1E%1426%D4%AC%B4r%89%FE%0C%24%0D%B0%C0%03%10%B0%7D%B5%D0%16%40W%14%11%9C%E8%8Cw%2B%8C%F3A%5Cb%070%D0%80%03%10%40%20%C1%04%15T%C0%80%CCE%25%90%06%2Ae%B3%92w%2B%AE%90bEG%01%18%B0%C0%02%92%3B%008%DB%0D%F4z%D6%08%8C%2CN%BA%2B%AFD%E2pF%04%28%B0%BA%E4%93%BB%DE%40%DAg%050%85%28%A3%BB%82%FB%2B%AC%B81%F7D%03%1C%A0%80%EF%AC%B7%DE%80%D7%03%3EPG%DE%CA%BF%F2%0A%2C%B0%80%22%C4D%02%18%80%00%02%09L%EF%3B%03%0C%94%FC%E1%0B%95%90%EE%FD%F7%B0%C4%82H%05%0F%05%40%C0%01%E7%A3%9F%BE%EF%07%E0%9C%8D%00%40%800%A0by%E0%8BE%2CTA%06%E2%1Dd%00%050%80%01%F8w%BE%F4%05p%80%08%C9%40%21%BC%07%BE%FA%C5%02%14%CF%3BH%00%0A%40%C2%09R%F0%00%B2%C3%60Bz%D0%09%FA%D5%0F%08%0C%19a%09%0Fp%00%038P%85%079%40%1BX%01%3E%404D%86%FE%12%B4%21%0E%21%22%82F%84%E2q%0B%91%21%09%A95%C4%88P%C0%21J%2C%00%13%9B%E8%11%FD%95p%8AT%E4%88%FE%08%10A%ECeQ%8B%04%E0%A2%01%B0%F8%C5%8Cl1%82d%2C%E3E%CE%28E5n%84%8Dit%23E%B6%C8%C58%CAQ%22tl%E3%1D%D7%18%C6%3A%EE%91%8Fa%D4%E3%1F%E7%D8GA%0E%12%8F%85%B4%E3%21c%D8G%02%DCp%91%8Cl%24%24%11%D9%C7GN%92%40%8D%B4%E4%25E%98%C9M%E6o%00%95%F4%24%14A%19FM%8Ar%20%01%20%A5%23O%19%C3%01%90%D2%94%ACL%E5%2BY%99DW%82%12%96%A7%94%A5-i%A9%10%5D%BA%92%97%04%B2%E5%2F%81%29Ba%E2R%94%BE%3C%A6%27%7D%99Bb%12D%96%02%18%403%9D%29%90%00%08%E0%9A%D2%A4fA%ACyM%01%08%90%9A%DC%BC%E67%9D%19Noj%F3%99%DD4%E79%AB%E9%CD%00%B8s%9D%A8t%E78%C1YMx%DA%F3%9E%F8%27%CC%A7%3E%F7%C9%CF~%FA%F3%9F%00%0D%A8%40%07J%D0%82%1A%F4%A0%08M%A8B%17%CA%D0%86%3A%F4%A1%10%8D%A8D5%12%10%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%3F%03%8C%A8%D2C%01R%99%19%96p%F1%12%06%CC%0D%02O%5B%3A%E0a%25%CB%16%AAd%CC%80Y%915%25%02%18Q%A6t%FD%1A%86%CC%994k%B0X%28K%92%80%89%24N%D2%AE%05%FBv%8D%9B7I%10%D0%FD%18%60%C3%8F%24K%F2%AA%CD%C2%25%0B%98%B0p%DB%C0%91%D3FF%80%C1%1B%21%CC%10R%04Ib%BDVf%18x%D0%C4%0C%5C7p%E6%D4%B9C%26%03%E6%8B%0BV%F0%F8%C1%D9s%5E%295%12%10%2C%11f%8Dd9%AB%F3%EC%91%22%F8u%C4%02%1Fn%E8%98-%C4%08b%267%18%1C%3C%20%E4wp%3E~%EE%E00%EEP%00%86%174%94%FE%CF%1ER%24%C9%0D%07%0B1x%01~%27%0Fv%40%82%D6h%E0%9E0%80%84%14%2Fb%84%D7%D1%83v%0D%08%0E%05p%C3%1Bw%E8%81%5D%20%82%14B%88%14%06%D0W%90%02%22%AC%D0%C2%0B2%D4%A0%5C%0F6%CC%15%11%03T%B8%F7G%20%83%14rH%22~%C8%E0%20%00%07l%60%02%0A%2B%B8%00C%858%D8%C0%81%00%15%89%D0%C6%87%21%8E%B8H%23oh%88%19%01%15%8CP%C2%09%29HH%E1%0C%1F%60u%D1%00%40%F0%91%23%22%3B%3A%C2%C8%15%05%D0%25%00%04%1F%880%02%09%26%14%D9%02%0C%21%1C%C0%11%05f%88%88%88%22%8C8%02%89%24%84%CC%90%95%02%1Ax%00B%08B%9E%80%82%0A%23%2C%00%D2%0B%7B%40%D9%88%9A%92LR%89%1D%3E%0E%85%40%05%1Al%D0%C1%07tr%29B%03%23%21%60E%22%7F%AEII%25%97L%22%05%8DA%11%10%C1%05%19%24%BA%28%08%23%84%20%C1e%25e%20%07%A0%97%5E%92%89%26%FE%87%B0%F0%93%00%0BP%60%01%A8%1Ap%D0%81%07%1FL%C0%E9I%01%00%81H%A0%98%BE%BA%C9%26t%3C%B0S%00%08%400%81%AD%B8%EAZ%81%92%2B-%10%86%24%95Xb%2C%27%9ET%C2DN%A3E%20%C1%B3%15%E0j%81%980%91%F0%87%AB%9Al%D2%89%27%9F%80R%88%085%11%B0%C0%03%10D%10%C1%B3%B7VP%9CL%03H1I%BB%EF%C6%1B%CA%27d4%08%93%00%094%E0%80%03%10%E4%FB%2C%05%0B%A0Z%D3%04pl%C2m%BC%A2%8CBJ%25%3D%B8%14%C0%01%0B0%C0%80%03%F8%8A%3B%01%03%BF%E2%24%03%23%F0%82%D21%29%A5%94B%08%06%2B%11%90%C0%02%25%9F%9Cr%03%03%F8D%80%15%9A%80%12%8A%C75%9B%12%8A%17A%9B4%00%02%09%28%C0%B3%C9%0D%3C%C0%00%B5%3Fm%F0G%28%A2%D0%5C%8A%29%A7%A02%09%0C%24%09%60%40%02h%2B%205%03%0D0%A00Q%3FT%E25%D8%A8%A4%82J%1E%90%12F%C0%FE%01%07%40%1D5%CF%0B%1C%60qQ%08%90%21%CA%D7a%A7%A2%8A%2A%A0P%E1%D1%00%06%18%C07%02P%AB-8%5D%21%1CB%B7%E2%AA%AC%C2%8A%23%24h%24%40%01%05D.9%E5%09%1C%D0rY%01%40%E1I%DD%8B%7B%CEJ%2Al%A0KQ%00%03%10%40%BA%E4%7DS%DE4w%0F%C8%81J%E7%B2%B7%D2%8A%27%40L%84%3B%01%CC%93%5E%3A%DF%BF%9F%D8%82%24%AB%14%DF%8A%2B%AE%1CR%01D%020%EF%BD%F3%06%60%7D%A2%40%04%7CQ%0A%2B%AC%18%EF%CA%2B%AF%A42F%F4%08%090%40%EE%DF%93N%C0%E0%E3%13%84%C1%20%E9%AB%FF%0A%2C%9F%B0%1DBp7%3F%EF%E9%EE~%F9%5B%08%0F6%E1%BFW%FC%80%21%04%A4%1F%01%06%B0%BA%04%22%E4%00kX%C5%FA%00%D1%10%02z%AF%82%16TH%08%1A%11%8A%BC-%24%82%13%0C%A1D%B6%D7%C1%F9%E5%0E~%2A%DC%08%0Aa%18%C3%8C%CC%B0%86%1E%B9%21%0E9%A2%C3%1Dj%A4%87%A7%3E%C4%08%10%83h%91%21%12%F1v.%9C%DF%11%85%98D%10.%11%22%11T%E2%13%2B%12E%1AN1%40I%B4%E2%15%21%98%C5-%2A%AF%8B%5E%8CH%00%04%20%3F%0A%86Q%8Cd%9C%9F%13%CF8%402%CAo%8Dl4%C8%18%DD%88%BF8%D6%C7%8D%02%A8%A3%1D%DBHF%3D%EEQ%8E%01%18%A3%1F%FFH%90%CB%04r%90%84%2CH%20%13%C9%C8F%3A%F2%91%90%8C%A4%24%27I%C9JZ%F2%92%98%CC%A4%267%C9%C9Nz%F2%93%A0%0C%A5%28GI%CAR%9A%F2%94%A8L%A5%2AW%C9%CAV%BA%F2%95%B0%8C%A5%2CgI%CBZ%DA%B2%86%01%01%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%40%27%BC%10a%00%A9%CC%06%29f%D8%C8%81%E3%83%00%A7-%0F%80x%11%83%C6%0D%1D%3C%7C%E8%C8%805%25%81%0C%2A%5C%C0%90Q%E3%2B%8F%1FB%8A%DCpP%96%A4%80%09%25R%B0P%3B%A3%06%0E%1D%3D%80%0C1%A2dI%8B%02u%3F%06p%10%C2%04%0A%15-%B8J%AD%01%18%08%91%23J%98%3CY%02%221G%04%1BF%940%91bE%E4%182%3A%10H%E0%22%C8%E5%25M%A0H%A9B%24%82%E7%8B%06.%84%08%21%FA%F1%0A%17%2F%3C%20%1Eh%01H%92%25N%A2L%B1%82E%0B%8E%A6%B7%23%0E%88%E0%01D%08%11%24L%9C%80%FC%E1%C0A%02%2A%90%FEK%A1%C2%7C%8B%97%2C%27%A2%3B%0C%D0%20%03%87%EA%22D%9FH%01%02%C1%C2%07%3E%C6%5B%C9%C2%E5K%182QH%A0%9EB%0AX%90%C1%06%EF%81%80%5D%09%1E%24%B0%1E%09Q4%D7%C5%17b%94q%C6%19%3B%100%60A%05HpA%06%1A%20%08%DF%07%0DH%84%80%0E%E6%811%86%19h%A8%C1%06%19%25l%08%00%01%0EP%60%C1%87%1Ap%D0%C1%07%1E%40%10%40E%18H%F1%9F%19i%AC%D1%06%1Cr%60a%DBm%02%2C%20%C1%04%15X%80%C1%81%1Cp%20%C1U%17%09%D0%02%18D%B2%E1%06%92u%D0Q%84%86e%05%90%C0%03%11L%40A%05%17%60%10%E2%04dj%E4%80%13F%BE%11%C7%1Cu%E0%A1%C7%1B%28%60e%80%03%10D%F0%A4%8D%1FR%E0%DDG%23%8C%81%24%1Dv%E4%B1G%1F%7F%90%21%60Q%04%2C%E0%C0%03%81%0EZ%C1%04%F6%89d%C0%10p0%9A%07%1F~%00%22%C8%1FD%60%09%94%00%094%D0%C0%A5%FE%99R%40%81%02%3F%964A%17w%E8Aj%20%83%14rH%1D%24%FC%14%80%01%0B0%F0%EA%03%98%A6%C9%40%AD%27%05%20%C3%1C%90%F2%EAk%22%8A%98Q%E2N%05%28%B0%40%B1%C7%06%CA%C0%00-%25%10%85%1F%82%102%ED%22%8D%18%12DN%04%20%A0-%B7%C72%10%A7K%1D%B4A%88%21%88%24%82%EE%23%91%E0%E1AM%02%1C%80%40%02%0Ahk%AC%03%0D%0C%27%93%00D%04%82%88%22%8C8%C2%EF%24%91h%A1%B0K%01%14%80%C0%C6%04%1B%CC%C0%A16A%20%06%BA%8E%40%22%C9%24%95X%A2%88%0D%18%13%20%F0%C0%04o%BB%C0%01%CC%E2%A4B%1F%FCJBI%25%97d%A2%89%1E%16%AC%24%80%01%06%1C%20p%021%23%A0%EAN%030%C1%C8%24%94X%D2%F3%26%9CXb%C5%D2%23eL%B4%D1G%2B%80%00%B8Aa%40G%CA%98hBu%27%9F%2C%C2%02I%01%0CP%C0%DBE%BF%8C%C0%BCB%E1%A0%88%CFT%7B%F2%09%FE%28%A0%C8%C1%00Hm%13%40%C0%DB%05p%3D%B7S%07tqI%DE%7B%87%22J%26Ox%24%80%E0%82%C3m4%015%23%E5%C1%1F%9D%E8%0D%8A%E3%A3%94%82%88%08%1A%05%40y%E5p%17%909V%01%28Q%C9%E7%A2%8CBJ%29%A6%8C%82%06t%14%B5%3D%C0%E9%84%13%80%B5g%0E%B0%01J%EC%B3%9Br%0A%2A%98%F40Q%00%02%0C%E0%3C%EF%05%FC%AE%9E%0A%8C%CCN%FB%F1%A8%A4%22%08%05%10%E9%EE%FC%F3%82%83-%23A%03h%F1%C9%F5%D9%AB%A2J%29%60%88%9F%10%F3%DF%C7O%C0%00%AB%8F%2F%D0%05~%18%9F%7D%2A%AA%AC%B2%09%EE%08a%5E%F3%E2%E7%BC%FA%D9%8F%209%B0D%FAV%B1%0A%E5-D%80%03%2C%E0%01%1Br%804%98%A2%7F%7Ch%88%00%BFg%C0%09%22%04%04%89%E8%C4%B5%1E%28%80%12%96%D0%83%12%E1%9E%06M%28%80%0E%A2%F0%22%10l%E1%0B%15%C3B%17%CE0w5%BC%A1G%02%C0C%19%EA%90%23i%3Cd%9E%0D%7F%28%91%20%0E%91%88E%3C%22%12%23%A2%C4%25%3A%F1%89P%8C%A2%14%A7H%C5%2AZ%F1%8AX%CC%A2%16%B7%C8%C5.z%F1%8B%60%0C%A3%18%C7H%C62%9A%F1%8ChL%A3%1A%D7%C8%C66%BA%F1%8Dp%8C%A3%1C%E7H%C7%3A%DA%F1%8Ex%CC%A3%1E%F7%C8%C7%3E%FA%F1%8F%80%0C%A4%20%07I%C8B%1A%F2%90%88L%E4%15%03%02%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3%40%3Bdy%02%01%A9%CC%05%2F%9A%8C%B9CH%CB%01%A7-%07H0%81C%EA%1DD%95%28E%09%80%15e%00%03%102p%F5%0A%16%D4%A9G%2C%CA%96%14%60%40A%DA%B5S%DB%9Ej%E5jOS%B9%1F%03%0C%20P%F7nW%2Fu%F4%B6%82%25K%95%16%B2%807%06%100%B8%B0Z%1B%2A%0EPhS%C9%EDbY%B4jaj%11%19c%80%D3%94%09%DB%CDp%A1%00A%1F%97%F62%0E%5D%8BV%1F%07%A5%2B%9E%9E%5CY%C1%82%01%07%1B%C8Y5%BBV-%5B%B6%1C%E7%9E%B8%3B5%01%01%0B%5D%5C%02m%1C9%F2K%29%96Cl.%002%C3%01dZ%FEU%B7nk%16%9D%04%DA%1B%EE%F6%FE%10%C3%A1%E3%E4%91%9BZ%92~%21%FB%89%3FD%C5%B7%1E%09D%FD%90%05%9C%01%CB~%B6%C82%C7U%FF%7D%24%82%24%04%DAR%8A%11%09%82%C4%04%2A%0DF%D2A%84%1E1%A0%07-%04%BEb%06p%18rd%82%25%0D%82%82C%88%1C%05%A0%05%2B%04%D6%82%C8%04%28n%04%81%1F%F0%C5%B7%8A%161n%24C%27%0Db%97cF%04%08H%A0%2Cr%20%F8%A3E%19%20%D2%A0%29G%1C%89%11%10%A3T%C8%81%93%16%05%18K%87g%80H%E5D%0B6%F8%89%0D%5BV4a%8B%82%E0%16%A6D%0A%CC1%0B%817%9E9%D1%09%24%12h%C9%09nF%A4%22%8B%FB%19hd%9D%0DE%40%23%81%A5%14%C1%27D3%F0H%20%23%16%0C%EAP%90%03%EE%F7J%96%8A6%B4%01%23%04%92%B2g%A4%0A%05%11%25yC%60%FA%10%02r%C8%82%5C%21%9EFD%02%25%A8%98Y%2AD%89%AE%EA%EA%ABN%B0%C6%2A%EB%AC%B4%D6j%EB%AD%B8%E6%AA%EB%AE%BC%F6%EA%EB%AF%C0%06%2B%EC%B0%C4%16k%EC%B1%C8%26%AB%EC%B2%CC6%EB%EC%B3%D0F%2B%ED%B4%D4Vk%ED%B5%D8f%AB%ED%B6%DCv%EB%ED%B7%E0%86%2B%EE%B8%E4%96k%EE%B9%E8%A6%AB%EE%BA%D9%06%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9D%CA2%00%D5%95%01%AC%5E%3D%99%B5%EB%D6%92%5D%05%0C%200%E0k%C8%B0b%09%18%40%40%C0%EC%C7%ACi%0B%20%60%20AB%01%B7%1D%03%0C%18P%E0%80%82%07%17B%B0%00%21%00%2F%C7%01%06%124%98%C0%01%C5%0D%25RB%18%DE%28%40%01%04%0C%22b%08%A9r%06%0F%9A%0A%933%06X%D0A%85%0E%26_%E2%04r4%E9J%D9%D0%17%0B%98%28rE%8D%1ED%94%3C%95%AAD%036F%0F%5B%E8%08z%A4I%14%AAV%AF%08M%F0m%F1%00%94D%96%3E%99Z%E5%2A%D6%ACTZ%98%5B%1CQhT%AAV%B0d%FE%CD%A2U%EBR%0A%ED%14%07t%29%F5J%3C%F9Z%B6d%C99%80~%E2%85A%B2%DE%C3%B7e%CB%D4%91%FA%13%F9%20J-%FB%F1%C7_%24%1C%00%18Q%01f%C4b%E0%83%AF%9C%F1%9A%82%0E%89%20%C9%83%0F~b%03%85%101%81%0A%86%FC%D5%22%88%03%1C%3A%A4%C0%1C%B3%80h%CB%2A%D9%95%D8%D0%09%96%A8h%8B%25%27%B8%C8P%00Z%B0%A2%A2%2Cs%D0g%A3B%11%F8Q%E0%83%A5%14%F1%E3B3t%22%23%23%16%1C%99%10%01g%C0%A2b%84%13%3AY%D0%06%8C%A8H%8A%8FV%1E%14%C4%28%18%0E%D1%A5B%08%C8%21%0B%7F%85%8C%C9%10%09%94%A0B%A2%9A%0C5%09%E7%9Ct%D6i%E7%9Dx%E6%A9%E7%9E%7C%F6%E9%E7%9F%80%06%2A%E8%A0%84%16j%E8%A1%88%26%AA%E8%A2%8C6%EA%E8%A3%90F%2A%E9%A4%94Vj%E9%A5%98f%AA%E9%A6%9Cv%EA%E9%A7%A0%86%2A%EA%A8%A4%96j%EA%A9%A8%A6%AA%EA%AA%AC%B6%EA%EA%AB%03%0E%05%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%FE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%ACY%AD%01%02%9C%B5%98%B6%AD%DA%B5%0F%DD%A6%15%40%17n%DC%B9%02%06%0C%20P%60%80%DD%86%01%F2%EA%E5%7B%00A%02%BF%7F%15%06%D8%5B%C0%00%02%05%0D%20Pp%20%20%B1%C2%01%07%120x0%01C%07%12%28%28XN%28%40%81%04%0B%1CD%A8%90%C1%E3%88%8F%07%A3%11%2A%E8p%02F%0E%22O%B2%90YC%84%40l%83%03%3E%00Yb%25%CC%9A%3A~%0C%FD%91%F1%DB%60%84%26i%E4%EC%21%C4H%12%26O%7B%264%27%28%80G%9FD%91%2C%84q%0AU%0A%15%A90%88%B7%03%90%00g%13%28R%A7T%B1r%F5%E9%80z%826%28%A5%9A%0F%2BV%90%FB%05%1D%C0%06%2B%B1%C82%08%80%07%8D%10I%29%0E%20%88%90%05%0EF%28%E1%84%14Vh%E1%85%18f%A8%E1%86%1Cv%E8%E1%87%20%86%28%E2%88%24%96h%E2%89%28%A6%A8%E2%8A%2C%B6%E8%E2%8B0%C6%28%E3%8C4%D6h%E3%8D8%E6%A8%E3%8E%3C%F6%E8%E3%8F%40%06%29%E4%90D%16i%E4%91H%26%A9%E4%92%40%05%04%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%CE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%A0C%8B%1EM%BA%B4%E9%D3%A8S%AB%5E%CD%BA%B5%EB%D7%B0c%CB%9EM%DBk%40%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%CE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%A0C%8B%1EM%BA%B4%E9%D3%A8S%AB%5E%CD%BA%B5%EB%D7%B0c%CB%9EM%DBk%40%00%21%F9%04%01%04%00%FF%00%2C%00%00%00%00%80%00%80%00%00%08%CE%00%01%08%1CH%B0%A0%C1%83%08%13%2A%5C%C8%B0%A1%C3%87%10%23J%9CH%B1%A2%C5%8B%183j%DC%C8%B1%A3%C7%8F%20C%8A%1CI%B2%A4%C9%93%28S%AA%5C%C9%B2%A5%CB%970c%CA%9CI%B3%A6%CD%9B8s%EA%DC%C9%B3%A7%CF%9F%40%83%0A%1DJ%B4%A8%D1%A3H%93%2A%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%8A%1DK%B6%AC%D9%B3h%D3%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3%EA%DD%CB%B7%AF%DF%BF%80%03%0B%1EL%B8%B0%E1%C3%88%13%2B%5E%CC%B8%B1%E3%C7%90%23K%9EL%B9%B2%E5%CB%983k%DE%CC%B9%B3%E7%CF%A0C%8B%1EM%BA%B4%E9%D3%A8S%AB%5E%CD%BA%B5%EB%D7%B0c%CB%9EM%DBk%40%00%3B";
16969
17149
 
16970
17150
  // src/components/HbLoadingSpinner.tsx
16971
- import { jsx as jsx151, jsxs as jsxs71 } from "@emotion/react/jsx-runtime";
17151
+ import { jsx as jsx155, jsxs as jsxs73 } from "@emotion/react/jsx-runtime";
16972
17152
  function HbLoadingSpinner({ noQuips, extraQuips = [], extraQuipsOnly, iconOnly }) {
16973
17153
  const ctx = useContext17(HbLoadingSpinnerContext);
16974
17154
  const tid = useTestIds({}, "hbSpinner");
16975
- const quip = useMemo38(() => {
17155
+ const quip = useMemo39(() => {
16976
17156
  const allQuips = extraQuipsOnly && extraQuips.length !== 0 ? extraQuips : [...ctx.quips, ...extraQuips];
16977
17157
  const forceQuips = extraQuips.length !== 0 || noQuips === false;
16978
17158
  if (ctx.noQuips && !forceQuips || noQuips || allQuips.length === 0) return "Loading...";
16979
17159
  return allQuips[Math.floor(Math.random() * allQuips.length)];
16980
17160
  }, [ctx.noQuips, ctx.quips, extraQuips, extraQuipsOnly, noQuips]);
16981
- return /* @__PURE__ */ jsxs71("div", { css: Css.df.fdc.jcc.aic.$, ...tid, children: [
16982
- /* @__PURE__ */ jsx151(
17161
+ return /* @__PURE__ */ jsxs73("div", { css: Css.df.fdc.jcc.aic.$, ...tid, children: [
17162
+ /* @__PURE__ */ jsx155(
16983
17163
  "img",
16984
17164
  {
16985
17165
  src: HbLoadingSpinner_base64_default,
@@ -16992,7 +17172,7 @@ function HbLoadingSpinner({ noQuips, extraQuips = [], extraQuipsOnly, iconOnly }
16992
17172
  ...tid.gif
16993
17173
  }
16994
17174
  ),
16995
- !iconOnly && /* @__PURE__ */ jsx151(
17175
+ !iconOnly && /* @__PURE__ */ jsx155(
16996
17176
  "div",
16997
17177
  {
16998
17178
  "data-chromatic": "ignore",
@@ -17012,63 +17192,28 @@ var HB_QUIPS_MISSION = [
17012
17192
  "In Service of Our Customers"
17013
17193
  ].map(dotDotDot);
17014
17194
  var HB_QUIPS_FLAVOR = ["HOM is HOW", "Scaling Massively", "#LoveIt"].map(dotDotDot);
17015
- var HbLoadingSpinnerContext = React19.createContext({
17195
+ var HbLoadingSpinnerContext = React20.createContext({
17016
17196
  quips: ["Loading..."],
17017
17197
  noQuips: false
17018
17198
  });
17019
17199
  function HbSpinnerProvider({ quips = [], children }) {
17020
- const state = useMemo38(() => ({ quips, noQuips: quips.length === 0 }), [quips]);
17021
- return /* @__PURE__ */ jsx151(HbLoadingSpinnerContext.Provider, { value: state, children });
17022
- }
17023
-
17024
- // src/components/LoadingSkeleton.tsx
17025
- import { jsx as jsx152 } from "@emotion/react/jsx-runtime";
17026
- function LoadingSkeleton({
17027
- rows = 1,
17028
- columns = 1,
17029
- size = "md",
17030
- randomizeWidths = false,
17031
- contrast = false
17032
- }) {
17033
- const cellArray = [...Array(columns)];
17034
- const rowArray = [...Array(rows)];
17035
- const rowHeight = sizeToPixels2[size];
17036
- const rowCells = (rowNumber) => {
17037
- const flexGrowForCell = randomizeWidths ? getRandomizedFlexBasisByRowIndex(rowNumber) : 1;
17038
- return cellArray.map((_, i) => /* @__PURE__ */ jsx152(
17039
- "div",
17040
- {
17041
- css: Css.br4.add("animation", "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite").add("flexGrow", flexGrowForCell).bgGray300.if(contrast).bgGray700.$
17042
- },
17043
- `row-${rowNumber}-cell-${i}`
17044
- ));
17045
- };
17046
- return /* @__PURE__ */ jsx152("div", { "aria-label": "Loading", children: rowArray.map((_, i) => /* @__PURE__ */ jsx152("div", { css: Css.df.gap1.mb1.hPx(rowHeight).$, children: rowCells(i) }, `row-${i}`)) });
17047
- }
17048
- function getRandomizedFlexBasisByRowIndex(rowIndex) {
17049
- const randomizedFlexBasisValues = [0.65, 0.8, 0.75, 0.9, 0.8, 0.85, 0.8, 0.95];
17050
- const valueIndex = rowIndex % randomizedFlexBasisValues.length;
17051
- return randomizedFlexBasisValues[valueIndex];
17200
+ const state = useMemo39(() => ({ quips, noQuips: quips.length === 0 }), [quips]);
17201
+ return /* @__PURE__ */ jsx155(HbLoadingSpinnerContext.Provider, { value: state, children });
17052
17202
  }
17053
- var sizeToPixels2 = {
17054
- sm: 16,
17055
- md: 24,
17056
- lg: 32
17057
- };
17058
17203
 
17059
17204
  // src/components/MaxLines.tsx
17060
17205
  import { useLayoutEffect as useLayoutEffect2, useResizeObserver as useResizeObserver5 } from "@react-aria/utils";
17061
- import { useCallback as useCallback21, useEffect as useEffect26, useRef as useRef49, useState as useState38 } from "react";
17062
- import { jsx as jsx153, jsxs as jsxs72 } from "@emotion/react/jsx-runtime";
17206
+ import { useCallback as useCallback21, useEffect as useEffect27, useRef as useRef49, useState as useState39 } from "react";
17207
+ import { jsx as jsx156, jsxs as jsxs74 } from "@emotion/react/jsx-runtime";
17063
17208
  function MaxLines({ maxLines, children }) {
17064
17209
  const elRef = useRef49(null);
17065
- const [hasMore, setHasMore] = useState38(false);
17066
- const [expanded, setExpanded] = useState38(false);
17210
+ const [hasMore, setHasMore] = useState39(false);
17211
+ const [expanded, setExpanded] = useState39(false);
17067
17212
  useLayoutEffect2(() => {
17068
17213
  if (!elRef.current) return;
17069
17214
  setHasMore(elRef.current.scrollHeight > elRef.current.clientHeight);
17070
17215
  }, []);
17071
- useEffect26(() => {
17216
+ useEffect27(() => {
17072
17217
  setExpanded(false);
17073
17218
  }, [children]);
17074
17219
  const onResize = useCallback21(() => {
@@ -17076,14 +17221,14 @@ function MaxLines({ maxLines, children }) {
17076
17221
  !expanded && setHasMore(elRef.current.scrollHeight > elRef.current.clientHeight);
17077
17222
  }, [expanded]);
17078
17223
  useResizeObserver5({ ref: elRef, onResize });
17079
- return /* @__PURE__ */ jsxs72("div", { children: [
17080
- /* @__PURE__ */ jsx153("div", { ref: elRef, css: Css.if(!expanded).lineClamp(maxLines).$, children }),
17081
- hasMore && /* @__PURE__ */ jsx153("button", { css: Css.db.smMd.$, onClick: () => setExpanded((prev) => !prev), children: expanded ? "Show Less" : "Show More" })
17224
+ return /* @__PURE__ */ jsxs74("div", { children: [
17225
+ /* @__PURE__ */ jsx156("div", { ref: elRef, css: Css.if(!expanded).lineClamp(maxLines).$, children }),
17226
+ hasMore && /* @__PURE__ */ jsx156("button", { css: Css.db.smMd.$, onClick: () => setExpanded((prev) => !prev), children: expanded ? "Show Less" : "Show More" })
17082
17227
  ] });
17083
17228
  }
17084
17229
 
17085
17230
  // src/components/Pagination.tsx
17086
- import { jsx as jsx154, jsxs as jsxs73 } from "@emotion/react/jsx-runtime";
17231
+ import { jsx as jsx157, jsxs as jsxs75 } from "@emotion/react/jsx-runtime";
17087
17232
  var defaultPage = { offset: 0, limit: 100 };
17088
17233
  function Pagination(props) {
17089
17234
  const { totalCount, pageSizes = [100, 500, 1e3] } = props;
@@ -17103,9 +17248,9 @@ function Pagination(props) {
17103
17248
  }
17104
17249
  }
17105
17250
  const tid = useTestIds(props, "pagination");
17106
- return /* @__PURE__ */ jsxs73("div", { css: Css.df.bcGray200.bt.xs.gray500.px2.pt2.$, ...tid, children: [
17107
- /* @__PURE__ */ jsx154("div", { css: Css.df.mya.mr2.$, ...tid.pageSizeLabel, children: "Page size:" }),
17108
- /* @__PURE__ */ jsx154("div", { css: Css.wPx(78).$, children: /* @__PURE__ */ jsx154(
17251
+ return /* @__PURE__ */ jsxs75("div", { css: Css.df.bcGray200.bt.xs.gray500.px2.pt2.$, ...tid, children: [
17252
+ /* @__PURE__ */ jsx157("div", { css: Css.df.mya.mr2.$, ...tid.pageSizeLabel, children: "Page size:" }),
17253
+ /* @__PURE__ */ jsx157("div", { css: Css.wPx(78).$, children: /* @__PURE__ */ jsx157(
17109
17254
  SelectField,
17110
17255
  {
17111
17256
  compact: true,
@@ -17117,15 +17262,15 @@ function Pagination(props) {
17117
17262
  ...tid.pageSize
17118
17263
  }
17119
17264
  ) }),
17120
- /* @__PURE__ */ jsxs73("div", { css: Css.mla.mya.df.$, children: [
17121
- /* @__PURE__ */ jsxs73("div", { css: Css.df.mya.mr2.$, ...tid.pageInfoLabel, children: [
17265
+ /* @__PURE__ */ jsxs75("div", { css: Css.mla.mya.df.$, children: [
17266
+ /* @__PURE__ */ jsxs75("div", { css: Css.df.mya.mr2.$, ...tid.pageInfoLabel, children: [
17122
17267
  first,
17123
17268
  " ",
17124
17269
  showLast ? `- ${last}` : "",
17125
17270
  " of ",
17126
17271
  totalCount
17127
17272
  ] }),
17128
- /* @__PURE__ */ jsx154(
17273
+ /* @__PURE__ */ jsx157(
17129
17274
  IconButton,
17130
17275
  {
17131
17276
  icon: "chevronLeft",
@@ -17135,7 +17280,7 @@ function Pagination(props) {
17135
17280
  ...tid.previousIcon
17136
17281
  }
17137
17282
  ),
17138
- /* @__PURE__ */ jsx154(
17283
+ /* @__PURE__ */ jsx157(
17139
17284
  IconButton,
17140
17285
  {
17141
17286
  icon: "chevronRight",
@@ -17164,8 +17309,8 @@ function toPageNumberSize(page) {
17164
17309
 
17165
17310
  // src/components/ScrollShadows.tsx
17166
17311
  import { useResizeObserver as useResizeObserver6 } from "@react-aria/utils";
17167
- import { useCallback as useCallback22, useMemo as useMemo39, useRef as useRef50, useState as useState39 } from "react";
17168
- import { jsx as jsx155, jsxs as jsxs74 } from "@emotion/react/jsx-runtime";
17312
+ import { useCallback as useCallback22, useMemo as useMemo40, useRef as useRef50, useState as useState40 } from "react";
17313
+ import { jsx as jsx158, jsxs as jsxs76 } from "@emotion/react/jsx-runtime";
17169
17314
  function ScrollShadows(props) {
17170
17315
  const { children, xss, horizontal = false, bgColor = "rgba(255,255,255,1)" /* White */ } = props;
17171
17316
  const { height = "auto", width: width2 = "auto" } = xss ?? {};
@@ -17173,10 +17318,10 @@ function ScrollShadows(props) {
17173
17318
  if (!bgColor.includes("rgba")) {
17174
17319
  throw new Error("ScrollShadows: bgColor prop must be in the format 'rgba(255, 255, 255, 1)'");
17175
17320
  }
17176
- const [showStartShadow, setShowStartShadow] = useState39(false);
17177
- const [showEndShadow, setShowEndShadow] = useState39(false);
17321
+ const [showStartShadow, setShowStartShadow] = useState40(false);
17322
+ const [showEndShadow, setShowEndShadow] = useState40(false);
17178
17323
  const scrollRef = useRef50(null);
17179
- const [startShadowStyles, endShadowStyles] = useMemo39(() => {
17324
+ const [startShadowStyles, endShadowStyles] = useMemo40(() => {
17180
17325
  const transparentBgColor = bgColor.replace(/,1\)$/, ",0)");
17181
17326
  const commonStyles = Css.absolute.z3.add({ pointerEvents: "none" }).$;
17182
17327
  const startShadowStyles2 = !horizontal ? Css.top0.left0.right0.hPx(40).$ : Css.left0.top0.bottom0.wPx(25).$;
@@ -17201,15 +17346,15 @@ function ScrollShadows(props) {
17201
17346
  );
17202
17347
  const onResize = useCallback22(() => scrollRef.current && updateScrollProps(scrollRef.current), [updateScrollProps]);
17203
17348
  useResizeObserver6({ ref: scrollRef, onResize });
17204
- return /* @__PURE__ */ jsxs74(
17349
+ return /* @__PURE__ */ jsxs76(
17205
17350
  "div",
17206
17351
  {
17207
17352
  css: Css.relative.oh.h(height).w(width2).df.fd(!horizontal ? "column" : "row").$,
17208
17353
  ...tid,
17209
17354
  children: [
17210
- /* @__PURE__ */ jsx155("div", { css: { ...startShadowStyles, opacity: showStartShadow ? 1 : 0 }, "data-chromatic": "ignore" }),
17211
- /* @__PURE__ */ jsx155("div", { css: { ...endShadowStyles, opacity: showEndShadow ? 1 : 0 }, "data-chromatic": "ignore" }),
17212
- /* @__PURE__ */ jsx155(
17355
+ /* @__PURE__ */ jsx158("div", { css: { ...startShadowStyles, opacity: showStartShadow ? 1 : 0 }, "data-chromatic": "ignore" }),
17356
+ /* @__PURE__ */ jsx158("div", { css: { ...endShadowStyles, opacity: showEndShadow ? 1 : 0 }, "data-chromatic": "ignore" }),
17357
+ /* @__PURE__ */ jsx158(
17213
17358
  "div",
17214
17359
  {
17215
17360
  css: {
@@ -17227,7 +17372,7 @@ function ScrollShadows(props) {
17227
17372
  }
17228
17373
 
17229
17374
  // src/components/Snackbar/useSnackbar.tsx
17230
- import { useCallback as useCallback23, useEffect as useEffect27 } from "react";
17375
+ import { useCallback as useCallback23, useEffect as useEffect28 } from "react";
17231
17376
  function useSnackbar() {
17232
17377
  const { setNotices, setOffset } = useSnackbarContext();
17233
17378
  const onClose = useCallback23(
@@ -17277,7 +17422,7 @@ function useSnackbar() {
17277
17422
  [onClose, setNotices]
17278
17423
  );
17279
17424
  const closeNotice = useCallback23((id) => onClose(id), [onClose]);
17280
- const useSnackbarOffset = ({ bottom }) => useEffect27(() => {
17425
+ const useSnackbarOffset = ({ bottom }) => useEffect28(() => {
17281
17426
  setOffset({ bottom });
17282
17427
  return () => setOffset({});
17283
17428
  }, [bottom]);
@@ -17288,7 +17433,7 @@ var snackbarId = 1;
17288
17433
  // src/components/Stepper.tsx
17289
17434
  import { useRef as useRef51 } from "react";
17290
17435
  import { useButton as useButton11, useFocusRing as useFocusRing14, useHover as useHover18 } from "react-aria";
17291
- import { jsx as jsx156, jsxs as jsxs75 } from "@emotion/react/jsx-runtime";
17436
+ import { jsx as jsx159, jsxs as jsxs77 } from "@emotion/react/jsx-runtime";
17292
17437
  function Stepper(props) {
17293
17438
  const { steps, currentStep, onChange } = props;
17294
17439
  if (steps.length === 0) {
@@ -17299,25 +17444,25 @@ function Stepper(props) {
17299
17444
  const maxStepWidth = 200;
17300
17445
  const minStepWidth = 100;
17301
17446
  const gap = 8;
17302
- return /* @__PURE__ */ jsxs75("nav", { "aria-label": "steps", css: Css.df.fdc.w100.$, ...tid, children: [
17303
- /* @__PURE__ */ jsx156("ol", { css: Css.listReset.df.gapPx(gap).$, children: steps.map((step) => {
17447
+ return /* @__PURE__ */ jsxs77("nav", { "aria-label": "steps", css: Css.df.fdc.w100.$, ...tid, children: [
17448
+ /* @__PURE__ */ jsx159("ol", { css: Css.listReset.df.gapPx(gap).$, children: steps.map((step) => {
17304
17449
  const isCurrent = currentStep === step.value;
17305
- return /* @__PURE__ */ jsx156(
17450
+ return /* @__PURE__ */ jsx159(
17306
17451
  "li",
17307
17452
  {
17308
17453
  css: Css.df.fg1.fdc.maxwPx(maxStepWidth).mwPx(minStepWidth).$,
17309
17454
  "aria-current": isCurrent,
17310
17455
  ...tid.step,
17311
- children: /* @__PURE__ */ jsx156(StepButton, { ...step, onClick: () => onChange(step.value), isCurrent, ...tid.stepButton })
17456
+ children: /* @__PURE__ */ jsx159(StepButton, { ...step, onClick: () => onChange(step.value), isCurrent, ...tid.stepButton })
17312
17457
  },
17313
17458
  step.label
17314
17459
  );
17315
17460
  }) }),
17316
- /* @__PURE__ */ jsx156(
17461
+ /* @__PURE__ */ jsx159(
17317
17462
  "div",
17318
17463
  {
17319
17464
  css: Css.mt1.bgGray300.hPx(4).maxwPx(steps.length * maxStepWidth + (steps.length - 1) * gap).mwPx(steps.length * minStepWidth + (steps.length - 1) * gap).w100.$,
17320
- children: /* @__PURE__ */ jsx156(
17465
+ children: /* @__PURE__ */ jsx159(
17321
17466
  "div",
17322
17467
  {
17323
17468
  css: Css.bgBlue600.add("transition", "width 200ms").h100.w(`${(lastCompletedStep + 1) / steps.length * 100}%`).$
@@ -17336,7 +17481,7 @@ function StepButton(props) {
17336
17481
  const { hoverProps, isHovered } = useHover18(ariaProps);
17337
17482
  const focusRingStyles2 = state === "error" ? Css.bshDanger.$ : Css.bshFocus.$;
17338
17483
  const tid = useTestIds(props, "stepButton");
17339
- return /* @__PURE__ */ jsxs75(
17484
+ return /* @__PURE__ */ jsxs77(
17340
17485
  "button",
17341
17486
  {
17342
17487
  ref,
@@ -17354,7 +17499,7 @@ function StepButton(props) {
17354
17499
  },
17355
17500
  ...tid[defaultTestId(label)],
17356
17501
  children: [
17357
- /* @__PURE__ */ jsx156("span", { css: Css.fs0.mrPx(4).$, children: /* @__PURE__ */ jsx156(StepIcon, { state, isHovered, isPressed, isCurrent }) }),
17502
+ /* @__PURE__ */ jsx159("span", { css: Css.fs0.mrPx(4).$, children: /* @__PURE__ */ jsx159(StepIcon, { state, isHovered, isPressed, isCurrent }) }),
17358
17503
  label
17359
17504
  ]
17360
17505
  }
@@ -17362,12 +17507,12 @@ function StepButton(props) {
17362
17507
  }
17363
17508
  function StepIcon({ state, isHovered = false, isPressed = false, isCurrent = false }) {
17364
17509
  if (state === "error") {
17365
- return /* @__PURE__ */ jsx156(Icon, { icon: "errorCircle" });
17510
+ return /* @__PURE__ */ jsx159(Icon, { icon: "errorCircle" });
17366
17511
  }
17367
17512
  if (state === "complete") {
17368
- return /* @__PURE__ */ jsx156(Icon, { icon: "check" });
17513
+ return /* @__PURE__ */ jsx159(Icon, { icon: "check" });
17369
17514
  }
17370
- return /* @__PURE__ */ jsx156("div", { css: Css.wPx(24).hPx(24).df.aic.jcc.$, children: /* @__PURE__ */ jsx156(
17515
+ return /* @__PURE__ */ jsx159("div", { css: Css.wPx(24).hPx(24).df.aic.jcc.$, children: /* @__PURE__ */ jsx159(
17371
17516
  "div",
17372
17517
  {
17373
17518
  css: Css.wPx(10).hPx(10).ba.bw2.br100.add("color", "currentColor").if(isHovered || isPressed || isCurrent).add("backgroundColor", "currentColor").$
@@ -17377,7 +17522,7 @@ function StepIcon({ state, isHovered = false, isPressed = false, isCurrent = fal
17377
17522
 
17378
17523
  // src/components/SuperDrawer/components/SuperDrawerHeader.tsx
17379
17524
  import { createPortal as createPortal5 } from "react-dom";
17380
- import { jsx as jsx157, jsxs as jsxs76 } from "@emotion/react/jsx-runtime";
17525
+ import { jsx as jsx160, jsxs as jsxs78 } from "@emotion/react/jsx-runtime";
17381
17526
  function SuperDrawerHeader(props) {
17382
17527
  const { hideControls } = props;
17383
17528
  const { sdHeaderDiv, drawerContentStack: contentStack } = useBeamContext();
@@ -17387,15 +17532,15 @@ function SuperDrawerHeader(props) {
17387
17532
  const isDetail = currentContent !== firstContent;
17388
17533
  const tid = useTestIds({}, "superDrawerHeader");
17389
17534
  return createPortal5(
17390
- /* @__PURE__ */ jsxs76("div", { css: Css.df.aic.jcsb.gap3.$, ...tid, children: [
17391
- isStructuredProps(props) ? /* @__PURE__ */ jsxs76("div", { css: Css.df.jcsb.aic.gap2.fg1.$, children: [
17392
- /* @__PURE__ */ jsxs76("div", { css: Css.fg1.df.aic.gap2.$, children: [
17393
- typeof props.title === "string" ? /* @__PURE__ */ jsx157("h1", { children: props.title }) : props.title,
17535
+ /* @__PURE__ */ jsxs78("div", { css: Css.df.aic.jcsb.gap3.$, ...tid, children: [
17536
+ isStructuredProps(props) ? /* @__PURE__ */ jsxs78("div", { css: Css.df.jcsb.aic.gap2.fg1.$, children: [
17537
+ /* @__PURE__ */ jsxs78("div", { css: Css.fg1.df.aic.gap2.$, children: [
17538
+ typeof props.title === "string" ? /* @__PURE__ */ jsx160("h1", { children: props.title }) : props.title,
17394
17539
  props.left
17395
17540
  ] }),
17396
- props.right && /* @__PURE__ */ jsx157("div", { css: Css.fs0.$, children: props.right })
17397
- ] }) : /* @__PURE__ */ jsx157("div", { css: Css.fg1.$, children: props.children }),
17398
- !hideControls && /* @__PURE__ */ jsx157("div", { css: Css.fs0.if(isDetail).vh.$, children: /* @__PURE__ */ jsx157(
17541
+ props.right && /* @__PURE__ */ jsx160("div", { css: Css.fs0.$, children: props.right })
17542
+ ] }) : /* @__PURE__ */ jsx160("div", { css: Css.fg1.$, children: props.children }),
17543
+ !hideControls && /* @__PURE__ */ jsx160("div", { css: Css.fs0.if(isDetail).vh.$, children: /* @__PURE__ */ jsx160(
17399
17544
  ButtonGroup,
17400
17545
  {
17401
17546
  buttons: [
@@ -17414,18 +17559,18 @@ function isStructuredProps(props) {
17414
17559
  }
17415
17560
 
17416
17561
  // src/components/SuperDrawer/ConfirmCloseModal.tsx
17417
- import { Fragment as Fragment29, jsx as jsx158, jsxs as jsxs77 } from "@emotion/react/jsx-runtime";
17562
+ import { Fragment as Fragment31, jsx as jsx161, jsxs as jsxs79 } from "@emotion/react/jsx-runtime";
17418
17563
  function ConfirmCloseModal(props) {
17419
17564
  const { onClose, discardText = "Discard Changes", continueText = "Continue Editing" } = props;
17420
17565
  const { modalState } = useBeamContext();
17421
17566
  function closeModal() {
17422
17567
  modalState.current = void 0;
17423
17568
  }
17424
- return /* @__PURE__ */ jsxs77(Fragment29, { children: [
17425
- /* @__PURE__ */ jsx158(ModalHeader, { children: "Are you sure you want to cancel?" }),
17426
- /* @__PURE__ */ jsx158(ModalBody, { children: /* @__PURE__ */ jsx158("p", { children: "Any changes you've made so far will be lost." }) }),
17427
- /* @__PURE__ */ jsxs77(ModalFooter, { children: [
17428
- /* @__PURE__ */ jsx158(
17569
+ return /* @__PURE__ */ jsxs79(Fragment31, { children: [
17570
+ /* @__PURE__ */ jsx161(ModalHeader, { children: "Are you sure you want to cancel?" }),
17571
+ /* @__PURE__ */ jsx161(ModalBody, { children: /* @__PURE__ */ jsx161("p", { children: "Any changes you've made so far will be lost." }) }),
17572
+ /* @__PURE__ */ jsxs79(ModalFooter, { children: [
17573
+ /* @__PURE__ */ jsx161(
17429
17574
  Button,
17430
17575
  {
17431
17576
  variant: "tertiary",
@@ -17436,7 +17581,7 @@ function ConfirmCloseModal(props) {
17436
17581
  }
17437
17582
  }
17438
17583
  ),
17439
- /* @__PURE__ */ jsx158(Button, { label: continueText, onClick: closeModal })
17584
+ /* @__PURE__ */ jsx161(Button, { label: continueText, onClick: closeModal })
17440
17585
  ] })
17441
17586
  ] });
17442
17587
  }
@@ -17445,8 +17590,8 @@ function ConfirmCloseModal(props) {
17445
17590
  import { motion as motion4 } from "framer-motion";
17446
17591
 
17447
17592
  // src/components/SuperDrawer/useSuperDrawer.tsx
17448
- import { useMemo as useMemo40 } from "react";
17449
- import { jsx as jsx159 } from "@emotion/react/jsx-runtime";
17593
+ import { useMemo as useMemo41 } from "react";
17594
+ import { jsx as jsx162 } from "@emotion/react/jsx-runtime";
17450
17595
  function useSuperDrawer() {
17451
17596
  const {
17452
17597
  drawerContentStack: contentStack,
@@ -17458,7 +17603,7 @@ function useSuperDrawer() {
17458
17603
  function canCloseDrawerDetails(i, doChange) {
17459
17604
  for (const canCloseDrawerDetail of canCloseDetailsChecks.current[i] ?? []) {
17460
17605
  if (!canClose(canCloseDrawerDetail)) {
17461
- openModal({ content: /* @__PURE__ */ jsx159(ConfirmCloseModal, { onClose: doChange, ...canCloseDrawerDetail }) });
17606
+ openModal({ content: /* @__PURE__ */ jsx162(ConfirmCloseModal, { onClose: doChange, ...canCloseDrawerDetail }) });
17462
17607
  return false;
17463
17608
  }
17464
17609
  }
@@ -17478,14 +17623,14 @@ function useSuperDrawer() {
17478
17623
  for (const canCloseDrawer of canCloseChecks.current) {
17479
17624
  if (!canClose(canCloseDrawer)) {
17480
17625
  openModal({
17481
- content: /* @__PURE__ */ jsx159(ConfirmCloseModal, { onClose: doChange, ...canCloseDrawer })
17626
+ content: /* @__PURE__ */ jsx162(ConfirmCloseModal, { onClose: doChange, ...canCloseDrawer })
17482
17627
  });
17483
17628
  return;
17484
17629
  }
17485
17630
  }
17486
17631
  doChange();
17487
17632
  }
17488
- const closeActions = useMemo40(
17633
+ const closeActions = useMemo41(
17489
17634
  () => {
17490
17635
  return {
17491
17636
  /** Attempts to close the drawer. If any checks fail, a confirmation modal will appear */
@@ -17520,7 +17665,7 @@ function useSuperDrawer() {
17520
17665
  // eslint-disable-next-line react-hooks/exhaustive-deps
17521
17666
  [canCloseChecks, canCloseDetailsChecks, contentStack, modalState, openModal]
17522
17667
  );
17523
- const actions = useMemo40(
17668
+ const actions = useMemo41(
17524
17669
  () => {
17525
17670
  return {
17526
17671
  // TODO: Maybe we should rename to openDrawer as a breaking change (to match openDrawerDetail)
@@ -17573,7 +17718,7 @@ function canClose(canCloseCheck) {
17573
17718
  }
17574
17719
 
17575
17720
  // src/components/SuperDrawer/SuperDrawerContent.tsx
17576
- import { Fragment as Fragment30, jsx as jsx160, jsxs as jsxs78 } from "@emotion/react/jsx-runtime";
17721
+ import { Fragment as Fragment32, jsx as jsx163, jsxs as jsxs80 } from "@emotion/react/jsx-runtime";
17577
17722
  var SuperDrawerContent = ({ children, actions }) => {
17578
17723
  const { closeDrawerDetail } = useSuperDrawer();
17579
17724
  const { drawerContentStack: contentStack } = useBeamContext();
@@ -17582,17 +17727,17 @@ var SuperDrawerContent = ({ children, actions }) => {
17582
17727
  const { width: width2 = 1040 /* Normal */ } = firstContent ?? {};
17583
17728
  function wrapWithMotionAndMaybeBack(children2) {
17584
17729
  if (kind === "open") {
17585
- return /* @__PURE__ */ jsx160(motion4.div, { css: Css.p3.fg1.oa.$, children: children2 }, "content");
17730
+ return /* @__PURE__ */ jsx163(motion4.div, { css: Css.p3.fg1.oa.$, children: children2 }, "content");
17586
17731
  } else if (kind === "detail") {
17587
- return /* @__PURE__ */ jsxs78(
17732
+ return /* @__PURE__ */ jsxs80(
17588
17733
  motion4.div,
17589
17734
  {
17590
17735
  css: Css.px3.pt2.pb3.fg1.$,
17591
17736
  animate: { overflow: "auto" },
17592
17737
  transition: { overflow: { delay: 0.3 } },
17593
17738
  children: [
17594
- /* @__PURE__ */ jsx160(Button, { label: "Back", icon: "chevronLeft", variant: "tertiary", onClick: closeDrawerDetail }),
17595
- /* @__PURE__ */ jsx160(
17739
+ /* @__PURE__ */ jsx163(Button, { label: "Back", icon: "chevronLeft", variant: "tertiary", onClick: closeDrawerDetail }),
17740
+ /* @__PURE__ */ jsx163(
17596
17741
  motion4.div,
17597
17742
  {
17598
17743
  initial: { x: width2, opacity: 0 },
@@ -17608,27 +17753,27 @@ var SuperDrawerContent = ({ children, actions }) => {
17608
17753
  "content"
17609
17754
  );
17610
17755
  } else {
17611
- return /* @__PURE__ */ jsx160(motion4.div, { css: Css.p3.fg1.$, style: { overflow: "auto" } }, "content");
17756
+ return /* @__PURE__ */ jsx163(motion4.div, { css: Css.p3.fg1.$, style: { overflow: "auto" } }, "content");
17612
17757
  }
17613
17758
  }
17614
- return /* @__PURE__ */ jsxs78(Fragment30, { children: [
17759
+ return /* @__PURE__ */ jsxs80(Fragment32, { children: [
17615
17760
  wrapWithMotionAndMaybeBack(children),
17616
- actions && /* @__PURE__ */ jsx160("footer", { css: Css.bt.bcGray200.p3.df.aic.jcfe.$, children: /* @__PURE__ */ jsx160("div", { css: Css.df.gap1.$, children: actions.map((buttonProps, i) => /* @__PURE__ */ jsx160(Button, { ...buttonProps }, i)) }) })
17761
+ actions && /* @__PURE__ */ jsx163("footer", { css: Css.bt.bcGray200.p3.df.aic.jcfe.$, children: /* @__PURE__ */ jsx163("div", { css: Css.df.gap1.$, children: actions.map((buttonProps, i) => /* @__PURE__ */ jsx163(Button, { ...buttonProps }, i)) }) })
17617
17762
  ] });
17618
17763
  };
17619
17764
 
17620
17765
  // src/components/Tabs.tsx
17621
17766
  import { camelCase as camelCase5 } from "change-case";
17622
- import { useEffect as useEffect28, useMemo as useMemo41, useRef as useRef52, useState as useState40 } from "react";
17767
+ import { useEffect as useEffect29, useMemo as useMemo42, useRef as useRef52, useState as useState41 } from "react";
17623
17768
  import { mergeProps as mergeProps13, useFocusRing as useFocusRing15, useHover as useHover19 } from "react-aria";
17624
17769
  import { matchPath, Route } from "react-router";
17625
17770
  import { Link as Link5, useLocation } from "react-router-dom";
17626
- import { Fragment as Fragment31, jsx as jsx161, jsxs as jsxs79 } from "@emotion/react/jsx-runtime";
17771
+ import { Fragment as Fragment33, jsx as jsx164, jsxs as jsxs81 } from "@emotion/react/jsx-runtime";
17627
17772
  function TabsWithContent(props) {
17628
17773
  const styles = hideTabs(props) ? {} : Css.pt3.$;
17629
- return /* @__PURE__ */ jsxs79(Fragment31, { children: [
17630
- /* @__PURE__ */ jsx161(Tabs, { ...props }),
17631
- /* @__PURE__ */ jsx161(TabContent, { ...props, contentXss: { ...styles, ...props.contentXss } })
17774
+ return /* @__PURE__ */ jsxs81(Fragment33, { children: [
17775
+ /* @__PURE__ */ jsx164(Tabs, { ...props }),
17776
+ /* @__PURE__ */ jsx164(TabContent, { ...props, contentXss: { ...styles, ...props.contentXss } })
17632
17777
  ] });
17633
17778
  }
17634
17779
  function TabContent(props) {
@@ -17643,7 +17788,7 @@ function TabContent(props) {
17643
17788
  return (
17644
17789
  // Using FullBleed to allow the tab's bgColor to extend to the edges of the <ScrollableContent /> element.
17645
17790
  // Omit the padding from `FullBleed` if the caller passes in the `paddingLeft/Right` styles.
17646
- /* @__PURE__ */ jsx161(FullBleed, { omitPadding: "paddingLeft" in contentXss || "paddingRight" in contentXss, children: /* @__PURE__ */ jsx161(
17791
+ /* @__PURE__ */ jsx164(FullBleed, { omitPadding: "paddingLeft" in contentXss || "paddingRight" in contentXss, children: /* @__PURE__ */ jsx164(
17647
17792
  "div",
17648
17793
  {
17649
17794
  "aria-labelledby": `${uniqueValue}-tab`,
@@ -17652,7 +17797,7 @@ function TabContent(props) {
17652
17797
  tabIndex: 0,
17653
17798
  ...tid.panel,
17654
17799
  css: contentXss,
17655
- children: isRouteTab(selectedTab) ? /* @__PURE__ */ jsx161(Route, { path: selectedTab.path, render: selectedTab.render }) : selectedTab.render()
17800
+ children: isRouteTab(selectedTab) ? /* @__PURE__ */ jsx164(Route, { path: selectedTab.path, render: selectedTab.render }) : selectedTab.render()
17656
17801
  }
17657
17802
  ) })
17658
17803
  );
@@ -17665,9 +17810,9 @@ function Tabs(props) {
17665
17810
  ) : props.selected;
17666
17811
  const { isFocusVisible, focusProps } = useFocusRing15();
17667
17812
  const tid = useTestIds(others, "tabs");
17668
- const [active, setActive] = useState40(selected);
17813
+ const [active, setActive] = useState41(selected);
17669
17814
  const ref = useRef52(null);
17670
- useEffect28(() => setActive(selected), [selected]);
17815
+ useEffect29(() => setActive(selected), [selected]);
17671
17816
  function onKeyUp(e) {
17672
17817
  if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
17673
17818
  const nextTabValue = getNextTabValue(active, e.key, tabs);
@@ -17683,10 +17828,10 @@ function Tabs(props) {
17683
17828
  setActive(selected);
17684
17829
  }
17685
17830
  }
17686
- return /* @__PURE__ */ jsxs79("div", { css: { ...Css.df.aic.oa.wsnw.gap1.$, ...includeBottomBorder ? { ...Css.bb.bcGray200.$ } : {} }, children: [
17687
- !hideTabs(props) && /* @__PURE__ */ jsx161("div", { ref, css: Css.dif.gap1.asfe.$, "aria-label": ariaLabel, role: "tablist", ...tid, children: tabs.map((tab) => {
17831
+ return /* @__PURE__ */ jsxs81("div", { css: { ...Css.df.aic.oa.wsnw.gap1.$, ...includeBottomBorder ? { ...Css.bb.bcGray200.$ } : {} }, children: [
17832
+ !hideTabs(props) && /* @__PURE__ */ jsx164("div", { ref, css: Css.dif.gap1.asfe.$, "aria-label": ariaLabel, role: "tablist", ...tid, children: tabs.map((tab) => {
17688
17833
  const uniqueValue = uniqueTabValue(tab);
17689
- return /* @__PURE__ */ jsx161(
17834
+ return /* @__PURE__ */ jsx164(
17690
17835
  TabImpl,
17691
17836
  {
17692
17837
  active: active === uniqueValue,
@@ -17701,7 +17846,7 @@ function Tabs(props) {
17701
17846
  uniqueValue
17702
17847
  );
17703
17848
  }) }),
17704
- right && /* @__PURE__ */ jsx161("div", { css: Css.mla.df.aic.gap1.pb1.$, children: right })
17849
+ right && /* @__PURE__ */ jsx164("div", { css: Css.mla.df.aic.gap1.pb1.$, children: right })
17705
17850
  ] });
17706
17851
  }
17707
17852
  function TabImpl(props) {
@@ -17709,7 +17854,7 @@ function TabImpl(props) {
17709
17854
  const { disabled = false, name: label, icon, endAdornment } = tab;
17710
17855
  const isDisabled = !!disabled;
17711
17856
  const { hoverProps, isHovered } = useHover19({ isDisabled });
17712
- const { baseStyles: baseStyles5, activeStyles: activeStyles4, focusRingStyles: focusRingStyles2, hoverStyles: hoverStyles4, disabledStyles: disabledStyles4, activeHoverStyles } = useMemo41(
17857
+ const { baseStyles: baseStyles5, activeStyles: activeStyles4, focusRingStyles: focusRingStyles2, hoverStyles: hoverStyles4, disabledStyles: disabledStyles4, activeHoverStyles } = useMemo42(
17713
17858
  () => getTabStyles(),
17714
17859
  []
17715
17860
  );
@@ -17736,15 +17881,15 @@ function TabImpl(props) {
17736
17881
  onBlur,
17737
17882
  ...isRouteTab(tab) ? {} : { onClick: () => onClick(tab.value) }
17738
17883
  });
17739
- const tabLabel = /* @__PURE__ */ jsxs79(Fragment31, { children: [
17884
+ const tabLabel = /* @__PURE__ */ jsxs81(Fragment33, { children: [
17740
17885
  label,
17741
- (icon || endAdornment) && /* @__PURE__ */ jsx161("span", { css: Css.ml1.$, children: icon ? /* @__PURE__ */ jsx161(Icon, { icon }) : endAdornment })
17886
+ (icon || endAdornment) && /* @__PURE__ */ jsx164("span", { css: Css.ml1.$, children: icon ? /* @__PURE__ */ jsx164(Icon, { icon }) : endAdornment })
17742
17887
  ] });
17743
17888
  return isDisabled ? maybeTooltip({
17744
17889
  title: resolveTooltip(disabled),
17745
17890
  placement: "top",
17746
- children: /* @__PURE__ */ jsx161("div", { ...tabProps, children: tabLabel })
17747
- }) : isRouteTab(tab) ? /* @__PURE__ */ jsx161(Link5, { ...{ ...tabProps, ...interactiveProps }, className: "navLink", to: tab.href, children: tabLabel }) : /* @__PURE__ */ jsx161("button", { ...{ ...tabProps, ...interactiveProps }, children: tabLabel });
17891
+ children: /* @__PURE__ */ jsx164("div", { ...tabProps, children: tabLabel })
17892
+ }) : isRouteTab(tab) ? /* @__PURE__ */ jsx164(Link5, { ...{ ...tabProps, ...interactiveProps }, className: "navLink", to: tab.href, children: tabLabel }) : /* @__PURE__ */ jsx164("button", { ...{ ...tabProps, ...interactiveProps }, children: tabLabel });
17748
17893
  }
17749
17894
  function getTabStyles() {
17750
17895
  const borderBottomWidthPx = 4;
@@ -17781,11 +17926,11 @@ function hideTabs(props) {
17781
17926
  }
17782
17927
 
17783
17928
  // src/components/Toast/Toast.tsx
17784
- import { Fragment as Fragment32, jsx as jsx162 } from "@emotion/react/jsx-runtime";
17929
+ import { Fragment as Fragment34, jsx as jsx165 } from "@emotion/react/jsx-runtime";
17785
17930
  function Toast() {
17786
17931
  const { setNotice, notice } = useToastContext();
17787
17932
  const tid = useTestIds({}, "toast");
17788
- return /* @__PURE__ */ jsx162(Fragment32, { children: notice && /* @__PURE__ */ jsx162(Banner, { ...notice, ...tid, onClose: () => setNotice(void 0) }) });
17933
+ return /* @__PURE__ */ jsx165(Fragment34, { children: notice && /* @__PURE__ */ jsx165(Banner, { ...notice, ...tid, onClose: () => setNotice(void 0) }) });
17789
17934
  }
17790
17935
 
17791
17936
  // src/components/Toast/useToast.tsx
@@ -17868,6 +18013,7 @@ export {
17868
18013
  FormRow,
17869
18014
  FullBleed,
17870
18015
  GridTable,
18016
+ GridTableLayout,
17871
18017
  HB_QUIPS_FLAVOR,
17872
18018
  HB_QUIPS_MISSION,
17873
18019
  HEADER,
@@ -18055,6 +18201,7 @@ export {
18055
18201
  useDnDGridItem,
18056
18202
  useFilter,
18057
18203
  useGridTableApi,
18204
+ useGridTableLayoutState,
18058
18205
  useGroupBy,
18059
18206
  useHover,
18060
18207
  useModal,