From 1307772b8bebf68e7ee6ba489e9ffd9476888bbf Mon Sep 17 00:00:00 2001 From: Griffith Chen Date: Tue, 10 Dec 2024 10:12:47 +0800 Subject: [PATCH] Sunset Site Assembler: Remove all CTAs (#97217) --- .../themes-list/get-site-assembler-url.js | 27 ---- client/components/themes-list/index.jsx | 90 +---------- client/components/themes-list/style.scss | 6 - .../test/__snapshots__/index.jsx.snap | 33 ---- client/components/themes-list/test/index.jsx | 4 - client/data/site-assembler/index.ts | 3 - .../steps-repository/design-choices/index.tsx | 22 +-- .../design-setup/unified-design-picker.tsx | 41 ----- .../declarative-flow/site-setup-flow.ts | 7 +- client/my-sites/themes/collections/style.scss | 4 - .../themes/pattern-assembler-button/index.tsx | 24 --- .../pattern-assembler-button/style.scss | 27 ---- .../my-sites/themes/theme-showcase-header.jsx | 6 - client/my-sites/themes/theme-showcase.jsx | 55 +------ config/development.json | 1 - config/horizon.json | 1 - config/production.json | 1 - config/stage.json | 1 - config/wpcalypso.json | 1 - .../src/hooks/use-rendered-patterns.ts | 5 +- packages/data-stores/src/site/actions.ts | 5 +- packages/data-stores/src/site/constants.ts | 8 +- .../images/assembler-illustration-v2.png | Bin 47402 -> 0 bytes .../assets/images/assembler-illustration.png | Bin 77543 -> 0 bytes .../design-picker/src/components/index.ts | 6 - .../pattern-assembler-cta/index.tsx | 67 -------- .../pattern-assembler-cta/style.scss | 146 ------------------ .../design-picker/src/components/style.scss | 10 -- .../src/components/unified-design-picker.tsx | 36 ----- packages/design-picker/src/constants.ts | 9 -- packages/design-picker/src/index.ts | 1 - packages/design-picker/src/utils/designs.ts | 12 +- 32 files changed, 11 insertions(+), 648 deletions(-) delete mode 100644 client/components/themes-list/get-site-assembler-url.js delete mode 100644 client/data/site-assembler/index.ts delete mode 100644 client/my-sites/themes/pattern-assembler-button/index.tsx delete mode 100644 client/my-sites/themes/pattern-assembler-button/style.scss delete mode 100644 packages/design-picker/src/components/assets/images/assembler-illustration-v2.png delete mode 100644 packages/design-picker/src/components/assets/images/assembler-illustration.png delete mode 100644 packages/design-picker/src/components/pattern-assembler-cta/index.tsx delete mode 100644 packages/design-picker/src/components/pattern-assembler-cta/style.scss diff --git a/client/components/themes-list/get-site-assembler-url.js b/client/components/themes-list/get-site-assembler-url.js deleted file mode 100644 index f8ba40b7d5392..0000000000000 --- a/client/components/themes-list/get-site-assembler-url.js +++ /dev/null @@ -1,27 +0,0 @@ -import { isEnabled } from '@automattic/calypso-config'; -import { WITH_THEME_ASSEMBLER_FLOW, ASSEMBLER_FIRST_FLOW } from '@automattic/onboarding'; - -export default function getSiteAssemblerUrl( { - isLoggedIn, - selectedSite, - shouldGoToAssemblerStep, - siteEditorUrl, -} ) { - if ( isLoggedIn && selectedSite && ! shouldGoToAssemblerStep ) { - return siteEditorUrl; - } - - const params = new URLSearchParams( { ref: 'calypshowcase' } ); - if ( ! isLoggedIn && isEnabled( 'themes/assembler-first' ) ) { - return `/setup/${ ASSEMBLER_FIRST_FLOW }?${ params }`; - } - - // Redirect people to create a site first if they don't log in or they have no sites. - const basePathname = isLoggedIn && selectedSite ? '/setup' : '/start'; - - if ( selectedSite?.slug ) { - params.set( 'siteSlug', selectedSite.slug ); - } - - return `${ basePathname }/${ WITH_THEME_ASSEMBLER_FLOW }?${ params }`; -} diff --git a/client/components/themes-list/index.jsx b/client/components/themes-list/index.jsx index 74f3e16a51ee2..6244e3825a56f 100644 --- a/client/components/themes-list/index.jsx +++ b/client/components/themes-list/index.jsx @@ -1,11 +1,6 @@ import { FEATURE_INSTALL_THEMES, PLAN_BUSINESS, getPlan } from '@automattic/calypso-products'; import { Button } from '@automattic/components'; -import { - PatternAssemblerCta, - usePatternAssemblerCtaData, - isAssemblerSupported, -} from '@automattic/design-picker'; -import { Icon, addTemplate, brush, cloudUpload } from '@wordpress/icons'; +import { Icon, brush, cloudUpload } from '@wordpress/icons'; import { localize } from 'i18n-calypso'; import { isEmpty, times } from 'lodash'; import PropTypes from 'prop-types'; @@ -13,11 +8,9 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { connect, useSelector } from 'react-redux'; import InfiniteScroll from 'calypso/components/infinite-scroll'; import Theme from 'calypso/components/theme'; -import { useIsSiteAssemblerEnabled } from 'calypso/data/site-assembler'; import withIsFSEActive from 'calypso/data/themes/with-is-fse-active'; import { getWooMyCustomThemeOptions } from 'calypso/my-sites/themes/theme-options'; import { isUserLoggedIn } from 'calypso/state/current-user/selectors'; -import getSiteEditorUrl from 'calypso/state/selectors/get-site-editor-url'; import isAtomicSite from 'calypso/state/selectors/is-site-automated-transfer'; import siteHasFeature from 'calypso/state/selectors/site-has-feature'; import { isSiteOnECommerceTrial, isSiteOnWooExpress } from 'calypso/state/sites/plans/selectors'; @@ -37,7 +30,6 @@ import { StartNewDesignWarningModal, StartOverWarningModal, } from '../woo-design-with-ai-warning-modals'; -import getSiteAssemblerUrl from './get-site-assembler-url'; import useWooActiveThemeQuery from './use-woo-active-theme-query'; import './style.scss'; @@ -81,7 +73,6 @@ export const ThemesList = ( { tabFilter, ...props } ) => { } = props; const themesListRef = useRef( null ); const [ showSecondUpsellNudge, setShowSecondUpsellNudge ] = useState( false ); - const isSiteAssemblerEnabled = useIsSiteAssemblerEnabled(); const updateShowSecondUpsellNudge = useCallback( () => { const minColumnWidth = 320; // $theme-item-min-width: 320px; const margin = 32; // $theme-item-horizontal-margin: 32px; @@ -99,14 +90,6 @@ export const ThemesList = ( { tabFilter, ...props } ) => { }, [ updateShowSecondUpsellNudge ] ); const selectedSite = useSelector( getSelectedSite ); - const isLoggedIn = useSelector( isUserLoggedIn ); - const siteEditorUrl = useSelector( ( state ) => - getSiteEditorUrl( state, selectedSite?.ID, { - canvas: 'edit', - assembler: '1', - } ) - ); - const fetchNextPage = useCallback( ( options ) => { props.fetchNextPage( options ); @@ -114,26 +97,6 @@ export const ThemesList = ( { tabFilter, ...props } ) => { [ props.fetchNextPage ] ); - const goToSiteAssemblerFlow = () => { - const shouldGoToAssemblerStep = isAssemblerSupported(); - props.recordTracksEvent( 'calypso_themeshowcase_pattern_assembler_cta_click', { - goes_to_assembler_step: shouldGoToAssemblerStep, - is_logged_in: isLoggedIn, - } ); - - if ( props.onDesignYourOwnClick ) { - props.onDesignYourOwnClick(); - } else { - const destinationUrl = getSiteAssemblerUrl( { - isLoggedIn, - selectedSite, - shouldGoToAssemblerStep, - siteEditorUrl, - } ); - window.location.assign( destinationUrl ); - } - }; - const [ openWarningModal, setOpenWarningModal ] = useState( false ); const { data: activeTheme } = useWooActiveThemeQuery( selectedSite?.ID, @@ -187,7 +150,6 @@ export const ThemesList = ( { tabFilter, ...props } ) => { searchTerm={ props.searchTerm } translate={ props.translate } upsellCardDisplayed={ props.upsellCardDisplayed } - isSiteAssemblerEnabled={ isSiteAssemblerEnabled } /> ); } @@ -227,12 +189,6 @@ export const ThemesList = ( { tabFilter, ...props } ) => { { /* Don't show second upsell nudge when less than 6 rows are present. Second plan upsell at 7th row is implemented through CSS. */ } { showSecondUpsellNudge && SecondUpsellNudge } - { /* The Pattern Assembler CTA will display on the 9th row and the behavior is controlled by CSS */ } - { ! props.isWooCYSEligibleSite && - ! ( props.isSiteWooExpressOrEcomFreeTrial && props.tier === 'free' ) && - tabFilter !== 'my-themes' && - _themes.length > 0 && - isSiteAssemblerEnabled && } { /* The Woo Design with AI banner will be displayed on the 2nd or last row.The behavior is controlled by CSS */ } { props.isWooCYSEligibleSite && _themes.length > 0 && ( @@ -362,16 +311,9 @@ function Options( { ); const isAtomic = useSelector( ( state ) => isAtomicSite( state, selectedSite?.ID ) ); const sitePlan = selectedSite?.plan?.product_slug; - const siteEditorUrl = useSelector( ( state ) => - getSiteEditorUrl( state, selectedSite?.ID, { - canvas: 'edit', - assembler: '1', - } ) - ); const siteThemeInstallUrl = useSelector( ( state ) => getSiteThemeInstallUrl( state, selectedSite?.ID ) ); - const assemblerCtaData = usePatternAssemblerCtaData(); const options = []; useEffect( () => { @@ -381,32 +323,6 @@ function Options( { }; }, [ upsellCardDisplayed ] ); - // Design your own theme / homepage. - if ( ( isFSEActive || assemblerCtaData.shouldGoToAssemblerStep ) && isSiteAssemblerEnabled ) { - options.push( { - title: assemblerCtaData.title, - icon: addTemplate, - description: assemblerCtaData.subtitle, - onClick: () => - recordTracksEvent( 'calypso_themeshowcase_more_options_design_homepage_click', { - site_plan: sitePlan, - search_term: searchTerm, - destination: assemblerCtaData.shouldGoToAssemblerStep ? 'assembler' : 'site-editor', - } ), - url: getSiteAssemblerUrl( { - isLoggedIn, - selectedSite, - shouldGoToAssemblerStep: assemblerCtaData.shouldGoToAssemblerStep, - siteEditorUrl, - } ), - buttonText: assemblerCtaData.buttonText, - } ); - } else { - // This should also start the Pattern Assembler, which is currently in development for - // the logged-out showcase on mobile viewport. Since there isn't any proper fallback for the meantime, we - // just don't include this option. - } - // Do it for me. options.push( { title: translate( 'Hire our team of experts to design one for you', { @@ -519,12 +435,10 @@ function Empty( props ) { { props.translate( 'No themes match your search' ) } ); diff --git a/client/components/themes-list/style.scss b/client/components/themes-list/style.scss index 98913303940d1..5eedb979afe86 100644 --- a/client/components/themes-list/style.scss +++ b/client/components/themes-list/style.scss @@ -21,12 +21,6 @@ margin: auto; } - .pattern-assembler-cta-wrapper { - grid-column: 1/-1; - grid-row-start: 9; - margin: 0 16px 48px; - } - .second-upsell-wrapper { grid-column: 1/-1; grid-row-start: 7; diff --git a/client/components/themes-list/test/__snapshots__/index.jsx.snap b/client/components/themes-list/test/__snapshots__/index.jsx.snap index 495d017f9e5d2..4a20ac28f5b37 100644 --- a/client/components/themes-list/test/__snapshots__/index.jsx.snap +++ b/client/components/themes-list/test/__snapshots__/index.jsx.snap @@ -11,39 +11,6 @@ exports[`ThemesList should render a div with a className of "themes-list" 1`] =
-
-
- Pattern Assembler -
-
-

- Design your own -

-
- Jump right into the editor to design your homepage from scratch. -
- -
-
diff --git a/client/components/themes-list/test/index.jsx b/client/components/themes-list/test/index.jsx index a1c17552ee5e1..0b5bfe40307cb 100644 --- a/client/components/themes-list/test/index.jsx +++ b/client/components/themes-list/test/index.jsx @@ -14,10 +14,6 @@ jest.mock( 'calypso/components/theme', () => ( { theme } ) => (
) ); -jest.mock( 'calypso/data/site-assembler', () => ( { - useIsSiteAssemblerEnabled: () => true, -} ) ); - jest.mock( 'react-redux', () => ( { ...jest.requireActual( 'react-redux' ), useSelector: () => false, diff --git a/client/data/site-assembler/index.ts b/client/data/site-assembler/index.ts deleted file mode 100644 index a5a05e673813a..0000000000000 --- a/client/data/site-assembler/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const useIsSiteAssemblerEnabled = () => { - return false; -}; diff --git a/client/landing/stepper/declarative-flow/internals/steps-repository/design-choices/index.tsx b/client/landing/stepper/declarative-flow/internals/steps-repository/design-choices/index.tsx index e235fdef2cb47..42191506d233d 100644 --- a/client/landing/stepper/declarative-flow/internals/steps-repository/design-choices/index.tsx +++ b/client/landing/stepper/declarative-flow/internals/steps-repository/design-choices/index.tsx @@ -1,8 +1,4 @@ -import { - getAssemblerDesign, - themesIllustrationImage, - assemblerIllustrationV2Image, -} from '@automattic/design-picker'; +import { getAssemblerDesign, themesIllustrationImage } from '@automattic/design-picker'; import { localizeUrl } from '@automattic/i18n-utils'; import { StepContainer } from '@automattic/onboarding'; import { useDispatch, useSelect } from '@wordpress/data'; @@ -10,7 +6,6 @@ import { useTranslate } from 'i18n-calypso'; import { useEffect } from 'react'; import DocumentHead from 'calypso/components/data/document-head'; import FormattedHeader from 'calypso/components/formatted-header'; -import { useIsSiteAssemblerEnabled } from 'calypso/data/site-assembler'; import { recordTracksEvent } from 'calypso/lib/analytics/tracks'; import { preventWidows } from 'calypso/lib/formatting'; import { navigate } from 'calypso/lib/navigate'; @@ -36,9 +31,6 @@ const DesignChoicesStep: Step = ( { navigation, flow, stepName } ) => { ); const { isEligible, isLoading } = useIsBigSkyEligible(); - - const isSiteAssemblerEnabled = useIsSiteAssemblerEnabled(); - const { setSelectedDesign } = useDispatch( ONBOARD_STORE ); useEffect( () => { @@ -87,18 +79,6 @@ const DesignChoicesStep: Step = ( { navigation, flow, stepName } ) => { destination="designSetup" onSelect={ handleSubmit } /> - { isSiteAssemblerEnabled && ( - - ) } { ! isLoading && isEligible && ( { const { shouldLimitGlobalStyles } = useSiteGlobalStylesStatus( site?.ID ); const { data: siteActiveTheme } = useActiveThemeQuery( site?.ID ?? 0, !! site?.ID ); - const isSiteAssemblerEnabled = useIsSiteAssemblerEnabled(); - const isDesignFirstFlow = flow === DESIGN_FIRST_FLOW || queryParams.get( 'flowToReturnTo' ) === DESIGN_FIRST_FLOW; @@ -687,40 +683,6 @@ const UnifiedDesignPickerStep: Step = ( { navigation, flow, stepName } ) => { exitFlow?.( `/theme/${ theme }/${ siteSlug }` ); } - function designYourOwn( design: Design ) { - const shouldGoToAssembler = isAssemblerSupported(); - if ( shouldGoToAssembler ) { - const _selectedDesign = { - ...design, - design_type: 'assembler', - } as Design; - - recordPreviewedDesign( { - flow, - intent, - design: _selectedDesign, - } ); - - setSelectedDesign( _selectedDesign ); - - handleSubmit( { - selectedDesign: _selectedDesign, - selectedSiteCategory: categorization.selections?.join( ',' ), - shouldGoToAssembler, - } ); - } else { - pickDesign( design ); - } - } - - function clickDesignYourOwnTopButton( design: Design ) { - recordTracksEvent( - 'calypso_signup_design_picker_design_your_own_top_button_click', - getDesignEventProps( { flow, intent, design } ) - ); - designYourOwn( design ); - } - function handleSubmit( providedDependencies?: ProvidedDependencies, optionalProps?: object ) { const _selectedDesign = providedDependencies?.selectedDesign as Design; if ( ! isAssemblerDesign( _selectedDesign ) ) { @@ -946,8 +908,6 @@ const UnifiedDesignPickerStep: Step = ( { navigation, flow, stepName } ) => { { shouldLimitGlobalStyles={ shouldLimitGlobalStyles } getBadge={ getBadge } oldHighResImageLoading={ oldHighResImageLoading } - isSiteAssemblerEnabled={ isSiteAssemblerEnabled } siteActiveTheme={ siteActiveTheme?.[ 0 ]?.stylesheet ?? null } showActiveThemeBadge={ intent !== 'build' } isTierFilterEnabled={ isGoalCentricFeature } diff --git a/client/landing/stepper/declarative-flow/site-setup-flow.ts b/client/landing/stepper/declarative-flow/site-setup-flow.ts index 367d3f198f4bc..f7043515c0690 100644 --- a/client/landing/stepper/declarative-flow/site-setup-flow.ts +++ b/client/landing/stepper/declarative-flow/site-setup-flow.ts @@ -5,7 +5,6 @@ import { useSelect, useDispatch } from '@wordpress/data'; import { useEffect } from 'react'; import wpcomRequest from 'wpcom-proxy-request'; import { isTargetSitePlanCompatible } from 'calypso/blocks/importer/util'; -import { useIsSiteAssemblerEnabled } from 'calypso/data/site-assembler'; import { useIsBigSkyEligible } from 'calypso/landing/stepper/hooks/use-is-site-big-sky-eligible'; import { useQuery } from 'calypso/landing/stepper/hooks/use-query'; import { ImporterMainPlatform } from 'calypso/lib/importer/types'; @@ -166,12 +165,8 @@ const siteSetupFlow: Flow = { [] ); - const isSiteAssemblerEnabled = useIsSiteAssemblerEnabled(); - const { isEligible: isBigSkyEligible } = useIsBigSkyEligible(); - - const isDesignChoicesStepEnabled = - ( isAssemblerSupported() && isSiteAssemblerEnabled ) || isBigSkyEligible; + const isDesignChoicesStepEnabled = isBigSkyEligible; const { setPendingAction, resetOnboardStoreWithSkipFlags } = useDispatch( ONBOARD_STORE ); const { setDesignOnSite } = useDispatch( SITE_STORE ); diff --git a/client/my-sites/themes/collections/style.scss b/client/my-sites/themes/collections/style.scss index ceda7cd6773c1..9661ceac4cab5 100644 --- a/client/my-sites/themes/collections/style.scss +++ b/client/my-sites/themes/collections/style.scss @@ -17,10 +17,6 @@ padding-bottom: 88px; } } - - & + .pattern-assembler-cta-wrapper { - margin-top: 48px; - } } } diff --git a/client/my-sites/themes/pattern-assembler-button/index.tsx b/client/my-sites/themes/pattern-assembler-button/index.tsx deleted file mode 100644 index bf4f3cf1c45f2..0000000000000 --- a/client/my-sites/themes/pattern-assembler-button/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Button } from '@automattic/components'; -import { useTranslate } from 'i18n-calypso'; -import { useIsSiteAssemblerEnabled } from 'calypso/data/site-assembler'; -import './style.scss'; - -type Props = { - isPrimary?: boolean; - onClick: () => void; -}; - -export default function PatternAssemblerButton( { isPrimary, onClick }: Props ) { - const translate = useTranslate(); - const isSiteAssemblerEnabled = useIsSiteAssemblerEnabled(); - - if ( ! isSiteAssemblerEnabled ) { - return null; - } - - return ( - - ); -} diff --git a/client/my-sites/themes/pattern-assembler-button/style.scss b/client/my-sites/themes/pattern-assembler-button/style.scss deleted file mode 100644 index 3348be0afbbf9..0000000000000 --- a/client/my-sites/themes/pattern-assembler-button/style.scss +++ /dev/null @@ -1,27 +0,0 @@ -@import "@wordpress/base-styles/breakpoints"; -@import "@wordpress/base-styles/mixins"; - -.theme-showcase .button.themes__pattern-assembler-button { - display: none; - flex-shrink: 0; - min-width: 140px; - padding: 8px 14px; - - @include break-large { - display: block; - } -} - -.is-logged-out { - .theme-showcase .button.themes__pattern-assembler-button { - border-width: 0; - box-shadow: - 0 0 0 0 rgba(38, 19, 19, 0.03), - 0 1px 2px 0 rgba(38, 19, 19, 0.03), - 0 4px 4px 0 rgba(38, 19, 19, 0.03), - 0 9px 5px 0 rgba(38, 19, 19, 0.02), - 0 16px 6px 0 rgba(38, 19, 19, 0), - 0 25px 7px 0 rgba(38, 19, 19, 0); - color: #575d63; - } -} diff --git a/client/my-sites/themes/theme-showcase-header.jsx b/client/my-sites/themes/theme-showcase-header.jsx index f6022adc88e00..8b1345f231e8e 100644 --- a/client/my-sites/themes/theme-showcase-header.jsx +++ b/client/my-sites/themes/theme-showcase-header.jsx @@ -7,7 +7,6 @@ import { preventWidows } from 'calypso/lib/formatting'; import { isUserLoggedIn } from 'calypso/state/current-user/selectors'; import { getSelectedSiteId } from 'calypso/state/ui/selectors'; import InstallThemeButton from './install-theme-button'; -import PatternAssemblerButton from './pattern-assembler-button'; import useThemeShowcaseDescription from './use-theme-showcase-description'; import useThemeShowcaseLoggedOutSeoContent from './use-theme-showcase-logged-out-seo-content'; import useThemeShowcaseTitle from './use-theme-showcase-title'; @@ -19,8 +18,6 @@ export default function ThemeShowcaseHeader( { vertical, isCollectionView = false, noIndex = false, - onPatternAssemblerButtonClick, - isSiteWooExpressOrEcomFreeTrial = false, isSiteECommerceFreeTrial = false, } ) { // eslint-disable-next-line no-shadow @@ -98,9 +95,6 @@ export default function ThemeShowcaseHeader( { ) } > { showInstallThemeButton && } - { isLoggedIn && ! isSiteWooExpressOrEcomFreeTrial && ( - - ) }
) : ( diff --git a/client/my-sites/themes/theme-showcase.jsx b/client/my-sites/themes/theme-showcase.jsx index 97a39ab981c6a..d6cf109681ec7 100644 --- a/client/my-sites/themes/theme-showcase.jsx +++ b/client/my-sites/themes/theme-showcase.jsx @@ -3,7 +3,6 @@ import config from '@automattic/calypso-config'; import { FEATURE_INSTALL_THEMES } from '@automattic/calypso-products'; import page from '@automattic/calypso-router'; import { SelectDropdown } from '@automattic/components'; -import { isAssemblerSupported } from '@automattic/design-picker'; import clsx from 'clsx'; import { localize } from 'i18n-calypso'; import { compact, pickBy } from 'lodash'; @@ -20,7 +19,6 @@ import { SearchThemes, SearchThemesV2 } from 'calypso/components/search-themes'; import ThemeDesignYourOwnModal from 'calypso/components/theme-design-your-own-modal'; import ThemeSiteSelectorModal from 'calypso/components/theme-site-selector-modal'; import { THEME_TIERS } from 'calypso/components/theme-tier/constants'; -import getSiteAssemblerUrl from 'calypso/components/themes-list/get-site-assembler-url'; import { getOptionLabel } from 'calypso/landing/subscriptions/helpers'; import PageViewTracker from 'calypso/lib/analytics/page-view-tracker'; import ActivationModal from 'calypso/my-sites/themes/activation-modal'; @@ -55,9 +53,7 @@ import { localizeThemesPath, isStaticFilter, constructThemeShowcaseUrl, - shouldSelectSite, } from './helpers'; -import PatternAssemblerButton from './pattern-assembler-button'; import ThemeErrors from './theme-errors'; import ThemePreview from './theme-preview'; import ThemeShowcaseHeader from './theme-showcase-header'; @@ -388,40 +384,6 @@ class ThemeShowcase extends Component { this.scrollToSearchInput(); }; - onDesignYourOwnClick = () => { - const { isLoggedIn } = this.props; - - recordTracksEvent( 'calypso_themeshowcase_pattern_assembler_top_button_click', { - is_logged_in: isLoggedIn, - } ); - - this.onDesignYourOwnCallback(); - }; - - onDesignYourOwnCallback = () => { - const { isLoggedIn, siteCount, siteId } = this.props; - - if ( shouldSelectSite( { isLoggedIn, siteCount, siteId } ) ) { - this.setState( { isDesignThemeModalVisible: true } ); - } else { - this.redirectToSiteAssembler(); - } - }; - - redirectToSiteAssembler = ( selectedSite = this.props.site ) => { - const { isLoggedIn, siteEditorUrl } = this.props; - const shouldGoToAssemblerStep = isAssemblerSupported(); - - const destinationUrl = getSiteAssemblerUrl( { - isLoggedIn, - selectedSite, - shouldGoToAssemblerStep, - siteEditorUrl, - } ); - - window.location.assign( destinationUrl ); - }; - shouldShowCollections = () => { const { category, search, filter, isCollectionView, tier } = this.props; @@ -449,10 +411,7 @@ class ThemeShowcase extends Component { return (
- + { this.shouldShowCollections() && ( <> - ); + return ; default: return this.allThemes( { themeProps } ); } @@ -692,8 +646,6 @@ class ThemeShowcase extends Component { vertical={ this.props.vertical } isCollectionView={ isCollectionView } noIndex={ isCollectionView } - onPatternAssemblerButtonClick={ this.onDesignYourOwnClick } - isSiteWooExpressOrEcomFreeTrial={ isSiteWooExpressOrEcomFreeTrial } isSiteECommerceFreeTrial={ isSiteECommerceFreeTrial } /> { this.renderSiteAssemblerSelectorModal() } @@ -774,9 +726,6 @@ class ThemeShowcase extends Component { } /> ) } - { ! isLoggedIn && tabFilters && ( - - ) }
diff --git a/config/development.json b/config/development.json index d97288776a6ba..fe4a76a3d33b1 100644 --- a/config/development.json +++ b/config/development.json @@ -174,7 +174,6 @@ "p2/p2-plus": true, "p2-enabled": false, "page/export": true, - "pattern-assembler/v2": true, "performance-profiler/llm": true, "performance-profiler/logged-in": true, "plans/hosting-trial": true, diff --git a/config/horizon.json b/config/horizon.json index 1a86fbd66ccbc..340cc345ab193 100644 --- a/config/horizon.json +++ b/config/horizon.json @@ -104,7 +104,6 @@ "network-connection": true, "p2/p2-plus": true, "p2-enabled": false, - "pattern-assembler/v2": true, "plans/hosting-trial": true, "plans/migration-trial": true, "plans/personal-plan": true, diff --git a/config/production.json b/config/production.json index f102e38b0fc4a..0a302527fb9e8 100644 --- a/config/production.json +++ b/config/production.json @@ -144,7 +144,6 @@ "onboarding/user-on-stepper-hosting": false, "p2/p2-plus": true, "p2-enabled": false, - "pattern-assembler/v2": true, "performance-profiler/llm": true, "performance-profiler/logged-in": true, "plans/hosting-trial": true, diff --git a/config/stage.json b/config/stage.json index 3ccc9318d541e..9820fa9b4e0ad 100644 --- a/config/stage.json +++ b/config/stage.json @@ -142,7 +142,6 @@ "p2/p2-plus": true, "p2-enabled": true, "page/export": true, - "pattern-assembler/v2": true, "performance-profiler/llm": true, "performance-profiler/logged-in": true, "plans/hosting-trial": true, diff --git a/config/wpcalypso.json b/config/wpcalypso.json index fa4e57ed90fcb..6e73d85c4f967 100644 --- a/config/wpcalypso.json +++ b/config/wpcalypso.json @@ -139,7 +139,6 @@ "onboarding/user-on-stepper-hosting": true, "p2/p2-plus": true, "p2-enabled": false, - "pattern-assembler/v2": true, "performance-profiler/llm": true, "performance-profiler/logged-in": true, "plans/hosting-trial": true, diff --git a/packages/block-renderer/src/hooks/use-rendered-patterns.ts b/packages/block-renderer/src/hooks/use-rendered-patterns.ts index 3dcb615cd5cde..132487a3978d3 100644 --- a/packages/block-renderer/src/hooks/use-rendered-patterns.ts +++ b/packages/block-renderer/src/hooks/use-rendered-patterns.ts @@ -1,11 +1,8 @@ -import { isEnabled } from '@automattic/calypso-config'; import { useLocale } from '@automattic/i18n-utils'; import { useQueries } from '@tanstack/react-query'; import wpcomRequest from 'wpcom-proxy-request'; import type { RenderedPattern, RenderedPatterns, SiteInfo } from '../types'; -const CACHE_TIME = isEnabled( 'pattern-assembler/v2' ) ? 0 : 1000 * 60 * 5; // 5 minutes - const fetchRenderedPatterns = ( siteId: number | string, locale: string, @@ -49,7 +46,7 @@ const useRenderedPatterns = ( queryKey: [ 'rendered-patterns', siteId, locale, stylesheet, category, patternIds, siteInfo ], queryFn: () => fetchRenderedPatterns( siteId, locale, stylesheet, category, patternIds, siteInfo ), - staleTime: CACHE_TIME, + staleTime: 0, refetchOnWindowFocus: false, } ) ); diff --git a/packages/data-stores/src/site/actions.ts b/packages/data-stores/src/site/actions.ts index 4f32bbf74b840..94c6cef46d24f 100644 --- a/packages/data-stores/src/site/actions.ts +++ b/packages/data-stores/src/site/actions.ts @@ -1,4 +1,3 @@ -import { isEnabled } from '@automattic/calypso-config'; import { DEFAULT_GLOBAL_STYLES_VARIATION_SLUG } from '@automattic/global-styles/src/constants'; import { __ } from '@wordpress/i18n'; import { SiteGoal } from '../onboard'; @@ -526,10 +525,8 @@ export function createActions( clientCreds: WpcomClientCredentials ) { }, ].filter( Boolean ) as RequestTemplate[]; - const endpointSuffix = isEnabled( 'pattern-assembler/perf-test' ) ? '-perf-test' : ''; - yield wpcomRequest( { - path: `/sites/${ encodeURIComponent( siteSlug ) }/site-assembler${ endpointSuffix }`, + path: `/sites/${ encodeURIComponent( siteSlug ) }/site-assembler`, apiNamespace: 'wpcom/v2', body: { templates, diff --git a/packages/data-stores/src/site/constants.ts b/packages/data-stores/src/site/constants.ts index dcee74ff1e938..ef55a88b7efeb 100644 --- a/packages/data-stores/src/site/constants.ts +++ b/packages/data-stores/src/site/constants.ts @@ -1,8 +1,2 @@ -import { isEnabled } from '@automattic/calypso-config'; - export const STORE_KEY = 'automattic/site'; - -export const getPlaceholderSiteID = () => - isEnabled( 'pattern-assembler/v2' ) - ? '226011606' // assemblerdemo - : '224076220'; // creatio2demo +export const getPlaceholderSiteID = () => '226011606'; // assemblerdemo diff --git a/packages/design-picker/src/components/assets/images/assembler-illustration-v2.png b/packages/design-picker/src/components/assets/images/assembler-illustration-v2.png deleted file mode 100644 index 07a45387827fad34bab606b4102b7902d2702b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47402 zcmdqIWmME{*Ec*vgES)2C<+3S(m99%(%mTnL+8*jAfX_kbPpn3(%k|A0z-F6Gt%Af zpYuGg>%Q*iUhDnve!Abs#ahnHe~#M6j^A(ZJs(w+WC-x6@IW9C!5i6EY9J6A6a)f~ z<6r@wbacapKp;5i%_~U_52HU#p5LEpHtkxuzPjCS-|!d${&8M(hObv;2Y}Ms&1>Jj zIDfUD`N4=}^`Zp*>+jYTIQ&B(;+G13Co}+oP|@JV(S#5nf?rCie)uINsR`EnrKzHF zxOJ_|)>1doQ!yyyt-bA{wBy^{^1eoDAHacfwp<;go<4sz zovN5F>PZaO>F9&6{q?OZ{j#^6VK~srH|WT(-qO7#cnsrvJP4t`CfLx5-qA=Nfmc)h z*C!8=^-s`~JC=aak@mshV)_3ij|$Kc#a`}awRZDcj@Puiqe|`)-*LMLVg}hQ_@2@t4Bh8oNdD#GeXL6D`AOnt$60FAj4Y$lVnXqAMJeEfiF<9k zd@Z443$mzV$Lq9R4bF+6h-om@9&95sGz3-JA})IP>&4P`%|c1K3w|%X*G49nd2g&E zQWBe>z_N&M9`1Janho0*iOSPoZ_*co0auc!5}>bfZC9CmK!1L}3e1~Y##U1MR+fR9 z1<(#UC85<=$>Yd4eCYN^dZxRt|8#1jU!Xghf${}+Y~+CvONn3$PmtB&TK~QEG%UY=CCyG2u}2GzDo@@)Tm)&z#PFejTExGd1+lyL*ROivjvjb*;|&9w>A6!D zCa;IckOVM$XDvvN(DECP2<(?MsS1-ogzKh`>tilN74w~1ByN~OsEx2H@0$@qg;Iw? zit3xG(avP!3Od?!Aj#ljF-jy2VfQN{^l3oLvLC8LM9x=Y`p}~uq^|Dh(q*OX@cxg9 zu%NA<%e{8rHLbPSw)_tMVDayGFtni8Mkl+Y&)~ zFs>=B&+o|~HGs8~WUwL&_HP{>b1w>1CJ63^8-j|*EW4xEHl8>do&RzzXk;%jdm93_ z^N658aQhYPU~fD2LA&$NsU&2>v|2l($Y(T8V?yd>|7g!W0DBfkO5w~SR<`_73jNS4 z(IdUH_8H4rQ{7he-;dixZh@f1iwXrI-?*Rmzrt^>fO#9AG3s7lRc5)pz>B;g_~(Ey z$Vh9M=u<>oL!5E6R{OR!c?XR5p*6jIZ6Rq4e78E<<%AzQNQw}z_25kh}2?|Pq z#JN0gHk(lkAoL*uCp8<=H-s7@ zfS|X2K<)VCs@+&z&0&ofTpoqtLs_KBkw*>*DOtUG0VA^Cc}H8;mQD(HvRqWWo=N1| z|AddHccCM_C@68bvQEDg&$1a%s z@M(_Z?=Ie9gfpO;9Suf4o24(SE7#1hFaoBjipg82St+4DrNYv;B#ehYvFD%1YdJ3z zfD~F;mD+A#;Xzd8mSI);1yp<--?7d6DRTC3n5Kzp4#c~~Fnzv_ofmuKv(tI3ieWci z8KL%V%y-usZsbS5So=*QPU~rXni?NqWSWo>A}Ap=PqWwg8^7t6tx81ZaF!&(jc(1_QrC5qgNp*-1aFtyClRNo97H89FqLgLK2`5^rO^#6 z#L$Ql1Ny6_cdH!QCF-RHx{%Qn^C`>;0u0fdSIq=yKOFlKvD>}AYw@JxSdQa~xVB!98`})vO6O;lmO>Y0-6aFON$0RC3qb5IX>nxz5A+Goa0-s}Q_=PK`g_E`y{z(k28rQ67S|Z_0PD@&tuN7D zTy$&ADIb`kT*%K7n2~9(R6LyZbz!UQa9QhgisqOVL6B`^|9*Un2)xB7sBX*g&1ylo z(XDPJt-6jURp^4H9t<7LJbI@or?}M&$%Qvc!Cz^-cw{S|93u=bYc!-@l+mq9x4(-q z8en$!LcIX(LTbfA>Dy_0LFVFQx-s!O^N%4e$NVxtOyYe2*YX`yEp5LOyOzIw$i16q zV@ogOHuzkJK>`ksO$A+!q+HRFXY82qddKNc_}=`)U3PE8gIX(VVe-bmu~EY=(P>s9 z)ZZz1M1bPfU=CKg3latJ5a-&05}PrOoaqf?0Y)KHsny`aBPgM>rsIgjsg}Tg|B%PR z6+X28r-Y55QYCE5Tu^Y_OUw&AAixSXqZkK-&phn$adwtk# z=1I>;)^u+2{HqS|^4eb>1`P>^K^o(vL`bseLB-nWi6w40Q0<$m69-_uXfG#ggBQp3 zrNRaq7g*oRXj?Xa+1OTU%@i#8R~fveKgs6Ek;>K+&;(*|79sR}1Vb-dNMGo!r#D&l z%atI4G4xm@zn<}SkAOi+ZGYUI^ksyDr`kk zuBwZ&UT=L?43%##2j=;jL@H>Lecqv(-Uql?`gNW_K*Hd?q12pVur0xdMt;06ST`nV zH8ZB-|BAMW{_ijuUm?kM2rV*G04d(i>eoS~V7J`_WFIsGtn+x8Gf#xZ$_7KwYwYtD zKz5b9$#AWvwkkE+W>>;cv$vr@grr2OeZob6P0R1)Dy0cSeGBh_Q*o;c2(E`@Pt5q5 z^0y1WPp|_qb_9y1cPwU=z3-QC2Vmj+jX)IIdSHeIh1RCW6^9H)HyJBB$aPfZ=I><9 z8=tFS&W(F4oDo1-I>o-E@;eLCEZ@cTztKcUZ21aP()(dYg4q0x?!Y^{7% zljr^e3p%X;H2*)4*D@Lur?z(_SJ?SLeK=-5Sz{I&#%7yx}^ z-%RVdpIe+f{RC98MNDV*6kX5zjtE44r2AVOs??AeP?Zv$YZCy55?N_Exnlm$bG_aM zu~XO~A2xiVOX59A(8+1Mn9SQB^+2D75$xsr{Y2%h8yOh?1Do4iA`4q0w1(T5TU472 z$oQ=ZpiSTQv3SvBMGlI{mllnibwy|;Jk1ktH>S5(L;#E#^r?YPM}1}iwNHAA+hEzx zg@C<*fp`H_4M4tY05o#^1#9olr*8^DeYv}yyJz*}|G$2O4%!})p(oflZMpRo+{(); zB6OWFbPpC-@EQ4=j8+`?vXur=75-K(GKFWULsh6W@2V;?^BudnIyMT7hQny%1-2l4mNF$FB%zZq(B5B%@xG++Ef zaLcWk(39`x*VXEO2dVgr^cE!jdoqBp{9iZO=qcQ7yJ{i?pqYGk%=~ZheyN=>a+@-L zztb_ElV1w9ySX~wmpVjB5e2XICFuJy%*)S@SbIurZe&Ff0t9a!ao{)9e7Qrt)}JDf zH(SmWcxHb{TN;1*{>&F^cx}P|7I9fNR(C;#w69x@cLaDTmdq`N1R6+BqPvGVgC<8I zNsWCc1%y0%${fZDhdF;-`r{kgP?S_K;xj%QnEvnf5w@qVKfe!sG z%(y1=;{V)uf0$*uC)2!R0Mm~v=u3c(o_4_35`UUPDyD%*7*Tt3fm&8HcYy&EKG^ec zO|x)!YO(%LJ*tExF-Iwls-*UJn4mHxN}BO*VjqgTXh(&`TWCm$l*R#rk(s>nIbqaf z$BjTbW~}4LKp~ko-}RT{(EV8t7PC1hBm`W1xOk{_{hTm+$W?;;KSav-qdoW@Be81- z$?xzthC)bN>kaw&-p?YtjfcPMhiY-RECx}nB(^ZAT!rYa>NyNGbiMV=(=6I5FNp@) zECQ%OOXd$4ZNHhjNV?y}rpNr%Bj+QTPke~|%fi819iJ8g=v)lgE{GV>pU9n6U$9J! zfGuM^lC_30QqaJbQ}sImpF#V`v35}=Af;D!21W${0Q0{1s!>_4p5q7iT{sNF?Qb_= z)Icx=R`U^;Rx1S&`QsnUbPv&UkHd2oe%a4?O9N_g`VK<q#e@s>))h8W8*}(XuX90cOu0+ZjGSisXoGWF;JD928Mh_aODuMLuF8@k;k)`Lm zQx&-@TXXyK$Qn4sDxqHCY2FOrrGX&I_{tD$_f=W|Y^Tof47*ZmC}J=SYTX zdjK5apY!X5dD^_O{mbo9F^z{ve$EgyUNq#;MSZ=R=Y~Od`#DtLNC+FbQ8yR)zUx%R zQB=#07DZ(s0hmN2u&E$$u@QGXyo(?;g_vboT}kMvTNq?odA*$h zgpUnv4IFo077{K3WB)fFOxSK@-l7#1k4;bw-X(D<}Ix z#qy4GwIL}k+eadkxX)m02R6c_CI{55HrxCPRLCMXbKs)*F_CBczvT^^NLMZ3R9_*7nnqHwz?qZYO@l?+Yf)dHko|j9#5RmzjnEy+? zXM_yns6`>idVZ`;;o*>bW2$OehI{2aa;(VR7R!4avo;hw{xR4cw)y!g^zuh1H{Q(*aw*}mv2 z`8TJ5v2uItZYYdEhV9_gqS8nmfJ1*BdIcWu&YrvEabq?}p@hP)3~MxXo^!y1Mcqj` zYs))ZQmV?B4YK^g1VSy|g@+7rzB))xT_(Vl3LgHLr{rH*o0D=`D=djz^HZ)T*{W={ zDX|Gapc#hS|EEKA*=qTT|ijUoZuWmSrEgPuR*5w8KK z66TER?wZdIJ~V~mBAoye>bd(fvzl@jxl5RlEgTHT`aXAGw$EP~MG9)TF{l~wG;#Uc z%}?WG(%+xU3%xi%Ghv)_9TkLq+oq9{sR2dMuQrBeX!ttlbP1^!gqRCa`8=4+y+~4- zOQFK5><|CE$aY&%S=U08MecmQ<>6O1^21$fb6Kk-W_;hPlAcS0Svz{s=VzEkOJ5er zzx}D609I9Ol|-^Yu3wZrSTC&uUhVlAJsBh!-3p7-58U#~8qKJ)zuNgE{nKz@Z0m*o zT*$(5ecO}{5SgsCu_{TvPQNj6`I-XnLQ!qWsBTW$r@9nE-S?!cH&3F<0N)Q>v)vOX zx^17xZpNc)d%jOfhG;c!kl}hwxq1`5Y3X_Y)3f12(cjaXS4~jutYIZuHQ476;6u}} zClq!&WvO<=wzV8n?R~IA!dO34kuGGEc@(EmIiE`(3JY~H{~b&th&{txrpnDzo>sMO zgcQD_^_kL}dlx&r$@FkFGo(FlOv2~bZH1|$dJZ4(@Z3Wnc4eFDVW=->J*BX=%x$L* zI#tGL+0`FvWIZ$bG|r>$ybB^9_1A{i#LhoG6onL4vRvKKUljtL^7^42kk#Fy`7gIO zE)Bx;$>-M=lsDTavM35feQo3A!@xYuN)qS!SI9rJrv_XDkPo(X`^hKes!0#P=Kqcc z>Paj4P;TB8T6b%3A%vKmAO7V`T#f**=_PR&5^4UvLK-muNzW6ZC!0O~`$l+Wl!1c5 ze}>%tA@%>o(~JQS4nP8$5)zSgg#SW3W{*MBvkf~`t`gP4+Q#V9HlAY=`zLV3u$726L>*M7AtD*A$D_XAQ%7OBt`Mb+3^431b{sqiFI=tF1ff$3u zn**1Mf%v>uRB|`3IlyNMTg>km%$DT;($_N>#kw~>I+s6u3FctnWscg_O^>(6-Ww&DA7=roHMYQmfPEd?4Ivm&B3PoJCtO-@I4X&pkP%VWhHrt#jEP^XTe= z%(SC82CKBDNc@fuUg%?05>_sCy?80Oe)zuETXpHT!xM^P?v|6O;73<`5(1Fo)3n@U z7eDIuI&6H_nj*jd7*!whGVy9maI<^Ml?Q0dpTLOd{A>K-~7J#R>E+#QlK7};m@K>c$jgLFspx>_xF?E9J> zT`%;lqjuNJd(2lZINiI*6ya0&_q941tY!`@&!(f9M^`@UZ8N7~epT)|r!|}J=U?<~ z$^3JVGxwVsSP8eL3#oRjz+-maa=yrrfpUN%{e3OTHWB8!Sp{3}CE9@L7Tv@HP`vVD z?hIm|ZYngbS7U8HS!)r;_jMkZTEHHMTIzdIb(LR7NZZ0L-M>X!wX@Wq{{A9sK|=b% zzsT*l@0K%2NSm-8SASgPE~B8SeJ7LY&ZtnwN$-veUG1PMWeMVO4lj?WT zzOPif{Z}b3&o=$wMB;5&MZJAxrTz7VqyV`M zG*~wwnCqPFeJ^_bpb#HQ3*BBm4R##$$3s2%g=1sn>!eV56S4ZJ$Y;!2hEt5T-6{je z^dweN;BBAv(|>J6s<>r4kT`NmI4I+)#Y*^r@Hmxfw=HFR)Qvojzo59SL5mwQV)DNZ zbLScM^>iwHdJ>`6Hk?6wT|9-f#U4*>4Qecqij(CbUw{iPs_%tsxzrIPn@0d->u&)i z0}{~90_wYei$JQ_(@uBNu}{c!IZh@hLi(j+&O8Wx;YyILR;%qsv_E;U8Xt#-2crP$-K%!OT!&c;j+W!8wvsdtTe5UZLRo?eR_=h{^`e%p6 zYr!qQ8km2joK83n8t+DowA^erJDz5&2RH28$S1xy-QltvFm%!%SLL@kN!1WP9dv3C zvCKB_9kP32(PciadP?g)fLpQtE8?&y!}GGJ%hkRpe7S;lX0Qo0xUVD3(Wh5>_>OkH zU8u{2H8y^i;BeO;k%_s~7EBb3NyLGFxW2G}L|@8mxn+#c487fldK{H8zoqm#qmK%b zq4TXonk|(vrz?zfXW%G{9lHi;gQ~n}3I2W5fcw+I#+3hP@zIk2PJGr~0WcJf*ZLmA z0ul`(AnpZ!+=f4QT`v+UqnUh5{Sih|{R8ug0t(Mz8^)d7w}=cF9g^93pHRLmutv z_@jVCM5HH3{&>?P^&ZOAXtP!kGV0{2geD^7SeA}3jN<3|dw?@S5wj(Bo?L2(GX4S3rKMzVQ#uZnBp#|b@l^GaIt4NOg67LjWnSPWp%OOcL^8_xxJwU2K zV6V<^X5rk2VTSg-ATJ8$ltNiU!4(gRGM7xM&NR4GQ=(KCdMg*cMo4*yk2Zovr%5z{ zgUFt+^dtDUUfp?6CQ<~u|9PC_NWVYcgmT&gZ$q>fAiTx623b$)7m_;79N5&^uQa6{ z6u}IaEUP`07;Wv8Qi1GSa(jttapriHWn$}iKnc4q5pNtr!?sj-bv8e8*q3e58KS#{ zTvfqE&fT`6-N{u9D7<6;b(OftbgzpkjCU0=@|byGTQsVGFoZnvF$;TMB-XSMF%$MD z7Su{L_+4FJ+yqN4sSa+zN;K{d!9o2SSACbu--+jb)7pDe7!4~2PD)$9h;v<1I)YZ< zy*x7u0=ItueJM;NC_J3A?s=-n=9S~zu|RC({b>H{u9U}DpqI{x7`n;5?0qw?J-&bz z$x))c{KZ(O|0@Bc1JWgg7TlwV@)ayiaj4^KC+{9GRg}wDS}fLC(9yCcE8~RiCEvKB zK9zGU^3W>hJm4RO~Nh$^!nh?>>a7q`aVbP`!Lb3=9oL`~+ul%nNT1x0l8 z`M%BY?XYjyr4%opp;P_k@4TQK+(9V8YH*XnLNZ!Xe{pJhaYWq_Auva}gr!1~i2DOx zI2_EH$|b4j+>@N&MU#`Kte*XZ@dr5so1q8HW?0ic7bYfh52=Qy&egsDc(h;cd#)J| zC)~_m5!1Ximm${0(pxCFG17ZCMPkFn2H*vSCI6hSRl&|~40+7NS(i=0y?|FnTpOCvV-7SOk8RGvkW~^l*Il!DdkR?b(O9x zmvlc1RS!2+(m^kuo%7CpnqwcCR&GUO0#1R&{jmuno4{qffaRIaL+X)3n&UsxVx^xg zdDjNbXTO`Ct#c~fhoE=09E_EQ8oJG~|2bHS3Nn-^_r|D9bGvaIZO)kHy!sPl9CXN; zNHbSyHImbPw7y$f$6v1{MH0m)H5Vb*B#8+_do1pf9m8LU ztB1yx4Pl8Y(KXX0eg+(=JNKrselJZcYP6+JqoUOleQkON#%t}>DHi~fg1?jEZZtJ#=vSE=rWw&KI z?3uWJS)TF^*6L}020i$**$d@4;gB2>nq7HRqUA+vV6anO5cUJnhqGFHv4@ujgr{*C$96a z@{dPB0@^nxTZtDMc;4FaF{Zm=Yw)AkzjSJA3B zp*^=FLnZ6t_oym-o=)p=TBdone5T;g#8>Au%BZa(CUrcwc(u$$O?`(lj)96WEzpY< z5h~V)tNz}0PR9jeMxE`m@@>^F${E>PgPne07w{rNtCS8N_*~3`8bKP}DID$`8Izm# zWE^ZBD3G)75pnHm@8wag=Hz^H9FpL zGkoPSHxc6dCyYkn1)S=LiPrA~MAz3#IAQmwM`Y-I8^KD0L6#Kkc;OGkC=5GsLL+u# zXh4xF(>MBG`~jcCtM3r4 z5dg^1$G}J+L}A%O(Ab5nNfvno6p6JIJ@Im!TZi20-ZMejmWn{4Yj47P&)@2grF3W# z8aj_VA}5s{LtO0x#lUGN6uIux=}yP^kP&(l!708*Otm0}XX{v; zT+1HLF*;aS7@*{GdPv*-NwRN0cp@?Jr3K&EwF+V(UN)g+;oNsoEB$$vKBri~(NwVw$L4PMT1y5(c*6Fd9 z2Bv1F$d1^=|ZtQPk!A$Y=(naMS@X9c@+a)z_9(zFSM)DaX zeK74WE&2>-QG@_u3DHw5JD^0hBo@juzL~=sZN?fGsqv^y1Av>{YXR9{WL&^~bK7nq zt~f^Nx-Bx3vJ8;&_LN48i8SoqeM|>E&Y$;vHjhU&)GGceN3y|_wXx;Tu5@01 z_L;M&<3V=o?R@ealq>_onl^B%=#Yw>?O4L=GiGs0zoX@hAKasYmcwba+KQo^0aO$4 z!`F>&1Hmr$J+ddpeTuo~bl_hQZ}wg%seKd1I{r>jDnG$#lz`t}DbZ~~Kd#uazxHQ( zAo8#gi&kdhp~vWH;2=(#;$OZg@NeIwNJyo^VDeUXkpU+>n!o0uc@zA@Y<6$WP$TF~ z-yb%2#bdlrD}kyBvmD!l~+am}6 zF;L~4+}?1Ns&DoSegSZ*K{?JN${)BI&juaNNQCipK!|5qguScfxX&s}L-JJ`3USPX zrE*3yK&lWX83I0aub$6dTS=B3-6uD%FaTJh-fDYE>!z@yi{4I*avZ3ngOlZLH+LH? z)n?p0ccVfWPSD?Y_y(n(30vfbrn(q;UFW&tTIQa-b87ZrXEpO~%Q2#WF=^W~fO1gr z0R~`;K+Yz6Axq~yM>1@KTwDKu)KuYtk7fsTe0La!?QaZF`BXk3o-lk-4*m!`!n5r& z9OuJF2JNC4`KPjEKX8BX(zlg>9!nBjt|Pm=z+ZY-U&g6uKEp0)Y^*neCD@II)gO-L z4gg$*hCbsZbAVXy1hwJ)5=F4u>|&j%OVe*Ywvsf+W6lw&CNPfuN%s2}jCHzyvTU+7 znAX`qJ#8Vr7$!m*P?2mN7WAJwIeu$nmuiGGv?St93peJw{TK$g&5pyoiunT=?*e)H zfexYlk!Jr%64PN%iXRg{AT_ntt+9(4hl8e?NV2rTr2Mqx#ZNW~{v|rOHmnTlVw+8} zu>I+{_AwY)>cPb^^jXRKlHmD!@tE*H0f;(0sntI6&T7)X{Ox;JK&vW`zkf7|ZHt7< z?R8jTDY!A0}>Ir-a$)-K)rsabFdA&Uy^Kcy1` zRpBMtYYbbkZWLGH6c`d!O!^(KUJbAE;aBuU_SPg8^K;m1AFWxeyIAy(7irpS4<}I= zoiD&+cjnN@F>g~Pw5#v=THcK2h9PQA-__4sP`i(ph~f1s=HQ(~wm8gQ=qHPLvedWg z@WW2O(Y|t!0t{zTg8~HcB*d3e!mS1UVy(;T>ILp~V10ApYF(Du?+Peu4joMqBJw#`R}r}9<_ zT&kEQ*{K9ptsr_{qyG}G^mU=$I{$T(aZf^MtyT~NdpYO&q+sFosa$lY&>@w__I}lX zY2FtLebF@`%VPsYm2n@Px|271qcmYsrMl72AJXAi_OOq@zACT`=>N__km7gSh-Ymm zL@SbHP~NenrpEv=1JGgL3}O}W81a@WQvssZs+ceCNCdA$+ zM&^-k6t~_zax*Qx*X8tVVvqLxyg~{1v5T>by1qyoQyRv+EhyOpV#1P#hLI=5K~bvM zP3H56LDI38|GCVElsVhb*Pdu4qsTO#fTUhb>H?|DAG~v)c#AO9>t3^Rrag^J3Ba0I zDJb-(sGi%AA}RWEFWy8^jE_=J%6vL!3X45}YIVl;vQ1iSMy4$C8amVEVf77%v+n4? zu?;h(FSN{Mr=DNvJL>Q!Pbq;6yHU*VMoi;rdiPJq&XdDrc(F=KNVdsg)PqI5Y7Nfy zuY}~zD{?Z$9`uRjv{DTZfwbTj`CSIo1D%RxfW~6Qq(?VQptTOY`@ie(ZN2rNWGJqj+ z` z*8_+i9Db9^kCBn4^`6~dtq>hdbM^c4s@1bl3J%wf&KZ2LPGf4PB*!Tr`P{JLj51B# zwdh$1%S6zG=%uniu#mbx{Z6`Xb;~t5^x(eAecjX4AB2kN6;^y;oV!}-q+WnT$ z;}=Xs|0#hxf??_8>=G_ek1y;x(nrhPc5jiiE!VNI0IrE<4CX|u#NmIP7RVS7enR2c zvp?*FDPNFb4q@jc6YQjme_aPxDlrbK`<-Z8c=e%c`=Brd|I(?)Q!pNkpV6P*dDjisA*jt&~`*wE#>sx-4 zUUMYRF@C4!vTlZDhKqgemit7|J&wjau(kguC92+xhMsejOULnIBdkBJV2m$f89|PM z(N5j&CZr2;FDeMz+)6GS1I^-pRW|;Dd}60pUq~5Nq<}YVvDx+eSz1 zKUYdi$Qe})v~WtpuzKFNN@`%0bPRAEEs@IDX}-WFR6q3)btU1#q+F#o z-riFFO>1Ai-!$yf;`3Y=$P-c?8SZNQyG#YN=YCy(kl@I){vpMHP)2Xu&3Yl*iqL*q zruAD&-YlV{GOmqFOiCyBf$-sRAXD};Obh2B4BrBM24;W{a7QQVsYmv51| z9JjA&up^FzTdt0Op8u}O8P!J7UoJ&OMn>riucRzQ5^+oX{z?BsMu1yv3tJ*Azw^a_s7T3-OKH?onL@Chppkk> zEzgxjZ|v6q36pByq@8zR=+(#kGo41s&d9eS6-6?Z;&aw0yJbHw);4&xRm3s=%)W#1 zja(3KohRf89IFyn$*lK94ouz5zjwL*&joMI8%L&GcEj!@Q^2tVtq+{L>9}@Hbhud3 z(LBiTm6clf&^IWsmLY_&6M@s;@ha|I!qB`doFfZxU{NH^l8SXX=~ic*;2tIZZ>T#EAyyPsm_!& zS5jmqzv&?g>Yj6m@gv&n!EgR+i(Yc4AAXR~YD3<3>}romA(JQAY>~R-#Ee&ry%?sD zk=v`@iMN*xrSw-3we~4?F)rglRVxKOx-sfGM#+J^;D_qlg~xKRUPH4a7qKIeh4AGp zusIY+&}AKVN7ESOUg`A){F00~Djnav=tdPCIfH-td8vuSf+ zLykk@W_tWiCB7rBINt1ZTK!$Qd&RbZv-IiurQoHDX-B_hD1pDQ`zX1+2xkx_g>-S_ z$;$V42SjpW{!5=tdxB;7a%6&^Qe1O|oxfhEPp__fW_Ngn`KHL&YoBOY+{wRpvZU;4 z_FN{YGr~@HP!#suzR1|8O|?wauJ1~R2kEh`D-72o@3nGlVt)AxphWUK)!_hWDrZL;Wnd#qVqpgi9f)xoUx^- zw)@j}6I+&gqKr7n+#d09ox+2VHO9g2ci3qJD1H6pax+${96mt#7NW0KCJMa{V=E1_ zTVMIa-9Pe!8&i(6AFXwj!&)Rel&^FfvyF9mn%}T)t=3r$t&W!y!bnhf;)h=Wbk+i$ z7C`b(#U_Cr59QDzXnVD-YPw7w8dcvOClj(aL;tGj#d-AJ^d@$&wvyQQOwOPLWf87M zuW5>oz7}DI#w!&1+w;EM9M4{znk(%Lhvx#-cD94!eajb|uR49F;$gXb2~&~h9-q1n z4vepDiq^-v_Km`4z8xgwr(FDYd#zhWw4N^(ffTKy(E z8BkRs^I$2~t@n750~#DpB40NKhi0xDGXtaXaBcMi!oPu|ELC2qT#P&5{NbusrE(`w9RWFOpr zmzB+#=VH$h@$5h1!W;mp5is<@!o`fjQ5<_;7?Y(82rZI-e;RtP>8SZqAMA`)z7gHe z3i_^-yNwBj(3smgVBawgfPt-1CH^)r$T>RT*FC@A`e8GxtN*j=b)4Hf?`*U~*PPyi z(MNq$bW-Nd-wu|ajj_1DQTcXZc3IqBCZ`@DKTcz4wB8$`W%VZ8?l{`UepXoPSnyBj zecK@J6Lu5UosP0{yIAWO`3F(P-z46|;r71mE%vY@nZ{dJu$x}#QcUqPtG#fa_)*qQ zc+(}&kt=?kw85X>=Ig_;Hb774y;J3W_S3$hJC@0ws+YbmHuousQVPQxv*dlj9DmUR z=-Kat8}^sv(}0V9oQGTKID+9_>uBW{iepp9mU}F;XxG$V{j}0*GD4J3Zp-C%&`(?( zD{KNk@innEh(w8MQ%SA9(O4G3<7?5=NRf7+MVGKN{j6uNckq<3^yX@L zX*I+5d81Ezce_o?By;0McvPsi(xeD$iA`*UcsyS<=X#Z5nQzhZSyb0~T+1|PP)^@t@9`Z=%(dKR%W?3v4nrz)GL~GWu!aP29C z$7roYC{I8d;*ClyQBo$4{cs>xFD&)yY+4ER)Gq5#Q}>2OF-Mrwj&WnS4vda_cJwf_ z(g>)KIMoSiR~7e~ez{KiGB0vixImZ^DemoXik9SO#5d|MC` zYq8W?C1+`^i%2kWm~l2P9=Y*q6<(KG$DAGmn}evL!(ybPG-kze3|nAx1J2bY!AhI{aCiifaeeS30=T0Qt;r z*?M<-a13W87sfN(@|D^+s{tGf+-5=S^qwA3MD}rDMdjQH$%zNSsH(8%6u+G3m#?d{ zCl?#@`vwo4-`{_%q$dZPzdw==n1#D@gzlj5eCftla+T*EF*7HVak+#ciGJfrm;b3W zwATHFoIzZht;Bv;&1a0%1LqS1uH!e4Xle{`B&K+Ze1A7f9&2lEcT%d`Vt&A>PfU1^ zl?o=?Dr1p}NO_8Ult=~As8GjKi)K>k^;X<6-Jro%C4%9FJmw--iZys9Nn~DE7(5c6 z@q$#LK)fx($e1uN8BeK7X@b$c%lX6o`@OL6&4I_;IWA+>f0)-pdDKz`rA2cO%;*<# zWyzV`ao2HMRpm(c&)DLt#|p+-~JFcJ)JuZ zvqG*QvMU*tiO;5RC8E0f3^@lLxsSx=V643LG!q$M2kW?)=o1WOUR0J25cEinXjsjl zH}7={(%?)4@tYlOVGO*zEYnv{5jE5X5hQ#<4e+4(jBQBN#|kJC^(kGr>fAP+cI_jv zP!d4|QYF-HZXa#mUY~|Ij^6U=$V8U;T`aWMdppqmCx9JlD10gCS^C|ncgeIL)rVc` zpl+kp_<(=bSt&?Vm{wzAy%%h^|0SEmVkafT1UEWb4q*+UjAlZRe$#x!{89lk&zWmP zBbv!^xTDWyZ={~)iyCX$R9E;mkl_7r474od?2kB4D6Z#SV}2HWLz0D}#>;vX|gqf@qF3uI5jPq6lu|#BFo%$tGo;haD%6{>axU!>M;3e(!3wmH_fA zlV+uR!RRgbPpoOMAz22X*XY+7X?x+kZb@n}oq`s^^Z_ZYoQg2NO!y_3-) z$X@)GwYY+zmD0d*p|OadxG98#Qi+Nd2VMbG_++5!c75qD=V*BR1S4Jt$Jz1i0;VE!<}YNy~Ms3LJrB(lWP}(gD36^ zO-xFb0@bDsA|);SvwqinPQr&#Eks1uo^Cj7#lIZ6FO54cW(Mdr(hHM+V?5W(ro~kJb?+;Nt?glr_j&>(=6xLG zX}uz5B95ywv6N8WD%br9zDUN<=b@6@-5P{xa8)suLPDy(Em?$_<4qBIp2h=IFG%C9 zNL_H9S-gn-zQGG8QIp3f;;AvxtrLP46vocFG>`|iq?0%U7|OV#$zlvi(i25sUWEXv z;be$54SI33T4b%0ZAEuFJ;9~Vfx2p~M#FBIrSng!ZXlMmM3rdnAbK|6`lrPpxU(VQ zbZJwbt4$(FYJ(5-?P*UhTOa6W3s+m^i0Cp4h7(Rlik`aUcA+jDF{H5;SEmi#uSX|U z;Tp`lY@0eJiXGN@HBV7*IThl=olmqw-zVy&C#8=fP9;$XUeCJA7}M|=c;ZIUV~-W4 zZh=lB8svMjI*QzXy3ytN|N|zavr(y_CE6uDNuV32yVG}YDwp?2^dhNlc_C*NCnQ@}pOU#p% zN5VKV+pJe;1SMttjYB3%c#K0XlJYqE z6@w>v;d1%%$9!7Gq~*d{ZI1HJ<)#jO2^A<-7}u6Uy!w>+t+JvptSI0ok)$aotu}R%oq9v0yPZ z)@)O7V`7(Gs)!@D?658xq`nxetX^_v_vZ%{?wM58QS*C&BR}s2P2g-AFXGZRiI0ufqKuN`;^-6$qCqZ%MRDjl`gHIna(u z<50(?y{O0nwB*^xLK1|=XT!T zBA2K#U6h1aBhy0U%`=n8RxcOCERZqA4%vKpD~3hucj{W2cwvu#dycV*R{ey&!nb57?smTR=%ZIemQ2>zcmT&SJsYY})N&)N#Fk#EiDWzK-Qr-EofN48cUF zFP$!zgsqR|D#*^m`?b#Dn$4TSd8(u9!U~{p^jF6*qKZ?Ly#4fM;ycjO`+gk8YL8P^ zwzrT&@c&Tp7G6<)al7{bLn+-1h;%nYN=kQwq=a-xm&DK^&Cn?f-BN;-N_Tg6cSxV{ z_nhZl=lu)rwf4RDH$T^ zL*gS=?$Z*&c{6-fz@$upikwBY;N`a&|2g#3_x20!42fm1&z4(1m*!8d<}Zj9^wzvz zyk9Y+{;=u>A0xpCuZgPDEy#rirt|=Gdy7;#4;(6w79reK%ND7{vhVw;Hubq5QO3$g z0kfoPnhb&S0WD0dFWdg6Po^)jA8wysNM`&_#fnOI-l>;AkxgQTzvR|N{uY1Q#qs~J zH|GE+y5Evty{UjBr2liKC76?{*z3Kg*oQBCA{E{i`)eqjH2cZKW~akWGgj}@uDWaP zv$ca`6If8|t#XVA79IMZ)-6+!w9y@1QCln#!Ob6o1b*dEqL`TG*eq2+z|#dS^C?1F zO-p6I8Ci*X+c)R*!r{F%bi~SwrT)`2dx_;mVNa}eu}~XP!(ij!101jK#@m8f`-UzM zEdv2}G?TOl*OBZgNb#s_+BYMe9MNdVOqvEe+Hc-T9==Vms03w9aF`+r%^o?m4 zm_80d9V*Y9T&qqXv+o+p}#kEM;I&(RKMH zAlqzfPg7!MEFzC=0xiC=T})job#v5L8B0Mjwx1<3WovNwv%YDA_~Vm+HB4yw=C#w$ zZ|X8-JVCchU^K2-{o`SZ)~nRu@O%>N?B{)n)n9N1_J0`aV*Lj0iibgWs;v7+oLK*W zT{ExP+$YyL&TD9mPq$t0VKrQWC_O6ju|)z9YDg`S*~t=)>yY%$P(k|Dcc3&P=!WpD zM7PkeX~H?lmA5H+VQ5Kmj7GY>KJ{2qa~hqVA} z1YJG6M|RS?rh{A<+*HCpLabJXa$q06>AL;7I<`~dUHM)Hf+gt>&QUG6UJDjztBEbk zHhB`wXH`!{GmW0bg(qf_JOAQ3F7j~E5x`6CyoC+#5+0NG;;C}H<%RGWH_?%YHh0cj zVxRkKaYqvCrrr7liVV5)F!J!yco#jf&Kpe= zYb&@yuN~&v*2s!AuU=V~T&9ZG_lEwL)``saem|Zeq!_UTC=o<2fpM6op&L?yXyOvi zdXvVQ)j}RcZ9=&F?a3`?$=BV#S+U5xb`|2vI-*J0ceqX;`x<}JvU?08>!(lltG@bb za_&I$m3E~zRAg6$TB;Q1(Y^G(Ig3SmSrAuXx{1=rl+L2PL5j^(0DS$rk+u#SUx{wC zas!A%NdH)`W%=EH2@l=$zpoR}LPqMy9}M83Yf*)vd&BTXZ(*sle|*Q1u3;Z@G(=UC zT-6>pdAH)?8>Of0eO9 zSt$qF@%J7MLvQ1moO&K4nn4$%S>9i~9>3%NTW%7q2z#WS_0+x#=Z{;Ys}MN(W4f*C z88gT%`I&t3gQ#V3phY)d&2_AJvJmzpa$nBQF;T+{$wL`0DfwF)AnmR>FRe`fUysVL>4! z&0-anFT%DZXd3=D897dQIgvlqG3wqIBTFQagR=_;#vYpHz5^S+SL)Y(oa8mnFkz`e z9cYxVN~esTEri-&*(s#I8cXY?Yu(#Wq)8h;iM~~AW1CLGm-`A4VYr5N8=32g2r|ub zS7-Wpi8bUL{t{hKwb7bE3IOR=9z}5SxW6~KtL@EY>`+Yn;;jFl?7+4P0n)hFjDVHU zDZiHdP7BUncvdQ@5<&6_7~K03@FCl0^Z@+6{WKv_N*JH{g7J0`L!pK1+TiVOPgV#0 zi1tH*OY7FeAobK5-#ANrCi|lF8p{$_Ak~ETmc>#RuM*NF1ZftJvjF#MTMn^@$49hvPK<^T9? zwv6jRoHyN+c|}R9B}NaXCQ+!x3A2%>p5wTyzOE^<7w^o+KJnJ0T!LbQ9q^V4P5Hov zs1`>Ld*=V>Yah5VPX;_Sivv=Ang!7{t088SmjNyBJoFhzl7KGTjmXyMzvJP^3$1LK zU{(4-SKDvG388HMOQ?-Oig|W-t((30HuPgQ$lv#h>wG6*L!KeLpV-I{V>5mtX$eyL z)muEyyKuZDPAIKd$*D(lf_L_rs%ZD-^bP_!kuX@!tJNQq5C30-b4P zVrNl)vsgqpVqzamUm6XyLa;BTk#P9~R>|n$O?p62E7Y=SQ9)do$YwDF|F_PjMbaPE zb|2fo6b^=!eIfdMguI0TVH$`c>wqY0-fZt933{OuxnVePSmRwmdzlZcDCSHI5YWsF zvNMYmEVkErhoOxYP-i8_0|7NL(R+sVXr9s7eTfO{B#stZAv;*Z6p2W-CP*~+jyZZD zeLUukQ~vPmDA`(X4H0;yxc194tAe05S7EdJik(Y1nnOR^gA;4PaymtTREBD4BW!D9 z4`j=1rFo{nfMOI7Xc;opV`r8(Jy@(1$w^xiC7yzblz+tnpvOr?GSA)8#}Uag|2KM-pGkkso)JhlxhIy8ckR$N74W*t>Wj=1=D)X zpSb9FnOBL%F~VSS&oDPChlzMlp6lk!a1OWQL4^A`X~N{^XdAw@=&;-RqeX$U+8JnQ6*aMBj%omFWwLpC{Y8BsY&pV{O*7&kn^ zHaw%)$eSQiwUL)dTdJ*JBEM8R$q?e)QtS0l@S}z(LW-U)?zM9}*_%Vr$LcFC^RwT; zBYp5gDHyhpZ=+|^xAmRx4bKWoTeyW#{dxPvbEz`fA)}Svw#!7>zNVnff3Hpc-)nni z?V=B*pW^1f^%V^-FkHF{L<~$Lrzp<5?k;cYRM{u zMR3-8kH(2a$~L!u#c-|y(tC4^g^l!TFdc&c3ikq&gC|N>`G6t z;Cbay_^40(Frs?C5Nve&{?6M zd@fIJ*&7cFfcm>z4#wQ#0iT=}Kuue{z4uZWxH#)OIR(BPFKQOyC-fRTd)_y^RU36zj z1|zxA0h+jb(~#0tu;U|yG+w&Eb-63O!~XyiHxZ7IXP`M~7l%4nfA;tln)K(6SSj|} z?|$;3cl?>ugs*VlgV_`XfG7YiniHo~7{PnU@$X5;C77O3s41JJZ_;SfHNVT6LQ!5E z&^CW=zq<{;!`w$Wht{5Sr>2DW=6W$>=_~@PEFX9R3&Idh+W_zuQkONk*xg%IX<#0u zlqMvl!EXgY;v|z&73)nlX_bSa9VEjJiPqU+NjA+ zyZ)$^k~qmb{2@69tX!W1oBtIi3@0OjuplOifSwqG;67&MlqS0YBd);YHSs*?Pq_Hv zhPbQL5Rf1lnitg~056sW?Gr)ghXQ3uvj}PEeOgt1)@mb^l`t%M2kI=IJO};tl)|fR zWeWv-Idd`bqx<|ee9qp#hV`qz6AEHK<~)`Q5RsZEjl&tdxFyO!8N_-ZgMod6dkAjB zIpP7y^~=Sop*mJF0tT9sD=~M#MNp^S!~<`@Gm`Vqhn>;5DpGb3V!NItx$wd0GJ7Xu zAxmZreV#^vf1sXi_>8X(172F8Plh|%hDHWIljoS$=acV+*TbkCNE5B90?D>Ns#TDJ zz$;dTA+9)+Hwx-?Ii(Xhtb_6eS$5UnGKg@aEQ=_OfSoG;^Vw1whWnjp zi9gnRGrcx@MzjEwvdU_m{7M>u*$WPF)tHL{10C_) zEHGva1ZZJTR$P}k+6lafZ(K)-zI;EbypS`#6HO-a28ff_9iyAqAM;j@nJkUJi#uww zM7f#!rbJ4(CowMUe)KNUU#NLqV2F?>am$cx8$99nvy4ObZQek;7s#+>9J_aZk7v`!)WzK zm0bAuXqEx!Xu^_4p=_z@X{2TroK1%-(|L8>(=a8p+^Syz*68E@3+Z&g z1nhECc!U&EIDXJ9SWfjLi{OSBc(5}nq+tgkP#B#TrYvHx;RxNzTc_pvThYV6=v;iY zM{j~GhhG8T1fgy|!#*O&H;a;gJXPJ#;a$TxYq@Q|qdR)lvK5P9rnJcy!<{mZDks^B z-TDG<88v0`{0Ve)X#(mX3JN;fu6#RRQ=#Qxe(e4WAi2ekcH0UXoj zY2}G4uoLq?E*(#NpOHolm*w7$*8&)XM3}u@qyKHR-nkuX0Ibm)R=-F7Dp*o_tQRB( zdf?BE>E~jMJD!g6!R;+1SC7jg1f}Qt4pbK)1(Qj}DFQHwzg2n z7+f1>q5~*~e8`I?L-FDwbgNatNrhnG{N!j9QFIuih%ggt3;&v9K)wzRROcaN`JfQ< zkh#nH0bi%n_Oi(QqJt*;bKX%u;hmVcvTrLwnDZ6&3UJ~@ zHd1hYHIZhkcieaN{OUL4-E|*fR^g~5qFCd!#}V1D4s~MH4Y&o>fAH+IpyoCwf?sd)0kRgp)nYDQ zmK6Uay9O_Q<)vcAf*E90qrjwXIeJ^j1(H$dLiOCcrbO9VtffWti@$+C#4?T98;h4* zBKddtpHYpQ!roAxCaf5&Fyt`{S@LKq2%Q2c<&tQMxZ&NUqD0z65o@_$ruauDj~-m` z|96tpDv07Lf?CoEAgu%S*l0uEK(foFqsvCsAg*Q`L`I3!JVYubWrSJVKzPHlj)$h*L|JAt?&#fhkS zmu^Tx%Ib#)YHWMZPD9Zwp^B8$YbQf5|Yg*r=&(u|i`K#F`LTR^Mwzk@9+wB!~ z$PFIUWQ1ygb%Og6b1hsh?Jm7je|Sz@t;&L3H5R}P#4S9ct&hL^iF;KLVf-9FeHGkB zod%u$$Z01&xBg8W+!TU2_nCbug4;-WSiyMbv2QW>tw!5KLF*V1IML`cS3jsVvH+wi z8I6CqklwG{wqti4iv@HBI;UZ2#6qYjJMUbF75Z8@lnd-;AgmIzPp>JWFI!OsEN{im zOtKJdhc-*7Bn)i}_{6a4Bu*#E(||^hB1(CaqV4+1C0=+^ZR2WS`(xGh^tHZtp|ty$ zx)0O$9gXe_4P^O}H67{O9KK6>9lb%HPKFLK?jFpE2 zZHwoBC12&uWe|Es=H+rFL2y4Ve!Puni-Rj_tZs@V@k0;T0$9G2_gx>`8og+$&mg9Q z*Wv}3ShtC(i$!{ve6JOyH9~sH^HqzOe+Awng0kVe$a)E+J_u_TNrM4mEP#icFN>}- z#-cIZWm~(p4fL>)<@Ydlno_D*B=^S_K5FVZfdze%AecBHQIBG=)Gd*-2OKx;7Vd)eE*r$QjBO`b7?*CC2W~G)J%|4?f<~ zuNlJR9WH*-O3nJ|g@s)2OtW3|>eISE!p9$Uvc@H4G$Dw3K>wq0NEf6etMHvoT#wz%8R@N9JS8Uj7{&dA7&TNHRXNtcT;yRh&zXEg_KYUnzPu7@ zM*f$4e99k-zdXIYOPOUcEm?f#sG;;2=yF%vxa5<$SHCUkiiU&ynVjc(N9lOp3xnu1 zGOP=b57hD9x$v;`e&G2A|0|>|Cy}7Jp!mks5Ae08S0h9+JaRbmY0(ExYjG3^!p975`iz|3 zQWd0n{(@P`#Y-5VvB3OS>dRBPa~~=oW+hEPjVpN`5@~5r59C>ty=A~8{&hwMMX&_b zr1&9V$qek0J2?w{Hb$lFAxN9>vQ+SNF`6FK$p!#j4`^%7PO)W43WQrMF$Iw3rsN^U zS>h2sCa)kMvU-1SM7%^Ui#&GUx>K2DnFxmgXGXBfq(i@WU2B)+X9fHMXsH??f2JCN6x*n;c*EUf&q}g*~GjG!L^DW@y!ON z;Zjqc=LJYTbj4Qyab6Ppg{DyWtsx1;b8o@=x-13TWR8HNVrn~1brN~~mJ8k71P>pw z9U|LAYH6<}Xt45?{lOK^uPUeEDIV~uG2C1LKYkl9%Q`E$qxp_6FQ(DeHoS<>to1V@ zZy^)16XM5|BPGa0d`HKJk{_M-Dm@xU@?%)mU zCoA}{qn-|PWPd(VGAt9NZ(IQ2qcJ}qkfZHpB9?>DH?e;HTGVKBQ1i`{AHYe; zR>b?3v6D3k5X*#xQ_X=|$kqt`GGlK}zlY}}W5UwO;yJR_o*b_uu2VOn#qPYsMs~Q@ zJg?-yhoIbM=DwWaaM$=+?C*LUjoRQ7o)Q;F6N_iJ0%`@M257N=`CIsyaP#Ws3g`MS z>8`7mc$P+q{tnLoCtces>w13tECh2H*ucT{gqKB8&8`9NP16RK_z&}%kk`ZC{c_FL zhhgT$SULekHF{kIEW$3OsSmrM=KVDG+uOLX=Abw;PXO+ z%XjlM<$pe(DJJq9vX?Vnq!9n@5Ydp>5dl9(&NJOW+9~Rdj)dmcCXxQxu7*0-Wqdd z*;BKzZ5+xJmjEX_Lu}eJxbF=TEUoBjYk1p<+)y_#-LMI0u+ODx_~prTY?mR>zwG1S zJx%RZDDfAfF`!kk66syjQ3mPfWR;A?Lb#{aKa&`3%`EgjOG3&NLpI0vh}@ld=%0qE z*wQqJvTFoO{{Xg^x`3Kf-!e`8Hx=3S5ZQM0P(Psq@VDqnCNVX3p(fnFvL-%2-cI6; zSQaI$3KD5fm_pJQAPAbQNP4*skHlt3PoLl1FYnc?S7o1FPW{23jb6#;zwaxE>*c<_c* z?e0}LtKdfgH<3e#!PBYxMSBdyKFD57xShD?lK8Ki&}gL z$DZ}wQ1*a7V%yG!e~c=-u2THxN(PrM?|{&(RgvSIftQqgDXf;3p39zlDtA$F46v z;^fUa1ePZUjG?99c(yL2Y5+owN^0=Nuc;K!fJTQoH}?;jxwnz!g_{ZdhU-v`1X18> zHF2V1*9j-GARgF_1%w!<=*9w&L2(X4uyy5E4xXdd$Q?}SAlIy@-%n&ofv{wkuaz?k ze!8<8TIR1Lj@Tafrrb$SIr+o7Le-*F8FajSamYHGXeTEd_&1#ikUN?t$|Lv360PP+ zZ)#U++qb8|0rAI`Y=}>KnFHl%Qsch1cmWTf!(3H#)jyLvi|^)Jla+fmJhD>3BP)Dx zXv2RLJkA;{;vl~%l^Acw_=Rw?+(!JYZGN#r*3I*%r-Y>zsLlkW z-lnXVlPiL??UICurenTL_w8jxF@h++i+FTBiKgQT;w#4+011;U=w;J>J&kI>S~f+) z4s=3wJps)`lIsdPdAsxt2+Bj=t_l9qBdkjBcS7Q0Y^fF|bkMs9_fQk$VDhD1Z`%np z+{;Hey4)HdF~9fmBpn!1o1HRGkJYArbwjRNVk&8se4zG0;#mvaHqp|D6p!`1ojH{c8BrZ4G%s2o*twfm1FmM$f zd_jKZDy}J{`CudR@Oo$LD+k-5ytw8=ol5wqnpL1}^Zz|A-ZRsERg{L^4H;xDE>!~_ z%(w(`ra%(@LNs0Hvhak_SawPKL7gRFf{*TZzpN2kELO5fneJg#riraa-p~0N4DS7n z6{sV7Mv*KibDY31nIv5y%@Op)I!sCPvCbF#has1w$iyU}JSW+@O7b-YbMJ4nRr2{z@G3=9id|gG(l%h1-SlpiylV-?& za`>-Ajar;kp|?U`5!UlA$`wH$hb}HN+Oh8|+Rru=|9{<3j!zko*6|bWSQMGjij)3H zh{iV;{CFR~l(p-ZCQo{C7wz47dX=oMZH4BIu5B?7x{l2`F05ZDLwI@OX*D2D#rMx4 zbCH-Rb?M5GIsV$uC_}O0M?H970dTcG9$LjvOM45tg zb=5=dY0b9fcE5+4(95A)zuk9tlzkow*o2x{APmCDF$ijuaTlomh!>`qt7^+smFa!! zr*0pSb^d|psy37+<)r@O2=;i7t%!a@M@EQJVo`%=68YyO*~y8|-&R9i2Uua2|}NF^*X^iI~08U~2gA0#yvBmJ{YkPw*m`^y&-M2u$R$6i;L?oR(eHR4pg( zATp2Jr6D#h%n)47=q_zgz4I?a*m9>JZi=biX0mQ8Dj|CiAE|$Zu|9QB87Sl>0Wos1S@i|nR0~*&;N=VhYKtr}qO8QJ)jQYav-}WgZ_V7QgJ|hx+Z~!FVaoui zQyl60@@4;Cqw~20B$R+iTZM1hskKq#d5@yib!-=u5`e-BT90nhT4Bq#!aA^+K2Y2| zaf7wgYovN4l`64CfI#3$CD)RoO;5eP0G6^F(9bv}EgjZ0r%@*%+x9EuP&ZhdW8} z06DEHbEATm9UdRMD17J+Ip?S47Y;Zkh`xMZBpt(b9gJK#Qc74aP=c+9*O@mdGnP|X zWyK^vQK5uVwb9wjm&iXX4y8O3viWHStNJUL$ctG~YFw#*h`*Y2oEw3U3kJqiyMT$OX<;ltkHM5Z~8Fb&rndEH=926=cH|1H^;=~< z^-?B-NuSK2C8@Rg>;kKvD@Rsqca_RKo3$Cp2qml^kxL_fkl^e?VqptUTiip`z4cA; zCvomDufkg`%~a5bhR=;0L{BVFU2H~Aq|r9QUv`a<%n8Z_NO)={z9V|W;fCK)L+2#( zREaVHJhYpg!C0{u5G8Tv4FDblLk`58ko&oazTBr>Xt4%#r#_{0x(M&Z%&(%m#{@kp zZzCz;%;oZ}jPtvTl7dZIl&$axqK)7yr$Meuqq$gZZ1y&cst7#U1mTUcMTy|Ik-r05 zo&En}jJ(~2JRD&6dcZ^k>1PlNmr;7fLvT%zX5JuA4IH9qN zAg{*dmGl)%MdRQex~m)^s4SA_mB?dk*OwOOF4l5Y2-VRgSCfiMew)9xJ8RHNPar*5 zZR(i7T17MSZd-@D*S)|%aeve4(29LTjEl2vEx1b0d7Yke_%|_v75roP$ zm~olu;P6Td+(^?J-CVGI228@HnSialF>cJmzTh|>bs`{&*``vN+8hlx z^q7^cy9-%g`ti~;X%At%^#eg}@#7r-!(q}J8XLI~%wJL^AIPA6ln;;7F-={kO2Amx z!q63W(F7iJedr3tf}@jTtmw|)A5n-g-VN~BEJj1I*}Q9nBORYYiI)E<#$g`o$LOup zh(L$b_}`N(&Gyk1c%^fyxheA|liI4xK{2i=0v~PTjvcLv+7i#|muu}?eU#o2&#e}X za*XK&?GQF%@TcU%P`mQ94OSVh@&IzR+!Wg>D55qvQS80X&pe4^pUj2|n`{+xrPDt_ zI=l6ed42+ocu!I8*53E@QB$sEB8vOcIg z@viLq-+~+P5X+=VZJmV*4Bz|E!7~zjG3aWQHT%BZYYA^0L&uNgri37#q{8Jk;1?SzPh*^6@Ms#?Q7UHbiXG?Z;U)Zm;HLvpd6pEllQZctoK0TLl z!uKDd^-K67{1`L%)Ht^zNXux!h z{T!le&dJBwU@?I?mJPN-FD5f3=jm8mm>+6W%8;!%e4xagLZoPwFX2#@w8-dqM+-ET)VW)x zdu*AZHHbPQ@2?A4SCtFKSA*|^5j6clq;?`g1geD)XVbF2>QxC(1jE%=IYJ+ zKtnl<_((=eZ*Vc%DAVsSL&kwRKYG)Lqq>juJhI)Q_P*@uv>_PtiGQhBr)+I7RVMZlF+exT@ctXg35Pn-wty&0f z)!4a5lAPt5l3DOMR6w-*9b~CwZZ1*ox`1DAcHT~_q|OzYMs3LSl#cSnSW^LfVr6~c zsDD0qdX?hsSmv;+Od9Qx8Kz^Q4Mc0katXsS_ z=MtHaHHY7vcX=ACMcq@8{lc0ptJ4bf)?W80R%;y~3hIJuwuN1dBXX!JV5Ydj8nx#SJ=Sl=%V;$Y zY)~4IpP7DtF!F?+4%|vi5jbqV+i!I_nJSW+pqH3@<~6`4kg#KMEM37qPq|`2)`N1( z>z;!)Yk|2fZTZnu_rf|?%8T+7UQ1}a*3zujJzzefdZA(uHWg{os0%Fu=B=;4ltybS z^FKvtIOWb~C6{~<1zhMmdoWhlzBM)BB%_8h_-#HEgrG-g%qfVFNJqnsmrBU zB3r0ZqqMXwn3SW`$nfMd)MAX)zejBhc*@czC>xin{4nvbw>8b*wN@z~ow6UMwQi=} z#pOe%zP&sC!A`)X2~^ssvJ1A06SX$9+Xs;UmSrC7bvA>te4TPMQJ;5DSTtLSQ*oQC9>ESk@vcT?pRqGqlR5i$_mt(?n$w zxVa=-;yJD93+ z-`TLK&a6+_0w388kX2D1WNcs!)=~%AqY}&Y7OVSnnsb=|W z+L#E?wN5S55oSk}hNKS;LX@2g9`9fQ&vaj`zCEp=Nq;^qO>0WV6rO}+7UNQJNe+lL z-&(3Sp6!}QvTLd+D1s25D8iQsQRXTJ%2Hj+L5qdE`8S>`-=1JwaRy81Z~R|U`?q8p zmaCDjvbIT#q=!!5DHsMtxV|Lq>KQ@0C*{vCeo|JFbF9YHQ$5ggr+#AeyQMW`8fN*m zA(-)Kt5cS5D`XXsa{uStH%dCzuDGns=>)*^;S76qI}cjDYcvx@|(;rzr$y<30!D?O8@`@+wxKp zT0}YR+Gw($iGC+oq+CDso}EUd) zkdsKi4?W^v_EnS~&TjWe)x{9ZB949_ry81Z}>1yULDV2whwx42-KJf;pIui2UI zC%JJdM_erFF8{KDC&Bo+ea$uITTBOHtJzV5Nt-dX02OwU*f z-w