From 75cd9d075f1dc527ed29de8dfe115cd4bbcf0d3d Mon Sep 17 00:00:00 2001 From: Mayank Chhabra Date: Tue, 15 Aug 2023 20:53:37 +0700 Subject: [PATCH] Initialize the project to use self-hosted Llama model --- .env.local.example | 8 -- .github/workflows/deploy-docker-image.yaml | 69 ------------ .github/workflows/run-test-suite.yml | 24 ---- .gitignore | 42 +------ README.md | 105 ------------------ SECURITY.md | 53 --------- api/Dockerfile | 26 +++++ api/run.sh | 28 +++++ docker-compose.yml | 17 ++- license | 1 + public/favicon.ico | Bin 15406 -> 0 bytes public/screenshots/screenshot-0402023.jpg | Bin 110723 -> 0 bytes .dockerignore => ui/.dockerignore | 0 .eslintrc.json => ui/.eslintrc.json | 0 ui/.gitignore | 40 +++++++ CONTRIBUTING.md => ui/CONTRIBUTING.md | 0 Dockerfile => ui/Dockerfile | 0 Makefile => ui/Makefile | 0 .../utils/app/importExports.test.ts | 0 .../SidebarActionButton.tsx | 0 .../Buttons/SidebarActionButton/index.ts | 0 {components => ui/components}/Chat/Chat.tsx | 42 ++----- .../components}/Chat/ChatInput.tsx | 14 +-- .../components}/Chat/ChatLoader.tsx | 2 +- .../components}/Chat/ChatMessage.tsx | 6 +- .../components}/Chat/ErrorMessageDiv.tsx | 0 .../components}/Chat/MemoizedChatMessage.tsx | 0 .../components}/Chat/ModelSelect.tsx | 8 +- .../components}/Chat/PluginSelect.tsx | 6 +- .../components}/Chat/PromptList.tsx | 4 +- .../components}/Chat/Regenerate.tsx | 2 +- .../components}/Chat/SystemPrompt.tsx | 2 +- .../components}/Chat/Temperature.tsx | 0 .../components}/Chat/VariableModal.tsx | 6 +- .../components}/Chatbar/Chatbar.context.tsx | 0 .../components}/Chatbar/Chatbar.state.tsx | 0 .../components}/Chatbar/Chatbar.tsx | 0 .../Chatbar/components/ChatFolders.tsx | 0 .../Chatbar/components/ChatbarSettings.tsx | 20 ++-- .../Chatbar/components/ClearConversations.tsx | 0 .../Chatbar/components/Conversation.tsx | 6 +- .../Chatbar/components/Conversations.tsx | 0 .../Chatbar/components/PluginKeys.tsx | 10 +- .../components}/Folder/Folder.tsx | 6 +- {components => ui/components}/Folder/index.ts | 0 .../components}/Markdown/CodeBlock.tsx | 0 .../Markdown/MemoizedReactMarkdown.tsx | 0 .../components}/Mobile/Navbar.tsx | 2 +- .../Promptbar/PromptBar.context.tsx | 0 .../components}/Promptbar/Promptbar.state.tsx | 0 .../components}/Promptbar/Promptbar.tsx | 0 .../Promptbar/components/Prompt.tsx | 2 +- .../Promptbar/components/PromptFolders.tsx | 0 .../Promptbar/components/PromptModal.tsx | 10 +- .../components/PromptbarSettings.tsx | 0 .../Promptbar/components/Prompts.tsx | 0 .../components}/Promptbar/index.ts | 0 .../components}/Search/Search.tsx | 2 +- {components => ui/components}/Search/index.ts | 0 .../components}/Settings/Import.tsx | 0 .../components}/Settings/Key.tsx | 0 .../components}/Settings/SettingDialog.tsx | 4 +- .../components}/Sidebar/Sidebar.tsx | 4 +- .../components}/Sidebar/SidebarButton.tsx | 0 .../Sidebar/components/OpenCloseButton.tsx | 0 .../components}/Sidebar/index.ts | 0 .../components}/Spinner/Spinner.tsx | 0 .../components}/Spinner/index.ts | 0 ui/docker-compose.yml | 9 ++ {docs => ui/docs}/google_search.md | 0 {hooks => ui/hooks}/useCreateReducer.ts | 0 {hooks => ui/hooks}/useFetch.ts | 0 {k8s => ui/k8s}/chatbot-ui.yaml | 0 .../next-i18next.config.js | 0 next.config.js => ui/next.config.js | 0 package-lock.json => ui/package-lock.json | 0 package.json => ui/package.json | 0 {pages => ui/pages}/_app.tsx | 0 {pages => ui/pages}/_document.tsx | 11 +- {pages => ui/pages}/api/chat.ts | 2 + {pages => ui/pages}/api/google.ts | 0 {pages => ui/pages}/api/home/home.context.tsx | 0 {pages => ui/pages}/api/home/home.state.tsx | 0 {pages => ui/pages}/api/home/home.tsx | 4 +- {pages => ui/pages}/api/home/index.ts | 0 {pages => ui/pages}/api/models.ts | 1 + {pages => ui/pages}/index.tsx | 0 postcss.config.js => ui/postcss.config.js | 0 prettier.config.js => ui/prettier.config.js | 0 ui/public/favicon-16x16.png | Bin 0 -> 761 bytes ui/public/favicon-32x32.png | Bin 0 -> 2198 bytes ui/public/favicon.ico | Bin 0 -> 15406 bytes {public => ui/public}/locales/ar/chat.json | 0 {public => ui/public}/locales/ar/common.json | 0 .../public}/locales/ar/markdown.json | 0 .../public}/locales/ar/promptbar.json | 0 .../public}/locales/ar/settings.json | 0 {public => ui/public}/locales/ar/sidebar.json | 0 {public => ui/public}/locales/bn/chat.json | 0 {public => ui/public}/locales/bn/common.json | 0 .../public}/locales/bn/markdown.json | 0 .../public}/locales/bn/promptbar.json | 0 .../public}/locales/bn/settings.json | 0 {public => ui/public}/locales/bn/sidebar.json | 0 {public => ui/public}/locales/ca/chat.json | 0 {public => ui/public}/locales/ca/common.json | 0 .../public}/locales/ca/markdown.json | 0 .../public}/locales/ca/promptbar.json | 0 {public => ui/public}/locales/ca/sidebar.json | 0 {public => ui/public}/locales/de/chat.json | 0 {public => ui/public}/locales/de/common.json | 0 .../public}/locales/de/markdown.json | 0 .../public}/locales/de/promptbar.json | 0 .../public}/locales/de/settings.json | 0 {public => ui/public}/locales/de/sidebar.json | 0 {public => ui/public}/locales/en/common.json | 0 {public => ui/public}/locales/es/chat.json | 0 {public => ui/public}/locales/es/common.json | 0 .../public}/locales/es/markdown.json | 0 .../public}/locales/es/promptbar.json | 0 .../public}/locales/es/settings.json | 0 {public => ui/public}/locales/es/sidebar.json | 0 {public => ui/public}/locales/fi/chat.json | 0 {public => ui/public}/locales/fi/common.json | 0 .../public}/locales/fi/markdown.json | 0 .../public}/locales/fi/promptbar.json | 0 .../public}/locales/fi/settings.json | 0 {public => ui/public}/locales/fi/sidebar.json | 0 {public => ui/public}/locales/fr/chat.json | 0 {public => ui/public}/locales/fr/common.json | 0 .../public}/locales/fr/markdown.json | 0 .../public}/locales/fr/promptbar.json | 0 .../public}/locales/fr/settings.json | 0 {public => ui/public}/locales/fr/sidebar.json | 0 {public => ui/public}/locales/he/chat.json | 0 {public => ui/public}/locales/he/common.json | 0 .../public}/locales/he/markdown.json | 0 .../public}/locales/he/promptbar.json | 0 .../public}/locales/he/settings.json | 0 {public => ui/public}/locales/he/sidebar.json | 0 {public => ui/public}/locales/id/chat.json | 0 {public => ui/public}/locales/id/common.json | 0 .../public}/locales/id/markdown.json | 0 .../public}/locales/id/promptbar.json | 0 .../public}/locales/id/settings.json | 0 {public => ui/public}/locales/id/sidebar.json | 0 {public => ui/public}/locales/it/chat.json | 0 {public => ui/public}/locales/it/common.json | 0 .../public}/locales/it/markdown.json | 0 .../public}/locales/it/promptbar.json | 0 .../public}/locales/it/settings.json | 0 {public => ui/public}/locales/it/sidebar.json | 0 {public => ui/public}/locales/ja/chat.json | 0 {public => ui/public}/locales/ja/common.json | 0 .../public}/locales/ja/markdown.json | 0 .../public}/locales/ja/promptbar.json | 0 .../public}/locales/ja/settings.json | 0 {public => ui/public}/locales/ja/sidebar.json | 0 {public => ui/public}/locales/ko/chat.json | 0 {public => ui/public}/locales/ko/common.json | 0 .../public}/locales/ko/markdown.json | 0 .../public}/locales/ko/promptbar.json | 0 .../public}/locales/ko/settings.json | 0 {public => ui/public}/locales/ko/sidebar.json | 0 {public => ui/public}/locales/pl/chat.json | 0 {public => ui/public}/locales/pl/common.json | 0 .../public}/locales/pl/markdown.json | 0 .../public}/locales/pl/promptbar.json | 0 .../public}/locales/pl/settings.json | 0 {public => ui/public}/locales/pl/sidebar.json | 0 {public => ui/public}/locales/pt/chat.json | 0 {public => ui/public}/locales/pt/common.json | 0 .../public}/locales/pt/markdown.json | 0 .../public}/locales/pt/promptbar.json | 0 .../public}/locales/pt/settings.json | 0 {public => ui/public}/locales/pt/sidebar.json | 0 {public => ui/public}/locales/ro/chat.json | 0 {public => ui/public}/locales/ro/common.json | 0 .../public}/locales/ro/markdown.json | 0 .../public}/locales/ro/promptbar.json | 0 .../public}/locales/ro/settings.json | 0 {public => ui/public}/locales/ro/sidebar.json | 0 {public => ui/public}/locales/ru/chat.json | 0 {public => ui/public}/locales/ru/common.json | 0 .../public}/locales/ru/markdown.json | 0 .../public}/locales/ru/promptbar.json | 0 .../public}/locales/ru/settings.json | 0 {public => ui/public}/locales/ru/sidebar.json | 0 {public => ui/public}/locales/si/chat.json | 0 {public => ui/public}/locales/si/common.json | 0 .../public}/locales/si/markdown.json | 0 .../public}/locales/si/promptbar.json | 0 .../public}/locales/si/settings.json | 0 {public => ui/public}/locales/si/sidebar.json | 0 {public => ui/public}/locales/sv/chat.json | 0 {public => ui/public}/locales/sv/common.json | 0 .../public}/locales/sv/markdown.json | 0 .../public}/locales/sv/promptbar.json | 0 .../public}/locales/sv/settings.json | 0 {public => ui/public}/locales/sv/sidebar.json | 0 {public => ui/public}/locales/te/chat.json | 0 {public => ui/public}/locales/te/common.json | 0 .../public}/locales/te/markdown.json | 0 .../public}/locales/te/promptbar.json | 0 .../public}/locales/te/settings.json | 0 {public => ui/public}/locales/te/sidebar.json | 0 {public => ui/public}/locales/tr/chat.json | 0 {public => ui/public}/locales/tr/common.json | 0 .../public}/locales/tr/markdown.json | 0 .../public}/locales/tr/promptbar.json | 0 {public => ui/public}/locales/tr/sidebar.json | 0 {public => ui/public}/locales/vi/chat.json | 0 {public => ui/public}/locales/vi/common.json | 0 .../public}/locales/vi/markdown.json | 0 .../public}/locales/vi/promptbar.json | 0 .../public}/locales/vi/settings.json | 0 {public => ui/public}/locales/vi/sidebar.json | 0 {public => ui/public}/locales/zh/chat.json | 0 {public => ui/public}/locales/zh/common.json | 0 .../public}/locales/zh/markdown.json | 0 .../public}/locales/zh/promptbar.json | 0 .../public}/locales/zh/settings.json | 0 {public => ui/public}/locales/zh/sidebar.json | 0 {public => ui/public}/screenshot.png | Bin {services => ui/services}/errorService.ts | 0 {services => ui/services}/useApiService.ts | 0 {styles => ui/styles}/globals.css | 0 tailwind.config.js => ui/tailwind.config.js | 0 tsconfig.json => ui/tsconfig.json | 0 {types => ui/types}/chat.ts | 0 {types => ui/types}/data.ts | 0 {types => ui/types}/env.ts | 0 {types => ui/types}/error.ts | 0 {types => ui/types}/export.ts | 0 {types => ui/types}/folder.ts | 0 {types => ui/types}/google.ts | 0 {types => ui/types}/index.ts | 0 {types => ui/types}/openai.ts | 9 +- {types => ui/types}/plugin.ts | 0 {types => ui/types}/prompt.ts | 0 {types => ui/types}/settings.ts | 0 {types => ui/types}/storage.ts | 0 {utils => ui/utils}/app/api.ts | 0 {utils => ui/utils}/app/clean.ts | 0 {utils => ui/utils}/app/codeblock.ts | 0 {utils => ui/utils}/app/const.ts | 2 +- {utils => ui/utils}/app/conversation.ts | 0 {utils => ui/utils}/app/folders.ts | 0 {utils => ui/utils}/app/importExport.ts | 0 {utils => ui/utils}/app/prompts.ts | 0 {utils => ui/utils}/app/settings.ts | 0 {utils => ui/utils}/data/throttle.ts | 0 {utils => ui/utils}/server/google.ts | 0 {utils => ui/utils}/server/index.ts | 0 vitest.config.ts => ui/vitest.config.ts | 0 255 files changed, 207 insertions(+), 402 deletions(-) delete mode 100644 .env.local.example delete mode 100644 .github/workflows/deploy-docker-image.yaml delete mode 100644 .github/workflows/run-test-suite.yml delete mode 100644 README.md delete mode 100644 SECURITY.md create mode 100644 api/Dockerfile create mode 100755 api/run.sh delete mode 100644 public/favicon.ico delete mode 100644 public/screenshots/screenshot-0402023.jpg rename .dockerignore => ui/.dockerignore (100%) rename .eslintrc.json => ui/.eslintrc.json (100%) create mode 100644 ui/.gitignore rename CONTRIBUTING.md => ui/CONTRIBUTING.md (100%) rename Dockerfile => ui/Dockerfile (100%) rename Makefile => ui/Makefile (100%) rename {__tests__ => ui/__tests__}/utils/app/importExports.test.ts (100%) rename {components => ui/components}/Buttons/SidebarActionButton/SidebarActionButton.tsx (100%) rename {components => ui/components}/Buttons/SidebarActionButton/index.ts (100%) rename {components => ui/components}/Chat/Chat.tsx (91%) rename {components => ui/components}/Chat/ChatInput.tsx (95%) rename {components => ui/components}/Chat/ChatLoader.tsx (89%) rename {components => ui/components}/Chat/ChatMessage.tsx (98%) rename {components => ui/components}/Chat/ErrorMessageDiv.tsx (100%) rename {components => ui/components}/Chat/MemoizedChatMessage.tsx (100%) rename {components => ui/components}/Chat/ModelSelect.tsx (85%) rename {components => ui/components}/Chat/PluginSelect.tsx (93%) rename {components => ui/components}/Chat/PromptList.tsx (89%) rename {components => ui/components}/Chat/Regenerate.tsx (89%) rename {components => ui/components}/Chat/SystemPrompt.tsx (98%) rename {components => ui/components}/Chat/Temperature.tsx (100%) rename {components => ui/components}/Chat/VariableModal.tsx (94%) rename {components => ui/components}/Chatbar/Chatbar.context.tsx (100%) rename {components => ui/components}/Chatbar/Chatbar.state.tsx (100%) rename {components => ui/components}/Chatbar/Chatbar.tsx (100%) rename {components => ui/components}/Chatbar/components/ChatFolders.tsx (100%) rename {components => ui/components}/Chatbar/components/ChatbarSettings.tsx (85%) rename {components => ui/components}/Chatbar/components/ClearConversations.tsx (100%) rename {components => ui/components}/Chatbar/components/Conversation.tsx (98%) rename {components => ui/components}/Chatbar/components/Conversations.tsx (100%) rename {components => ui/components}/Chatbar/components/PluginKeys.tsx (96%) rename {components => ui/components}/Folder/Folder.tsx (97%) rename {components => ui/components}/Folder/index.ts (100%) rename {components => ui/components}/Markdown/CodeBlock.tsx (100%) rename {components => ui/components}/Markdown/MemoizedReactMarkdown.tsx (100%) rename {components => ui/components}/Mobile/Navbar.tsx (90%) rename {components => ui/components}/Promptbar/PromptBar.context.tsx (100%) rename {components => ui/components}/Promptbar/Promptbar.state.tsx (100%) rename {components => ui/components}/Promptbar/Promptbar.tsx (100%) rename {components => ui/components}/Promptbar/components/Prompt.tsx (99%) rename {components => ui/components}/Promptbar/components/PromptFolders.tsx (100%) rename {components => ui/components}/Promptbar/components/PromptModal.tsx (93%) rename {components => ui/components}/Promptbar/components/PromptbarSettings.tsx (100%) rename {components => ui/components}/Promptbar/components/Prompts.tsx (100%) rename {components => ui/components}/Promptbar/index.ts (100%) rename {components => ui/components}/Search/Search.tsx (94%) rename {components => ui/components}/Search/index.ts (100%) rename {components => ui/components}/Settings/Import.tsx (100%) rename {components => ui/components}/Settings/Key.tsx (100%) rename {components => ui/components}/Settings/SettingDialog.tsx (96%) rename {components => ui/components}/Sidebar/Sidebar.tsx (96%) rename {components => ui/components}/Sidebar/SidebarButton.tsx (100%) rename {components => ui/components}/Sidebar/components/OpenCloseButton.tsx (100%) rename {components => ui/components}/Sidebar/index.ts (100%) rename {components => ui/components}/Spinner/Spinner.tsx (100%) rename {components => ui/components}/Spinner/index.ts (100%) create mode 100644 ui/docker-compose.yml rename {docs => ui/docs}/google_search.md (100%) rename {hooks => ui/hooks}/useCreateReducer.ts (100%) rename {hooks => ui/hooks}/useFetch.ts (100%) rename {k8s => ui/k8s}/chatbot-ui.yaml (100%) rename next-i18next.config.js => ui/next-i18next.config.js (100%) rename next.config.js => ui/next.config.js (100%) rename package-lock.json => ui/package-lock.json (100%) rename package.json => ui/package.json (100%) rename {pages => ui/pages}/_app.tsx (100%) rename {pages => ui/pages}/_document.tsx (58%) rename {pages => ui/pages}/api/chat.ts (96%) rename {pages => ui/pages}/api/google.ts (100%) rename {pages => ui/pages}/api/home/home.context.tsx (100%) rename {pages => ui/pages}/api/home/home.state.tsx (100%) rename {pages => ui/pages}/api/home/home.tsx (98%) rename {pages => ui/pages}/api/home/index.ts (100%) rename {pages => ui/pages}/api/models.ts (97%) rename {pages => ui/pages}/index.tsx (100%) rename postcss.config.js => ui/postcss.config.js (100%) rename prettier.config.js => ui/prettier.config.js (100%) create mode 100644 ui/public/favicon-16x16.png create mode 100644 ui/public/favicon-32x32.png create mode 100644 ui/public/favicon.ico rename {public => ui/public}/locales/ar/chat.json (100%) rename {public => ui/public}/locales/ar/common.json (100%) rename {public => ui/public}/locales/ar/markdown.json (100%) rename {public => ui/public}/locales/ar/promptbar.json (100%) rename {public => ui/public}/locales/ar/settings.json (100%) rename {public => ui/public}/locales/ar/sidebar.json (100%) rename {public => ui/public}/locales/bn/chat.json (100%) rename {public => ui/public}/locales/bn/common.json (100%) rename {public => ui/public}/locales/bn/markdown.json (100%) rename {public => ui/public}/locales/bn/promptbar.json (100%) rename {public => ui/public}/locales/bn/settings.json (100%) rename {public => ui/public}/locales/bn/sidebar.json (100%) rename {public => ui/public}/locales/ca/chat.json (100%) rename {public => ui/public}/locales/ca/common.json (100%) rename {public => ui/public}/locales/ca/markdown.json (100%) rename {public => ui/public}/locales/ca/promptbar.json (100%) rename {public => ui/public}/locales/ca/sidebar.json (100%) rename {public => ui/public}/locales/de/chat.json (100%) rename {public => ui/public}/locales/de/common.json (100%) rename {public => ui/public}/locales/de/markdown.json (100%) rename {public => ui/public}/locales/de/promptbar.json (100%) rename {public => ui/public}/locales/de/settings.json (100%) rename {public => ui/public}/locales/de/sidebar.json (100%) rename {public => ui/public}/locales/en/common.json (100%) rename {public => ui/public}/locales/es/chat.json (100%) rename {public => ui/public}/locales/es/common.json (100%) rename {public => ui/public}/locales/es/markdown.json (100%) rename {public => ui/public}/locales/es/promptbar.json (100%) rename {public => ui/public}/locales/es/settings.json (100%) rename {public => ui/public}/locales/es/sidebar.json (100%) rename {public => ui/public}/locales/fi/chat.json (100%) rename {public => ui/public}/locales/fi/common.json (100%) rename {public => ui/public}/locales/fi/markdown.json (100%) rename {public => ui/public}/locales/fi/promptbar.json (100%) rename {public => ui/public}/locales/fi/settings.json (100%) rename {public => ui/public}/locales/fi/sidebar.json (100%) rename {public => ui/public}/locales/fr/chat.json (100%) rename {public => ui/public}/locales/fr/common.json (100%) rename {public => ui/public}/locales/fr/markdown.json (100%) rename {public => ui/public}/locales/fr/promptbar.json (100%) rename {public => ui/public}/locales/fr/settings.json (100%) rename {public => ui/public}/locales/fr/sidebar.json (100%) rename {public => ui/public}/locales/he/chat.json (100%) rename {public => ui/public}/locales/he/common.json (100%) rename {public => ui/public}/locales/he/markdown.json (100%) rename {public => ui/public}/locales/he/promptbar.json (100%) rename {public => ui/public}/locales/he/settings.json (100%) rename {public => ui/public}/locales/he/sidebar.json (100%) rename {public => ui/public}/locales/id/chat.json (100%) rename {public => ui/public}/locales/id/common.json (100%) rename {public => ui/public}/locales/id/markdown.json (100%) rename {public => ui/public}/locales/id/promptbar.json (100%) rename {public => ui/public}/locales/id/settings.json (100%) rename {public => ui/public}/locales/id/sidebar.json (100%) rename {public => ui/public}/locales/it/chat.json (100%) rename {public => ui/public}/locales/it/common.json (100%) rename {public => ui/public}/locales/it/markdown.json (100%) rename {public => ui/public}/locales/it/promptbar.json (100%) rename {public => ui/public}/locales/it/settings.json (100%) rename {public => ui/public}/locales/it/sidebar.json (100%) rename {public => ui/public}/locales/ja/chat.json (100%) rename {public => ui/public}/locales/ja/common.json (100%) rename {public => ui/public}/locales/ja/markdown.json (100%) rename {public => ui/public}/locales/ja/promptbar.json (100%) rename {public => ui/public}/locales/ja/settings.json (100%) rename {public => ui/public}/locales/ja/sidebar.json (100%) rename {public => ui/public}/locales/ko/chat.json (100%) rename {public => ui/public}/locales/ko/common.json (100%) rename {public => ui/public}/locales/ko/markdown.json (100%) rename {public => ui/public}/locales/ko/promptbar.json (100%) rename {public => ui/public}/locales/ko/settings.json (100%) rename {public => ui/public}/locales/ko/sidebar.json (100%) rename {public => ui/public}/locales/pl/chat.json (100%) rename {public => ui/public}/locales/pl/common.json (100%) rename {public => ui/public}/locales/pl/markdown.json (100%) rename {public => ui/public}/locales/pl/promptbar.json (100%) rename {public => ui/public}/locales/pl/settings.json (100%) rename {public => ui/public}/locales/pl/sidebar.json (100%) rename {public => ui/public}/locales/pt/chat.json (100%) rename {public => ui/public}/locales/pt/common.json (100%) rename {public => ui/public}/locales/pt/markdown.json (100%) rename {public => ui/public}/locales/pt/promptbar.json (100%) rename {public => ui/public}/locales/pt/settings.json (100%) rename {public => ui/public}/locales/pt/sidebar.json (100%) rename {public => ui/public}/locales/ro/chat.json (100%) rename {public => ui/public}/locales/ro/common.json (100%) rename {public => ui/public}/locales/ro/markdown.json (100%) rename {public => ui/public}/locales/ro/promptbar.json (100%) rename {public => ui/public}/locales/ro/settings.json (100%) rename {public => ui/public}/locales/ro/sidebar.json (100%) rename {public => ui/public}/locales/ru/chat.json (100%) rename {public => ui/public}/locales/ru/common.json (100%) rename {public => ui/public}/locales/ru/markdown.json (100%) rename {public => ui/public}/locales/ru/promptbar.json (100%) rename {public => ui/public}/locales/ru/settings.json (100%) rename {public => ui/public}/locales/ru/sidebar.json (100%) rename {public => ui/public}/locales/si/chat.json (100%) rename {public => ui/public}/locales/si/common.json (100%) rename {public => ui/public}/locales/si/markdown.json (100%) rename {public => ui/public}/locales/si/promptbar.json (100%) rename {public => ui/public}/locales/si/settings.json (100%) rename {public => ui/public}/locales/si/sidebar.json (100%) rename {public => ui/public}/locales/sv/chat.json (100%) rename {public => ui/public}/locales/sv/common.json (100%) rename {public => ui/public}/locales/sv/markdown.json (100%) rename {public => ui/public}/locales/sv/promptbar.json (100%) rename {public => ui/public}/locales/sv/settings.json (100%) rename {public => ui/public}/locales/sv/sidebar.json (100%) rename {public => ui/public}/locales/te/chat.json (100%) rename {public => ui/public}/locales/te/common.json (100%) rename {public => ui/public}/locales/te/markdown.json (100%) rename {public => ui/public}/locales/te/promptbar.json (100%) rename {public => ui/public}/locales/te/settings.json (100%) rename {public => ui/public}/locales/te/sidebar.json (100%) rename {public => ui/public}/locales/tr/chat.json (100%) rename {public => ui/public}/locales/tr/common.json (100%) rename {public => ui/public}/locales/tr/markdown.json (100%) rename {public => ui/public}/locales/tr/promptbar.json (100%) rename {public => ui/public}/locales/tr/sidebar.json (100%) rename {public => ui/public}/locales/vi/chat.json (100%) rename {public => ui/public}/locales/vi/common.json (100%) rename {public => ui/public}/locales/vi/markdown.json (100%) rename {public => ui/public}/locales/vi/promptbar.json (100%) rename {public => ui/public}/locales/vi/settings.json (100%) rename {public => ui/public}/locales/vi/sidebar.json (100%) rename {public => ui/public}/locales/zh/chat.json (100%) rename {public => ui/public}/locales/zh/common.json (100%) rename {public => ui/public}/locales/zh/markdown.json (100%) rename {public => ui/public}/locales/zh/promptbar.json (100%) rename {public => ui/public}/locales/zh/settings.json (100%) rename {public => ui/public}/locales/zh/sidebar.json (100%) rename {public => ui/public}/screenshot.png (100%) rename {services => ui/services}/errorService.ts (100%) rename {services => ui/services}/useApiService.ts (100%) rename {styles => ui/styles}/globals.css (100%) rename tailwind.config.js => ui/tailwind.config.js (100%) rename tsconfig.json => ui/tsconfig.json (100%) rename {types => ui/types}/chat.ts (100%) rename {types => ui/types}/data.ts (100%) rename {types => ui/types}/env.ts (100%) rename {types => ui/types}/error.ts (100%) rename {types => ui/types}/export.ts (100%) rename {types => ui/types}/folder.ts (100%) rename {types => ui/types}/google.ts (100%) rename {types => ui/types}/index.ts (100%) rename {types => ui/types}/openai.ts (76%) rename {types => ui/types}/plugin.ts (100%) rename {types => ui/types}/prompt.ts (100%) rename {types => ui/types}/settings.ts (100%) rename {types => ui/types}/storage.ts (100%) rename {utils => ui/utils}/app/api.ts (100%) rename {utils => ui/utils}/app/clean.ts (100%) rename {utils => ui/utils}/app/codeblock.ts (100%) rename {utils => ui/utils}/app/const.ts (82%) rename {utils => ui/utils}/app/conversation.ts (100%) rename {utils => ui/utils}/app/folders.ts (100%) rename {utils => ui/utils}/app/importExport.ts (100%) rename {utils => ui/utils}/app/prompts.ts (100%) rename {utils => ui/utils}/app/settings.ts (100%) rename {utils => ui/utils}/data/throttle.ts (100%) rename {utils => ui/utils}/server/google.ts (100%) rename {utils => ui/utils}/server/index.ts (100%) rename vitest.config.ts => ui/vitest.config.ts (100%) diff --git a/.env.local.example b/.env.local.example deleted file mode 100644 index 752af4e..0000000 --- a/.env.local.example +++ /dev/null @@ -1,8 +0,0 @@ -# Chatbot UI -DEFAULT_MODEL=gpt-3.5-turbo -NEXT_PUBLIC_DEFAULT_SYSTEM_PROMPT=You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown. -OPENAI_API_KEY=YOUR_KEY - -# Google -GOOGLE_API_KEY=YOUR_API_KEY -GOOGLE_CSE_ID=YOUR_ENGINE_ID diff --git a/.github/workflows/deploy-docker-image.yaml b/.github/workflows/deploy-docker-image.yaml deleted file mode 100644 index 3e7ad3c..0000000 --- a/.github/workflows/deploy-docker-image.yaml +++ /dev/null @@ -1,69 +0,0 @@ -name: Docker - -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -on: - push: - branches: ['main'] - -env: - # Use docker.io for Docker Hub if empty - REGISTRY: ghcr.io - # github.repository as / - IMAGE_NAME: ${{ github.repository }} - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2.1.0 - - # Workaround: https://github.com/docker/build-push-action/issues/461 - - name: Setup Docker buildx - uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf - - # Login against a Docker registry except on PR - # https://github.com/docker/login-action - - name: Log into registry ${{ env.REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - # Extract metadata (tags, labels) for Docker - # https://github.com/docker/metadata-action - - name: Extract Docker metadata - id: meta - uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - - # Build and push Docker image with Buildx (don't push on PR) - # https://github.com/docker/build-push-action - - name: Build and push Docker image - id: build-and-push - uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a - with: - context: . - platforms: "linux/amd64,linux/arm64" - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max diff --git a/.github/workflows/run-test-suite.yml b/.github/workflows/run-test-suite.yml deleted file mode 100644 index c0914db..0000000 --- a/.github/workflows/run-test-suite.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Run Unit Tests -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - test: - runs-on: ubuntu-latest - container: - image: node:16 - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Install dependencies - run: npm ci - - - name: Run Vitest Suite - run: npm test diff --git a/.gitignore b/.gitignore index 5be3dc7..1499042 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,2 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage -/test-results - -# next.js -/.next/ -/out/ -/dist - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts -.idea -pnpm-lock.yaml +**/.DS_Store +models \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 0a7352e..0000000 --- a/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# Chatbot UI - -Chatbot UI is an open source chat UI for AI models. - -See a [demo](https://twitter.com/mckaywrigley/status/1640380021423603713?s=46&t=AowqkodyK6B4JccSOxSPew). - -![Chatbot UI](./public/screenshots/screenshot-0402023.jpg) - -## Updates - -Chatbot UI will be updated over time. - -Expect frequent improvements. - -**Next up:** - -- [ ] Sharing -- [ ] "Bots" - -## Deploy - -**Vercel** - -Host your own live version of Chatbot UI with Vercel. - -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fmckaywrigley%2Fchatbot-ui) - -**Docker** - -Build locally: - -```shell -docker build -t chatgpt-ui . -docker run -e OPENAI_API_KEY=xxxxxxxx -p 3000:3000 chatgpt-ui -``` - -Pull from ghcr: - -``` -docker run -e OPENAI_API_KEY=xxxxxxxx -p 3000:3000 ghcr.io/mckaywrigley/chatbot-ui:main -``` - -## Running Locally - -**1. Clone Repo** - -```bash -git clone https://github.com/mckaywrigley/chatbot-ui.git -``` - -**2. Install Dependencies** - -```bash -npm i -``` - -**3. Provide OpenAI API Key** - -Create a .env.local file in the root of the repo with your OpenAI API Key: - -```bash -OPENAI_API_KEY=YOUR_KEY -``` - -> You can set `OPENAI_API_HOST` where access to the official OpenAI host is restricted or unavailable, allowing users to configure an alternative host for their specific needs. - -> Additionally, if you have multiple OpenAI Organizations, you can set `OPENAI_ORGANIZATION` to specify one. - -**4. Run App** - -```bash -npm run dev -``` - -**5. Use It** - -You should be able to start chatting. - -## Configuration - -When deploying the application, the following environment variables can be set: - -| Environment Variable | Default value | Description | -| --------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | -| OPENAI_API_KEY | | The default API key used for authentication with OpenAI | -| OPENAI_API_HOST | `https://api.openai.com` | The base url, for Azure use `https://.openai.azure.com` | -| OPENAI_API_TYPE | `openai` | The API type, options are `openai` or `azure` | -| OPENAI_API_VERSION | `2023-03-15-preview` | Only applicable for Azure OpenAI | -| AZURE_DEPLOYMENT_ID | | Needed when Azure OpenAI, Ref [Azure OpenAI API](https://learn.microsoft.com/zh-cn/azure/cognitive-services/openai/reference#completions) | -| OPENAI_ORGANIZATION | | Your OpenAI organization ID | -| DEFAULT_MODEL | `gpt-3.5-turbo` | The default model to use on new conversations, for Azure use `gpt-35-turbo` | -| NEXT_PUBLIC_DEFAULT_SYSTEM_PROMPT | [see here](utils/app/const.ts) | The default system prompt to use on new conversations | -| NEXT_PUBLIC_DEFAULT_TEMPERATURE | 1 | The default temperature to use on new conversations | -| GOOGLE_API_KEY | | See [Custom Search JSON API documentation][GCSE] | -| GOOGLE_CSE_ID | | See [Custom Search JSON API documentation][GCSE] | - -If you do not provide an OpenAI API key with `OPENAI_API_KEY`, users will have to provide their own key. - -If you don't have an OpenAI API key, you can get one [here](https://platform.openai.com/account/api-keys). - -## Contact - -If you have any questions, feel free to reach out to Mckay on [Twitter](https://twitter.com/mckaywrigley). - -[GCSE]: https://developers.google.com/custom-search/v1/overview diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 42f7994..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,53 +0,0 @@ -# Security Policy - - -This security policy outlines the process for reporting vulnerabilities and secrets found within this GitHub repository. It is essential that all contributors and users adhere to this policy in order to maintain a secure and stable environment. - -## Reporting a Vulnerability - -If you discover a vulnerability within the code, dependencies, or any other component of this repository, please follow these steps: - -1. **Do not disclose the vulnerability publicly.** Publicly disclosing a vulnerability may put the project at risk and could potentially harm other users. - -2. **Contact the repository maintainer(s) privately.** Send a private message or email to the maintainer(s) with a detailed description of the vulnerability. Include the following information: - - - The affected component(s) - - Steps to reproduce the issue - - Potential impact of the vulnerability - - Any possible mitigations or workarounds - -3. **Wait for a response from the maintainer(s).** Please be patient, as they may need time to investigate and verify the issue. The maintainer(s) should acknowledge receipt of your report and provide an estimated time frame for addressing the vulnerability. - -4. **Cooperate with the maintainer(s).** If requested, provide additional information or assistance to help resolve the issue. - -5. **Do not disclose the vulnerability until the maintainer(s) have addressed it.** Once the issue has been resolved, the maintainer(s) may choose to publicly disclose the vulnerability and credit you for the discovery. - -## Reporting Secrets - -If you discover any secrets, such as API keys or passwords, within the repository, follow these steps: - -1. **Do not share the secret or use it for unauthorized purposes.** Misusing a secret could have severe consequences for the project and its users. - -2. **Contact the repository maintainer(s) privately.** Notify them of the discovered secret, its location, and any potential risks associated with it. - -3. **Wait for a response and further instructions.** - -## Responsible Disclosure - -We encourage responsible disclosure of vulnerabilities and secrets. If you follow the steps outlined in this policy, we will work with you to understand and address the issue. We will not take legal action against individuals who discover and report vulnerabilities or secrets in accordance with this policy. - -## Patching and Updates - -We are committed to maintaining the security of our project. When vulnerabilities are reported and confirmed, we will: - -1. Work diligently to develop and apply a patch or implement a mitigation strategy. -2. Keep the reporter informed about the progress of the fix. -3. Update the repository with the necessary patches and document the changes in the release notes or changelog. -4. Credit the reporter for the discovery, if they wish to be acknowledged. - -## Contributing to Security - -We welcome contributions that help improve the security of our project. If you have suggestions or want to contribute code to address security issues, please follow the standard contribution guidelines for this repository. When submitting a pull request related to security, please mention that it addresses a security issue and provide any necessary context. - -By adhering to this security policy, you contribute to the overall security and stability of the project. Thank you for your cooperation and responsible handling of vulnerabilities and secrets. - diff --git a/api/Dockerfile b/api/Dockerfile new file mode 100644 index 0000000..731a2b8 --- /dev/null +++ b/api/Dockerfile @@ -0,0 +1,26 @@ +# Define the image argument and provide a default value +ARG IMAGE=ghcr.io/abetlen/llama-cpp-python:latest + +# Define the model file name and download url +ARG MODEL_FILE=llama-2-7b-chat.bin +ARG MODEL_DOWNLOAD_URL=https://huggingface.co/TheBloke/Nous-Hermes-Llama-2-7B-GGML/resolve/main/nous-hermes-llama-2-7b.ggmlv3.q4_0.bin + +FROM ${IMAGE} + +ARG MODEL_FILE +ARG MODEL_DOWNLOAD_URL + +# Download the model file +RUN apt-get update -y && \ + apt-get install --yes curl && \ + mkdir -p /models && \ + curl -L -o /models/${MODEL_FILE} ${MODEL_DOWNLOAD_URL} + +WORKDIR /app + +COPY . . + +EXPOSE 8000 + +# Run the server start script +CMD ["/bin/sh", "/app/run.sh"] \ No newline at end of file diff --git a/api/run.sh b/api/run.sh new file mode 100755 index 0000000..3faf55c --- /dev/null +++ b/api/run.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +make build + +# Get the number of available threads on the system +n_threads=$(grep -c ^processor /proc/cpuinfo) + +# Define context window +n_ctx=4096 + +# Offload everything to CPU +n_gpu_layers=0 + +# Define batch size +n_batch=2096 +# If total RAM is less than 8GB, set batch size to 1024 +total_ram=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}') +if [ $total_ram -lt 8000000 ]; then + n_batch=1024 +fi + +echo "Initializing server with:" +echo "Batch size: $n_batch" +echo "Number of CPU threads: $n_threads" +echo "Number of GPU layers: $n_gpu_layers" +echo "Context window: $n_ctx" + +python3 -m llama_cpp.server --n_ctx $n_ctx --n_threads $n_threads --n_gpu_layers $n_gpu_layers --n_batch $n_batch \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 85fa1d7..1557e63 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,20 @@ version: '3.6' services: - chatgpt: - build: . + llama-gpt-api: + build: + context: ./api + dockerfile: Dockerfile + environment: + MODEL: '/models/llama-2-7b-chat.bin' + + llama-gpt-ui: + build: + context: ./ui + dockerfile: Dockerfile ports: - 3000:3000 environment: - - 'OPENAI_API_KEY=' + - 'OPENAI_API_KEY=sk-XXXXXXXXXXXXXXXXXXXX' + - 'OPENAI_API_HOST=http://llama-gpt-api:8000' + - 'DEFAULT_MODEL=/models/llama-2-7b-chat.bin' diff --git a/license b/license index 5421da5..d4a3a57 100644 --- a/license +++ b/license @@ -1,5 +1,6 @@ MIT License +Copyright (c) 2023 Umbrel, Inc. Copyright (c) 2023 Mckay Wrigley Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 13e707283da3c33b6ceeedcfe3fa8a4728364ed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 zcmeHOYitx%6doQTDn?9HRHEq*#fp!h7&TE5A2IwfBm@wn5)zDJ)Pxv~Xh5nEQ7J@?#u&OLW3Nu#7O(!_}p?hVqCv6A$lBuNbondio9C214trcKMfpCU<}*Gp0( z+JFQUnR?tRcG*egHY>?q5Ta>xIZT}{Hr3XZ?Uu&+O`Sbo4y~!T%mtl^B20~`LO>n9 zO9(N_GWZj=&f6@F??u}`G6la?xsPbwqVt75QYoEe)4|smXydglaJO~&>0Ek8muK4= zvx3l48)}=u$}IpJg6l!`iwvXFi_p)z;ovDgMRyoHd%Sv2?Zp{k@oL zx9KEbRE(xl^-fpYRLJ~2S1$dA-uIX5o65yx8m$juKA!cK1lr_(3jyM{d1HFA;jvu4G`ireI z#p}y(ckn3Vl9Uy?zfJOW5MUQyuFjco?uQ z%e9j2$$|gnBtNxh&CRF_93y)4QSWZ7*+sJ5^(4^PMV0BNcMSe6>N@=OHG5Y1POPD) zYbGy$Zk~kfA^x$ZSll=}%pPOtd~+J9KglAQ8R?n7(7{6JpuYxs=(p7TJOiOXjPeHLS8qMg z*+tm=o4Nh=|HgcngEqxt$k2X*coJ{Fyh6{2{cb_|7QU$hX~9DMHn=OS`d zUx__yu8xIreIVM~=Z!Iwh}nP}dj2cVFR1)TD#51v$YSv*IyR4YbC9~5W61R%1AZO3 z!gu0kH?F@q&^jrlvW?Jp(f9~+_BYYfG%gm(&Vry^R!UVK0PY=mwlZ`-XyWW^Zk(_a z7CO^Iu7J+Jit0VvuU~o-t&^&O-}NO}56n(wveU^Ldo}(PFuj5`?<0))rzstFq4SNH zkLywz`_R(m#V9kKWb3_X7v%h<&(YcYm9~39Iq;&A90aDGW=(S)DQQmq900RAcVy3f&PA99r|2|KNoh-1{8 zceSzOsOy``5&}6Yt4nzt`Lmk)*68|@9ZOyN80Nyq(RoFmm*FrdtFWfV(N_hv;h(YQ z=kN8S+Gg$OkJZ__;~y6rdy#ZF+Z!pHA0ju6^M|6}@5Q}eE_OOAubsX6$3NP$d(O{S z*DZeC#XbWub3Mfl*)el5&q(c}9CaPW55P>=@lEe#@Bu5(hkA-3fE9atV5b<=?*8O< z#BfLIWgZY#!c5q`3*SI40seaM1!=aWAJ2VU>ljfdU4yXQ^# zo)K;O<7Z1a@7LK6gwexW=x*bCM|>-r0R9;D0s6##g}%isgxOz5xq0Law_r~^;%gFN z!2W8Bf4=%L`=8Gl>^kJ^SJ5{)BV|h@n=lX-KfWN(ZeB%Go(28`D7j~u(c+fj=Q+tb zU_*9po+Jq7LT%_iT<3)&XrRCUv(kd=8Q{|`9Fb`#EWJMMkX-TU10?tSlm_ZnHBS!6BNnsbdg=0E;_%n|Z9c^1TaLrX^s zL_t9T@&*2Z$djO}Aj)IMe*FPnRKO249W^x-6*WCAEe#zbJtHFnJp%(1^GQ}F<`c{e z46K~2C)n6II5-$txVSmlxlgilu>bl;C@6t*sHl%qQy*t%VqjwbcfZKZpc8bIHMGH$ z6lXxkPEb&updhz{gg_t)YT#~vz2X1;qBsWJBMmLxae4;efJ#=-F$zk`V^oyC-ZgM^ zAn-Ye>IC)4(-$t&uo>K=J>$kM8xosFCw!%}g~MZab)6e`jEqf8&CD%qAJ{##f8^lk;pye=5?I5c(IAuUlNCuyrfgn+z#=~Tdc?tpOifSP`Rp6~iE zh0ul1VodJKH3x-c(B`H->8T>@fQam@*I@PntE zw(=Ufp&ED3(JFVhXy7s~Db4(F5AYw}=L~8FHxe6j$)EwPEfN`2jT`*U-YBnl2^X@u z5`08AMF!36|LP-uvzMXCdF)_+KO5*sJ|vzrv!MOsj?ts^KWPHH8NE90)Ia7pQiqEjQ_>e z{d8_Wz537T>|bW}|GxA1E(^{O-A@qT!dZYF%Sr8|2~r1M`Ws&R?b6mvbiMaJexlz| zo-+D3*y{I4>)#1e3YcK+N9~F)OV?1{Y9&vqrBxCBgGCRoLx2xOe z2QOR`yj&57kL=7rWKi%XWcgA!^52d#LznW+zjD9Hk2+S=$aB40cs%0y1B|jfMgAYh ziML_*t)pC7Tm3ha=anY6AJV`#Ea8W%K!h6d3gDDHDgG=%jdUY})TO`}Ss{}2@6KgJ z{L$bib<~hSsfh?24+|N@brW%;w)*8K1Ci*UowhUGTx&+}g5>Ec|M=$3jc!wzRtn*^ zhq_$LO9{{kaI-OQV=k;KHHi$e0V3>-%nx?F;^`sO>;{+qy&G4B&>^$K!r1)zpwLi* zd^8K;h5XjhA)E}l!l4zCwDqRz<7#O!9k$|&x>@&UL=W}td~_1QZxyz;F>|DHBjXY^ zhg4y~K{;LFT%4c&^?AcDFbZ8CJGXl>2_95cL$<2FT*(%!k*5ob5dXk%#2~a8d7TV; z>cGh*nAhbX6r0BpaG4Bx_3b?w1i1hN*jI7}w4Ac-@b)fGxppN=qxU3njOUz3RCL3;Qscv`b2IIFusPGnT{4Kx z_aSk2)263d`&{s+<|tX&RKU_sp+?CdLGa^ZoEeh20X*MNi`#0qp~tSgeOw8rH=nvC zC2;Hl{-)l6(F5^LcOQ4ztT#ytqhZkM1=ur^BF@Rl*=xR--jO6!RqMeo=g0{^sTvaZ zAvS8^T>$R^0?k0W`FY=)464Z{#c<3{E8CXS3J9omNM=Mw$=roR2 z%UY~0RRJY$EoGf)sj5059By8FpPipE)prYGfD_vv2Qvgw@?jUOow^X5UTq>;DAPpy z@__}@(-0>@+y&72PWM~P$6gIfy97h+=UG_RG}uux70xz&)?lO3w}s!G?XA?@&$iq# z-%FckVRh7yK*?0Tx7oJ7YSi?$NZKX)aYNjN9$WLh4^M0RPmn=f+c4AxLa(P+pD&yQ zjwjW^zd5NO=vW;ZEF53dR0$njykO+Gp8^=Xe>O2dh7=Q%gF653^(_B-JXfW(vwZp2 zNg*QNsjMNs9=!D@GN_>X1=M~pGLI7H(m$v38()^82aI?1JETUyyJ>4*`Xt%$CeB@7 zB>7(*oW8B^zT#O~!FRIzcHdb_IjGqw?C(@ts^9odg^#_tq7m{kZ#2N>SErHzI2Bpg zidN15;6G(>J40m9`UG;z>X-D#mH0t=4^0qZ1cL&cqG_b@fI`3~i_vr0uE3998yi-5Zj>-T zKToYgOZ)2j2kl`psC;>2eL)rS0?GSbp*U>%%ri3$F1$wU{wC*~sGrTe`uedlXrD3c zIVVGnrx;ibmodi`Ltx2@)@=`>$8x>c{g!Z#EBRxBdc`kSjvsFvU}~3Ol}lyG3S`1- z1P$8A)!_oLMKcz-`1!MYA#<<_2O*cSB0-}BY2oPsIq;`BOWgJQ_3%q>JN*$FGQL|~ zyk^5t?FGmQ-)FbXP43y}IhKEI6#)g~1-iddo~PwmJR0KZ8PsHN51hod&5Av1fMHCV zF*pgG@*$01Ry3%F)pP@FZ6C)9xObYBs@2?P=x6J+ich>t?7Ps8E1y+?-oORmFRTQy z4^=eESYriKa(i;t?o+++?~qMQ{iey|#(yuyQjDLu@-x(km^L>=Is@g!!rG>6`$pBo zW_!hM);@fCeNZ~hoNE8OfT=$#UdJkz@rlzER2y#(l^JRhB`{(YpD)yu4#}qo7&5u) zR9Cr4$Dp!w=_18-j;X4OU(p)v;yG65YiK1bECr?pU9=|uRMhkR)4V)Y&FNdnzu`3%P$OJd2c0C={zbv>GX z`wsTZ*p?2weeh)_ljz69?UcJi3G}3gySA0#3p6zgTk5-muvrU$h<8~zDzu0nm^O|1 zgh$r(&Ft^z9eGw;64na|e6Gxd;{zI}XVzL7-g}tU3>SFbao$loFTUf#m{N1>YPrh{ zbiWY(97(a;&*RHwhMkFOuxANw;K-i-<*nd{$AYAQ&tul4o419}D(Sx|y$cd9R$2!; z7e@)Q;NC72vfaXYxh?zhT`h~>K&)(m6cyzfJ3do;nJm3GjV18A^=e`e?Siz}gAIHx z^eomsVgd6@w(I=qc_|6ghRVbM<%z=flb2-@voe}*x0FU<_i{8I_34@KLgW#1e*P;( zFGRU(@>fYd4$z87BFj~r7+w))f$E%A9zt{o@?zm(UivRgk3PoFTSnSR-0hf$XqfSN zO!jh`Eo@N?EWT2!@0=-jeNh-B=#Y95Bh#J&;eN#C6uZKO;tflZj^AepXY*G*j5&;S z6~%RBTY1^AVTD>*p803DOG&gfokybXk7@`w^2)7qU33?1+%LSKS893f%nZMomCNhd zciS{_w9PY-BoL-}W6x_2!r3SN{TJ+XQi0W@k3%||V+gLK<)x~_K#s7XW&q?_SS1D~ z%@}9HuGeq8uN;RkeFp--)#Js4l#g{Qh9h7*810(BSR|@Nh+7isG!Lg=jax$Lu_@p8rMSqg!bIjQ{OUmaHj?xKCmKHpr-6ifq+YnX45<;AgtT>x9#O6#CyG0gk!?Z~ zrVB|?P#NfvV)$(1pyb@>DPuWJhTdOx4KFu8-ifIZd|HxD%$G-m+weWp#VyV07Kd}y zK|A&2Y$`@*5IJpp_JIv?bmO{$^E{V%?xa5P9V8}iK5huWD-&#SUd+h!l~mDDmx{=B zc2p(ZMp{h_&%4i6+DczDT!l7Spnkw@kwFi^tOQleSM<~Y&~G`GT_SFLffDVB)pBtg z>?e4uu2U_hwuxYvPN}ZLj}e4%l^E4|?FcBtTy#JSdh6*zX}v^_6GI^N;+_5_*%M2- zhBRijO>!O34#-_x{{B@gR~uxaaIaCd)BmPvUF5XT2@6YH^4IYh3(LoebaRw~o_U|T z9?rXK^GD#0f@L0oxA}*W>)*gcIv_0gKn8Vt+#-XD-;hDOr;Qv!^5^<-B-qh6*qfr5 z+WsF^uVMW;Rs&6r57fWPSMuu`7k`znj!j#bw|(^02jr_%j(hUc9$^~yB(=Gln*|Sx z!Rf*D;y<@P?E`@6vR3&E(`7vK;9r<7G~Q(FSEg%Y;{Bxe0lv21f9L4081)B6>eqlr z7%;L$AmFh*Ozz8WrQ&rZ_^l!KHjqauDjB8~Gq{~m@cIO7*V9X@Hdta6JfXPnh5e-w zi)wYl)z9_Sf8&J2lB+X)3epX`S@6jZ%FhDPP@CjeQlE|N7&p z;wGpU9*mQlx8In=wCP~_V((=T%mq*Cv!VmzrcT3HuQgb;E?wFYyUj6DWkzWGcpb;v z1jp55*P0(8%K^nP#A}r{9Ln}VlX|j?v6N3Y^U0*_8s$@2<{_h}T7EgHc^9^%@BwA0 ztxEjnh_G)@kEi}}fhWFr6?yd*es&NSf>$T?9YMn6)iuCexD>Oof^UtiB8L5CbI0B; zQF@3t)$F{_W2UxUN0cpx%6Q6f>C6g6at5hjX`gS};EjgvXeIVqpf570RSnBWl|L6# zqwZex?yvN1+aJPt5z8@bof-ne=pp=-Q3Wa8_EdqY5Y$GT^>cGHmmMAc?Z?6?+a1-@_tESuzLYB>`)kDZVDNh2G=IFK7&+Z z<;H`)&rjP$U47Xw&7dombkIK~mYT3shiFbgFcY{&)qDyarLwIjeG?iKTr*OvJLexQ z$f%{dU@PzN`I_`BMC`93otRkkh_9h?*{eQLNX|mR&ssGa*CK3(C5uwmrrJ}yPt1-Jgb1;ZsckUIzxOFbipC@ED9dFJ6Y(Yb8WP@zF(lCxi+dh ze1~1~VjP9Aw_ArZPHcX;O(-O3h8Dm_xE3|tkB^!p;yW~iu?m&Zt>_NntBWGH(;ydG zvkkf8qkJg!eI}KfVuT_h6Y!5F@%7^iue103Zh(PvJ=`aoa;2+Lx3Upkcu}0~9c)-u z=E@AGl!Aavn@P24kPJ#>P%Lax%gp??q`AAx+pl#wdbQ(j?;`Tu@Zzf~d&uWrh-1(z zk)48UW6-P4bNQQ^6@HRMp7ptJukc7s^(~%r=T@S^cF42}Mc6RvpCH`D6h~Aldm`we zmm;p;N6l6FHFe1Q{1V_`bNa=F_=8}+T7EC#8Vsx*{6eU_|Am_3EK#oOB1x`h1nQKv zUPmg;9=FoA&z`WjUXYVAqE>Xv?Dd^y2^3F1iyvO>j_x*OS;kLe44$1kVc64qH6!V3 z#`nsp+DG=)8@h9RDO^<4y`MZ@(8URq3fMgLrLq~FUHN^GfM_V z+b|9h?&0;Pr<^p5i=%d@EM~66Z23IQVU zFp)ti^XhUPD!s%dc>JmD*|^qA(G5jyaV!+!0?j$7IGMuqnfxRPi0GD&O_(7C>XSs=dd44DK?fx&=l-;#zOw#q!5Fp<_}c^T4Hxk$5Mfu+ygvyL%K-52#zFVn)-_ zW(Z<9S|_Y)$X#C?8ffzP&S!~#jox4Z>* z0{IXemdg^6QG$g(-OL^q!;Fl1$W0Ygi;g||#;_F3CV5%Sb3LlPHjBG*TI$e2esc(?bDX+tC5#ohkt^nlRu^%>uA1OZhzfL%wzX_X%VGI36 z0Mf7{g9Zl&WTX9kHd@kFNutE`CVmJ1!gnfRDL%y(nr=={LKYGj^AqgUIMiEaQEyP` zq`n}@VYTDfcQelU7fwvio=45!oq3ym{P6c9V+2dQTCXEVz!{qXy=Zx{5&+l4QHU9-%xFE&FgdM z`+>L?D6;&?qU}<@jYKAn53e-gBt!|lw~zvh2;#vkzci5iP=&y|%#S;ie3i#qwFI4H ztN0Rp?pz`*(>p`Tr5k6>uar_e1G&}M(@w{|i9{a|UML719mWHcs)AOr)66#i2yFeE zK9O#e7j$kPU?BwkA;bVhQcPUV=%zMFt)hH#V*@O7Q6J0Bn4!sj`=6ooj_m{5)ahPT zQj;x^QuMFH?#`+k5BO4R&VcOiE{mUiFzh+O_4+!RQzJ^`Vb|h(&TR_d(!yyY8mFAl z*&(}dI%~*bli-j`c0+mj_A5WbFYMPRTfZxhH=Mk*8HG~UWT*H&lRHYJ0_a{H@KYX6 zdyR-}H}I=GcE(Z6G64oAdVs%}YFjP8052Q@q|95={W_J^Y|KmX^oW5U4e{su-ww=w zvp@cr)uHMU}Dlw-9=;#s3jfUlfM3@IxEu<;ve7o1QR z?{XWA!^}6n&1W-f-CMHP+52UTtz=Ym+tciGUz7#b=_5d%aq>fIF+Qp%zXa-h9Mn8r zwfMa?Lj2?J&HdPKY&BYuq_(Gjv=1Q)2uNpdPdeoI+EpzEKJXSwqs3-ihp29PeFMck}mM z1EmTU!SwacekZE&3L}p(VPD}qhYMmwawGiA=MsRy(K8HQ{=NkW#-?OYjKSh6V&~8Y z5WE24s_R@dJ7eQ-ej~o^*?&m*RWmjQG~)!V2++^Zf9$dU_x&@#Wl|+h20b|WSuPi% zV#iP-$UI856LVN_B>q7&Qupw2TV80K7#@3FQNlJ`uxTMV1%G3P6yl9I7?~ls=L}xr zLRJ7Ns4HB6<`@Vt++E_Np=uzX(mI>C2e5kldGfbq5B3v~#ABP_tz0B-NeFEMMDPq1 zWKh$`|7`=c7jw24t}+@}w9f?Iqy2Uirz1S6a4SOm#2?1^fEpxm=}%+UpK<-)avRHP z+GLPW4;f_DwWBbIQl1CnNcu-^V5G_uJIq*8{&1t^Qsx8 z3122%`7*fPAc>B0;=`Qq>nw{7dgR{kJT|+ zgbAGtyyF7N4-K2;2NN_6(t~AS&Q`E~Reb{G3t+vlk0`LugWubn) z|Ht~`57{~zV|D|pW_ANj(0|p<5$8byBS^J~ZxR_r9>2-8@Epcn`U%1RLCF0>y!;nf z{znj;$H+j_17x7d{{MEf(BMaw5ACfpG-`Etsd7IwO&)xclW=*-!zOpW`1z6M-dOBB zg5mRiG4&dko9NeolB1wyicuoFeeP=4hxvh#MiS3Kbv@S0!och#tHfpYF@08#KCC@>zaV;)(4i>5*jnKu6#RhU@ zDwa(+nHmDR)j=ugZqIK5x_3L}vubAoXj4+S) z`SxQ3mP4E9Ry5Akz_?bYC3L$NjEAL4-_l9aP1e3RU82Jc^02CoQd0znd8WX52udTs zvasi-#xL9aT#p}aDn1$PZXkSkM>*<&dUc&P5*U?qzmNTYzyF7{P4Hh-#D60B@b96P z|53mDjn=oa{thcdfQb=3guaYi)?mj z9IU>JTxdPXvVg89UbPt_fi0uCYzAjqHAE;$qKYWKw_-q~i-RZL7#P#MmIOI5Ocd1v!-1-pBpV)n0 zoPmo1)B_S!{$PJRtzd?cpp(0*LIyoMg{q|0my#-K6L=%Ge3P=~#8>|(PNB7x$$byQ z=6Oyf_;;O2xQF9C>Y7`_Wy~i%bM~5SPSy{19=e?68z&n2d_~73#;nA*Tlo8acME<- ziJ+6x9*1ki`Igi>Ju*=?AH2;vgFNA+zuT2v9QLdW!KezVQ1zeJ4Kctan(T)Gp`xrrdVgG}(8; zR~cWG@2#y036{|K$IRgGnTB|JV|hD*&NHPyOhqs^?b@Jkh6+#6>Ja52DElN2 z)bmh1SYSOJ)x@^uuMu~YP?VOnz8~9HHGC27{_uQv7dl6JBx$&8+zx9C{7hk)qcX>oh0h5wQr0SNV_CbHvU7xvb>`7fb`nK~~4*l7E$z>wTm^eA9VwpM-PZY#00#tGKGR`VFpPld4_LmB*33$v2W~Z+x`d9cT#^+zQJJaFEnc{92 zHxb^+?@U?D&vuDlonyrmLgkgB>HzK4)#iO?GUF5vBw!v{e3U!z-t1HET-!najY{yV zz5aAv|FvA#KI|EfO9$x(83%9tOQ&r}$Q3k`%56_L;NxKF~oLTh{9^x>hXdr_l~X33WEg7~+I7RyEGN zXgjdE7$)VoYBXtCm5S#sIlNlq&KmzpWq+>&JMwdo2e=L<>MmTbw6l31RX(3 z1H-eO*NFq%oc+Vu%31I^=~#QgH_0=R3qvwqm%o`$^3lG2^JZT0b(o;d*41}GG$E<> zn*PqkEe1~Z^L%htr_x8ID@hJc%9gfDPd?F?-3w9vG;51=Y!qt|;G90V{uIX7#=GuV zoTW6Jso{I~yp@Zfjajg=Jl*yUiDA_2XllwFYLsww-e@o_g5<1meXJ+j_RK|^W^T^D z<16Q>AN$J83C7xC`7|p>y_EKx`3$R_3e^{?oRjiP%L)`Jd8}NP)j=QZqYP}~oiJ_M zBV0D4+Tj+HZT^pQ*=%6;_1zCV4yZ1dhYY(pE~=TQnd4waW}d|RGgf7BqRFcHPmE^a zbt^jJZFR|1_Xqztbp9J&!L-CTqpPj0gdjiS>9ih@(x`gF?EC2mW2om8d$6Fa?0KiI zl@Bagt_^;(n`iW2Bpq2VUT`R#p0d(^7)O)%xzFS)4}}P|z0y9vsmzB}P6VSXL2q6F zz>=<;E(JwW8+Xg<%`+QhV=FfKgO&RHd9mljd1jy-r~-K~_szP5Pves_Fx|%+t6TnG1q3k&Wi|_KU{ityE;)_M(@3g-WR7+_ZRb_A3$!e+yf_|+sUhd>e#%}8fZAC&$6C;%|EbX=vEl_YheJG||~sHuJh?x+%Uq``D@6(|4X4x~B;W_+DQ0 z^--Pr`)Fd?zByW=GMidOJOj4;;KRjco51)6U7OKTQk@8>PmPxCIJ znGE)OU1m=4nJv4FEk1Z>8fS1x@L--vv9%oSFodfUVsSvXC%?PV*5)H5S=CP1I+wwk zQQX^dWO~`vD;pOCW-EZt_6prh(XWZTMf#E`=i!+NO?g);7UlL8;dmGqK@}jKCKXdT zr~iUCt0_M_?@^&ZMh_guQ zk|9II_9%V9TlDo#e^ju+B_S;V?7&}GWF;U&2r$u z^di)&mqQZfR&05_WX0nzTIWDG1u(CV{+P}9bH3nzQgnQGt+Z2GZ$dYDWw=P8tz{>h?uN50j`3%4!~sSTB#EAxABEK?D*%-vG_UgD|^ zmL_dJT4#^RaB*r{C9k3&FEjYO5{UUV;}*dS%WwvA=*>){>LL*{;-;lt=WDJ~=rEytfr&I&s^hhON_gz9Aw4v=8Qm z8V;$M&cS%E#mg(Igk?P5HyP5JOy(Yuo^N)hjhcP8W8_uL_o&(j!C)gXwVK}MlC=EE zZ80I1=Y_=1UCILw8)HpSAlCvl21tQx5;*=5#df2r4)uMxtTCB~Q6IH*muBfx+-2eF zMh^_(8s=N*g6lEMNt+(Obe#9`yD0{&WrxvcN*)^FCoc=n6#7X{pBZtH=L_W2jYHct z6snovP3bqz-*Q8YmFG~7LuCRpakeHXHZ9yswDoS8M2n}hd4Y?tT3MYeTcf+5uu!21 zwzumk^j`7j^J8hlOO?agDFF`IvYI(IjLVO0`7ZCN!|1pD|CH_hnjHr`CSGl3WF!<;iBgev|qvBE1ftRL(HQ5N-lC!tQlSj z3bzR*gQ(3hDptPW77fXW^MZZ*))x&k@;;^BUtYQAieGCIA*PT{$+T|8q%vS7%Op*z zk|RXFL_Og=F2|lpJTXqVnt;kJ=yUf9@@{{V zlAU@3V|4na1Hbl1O=!{uF&1g_xV7@YQv*cMQ~$S))bECp*W2++rq_Bhr&?xpo)Yaj#T z@b7!iwglScI%beT%s_kLJ%vuDby%8GSe{MKvJJ#a$3yJ}F4J4G3oA0JLgXLjR0jdeCDwF^dd8F9aJUldkVh)Qvg+lJKk#){Nk0MF*&3R3-xWEbuQi#_8 zZ1`I7v-~X?oCFsk2Eu||Z(S#Yv_$=jHz4>EIH%Si`XPWNe1B%f604PU(&n-~Oz15Q zf(_KIR>dv5z-S(V_T_F7OQN>B+_RA-Lp-N7y5x{kh=#<0rNxWURKyaE)JrnR+8Me0E zG1F^|gl#HrBd@;sOFR^1$6E@mU5qkObw|%_d!=tR!h0Q(X*RdwKy%}ZvxNe z+|CdQ{!%K#B zU$7p(7yGHCjdDfvocnVAMrHwUnQr6E+<^q&wK(J)tQ~Vs;y`8r-UgxZ{oL{>^*pDy z4d<}*!l(jg(h1=Xx`*g5DrcQ*_dqdwcV=fg`ky1X057(np#`nKG$pmFT922I@uJU!Y!Fk~|eJP6M`!|qWIE%#! z7XGS3&AT)P8D5N06tq;wWa&1wD;iumd{CdiNoCnr>&s!%Blcaf(hjG~+}ardnE$3V+m!&&DBM#Fuj48FS1xrSl@%`5@eRvuQHdNhP`9 z)%ZR4&&+er8M>!wz8&3Vh`xR!snX^15poJuqNCJ5Q3%;PM8tZUZrDGEJ=PBa%Dbyw zS3AM9;RE-dv9Eq%I!tdd9jBx@UDLBd8QOn2z5|+#hXr*VDYi~>Yn;NJ>BobwCC^%} z`CHi^n3RFP#$6zYcP&W_oUEChy_z$Rk}b2-I%lf027j?W2)2h&ufk3QDf%k5S$s9r z%X0Ktb@kwPXMcEw`O>}aRU01&3>eD_L2@|ZRuuu%)5?^7i4Omx$vp1BZo=GWn6E8hLQdNLDes9cTlA^XXo`>Li(h_0Rr z1bTA6V)$_o-`B#?)KZShcRnnSF_Hl%qKXWjzB?0U+od#L^XQWcG}01TufM*flJ)7s z;%*s!kJPlVbR@C=qJ<2i(_kfaAy|GH`z}>baHb?&Z|mhA-E&mDa`Rk?nakt*N}X~8 z_Q{B51P_TRXpFNiCd781u0EaGh$+--Z8l`YOJSU z7ZI^*Ixt$WR|;8oc^cg-JZjT?^Pnw z>!b~q>>-$>xu9}v{5(zUoD{v(0s49U&4T0Ch4~wbNuP@Jk(YZoj&?9F_U&=DcsXCl z=BmTJ{dFbi0 z8(p_vq+DO>0v3_Y=0VsMxLq40W*Kzfo*K@ob~Yi&i%2f}UBBuddiHeJ%>?yO?(jNj zMMgc*i%_{Y_;v_h>7IfHqn5K{_cUVh51{N=v6svtP79l|y5C&I8D1`h9Y4OnApi2r zWBi3)zpl+Ycm~{^d1P4eUNNnMNva^WKzz9Uv8|c&)?}`Zf!0)Sp9qLQ_FV)asklmm z6)-M61xOf@X&21sn9AVFHnsXB5P>(ee$cwzd3>DykmXa+Xy3y7+Ja?GB^&7>5;EUQ zTJE)7)r-WS){A8pB$Ob1bxnABva;*R>zP)vC6#YjFRxrKE{DzL4Cayg>n_s+WpG+A z(*iU7O|jwxupOAo5{KX49wg{GePrSlfZQID34NK;$NE+(`{8Z8sj$dC$B{M`KL_M4 zHh9eiUW5r*O-|zUFC(pOu&yH8b4d@}&lJ4C*Jo0}=R2o8A{sQO&Pn?}O4&Xr>OHG- zrQ*=b#KCV$9^PglvA;FD)dhYo#Ca0N>`QAhEMxMC+4IeY&48pZLl{+<`KrjGC6Qmth z~03vhyzc28z(x7qhjRzPzIoSR#k^buAli>&J6L)Y!Ym^`;A3$z8K zDv1n|X;_50fG33Jx|;i+RRx{Kq`voa$nD8*do-jUAo6*s!o8HwY(ZJ`Thn7AyxA4) zG1o0DjJE(UI_;4`^9LPpIw(J;!D2buh18X)<6f03Hes`HP*CvcVtVOHVV}f~{dMeE z2v&kbuaJ&QYTY4bUuhaEyaI(D*aG_P}W;$H~Tqf=WW~w|!R^l8^oT62}o2a0m3nSc3W-@;I^`Nxk~&(Tv?& zHnZW40TJf7^TuykpA_)t+yzlx^nZr9Kzs^3KWEj21mZy?6v7_wtFQacvg3ZiZHU#~ z3yf`4TEV$WYi5kIto~>9jPy30yL0jN>RYAT92|Jvg)KDYEHIm@!$T{N7c{6#ToZxc z7~GwoHhS=iCsDNZS-*|G7)>7ZCNNcVkj9WKwqpg(8@$W6t9L49*d1Oye{V@8y$zE7 zuqf|39J^gDtY~`6H$Oej)F8gxenIU9@3lJvuO#*)<`p++F#&BbdNuu`@m1cZju&~Q zdN-KSuM5(RLf-38%|?ZEKxgp6zHM!YvKL)40uDm#E;K0$jkUvy4^=Pq9A2KKuiL)$+)6M808uDs z(mk#96AoJY-qnG~Ir#Eg#L=(czk9FTC{PJ4UM~jg$}*l=g??~;1HV?^ zwBWf45i!1U>&B*;o;jirhS9q|ihQVQXskmTt6x(eYhoofu*+=PEzHu;rZ^3g8fJ?d zV6(}v?Z@88ea?E46NHvD4cYd#0Rxqws*p$8)Oz{{2_&H*F%2%Nos+-AvJcb)i+_y+N*LeE0q>q8f{BgD z#Sy3nX{nf$ps6K+JHH3RJ2bHn4}j(Aghf9v;bf75>oY+K(aT`WD@6k`=+*$LcLsBZ zg8_e22}D7Rb{Jk44HN^Sj$9yolbP?wbMuiwI%&lzu-T80Z4VYQ=&qCgvZ(t!c-jGo z3pS(jz-#MSo4@alY0CE2Y#EU+ zE``tt`5V#jl&Mdc5t)Kcp;lppljZY#j;WMb`)6YALk^1JFc)qz==0gv`Qk@vK*^lR z8)DRkQL{vtJ_;k}+?x5Y5nPTeh9Ux8_|&V-MTXB!WfTByf|i5I#*qdl0 z%uc)MtJT$#*~7bsWkJ-oXxL0~FMOhUo)u?`9d1b#jWb{>Ecy^TrOHo1^)|*Z=;a2C zzKy|u^y5+?aV7;t2F2p5P2ohREvh8Oyd;333!ob_ca@GamuIZK^Jipw%a>_`={}a(ef%(NDsTF^ zM+?u6D;I#m&dCQ_c5*4Axnh19^yK*_8-3AQUSEX%)(w$V$ET`{MVC5#fVyMJ?K+LA z)rXCMA6k}T64#Pit0>)?<|U?UQ2MI2dJFOmslh&2KHBH}?BMKz4oP}&<2;u~To+}G zPH`e~HX#*45CgL{yyFh)cPe+)YkFMMHD^-|l$o{Pz~VIsJWeyLINe(fwH0L-6E!@G z1-@swl`|wpzb&vl##OMqoI0%}jY>CYMKx||!nx&s;{L63?9D>A>L9%O# zy!02Rx|Zw@op4;p*=&=s10<&gyXDj?sfRJwm&BCD?O!VDKSrSu0$vQg46_ipjC|q+ z8}tfSnWa3G!!G1g>~0720x)OZ6@}Vkc4Jt^rIEY$O-GSs@J-6Jph4L2jrp3|r>-Y0 zETmGav%0mmC%t(t9>iSk)20;lk66m$x^rwnFb=UGMuLR9CzW?-xuXXO;Qn1OH^sTj z{Ji_o9{ZngJ@XLenMW#!=>B;N zV+!|kwKZ@IkmQ*vY9c8MuLspkGVHF=Gr4|S=x{Mu1aio9X9p;nJ(~=!@Q%-1^?@)n zT!jg|-nLd4i9y!%`Jp?k8Ji%sIOf4lcRf>+_B^Cr_I4vu!Yo48=9AGhV94OUgG0cnU~~g- z?C;ESmb*UL*sn_79h`JgrvJ!o{o0@Di~eY|AEYBv!V-)-#}#VxRXiZ_y@vVzJJL?~ zWPchuAE=}Wxq^||2*7Bm>g;h06Vx+0hx!A&+j{HX*4l;~WO_6k?^9+4xj?0HX>Qn* z{T<9!l*^g(Fo*ROOmo+pG^2@=LQf)UyP(5S309B!FPaeI2tJ4Wd-2&Jg}tNT9a5uy z9db7PWCNrO9^ow~y&fs*oXsQT2#>%`l8y%m%WU!lrM)!45c{-?w>}h?0>>h@9W{VC zvp7YFcs8a<32=E3GN`8uC{;a<1oEph?iQ5HZ0{_SL75rp)onsaq}Tpk1de1=PB2pj z^R#&!F~a`orDwE)4T!!fyzmrTR&v;Su$&d- z0bJy&+Et%9A@q(ON`Bv{Y51`xzMCiPQk=2?N@Lbsyr%`SDZFDhHeGL|C7&oIJW?dZ zQRpo7{i=>g?irO(!CH&C1^}v1wZUkJW4 zSW+vjG&z|}M5^&%6z9NC!=i!Mkbc!0#_Gj$-#}0ahF+tsPP=Q9iFFj!N5JuP{JFr7?cY1uqGG)ZTdh>^NZl4 zI|5KApc!qI)iuOS=?8DlCNj~l&VH5k;W=%nordl`OePB8rZ5Oy;)f>oH9@x8k;U?o zk#;$4n0?iiiz?kwa&2eP8XxwGzq~E9BR+#Ut&8ZUL|bZ?u)clx;JE1MJ1oUnw5)7_ zCFR%!E2W1S%2zCuZDw#xF?l_G$*;XC5epux2;8}jy{};U1_38Nl?lB9xtm-{56vv^ zf>Zbd0!+JSN}TtW;G5>N_a61B9ZH{mYxIg&&iU-!Ky485Qt@zqIE0080uO=m#q=u3 zHx9b)+c+FmKBIB+Gh*eZ{A!mFTjF>3iN7CeqY;061yPQOaDnQ1%^z1YE_##9V4nQN zqQfyddhwS7(QfXkR0?7KZ;3(&vIq?XrpJ=dns4mT6%WA$cEe_~OuP@k zS{M*O9E{$DwV0?01h_6BX>gfZTiMnQTiHCv2)UB(^1*CtpU(m@-o5;9EE8P|UI!b% z_mEirFZSL$s>!b16Apr+D8+*GqBNx{(v%V#ARt6gK%^=nC5A}v34-(zK>;6H1Vlhe z=)Dt~Nbdv)5IO`BkPslmxu18wZ`S#~HS3%+XU?pdS?m3i5O%`8_rCUZUHez`$aV$# z9uDsdF`FZS&N67ek&6RCoME-GlbG=mi8lCD&%C4l7($BFPBnRLDkW1N_}ZRH&8R3K z{E&AQ+hO#sP%yD+=>Q>qNi^^Fu%8}XXxG|>3bWcHtx&E|OUQaHweUy<8Q#&~G55@f zv&$3}%aNOwxaW%}p3UuZt8Z+nbJ5QPlTdo&B8@c-Wbr}=RJ~)BSIKGfpV}eKRSzo#BSs>nEu(=&Z zX^EXHIh$Vd0uP$Ol`En3s`;l)pAO4nU_~ZpOrDut9OI zgCG@IAu7{NufNP4M!!EWokEkI-2l(0xf5cM^TL&YxZ$mFEU>`??>z1BC#Fxs&xTC_sW$>WB1kc#9JJ0SIPrE4h!_{tv&pg`no>qUrINNA3 z44zBkaG>8vG9g1ybJZk|Z=vhR-)@}P!RyjJB8fO50gH?H_Y--tx?5_~C6-9*x~Iu$ z*^s~1@sQ!)wEi->q8>l~gujODL$T1N|}rDjQ)$2Nvy)r^d-YAjCHCUy5T! zko{-;FdOAfVNK;>L5dAd^Du?3qVzLGqAJhp zC(?y~`CYSTN^cWSy!iOxctRunwY$k5kZaU#($d9k)ckH zlyK_BZ2BOcO*>>yKsP}CiU;Q=SK<%;{9GH2r)?*S+A!~+yY}<_t!*Sz$^mI5_~b~^ zpkwl)6z53z`Rtg53sM{^ef;jf^ICcmtE6V?=#M&Y#HX`XAAbSpAUpPlXg6fb{k^j@ zV2UwWr_3u_U-8?mQhvl*5y$!85{zWbPgHQ#_>_G+=H!fHb_mV4_pe~b7MT@cM)DeU zoS4(TA;bbrKV1u)doh9v10E~-vRVnP?D9{;N%&S=D-k@4vsR;B0-}d2Rc~Ghn}WPN zLk-=<=0H;Vhozlm;yK@U&iHWO+~t9YFr0el(r*7DIoq(8=s^|B+1M4la_6(pWeO5y zy;1davdJmM+Zp+0J3>e0aK=F?B$ zbqAJaNXrTh)8k^f?LE0E=z?@@qGqd8>HWYzpng$?e-uIJw7<1gnW{!Ga192i(mq>1 z)DfdEP)Yds<7LRC_Sb3b@$<1xB9O%}0a})g8s4ka%1*2+^{H{qGyS_VA8R9599W9D ze%(ivgA5+2YV&k!`56cnGHIuXaNwEku(mU%X=pTTs3?XyuH zueY-f{B`4U1x;PI(6{3A*K%ii${H1&0%V_tQb2Y&Rc7Y*E@MkZIvefSzpa*S6~H$7 z;`k1=`wvL;V#gm4MFvRU)}+P>TpjpGQz7m~8SkhLuk+mC@}l}K8{1z`a?kvoM}8$V zLMf=W+M@U5{<+Ot&u5PF?~^abj}b-BDgWr^(cwByvM3fQIrTY1F87)TFl!D?khpTE z4(KSRogm<*B#;)Ljs?Ych={L$TNm4uU>}*Yi{zOZT znk(T9`eT8R&gNfMFUnM1z=tmZ5y*14FZpG*@^uZaj=y7S{D3WQOI65%Lx zDLfGDC{$t%CC`|xSCYf$M}Pm7csp4-{(O~`RFRH|h=>H!>yhz#r;g02ZUoC8kejtj zqJY+o1my7b_nozgOXWBH z1tuA8Peo~xl|Hez39+nmtUD!1xfINrt9U15fyJs{wsGKZ*=86ExSldzmy8QhfdYq> z)NwZ=bi%vZ!~?H~;6g^(e+7;cN#tS_wT#|z3JClT&}BUJdJ-)a$e|~AhYz}~b&&u1 z8_Zt)zb!C8J&+AhKD~BuKk{19&VRU1^KbQc{t37I4>}a!NI9|oI&-SsMKr|))~9V% zPbCsW5A`=Ii`G7RmT5J|ePmRr{@^R`ifY*4YFSRrl0TbZFa5ap@- zc9)yjcgkh_M9tK-49DWFNxU-gBw44hx6WUe>=T%i`05UEY^b_p+UHA$swt!9r2>qL z&t>-+gI%r0pd(0KdI#kcJ7;fs41Zkls_}a!As4GE+ap_l$Kg$pvZw{w(t*rPR)r|( zFZ*#LB^ry%_0ExS<2M4%P-;#G?|!VJ$p}re0KZWi%=&%9u*PQ*7k@wW)gwlU*kDE5 zRwRd-;T(^%9jP-y5y__K`lGDz6H+Gc^SO`Q9c}M;RQd~T40S{kKF-#q%t`}UOQc$W zV*RWHSsb%)8#eMy-f4VjMnTu$(Nhur6L;6vo+*GioYJ{QuZ)z#ba!<|Ufzz}>F^4D zP28#ds6FQta!JnXrMj1T+#k?eWDF!H9Fr+6Y-Fd(L2|cOdG-iq&YVP`Hl-Tb5`Yr%aw@{ zfpOCiN=)E6(D%FT+Qkd?>5&1_a<_8Goj|U}<^Qn^3` zs()s|4(=5`XsgYx%+9v9SWAv6JNRg2_G?i8BGSk5kz_#24|gLSZ5sq-<>i80bUK(E z`bjnk9)m+ zqokI$0Q;#DhYY_u#&NfaJt5phf#)g^!G#Zf&$!)$J$xmB9v%q3W=c4>lLO3FK|qD zEgC5^k0*72C$xX&(3n^jX_f>yhxZ@QbC@}{c9hbPC;#EdB;(z%$`c)yvll~{Qm@Uu z9+SD0UbOx0g_KAkiM_pv*I%aEr(SF!;OSlY8;&BSHLoL$R8A85#(|D2qorIF*a;G) zp)za^8S@V)w0K@EC04I2c>mEioBZ(BZNc6+D|1cO>&|CqCIFDC4QJInnBP09+4p@D zX|^uUf$Q5z$KSY|_Y;h%7e2i96O_6T$r#XY+jv}}p|H;DH`znxd-2@NGcm|G^0D8e zz#AHK%k?SGMll|}_x+A_cL+}!t6{sAmbybdBEDreMbU-EnF$HoFAsQmnZqlrS)2x( zlErg;verEhcHr(uVL=W%ENMj_Zgh#h^Sx+}xCYo~p!ps1bEv2egfRJJP?xy5<B z%ffRU+)_0>ptw}~PZrsiX6u56pE)=PULEzno`3I$Lvq?ODi62P-7vf*cqXe$(zBMM zO*pP)RUZaO>Ws(wyL>M~FMxTd!Pv`Zh5v$i=o|Tc2@bq#Q?&T{gqBOXzU${Fd()Sb zv$6rJBn&4_ek2*_D5qZ;aX*{W99Q7Xd-EDkvj;QVDag6gMPZ%ja%*gVL@k`+6;Th( zcS?5QhAN?ZLJiz@GhbRWxm5F;rVi?4%d|NDP)$Ljgf46=bh~e$!VywvNa97f*tg`F zo`+=4sV5o!oFdV-+zZuC*K(Exq1t0vhDij-#53+onu*9&B7=fy1T4; z&_${3gl!&2_;)B>nJixOy-unkJv-mR;{LB3NnO>CkJMF)Qgn`g(B&L_IR-ZyuWXb& zm)z8ZW^P5TmMU4^B?jG`s{avbVgjx9sDb_~kJ-)GAv1aSWqQec(^T660RQ^ER6LBh z0(Erwaz+3MLJkw4W|r6Ip82s!#r~U7Y5Cf>A?HoK8IyaKC?L0pPFJCt>5}(y_A>mcC3UX? zM*B{^JM~Wer0X*vqF3_4wm4T2%*PpYF`9C@9)!&s|6*7=&QmOTMj>$(JQ=Z*Pi5Kt zc|H6$h6gd!bcrtfydklH(BMqzczCnhp-PL}?&-)K?FtKIJ*!XQB_kb~Fi#J`OVm69 zgke(8ejdZMF)L7>47sBhAn`PPOxd5Iy5KE?3h4E2pp-IpR(9MUn)e6f=pFWAM3Ja% zgChE-jU>qv1-Sg;-^qLT`*vqWiEm*6*7lA69@+ap<+Xnj8UK$1Z~tfT1^#Ep_$Pq; zf7MO=|IOq66Giavtxnl<>AX~Xpd)yK&bWr;tcT90Ao;vMVUygIG)eM_DLuC=YF1luQHqneVM3^P4@XOb z9{+Ak&Z$glLdFd3#c?!(%NqqGqWd)A9jmn$Glj*olpc}%Z@;qA>I`+%tBx*OX_EBj z*y_lo1hd4U1y-*6g9VEXBZ|G67B9?yoFhsz9E7h31|~;F=o(-2)%pVxg9*`R5LLx_ zRow=bR>vNV`M+rp*zg~aeH{4~MVkuCU9C(P7}z^G;&ELObCris^Bay`O1CC`yd$g!fHk>`9dC|+5PiS282uvIo$ ze*HNBi@|)jye4&8bi6{zotdTmb&{h9&INGdeUTXEL13R)p&$l{+lWrTfQ6$JKEF;| zdhF}!1mpL8cbS4avu(bOEWwu}t1yxW&P^A7M;jmMkzA4Lv9kS?^VBE>Po;fdRERt3 zJpQh;jGA2ThGF{;gKAM&6q7w_+Xc@*hTiNvlAZ9sS4|D!iiW%Eo$cj%JR*}d`MWlr|~U$cuKYZSXo!OS^H?SPrmWMi-jXhbTLzm#c<1 z-(rwe^-Gd@@TD74vf4uRJ5=@Ysj6Ib?WeLQ4aY$5xyL#Vt(Z5nu?-tH7FzR}-evy) zF6)faxMjBPoA}wCDA9IkO+!MbmL|$es@|U9{3g5`#0FC7>XVmT!OBf0wd2oKz}eag zELM9ny@Or{wP7jAK|SAUUNO8$WsftxEfzR;L7oBgg8K3D5#=n&kNQ&dj$&2hc2mWW zpyzELjlMTi;OfCZ17<1WGk-8=JBD_#za3T-Q|VmB4SFKG9}9I#lHQ# zrpX8Qs2XFw19Y@s`1-7>>~w3^;ZxwUaJsg&^;MxMKg!Di`emwI>z%Ez1);N2LhO^h zxn>WFc(y83b6hcQj(qmNJ}e6KgtV4)auSdX?l^sWLRi}o>-{ml4ZcD|2M@7G1MFm^ajHy?~{FOr3=u8)uiMSi2V(TpbL89=xJczndLrmgmc`6FRZ1 zs`}+Yt*zr0b)jd?pJQDfMoFDCegb;J3}T^3p-)o%{RNJbFj`?bXM61}8^WGeU(Q>$ z>ZlF6TF@Kabt3+&(mOV(_s7LFzI<;8C7%4tHzsu;M*C?peMsv;rMKOy)h=YX|Aflc zX`)pxL56L&1<49PBhhTo8x^rNf`#h8E9HYq+b@li)$B%gzJ>A&&c%-QgvEP11x#lg z=mJe+gVcvvdy$1OCltw(Hj3gtE>#0(1AW&-az{eu+E}f@UoaPzHhWu^wsUuJSghnV zkgLv|hj^j?ZPYU%z@Vp{?~B^4`IrZ~K|Afv9#PbZbKUXn z{NT=ZICyWDnf~d4IhqBz*wuI&IiUvxwV{xL+@lHe#zESGoAIX@2V5O3<@lW3NkpfH z5;-j7H_UbA8L2f zwEZ{H7V_z5b(JgIaNs?rclVe$w3*IZKiLpeAely}DU*&`0VIlsAT_^D<4W-$@ohQs zytl8hSxyNvN7+5$P5}~6L?5V&lYp-cfOCwtn_EL-&&9y|&S5FIk($zjD_UXtZ= zi}<@&UK`>>au?nESbeSAkYTeNr2S1CoX{WfVkJsZ?wr#LoY|zeX`7c6KkFS41cl%; z#l~n0y1~7;)%+V3rOeB^y@@78uCxhqHINeD%f)z2nmKXBct~ZKxyddwGJLt&Oo)!H z@Eb8Sx4KRv(tXY8eCZzijx|2Ic&R_2#Hy-;gA`;77$Jg#madN1Hhn1X)koXK6mAt? zO?ujTN_>*V+2#x`@$Ap^>G6KVHBv|3T+?|c-pf^X;^=(GUB!mpg6bK*ycYg<+8O*D z_xMc*!4>pEAHe3fJzt0Nmw%7C_G9xm({3CbxZ<;Gp`yn+MP3x(rtVWQdH>j>0(>BG z(w13*TmSeQ(2us>9l`zO_EVscil@a&&FwdXFZ(;!jDU-;lmoui6Exhh?X&93V5JK{naEj8?q2rQb)J->^8{(CwERxdMv7OzL%0>l?byY)$Pa& z9|JdVmB|5=tO6?J?oh>9J!p!h-t*DMUZ!3ZF=3Zp!GRY&=1l6A? z3;NYIpft=r!mwtAnEbk5K zbj-Lf_-QDHEi3SvU}wZ_@!@ za0KGAw>>46_2nFUM3VKzLXSMr9jz=z9rXcE`=4`m+|CkTB|9sOM%6TB^N()Rhkdgf zV(?+H8HBT@pA4!6Ee4otPA+_8`|vtc=*7y@B#H8^q?~rn-4}GhH=|tABXX3&6=ySW z9~hO;&qggdx=AgY7YcFTzGN}$kS2iH^Q@ zvlV$S94VJ~Eb*4Q#rNPWTRx(%IE}Skbxt&Xq{3W8(Z%rgBTv_XcFbD*Rl&$#tY~MIBNrSU=%r?m+RPBV$hjZ`P-`pmq zONCOkk5s8u1hMaVxogPDL#_AO z?l>8_j;2%eTULq$3%#6~h)vA_lUqJv5tsOt?r%Pgztz>xM;6hquQ(1?6SB`PNoSR7 z_ZsjHDP&vXVpu${@WF#m*9N^UQQ>x^&AqGVnUGXa=zf@eaG1uQ*Z6$@U~_h6rYT=g zjvP$!CBs{uyZ7|kz4Z`af5uZhu3(b%M%I4j^Gd!R%Yk*642j7C^mJ6*| zd%HBkJH_{P%;;8UsqxR~(!9PqWUHBZYLN_bE*&8SbBC4Hl8tLf)EZ{-yO#_G?JEa` z3Drp7iX(4tYtykNM^-jIR;A?~eQWLEVaRh^8A?`_^F<*)^w08`<9bK+ns`L48df~j zCp}qtUoUA(Me{gT%}=5|WjoAJ?_2+Zl)lK3;|H$`-04C|rwf-BYo<@#U~VuZLpIY0 zNLFfRo7Kh26fLqugh#)EcuIzKRD=w#8r(cMu!L~C@6myIx)c%Ss#5@VhVysxl`C`5 zloApK=Hr62gHCUq#{30-X`H_Ogjxdoc8i^7+FO3l{mp}j$4#=HLfiIlRQHOU6jP@$ zl&6SFx2l}B+$ApVB4WF*rPlV+FV|V6<7k@49RA$;;UaHXDDCN~D8MMu56-rp@8yyM zl7Bo%WU_6Pzq|5PyhMYG{!0+R2hN+(jFOTiLh9xC@%H-m*u$U+97NWoR7p7THbJGs z_0~sCTbl47UDVPEaa9Av`+>`|_I0PJpJO5@(FUcU+jke&Iir>;sG_(BX_wj#0Wc+H zP0e)x0}&xt|p4F zTZ%j*OMUykJlQoJSG#8nt7dvv=hDKdym{@Dg*DBzVlYZBI)`Mp?(qFqgc?5S3j3SB zUtT#pX8PU!YO|)LO+94?pVTvYD1|$9RlOd!;e3b=#2pem)FZ%^^+6lrda&jn(8q?V zFc0Ip>ft~haR*A!O+1gV+rUK=`fV!saS4_62yD5=D^u8rDR{mPh9>uon)ppJk){29 z#thx)X1uLNwqS2%6jTyn=@}t?>;P8WUUVv?rtFjTR-)7 zg~`r{pb55SbLe_^hs^f1!}T1hV-AgxrF79*2gZY71IOl| zaP*cxpbKv*Lz(MI?Nt%qD~~L!E>w@%>YEWdyueXDp@I9q6P$EiSgc6(0Nh|8FK znA{(hAwRP=Ui9)yaX_dTlPzLPrEjz_BXXC1@r;^@U5Ru-KML&5 z2A(+oL8RDlg5}T+I~7yW)B&GbU(rgvPo`?KE9S$n3rrV2YCov+4A`A5j>ZM$&B}ZJ z{u@|5+WW&Vro}mx^C(X*fp(a+gbEh|ph0SkbLLH4vKjN+7gxtFge&r>Dd!b#Jio1i zZDxqR2_mTUtGSs0(GW00X6N#MLMotN*XzC5I?ELcFZ*7$5OD7;EGJ22l8-}=pPXuY zo2Tn)UH_!u0)%ReE?2MIT?7YzOUT+Z(+dF`)->JOvyL>ypM?QMGxEI`LJla1BNYqJ zIUw}QX9emb`JOv>;LD}ohaC>h?XN(6d25te_Zpf6f$9TdE%QwDhfcdYfQtoC6vP1b zc!VrK$%nMao!8EyW_Dlk3lC|}o+;0SLaR|aS3kaM+YyO=pWI0j3iQ~Hn3XIct%R1Z zDeAu>N4CQSneWB_!v14T-{ss!mXF7j2e{2)T4%T(lI$bh1ukG`^u9Tzi@ATE#@*(N zSGM|5SOtpZa#p#TbNqp}hG~?3v5G};Tl^hK;Bpb?>R(^koScky>#R8cN!Pz;etD-M zfo_TZl}BW=u7D@ZG(z)wy!$CP$@mWdj~{AM3j`8Vw#YN1Kpy|2aHb;_)Weh28W(t* zQPgAg43J7BBKR>tTYnOV)leH!YzmVi@Ezql5Iv9_>*pI9lNe9RFtvwX`Lak$Gcdi~ zjJXa#G5jYt&eI1Cr?oI_G4|hQ(|o>LXjL{oJyE)7gV^m+Q6HZeX}su=LSdtR8#s5@ z-};Shb7xOD`Ow5TNAlg^EUhW}z#30?$Zgj-RB8wq10Fea{jc4eC`^$Dgmc3*DSoQo z%f(NjOwSH=WhOQ8CL!j-r)bai0CkEGBLaZ8u&7NN##%^6JneWBI{S8=U_t3;7j$& zIU0pffWG@n$i8G$7l>HI6# zsR~%xk=-v{qj$?>FI}FqDY?B067^-@1ZT}q*@T4r&BuhHa)3*XU~PHqx=V%g);Gxu z++~3)Qo+HapS^Otclw`K1Jm#6e=E6HJV2bC!>R&E+s_z_n_(YQiScde@@sJmNq^=Kt@Gdmu*LBoB_Ux1ys*AcXcWgUOe_28s}l_ z@jm{-U1kmJxji1v=~Zy?HdftUXK1CSfi(L*-)Z3B&@0TN&`hR6wY=lrqetrj+(D`f z4XSgKWkXG`g;=`@cIQ|3g)S6`4mD0`JOw$>2fER7t^J>dw@tQ*ig`3q0N&`(VCQc- z&mL}?ej|RFM`o*hMoTpIo$*7~w>Q)3K{vaEW5147`O|y%tLC|O5qpgggMkW^a?<+v zOb%h6)-VS+uy_0canyS($eo&4TeDxVWa;y(YtT53b``pw@Is;awyUM*Z|2*5Qn}=? zO&9@lnkr#Rmba$5VJ{!bf-5%5WsIG-%4g+geXq3=w}alv`<{TV5`{XGtgamAYA9?B z0y@{EHzjb=`fhLe=!wE12>%n}XQHU<2@Y*5R&V&`Q#VOG%_{KG?Bgc(J(GAfTESfu zQ|#hvy8T$f(lu-QuBBZA>tI6~f}T5M^qEUXM|<0lRuk(+QKv$`(;iX>?d8I+gu+>< zh$)!cb1unq;@?_v=ZK#aE#92`U8Obs-pP$xUtgx?{6A zEb>j5uKp`q;ZN5RXlYePJ5-k`)Thk}zcH3Xk*s0b4>0+TOOpOl? zo;1jFD>aXP-F_j@hnsEjY6;^w=ce_=MjooF$#I&qhA<7dK{U3VSB1e~itJ~-<27#< zwn@I1)-apGp2(7Lv#rJj|3YBX<%>yRqRjl+UZdxQo6hM_=5#A2m;!{CpK>s%6>ug; zbJsv;eH@}{DY4Pa|w#fg}TMKj1@@uRo)?>gAHwxVu$D+5T4CI|N5JKI6F!}$AT%SC$=66{x=$MIh` z-U&)*^>5)_nqQ(m6M{e_p=cqN`g@d*u4QG-A@cK@DydKw<+wdig z_C0p`+|^6C@(W+jxnp>!#(;LgFo8KjQD5lcaQu|M=;cw_irbnMjp+#qKmY&<3 z@K&?o_r(NPsMcYq*IcK2+@wFD`KPh3Wxd{VT@bc7gfY0RwR=`sv${)RI1mG~Dr8i+ zzmDx(j1+cga%NSK^Do<^CvjUk)(ST#mx6jmJVb+7cGHvy2J(Ii^u3=+7;MuVZ;#ne zDfe+g?}2L*RU*v)!EutmF=_Yyu-e_j9N@=!zm1YtYWL=k4V^b_zNEqu@1B}HP-*V8 zAX}x7Hz-B}^^7F@7Qw4S{`&KmMt~IC9{tRH{8x_I$4412+6^9N+!Nl!jhNaMSbHl! zJN|$WwE)P~hnNtWhDY5=vkEAs#&7ar$*FfYD{d&|;XXo!>hYB1n5Ox3q&?RZ4qO6H z@>JMcZpP$BaI+NLCvPlWA= zM%iNe=yQKft~A^1De&Rf0iniTDu3ufAc%kFX}b_hlY{jKx>#K!X+MHmmyT!oW1 z*TmV|7JOwYKYK>yf=i&hxtPJDu6%ICRIUHhJ09Klrg!$_suE!O87Ptfj>*-A*zwnpwDfAIXll?t-3k=6E-o14*BY#0Kl z5#o#h4mn#m}i5>^Uiu!2GdGG!Q)GJ2{H15$&4Q?tk zHW?i*gJIoUiBJ%$O^7ziecE8AqvFc8;LDcKPtyXNWw7wTTI&uxo41G_DYhzu8mca5 zGAQ%0G6|tn5ZNkwL*w;HEqR_63D7u{0O9q%*eXK%Zz5$WZ$@)VvAAZ+hLV+izi&- z(hYP7Y}qrqiTD)lsiARF?Llm$RqLn3KHh^>A{AHJ*+e@V8YR@uT!{;K$NXPcfC%Y)FHD6WNv^Of9^e9NgS^j^s7*LThGTU34NP2Irl$ z0&9j5zAFp8*h5b2({=DfAf*GjqC*&JV(M* zTWvB>`?M>LDdfu-zpX!$H*0DQT`_of#V_G@MeuGWM-5!O~U@$OjWpeojIgf zL0U{l*(S`w?*5LBI!JWfPC}?)5K@l(U1LoussGkkgm(lViz^*NY6^g+kvs&q($OdY zKeHM$e}p{87w(>w(?)r|bfj1Ze_lysO|<=ZD;~N#)}&jmy5YA?y|#}9m;EX`?Jp;K z;nHn}v8ieK<9h@WrZ39+98`HqV7UVJ4R7Hj{abv#LP zw*M#}AcMzc>u=U4^~ZD3oZkQzaw9eX1mr)(HkGr_8$}0yqSv67p@7FJ7D=X|_kJO7 znT=5I{saiUV$xx7hKEO`16n}MJ~H<=q_$FiXFTD==K4v;$(-<6gE20C7HZ_UFW+0ix|J6)wK$6goenN8grJn{I20{ zy<%3sOm7S-j`u+Rk&fr=CDqrT+HNvd=zEaO+fCD%2WVHsiwJE~VmQ3xSVB;+92ZEG|&MgGgZ#Y)p*7ep2Tv0)~^P&WS(705N1zumS^a= ztJrJ^Nx1HojX4N2unNo3KhpJo0OqKFK!Czr+yN})2IWmFeQRjw5}x6i(zle>w@yNB1S^Azy+k{{5PT`PDnFNaGZ2nGMLY{o2;4N9d}zFWg81tXp0t-(F~}W|=kD zYWXN>`zlxD%6;NSr+AIzbu%}&J$a3L8IquPLFJa5M{#(>9 z$qa_6$R8TUjDdHa9YV11^A3p9<7!vza(y%e#>GNm_xrnI>Q^FywY(B!tA&L=NALH# zxj%{5OL)s}>gk6J0Kx-a%&y6c%?jdH;YQLCfZfj3BM84}r{gT|po= z6^t0!G_nH8?;Uz%IbLyQ&(i7;qO`CzU!__FX$FBn??50MmYFMY3(>)C(cSOE@WQJ#f!%@1As(vcAoq@Uw^CUk;o$NnEGp8Zva(T} z%;#j1SQ|J(%uxDxwN1tHhpE$vOL7dis&H!KUko7_Wg{QsLKxep4x#h)ngl%GG_}cc zL}O+_D#A9|y#K1ozM9jIuvgda1xBjy6OyAk)78ci;@-eTAa+))kv=rG{gW>WBd$`F zps9IaYit-|%+D}Xd@XxWwr#_$h6*89bpVE4(6k4wylsvc_aLcULDA&1A9z~pomo;} z&k_D+V2p*eW2QtpoA_RpR+3FBC~0@FTNT5FHnCGv;vLGT382dzK5ygVPcgLnR9sTX zhW!uihgKj-jEg5m7GE10SI;d_jCY30ebpg^#CW zPied$SGCIl6n*k1Zw&U%(pbgO|EM|LiZvTY8p#-MBsNGh2N~)$sT87;|x^aeeU}v$18K)q&6hvSEbij zX#vUNe!JE6OF;$S+=T=0QGSdVe;-~pk4ktkHn87dOIfCN7dj;Ix;IKh&TPFrQt!xc z%)zz!NPCN%vb)=cF$P>8h34ftxB30gS2rNfY>4;GQW?DLTv#m3r)^ba_=4nbjo487 zR4{6p*`gS`>O--K-|SJ=g7q%s+Vvr8E~tJ0>lZ1g-8r3;71ipVT7j~V{a8T3z&w)< z1V3(n@Z2Msm@VN<=1@l1=0F!L1N!A5Ynt2W3r~L0zxO?<-&}D{c<*Q>|a2$du>!mdu``?e@$DA18?-9 z3FZ~uu3@I`=?#AzkKjp zzt_chi(6d<&G9x5nv@FP7eD&c$u*depyaF`N?tW zGvcAE4`tSuBb%OP?*D3NomHVD6?0mLD_y3;>E=azHsv)f^Z#(CE^bo@v`i~hF<`!fmapHmC(Ph|CKSImwK3jx`Ww zYLLE0-&*kW^PUS3xRfo=&92kT+#$|#b>=y0W>h1~ zx~1eJ=HAYmv)mK*<2|?<`SaN@N^%(92M8OOjw%n+l8*tIrG@cMB%eRLv8fLgIb@i8|CdIu6h6e|;WjDL9TDoNluhN^o>TzC796UP=H- z$A-j$r}~$y&TE=V>Lti9?RnWdey7=!zkgbgJHIgi-EAyckh=Z**l1_zf{(0C%87^K znr~lA2AVQ~Kv&D^Ims8XV7BGaY!W5o7%iTk)0=H2B!1f;XXdi3y_<(iW&dIm{Z7;E z^V3N)&#IoP?-+=DO?JZ}eg!|SiHRHau3Jcopm}`thCdwJ16Mj)2~;U1TmHbcU%+*E zF8W8Fy;$Me`>FGV8Y5X7z`36jAN@ue%Q;3L7ut!Z1@Ph8)x0im$8>c|mhQ$@cdamg zvM9WCbTIn|q)w-Q^W4ELRZV*U*md**T);ttcd(*Yk2nPnlS%H^3+{>pmtj4ZysiQ# zy^GH)hye6&%m|*x|NLl?2m5I!VvhRstN-31H_ocbXEk&G=a{{@G#Ry&?(e7wsq7b8S zxKI*IDZ}pMFVZ=iSK9Y`f&P}v@KF62GTKVMj*4PNIeQ$XG;!T~S9R0L^q$yjkE3d> zlS;8YRSs*Bgxt*8eX!Nyr0b6Rrh6h7IQYNQ?hC3^j;J+VI!hU$;}^A%LuSAonVqLA zHWk)c;n8^d_YdnNjCaVJ0eC%H`Eh8+?6qePaam_77#=Hw zuk&mtXJ^reggD&6AzlFT!)9C!e|lDHkdH6QA^WD3((?Jb>vl{O=GZLe?aIwT`wO(f}?ZtT_;;je}+M0=a=uT&+CM`ffYqM8M z20Vm{Ur>YE%V%`KSFfubdG;;#yDcmm1fr94*pM>Zs`bp-Y2akcDwe_sRr!TphGunRe;kX_C`Hz zY{hcUI?76h3SEc-yxINC;`=S?L!Zmay@^y!N)Qw7uIn{nD&dhCpDl0z^VGkbM};14 z2mbE0EUcF+d|ZY%D|qxc`b2P;RL#AKzd+GM!Gi^dEFhQIIbc;v8#|)4Mqc|aoEiC_ zW6Sa{>Rn5L|Bw4|Ury^O<4cAX&Hq_-_Wz1;oT&ez;B{+5lWBiId%ymGZdwYs4^!^~ zi2s5A9aZ`N^`H4qUhsdA7yO^$qxOI582_Y2{g2V2FkdyU(YuMHaf&y|t6gN_eJ+aQ zIEgN1ZL`zZzj7bISr_gaY{EKcc>26C=(X$OQSa!vcgf=~7~y+H~%&ho=K*v}uALCm+yqrj!aU$H4l2Pkw+>PnL? z`A2xSjwP?IEZYzrlWVByJKl_(OlfZ_f9!kYZAH)vbjZ6n4R9L`$gg#poM&=@>fB_; zWhy@_>7jPqV!5I9U4O&lPq=x^CV6ffkV~a zN+s(W8JZ%{K86NHOXllzVn2En^R>y|dh%u?*qgD#N?hqRxK( z2yWkHU@r@6U25x%q?ixU<&mvM5?mcuj-!szRc{WWksI~HskUI(?`|5;Cx^!;h-ht?f5UnH+aI z7V^J8MCWHU%ew4oO4$&NSw7cMVC4`PS0_A;-Xc-~2PbNjjg)&|2Q%AL1lORMnP10CX&KjOW zD~Bx6Hl;GQC&21Xd45j1;J&uFFRg%K1uSdq#gb&iA~@KfNK-_*P8XT>WsK8)Tl)?A zpm_|f3UmC=-1I-)NKIQ1fFGUeGtaQiaKyjfwHsaHnSHixEvwklGvB!3l4}3ci9U=1 z6kpg3*7ULfhV7UCYP@JVfd&N4USUouH#gi`&~9fJ(w|q=w_&tptrdQD&b){17oXb= zBivnX0mus@r<<;RC&qN8JpH{i17IXBiXsUeO=q?6e?pBQ_yEeJG_S01B=B7)E4eTwASFJg{Jx2##tVgacSacM$`T7@DL|FE; zv_s@QtIX-3il*-4m9v_h8@|ZR?u8k>IT?I=SCK-=yr0Qy?-yQN4(e|@9 z#vHj?BFpdu*Jjz}Ip^**t2p~3Sqv7BN*5!sw_+|j&R!W-m|&f0EJV6gUe6SKZX>8* zgH=m$&0=;`*xX9;YpQ#dsRIx0_t7Svane3+cy z2&gc*84oswN9BL>@6-&iCnwR*5HU0`Nfc1NKt*n9TygL$QP|hFXZ|Fq)#Nj9M%0Y+ zuIT)G?p2@8?u7HHucs`}x;Tmh#fRCIf6Sc@3?{RLH6dvYL!`n9u{RSvB|r?*pR8Z` z+W_a(yLF%|h5)2W6d>H6eZHBC*zik{{wrhpqmc{R^+*Vv{lpOd2n&&2K zm1G^@9qIk`$-{kgvir@vHDyO>4RlwOnT@fSy5i^<+j$2L8`7 zm;dG8|C7c1-x8~TyM|``jq7A7Mf^mTohS`88K&Q>{@Qj?5CxT{^d?bhB2AE9MWl&rV8LhmJ^1_=4@-!tdK+55ve?>sZlIWv3q`zasD{4xpaUh7`h zeU){oIJ?09%tdd%qsoWiJxuWPtn8&VSgvvv5ZSbt7zIL9gDKysL}5hI(w83aHaCyo zk2ls9Vk~a!>#L zyQJIcZ^#xrW6p%EFUuN1ze6$R0-YPxbDqIccCIVhF1V*+)FBzBm8^r)@k8>p%PP;$ zGf#{Nb@{=Dc$w~D?u{D1SDSt*)5El7d7qM#n4_PT-Tq4Rby!33wrOqcV!oX7I3G+b z#6llOx;hR+eYC6k0v=8?A-(`jw=eyxl-!}$2{SEO_Xx0D=M3xgtFUSOCO*!hV{ud> zFERNw=DI_R+=c?sP16R;j&N(4OZ41xLx15DN4Dyp5UmlnZukA9t_%BY ziqHD!tqi)XLR|-Z#+938+Q3&_>NR5#8~xhMYaG}4$RcLfjFrvPY>VDgV4)sD3u3!| z3k|Svnd}>=M;kKd>yg$PuCDzwk8`Rct;%Fdu2cs1^=Plqys_VW(0dr91ZsdOD7jtC zl!IIH9r{*(H&pHxWD6aUvi}4Fe3$)Q@e8315W7dPg3V9=Vcl_&Nk}!}Bsy%KmqDYu z9DktViDMz!Ah_^e~FfjH^`TxBhl=K2|8c7F-A72}d(C-(T%#EBEO$IaP@a=|^gd`E3@uXzbdNxU~wrf68Q#mY+6C4ao6X_uD5|6r;6$7&(Z^(kRG z3m%GL6~}+bFb#{{QK95p;2S7GXY+hgwB)E(GUPYAL;QE`ii-OZe>^{Hgy0i=gFzQ2 z!JKFm#cZ%3ekgv)RiA!pt`8HmX%XDJ`*By8`re_k8QB}QJAGP1`?@ab7urK;cd@#e z%=OS8FxiNvFM^oK6d-pX)Z#qUy6VCySYd3P5P)m%%0MOl!VtDe40n`=UpDyEG;w8ak`LqLi&6UJGb{wmq#GsUZd+Ti{S6nc__`Iua$xY=Ymm?lJ`W@Upv`=DX zK6QDRzWOB>A0!1>9SQ2-5zQ1kAhy;*;+;!mBjr5DNcD^n{`li$edX8d?ay?gb8fZ> z$46ZKtV&U!=h_K#7sEV-(g6}~m8fGZ^~U*r1d#{kS{&;e5z#pv>%6NGW2`bBn{>`oe zh)iNJ+_d;Mg1!|B#fsNndLYJQq!arr?soxJwnXAj+yWW<>#&Jo4aSwip_-I4QP<9M zkwJ$C^Kf)0^XUxuM`|L)WuEdw=WO;+A;26P&<{lM;JSWza(TjYuF~w3g!6nP_me^X zTtQDMvo|*2utbKMgTwZG_n)jNqs6cQq8R@^jlds@L5p;F~JnYtWJnH zo_=zlj+om$X157_42>)6$@I@`^CMGv;h`jbs3yt$YTmN(3?0+Z`3)t3}w2k|ebKGbAaG$D7mupwR{(C2Nlf+SHleg~|8>`9nsCeK3g>6{Op&AambBZ@`&4C8~2cAIsUz5g)j3c!pL{t3Xukll~w+RUM2XTxPy6c*eJ)k1i5`h zon=m(iNVtwkf$0~Tco`jP)3F=9*D!lox_V){w9lJJKK2H7I{>5spU5J{R@+6fr?0e zq`vfo4Ol$G$mZ~h9ut0hw29vQvXpd#_=cdia0yz1Mm6e-!WX~V8I2u9U$L<2sVEJY zTcb}6OKhYNH5HUwGhg-goIW5SLqkOCNt&H(f-u<8>VcKdMv!0kgQMXvQ1xjmmeJp? z{amW1cv&d&FT(2&=%LnpkmbOKn~Aa>ZgN8!5_H$RRBEz2;l}zHFo3Uw+ZEEXOND^U zSi=M^Y`)Ak22tUntSa>Gr4vlxnrT0nOuGW#=jXBbB>34u8v^6)rxvOdGL3mS&%#OvIiPdjQ} ze@KaAsLo}|)!T+NH|PYXG>GcY1(%!9cUzEHG)F)PnO!pn9My7RqCHK#m&tqA z;i{16Qaj%V3PK}5Ny)~&?C%H886Et|x7-(sf`wD4dVI zcW4fDbsyB$LVkNS96$~(hp^v%Xsi_W9aX-_84<6h05vo|P7{ ze_?r$mok%L{pvzEbh;*+I#j@a-x@y`KcDZuEXWendo*F}&ri2v!yakZQ7Y^9K9_8~ zO9ImE)a!WBw^?{z;w9dr!l7`=g|&o18=BuS($c{5 zn$zgpr=C|?forJ0mqmaR{~at9Y>yQ%_xD0~gE-5B$%}%YHP;fH>|lld+M_D>XI>3| zO<YP)T`47UaLxp z6rNt*h)}B`jlYxFpP?FBM?~<_zFYzmQ%tVio$AqivAkMQ;1p=gJ2**~-|- zrr{I4(O{5Dhgia>S^Ljkyq*f93nafAPWDuFO(pGBC{F*;A8*j$`?_5)52;H9q^JTc zVuNP9ShVo5&&j)vBJ`D#S$d>glB6n}&JVJt&qzXF{qg>(6 zB)&VyFH#v1q56tYNK&g2_P8sb=!d2O*3*Y!bIKkk|j@GDBdK5T<( zb`#@0P&C~t9iRvfA=k$? z!>ufy^dL>vue=T~8Xhxf$YGe?ac8rdNbxSM)vKf)q4j}VZT2&GKS1Z1XfBJ|px;fs z7@kU8P(J+8U*I9oOw`FJ04~49R{D0oh(e=q9nD;~hR@F$`HxIlR6Lk7L59{M7f(pz z+$;q6g)C7TN10+%YO$@%p`+fIb;6c5M=VjJ4sffi;;QKBOHh(G$@f<|X(Z_2VT;O9 z3(bk<*DmMQVpw}7M6SkFxmo>Q&Gkv*DyMm5RPjB5414>cciaY!(^$!q?vm zTXh`)%yhQ`tt;GJm&&K87H#m-0@Ott_!3LH;O3f7L5XJzrXfPZz``g&r>k{l)9?7n zZ*JOnKh*5ef7J6K5ltSN9Ul<23%#(|1hF20=>0)0^3TqxK2-B--!~iA_Q~44T|(n-FxTO*Y;NE(boqE08Cjl>K9cGKn+rz@MYb3}9Fecz$58Xo)=^|p z%B`~+=#};V=$qFQ3{Ag?(3O7(z#dES7m_nX4|md}c|_;>&K(@oyeT!?JV95~d5?EZ zcWvmYg+Q?^)qExnc9PX_nS+3P4F*#e5=;#0N3L><;19OwjIp|LAn~;O?|J?RGp@@D zc+N61FErN(?Akyso>)3(&__!4R)eoPt4Y_K-Yn)Fb)VwONxp3qYV=b7Y6_a->m*8g zL!N%;!Ul(JNy~^&oh%lcQ8X(7YjQzD?l1R;DJ69Gfk*qo!V}+rK^?j;Ths<#LIpeBn zl?kjh(m1rVtI^6$A!Y;t)n(O7^8@n$cM?JM?<`nO6pQeqZiZ@}ho8t)0DEobBmH>E z8TCtKD0`QP&240)6oX+uo50(3w({&?n~S%>bcF0Ye`rUj1R>zJ3rgYd`yidrYmMH- zQVaiYew}ry?Zt8+za}F*>+Uh`!t^q?5rn@Y0_rHq-8fg8&-SFi%)~|}8{GWzN_jLF zWeT#htX_QR@68q`sk3E>T6y_|FU5E&D_MV8F=tjpemVh*xl4pqIuoeaTIQK2Pt-^^ic)rET2VMN%N}1cM%G@N+5XHw?pDtrI>}H^ z>V9z_=0XOBw}OObfT3y-Wr&{G;=1us4Jj~d8Q;)~B=KH;C8{pLKAls2Y+h8s^|(JB zT?dYKE=mDy28rRr_bu-4=ECSS=)|eIvN3iYp^QMQ!H%axYyB+%D1RrWW$vOPd9GR? z|Mm^osos5~`YNtsD-b=5DctqOLED?Fka3~R{-Ac{2Y-;wVg7Dq27SAsu~SU1l@E9jbkHRW2)&bBjPnp2rR&9FNN2YAN)+#mh2 zEGVZg<~Ms8&`fQKiTE;J*i?8H)Ew)p+z@q=iRVk)0YULblJVCNQ`0sqBJTGpT2L%! z(`z0>L!tkW&94_SuLgFuxq@*o*pH*(@a4vaaozUnSAeXpDw$R8u6II{P-os{k>W!@ zCwG&`#SvQZ57`abFDe+~S5#*rG9-8Ztbw!+@-9b8?h{j~}-KfhW6xfzcfsZ2)z`P8Z1C zwtrfWGKy3M608#u0jX;r9WI-c?^#X-i-14*85{eGc<|OmV#ajsprC#5fI)tOGI)v2 zmRw0z{}UFe|Gv=*->^s(=XR8MyR*Pw5ll^RszEa9tUoQvddZk7`_Q{CJ<>y%s!n-b?6#PyIZpI#&ekKWnAv>Iq#XZqw%7d zv{yk=*G{Eih8y&N*mr`&OBz zLO;N$LzxJNE!LDcY^-e!T6oVu=%RwDASn8c^Qm_In^&wW6wU&GW3{#S3G}iA#pUm} zz@3lFTuO`h4cg6 z9B9(%vLmB_&#VHqZA!wXiNxo)^(dk^46o9eq8loDywnSEtJEXJU#Hpnpy4ZcEzx+v zHfmQL$KSo=*OpD=iW2&RJBh+`D_OVeH8tQmGJj!cGR~uCy zRF1%*b6+*TsTN#rE1-6d&yIFNOx)Ok$!W zFXiN<^o+;Y6;4X^RKLzfim0cWDuTVkNdU94`V_z*A?})OtlaEl$3fRd@6{zNxcu#8 zx4RctHY{q=b4KT#Fd-^&Du+n^k{PP&?EF1+C^i+co)55!50sovbZ-&gT*i;IN zJrM5va_g14;REfzGPposc>!W)5UfKiyxtyL5wYH`<9|QBlS3>5E~OF1*8SbVz#E;^-j8lQoK0bjGK9p>kUzYs}`MDJsfXKq?Cdly}Qj}=SSpB_4iANJkCXe)I z_SLH{Oa66nU=8%G5(x95+Y@YKV~ z{7RMHEJ5IqP-Q31%f5feijN9vF@EnuABGNMZ^C~f9T8zmYuhW9NtD^b;%UdTgZIwi z#sr1s?S9Zq$`YXbU99+{d*AuqByC$q+oFSo#e+6V+G>8bWa)LK3zOdS_1&b!%b=6L zBcZ~Ukn>txR*L(HPLNcjSk0N^yt{lR#DsI!4k+ev zHvwOFQ;@BoDR6ctSvX{SIi{f#%ZL!7wGE*%2|5Xz zpJdC}3_eR83#|U7LAFj4u$i$|$azpuy_y_~Bzn3s#Ru?lt*NBdI zRCs}g?O64$;}!-Z;aw?}8dkpWNaf~5IO*n%wpjn1D7P@82Bmx z!KzT{;v(rIuz*{+=Msz#bHCLo$fbm*RHsd-*xo@rf#n%+SLJ?nfrM~FxyqqDn zRmFK46oaDX%>#D)RB+GTpPt}Dc{k7uiuJc*CLNKXc4lBeUA|-XnqrG7&?I01%IFWI zrti=Lr;#Lzy9%$AkXmGkNX_4QlQ$%#spFf%BWwI%P9+Kvz#0#8FOLGzl32DvsR*=- z)Wh^Yp2_R}wk{hM3tY@Iun*u(0X-1an5D5N6B-X?@Xu|xz71R%JT?QP;@-*NK@kI$ z7F!(ebZfNlrvOzIB@|`Q8pV^!m4L|CgR~i%2UAaMpIX?Tv$v<+&@i7vZj_QP_9i31 zY=C9nzhnv(S%u4)SengqvAAmE^q$(PC(@0=`KfH*&phJeOSP!7-qHq%5g)qSE$D|6 zr55);T65ymB3@!T_hSl@<@Ru7ylmrXz6vNuUNJJkJIbnrK_D$mevCw+gDYGZjzZkw zdET_Nwf*v?w8kLnNnS%k!|kwvw^S60cIJmCl>{FAMJtIbd>I-cm5!H=Voej1Ob#xI zd(RbCDMU7-`cQ*>V?y-&Ldtp0%5N;lxA`egkS0cL|K|_%79`{I_`3_GNOHwjf``mcT13`v=}|rpk4w?T4eyfwLhkyM1v5vr$iFtX zIvTqyG{C?`CWfa6_C|{>C2rj$^Lj!(^Wl&s{=$m*2x#!`Edo&mgrG$%@qQNdNU4X& zGkK+mM!(Z!9d4|I5nb_z_hj?>^KyKD{N+yad>AxUl$1e zVVEE)6qtPil(d=H-CPgyX^xKxTDjb9W-rM%5GQ3(RPl-?c<-gq=%sSHUQqiFHT|&R z=k>{2-}tXc>%4y{XVcg>)t7L~q?<&2S&!l%h%E_pW^=awBqWD;cN(<4TbP_&ydNXv z@XSm<`(VwgW0&?ILNSXf8t}`hLGckxmiQw|{S&)5)|!6K%#~m_%a!qx0#W4JWPh## zN~9+%ue<2pMzFi(I)#*-p21ZXQu&t!CoHf!PzMt9ToVOrRS0JF12WCN0EPoW3s}gg z+e($A!%QPzUqo==qjq{*p(R)h_TY7}9gwh=Ief`|eBu~>;T8N47}f|Zfup4}KrsgG z)+08Rbx4-9dC&UzmP7HA_=XqG;bmU(-Wm92I-)f}768LZ!WM*-RwPGZ9AZ~vZ(nWP zdXBm!`SALo%-a3LH1|3hI%SX49|fy=c?i#N{lP=AVVG(spM11)J})|X^-@~d1JIlP z`M;T8|Mh_KzeA4y^90`}ip6qZa2b4W)F=LNn>>D0*yruFou{KW8fOKqD|v3W-#$p1 zY$V0#3aWSRoYEB^tEw{@{+IuVe`D(WZ#}E*45jG5iDIIUEVL46RY3kj=5U!t<1}>G zJn43*G8v2wnki&%8PV7peslOAamW9Eqo@8iMfBgJh~~unAMyVG=A8V0RsH`vKli`2 zCs+Qfe767T?{v9s+|-F3EPm$&xyAhPzovH0_BnWjSfLGE&f;|mN*YxB<@5ejx~RV^ z6GS<{$lTpk*mHhn7IVfp6Xjk+m~H)%C9CLZ(x_sm5~EBHVC&x)Ew|)De`mziR9qQV zq~zgVebw*oQM*BF3(2CG$Q{kJZukV5WI27*k?lsyIjbNu_sMSUu6@>fa`R3BDb|{7 z!0#q5GZ=}g2h45CiR8gnxMgF&g7|kk^N+n>1)B$7vki4LP4&c+_3s6qPl~22Hi0{? z80K%9)PIh>w5di0_=fm~$DGOrs}_SpN73ePXf%DHVv2=S;n(0?(C2QCp|8VA@`sk) zQM=jNIF+dReM3AjDVfzfk%vZ2*izp|wXbP;=`c`Ij(s>TEiQ8|IL~{XH&)T%Z?`y! zT0cvtIgwtCHW z-Xc6p-hHMU9@y1zQcDcNYhe0^b)rUczrBfw_U50WendS{CwJFGAm7pz@Z}`i2kQhC z&0K__rcPErhNoJ2FUQMSx=vXq^HRYI(S2rnzsI^L51Ba zDU~QkA7{Bt{#p!i)ykOXyu459vq<^GQ(NPYG5q}KXJTg2=C<`}?qwN7@tz229iM$d z`ExScnY~u@#)Y8V){Niou%Zcb&b+G(h&I>}bA&F3Fj^o=)8kgtP6t6-{a&0NyHo3T zoL$gX%|lpp@0HXOQu9J+x||Aou<~Ru-AOaXxRTf8R`Ab>Cx=24DX!c{_Yr=JMVzD=M3g&Y^z=bpb;uSPd%(5lG`B%9?6z+iw^;O-corio;_4 z|B#t}sEEt@*5z%b8RaJW4jeu&S%(VK(ehyzhVODX2(8!mS%s~av3`$H#u^&tyO(or$jhaU|UGw@dcCK&B;Bu3*eV2G!F zeo9@cb5+Dw|Lb{B7mKw%AB7D2Qf0ySoQCO872G-Tf>qG0IeW4E_&^cz?xN<8>!Pc8 zrI}(u-R*2)Irf_tY(sLLX5sCDh>3}&QhBQ#w9M@rzakat@)R9wcSxMsKd=ZYAw+A%k5)W8)Y-S zFTprr`m1L{b!7rln7x@xR3A7dA!l%kPA|uxlCelcb9GkVrt*=@?P`y@6$h=Jf?3F^ z@mq^QrRu-!Z}S(Ewfahb)7>x#j5{}R#T&k;MS$t&l}iGOr>)IcsyMzsRVcbo*KQa0 zJuX?z=_yp!oD!bc`p0?3}rD z$5g!8H;11eTO=}p{j=M-mC%x4X_4n48suWr2mFcpH(QzPKG(gbP1N&;H(#5z?3HQ1 zfk3BRSe1J$BZG2+ClP`lXZ2<0wJc8*Uo|fhfF1Vh_c~(~Eb91-o1Qj)u!EIR9V+~1 z=KYw~r{^6vT7)%UWXbJYaNoq~6)q3Hftg1kYA3tQ}1qCLW=i>MSatTQ`Oa}4+e`W<=+sb6$*Ui0i z)}^#rKGNKpw(p46gaU=Dp+d9G=rWw&oex$n$POHI|2`l~^`$HD_Dqw}xa4*d|DKM; zwpr<3?&4x?T-P=>mFIpFNG-(#34{Ve+;nFHx3*r2{@kv$gqNpH&4%Kv7MyUy%oa;m z)BQm7!K~8N4(<@t=r!Q_2mR~GkDEP$98<<{L|FO2a}yYB@iJ7CvCu!rXp)(u z{Y7Jw8L#*~Br z!GYUHHxOTy$+zfp5p8ysKsMYHBe(uAIR=$yFAehF$%CZNu?974uie^8I zM@=5+tbex)eT<0~5)1(FiIqboMeMd+%le;sMC3dKUJxS`AwrXU&*(En*z2rZMNi{j zxOuqeZ|QF==|Q4-&4Gg=vjeijf^kPY2tO3>Umvks{yd8_kTe2~}~V&M|{EXJ_!eLjPv0WqJlF*1yX+nAn-_{nT;Si`D6c zJ;ibFzO}&Or3;MCHH{;`qT|FnuYbRK9i%pfFHUUg56RF6tgm>qt*m_1U9FV22m>PU zg4#!2qy4KI7PfSyQyWxX{v~e-PNub^Si@LtREq8s9c#X-uNv~J_{7O3aJMlF>Kd>` zek$Mje!bDco2}xZhI*1w)(g9ubyI*_z+b+Fw&n|8j!bgTRl;mcBUoOxH|)S2DrDZ! ze<_f$zjXOx0a5ygOyDxK>63Tmng#TL)U3B2r4&El>p9odSOVc;(w@GqVH5X$?gl$o z&_oeYrbJsjTCxHCMWc$z!cSzi<_b#uR8NCmEy+54S%h~RM8628$MlBSxi2XksaMDK zR&Y9{x1HSev~tY%3|XAB=tyMjbtp0?NKg0)ws$P|Q&ClL9b$4$5+9SA(Dx1%@-Kre z3y04mGyU?cwIMK9snl_Q?6nR@8Oyl1Vs@@uFplj;J{)SfGxYYPPe-GLZ{@5A++1nU zwYYzs zJV_jGK-5&4*(IBeOa30RH#}t%o0C1=G)_flj*+fE*Oh`A4k|J(G>9=m0{3!@w)XR; zA>y69iFXPy?8NRVGJv+LBHs{zTkBfZtsFlR3AzC5C7&x$rzH=xic~ev@loID(+Hp{ z>hw)h28|Ipp?HI~lN;rdpO&kVd27CE96UXw{1o-DJy+CUiPkGERBCM13e=9FOX5$r z;V-^6F@Th@4o1_JUI}|zWW=sWzOToUlK7)p33i1SV*uHO^-2-G7se^708K_=jFb{+ z7vyrmv`hb^%8|(3;N^KX0Z; z;D7w5M!bP*86Nb`FT?o9zXpDq%7QWc(Vw7ny&M`Ija_sg9)3N_$1`mEFR_-eHk)O7 zE`LkN;pW)ZUrir(h|izrVm9&MABD~kO5*axL~a6HYzvECd75o<39|}yiq*C8fx1Gy zMXE<;EIke!-`(TIyq(ck3rF7(`uPu8gm+msWnr{&m+v1)hN3V7%k^6_-$N|}LXb{H zQu%nV16jnj)s>0%=?#|R!eYbr=W^dr`Tg{S>m}RLzdUjGRqpG2LK%C&L2bFQWja9VA}nLV5c_Q}#k2c^;~Z{nx3jmkL}}e%M)S zgI|o6BbZ|^?aVC{e8iAb$Pev$gkL8-@{U`0#fBYE2obw<8x|Rpw9+(h zkggAjn7Hh@`qkYA0-`9!{LF|v=vvpUPsZ%cTUdM@;%5JxTYPl)Kxlq)2-}Wg$A6TE zua(0>Gfw6-PTNtI-dd4LJ)`z_icC>YNTNa?39ZFyMdgvx!alA63>`)FlQEpJUy<1& z(blzR?}1L-r#MI~eW}d($IKatu3H6)Teqyoxf0Si1y}x<5#hyGBVs-ZJ1lyx#@(_| ze5Uu0x=40|tO2|BBh z>tNgooHlc~cr);mS*e)`dxFd|^hKHG-$|3kfb`=W$Mh=Xaf4q%tyU+MA?jo6L*(4NjGd3Pm7KDsiZ=zW|A<5O~N=uDbchxoczGjh; zd~$TYfuRIZpw>Qp$%unD>o@3ktR3qE6GKOWoYa2JStdg6-G0@X=|yZq=!K#tG_+2)W1C|zg|Z3WCHfFrn}>W zbPpG~05V1}n(wI`;HjZ6l}j35t4m|H9RSiPu!aq0lT9}L&Z^%YIG^HsA)HgQdFe6b zZg6S}iHf!_Y-b-7X?)5eu`N|Dw>Es!-nwX-qv|r|T?0yg*v8sj;&33q2>N1_cxSfu5qVIyTqzGd9PKWjAt%o zKP97fx>vJ#^5N%5O!z zZigOy556$j4|^;#4*(Qwt8EyCkDS=vdSj542P3uqJ+I6h_ZG&#+|B00JH-KFol}#f zLu>a?R=LC*{uHM8d{m)yrYrBr)J*k`v4G9JtD(ET;puWc++A=@9M-TNaNNy@T$@`Z zqQ}gnztQGOR(ze%5%1DB43oykpb08ci&0(DC&~J2HQ{eZI;pwR>A9~{pdOE9R4F5i zH&w3gFwE~QjhY?ze^AiaNtlYKV@n7;&@AFk^{O;E0G}I0>(0+Z59-#v0eIp3Lq*!C z|9<$H}y#Fqkl^8auOe8+B5`4FiXd zNmXleNTTc4m@z%vej8^A=(g#c)n$6eL5p2gohiG$DVcz9d{XP~tZ|09?!VF^ujm{= zh&_7d0OOXL1TYvm(2HE=>7R&F5SucQ`NZ;oFsuPfz8S|Ozmg7%Fglf3lSC;yj>`#vqMVque`}=m|1+pfVe-Ei2YF|4{X>?x{tsE1(^<^Mc0qO7mAY{su!lfDu8vTd>s|i2 zY4+viwN*4iaw4IqJ|44WpC%LL%V;0R*eo|ByKVfgnRUBfYJbYZtb&vgu^x@n=Ji$hvUwe3flv z@K!!6s~~su*mai$FM4#*yW^1_k%7^O?+QGibAdAjM5LBNT&?*hh}yzlE|?$ldHA?{ z_22R^3d;hCZNITDCV_dRklk@~iu>zBfzJ)@6l4G}{q|uK6M4Da@|_@^F_2!>By`se zqyYa__bzU|ypK+9f7@tJQT4Y~bjNw>O52iA22{ciDxtn;RT*G2mE{rvd}>lIeYBLT zyBWe1q0ntcm9_WPgEv zBhi>Np{svkaCo6jMjdbxb@-mT+U79pyU(WXsL!s>lSUbH$6r2$vq{y1?m`+J+&@1D zFl)q+A%AbPp6@POZJ8ihPhUK8tV_)crVHmiDobf636Cj?Em|1}JrJ|#kpDvOAkyBG zGyj17gL{m!Z3mg$g45y3gWO!zsk*#v^T=?2(W9A}c;yw^99M|BbnBJ`{c|fd%W*`= z6EGG$J8vC#+f#AifaYC0W0pdo(ZdJSoE+(Kh)Y`mfd64R4z*3X>XFXsC0`kK{VHQm z57pLVvoxgl)NHq>yJXtw?MKe5(J}RpHdML7U%h$~!10&RV2PaMoyeUO%bnn53+k-( z6pAAco9<EP+S6b^-J_CnzsbcNmJ;0^JuN#q0}CHo%3G)QmlInh?q~*9&>8^ zGd}iOrtJWu#(k@OHMK`>2u5Q}GtW1%Cne}}!$+rAY*mdbUH9#prh#;-$oJ2hY)4B~ zMZdQ8fbtB}7Kv9<>Eswnv6D(ogNHadNe9pPi{9Z0j^iqlmE$r-M<^OOQ5FXUm0P)L zocnMa!wcq;d>HBKW;Jjc-g;642fAvekIXZv_x}=*h<#V}0R$zu!IF zYfEO=X9wfnQ<8CI!@b^arKe58-Dzj>7Lu_-Pm>=#-99ya@0pYmJ|krwqgIKCEh%%+ zDMsbhM~rTXnj)sYHBJg&w*|||T@4?WE2;*(B17u2yYqfi$nqa2!2y|%hi38L-wm4N zMEvx4N0P_ebMw`X!K(ox?#NMtQFT?!+LHt3t7(2b@dNs@%kLG8sA24`ll3}~x7+3) z&0Vh)jEGvQS08hF$8mj+>CQVPhKmeJyU8S}!;USI+G$BmKMY z?);83Xk^GsYS6rYt8eS=>jYJ*ih>c%uK|qK)|M`;2D5Yee1ik#S@(Ju=*GPNWa5!5TZ0)(<;zXoItt>Zx?5w z8V`5rlp?a(d=e)RbA+XF8FR&aG{Hn7DFSL#?O)yg650Pk&-6gGWji4deNSB>I`7DC zPn5U5HW~6GFHJ*qubc1d_hc9c(yrXa+$w(pp7qPe)%{(A=)FkCXQ_cU?`3Vm0?#Kn z1OwCH{OM@tVLgUAU27$fkL0##ZiaXss zylKSewTeMD)fC-}+qxq}hjRbWc`eB%mw(9gBGu}a5q19K*_IUO`HGF7#u^FfOG+kc zsN_Ta@v;01kW+v?-S+^*n{-Y zJ|f(lUrT+cOCFS^^#2f9vo|xj>i&kFCj~v3n`zWkn}#uiit;5-v&i0AwY4?6_??&i zg|6k@@9LM=W}3VW#(6Rn;7_;Ku68MQT|Jmu_FOA-;g-TvmK4M*pIVN4 z>^z~^8M9L8?$-bEoy+&A)aAheneoGx@G!Zn#%sTp%WrRCU{g?^-RFA)?`a#+dK;c& zce7v|?Kz2e4~3=keKCQii1DsoUI}=`=QEq0);D!so?Q@ODQfsb;20G81|Y?9+Pf>OgCdg^ zu#g*(YbQ%f{NKuGy!r+TG%kk2Lh*Zn8O7>kR_@SOL9yBx(q>_mdICo6F-wF=>T9{P zCp%Qn5x@Q0ttQuM(qB$O_w8%kaZ;WAbRdov-?65ZZn z+4715&nmqS{|pbzX6Y+t#B`C?bsA!}hL$XJz9wv}edv=1y=+ecz9!va9%I0-DV+vi z;*aU=@8=UU`?p*&@(eTsimm3ld9lv#vV7l;E_)o@Sgq&^Tq*)K?Ubo4R&%RaKVy@} zW^)=|DXRB04dd(|t$6CYn;#$H-=I?vpVEg|3N#Lg19qXa%Rq>UdC7k!X5oMCpZ+^? zf$86gUig1}??z6*s@AebvgSP_Ci@CSGAeI_xvAMHOI@fpRHUgxq{g)1DV+W2O#s!l ziJ}Mql}jf9gQU;@kZssDRlS;!+!j$=rkas-Mu0?@WKssQw20#}*RR~kdqZ((?-j@` zcydN!0mO^}2xQ^X^g>Nq71&D69m=VzIK-16$u8WnK)$D|@^WnNUFPOa`Msc^BCc*> z0~(1xTeQ}=!AA3_n4==Ao2^niT0NzzH%H0edndJSe@7Q?hTa&3BC^?HL->MqOU+$I zRVkA^i>hfv+NB++-Ue{q6`LQHlgq&fY@frv%9$ZH&w&ZU@@r#kyf7SqOBt+MT??$8 zM?}X?sEOZfY=5Tqu9SI)1@JI8u%@*n8w;a{P~1=n}zNbtD9Dihc6DN2P|anUSEl9e`Fv5V4wOfOI~FLg)aMF6KPv#r#=+#@_I7NtnBI$u6M3< zehJLtp2i%77`C44B0CbVLtbH0|BT-o%UTl?PdF6CKK{PqB=Bn);p*?ya<0BkF=A+aHxG|Wj|djNk0aAYm;o(jrGUyiZL}@3FjQp4;VibkX!g&)waz?$$HM^xnAUbhfSC4{dP?`dkw} z1_Na50`IQ{se~Pu(`;ox6Iiuy7aM-JH)NhlvnI-Bh@~sEuhU$&HlaxAe!dvWI6H$O zYT)p-RTiB=Q?HnRq}Y995{l2W4bf#ya@f zBIzYx+|l9vG@M4YdN(est4a@VKx$xy1*M;303$HpdHRu~AeEb2Spt(g*+!A`OA12n zN{-IP+E!+<3grXLM*0-Ra9UP%Tw&ZX5UwjCCRswQb7TKlNy+|@>>$#&orj@A1r$`M zm{9@)3z43#k(%iT4l{)QuKmI7#}S3#*i8-|f7r{BNx6YnbG?dwx2itMVS5~Sxx&L! zI(@zTWm;uGx66ra8P__<-3QtY63*3l-R?1bF7nFvOggk*Nl9wSXPXR%Qj^43*@c-ENu@p+S;?Xa>`SaV0yy+3k!Tg3Mk6sE||X4 z(;ul_r1DKR@(IU%y4Qk3

iyiX|-yk1Js*AgL1)!u3!ycEq|lm!RKnEt=VCo>~+4 zuE9#}b%^vyt4CfEFNQh1M0~amILB>bRsl|Vlgg{8uC*oFb=`_&SMZOhv?ZgL{)#w# z%h5pVOECg~EAijdCV^ss=Q5hukBBXgEKQh?8jab1ZAn)T)%Z-4N`(eZHhFBT;WRRr zMd;fN{JmTwCq#CyB6H4-oO!>oQc4Zc-JtPvDkdWnx)Tag^ZV(Har3I5xAad75ig^z z(EWLTZ~Dj2(;jxE$3}f8XQ6_jd50weheXaxda;})iVjv3Wr8kPD_pgqB6(cVI3vfZ zy0ZTv7lp9f(`#R+#w13Mj z7A}qWE%#Mq*I8%cCjC$*9%* z3#|mUNV7jTRDMbsYuSJL^UnTZr`}@R?eP#-bR+$OmGtO#t1sq9X$hc%LF)?%A3Vdi zGE_c{FBMOx@sc|WTq+*?y_rP39x45IF+c^e`u@2GUr&0E;rg=g<2c%8zl1NOe%HdY z^23Xc{C$h_ZIb3UtIbn$SjtHW1m3tY>D;){2aP-O88(t#NO*YjWcZe~Kg5GbWmmF6 zU#cIFGu3g(*&WrRA)Nb051y<&m-N@JDF7BLY1$~TtYr8CTSdiFCiHvn5?JI&Ea2i7}49dmmC=)hd}QP&gWq&EhM?$3{BS#!QWSnOvd zWG{C1exAMW>$-ne7|gpvSd!t#@Sz*vh6>Ht6|{wn0_`%v`5S4XadBhCo-~l0Hkh|? z4iKP0=Peha%!zP5vS%aTZo%c}+xjsX$;Qp|TBv$+Ca^OMIdI!*s&uYjx8;JBS2|+K z_<)SDM_Jag`bddP1Cg^fj?Tk_RKR%DVA3O>r?H zcR~!4-zpQ3Ss`;EOznUos3F$k8^j%<@naE*oHtVki|8YyWACdn=w{e;J956S_L11p z+xr#Z_5y2$-VO<=)BFh(!b8jhU!`T4eS5D+t^Kc7-TZgU?0=7C_P_RCQe(4oj8mD7 zZ{5h1%%H%?n%685!~SHeVbEg}b(9A6(k`PQ@^t)eaDQ*~BDD{Cb-FUdFI2vD)P-8- zFDMKfJ$!sECTJ&>yd$-d`#mv3%_KGFz0G>~yH0Pbd4~Q~vzI>e3Nuw_Wuj2>hVl8s zrAx_ur|XI@;`iQI4?VTsx+=^CM-?Op?p^+3?0_TA%6?(@dJossT`ZWitjRQ$9SK<9 zCl=W@X^#0??W)`V_SsU(>t@tX0?G(xZ+0{uG-NJe=MR(}N0Q0ol3Ha#$z4UXs*UW{ zy%5XP0u7|{RLcC>c48F-v`HeAwbIf)S>CBpVTmq*9cqp8xQeRgX7Qd1qsglNAxiodb$IhUxf?&oYna_jb;t=VOM;jQz8s7>zzSRrai>V5h0I_cscj zc%H}#YGCV%6~)2;6ttcwxi_$aaI}e!L_JgrQkdA6mte-vZIY1awd_RQ5T0MDfX$h~ zb)J6bHKxX97ti{elCAi(!UR_++)X{H59V8OQ0TS>&+GpD#Q;;rl7sP6{oZ zhjD;hlflsiF_Ap;mw)`Y;5~6finWM$69GIJ$4aANFkgy2q0SxGp9$wy8${X6Dg7MG zM~tixfiQ@ny=Hmatb4yp^dc!QA?V6gw=`cYGkIH1?_+Du`88jhm>`w?xu#D*9Fx(P zlKkRP9}E8s!FEn0$=%-^VX0E?Lw^D~q=GKOy-9lgZT_Jg1qCs|-4`^4 zL_PlMY$nxB6K(R2)+O^MgLa}tJ=S+~vP9MkC zF)1TmpjNC{+9JAsZjfi2G{NN71AiEF#L#zsa733N!&8nQeT9*SC6N-IjgKXM;vJ5?IfO8Ua!Oj59QOxsFyayad zs`%^AzN4@-To1Riv)6VhPxZm$KY+io973z*h9x=I?qdj4?ZwBFY z&ox2KL|GgV-i4aTLO?c+(^rZ1lI z(tO{3MtlxoN6V4U@CIl8HV$USzG5c66b;WUlb_?~>(LLx$b32YytbmJVAzHtf%al- z^kKKK*&ar#o58)52IkDK5J~li%fuFk!P_Ei>x;g>@tav^`4U&@rH_-TPkDjx$Wc}S zxB6f8P4gqAQZRU4&RHX$icfRL(b7hi2iq*};TRls^lQT(oUC;SDSDJX&2@8d zNCXiP*f1mT6}b*71b30-6@NiygU$kSGoB)-$1C@w<>2W+Wjo4 zmJ+9@dH75w-s7-Vpj+TD!LMuT+S-mS)Hy&pxERohhRuD*pk*UjT^T@Q_LPmhSMxq==~ zpC#1YWbD_~FTK6F683ZYIlf_ds(I!e6db>jY~mY46a>EyA>aCZ#vr03)%ck`>W4|~ zJrsRigO`J}$&b;LsUIc!VQYDR)OC8i^DIx`jeG}=V!o{bP>HZs>9>FUT=VQVY)cjw zm-E)(OC(PmH?R)guGp(r)B7HEC_xI<^5vasNSpUv3wm0glmpI+n!1p_7X;A-0eJQMgcjd4zo&paV$<3;McA?jrz#xD9K#Y~80S0~*v8y&56P}vl$^okABm7k^G`%H> zY98XDjY)IRnOV%qjX8QyzbL3s-%vtUCf!-n!t@8o7+@AtqB~s zGuPsGKn%fuv2X=Iu>YyA8Azh!u{e#(P5EzC@&6cJVxzN)&lCN)>fQhJ*2n)^Tjc-8 zYoY;?e?e>j%*u59gk}OExjK%;1z&Ckf31pdvAbpmDyO!91PyS%|Jgq@e}W#v(9RLp zo|KW4p=-_I;kBY8e&GXI!hNx?<2Kw#(L!O-MbLsr+8fIaz%y&x(Gc%sn-Ln*-;HCQ zEo@L~pLUc{z4>;#tB%&Et>l4NSbd}Gyd37|9^MKV7F+>5 z+V3eF@pU%D?BBP@3c&%U2i`jnW@#RtE^ zIAJvxA|CZ&Vl910Lx8fO<2ww5X_M*pemU^F#c*m1gS%5Pu`eul-r|Kv^xau0%0nXDr1IJ*ssRzx~EeX1+oORRu zTY`>H6}ixzZg)BfXb2d8PRWRSR@i3tm67%|UK;mIRn(BZN~rOQbsslPQW1zP=dC{S z?&e)4Kz?7G-p?Fr zLsoISbIR#W$>RJ$3e3d}iw0l|$0s(;+)0vj3X0 zer|+onH6KYANAX_qJMgx?arCDfp)DGT775xG*^G*eb>@2LJV>RV!L=G+{jyv*0?mD7%?=@lfXGe}bOWiy4K+Qh| zU&Nu0+uDJd8NWXFTIcmX`=)+#j-sD_1G)ofC_AEzD*0lIB+t!oXBL0#WahZC&_?so zG%4w97)1D8Jw-g#3(D z*g8X})#K{b5|}deeNFg$?yY0#%nI3dc^Wrg#1_`pH;`u5@LG6Qz|+xqXb0kvHu-jb zzV)K<1u-`XDag&F8njvJQ_*>zdp~)4T(n`oc>SXZc#lD5;E|?_S0mnl%-!b?GhPjM zG(IhbDx#s?R~GjJggT~s(!Je20xNbS(Yl11tCgw5341)pd%+FyzNIsU2~S$5dYO1TFm67#QL|9T-V+rm7e?3X`02)w-{K{ z)HJd0OO1;^V=@7s6*9f^*XI!2~1 zdI!g$L56#jF`!N>kw&BEL2V7|mtO*j$A~Gnf$6;ao~IFXS>GgIUA>Jw)Im^RgI=& z+50?V`%KlY%@KB|O=9U=G>Ts0=1i^aXz1s)hDnI}Y_Yp5*|X;dP6G5&RdaY3&k2s= z7hRW2(aW7!{`nrkGK(F?eoRoBC-3~udF7<>!b59P5S;{jJgI<>$bRAbk*bWd_Jl_T zt+Gt3PWk0Kvj*!s?b>)L9v zMeaS7uwLl&N;{wjh|>}0egX-uWu4_aQZvPsF*H+l-j8&gM!ODfD-)pa42%k7u*~*z z0n3g6*4lq1OXpExxt)dW1p{Ax6Ti#$&%3K$=(e?FN+M7^IH7RBZqe+Y<`(@=ou~iq z9{nG4SkU}oyVt>I&*&UiBFEM`#Y(>dqq2Bm<1F(1;xW^GNB%@NsiRmgC|g0!CCSiv z@a*!spH29+5x5xpXz~EF<0Sat$gCq@g#7WdffxopEH^hdysQeLdnA)C6%Va6(pZrW zlr79Oaa35kgT%aBS(Ryc&z>03{Q)Gb3e79cZ>b2QvkC*_de{=@QOu6JbZ?!ij}s6pa%u~J((>1RewVyO ziJkoTivv$7t^)fDeQ^1Ci`Q%K-Q(*-*_KWKa5QqT2gywJCJmj>Yzdck`e@7;i^ zkaR9&4dSJQtfd1`)RGE<%&lJXx)X%lYe!h1YQndpE&ZSK|)ovG!tM zN$g}4#gy5(^FuafM)yZ63v3+;CNAu=5Mc>zza?mrSVQbq;E_0y`lch=m_UEO^a^L^ zA4_~AyD6cDRse^C5jMw{i6}dDD-_(i{`^B`;O$_g)tdtwp)~;R3S+ zjY*MKi||XQx-tu}lr^Tp)0#g#F8!MajEpP{{Q6HDPxzR0_AE564FIYWD?&qyV~i*N zMBC~ojkD(aB+~0_K739eH#~UNEXg8Cv*uX_^+`VLvC$B>6v8k`{INVnu(iGcXbZU- zB8Qhjz-I`#weDzxN~=x{5eqch(G6GYIB`;9k-hMHWrk; zskDr+WsU)=`6l+pkr96;XS+4soeMt4liDOdyj33({j5f->r}3pW@TEpUB_$&PI@ca z#6voPXwf9NtNkeFbA}h@+#umywX#fk_>s_pk_J0|vOh(`G&Tkm@ohDj+Acj)KcQrg z7RMUT3zk(G7u({&^D;{&kaSyE*;+72(9#<@_$tBep9`;0&)@Nqzn?$Vz$;!qT~OCt z6UVJ!DAJ`Ar^{NFOmYTtH%;h@n5w)sW34FHAkfczBW&@dBuRJtAz44;EnmwkAJ&Mb zT^_50{a+PkB7i3ckij@++oad_1$%3K!W5@PAc6{JUc@YiJ;$Y2uQye`jnvZMd-<*% zYWrlNM38I|*EEDlVj1pyjFwTc>5b>wFW8fshIy%FDdZWC?Vn&^8Nii(eR~M%edCBz zF2p|TRWIXCfHt(NvuRF?_)>jnPSYz%tXjGt5y$21;$50y}2J|3{RC0(Hl^ zJ}vd349U-;^nw2G47cg>x2ALUO?p!7>cGZnl{kXN8lR71=d&(Khzz_=yj#4!Ap;I# zE1)gW6zc~|s={YayP*wz7*Y_r%dj-B{^1)(qEJ-Zmc%>CA=j`l zQ$?DBw4&n8yoE|GCTU>0wwaKE#?}uX-u0P(TbA=2Y2ecg-}!as48H%sG( z`fy%GpX5bnj-2aDvF6AiL161l9h+6`&*-`As+UqVN>(s=!MA5ysk)~Yvz_$Ex!+bz zOw|2XDGCe8E&IB41K$g7+`5nZHRqo{tF5k(38CMcp zgYAASag7~q@-k$-f1rDNO@cEw^^o4wXjDAp`UORyjcjpyT3iuYSt{#GQOw~%%pqRC zd3J*F3D1)uD_to&aR!R^J_<(3MS^8$ezX*R^bRU=Qmf}(T+}vx%uQnZCcL; zSZK8+6C^sv-^>V-7el-E@BZGEs>+eYl$HOk?X>Yqfz)dbw-+Z(r2Cd#u%l@?=s1Cp5< z(W_VwcK+OgHU#V_iXGnga$Qmlz@hqp>eFyUTkPnL?(Xs$bSGWx_6|7ySw-4M-(O$5 z#m>wO)SeMNy|5V(DCsW7FFb98x7hf%sx$Mh)5CO;2Vu(RpVpvnl_4(Fnu|04;gp51 z-~_gUSLN$`5>_|MR@2}OQ)e$ql}mpLel)ad(qiIZ_v(sZAoy@%<{aUv{;aD7(LH)^ zOTRkTOzIeQj5**92m1$$kk>@H*RMIfr4aT*L`}TCT%JNd=-OR^CtORjxxCbPK*ZsS z^W1KkGTvRnN1N?;6k4^urgZeSAbSRE>&_7V|Ol63G#u{iXsl8gV z4%P`J^&Tj5e^MD_fYKF|YkX@27MIN6@2QT?9CIT6!4$Ta-r?6zQ2a`LSh+&6d|!Y2dL5lZnCeaO?w=7%#YO*QMYMXmJl$I z(ENYz*uX>fk)yv+%@qIKJ^#VUC9%ZB{BNP5F2sEr#o`82))SuKML92}%t`MMr10x> zeIAto<_~_Fw_iX0?%vDvNz3d}4d4<6gm}?mZ$l@-=$eLw>cQhuw|tewP~Ue_`eF&i z!;sxsV-K<@(S@B`BA>&_MyT(9@)VVZ_oMeZ^|1UgaQ0dLM-hwH zpj(a}e&kh|8I;3V-}@&1SV9G*$YA3oa~r>`Ds*o(VD!hbnVr-@5{jtiCD&+U-m`C7 zL`$9&G40B3&4t#kX6F4gK*jIr|JiEU5=?L{J<}E-`mDs4o}ML;@}@ z6jGk$tSspE<){oju+f89yGCJ)(JdjSLcoRw+UR(Xz+cL{mZ*yL0}{uLvECK7a(5>K zl-<{F!n7T03TlM8wTt_n;@{?cmwQ_vgUy7wmuAi`m~0b{UW{*Whi}CSP!;4MpA7_Eze2a}SloPa1pd=X~QyCmf6z zJ^}QCm)%HC94CU$qrxCwI%Y8a4$@MA(CU*aC_9Ko|8nB=YCgt@q&`t)Ldg7c8T;CN zG~vtts*VP7Vy9>bHva_;cvi8nllfVJY1oUD^L-ddg{V|QhUz&r@J0Mz&`yXT`L;Og z6GWv)jB>nm*5E6l`kv1Omx;vvtGZ4Q$bsSGm57u0K}gykt(pD$lWZ5n9tXerWsd-0$B`+tHSXu9>~FKF#Te(x*p zV~fF-Jgp5RDJrMSWSPLis3xWBJ~3l$GO zzk&B9{KIxgs%^#cJTmWw!09jO@G3Zt?H>mqtpaGUvwiR>RqJ06d><$BF9vu@(d{?w z0JZ3s(jgA;>|rPV#pu^tt+?fnJ4 zYWLl+-IimYmJuq2;J&$Hz{N_jsx=lH);!&0ch>J~6q;)sDI_;XS@fmvMyJ!78F=f=oRYgekbYlPFkP_aIpCot2)b*3I zoNaKb^3yTKv=*~1tZ)F|MAE(Li9Y`<`dQ1h3ark5%qnj3v-jak-0%Q>bn$l|xc<>* z9f}3N=b`w-8=O+*d5{%R1{#}=c^+%=l(THqQ2+jws1c|~d%$m5<$IRo%qJnk2BqPRSMtQs)W zaa20DJayuT^OCZ--!%!&BNJ0H8JYZ}>&UPWutngXxq;(;44_cbP_Dm%?G`Anzsx*J zI5Oy!qDUhAW>roPVdv~(yt9ZJ9K7?VIF;==IA=ywItQ%X0&hzhYi&s@$yCqxmS#@* z1Y*veQLp-NJ%9B_f}6%>POxRGMFRyC_23L5&^tRdeYq^K=7vyy(RT{T5AO8o^r@|9 zEKgGzA{)!xS8nKfGcmFH%Z5!yioLP0p^&18y9`}r?E4FIgDhUCrV9C(T%PKN`Un=) zm&OIXx4TVVO%=UcXHPA2?3nA5*y+`p#Ib{0WHH6=w~?*(Z$Gp}_;92%{H}4RcPMsG zR#}TZdg*6;b9MnezE;tKy#-uqIHGDF{kvcUklj=MZuxmjOZAd+eO1qdwY+ozX2jn?!JY0uxt`vd1R1Xan037GTS8q(H4}Z_6Bnv;)uzVsL z3>E7ubk>=?CR!W63k?eh^l5?gBa@l@!!tNs5=R-IdF)l=ozissP$*@gh$3^wwjAFs z#;~prHJEhE3Cskr`SOpYd18DY#rE>l+dWkI92Q|fz?z$;Fs==RRY`b~dQ+Ko3y(9E z3(#~s5jhDV8in*2j9oL{ZJcw_Ag&Xf>W}n`QR56gd))@dijTfDB4ZS-*GmR+g?l;8 zpS5yuZgHk$LRW4S&b$2NBOn58YL59_yTv2M=6NMdQP8Ayc81@pstz>x-uTQ0sYcjV zeIQ47Uwi3rxTC{J8)d;yaU>AX8T#~D$}cjnUOPKDwTx=fPGh4!qUOuKE~LKJxR>+S zlUx!X8Y|Wjow$hjFnFNQo??f9Z#_M^b0X{Fr>ExmJw(^62H!HXmFiq#w?wSB3h?@eh&TznM|hal%^Ga>p! zzrtR5sLCNPk<00M!o^H5te^Seku)^guQ9F4$3~@D-O}Rjp3s8o{oRC;h96lJzZ8UI zq@NsSua>h#2%B%`vdxI5&Q`XGS|X_CafBk zUbO#>zv^L|UaJ^H}LB3KSKVj@e>9 zf7sN{t>5;m;f~es>f!>iT8L=zH(dhsd`tHCP(zHGO-$ z-J(eYDXEt|k;{1(e?bNm2Ibq!7r{x$y(N*^04DVLPdD3S07}CY1CBdaWz2A?V^&fn z+F%%DIT?Sw!|wrk)ZgQWfpc``+pFf!Sqct4*Hb_q$cbzO!f?{_#-`If*l`%;_>sj;qVLC} zud_v6N^jouKNxVJN=c-jRfNVgu+gg?;lG+*dQu-_CU>wq`AeZZef)j`UkMTYxLo_* z_@NvZHsbO`y-B?0r^j5to{A%+Aez2t%=^xaLdwC5$_gN~(>SoNShjsUL!gi>{ak&c z?1Uq6qn{%-Y5LuzZo6K4Fg4_Yw$LV6qqFfZ=-F(5D63aVxz=%qoj<|0>w_cy~Ss>xfgA%AMe3_e@MWR`w}(-rTd-? z*M(hiHrq@fTj&AJt-dgld|eQTbta!Jp<#QUcFq~@)<{|W>3wWo-7_blgZXTm{4r(A zCoq4wMRP?^%n`NaOov4d@WojHo4h{=`vk_} z8pBd+p5F_ArJI5IL~Hx9eKVxo#9r(^6L{X{o+8gDuj<3lr$G^Mj2k$3kvLtDHPEY- z`^^)aZyLacw!kdjoP9CL0_uf-ykaDsmmd8&@a%UsZ-4@44vir;te0?DH3G%Lp^Bc_ zfHb$xZ>b(Xd)Bdp$9YPyMzfyzBkGLbMx&vowaJK|-#Xpa(lF_kNF~Dnl1Q6~g~&li zME^gy&oh?GX}GV*RghS<8xkP8Z8kTc^Kh>%B7*-s zpu~OVZNY|vDI>3?47$Ck7VH>{PZReT>wWJt^nAV`yECLj#2!qibGY8}w!#yz^0$Pi zb|`MthZ+_knZWpoE-#3VXxtFJEs&fJ2!Vk`(~OefL!YEsi!2uj_Hg#>(5K4w6%ZNd zr5!ft#n468=}qv+C6Ufdy*vfB6-Tur^IGTSC;mFDxh(NUyx|b#8bP|(*gkel-StvA zazBW3XNfLN^{H*fu^nPkMb5dpYNyca6pvPMtAjV95!-;uGIO$O0=;=l8l$SL z66le2G)sh(R{i#^`966X=!{RErF;#l2c8fwuExxncTZUA-w#@v=H-0zp=WjyF<&}& z9{+K+Ij}Lg_!sm87v!ZZy{17W9wVbyZa>mWyX)ogCUBtt4m|XeJjr&@y^+j_vNE5K zURs23Tg(@ef(6Q4pb*>9C%>YX;)nwK%SU>*FspLUJB!{q0Kj>3>jif!vbUta=H`^k z-vVsKFHxlaqZYbZYOp%%W+m9CVb03RJBpons+|`Jw^Fq=(g1Tls99{y1Mqip=kMTH zCiWdX1@W+AxEX8jdwT|$S~A}h5r=nC{j~+_-pfXeY%vYaUyvFx4go4V{&sdH>Vfz& zJaEfzB!8$934gi6oc&hYbk=y6?_!ZxJ+8xCkZFWm0AF0>7yM(8vL~KWV0mBb(X$@8 zhf`a%ZEdk83lhnzj{BCM7M`w)gj3UP<+_iHKu4K6V89%79`r@h_XA{d869-;%X!rX zyT3A8lTJyPxn?`|JW4nyn{B9V2)D!wWj5`U_H|J$t(CT6(j9ssp9Z#r)619@*TD_{}xSf z=Vkce=hI+vV}MXOub?)g_O-rU{*Cy33yy*3&uY4ofAbI?5K2JhQc(TTAEuBK4P4US zuXs&was}(Zy2eESNME3Ft@Ly`nw4|XW8Q=p{JY1iTpww~Z<%aMeMU7fWTY$`C(&Vc zHopZwo7Rp=o-jNezqgwbAPeLk#)op$B+Jv(KUJwIv!(9p`Eo30E@vA5Daq8Lw<2O@ zzl{sBz{8@ZJ=v4t{_yrm&Ib>Q=eUQUK@81^J+Ksc&ifAtLS?X3hjPnO7b>k=NP}P! zp-veJ+49_CsD=G(OJKtS&Oz+%1?_N+fu$3FY{)q0*8@oz}(UX!y(N z0D11;&<3^Pw03wLzKTq3fduTXS17TAch$H?lbYGvwI2BojS0FPXdu9Jn)UUC^V0z0 z*H+GB)I#)~TeEHc-5pZ10fJ!J;<%oVV_x@E!Jf`6J&OHGa}N`l7TkNe`V&O=AZpsv zkEYE{MwR9u0v|kdI%t1BCVW~L64%rx(JOWpY%F?_T)2EW3*0J27TO_!Tbp~=EJdm) zyWZ0ppG@R{nN;~e_3O_qPN0Bh(3OEkg-_VaKoipmPqzE*xYQ`w7OWQw-UPoFA&J$y zx09doTbWlj+bCrHa4a;ZsZG2;+PfA-UKrfimub$|I{ua5?BlY6B9hi7}ddKVAjmb~w-Y0-)R+4}RR&({jJ-Q&a8GcVD;((Z8VC8)D zYu?a9f*t7M%hLevDvJioWFh0Jm$COu%vhoW1{Okx2i7<#l*oA(O$KpKOb*xt+ede> z;_gdZGa?B@=C*#XSb13=6ZGdMbaJ4L9e9Fix5e(_8N2RHOHXIv8$dIv6vt8{RN8_ zd^?<&aDfNxHkRp~iepNXQj`#_3AsnunC{EK_O#-4b!Uf7HS6YvXm_Wc^{*q*uibZa zIgd&j#8OIkYM0v@Gvj`?v>4GC6{j*s@F^V*Or~YE;2JEFv|>y$WbPHv%nDA5rXLTD zmcS_TLmO8}SI&^cq7bVxQ=hCCS077J{uQzci|ozTc)x|D3kR4(Vy_ICO6)U?Wl?5E zBfs9Z5t{qRz90&fjk6s@RV=>V{b~ND!p>QE;6Vge99>dM!*hZw#LPQ)9+5Jg;zu*} zu2X3+-V<2h`EJ9`oYcy7vsaDdi2UC07(QY)aT4k{mpxpecB+le@<_0Qxpihii zlIzk&zPBZRYO@}F9)1dgAt>Uwrd}Vbv*hJY(FA^{9S4yGbex4ieXcZHrW*un7DK=y z$$V}XJY2^y_vnJe@%A$ZC$Du%w=ob$g3{Su*u}H15m3XvseZA>TJP_w+ za$(OU@V!Zi+5Lpluk5}#wp9&%HeEnEYH+2X=9#>sgm_-Qq8k6*-82CAaN5cErntq9 z5&O7_?|TL)l<4i#=R5JK=|ID_m9rxm9Y3|#3DcL*(xHLp1X~Q-QXW+n`z^vbCB=XC z(G^@k{J96z`d}yM(y^>%c#D2XY;($BJ|!Iib8qSBP-Tv8A)9uXs{(^|xJ~lgK z+&B_<527>Pnze7y-U7Sg8{L48vfkR?=?A$R*nh$<;4hZ8L=TW5x40gvjWV2I%prH{s2{ z0>nMb=8#osWv2H0Wb+)|&-3vKG#5%af%|d!5^TTTq@z_Mtm!4$8}kPuPaZ@ic=Ay! zcNJ70DHZ=v^*CDa&9ir$D%!3sip$FOsmc`=5Loy>K2iQb$<7mn;Wwy{R7hG?d%$I z+Wt6UFK`oqCFa7VxhEPCzTb2Owj^&?%ewG>tq@11jTK{p>s2=cb7?~5Q^`x4f3CPs zpKVqcj9Kw2Q+>&?-RE|n>7MeiQ_9)~lup;2e`@>DzrO77&rMpJL2q3H**@;_BL>Q* zTaof>z|;NSH=JdQ)Xop|CqS|J{y)tw`=8op|92Yy8(4v%x;J@p#3liD2$@%+7F2@a zGSaJ~jDhaDGeLa_XJ#tl(6W2A>6R9V@3KBbLwn2e)^K{;4hHmi-@L4WRz%;H0a|n; z?Xz|=`N+oFLyyalsD&R>exwL*bE1S@&YSNk~a(jDMFD<0+&N)3hN1RGU(ZGMxABgDdbAYj)j z^}tGGJ!ZCMzBF2riXy4TC>|TYO)*+ifX}XSCBQUaWo8N%NGskC<)VyO zWfg~ErO^jw7X46n=gMxe2&gSbed}Gyx}R?c%z8f8l@9W>NAQwpr5W~CHCjlTFQ*X0 zZHTl@cyYwy7kT7b7QxuMF4j9((p4yuPOlbC6nU-cx_U@AXJR|Cmrm+Qo~%KO`pjx9 zy5#bCCGp!Buk_Dgl7RbHYJ!~!jJxLdCa(n_6<6%~>9-d9*f0O_@{2|qw@*7HJ?T;W z9Ax6S*OVPgX7jelUOC4h)#O-P6-NgYfFo;ya!iuVodnd5HoUGiKHEYe*IcMW@}Ox} z25f%5#kB}JIBe_JwX`qF?7kklFPqP%0c;6x%0b+?Np(zGG;z8q&Hn{85cQA~t+Moo zUJI^{N3h~+)cd$A%{q%pFOoc|vdOboQSu>)+xWDXkS)D_qQA`FT;HmHaS~)&3E6PA z=*|ElS(JxZdC>87D}nD%bAr{ICOtXhC5>lyNFZ~s2!`I%s4M04hSO|90iy%)@o z^}_M~%Q`h)7P%FBT4T4DzCy`E_q2^71!A&!a;ZT?ug9=%NVd+rx%WX_;$Z>uYi!iu zCC)$q(60VY(9wY(^;xC&y;c3dXx`UTwsLsu6E$m`J@1iKrj|?elB#@%%yPyBD;3ZT z(!mLIl?FURkz2jJVogFBS~pEr$zYfFsrovZ_x1U{S`sqf@;7*9@ty7NLyOp_xFK&w zn{G3C{pb^o8K+`&tT?yE6i!vE$oc8k(5I)uj*?6+*;|?Ldm=0(&Yyrb@U+bgw1w7@ zcvyqFz-5#XS_+${rTm`TFevG+r*YGa}X|8{lkfdrkq4_R5{}H8(I|NseVa`$&yra{GL?|+_+M<_qMn%?*J#m z3d={zu^rjWp{iT2$f){D7VJSgM+1YdK7;{ZfAWX@)a`wSLWGeKg<15k<3JJcLA?R{l6NQ=3klE{Xg~p`Zr+g(45))(K{kt zwfG#w?jza|$atcBq}O)Rj))O#Q%TSCaM@3+t>-5upbz%0t`Qjhq_moly8Yc|I_MeN z;-^Mz9<_`W#K#}SmC)r(!M`2ft=2K=R24KWhR-$fp73E@p4ac=*C7*ldX)*tXT3{A zQ#kT~r&z0%aaw4+Nw)!G&IYE2{PV0!dQ%z$hhnPr7ra^}MCol# zsz*cKqJNMB*P&vU2^f2L!DfSX#?&NeVI`0JdzK#7qN~bK8uxuNG;+7PyeDcJ+hKQ8 z-I5r{K0VQWw_00?H*SA4eh)Wm&OaTXwbHK9oo;Lpa{3oU*gBZMjby&<=r}iK?M-1+ zY$qjTH876PEyu0+%4*<{g&*we*2{Gf#HXbn$sOc;{S7D+O8apvURz%o+sm<|tKbFL z;GekrXeOT|g*{|s|0mb0hrI>wDPjZIVa z6=n~)s^caY>FMmB5qfbA?7qPNMS`*|9%d1lKUEj(gttK!0k>lg^g^)dj4hUp?MyH( zQ$8{uQBO|6@2(ocZ+%3QO3AW+t;*O>pPj+eb9!l6lk23T(~A_2ULW_fryu4$ajSEsW%@{({U~E_Vf@1hRrHW+Q(g zBlkPkD#mGj*i0jp(PMy&aVNZeF+J~xk)e#2GuY);dt1^)q)<6124?qjkn_Z-L-?jb zpy4nA_Yh4Hvcg8}BiMDhH$Uo2o8%~tWHhukqPa$-Zl&Sd5#VKmR7F=kwEYfmz`^4H zH59OqL2ZFP$MOPjQS1&%{iW&z)T5n;UtA+gZ(3B{X?xyi4%w$GlPsaners2PsLJow zbE3Qn3w0j@3>8peFO$ny)rejuZPTc{W9~8K(eCBTou>I=pYS(jPom^{^aY}am2LW( zyUM~AIU0NUvBC=Q_}jRJb4Dvl@ccag{xJ}ER1f`!NatJs1KZ>l6v6!`e?f?6*S#K| zWB+J-%M88)6djEJsbHP|Xp#PZtkVCR{{A;O6)$x#asby_5EBjrL-_jt1r>5YGxv6u ze|u|W^$G`Ap(C;_GkWA6p!v^o(`+~gsal(ssi+>f5u$`$b3f&N%6utPxI))garh~i ziv370KFhI^vQER=)ym@_MnpK@0Pk0XPJFDCW&1g1`e-)csCxy`B_ExHwV&@^dNBKF zx_%zcvr)yB$)q1IaXn~Am>6>XhWMf;rPsFzUUMFEOD~L{6WC=tzkgA0_qwRvQ#G!h776whF4b*^GC)1{K;R)jl9L-!$6n9PW!& z1WoA6)3<5kNU`4vw$1N+awYgMa?o4h{S%hU;9{d8e#gk~g3ky3e8Wu@T(%k#bVBPhz|&+1V($_us@ zsJ(_t&j~L7nrQ-77grbJ&LDXucF@dS^zLLKa|kPbrR8IV@kNKX1F@I95EH$bGq04M zbE%F0qrESWhq~?lpHh}vlI**(H!%t!V{e17&>-+7m&x`Z9mN}nuUDr9+Ip=*a`xI}c z94vj?Ts}(5Qr6s4<)+k_E2`4B(uXH`*Dey?tPV9M`;_@RqpCmFuC6Rs2Q=WA7_18u z+|&Z%gU{Up`jcqZ`HFk~ew9hXBvpazu?LOEpA{}`JAZ?VZA>5(Yu}?<^0&+Qb4Sl$&?5!)sGW*1kq_D&n3oqU$hh#& z7DaH=I{aSEfH?DjNTHEqkzt`u&ub67OMYbk)JUf_%_N}M!oR8+>#pFoIMZI#^muw? zWaV?2=jjQ5h}P0oBeMG>sfol+9mn!G!<3Bo`WhRjUU7h)yGL?=HhlcpgQ;Z`bJ=Yn zI}z{pXq_IXc9Kz(x9Tn6yWTpfO+W|h3<@00-Cn5poF6VKuTyq$O!m^Rsy0#V*d;$) zdrQ@V!IxTJ5(*QbG@;pBV^rPu`c@h~JQ>5-%epU^L#)eYS9`T+Y~R%J@X1@zw;^`#*-TsCQ$ z3hATquhNSkT|k({XywpodI}BYh~oSNk2%@huwk8_vk+r%vzAz0X{G(fSv?kc{$zB+ znLU=J5|8dMJ10<$$;q$mrFO7x$!7AS_~IwA#^O_!Dy-f(NGB!ldA}id8R_J)Lm_vJiROAz&lD?x7_RNWP1S4n zl@*cfoR0)U@J8MiXc-=nxPTL;gUJh*sU9@N4@1^6gDzNct2o#2d@tM8xZ^wld1DPd zjd%JYWDe%FAYE*uXAyohB`ROz)R6)Ti$O0^&eztEyqasrm*q$_l#@s{d68}+to1N* z@I$=_gR9-J zmsn)-=`l8Mq(;$neVG_M2~C_k9IfT3VZ=pLQ`u!hvFhm-T^{hxw!2L{9UXOU?VwwS zn0{b(ntyFjtzX~{1g!u8*lzUlC41qCJ_cqB1jCP(R@2M?i<4uv**JXUAf(7wb8$p5 zReI^ky;953oS0Y5tih~J2{$`2d@}|b&0aWeZ94*+F4?RZd6XOW2Dk+b+n!PHA!Q%NYA`+7h9BtxFO^l*1nkz*7`b@{R_ zCW*_-X=Y7O?Ns5j$-w?3b(zX|ZHMj%GD4IZH@T_V4Cg{hEMVmgjb*P;uITcXHQy*( z*E!SC-tzG|i^qr(sMAh;d1ZKFIT=pn#WM^)ln0)ElDafN)6-S}0IiDrZ^HC4qYs4s z8HL}8`rjKB|8M9s|Bepyx3~E%!r&JrEPsK#%BEseB8 zfu&pYEqm_gEV}Q{KgAF5uSGTSfXDgQq`epUp>z2G2y{tjBt^s=;0+Rp`mLPRRepO zmGr>DCV~`<@=llSe$Dn~Z%yc|N&f*;Ko2gZt0y!LO)!a*6Bg21Qr%U0EeQw1tSue}9|`xN zWyP~HNrLvJ8|(2(Kj-k+BPmg}L%hiK^uvPlDtOb>3E9kQQQjq7rFeu2nhiNHq0x6! zOR@W8U(rO5u5IpU_8z^5>HI3pgOB>O<#6N{&xr;oslGqHD*S1*xG zapc)nYY17b`2*d;c}f_9nJ|AnHRp2ux+0&_jwEzqkf(_K&Kno6nH3Kp6_4*d)CT)9Cs1ap!dMIMjd(iBJ>xJ&-6`fhux+xy2>0b}59ml;2|snQM2#AZ}(CPA6Q)ozk-G+A5y|c|v=?VQ2qP6eE(iX^8qZqc|!T)*`(NNUz)kbc_!)7@7f#sE# zg-1qiUW>|3+S?qG1*&D*YpCdv9ERUm>|6(L>@6SN7*u#^Zk^jXU{*t|U3Kl9CG%h* zR9oU(hLq#IqoG1>xh^AT(p+aAy{H)VS$<4Fc&fb-;99wATddVS3Hg{sUTYA?q=wbW zPrFB^sYM|iZ51~!)ZaR~Bk65h3$uNYmByjA54%6|fKpm_*yMw2QC8yb`qzu!yBF7$-pLoPRD-j!6G zLmpWDTw3^KdSnq*Kf2PhG9s5*uKdeM@h?u*zYS6NFUUy#i%+D#^tAl##{1usEgcO4 z_aJ$4W@BVi>(>ZeEVt`qWgk4V5~k&cB^&Lv6K>OulF__m7P}!bDGtjFf;A)%D?{t- zB&ft`NJtI#1<{pnx=(Z5rrT8ML+a6J3BHwXzJ@kJt?8jGSDP$t|2ng2Qj}`GD_|^V zQ4_=?UF!hLNdkW}P;uJ9rUL884mCUSZt-B;nlTh~l9_GA7oqoT)Zy0AgGV2~GuIk; z?EyE~S!CFdE?M5|A`?)1vFg@AioD5tUQ3PPM2s2|JncV3M#p%gxBEsn!pV#r zk8I~7hy5z>_lnP-8qH;?lDMNY8LZQ$8XanWF0}!-E~vkpJpWSfSt=%>sRE_mz7h@V zrn*lO!m%uykAQmcR}jLK?ZnpP&WzDkE#ilM$2;cvXs+g{v)1~yqqi~MoqnVy@i-U< zUfbC?EM2*52(bm?a7d&Ex|6W&hu39B+gBLJZ;!h5uU(uKxn9>eZMJAY(Vd=+I2$sJ z<~0b+!Zb`9f&(-IPR-mA3BRKwkiaXZy?+=$#qCS=^j}I7#)UD8E7pBV_Y@Uqh7@bBF;6{2%K(=6s;}L>h-AWl{Nt-G6p{GQM@dz+Y51|q9#d!xQbml)acMHYo&B@}7uej%lNjp=? z9ktgeM?a0ZxvO(b+$5S>6P*vcJ_^|MZR)5w1$u|1kxstedB_wC3I z?OmT2B^xGG%c&{TC0tH5Rs*@lFVZL8bPc_kw3M??(Q%aevGRxAz3A2+gyuB*_7UxJ z-rQC{tUSA`;>tN!6S~rdUO!=Eyd(5f+2IVhg5dC)yhck8r#ba>v_ZMFVu5=#q*vR@ z|Aj$7&&>@jeBfug>s-c~d!zP9Cb%RVFSe%#rl3zwz1$Dg$(tC3!{=m{+Re(UALIx> zeB%>+!shJ`knXnEG#nH;i00l;eN5TkH&194N^MeiQF-eUUz_Jhc^j3zGtF2=>I9f? zR`XWexaX<*62Z(DajF6>U_1AEi{-_E{t>m#SyVG&WeG6$9j<@3_@Df3mjB;l@&6lU z`5)apd^gp9HLw4L()4E(tKYrz-BkZmrt2?&IsZ#c{lCRj$1*z5FI2?&@69$_L+~zi zN%E*+Re~iYvbqq${Ev{Mz23KSAN#Rg%|Q0(SciG#>`F8`*Md4cVO)k~B<&ENEjc;Tlr$3ZFS+%*3R6F{29tE(rd~!0iGy zwdA3Dc{y&yHVWnD`WGVa-y3O#21%~35w%-OIIVnlcTc%D6e*H)sNU}T#|W15I@%cT z(NX|3bLq$h>y^pd_g|A>mg`X7U;6fvr@=djy4VAn4zdHLzWD^E;H1sP;F~L@;_I;xU(#Z^ zFu3ZXd0SiNWksg4`;P@g!bJ}eBm($@NLe^)NN9HxdM8>Ye9iU zPC^7j4%tcIV(gmZODl<~Q`vBP;C-kvep$FSpbF7**w#K+pOwloW5ZVeNwrk%V<07* zP+v411?9e3b9xxif|Y1SxRHAV!4;#D2eUg{HHQ0Mwoi56F2@ZQOmfBpF=%dcNe=$V z@{$iRPaSS`6e+ZiT1C0##2%xzS5_!krH`)#yX5*bli&{S2Un?w zO=_?cEVI&X=+p5i@X#wqI;CWlHyGQyRW-J8HVrUUcYkocDen` zvR99J$F>Ho*%JLud?t=r=L}o=vQNEVaZTys&DIx?)-2Jrej!sk zsSQZlsxviU5-sddvzl8-%`~PO6%%{BRZEk0C5xus?-b^ym5=e*?qd5?VoQb|g~#BW z0VE}aO^@qk2WuGlX~wOC$`#Y8L#vA%9cM3YOXrrdl`0h|j-r*hy7EeGUbMiyIc->x zI7Xacuk}F5N)^7mU`&Ep_cFNXLezQy5-hNY)yzMxjDRC(`m0{S*N<^d@a|F5QkS1==09- zCh_tsTcA*gH5ng_6{VU@En;yj!>Wdh`{i@$sw&%LxDJ*bX>vil+8tPswTab!hok~I zoi@w~Tc9VeFF?W!ZW)pvq7)=obaB{BngK(pvfFI!ehunlr3cYC4A_RXSsL@4kcyO- ztNG4eu96w$mGL8XdUt_B2mA z^or$}T*uS5u5iU2P`{*8ITq!! z7=2Tl#GPV#wNZ*Q^*wVja*!V;PPHW`G;OSf<;Gp367xqE_OuF%k{wGMMOO9^gWcZW z&|gE|&0e>8S6+cuYj0nFjgxy>tjaTH7Kk*!x{b^U`(g8sAf$m1{s;f+8vc9ezTAH# zg#Ygd-T$}+VnI12aMAh6vFV~frS`Bo9h;im)$xbEF-Fe$2O)Jik(S3!L^FlywM@PR ze=ZToyq$(UKrt;LqPU!dR$t~BKU)wAZ3%eTes649V=1r}qz(cp?F3wX+rL;FvXujh zg;VJQir0g|VWTP@ZI`Zz#j==uE+$TiH$Q;!v=T2RoUt-w?1gho_0U6#+{qm_F&Ps0datCIGs zQP|hGP8w`whSZ|wI`_yUEjaqvAKf~*I@ElA2BfMDLJjQIq6%%&H55PE)%jX4sY)Ia z3_AGac5FP5d0ak(xIt})v>2fb(>R0(jWF@vn^a7ZxGpATCcbO<@bOfnRm>sjE;eFc z-TP>o=OkwI-@VF?zSzWRW~8 zuXUl@qvd<`-=B_ph-VSTTgG=w3;LmT+HJ$%<-n zY`zPgdp}gJzo>mD$9swKkYMLds54Dz0m()UurKQNmL^5YQ0(xb4;xo~!cWppFp=~n zY_1(7$ej!N^lp|n;qd8A6}q`0#hJvpKz3g?UV>UjzpWs<;r#NQ{JpUe`NnyU9_6V5i-#}K6UpQnhXMyt5F%#k zyJqWyv;+Vi>8W5{1j&UK(_$3{18%=!V)^%7pKJ#S*eid4mOq5MP zKyFR@-t1vs7QYCk?`6aK!4|?ipMRkE6+NC zU-U7!si`e^|LpXgfK3mz%evCh8+W`_??KnZleSX7;KL_(_q7TxTvqlqwy5mAJ~-1` z&WgG3#;8}IjR3-NN6k+`=1A0`t_H98fu&22KiZjC_%N6$(gR0TdVEnA(-a&hv<{#8 zm}7^%=34xG53cUO*q-Y8$pNeq)o;2aqLPp7ThMs4H9WWKJh{2>vY|s?-Ye-7(QHhT zxkYME-#yy=lNtEmwZ8v3S|5Ox_=50pd>S_bZk9aTD*BN6PfF(2_3FbT}^=X@7iHRc@=?NxC+QJEtT z-j0bpmk4>K{2?J0&iRq9JI%@ITSJ(3O9pB-rVICHkO@IhBgD0Pv?j4L+FBjSih}#C zx(bvmx4$ZxI6uKev6z+(K?)+kLs&syPE)wxJmWyx1g!<8$c6Fgf4wW*p~$5t==i}1 zk2?wXKTS>{yrx^56Sxo#lpI17!q7*y?k;OaWtfk}$T6HJ>xImdSwSq-8dAxv=Rx_d zDB`^M8h(A?BA8bqBv@mI>8Aq+F4>xVa@=fsc_{%4q=Z6Z#MzMiK=P#|9>NfD7L%d8 zPxi9&7H!&?3_0r@R&hJSYj2YU>k-k~NNK;xA@?x4vp11549AQxE9w-oc7h8@4Jf{2 za&cOQx;6RBNildSYLQU=0^iEZRfFZ7=U1)_x*d5?QqCTc?sp^OMQS3i4pUOkPLoxExO_HWY)Mk4&vjHOj~zd<5sV} z0@2=-F@fJwdmmUoi3`I*$b?qXNP_twR4spQL(?~)X-1X(p;K1)9X?@$ z$?MOk^Ww4RFEhH0$x*7S0QsU%O89e_V0q-xba;;QN+;{ccF`ZcnA7An*{9A7Mu|c|zCj!vxxprgOuK zZFbePJe=aN(|(~^m%Q>O=@j;gU4zmkNv0u8mXn*>h@$p7L~V-XT1-&I%yc|*#ieo9o6_#~;!y$1nv#USVrYZ3evB#_#F3f;A69lmPd|RyzV>q3ut4&?(hDd9Y@0lChTHntUXL#G?=>@ub zsqpu_k&S;Z|3h06Q)35HN3YxRDU)Gy%=71XTmQlJKg8j zl7RRTFT>=tL!lLBw9QfNWV6Z(nK>usy9#-Wmr_$-dasB72;g}og+B`FXD4apP{7gT>?qxy9ldOQ>fM{M zD)-dl-CpUceMWDd7MO0r-Sw|m47=LOwGTJTDO^gzj=-=rx%0HQ8)^*hMdNy0`SlRs z`fI1J&qB+Hexo?M(UVU5?5;#B@iA2H_-G}4Z7)m-cS!y=UUgO+6CVQ0plN+T%JOd9fUE(8r$0}Bx!i=7tr5N2S4ft_d zraFm4JKNWz7w9ZN1NV?(J43h6VqdV!eRQ|8T#EB z`j1g+-{Y45L(bX%US}xBn3m%$6Fs9h&)vi@ZlYd#JeCKA!z}t$Y9HHNku2A{9tUkX ze5y34nn}Zk#gvJX8Lh|%)aq;4myhznZ-JPeY=Ndf0N3`q=NXG73>F=r@tE9rj{4sIe>VSwgdpK1MT(DSj^yRAc8~rD zedn*`in43p0s#-QB7|`u`T)_S`SL;WVb3j4w*{Qe9=)D*P>;7EzOlQW~WvIJ1BfX}Jho$ifm zNcg#nN~(#TSZ}O$1#tg6Tgf;|n9^SzOr@`Gfm(&>a+wJZO+YX3pL)rnIkhtaP{bkz zkBL6!>d*a)xRd`01sEBibpO81*WP~9ChnKs{`ok+p?vM_kK2?0ASLnNeo@dL{aAos zz>obxLIG^>_{s+DpE>yxPHx*QxBo?I{t4-)RzFL{PtAT6wx61*6Q+Jg`oqC~H;=D9 z{*z`k>t6-;3pZI-2hm@}(1I@avrH3FVLy?6kx<6Si?8DTE9qM+KzM&{1+0YMwfaqm z|AO>uhrfrzHH{-*B7t@ zd|P_|d)Al4w>@hM^yT=LU7bm#ul;fmw?J0Mf8L7ZwJQ&P+0TF4Mm1T!y!!3T2J@TO zL@&=-^G#$Ndc@UbT*Py+x*E)yVNhkFcZ_*z;pEhU9?$Ojs`G9 { }, [messagesEndRef]); return ( -

+
{!(apiKey || serverSideApiKeyIsSet) ? (
- Welcome to Chatbot UI + LlamaGPT
-
{`Chatbot UI is an open source clone of OpenAI's ChatGPT UI.`}
-
- Important: Chatbot UI is 100% unaffiliated with OpenAI. -
+
LlamaGPT 100% unaffiliated with OpenAI.
- Chatbot UI allows you to plug in your API key to use this UI with - their API. -
-
- It is only used to communicate - with their API. -
-
- {t( - 'Please set your OpenAI API key in the bottom left of the sidebar.', - )} -
-
- {t("If you don't have an OpenAI API key, you can get one here: ")} - - openai.com - + LlamaGPT allows you to self-host your own LLM.
@@ -405,12 +381,12 @@ export const Chat = memo(({ stopConversationRef }: Props) => {
) : ( - 'Chatbot UI' + 'LlamaGPT' )}
{models.length > 0 && ( -
+
{ ) : ( <> -
+
{t('Model')}: {selectedConversation?.model.name} | {t('Temp')} : {selectedConversation?.temperature} |
{showSettings && (
-
+
@@ -482,7 +458,7 @@ export const Chat = memo(({ stopConversationRef }: Props) => { {loading && }
diff --git a/components/Chat/ChatInput.tsx b/ui/components/Chat/ChatInput.tsx similarity index 95% rename from components/Chat/ChatInput.tsx rename to ui/components/Chat/ChatInput.tsx index 64f8df6..30fa6c0 100644 --- a/components/Chat/ChatInput.tsx +++ b/ui/components/Chat/ChatInput.tsx @@ -257,11 +257,11 @@ export const ChatInput = ({ }, []); return ( -
+
{messageIsStreaming && ( )} -
+
{showPluginSelect && ( -
+
{ @@ -379,7 +379,7 @@ export const ChatInput = ({ )}
- ); }; diff --git a/components/Chat/ChatLoader.tsx b/ui/components/Chat/ChatLoader.tsx similarity index 89% rename from components/Chat/ChatLoader.tsx rename to ui/components/Chat/ChatLoader.tsx index e666d57..eb6c9dc 100644 --- a/components/Chat/ChatLoader.tsx +++ b/ui/components/Chat/ChatLoader.tsx @@ -6,7 +6,7 @@ interface Props { } export const ChatLoader: FC = () => { return (
diff --git a/components/Chat/ChatMessage.tsx b/ui/components/Chat/ChatMessage.tsx similarity index 98% rename from components/Chat/ChatMessage.tsx rename to ui/components/Chat/ChatMessage.tsx index 512551f..dd04a21 100644 --- a/components/Chat/ChatMessage.tsx +++ b/ui/components/Chat/ChatMessage.tsx @@ -128,8 +128,8 @@ export const ChatMessage: FC = memo(({ message, messageIndex, onEdit }) =
@@ -149,7 +149,7 @@ export const ChatMessage: FC = memo(({ message, messageIndex, onEdit }) =