From 479b6d7afb3d94b5c44caae9bdc0e9d85b0c09c5 Mon Sep 17 00:00:00 2001 From: John Yeo Date: Tue, 21 Jan 2025 11:18:42 +0000 Subject: [PATCH] first commit --- .gitignore | 59 + .npmrc | 3 + LICENSE.MD | 0 frontend/.eslintrc.json | 8 + frontend/README.md | 36 + frontend/commit.sh | 4 + frontend/components.json | 21 + frontend/next.config.ts | 8 + frontend/package.json | 69 + frontend/postcss.config.mjs | 8 + frontend/public/file.svg | 1 + frontend/public/globe.svg | 1 + frontend/public/logo.svg | 4 + frontend/public/next.svg | 1 + frontend/public/vercel.svg | 1 + frontend/public/window.svg | 1 + frontend/src/app/credits/page.tsx | 13 + .../[customer_id]/[product_id]/page.tsx | 27 + .../src/app/customers/[customer_id]/page.tsx | 16 + frontend/src/app/customers/page.tsx | 13 + frontend/src/app/demo/page.tsx | 5 + frontend/src/app/dev/page.tsx | 13 + frontend/src/app/favicon.ico | Bin 0 -> 177898 bytes frontend/src/app/features/page.tsx | 13 + frontend/src/app/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes frontend/src/app/fonts/GeistVF.woff | Bin 0 -> 66268 bytes frontend/src/app/globals.css | 32 + frontend/src/app/integrations/callback.ts | 0 frontend/src/app/integrations/stripe/page.tsx | 10 + frontend/src/app/layout.tsx | 119 + frontend/src/app/loading.tsx | 6 + frontend/src/app/onboarding/page.tsx | 8 + frontend/src/app/page.tsx | 22 + .../src/app/products/[product_id]/page.tsx | 21 + frontend/src/app/products/page.tsx | 14 + .../src/components/general/CopyButton.tsx | 41 + .../src/components/general/CustomToaster.tsx | 13 + .../src/components/general/SmallSpinner.tsx | 8 + .../general/modal-components/FieldLabel.tsx | 10 + frontend/src/components/ui/accordion.tsx | 57 + frontend/src/components/ui/alert.tsx | 59 + frontend/src/components/ui/badge.tsx | 38 + frontend/src/components/ui/button.tsx | 107 + frontend/src/components/ui/card.tsx | 76 + frontend/src/components/ui/checkbox.tsx | 30 + frontend/src/components/ui/command.tsx | 153 + frontend/src/components/ui/dialog.tsx | 123 + frontend/src/components/ui/drawer.tsx | 97 + frontend/src/components/ui/dropdown-menu.tsx | 207 + frontend/src/components/ui/input.tsx | 92 + frontend/src/components/ui/popover.tsx | 33 + frontend/src/components/ui/select.tsx | 171 + frontend/src/components/ui/separator.tsx | 31 + frontend/src/components/ui/sheet.tsx | 144 + frontend/src/components/ui/sidebar.tsx | 764 + frontend/src/components/ui/skeleton.tsx | 15 + frontend/src/components/ui/switch.tsx | 29 + frontend/src/components/ui/table.tsx | 120 + frontend/src/components/ui/tabs.tsx | 55 + frontend/src/components/ui/toast.tsx | 129 + frontend/src/components/ui/toaster.tsx | 35 + frontend/src/components/ui/tooltip.tsx | 32 + frontend/src/data/stripeCurrencyCodes.ts | 138 + frontend/src/hooks/use-mobile.tsx | 19 + frontend/src/hooks/use-toast.ts | 194 + frontend/src/lib/utils.ts | 6 + frontend/src/middleware.ts | 56 + frontend/src/services/CreditService.tsx | 7 + frontend/src/services/DevService.tsx | 13 + frontend/src/services/FeatureService.tsx | 19 + frontend/src/services/OrgService.tsx | 15 + .../services/customers/CheckoutService.tsx | 8 + .../src/services/customers/CusService.tsx | 20 + .../src/services/products/PriceService.tsx | 11 + .../src/services/products/ProductService.tsx | 32 + frontend/src/services/useAxiosInstance.tsx | 40 + frontend/src/services/useAxiosSwr.tsx | 70 + frontend/src/utils/constants.ts | 6 + .../src/utils/formatUtils/formatDateUtils.ts | 19 + .../src/utils/formatUtils/formatTextUtils.ts | 21 + frontend/src/utils/genUtils.ts | 61 + frontend/src/utils/product/priceUtils.ts | 27 + frontend/src/utils/serverUtils.ts | 33 + frontend/src/utils/supabase/client.ts | 8 + frontend/src/utils/supabase/server.ts | 29 + frontend/src/views/HomeContext.tsx | 13 + frontend/src/views/HomeView.tsx | 52 + .../src/views/credits/CreateCreditSystem.tsx | 249 + .../views/credits/CreditSystemRowToolbar.tsx | 78 + .../src/views/credits/CreditSystemsTable.tsx | 64 + .../src/views/credits/CreditSystemsView.tsx | 47 + frontend/src/views/credits/CreditsContext.tsx | 15 + .../src/views/customers/CreateCustomer.tsx | 94 + .../src/views/customers/CustomersContext.tsx | 15 + .../src/views/customers/CustomersTable.tsx | 65 + .../src/views/customers/CustomersView.tsx | 42 + .../customers/customer/CustomerContext.tsx | 15 + .../customer/CustomerProductList.tsx | 53 + .../customers/customer/CustomerToolbar.tsx | 81 + .../views/customers/customer/CustomerView.tsx | 200 + .../customer/add-product/AddProduct copy.tsx | 141 + .../customer/add-product/AddProductButton.tsx | 49 + .../add-product/ConfigureAddProduct.tsx | 24 + .../add-product/ConfigurePriceOptions.tsx | 114 + .../add-product/CreateCheckoutContext.tsx | 15 + .../add-product/NewProductDropdown.tsx | 130 + .../CustomerEntitlementToolbar.tsx | 75 + .../entitlements/CustomerEntitlementsList.tsx | 44 + .../entitlements/ManageEntitlements.tsx | 120 + .../customer/product/CustomerProductView.tsx | 270 + frontend/src/views/demo/DemoView.tsx | 167 + frontend/src/views/developer/APIKeyTable.tsx | 38 + .../src/views/developer/APIKeyToolbar.tsx | 75 + frontend/src/views/developer/CreateAPIKey.tsx | 114 + frontend/src/views/developer/DevContext.tsx | 13 + frontend/src/views/developer/DevView.tsx | 57 + .../views/features/CreateBooleanFeature.tsx | 101 + frontend/src/views/features/CreateFeature.tsx | 83 + .../src/views/features/FeatureRowToolbar.tsx | 78 + .../src/views/features/FeatureTypeBadge.tsx | 16 + .../src/views/features/FeaturesContext.tsx | 15 + frontend/src/views/features/FeaturesView.tsx | 132 + frontend/src/views/features/UpdateFeature.tsx | 76 + .../metered-features/CreateDBConnection.tsx | 98 + .../metered-features/FeatureConfig.tsx | 243 + .../features/metered-features/MeteredView.tsx | 33 + .../src/views/general/CreateOrgClientView.tsx | 7 + frontend/src/views/general/ErrorScreen.tsx | 11 + frontend/src/views/general/LoadingScreen.tsx | 12 + .../src/views/onboarding/ConnectStripe.tsx | 231 + .../src/views/onboarding/CreateOrgView.tsx | 17 + .../src/views/onboarding/OnboardingView.tsx | 35 + frontend/src/views/products/CreateProduct.tsx | 102 + .../src/views/products/ProductRowToolbar.tsx | 78 + .../src/views/products/ProductsContext.tsx | 15 + frontend/src/views/products/ProductsTable.tsx | 60 + frontend/src/views/products/ProductsView.tsx | 61 + .../products/product/EditProductToolbar.tsx | 85 + .../views/products/product/ManageProduct.tsx | 67 + .../views/products/product/ProductContext.tsx | 15 + .../views/products/product/ProductView.tsx | 145 + .../entitlements/CreateEntitlement.tsx | 67 + .../entitlements/EntitlementConfig.tsx | 167 + .../entitlements/ProductEntitlementTable.tsx | 98 + .../entitlements/UpdateEntitlement.tsx | 68 + .../product/prices/CreateFixedPrice.tsx | 74 + .../products/product/prices/CreatePrice.tsx | 105 + .../product/prices/CreateUsagePrice.tsx | 251 + .../products/product/prices/PriceToolbar.tsx | 81 + .../products/product/prices/PricingConfig.tsx | 159 + .../product/prices/PricingTypeBadge.tsx | 12 + .../product/prices/ProductPricingTable.tsx | 130 + .../products/product/prices/UpdatePricing.tsx | 90 + frontend/src/views/sidebar/EnvDropdown.tsx | 86 + frontend/src/views/sidebar/Sidebar.tsx | 93 + frontend/src/views/sidebar/SidebarBottom.tsx | 75 + frontend/src/views/sidebar/SidebarHeader.tsx | 45 + frontend/src/views/sidebar/SidebarTop.tsx | 43 + frontend/src/views/sidebar/TabButton.tsx | 42 + frontend/tailwind.config.ts | 111 + frontend/tsconfig.json | 28 + notes.txt | 3 + package-lock.json | 17324 ++++++++++++++++ package.json | 16 + server/commit.sh | 3 + server/package-lock.json | 5928 ++++++ server/package.json | 58 + server/src/clean.ts | 37 + server/src/cron.ts | 78 + server/src/errors/errCodes.ts | 60 + server/src/errors/errMessages.ts | 3 + server/src/external/awsSecrets.ts | 50 + server/src/external/clerkUtils.ts | 63 + .../external/clickhouse/clickhouseUtils.ts | 17 + server/src/external/stripe/stripeCusUtils.ts | 81 + .../external/stripe/stripeOnboardingUtils.ts | 30 + .../src/external/stripe/stripePriceUtils.ts | 88 + .../src/external/stripe/stripeProductUtils.ts | 48 + server/src/external/stripe/stripeWebhooks.ts | 144 + server/src/external/stripe/utils.ts | 47 + .../handleCheckoutCompleted.ts | 76 + .../webhookHandlers/handleInvoicePaid.ts | 45 + .../webhookHandlers/handleSubCreated.ts | 35 + .../webhookHandlers/handleSubDeleted.ts | 55 + .../webhookHandlers/handleSubUpdated.ts | 132 + server/src/external/supabaseUtils.ts | 34 + server/src/external/unkeyUtils.ts | 53 + server/src/external/webhooks/clerkWebhooks.ts | 94 + server/src/external/webhooks/webhookUtils.ts | 51 + .../src/external/webhooks/webhooksRouter.ts | 15 + server/src/index.ts | 60 + server/src/internal/api/apiRouter.ts | 27 + .../src/internal/api/customers/cusRouter.ts | 195 + .../customers/entitlements/cusEntitlements.ts | 22 + .../customers/products/cusProductRouter.ts | 333 + .../api/customers/products/cusProductUtils.ts | 390 + .../internal/api/entitled/entitledRouter.ts | 260 + .../api/entitlements/entitlementsRouter.ts | 63 + .../src/internal/api/events/EventService.ts | 31 + server/src/internal/api/events/eventRouter.ts | 206 + .../internal/api/features/featureApiRouter.ts | 101 + server/src/internal/api/prices/priceRouter.ts | 108 + .../internal/api/products/productRouter.ts | 452 + server/src/internal/credits/CreditService.ts | 23 + server/src/internal/credits/creditsRouter.ts | 42 + server/src/internal/customers/CusService.ts | 173 + .../add-product/createFullCusProduct.ts | 281 + .../add-product/createStripeCheckout.ts | 87 + .../add-product/handleAddFreeProduct.ts | 53 + .../customers/add-product/handleAddProduct.ts | 179 + .../add-product/handleCreateCheckout.ts | 75 + .../change-product/handleChangeProduct.ts | 359 + .../entitlements/CusEntitlementService.ts | 73 + .../customers/entitlements/cusEntUtils.ts | 33 + .../internal/customers/internalCusRouter.ts | 48 + .../customers/invoices/InvoiceService.ts | 96 + .../customers/products/CusProductService.ts | 268 + server/src/internal/dev/ApiKeyService.ts | 35 + server/src/internal/dev/devRouter.ts | 73 + server/src/internal/features/DBConnService.ts | 42 + .../src/internal/features/FeatureService.ts | 168 + server/src/internal/features/featureCrud.ts | 28 + server/src/internal/features/featureRouter.ts | 49 + server/src/internal/mainRouter.ts | 28 + .../src/internal/metadata/MetadataService.ts | 48 + server/src/internal/metadata/metadataUtils.ts | 75 + server/src/internal/orgs/OrgService.ts | 32 + server/src/internal/orgs/orgRouter.ts | 290 + server/src/internal/orgs/orgUtils.ts | 20 + server/src/internal/prices/PriceService.ts | 194 + server/src/internal/prices/priceUtils.ts | 192 + .../internal/products/EntitlementService.ts | 125 + .../src/internal/products/ProductService.ts | 272 + .../internal/products/entitlementRouter.ts | 37 + .../products/internalProductRouter.ts | 86 + server/src/internal/products/productUtils.ts | 78 + server/src/internal/users/userRouter.ts | 23 + server/src/invoiceCron.ts | 282 + server/src/middleware/apiMiddleware.ts | 34 + server/src/middleware/authMiddleware.ts | 69 + server/src/middleware/envMiddleware.ts | 20 + server/src/queue/queue.ts | 87 + server/src/queue/runWorkflow.ts | 77 + server/src/queue/worker.js | 58 + server/src/test/AutumnCli.ts | 64 + server/src/test/gateMiddleware.ts | 71 + server/src/utils/constants.ts | 1 + server/src/utils/encryptUtils.ts | 42 + server/src/utils/errorUtils.ts | 49 + server/src/utils/genUtils.ts | 19 + server/src/utils/timeUtils.ts | 31 + server/test.ts | 23 + server/tsconfig.json | 31 + shared/errors/errCode.ts | 61 + shared/index.ts | 39 + shared/internal/run/runModels.ts | 29 + shared/internal/workflow/workflowModels.ts | 22 + shared/internal/workflow/workflowUtils.ts | 0 .../cusEntModels/cusEntitlementModels.ts | 48 + .../cusModels/cusEntModels/customEntModels.ts | 18 + shared/models/cusModels/cusModels.ts | 23 + .../cusPriceModels/cusPriceModels.ts | 28 + .../cusPriceModels/pricesInputModel.ts | 19 + shared/models/cusModels/cusProductModels.ts | 51 + .../cusModels/invoiceModels/invoiceModels.ts | 16 + shared/models/devModels/apiKeyModels.ts | 11 + shared/models/eventModels/eventModels.ts | 25 + shared/models/featureModels/creditModels.ts | 22 + shared/models/featureModels/dbConnModels.ts | 12 + shared/models/featureModels/featureModels.ts | 29 + shared/models/featureModels/meteredModels.ts | 15 + shared/models/genModels.ts | 28 + shared/models/metadataModels.ts | 10 + shared/models/orgModels.ts | 19 + .../models/productModels/entitlementModels.ts | 53 + .../models/productModels/fixedPriceModels.ts | 15 + shared/models/productModels/priceModels.ts | 43 + shared/models/productModels/productModels.ts | 62 + .../models/productModels/usagePriceModels.ts | 28 + shared/models/userModels.ts | 4 + shared/package-lock.json | 25 + shared/package.json | 22 + shared/tsconfig.json | 17 + 283 files changed, 42601 insertions(+) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 LICENSE.MD create mode 100644 frontend/.eslintrc.json create mode 100644 frontend/README.md create mode 100755 frontend/commit.sh create mode 100644 frontend/components.json create mode 100644 frontend/next.config.ts create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.mjs create mode 100644 frontend/public/file.svg create mode 100644 frontend/public/globe.svg create mode 100644 frontend/public/logo.svg create mode 100644 frontend/public/next.svg create mode 100644 frontend/public/vercel.svg create mode 100644 frontend/public/window.svg create mode 100644 frontend/src/app/credits/page.tsx create mode 100644 frontend/src/app/customers/[customer_id]/[product_id]/page.tsx create mode 100644 frontend/src/app/customers/[customer_id]/page.tsx create mode 100644 frontend/src/app/customers/page.tsx create mode 100644 frontend/src/app/demo/page.tsx create mode 100644 frontend/src/app/dev/page.tsx create mode 100644 frontend/src/app/favicon.ico create mode 100644 frontend/src/app/features/page.tsx create mode 100644 frontend/src/app/fonts/GeistMonoVF.woff create mode 100644 frontend/src/app/fonts/GeistVF.woff create mode 100644 frontend/src/app/globals.css create mode 100644 frontend/src/app/integrations/callback.ts create mode 100644 frontend/src/app/integrations/stripe/page.tsx create mode 100644 frontend/src/app/layout.tsx create mode 100644 frontend/src/app/loading.tsx create mode 100644 frontend/src/app/onboarding/page.tsx create mode 100644 frontend/src/app/page.tsx create mode 100644 frontend/src/app/products/[product_id]/page.tsx create mode 100644 frontend/src/app/products/page.tsx create mode 100644 frontend/src/components/general/CopyButton.tsx create mode 100644 frontend/src/components/general/CustomToaster.tsx create mode 100644 frontend/src/components/general/SmallSpinner.tsx create mode 100644 frontend/src/components/general/modal-components/FieldLabel.tsx create mode 100644 frontend/src/components/ui/accordion.tsx create mode 100644 frontend/src/components/ui/alert.tsx create mode 100644 frontend/src/components/ui/badge.tsx create mode 100644 frontend/src/components/ui/button.tsx create mode 100644 frontend/src/components/ui/card.tsx create mode 100644 frontend/src/components/ui/checkbox.tsx create mode 100644 frontend/src/components/ui/command.tsx create mode 100644 frontend/src/components/ui/dialog.tsx create mode 100644 frontend/src/components/ui/drawer.tsx create mode 100644 frontend/src/components/ui/dropdown-menu.tsx create mode 100644 frontend/src/components/ui/input.tsx create mode 100644 frontend/src/components/ui/popover.tsx create mode 100644 frontend/src/components/ui/select.tsx create mode 100644 frontend/src/components/ui/separator.tsx create mode 100644 frontend/src/components/ui/sheet.tsx create mode 100644 frontend/src/components/ui/sidebar.tsx create mode 100644 frontend/src/components/ui/skeleton.tsx create mode 100644 frontend/src/components/ui/switch.tsx create mode 100644 frontend/src/components/ui/table.tsx create mode 100644 frontend/src/components/ui/tabs.tsx create mode 100644 frontend/src/components/ui/toast.tsx create mode 100644 frontend/src/components/ui/toaster.tsx create mode 100644 frontend/src/components/ui/tooltip.tsx create mode 100644 frontend/src/data/stripeCurrencyCodes.ts create mode 100644 frontend/src/hooks/use-mobile.tsx create mode 100644 frontend/src/hooks/use-toast.ts create mode 100644 frontend/src/lib/utils.ts create mode 100644 frontend/src/middleware.ts create mode 100644 frontend/src/services/CreditService.tsx create mode 100644 frontend/src/services/DevService.tsx create mode 100644 frontend/src/services/FeatureService.tsx create mode 100644 frontend/src/services/OrgService.tsx create mode 100644 frontend/src/services/customers/CheckoutService.tsx create mode 100644 frontend/src/services/customers/CusService.tsx create mode 100644 frontend/src/services/products/PriceService.tsx create mode 100644 frontend/src/services/products/ProductService.tsx create mode 100644 frontend/src/services/useAxiosInstance.tsx create mode 100644 frontend/src/services/useAxiosSwr.tsx create mode 100644 frontend/src/utils/constants.ts create mode 100644 frontend/src/utils/formatUtils/formatDateUtils.ts create mode 100644 frontend/src/utils/formatUtils/formatTextUtils.ts create mode 100644 frontend/src/utils/genUtils.ts create mode 100644 frontend/src/utils/product/priceUtils.ts create mode 100644 frontend/src/utils/serverUtils.ts create mode 100644 frontend/src/utils/supabase/client.ts create mode 100644 frontend/src/utils/supabase/server.ts create mode 100644 frontend/src/views/HomeContext.tsx create mode 100644 frontend/src/views/HomeView.tsx create mode 100644 frontend/src/views/credits/CreateCreditSystem.tsx create mode 100644 frontend/src/views/credits/CreditSystemRowToolbar.tsx create mode 100644 frontend/src/views/credits/CreditSystemsTable.tsx create mode 100644 frontend/src/views/credits/CreditSystemsView.tsx create mode 100644 frontend/src/views/credits/CreditsContext.tsx create mode 100644 frontend/src/views/customers/CreateCustomer.tsx create mode 100644 frontend/src/views/customers/CustomersContext.tsx create mode 100644 frontend/src/views/customers/CustomersTable.tsx create mode 100644 frontend/src/views/customers/CustomersView.tsx create mode 100644 frontend/src/views/customers/customer/CustomerContext.tsx create mode 100644 frontend/src/views/customers/customer/CustomerProductList.tsx create mode 100644 frontend/src/views/customers/customer/CustomerToolbar.tsx create mode 100644 frontend/src/views/customers/customer/CustomerView.tsx create mode 100644 frontend/src/views/customers/customer/add-product/AddProduct copy.tsx create mode 100644 frontend/src/views/customers/customer/add-product/AddProductButton.tsx create mode 100644 frontend/src/views/customers/customer/add-product/ConfigureAddProduct.tsx create mode 100644 frontend/src/views/customers/customer/add-product/ConfigurePriceOptions.tsx create mode 100644 frontend/src/views/customers/customer/add-product/CreateCheckoutContext.tsx create mode 100644 frontend/src/views/customers/customer/add-product/NewProductDropdown.tsx create mode 100644 frontend/src/views/customers/customer/entitlements/CustomerEntitlementToolbar.tsx create mode 100644 frontend/src/views/customers/customer/entitlements/CustomerEntitlementsList.tsx create mode 100644 frontend/src/views/customers/customer/entitlements/ManageEntitlements.tsx create mode 100644 frontend/src/views/customers/customer/product/CustomerProductView.tsx create mode 100644 frontend/src/views/demo/DemoView.tsx create mode 100644 frontend/src/views/developer/APIKeyTable.tsx create mode 100644 frontend/src/views/developer/APIKeyToolbar.tsx create mode 100644 frontend/src/views/developer/CreateAPIKey.tsx create mode 100644 frontend/src/views/developer/DevContext.tsx create mode 100644 frontend/src/views/developer/DevView.tsx create mode 100644 frontend/src/views/features/CreateBooleanFeature.tsx create mode 100644 frontend/src/views/features/CreateFeature.tsx create mode 100644 frontend/src/views/features/FeatureRowToolbar.tsx create mode 100644 frontend/src/views/features/FeatureTypeBadge.tsx create mode 100644 frontend/src/views/features/FeaturesContext.tsx create mode 100644 frontend/src/views/features/FeaturesView.tsx create mode 100644 frontend/src/views/features/UpdateFeature.tsx create mode 100644 frontend/src/views/features/metered-features/CreateDBConnection.tsx create mode 100644 frontend/src/views/features/metered-features/FeatureConfig.tsx create mode 100644 frontend/src/views/features/metered-features/MeteredView.tsx create mode 100644 frontend/src/views/general/CreateOrgClientView.tsx create mode 100644 frontend/src/views/general/ErrorScreen.tsx create mode 100644 frontend/src/views/general/LoadingScreen.tsx create mode 100644 frontend/src/views/onboarding/ConnectStripe.tsx create mode 100644 frontend/src/views/onboarding/CreateOrgView.tsx create mode 100644 frontend/src/views/onboarding/OnboardingView.tsx create mode 100644 frontend/src/views/products/CreateProduct.tsx create mode 100644 frontend/src/views/products/ProductRowToolbar.tsx create mode 100644 frontend/src/views/products/ProductsContext.tsx create mode 100644 frontend/src/views/products/ProductsTable.tsx create mode 100644 frontend/src/views/products/ProductsView.tsx create mode 100644 frontend/src/views/products/product/EditProductToolbar.tsx create mode 100644 frontend/src/views/products/product/ManageProduct.tsx create mode 100644 frontend/src/views/products/product/ProductContext.tsx create mode 100644 frontend/src/views/products/product/ProductView.tsx create mode 100644 frontend/src/views/products/product/entitlements/CreateEntitlement.tsx create mode 100644 frontend/src/views/products/product/entitlements/EntitlementConfig.tsx create mode 100644 frontend/src/views/products/product/entitlements/ProductEntitlementTable.tsx create mode 100644 frontend/src/views/products/product/entitlements/UpdateEntitlement.tsx create mode 100644 frontend/src/views/products/product/prices/CreateFixedPrice.tsx create mode 100644 frontend/src/views/products/product/prices/CreatePrice.tsx create mode 100644 frontend/src/views/products/product/prices/CreateUsagePrice.tsx create mode 100644 frontend/src/views/products/product/prices/PriceToolbar.tsx create mode 100644 frontend/src/views/products/product/prices/PricingConfig.tsx create mode 100644 frontend/src/views/products/product/prices/PricingTypeBadge.tsx create mode 100644 frontend/src/views/products/product/prices/ProductPricingTable.tsx create mode 100644 frontend/src/views/products/product/prices/UpdatePricing.tsx create mode 100644 frontend/src/views/sidebar/EnvDropdown.tsx create mode 100644 frontend/src/views/sidebar/Sidebar.tsx create mode 100644 frontend/src/views/sidebar/SidebarBottom.tsx create mode 100644 frontend/src/views/sidebar/SidebarHeader.tsx create mode 100644 frontend/src/views/sidebar/SidebarTop.tsx create mode 100644 frontend/src/views/sidebar/TabButton.tsx create mode 100644 frontend/tailwind.config.ts create mode 100644 frontend/tsconfig.json create mode 100644 notes.txt create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 server/commit.sh create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/src/clean.ts create mode 100644 server/src/cron.ts create mode 100644 server/src/errors/errCodes.ts create mode 100644 server/src/errors/errMessages.ts create mode 100644 server/src/external/awsSecrets.ts create mode 100644 server/src/external/clerkUtils.ts create mode 100644 server/src/external/clickhouse/clickhouseUtils.ts create mode 100644 server/src/external/stripe/stripeCusUtils.ts create mode 100644 server/src/external/stripe/stripeOnboardingUtils.ts create mode 100644 server/src/external/stripe/stripePriceUtils.ts create mode 100644 server/src/external/stripe/stripeProductUtils.ts create mode 100644 server/src/external/stripe/stripeWebhooks.ts create mode 100644 server/src/external/stripe/utils.ts create mode 100644 server/src/external/stripe/webhookHandlers/handleCheckoutCompleted.ts create mode 100644 server/src/external/stripe/webhookHandlers/handleInvoicePaid.ts create mode 100644 server/src/external/stripe/webhookHandlers/handleSubCreated.ts create mode 100644 server/src/external/stripe/webhookHandlers/handleSubDeleted.ts create mode 100644 server/src/external/stripe/webhookHandlers/handleSubUpdated.ts create mode 100644 server/src/external/supabaseUtils.ts create mode 100644 server/src/external/unkeyUtils.ts create mode 100644 server/src/external/webhooks/clerkWebhooks.ts create mode 100644 server/src/external/webhooks/webhookUtils.ts create mode 100644 server/src/external/webhooks/webhooksRouter.ts create mode 100644 server/src/index.ts create mode 100644 server/src/internal/api/apiRouter.ts create mode 100644 server/src/internal/api/customers/cusRouter.ts create mode 100644 server/src/internal/api/customers/entitlements/cusEntitlements.ts create mode 100644 server/src/internal/api/customers/products/cusProductRouter.ts create mode 100644 server/src/internal/api/customers/products/cusProductUtils.ts create mode 100644 server/src/internal/api/entitled/entitledRouter.ts create mode 100644 server/src/internal/api/entitlements/entitlementsRouter.ts create mode 100644 server/src/internal/api/events/EventService.ts create mode 100644 server/src/internal/api/events/eventRouter.ts create mode 100644 server/src/internal/api/features/featureApiRouter.ts create mode 100644 server/src/internal/api/prices/priceRouter.ts create mode 100644 server/src/internal/api/products/productRouter.ts create mode 100644 server/src/internal/credits/CreditService.ts create mode 100644 server/src/internal/credits/creditsRouter.ts create mode 100644 server/src/internal/customers/CusService.ts create mode 100644 server/src/internal/customers/add-product/createFullCusProduct.ts create mode 100644 server/src/internal/customers/add-product/createStripeCheckout.ts create mode 100644 server/src/internal/customers/add-product/handleAddFreeProduct.ts create mode 100644 server/src/internal/customers/add-product/handleAddProduct.ts create mode 100644 server/src/internal/customers/add-product/handleCreateCheckout.ts create mode 100644 server/src/internal/customers/change-product/handleChangeProduct.ts create mode 100644 server/src/internal/customers/entitlements/CusEntitlementService.ts create mode 100644 server/src/internal/customers/entitlements/cusEntUtils.ts create mode 100644 server/src/internal/customers/internalCusRouter.ts create mode 100644 server/src/internal/customers/invoices/InvoiceService.ts create mode 100644 server/src/internal/customers/products/CusProductService.ts create mode 100644 server/src/internal/dev/ApiKeyService.ts create mode 100644 server/src/internal/dev/devRouter.ts create mode 100644 server/src/internal/features/DBConnService.ts create mode 100644 server/src/internal/features/FeatureService.ts create mode 100644 server/src/internal/features/featureCrud.ts create mode 100644 server/src/internal/features/featureRouter.ts create mode 100644 server/src/internal/mainRouter.ts create mode 100644 server/src/internal/metadata/MetadataService.ts create mode 100644 server/src/internal/metadata/metadataUtils.ts create mode 100644 server/src/internal/orgs/OrgService.ts create mode 100644 server/src/internal/orgs/orgRouter.ts create mode 100644 server/src/internal/orgs/orgUtils.ts create mode 100644 server/src/internal/prices/PriceService.ts create mode 100644 server/src/internal/prices/priceUtils.ts create mode 100644 server/src/internal/products/EntitlementService.ts create mode 100644 server/src/internal/products/ProductService.ts create mode 100644 server/src/internal/products/entitlementRouter.ts create mode 100644 server/src/internal/products/internalProductRouter.ts create mode 100644 server/src/internal/products/productUtils.ts create mode 100644 server/src/internal/users/userRouter.ts create mode 100644 server/src/invoiceCron.ts create mode 100644 server/src/middleware/apiMiddleware.ts create mode 100644 server/src/middleware/authMiddleware.ts create mode 100644 server/src/middleware/envMiddleware.ts create mode 100644 server/src/queue/queue.ts create mode 100644 server/src/queue/runWorkflow.ts create mode 100644 server/src/queue/worker.js create mode 100644 server/src/test/AutumnCli.ts create mode 100644 server/src/test/gateMiddleware.ts create mode 100644 server/src/utils/constants.ts create mode 100644 server/src/utils/encryptUtils.ts create mode 100644 server/src/utils/errorUtils.ts create mode 100644 server/src/utils/genUtils.ts create mode 100644 server/src/utils/timeUtils.ts create mode 100644 server/test.ts create mode 100644 server/tsconfig.json create mode 100644 shared/errors/errCode.ts create mode 100644 shared/index.ts create mode 100644 shared/internal/run/runModels.ts create mode 100644 shared/internal/workflow/workflowModels.ts create mode 100644 shared/internal/workflow/workflowUtils.ts create mode 100644 shared/models/cusModels/cusEntModels/cusEntitlementModels.ts create mode 100644 shared/models/cusModels/cusEntModels/customEntModels.ts create mode 100644 shared/models/cusModels/cusModels.ts create mode 100644 shared/models/cusModels/cusPriceModels/cusPriceModels.ts create mode 100644 shared/models/cusModels/cusPriceModels/pricesInputModel.ts create mode 100644 shared/models/cusModels/cusProductModels.ts create mode 100644 shared/models/cusModels/invoiceModels/invoiceModels.ts create mode 100644 shared/models/devModels/apiKeyModels.ts create mode 100644 shared/models/eventModels/eventModels.ts create mode 100644 shared/models/featureModels/creditModels.ts create mode 100644 shared/models/featureModels/dbConnModels.ts create mode 100644 shared/models/featureModels/featureModels.ts create mode 100644 shared/models/featureModels/meteredModels.ts create mode 100644 shared/models/genModels.ts create mode 100644 shared/models/metadataModels.ts create mode 100644 shared/models/orgModels.ts create mode 100644 shared/models/productModels/entitlementModels.ts create mode 100644 shared/models/productModels/fixedPriceModels.ts create mode 100644 shared/models/productModels/priceModels.ts create mode 100644 shared/models/productModels/productModels.ts create mode 100644 shared/models/productModels/usagePriceModels.ts create mode 100644 shared/models/userModels.ts create mode 100644 shared/package-lock.json create mode 100644 shared/package.json create mode 100644 shared/tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e2e7e91e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +db/ +start.sh +supabase.sh + +**/certificates/ +**/node_modules/ +**/dist/ +**/.next/ +**/.vercel/ +**/.DS_Store +**/.env* +# **/.npmrc + +**/test.nnb +server/test.nnb +server/src/test.nnb + + +pull.sh +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..c758aa2c0 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +@fortawesome:registry=https://npm.fontawesome.com/ +@awesome.me:registry=https://npm.fontawesome.com/ +//npm.fontawesome.com/:_authToken=${FONTAWESOME_PACKAGE_TOKEN} diff --git a/LICENSE.MD b/LICENSE.MD new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json new file mode 100644 index 000000000..1ee705cf1 --- /dev/null +++ b/frontend/.eslintrc.json @@ -0,0 +1,8 @@ +{ + "extends": ["next/core-web-vitals", "next/typescript"], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": "off", + "@react-hooks/rules-of-hooks": "off" + } +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 000000000..e215bc4cc --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/frontend/commit.sh b/frontend/commit.sh new file mode 100755 index 000000000..86d8b0e9d --- /dev/null +++ b/frontend/commit.sh @@ -0,0 +1,4 @@ +git add . +git commit -m "$1" +git push + diff --git a/frontend/components.json b/frontend/components.json new file mode 100644 index 000000000..0f5c76a66 --- /dev/null +++ b/frontend/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "zinc", + "cssVariables": false, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/frontend/next.config.ts b/frontend/next.config.ts new file mode 100644 index 000000000..6e79088f4 --- /dev/null +++ b/frontend/next.config.ts @@ -0,0 +1,8 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + reactStrictMode: false, + /* config options here */ +}; + +export default nextConfig; diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 000000000..0fee817b9 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,69 @@ +{ + "name": "@autumn/frontend", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@autumn/shared": "*", + "@clerk/nextjs": "^6.9.14", + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/pro-duotone-svg-icons": "^6.7.2", + "@fortawesome/pro-regular-svg-icons": "^6.7.2", + "@fortawesome/pro-solid-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", + "@nextui-org/react": "^2.6.3", + "@nextui-org/spinner": "^2.0.34", + "@nextui-org/system": "^2.2.6", + "@nextui-org/theme": "^2.2.11", + "@radix-ui/react-accordion": "^1.2.1", + "@radix-ui/react-checkbox": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-popover": "^1.1.4", + "@radix-ui/react-select": "^2.1.4", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.2", + "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-tooltip": "^1.1.4", + "@supabase/ssr": "^0.5.2", + "@supabase/supabase-js": "^2.47.2", + "@wooorm/starry-night": "^3.5.0", + "axios": "^1.7.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.0.0", + "date-fns": "^4.1.0", + "framer-motion": "^11.13.1", + "hast-util-to-html": "^8.0.0", + "lucide-react": "^0.468.0", + "next": "15.0.3", + "ora": "^8.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hot-toast": "^2.4.1", + "react-hotkeys-hook": "^4.6.1", + "swr": "^2.2.5", + "tailwind-merge": "^2.5.5", + "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.1", + "zod": "^3.24.1" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "15.0.3", + "postcss": "^8", + "tailwindcss": "^3.4.16", + "typescript": "^5" + } +} diff --git a/frontend/postcss.config.mjs b/frontend/postcss.config.mjs new file mode 100644 index 000000000..1a69fd2a4 --- /dev/null +++ b/frontend/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/frontend/public/file.svg b/frontend/public/file.svg new file mode 100644 index 000000000..004145cdd --- /dev/null +++ b/frontend/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/globe.svg b/frontend/public/globe.svg new file mode 100644 index 000000000..567f17b0d --- /dev/null +++ b/frontend/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/logo.svg b/frontend/public/logo.svg new file mode 100644 index 000000000..02172f557 --- /dev/null +++ b/frontend/public/logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/public/next.svg b/frontend/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/frontend/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/vercel.svg b/frontend/public/vercel.svg new file mode 100644 index 000000000..770539603 --- /dev/null +++ b/frontend/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/window.svg b/frontend/public/window.svg new file mode 100644 index 000000000..b2b2a44f6 --- /dev/null +++ b/frontend/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/app/credits/page.tsx b/frontend/src/app/credits/page.tsx new file mode 100644 index 000000000..5bd37edb2 --- /dev/null +++ b/frontend/src/app/credits/page.tsx @@ -0,0 +1,13 @@ +import CreditSystemsView from "@/views/credits/CreditSystemsView"; +import { AppEnv } from "@autumn/shared"; +import { headers } from "next/headers"; +import React from "react"; + +async function CreditPage() { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + + return ; +} + +export default CreditPage; diff --git a/frontend/src/app/customers/[customer_id]/[product_id]/page.tsx b/frontend/src/app/customers/[customer_id]/[product_id]/page.tsx new file mode 100644 index 000000000..fe2560fa1 --- /dev/null +++ b/frontend/src/app/customers/[customer_id]/[product_id]/page.tsx @@ -0,0 +1,27 @@ +import CustomerProductView from "@/views/customers/customer/product/CustomerProductView"; +import { AppEnv } from "@autumn/shared"; +import { headers } from "next/headers"; +import React from "react"; +import { getOrgFromSession } from "@/utils/serverUtils"; + +async function CustomerProductPage({ + params, +}: { + params: Promise<{ product_id: string; customer_id: string }>; +}) { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + const org = await getOrgFromSession(); + const { product_id, customer_id } = await params; + + return ( + + ); +} + +export default CustomerProductPage; diff --git a/frontend/src/app/customers/[customer_id]/page.tsx b/frontend/src/app/customers/[customer_id]/page.tsx new file mode 100644 index 000000000..5b9e4437f --- /dev/null +++ b/frontend/src/app/customers/[customer_id]/page.tsx @@ -0,0 +1,16 @@ +import CustomerView from "@/views/customers/customer/CustomerView"; +import { headers } from "next/headers"; + +import { AppEnv } from "@autumn/shared"; + +export default async function CustomerPage({ + params, +}: { + params: Promise<{ customer_id: string }>; +}) { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + const { customer_id } = await params; + + return ; +} diff --git a/frontend/src/app/customers/page.tsx b/frontend/src/app/customers/page.tsx new file mode 100644 index 000000000..1d4c74d4b --- /dev/null +++ b/frontend/src/app/customers/page.tsx @@ -0,0 +1,13 @@ +import { AppEnv } from "@autumn/shared"; +import { headers } from "next/headers"; +import React from "react"; + +import CustomersView from "@/views/customers/CustomersView"; + +async function CustomersPage() { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + return ; +} + +export default CustomersPage; diff --git a/frontend/src/app/demo/page.tsx b/frontend/src/app/demo/page.tsx new file mode 100644 index 000000000..790e397d5 --- /dev/null +++ b/frontend/src/app/demo/page.tsx @@ -0,0 +1,5 @@ +import DemoView from "@/views/demo/DemoView"; + +export default function DemoPage() { + return ; +} diff --git a/frontend/src/app/dev/page.tsx b/frontend/src/app/dev/page.tsx new file mode 100644 index 000000000..d50db214c --- /dev/null +++ b/frontend/src/app/dev/page.tsx @@ -0,0 +1,13 @@ +import { AppEnv } from "@autumn/shared"; +import { headers } from "next/headers"; +import React from "react"; +import DevView from "@/views/developer/DevView"; + +async function DevPage() { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + + return ; +} + +export default DevPage; diff --git a/frontend/src/app/favicon.ico b/frontend/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a69856ec2e7d84aa5f7df61e3fb1e032b1f711a6 GIT binary patch literal 177898 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 BGo}Cl literal 0 HcmV?d00001 diff --git a/frontend/src/app/features/page.tsx b/frontend/src/app/features/page.tsx new file mode 100644 index 000000000..159e6bf66 --- /dev/null +++ b/frontend/src/app/features/page.tsx @@ -0,0 +1,13 @@ +import FeaturesView from "@/views/features/FeaturesView"; +import { AppEnv } from "@autumn/shared"; +import { headers } from "next/headers"; +import React from "react"; + +async function FeaturesPage() { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + + return ; +} + +export default FeaturesPage; diff --git a/frontend/src/app/fonts/GeistMonoVF.woff b/frontend/src/app/fonts/GeistMonoVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..f2ae185cbfd16946a534d819e9eb03924abbcc49 GIT binary patch literal 67864 zcmZsCV{|6X^LDby#!fc2?QCp28{4*X$D569+qP}vj&0lKKhN*HAKy9W>N!=Xdb(?> zQB^(TCNCxi0tx~G0t$@@g8bk8lJvX$|6bxEqGBK*H_sp-KYBnwz$0Q}BT2;-%I=)X2ub{=04r2*}TK5D+LXt~5{t z)Bof^+#0@Rw7=mKi|m$bX6?Bh~_rVfN!~Z5D+lYZ~eMdYd=)1 z?To(VG`{%|MBi{mhZ2~!F#vq`Pec9x)g^>91o^TxurUDvvGDqSS9st3-kw(m@3Xga z`qtIzyIr_nARq+I@sH7;0MG(2NPTSa#jh!1f4cEF5Xll)bpZ(>cyI|Q1wleT1wA5Y zq9^hv^x;~(?2G$>(CTL2)#Ou-rP=XDW$spn8<%0TH%F=^X^(F62Vd@bY`Wi$j$33w zf!U^8o_B|x>{pW$eFZG}b7#|uFueKt$`e9j!wHNBGQX67&nfgl(Ae`3qE-E+yBSfA zEnJSA6p%}|+P9ZIYR{w}nfaKIlV@b3YYzcH!?WNXRvg|J( z((lq^WAE%Q7;oE?zDk~Nvg1Dr_0)KH8m&HF%^&8bI!=#YAGqIx$Yf2lH9S*;=c=b6 zUHi?R*$?Q;>HU4-#?hGJ&dj2jq>d3;_NN_TeipMG!(E+ou)RL-kMQv(W$b9+k# z*%bh8;4)9Je-Giu+XwdbyoaSGei^KG*(1D)5+h{Kfg<`v)nU>dj}RiD_+VvZgb7>9 z-Qb^cdc0k1VSIW!onbm2*_uY*_+r1qe${8^DzXxMnX@F#u>I3_n0j_0ih#p?wd+gPI5niQVbIIsk zkxy%JZZqLeb?p_DXdh1*9Z(O`Nm%TZ(zL`RA!dd+$VNO>qwecEt;dy5w%UK1@1exK zD~__{?4}pb@sGL5CjI=xAR7Jym_*l%fS~I(m>6873y~E7k;IfdA_0)|1$o9?h92Js zt4eu6$WMaSodkz#g|LB%Iw?^B?6x^A=arKjpBhhH6ZCbk2{;io5x)B3eh9R{KEOQX z9|&Q1T3-YGeF+9$doOBzU`TntM~LF~ON3aEZ|p9Y7+wF9qBi`6(hl}&)@-uZ`4zJl z>R`Cps(&x90dBZ~SLeCp?oa*PgM%P!bZaG*OS96bkBT*gF)q0a zxEd&4ZXnQHBuCrYm@m@ffPQTObP*2j+P z_?=gLxmGc32nceW5l5oy=+SB$=N%F^{g}lKR9(TljKIPHw)zVyZ?3ODUL^k;0CuW% z!;ErXcl6|m8OB+{5iYNEq}!Y@o<%r_^{5a($V)INcxkIcMA}Gd8LUShZK5U!u)=PR z6ZALS*{0F1Oxl?y$xE;JA+eyc6mW}LqFTZ3ZvVl#h*UFfj`$%JE0l8D!JRBYUlH!L zJ!uZs@&)nqNg9x8t`fZ?k4Ihgdv(Ogzr)|%{JQ|-g@#=7rCIq(Oo={zr!i7F_F!6; zqpKdMO={?6)e1SETQW+U?L?WPzQx9x#RrVu%xa5u$bDgLQrF-K4Iwd}9a=yS3(f1J z=&B1p=UwPU_#kfxrJ(YnDYZkc%{pp&sn{<~MdR_9^8y%u``RUJaJtY*yi=~R9ryu@ z9kzsKGwMLhZ1egl=e5m~k^Ft9pSfxI5B!$g1WaeqpO`4?C-3aj(gSm%1+@BdqpyAV z@X|;G-&|(jA;zG>T=$%}2gC%)gu@pTPQ)SpSw*2DuSrX((%PM=kQ&E@b=Ygy)l&#k zn6Q419734+(;{THjU2Uy9No0H4_jV1#6O)c>u@tbG6oWD;-8yHLnM^;;b@dWvle!?{40o`dO)$$EZ zM^@JN7b3@-+?UUO*P#gtLsy$!7gZcziDwAj59PsCAJm>m6r+l^X1z|%wu-jJhnQ&_ znPJwq9_*qBLoo*W`sPdYk10kPgf$aH@4qU~%&pFl2rZ0AHR*E-AvBR{F9QCehDa@z z95xXU{QZg|=zb2Pq36>@3je4inO+>S(`ht?)Z#zrHM(i>qE+>iU#!8v4QnWDruR08 zihT~ec3TRJh#llhgk(NqF04=VE8}61FWwvTi_}KWRnkIGbxQ)CAyBfBoVsTvRsR!v zeeHuptQ&5sDmg3vV_f9UtqYjdrR(_D^waATK``ZJjfZD5Kduvl1+l2-u6Qf=6Ombx z7Sq ztJ92oU^LD6n$?=8G?#FGx#fF$d!2WBTf$UGVa}#`S@X&5dFIq%K!1Ikjs!+ybc~8&;<*f2$gyb>j{=&y@=kHsC%Xl#WTojY!)xQxm z+xUe-8Of9gTp&DDOh{Yy9#6leUk5m&-h{G7M@bsLtAJZq1|X(5;ulY z-D2nY-`lAFFZza${swOYsV>&wyw;MiiXw9Ze4so}{Flt`IeJQ5b1l1!d)yG4v?WEO zO3yg9oy--%g}hya8*T);IAWhS&T>>KL9Je(WS#9P#!$_f6!1`7cfKj*+i>@*tP8Mjj|un5Z`YGD>MiCU!adPX zx#5sU8_)@)5fHgRLdp7k;l9Mr_8H3SOvpCBbBRGBQ`Wih*Xpj<)C6}E4SH?GeM1wt)HAM~N<~ejyt^Wpq0tmp z6X&e+wbKjOt@{1ng^s>(semrGFCQLXu|@O1tvtmYwuZ`$BSe{a-011Sk2a~(>MVE0 zpIQ7LpuG+o?lOHuw%e_kJ6yAoXCpu*QQeY%8SNh6?$89*3`>%=;EOJb+gtz&Kp|yv zfPV+nw`uTKbxE3vpT)v3C@L}V3(f*@_3N$Flc(8e<6F?hmPF|Dt%$W})5dMX(nql2 zOMy&yEWPokJ^l?odvVv&l(un4B`x0UHu6T8LraPoL*NltIUElZ5m!YVjcyZe{0Gtx zK{scl85IYuMO$EBG$tHHu0zc0wi&8rW3`d{VJC$oYNJ?m2MBStoGQ!4xQLHS_tBeI z4=tL^Lv>Bj^g79fzfCc?aTHu%Uvn6&+a@&*N~Rba)gbaLl?WBo%1^Pjx=t&|S^9nh zu(^m2A5XEp+ZN2L2#w^7IpLW%BW#F@6{50p0liwKYe!&NWu2F@oIV-5r<}*;+3|bP ze>zfTOAXqW760vNex|NG!Xz~@Wcd5UhOk&n5clNgylEGuS)lF7K$c{a+Hl#rx-2Ic zD(HhN(=Sa(v|zonLt6q9;>ZBVh6n__yB8Pn7WCY*KX8V+u(@n9e zOTe7&?}Fvh8wHRCgku@eEVodSv4NBH%wJEO4wEp#-}%%$wR$2D5JR|@$vRkRb7}iIhxv; zshP$6ckt<2KCd5K9#gwy%I*Ey>Fe20M_29Y=)g1AcBH#@^pXEtP30j`IbaZgR2{t^ z`r?E$A9Zdf@wct0$aRwJ=i9-^yxU77e+%zOG9j-MXBP)nekEiIFHfS>Ba|3w;D?|dL35fhFX>Fi zQcepJaiZvXu&=IsDUMoZIo?5N1`h|7?WDfbJmXcY~w_lg&|t|BlK!`YFCDcu*n(Sa{%c z4$vg-+drB`)#x8&q6x0pG5p+BKvfIu#O32<*&LF;z8q?zL`41|Yicx^Yq4jz6>WcO z4=~f8fF;F-A=fL28*f$mLyZ)0X>6z$biG4VuDpiV4z zY~_evrt9XZfAzEyT`LtOtA^qKGM{Tq8NMHGIOL>T;4vaiE@lH-C<@aOeh_^m?<&&h zdXSPA^^n-i>Uj{Z%Lb+6v5B_zD^V_GWE1OBNlHndI9YW5kD^Kk@cZ&Ia z6oRdBan^1xma-m6+`d|wRJR`V~A;L2zw&Yu_yoTtgzTrhi-xxFYK659imn;^%TR%3!4mYTU`we=`K-=!r$)M^U|fng0gd4 zY&D|@id)hQ6lZ6$q#}%snpqqb>@aUApp7;*W>0UoVkg(l}MYC6COXI29 zGc~J-gZ4vC{yy!bjlkXM?rF2de*R#dL=(PI9-L-quUxck&u`DmTQjI#p*2mPjNqc? z$X9XK{UtI;@pJUK?cwIxV;%;lTG0!%y5 zJpWhb11vK@d2I=!;)F5vM`ML)^6b)LCj<7zlFm7!F$_T_`hyDZ>MEBe@A%a+9RG#y z_*KevIxJ(rEBNzd_KBWC<+$;IWH5}W4eTN}TM#4*`n;PelIth54aC}8|KHL1Kd9hY zdg6C1@KJ_+m6OHmY-}EB_QYaDnd8)^Y#fTGC1QB3E&Rq&s{PIUL5DzjJG<4E+;x=! zz3?hDSALlK#YF2II?cmMlq^D)riLWp(`LjFJNTY&BkIxb04C*yZ)Vjb*8{OJ&U(p# z3cxi}BFmgL+V%Ew9*g|D_V>-jj>E&_kXF}@LX&k)UuVIb+!>`~SGXZrZd9yBFoeR5 zNrxA*){}5*BIRJ3GSAb5CW!RX5}9`W*v3|J4v;znteT1Jn6BmRxF0|>v+o2A%ix3E z_}aH+5hk}2B`>5kW}hg%W`rkIVN-e8*j3!A(mQ&IFKdo(2cn%(!rGGG-la2y4dz)d z;cU;$Z5l<(tUS+pPC9~e+Sl_5OnGT=${=;{P%TayUQ^o1bm#Qel@0Ea2wDFsgpR8p z%{42-o*aWIGVFESm@;QGB)am8yb0`j>EazkuEVoKMd!r}nWzO!rg#7+BuCQ?4|TZ^ z`|;e56wJl>(SLl!DEUo1dvlUaqZZ{;%CQg!oaJ?FFxAmVK6uv$_;SHB!^)t!xv-f_$Bs$C)MjJg|HA#qe9b`BSwl8 z2McXH6Uvn|ClJyKV8|OT-V{LIG1v~h>gQprzhfK(DrmFQ4M!VgO!ZS8o6D1p%RSmV z+Xf5C09vC7w0t%eXb8L=U(~wlP)tZ3TaN#j4{NWJFL7# zMeiEPfaIS?IHAdP9aH+sm5udxfk^i!o76N(KewVyMk&0@OpX6rwAKG}3?0IvE?(cPM;r3Az!_xLiYFY&)}Sl<19#fU0x zj-uZ}`Ey9BnVxqbj#D{R24|$jM(dNl2KH#FvbDSz*@x<{sy48Gz=(yRiYW`ofYMu+ zzdPsn^PhpxWX2v}!sahrD*o$$3k;XDHq|HQU^rDKHq%xw$IafF=^BmtY8T@#Z%YDW zAdx@ahu2vaLq%D&-me?D(}&)mEb|5m{{oc6#p!vRnXxnizHWv)adXiBb>q0*jdBJ~Zv<2B}4vZ{P z>E)ayXwPyT&!MqX{ao=#mpGCX5|61&)PEQKmppcZigqM*Xe+;DOlb?AQ8hZ8S0~w3)(nNAK)Iuc7rg zfIT}yB^fVpt`B3Pkl;fBY6u~2&%W5O{d;oadPW=tcE^D^C>VI_JPYukh@TfhQoWZeCJ5B$7I19W@q_TM0($TkNK3wl)QIl3|@|1RCuW$X^KSG)YgdJf$ zD&q2EfNK5$`W1XPc!pW_jn16RK(}y~T4kUY!;u`93tAJiu%lz7ol{&ur{Q zrA4yCFcU|gV0|>p_`D&ByZc`)DL+`Qqx8bmSv%J+qdQd*Y<;Klb{>?OW@XKPzqewj ztIkvI-K;Hlf@9cCVRdISFG4&ME?xbBnin*J=9sxZ+*CAN{PGnwwyeqzbU^u}JEz&U zujyQvjy%LMauULwp0$59k|Lxd4Icntq<^uQ3!iJ0*EJT#GqBhF5^zk{hkBT< zKNwtg4Y`s4lJ-1VzUy%1!)~>kypou8iu}HY$;B}2qhX>w`(0ya>5ndBmNHvwz@<@d z)_T3Arr!pCuZ?)(&jZ=LnXHsU&B)ifpJd12LpQF3x4*zCIMUlbov*YMkDIX`ZQ}#B zDEm7;2>6H|!x9eQMZTTQ#83yK07tV{aiGreb{XKo=?{!()DRH+$I-(B{q;fyyO2n) z-rGbBGoMjZLapRim!$3W&f}tbELYcO^N@9^$@oA{Fw|v>Jo^sP%|m`>OsVrmyd1`r z*_-ScUuU|lzR~%OHT$uyWNQuw)pj`yF@eLl^+;zNjqf~|6huSAAIGYnALff2fZP5> zz7ARH{>mIa^RkT@w4ZV!CXF(cDn9w9CcPN-d;=6xcKKM>?vd2tUshA!XM9hA9JplyPAlKHA3W}2f4;=EdS9$VRk zJd#7BDuS+qpm{NTo#0B*Oj{$Z2l2)5j>joob07T0UCp(y#jl_ioRJq7;CrcFZ;7+D ziT+n)gme?&`MZ8Q3URYd1 zUXO6*c;TeIhsi*l(c2?lau-s#yIh8Vm$bBPLkB24pwd6-v8=f_57U7s_X=;?ZMPX$=V+KD?D%h69Plxj z6s25MR;B`_3y$P%?|Wl%v9)a+)Xt1ovYG0-8ZEx;{wk%oGLr8D(F1mGIiIYKO7qIT zkyAXybQE{@&#($=@kZpE5&n7R;k?&LuC|WbUG$$?mLATHDk-iOwVbXY!1z4~OSn zL9Iql5xuH}kpF|{#T-2i$=3HA7g2YTKZSXE!U$;^53~)*>eS`jehs0aZ z?~}w>o$4HP*axMt=ZuDj#B+$8z;s<~`^+`;?9euOJhNPximpeOXZLVk`?)op?#1LI zsEJ(3NA-`GoL{a>z!{Z>a*D$!ZnSUCRhF+h1{YrQx-{HFin8WzZefO{l z8cNaM;e7wxPv4B1qdM6*FoUE$-f@ij7)Qn+%qi1X#m$C)|q*>heV z_F1E1;>jFo_X_SxU4z7K=dzD=a^~oL!C9SEV-!KD$#mnz60qM-#pJFWBjB{A91?@LxNGc9%0{4?@cU#Y7z;WB&(t+Ux8ij z{ywC~@RW4y=k@~>Rr8pTmb$u=7qLo2Vpes~6>g_ENtTY7^pVeIg!wVc`DUmbY|`3M z-R+tCPAunS>R|zng`6f_20?)pLm}bSq%ja@pW1*wXr=T!IW0oYP6_8+GG^?eKvEc| z0FC0qr5|LsL5JWpacSeAuHLx1qO#F6G*`!D4x6a;L#0WM=HD&Vnsp=Ye)1&&^=NgK z$R=p#49`^kf{*a{V%70)-|osKU4qK8u*Ee`n^}AVgiVqOGq`)`$~)h-UbZ_TpWn5) z4AU%KuIEO^Hr5rLcT?KcOFj<^6-E5p*F`RXe_*jNQ-<*{pcs{>ypy$kvv5&h_=hdL<+0wfo7i8Zr zN2QPM2zwaYFfOrCFU7(G*GymiiuOMUH#o1w-P5{_<`RmBx9=5gvCW1?z*U9M+@ATPF1Psy-Tq}n0&H9|(XuzmZW30{I#a|z_}fb*J@}$Os9qoBgJ+y# zL#8>}`N|}X{(N$J8f*=>O{m7)%z$pbzMS2$yb0xce}L`230Nn-UPkBNZy?Asat0>M==4pw7^P*~|GtzfgB9oEz zSk=B0wEed=|Ip)4I}(ZDBYlprm6N!l&1a{)JCR@4>nZ9els~Gu+`<5ezJ3A;{B3`Ck6-7#p ziFkA{?4$2BcHuw~sGfB+sGG>sgP(eW)M^H@39}u3uf^6HSPdw&q^1jxpusc>E1p9-Su?Z)!3+F+@GwHP~|a`e`o(nklU0c z$M)W3BB{3Wn$(JgntlTNAP(iL>=b;wqp`!xMfLpa7@%+oG3L2vFv0Yd{WYP^a(Nq8 z;2jw%*$3xNJbL7%aTo}j30ZXHpm9k0sVi_dl8xNyUxDA006-~CjL%1|Og^BvD;u`5 z8eUsPX>1Jry+fY`?0PYEo<6g2_UycjSnM=1^3)pT)`AiKgWBpcxjSg3%AirFd5eP* zjvhK=PEj=}3VEoUv38N5?p1FxcdB>$Mz7(sJzqFUM>lEr#N`oGvZQdU_A z`K|dEXc~4j2p{1d#j?jW&BI$yC00u2CH5F#XOFeDJdb_wrIAZDw(D<$uoFNSLNQjK zmiC)`+pCCs75<1NJK7S?oxlh4Tt%Ivo^LVH@gw3D4)|DOKg<>hv+aNnO=o?qd) zBGw!;7ZuIzay6nnEQm`!NKyMPw{nUUXT~md>GPvp*Ji(};@O*%38?IVxSFTwda8h& z9P2K-lj+LZ<%5qMIw`qxMMTPc z%1Ih+=0rkm9R@ptoN^AtL$sNVqokbv6{Nq1?bg%!*-vI88&j7m`-g2-c|Su|XmJBx z42Uub_~d!tp@Fbl(y`29x`NFGQrL6X@8ZCx;)-D4k4cR9IoeQM*@nMU9Mcy3(NVPh zf_5O8k#(#Tw=kX}S;sXT-GpXIvnQowOrmasb{$NgKNzM^`;cBQ=W!Z=VMcOmH1-K5 z^bm4kEA0rOiCv@0Apn-2k&-3;*9MhJ?#( z5?H^2k%5!&3qybCk7+d3658c9fRy__w>T(QRzEr z6APC_Hl-})SqZ!%4*dsbIVE1#BJPv13iV6|Xed34s`O*jDYmyxsWFar_w}g$gsP-F@R z<>#H5`3B+f=oWr9JZTL7Z{APZfW5v-+aMO7e%ivNM-W#S?|Fvcyr?2@iI$Su+QJ(8 zq)JjtA!jdwfSsSQtWg8*n1W0cSx?;@IDH_LVuf6GBSq35qz-=rbdpafaqtpmaJkD6 z)FU4N`0$>ky=urSXvZ>Z5+CCcp%Qe6L{{t03OeZ+ zRCbk>BIWW0M0}3H@E=v2SKJ_R*ZIq!pRh-^0N+(eDiOZF+6xCZvte(X-r1bgx@pkv zyuQ{9&YI}0FuXVNd!Ap~T&FwUkgPRr@D4#DMnvJm1tLU6;X~EEviiyPcadF~p;X(( zPfbc8;^*!TCu>?d3D>G!=ToM}c5s~~nAt0=*7w(iu|XXp80WJwG}1joDxbSx$aAHK z_4SS%_W_33*4oH7igJ$!EPp1HV0E_tW<^(9NXO>(=o@os$07H+%tEmGFeU>MmLY06 zM#|ETy5I{ZDk;tjza2(WL4xUo)ATh)MsAvybn+I26<_Ht)DH2oGS;c^iFp z4=e6_4}OiZpR&2uo*f!1=h32V;?$GJj0|3JHsw|;xTovqX6j}6C`D5HN!C5e+*J7P zKF^L%n<_W(?l+=cLx(%qs`;Bp2y!0pTKzjaegZo4s`ypoU3=-CzI7%Qc0MjP+hvIs zvb;zY9!)RL06PHqC)}A{LHB%6N+xzQphj`@&{1BeOL{q2x78AOd_f7I+j_IvX+|Vn z;q+Ntq*~#0;rD1E65XF4;rnv1(&|XIxp1t$ep72{*Id~ItSweukLcT7ZA-LpPVd|} zI|J&@lEL%J**H(TRG(7%nGS6)l#a|*#lfUcUj($QIM!Fu1yHlZf|t(B?*%dvjr||y zmQG$R(Djjf#x&R_;KPYt+psuo(YjfvRY^YCepUr0KHi`K5E}HpQ}UVqa+|mpE`Q|< zdhU+Q^%%w9`tGj9BKCBPd)P{E&^~Nr7WBf7rUWVMq8{5g_b0ORy#>P_8@k~pp8sm` zAK8t57^DN6D~ln!mx3!7?RnjSQCppf;A@p`!|uysB)zWt0wEJ~NP^3@9h=eFIzj}u zLin3oX0!Gg7N*gAUQ-kEVRUF2Fm*1dw5V-Uda}wp?rS*;JB*a%d<;*zOP(|x(?XuX zT@q#!3@qgxWi@Lnx@t<=W4YNd1RE{H-DO3K!}#f@QS$BNWln5GJmy1GJa}{u+9e|K zO1UT>v>KSj}% z1ang#sQMe>iK-&XnHp09x5iB-ZOc{map*+J5@myMGiwFnRd*g&rOsi|J!C!Hu((A; zk{)gS&m|={yS~CZCVsNh)&>Us*frV$UMqb^bB81yA;$E^JwPt9k4NS5IK(?4EDb^A?E^z_xMj%`kfHxeCO9B#{Q6c ztL=4VCp>ts_-;MHzD@d;1d8)z^Lxwb+b;Za^}>>?(vDJ)dJ=Iw`O6{ zuC-%5D~vgwyL>QxiSK1c-}xkG{zTaJqlTx)N2nHZ+MvhzFKM(L`;XO2D1AhuiWvQ`?uM(s(Phi{U1pa_;IqwzwsmyrO{H3KvRCl7LMSLGWoUjP z$oo{WpJ<}lz@>{WL$!+Q<{hhlP|KdeGe`AZPv;w?o=@B?_3SHT1GjI4PEScrQyH8r zPDPoV{+#wyfE@$V?tuKORJ!R*uK4H84tF{_%-is=TMLf8!&|N1cAt|vc$_3U9X+bX z21!M&@Pr@ry9YoEg2S&IWRFo~(+%E2_Xr~IJZC(CXIR#Lx_2+XtScM&FJ>bgXf0FA zPfTyb_3(SA*w5%HLA_6fMi3xkGmXe{AahG1?v7F4Ylte+sgNx8yGLE6p?5b;zPAG&fcXYZRYmHY~O|d)^ay%!^0=f^?4r>4fNSZd(zC^9ro6d;5Lq& zqu+6;__+p}fb*>b26D^6eI>l%CJ;+T`zM>Jr#}sMG7K%OC?p?w)hi5GGJ05ziOq|! z=x=f4L>vZjEx~HXe#at~R17>w2uJ$!_`)8{^Tc-jR#Hi?jt-prwCrGgGn#3hl24dm zldosg>kw^8#goKcCK=*+s7-U4()3lMoxjW=HnQ_wb_FGqw*!nN`=Q7pBfaSk?msx9 z4w(l2)N4*{gEFy=qg~fFvk7l)fU6LpQTCK@WSvf&0LmzTGANW1@7+QJ3`M+dc2Y8y zt^o_&Lq1iu@x#K_YX3BI(R#bD!1=5b(kTB~ViL`hpz<*}?a~GD5=9I1B{L1C4+Y!A zA*Ore{`=ZUFVl<2uCxSy(0t{=6&oGBQqKe^J}Y>^UK%$EpwlXMh~1Xy6&;h}VGTdcm4+@ESi z$Xo1_84wSsl~^tnvi^v)!MfQFLhjh3Ay~l%t5k;|Spz?SolNM9aJ`XJ+rE?UGs%Ydbo$nb(!mkD|0>$yf2HhWp#)nthTOk*s)IOEU_qIB_MT}8Gv7w z)1iert?Vlq6I<_FNO628gDnvW)ha~1@FnX@JdNItDGO=wkA{|iNP-4H!meaW;A3nZ z*tb~SNjVUMvsZWpGORQw2MXO#j{Y%0y?P5g{}7J&J*BzZp3L|uwdx2Ppq%3F1EY>m zSL{U_Z_W>0&M^inR~kA<-my?xX;qSE7eM-kG>l%7BZ5mn^}%`$CBimAz{c$w(a%;?K4-_vd|h6H=}23A>@E z$ziyCWpieAcE+IVDsiV5^Dr}g5^v|%)Zh~w;uiM{jvo@DzuB7vpcATzIOvzJMkSIt zf26$!EdeSgg|6AiJ*vvTq+1hol{BA7%CN4P83r2@Gmb4!U~TS%DJqALJ@oDxrw{KV zzl@mD$SYoAB;sNOy?`=l4vMHD0iO4wDUDY4$EN2L3ng@)bsU^EZv5b$e3}Ewmj0W$ zGwaO3)M%7dm31}_8(ODTfo&ke!rs{EF#%p+z)O;GFw6Md@=BFP<78(Gb92!|#_5rx zIUId2V7&}LdjT8rMnpf(pkPWuO)k0vo5X+!E55DR^6&6q%s$++q;!;_q-vC3F_M4b z=gR_=C%tuW@`w`aK_{OFYZ`E$WhRj}ezCN(+F`Cp%uP7I-D0kY+|3B={b0ULsgi_5 z^_7K3#>9=Tpy%USwd7)uDGU`1jt;-9T9Z{7(GHK-BjMzSDdaEJrJ|(e19O7=axuiqvckscp64zgVR@{C^ck&^ER#d^@CMPOP)^kX( zvBciKadokDb*w>}3Yf$hgPs?wM^iGo{D8!nZOmF2Geaz!Z#H=kbC?2R(AY92O@8hC zZ9aXT7k0mUsL4-RG!BAO_;t3iI`KBfbxhjQ7 zE;Ou=mhw^wP%bG5sCx1Od@mvWIIS9S82b`Uff+*eb1*tC3mbqwfsNDC!?`lWaoCHb zEK)M5$ysY9F~81=s$x)3YKNzS$}(n_LQY@mSHh2G@bP?taR4NfT+$7Ykzuh+ogQl4 z^q$$^2ZB&A;qB(Ki2`9a2%e%j&<3O{K<;2o>N&ClpX;R=mq;M2xa%OMq^EhT`Er{N zWso(m2D#g%AIvd5;EJt}y#Ue{Y1YEqk*mK`GzGvuApSw#%V1SO?o>+OpM3~a*G|(k zT1ek`jRH@W8PboCmKYhoNq&VNN*NI8s81-U1K1&KfAe2MYhbbY~k zNxeYxvAEWJ#@xYUxwn)%p2xJdw~Zd3)l^xq?ERE+_hq@5VtqNoo+hA`2E4xl4VA9j z<58n##BL}in6!*gpoQ+4W|_icS=XlN=T6gG`&D;0PE!9}oizRS9!o&0e?Q#uw54#z zi4Tl3c}EV2UkyJ11Ruk}HT5Q6lJO$AV58k?a322~4l@s*CRw9nS z>j%EC#ja3R5pUnuw#p0;V4zy%nR6WJo~H)`uAx;!0w7z5CeY{A2(anBn-I6syH*Qe z+%%=3LRx8zE+io$W`pUMC?~j4&VzK>*an#;@^^E>zeK3=XCK6;u9pp6rY22maPvLl z`z&ftU*4?Xpf%&s?A@LcY|-La|I2`^6(e%NX@~FT%g*;q+2P%?JK1yNOM=_W`azLU zv?5hzA00oO6k_rApf~mM&@J+%w_k<3yoLuQS9sH%GISt?oobE9yfUd;ke<2SPrHRU z)9$v_dU#qc?D&aG@9n(%3;oI@{x+*p0=M!i5?XU)S@t4yv&~}?oBj=#>FAI9K2yY- z)%@LA4Nx#dT-f~umG28ayK;YCt0Y1$5%6`7-2#SB3K=uJFp|GV1QAZRyEU>`Qmsm2 z&fx!s*q7P2Ek_1M)KZOXi|5bnf>I@&BAmD55@EIx$eQKCTM?btfx&8BHK1Y2tgkfg zyS>9(&d_G=g5Lh`^Y{U8iJ%Z8iCsK^^ZU<2R8>x1^Cr`Ow%}{^W(Z(Lj7!85c32TY zSX})fwa<3`c=nJ@deoQEe}^t}7q#v%Qp&EhbNX8QF73Kbicrl!e)MJSuLn*#9YzFu z8IBvPn#-rv%m_c2r5L1&?V**H_OCY3){>UhI{?5o6Luq^eaNy`VzVH=tgX*SB;p;u zXpnS9vfL>FBveRvCG8K(t|m@e#y7$8AMb7TcWJ2zpJ;ff+@j-f!M?Md{C%|N?EL=j zq7)69qnr9+(`pngdgxFb|JX~<$JFaqlwAK|H)JX!&f<+A_1usw1UbJSBjBiwDFS1_ zUkZhZB01EPAeBj6Q&t2-d1GpIg z@vmFNf-Rlrte~+O!ehclveAU*))^3)xrKm2m@J&(F;67BpYFIdOKWuVGqY{Y;MLAm zYKcgz?DQ2szyOTX8-XDED*~~Y{5Pqje)Et)n2h(MK=^TB?SfVW>iBMA8Gs|eflsc% zy5s4YhYtd8h6iG6H}m(qj67mc+Vu^I*V;qr{mlJKjJgS*2v)1uM35IpQL%v|{(kH< zrs}>E6Uz)#b}aH2qXRbloOwx15YCG^)Xa3Igeb4KE4j(JH#%3Mn*yF(Bh~$1wEiQ_ zWpkxeyVL?*Q=yBJ$P5>EPaglkjsEBeI0F12nCY>t(OUy4uOkDL4@POv{b!wJw7laU z4}L1ASUHdyqOUnWBZ?_3n;&Cgh%BWL^SK4*$SmGDhw(DQWT8WQJzlR2{i%4r?bz7# znv`Puo^{6X3QCWnH-1xDO^e6`LW3*!x(#}UQYb^$mg z`TrJUaUt75yl^1#r-{J4e^3cAl=I_Dr=>xwm7Lg7C%(`TwY*BG#QR26>le0+ zSjA8Kpk{_9Y|)SEY2B|2Lv-Cl3gV+L#6O}c!&g65jJ@HknlYmzUS$?;sa(dF{aIy7 z=>r`$X{U0m5?@2P!cXZRoH>HH8_3W`dWy13 zce1IF^&L7{DkW(g+eI$1shczxU?#d?dON16jK6flt~Chm`~GAYEV57P{@Oe;9+#Oq zkxXR@C13kLs=fg@v!H1=+1R!=wr$(CZQFJ>w!N`!jUP6r#mw2MMX{-)F_Sgh&vcW zKE{vkxb2N=1XV@_rK%6?*bjC>#k`8`QL88_Dn?4u*vZML5knoj56%U-t0O0_fTM<# z@yL|l)s7tseqKE@4)zPbaLr5&?X}E4Ot8k>PY-VRIH%*kl_$W7(DFrMJqW(|$e|aj z<}Z}X&QMT1GGoQQxSiMf=_!b*(=4>4l#EcTp$czycI(KP4|gOnGO6L0eDozy$`iq7 z+jF{tG>&vUUYR{Kr%9Lla1L*V;2bn1ARfY9ekHvww86i!>4)o}QIaNG6vxwoJBfN& zTG^klmW8FkoO~!yLKNX`W0QJT@pnWPD={ zkDz;wyAkm}F^IwL#dxW_h}LWVc2CV}$_(NXmvU=bO)ZX+l$cV81cR}n0(X4LGVJf3 z?*69|d6rTpKAe^X@(o*wwl|!et)4$unl%-wC0oil(%97D^_P6jz`wT8$Y8Eex`Ri$ zLXK0kqAI<$(RB^aT&In;aa{9*fb^QA#6{ZM3kUoC4I9VH@~zddNKFi2!)|z0EboNE z{ia6Q1z_Y(3Y3Ly7U?{jIitwcPB?I2KkD#~_R13bhc1oA>E=UoNp-Rm^(^Z$3)D+M zBP+9fE^}*E+e~z!_m$WpyYO%_fki#~;DgZnT)#X|4zIP3;zCXlDq<`sXKAaI$LZQ} zyyr@+j|I!~63a@fS&NEj95t-RdUCfMVvVfzMYuT2H}=XOX8I`FmUKz^F>cjo!0k5Q zF?s$VdCpZVq9&~-PfUFk=~ekfUT!72%3sepTk&V6s?>ZsA#WXBWxBkf%zOn9l{e+T zyM|jKz1s1FBgTbu558xvCcama)nrIOB8fOXl%v)5WK^JSqX?#fTc~k5;-d zh(_Pd@tFK?0~+T@Iz9|(X3b6@M??0LlC407cVDzsbbl6>4~eXM1-5VW>Ztk*qTzZ<=h~(g;x?UD>*TPzg327N_qACmOb5l z^@;AHAh=}YglwU6tAbT6ApgiV*B~yXi)m!wUxg2!t8E~ zmiQ;$RIsLL$|H!HI~>8zo}XYOF3N>af&yprcg!_FIHf<+vv$RD{(%0TM>ZN<9x@MX z2+xwNd+uQ|Y`tn8I*GHUX+xEXotm(v{vvG1!!eN7`0KCReg1}Gii3Coe_4@=a;|NC znt+p)%$|a-rLke|+O;%oij#`fw}RyKW|eu;J9Ht{%7%L9JTpnrS2LjFSNIGp#)`I0 zXh`y^GS%fTg$q!#{) zC3`wacCX0}bd!Jo(AKHbye4qa+h8gyvE}Kr|1G1cA8Jg2Nk+DBUvzl|ZyVEFx*kru zTI-lfYI+HKIaSrrZ6v0hvuMLKrJGX$8nje|F&>?Dary8wZ+8jGzV&@ zE-~nInmW6Ep9@1VT3YQjx0*UO=Ps1~wI5IAFxM6<(mK4WENak8@3mY5GSKD66sm2*H*yma)O0?)7Br`1`KeHi86a#yotkjM!s%JhTraYdP+lfcCj4mpTL=a>KSHmtd)aGkvevTSKC{ud zobS+D7KMna$Q}BYHAA6dU@!Rr7)jPv=4DQ`XJXcb#cPuWh78?MNtQ73`71@!K(xT&k9 zMuP)~u=%IFwfGP$jrR`N|4C|9B;RpmzZ1AJYJfm=ly&Tp;D9d` zy*NdJYGnPL4-YR)-|D`r4~Hs5yT^a#x69-*Ix^236v77`Zro|dn&`rsO>J*}k1mP# z;tG1o*fw^5fy}5-p{{6wZE^jWBv*Kbr~+`8Ah>6*${yA%l`d9v`15!BIw9BVfYaC9 z<~*1=*RymuE#tINYfUvTv2dlN_=Eup{6)VHL4SfV(M7W7&`sLY^C6ReR9Rv7=@7%i zgP(+ZRY1XeZqZhR+7uz|f=*)v?ZxTy&A-mIS}jp#8r>)z4ulp9oV;^==msMFeh9?u zUe`TC8bqEaKErcGH^cO11Nr{wFX`Wvq{3OaWr(X$!p-So4Aa9tO`<#mS}lg5go-}G z7qL_={ySe4y)Q@36h~%XPegs65PFSnrTVATTK8e5b4)yPlCx|=sfx<-P|9pNg3T7% zSK{mNqa%XXT~v+Xv2puxdwC?4`ln9%?ClYeXt~8m2~?qnLW3Pub;*sxU4>FJy48F-(=`E7>< zN~(g}>iSE|%k#1=;(wNx?MCj1CAHyk1B4v@j9CX0i%-9WKLkGfY5bk$gd)Ixi+r4d zb3YO1Sz_u0w`4&;oM++e9mWLCTiLZk`)Ol|#i{KF9(DA-NlJS6UX|Ut`=-Oi8NDV^ zkA3{f*A2gx)11?2#&w*QjYe^mxmT`#oF#FSD3jRV9oK-?R(R@_AoU@#6;UgLd2+2D z-KBSQ9etULXa8!;*1M!7`Q77ieY5#*?P|Mzu=^9$9@F3feϣ%UY8`RWp~V-U_7 zDSM&-@cv_g11tXxtR8hhSsvhbm}^TIbEA^ zez~Ise9A5xP83c_%z83NHI&u7X>Mt9`pnf9TVC8vDso9r$$%-f#fu6f@a*df)uo-Q_5os=ED| zcEe;FMSWSJ&ct}ag!R8s`bGUZ`f~{uR>BX_16UIZu3|HQ{An_9v zHp7)lLClDc62YY@VO}JkS_2kF)MYGEO;oHS%W;YuDSf29meyQ*kC&Q@D5Y()UirbQ zeT^&uH7^72nS2!YD|zY#+SZO~YV!l{p=s^XHa8fe1Wr{Ir~lt? z&T9&mFQ)1Obn6G9RBhN4O5^az)h8(>R7Z`?G=z2B6om`t%6fF1Lre{m0c~K~0 zXZ`%Asz;D)&nPl8w^z!q(xW3qYNIS&^j=w1)?4pd)hsHQJu%L&>=IUNSr-?V@a<#y zTe$XUE|?}yQS@G4Hzyq}NAYok$^v;@M3G?#N~=Lk0A7LKEyo$`IGn`T`3c+&xhE&g zGUdOb(GqsDl}c<$s___$V9iP|P`$KE66Ka)!2y>Q0W!(Z1+^C&IwAD7-&RKDm zn@lTqPUJ4whnly4U#AuBOX0`y@9}=T_iKqGj)SrPBvyHgUX8{~cQ&n$YZMhEYGih$;=(NLFnCA; zJ<{P6EViq3GdR@A0F*j71H;Z7rbk7w@|D5)fHG%I7z!A3i&zoOG}HN^4@2Y@zZPW8k#z-2^|-~Kx5rTa2PJ#IoVGbx9( zms$_6iSdGT;U0f^Fi(^HUqEObfHCxveHQQmm5N68!ya{NsbpQ!J&T!=K7H*BqwI3( z<(8F_S1t|R9X3GYtkqCkY%MCbUS*P0tD$w9$x6L;NSmOB={inXdS_%wItd~9g6P?q zbe5ls)xwWyqa@6o*JRjjFm*JXA3Z_f7BV2Q zr|8x;r2WS3q$)JNtkgct{V{eZW>(nSUAP3`gSGb@Ta068{O(62Mo>By3C4Fb0xq|f zF($svLG@T|?ZAQUbnm64rqnxjz@vnk*h&!BzyCpfWGxn*q%`b!2z>QlqgEDaj{z0qttc?)(Dp;3e z(yy(@YjF6%)!PGZ32TFI_{e0?Tr)><@Nh}%lMmyo%EZs_SFe3u*|%^JhjHJ1XGXjI z``I;gHSp+U(PI(CA?ZoqXG6&?-|KFNIGgKWj|g#lmAvsh#qaePKkb)vfkVD7B!sBr ztwrDIu9PhVp@t9Ota(3qIW!E{Stq+;x1M+(GR!qB3mdmJ6EZTkf_M>gnYyV*G~{HY z916Bf_&5)i%wxFAr?Wy1r!~*FqLp^99NyPZ-4ZHUy`0AUEz%0+bKT6;SlXPy5^Tn9 zit~>w<74c@=Of=s&C`mfeNxu7BhA8zZ8aUPGKDEyrHnjrw?v_#{)nzNg>MHveY_6& zIahSkcjLb>)xyrl4^6X;NEoPI)mVS-Scfz&*j>UtsLUHUf3vOFe{VM$n}31R)1_Fa z4wRr_VWG*Hdy0v*FC?d$Ny$k{ruxs|=UgZ|Sy?quvZB$JfE;70t4l^6I!Tg}>eg_Y zhK81qii(yP9MQjwa+ZXOmOLc=wpjZZ^%-&YDc@d%&LQkEUp2PM-s@%<^j>Wd*zN{m z`uIvD`cpvhgNaqh?8!Rgu94tEplL>Qwr-K^bDvl+D{FmgJ(tCsl2)sp@ zO8+Z6RqvHilF0dRCY(_2%LY>mq<5f&S<@pZhp;K@gL)OlJ+wIoR9s4riQb7G*E(lM zT`eb%v_6o2fW3}!gLQdyB7{*2rErWtZ}2<$YTTn(CQ5@*lC)YA5dw-p!l1x?Fy_?9 z3leg;vQHW-#<5G;K_a7kIS|F5x2qAw4Sjry?}hr}BzXo5(-a}1Nc2lv-Ux=7dw_`8 zr#XGH9?Vo})J2ws+jH0iX=yh&74q$+tx?E~Dm3uC#iso#%yxrgdwQ4sCaS#1Ba6qP@BDTTlWER; z_Nr?)h}&+X`Ml*kd?vj9KHR?7)+4QIjnxNdB$-4<7JHBLV%V%f75QVvg=?DA@P6oP z6|+Cm*j}NeBB0y|MVZI3d#*aVv3lH!Q7ug;bw0VX0C1mpTVDuBU-JlZ&L*CrEx~@g zvWYf!%l@HoTQc76+$Rpybh9IpMMRVsTga6ck4{C19$W_b-Af|r-k^#2-F(MyP}23< zJMWV1g}YafX{Z_Rw!3?-w2Q@oq1XAOMa^scf-SjkdSwG>qy_`I@4l?3=ytXtN6RU2 zRZ?CjbKpA1i}Nb`pyH@hS5vF0`s&TH$8A47t|iq@+0wI3nn-*7ob=)T!M(+ruye(< zEom9SCd#4heQ9Q{%npGh?2m^nPetWYjy9zv4ia)CrBY?wNlG2o zo#y=B+)MHX17`SlMY?qZw;;hMoH1JbxC*NXfq=*3fcaLt)%B_ci+Z)ctA0~lZj7Ga z6vPCw82$QeeH~s2j~}m&FVF^B5Z#nSEA;WOmT~aU%`JChOSD#3x0<`7!@a5b^5klL zE{Z37&-828$DM=l8@bj!a;JCkT=(qSYNG~mYkT=r@32~Pp9^&Xo0jSK~pHT?6)f?A*>9E846baRamXh?Tkxg^BjK7qxaHX5Y=?%)&BTXb5Z*`A0_YR#@MG~i$G&mDiVqBUEQmb~ zT-b4iN)tcawMQpfkx7NKEy1{U4Vn; zOn`N`SltDeICuwP!4I|f=KE&G=pA?A`qlH(c;DggP=Hm>jkJD-jK*C)#5xi`pESX`hO z)^AT71c;{_!-jQ+x%G$xqtk23#8vBfe!c#pI5j)(Ml$E{L-uq#7#P3Dj=X_A4S*3H znBlL^`de1}*(c$r2C$6jPAg-6!zeYxwbp@XvS>GY%obNhzgT{!V7`!tha) z-OVAEZ3n1vj2wN3s5_q~K0zKsWlI+qA)%XFSW#i>btv)AF5|UYK=>9Y<6WAGKhDm9 z>~TM~Vs#Y8lnF4USHyMiR4{8lyM^>Z)dfszO%?SH*J5wT-p#cJ8(>q7#3GzJM3d!F z)-Za@re5UMqQu?&n9LL_mJ&?!G}p(vhkYsK$*YuiBRNhjbc7<@KedR3oRvOw-kVSZ zvNJxHu<3gx+=T^c628Kyo3L^%6*UVHBMCbNS2_Jlr-!(Ngw;HidJPwcpmr&Bl;U59 zAB?_`@FD&}7<>qFe0pDef`=aa3O_%Rh`BLksk z1{srtza=8k86*=_O@dPgt9HG}|0hh)8OxMT0bAv-7S4Fb0 zkDTdD6%FGH%Ue}4h>u*^j8xB_GrG5#lle?4ZT|>P~W#{+!GHsZ*!l_U6YuunTFV9Vtqf-CEsVDxn`5_ zegWYFLHw{L|BwU&fdGMe0K@i!pl&e$0rj!O=1jNPZnS(7m~FJ!;{0j+xwhQ_1~U3a z05a}_tpl|I+UO&6fZzNz(^vM}Pl59UBL=z@EIP=wKXq5@hQb5vVDO@jfd;{P@VE}| z0xY~=(gD8rGvaO%D4&jJXmxC?gP==rw>UIMnZNf={z4-^_zT*Ix}^-jB!2k zsR-f(%PW|#fZ&86H7muGRa1F6?9pIhm8d1o)(~P9%PpAKkYJU7&co?v^T_d|XN>#) z!3%Ovp#4Gk3#VVSKe7Ntf`SREr>Nwd-~$rz5UQg@HcIOd^R48sza~N%YRAc*PdML#BJHU% zJ4#DV4c^j`%%U_6meXa;{077Xkq-yUny?@_RH-3I0cN|8tC7J-Yl^_$Rx=_&M=_pvWW=AIentRL+haM^^M| z!TJ`luzS(QKo?tikn2H_8}V;H#ebuMG_;kI2~LHZbhVRt6=mpZSrx`hmuKFx z3p~}OY^Pl#R_&`Tvz(4^{RvRshVqw-X{)yH9 zEB6-L=j}?Bvia1BBkGmEU6oSnRJ0X5#9WAJ5!^$}`yjW`GO}i*_erGV6U72-gx>Mg zW9BMOQH5LzgXPRFBi|ThsvX!{k@({FMf7vMm_e4Kum+_J(dn)Lx?}A7A200KY_cH& zZ?wkfPkq{|_yzY9Mp{DUScVS29VmOGc7M+9)y?>8m5*ZX!DrXh%3k;_&I`f^Jz;aa zG6fxC5KR*@I8v{~$+WUL|Ow zdm)QEgfm<=jDTes8x>}^Dn@G@!Z^BWn9Ycf*$dbtGkju9OVo@ zN9JtXndsN)ukmMZ%1Mg5TXE=SLrr7d` zicE-1gCh69WSS7B=|11x~CP`}>r@j8`xaL>{FyB{^fQ6J{djI=f^&&_Ni6`plZ3X^D3zfCZpN`I&8SBNX_9q)=j-Lf8 zYj3Tk$k~Cdm-m&_^Hkc^D`A`*;amMNkFK47Q+u?<4Y#Q_%qirCD5S5q7wGWybg1UW z$zq7iLKXIoVfZFiSM=*s=+hIaizoRvD#CpOAc7%+GWDghfOQ{tkn;%--4Rdsk7xQ1 zgN;yU_w@wG?XGduS}l@sWdStsu_z{6;wpta-!bKJ1NAzhaD3S(Z8t)%dEs)kE+ZJX zn8YzdzDArt7?Kv}*9<8pI<*d*u?4C%O?XObZYL18(V7*eHk@GU(b-JnjL1;83=vDO zb;;T{Zg#laRQT$Wg#f8g5vXrExuj*tA6dXNu?im;@qC!!En^%oGk<^`Y5@}S?vGnV zm-(nUVZCeBf=!wptO)3Hfz9gv<&t@Q067A9>=;Xr601f*wx}hVjrJs18=Pv$yWBLbvBXw>nybvCzqLC zIvrQL3rJLYh8-HK9rX@x*;aZ$M_Xqe$PWEobiHM zan!Ew`Cb1ABg@_`z-Ti_x(?)N#Fhiceb94=| zCK|AfQTYM6Amb+3f%HP z^V4u0z!4aj5*Yk9nldObupdW=d4v&@(TVAIU?{B2Hx}l~SJ>@fP_{27JOjnY%M8y! zFSIc9J%$(=7`=%Z6NZr7BHnsLv&+2%b>kD-&{MgM;U5Wu%_=ludGG0P;EwJW zw(-;ih3{K>ko83AOA0DgEede`#!H=+2LCmb%YhpN|7{bPt;+fcyrUuMIsZgGWq{iXfqPthbyUu9!)+ zJU47kLMuMCbn6s|E6}bu>(tIG0N>CJ@Q1Pr-g*MPj?{*DqyMSS{34WyvLz~O|1T(2 zL!vZgEsOg4iI8i%i@K`0YFUfAzVi_26`4t4@Yc>Z|G;(e@^zj z$RazYfEor}cw|BSH0p1sR9{H z5rKppn$OY{68FPYH>jflNo`1d5gH7I{M`SGey=+||IUHXQR9o|yI5~A4_rC(H ziNr(c;DY1}bfi`lQWhNvTivA%hIb~>UV>O*vs~WqJra`4%34)gQ6uu5Nrd}@kHYv9 zYLbh=uF#=k5vVROQ>1en6Dca%))vuV#c!4zxpn!=w5MsUA#AfLGdLllZ>os0SP!nK zGUf>;|Jv{1!@HI8m)2JoqbVhd({sx;Gc2P>wrloU#1#(d{Nas#BgdxI^s9)uBt)ia zj2)`u`D3HwLNo5h=+lDJ($hi5Jsnrb*)+;tiWerf?GSdd)}TI|C^nUe1fMU zzfJl#(}0yS{m1j&l~1x4VgC#H{ygyC0zhBjy>E89|ET$zUp;$Yo_wD9rnt914vO=h z8n1c%Fg^%@8mg8@?$*t??Ha4AQyTA5H{7(vs4cN*@=O~5Pf3@p1hkz~1CXK?M93+i zBqXGkV^Z)=$^k*BWke}|h2YK>LY`dmskcsyQ)qfsTllME$jy-N(`S^_8bYftjv&7F z8Ads#u;?7ay*K~W7YjgFIz&}bM46)5{8eq*q3tkjjBQz9Tcgu9bLK6WQr5IK^k4On zw~f9~hp|WEiNtH`~g%s2WN=~vDAXev}Q)o5k(7`1|7#$y#ymJcr$Sy=QryTHvc8)XBDW+kk z7<8p_$g1GU=lWAVB5ZXR!o^d@Hd8*Vj7zic{OJUL zu*i!8;e3v#P+SpiNyT4P&D~X5{!z)^RZ;y>(YILzB1IicRfSYl*>y?Dc1clpNtwD? zO}kl#_f7G8LH@1RZ&~28Q1DGP z_%SQ&3;}K-54)z9MF>J-+OC5F84oRYI!c0vZBCl;q&j^Wkf}{e+uYhFxOy23Vecw%=fq6_;Z3X&;HZgK zY1LfSvQ(F;Hgl%UT50E6Rl`~r2CLAOW?%M7?g1<_MXExofEv2@z5Tuk=I$PiN@D0s zTfCdy!%fImrCanX!RW^jE3Df(1~OM1xT6oZVBbYRj>#wnO{ zo|+`GnVs#`F*RnXWG6Z8b!I=lCcmBJoZChJkMC7wns_p2^7XI{r#*n@IYX~B!#ogR zOlT6gAq5M*#~BrBdd$~P&FmZsKbSZ$9_t8WL_@A>Qcm7P$w6x)?9-(MdAPLd(0*S zkhr0RX15y8;h<;k5lrB8dc^NR2846F>eFVcY9@g1?Jm-l7o+-I%+nqdHoCs0&}=s> z?DXGMD8-uGUnTkbO@FbvT41f|(#}Dn%xFV@>_!_`*p-PNbJ^_Xbw3qD_K;Re=fS)R z_e4U~4iu!8cSHqGU%!EHfL|Ah)B%6n&xq7MGiakN!FG0??PMfDzD^s^sOFsEtIMRE zV4H;eA_%N{(s|;J;^}xkIn1gRm0tQ`$=y&bOnhe^l(^;DZ7OeOtq@yoX#4$;G^O)LQ=g=q(@lq)b>A*=H@mxy1J=1&$=^A?lTO_)l#39YQ>8=k^ zm~&c`E@4bOQGyNNKrF$Sh~dLLVPP!6y3BDP`#UzA>@I>0Kg*Lx_+7KT=$om;f_*0EcZg?l*n zX>l~XdwUjs2d6Y6=?ALU)`6ast-`jVSY9kFg9XYb+lEo4ZL)Gd#>Qpc0$t~2!Mxsk z`973z41*Q_AUwwj;u1XfJ_T!B`yZ`m@4jH3vN$gU&sE|W&*UA@enDVCMIfO5ttcQw z&|P3YpnxpMnl}zXU;{F-NNCjwaP91JN3!W8P{|Fqi^PV}lvZB|k>XffE+?6=4wOt# zY`Gjx_q{|KPW76tHd6V(PHws@UWJFTyx$&u6~BKZ*yj9=WAYzBXuaq1j1{F~C0{Yg zj8?1Ja-~2y&5qaW@s!yPPg6dU^&Md0iW0NX@4opoq*35$~QV9DpFcPN^){+Vw{?Sin6l2 z;`R3Y`llrVF`z%-BU{$GM$u10*rtbz-d6PzU(k^$lxu`asFti2E0k*mi^!(5nxy{k z_m&Ga!ew+@UJqvr_I>$;gJLn*%yt9ClnZ8nOlJH3LefdKDy>Gl!BX0vo>_0a?kgZ3 zmCNRGz8WZ@Ub#IYOH7DzF(JZf9}_2xQgk|>?uPi2%j11}7M|z#dikgK%k%zfu(N6Jwh{(y%8})eFDrzrt0CJ69iK=NHI;V{+r*cDa#0yxXyC{;s zFG9~p?Vdi!(Ed|s<}7A&NPp|sTKDv6ulf{>4cEK3Nea!4X#6K&^4C>tYAW5>>j|6vzAEsWdBL!Irzul32428BP6n;xBh z-j5>ZCV&jv%pUen`nCs)oih!Iea(RjX-G;F~W5+~{MJX+Mq8nHs{#5OWyQbLN!9dgwk7DS!-P&l$( zq@ZmKP;a=}sQjW?tVMRtAe_q)pRVBZN#jX%IA5@$KkkyBUc^C85(;0Rzm7!q*n_PNR$*tPzlZz;(il~CDJR%oms*gR}8Ky_i&nk8k@OHEOulB zF$!Zc2i>M%cUvJmYW2NHG4xn7^qe!u?FJisln=BiFwjvkz{6mQ`bo#pLW(8AtY+i6 z>Xf^LNaije4=*VZ!HY(oVW$XD7tJHSZc_oLiD!TtuK$+72{{d}JNpg54Y3Sn@I@>| z7?==DXM+s>{rzCWMV)xs@}nmZDsUx#C&Eq88WLS(Lbev4rj~YIW^lbEAK_?L|H4=K z{-HZNu@wPE4dqrnZAchZ;H&C_6wY)&+3v!7#}76D{dNyi^cqbnBIUD8y&jeR;F;bT zeSP*Q`@*{(dOtY#Hq7?^nEy7e1E=MBm^WZODTc!=VYDcbO|Lf?CY#FVhR<$ukT#z! z6sDgl1Q7$I*BPXkEr4*dSyHjZU>0Y&48(wSy1=xu$d#IB0pNqHpt5Y>(=NdA$ZVW2 zIiq#pVdzfbv|LV1hpZBwfQw?ls~@14(W{u`I_83}I2`r|XoCf#;k#p^;V~JF2ZB^b zWDzb_O{!KIjN%RFf8M-cqS<8P%HVO!;1$zkc3b1ITch;?tRAg8skQT{ZH8B7)wUAY z<<7Tyz1$^EXMUKhzK>_4n9*p|8;%B|tRxw-X2AaZp3z_^M3ZmPP;avOfB|#ckB!%H z>d7xlkv=VT66ONLL&d{pDuI+h>aTn+^}hNqE~j)|f62w=t4V#&)YE+M!8NOqLt$R;ed=V(&BdkE+%zUu*e2|WOh&KbEFp<3FTBOjQ zCpX;rFkblx;J@$8M-1M(cA}hQ+oFdr2vvvvjOq^JUy|!C_^jNZ z71pFMm#kwXB&{YK?nzgO96d9 znhQcPoU>(ZsU(eentx@bDCGuT&~ncF&15hH;w#sAbmyXRO-5db`(!MXOwUn++L-sL zxa_%NS~TC4T(y=t}1I*7Xv9 z7HY}b#P->8Q3sw@DLwUXot%8iEJC+bHB)e$ueT{=RBxgsh!Ob1p-)8jX68vxZHk!y zLf041kwvK$7B2k5Ns!v$)wQ!QDg3RnX4M;vnoaR{tG^(mxG9fQfk!E^VlCI8uPRy( zF%A9%*_@DrSPa}Ei0wqDv_9Fh3rUIPxnYRmi&JmWFXZJPg+7+Lz4Pw009IOU<6aLU zA3%EYo{PW?5@n&-P(|^|=TX-iO$jpn9zj-{qvKo*e@zpr7kCTY*8#X!lI8gKzAQuw zn73cW^i7z18lQjuDA0ra;*qr0Wn$73v?y;sMh?S~tTH&U11gX|SPE6!~{hmrgr)BMD-fX)gy|Gn%k>5a_ z*t3=Y^$SP=^}vFLKp=bc{6EoT%sv6HdZr~*B`b7BKmo`@CKr-2MUDwnSk{mSmw7*<{BVX1;{23V3J@E)J+B; zfrGG>;+&tTR(09`qC~bEPfx(Vf&9gQ>iRjzUqEo+zfcg0!7~Kp6kt_;u?jNJLOnnX z_JKzjDr!J22Td86a{$$Zdw;!PX`&L82zx4Gslc&{>dpeO;BO6Ms*f}~!fc`;3?1Cq zd}Is}b4n;G1+$RmNboad%8*Nsfj8vvkX%#bLs@8LCZ(1wSsJhB#uaUxh^Z89M*$YGX3rW5heNEJ#Q4xS9Jru^T zhao>?eJc!&rAn53YC@-}lbQr~2+65Rmw0|i=c(+cqM?ZZmHJsvN6I&ngqE zTDHjgsL{O=>f))Z%f5`~qR%TMza0G_)-6x4g7F~xDbc&E56jeZYV($5XjYYBiJpFB z*0^RbmnEH`l^~ixo`Asj5KFKif7W`_`66zsv@zh;I(T8yIabs9eqrf7+0#U?3%jxa z=ZdnW^HYx06(X2M@Y6u7j%5`y8_o_~KKKtIv?wO43~DKibExZJ>Yjb-F7Sli@1G*d zw&dR9R4*}#|M4)`2!4W*{|Q2Bd#9gHP93H?X0>T=I$tqAN3*~7e{lI>_{a1P?SK%@ zA~u2X_5(5C#{637LvtW4bpm{(y9*H(v@+;m(gV=HqAZ61L};#aC}oilL-Gtz03ak9 z80!J>I=Bnq@IFQdaGhW5eU~?|A3)#vixeox3U-U2t^&TZkSxGcg4(mdF1Wg8_66o` zh;-rBduDAYSCQfS^&Vt;0V})LBv|7jkaH4liGPxbmL!Ph<7CKS#;~90JSBVP50lHF zn=S0LvegRUES%Tl+)6-BA-Mvl6A~po*RC!gEeo4;)~S8t`Nkp-V;X4Xlh`NdQ$(b^ zNVNx$p}46&lff=jkBTzInwONU^j&k_h~k-NQ?>{IeMBv44sJJM5>QKU)lk-ZQG0ZI zb9=TI%{O@xxgn&)3q;Yx(M1_Wu7x>;pM^<8&)oWL8a!)x4%M7tvV&cZRj>7$DdG6P2@M$3P z(#9RnWAOd6ntyJt5FIF6X}MQR_wa9Bd7}jT{14xssGw* z>)y%#3i3ym=ixe&HP2QaRy2PdC4_y>UP|=wmL)Q^&cZU$GoSLVW^otPR;K5XI&$9@ z-#Xsj!x%^EZs+qd8?vY}&eGX3r!%56HZsLCb~H3xWu?U@K_|H;v8=VMEve0OfJuXy zghLCQ;_-v>85TjX3-LiNLzD+g3}K%Jn)i+!$lEZwe$q8mRI?H==MgdjY((RJtIr-< zm^J;@f|t!-n040xr(st^u8bp0$H57s?Q=T_y*>7z_krbu&=0;Ik>6{*6&Il*B36tF zfTZt7k&W;>Qyfw;0Tg|Ezw*AGCo|77xX z-nUzOM|o>`ZhL3FV&;i|j_oY+Qz(!z5Z+`yHrTF#U4XkGct>>)_CT8j5!vsX-_r{>3oi&E3=R+a4onVk4~!0^5rYw{5=~1~ORS8&j7^MvQJ`NU z<00puOky^U5Y?B~8`gu}syOQU)bFC7LD7aH4VV}fIp}$i9%Crhx3tOdQ1K;9NDG{i z#46DzJ&j`>?mL-gq<%W-wrBC^=@Am7o^u zYgKPb1%x1`o4|6^yYu{HnK`XzJ8%2$+;k9Bi#<;-9Cy8U(Pu4e`X5|N_P}EX$1)lq zYX15OC23VJo^2~5uLhH@xqn=z`Gl5u4>bIoY zLzfH=cnChWD9kcg5I)bL=|ZU@c`bn4eq}p!DCrZ5y|e|2YXmOiT#ck7Ii^Xmqu;JJI6baux0aV7kP#z8%m3JV z{6#mQfD{F_WYw;tCf~T$RcZ-K{U9SJ=XG<(bd;N!>6Dt9#z{)Y09&CdL78@N6|QY6 zl~^2(kVJ)%n~@<&ma-}a2NSgGh8YIK_c}lFG#HN1x@4drJCJ6=h)FZRz%!~v8!>Oq z%KAh6$^D>0#makW-V{7MEZX~xo75Z1&=HIXy@AV+Iw-a$P#E+V^IxwOu>WA z&N->3J?mU=3 zPv(kPphJ%>;;7R$(C0I!0vS|>>eGorms0mg0Zgq=zwRT@?E0j$OwohG7ph(FYnQ7j zX~X`qrhS=JdTnc6t!i=ESG(BozUw~leopvqltk)E#>Yk0Hl$q(oIgW72Mt@Jl-b3- zS6O(k(Q)CaRcKMAxJ;jQKJ`D$7sY0(IvS|Clq`6mYLJ|vrib92!^IGkUGCNKe!kQr z7s;R;e7`rMr6k$;$=0%AP7fHwa8j4m_`mx1e$JTyo$Lr|Zt2l)YinsqRmNBjVPy&~ zbpYf=r#^j|xmcID7Vtv~h)AF_)pYf0*ml4~TL1tLMK+vhUoxwpzOA-?)*V(0O&u0R zd3myXO>1}l5TqXQCwwDNitITG)RD06uojT24o!wO0U9#xsNn)b{{S+hfFlLnKhnR3 zhYbFJpsUCQVXlTSK0llO9{^-Po4+bH97qfqgpjKy<(9n9HqI!|I8g0)K&-r6SkQGr zQ1g{Wl>?!`unDP}+TDbiHuA_Z2xRXqq*9_NQ-`_Ao3f$aRW@{Q(Mb#6E;Y`1kpl|o z-s2rDe-L4)2n{nL2xyU^OR01;WTh+Vjg5_Th334G2u&Xx9Gui>T2*PlU8RI<)_8z6 zaWCL*st2VP0e4$;D73d%t~KN)yDP(lLa@<50%yIykfWplJOtaZ6tI$F$CM2BM(b1caS63xzb@lPh(a|h4J0!`W(8c}zVgkLAB~FBR3(=A^ zRQ3bPxX;yOg+Ay#=(Q}n@)LA}t10w@f2sbmyUy+`nR*57Koi)9Gic@^Vs|wmB53UN zB3hhAU9FGzw=lZ*cz@eNf)>&Zb+9l7;i(~jxM*GwR#yuR*TlpGFifMN$UH?E$3PM} zmyBI(!li2^?Sq*xeYCK!AV2{Iv~vETp>bf9UWbew)SF!5BQu}2W8{2IC$C#V2t!54 z2K4Z?(u#J+Xwm}uZ5dT$9Ay$VpoE3sH-x)VlL}B&MnxIlTWI4M7a6(H2@h7%qF->C zvqd$C6PB0Dng();%07IU;ItbzP6R=NpLlw@ZS(>e!{2H2ENPj9(cggU1a4lygBNzL z{}=z>Y<&4;=IE%Q(8oVl`&!crwIBU4hX2;L%)UMzh&*7f|LQs-=cnb|0PILVQ^k)6 z-wb8^3jW476ui4jJ`>IupeWmCQ2T^!l6*z^)cle8hm=pzXXrEd{)fyTosZ{*@q7p& zt8kZ``X^0sjsBB@{y@U2N#vBXO*#Du`k!EQf2R!_LW|-%+q>sf+M+q!db;aV1U?4v zs{r>&j^Nd+S5;L-4(V4`#)EaUmAQBCs5IAFqtCUy1>!9j4ElqvUs*5jcDqH+?Z(vH z<&}Q}VWTm1bF&P?63xQsb;L5VbAF?Q#35p7icL#X zi5R47)j*Vm3`C*)Dy(ibk6fdmUq)Rp0?k~Ez|gXDdeDx}Ho*egJVW+DFoWJ-dc2Q+ z(t>MWQFefp0TrQGAhT(E7p~^sg{xT7F{Hi=UvuxqSG)AO(0U`gC5&-tcWv?i{Fndo zU;fYHTJrGlFuAr2mgw@@iD`cEMWgY>7p8ea)Lt1``8dN{QMn@9=66s(EVUnP&(9M> zC6(&w0X7_Av1yu!6`WEa5RjZgVQp=#APhn@V^Gj3>iYFo)nUL!1JQJxp(tcDWZM*M z8nj;t2~$(DWqH}}&txVh&gpMFiqRx$I&_#Os*1RC6c!~z(~P7976+4LWPx*p&_OwJ z>(;@6FH0d7FvcPZn0ga%wpkk;ttoL!IeVPhUR_<4d7*Ja5G4rb=Q@EfRNy0gN{x(+ zP^TE5W=~I{VuA3HdvkLWbpPPs;K|7eeDQj{pZiM8J`8@qlu9-$%xATg4u^&g6*ru9 z&`7~a6Dzssmf zB@n`)W-vB?q}S`Rv5AiI&-OYJa)Fypa;(zwzY`thn6B@6x0*9Oyp0`$^}i2JAoiqG9`O3)RO`txe<|3SQ$9c z{R0Dk`A36r2o|FpiVE)6E+Omkw_udCG=n86@ z%b0;l7;NFBWZo6a)@Hdnnx98??AMLL5lhhx5R0%-;csZ`!-|a8*FU#tcPQhY;K?cSr|9pazyJAb&t|ac z*{tiRCxw{d?9*Ycwmu2Hl1Wk(eCG~$Hp3pjL1l955^q#^szOFdp;YT#!TJb*u4Q+qFM~S1mKL$xUgB}Wz$gTo5Jh}sxeBw8@O z^9}}H6bt!l*9trL?%mtL*REmcRXZz|t5uoah9dJ$DxUevBnT8$K1v^C3|vmGtgLV` z7%vP)UX-%BYz|Qa9$bk?f7I{X&z30BxueW_c$Ol8X1#2hK8So>>Gk^L zF#}UBsYhxZsYw&}i+i+ZpmAUIq@dD{zH1W&Xe&4z=coBG!suHFp=cJs5`?g}j?1MY z*p$Um*#!omvsOw&OIibh#IYF#-``V^IcHxuLO$5cfPmDEg#{%V9UU9bW`~DIqhW~$ z+l-gO$zS~97n^yiXLxwHhb}_*hM`z3PGXaBEQ4kHq{Nnp?5wgbh*`Jza~TY^Dm#$Z#C0)#C03ve+W95I@Sm861EQmgp2x}5R^LD?yd0CPLI^%WHm>mE#fvAi;-@$XR47hGA5)d)uq)>yotcVs(43ky>A0PZ_Sk4?p}c2E1>@49gK5I4ue& zAvlXc7h5Hoti*yd|E7l6y%Zt*9>9MD@S)RG>h#@fZAIhXvf!bGk3U{0VT;9rOWC8H zy}fXFYkTJ?%bo7+?VVae6W{*!x32~i2Td1?=p74ht?&;ZjQ#{dXv`z%%wWvN)EeL+ z4zhL#ui05sS97^sv1U4fG+pK?1V~OnWQ*qDP~94xM8GJh@?%D2vh!7cdJ*HJc!$Gb!I(8crmsB9Vej}gkPi4(7#}aK zTqo3TA=EEc>b%ca1;XD`tGdh)@xp<4iD-F{FZoJcXF&ywO?b=cWRU=mH4vL1sHcx}H`$C~~ zI$fxizje0SeZVi;GWyYsf8xUa+KWrhynYaBhDvUy9q! zMuQcgI7LC2_Q>{#k87w0Kpv+JTO^`%)VYuj?hfxDDIM)_jlezce!esOuOkc<;M1Ch zeog!aiI_sa7LI49Ef#bJdVKP#ueSXF%KFMi8se3ym#a%Z{pAB1O6~N;g9rDY=M3Mq zYu6-0an)*>40;b-kDlikh?3sl$dpKc3?e>$^OR_AMW*(5PvXE+tP`vO7fwhjkmvQW zZ~$Zp7%qoZ574Ws$QDPh7v{3_GKUGfAF7F0w2Pdl6;aOQ2#!yaBg`_@r8fO7+9VF~=~-d-u21)?NL z+&Fd(%hb@*rwQlgema{yp&|LPxtW!utU|8=PU1MbB2ycalWi;Tca33ZNz2&fGmZf4 zJmUuyA@A+mgM;7w=5KxS$?q8eQE5ek3>8kn0E&u!&%f6F!*WQq7Ku%UJfzZEU)=;^fi>*ghYy?*Hz=(h6^v5Q*YbpKf1ir$f@8dziqd3@80d-gt`AVLg)j=ZnyI^GW2R?btO%E#&0x? z8m(dC{A-2dEjZ4t|`}0*tgm} z{UPx5^tAUO#v)+jb6~3siJpAvU-@6+WR#w*5QpLl4uzn7X)RW|k zH4q#kOeWNd+hm(19oY53{hc^t;Zda;r+qg+`Z~C4$4wU~0^8e#qljtKH?Q9s84fx~ ziZM7mcH`E>^t49&?+kKYfz!C+ngi*f7EK2JB@=QCyn*Ggd#VxVM(%7Y1Q-gQ8fU0aF_okFHI>bWt zHd$zPi6=EWNLlW@_n(Vm^p}Xl3?odD7pxHq#o%UP;3okvVFzC;ot$jGI6OW+&Z{^u zFfb6LRo}ost+>19z`8Dn3{)@35 zgETb24}x==fAFP@?w(Um?BX66>+|^_O`SRfB}-@(;)7~ZX4co9o>Qpv@a4;w@KCTv zk}6GydX{$&H5${?lW$Puc(i4K*u^F$Xs85DV%`svTui}d{76lb;p1r1Tl9L1ZR6W@ zJ)1@Cb6k!SfJ8=Fr~=dv+IXT!PBPWS4?enp4`0|!0u+#J$GQUyuUu|uAT$uLDRZ25 z1ke*xp&ULjA*F!yL2UI>+2&=LmBp8P+iMW8s#KwSFDx|(7Mo0sOawYd7%lJeQ*amC z%Iw17^)7I&BfR_gB7xVt%u9D(wH>wclU!sMMRt=hMMn2N=dz<{RT|t>fL*^Q2#Hr- zN(`P9g#|ORi*INfF_atxZ{!}s+*8mWNr>7+pu!(53qlb&N(vT)PtZTd3`5=lq3GWv z{(o9Ymu{Nd`a|pHaB6FR5O4G;sMhphbr}sNY&*LX=5k+u-&6DIzCtANM<9@8G=Jd< zo%?<+HgDRc;FaJ8J)GGEDrXfEZc3^Ox+i1W_{_C_0*=t(W@gx2_Yd~5<#okQLROQJ zh#>qKK^U;Nd7suU=f`)krMWJWp6UX(T);c#w)q=;Wud}8oJ2EE5u5vOIoA(7?Bs^9 zG1+l^<}!WY&Qwix^544q10-_%hX6jz*}#Sm+J;AZD7ZoA7HI=P7A6ww6*((OX)ra= zk0+q=9TX;Mx-+7=duY=j{~5tUPT2;zA}t*BbCpBL&kff}-n*7rc#_dw!&lWaonpY; z%%qM_>*^{<$!1!v*8%#CbGUeiXgyEMS(+BDjMXY+M*x1G~m|Pm`0hD*5W=KMIjN!PyI-Khg^JH4j zU&0yu{EEHp1g>`()%C8`#m;4?)7n%_xk5RcElb6s1bX^#O=i}fz0%XfX^BD!OOiJm z4rk#B>6XllPE0~8*qd*^FWjDI>c3dSIKog7@`BG?wgJxp1D;iLxvF1P{R&57Ea>uD zypKP)dH-y8cef8p$mMb#hC+u5M}jPIDgf`2EvUaWBT^x)onz&;E+;^B zfwNtoZ;LLn&FCTp(Z!CGrnbw?OPu~znQG}EQ_aqN%yn4tC0d2M5l|7jMkJw?@9VQS z@|zpH1vkohC}-tLrEFUKey@Y2ptVoW0J9%MCZxY!Etk}?6Yc?fC=&tKW0cziHf>(1 zp=nwcHjAd;WjD*2%}wQ69iGsu#bOnKY}IuG(JU0sLem&Gs+Drh)N9}wPy&P_1Wth+ z$rgrTbnwvXvWJ2JDdcuRA?`Z#gz=rM0qy}}g;zI?Zj$(X6rlhM(FGPa&d$yn*a=3s z6BohIEs}JUVd6N2O+&V=Fc59@*VS({F?R3%@*yqkw#6h|Sa z1*8|{bhhTY9>wT3;Z6rUe|{euW2g?@_OgCi2d#503@PkQ%t(j&NSy);^5bclpeUeq-iN!hSrL{M1=Fm+Kq`Jt>;u%== zWN{WRp^hAGyykEbVW@~@Fa?FFPLcl2`=JbTpNv5-AsD68vuAF2mO1Dp&yHbumI)rg zvv1rN=ZaMbf7hX0zrMK0UBAAvv~>3ig(3gDNXwY~JLcicOnURnhlean}r~I>4-@gcb{~8(DA$nXZ zt681z1tHjPtH{xcH~`cWwwdbAh7@qKW}^flw4KBB{t6YPApVgiv7xF4nE(@`jN=Uj6dRFJBZ)_teee zSy314HptJ{YPALppMoeTazya?qJXq3UQ0a(J}3B64*g_*74E5R9UrTZ{WJ}|UX@u3 zM_X8&xctAJiHW%xLW=rJq&zvkWou#F_^6R&EPTFjD}o!CJq znGEbCJ39*>GyIR4nQ_lj+cUez%*@R9@y^cd4u-*T5;I%2n57o<|5pM#@?_xnDk-bg z>MpKVuipE;SJ+y?@( zuX8<3o<5yicKy23+F$4z^&RSJZgzgRrJy-cfvk>6?jJvR@OabQ9G7cljlXh*)ZegI zV<}J{tM&fn>qB9B|HRIq zwpUU;fm6X1aWuNMv9?xgWr#8PUYIJv8;-5rSTeQ0wliit4W2#iZft4NIfM%^#V5Za zOnab2yZm%3odvYr1W?O_k1hjm6ejO#yxL>sBV08T3(J#JpkmV#6K#aEvxSGo z62rBEymz+TTb!P}N^V5>8{`I&?YB)2#gA53$hioAj+`S$droW1PP0Y-Ec!PUNb{=(elBS%tYKF zesuFAmOwMtW*d9Z#_qvmd(PdSmC>Y&OQEbs8qn>5p>>o3rEQgT>c~!qKD#bh)|j1+ zXH9UQJ?jzpt~J3sIeBEM6Njy$-m=xvX65HC2Hiboe)#axG+<)Wm&{-JwZHb)e&rIr zpDh-F7#AUgj1}t<<;HeVgv|8DjW_-Ai3x#%nWRGe$-nz||L%!^@613JPlL-G@d^>; z+%V)vg~GXWZ+_NFmvEE=4oBc@x&O@9zIL|%V=G-|d^~gN6i+2pRVB(N5~og8*D!Y0 zs-Lyeb!;qVhuORZgv@5!d~knplh~d-&X%yol(IG-#+gZI0DCRn$@I zoubgJwKh`UjV9vj)6?m+cVx^+)YH>bLjg&W0z>Hb_5%7^AyYYci7 zw8o%UZnj3dWS84G>K-@rcKg^+?kC*LFbX2SsQSVSFQ`RqRkW~xQXCZDwB&N9PTklm za;<{&80XIqIT;Fd$S6)u7O!TrS92&p4idm%s|$L)mNzVZe>9425L+2{VV{R&6Jyn6 zl27N(OxPe$gFtF6k40rVm&y}e$4;wbfasFk?xB{QRDKzqvKEV#!_6g78|s)#K?Z;O zexhR~MH2UJnoT_6`CP7LAz#rWE-+!cSW;jpWf=yI3d*t)=A$U2M!L&paatFavUm#J zIcy=>rw^?T3#pWt2apPxk)#>uQp&Lyv$J2$w~V-k+-|93+Qp-2C|kW$ynNn$WWnV= zH&e{ljtsl3^|}?wD6$+xVUSI36@}YHAtQob!CVdVto=R%ef~nHAAz%o#xlint=dxT z_HtzgxAZVWat7(3RO4i)J1o0TW0QK?En#zeMKfVV>*?!p*~~)33aYoBS4JT{D3bH% z=fZqpH(QTzqTL&opFBqYEIfXy(fjw0d-C!iAtOa_*u`81*=BOhA@t5WQDG2GHz?#b z-}`U>?Z3UZnZqjzsYJL6QRdyOb#ASdh%$n98#a+L+EH^k8DXa!VoT_XKVYFnx%xu< zN3%}q!<_@)aLWCq0?)s9dviW9E`-Ojj;K~jqQpTl|R+h z4ZXp>fH~q)y#4)|x8Htyy{wEp+ZQ?TL4qs^To`7RKEf=}@87@M?2uy$cjdVh?k2ql zwP9MiR}=>arJ}gz>85bv#Dq9DX4E-wWL(`iI2ao%ErDxWDrpw0Ro9LY7-*diHNu8G~6{QU@DbNRaBpkL=X4lU^n-+*4IDFc(XqqJJ{db z+1glN-%pQvy}n>i@4z5JlzfI&=L_EcfX#8Z6J1@|*-h;xOIwOMbaujH6F$q-v!8dk zJ+8sA@$rclUsv+^bZTRLb#>|8pDB~iWdl0c;Tokoaq05;fW2BRHi+~jq=osVr7MFG z0r|Z4%jV_UOK!{K)r=`D2sXEW0Hf{eUth{b1dR4an=Nj;2Wj=Qb@~NLU-+q^yZl%# zH&%Mb`#s;|d8Z`Y9r`Kl@AwzMZ2kLE*}2#nD$rfA7K|Y_|wYWox#DK`^rxbvbX-y5q5GMZ@Ddtix$}H zI;nHj^Gek36Qk(lv#gshZf#xstRZhw z)s+?U-|00#If4B84fy4^G_jk73Sd!YtIOu``PSDr*S0^p{b2LSmM(C0(2fQtcqTw$ zCq0V33-)EZ0!v%7&Fhj$2D_TP5H{I7-q8Nd$B$OC^B|~U`<>-1v5n!KF&oK3C8=Gg z9!3+`D3_|agY9jf&(4PiFP;xLO}wEv-3TgQ+JddjX0C36to_WO1&!RVx_maNCi~m~ zyxR&pTbb>&1a1fc>lR1D_UR#;phsb&eoz%`gGVy@R|Z=girYnaDssHQ2z@JX)a6Ma zkckPhM%>ubyXhL8tp=V}l-z?vC)@kC-s+%JI1P#~bf$KDO`$vf}7^LX#oSNGO% zv6_DM)wE`5!s1Ofg{yIVE#ka560*R``{G46$wkppZujx-)-gzk)Y7BHN4sV=*BH`qx>%Ufcx)51bISBIsUI91 zEH8)Q1CGV{9yJC8{I04#c;GoT<#(&qS1(noK40~gDBjW}4DeT=RSSbOed(&t=X>d; zdi~O+Fn{S%z5ZEf^Uubx``c0}_m2c_3T!ov{)gJ-3+4Y1Rqh6U1TvrZ5@*XheSJIb zmz4*1gqPj5i;4F%DvDu>BC$_QGf`ym*jL0)GHV7~U*GP2wrXOyzaoNy3v(m8v(?wH zHqszFyW87)_((x24Zt5^2&Mg+6^Oq?JXYkHdfrbOhDLcKf}Vc!RC#xIWXLJxAu&Hp zQ<^@+MV6|;UZ7bdCy+NjyWI!Lt3%di$MJm>Eb36eT&>k@c86GJ7{s*R^rEL)BwmyN zr;(54JU)yulY4b_gu&<*FwDq5)5ve0XM0yR1H|~)zGpcont#2S{PR!Noa)-Kt!^)q z$?W{Yr-Olwjlkg2Kiq*##`S~F#Z`}IbLs*qO}4 zL?V$YNdqlm$-c%~v>$XJ^B1UtDwsf({eaB$yLTo@SXWF7i@aQW9*JZdU!7 z>h)6T%$dgnx0)_#en}&LDop;^yyehW-LP05KCJ0uXYx!>{Th-We?3h8@_c8ve~fL$ z4DqaO_YKFx^w1YRk^l^@7xP0KqDuN>X3~7iKFH>BM=s=v55rD-x^0Bd4y0-ROn`<86t&kmCdD_T>aOE4cMYWQU%_nKk z-d@kKV-cPw^?F#nu}^|nD1u}kLV$rRBfJSL3T`O%+*ZP@gff)bXgTOkPtT6lqnE0p z-3?j1+b&j1x<2d>bxdzvbPNx_c_jB`9{+rh7%4SfYGFx|y5W9SU_^^-$z8`JSWfG2 z`W91(I2bzclF$nFxa!*=@aR^};}~+w45^<3m|_?x{mH?Qxr0=8ASc(e5+iYKIPUpw zB}^6~`~q1ZGXKbSL%RL``|>3-F<&Axt$y*NUwQ|hl^A)~*z4U3 z9QJO@W=J^A_}6-W6z@+Co|GVU(%1?N46t-q3GfW%jsw7}rPan_>3#CS+i$C#L@(86 zj-~51@~ljW)rTvhI%40B|6q7cq=ePvNCP*;C>eH2iB|An%P}S<@Esxp#un5d<9QUT zS<&*39%=6MsZ$d{^lWeEb9%Nk%VL8`xepU^mmNsb-)SpI5nOBuQ+yE%x+JO-(X72-lRvE<&Zcp9bHT z*&nsQ8;NBf-@E9}+;Q6;)afCT|V%$&^BlYOf zxasuiiPL5RA|-}RC?b!RRif}+U9;YW5>5}TDYGv`_MxU#k~y;QBKEMsdcGc%b^vJ9Io@#0|1w$bGj1ln$P z7VtLbbXAfQqa?kw#Jm?yBrDZ;*e+Z80GW(2jBPD~S>zdu3R7ri&I;%+LuW!Q5#|quhYz$C;`^v1#)45q#q5sDCM!SNuIOv7r?bCEHA32?g}H|3lEID~d(Icgdj z84CG4zTR`i>ts&(<&Bk<#*4q~m%ZrbB*m-<95IuD__PP8;(~X&S*i)N+yI+CgwmFj zqBV=G7Tgfq-v!Phn@n4Q8#hc+pm4iD%lf>aPff)ZY`UU&$p@ixx#S1Rm%gNg1>H=N z$*`zDeym#ukNs#eyNA(!NIrJcgf>-r7Y58_0I2)>?V}eEa8DNdF-7MfpLui`A+?Ak zHLWzIu!(Jd_ld(n3XzuO>6rB^U%CFmg)5`zAdvi|Y4j^!`HFRKdFcth;U2B-F$*Tm zWwqAt?lCKP>C0c!Z#4rG-ey`Ix`T{*+;BfI;zu)Grr!xmn-+z>7C=HMO)a5UH`3J9knkm4T z6OiWqQ|D)1xOR<`jA9!6+sc!>_g&=EOazYo6k_5Ln|Ha~AL5Jg_(AkAx(MM5_dzdg zKBp1J=56|mmIqHVswhf|%|4*Bt=DgPl0nLl&E0#@p2a;KY&H}>m!7v5fb@m!N8Z_< zEHB$^%i=`(?QbO}#Ol=cI~t`l{3&|^cLzsnfBMwE`;V4}f}5Mcq2+(H3z^JrfB&xg zhg^@>yxz6Pt{-wY)9U7o2}>hz%%e2PKPOk;YjK?#<2s*VQY;UBkK%{^MVXQo@7XMa zx8o7g{gg~3AWUdVV#s$jy0*Y-V$(BOu2)V%ARJa+qS*N~7c6lTLQ|OVBSAB9yX8tO z0Zz1BWMek|fNkz{h`Sh%5g~k7Xv86nh+wGoU@yM4w6(ppy`9NGO93w|PM5>$CEJ4| z+pxWtRi#(l*hBz`D&>V%SAcT3ZcVnYNy*nQH6dT_25A^m7 z;uFR&g@b)X^1*&P1!ApF-EY9~;vVD_GvtS{#f<=hg zQw#O<5@_+G4I4jyzEl7TO6NpT$RQLfRB$I#hU8_+tZ|1_DoJj33581IAPLk|1)z2+ z$|jjqD%onSVMO}s>F?ga6kFIhsHou3u_z^p#XpG^;?fr!^869kfQa?7HGD2e{d8lGUbUjl)Fh5PKFnG~CO6^R*nrw<*zTsSd@C9 z<#99;3-=VW+$d*3d!jqhh4@$`;zl;zv z?XsHhJ;*jK5{9itK5zJ-BlViN-Hkx6*F@Q&4ba@A*nW-&P9{_>IvL2^7qH>Z+HU!S7)j4i{+9(xgE`+2MgCcMRWc+MJ1}=3 z;AMuDRtZVVUO%(+8nV$8%*pU;{cxS>st?eTW^`=@gNq|v+wZfhv&$!~tq_$b&1d0$ zbMlt#-6ZQ?@$+s zc<^w)Tw`XtRUR@lM?){>wwqo!-I(+J4o6tIa%E>FY9NGZ4Q|0IIMrf$%Ee_sOb&>t zZ#Wto8}s#g0#5jIh2X`la!7}P8hTN`kizyCyQy5*^5B6<;#uJ(nWx7+gGk7f%Y$Gl zMb|chK2pl>FM~WK3xy0UV{(S*f$HB`E$p=%nL&SAZd8qkn-fg|=6}DixX842RYqaM z)?2#`H&(Av7##HALo`V9oQ?SA<^dau4Z@tz zIZ2A?oQV_HK5~fb?WS(flxLY)-1Hb4%LzqA6V`AIVFm;G++aGnUi_i)r^AwZ(DG2QZ`gp>Q6nLIM z{=-Nu+TDJR(b#o{GGsLN2pc04ibx1Qm|3%GZ}OXTprN%jX8&K?AJ94LR$-9E6oimf z>>NmH_u>6iJ7iO-t@l5~h27;V=k=L;*fRf#0~+F?M<2UKo0|fdsyu4 zW6Jk8&qYoC;-2iy8>K=a1sYr>s>f#-)Ziox8LQRl^GcGDN+x5;T+U)iX>ZyjWFcUs z!qbqh)Zvr2S_efEZJ-KbEXHImEotZPMd^PBA>^e_>CsT}WZfKu9Mf;cs_)0_@|j60 zVMZ_^a#U!_~JZ6Q_fV38i#8It= zI<=yd`h6CWVVY|^rF<2lm>LI*b_`5T!~lTY1%D-;K2yVQ1S!ueShLL%1?9)@VERzm zLZwoVNR$|qP=2nfrhkJ_^4FPnwoXk2Ns1m;Brg*&gXT$Y2p?TiEp{Lwh=`3kVGXQE z2BwM%?;{SQu)S&6jaC3}m|c8=3+=z7{-4y_^Vd4VyX%bx z;ZY!-vcd_}D5VmKeTXh{W!_>d*-Mp@4h*>=iYA-2(I|b+M*6g|(wdL25=vfV^Rd%% zQYKS{mz&J~J_>U8FQ^7pXW1GU`S!f&W&kkE~*WNHM z1CEXj;*R`m@BPWPef_oPmjP>ZDnqQjY=N}8T-Feik6HO_+KOO76a^W7ZFZ~n@j?nH zb5PKgPr=zsyTL$<5dV{tb8SQD9d5<;nr%d$q0m{kNt5T2ciNZ2By77A|w)>mu*&6G~N zR2hNixg&DZs>h!ol>9M5h|;MCnnp33&`5-faHV275}?G!EE`CMSvEAUZ6wRCKVBz= zBXvsZk}O6PQI_h2Hc*jR>nY^wRxfU$;|qC^4|6`gUzdak=B!!!)RqZ;QpuYYR$kA8Cdn|!@soLMk^ zdi(Z#V*7?*WI!F>H~xp)u$)a+5E`7#R(^gn^?Xt@m9c<^xwtOOAKR5o3=-1AjsoCF zqsENGRLm}wFb`7&A_pr6+Mls+{2B|SgVs(E}piRag*EUQ*Bl&oX2P#YHq66YLyzLp-^4xro!ji2pI6(VTE}?agyTB z)|-S6bGgS)-}odRWmW|{oo4(QwRrtuD@S-_q}XgQpq1s%!Abl8^8F!#&RyH6py zv!6jcXFnG`{85zU#|R-*6oDc(V=@^%K9T5&t(~1BWMC01C06u-MPN>53LJB!TW8kE z<|^SVtoJh;@d)3jBR6%sNX)pU5{8kcke-eRA`whNDpwa&Ur$fKrYOzAH46zKb~+$9MZ2L2>%@%#oX-kDUAP@$^6 zL_+?Iys_bMu&DhRIS|<0Wl=lE=vkk^hBP<>|HKUk`$yC;DTGD;4*S=ABG@db3%T}6 zozz~@Oj}zHM+G#k!2Gq`yh+~rjzH*lG*ck3v(o^2lhPBGkxJ`LVzbSeS}(FBG^O<- zxp{NW)OwGl@W0^Q(~RabYTSPJ$A28c)HxF2zVwyXu9JvnKT4=m4^un2xjAy(_!GkH zciwt?RR=+_9vMaO$g+oh4!aYH!8oLdNYvCjWtFpA z@I-AbXCLj9BF@{lZ@%|osnQTYK$NR5UY?oxX1CovS0u2z=Rmu(ZktWQVKvsM&o{?m zW2Vu=!@1V)0-=b6%#*;}Ji*;AITnQyg4pJ$$)pj}+_9983h=Vi#aHk{$-Us8p_uq` zG#Uu7sPT!x(B7W`Um1o}VtpNOsnRp@)EV|xe{9?L7uZ{Btu{T4WA}QOmn|0UOSL)f zTl}A_e@Xii|C{Q+ruMhFfB5DX8-KL%N9okmSIK|FzrToo6;d%ghKHY=6a?+#NMUNz zJ3a!MZDU-x-D#Dv_WW~y!R!6P`02B!U-kK3WuL)EkAj-UGq(CQIV&%n|9CO@+hwOHcN;wotCKV-@YuD^*=L}|E(EV^R z6k60ctb}0>M0Ni8`LmV{F}1cB7DUfZy!TD=9BcGY5X9ByiUa&mdujV z8$w}Eq|Qp7O2iIYE>Qg*7Zy2Xa*_y~A%r|((GwI5PSBjJ%DzCb7ilAhoxSJ*o_q3y zY{KhKr3lugoQmyjwp0Id$NN4jdymf^7+^dIJW{L&ePUftLydHJxV?`on^m#VLXn3> z0JDbk^9Fb)-sU8Cdict%&f9uKrQzF=?fUbCLI{-Iu< zMIt#c2yw!3nu!vy4T8zx@n~J`K1TqVKxV&WZH{zsW5L0e6^tx3F>C^r+%q$7ayu>! zb5DQq7x`gxmLa)`4VxDGocdrZU4@lGEsev7PqZbq2f|XoULfXlG%Q5ZW>V0c4X-zs zGnd!P=3LI}Z8%OlG-okcuP2KZk~6t@-et;RcsMKZnAubn-D1^bj>RkKt+YnExDDBS zbJKA)EnNn)A&!qoPxaEW_Ggauq0AD;=Efwfp^~iK@j2Hf0X&bu)RGiZaseQy~jy&0bO4pDlB`{Ikjf;^aHEh?=jVCC+7^+n@)EYwG))QUTjiw z1C#9W+=*4gXc%nOXdJB?m)cfE0k_xJnm>oJMB2ePeG4nrc79GcNXB;)VIi>_PaZ^+ zB+7|`ZYAdfj~?BD@`Ro52Ds^yXA3Tbq+p;o?CK2!C8)}}s?o8yXyuzu#130C%jb1F z^3BapGxxb5MWK2JJEf8Z%HV{nQhHhyd(&nwZCKG5bX2&LZAdHiEr-oh8&_;Wjx3xn2`PbpcTW} zN{i5{6{u!68G4m7nR}VujWa|c;^AepYVQkr>~1$XZj@7NPoCa}y69ev`p=$ArSmmW zbue^!@2SDQzO^ip%hnZGfhcv&KGhe1{HU~t=MN1k@S3+)sx@S{Yv_4xCbefL0Sjkn zWD-;K#HDlz8J+egKK5JDOxJAGT*Pl(na%!ANs(;#aP(65{j$9g1A84GF9W7QOremGFpS{x`@C5o(JIgyM zZJw(Van4j&y|r36>lgjZNvnyJAQ2(fxz4T(k&v+#7ini)q`l2WZf+iKAnY9;?y%3p z%}uH~IAU-nhd#ER2hR@m7LBJ}!v zJ?zsrFksXRX@pF^Sj=bGRiSQZD)(R^&vAlGDa?^M>zVTrC&yz~8;kDug!~Q@XAo9a z!$_nM42#8Jp9$!|q@i;N!&XJH46~~tDT}hYUBO_bl!+BmhtUt;zkNI6EbTnnK4{o% z3lF!;4NDzOq&?4e8NFlqwYH^uy#d(yq8eUo(mj!}fsh~E=W62q3^&hN@#>-Q!a&YTE~*(|kKsP@f| z|LVpXUnm$ho56lP>BA`h)I3Yizr@LXU}m-q(njJ@GRNj}w;z~RSzCW$bM)xjc~kz| z&g%IupRa0v;Thh1V7tSccTQde50Ok~5*7`-qcG&zTd8SsK3_1oTuMQU@UgtbJ9qSk zgT3LlJ6w=_|0+70pEzHZfPOOa%gh%?1#JUm?Vwm-B8V3Ko)^Va?S{+XHn{oA+UtwXqtAEJRd#BM7`B25PZFv3iL zeefN=DXo3<(Hhdiw?OpG6HmI`3(@F;yP3s2eAEF*H5|jYqcq(ex>ow&gN4G?tBUEg z7AEE}Q6UV*(%0DDrgTRO^Ln9B4O8qJj&pFd<_)0n4vk1*BF%T5%6RnbOvhi6qUglQ z#6@}{L5tg)n_Dr?o=Dg=nZh_H%adwE!LHm*coU^fpt#RuDnkSqi`A*BjzjN`6Y>K@ zRp(}zi=a!Fv)PDrAK`(`8s?+X|NNh|E(G4Vy0M{}D-7zD2a+ib*`OerL(tc_V3)}` zk%qmnupnt~m<568Wfn>xk~h{%9GGJmz~rSqun}u(+Bh4GD^2S{r>)U&;8Q8AY=FVo z$Oi)XHC(J^1A#1(QY6tN6RxJ~`G^xpnHnH-=g<3u;x0faKHtZzHn9&N6~qC=#!2}D zyaKxh5Q1)ZkbSzm%gb$goMrSl+os34+&k|8&~)$KgG^ZEMZ>668^m_@{P~ET;~^9| z+}jNXJQf)o{Wp8v?!?*(LcCImv(MFp+r3e+_aQiqu*Gn)D|=yMX^C{m>BIMKf;QVho3mvrwlZ5;**ev0`sT6CB(u{yG4l>>mpli|#uH;8#bmbc-W>?XKG$ripyQ$+}P?_MM zBSZjs92%-2JbrAqg9GTcyYEQsMn=MPWMt0T60tEPEQ?2yJBDq&e}B#jA)7%dnrfr3 z@8IBnLt5wBGo_Q(ulY4$?$`Vp2;aiO*RQ?y>en?l3=m7X{QA1x&SJIEsFun{Y5)Dd zALjo4-zQ%*{+RJ~?(JV{O5fZNJl754a;>fP^hBeiRwEp*wXC2BMLd=c9_9Ae=}*1J zWPM@!+E3w|=B?Ih)k2}2Dzg;xrmS%XQpa{~qa7QCR@>GpzwoV}uVk)V$#i6_ z&xma8tp?TW*IxcYeROegRI@XYH@KbV-~Rrik<`?NV z0%x%f{8{yTt~BDIb7E-3zMen!mXCPU+p&N9cG&#Rzm08-jBK!|c{@X>P^{IQ&XYsQ z`D53^=GT7I;kb}ov|?p`$*RrG4xx%@EW@4>&73Kf1%li zx;&pGJc!pEi?y{y*-!;7)*8yrcT%Ws$UhREPnYXzX<%*9Q}zef04XF{)XnIgbk%N z45cWB5{49wVkl|dqe2!4|L!~QX0z>4QEZM1*&wx7UwifP-c9x#lPW2GUYDb=o5fSQPrQS+8lL0H2L`q@=ha|g(K@w7wx+C$h2T|U zwH|wvXY`O7Mi@+87@za%!1A)K)<_KW#twTmjdI*KRq_L6UhA?*XwSse z)i7OMowv67xkLOqGxA)^HL8_1m(dL@qX$?9ENb3XYoT&Q=QB%&=56Ki_P8D^*!RQgnlMYZ&CPlH7AK6RH^+Qqo9R)3+wx(F zljX3WCSuv#RvT6_{tw)-j&0C{6Z(B3?8Sd%)aq8_Ai2u%8??kQ}e~LsjcaE`7 z`Oex?V(e47lgY39bzzFgz4rR`*GPoC!Jao5^F%s}4#$|MHt!T66p@fulV?s(Cu4UX zZyg-&uid|S_tE-JG@UDE4_6i*FYg|fnT_g$<-=U11ZC##@}v8YcjD>9;nv#I+c(~S z|EBh8i-yNy$xMtL*Pcm1znMrLUqja!Hw3t1_p_TJH^k(mwG4tCA7q}8$kxy?RPldkM!n%AqiUfPM3J96hcgd!4h?acX1 zN?+SfWb*N~#Rrd`Z0sE5D)kb8EE~J=bioi5T1Xtk;qHi-9WJNpc(8Ea;a)Oo#cV29 zRcs?>K`&$u_Rx+s&d^hbduz*2kZUQI*j`&%xPR-`?aT%38f&#KwQ%=!@|o*=&7fR! zp2Pjnh0`PbOm{reRv!EC#nZm_9x0Wv`wRAfE?iq%>ivQ5pMXEm@u2{Oi5>_qO;(## zfTSGFRw|V%rF85NB1gEo+1h-1XJ=w~bmzgs%Erd##^zo!GXhJrH1@)|g3dALgv_qM zWU~1Kez!N!+uz^YHvl!lHLTIh?(X!kAF2`W;3-_68umT+`s}G8zrV>ZFfYq+I?VHY zVdQWNt{!&cWqc{MuS>Wt9&WSiM3K2iIN4K9o8!Tg2lp11cMcMTaP=P0S=o*CK6=Jn?r@gqk=9$!4T_O-9s{r-{Du)YJWxVF2$ zJ$C)&7hZnll@~8xnz?l8+{D=UTug-Jzs7pR`8@ltQU@3K8Regd3Z~!5a%dNS%T$lp{FMnJKTC2IHMV=`CL|#WMVWSUX&8aEY=S;clWlo_Y*~GVnAW1T5kwau~62_DNquqk~a_h zv3M+=f{9B8Xu}dTSJ|q>+$lh^!cY!WSL07Iffm41p>irMX!|0qoY=knushZ zSg$3K$-(`24SO8qjYmU*P=dUu1gtfRktihW&9&qvL>Kfde zZ$krha0ovcP*fTE;mV55CiA3GuN4!~DD+a>8|yH}e!770@b1s-pBkIk-_l+!$99(5 z7^Ds!X{C8xuC}JfXs@FUTk1fVtRY-aH4#;vHTZY5ZL?-Wm&EvQV84wLF4k?HxBq zv|K*9eqAW{1)Vn4?jJopKIn5=MGos#pufkbN*wsSGO@auUbX~uMn*TeY__GPI2y$2 zQ1omvldsJVi*|1i=H8VWRV>b)!O=daNmNv~A5{GO*~zo%Z0amH4J_?$y# z^;+YlcNJZZwFO*q=m9&+ghlUesiYKzjugv<vlkLcG0hB#eZ63kYBa^}o zJI0Z$Zs({CB)i9})xNP;baCKSJGG%bRLV%3R_>nmd+Ih=jas3IKXAcK*yjkHunXBx74o){@oimc!LM znvBLXd!tTMqb!eIF*9Z&Qz?5;phkM<>60f30CoGgMzLf_oJ(@}or1wDp|dlmLiUBl z@BI8P-N}~1G-wO^9_-|&LbMoPe(=DM?L#lVaQSr5-q_P#&Zc40luE3uF$Ka#qNEeE zD=<8|aO?dK>a|8gy7A=kZvOE*Z&mE4&zu{qZ^dA{yp`op0*8RSMVNtFETjf{P^;;c zie9f*i`k#}zF~`O@p{5EQw{qro*r9?72%iR(u}!q2><^dt-v3orz5dzOJuCq;F#^& z>mPlT%LRk4zm6uV5#i5S7t$pv^sTov>ahH2()LpG7xCs_W^|)2!*S=Mcu@iq z;Va6_PJeJ_5P!J}Kv+B5eh;Z-)^Hrxdb*fmPRW-(TEX8^rD(+)eY|*x`N1H?0S239 z#~^N343ooZ)QP0jbNe3lQmOG)g8e3KIw3r$N@ieEOy%U(fp$#? ziJUp_rb*UTIp~6u(MPwI(RcA;L$Rrr4{k&aB{V)UIXTjAQ7|xjr-B$X7@kq&oundj zX5`ehYhEvq6I0i(Uq93D7HVK9O4$ll=xWvAnbmT&n!vcO5GU z@e!wyK_(f)IXZ3_yrKOC&(pm!kwYkANFtTJr%#DN7=@r=vl};UBnyuoi7+wdU#{1Y zQqx^y(>V+>fQlO#2zIF7?E(>+ldT5F64{m2Y|Rdwti6_9TghhYHRk9MPclc3C}}dF*;Zx0eufgBlKp?x-hs6@@e{ z%3EG}`g%{6zLR>h2EE;7=LHJASe-jSL+}UuiIQt(RMnyGqS>3hX^DupkQt zmEcKB_v)JSsIWD?UCxddZbU--<>jQ|%Qs1P(;GglU zAxA!1;z*3rSfNxZ6fKq_i+F_6Z{o2(LrBMu;^bhBj91 z9%lW`B53@fT|ESD?*zsm0j*@tt<9hC1Hgo}0825UEZ*tHCHfBz{44^O2>>^cwT=oA+JLB^J`!67V9rp2|M$+e-!Vg9&92L>*QZBUOwE@ zC`F&%_(dGb@QXK|MoW#xJ#fCj<*hwkymwDKWsr>xT?b7zAb$YKEEJel$)KP>)Tosq zvMARKSW+1^ElhqyBY!hY`}@N^9+H34Z1qd_w%6vCu1OWbHjTNoc))kZ7^f-JZH zYFM3FoC{OPHF-e*So7%Wjcz|WnmRG@^rO#rOSkkGZF`ui`87B!(TB zR0W0*Uw!y4%b0$WR6C*T0S+K+9hjKl7P+2jbGf%{n%3qlNRAw*$IgVa8i$7#pK8QP zDpgByJcC4u&son(*_u;6A;S&ZH_7Jd#?z;b;=-;{Qg#-!`DT%O%KPU1Qje;I?Uc~N zyw6uKd1=8^Fg$pI6+2sZO3qqVZui1#XxZz7#Oon#;?fQ+lHhT`;W7fJ6ns~Z9;4W@EQ+?({gmaR!9ye)uyX*??MkdpTWhN%X>ak3$z9%FE!5!1@ z#FUl8N_IuxUWt(ySs`29RzG|q>2gPiS>u?ip*Jb4^bzN0c||FgBc!Hr=r!C&{~@06 zB0Sii%k^_AgnlYVtC@Ime9%ra%ub5hhDPIu6{^h%l0mp9hRqnfVa5mE(^V9B!ek%>_G0COi6aBr;`6Dlz zzhMygg#kzMPDbr#K5A4_*v2jZkXL*9cH*2pZNKQqxU|18khz<3u-j@M9_wp8W>32= zrthWg&Wz)NHaI}Ic4%(2g|=hS<1kQ#)uZTeh&q*^X)%RHMnWcbts9cT;y~-?YMR|M z7gzU6cn0^6o@uq=ZzdFxkW0Z-D#-DY<>9SG2yT6o;8y%jhYeN6vw9_aI6OJ1=uz-E zk2iLcd2nf|Tuqzva->|yt-}q`(`1cz_yazt!)4|oo>~JtF?K#&pM@(VlZhli2aWkl zHASgqa(eaR#bHzV-~oKv-P+;A26Jje1x`}c`w!Q10`o3@woho19j;zx*~qFbbP7#= zs?TL6>7CWhWWLgfc#LYX5L-s6qQwTR68n4H4pp2#mW8kr493iL-fXV%W|dXPhC!0a zPEYx{>JHx9sdBE#scfdoX;wC0SR|Aq4I|ga&rK&{xyGDre?KK! zeUq$}DMn00F$55n{e6h(TrfROrFwe6pe?bo*BF+4ruOLed+&YtBwjG!Q#lsRfS4ml z7R)Ztc{oaAR>xD9E?yWmSF@`NlHDbiH3*Hw+};NB61NH2s~#BuW0n;y7F{R2#cL7- zpHC31-u}}N8%+-M1)uSe{6fb^GDb0fuy+aH2otBLd!G*)Yht-3wfS5 zBzA~r*)~fZjyL#hHcgJtLH)Iakh2bU3fk!Kkg86NjUx=WKxb0%vooV|Et5omA5~R7 z%;pa_DOFX?e!oH_N%625fFVl^Ed-fR)7jgEgBf2}+05|f?tbt=o!r*WuCFsQnC)HY zM<7FHm6F-%QcpI^yeV{Q`pm_dS1tqs;{&~umzn8|X6d(*S~-*4-^Wm>g;Ae~zr3@s za1X7voG4Y$&Xn%&7o7kJhDrN;$g->7~;)l`enm*`XzzP%*-8e@7CipL^KQpF&bF2 z6^mkhp}ugJ<3oFa-4@FHcjMXLgY^6DCX3P_<>;O#U?$9_zrhnZ5Q;~O#Hrd%VR!o{ zy)F>i`DyO5-)nb(f+LF9aYG_|m|(LeQT6+SUMrJ5!n#am$55^99)iQh^sK=dn^Lb6 z(H0m5S|T7hBuV6re024}14?UIqru7c=1+FXfpv}6vz?!`%VIgfjAG)3L7_K*8mJd+ z28LNf6s2-}3zR2e7+kel2@2IStnyxrHE%-UQ#S`(vh9ATG#8J_=Dt&tHy z3^O~CFfrx^K&2~0!~pFH^mqu9+$4#EdG4zpY(=*Z>hJ|pNaiDizQI{t*0BFUjKE3! zITw5MeuB6!oIB$o@rMtzH<=jFXndou-e`7tDwC2Oy{KWYV+&Q=PL%9+M-dWp=CxX2 zUaX-9!(WTg@@1Vk#38#wR+3*|Tg?#WoS(U_U1N;G@Nl~pQ*G>@+h!w@KZxMYW{G~V zzaQNPjGTW6w}>F9LYN1Nz!j#A+MN68S{#NqK>imdh9DyC86LKRT1ZzAE@#sb3G3<2 zn>NP@T&7a&+XkO8!NBnUAdLUqy>s_8r55vJhCilL8aab*33Jom?wm(t?LGq{%q%7{)t6%-^%E=c$=_)q=PU*WQeRjGb{psas3xz9jI~Jq(6+a$Os&Xs+l{PjKy-< zd)Z>iXxt@oD~w~v2=GGPxKq`#v}Ca^FIz3;vPJtQTdh^=7r*8yo*qdJo6Wl|6 zlt0||uQ0B%V6~~%(HAaVIptUNs)^n4ow|JGm6?!Q+j+F`aI?y`Xf(`RW0;N1!gn(h zXGyiv(CiN$t!!p}=Pz8uidf!Wc&LrnYs`C$D3?}m-T3z798@Hp{(z}gS-*Yz?s{4F zOuhKh%jW{JHqPYF4TBQuoce~MMNTMJ?ogfJ!^K4>>7LXE)SksxTtOh|d zQh>lY-}G`s(OI;ry`gmWoy>NRqeN$rBFw~?({z_X!L$fzc&%of%r zR`FUDjiBV>JD|7g@p9PvbU&U!=IJ;b9g}i=9rt(Qx$wx-z2p0*dOb{3Vew%5$JsqW z#`k;d90wJKYHBc*gwqa{9H?gV5EEB`F_mEwtkU#Z4EVyHCNo@|@SU4CPuS^@v^Gb)h+R8>(0nT>vqHR_PY`%yj#6b>%x9CnYi}Xy0U1(1ePgo(DSWZ*;CYp?7vvZ~zVWmVF z_dwE`s4;T+^2v9hXWZP}ZREZET38kyKU{D~dnwJ7DV4^?22JP8JGiZ%I(shRzUtCW z)J5i{58nNNc?;B@#UYz&4gHntuUxz+idq*Ex%+L0!?VA=Gw3TC8mWb$-8kh4RnnR% z7Tfg%Lr)qbb!Mj{VFRB0FyTHv;Smx2VmX`s*FWjN(f9VB{MVUtnw6eCdw6*69DVR0 z5P+q&)kvxr?iJj`UATKegU~su?EBGwv5j(Ai^W8u2`O~B%w|Kgn#RxFeq1mLkMEuxR~jcU!2=$L&1x|VGA(2V zCIWh97bc95>6%O%dz@<9da4bKpPo8>dVGBB)Oq-0S4(xlWRZA*RC4f4Je6LxYj#@K zL4Rt3ZD71XL`4Z(IgzX852Fq%SB+At4RDo0D!O|6!|y)W+)TjiC@;AO&R)23=9J6I zOMO%JXWBc6N}3bzzwg=E@!X8ZZ)zO3GO6**EKidq(h})QaQ*c!5 zH#R-yvu)cRJrGUO17|{Z1$N`a&E``x!}<|7j!1}t1s-nPRZLo*S%yUD(zvE9T)(a; z3*@DjG=2}{B0?|R)joczAF>o7ZR{=df+;6UWLzx2J^em;UkvS$3*>HhKI1l9p)fuZ zwK0cUi3GL)OLNKx1_;;(?--k!eET+~7cY*E%{@P#gt>1=-4O#(GESC6<@&-)O?c8;z?pz>YOuDe?0oiT;a~br5wV@XosWlc* z?eg?=`8v@A$9Jz>{E&fK4>V`qn(@wjwWTgo0jZb6x(;h%{0gsrUESHEE4M6^~;jmTm|)s_(p0 z)uid#O|N%r>m-d$Aq_KPw+|3HzTBKHvjP^nwY9lf@$LmS6ma9Em&ljCbTVI;V}%}q zE0c^HhQ0harAfuwYsys^bWwm?cHe(h8UMb)I*l`Ge-i6Snh zZ*HNeC*LqFn1bA91u1e@oRdmglk~69eg7*K+|mDQ@~v&RcGBC_Qzn{cl61|)t;Aw0 z+(a-q0gBC}2tv~>zsWlRL9ZA4CGMohsByo4oIumNJZF0HWMH5?F!1Dwp(#u~$L585 z&gAt*qm5|P>owZ)cVFjZJ|~X}Es7)Ot*iHlxN1E&V!bbk4opzo&MjDmriaAo+`_tb zsF~*n$n!(SyGVStM1aVnrEJ}1tyZ#}V3i7mvc+61=aqUnZ!nQo!i$Re765$qy8Cs|sznVo@yRe9>H1l}1jNZS_)4wVd8il}bL#n^+-;Y~%Ae3CWlWEz9LRD2=KV zkg3$jRzxc(R-V{2e@*8J;1m!8m_=g9R#lLy1}{tDYi5%Q>MJsrSiHpq08qmazzjmV z%S&}$0=HKyl_*!w*CmOsS4#zhl42bYB@x#1HA1CIg~^g@+BFqP*90P{%+H%>YH+m% zry@mcc7=M?tWtxR>mtRwirFI64H+5bi&c)6i-j5|OPpLa!aYUgP~#cr*UFX{f>ES__dceMs1Kv;k2PdRm%u`3xCj_%;{G=3UPbUR>a3TeEBtJ`lDMX477rK-i`b)>UZBHA43SZU5`S9o5BKuPC$#ctOuKv!5)p41C@n@yRs7V6mA z$<0_V6xvj1vUOsgMP<$kJBPTbkZ2IJ4_^naK-KqjTd`DcH0q_I%}QufJKuiNT7xCF z+1#|=k!5PFa~7wCQ)N_MmesBk`DX=Dv6-Z>In?XGwBs1kB#foM$Y}v6jJ-e>`FsrC zisnJUUPOY?asU7$YGCt`FO&%<2&7TdL4d4sLkrZZwGy7J*Cm$=sBj-r@H!kavm1M! z_mh1$^M0bnPFVa~v7jYSt{F%QNPWVgCM_-H^MH7^-?-E{ zjf+$5H9*igMsqovRnMf@zOmNO{8q_GW`IURM_Ft}gA}U<0j;!ZLOr@C@L@+8KbHAQ z$rWVhd^;sx^Y3T!4ktV7LJ_JJi6_vNRr0a@{gd`XRv&`jx|K-6sYNQA&w&lDaGKX8 zp?$duF)6iT3O^kjs8+0CUZ%Fk#@>$h_Ie?GVjE0>YF@no9-5A)JQi~ zXlg z#=^oz-i&COni{m=E5jaP%twT#>)tR(UBtw&VJ&3T++VO$bRgG08;XGfwf`R&XuC!L z004La49P=a9#9Yj;F3JM z6;K#LUsp*GWl-NXLKEA}k7$7&wiia&F_>m&V7Xn1wRSyr*j>11AK-<3g?IJ?3hgia z107{;c~-VnS}Za&6FA9E=Qnow|#k}$Dp3+ zndet}1?i36gZiqkHd2u`N>ToeQLIf;lFd*Cf&m5y2FeEh*Gv{idjmlbZLyh|nXf(@ zLU43nI1b}yHZzH(_8Y^hdTNK>Qt1{im>}sGx`rMoRhk{oPD|O@?6L}_R9?xhOUyEQ z{%6YUCjE!$SG+j(5|%BzRE(#5S_BOz@q`$Xzeg=9ysD$#)y;@93Pc7kc6HCobmsVj zTW{0dlRw~D6|6G2{uME1bb2OwAP8|D52~;`Itn58PdBKBdc>{7OvEetN9q#1eKxa` z{zwf~u#Qs6X<`L;Ds618BYNo0CYtIXnMS3~6F=uZXcB&?@DCMyu}TB!HqpaWd`Gnh z)QWr5ekHJHTZuRQUT6FTzm9YIC$YgFbt?WSo3*px#@V6|Rh&3MnR2)-^dYi*r5=0F zqxR_-XW8!&?n$h@qub1nlM%|?(>GC*DM8#gO8o*2P>%Xn><@aU!<_mEUJW<6G@*ZE} zeszlc9oIUAF5@3%orF913jaB=g5HGe>)#f!N9A|{Op^t0Tt^ayzki;!Cq1op*H0@5 znNeImGt11(%uXT*Gcz+YGc$8yI%ej}F*ECCTJo#xRQGhhrmt#x5fIbKt%}U5S*&C`i`mKh zY~n-q`uhERk$3qr-)0}*<>!2fUrKyWk(Tf`eNR8r4E@`mMQ)@!PK(_M?gU-s9(GUY zYWI|TS~t4q+)KLIz2&~4JKVS2clEOSzWb$KcYlqX_C&p-{`zV(F#5DU#(jcO#wcTy zG0GTaj507J%F3+9gM6DFziG#0zg0_NWfjqN!SXNLpobm3=>|ZQWZjnJQ>HPlJf7qE*YaN~^U-Yqee*v{75MRok>(yR=(J zt4;0d(CIouXX-4St#fp~F4kqbTvzByU90PLgKpGKx>dL7cHN=7bhqx&{dzzT>LER> z$Muw+(X)C>@9I6huMhN*_Up6yvc96P>TCMCzCmm5cu)b9vD+m6M|rMnP`m0&NPl<&)K^Q|+7Yd$33D%G{lL z8T2IBy$5o8a^EfgRqngtb~7M|z7F~!=vPp6qo4C+?&bU}2vX5ru`S!_?JQ)^_A(Om zFBgYAcc}MgVC=5Wjr6^&KGYFuR&;gz&5B*Ya(m*>+qWU%e}h@k)x;HZfI;@gqb*`q z`r36CIXvBl`tDs#{RZ>v-JZ%nVHRXBHLD@b8E~%oY0rV?x41nO-CMrceVbzOQnM1` z;xM4aa=QImV1)UN?%QP}iet@6C|3Rt`{r}z0b?y^NvNs(DbQ;E*mUl+ZVroo2uwGB zpi6ScR=()1A-J+{Tkhm;A& zWxj)!K;OVOjMK<6$d29{Dj}>bNo)~=o|bl^O;N!gnpqvSQddt5Mc*XU&ng5HMppf6=t590n(@~=A1c_;D+sC z2boWHkkm0RlGlk;_ac8}IE&{=1?Q8(G&_e&*g4^r1I$ITb{LT+qP|co^6}gw(a|_ZQHiGYwGkWzgpDS^{;j(-EnuY@E5_L zvRkd!G2BlSv;?NcIQHM2(}lZ(@(ke_K0Z@;o{!HG9u)pENJ+_T;ep`+OL<_9Wtdx~ zGEa%BMV#C_i$N-Ps`V;ef6VWIg%Y_p`~`K(3eNK_w@YpYKuerg&qo#|k*|wHxp}~1 z$NbXPack-^8yRXNcjbl<@;9HeOmZfH@^ax0Hs`|B$R>1hvOb+Yo7PmfwkFZS!2t&0Js#T;{QuP)pl zlv^ch8r-5;%_S?HlzLT#upc|~687==+IynEaO_T86AOFgTD=)Q7Iup6P_Je5H|w1i zh zGHi-f6}%*>URC$G)W0CPWt=r>EeoohM!6tGpeGN>IK$X@8zxB?g)^<&1w@+v3G1D^J(s^GOP2=?S)|(zY zMj`9!t**VYWm3<{z=0SSalK0a4rr_U&*o&FaGuZUBstrFzKKS1mH_>P7XbxyuEUm@ zF|JHB1As%KX=VHOtIQ(xevsKGd*U(3Z1LU@H!d69lUbnNrc8(A1z-+ItsUIFX9A$( zai?-;!Vp}jd#g5e(^oqWRI@)u>m8E*Oub&|+pSk&y$R`;)Ekz*I9VUfEW}`>Ejd}i z25=q(%Sg^hZ9CR!KqqOTfp4+1o(k8OZqDs&bHpMciM=@;dXoadFd67X%|dOrRgU8$dH$@ddx7})xbe)rVIFo8K3Ojsl!%V35B%UMks-?tWV9v6_~ zNuH&KF{X?<_I>g#8k+uQFpb6){fuuJ1Y4Df20F{w$_P% za2lQE71*CUc#u)1+~k>JTA6;#w__N>Rx`{DXPX&m#<0VTH{;o3CYvej#mG19em*H> zCR4&1o?yjNrrAk+PD$%#)|9Ye=1>XyMM?WdNjtlw&5_!DeNIOh^zb`;Y>eglp2rDi zoQL(yPkiKuvE!#b|H!iZ5}+$S*)sfC@>_e=c*(k$hN_w%s)?fN;#HGG^@-=7NId2F zr^3}d|IG67yJ-lsWH;3(Ag!nG`_{_j+?C6@%gVW{A?L1+oV&Vu;zFKrp8~-c;Eyph zVuV@``*()575qhQ2j4@@(&=iK>!(#D{r-iFsG(!?0r2x=UWH!(et8r>0Q^ey{}a9u z_>J(qV2#e(Z!N>`r1V#!`Umi9;lBv~0{Fe~pM?(rf3RFm9z%qYnW~SWDKiK#VZoj} zFwP?d)YiWZfwmaa0lA<1S#K(}FZ0~YvLTh+0e_5fW|S(FiyWmB8C7)BF%-n08L_iyaI@PX0k^0EkiBYn-Ps|&Jg|H$1)7iem$o8 z2BPmRrGb>XS{n+dysD9?y2gA1y=Y^8004LajM4*a1qmF);hFzF)#jmWjHd#D@07ChilML(X8CnsMvy+?6BNi) zCucXqQPb0Ni#TEZrO9cWHoMUVlQ?H~VR{yq{AaKFLvL_<+rrY!Jnq?aqxtpm$flc? zmE$S30cdr=0gZk)A5g#(Hh#*~6Rao$~JHy&!Nw;JUzLf%if@AtfO_p`Os>(6Z10 zIKNy=+Yi&Y4-ernJcZ}*5?;ewcn=@p3w(ngX!J3ZcQBH%Ok^sTX9javz!Fxlh7D|C z4~ICxRk=3T=PZ}F6?fon+>871ARfkJcmhx189a{{@iJb;8+eQEb`KxmBYc9-@CClY zH~0=e;1~SP%mNl^@s?_7mSaU$W>r>aP1a^z)@MUDW-HpNwx+FXGq$14+M;b{TiJHD zlkH}EfgA^MupA?ixn0Wchh!?g~QBjiYFklkeuIZF1Fy<~6MMLd|2Pn$IdYEMPU;U@T;fTEtqln00Ci>(x>=fNYlz>69)Q z9%i>zkMv3(3{SCNt5KSy8OBVuXthd~OvnI;A3=I$P=;h!Mr2gR;F#ZH_$~B3TdW#l zacZc=t6`R)hFhWCsD@cV@f|!QEk9aJH<&ljX&AuVGtu&6{}%&tbui~K4!5c zw#TkG5GUY7oP?8c3QomoI2~u;Oq_*_a5b*M9qvE;r?$!g# znBzWTHiZ&*E^X+}YPNeuC;GcHy&24CCfi?RTIt>WJFr>=)<}W1$^siO3ic0SgJ?@v zS+XqbvQV4cyKU*+Ce5$b>fMv5ZZsLj=n3ZD9j418gejp>6$V}$5R6{95T}2He3moBCbQf{vdG&1MQbb4S>ry%X6Gmy*9#3M(H{tRb4(<8$#o#W9z)m`>}OC;VWH38!gb5psOjQ_w_{8PB&ACoQt|AswnD;^nY_@ z%IT`Wa$QFj9yg@E+?1-lCFOi;V7YFOYPaZ)z%t$C_^Ipf#?k5WsO4JZQErTm+!ph? zGbR;%VK5^Z&s05>eD4jP`;Z>h{o(UK_&ive?!!ox7+qsuF3=*a&`S5&GiF)zOg;_$ zu5anGRy)o!alDtup_TmLkXKOiANjP9@5=!>x#;PdtGJqLxR&dukMku#L9KHrp24YTInP zR%?ycYMs_=gEnfDHfN)<(b>$naFa^+ZDL%tt+@;K(EnVkAM>|q_d66f$1hH+s)k~i zRbX_-=m;S-Cwb&AO15&HSjbnQS&-Ajb+H|`)BJ}~h&^~OE&l>0;q(`H0Zodv6#_v3 zME~sKZaErW0hBHOz6o*a=wfh8txO1xk3- zY0zT8h7&#lkeI+XTdpn#jM^nasUV(f%*)S z000000RR91000313BUlr0M%91RqCtis{jB101V9x%^8{*nkHr@W-~K0Ge7`90002Q CLkb=M literal 0 HcmV?d00001 diff --git a/frontend/src/app/fonts/GeistVF.woff b/frontend/src/app/fonts/GeistVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b62daacff96dad6584e71cd962051b82957c313 GIT binary patch literal 66268 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 >-Aun5A4Gp>4U0IQJ zJSDj%uq;_-j;8!z8*BN3#G5`ojMF>mZtK$CmJZ>LZBP#+{!QxI(n!6=j?D+5s8yl| zCqq%@Li|olF66yc&uRtqxK_{9<1Bz%WM|3)$GtRZvu6gM<72a@tfd#+V6(pWfBD**uQxR;owP8FIttM>^4T=+ zFYN&$EludBGthdY*q;-P4l)cZvz=S2KfBDRiZdk$T!jv@&mB^%V^Q1_xXKs?qV=+O z7JK9WX_6hj5rQ5#_#XZR<>aHdT&e4ifAZwWse0~aHapMWG&cBWv{?RZ`hEHB@_nuF zy}fbqt#tNX)bur{>6ftehFiZkNd>Ryw`lrJv#{N3PTAXz)`CuJPCB~geMIozQlm#$5l!D;X zfUQ1!IFD;IjI^b*Mkgk>MUhTnv4a>qY7RRms)c0?WH-vw-S9;aXwyNe7Ta*5``;;g^I(Vd`+I0u7da=e}#F;{J_6W$C;2b`UBI+E~4_A_HQQ5 zEQ&p-|FvZ}rahkr&RN0U9c#S3P4p`5%G$~Q1Gow$7~C7M`U(n zH^FiFC6R_ryR#`dH%S4ZDE#M*I!7-^?m}M>oyQ08|KKpz^j+15&QmYy$Q`n%QO3zYhIp< zL@=uru9zHQ&p+^Mf`TE$N6+X3DXHLFHM7ULndU-NzDCgbzO@DRYM`}{g9Ucx2d0wT zg|vXtmgY(G{#9P|@KChWPlr8W`g(H1hNk~a>J&0B02gHsTNjj>*_i%Cgna)s>-q)} zxaIxqdlH*u{aqw9fqCww89ikAvHf?Q$#we#8Dn1}a=W$}OpqPy5^-&9Avuoir=($k?pgH2#cR*9FeVS_gLRc7U0k+2y92<1`CP zAP|x#R&QbPF}jnpTfaTSa3cH#v3D)=rS=>G23m#FFV*t7k4bvAKuVE8{3!#`2WN3wo)f6L0KwAkO>ECG`!KDm9U&Aj#-xeF?-Sk^#N4MY2 zU*K+D^9rFIH3hnht<#=H3WI*w_w%358;ibQ@gDcbe2?DO{khi%(YMbMP~(*oqXD#| zcd^%2_HY!2T)|3<7?dgI2@9=B zrQ>K)@X=?cYYwfUkafI;oV=Cl_)4^L)F~LK{e60f@)nUL_9PX7=P} z4(!MF^v4eT3Q6*RSm+w(M0qf7p-4!W{W=i;s*Nsw$amYf+IzTPq>erZZ$br>9Ku&G# zQ>k{y#@X0ocWW8vySn!eNXe`O3Y%_3`aNctsL8LKLf? z?6Zw>jM~rIAuZvY#F}!9x!2wyPHmY$t9Fb&-`GKKZtd5(a>#|`JwQMTK7EN7xJCFH z?SA3--bMO8tizXeA7jb64@jMGRAQ`)dyb1xr!5igNHU={3!alyt;=AmJY-u{FksRd zKX>P|+llT7=eS4T8e4a7uDcqQW855ncNZYo3G@y_xJTk2gJ92)L&;q2Qw7vz<6RhI zw69j=^56RYvX6_shj#K6oiw|&A4v9{sZgJ$*|?6mI630@V9j*%BPhV#=cM2qrIK|D zX~^2=#b_BJqjw6f(B9|fXc@G*vQPEeI0i=Wm_W(7i#qPuA#2z`m8LZXr_mU+T&hip zwl-wZS{Y*pGz4Z}7;?O?OauSAbKuX!kzq>kN!N}2zjcsT{WY;-f&2fqYxuuLt!}); zzFGn$l7;uW0FrtCtIWI(Z~-)N;#jTou6vwTdnnBt`K1nSXBWmDFf<|}SXlju8GT7c zDzz2vK5<9i|zx4aAwo>ml>7lgPd0s?QLl96URHi1yXy{%tO~s zB1rNfQ*OVcj6eJ36ND}6NeSvvnD7AKoH&5?A)dpd(bEr_K-F`5po-tN#zPiNm{fog zdTEAB$lHrs zvw2rdi&jvE*CC3{axexwRt7rIAKxW_`XF@}WU&<5Z!0Wu;|bkB=ic3t$g&s+{2=$K z31U7BBzu;|A(UkB{WVO#wKG;tPY!tm5^&I1j@<`TW zkOVQAZ7Fn3%tLi74>1hKdVCHA_siV;g=!pmqjfY@GpjhDBI`Ay&i(cDCaAr;sNF}{ z_kj!Uu;)iyu9|=&`(2GdpWSTTKSM@R6& z_?=updf73kQ0!e#x@RSg&bHodW%ofewxmL3UKv zTMJ+1vpAkWpANd$2jXtUM&UExm{Z0s*l-=Y=Amon3s0XrKTWp64IaR6*IF*$ZlUF& zIa$HMA-IAs1;!zJvsLuuvRVDy=Ijm$-`+)cj)UC@f1XM8eW_21cZw$=l-n&w$;qW9 zw`=bbZ=$nvGk%9hwTpl&c2mBe(xewGT=s0(E3A&8b1SOyS+$zk1YstbRUOg4qAl?> zwUCFwW8|FHZyoTgmud9>M}*D2IgOi#rM=uE;hQPB(l6b)Wm13d4|wPgP?H;qBq1JD zF-T_-*oR@T#)eJ+)A2>XeCadW_4;=!b4G?0~@LZY}0}fduLs=7p)>B0refS&IQ9HKyv$5Pm zG2O=VfCUAZ~&T8i~ub~MczSu)OH0Fc$8 zf#Fc77^^Tg=?-zqya)SOEr4lvciFmRh*NhwJEDl@WZI6vSQo#5X=lF}2BaMt?@+-P zEZ?dxju%+o4;6=74l={_n9x4T5I8M&UM+WK1uU2NU{7;60+}QrnOR9Ut41MqZpz>p zh46foHsXHtJm>WQTrDzft)Mw3m;$6GosoWZGT41ae13Au)u$Y(VOHATaIkeC(3Q&h z>VcPSZj`Mn;h^HXguh5)NH}XsFdQVdb%#_A_OYu;LNZ&5?Ckc5_S}UrpoM7W9e5G{H zH+LUjKRzIQpdf#+d{>tE85lf@s0+&|psOfF4I-zv&4ue#K$t&4(^&sDu= zpkFh5ae=>o9qEGs20d`c@@}}I`WHt+Y*%OaV)k!@w9a^Ccff>gYVJu5nGLi0%Eaxl z&4@=evMRjrkBM^cx%8ev=mjNp(JM5@4%^i1gWr<1!#UL)ny%Qi14)}Khz>lf)f)cd z#7#$U1fU)wQgLlm_!2yy^Y?&;-4P-XPYLlBela3c2=tLy#@u4wd1MVQ=I%fT@s284 z%HFf)FPIh|;ZB!vP2Y>(f-n$HMRt^yq`E^xYjjtBQP&WEbmPq>zVN&dnc(NpMgL^q zza9tZX=1W}Jsz233Ho}iweZR5Q^J14W3NT*V z&7`Y7z^4H(?Xq-rifx^#A)EE5_)J=zO1N~}z2}3DO}ps{3MJ=d-9>`_W&!#6&Sj7F zamHoZs_&S!*u>A%ER(KDhZ?|G0MFsW4r)OZS*@P^qaRDCoN`Ex;TKsANj{RI|6>|` zri8nBpAJfnX&-F5{c=#rif)dOs}Tq1g{%_YXthK!-KoV z{6mExa$bu*P!#;cn?y@l3HKMdUzfn0>5OpwCm8Flit9&qnU7EHQG42)JnmZ)(zdWQ zn(qC5G;*-r2sZ2VE3R9B3eUidt$(JwOhtd>EaX+O;n*OUqW^3hEz;-V`1~9Zv$3Z%2oX{`zyV*ZFoG#P_kv`siRF*W_g!otEmF)`6%U>cM7b8UK*-Ic(t z`NMNiU0vfG+qKR*&yr!`h07%UrAhyX(&mcoIsJVS^yrV@Ca-mQX0>S)mQ`^YmT7VN zVNGJu5!*d?QR^@Oq7m{9lq9WJQ=dWZ7X1e821ESUNV+1IoAMQED_lLg$z&KGl9z-n zXjxeRkdZVlf{b{?pL03 zQ*!BF198koVI*OzF)zBmeO)epNeN`$ehx6+x~2KsXLort#=Fk_;g+O$FQnKk3Vlf7 zpVNa_dGCm7c(zZcRWiw#sCP3>XMi;hr%gPp7gRm_eyvP|uUB9nRb3@tHwnE+>U8Yc zQaaS|a!X1*F!2!4Oyvcvu*rP1d}kt!5YAta^C7!oG+DQFmP*Ee*QJ zJQ8EpEHes3HOfI4kFJ7q|x*TFy`wax^-(b+5A`^^82E0<*bsX z-j?}yIXsACCY5AP8IotnI~TsiYU5&4emqafJZnP=H#V198~1Z7`w$g}Gp}fC_BcUB z*7?Wim_qy6UW32J82DI$|LWNGdltd94axExv&+@uL`aY0p;UIaU~AUfGVp!Uv?4vw z(U(>B)^E7*ZBhPwJ9Gjg!zQDGIpz?HA=GlhgBKc&<=W~cvU=t^VwXoBLD>#BSu{E| zi}a)h@p0GgMj0!IDnJWLXTk?QSu_9CWYcH*hKY2qJo-M$fnp3TwLQL>!Xg9OtDbE> za8=rqhm?}bo5;fv zU0{?;@sFUQ1PrMZeO!p*P=~=*T;{=1N1ME2@D|MVWTF15zQ`h3uU4g?Ua(ZM@b2X9 zhaZhP9~vZ1fJ%#Zi)O7+OUCDi9SnNFeC1A1p=$6rq#M3kDWf~*i=esSP2fHZU2X2} zcpt}y9*i&Ahsgfqm-l|2c*a<8HH=Q&AGhF)&@*(U;SOkz2Fdapo!v8vQjZoRQM3@T zqVXxE<0h6yewonzhCZn;fmJSiwUc1wiz&agR;S@@0e0Jo(c8jij7?lVZN=bRnC`vg z=W-Lpm&6-4DiOV#@}JfU5a*ph-fW|`4lbXbm_39hP$`0Ud^oSZ#aASh<98CzeYE6r zh;WO-kf0DZmIiJCMn8|VEe3(t`eIJW6e zY}1hXwPkhS7-KH$vwZzo-IO0>^d3zI8biH(%6x5~j)xLs`UK8Rl?$2`F1l7DnxTY} zmXsEJXVc?*_@{bOXl!$#1`b!XOKN>V{3km}0>_rb@Cz7!?ucFLSfMPouHnk?x5wUL zX`VGNw;3^UD{SA=kHc|@6rB|yC3!;OrEcGWv4VtHI4g@4##`+w*xX9GusX_`xyUMt zksR|DcXpM>h)#JBGx7gaPl27M-IB+8>-ipJQ8Z0?kmH}=Jz5_aiB;(g@dt|d)+3R7 zXsez%aLI`=s>N=J^dQ?5RODWZ{LGz_re&(YJTr+`t3T;}2yLTQtRl_m8sJ`pSs>e4 z?mD>7H#qfXGPGQzqiqhdFcx14^chAee!tQ?Mo0f{)M=QS(jHqIS@aU|I)QiOX6LTl zM*yxN$Ni>eo27sfpQt)5_0rP(*Ew_{oloN*obq~cUA`MVi*=I46*cuU>j#=96SX`> z%rPTz(FA3%xHQnen;k(NwKE61i+;bNV7(K25_td-@Lc-7;;B`ztagmRGkU?+4|z)6 zH|14o%^EEz^JNixm7Z+YkfS)V;d;QR75_9H(*q_b6_9+T)35W|n?m3-Az4=Pa*$U{$1hr^Z!Cz$X*WHAbO6o$&C$H${4HGHkB%MEI*-t zu<6pAo8MY4q}RQ{(O22?Or+GML~y5eIHCi+(PhfX|ES!5Zu+7=O*yDOwPWi&4kPMy z!z}TWVBybuKhr?9=Q43d_@EtP40dv=J)&W|+;s99N%$p1kO4QhxxYL28=E;mp|?0aB56{dI!8UAfElgz zXR#B#DY$T*!>Cnc$e41`L}6%7mEDvUk|pJsIi+hY&`QZlK&+>wB8bh?mV;Z@N&|xX zYs8T-Hqod0mv`l>(n0gVrhDRatwsY3YX#8DK)pjZM&-OJMunYK)v_i|V-*>_Re`C` z<%`mx8=hZrRS2$MPS+I(1ELVf^*^;}U51lwR*>)t(Qo4Ts%6=jc1v5SlyQ*hq6j&< z&x8(3X%8>(%xVA~-X+S_)qC28Ib#Z6*m1@TV4;uStfz!4X-0H6ExaSt7}A%w1Zt?t&Idal)10W>YDZK8p)5W*u2 zFes$Bazzdg7ruNoHD97OIZG&orKig0>xRF}$e&c}9|UaQ{f3iY|i?2RPP(-=l2(!Lp#90zHaE87&$4~*c1q4*!1Bu*t4|Y8^{xm(Y z>@D#Kb1qH8w>t;kLhRf88W!K6P2ZcrAD|a*HihoM$w{F0Ca37Z-AxRMqsDU%bM9`u z^8lMdq-Lat6>seS7Zea@p4DI0D_ijKEmPWFJHKl9^>x3!1~t;yHUhgcv1+1XeBEL@ zot-X;y7Rm}3Mm{!$;3_^s(X-dya@tBm7j(zc`8Hj#+(ynF>Y40;wmbl62XElt(CJE z9z1_kY_8MNLR(aYo;)dSVKKNDOogYwRz+RJQ%;Ru_#pD^bn)#WD~?gvsnQYpDvWSH zihsm$VZdJz`g-wmc4EL^5c)dt9e>?yyBXu5bKQhO=Vje|@5%kVVsyfoer|8l8Y7=~E?%T9 zR@QxP9_@@*Fj{TIw(OEc{j^eHi%_*;RHO4OznSC9VFNn?EcB}y2YeDP1BDft6`K{E z^%o{i9C#RfAbBT^=ij@4aqvUPR7h$ldIDukZQxSM7D0Ijdy#($I}v}1dXxP<_XUZ~ zMQ5zvn3*)u_-NjKKO~z=RmxTN#WvMt@1y5p*F=7k`6_<=9Y`2B8~A~fBBzq+N+rlpH+L46(|$A z3=yHT&`7ZgR<-=JMp^HBTi3_2EwJg30i3FuvH{kX)~5i?mu8`>4z3y5CdaEHuIV}^ z%d0Z3nVTlht3pp{d?wSYQcoG3CfBQCPw74;+pBU*hL=xT1H`xDrldRxI8;$d#B9V< zu2T+EE>ljjF0xLtZc{y+iT6lmT*I8h+`|UA)8N$<_C$Na$E3%`$EaojPH9dpPVr7b zPK8cMPK`>(*5}$6+I!k(+DF<~+Pm5k!qM1eRB56X<>%%yPIv{UKfTvK9Xl^gH^i#j zpiN;8I2WFD$S!QHPGm!{2v@pN=1j)Cu7D|9D|4{SF2c;U!kY6o`>PaU(SlA)=P1f~ zo_#0_NW8AJSLLqATAac*qf^*!%3B&|cWf?#Z_pkmGSphNAHQ#Fimvsp`LroSbH~#! zsGK?fy}eId6KEZU=7nc%R5fsph+|eHF2F6oCBP#i+c3ZPvDe6LBg<1SGG%D?-)6`r zD_t&dGH^0*GjK8R)Ns~t*KpPF*m2tZ+}A!IMJz!9T8AJS;Oz~lS zU#ON1Hn^6NHprGZ#Fn2>SW%p-DQA+l87V8YlXhE|Mmjv(`Ko(}s>c!o+gaN7WR=T| z)zD^VUx(6IRTea3*X0U4gZEYJSVX2J*E81y`XiniRE5tH2I2zccwu{;zq@aA4USu2 zjLhxT+_?Hz=;=N=o>#30?Wx1!oO5ejFsI9=9_bd_eFMYFft6%O4iqg>!ZfQ0)K-Lv z^JM!jVDgQTp9X#rl76h@ikCvVl0ElVqI*1X9l9S&COz@R5c)(@7=>B2T;?uyaX)nL zhWec$K!2K4N}uBl8r#DSJ8GvvP&g)RKcm7Kl@c&!IZ)E&N@Xc=MbC2uvT)ICaQQ$K z3Df}zxi<3&zM-6BPON72w`L8$YWD<;3nZFu`;kS$W6&jf1)KUzkz=L G)cz05(PHWV literal 0 HcmV?d00001 diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css new file mode 100644 index 000000000..14aca9535 --- /dev/null +++ b/frontend/src/app/globals.css @@ -0,0 +1,32 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + /* font-family: Arial, Helvetica, sans-serif; */ + font-family: "Inter", sans-serif; +} + +@layer base { + :root { + --radius: 0.5rem; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + } + .dark { + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; + } +} diff --git a/frontend/src/app/integrations/callback.ts b/frontend/src/app/integrations/callback.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/integrations/stripe/page.tsx b/frontend/src/app/integrations/stripe/page.tsx new file mode 100644 index 000000000..bab24a5f6 --- /dev/null +++ b/frontend/src/app/integrations/stripe/page.tsx @@ -0,0 +1,10 @@ +import { getOrgFromSession } from "@/utils/serverUtils"; +import ConnectStripe from "@/views/onboarding/ConnectStripe"; + +import { useSearchParams } from "next/navigation"; + +export default async function StripePage() { + const org = await getOrgFromSession(); + + return ; +} diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx new file mode 100644 index 000000000..4adc0c02b --- /dev/null +++ b/frontend/src/app/layout.tsx @@ -0,0 +1,119 @@ +import type { Metadata } from "next"; + +import "./globals.css"; +import { ClerkProvider } from "@clerk/nextjs"; +import { NextUIProvider } from "@nextui-org/react"; +import { Inter } from "next/font/google"; + +const inter = Inter({ subsets: ["latin"] }); + +import { config } from "@fortawesome/fontawesome-svg-core"; +import "@fortawesome/fontawesome-svg-core/styles.css"; +config.autoAddCss = false; + +const getTitle = async () => { + // const headersList = await headers(); + // const origin = headersList.get("origin"); + + // if (origin === "https://app.autumn.com") { + // return "Autumn"; + // } else { + // return "Autumn (Local)"; + // } + return "Autumn"; +}; + +export const metadata: Metadata = { + title: await getTitle(), + description: + "Handling pricing plans, packaging and entitlements for your customers", +}; + +import React from "react"; + +import { auth } from "@clerk/nextjs/server"; +import { headers } from "next/headers"; +import { AppEnv } from "@autumn/shared"; +import { redirect } from "next/navigation"; +import { SidebarProvider } from "../components/ui/sidebar"; +import HomeSidebar from "../views/sidebar/Sidebar"; + +export default async function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + const path = headersList.get("path") || ""; + + const { sessionClaims }: { sessionClaims: any } = await auth(); + const { org_id, org } = sessionClaims || {}; + + if (path.includes("/onboarding")) { + if (org_id) { + redirect("/sandbox/customers"); + } + + return ( + + + {/* @ts-expect-error ClerkProvider is not a valid JSX component */} + + +
+ {children} +
+
+
+ + + ); + } + + // Main layout + // const user = await currentUser(); + + if (!org_id) { + redirect("/onboarding"); + } + + return ( + + + {/* @ts-expect-error ClerkProvider is not a valid JSX component */} + + + + +
+ {env === AppEnv.Sandbox && ( +
+

SANDBOX

+
+ )} + +
+
+ {children} +
+
+
+
+
+
+ + + ); +} diff --git a/frontend/src/app/loading.tsx b/frontend/src/app/loading.tsx new file mode 100644 index 000000000..631dd19af --- /dev/null +++ b/frontend/src/app/loading.tsx @@ -0,0 +1,6 @@ +import LoadingScreen from "@/views/general/LoadingScreen"; + +export default function Loading() { + // You can add any UI inside Loading, including a Skeleton. + return ; +} diff --git a/frontend/src/app/onboarding/page.tsx b/frontend/src/app/onboarding/page.tsx new file mode 100644 index 000000000..382951f36 --- /dev/null +++ b/frontend/src/app/onboarding/page.tsx @@ -0,0 +1,8 @@ +import OnboardingView from "@/views/onboarding/OnboardingView"; + +async function OnboardingPage() { + const onboardingView = await OnboardingView(); + return onboardingView; +} + +export default OnboardingPage; diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx new file mode 100644 index 000000000..408f85958 --- /dev/null +++ b/frontend/src/app/page.tsx @@ -0,0 +1,22 @@ +import HomeView from "@/views/HomeView"; +import HomeSidebar from "@/views/sidebar/Sidebar"; +import { currentUser } from "@clerk/nextjs/server"; +import { headers } from "next/headers"; +import { redirect } from "next/navigation"; + +enum AppEnv { + Sandbox = "sandbox", +} + +async function Home() { + redirect("/customers"); + // const org = await currentOrganization(); + + return ( +
{/* */}
+ // + // + ); +} + +export default Home; diff --git a/frontend/src/app/products/[product_id]/page.tsx b/frontend/src/app/products/[product_id]/page.tsx new file mode 100644 index 000000000..cdd8314d6 --- /dev/null +++ b/frontend/src/app/products/[product_id]/page.tsx @@ -0,0 +1,21 @@ +import ProductView from "@/views/products/product/ProductView"; +import { headers } from "next/headers"; +import React from "react"; +import { Organization, AppEnv } from "@autumn/shared"; +import { getOrgFromSession } from "@/utils/serverUtils"; + +async function ProductPage({ + params, +}: { + params: Promise<{ product_id: string }>; +}) { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + const { product_id } = await params; + + const org: Organization = await getOrgFromSession(); + + return ; +} + +export default ProductPage; diff --git a/frontend/src/app/products/page.tsx b/frontend/src/app/products/page.tsx new file mode 100644 index 000000000..44ce01065 --- /dev/null +++ b/frontend/src/app/products/page.tsx @@ -0,0 +1,14 @@ +import { AppEnv } from "@autumn/shared"; +import { headers } from "next/headers"; +import React from "react"; +import ProductsView from "@/views/products/ProductsView"; +import { auth } from "@clerk/nextjs/server"; + +async function ProductsPage() { + const headersList = await headers(); + const env = (headersList.get("env") as AppEnv) || AppEnv.Sandbox; + + return ; +} + +export default ProductsPage; diff --git a/frontend/src/components/general/CopyButton.tsx b/frontend/src/components/general/CopyButton.tsx new file mode 100644 index 000000000..583e0ee00 --- /dev/null +++ b/frontend/src/components/general/CopyButton.tsx @@ -0,0 +1,41 @@ +import React, { useEffect, useState } from "react"; +import { Button, ButtonProps } from "../ui/button"; +import { Check, Copy } from "lucide-react"; +import { cn } from "@/lib/utils"; + +function CopyButton({ + text, + className, + children, + variant = "ghost", +}: { + text: string; + className?: string; + children?: React.ReactNode; + variant?: string; +}) { + const [copied, setCopied] = useState(false); + + useEffect(() => { + setTimeout(() => { + setCopied(false); + }, 1000); + }, [copied]); + + return ( + + ); +} + +export default CopyButton; diff --git a/frontend/src/components/general/CustomToaster.tsx b/frontend/src/components/general/CustomToaster.tsx new file mode 100644 index 000000000..bfaa8949e --- /dev/null +++ b/frontend/src/components/general/CustomToaster.tsx @@ -0,0 +1,13 @@ +import { Toaster } from "react-hot-toast"; + +export const CustomToaster = () => { + return ( + + ); +}; diff --git a/frontend/src/components/general/SmallSpinner.tsx b/frontend/src/components/general/SmallSpinner.tsx new file mode 100644 index 000000000..b1aa33749 --- /dev/null +++ b/frontend/src/components/general/SmallSpinner.tsx @@ -0,0 +1,8 @@ +import { Spinner } from "@nextui-org/spinner"; +import React from "react"; + +function SmallSpinner() { + return ; +} + +export default SmallSpinner; diff --git a/frontend/src/components/general/modal-components/FieldLabel.tsx b/frontend/src/components/general/modal-components/FieldLabel.tsx new file mode 100644 index 000000000..b009c73ad --- /dev/null +++ b/frontend/src/components/general/modal-components/FieldLabel.tsx @@ -0,0 +1,10 @@ +import { cn } from "@/lib/utils"; +import React from "react"; + +function FieldLabel({ children, className }: any) { + return ( +
{children}
+ ); +} + +export default FieldLabel; diff --git a/frontend/src/components/ui/accordion.tsx b/frontend/src/components/ui/accordion.tsx new file mode 100644 index 000000000..e31d21345 --- /dev/null +++ b/frontend/src/components/ui/accordion.tsx @@ -0,0 +1,57 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/frontend/src/components/ui/alert.tsx b/frontend/src/components/ui/alert.tsx new file mode 100644 index 000000000..218f631f4 --- /dev/null +++ b/frontend/src/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border border-zinc-200 px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-zinc-950 [&>svg~*]:pl-7 dark:border-zinc-800 dark:[&>svg]:text-zinc-50", + { + variants: { + variant: { + default: "bg-white text-zinc-950 dark:bg-zinc-950 dark:text-zinc-50", + destructive: + "border-red-500/50 text-red-500 dark:border-red-500 [&>svg]:text-red-500 dark:border-red-900/50 dark:text-red-900 dark:dark:border-red-900 dark:[&>svg]:text-red-900", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = "Alert" + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertTitle, AlertDescription } diff --git a/frontend/src/components/ui/badge.tsx b/frontend/src/components/ui/badge.tsx new file mode 100644 index 000000000..d140398a4 --- /dev/null +++ b/frontend/src/components/ui/badge.tsx @@ -0,0 +1,38 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border border-zinc-200 px-2.5 py-0.5 text-xs transition-colors focus:outline-none focus:ring-2 focus:ring-zinc-950 focus:ring-offset-2 dark:border-zinc-800 dark:focus:ring-zinc-300", + { + variants: { + variant: { + default: + "border-transparent bg-zinc-900 text-zinc-50 shadow hover:bg-zinc-900/80 dark:bg-zinc-50 dark:text-zinc-900 dark:hover:bg-zinc-50/80", + secondary: + "border-transparent bg-zinc-100 text-zinc-900 hover:bg-zinc-100/80 dark:bg-zinc-800 dark:text-zinc-50 dark:hover:bg-zinc-800/80", + destructive: + "border-transparent bg-red-500 text-zinc-50 shadow hover:bg-red-500/80 dark:bg-red-900 dark:text-zinc-50 dark:hover:bg-red-900/80", + outline: "text-zinc-950 dark:text-zinc-50", + purple: "bg-purple-50 text-purple-500", + blue: "bg-blue-50 text-blue-500", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/frontend/src/components/ui/button.tsx b/frontend/src/components/ui/button.tsx new file mode 100644 index 000000000..a6993590b --- /dev/null +++ b/frontend/src/components/ui/button.tsx @@ -0,0 +1,107 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; +import { LoaderCircle } from "lucide-react"; + +// [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 + +const buttonVariants = cva( + `inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-zinc-950 disabled:pointer-events-none disabled:opacity-50 dark:focus-visible:ring-zinc-300 font-regular + + `, + { + variants: { + variant: { + default: + // "bg-zinc-900 text-zinc-50 shadow hover:bg-zinc-900/90 dark:bg-zinc-50 dark:text-zinc-900 dark:hover:bg-zinc-50/90", + "bg-primary hover:bg-primary/90 text-zinc-50 shadow dark:bg-zinc-50 dark:text-zinc-900 dark:hover:bg-zinc-50/90", + secondary: + "border border-zinc-200 bg-white shadow-sm hover:bg-zinc-100 hover:text-zinc-900 dark:border-zinc-800 dark:bg-zinc-950 dark:hover:bg-zinc-800 dark:hover:text-zinc-50", + // "bg-zinc-100 text-zinc-900 shadow-sm hover:bg-zinc-100/80 dark:bg-zinc-800 dark:text-zinc-50 dark:hover:bg-zinc-800/80", + destructive: + "bg-red-500 text-zinc-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-zinc-50 dark:hover:bg-red-900/90", + outline: + "border border-zinc-200 bg-white shadow-sm hover:bg-zinc-100 hover:text-zinc-900 dark:border-zinc-800 dark:bg-zinc-950 dark:hover:bg-zinc-800 dark:hover:text-zinc-50", + ghost: + "hover:bg-zinc-100 hover:text-zinc-900 dark:hover:bg-zinc-800 dark:hover:text-zinc-50", + link: "text-zinc-900 underline-offset-4 hover:underline dark:text-zinc-50", + dashed: + "border border-1 border-dashed bg-white border-zinc-300 text-primary shadow-sm hover:bg-zinc-100 hover:text-primary dark:border-zinc-800 dark:bg-zinc-950 dark:hover:bg-zinc-800 dark:hover:text-zinc-50", + gradientPrimary: + " bg-gradient-to-b from-primary/65 to-primary text-white hover:from-purple-500 hover:to-purple-700 shadow-sm text-xs shadow-purple-500/50", + gradientSecondary: + "border border-stone-300 bg-gradient-to-b from-white to-stone-100 text-t1 hover:from-stone-300 hover:to-stone-400 shadow-sm text-xs", + }, + size: { + default: "h-8 px-3 flex items-center gap-1", + sm: "h-7 rounded-md px-2 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; + isLoading?: boolean; + isIcon?: boolean; + dim?: number; + startIcon?: React.ReactNode; + endIcon?: React.ReactNode; +} + +const Button = React.forwardRef( + ( + { + className, + variant, + size, + asChild = false, + isLoading = false, + isIcon = false, + dim = 7, + startIcon, + endIcon, + children, + ...props + }, + ref + ) => { + const Comp = asChild ? Slot : "button"; + return ( + { + if (isLoading) { + e.preventDefault(); + e.stopPropagation(); + return; + } + props.onClick?.(e); + }} + > + {isLoading && } + {startIcon && !isLoading && <>{startIcon}} + {children} + {endIcon && !isLoading && <>{endIcon}} + + ); + } +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/frontend/src/components/ui/card.tsx b/frontend/src/components/ui/card.tsx new file mode 100644 index 000000000..1b43b8c34 --- /dev/null +++ b/frontend/src/components/ui/card.tsx @@ -0,0 +1,76 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/frontend/src/components/ui/checkbox.tsx b/frontend/src/components/ui/checkbox.tsx new file mode 100644 index 000000000..cb0bb8ece --- /dev/null +++ b/frontend/src/components/ui/checkbox.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/frontend/src/components/ui/command.tsx b/frontend/src/components/ui/command.tsx new file mode 100644 index 000000000..815157e2c --- /dev/null +++ b/frontend/src/components/ui/command.tsx @@ -0,0 +1,153 @@ +"use client" + +import * as React from "react" +import { type DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +const CommandDialog = ({ children, ...props }: DialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx new file mode 100644 index 000000000..35b0afb66 --- /dev/null +++ b/frontend/src/components/ui/dialog.tsx @@ -0,0 +1,123 @@ +"use client"; + +import * as React from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogTrigger, + DialogClose, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +}; diff --git a/frontend/src/components/ui/drawer.tsx b/frontend/src/components/ui/drawer.tsx new file mode 100644 index 000000000..1ff864a4c --- /dev/null +++ b/frontend/src/components/ui/drawer.tsx @@ -0,0 +1,97 @@ +"use client"; + +import * as React from "react"; +import { Drawer as DrawerPrimitive } from "vaul"; + +import { cn } from "@/lib/utils"; + +const Drawer = ({ + shouldScaleBackground = true, + ...props +}: React.ComponentProps) => ( + +); +Drawer.displayName = "Drawer"; + +const DrawerTrigger = DrawerPrimitive.Trigger; + +const DrawerPortal = DrawerPrimitive.Portal; + +const DrawerClose = DrawerPrimitive.Close; + +const DrawerOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ ...props }, ref) => ); +DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName; + +const DrawerContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + +
+ {children} + + +)); +DrawerContent.displayName = "DrawerContent"; + +const DrawerHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DrawerHeader.displayName = "DrawerHeader"; + +const DrawerFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DrawerFooter.displayName = "DrawerFooter"; + +const DrawerTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ ...props }, ref) => ); +DrawerTitle.displayName = DrawerPrimitive.Title.displayName; + +const DrawerDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ ...props }, ref) => ); +DrawerDescription.displayName = DrawerPrimitive.Description.displayName; + +export { + Drawer, + DrawerPortal, + DrawerOverlay, + DrawerTrigger, + DrawerClose, + DrawerContent, + DrawerHeader, + DrawerFooter, + DrawerTitle, + DrawerDescription, +}; diff --git a/frontend/src/components/ui/dropdown-menu.tsx b/frontend/src/components/ui/dropdown-menu.tsx new file mode 100644 index 000000000..48601fa48 --- /dev/null +++ b/frontend/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,207 @@ +"use client"; + +import * as React from "react"; +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { Check, ChevronRight, Circle } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + e.preventDefault()} + ref={ref} + sideOffset={sideOffset} + className={cn( + "z-50 min-w-[8rem] overflow-hidden rounded-md border border-zinc-200 bg-white p-1 text-zinc-950 shadow-md dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-50", + "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + className + )} + {...props} + /> + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + svg]:size-4 [&>svg]:shrink-0 dark:focus:bg-zinc-800 dark:focus:text-zinc-50 + + + cursor-pointer + hover:bg-zinc-100 + `, + inset && "pl-8", + className + )} + {...props} + /> +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/frontend/src/components/ui/input.tsx b/frontend/src/components/ui/input.tsx new file mode 100644 index 000000000..226ff6fa9 --- /dev/null +++ b/frontend/src/components/ui/input.tsx @@ -0,0 +1,92 @@ +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +interface InputProps extends React.ComponentProps<"input"> { + startContent?: React.ReactNode; + endContent?: React.ReactNode; +} + +const Input = React.forwardRef( + ({ className, type, startContent, endContent, ...props }, ref) => { + const hasAdornment = startContent || endContent; + const [isFocused, setIsFocused] = React.useState(false); + + const handleFocus = () => setIsFocused(true); + const handleBlur = () => setIsFocused(false); + + return ( + <> + {hasAdornment ? ( +
+ +
+ {endContent} +
+
+ ) : ( + + )} + + ); + // return ( + // + // ); + } +); +Input.displayName = "Input"; + +export { Input }; diff --git a/frontend/src/components/ui/popover.tsx b/frontend/src/components/ui/popover.tsx new file mode 100644 index 000000000..82aa150f2 --- /dev/null +++ b/frontend/src/components/ui/popover.tsx @@ -0,0 +1,33 @@ +"use client"; + +import * as React from "react"; +import * as PopoverPrimitive from "@radix-ui/react-popover"; + +import { cn } from "@/lib/utils"; + +const Popover = PopoverPrimitive.Root; + +const PopoverTrigger = PopoverPrimitive.Trigger; + +const PopoverAnchor = PopoverPrimitive.Anchor; + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; + +export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }; diff --git a/frontend/src/components/ui/select.tsx b/frontend/src/components/ui/select.tsx new file mode 100644 index 000000000..c4f99c434 --- /dev/null +++ b/frontend/src/components/ui/select.tsx @@ -0,0 +1,171 @@ +"use client"; + +import * as React from "react"; +import * as SelectPrimitive from "@radix-ui/react-select"; +import { Check, ChevronDown, ChevronUp } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Select = SelectPrimitive.Root; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +// Default + +// flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-zinc-200 bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-white placeholder:text-zinc-500 focus:outline-none focus:ring-1 focus:ring-zinc-950 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 dark:border-zinc-800 dark:ring-offset-zinc-950 dark:placeholder:text-zinc-400 dark:focus:ring-zinc-300 + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1 dark:border-zinc-800 dark:ring-offset-zinc-950 dark:placeholder:text-zinc-400 dark:focus:ring-zinc-300 + + h-8 + focus:ring-0 focus:border-[rgb(139,92,246)] focus:shadow-[0_0_2px_1px_rgba(139,92,246,0.25)] + transition-colors duration-100 + + p-2 + `, + className + )} + {...props} + > + {children} + + + + +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName; + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +}; diff --git a/frontend/src/components/ui/separator.tsx b/frontend/src/components/ui/separator.tsx new file mode 100644 index 000000000..a09d5ec5b --- /dev/null +++ b/frontend/src/components/ui/separator.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/frontend/src/components/ui/sheet.tsx b/frontend/src/components/ui/sheet.tsx new file mode 100644 index 000000000..548b2ba3f --- /dev/null +++ b/frontend/src/components/ui/sheet.tsx @@ -0,0 +1,144 @@ +"use client"; + +import * as React from "react"; +import * as SheetPrimitive from "@radix-ui/react-dialog"; +import { cva, type VariantProps } from "class-variance-authority"; +import { X } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Sheet = SheetPrimitive.Root; + +const SheetTrigger = SheetPrimitive.Trigger; + +const SheetClose = SheetPrimitive.Close; + +const SheetPortal = SheetPrimitive.Portal; + +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName; + +const sheetVariants = cva( + "fixed z-50 gap-4 bg-white p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out dark:bg-zinc-950", + { + variants: { + side: { + top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", + bottom: + "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", + left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", + right: + "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", + }, + }, + defaultVariants: { + side: "right", + }, + } +); + +interface SheetContentProps + extends React.ComponentPropsWithoutRef, + VariantProps {} + +const SheetContent = React.forwardRef< + React.ElementRef, + SheetContentProps + // @ts-expect-error - className is inherited from ComponentPropsWithoutRef +>(({ side = "right", className, children, ...props }, ref) => ( + + + + + + Close + + {children} + + +)); +SheetContent.displayName = SheetPrimitive.Content.displayName; + +const SheetHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +SheetHeader.displayName = "SheetHeader"; + +const SheetFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +SheetFooter.displayName = "SheetFooter"; + +const SheetTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SheetTitle.displayName = SheetPrimitive.Title.displayName; + +const SheetDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SheetDescription.displayName = SheetPrimitive.Description.displayName; + +export { + Sheet, + SheetPortal, + SheetOverlay, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +}; diff --git a/frontend/src/components/ui/sidebar.tsx b/frontend/src/components/ui/sidebar.tsx new file mode 100644 index 000000000..48216f580 --- /dev/null +++ b/frontend/src/components/ui/sidebar.tsx @@ -0,0 +1,764 @@ +"use client"; + +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { VariantProps, cva } from "class-variance-authority"; +import { PanelLeft } from "lucide-react"; + +import { useIsMobile } from "@/hooks/use-mobile"; +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Separator } from "@/components/ui/separator"; +import { Sheet, SheetContent } from "@/components/ui/sheet"; +import { Skeleton } from "@/components/ui/skeleton"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +const SIDEBAR_COOKIE_NAME = "sidebar:state"; +const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; +const SIDEBAR_WIDTH = "13rem"; +const SIDEBAR_WIDTH_MOBILE = "18rem"; +const SIDEBAR_WIDTH_ICON = "3rem"; +const SIDEBAR_KEYBOARD_SHORTCUT = "b"; + +type SidebarContext = { + state: "expanded" | "collapsed"; + open: boolean; + setOpen: (open: boolean) => void; + openMobile: boolean; + setOpenMobile: (open: boolean) => void; + isMobile: boolean; + toggleSidebar: () => void; +}; + +const SidebarContext = React.createContext(null); + +function useSidebar() { + const context = React.useContext(SidebarContext); + if (!context) { + throw new Error("useSidebar must be used within a SidebarProvider."); + } + + return context; +} + +const SidebarProvider = React.forwardRef< + HTMLDivElement, + React.ComponentProps<"div"> & { + defaultOpen?: boolean; + open?: boolean; + onOpenChange?: (open: boolean) => void; + } +>( + ( + { + defaultOpen = true, + open: openProp, + onOpenChange: setOpenProp, + className, + style, + children, + ...props + }, + ref + ) => { + const isMobile = useIsMobile(); + const [openMobile, setOpenMobile] = React.useState(false); + + // This is the internal state of the sidebar. + // We use openProp and setOpenProp for control from outside the component. + const [_open, _setOpen] = React.useState(defaultOpen); + const open = openProp ?? _open; + const setOpen = React.useCallback( + (value: boolean | ((value: boolean) => boolean)) => { + const openState = typeof value === "function" ? value(open) : value; + if (setOpenProp) { + setOpenProp(openState); + } else { + _setOpen(openState); + } + + // This sets the cookie to keep the sidebar state. + document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; + }, + [setOpenProp, open] + ); + + // Helper to toggle the sidebar. + const toggleSidebar = React.useCallback(() => { + return isMobile + ? setOpenMobile((open) => !open) + : setOpen((open) => !open); + }, [isMobile, setOpen, setOpenMobile]); + + // Adds a keyboard shortcut to toggle the sidebar. + React.useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if ( + event.key === SIDEBAR_KEYBOARD_SHORTCUT && + (event.metaKey || event.ctrlKey) + ) { + event.preventDefault(); + toggleSidebar(); + } + }; + + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + }, [toggleSidebar]); + + // We add a state so that we can do data-state="expanded" or "collapsed". + // This makes it easier to style the sidebar with Tailwind classes. + const state = open ? "expanded" : "collapsed"; + + const contextValue = React.useMemo( + () => ({ + state, + open, + setOpen, + isMobile, + openMobile, + setOpenMobile, + toggleSidebar, + }), + [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar] + ); + + return ( + + +
+ {children} +
+
+
+ ); + } +); +SidebarProvider.displayName = "SidebarProvider"; + +const Sidebar = React.forwardRef< + HTMLDivElement, + React.ComponentProps<"div"> & { + side?: "left" | "right"; + variant?: "sidebar" | "floating" | "inset"; + collapsible?: "offcanvas" | "icon" | "none"; + } +>( + ( + { + side = "left", + variant = "sidebar", + collapsible = "offcanvas", + className, + children, + ...props + }, + ref + ) => { + const { isMobile, state, openMobile, setOpenMobile } = useSidebar(); + + if (collapsible === "none") { + return ( +
+ {children} +
+ ); + } + + if (isMobile) { + return ( + + {/* @ts-expect-error -- SheetContent is not a valid prop */} + +
{children}
+
+
+ ); + } + + return ( +
+ {/* This is what handles the sidebar gap on desktop */} +
+ +
+ ); + } +); +Sidebar.displayName = "Sidebar"; + +const SidebarTrigger = React.forwardRef< + React.ElementRef, + React.ComponentProps +>(({ className, onClick, ...props }, ref) => { + const { toggleSidebar } = useSidebar(); + + return ( + + ); +}); +SidebarTrigger.displayName = "SidebarTrigger"; + +const SidebarRail = React.forwardRef< + HTMLButtonElement, + React.ComponentProps<"button"> +>(({ className, ...props }, ref) => { + const { toggleSidebar } = useSidebar(); + + return ( +