From c4b7c2b90050acf48e28bb36c5525b1af175efa8 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 12:02:44 -0400 Subject: [PATCH 01/18] Add auth analytics --- app/src/lib/auth/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/lib/auth/index.ts b/app/src/lib/auth/index.ts index b09a60c3b..034608ee8 100644 --- a/app/src/lib/auth/index.ts +++ b/app/src/lib/auth/index.ts @@ -1,4 +1,5 @@ import { makeAutoObservable } from 'mobx'; +import { sendAnalytics } from '../utils'; import { APP_SCHEMA, MainChannels } from '/common/constants'; import { UserMetadata } from '/common/models/settings'; import supabase from '/common/supabase'; @@ -56,13 +57,14 @@ export class AuthManager { } window.api.invoke(MainChannels.OPEN_EXTERNAL_WINDOW, data.url); + sendAnalytics('sign in', { provider }); } signOut() { if (!supabase) { throw new Error('No backend connected'); } - + sendAnalytics('sign out'); supabase.auth.signOut(); window.api.invoke(MainChannels.SIGN_OUT); } From 08ab1e488786655c3d4604b71cbc0f1df23e900e Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 12:19:12 -0400 Subject: [PATCH 02/18] Track create and delete --- app/src/lib/projects/index.ts | 2 ++ .../projects/ProjectsTab/Create/index.tsx | 9 +++++++++ app/src/routes/projects/helpers.ts | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/app/src/lib/projects/index.ts b/app/src/lib/projects/index.ts index aa24fba53..c53e332d3 100644 --- a/app/src/lib/projects/index.ts +++ b/app/src/lib/projects/index.ts @@ -1,5 +1,6 @@ import { makeAutoObservable } from 'mobx'; import { nanoid } from 'nanoid'; +import { sendAnalytics } from '../utils'; import { MainChannels } from '/common/constants'; import { Project } from '/common/models/project'; import { AppState, ProjectsCache } from '/common/models/settings'; @@ -71,6 +72,7 @@ export class ProjectsManager { this.project = null; } this.projects = this.projectList.filter((p) => p.id !== project.id); + sendAnalytics('delete project', { url: project.url }); } get project() { diff --git a/app/src/routes/projects/ProjectsTab/Create/index.tsx b/app/src/routes/projects/ProjectsTab/Create/index.tsx index cf474e99a..9fa8912ef 100644 --- a/app/src/routes/projects/ProjectsTab/Create/index.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/index.tsx @@ -1,4 +1,5 @@ import { useProjectsManager } from '@/components/Context'; +import { sendAnalytics } from '@/lib/utils'; import { useEffect, useState } from 'react'; import { CreateMethod } from '../..'; import { LoadNameProject } from './Load/Name'; @@ -10,6 +11,7 @@ import { NewRunProject } from './New/Run'; import { NewSelectFolder } from './New/SelectFolder'; import { NewSetupProject } from './New/Setup'; import { Project } from '/common/models/project'; +import { getStepName } from '../../helpers'; export interface StepProps { projectData: Partial; @@ -69,6 +71,7 @@ const CreateProject = ({ ); projectsManager.project = newProject; + sendAnalytics('create project', { url: newProject.url, method: createMethod }); setCreateMethod(null); }; @@ -82,6 +85,12 @@ const CreateProject = ({ nextStep, }; + sendAnalytics('creation step', { + method: createMethod, + step: currentStep, + stepName: getStepName(createMethod, currentStep), + }); + if (createMethod === CreateMethod.LOAD) { if (currentStep === 0) { return ; diff --git a/app/src/routes/projects/helpers.ts b/app/src/routes/projects/helpers.ts index ee9e1126a..11138d4f3 100644 --- a/app/src/routes/projects/helpers.ts +++ b/app/src/routes/projects/helpers.ts @@ -1,3 +1,4 @@ +import { CreateMethod } from '.'; import { MainChannels } from '/common/constants'; export const PLACEHOLDER_NAMES = [ @@ -43,3 +44,20 @@ export async function getPreviewImage(filename: string): Promise } return base64Img; } + +const STEP_MAP = { + [CreateMethod.LOAD]: ['Select folder', 'Verify project', 'Name project', 'Set URL'], + [CreateMethod.NEW]: ['Name project', 'Select folder', 'Install project', 'Run project'], +}; + +export function getStepName(method: CreateMethod | null, step: number): string { + try { + if (!method) { + return 'Unknown Method'; + } + + return STEP_MAP[method][step]; + } catch (e) { + return 'Unknown Step'; + } +} From 2def836b3f5b63235c48bd40d40764be2abb3359 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 12:24:16 -0400 Subject: [PATCH 03/18] Track creation start --- app/src/lib/projects/index.ts | 2 +- app/src/routes/projects/ProjectsTab/Create/index.tsx | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/lib/projects/index.ts b/app/src/lib/projects/index.ts index c53e332d3..c1144d842 100644 --- a/app/src/lib/projects/index.ts +++ b/app/src/lib/projects/index.ts @@ -72,7 +72,7 @@ export class ProjectsManager { this.project = null; } this.projects = this.projectList.filter((p) => p.id !== project.id); - sendAnalytics('delete project', { url: project.url }); + sendAnalytics('delete project', { url: project.url, id: project.id }); } get project() { diff --git a/app/src/routes/projects/ProjectsTab/Create/index.tsx b/app/src/routes/projects/ProjectsTab/Create/index.tsx index 9fa8912ef..910cfb05d 100644 --- a/app/src/routes/projects/ProjectsTab/Create/index.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/index.tsx @@ -2,6 +2,7 @@ import { useProjectsManager } from '@/components/Context'; import { sendAnalytics } from '@/lib/utils'; import { useEffect, useState } from 'react'; import { CreateMethod } from '../..'; +import { getStepName } from '../../helpers'; import { LoadNameProject } from './Load/Name'; import { LoadSelectFolder } from './Load/SelectFolder'; import { LoadSetUrl } from './Load/SetUrl'; @@ -11,7 +12,6 @@ import { NewRunProject } from './New/Run'; import { NewSelectFolder } from './New/SelectFolder'; import { NewSetupProject } from './New/Setup'; import { Project } from '/common/models/project'; -import { getStepName } from '../../helpers'; export interface StepProps { projectData: Partial; @@ -48,6 +48,7 @@ const CreateProject = ({ } else if (createMethod === CreateMethod.LOAD) { setTotalSteps(TOTAL_LOAD_STEPS); } + sendAnalytics('start create project', { method: createMethod }); }, [createMethod]); const nextStep = () => setCurrentStep(currentStep + 1); @@ -71,7 +72,11 @@ const CreateProject = ({ ); projectsManager.project = newProject; - sendAnalytics('create project', { url: newProject.url, method: createMethod }); + sendAnalytics('create project', { + url: newProject.url, + method: createMethod, + id: newProject.id, + }); setCreateMethod(null); }; From 553fa502190b24072ef101f668d555e8ee455245 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 12:34:00 -0400 Subject: [PATCH 04/18] Clean up --- .../ProjectsTab/Create/Load/SelectFolder.tsx | 5 +---- .../projects/ProjectsTab/Create/Load/Verify.tsx | 4 ++++ .../ProjectsTab/Create/New/SelectFolder.tsx | 8 ++++---- app/src/routes/projects/helpers.ts | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app/src/routes/projects/ProjectsTab/Create/Load/SelectFolder.tsx b/app/src/routes/projects/ProjectsTab/Create/Load/SelectFolder.tsx index b77486022..6691fc801 100644 --- a/app/src/routes/projects/ProjectsTab/Create/Load/SelectFolder.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/Load/SelectFolder.tsx @@ -7,19 +7,16 @@ import { CardHeader, CardTitle, } from '@/components/ui/card'; +import { getNameFromPath } from '@/routes/projects/helpers'; import { MinusCircledIcon } from '@radix-ui/react-icons'; import { StepProps } from '..'; import { MainChannels } from '/common/constants'; -import { capitalizeFirstLetter } from '/common/helpers'; export const LoadSelectFolder = ({ props: { projectData, setProjectData, currentStep, totalSteps, prevStep, nextStep }, }: { props: StepProps; }) => { - function getNameFromPath(path: string) { - return capitalizeFirstLetter(path.split('/').pop() || ''); - } async function pickProjectFolder() { const path = (await window.api.invoke(MainChannels.PICK_COMPONENTS_DIRECTORY)) as | string diff --git a/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx b/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx index 6fb0685d4..973accdb3 100644 --- a/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx @@ -7,6 +7,8 @@ import { CardHeader, CardTitle, } from '@/components/ui/card'; +import { sendAnalytics } from '@/lib/utils'; +import { CreateMethod } from '@/routes/projects'; import type { SetupStage, VerifyStage } from '@onlook/utils'; import { CheckCircledIcon, ExclamationTriangleIcon, ShadowIcon } from '@radix-ui/react-icons'; import clsx from 'clsx'; @@ -46,6 +48,7 @@ export const LoadVerifyProject = ({ setState(StepState.INSTALLED); } else if (stage === 'error') { setState(StepState.ERROR); + sendAnalytics('verify project error', { message, method: CreateMethod.LOAD }); } }, ); @@ -59,6 +62,7 @@ export const LoadVerifyProject = ({ setState(StepState.INSTALLED); } else if (stage === 'error') { setState(StepState.ERROR); + sendAnalytics('setup project error', { message, method: CreateMethod.LOAD }); } }, ); diff --git a/app/src/routes/projects/ProjectsTab/Create/New/SelectFolder.tsx b/app/src/routes/projects/ProjectsTab/Create/New/SelectFolder.tsx index 114923957..cf40d126e 100644 --- a/app/src/routes/projects/ProjectsTab/Create/New/SelectFolder.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/New/SelectFolder.tsx @@ -7,6 +7,7 @@ import { CardHeader, CardTitle, } from '@/components/ui/card'; +import { getFolderNameAndTargetPath } from '@/routes/projects/helpers'; import { MinusCircledIcon } from '@radix-ui/react-icons'; import { StepProps } from '..'; import { MainChannels } from '/common/constants'; @@ -53,11 +54,10 @@ export const NewSelectFolder = ({ console.error('Folder path is missing'); return; } - const newFolderName = projectData.folderPath?.split('/').pop() || ''; - const pathToFolders = projectData.folderPath?.split('/').slice(0, -1).join('/'); + const { name, path } = getFolderNameAndTargetPath(projectData.folderPath); window.api.invoke(MainChannels.CREATE_NEW_PROJECT, { - name: newFolderName, - path: pathToFolders, + name, + path, }); nextStep(); } diff --git a/app/src/routes/projects/helpers.ts b/app/src/routes/projects/helpers.ts index 11138d4f3..e8d4c9c4c 100644 --- a/app/src/routes/projects/helpers.ts +++ b/app/src/routes/projects/helpers.ts @@ -1,5 +1,6 @@ import { CreateMethod } from '.'; import { MainChannels } from '/common/constants'; +import { capitalizeFirstLetter } from '/common/helpers'; export const PLACEHOLDER_NAMES = [ 'The greatest app in the world', @@ -61,3 +62,16 @@ export function getStepName(method: CreateMethod | null, step: number): string { return 'Unknown Step'; } } + +export function getNameFromPath(path: string): string { + const parts = path.split(/[/\\]/); + const name = parts.pop() || ''; + return capitalizeFirstLetter(name); +} + +export function getFolderNameAndTargetPath(fullPath: string): { name: string; path: string } { + const pathParts = fullPath.split(/[/\\]/); + const newFolderName = pathParts[pathParts.length - 1] || ''; + const pathToFolders = pathParts.slice(0, -1).join('/'); + return { name: newFolderName, path: pathToFolders }; +} From 911009eb41c0200b8eb051e82a8549e2b716840c Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 12:54:35 -0400 Subject: [PATCH 05/18] Clean up --- .../ProjectsTab/Create/ChooseMethod.tsx | 2 +- .../ProjectsTab/Create/Load/Verify.tsx | 2 +- .../projects/ProjectsTab/Create/New/Setup.tsx | 110 ++++++++++++------ .../projects/ProjectsTab/Create/index.tsx | 3 +- app/src/routes/projects/ProjectsTab/index.tsx | 2 +- app/src/routes/projects/TopBar/index.tsx | 3 +- app/src/routes/projects/helpers.ts | 6 +- app/src/routes/projects/index.tsx | 6 +- demos/_123/.eslintrc.json | 3 + demos/_123/.gitignore | 39 +++++++ demos/_123/README.md | 23 ++++ demos/_123/app/favicon.ico | Bin 0 -> 179344 bytes demos/_123/app/globals.css | 88 ++++++++++++++ demos/_123/app/layout.tsx | 22 ++++ demos/_123/app/page.tsx | 26 +++++ demos/_123/bun.lockb | Bin 0 -> 149966 bytes demos/_123/components.json | 20 ++++ demos/_123/lib/utils.ts | 6 + demos/_123/next.config.mjs | 10 ++ demos/_123/package.json | 33 ++++++ demos/_123/postcss.config.mjs | 8 ++ demos/_123/public/next.svg | 1 + demos/_123/public/vercel.svg | 1 + demos/_123/tailwind.config.ts | 67 +++++++++++ demos/_123/tsconfig.json | 26 +++++ utils/src/create/index.ts | 12 +- 26 files changed, 466 insertions(+), 53 deletions(-) create mode 100644 demos/_123/.eslintrc.json create mode 100644 demos/_123/.gitignore create mode 100644 demos/_123/README.md create mode 100644 demos/_123/app/favicon.ico create mode 100644 demos/_123/app/globals.css create mode 100644 demos/_123/app/layout.tsx create mode 100644 demos/_123/app/page.tsx create mode 100755 demos/_123/bun.lockb create mode 100644 demos/_123/components.json create mode 100644 demos/_123/lib/utils.ts create mode 100644 demos/_123/next.config.mjs create mode 100644 demos/_123/package.json create mode 100644 demos/_123/postcss.config.mjs create mode 100644 demos/_123/public/next.svg create mode 100644 demos/_123/public/vercel.svg create mode 100644 demos/_123/tailwind.config.ts create mode 100644 demos/_123/tsconfig.json diff --git a/app/src/routes/projects/ProjectsTab/Create/ChooseMethod.tsx b/app/src/routes/projects/ProjectsTab/Create/ChooseMethod.tsx index cd11635bc..6f9330c98 100644 --- a/app/src/routes/projects/ProjectsTab/Create/ChooseMethod.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/ChooseMethod.tsx @@ -1,6 +1,6 @@ import { Card } from '@/components/ui/card'; import { DownloadIcon, FilePlusIcon } from '@radix-ui/react-icons'; -import { CreateMethod } from '../..'; +import { CreateMethod } from '@/routes/projects/helpers'; export const ChooseMethod = ({ setCreateMethod, diff --git a/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx b/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx index 973accdb3..f44edea23 100644 --- a/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/Load/Verify.tsx @@ -8,7 +8,7 @@ import { CardTitle, } from '@/components/ui/card'; import { sendAnalytics } from '@/lib/utils'; -import { CreateMethod } from '@/routes/projects'; +import { CreateMethod } from '@/routes/projects/helpers'; import type { SetupStage, VerifyStage } from '@onlook/utils'; import { CheckCircledIcon, ExclamationTriangleIcon, ShadowIcon } from '@radix-ui/react-icons'; import clsx from 'clsx'; diff --git a/app/src/routes/projects/ProjectsTab/Create/New/Setup.tsx b/app/src/routes/projects/ProjectsTab/Create/New/Setup.tsx index 222039b82..c11da104c 100644 --- a/app/src/routes/projects/ProjectsTab/Create/New/Setup.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/New/Setup.tsx @@ -8,18 +8,26 @@ import { CardTitle, } from '@/components/ui/card'; import { Progress } from '@/components/ui/progress'; +import { sendAnalytics } from '@/lib/utils'; +import { CreateMethod } from '@/routes/projects/helpers'; import type { CreateStage } from '@onlook/utils'; import { CheckCircledIcon } from '@radix-ui/react-icons'; import { useEffect, useState } from 'react'; import { StepProps } from '..'; import { MainChannels } from '/common/constants'; +enum StepState { + INSTALLING = 'installing', + INSTALLED = 'installed', + ERROR = 'error', +} + export const NewSetupProject = ({ props: { projectData, setProjectData, currentStep, totalSteps, prevStep, nextStep }, }: { props: StepProps; }) => { - const [isInstalling, setIsInstalling] = useState(true); + const [state, setState] = useState(StepState.INSTALLING); const [progress, setProgress] = useState(0); const [message, setMessage] = useState('Installing project'); @@ -34,7 +42,10 @@ export const NewSetupProject = ({ setProgress(80); } else if (stage === 'complete') { setProgress(100); - setIsInstalling(false); + setState(StepState.INSTALLED); + } else if (stage === 'error') { + setState(StepState.ERROR); + sendAnalytics('create project error', { message, method: CreateMethod.NEW }); } }, ); @@ -48,48 +59,77 @@ export const NewSetupProject = ({ window.api.invoke(MainChannels.OPEN_IN_EXPLORER, projectData.folderPath); } + function renderTitle() { + if (state === StepState.INSTALLED) { + return 'Your project is ready'; + } + if (state === StepState.ERROR) { + return 'Error creating project'; + } + return 'Setting up project...'; + } + + function renderDescription(): string { + if (state === StepState.INSTALLED) { + return 'Open this project in Onlook any time to start designing'; + } + if (state === StepState.ERROR) { + return 'Please again or contact support'; + } + return 'Installing the right files and folders for you.'; + } + + function renderMainContent() { + if (state === StepState.INSTALLED) { + return ( +
+
+

{projectData.name}

+ +
+ +
+ ); + } else if (state === StepState.ERROR) { + return ( +
+

{message}

+
+ ); + } + return ( +
+ +

{message}

+
+ ); + } + return ( - - {isInstalling ? 'Setting up project...' : 'Your project is ready'} - - - {isInstalling - ? 'Installing the right files and folders for you.' - : 'Open this project in Onlook any time to start designing'} - + {renderTitle()} + {renderDescription()} - {isInstalling ? ( -
- -

{message}

-
- ) : ( -
-
-

{projectData.name}

- -
- -
- )} + {renderMainContent()}

{`${currentStep + 1} of ${totalSteps}`}

- {isInstalling && ( - - )} - +
diff --git a/app/src/routes/projects/ProjectsTab/Create/index.tsx b/app/src/routes/projects/ProjectsTab/Create/index.tsx index 910cfb05d..492ead8b9 100644 --- a/app/src/routes/projects/ProjectsTab/Create/index.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/index.tsx @@ -1,8 +1,7 @@ import { useProjectsManager } from '@/components/Context'; import { sendAnalytics } from '@/lib/utils'; +import { CreateMethod, getStepName } from '@/routes/projects/helpers'; import { useEffect, useState } from 'react'; -import { CreateMethod } from '../..'; -import { getStepName } from '../../helpers'; import { LoadNameProject } from './Load/Name'; import { LoadSelectFolder } from './Load/SelectFolder'; import { LoadSetUrl } from './Load/SetUrl'; diff --git a/app/src/routes/projects/ProjectsTab/index.tsx b/app/src/routes/projects/ProjectsTab/index.tsx index 3564813bb..022490bcf 100644 --- a/app/src/routes/projects/ProjectsTab/index.tsx +++ b/app/src/routes/projects/ProjectsTab/index.tsx @@ -1,6 +1,6 @@ import { useProjectsManager } from '@/components/Context'; import { observer } from 'mobx-react-lite'; -import { CreateMethod } from '..'; +import { CreateMethod } from '@/routes/projects/helpers'; import { ChooseMethod } from './Create/ChooseMethod'; import SelectProject from './Select'; diff --git a/app/src/routes/projects/TopBar/index.tsx b/app/src/routes/projects/TopBar/index.tsx index 632391ac9..04dcdb827 100644 --- a/app/src/routes/projects/TopBar/index.tsx +++ b/app/src/routes/projects/TopBar/index.tsx @@ -8,10 +8,11 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { cn } from '@/lib/utils'; +import { CreateMethod } from '@/routes/projects/helpers'; import { DownloadIcon, FilePlusIcon, PlusIcon } from '@radix-ui/react-icons'; import { observer } from 'mobx-react-lite'; import { useEffect, useState } from 'react'; -import { CreateMethod, ProjectTabs } from '..'; +import { ProjectTabs } from '..'; import ModeToggle from '../TopBar/ModeToggle'; export const TopBar = observer( diff --git a/app/src/routes/projects/helpers.ts b/app/src/routes/projects/helpers.ts index e8d4c9c4c..982e33454 100644 --- a/app/src/routes/projects/helpers.ts +++ b/app/src/routes/projects/helpers.ts @@ -1,7 +1,11 @@ -import { CreateMethod } from '.'; import { MainChannels } from '/common/constants'; import { capitalizeFirstLetter } from '/common/helpers'; +export enum CreateMethod { + LOAD = 'load', + NEW = 'new', +} + export const PLACEHOLDER_NAMES = [ 'The greatest app in the world', 'My epic project', diff --git a/app/src/routes/projects/index.tsx b/app/src/routes/projects/index.tsx index ac29fdae4..4bdf188e1 100644 --- a/app/src/routes/projects/index.tsx +++ b/app/src/routes/projects/index.tsx @@ -3,17 +3,13 @@ import ProjectsTab from './ProjectsTab'; import CreateProject from './ProjectsTab/Create'; import SettingsTab from './SettingsTab'; import TopBar from './TopBar'; +import { CreateMethod } from '@/routes/projects/helpers'; export enum ProjectTabs { PROJECTS = 'projects', SETTINGS = 'settings', } -export enum CreateMethod { - LOAD = 'load', - NEW = 'new', -} - export default function Projects() { const [currentTab, setCurrentTab] = useState(ProjectTabs.PROJECTS); const [createMethod, setCreateMethod] = useState(null); diff --git a/demos/_123/.eslintrc.json b/demos/_123/.eslintrc.json new file mode 100644 index 000000000..bffb357a7 --- /dev/null +++ b/demos/_123/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/demos/_123/.gitignore b/demos/_123/.gitignore new file mode 100644 index 000000000..b45fcb998 --- /dev/null +++ b/demos/_123/.gitignore @@ -0,0 +1,39 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# vscode +.vscode \ No newline at end of file diff --git a/demos/_123/README.md b/demos/_123/README.md new file mode 100644 index 000000000..56a312582 --- /dev/null +++ b/demos/_123/README.md @@ -0,0 +1,23 @@ +# Onlook Starter Template + +

+ +

+ +This is an [Onlook](https://onlook.dev/) project set up with [Next.js](https://nextjs.org/), [TailwindCSS](https://tailwindcss.com/) and [ShadCN](https://ui.shadcn.com). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) in Onlook to see the result. \ No newline at end of file diff --git a/demos/_123/app/favicon.ico b/demos/_123/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1b3613cdcb50762ecb025f49ff186a45afe4dcc7 GIT binary patch literal 179344 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 literal 0 HcmV?d00001 diff --git a/demos/_123/app/globals.css b/demos/_123/app/globals.css new file mode 100644 index 000000000..f4447b450 --- /dev/null +++ b/demos/_123/app/globals.css @@ -0,0 +1,88 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/demos/_123/app/layout.tsx b/demos/_123/app/layout.tsx new file mode 100644 index 000000000..046a7d272 --- /dev/null +++ b/demos/_123/app/layout.tsx @@ -0,0 +1,22 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "My New App", + description: "Generated by Onlook", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/demos/_123/app/page.tsx b/demos/_123/app/page.tsx new file mode 100644 index 000000000..cd8168e6d --- /dev/null +++ b/demos/_123/app/page.tsx @@ -0,0 +1,26 @@ + +const NoiseOverlay = () => ( +
+); + +export default function Page() { + return ( +
+ +
+

+ Welcome to your app +

+

+ Open this page in Onlook to start +

+
+
+ ); +} \ No newline at end of file diff --git a/demos/_123/bun.lockb b/demos/_123/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..fc04296c4e91bf724bc8ccc723f7480de6e8c97d GIT binary patch literal 149966 zcmeEPcRZEt|36ugjAV;4Dza%QA|xvzM563HGK!2ev}va_G%2Jcqpeg%iIh=BG!ZIM zH1zv?oO3)$M(*@qT|k*XJ7db>BxNFRLCI9;WW@7p(3TymEqj zWbi1sR0Bgi0=)eKy;QwJ!h+l)R99+@Vx!S$b+1G#YVHTWYCqK`b=9RF@_8F!GZ_7!7FQ5pH1-USYH&P&1ZBOV9!21^faH z!~i`(kRQ+^JlreXgGPG=<=8GXBs>DjXwmF68Xx2npnMcyuv>75pC^sx0eK$CN4o_D zqR}Ui7liyhK-4Q@V3=2UNZ?8@S}!M!HXh2`0a51}Ahz>$3lCWpOrxocq}xem)Q9?c zN2Bg)$O}WeOom<>Ao{O0VFE@GvhoPfx$F&^OQy{Wt@S#{jwoN5j1E z@C}dj2y+YfqE$d}F%F@AVQvx7fuPkG9UAQ{G{$&D_<9AS{auXwVLT}d>IC=^7ZrZg?4`7UQu3v7oZ&dUoS$}3w4X|RSocpwgEo!JV0zX zK7PS|p>E;frcjP~37A~S3kJk~=`+eliqq|Wg>v-o6Xdb|JwP0fqY`x719^;}x+Hy` zDgdIr#ZZqZE=A}203z>qI%(tRe*9hM0t5l=9|XkpFkXg61IYv~Krofi2#Dn$rD-$> zL4v3<{7vWf#w$GGmJanC-!qAAnL)mdPKnI6BFqD(3EA^fjrg+dqrV2ty_*p zgRUh!X5bY-w0oR^TL2*x2`d=51Q7i(2E=jH0E8h*Pyobu@iK7lBzis~JkZY_4M91^ z?KAj+@!C9@p6_P(Mb^7}WVm}sG>x`PkRrJp-#BXKx;slG6@-gI3Axh z=sJI&U#~Rjx}IL{kvI}T;qU`eGVm~ts{k=x9)Rel0U*x%B5gV^%r7X+&6`Fe>mz6? zz1|%VlNk~5$+f49q8xd8?h?PEi@G36B6u!%Yz0>VR#~poKA1=9q1Mj;pIuw zVA!dFa_onHxa#m$3G*e?EiByY9+YETzt5oKdq7+dTW8Yeho4VyNElc^zuW@DX*xRe za$i|H)u(-=<_KW5c?|xe&9Nc4D(a?nf5`#r5d%5dg&b+6Ltqk9t5H$4UkU%%R6C&}(Hd#={NrSZ~EZM?mCz zdU=Ja`i0X<7`!Wh!{s3!5n+D8US8pm5q{85Z@*wq)yPoVpaI=p4+BH-mI*r_pkI(* z1g&Q-z1}N)MWk0)G|j`;EieG=ry0`w1NRkG7z-a0ume*(!9j%{k4Bh?*k8AK^!_>m zq8~x9e+Bu4NBD<_1WyB5QaAIhj70zUR59r(CD z3!pv5X$RzS{X{X)n^A8Gi2K%5K7rz z9{pu=pqIMuMhqz%s-vXlFH4MBBh<0`X;=U6Ni2cifal!Uijp*Y<_8VnYdOJ_X zJWhdjXwT7=-flhQv47rxa0^Lr1jM*n0ivJJKo9-@W4=LtG~`p4)BVVTJo*#i7V736 z=tbKDdGtpJ>`DMutI)9*Hf9CL=KkuHe!!sS~k$n^Q6ZdEu?Vcxnyy5IIe1Mt{ zdkW5v@Ibe4y#Ln#e*)xFKp%C;{z&fQ2~dvx^asQ^*ZI)>C{Z3#YaEHeaV0e9vfxe(0yh0L9k1SL3S8zsKxP7cUYCcdN z$oc-H-JP6OhC(BZV@_z-S*4vGoUzFCX)j0ow1W!=OY*OAxTh|4dsxwB$-P#&_GH+j zfQw7Rx0nuHI;{}9Y~gqXx!ZNyqQ?1Ew{3Rqo%(h3^~L*gUB_t)&74@RaKtG~zLPI; zhi8--cE{F8CpAOy{=6~JAyyM={ zjaQA%{NPVtwZZ$1+QP_bqmHya+c5H_w$#}*&vV}9)2wdi+0|WhKlCo>&LPLQHuvq9 zcm4dj)9rJya0AzslDFgaJ{9Ly2u}0maMZG^JxH^=@;EZJv8`uRSY&?o+(gMM_`&O3}`BVu?MQTja*4NJz`sZZj6R zkP(qoz14GjfrDSu(Vl_G!43BBcIOw|4dp$wKqRcw#v{ghn_~Q$o_Eo@=Avmewoej2 zIz}3Ce(`+O`ErX!@2BjJGs|uzo&FrF>@A9$@PH!u4^Q1X|P3wuq@s4RZANT{>k zK;-#>SvR@kMs+Nf)<3rWYfbpgp;}vAo|3OHSmvx@>vtndqSq?PF4Nk7n+ECn{2tX#coN zVReY0leAo$d@+yQiB({Z{t-L}(wu$GgrxQ+~boJ`FQ&---PpP*0c-pyg%^t+n0Nzx?d*l z{BY)h$;t=v_3K1)c^<299Ce&k$5!GYvsSYL8`xOeK(o!b2R9j0xY8zXY9D!4C7jJLQoR(@pi@r(99 z;;QVm0`opqRQdXpDlJP`)#fd5c3^d2f3n3gvOezK@63;1X1Rj%?Y`;32XaP_N$nI9 zfBwWrl$!xUN)9{ zYL=|yiLZ%272b`WAi=wCqE@Hvz48XHbbqxQMQVmxiZ!={X7?|%+|eN--=N8S?gsrQQs&iV^Pg^>G&IL~Gmk{sE}rJZ3t5x- z67DTk-nvm~j{BAw{G2W#g1J{$?+891yzSWw`v-SV2M_8DEbzCLI&@Is#)3T=eF1uV zH?MfyRO)tH_U`-x68-7|-0tId<#pOWZBrH+Z?Ss9O7jb0!sf+Mm-}aM&N9o==AO8~ z%+h)5%>Al+WlMz0^UBxkHuTA!Sj_+S?EE~>k5A<*CvGt9G7#l-lD3jwUw+3)KSv2-z2)n)oJ&)^W`aeRlQuRVJW(_VP1)cN9E*CVSAc8gQvTFk+uGj>{C=k<;Y=i4ieJiP0H{Q5U1q{sbOvn%s$dF{C3rbUVTI|`y*XfqSsTYx6OVjCF zd1C&y7*3&xqGN|lQZs8EGw*G?uyO6F5}{`tNxH&wrx`}xu4;VTxvJr%`avpHHghBUNf8jOmEaC$AhwkF(((AyX8FaEi^fKxJ+f5d6cU1yVxm`?PFWwZa((V z5t3hHqV%b2g75|2XF*Yk1&_mqvcA^6*gkQ(*K!TjR8T z7D!uhZoMMFarDJ9t#JviR;`OVY!v5qd%o)Uyg9~loXOgi?G0?>`3?4WO2sU4e763U zxah-=an;kiMp)e!F|RnYNuYsqe)ETf`_@w?4W=63{jQ^bf5q0kUAb(0J0H?`FD;ao zIv5y9_8YJ5V`uNapXW~Iarazj$7u_Nbrw617V0y)?=QW#of@H3 zHaL}cuj=DF#~xkFiwjMj;tYOX57W1W7_13aF`mC|veCrPdy zF@5_)L-PZIpVkYCO$wPd=EMFZcY_f(9n$l6>TvBVc(m%|PZ9nJxAU%tZ}CrcnreDF zIHzGe*T@$iCN)o)5z^STLgGqBg@fmbTQ8y~Jx>1PJgb_sj!$;>?eRNAT-+{SNtOR{ z#@%wm)A0#6visgV4;oyQBCoIVELcxs^VRek@l}shcBwB(nv}1n!xN%=uhS;=>Igij z|BJ-N;9dZ+(Sm*;O|D6bF7X}~T z5%mxMNjbCpVjxUq`2RZ&wVv4NgAW)#>^mk>PS5@KpQN231a1cKxuGd)z~dZKiSRc9 z-w^n$#10J*ei`s}8GJGam~nvcg}`YNKb!-s&L0!t!z;ky`NK*di2VfMYXBefoXj}R zXhZlHfIk=b$R%aW$dI-lfo}|aoWG=u75+3ZJP-KrtUo;enc-p^V(TREasFWJ;QhuQ z->_kuUnRmH1CDz$_`hoZ_d3E~1$;7punnu@p9g&GKkBg(17d#w_&EPap5Wj8{d=CY z(*cJK8U6n!^DhSY)c*h7&VS1j`-Q+K^B30-vx)HE0^b_^hiUl7oM1+S@MplrgY%aa z+o(_YF~Emc=l__0nZbu)98N@+k^Qeg+I<23bVmQNF|++3{2A~v5yubnIR1DslL$YY z!N>SxVwHal_=XJo|AasEH~SC{rV{br2yWQ8|6(3v$EyEvz$g1Z8fG>ASAmc5hiUwe z;?K!TpTDpT4kuRqw*@}-AMLY}Nc^?~pR9i@Bjvx-BJIi;_A$?_@2E}qZ19qn+&?k) zq#WD)Dv@?efsf;dws8(K>jUBM1U{~Rj6ZToIeh$OBJCamAJ313%j*1{059>i8GLxZ z&a(fDfRFnJ={H%&zjPidiT_)GPwro+LFOT|{Aa*7p!ENDJW@~WE5XZr6AGWz^%nws zj6cz1)&Cse&jdc&C3`sW@mEOf^)dLEM-5i}SAj#rzp?KLe7ygmeKH4rZ zIfKuv@2Ele?1F##kM^0>AbfY=eiczxd(HLrvhrZFrc=>iS;?d^?7HX8VrqNdN1AZwh=8e`YlZf2uG& z{v>{^^1~Q>GWVDrLt_6a@U_5yk|+2(KS(=X_>!2){~eFi6TTksasMZIQvW+7?RNs- zkP-jiaj5l#Ujuxy|Kc2Eb^eZmhgNd`hocb7{6OH(2LH+YWp(^AfRFx@^C#&SwXgr_ zGimo6_;~(;WB71lb^R!c{dN3UjbAMAjln+Q5x@SE&(t!~t{C{_{D^Ca)%b~t)8`Lr z8$mmQE#*6;6lq@M8Ifsf~Ra_=B_e4Ibne`al?KH8 zp^aZ9((WAaje(DCN!hP>q>i-x2z;DBxc^}pDJSjz85l*F^CPSAO9DQgACU(~0jAI3#QqK7t1i9IQ2w*Qh7 z{(SyJ4OaQCz@H8N!!dl=cUI$<1AKgc@lW|}z&BvT57z**iS%=p?4Rq0SuVCC{0QJ< z|FH~?5`UCq{#S|cuK^$D54;8#<}!O9CwwJ&8g22v;3xb`em(H*|Al=Og@4Ci3;ad@ z!v2$g$)7xt{{G;fj$ah;asT_L{8Hds{0qL&BpPi#@X5OUQeI9z{%ZREG0&ZVPv$@F zA9yj7$oxG<;iF+z_rFHqljlcf*ADte?DI{gKYwvB%9uUF6TT(zbs>J(Z}gw3;8E=7 z0Uz)GP&Axa<$nbJw0|-FlNA5@{X5)Fm`bGoF2JA4m_J-hG3kv6{|N967<^{?jtYd| z417aI{0dkQAbfMBKfixOIl~ zZs6njk=%b-UBAu1p9g$+4NSxS!`B&1C1PJrng0G1*FE~r>iTyCz6022W$e&FV*d*8 z$@;~<<37MlBK*(5UjX+1>HeLlN?*U+U{r@0!;Ch>zPvj8omNKwv5MI_K=}KBkN0oF zBltU42)`5fw!p`@F&jJ7Cj7-3^xq%CaYsI@<9{0XHees9!|z{k9GFSOz7QO~kWccg z+V=oHt{>!K?1;|qd?4+P0DnI4k&74a?}&_g!tVh-&R;@fb^NBl%@h74kk~W3hZFlt zflR)?_$U3}416<&eP;WPeI@oE0e>OzS+Py!Pk@IHYleLiLuQcJ4+Xv{@JZZQjsI=n zTr!76_vkPU#3daT5N*nbUtD~5gKvuc0tj6c7> zWtIzO{)qo7;8W)xvl_(z^T0Qt#1FNZNrcZ0#tnea%G^PH!Z!uJA@GUc1b^oP;qL)H z_5Sxe9;qk%O5o%A!MTg`hm@0c{|!mI5pZY%i3I%KUi`l`{txAZZwP$y{3;CXNcn%D z{H2JrivvFT&jYo%cd#12E5OJ2{nP%70U2%q!|(6$?9HlubKt`fZutI%d{+0r4B#&X zKE{Jt+tBonII~0W@&1ctIER_lAn{)Wd=uc4y@%{$sQ0Tx_y>WHAolAR{!@Lz&%aBAF9gORgbCOl_Ymv{ zGl}qHfRE=dl4o`OmH;2mA7~S8v%3C1QT%7tceF+PRoAEYAMIiptM&tckK<4HxQ{ZE zi2c*R$MXwvP=nb%5Pl=@;RrUo|H4+zbRv8~gFpRe);1a;d~@LA{=>@Lr}EbUANx=A znAIWeix_-n2L3jN1qz&IFSF z4>J5m%0J=HFr?c@E-Nu0_Je>AkI)Gif7Br5@bQ<4v^xiUW8jnh|Cc06CEgYNgXpt_$Ki3j@*A(83V#k0KPfJe^&cH0&f0r3m*0#xvcW_f$vD^ zKk@5#F(B>E0^gFt{~eFi6FwWf{4=EVpV@tY@Ew6q`j6VojsfBC2R<3Uf5NW@K0d#Y z*t6>Y1Q>ks{s--|I)2u`r}~fkFf)nt{|NB${R!H|GE)9K4btu%@Qo?s&uaWl5S@r({@X7o|+pLaX5Af|M z@n@C46keV$rSP#I%p?-0BH;g<_{qTHv8C82y1(;*v^xoW>ilPQ{WbrM&uaX{;P3!j z;PCuIpIPNE13oOFKjts#7qk683;ci6|Chig^AByZYF`!xkGlVJ{myYlJ+Tu6d^m#q z(SLl8$4nypi@mXoflt;SYVxpX{{rx->z~#A?=$ep`4eN$>iSi)|99&r3i#CLUrrYLp96g8!tne> zE*Y2K$&hwqVe;boCwYR*@>c*KwyVGKkspCiD@~hZk9cgz5_%MZs=MTo7RsSWI{JDRjCadEY z418ls{8?Q;7lDuW57Hkp53rBFN~HY|@X7xDtM-4dBYbP;zw%k_{|Vqz&p)j4JAv;? zi65)|H-(!gOyNKF4_56T13oqWtlmGnfDcFT;qhbk-ic#D;y=rU{{95}jb*H^-$3AF z{D3;V_c7}Ov0nlFnGFA#jUCz|d^Rvn)*tBu*8eUMegN<>e#AB@XO@2%_~icgPwew7 z8~(TQhwYF?ig-r?Sf z{a_{$`%9M7Xa-;(_kCvjj{1b3x%{vD2i7r@2)}nZ{rAUk+{VDgYzzs1w%ecQKP+RF zzXJI12s}J~K&MT{A50`-zZm$ig%8IM<4?+eCqdfTxzm4t5XX;{{f>+Eq^+n2jRsr5 zKYo9|2Kev@^N;y8z@PUo_+p+kngQ@}+?bua)c!99{w&~=eUn)Y62D!*$MuW9yU6U^ zq1t~0{5il!y???N@S^YE#BXLbi2v5W$NqDmQ!FIH-wJ#!;1m1IN)Y}v;KL)-Kb}8h zy#L+b|M3Jq`acRB$37r3lZgNOfsgUSJo0f3Gm{9v8u;Y>0orDE90-4$5B>a%cF7!O z#lC;0Gb#jO9az{lrz z!ox9OCXx0-hh-c>TSc#4if?I$$5yJ+pHUwFo~K_&9!8hKbej z?*~4PAMU#tKUVv%8A{)O@%$diG%@Jf;0Lk@m`AbiM#oW9(U7Kfb`n^M@dC`Tha_1n_bE z$=qjk{NDhdynjIroQKRL(*HT(fAX=6)%*8;;2VPfLcnEq?xBCgegp7v{Rl%D#*kSJ z!k3Pq|NF_f?~H|u+4w=z;pbKI%!>Yt!leioYEOX+6BRMGYH*>Cns8xa1yNTUF4UO; z7wW*=8BSEhahweoBCPG%-|+i0$B+X1KjRy*d6HSHu09%g7_5KSqo^BJyA^ z4&yuq!rnTZ{uAO{v0&6AA|K8|!@5?C{6auXh-l9SE^KED7bYs=*ew|@r6ab3ycDHK;dgajjB+YsTz%m}J{%8+(H{`ge?pu)uni6;MAQ$XXNM8>BH=>4m5g#k z%&%hPsfhe&MmZI+{c5-nV;J>_*glStM?`o9dPMv!N?=xM@dGWidcmI{{tpO z^jiiHi^em`5plnjXXO7AVwD1;{#S^8O=7e|#E+91c`9POR2k)n$WsTzA`M14Gl)$! z8SN2KN1KsH#E(-MIE{hRu@Dj>ew+b6kf+1Q&%#1Th&bQo0geT91jINkWz_#C#3~m? zJtD??IUp9fG0G9K+>?<<#E)JK^ajNHMgSK64UrejXovqXH@1ra#CWa-#QHcuya#77 z>MsDoA6hO0FJcA~B7V$cA7zYk{8w5q zUj>MIPXN)sdImmYU^5`vZDZtL0iymJMtLV7CPZx4!@yofIU<&SX5yO?8Y8a`i0!l)`KgTjOhAm|90nQ#VnRf{d5ko0J61wM z#PXkj*gp=)V4Oz*q8={;M`I&K!nomu_2}#W&gK6*m;div4hsR&9y$yoE}8$G%jx^X z|IX#~i9tQ5;}-nCb2&XOcs|Gb&i~Hk^mzR5Tuwh%{qI~(kHi1Y<@9y&zjOJ2JC_d$ z;IriaYXZFyG`cQTnj_dX{Z!oJuB0boQs+m{yI-naTeNiUp8bsv54!c#mc1*#ptXh1 ztvTrP$y+i`y$eS^Yu&Z(rS@R`iD`)&RgJ!NoucS69z%xR=1}tXv>Uuyw%2WCkI+1& zxK#2xn*yT|0%yG?! zZ=0UZUwE+lmC4;>qklS3bn%`_5=YQPx3XQ^9$SufSpVb!r@@h2MdvBI?wP)Sx6Ljk z>8k13s%)d6tTSe}%;j^|Yd^J)H(GooRgF9Tg23ssCtlkx$9G(0KHxJjNgV7W4}I=< zD71G*%m@muG3$+7DQH-`!uFb z!*{ME4x@-DAV;)9- z?|UwNv3;_!P1!p0;!-{?=fsU`KaNnucTz+b-~Exqv3hHKv4;AoZFUuvoJ;1GDYafN zFHpAhe)7^@NBQQVf;y+wn?sHyKj^QE-YK0gUVB1BFY`&KfYo4=uA-36qRS^Ky7(@D zB#uVTZGqkm{0f<8)}5I%J*%mtbz}?2d5v?~kEV${+j#lprF7LTk~$kcp1x)|J+#v5 z{Z%opc{M*@uvg#WZxh%#+Jd5s->s6wVOvP!7+(}*ewQ{*YX7S;4)glkpSu?I$1K>F zcCd&i?y|;ask|-f%kMs3zexE+bZN7MfKD=xrSq8{i#2(#XOE)4i>2>7`0j-y4r#9L z#@ji2)eI(U-dJ(Sylv(CELMK} z!CGN?_bi2?k5`sgQv4MlqJSJ5Q->y7&26xEwB{_0I_FrHbfqh;dGt)nMaNc$DZl9z zK2SHE=dj4f2gfS-A81bsu#mZyl`K(`oO$-=j-U_LyfGAAL8|Vt(?@kx{7<(e?!9_% zvAx}6nZ})i>DzX8qEK32*1#7R??JANtKH?ZB0^SIY!^;sSY=;Hepk~mH@iyn!%9zW7EVUvtr&#rM#r#TADNqzaODmwHu4Yxwt-Exm zS=z5FrmxB&Y($kxhx7XnT3Sv+*PaxsQuj%Ge?t<7idMLu4ToS~{QVu;UqYvjY1VSN zsYDyMamkKXuQy7&k8*7MvEjlyg$t>jJ&QKoyOw3w(Z5>r%CS+g{!$NRY2Wc3E}6gh z4vHj>DvNFx6}1(HL9{2L`x>0{uf}kN_1zRt+`h?3h3njH!G=QBLw+sUUyDu(oN{m5 zc3{$*`w!Mx*iJUww9vJ-;f_5;7r%!liK9lyu7ARg8y?yd#GFJ=E_Cs}vhqxf)1$u7 zb$a((FIrUGYY7|pAU5&b`S}OV*xS$T)$^GDI{BjjZA5ortGSLabw9)Jv`FIUUQu}` zzH?cV$s2c#d#1q$XK8-FJ!V?TG5%`~7w)e-HR^M-TSt4vqrEM6Ic5Dur4AimbV=;S z%q^y4KKYevek?Gh_>1qxNaC11GUU5+jGXqdLj#xYeKPW~eP_&W6W28}#6LhRe7`2! zN7ZkILF$|ig4yRLY**f5^EO?t{Ct9y6pr_Ldb@Y*-tb1eT{<|oL{b0JNUwp*Gs?f)_0L}z@R_44$+U9P zw%`*KU2&@JlgEa6SvlthMS@=6Yg6YD(GRMBTJ$O*W6Mu%$HM4ieFxtfPcAO47>Ij$ zGf8*V<_|wF1QiS|xvOTnc{Q)!qWRGjT?wjg$D6=cS7$7#K5-%PY`^NpMe5R-<|f+` z>@D=}`JdU)(bW@T71>~%mmjHNEwiqD-62Dh>2p^8JTOPpee>=4BQ;bgx{_4gc}hRT z&I@c`Ge7fbP_9zva@EDIiAVdyd){{EH;<1EeRMAWj9yk#f{t!;aK(AqoM+R69pXMX ziS9da-g|$JnFDoSm!j$}8^`^@=(s(%XvUfK>fMbsH)pNcw0cB*o|#p&^oOYO>J68} z>ce*}b$glfHTquslOjvgo}VrOh3mHHX-^0mJl{(3cN|ssZij7vZ0Ym#2)YQwxP6@Q>hovG3wd)6MkafY@m!noal@sI^Be(f9k%8a zU1_SW*~LS&r+n`g)Nb2+$9qUm^|hH+yp|NNROMmCY;!Fk<#QLB-%i}*JUc!we$1AR z5$vbln2H*7AI&kFFL6F4s_QsKSB9z^p>?-+7k_=To5Fpsaf==WJP6#T`AoZVyXq%T z>s5C7HX43azf~L(N+139(zdvV14@%V{2UUBI+)sU$zGnKJD#d*@ap{Pfx!KW ztsWdJI;6fm$gmVEcQy%(zdRzh@m)#yi_Je;ee%>jx3(=5-C^fc&2b%!1vZo^V)P1kEv?q zjd7{=*DSeQb92K_eN7%CDe()YiQJjfIVifaRNaXSx}zd0lijA<$tFI0qdO+{Hs4Z? zGt#Lazj5E>+I=a?z;Tz1eY0;Z?R)jaS%WFYE)m;;l-1PPJa$fSI4dk{N70p|>XviW zC%k`Xw$G?xo1EH`_HVh*JNRM+Q!7j@q>nwQi0VxVYi_-!uc%tGGh+L_E2)E``WyJ( zPnbQpBHTJWwqgbSJ2U!yQ=Y2pe(P*Z-I^qnc1}4 zrcZV0-wD$Fok-PvX?-HzbXLrr-hESC@@KiKE}C+Eg7M<1-IrqS7|$7~@AUC0=DWFI zYU>?~ml30Mb`gsZq8l5@#on4*O?xdT7r*7%r#e+*juQMXk=)-V zQ+2P@CKrC(^zgOj;fuK=Gdw@p`Ra7?MMX)Si^`F-(kgTH-#2b(bE3o5qZ^)n-8gPZ zeU&kvtTD(A3Ni#~+=##x0%iWnFjf?(_WF6n~Ydy1hBILhL-w z>tgduYxUJ9Jbt{?h|48pgmI?WO{as3@-yH5jJPMjYsIr|v6SG9+4mPdOws0^(0cRb zXZ^#M9__Zm@1{u{rciZhFD97Lj;6~w7XK(VS&{o~pO01dCeBUafgS^|Uwo+h`sIQ2 zd(Xm)(anLp4L(67hrje?Y0K*v_bKlT9Pm?jqMlQgsk+CO$1jpt?o=kYd$i&Q9}cOJ z>BlvLnr!*|)1L)Oq)Ks?9TPe@;MrTVr~lLb7D@j5`xVzrldW0oRh;MK^KkVz>OQGL z)y)+#YO&uZ8+ojK+?9`eVs1$41uU@+eO|}mkib@4BBo=O{FSTJ=zCRuWa0H=*|y6j zNfj>tJoifXthq|%FiONoOm>#*^?7esWWS;VsPp5$l0q?&As&= zRHUnEh<&9#U#JsNK#n)ABISEy+Y8q0)pc4RbMnkhn(%_%)oU#@eq0$*)TL_8erJ{2 z$S+eREJl7){bBRrM03-p4;|J;gBiYiwja~1rtXs(RNd)slFV|__MRG?c02@v{Q4`^`<#FPNyW(bvY*R)fMP7{KaicWb;xa{?1JaHMj|{wYw%l>>Ys-S^ z^X>C>~xAH{;t*0o*dcY1zd>KMhYtT~xS#Ky;$ z2tVHuE&8hYtkR9{BD2PtkO}WbjGjB$Ki+80`=I7odiD~Q4=C}S_J=CW2hUq$+}_PP zrF*2J?ZnE`tFvx>%)dC>Y4Kj6?XB|%W}j=;v{gDV-TA5U!it7639D%r-v^tmQe7ce8 z{h!x#%BBWHs+n)p_8+{M!n@6hJ*`C|B3XMh_53h{s;hX%Rm8k+~uH@2{3Do#U^0 z=96lUo7suGr*_#?RnOTlRh*&=zeD>+;_&#Kb^Y>C&b2QJa;N*$6zu9B$0-#IxhcJ} z%X?)ZVajfzr(~V8*Ywpx0mWtMlUC?F(@y?k^j2^34BP9C3r0^(py6#yX^Qd3=qs5wvJx5gP__kP$ zfPZ12y5gYW+rCZsyFX-}&8F&BRhmrgd3$6%$Hv^_eT5fO*UlW=+P5U$GBiv=BWGzG z?esu({p0&=-kjsU3~iT*x-J`#s21eZ6mi?NJFoxK>ZcT4U8=5ellAzon?HS9RUlF> zFj6JosHn2@%)1?X@Bhr6W;eGq@omHFA)Pc|{q`+~ANi--1O#~7*}qt4cJ7S5Z{fmi z`wmca^{Be@9BgG>O{H8$?pc*_;#u2Gy|MirSHfj)sm=YloGW-rMr@+QsKm*)#Wx8w zoEEP(`go+Nc&bFw{-t<&D($T&eFh=1_IJE#4@dbueiTU8mJ=lAC*6&f%xAgz%&CW%71(?4d)jP{atZlL&!zwb*DNA`iS zhS9=@;{wG5v=*MWT@+i=ayR{Imc)i_G9Gsq4|oPQ4JCFt-%zM-cNv^0UK$eH+E5YC*I!OLi_&R zQ8k|}?#AK4B`%GFYa11e_I1skc*AW>)H;ENL$N&{(ih6TC_S%y>~5O6TbGHH_L?pk zimoA5H-h6m&zl859|&Fuybz=3{UB!1-X8_yOE$!Qt<}g2c==^xK>Nu{mw&cDT=u9= z*ZO1tug7)kiL=b6aJ8H=KiX2WkfLiu)m3di)_bM6>>lS*apN-&zI%?iwQXJ0WmWg@ zDkd5_FU#zYMBKe^U)=Hdh>_Q~8-+JhL-Nme$WJ-#cTsrrpiSZ38x&n*s&0tx!P@t_ zC6Dtr*EmlJKYe|}JI4>NU!Kel3}SB%n|$+q(9W+Pv!Bb`7{3s;ezn_u|GGHK_Q_@J zE;U8|$pJNI&Qo;fQFXTnRwigG+ zi`@S>TVdX-iS3=Y8iI$cQ=hG?^snC)9Qp9xJBqFeRhQ%93@evK&f)JZ${O9|Ne-m)Y8(p z!Ist~S;Zyu*9YGbJ2z6}su%n5gHyQ=uaNGzl;zT};l9RsDXXV16U8Gg9e1)!Dcqx9 zG4A{7`BM11gk+yIr|O>2IXc7q$TwB_JWbW($-3u_TC!3?HO#p8%I9?OFMH{v zbrq_$z3#pn)iT}Ay~jgOJ9czQEN{6}a6;S`BhJz57w^2iH!1y1@g(J!n`d9u>0i}l za(7e4f|In=M}ChVNz7htM$uhB)jjhv&tmb21>T&kW4^~N-Z6S?^5-c*S}XRBIm{RS zW%QDW+Gmj#KKZ`W+yrDy##Qc|dioiy`|0YKT#I*UKFgjI1W#SW3k<6dt0~m&yZIq@(jm5L z&L!e=sm~V+sk*MA+}8zUv^&^3PV<&#s~M_@T#W77R=>)5Ty4`52g~Kt`dka@ETw~s z#|fWqRhs*B$%7jQlTWBSk6b9SL0IJ+b)H#Mbz3$ZweB9P>3VfTv%$gqF6Hg1XRW%E zWnYH~8+mrluReW!U~)>^B?G@WTAEZuq4f5gy?)LdlKN~DWo3C16LrXW62I58q3X`` zb22>qx%~5S_CA-|9c-(fY!<3G?`l|kTtz=@wCvF_mV8$QMcz0b+Z_|Qajr%6QhzVe zFX`D?gB^MS$FyHrkEF!cma6;B-ZQDX&p@c^_@k_e^E3T(zuU2?8?=^%aL2js8MIK$ zUQ?iG$jhVnY2Jy;<~*m1Q+$P9OU;`QySPb11rtsJgSunv&A%{TC-oRaZZ5 z9pmCXcfnv)n}=Oz(uTzp~hsJEZ*}GDEL)8xPhUYrBc)s0Qy0j-ODCkyGVtKB= zAVt@Xs_SO6d553mflGTz`IB-Fw2u_4xn15@Ug~<$XJ*E$>9r5T=e&tbUzW5+#O2O6 z7n#8%yH~SZCULcLs#ZL|yX`_hb-meBbv@RI=*c!^&J7r~%g3m($1FPY%Dchi;agAn z?CCh3b$;~>i7JDA4p$V!o|v{~gpAqfx$I`mR_?CMs>|@wa=zUwioXt2-OLx(u68xn z?w?iG*xIbtUCb-~qC)bhxMF*r?V*PpPcAGSdw<4kOQn?x;pOAQf9yBYS|oZizH{cA zAE#@)H0O>Iq3ABA>K143oHxp2vITd>xeezgxk#2hm>3|Lkve9&;{1(08@u*d{cI>3 zd0K0A?@)eBa^~gMUj3#!r|QbRG_EVW+d3&6=NH+}9I3ihO6hOk-MFAExyprm#rYbEIZDa5G+9|qAsJfLG;#t~2x%}Glf`xoGqZmr{^oNRrWMSWdns{x#)Rzw+ZKIWtN!iKid}I!D@#t6K5u=m z<#2TFn)zuK_ct8hs*|;LMR%RvEDkPLnu-BM*M+KkQLWlBInTP{a!0O^=;vbvfe#`) z&Ycu{G&ni0evx9(m)Qj&`*zJ&*i%>cbbeZ#=02OeQ+X1*OAKhwcy-rbU%*4rb*1WV z%{gjsJL^S+-~!Pp4OzzPeO6w!x-aCoXfp4}w(Vuohh*JrTUGP$@NNL9=#~;<9 z=4+)lA3Zw9MOsllM9T1yn}o}@s9VKfA70|vtKBC0W_c_{cR5v8ChQ@P^!ucHxaevrN(=3bUFs`7alrczTH19CFu3Fv?ukaK0G}8XzQB{?v@RG;-~7~(XI-X z?K?x!b))LaSB-Vscep?5fVA+;pR06oWMj|Zr$V4x{#|>^yQ_XyTQ5KvPrK$4Fue>U7zn)axsV~w$iF-ca{vAD5^V3xyQ>puo zH&u7tkEioa2rXLmQkR?WV$oWY11`n=}vbyN_>5(xvI|_p(gOuO#L6wx;Mc0q2JHL!~-gMWBBQq)jtA3t%k@Dl(C7+FBXRfF_ck2Cu3JFgGd3%>@ zyRnJm5F}QI|aNX_2)#Y!$Q*`~Qx{V60(Vle=?w*qA*^=?teC^8; zzqO4=8!lYmmZMP6IHU1(m&SGe{)(B>Yk5~XeOdk`tbdK);QX3x>}y8NU%gl7IYl>s zsyh%JR;c(|_iUNe-5%o*(HqMbev;DFzaBOyx78wj@shO@)ZXs6SKV%Hx~bbwI;ua* zX!qPxR;kCAq9j9bc3n7Z-OTqWX7M{>-@N;a(tSJcESp)@hjgh>)m&8b8yO4t6jOVY1elTtyMF; zwRH2#i~C!H!$wR$YuXrNb7b0{n(`;q=d2K_?k)A>Y;3lP(xWz5R4I&lUev#!zU@<8 zvv_B`hg$B=V3UC>MFL}gjJf_ke`j&z&99;fQIp!-$1QHZD(1h)LBC)N#oth>Zi;fQ zuK!P`fq;D-1>85Eghh_4pD{&|Z4!rW&#vT#SIc@0iR%j{Zf>!h6AkSgl^IE<=m{p$FI@7i6@9@w6- z>1>u=qUmzwQ(kc6w}OPy`T^5(eG4XN_#75FQmw*c8SpqgN@RZ^7tiA#KMtpLKD^V2)^7+;qGVKtrMIB?JsKokBt{U3=#*ZbkrFcG<~x_w)=-Doop z)4!G!eLqA-G{;8B-QH)cMpwX^ozH}(Enh9>r*tUGY^D!a%;YT5X|BRv-y?Nio(^K@ z3W8$fAFA-)=$lq#LWkT@@Fa`N8X;#Ej5XdIFLQZP$lX&{?t#Azg zI|Qq!x{Z>emlmwbHC&Z>AwOk=zRdKJIU%Pwxj1*5?h}-A2zz2+I-+`@NnU%Va(w3Y z<*OdtaTs*wol)|*vvRk;;$jE-xrD}@0Gd%$-3%%2#;8$FQfo{<-rcFGqTe-VT1%^P zd};cR$!j0ZKOI;QQ#h)$>Cw+u)6=Vk&m<%*cuVv3I-fdD^8OW%@4N5N?{742j4%0n z<|xmx*5c9)`R&)r!$rpRpI^MQnjYABw(NXlU*~c=x=a=~nFp z8_#chQ$BV2ssira5oK?*r<&~>jxSwzHPzok$46vdRfxK)U11P#bAHLPAJ_J|kB}Uz zt+R1=!4bKQrk`Zjxhomv*(da`H7pIkTe4=?X!FdGKNmhW<`&D`t8s`iA2>iWhN^2T zY7*MDxi42gfA^P7&$@mFj`m95qRi95KKYo9^*!%wm3=wKHNWiM(Wt`dDfDH+Oq-aD zmOX9RwzX;e<}Qb3++_HRy0KKdadiYjyR!rVsc#USAV6@uC>tfg>5m&lYLz2;Y*kuuo^k_QzqX)ZQD; z-thX#q_=o=eyYE(x zwx1ufuCCix=9$*VmWd8By(McuXgKZsvHsGAO%h6KpNqG4%sG4{i7kKiL+W`wfvTI3 ze_QEse=Rnr>n=>e-&JH0Hwzf0eU{lbL0gH@Ghc5d8vH9W#OEHm$>Ztc|< z-`9TKp7E1g+e0v4G1FHi;9P0XhaJlJcfrYhXaiMOM>p>Ni5Yhmwrm}rS=AURxb7TY!a!u zdaAmzSL6bop3D1jaji>>+J2pN5>Hn2)_$M&SSQH%S-Pge@r|4o3%0j>652ke3sJULNR=t`Duwmj|yTt)Gxi_ zQn)qmYjxk!rD=0&CzZQSI()V>-{N{yj*jHXy-}C5UN#g_bT?6THA{7hR~^r&OQ~|m z?I^G-PhJu)5d7@wVAv_{7S90p|6}hhpyKGZK5qhzy96g#1a}gG1%gY0ySoJU5Ih73 z7Th6Na1ZY81cC$)8r&gR68O6B^YE=RYrXfbdFPw=n>#b?wf5@j)78J){jXD1=j^IJ zN7(PEs@i|(aoDS}@X@RD%DMvj(SG7n;iIF+11T3;kZyn*1aj+3Do`kchSV0Rj?s=D zuDpDqB6wPlX}1K)wyd54X>9*BOpLc1Y^UJWr7Ug zz6ZIl-&YFjTPv2Sniy2Ndh_z=vrXoBo<%P|)qIRxy`u53=k?c5KXyqp3hLKH0(?co z+}lvFggmJqj=epS{yFvB7~lqj+)zb+Y7CxtgEOo?=u~r-OkyL}W|-mr*>M52)P*0l zX5+`4AQoU?KxCD#>ZFU^_GmO{YXr&D%>T2RQ*!?m)#~1 zZz#yUEA;V)BW0ouMb&%v(|Ecc%k6pg38DsvDFu`EJjITg*C}@iJ&opG z6m)-IkgF&xkROPB?V@X6n&YR+qZ%%5%9c5T`K8pttP|jdgWPq#C7lojZW5bxxfS>{ zB-PH;Iu%ZC!|bO??HG3xDqqgNPbq5~slL<3`F0(Ttz5xV{T`fVzQ?!Zp!37KlPVJc z_XEh~)QX7c^C*UI`OJ30G-X|ghs~0ZLu$*!Lr$=#xQ-T+Ecft9-w$q;FFzKuFNOq} zu4&83yfzvk{xMOC)K_*G4>K9Ts@iIJ_gIa$m)^5`JJ)h)W z){v?71-$gDuUDltml+QT#-y>R`2uDZc>cmk5+su|;f9xZWX%dUto1hxg}NFZC!qn`ASvCyfgNVSH%RVI+dbRX_>k~tfu`BC7R z{B6Bgm{#MWPE*LV>TCeaN5z5M$zO0wbBu#H9IvHuwn8=i9de43cT&pImxvCvT*Qbi zA|h$!`IThUMq+T3u_q}-4eZCVlH9wdG&q%XPd~PT+<1`N9xur3n%PfR)OjHqDLcM3 za3rI)O|?7tmiVXVT!Wx3@mn62R}^7$sx8>3=@XX8yh-!4+X>qU1o6W&Q?{9wfW8SJ zcm5fA#Af3*&ZIc^!eEWc$!-;N%zKuxdp&K| z2%cL9Cy~+vMz42Qz~`t;l&k4F^>n96KFITP z*XO=c26OyHYe8^~OY9-z9AD&r_x#~E{eD1|i(m)Dn*?$n)w_QuFofsl=3-~-P-zJ9 zxsu1A!Y#op{=Q!atYX9>1n`?6l4@{yQb#tSv!)0Pn>yfFqu)lZDZgb2((q=DQr z3+$dBMjX>V8(pV+K0E}tqD=CMX8yIhxdBh@O1B4;E+3yY%YE(3jC&?B#`vH(p)&Mq zOOmr_XHx?=zj)v*5bsBjOLqLMGAOi|jUCrmkNE_Z!yru07NwJzhoAhnZZ>tk@Bl%0 zG^@FFwvY3BxU9+WyFb=j9%NR?EqpT*K{7FG-2u4iAot4;9m3D3!HaK&Mc{{!-fm=` z9`vpkWO?Y?F$76B@lUt-(~e1+ZEMqhY!@)^@awYu^`hTUuDwG`Wo2#>*RmMkW`Nw6 zGum9KlL-8-q@_$6i)1YB-PeQ7LTI*QVcN5Bt`;BO)SDJ^7ftixZ&haq(26 zgg~dFL?*sJA~w|r;AVo{9ZRb}&J~FjtJCmPjBg#YI|>asshvXAYD12u;jEZmehS~B zU^p|@9G=Uik(zrTsTz60%Pi51Y2NgilliMK_`F6I$VCl=aF@QT>Ox~NHz<6>{Hf2X zuo7{hUpg#uhj=PVNcYvEmN^}Fl9l|A@8mPM2&{67J@|}lYjadAm+A)1thPYB*&z2p zA}V_#9I=AjGgAhg*kP+aStNA!K{*tbFAvz>UC)G}{}i%2*`N9zUPgqy{L^pdQx~ch zT5`y1iq5z5=*7`g0QVEfO;L6ltXH1)Ns=I^LrEUklxe3l6zf%yY=I1v1)h$h2gVHC zM^HC-F)hfVidwm;UNd{?@{1E&UtBz0=JGz;Pk@^Pa_^`f%s+Q|^KEN8WYmIHC|P3V zjnd3fTz5X#PNM4!4K00Ivq%h&-u>;6591%t;^dUs2;9pS@Z|W}Edb60?)Q-Y(PqK!6n6^MU?uak6%dATjw+4%@Ri`Yv@1<1EE-_p5GvD+Q%up+f zZ+sKK8MWLl4nwhlc=JGR^sjCUuV;p;HCp_kXeT32UG7o6+2ScQ%OkQGV&D7{Lo$ed zpRQM9s?d@so|-^1l{EFfypb= z25xPwJSqXnxcdXI!3RPucO2F;X*p++*VQM?C13Oa+)|J`TdJ`zhPRC>I1f$wQAcuJI(m%u?1+Qzzu z~t(G{!I0^yge#DFJLSGgHHL<-kg&!XDP45zNECbvskV}H;uR$uWHoS3;!EacoXA-@@ zeK*lieA!9Pc&*;#3a6&|YY*aK&Q##?)~DEuegsnKary{$e20yiMDlVHgG+#04RW8g z8o_t%o3O@GaidJCOQ7Ci-4DRut|kbHk|LN0%4@1wYc&n?5-g;Yt-r8ZV?5##(XP42 z+XX)|pS_3Qz+?e%Yd~&5s}i?#ge?Dk%}EOVu*|WXXQ@J>WnU5Q=Y4abLvPyPI1<{s z4{59;v51nu$)zS@75C0zJ6g3f<=}e$$eaO;w-)5Wm^Lva%LIjO-ps~C$vyu&4)tSHt)AFPLWfq3gcF86*K ze(=fFgWPNkk>k|QbJ$@cWUoaRt{-#QiOt6n*gq^~V)stoF;#by$T#fP_5Fo$eYlWg z!Q~S%FGlnH2{XX02f3LIiRK!#nU$MFp4pf*Pp_L*LhhuQqT~`=RX=_k_0~zi#^XVn z{@S9$dXx?>{_CqWwn>Q>zbwMMdOng|v+ID@iw2NeQfhS`ZQ%VJK7da|kHq9rEzh?A z;~(^D)v4%|7(PFGvf91&84UB6qqjqHAa1`-1zy&bq2KeZ+NGgi!;qi!1>$W4xmEq* zy&oKHn8r@xCbj|~E6o#I#y@m_Eq@h2nx~c2f02}9+r38S`${kPctYGgWcKaGksZTA zfKDqmE+g+s{X>A;1ad#PPOzYlWu-P)dL;Bl2fXmpBHLb1MPkL5s!OsUpWtZzh(n(v z6vF0rVv$B+qw@T*Z&UzDb2K}TiEK8~TPpClXa>1)MBc4>A<+xSrvB~KDzD7n=mo}3 z1#{3^s?0?D=$xfia(RX0%a~A4$AV&*smQNmgt{)wn({CZ)rz%-;h^zttw+rNs6d2_@ zsWew}pmqKH4Dr_CsB9{UeJ+Zz(P6%G8Mj~N5Q<`c2ZtZ`a(Mi^AcJBS^e>?%Ld9aw zrW7|E^!c)=0d6`sTzGe8D|XbNcTiC0sDnLAeXI2Nc@MW2v69HWsw6Oi~@5z2_0cE z>^aDFKFc=>sizBb?O2D0xAMb6?;ZxR*vUr5R?Gjn2BBh|4;eqYR0g$^9EWc+M z(?vwWRe@zqK|Ne&UtXXn8Gvb=Ld0+OZq#@p&+r|!+fPhnj0}Nl8K;+ajR{wcCjzE% zX5T6_O;b;Scn3i)#)G|$z@_{?rrpQVM)rrf9`ywY>OW{SlBz!gY)(IPMD2 zU=JHM9(DZsbjlgjPl35O#B9Z4kTJ#Y3UG%&?nUKktrujq+<%X9eSUjR<`+&(YcLd}@=Btt8li1n?QDm|J}Sq6I#m<&|$@%f*m8; z`=qA3<*)nxfAw2NL9XF&&0FIcty(yYWkHDZl< z3Gu2MNy3fJmUMUV1-Fqn^JD)GBtk{HUi~k}C8`LVLSou(D*_g(X3F}z;;GK@L0INZ zp*lTDc@bbfY69d&YLVx^=HX#*KYZxqA_<{aufOiiT6lqmXxvxm`QgvEdm3D2jA5#M z{F*WIy5jmz%_azbSN*{*SCuyLltg0R0_wvzkh?!TtRr9-Q_=E?*i5L3=R}oa#j$l!jG!Et)Zd(~+MU2gyi&jzTgv?MK)lL%pjyPia!jP%_4OX;b`w4cRk>pYXNs zVp}b>G#R2X>Z}+8reYqEf0yDxQ(guilp*7FmFEta$menN*OvJ zLl7^IcClBU;zv7JNn=lSyC^VuH&IS^=Zm1d+(vwPY+yZw`}yX$l7!3B++2>VotjP8 zOEt&B_pq_HZ|?KXg4|*arslpO)KTwD+>~u%><(HFcOt*;-Vn~d@>;pwE2G%F_%gwj zswA3CStlBCNIyzVIqTbda4MR9vwZiAG{FDA&4FC|Qj3nsjRZ9`!9y8c9BKJdC)2}B z8|v^Tycaf4jf@)j>Ps*5_wMjLA+AjF@0#;GEq6CZek6grW-mN9T!>Qv#5)gi)AMKj zwIiwBmFsqX2jM^L6|YULJ*Qgbs3&^X!D?*O@=f`SjcQ*7p`=l8A2(v}YQ*MJvhw8{ zCIPe~*Bd?9K;EBwju-obFF%$u!>&vA&KL#@Ca-Uc+1)327qVbGY7yktEogRx za2id*%PA0Qd@UVsQj^Ftm^zKre01``m{vqu|HX&PQzk(zaku>Bi&mEmUOk#J>8t1? zvtG2Y=g(Kc{NxhIy)qcWpX%j`U&b~-i^3FUq&-r6$?4*Bu@pqci@YM0Pbinfp?4X< ztfUmV;oudI(G@#5pna6-;?h#9@xtqg5un2|$eludERNCf=Iqf*Tj|r?!OIVivxRkA z1;zy$^W^R4=?jrtqq1DSP%=Az{3H810@6k|Uzw31-mo!?r|Fy%!j%MYS3s^a-U_P0 z)Z1WEgyy- zgdT>v&upkOYAE!2 zC?z!BcHsW5*kX!#(LYwPYoM36W@%Ep72y5=xwA|@68*jr^HcRi?=79_)mfD1t1mKJ zk6K4OB-kcm_z@`T$>EZ}7v%kH7>-gFT!}P3@Bf927F&>S>C@H3i2`ufK<-;5Lbfu) z;Wp_Iwb~9b4&|nUOB(Ih`iKxD-!%JR-e}Dq*Z3?l#x^xomtXRzm{QeIn>ZY-@G#zsDj{jRqh%*$Rc0=Xtv5>rLiv&3Uf6}HbzRhgc{cVcB-;ymQ!c+j6x+tsT7?I`vmrGOSQ zk~M3#cRU-ag4oc=yFims6eVS5mXyzczS|)85H*4!15UE$^+yVVaSHQ@@(0#3CDo(e z@GcL1{ z*d@h+&BWw@&)+?LW!4LASq!t|^-BQm9?1PbSizK?Q6yb3n0l|?m`s&mN@%D7_2j3V zmzNJ60-@jUsi+;@?7sb?{S8cFrVU6+6-Hy@4pv)Gi5@0l%qf_M*$266Yt&_tzm+4D zTI!kNur7a@WXOc~LWcIQKzR2#G2eottyW><;Fuw3Sh6>{TB~Cs0UZR8a zUYsv@-8=xf@eb{^x}iRtcCsAV&c6P^gtRqD3IgR+D+Rl87NdeHWPbV{Ov{XPaZ~#8 ziZ+fj4|Zf3ratiXn!YCfI&3_D4(M(42H##bwF3Ih4@_Vz<6$l&u2Mj z6RTTTn+I}6_Z`{qS?sjaKQ;i*lP4gT*lCpeAqpzij-A(z*~;T0O?q*^rK9;|<_GnN zwTzVwr2fly)|h;h?Oc?w8XIadrkM6-=C}iD{9ekfE=Y)rtF+qOC#;QxWcc*q?ye*;s`P#E@f3`Wx z2f^njPeJZ^t;0MQegk*!8c}KBz#Y<@wfgc|tDx2paW|Rb_3FDa35|L-g81tJwWz1B zw1am~Y0neovGx0(wJca$3LJz1_2CTUzFAt}@~T1-P&+#xa7_N0g%o1AH1B3V`dot= zg*ckAzpXJRhDC4I&4|7IGf{XPV@t5(tiFj++DVhz2LyBTMSyz_ax-*j6SS10S^RV^ z7~JpLLaqm-3|&66u&Vdw1&KJ^ulZ1f-_lzYd$RMs?@=p52=xWweHvZI`?MOzSE#A| zn@#}t0^~kUM?mf};#VA;*16m0e6It8sY6^9F_XgYL#Eps>Fyn z6Wf-wRl%sgCsCFu%e78V!ZlAQA5TZU@;w#z$1kZ`ZkixT2DraK?l?{*qJn|UrBlHi zue-a)n|&;7F-AsdL{>h<(77eM^e5_k?|X2t^*HwgN3%o41r($qnkv_a=Vhaq@_Wc)1vTNcADqOx)=$zd;OHJ26Ls5gz6}VeBMM{n%1J!xq!ge zJ!+}|8N|*GjXjLOpndtrSwjH#56E?`V!K!~j|;5CvFkMqY_`Ty)wK`hP0Tb_-ecD< z%i%wcXv%&01T6@aCx8+^+`i(C@qzm06NNV^X1m)q`kIFT_X^~0Ys$q?{RvD}$*ie( zB&6W}NSD(Qfv!C_ur&6hiGRV*U*PKmfqK19B^0#OU#qhVA8f z{A`G~o(ts+eI=)F+h_uxQ6Flf`=RiInrC#Z(HU3PvfsA=H%FVFm(=#1>Wx8(?8o6L zYXsE*7artBt8h`14{(G}$NEtYkyX!axO31TTK3Z0PW;;3`gk{jq1B5=J{(P!tW7__ z*_q~#8C!-drJ}#UfQtZfeIAq2Ihdvil4_A>ZTcSRXzBY1z4fw3;{rnT*YIYqiHjkYV7m{NtGqGDAm#It71AXB zoMZLs2dU#6UT*vuMIwBt?&0N)^F8;|;Nd$lk@F(!XIx%}|9W~5Rv&7W(@s5LvEQX3PZD%+lK`!asvzA_L&Ua_u(;`Mo3ZB&!(yr8H7x@@(f7Mf_vVMTF`T zd)AKKV6`)_-!`b{yy(f!IaKXAQ%AS(jlS8xbB zFK18H(AnJdp%zB^4nbFR(H)GHF~3hH5lsN-fC_TI)1sahlV(-XM1+CD|4c~3K)kSL*>4P@;1oDp>?ak+UG=Mm%qh*GxrDgvo$@g?O~y(bTudcZiXWZ2 z<8SHDlSb^E1W%i?zL_Y#mV+o|sXCrV(7y}-ug4f5H@9hzHTF3U3TJ<*fp5@~%a&(5>c{y*fGN+YyFvb&Wy^kix+e3hJ^{a&bu!`{rrUTfph$BdmDx(Tf%@Z^)!r$c!qZSXCiq zAT(>NG(dt&xvK}@!rJaP2049CzIS2;y-wY!)JE{Te>9-UG= zS$75sZB?UuBA&n_uuK44T#(!8wuIF*$Awpk{6zTy?WE}&c_qrV*3LQ!EVw+k%WHd!)Dd27lSLKhE%DO#!EGGZv^)O;8LF6=+=HwNKuUB(g}s6FxewcaW+|!s(J(tw|3#xT9evdw7K1m73lkgl6j%UufjD6%JW|3l#8MXiO3O}2Ef`tB%rMAKyd*_)~E(Z{ge;NEt*xUXGg_=0`8 z=mind!gHxG)1XL-=AvgD0)G%)=gmr*RPV?KyBBm}wCgo@%jeIfMU6A*_D$G)$UqWroO^Jl~$Hw81JCAQbU z(zQ;z1M?s#%C#_%l1M&(r+UR-^!No0{Ulk#pN1`JZQX_zl3Ll5PJx%7l8ZH>5zZXP z+L6C+gY5?rkh@xd(qN>Y`zU)qVKU>ZZE9}Y28Vv>o5uR(N+xls@G9;T-a%~pySRjr zN4>`fQ~`c*ww)KA(o5XLU2+5-&R{#06y(CaCVkjIpkh;2n5lTo+?O)keP8d7{dM-N zTqgEYMf0TP6zQkG8omZkhReViP!Rj{!QnrVe`pkBH;gAOXiE7D%DUNaWFWV#cgDT^ zVC<1b+qofqRiAp<)B)C!T17?}LcZ1ew`vj zBc-XsD`27raAEfjZw$g^vCW8hEdAotBUu+j2(7!mu^{U(324Dfz8?4J6K zL4;^O#UV*meWE)xPe5#Mf5%NqKGjF$IQ3b@&`GehotpNWI6M6+zQbti8#XM;IB8K& zs;MCCkC|o2e)vcCEgAtGVB5Gc$WMP#88W!{Oyo_>XKW--+Sp=K4V&-bdZ@&>gpup| z54j6>y>xQ_@bR78J!9!*<-&!&KM!k5irx>{K?iK@#`FZZu>X4B7-aq#3s-B+Q%FyQ z3KL-|<8N{}?ecx4>zAhnTpmQv*uxDAuaWm$S^2*6v6#Ybsi}5MP#*^A&8F;ad9AZG z%WDAK`yjXGlhsqEi6V=Pbz5CY2k$5Q9>%^WKloW-Q&EV;XFBq1HQ9)b zT0&Zk!N+UmwfaE+H|zXA4;bT90PX{jyO?$$8gT}P!&y3reZG$3P*Clnf|lzu;ic_$ zN%k}_PP%U*l(w|v&jDS{PR15y@jXgPCgpvuwb&OT$&vX>nx7FJ{X$aB7(xHcnwTdPaay3=`d;Ld$%OI zFv|nnMOi8|}Gx`v5!%)F5n2w*-L;ZccmPSo(S$Ss_2f&5hQ@=4tbjIUx?IY>V z;2*_R^f(BJ3qz!?k?wb1u0{2Dj-!9V>3ks~Rku9(+1YRS{*y{&5ksV{xr}a|li3i{ zokL?@u%E>Ma@o7I46WeizM{1e5U*j8s`qFczqB{I>k-oT1}#&uI6tk{IO5@WoO#PY z7dxk9W)f;gMqI?#LwiaC=MTj*&rE=LVQrKfgP^D%8~D&H@#wurU;a`q?|w3-{l*OK z)5kZB&hW&L^3LPUxB=@+bkWayzFZtgQ|{i~qGBp|eFk0FSKk^!oOJ*$EN6RT5Owv_ z;K9?WxD3T>-~D0ynBAdmj?P69B#y}i4wwg4Zx8_5Z?9<-@ZHe~rq+1^2b*nF- z#(VuJ%Ib%>4t{;7lq@;#VLk*O_Q)L3>lhrTfd%B^W0Zd#mP?9fLZ(yH3cfmH8{cco zx;xC9f4#~u8-+?_;918dIXV!TeNk|RoQj+77%g|D-7>J1tt%bQ?d1mR1Kpf|SwZe2 z4_`66&sci|EKY1a_cyYRvz!LqEhX=wSJZp%aJ?$`9)sUa$PC*FKZEm9njN}S{P8vK z`^ej66ea8{{X`}SfXfDQT^`@LNO5VbDKqL+jTwn?a_i6?iswbGA2V*k|9q_&x#+nx zFeZT;@idAYn$8v@H`1S zMs5re{4K7ynyer)KEhms--IO|bxGw)BA3}dh}w#@D2NnQ3z;Nf?If!UId|b_059hz zm&{M`5gA6pHI>(m_o5WR`z^3O?Ttacd=GcYd7Hl3Hxb8#>RbHtecT}TkL42zdj9wB zSJgi13dFhgduI6S?>y;(7BA+@LcS7}{c7dUZ3wB#@>KB!>lqiwT{do2zIde@7xtY` zY*gzJKP^&PiC})h1XV#LIfI@~tGX{y@6i*(w z`a@Ya^?@7YW~gO9Q$wr#;3v!1qv5M;H({53F)1W&%QA_e@{W#FuZ-XI z9Se;L%8z}XAX%({FVh14rbBYd8vyq)$Q4AI*<@#bk&1X9^=H9zq0qqKbPiXv_Qz;s zA(?n)rh2df<*U^% z1?pw*zC<^YbhP~P#;V$Q@4Gi1er2^b32iR9<4cjU?Ds-?9naaO`*^#bQ$K@Wq8lAO zz;E`KHuFWb90s^NAeX7_$Na?7i=O=>1fB@lUWL_>Up1Rfm=9(qC>MNmoE=w(^`Ca8 z$^1T}c8!qPs?oL^mM8sHS#IjcsOnr3%GM8XVb`P^gAmV+G(o;lT}Adi>72&UI*c`W zY{m6)m^D|6v(4Br;m_kFr=1?>;*Uv@E;#}nCiAsQ%6`XX{?j8B{P4M(3>E+vmP5KR zNSc@V(A3oPSa?&FfCeH|qoe$8v53z;b5^Z63_&aX)d)CuDi$AAos7A)L{rq|jbFG$0=Z(Fbse|hPED(~w7>L*mR;8tdER^^Q8#>gu3s7~_i|Go z1VFAMlj09!95f$0seF2lhC$sG1l-z}S>J}p-G}VNGCzOn>B)SzuE!jqV~2DU^zoNP zVVs46UjyRwgNFWukpV<1fGhala5GSZahDtt-7m))aXP)Cp59m6PM4qflDLS6p!wsA zga^(MP61rlGb}d-(biHXKYC_SZjc;E zhVta8p#*@n#AXfnaC97WR(AYd7+xdD0QMqzEJ)}c*jA*VTT#?~-zr)cWC8~REUfO)JEV?Pz zX_dPW)st#$>_?YsJL$y}g0BItFvt~kOLCkpwIJu}u_G3TYaeG4dR9JWH?xiN$mcKs z^|i%j)^5b=qx7nTnaqi3Eu8Loi2wvOI{cT0lo}txo}Gg2_2(cr9FNF+=jdDaZ(0U& z%Z4~lU#cB`ep&Y?TY;zAY$% z{bLc3OKw%3zB;8u6}mN`{3Zj{&(#etunaEzn0<1KZxbo}wMGKY@t@AupRO7Ibh>Gl zRF<`Dj=U!i6NWs4)DUa-4gflcf?Q4MZ@FJ17e6h~nR4>fMc0}bPKdqpMt`zj_s9Or z>#J{;ZPBECpgt#c*C=qxW*YAk1-1CDQjjwsm11lpc6BZe6`v zuc9e~hsB)9z6dQ2`Z#gYOaollHUGvS&ne$*5{_`5O;z)I27DokEJ~I?9h zBy$#F*R&h16v*`~;k}&w3IBqCzgUTnbbT?4^3z0C<8rd_ZsYs- zyBN+^?-FKTx6;8G`^}2bGO@Q5G&g|#ZfTJF#KTYKSl6$^H&cS27+LmE;-Oc2rW7lA zaDp!O#c~VpuQB1Pv<|G!gpsu0SoVZ>Yc(h+WswwrR%=vsCsm7E1M$j$T=fK^Q;)F% zslkQ$tqFLMhn9r1eFPp-N7kzg%9EII7ri~!PGYaCu^uc_J{jVVmQ)b`S($izrHey4 z>N;{xm;i8L_u_60lCty?HB)>hj^QbB|Kzl#V391}kww!;qSLPzu7ppbE+2m9+K)i` z(uCe|jQ)1S_KpDs3h|u;EbT4z=#1-!>oWlN1<1wsf{!5PaL*EPs2<%?1QK}QJlgc;6aKja^*|fXquMGD1eO#Z5%kDbV*;9ryJ=4h)zrTL+?ODiy>@6t zjuOvR?>*w|T}<25g{sGX9TiT5E4tjH{&#el;xW3B*9D!{_~Ksq#o#M$b>TE%A*35W z?q|jAZMSX!+dFa~cci3_d9CqSQzCN)3AaQaONqV4UAwZjT0BwMwwyCC_^VSnRy9h) zM_)F^Y0V^O_=t2%i{(g_wXwo+i2vhL0|U6aAZC;|GMM?>7HjK%dU;l zz@P<5qVmUHYDH|a#2|5A2|iajBcZELf=>{QCIPMz$n`QiSaPGolBkIs1QRXR6)W3Zt(9y3Tx@UTjEYSBR4W~lIuk>$G?PFRdL@hXE{ znGZuggTO!@_a0S(lhqlTDl zPoRU{|KPRG7z*QG0k|q4moaFf|7n{G`rL62FOqnOv54n_QLD6+=ttThunfY~#=m1w0L54hfY!Z!=Z(#E|DBK?Y=1;bO}}gPt>y0qin0x>m}tQ)kMw?) zFh3-%A^dbua5wq$FvYjqd!--{y_7yzC)1EaX1Qd4(zmX>Qz1))HTu$L4 zU03%OCBCxJLG)3Efdhc61#-VO)-_L{e(rrI+^l3E+#|UDQerD!|1Dbe1J1?@66(jw z;Zj}6JQa}Skax=3=X_kwxQKCm2wYJK)T5jY*B0IYR~zISDXKBl97W=ZyT~6n<;!F@ zhSEGJ(EJtUsyo({$a`?q%43vA^zO*=kKICcix(1Ob02g)+ zx-m%kI3B^ht2niB`#a-8yI06uR;a*e}vLr+K|qE+`Hq@YLRVT<{$Sa)srXK zL@%t-J!JIJu}cNNcz7r58hoR#F39!s`_$4pT~unINcrZ+Mb8&}Nxq=*6#0)WXI4YH zDs94V2|0M1Fk{<8vkV_&;+BaX-1)ux#76zfrkBeZdzslC;Oc=~<52q4?JxC}jW#jo zlk-J+Xl&|VF7IppRFT>()ZaV ztWR+huRh2n>LEGL?T)3+9GjMsYZ-FQd~Y_FUVREb_LEq@LLki;jj8X*CBn1+bpNE- zMp~FB5hgh9=h>!6c@@tOUv1_Uv5b?g2#2@WhJJW^c zyP1cso2!lQaP)@%nvg+HZcW(7+&|3G^*RcpWJtkER=&gO0dNgLZrQ16o}KPS6wQm{ z*M*j%A=hIaBt8Tlw14bb47v8o_kM@8ms@7x%kj&lE0zqAihSbm8W|z`be0=sa9X^w z+W>HlKyDCq#E0DnBaW$N`Vco9gt*SquY=aSejZ;c}NA*7{3eeE!S3+p4^7=)uK(NY#?*BLH6Z4&`PC{8SWWQ?;BLCS5M zmBeotFX{m~&*KqmixOg2#@zEex&}a zq>K6G?3-2egE)CYX)c4fcb9?>Q?c4eiDnx2zI>vYIV|QlZMDlZn3t-fe!+?_^sNH% z;@c`eSrfoD1-TLl@7FX~C?6hIN$l}ptS8oUgjqK76*4?7l-{BFl0TOkl6IH-b7bxZ zQ(Ij$YjdOtxU>68P5$v3zgW=fC+D96Tr-d>R(mQjcks+0fxDeFI@BDl>-8RKTcDeg z1;zcnyGE_|sY zGE4W2jNtyWr7N$5@mG3C9s!tTyD=VZ#qMtg|LDel(A4=(EJ1)R5}z%6tsHqhWxW_C zqc9(xiMShe4RB#OgByczOBj4jpJ@uqds{&UIm^||_I!hTg>Mtp(o^|o_4~JJYYbDF z^H;(VY>z%tSto8%GM07}I^MT?<*2PdFCcxu6fT;wmsz9cjuFC-Iq`;1Rs?$5#Kq8iUump zZ}wvgY53K`@Fxd`_N_B0_otCoQaqFSMnyfq_Bw3&#vl%s^xdp?+wkBz&Q^mt%-=oQ ze0?S7G*8bC|6)_V#kg>Nq~d<6{%?jU;*ETHCkdX)pg9ryL&?6}=DFVT9!=P}=B7T_ zfZW^+`-6M4y9qK^s4-<2mDswf0S9xAm}@CUTBZp#IcD!&$y6%@vT!qbj0))H-2%P& zqI`a%Ilja&{2uIg(9#NUZ9y)o*8GOT;za5&Z-h+ep8q!QRWXgf$mnHpWUEE^59V{} za#I2behJ6Wz0w%XE^Hs(7zB?TE@yR(jU>KSDKm-y zo$BtRttI_qLoKVVDq*e8hn}7s)!6emE-)i-N5N=u&n8i{(DpeG ztH@NNhM?Qm;v;7g1>r^`BTu3(fD5Y|HwJ0i4Stq;{m^9?qMc`Du;*UZ^j1Ng)Vu4* zQ$~Xyvy+NRO;C%k0_5Qz~i)8YI>~*#>OA*9O*B zux%My*sxezI>HwJhYiMaFmbfCaxsBRK!k%s|0mo1AKt+27jG5#-&g_I`Qpa^cljBx zW7^Eh)({r&6&@UH{B9rE^8ZYOZKH+YuXAA^^!2}D8~-!oy=C1h@UIkr)n`i!Ckxm* zew6?JT?b*?&7^{Z!+;*6MphOq|C!4U@-a6b9xeW8E%-|-*C2m5UXMz#(%&{r&8I5^bXbM}8E({0(U0{>Ehzs?c1Hr&v) zaG`l1SWX63=4fK=V&VV?CnJ7)J^Ggd-hOziz^wwe3jAN7!0mP6-)kqs_Q!v9e)8Yz z7vDzn@2&u>PX3>MAM8JIyY%0EciqN!tH7-Sw+h@UaI3(r0=Ej>DsZd7tpc|S+$wOZ zz^wwe3fwAitH7-Sw+h@UaI3(r0=Ej>DsZd7tpc|S+$wOZz^wwe3fwAitH7-Sw+h@U zaI3(r0=Ej>DsZd7tpc|S+$wOZz^wwe3fwAitH7-Sw+h@UaI3(r0=Ej>DsZd7tpc|S z+$wOZz^wwe3fwAitH7-Sw+h@U@V{08yT9jEN&kDk5;T5C2O|~>8%HMtD=QW&TccN| z7FH%K$_^$bf>a!ARE`$zCbp(bR9sXBRu*P9wx-Z=BmZB!y8g>x1%J&6^N;aa|MB_F zd)PQZ(6PGzVX(QRU}NeaK)v&?A~@JQP_T7iV<&h0T?U(L304N3UIT96?=skYMzHT9 zL7n*TGT2;1urg$*ll)xd#@>a~hrWl!3DX$1 z9yZkP{Jowd^cA)U9seKB4EiB#TTXwM;X;>{pk*+qJ-cW}z{+jO$4vq-A>yf3Vm&Z`Y_Z-p#Bx=qfj4%`Z&}lp#BZ&lTe?6`ZUyMpgs%rIjGM={X5hbpuPz8 zC8#e$eFf^PQ2zn-HK?yceFN&7P~U?3Hq>{Zz6MZ|HbLRmkMX@~oyL)B?jwC^lXh7KG0#QK_l`IGdqA0qz zw|BR&w|ngF9UP`Z#f*ZYf(gtR9tO<%6cK%j85G2TSrKzYeNX&YX5ek$9pF9Sec%J&L*OIeW8hQZGvIUJ7y&S6o&?A@E8isTY~T~F!~B*5l|TeI4mchd2^<4liI_`(tAIEV1}cD~ zfa$ z(w~cgLx6(;@uOXUy@3M&@x9`M+XKykW;*_Z zNpAX9)0f-+P3=Glt$MQQ7 z7!QmEjsk`QVuwcqV}MbB_`;FEXh3Mj0TY1ZfXTol;56U_Kz!^J;1ob?@+3ggC2gwy zJ&|AWv*I^S213ATfY6?*e@pod0ui7BCEKzQ3H`%WU@* zxkjuqj$i4sGShm`9vlu zYZ-7IAU1G4a3gRFunM>bxD~h!xEr_=SP2N-9l-5?q~E3CpZrR_&H76Hq|U1WsiV-{ z2Rr~g1Uv{l3_J!r2|NLad~*E^um*S1|(hXfW#Rh^FV$N1rFg_Vk;Q~rF}jE#F#{H5(`MYC2?0FAhB65 zK;ks90ikbAzE*(HN}VMR`<35qz!$*BfbjYp_zd_I_(Wg-%g8q@|gFMPwsyKgqKMxX_8lXn`Q3c`VeG282GPFKZxrCfgXU# zQ)KJTeOI6hAiN}IJpeFy+GUeiRbtlvkgo&35?3?_+5x$MjKLC5N$e{1l(OgV&?(6$CTX?}7q>Cz@5r|48@%yhYybdgia5j}U~SM(?{ z3a$JKPm@mC-tAiK&d$>;N9;!IL~wF#&m;Pgz9&9Qep~UI4@kea=j#KmwL_XckCZ3; zB(FVP(xfh8BN98xJZwJqgZRCYU-26+1eB95zDayi7$^f~0H*+@;3x7c zdN_{X@qp=@q>ss*P3mK|=>+bDm-sm8kK()RdJ%nz4>0|U^nI~4v)@afp9DxB7M`L* zvA@aOi;ZUU61?y@9_Rvy?VQZ7*wl33BtZIr_zAIj>BCd_l|FbPzteydfT@7+7Jg=5 zk>68EH*KtxYrzNk6`PVWgtyq4@IDQ&`yuHQ_VP^G<<~63te@~S4imJU;=Vb1Aze zAbOX&v?8q~&;qCih5}L2O+I4t=C#SQj}338nf+xU`4iwzJC8s7Te{Ks-DmLh;{K=9 z3}n@_e|k--D09`b38C5IJ|`_a=%FEl_R5`6T&OsZDp7rXhc*YcnBRT!%V3HIDok7c z=7YKLiQ6}{oAX9*3uAr-?y=+RPro;Rv4O{w`c}Yj>tCVw-=+ke|O9AU`h)578Dr~^*&&hA6VbJ*Me{< zn0`t$)hB7g`qR&R_qB@F|Gq0P&qz0VUpp}ErsqBL-p-$A=H<>PEErHgWkb>AT*)-0~izhB=3OmRVxlrxW1(ZRZ$FDL)Fu%efu>02_epwRr@;`|qX-ZFI3j2rUO^+|+- zp%iqBzIc0U`$g-PK%@0`KB;?)Z0!#JBXYs<83a*g+xo(>$UNf;9H2t7~TUoSLVV*vx zZ1vsOjy*wfD=H|#w)HnJFS>ry3A;_*ca6dnQ&dhQ8BiZ-m~&qF=LHjL`hn>SH)yh3 z4$MH>r?@2j2K_^dZhLM2Z8bX#ZpDa@tO+H8$#BlY&s8_M?$|a7FeL>g#gr4OjL(Xc zA^Vz(PuYKHpT`xZpOhnhNAy-S^wtBv4vnDHLuOYs~(4 zp8dh9FCHRdQ8ZY{5-`#VH=h5*Q7iv!b~~8kPpRQi?Obi+<{a&ON%V-E@hPtwj2Q zOUqHyx__wkiuzt}-I91?)&nOisg-sdb)b5Ewru%g*Vt9xoO!#e5u*OKi&k_$bo|Xn zz)duYt}g>4_I6~GhjQ+DdF`dD9ECBzCXvw>ikv*3Do4@012@t2Ei-Ft>UK`=1UJe@ zbvfH~Ip^LNe(lgf6CTs$po1U5bcW`?YXW< zYPsHf8rr#T+4>H%s~#24hX$lgt0U!g;wnnUe*Wvj=l0xF(TD&Z{vbe8iw^d=;iGrX z+w+qWMWZx&FPNra#;;v{{H7;MuhSCHK90J^hZN zjCdDhbMOb!fzfDHI8hPi_vhPNUY~bG`65N5H0t7!=szyL7pa?~PU+jP?0f8+Cq49C z&%9i5d@=}@2a~DU{MLRvW@F*_g{P=;@JaGrlbWP7Yx5q*96$7`-bP<2lz!TU!reKst8|v*Wt+&r9M_TUa=J(x^TKM|KaMM1%p?1#F{;i>hRplrh z1k1`IiRx~huW8?@+a!Dl7^R)^WVkjQOC=v&bWYm^-(I+NHz}t?TF%klkb#vL6wm_M z$}W9)YUI5ezeNY4ILc`#!3?P>7)NfZ6_({2UirE8#6-60NFtb`)1Ce8S9OEO?6+K(LrvGitu@@XPYj)Y+$D#c1%}=ucCeU2 zWCXnJ*STern?2uDm7{8UJs9crlP=n{>VRou_OZC#scClKQTFNfPcAC7Xi}BonAqr# zKi%`?%2S_Nn3ww_dBpIfYIKir^Y-rDe`RI&W+*^ zwDnd8QFz(e^f{G7_q!O<%6MY{xAV zejK4OMdCxkbHiX(_CDdA$t|~UwrI{};wbI2&zC238oJ`rKU6tN>V_H}P4zmEH^i@K z^!s&ZR$ssQ<&Dr_Z!(~^C!i47PJH^?-LK#J%^{WqF)-4DPnh`Tv8Vj_;zvSb^o2jb zhy*v@b;Vcvwb`%$j06F++@6H$qU)7)JL4rQ_CInrWp5JNT?t0);m>I9ebwELeg_)u zDIV4|zx{D~<=SaWZp+JEP6|cTKhLj>3!S=s)P2p~-DK31RzN$Sff3otPJDLljm=l= zo|pSNDJZ7?Cw`@-Q#O9xV_rP}L?xSwE%VzOQWx#>!&irnXuVrr?tjTk)6|~;Mp}D( zpS3r)U;k`tXmmeykeZo{^f?FFB!UEUBiuyllX9Mpfz1&5l74v@g1rkci~rh_m~VnF`>C({;i0$R9r~o<-|)SCb2@`T z4fVgb2+!Kt_myRehPErrc^8am^t92TCfzQYB96^2xi(yrhKDm9?lG1yp z8nTI#zZs0!b>8OL_17F(+)I_CxMj~Mi4%(kijVi8De7vJvu)+Y%{Oh@1Ka6Jiu5S= za!PBGrSUq}fUX!HsUJ6qv7X^Vs?#7!%gdFCUI}{pMwhc{1r!zKH0fsO;H9Zozp~-Yb5706B??h- zNDqxExgs?0nHyH%`Pz~qzN3&|>3j2w-b%IZb>+0((lha+!H8GBaoS;<@}3PHU|~)I zBQ3Z2oc-?Kdt>k2EX-^$bmsa+->-amMD5GnEzCt4v*kZKp5N!2PZn61o50W=>hC@K z>}@Ug{%)y-d0b;E7S?RMba7?9h1m#3{OPFkbH?<(W7?G#<{OO}x8=^dk(2UlQYRVX zM17OK7=Ce!#g%hgi}k7qa?kEY+dg&M>gPuN^TAOH(^rPTwqROP&h-2Cnih_n7gZP! zs}fJ1y-s1+n_yDOXrvSgMl65-uAAFF@f$5yj3HnmOAazxZp2-G-P!T};mws@tCfWd z4>ml~3$c@yO?c(tdD5n;YZH%Vu9W2GUP<0ANb54w>klf|u&Rc0bjO*V8cP{T)Lpq4*>ptwGC5k1<6oElJfih?b*vwl+;*j$ zqk0?jg^#~K=>0mxE_r3pO(3!-~0KIid(>lC6=&v2uAwP)McO6H}81kO3NR-4n}%O`Iey% zObHBREV-8yoJ4)gfPtBs`nK-GzuG*Tm-{6c8lt`z81cQ~OIsa&#Y?M8DMx}^>|g{K zq5b~FRe{#s_SgWX1XqFgKN^ki1IAn%l=TBdL+tF;$^6_3xQLE}Giy~l{W4)mvtjRz zIa1ZM2-D7qhHGPjD%tD6V@Hph&g=sT)EZ={G8ml&=Cx1e7mnNS-~5 zj$O*)p;RIg3tv2?=ZL`T&&vEq#}tpFS&5$3omjYIpGzOUT*@&#g+t^mqb5>63yrkg ze!HL8X?&-18A}Eh^kcMVXIW#q)Q-6?(Rz%mPO?-a_T~^D=*VHSrkS$kqh2jLkHznp zQGiQKjsy*7q2_AdM{tudt55U2N;@xJy*s-IxSc`7!1P#zO?UJFoah1$tS1W zy(+Ky4~j-{`%q&JD;j%zhxs4KYzo&a{bwhb1EHDPVbmL)e^`y}m>9?Us8O?_KNyU} zB9luGrW{A>RZAtmLQCLTf5e3oZ~pz%=ov_$d!xh5NQR67>^`BiX3#X88GTAw(idJ_ zct*3fd2bOTnWJV^Qv4C8LLOZA)iBG*h|0o!h$oyd%{{qT9asQ8*r>D=Hx(8#!eW+Jh24%%0y+T7NA?N=Ya{-(kx z*&?yZa3YdQwzzhC+jbwki6u&14@OV@p@9!TUbNA#fx<3}`hw9u?% z48;>MbiQTBOU# z=Jgjwf)TwTb#+awF2v?X&m&4N8qjQaS-TZa4yO4KLkGdNU7s7dwEZti0@btHfstN6 zYsiudXK#G(-(Ym);Eox8gh8|V#j~#%UUAQX(CB$^SvXuBh$M5ibbsZ*^G1C=3=AzQ zeR~=-(h6&ueR1c=)n%eHv=tu|m4J``|qn)LkHUAZr`YfQeK^QaQhza@?hVCf6SdMywYL`SwU1Ioxr?n$H)M z%9@>M6dK3&Q5c8S6&-OcA8w2o$2=Pfy>jqR3Al;xg&Vs(0sMT$mG4zP-gMf#>%nNL zuRO|#$ydDbvMWgz{xnLwlnprvWw>cjk z{gu7AGpknXj8}bQ9jXqAJBQfkp}l@ z1@{qS6*X;1O;<0zKdH>KL4h3!O%WpqYYd8OY+j< z^)r+47-pAqSfX^skal;^(Gp;9vgTbCNv4*)zvSVG=YL+PCBP$1JI3&Qk1jsrgW)UY z$V$B)nSx-%uGf5c&iWVYW>kT}8x#}|a^r?oy*k3+Hgv|1wSOG7+>Bvq?ag3Xz-`pJ zA^VL_j6Xq3K+oC+MrH*CgP#p=yLhs!8cHvL+mMk4w*!yux?BVA_GXx!KakY8E~rK3;SC6^ukR-CI9(!}85<$c$h50yNi*GTOA= z^3#_sTzR~V&YI>IFw$~g-#g@{)(=fNL}6s=>>-=`zVp$ejrw%z_~+S+@A^W<5-A4> zjs+vK?Rov;m%E?)`OO-GKX9>YwBs(dyWT3|)n(!r{v0~-#YZczG1hyP1dcUTW8n@Sb{tz<%>mtOx+@a6YsbZ^=vljB@qNY`t$oQ0 zXEoXU%2r}>?4Vd2X&o4`-lL!U@1UVC&A!;Oki}qR_V#`KOUE60(C^n;7IF_585iQq z&f9kD0c*@1DEgecY-^#(hi3iC3!1;Z`^fjLayEcz1LpPqU+0d0sm&M*^M%H|bM77W z?2-sqgy%jo;+E@Q=-tn-5Y-#6fkrgiZov!7o|<;2jAmjX)byWVB))F_=A}nHb^A-- zXbe(63`R!HyWX01*YlU$CsC*J$|X7Lz(^}>X?smU%lh(9HI4K+O><1$@N1uV<``pF zURL^Y+n^QTIcl}_FEA~@%nkJV z>Wo7>Y}2wKLH@CZu1~*Z!kFNymn*ew)U-1g=|3xfoO{8vWnCXp7_}PF7mW1n>S1Tx zz2@x0n`s&%hjCzJ&eZOpFS>4BbZvJFQx2vjn2p=#y!}as3HNFY63hi77T@~Fe#2|l zzV@!h&~le+%=}xQZTZe_3uWy|S^=8dHMiYcrXF2!-3Zf%&`TZ#BewJXzHMh#ZusL^ zi{{^8Lt+m{P2dFu76DF^!y3vusR-NzfU zO%65N)a&{ghDKF=-20EC#jDY5_yj}OPt4su@$C_R4%IbfJazGw=xrx7(tmOW{akzV z$V*PQwBs(p-p3hs(B`taU3YGIWvfL~4MzIH_TZ}Bhoo+QOJiucIxwQ^CLbTZee9Ks zwOvajbTOEGF#nh`=i<+=?)a;wp>MnNEbRJPXr!DK%l7Ht`LRpC(=_gWhnl+R8VTGn z?s{{lanUF`aN&lh*cIDx_r30Z$K68Q`a<9TwZ5<`_4&WosJjI2@tb@5xO3Z;ImZ7z zH@9ez^RTWnBNwUhcq&TA;>+C?@-XJ;QGQzLg9b%~MC&S@tZF?q)k z^J}-go!41M4z#IDOyTJ%+*`pVK7gBxg}BEDo}SNrmgCZLo>uj@x$UBC?rQ-qQhWLk zHw!6owox^!c4;~MoBLeTWe!N2x=ZcO&4q^cap?2c|<$p^8mvVNo zwcUNMyB)Y_$K85&Q8sr8T>2bd*=44O1P;3h12~IAKfU%eW8Qc`$%x>#c~^C_T3cQi zBXioUbE=e+3RVY8qv4zve(&34NnqnT6(bQP$xePW5=-$u4gCacer^X2OtRtYcBTYw z*O5b3Jr=(^I`@G$PP-s4R}K)tEN3+sd8RAxz4OmldQnNt!fXK31x)OKpPqi}?H=qV znKVCw=>g`>PVc|))&s{d4>mCkWn;IzpPcY@=%;dG4cX-UL1`W5c-}tk>`t-2)Y^tD zJ{3A^w4czp@7y)qGm?icXoQ?($cSoQZ8Pe~TYsKutRtzYb62$EzQ^y*jSV8TmS&zC z%;(&oZ1Q_O*^rC|lk(KXH#h9vx@UOdtJs0w8FD|*=lC3$I)A`(N$OGC%iUK8lL&lj~S_*uFR)z%x6U$p1zSMsu+VC+JSodhMGD*eIrV6fBI%uo+7EPFj{-m zZLw8vciv-9o@|ig>6oJXuCMzJ?mW233hnBDB`=zJ?TK=#MfL$%w+zk=2RNh>eq+up zf3<1WMOK{qazcfgUZ`n0{>E1N)A!6*Pok+&^J*}y;P&MnuYT3G)fpS0k?{v^?$12j zscG6wedUwh-Pg^~G)05l;za!Qlh8D!oa5h}cSx^}1IwY2gR->GiyCuDuQxi}+HZon z+sE#*L(9pYINaQKece}rH&IS|B)InXXF|1iJ|w%bGS_tUqu-HNJf34zqgu`}swt9V z26xj*#lsf;}V zW*U1RIj+Yr986?k!hCeOl5NUO4*c*B-h2i1AvZ zcs}nrlVd3-lHT`PK{ zoP@^gJmvBezS=Nivqj@>Rql4+(sFnT7j8)4PV-TfA$4lQ9E|V;U=LadUL4{vh{~%U-Xv$)4BO=4~olaRH2~g^9L8nnk%4=X!RQH{$u$5`Ut zvs@w+qQQE6jzl%rbRXLLo!F4}svLC+(LGXKs%f6O=jYEqsQP`fwoxQ-KWpe7TRNU# zRU?zjN(mZm77+W4cDIDCa=WE4(kW{6yj&(kQnynXFjewXyaw#kz}65)2ute$T;`) z?Dmh}v3_cqWd{vs;%#QD_s#86bnDW8Jo~9*tgOyg?aG>vV?R|V*4%dl+WZEespVcn^jev($5;9Jjx`%_+gh z9yd<4@Ng6}s$FSQ_Z72U;pS!`UbBz?t+l~ju~B!~SU*uMXFj)UJ!#v5*iG7W@A%;7 zw@*{0vGw^Cle#lOrCju_se;F!6oa3U6rPL_uxD~{+=WW9oKVCF0M zSW%2b=kV0#$mtsn`nK2o2g^GP#YbJUvt)SmzOgNtdaHFF^Idq^`0V$p9iDIGe|O61 zx1Ml!m-ZvLmzvCPJEhrQt^01B#6ADlKR4*q$wO-o+nkaGIR35qPwU$fOBS^*jl}v$ zTJx>94F0y$?8j5dWH`Y&>{B*&nLnv~>~E`j8T`&0*ze`sxy^RIt@Y4Z+N^f_S2$k3;T00jJb}%w+}?q$=jg6UhVw zUCub83*V?goP<1B-zOA}6wFLEuBfac)Qb@dg}1!_Ni8ErBT++dWs$PFcuiF}7^{ke z5^?ozrs_y29*RffiKKo57tc4z8ef1Xx_ApxymV$blnOA4SMpqP6(7l&7Y3E8G;>F) zs^f{2c^3;OdAx8K-`a_X`pmA0gk}Yzi5e3djR(tg6PiiMa1{QWbW;zIB|NI^LP7Oi zFadff%eH7jp8N@vg?Z#!p4sszBQqncGZR$1DUQ-BFp6+8%gY-}i zora}NbQJ8NBAtU`^pzNdJOu`S=2EiY9jJUx#&JSQUGrm8gT6+>YfMjrU2uMtZ2D7_8C3LPP}Zg2=Z{q94X z9(5s2Un_I;D>WU$LYcm%DdeeGF=fA>!%KNQ48z!bhpllzJ>&@& zZyne=GK97}8o@uB$QDkjlq?W2l@gUn+w&wt!59YtJnEoc@TxU48z$^<`c*-{`4u94 z1(`fL?_F^Ru?*?8jH)gB36n%kOomS4|8Uepa(gzB#YUx+q3nXU9TAtPo}UUPy&5ws zCmgd<6jRlEJ%q}rCDx>?$d&R}s(v2i=4;C#GcU1Jaro$k&c>J>Ow^&BRHX+O^X0Ru zaN|9+%3b*hFJrX4&K5fJ(kk7fyiCEM&P=d+sTQBXB+NuL9`kbk4f4XbL7J+Tp93)8 zAPfWZl4`N=FG__a0iSw}y#7%y47Vk#dym>{GPs)z@GUyfA2u@)DXR$22}h%SD#9_D zC{?p~!YR1_o1qq2SL?5T0@2bNWpJ0i{+w)F#P9n#IGglP+U_XdKNQWVF!UMssM9}yYG4&` zX^^Jek#f3atReLYC#$4;6tIrup${Dss$qvCSMqWuT5D!7G%Hyh4$e|5@f29NA`!0<8?B5)%c{v7tOzsTXAV(L8waF(k20MJsFE{+dih5Z*+RiBJ4uc3 z${1OtV(Bee9h`&HsbB?_&^F>Fu`L&jZFj2m{M?PLIH+xRDn?QrFv--I;EztP{D4Ft z0rk%10%=3Fj%nO`s8!{s0QF1HYs{R0cQ-?!-r=k${Hl^Arzj&+a*KDYY&Gw|+^d6Xy!DVhD<|x- zQdCnbCGpBfSp+X*G{aSR@yy65EHe^RPxq@}+BZR-zNWq9L@^CEjE(bPC@G8GHIZS} zvnrT$s$~~mC+6h{v$MiIO(r9yUR3m`Tt>-|D+vPXh2tU^%lZuTfjN<~R3)qXhuQCk zv8PLiwI>Bwvy}U4f`MejBrxuVDO)VE(2`kRCYR2ez8R+8L|&M_mz*ATNasWT^tCmW z6Hx-ZQ8pU(Vq(b!7wbkXQz&~;Z2bI!l?g7^jWsp(sD>13>RQWS-r})k`G^JySH)*W zjQKL*X?abQ9WvSmAB^*@juUlxl;A=^VJ?_Pc`}g^Wp|KTH_C@L zN|DMwp|zQwgqnVXikIo7C-h-9(Sk{K4wc1u=q@uO(qty!nEY2RZDu44EURZ!@Ly(e zH!9gT@Y6qdpVE)ymA*rrX?UtY^BZr?Vq;!I>fJ;kjiY1#`LHQpO_;*f0g_23!)hF$<1FiYWUU8 z+-Wy<=^@Na!0pL)o40%{ld!SPmOtd_>wxh+1tDc?H!K@hiD*2|a(6gZ%Z7$WeHD*1 zFN=={iJdc)_FI%DYwpNlJV>OXSxG5mH9i%e#UhLc<8&UlrmyMD{tibHdv4|z$XGZC=;05zi)%IV4}*N$^^V-u4D{U#A>X} zR&rHMGHRv6wWL^OuS(X2taKy4;+@IJAczE^a;I=A!{DW8s-wZWISF|)avwgtlo}SV z=JW-JBdWq2GU*en_H-Lct)de{5{s?0qC>K+Nj%!nx#m(2&DO3EN&dTRv-FlBY+9Rt zm#JMSn%hBCQvWW~Oq0kERLn|R@b9wBw7v{670X@Fr^Pb6;@bBAu8g{iDSOfq+LLyX z9l~TX6X`4`;bD<>M*s`^Ee?|qLmWo`erojfU}JYQu+c6DFUKcll$#Pq6pGi#YOWs} zolT@M2w8QPlSDoWF}`sGm2rXj=;djq1>s;-G8{~JE|A!>!Nq>70v^Aai~aN=^!8hHr9Lez zHJCw5Fc~rQuU4~cO<`Qhicw(zY28mI%13M{M1C+f|5a?aBa@1U^Jz+i_BY~8IsBs$ zr{kQ+V1#ROw$oB|c2?#v*n=GJEGL-2oYN{yD=@9T^o5@u?Wa=Ha;Q+x@EgWiR(4OS z1M1SFNi-`fFZ`? zfn4}mH+UP~3*gf+8=mxqN5e#$bI{1@XiWw2pfZlkB;)8?W*VVqAXrpXH!M+;tYnTK znq?NkVsofcyCU@xhk)iRQ5LJrEK4ba5r3gvq|q${UDWFpjCNIZ4;UpHtCI;94w+^O zrOY-9S&>%z!2^nl2A20LD;p3fE-Wr798lOVQ%=LyE93E5oHk{EPwA6=)H4~6vN)vn zI9*Vd>g7{3tSl+Pl^d6qG^o7ieMTOu35+lCNEC61HN3vHx_Ve;4coqRD&w;Bz?!vj4&7M0&_!A_IzfGKAdApA z45`~NoKQP)SRZ=Q^2w>WIc#yoYf@^T&U@0?D0&*NQTgcRjToad6_HgRipol998*sf zTE?d|O2A`IjniGwSUVT%HohM26{9#0Cs#=+ZSDJ#3zljB@d8zufUl3(} zWlPZ+AKX&q`E?7~xv7@zdE-LS_;nBYo)#4HLw@a=JvzF4X^i~xgIVf;Pz_L}HRa`= zGj3ZhIN0u#b@SoX!P7L51DyjlfG6h z~tLV88rqvGPu_(ms0`YOO7z+&CQB(@KfvsCQCAe{#m>1#$*`DU7r z6&PQlgU+~M2T~rV!*bNe(PZV`qug{J=+oC$mDQmLV=iJXX{2W*iolO~nlU@f{+pY8 zicbh;)-ryPU3o#(L5+wjzz!ZWsbpA9Jq$!vOzt6%I}v5NBbD>;vl=HM;p&u3v-%%l z&zf7A0$Q^zWy^k1qwy6yh>Z(6p?}Hd7ww=jFVTR%`^}pEL7tV;s4*vVh6$6*1Zpk& z)82m3K4XQ0{T2<#9=kWao_DC(FZA|X&N}G*{cw_pRBJFrI<_`S57VS=za zl`ct<>QbqQK7Zm-s%=IOt?f=`IGBRB8myH8h^-s(O1?vrwY~tYbp!1nqg);-jMi`{ zD4LuTPm~2Dicx+~9miJ2&zA_*-f5V4%6-8!J1fOyC#f;fFP@U`9zrWWjq0D4u%aCC z@Jez;>(`)G-J!K^=pX(LGOaC0)7Og9Z!blEClWe+g{=NYU37b*Qm(HRvgr}J2j8KEloufdU}A1GF5<2>jyGr}k{L3wyT z$yp;+U+#q3ylhl6>!CzP+&Vr^7+VnLD!gwV8cAMcM4fpMDq1HGEy^fqdxSe2t27P| z>k>3ez2K+T<|;T|#M?sD>L|peJlJKRbzZ%at|j#fA)N?Rld3iFOg_XBx_=Ghx$bKM&6KZ17dt>28e5gM0?`bV-n0b`t;myd3$ zF-JWM=^?8UE-j?YXjNa8d9i-sj_1*7BacX{z9@<>^bbQb8Wz%wdnL5$+%hLrPv@6~ zF)aHe+8dXN;G3#9?ZcOW-jyJFvFX=&EtqR$l@etjXE3I<1qeG$oo7iq;!^#b% zG^=b0tz}l#>*!y@%!aPBI4JJQOvFvHmB)TmGUBywpOFuq8TU%_Mzn2cITe?B@iL9l zc+^X+wp>~lnnnre7u{&xrQ((z8Pdfh{V1Ib1SU?&@beEM<&|=x6n<3sehXCT&IwWa zT2ZRkddSh(^qVrG;aG*|gSrm6Ve61e0sd#VwL8(H2#hill#oijm>P@Ma^l!)-N%*- zUbZ_CMixC8<&6Q-SaJ=N)}@##8jf&!{923K_GRJgwmlG+Qu(~Q4DONi*NH$u^o@|&&O{_FN*J>%_ zQAS%f54YYRFE-jB4NK)eWA=$xv)PCTXYoz8obb&`Q60%|p~n1pBIM>Jk&x~-9;IUj zrfETHyOUnWaUSn=5$DbYBWHxFiQ>sIr({G95ZJUIkZ$5N2DlSZqB~NR>NkzaG7T7J zrPx}51}lwlY$ug8EC8dT&!ruJhqfK_QA;KxV~TGDL4IpG*Z9j55>Uq-Vn3S}=5~Ij9D0 zloq6W>h_1$cBiQQI;!2^4X*@~hKY)o-%1@?wNV-su_Y)y_`ZU{PN0TV!+T~)WyAdK zYT5>BC$5GT6j#4!C_`2?aAz}AiH(xbec*woJ5urXo9sD~GuXLt2DR&a-I&6Wuk84E z@T{R*c**E)4dzNNzbF|)R1}b#m(ck~!wn({vwVAWp*Z<x&qMy;qh?#w!P;HP`Drt|~)$^(%uBxONKPGvBDS@5epy-sH0-TZ&Umq{=@QWGo zAB-~Y)f%IpQZwVpGz%t=D!`QH^xsCtjC6Pk1M3E2ttO8ukli5;HuyLo6wgLjct)&k zaLY())H*w|rQ>&lNBUOD;pYLNx6cd=7WNdih~+zw+b0{s!+x*iFlLwXu3;9JV=>P+ zW63*!&1^8U-zr{y!lo>mDT$N84x>E}z#zGIugNH2t`3kI(K&z5FQ z6XBMX0vEmMWf)0V$8_G7j`^4wVVOy(YU|fs8%}5q(XwW_jk0dbmTmC@>>SgTbbfJp z7G*kOa!gko{d$m%(u^RolN!ZGbvoxY2WsqrRowmjO-7f_44~XljgnfsbK7PB!Zu7) zt?d`(IP9e;(^0z}_8k_u$pb&$bIHu}urfmUO)7Nx*;`2RdLv5?C#;$o`$b0PrYo$> zOX?xxk9R#(^VnR6oZDj;1~x7j+D(s#(iJNsRe_qA9Jr9>9P8@#C!(z|6Q%XEV5D;Y0!_K?!rdxM@GI12V}VVtbB zNeErWeWN&J@8+nlx%$|Z3~1)g8HL(!3CrXp8g^-(Gvv)ga&+Cxe6q8`Gdqd8=uI0B z6=v_S!Y4b49r#AP=Tm=|7J7X}ck@35;Eo~*Lr z(7!%PmHpxaW6M;uXl$FNud>b%dOo1)`gj&HaW0hiky|_U4tZtLoODRHKQ`ikR%gC2 zq8KaO2?xAlYd$l^^QT@f>1hnPw7W=ZXKB@oS4{Fgfq>eu_b^6>g6!3#4EwFc{_n9= za+>lsiiur(A+*&7yY%1Itcs{Fd4wtJ=P>3HKJAdmAHzQXXIJTVsc zI#p)N1rys{qXt9stH6+&muiBdf;4q9NOb9;{d68Uq^}!wz(jrC7%KJKsI7em(8I@8ir-d`@t#UTaXeGUjNB zU=3S>>C=*gNF0t&$itlh{l)~v9WKg~@M6J=8hN`Y+j#1Ic(Dpw zgM~noC$)CP(J=nQZieV^%eYr#of_)W$;p~hDk;l!oLEVCoeXdzu@{oXO$F3!(t1b6 z8LEd{#yve$zii9H@*Ua}J`Sl$0etHUflLFi8rGwLhMD2tFj4HC*hB?fZKM zNv(LfM+t1WIuKBbGeT8FEuiQ>Qt8u&=BGZ@*ewk^F@^TJ79bOKpN-n)8^IT3VSzq;R-8 zpq~AwUV4=sza+CX(|w?8o=xLZW^5drYvf)Nv~(WWr?07}|5Bs9B#7;|ir#ODEK6`$ zWThxB%3PBv-Wy`nkdB|OtB2ZLC@91Qqng$)!U@i02|AvTg&*@$HY@zc(aeZK$TLC= zb)3}KuF~;|(5G)?+Ux6hGJ_&Dsf39`D$ypd`B%P3Md8+XmOdGrozAfmd8H? zDp--JMxkL%1^P6woOLvUD&yPv+M{ThTP>h;U=ETP)=w-uiV^D_68UzDVZA5<{F z(=_BrRRhlG!==ndnMMOzvm#D>O`Muy7;ggb5Lhpmz{p%WQK6gGpiekt=^c9OMqZ;M zub}mgrHs{wh&*R$UIut$5Ibvrl$nhWeP)8{+WrR5;V)Y|nT7^8Hyc!Z{dRM*i5Y>^ zk#`5aCJMg(ONGYFPHW2X^_hPDMRU+=%jymKJdldUl^5h|1(8t1=tLgoV$VjE?6>le Q=OAObQhkE-|HD83549J_Z~y=R literal 0 HcmV?d00001 diff --git a/demos/_123/components.json b/demos/_123/components.json new file mode 100644 index 000000000..481633df9 --- /dev/null +++ b/demos/_123/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/demos/_123/lib/utils.ts b/demos/_123/lib/utils.ts new file mode 100644 index 000000000..bd0c391dd --- /dev/null +++ b/demos/_123/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/demos/_123/next.config.mjs b/demos/_123/next.config.mjs new file mode 100644 index 000000000..993e27b34 --- /dev/null +++ b/demos/_123/next.config.mjs @@ -0,0 +1,10 @@ +import path from "path"; +/** @type {import('next').NextConfig} */ +const nextConfig = { + experimental: { + swcPlugins: [["@onlook/nextjs", { + root: path.resolve(".") + }]] + } +}; +export default nextConfig; \ No newline at end of file diff --git a/demos/_123/package.json b/demos/_123/package.json new file mode 100644 index 000000000..294be891d --- /dev/null +++ b/demos/_123/package.json @@ -0,0 +1,33 @@ +{ + "name": "@onlook/next-template", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@radix-ui/react-slot": "^1.1.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "lucide-react": "^0.438.0", + "next": "14.2.7", + "react": "^18", + "react-dom": "^18", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@onlook/nextjs": "^2.1.0", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.7", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} \ No newline at end of file diff --git a/demos/_123/postcss.config.mjs b/demos/_123/postcss.config.mjs new file mode 100644 index 000000000..1a69fd2a4 --- /dev/null +++ b/demos/_123/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/demos/_123/public/next.svg b/demos/_123/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/demos/_123/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demos/_123/public/vercel.svg b/demos/_123/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/demos/_123/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demos/_123/tailwind.config.ts b/demos/_123/tailwind.config.ts new file mode 100644 index 000000000..141f8407e --- /dev/null +++ b/demos/_123/tailwind.config.ts @@ -0,0 +1,67 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + darkMode: ["class"], + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))' + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))' + } + } + } + }, + plugins: [require("tailwindcss-animate")], +}; +export default config; diff --git a/demos/_123/tsconfig.json b/demos/_123/tsconfig.json new file mode 100644 index 000000000..e7ff90fd2 --- /dev/null +++ b/demos/_123/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/utils/src/create/index.ts b/utils/src/create/index.ts index 99359e7aa..62500623b 100644 --- a/utils/src/create/index.ts +++ b/utils/src/create/index.ts @@ -13,14 +13,14 @@ export async function createProject( targetPath: string, onProgress: CreateCallback ): Promise { - const fullPath = path.join(targetPath, projectName); - - // Check if the directory already exists - if (fs.existsSync(fullPath)) { - throw new Error(`Directory ${fullPath} already exists.`); - } try { + const fullPath = path.join(targetPath, projectName); + // Check if the directory already exists + if (fs.existsSync(fullPath)) { + throw new Error(`Directory ${fullPath} already exists.`); + } + // Clone the template using degit onProgress(CreateStage.CLONING, `Cloning template...`); const emitter = degit(NEXT_TEMPLATE_REPO, { From 7d501235719751cf7cdbc791c197cd2e8c06067f Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 13:04:59 -0400 Subject: [PATCH 06/18] Clean up --- .../routes/projects/ProjectsTab/Create/New/Run.tsx | 13 +++++-------- .../projects/ProjectsTab/Create/New/Setup.tsx | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/src/routes/projects/ProjectsTab/Create/New/Run.tsx b/app/src/routes/projects/ProjectsTab/Create/New/Run.tsx index df22664f5..96b917c85 100644 --- a/app/src/routes/projects/ProjectsTab/Create/New/Run.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/New/Run.tsx @@ -8,10 +8,10 @@ import { CardTitle, } from '@/components/ui/card'; import { toast } from '@/components/ui/use-toast'; -import { ClipboardCopyIcon, CheckIcon } from '@radix-ui/react-icons'; +import { CheckIcon, ClipboardCopyIcon } from '@radix-ui/react-icons'; +import { AnimatePresence, motion } from 'framer-motion'; import { useState } from 'react'; import { StepProps } from '..'; -import { motion, AnimatePresence } from 'framer-motion'; export const NewRunProject = ({ props: { projectData, setProjectData, currentStep, totalSteps, prevStep, nextStep }, }: { @@ -40,12 +40,12 @@ export const NewRunProject = ({ -
- {codeContent} +
+ {codeContent}
- + + + + + Join our Discord + + + + + + Visit our GitHub +
diff --git a/app/src/routes/projects/ProjectsTab/Create/New/Name.tsx b/app/src/routes/projects/ProjectsTab/Create/New/Name.tsx index b68c7b9bb..5c939c198 100644 --- a/app/src/routes/projects/ProjectsTab/Create/New/Name.tsx +++ b/app/src/routes/projects/ProjectsTab/Create/New/Name.tsx @@ -28,7 +28,7 @@ export const NewNameProject = ({ {'Let’s name your project'} - {'If you want it to be different from the folder name'} + {'If you want it to be different from the project folder name'} diff --git a/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx b/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx index b8720295f..d6d0614ec 100644 --- a/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx +++ b/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx @@ -14,7 +14,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; -import { DotsVerticalIcon } from '@radix-ui/react-icons'; +import { DotsVerticalIcon, TrashIcon } from '@radix-ui/react-icons'; import React from 'react'; import { Project } from '/common/models/project'; @@ -37,7 +37,11 @@ export default function ProjectSettingsButton({ project }: { project: Project }) - setShowDeleteDialog(true)}> + setShowDeleteDialog(true)} + className="text-red-200 bg-red-1000/50 hover:!bg-red-800 hover:!text-red-100 gap-2" + > + Delete Project diff --git a/app/src/routes/projects/SettingsTab/index.tsx b/app/src/routes/projects/SettingsTab/index.tsx index 7b6ec9aca..9a0941d69 100644 --- a/app/src/routes/projects/SettingsTab/index.tsx +++ b/app/src/routes/projects/SettingsTab/index.tsx @@ -36,6 +36,10 @@ export default function SettingsTab() { setIsAnalyticsEnabled(enabled); } + function openExternalLink(url: string) { + window.api.invoke(MainChannels.OPEN_EXTERNAL_WINDOW, url); + } + return (
@@ -133,23 +137,19 @@ export default function SettingsTab() {

{`Onlook Studio Version ${window.env.APP_VERSION} • `}

-

- - {'Privacy Policy'} - -

+

{'and'}

-

- - {'Terms of Service'} - -

+
From 26eaca501a233a4fd11023f8e9383e7b4b8c1317 Mon Sep 17 00:00:00 2001 From: Daniel R Farrell Date: Mon, 23 Sep 2024 15:43:20 -0400 Subject: [PATCH 13/18] Added in links + styling --- app/src/routes/editor/WebviewArea/Frame.tsx | 6 ++-- app/src/routes/signin/index.tsx | 33 ++++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/app/src/routes/editor/WebviewArea/Frame.tsx b/app/src/routes/editor/WebviewArea/Frame.tsx index 9c0d76b33..3349ad88e 100644 --- a/app/src/routes/editor/WebviewArea/Frame.tsx +++ b/app/src/routes/editor/WebviewArea/Frame.tsx @@ -154,9 +154,9 @@ const Frame = observer( {'Your React app is not running'}

- { - "Make sure that your app is running in your terminal and that you're pointing the above browser URL to the correct location" - } + {`Make sure that your app is running in your terminal`} +
+ {`and that you're pointing the above browser URL to the correct location`}

{' '} + and{' '} +

From 90351e1e2415c9f31b2df9ccc8e2ef545719c9cf Mon Sep 17 00:00:00 2001 From: Daniel R Farrell Date: Mon, 23 Sep 2024 15:47:27 -0400 Subject: [PATCH 14/18] Update index.tsx --- app/src/routes/signin/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/routes/signin/index.tsx b/app/src/routes/signin/index.tsx index 997c4c8c7..1f185b73a 100644 --- a/app/src/routes/signin/index.tsx +++ b/app/src/routes/signin/index.tsx @@ -101,7 +101,7 @@ const SignIn = observer(() => {

{`Version ${window.env.APP_VERSION}`}

-

{'• Last updated 2 weeks ago'}

+ {/*

{'• Last updated 2 weeks ago'}

*/}
From ad78fe8869d429e5d050a68963667c5e6590d86a Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 15:48:04 -0400 Subject: [PATCH 15/18] Identify on enable --- app/electron/main/analytics/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/electron/main/analytics/index.ts b/app/electron/main/analytics/index.ts index a8cbdd40c..fcb4678ac 100644 --- a/app/electron/main/analytics/index.ts +++ b/app/electron/main/analytics/index.ts @@ -60,6 +60,10 @@ class Analytics { private enable() { try { this.mixpanel = Mixpanel.init(import.meta.env.VITE_MIXPANEL_TOKEN || ''); + const settings = PersistentStorage.USER_METADATA.read(); + if (settings) { + this.identify(settings); + } } catch (error) { console.warn('Error initializing Mixpanel:', error); console.warn('No Mixpanel client, analytics will not be collected'); From 1a430f8b43989cdcdff583a4f9f4de5f2ee93b26 Mon Sep 17 00:00:00 2001 From: Daniel R Farrell Date: Mon, 23 Sep 2024 16:10:58 -0400 Subject: [PATCH 16/18] + Open Project Folder in Project Settings Plus other style improvements --- .../Select/ProjectSettingsButton.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx b/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx index d6d0614ec..fee461d19 100644 --- a/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx +++ b/app/src/routes/projects/ProjectsTab/Select/ProjectSettingsButton.tsx @@ -14,9 +14,10 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; -import { DotsVerticalIcon, TrashIcon } from '@radix-ui/react-icons'; +import { DotsVerticalIcon, TrashIcon, FileIcon } from '@radix-ui/react-icons'; import React from 'react'; import { Project } from '/common/models/project'; +import { MainChannels } from '/common/constants'; export default function ProjectSettingsButton({ project }: { project: Project }) { const projectsManager = useProjectsManager(); @@ -27,6 +28,12 @@ export default function ProjectSettingsButton({ project }: { project: Project }) setShowDeleteDialog(false); }; + const handleOpenProjectFolder = () => { + if (project.folderPath) { + window.api.invoke(MainChannels.OPEN_IN_EXPLORER, project.folderPath); + } + }; + return ( <> @@ -37,9 +44,16 @@ export default function ProjectSettingsButton({ project }: { project: Project }) + + + Open Project Folder + setShowDeleteDialog(true)} - className="text-red-200 bg-red-1000/50 hover:!bg-red-800 hover:!text-red-100 gap-2" + className="text-red-200 hover:!bg-red-800 hover:!text-red-100 gap-2" > Delete Project From d05c38eadd6f6bdc5b02158e848e17a06a7affc3 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 16:18:25 -0400 Subject: [PATCH 17/18] Fix clearing user data on sign out --- app/common/models/settings.ts | 1 + app/electron/main/analytics/index.ts | 6 +++--- app/electron/main/auth/index.ts | 4 ++-- app/electron/main/storage/images.ts | 1 - app/electron/main/storage/index.ts | 2 +- app/src/routes/signin/index.tsx | 23 ++++++++++++++--------- 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/app/common/models/settings.ts b/app/common/models/settings.ts index 6475615b8..7e0aea091 100644 --- a/app/common/models/settings.ts +++ b/app/common/models/settings.ts @@ -5,6 +5,7 @@ export interface UserSettings { id?: string; enableAnalytics?: boolean; ideType?: IdeType; + signInMethod?: string; } export interface ProjectsCache { diff --git a/app/electron/main/analytics/index.ts b/app/electron/main/analytics/index.ts index fcb4678ac..ae0d7eda5 100644 --- a/app/electron/main/analytics/index.ts +++ b/app/electron/main/analytics/index.ts @@ -31,7 +31,7 @@ class Analytics { this.id = settings.id; if (!this.id) { this.id = nanoid(); - PersistentStorage.USER_SETTINGS.write({ enableAnalytics: enable, id: this.id }); + PersistentStorage.USER_SETTINGS.update({ enableAnalytics: enable, id: this.id }); } if (enable) { @@ -54,7 +54,7 @@ class Analytics { this.track('disable analytics'); this.disable(); } - PersistentStorage.USER_SETTINGS.write({ enableAnalytics: enable, id: this.id }); + PersistentStorage.USER_SETTINGS.update({ enableAnalytics: enable, id: this.id }); } private enable() { @@ -100,7 +100,7 @@ class Analytics { } public signOut() { - PersistentStorage.USER_SETTINGS.write({ id: undefined }); + PersistentStorage.USER_SETTINGS.update({ id: undefined }); } } diff --git a/app/electron/main/auth/index.ts b/app/electron/main/auth/index.ts index 3fdb53319..ffecd9b79 100644 --- a/app/electron/main/auth/index.ts +++ b/app/electron/main/auth/index.ts @@ -12,7 +12,7 @@ export async function handleAuthCallback(url: string) { } const authTokens = getToken(url); - PersistentStorage.AUTH_TOKENS.write(authTokens); + PersistentStorage.AUTH_TOKENS.replace(authTokens); if (!supabase) { throw new Error('No backend connected'); @@ -32,7 +32,7 @@ export async function handleAuthCallback(url: string) { } const userMetadata = getUserMetadata(user); - PersistentStorage.USER_METADATA.write(userMetadata); + PersistentStorage.USER_METADATA.replace(userMetadata); analytics.identify(userMetadata); emitAuthEvent(); diff --git a/app/electron/main/storage/images.ts b/app/electron/main/storage/images.ts index 4d2e4d7d7..febdac48d 100644 --- a/app/electron/main/storage/images.ts +++ b/app/electron/main/storage/images.ts @@ -59,7 +59,6 @@ class ImageStorage { try { if (existsSync(filePath)) { unlinkSync(filePath); - console.log(`Image deleted successfully: ${filePath}`); return true; } console.log(`Image not found: ${filePath}`); diff --git a/app/electron/main/storage/index.ts b/app/electron/main/storage/index.ts index f3388eb18..dca45bbe2 100644 --- a/app/electron/main/storage/index.ts +++ b/app/electron/main/storage/index.ts @@ -42,7 +42,7 @@ export class PersistentStorage { } } - write(value: T) { + replace(value: T) { try { this.encrypted ? this.writeEncrypted(value) : this.writeUnencrypted(value); } catch (e) { diff --git a/app/src/routes/signin/index.tsx b/app/src/routes/signin/index.tsx index 1f185b73a..62ae120f5 100644 --- a/app/src/routes/signin/index.tsx +++ b/app/src/routes/signin/index.tsx @@ -7,6 +7,7 @@ import { GitHubLogoIcon } from '@radix-ui/react-icons'; import { observer } from 'mobx-react-lite'; import { useEffect, useState } from 'react'; import { MainChannels } from '/common/constants'; +import { UserSettings } from '/common/models/settings'; enum SignInMethod { GITHUB = 'github', @@ -14,17 +15,21 @@ enum SignInMethod { } const SignIn = observer(() => { - const [lastSignInMethod, setLastSignInMethod] = useState(null); const authManager = useAuthManager(); + const [lastSignInMethod, setLastSignInMethod] = useState(null); useEffect(() => { - // Retrieve the last login method from localStorage - }, []); + window.api.invoke(MainChannels.GET_USER_SETTINGS).then((res) => { + const settings: UserSettings = res as UserSettings; + if (settings && settings.signInMethod) { + setLastSignInMethod(settings.signInMethod as SignInMethod); + } + }); + }, [authManager.authenticated]); const handleLogin = (method: SignInMethod) => { - // Save the login method to localStorage - // Implement actual login logic here authManager.signIn(method); + window.api.invoke(MainChannels.UPDATE_USER_SETTINGS, { signInMethod: method }); }; function openExternalLink(url: string) { @@ -55,12 +60,12 @@ const SignIn = observer(() => {
- {lastSignInMethod === 'github' && ( + {lastSignInMethod === SignInMethod.GITHUB && (

{'You used this last time'}

@@ -69,13 +74,13 @@ const SignIn = observer(() => {
- {lastSignInMethod === 'google' && ( + {lastSignInMethod === SignInMethod.GOOGLE && (

{'You used this last time'}

From 49d2b1e30c3e9d31a1a513e680a051f483491616 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Mon, 23 Sep 2024 16:23:48 -0400 Subject: [PATCH 18/18] Remove dead code --- app/src/routes/signin/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/routes/signin/index.tsx b/app/src/routes/signin/index.tsx index 62ae120f5..5c5ed0f25 100644 --- a/app/src/routes/signin/index.tsx +++ b/app/src/routes/signin/index.tsx @@ -106,7 +106,6 @@ const SignIn = observer(() => {

{`Version ${window.env.APP_VERSION}`}

- {/*

{'• Last updated 2 weeks ago'}

*/}