From a9e0f19ac4fdfa91219f473ecd08d797c0c44b2d Mon Sep 17 00:00:00 2001 From: Tenzin khenrab Date: Fri, 11 Sep 2026 10:38:01 +0530 Subject: [PATCH] Added PWA --- backend/config/cors.php | 5 +- backend/config/sanctum.php | 2 +- frontend/app/layout.tsx | 38 +++- frontend/app/manifest.ts | 70 ++++++ frontend/app/offline/page.tsx | 56 +++++ .../providers/language-provider.tsx | 30 ++- .../pwa/network-status-indicator.tsx | 70 ++++++ .../components/pwa/pwa-install-prompt.tsx | 207 ++++++++++++++++++ frontend/components/pwa/pwa-register.tsx | 103 +++++++++ frontend/lib/api.ts | 23 +- frontend/public/icons/apple-touch-icon.png | Bin 0 -> 10862 bytes frontend/public/icons/favicon-16x16.png | Bin 0 -> 420 bytes frontend/public/icons/favicon-32x32.png | Bin 0 -> 1112 bytes frontend/public/icons/icon-192x192.png | Bin 0 -> 12019 bytes .../public/icons/icon-512x512-maskable.png | Bin 0 -> 30720 bytes frontend/public/icons/icon-512x512.png | Bin 0 -> 38780 bytes frontend/public/sw.js | 189 ++++++++++++++++ nginx/default.conf | 27 +++ 18 files changed, 811 insertions(+), 9 deletions(-) create mode 100644 frontend/app/manifest.ts create mode 100644 frontend/app/offline/page.tsx create mode 100644 frontend/components/pwa/network-status-indicator.tsx create mode 100644 frontend/components/pwa/pwa-install-prompt.tsx create mode 100644 frontend/components/pwa/pwa-register.tsx create mode 100644 frontend/public/icons/apple-touch-icon.png create mode 100644 frontend/public/icons/favicon-16x16.png create mode 100644 frontend/public/icons/favicon-32x32.png create mode 100644 frontend/public/icons/icon-192x192.png create mode 100644 frontend/public/icons/icon-512x512-maskable.png create mode 100644 frontend/public/icons/icon-512x512.png create mode 100644 frontend/public/sw.js diff --git a/backend/config/cors.php b/backend/config/cors.php index a54e988..b8cfe9b 100644 --- a/backend/config/cors.php +++ b/backend/config/cors.php @@ -6,7 +6,10 @@ 'allowed_methods' => ['*'], - 'allowed_origins' => ['http://localhost:3000'], + 'allowed_origins' => [ + 'http://localhost:3000', + 'http://127.0.0.1:3000', + ], 'allowed_origins_patterns' => [], diff --git a/backend/config/sanctum.php b/backend/config/sanctum.php index cde73cf..7726638 100644 --- a/backend/config/sanctum.php +++ b/backend/config/sanctum.php @@ -20,7 +20,7 @@ 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', - 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:3000,127.0.0.1:8000,::1', Sanctum::currentApplicationUrlWithPort(), // Sanctum::currentRequestHost(), ))), diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx index d4112ac..514bd3a 100644 --- a/frontend/app/layout.tsx +++ b/frontend/app/layout.tsx @@ -1,8 +1,11 @@ -import type { Metadata } from "next"; +import type { Metadata, Viewport } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import { ToastProvider } from "@/components/providers/toast-provider"; import { LanguageProvider } from "@/components/providers/language-provider"; import { ThemeProvider } from "@/components/providers/theme-provider"; +import { PwaRegister } from "@/components/pwa/pwa-register"; +import { PwaInstallPrompt } from "@/components/pwa/pwa-install-prompt"; +import { NetworkStatusIndicator } from "@/components/pwa/network-status-indicator"; import "./globals.css"; const geistSans = Geist({ @@ -15,9 +18,37 @@ const geistMono = Geist_Mono({ subsets: ["latin"], }); +export const viewport: Viewport = { + themeColor: [ + { media: "(prefers-color-scheme: light)", color: "#ffffff" }, + { media: "(prefers-color-scheme: dark)", color: "#1C1C1C" }, + ], + width: "device-width", + initialScale: 1, + maximumScale: 5, +}; + export const metadata: Metadata = { - title: "MealBuddy", + title: "MealBuddy | Office Lunch Management", description: "Office cafeteria lunch management and billing", + manifest: "/manifest.webmanifest", + appleWebApp: { + capable: true, + statusBarStyle: "default", + title: "MealBuddy | Office Lunch Management", + }, + formatDetection: { + telephone: false, + }, + icons: { + icon: [ + { url: "/icons/icon-192x192.png", sizes: "192x192", type: "image/png" }, + { url: "/icons/icon-512x512.png", sizes: "512x512", type: "image/png" }, + ], + apple: [ + { url: "/icons/apple-touch-icon.png", sizes: "180x180", type: "image/png" }, + ], + }, }; const themeScript = ` @@ -52,6 +83,9 @@ export default function RootLayout({ {children} + + + diff --git a/frontend/app/manifest.ts b/frontend/app/manifest.ts new file mode 100644 index 0000000..a79c613 --- /dev/null +++ b/frontend/app/manifest.ts @@ -0,0 +1,70 @@ +import type { MetadataRoute } from 'next'; + +export default function manifest(): MetadataRoute.Manifest { + return { + name: 'MealBuddy | Office Lunch Management', + short_name: 'MealBuddy | Office Lunch Management', + description: 'Office cafeteria lunch management, daily meal voting, and billing', + start_url: '/', + scope: '/', + display: 'standalone', + orientation: 'portrait-primary', + background_color: '#ffffff', + theme_color: '#2E5A88', + icons: [ + { + src: '/icons/icon-192x192.png', + sizes: '192x192', + type: 'image/png', + purpose: 'any', + }, + { + src: '/icons/icon-512x512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'any', + }, + { + src: '/icons/icon-512x512-maskable.png', + sizes: '512x512', + type: 'image/png', + purpose: 'maskable', + }, + { + src: '/icons/apple-touch-icon.png', + sizes: '180x180', + type: 'image/png', + }, + ], + shortcuts: [ + { + name: "Today's Lunch / Vote", + short_name: 'Vote', + description: 'Cast your daily lunch vote before 10 AM', + url: '/vote', + icons: [{ src: '/icons/icon-192x192.png', sizes: '192x192' }], + }, + { + name: 'My Dashboard', + short_name: 'Dashboard', + description: 'View lunch attendance and meal history', + url: '/user_dashboard', + icons: [{ src: '/icons/icon-192x192.png', sizes: '192x192' }], + }, + { + name: 'Lunch Billing', + short_name: 'Billing', + description: 'View monthly cafeteria lunch billing', + url: '/user_dashboard/billing', + icons: [{ src: '/icons/icon-192x192.png', sizes: '192x192' }], + }, + { + name: 'Chef Dashboard', + short_name: 'Chef', + description: 'Manage menus and headcount', + url: '/dashboard', + icons: [{ src: '/icons/icon-192x192.png', sizes: '192x192' }], + }, + ], + }; +} diff --git a/frontend/app/offline/page.tsx b/frontend/app/offline/page.tsx new file mode 100644 index 0000000..9b75678 --- /dev/null +++ b/frontend/app/offline/page.tsx @@ -0,0 +1,56 @@ +'use client'; + +import React from 'react'; +import { WifiOff, RefreshCw, ArrowLeft } from 'lucide-react'; +import { useLanguage } from '@/components/providers/language-provider'; + +export default function OfflinePage() { + const { t } = useLanguage(); + + const handleRetry = () => { + window.location.reload(); + }; + + const handleGoBack = () => { + window.history.back(); + }; + + return ( +
+
+
+ +
+ +

+ {t('you_are_offline')} +

+ +

+ {t('internet_connection_unavailable')} +

+ +

+ {t('offline_reconnect_prompt')} +

+ +
+ + +
+
+
+ ); +} diff --git a/frontend/components/providers/language-provider.tsx b/frontend/components/providers/language-provider.tsx index 876349f..488c93d 100644 --- a/frontend/components/providers/language-provider.tsx +++ b/frontend/components/providers/language-provider.tsx @@ -311,6 +311,20 @@ const translations = { dietary_preference: 'Dietary Preference', veg: 'Vegetarian', non_veg: 'Non-Vegetarian', + + // PWA & Offline + install_mealbuddy: 'Install MealBuddy', + install_app_desc: 'Install MealBuddy on your device for quick access and a faster experience.', + add_to_home_screen: 'Add to Home Screen', + you_are_offline: "You're offline", + back_online: 'Back online', + try_again: 'Try Again', + new_version_available: 'New MealBuddy version available', + refresh: 'Refresh', + install_instructions_ios: 'To install: tap Share and select "Add to Home Screen"', + internet_connection_unavailable: 'Internet connection is unavailable. Live meal voting, menu updates, and billing cannot currently be loaded.', + offline_reconnect_prompt: 'Please reconnect to the internet and try again.', + dismiss: 'Dismiss', }, bo: { app_title: 'ཟས་མཐུན་ལས་རོགས།', @@ -616,6 +630,20 @@ const translations = { dietary_preference: 'དཀར་དམར་གྱི་འདེམས་ཀ།', veg: 'དཀར་ཟས།', non_veg: 'དམར་ཟས།', + + // PWA & Offline + install_mealbuddy: 'MealBuddy གཏེགས་འཇུག་བྱོས།', + install_app_desc: 'མགྱོགས་མྱུར་སྤྱོད་བདེའི་ཆེད་ MealBuddy ཉེར་སྤྱོད་ཁྱེད་ཀྱི་ཁ་པར་ནང་གཏེགས་འཇུག་གནང་རོགས།', + add_to_home_screen: 'གཙོ་ངོས་སུ་སྣོན་པ།', + you_are_offline: 'དྲ་རྒྱའི་སྦྲེལ་མཐུད་མེད།', + back_online: 'དྲ་རྒྱའི་སྦྲེལ་མཐུད་སླར་གསོ་བྱུང་།', + try_again: 'བསྐྱར་དུ་འབད་བརྩོན་བྱོས།', + new_version_available: 'MealBuddy པར་གཞི་གསར་པ་འདུག', + refresh: 'གསར་བཅོས་བྱོས།', + install_instructions_ios: 'གཏེགས་འཇུག་བྱེད་པར། མཉམ་སྤྱོད་ (Share) མནན་ཏེ་ "གཙོ་ངོས་སུ་སྣོན་པ་" (Add to Home Screen) འདེམས་རོགས།', + internet_connection_unavailable: 'དྲ་རྒྱའི་སྦྲེལ་མཐུད་མི་འདུག ཉིན་ཟས་འོས་བསྡུ་དང་རྩིས་ཁྲ་སོགས་དྲ་ཐོག་གི་གནས་ཚུལ་རྣམས་ལྟ་མི་ཐུབ།', + offline_reconnect_prompt: 'དྲ་རྒྱ་ལ་སླར་སྦྲེལ་མཐུད་གནང་རྗེས་བསྐྱར་དུ་འབད་བརྩོན་བྱོས།', + dismiss: 'སྣང་མེད་གཏོང་བ།', } }; @@ -666,7 +694,7 @@ export function LanguageProvider({ children }: { children: React.ReactNode }) { const t = (key: string, replacements?: Record): string => { const dict = translations[language]; - let value = (dict as any)[key] || (translations['en'] as any)[key] || key; + let value = (dict as Record)[key] || (translations['en'] as Record)[key] || key; if (replacements) { Object.entries(replacements).forEach(([k, val]) => { diff --git a/frontend/components/pwa/network-status-indicator.tsx b/frontend/components/pwa/network-status-indicator.tsx new file mode 100644 index 0000000..8dd21f8 --- /dev/null +++ b/frontend/components/pwa/network-status-indicator.tsx @@ -0,0 +1,70 @@ +'use client'; + +import React, { useEffect, useState, useRef, useSyncExternalStore } from 'react'; +import { WifiOff, Wifi } from 'lucide-react'; +import { useLanguage } from '@/components/providers/language-provider'; + +function subscribeToOnlineStatus(callback: () => void) { + window.addEventListener('online', callback); + window.addEventListener('offline', callback); + return () => { + window.removeEventListener('online', callback); + window.removeEventListener('offline', callback); + }; +} + +function getOnlineSnapshot() { + return navigator.onLine; +} + +function getServerSnapshot() { + return true; +} + +export function NetworkStatusIndicator() { + const { t } = useLanguage(); + const isOnline = useSyncExternalStore( + subscribeToOnlineStatus, + getOnlineSnapshot, + getServerSnapshot + ); + const [showRestoredBanner, setShowRestoredBanner] = useState(false); + const prevOnlineRef = useRef(true); + + useEffect(() => { + if (!prevOnlineRef.current && isOnline) { + // Transitioned from offline to online + setShowRestoredBanner(true); + const timer = setTimeout(() => { + setShowRestoredBanner(false); + }, 3500); + return () => clearTimeout(timer); + } + prevOnlineRef.current = isOnline; + }, [isOnline]); + + // Normal online state: render nothing + if (isOnline && !showRestoredBanner) { + return null; + } + + return ( +
+ {!isOnline ? ( +
+ + {t('you_are_offline')} +
+ ) : showRestoredBanner ? ( +
+ + {t('back_online')} +
+ ) : null} +
+ ); +} diff --git a/frontend/components/pwa/pwa-install-prompt.tsx b/frontend/components/pwa/pwa-install-prompt.tsx new file mode 100644 index 0000000..167700d --- /dev/null +++ b/frontend/components/pwa/pwa-install-prompt.tsx @@ -0,0 +1,207 @@ +'use client'; + +import React, { useEffect, useState, useSyncExternalStore } from 'react'; +import { Download, Share2, PlusSquare, X } from 'lucide-react'; +import Image from 'next/image'; +import { useLanguage } from '@/components/providers/language-provider'; + +const DISMISS_DURATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days +const STORAGE_KEY = 'mealbuddy_pwa_dismissed'; + +interface NavigatorWithStandalone extends Navigator { + standalone?: boolean; +} + +interface WindowWithMSStream extends Window { + MSStream?: unknown; +} + +interface BeforeInstallPromptEvent extends Event { + prompt: () => Promise; + userChoice: Promise<{ outcome: 'accepted' | 'dismissed'; platform: string }>; +} + +const emptySubscribe = () => () => {}; + +function getIsStandalone(): boolean { + if (typeof window === 'undefined') return false; + return ( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as NavigatorWithStandalone).standalone === true || + document.referrer.includes('android-app://') + ); +} + +function getIsIosSafari(): boolean { + if (typeof window === 'undefined') return false; + const ua = window.navigator.userAgent; + const isIos = /iPhone|iPad|iPod/.test(ua) && !(window as WindowWithMSStream).MSStream; + const isSafari = /Safari/.test(ua) && !/CriOS|FxiOS|EdgiOS/.test(ua); + return isIos && isSafari; +} + +function getIsDismissedFromStorage(): boolean { + if (typeof window === 'undefined') return true; + try { + const dismissedTime = localStorage.getItem(STORAGE_KEY); + if (dismissedTime) { + const timeElapsed = Date.now() - parseInt(dismissedTime, 10); + return timeElapsed < DISMISS_DURATION_MS; + } + } catch { + return false; + } + return false; +} + +export function PwaInstallPrompt() { + const { t } = useLanguage(); + const [deferredPrompt, setDeferredPrompt] = useState(null); + const [manuallyDismissed, setManuallyDismissed] = useState(false); + + const isStandalone = useSyncExternalStore(emptySubscribe, getIsStandalone, () => false); + const isIosSafari = useSyncExternalStore(emptySubscribe, getIsIosSafari, () => false); + const isDismissedStored = useSyncExternalStore( + emptySubscribe, + getIsDismissedFromStorage, + () => true + ); + + useEffect(() => { + if (isStandalone || isDismissedStored) { + return; + } + + const handleBeforeInstallPrompt = (e: Event) => { + e.preventDefault(); + setDeferredPrompt(e as BeforeInstallPromptEvent); + }; + + window.addEventListener('beforeinstallprompt', handleBeforeInstallPrompt); + + return () => { + window.removeEventListener('beforeinstallprompt', handleBeforeInstallPrompt); + }; + }, [isStandalone, isDismissedStored]); + + const handleDismiss = () => { + setManuallyDismissed(true); + try { + localStorage.setItem(STORAGE_KEY, Date.now().toString()); + } catch {} + }; + + const handleInstallClick = async () => { + if (!deferredPrompt) return; + try { + await deferredPrompt.prompt(); + const choice = await deferredPrompt.userChoice; + if (choice.outcome === 'accepted') { + setManuallyDismissed(true); + } + setDeferredPrompt(null); + } catch (err) { + console.error('[PWA] Error during installation prompt:', err); + } + }; + + if (isStandalone || isDismissedStored || manuallyDismissed) { + return null; + } + + // Case A: Chromium / Android / Desktop with install event available + if (deferredPrompt) { + return ( +
+
+
+ MealBuddy +
+
+

+ {t('install_mealbuddy')} +

+

+ {t('install_app_desc')} +

+
+
+ +
+ + +
+
+ ); + } + + // Case B: iOS Safari guidance + if (isIosSafari) { + return ( +
+
+
+
+ MealBuddy +
+
+

+ {t('install_mealbuddy')} +

+

+ {t('install_app_desc')} +

+
+
+ +
+ +
+ + {t('install_instructions_ios')} + +
+
+ ); + } + + return null; +} diff --git a/frontend/components/pwa/pwa-register.tsx b/frontend/components/pwa/pwa-register.tsx new file mode 100644 index 0000000..aa828f4 --- /dev/null +++ b/frontend/components/pwa/pwa-register.tsx @@ -0,0 +1,103 @@ +'use client'; + +import React, { useEffect, useState, useRef } from 'react'; +import { RefreshCw, Sparkles } from 'lucide-react'; +import { useLanguage } from '@/components/providers/language-provider'; + +export function PwaRegister() { + const { t } = useLanguage(); + const [updateAvailable, setUpdateAvailable] = useState(false); + const waitingWorkerRef = useRef(null); + + useEffect(() => { + if (typeof window === 'undefined' || !('serviceWorker' in navigator)) { + return; + } + + let refreshing = false; + navigator.serviceWorker.addEventListener('controllerchange', () => { + if (!refreshing) { + refreshing = true; + window.location.reload(); + } + }); + + const registerServiceWorker = async () => { + try { + const registration = await navigator.serviceWorker.register('/sw.js', { + scope: '/', + }); + + // 1. If an updated worker is already waiting + if (registration.waiting) { + waitingWorkerRef.current = registration.waiting; + setUpdateAvailable(true); + } + + // 2. Listen for new workers entering the waiting state + registration.addEventListener('updatefound', () => { + const installingWorker = registration.installing; + if (!installingWorker) return; + + installingWorker.addEventListener('statechange', () => { + if ( + installingWorker.state === 'installed' && + navigator.serviceWorker.controller + ) { + // New update installed and ready to be activated by user + waitingWorkerRef.current = installingWorker; + setUpdateAvailable(true); + } + }); + }); + } catch (err) { + // Graceful error logging without spamming production + if (process.env.NODE_ENV === 'development') { + console.debug('[PWA] Service worker registration omitted or failed:', err); + } + } + }; + + // Register after initial window load for fast first paint + if (document.readyState === 'complete') { + registerServiceWorker(); + } else { + window.addEventListener('load', registerServiceWorker, { once: true }); + } + }, []); + + const handleUpdate = () => { + if (waitingWorkerRef.current) { + waitingWorkerRef.current.postMessage({ type: 'SKIP_WAITING' }); + } + }; + + if (!updateAvailable) { + return null; + } + + return ( +
+
+
+ +
+

+ {t('new_version_available')} +

+
+ + +
+ ); +} diff --git a/frontend/lib/api.ts b/frontend/lib/api.ts index 54cf64a..547eba7 100644 --- a/frontend/lib/api.ts +++ b/frontend/lib/api.ts @@ -1,15 +1,30 @@ import axios from "axios"; export const api = axios.create({ - baseURL: process.env.NEXT_PUBLIC_API_URL, + baseURL: process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000/api", withCredentials: true, + withXSRFToken: true, headers: { Accept: "application/json", }, }); -// Interceptors removed in favor of stateful cookie auth +// Ensure X-XSRF-TOKEN header is always attached for stateful Sanctum requests +api.interceptors.request.use((config) => { + if (typeof window !== "undefined") { + const match = document.cookie.match(new RegExp("(^| )XSRF-TOKEN=([^;]+)")); + if (match && !config.headers["X-XSRF-TOKEN"]) { + config.headers["X-XSRF-TOKEN"] = decodeURIComponent(match[2]); + } + } + return config; +}); + export async function getCsrfCookie() { - const baseUrl = process.env.NEXT_PUBLIC_API_URL?.replace("/api", ""); - await axios.get(`${baseUrl}/sanctum/csrf-cookie`, { withCredentials: true }); + const rawApiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000/api"; + const baseUrl = rawApiUrl.replace(/\/api\/?$/, ""); + await axios.get(`${baseUrl}/sanctum/csrf-cookie`, { + withCredentials: true, + withXSRFToken: true, + }); } \ No newline at end of file diff --git a/frontend/public/icons/apple-touch-icon.png b/frontend/public/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e19be0cb1c3319d10df06bb16e604e2b87873b5 GIT binary patch literal 10862 zcmch7RZtvEuMjk)EFF`MNqrO+^k9jT8+40AMP}OKZHfP5&_p(wh{4B5?u$%sdLx5?bEN zrvVD_WpbWtez+IsLA4ppo;v5~OAby_6E6Ha7*$Xt&~PRqLga3oD$+?D2JzG{MiYz! z^PjvMVakmfo2w}*GkL zNCN;~Xb5N`ojw^f*ffyBPvwgA6DJxD-U5aHLG+WjcrmJ)JpeOY5sn$6SAkMa zm-!Jot<}h_DGYr-i8s(Fjhe$$V*b&i3>06sq0aDKciD+9f)a?^pNd?CSHiGE>9vMZ zhAWX&M+ATekePgvI$(?G60k*uiv}d42;c$$E}>6*@v8CaM={?CmK8c37-2sO`U&{7 z>4BT{Lhk;+3lVCmD5dqyYGyU49=yQ*J9O8$n0qk3+6$tzmN0_aujoI1rD0SZP=KVk z_(n80!v`9;P$Y2xBBC@C#lZ1X5Ws}lsZj3yb)vO+iCjzhl82CJMHqfF$a(sTI} z`P?U?wND@FviNrct#zWNtCrERhIXKAmo1NK zKW1)X)4r?vgn9OnRcNkFRST%MpU~Y*joQ_ggB|k_zycDomQ%Unw(v$z%813>A+yD( zZjU}>$Pjij6zOn$25gt(L)Hn0C+5~=AtVHv>3@JTZ*mlretrZq*AGY_bb+*=#DKm( z#p7Z+A4BOhamx9L75%#NI`SZkr@XXc_Od;&_$Pg!XXRrKjH&j@Q2{Gl8G%4*0_VXZ zM4sD?lDlLIfYM||ZRg}~!F#|qi46NCx#(5dZB}~H-xyM=%1?+eh!c&HJ_^ZV{;n&S z9E&q_hlHtL~!407iNBn9II1x4( z4DKXE3`s+}+I7I*4-l80%B51^xyGMAEjw$!FpZ|EqRYZ%ObgH6*VDpe7G?# z(%O;1@o?+b3l~?6dm_e5N&a}Nq%W<7bz0Jj2=rAIBlho5K=oCI7p0daRm8;hq3NW) z95PUT{@z(2#Q0eIK);o+433i_U@fUPBOz{=!oHc>9;n-c_Ao&ep={~Jnzyj|RIS>giUdZ4c-y?~)Tg)?Hu zFJj5ukMdlYv1)`waRgkA)aO|;mw)tIsRZQkS_Xc$@Y{T<|FeI*Z;;UFTsPrMq~BaA zhdz9IcL&FKePH?S=pXP3=q%E^KRDhqy1~DX;`)_pOdgj8<_Evs&y4N-`ckm=pp3tO z&aOxazkAKXRUHY+zngzXm-z7PALtp6M-ytP*duPaa&}Z8-7*HdqD%={Nk5Dgn zd@Ob^C&xN}HMmw5#A%tZ zws<9y<6uH+7we26vCr#1PS`)2QYcK_0U>#}m-5*^>WTy#;lUg!c!DiP7U^Iqe~B=x zChu%OOf1Oz%CP2Q?$2{zG0QdEY45+$IuW<$UC;~;JzWZ}MbUynk~6=`s%`<>b2Adn zJN=sc;&gmZW#U0V4qy6N(JQR%nX!#h;Phbe}JR zgeH-3aqj==;`jsxuGC@@3|-zQ8zI( z+_ieDBm)>;s(gLP2g%eYFfqzXpfJnF4F|iThwp~&X8iJ0GVLU&?`GyVCUB_BeLczi z<)&yVK#c+fnECyTKsV%nXL}yNE^nVxRHQ61LR=OvQ7$z+4QHu7#E zw~tk(Kx8?MoFh~GS$~`t5bbYHiO_!+um6QBcYTU>oqGFm1)5%3(%ZKCp z7IvyFzWB@1@OTE%TDI`Sv+mN}V}&swN+E7EmIMI81~7X)r*M9d%=MrqX`!O{-dEp= z)_3-a*dxnq(I~{b9!_r>0WvK-IL@-MiUdNs7>0G&o71v?k`9wUG|}(69zW*06>B40 z-dbKj>k9i?eAL*Q>cPfQoOt7yG% zY6~-HgO#^Km;Wm1r8<&HQF7D|2J(g02jH||2ijr*C}1x!`Vzvc;bvZ_9ni6o*^=J)7Ztt(bF*-<&w8+W13Zbn5mZxaya)< z@NTB5=j#=_*9IAT^S%O#{iE|a+I#eli)PAo!$o}?*bT#t6TH*9e%Emb&mrSX%W-IY z7?H{w_09fH+kPeXaQeM>`B?9}i>cdt?;iblOm%{j%+cnUI+|Eg{(jh3MmNZ-Mc$ib&NpgVr)@lw z=Qq+i)qMoaD4R-OI7we(bW zZDxS?v}=Vqx_wQ1-c#ZbhJj|1tx2ar84^C&!uQk8jX41(dGhKN{wbmCxaT}{uOM`l zuMnt{rGvjnOfavG>dd3qQ(Z^1FOtIwLCZT+1M+F*KDWv4r(c67b46^EX9jVhQU-T- zYji+Z;|?9-l$!2|FtrIIGO%DKNg3jWtz&RC6Zk4W(wd!)T2>W)d6LE+w39V=z18?W zeJ|F~n>@|`BvDx!)Z$1-?0_wl_++~32E6QucuIu&gEGUaV`u;MFie#8yBS-xmhQ7Cf|V8*O~SqQ?-p&i;v;KG8*e#>DX6^Dao@U z(aCFuAx25MtU2^s?`Y)d*!R{8>T5ogzTyCqtzQfn7VkdHwRu8xdIQVxk7^2*pN^>b ze~2i{rJ|6WhLX5>-3#>eOmcfhL1> z^Z|8UC{DI){F~&uYup0HMg}S|4E}u_n_gPHr`dsrXS^zZudrm-p?918Dj(O@P?GYa zL+eZLev~EIHjPZ%d`NrYqP(yxg78wQ4J7IWZXe`iB!Vy}9Mezpo-YfvPgoLPSetIFVW(^P z7t5z4tumOE2Gu_5r6&in0v=sd--Gvce%&6M`hBTi{aC*$sOy9ot_f$B6}%Kes4Z^T z*5BUj?i!vZ>(4oGnE5_+vX87S4BW}Gl-M#fo<1sW#i1x5UVxRY>_;`jI$ZWnZxx=z zQIeF0nu3>_qN!y4T)dT14wmicAiMS;t8oY!AZQ_6ILdRiHA}uE1qAoqm@c22=z+X) zlO`P^&ueEN#f+A&gyF=UTs$k;T7jrW$@;idV%p9x*Xx1X*Nqx>(fIFR+0DEbLAGCT zS~8L8n|U$Dpe14}8E5etbO3+@maFLi8G+x__vLQmxwElqu6kxq@^Ed#TgT5AAZFxR zM}b=O#O)9(KN+kjF>MwebE-UoxqJ=Mz&;^W7z|*JtZ! z4A!HSm|%#46v|~P6KI~wOiagq0ABM2dh+sFI8Vj)6RcK^M^t;X9$1ua@^BrPuEb8ccFG5oi^JOkv5O3o}V_( z9VwrheK6Q8rMcCS4^PexZiUdg4An#Bq)S)FK3Or1VLW|M*-pOPTA{)_pQ*4+pDyOd zR!P$jT>&?y53%WekvSIF8OMX8Smw6KRfK`Et8k|Ia0+>2C2T*OY=#P|@iC87=qkHH zjJ|9u&c%?G6sSD1f_*+K8mr}HHQSozkEvKfUbBis_GPB4X_D7YKW~_4v5gAQR8hi& z|3Zf<7es}1DJdu!^eb{CB|oLTD=v(XIFS9dX6F`sMZqpjHH>aGqa~FuL8`PyVXfU- z)ZQIvhv`>UaH~P|kOM`YcJEMce-9Lre}AVrV5BfU-w&GZzw~gVi!3Ha7)aKL^!+KJ z6iG)ilUkBVF3&|5A)mX8zLo-xPtStmk{OOBUI;hD$B#`0nucUqB%Gy;3=am*(~E_kaRPA!l91^#C^?ODMFyy z`+Od40M93s@KY{A3kUAycG-*yUhC%x?n1+q!V*ML$((36b(bhE7@umaPeMRZ`v>o? zTn(DHViBj}ZA1Bskf;uB$~2&T?cKD>MNWZq$Em=l*gyWcuVnPdDkv-QsAy`7vqA-Z zl{MY-h&zk%bxli0@$2Wa&pS8e#_ZiB_kMT-2)R=VX7_v941gYkVHVGjws=wnl>}C8 zSX}Kn@JlV_H;*03Dy}(~C_gDVF%WJd(5LacS1*`aNs8@lOA@sZRLm8xUN3*xULN`0dBN_($R~uZ#dz*4oZ}F7u@l{a5K!Th1*`lSSDMPlrUlm9+se0r%7%&fXu_zklEC zlgF)^NphNS;WYAd4sHI#DdzckTa~bMXVTr_Jn6eb*^#v=BKr7`?KR4;goc^8yf^Ur zI`8$mKVzRvg0n~g`Zc|5oEr}QhanNFV&O)eNuJNCZ{4bZz=A+Hoe^g!m&rF$1qPm3 z1RfsB+st0Sv&E9Td9cnKLWbnBktyP{BUW&$<=TCy%yp1>Ns(=OU23PV%!=l7x&8Cj5KvVLet zUt?MQ?e#_{xs2#bLg1VUO0Lcw-*s0yX}P38RZoU$Kp7b5E7%k%_HY&<*L$>53ISdVQ6InBaLx*NWX06Um4zL{ZG-tOB$yvzZ<#zGiR%}Mr+LHu zFW={a-X8CRy;p&tlM$7zi3#s8rPr+n%^!Q^TpIWZ;UP?H$FsS?!g&{pBU@tpe9wIg z&J^CFlg2(j%YS;Nn^OaR){(bekH*FE71l;+DKrXyEkUs=VI9Q@mQ=0J`>;Q{ZYa=n zeS37m2LM<U8b zD~vXJV%<=0fj9u%pp-ZCLwawMZrtE<8XBcCfcVlsOS(F?jx3<3;`6N?H= zUPg5Gvnq&y-EtyPQWU3CR0Ou=99Ir5hH^jcvg&$zMFVcTZ`vQ`RCX;zcMlyJR)zfP zrHO}FU{S}?@^Fh&TGLEYKyXsdp*qUN;_I-1@tfeOzwVh z4|R_;UBM`utruw0skRt zbPn7RBo8-Dwnm$OG{14{47>=lMyPA4LFS>NsNrSvKi+W5_|gCD>@3zQhr4{o?BJz} zA~L$_Ykj+C|9aFu#)f5q+9zLC16zJPubcFkGQ z&;B?cYxsu02a0_`Dp*v|k3l|NbT^1Gupc^epo17(|7KSCA-s*9xgTomEP4<}(ku4a zt29DU+-hO3w4ZKjpqOGXb-BT7+q&0nTcb1A=u~^(ph4(Z?}uO8bcdUpFI2$LQB?gl zXS*H#+xaZx;iVt#@t}%`F9FlKhOyfkWtht9Q%cb5!n!$(Gzs>Wc@t2 zq+RL((G=x9TsTF2%i~D4~hesqwZJY9h$A`0#o(eDHp)F6*82C6tjtA9a7KqERqE}o@*)aw| zs4{7yGnm$6K%rINEGx-AGcJAiQLo#?+D+$kIWjhcEdOy>`h3HVv$1#|8LieVLbVF>fh7~rbsQyx_qvs%VX1q8(u4Jd;-?)i6PxiuIcp3TqOxA25@rYi?Hk=hP1RP?q zPe=ry0y3LENTG(MxB6DWjw)3u^91{h?ZyK4ep5B~tLb~D>luS0ifqox6}@w;YiAGq z)kSIGalwKu?Xl#wQLK}Zh4i#Kmg+X;dN$?NmX)9;%}UE538v|4=gQ`(2r3u%-?21i zCd{F9>QhN{*Z6B^gA=mAF9vxjVunfntHemV(BZs8>xuYjCjQcB zA(w#hF!PkZdNGDoCE>{g?4T`9jTO|T=+Tbt1})M-!4uSz6CUOjg_ z9Vjqj*GE=6{;vDXe{tVkBB=Td^G;isS%47vlh#40jT-a$_h5O4Sw(gHowSnVd5W~K%a|gVDJ6nP1cIYM*&(_zHU)OHm9~>9c2w%40DCP*)^NW zw=20_hBC?XnyWTh)XgTseA$|hbM}78eMkaYPHz4r;LSR4 z8E~l09!Rfm+k@u;e~U2fC&9D$_HN8sxK9|A*q#iZC^W(>2|>+Z(9+<7aHplVjlZwf za?emK(PZ%e3DCth>gv&C{*Eo%9mx4hYxOQ>$ILhCN`mfEdY;+f(0U-w;0s@D#VR#- zSBZ)HmhVUmSTag-Ve@A!Q?wT84`rzeCe^SBF|hJR!FmbzsJ>qG>;11SU{EXi_bU-q zN_s$|_(MW@z@&e`=Aa#PC`UQ8aJDUsMb8~^^&x;cW?K2s^&{clXCeX<71fMc?tNT# zhlJxDjVkI9ri6^eXpK&xWbNJ}{XU7kvhLY=1lvXlyQRKyH(J}rl=o(go?uSsvoaUa znQJTr>S5{59ZRH74 zrn8yNMXGeGqvpk;In1SJ~%=~}cz2s{#NlU(bm>vl;Y@)2lQyN)x-$sFe7 z++cZS7pOogj`9*AZ5)@Cf$|D`b6?IaDAA0)6p561S0w>aap(D>9-=8*12m55BG;%dxyiJtzJ38O5#TK6d|yjz?;m36v5l&t z%U8B3XNHmGmx(o$dOcd)N>(VtxN0aaIL&Ek>I7C=_#*9QLs;W2?Ih>ftE#QIf?ro| z@hLMbcAX?Dq5(HXStistE1n{Mc^}S-a1_JP0$4?LFIArX9XBKV3J|&<73-PmM*dx) zGoDB_x6)0vemlHctI8WLdC9&kk6~5KWvG^QsexBp7d`TCC1dBGDC>3{U4)1X#Km36 zWSYQEAzK*K8FamV7wSMtzNWm6qqEo}r-|g*ODf^pXQfADU{okD0nJmwiMD=~UNC#M>n^rzuo_cKd& zc~eu=NQMOx&re&uEX21K2SNKM79kAp4m$QSbS3#~$lQqq$^kswNQ%8jl&>w{Q zTd#$%$I&-vwT~`h(?gb&aXNjNz(sc-29z^-cm&Sz9b1_xBuuLvk44R9&yD@|J#{-x z=xz5cTf{`{F-Xcf)wV)`-@p)mU5a8X5^N^#(ZOtIFMF9D0o9b$uNg3RUllYm7JW=t z|L2rBW7VnS^FAe59MAprU>5(8)yW$S457ZsQrJ`cIS}#Xb)2%mcT26XNwuEr=Hv`r zk|+gx5a2-vIil>j^LVx!>o%2t-c7k5t?)X-UJr6(Q2&~5un&V^b|0gPklYhn-d>+~ zUuBH$Rs_wrQJQ?8G{lT(Tf7!~>h>zE#^&-vGxL(=K2wrRqM@|V=zY8%kFqbnv!gfr zN@)Vfv8OjH&|~R-d^{Hx;Y(Msm?hl_6hKD0`xGa#6Y;42`0Q0A_>gvd^PfQu4XFkk zdi)1J;X@?eZ1OPD{E!#)_e^uh!s;_RU)Z|p{_iucZq!JCzTH{CW7tsdiw=0-gyo%~ zOXN2w?|o%w1?hWmyZ*FEK|#>XN+soM2i>0eT1^(rdB5+h&j=VP-w(JpF&4a?rtEdU z<}nq%G@3{-c^)AO>KPKCPI@^gu&8_9Ew^B6F!U}wi+V@3>MWuy%33yrvoooE*VV?! zRCEt!oQOuaIj{jIADWkON-YUZc#r~$-@@u;h2M*+su*+D!!FSfy_Ux-ni32_z~~=2 zpGh(Y-O{Imr6QKec0xL5iX2jMQw)wYDiTtSKF5{@qdeCI^M6Mf_mqK;vm@ID{RV9& z9fq)l05mZLD2%Cf<4@I1(bIM*(cZ1rOhC5;l44(Fb)XN9rkDVNF&e0CsiijH?x`Vz z3p%*Kke4rtvj34HJdNqMFCySU+5N#jYh`YNjk4?V2;I-QYr~J}L8>Y)mf#jgmYo|Q z{t-u5MIrF@_wQq|Hvf$(X}w3ZXX_RN`~(Vp^Z-Wt?#fw_D{O3Iiu`;>5hZE%_;gY) zWN+eVW$`zQ(fqEOTUPD$x;J%c)Cu(9yO!h#f7zko^*xE?<_)}5daU~wRr$c!JRwvm zSz9yq7cO=F!yyj>`~xdEp4!kMvhwA2^kp+=?|NYnR_$qlKfrnPG}t0WoAlAK!2lRN#C1(6i=u z%r%+xC{FnK7W;DiT3r7i$xR9XNK|#~x=D!0b7`7?Qao^{phuh50*;P7EZdDtJ}66}2Wact5jh$=_q`cvgL9 zDVIy)>*e2u-`D~yKe(&=O@F!&JdxFrXnKGBHby=-ps7ft9^~IVChLZ z4TCSe#mlt;4e5I@5|aNR#9)czkPbF0Gi~2D7G1Y96oTc~8r$knHn;hjn^Xm8@HB1#rUD3Rqr1$j!_`88PU$4k_|2cu=OV4L9!Qt<+ODa0ISwe4VAilDyZJS8nFeAyuPqX{12QY(1X1<8OQYSryMO z%MR?(WNSbFE6A~A{G2ov3$-#e7#08z>#D4N%^1@K>oa5KAd*=92mV%+PCS7Z9c1ds z5KMS4N8<4&d@tUalQzbk6GQg4+mlr&c9Is~!fkq|Tn*govb;>woR<^86afRHL{8ZP zWx27@u0sCCf`tTul{h-==2z(uxKu92NwSsgGZz*s3+C?(vTnDQW$ZCAlLCXcS|cO7 zGdKXd?6f3LQ+uKVt3{%ql{}hz-&ne}BwnKi6sGJh_8CO?8w~)`R~{9-Cgh zTbcGJ2BxBw$8%%S6ez8`ZTKh`>Lb@1`FKXPcIfR~W?2yMG4PrUSkCer9KijMk?MgI_v@m>E$!@l;FNw=FP z$u-e87Ud%LrXWlsxsvDUwObnSJ>PHer?~CCq@-~mBjApQ0tAvM?|tK zt`?LYIaeQ*C$e&zzcXHui*_C8o3Q5CIk&CQkSA_(AKHLx%~e& zkPhgu0~2es2YY{6du6f2>KdUAanz~52gvHM*qhlIX}3brh_5Xi6s<;sG^CUg06fq0 ztWVE+`%tg>lKYZ=Hq5>3;L;BOw1fE2SW6Df~yf6z$8g%DBzjK05AOes%+NFC>zvl+9$qXsbEmVX#)Hz)6k z#+_d(!AWyX8h`?0oQMU~r^{6$S{}7^;XG@Ge**Ti19P$F(#1mTeWvj0xE^tb!1Q<0 z#0A%ZXlpA1Q#BU8V3*?*Pm2Ydl+lBKk&@JJ;9 O0000Y!O5Qg8X?wQ${*|oj9*ao~{FbN_Mz)?a#k-$>&2RKKH@^^B}KR}Uk;+iW`Bru8u z1cE?9CM4#=-yf`ZZSQ*LqpNaQOb}q38<(wPPgmEYx8JTBI`jQcijNqKj~qRK9zYMk z?(|_eZcmT&wHAh>jlAk_1jV4;7jjYxIE^jmp&{on)B=DgIR}&GVz(0UTU#zz-%O*8 zmuV?kY?ti(dVFB16^(rmz_|mnlV2TJ?jH(Pj`?Vfd42$6L$DWtO&M$pAof9QLDUsc zRg6j=s-&T~q#}76lGov~S!8L76j5tA8GP{P!cg%HEqPz3-2(e|2i86;2OvQ0|1UShNU6!VXNi$^*$XZpPM(w&9c z?h5>T_nXqm^6bq^CyRyflff!$B{E!$eXkH0ww4I5i@jNRJB;xZM0w(nv{hP-d}Hh3 z(%{PEBbz*`*T&!8Pdm+mfLiq*Kl@{mOepM?#48lZ^J5qr!B`(;d{tN_Re&6+OG#XU zJZmFQTgZ|YkZ*7&N#vJDmyQX0(Fb`TvRVDy!G(t-#SL$C(7VtdD|b4p$nr&GNsfFA znTR+6IS7dYAXYX|<1<-n$XaXRg%+haz_X=bA4UJx4gn91X})E7~RD6(9TIMZsRwmH2PuFkDTjs3+| z-}&mw(V1pEwI{&xR&;2tS$G=y1_~oj8v{$Znk9mONx`JVB-FJaK>-i|RZ;;#lvR|K z09Ye55O#vdhxhlg|NP%Z`Q)Bg(8<02Cu{qfKYTeevAEiC07)ulv*T<#b9O6roI2%P zghWBzS3tr{${vg7vG~5pqk_$2-$*Q?I$RCRulEjLPn&;AyzAN{!l!;Ohz0dmq6i@)F3eoPBq&f0xzi)5;Q@VX~c65SBohq5VIw2EOu0B3} zDzFd!8n119vDQqT0LrXP-CFMrdhG`if>O2LxA*5t_pVNzK1EP@U+aHoL6ryuN}Y+X zJUn~q+LPfMVZoTb$XG*Q0+_lz08kJV-GnXxGl5Hyv0=fOYfpx6TzPQz^HfX>0;#^M z-Hv^LNOe15Y@mMs+tC;9P-*Q1lZyh&Z?vOVCIpaXq5|7~u|6>M`}0vV-6)U0ebxsL zqi%vK5oEei8J})caIyCM`h}6jTBl8!$9cd|D_tS8OgIfJnOk#1^OLhjCbs>g3f`&s zt^oh*0K+61l+9GVS{o{M<|{$Fs0PZASNSBln5>zGYtNeHDg#0!&MA9)jbrNlmiGX9 e06l<@4e%eC)BuHHsZP-V0000-z@m!;O>o!6-Q9f&?(Pl=uE9fq03k>M1Pe}ZcL?t8EDn$R z6Yl-^KJ?5~&2-IFpPHJ}rzb{LSq2-E1QP%NV9Uu$s=xH@|1luiORK(Uj}8E^G|5Sd zX?ialwd^EV>ZDV8kF;Fhp6+oD8YF93rsTj=hL6oOCIB4F7|52MZ@HnSmr}umo$^5) zfnk>gR+qos*U?|8k8xM0O zuO!FWbpA#jvdKmp@_|ocHM$!DmWTwxq5;4S)^RWdCK0{>_<+pS!&ZioO3ji6SBK;= zcD|c5lpnVG9wE=IQ%0D|AokN!mpURk&6(inCg!!7xnwFMUUB3r6NCUXc{u;zQZ_sX2mtWCF(Heh*W|@_E#HJ6{mMo#Ii{yAO{FerhAVGNDHEa^ zMpUXM4SMv8aWeAphjN;NLZ|@oOF_uUUz0)rYES%XPc3V+W;gtsEB_ulU8%v;D66t$ z!DIkbNn})whhQ{G28z#|);IjIEp*gus4wmlXsI2FOnF6-*BryM=3AHO6ES`hO3j%i z%@Y<&Qx{DW%vT)sBnlh+%K

gys-1uga!*OeDcwam3x=S>8$RA$O%h~O zz>Uw|<#2aFmP85|mN;JfgiQ^QOV z$%2us+i$s96D>Jb^GA-SNfUGK)V~GAP%&ogQb^Pje0_GIOq4rO*+MdYTtUJVfR?Bj zr~<%9)I)xVqzG(CV-F7n%=Z-{2M>C*t@SEQss#n`99m7Pv3@??i20bIEFCX!;6ujO zHI6+K3A0040MKR@&~itDWzfPUb-gudnaJ!N8~duOH(37^qneaZz9V~Jxf?@d%5GBflgVHJE#&T4t1q z>4)`3Wh7h#y{B6D93z$E3w8+mmndFH3|RL#Gg8_iA;@o>D4L-S&osEFiqfK;UjiH& zvU-d86pQIQ>HQnR$*BKU()lzl-;O+jmpYPRUp&+|)*F{ozguUUEiIlP>kWl7U(#$9^5=o!DHO;A`o$?*H zoJ81vQjoLMk4}j*a7IGYLKI2HvZQx|p}h3#AUK4b^rgkqR_ zLH;&eBbJ$wwA@X= zm7nNdu)n!f=}XLP;|!HJFqkEv)EjM}OKE(B5=E-?e4fCX3t2pz$`2T$^YOe@VU4QfkDj%7!oT=ox5Vow^A z#=_H6aFA4*ix*{?``ou^_m>_E}G(K;zcvY ziZBC{f|J=x?Ey>&V(Fe#3Id6L9r}{r_pS33oe}ocqUcS$O2dYg6UU~%(sNCQ{*znJ zsjqFpe1d1o_dtH~jc2)-K2P2rRM8IjY=m7ko(LzS-jvg`YWzY5g04jmW12vbq`xPbTpTN z+xw+SSl)i86>|PlB~6xgsI%W{jP=g$H%mHe$OT6TT(UB*9$Ax`!rj4L6 z{o_3d7m9mKYbSP=FjX&Gt0HT2-G4cljN2=QW><9^w!_)Q^G#!-4q^-@g<(wPX2?^>`GPD}{P8MuDL?fu zKT=Z2##XtRW+wXQ#_M{x3+ehY$>ndtf@U8AfnmEbho#VlW@Np^7qWAF)7~gZJzb@i zK2$`faaEHk`<$0vjL!pj|PI%=SCG|9d`r>T?MEd3V?LE0B zVs3j9yI#l0;E+@Kzsh@qRltESOi_l0#<-$r!50a%NKZ>?C4YkOjXuoKeBK46T7tTX zdJ%ZhT&3?q`XxrYlIWkA6e)f19zLu;MT&UR_0`Lhy=#@1JY2>UCZR{CW;=#8x_}1a zESxv{+t4@;BrcBco$qV%+Xt>@FD4k*0@r@`0TS6unW)^d0+t`VGV;$U_k`N*=UN`R zN<{HwNc&?PO+qJ1!7(eM+xe8nqt6J@utJr`D{{ZtuTU?+DeE&>y+N1isdF*0dB7QY z!|C%QMNt?bl*li+9Sp{^?T|~QK_{&LL)!M-!QUvrknfXt5;`jMDENF3HiU9n#Cvso z{-ZGN_HTi!(=YAyR`ziDu*g3%mQxI&u@Z#!YcVGeEIIy&laO)O+5kx8>x#3Jo$nzQ z*HC&?2uAS&Ui9~DMFi_JG-A(M}Z1>2K zIPTL8PmS$FA^PZVKO4G+Ai&dg0WUY)i$E<*gQJH$3FmP6cVfkAdb6C2vmbBb1hHhY zU2ek6l5%`fIXjx|9-|;_vVFrB8V5ve+%@VV>hl6RIE@xuVocl&adZmz@VmbHvlypm z8Xk|E#@y+%BAI*jW)h*@3f#@c5O(_tqhf`V$B;(1+mcORDgv_4JFceDW02iT&w9jO zlpW{NrvnWYM3Er>BIHnKw7oT5g6Qg*YviuX*?B`T!0k-41wzJDuk!MsuL&TpH=xTS zrIw72FUIIxO(hY1ncy1$J5NzH1cVJSZ0Om4KE|-q_jj>d7zuM4$KzVYm%nXuJcyrf z@I%se`ZMy6`Gh9yb!atmrsmlG#kP69@8kKlq<`Zy-$ZPe#fHK9<1vLG7@Iv>68Hrp zIKeMuEU6;G^}6S$e7W1#Wt$Im{#-|UcG)Lh8j2pXyd{Pyj4BZ1ypg_J$&f&c6?jq(LejC1;bUv6@WU4cyZt0n z)nagt#9BGiQXIG?D|jW{=sJ>_1wyNbcOn*I+tQS8E2_6W>6sikw9X6gBdEN^_*J%V zu$@EE_&QJ zHp+8!!5_vL&H;Ggaveb(V&Tk|^TvrcUMC%WYqD##HzdxA+z@%w8Wq{ngVp$fXytZG zvaqvDo4zn`yQ1>%__=M{l-_>Et!*3Ecx+gNWX!SvJ+B$r+q7XN{AnD9d7 z)20*>WTlefJrirxKdc@wfEbLoUdq1&ARagf?|+TYj0SW!Cb#7xRxhL$<-m-UXRpFk zQtc;>`>0kDesSN}?EaLodsj|1x`woHem(}C$3yCIi%19l$8EBlseUYzgy zwe?-}^~x6Hzm_R8!F$L6T1%EbOl0pyrE-`38+V4nTlOL;N24erQamUFpN|^zAMMX> z%I~K)&-=ipf1*}p8?VMi9})K|Ob(yBlK7=?nE=6>XzP*(dG5RmWo^rfod{{N{y4E+ zM>?^J+`E*3Jtdr$=~HRxc$*02CM|rqlEa>`WP-tD0*M%U!S3gev!~;5E?uVx~Jg$bD}w zgA#2chylo!I?EQm&Pv(*aPhnrvqf3kq|O20(R^6<&H@UP6NDRal2gY{6ZUMSI+fBY*oH(Ij^%8nxc2mFkKxiu!wOnJjf z^^Aid3wZ%U#tfSc4k;WR+OaRDB&Z~tABZKwqQl9!nfG;N$e^8H;}VnDWwXYJ*NcLa zcw%eUXt7ajQ03Pd>Q*z?gr+-_dd}2`TNK?)NbqF4P;5Sz)XgVttbvLKJywXm6UF>6 zaGf-sS4#Pwy_=O0{V_w*inTmdQX7{{>%yqVFzRRwrzw9Q4G_$n=%H@CVbXe$9GzDB zhTk9V5z?C1@X8vnT~e>oayoQ*m)kGPDl64(`p?b=nd2kFFbI!?#6XM~#WVy(t$+0E z{71u8dp7(?l03IG9%ylhX6O*e>8<)D0nHuCUU!UZa)|3DOh7;znc%2elAl_;Q|ZmM zz(9q3SIZF41hQ?@Whk|aeH9UCf!+>tVax3DU?R4{(fB#&vG0<5Clq5>X&Y5Jfs{e# zPK!m}k3!V~lU>@7pWGlD>d@f) z#h^Xt!^+m-ilLB))t8(TY;rT=F3Jwr4EXQwIXsCY9bO_H#tYRgr1~Cs_Dt2 zH{MiL#y+?dFzA&}CfNF&|mCG^s$GDNIx-=#1#o z5re^TM&VT;*NXh(tqZvtfI9Na^}w0X?-v0jR2=$=LB|6wYs<24B&_{UUs!v|b*FPg zd{`k~l1g+0Yznqxi+oX}!i2%vVw@M0Z(4x@P|~!bRxf1CSJ{dv7uK(TZg_9PJC@>R?>v9f*D`MrpnIR`&V zHRe)CfBN0lr;KcZ1ETE7i@}x&2w=5~d@(Rh>d=7L-CK73Lo(6MN$X>7WAS{%{%Y(2 zTOUWR0@Z{pEfzltp*OOKF=K%0bxMyWqhOAlgf_Z+kPcu3PyKDv^K8UUI*v~BLC{&> zFo7F)Xc{ zkFB3?3@F_L@8|9=3S{Y%6*ZERcp@YHjHH1Kd?=Pe_qZ7eZ5@!l4T2T|N$D@-XSJiu zfG_NTR;;JJ{)%I}dfa=_mH>P8VE=M2*?b z5pzXT1_W=byd&%_(!UZhBHgRx;+25y&Z%)<|8LV;97#QFlAE%E*xBvjBGy6PXNS!T zfQLG_iW9ps!@_>wKt7$f;t9tev1?}xqVaQAmAJ1*p-t%~k@pDOU_0{im^4-aZ${(PFW&LR%y zmL4VF0573y+8I>-t+qM0o3xDl=9YFJZoKuO*7Lsa^$?a7TOIveUb{n#0LO`#^=0urfKSz2(BueZYiR;CKD|qfvP)J znC*SRF~}pubPWwWw=>xaQH$jjJ#Jm*jT?0p2_sXy0=-N}F?*$cKk#Awc%bNWTd5a1 zp(Kfl2L6PCO0}tllQ2C;ivr{0nKDm}k~GDUc^w)827>T7Y`$c}svsGJM1E;k1_oL# zH5$SKBFK!cmKXi~S1Lhv@J3houM0)v;13`u^fmSwnVdHZ`pVWAgyCv@Vd&rUR?pcj z{MQoo?OeFnCp`X}^~2oRHw_ORfD&6_6_0FnrFmYcHXaRyKkhYAj!IET zRdyk{_&MiI6t4NuVBarYvGWZLIA-9thvc4US>}s65$Bmk=g@#C-%(DZ=)u2a{5;ks z`SIhrFs?X|(P&?rdGK*pmUWPHE~*s0KR0E1W|%XMPE_rm5T_mofjq(GhGBCgJGc^d zX^0cbx!a3>>^_*^(#F&5Yi5NoRB1|4QE~c19>eEjw>NfeM)_OxUW979EanC0`ImLx zZrB+jOF2z<<3_+(;l2(XIjTv5LsII~55 zA+_+cQf>7pH?mneoa*}PcqJ+7CVlQg7MBCu_{XW{-GtFdBq++6p6e3~^{?)J7*|18+%>=qqQX|gq39UczkT7T14$;~T}c<#-%4)k%c zxO*E}G`zt^1-~ZT4GKIa%1}`%u?{{btzGaqF|<`Oe)bM%@((CSD6%U_Q+#)4C9nF; z6R*86ZeLcf>alU#PSD6pIkNsvJ|~T1Oo_pv1Ex=?} zK;PEImKW6ZFZyHRXt1U?8yHA3D}OZVJdI+l2&Y|>3Bfa0&4zEV+`LSl*En?o{c6fJ zI{K~*BU`imuCyry>jkHob$Ccym<AHtZF# zS_+@?HQ|I66yR?a5z}J&VqE%77&yJ{fOF#9Wy^iYlG}B98(5d(L-071*xddZjx zns%_JuOmJRSK{Y0@41v2R@M!IFe*FD(D+GKWus-IrJ}KiFoB5dGyZNfe-!%$+P!68atdeP-SlHqUOdlG&{S;YM*)&c7-K*3lA{4Txuy4 zU+L9Z96{a8%Wc7a{$O=*DVe#SLq%&7_*(<5#y8VX^zL-Z&WV-M*Glvr9pUi`0C4^c zdAL~dEu4*>s@1%m1%-$~x1B9-De$S%(DVa-wob9GG)-3`9Dm!@6$jpS-?+xfPMxL* zrgWHkFzsH`ha$~9@cr<$8Q-HlNE!`4adFP^PvkLQ=1!NxcKKdFNy@K!3^!>!a@_Z9 zo>02WEceaC3fTMD>e`}-EPUgsys@kVkr}#9D<1u!ZEfF9{0KCLBDA|LqqAHfN&t_dqQV z!qh!zaIBj%1%*8U%Q^3_9LX!}>k_o<2QJjEb!jFD^18%qP~^UeF>#=N&@~o76^H)5 zGe0tEy?0H;OQ0Ck|8l0adXH5f_;j7udK*@er{1NwcD!Z_>^6!jIM_5cvI}+mVI_!t zQiT0f>qVATjUG;Fn zf1t*HM{Na+TCMWk=B3BcRXO=dmVsoYpv94j$=cln#q4R_1Z8^PVicrGQ_Tj5xkx_q zpv57*qm@0+6~YHVsgR)-;h<=C+MaRekyvnSgK5v34~89eJ8T;maDSCx=Z`K$T`W~O zQ+zr2`A!K%{r|)Xuw!25>V85%-2{!caC|ef-8oF^HS+5jg6@eYROwCmkw+ zXL1OoMOtO9>3x?>hp-U5or3Yxsp0gNY*W_{U)aQf(KHD}K9u+S3X%2Z0kW z`c%K>oHaIUCD()ZuT8i{K|&?XxdEq;7lQ-r;HTMEKIc*jAPyXDfbtX3)^_ju8DhMk za?*CPHReN4U8ebIB7a5TtejHB&jIdLzER19$+L|5HKtGYD=oJmT}D)1rFLh7Z!CTL z93fy+xXlI*Rr^7yU|q)A;>qjgYqa-vX=r+B=sy);-wAB=0mfeS)PH5X! z6CkmjB{fS|IoYB!byI3_WXoHW&s06wNUZx?x$9?XYpzSU;fJX??sfwE%N2ZjhMt^S zo&=@dWd@!#46eWAH!ZbHcE6wex?>}Oe{2t*K&ySJG)4kH#^gznGPdgmof3WiIWB2N zJC`6T7|1xio)$JH_znlQox};aSl)l|GSN5qYd83y-RDFWXw4OdN>v-hKQ%^MtPrcpi1qdi`iT=LBPgIrbs>H$!=HVEp#OK zaXzlbAnVkUCARrl>0&+D9mP#@VpgAE^x4(reE5X?pMT?0TGmC?io|QCSec8a^KI4SC%-NKg^D<#;-JbJ)dSgHE+xxgbG~~BU)G)jV_4G`4|&NX_j(ErR_lUb#&EAcH4N?sW+{<-3Tlx z7n^$cQC>^e^$Fz@Q_!{P6S~=!d2;VR6SL#z|WTpDWi*y0`=7S7|r-X;dv{;@&0s<4o$o- zGXyJ4@{u?>x-5dx8c4us_4fm!cb5+^TUmaIUk(Yl+4`tqie~49DkJn|gvI`do(>HG zbM%_u!Yi2Xub5Px+K5J530~!(eEI$D749d)aGZdi=hOB1>vX>@dgA1-C;}BZejy1eq|T{#(pkAXn=WaMk`)lWq_B_B@I19fff7n#A3oo1W|oK=emAV9KG+za?k~PqAj;w*4ZMA$oe!$RANk+q5sKdc&~}`a!rm`?gpX&7-*c zudm9x=iQAGZKqn&fA8aP&$d&95BaandT#EtHyVSkj-AG%%ImK8t*F3<>AMF^wiWosheHehRs?J3 z_>514V}jXaUw;r!8}!Eas|8WUQL&N9g|`BzLrE(p=${`)3TDvDIak;d6<`#!!xRd^ z=rB~k*AlwylRtc3L@Kk{qZ#5ODVh>YaRuhCTU`Q%qpFoPpMbmku`e3JF|3?9n}8^= z(H|&c$I~i2k>fW6dj3h*uA5W`Y1?yCJ2}6o864axnNc3m+M+@Y=hK3|wGl6hGP5G~ z^+h$0hY@-=)|=Qif1-3yG-<2mXs(`M&0W|71q%<{`zr*q{-l206b6E3*oo>N8TvYU zGKv^DiSX<3U`vL-=ofM*S*i}@Gz7=9jZ_&VOL>UCr0@f_Q$w6cV3zQ2pECZde!udX z@gwCejIs-=(7%b|zGT8r7M{STbGh0AGeB}ucc=1p>htcT+bB)4h@PF1x36o3->;uO z_H^>`HxxuYU`r0lME0p(%6z#8k9cEprC_rB6@~B|6fe|u=LvusL|M>#zJ~dOG0{f=UrPPYfY4tm8oPSa}9q4LU{ZVjF%J!Qbbe^2}4}a`uI_( zz^`P|aZ!+VdogG3p4QFl{de@s3o7eKdU;Y-*#KmD%vUVWX&X8w_lSpudBy$nXT;2P z92K4GdmFolbU=PHHGq;~T-bP6`C+7gE3?hr9Kz$<;A2r9cw4ib+B9LC<8SQ~NMY(H zJ>x&M_b#<*#B$0>GuKkUSyA|sA9IAyqPb|uMiI%^Ufh_arL_=@ojQU(c}1{nYyGq! zP3FLIHE`}&rLK1@C4)X83<5+AI{ps)vCxVjieLQW@qI=}#3;!cwU<*8z?*gKft>T( zYX*N+VPy4{IqY4(tknQ9D!vsFDJ$86|6Xz7`)C5};a0zE<*HxaHAV_V&C@Yn+Jt$2 z0rr*Ytd`B|@Zpacj%iC=Ec}_6c9iq3z@X?qeAfiM)3igC*x_Lw!g5wb%$l}irZ z!y@B4nwEaa7&HJE0DxSuFsXKexTs;KBxiK;!74r$r;){x3HeNoEX!%6=q9!&sOW!z zyqgY4NPk90wQN_QA{zdk1ca%F_21dL&*en_ifFvs?o^O5_`)s5I`b{XSK)=m|Hg}2 ziWB?5Gdbo&A82I(9_f+S~1^Sl?T#hLwRVlTFK+xj}_mKv~Hl0C9Zxr)w)YQ;gHw?TmT^-qTsJn?aC-i9>$Y zVJ8!1m5}+q?^k&940VsD7)Du~Wp%T^dph-0V_l zitOmYE?nXO{v4apwVrD-LVjvWyV`p%M(nX8W{F_9zcvwvDL^uE3<}0IWRXt_&VFAX z^|v6@ey0{YEU;e-fCR|P)4$(RxbSMRn4X#3O2n$bP%jg+;eZn-A&GbUFYMhI{xZ{y zMymFgA4DkrT59$7=7A3MlBkJj_mAD=)U5rfJnCoVdJw@cSnV^Sr##AnlcYC|r(J7r zr!O013W}r{{JhckT5Id-R+jX5Bgde`LcsH4J<&d#}vk<&>9w9igzeNiTQy& zX1Bi?DUVCl2nsYK8I|6pMbgJ?hv^EqnDD!>UetK*cWCc78`!AYlq_5FUMYjy%Ua~y zFJ7}(_ZEDe#0OBwP6AQfg7y+Z-1lF;N$A`aSBWSH2C?06N12^yAv>PTSrlNJnVDgj p{@3h1sl literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-512x512-maskable.png b/frontend/public/icons/icon-512x512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..9dead03840502dde6ac586c9c93468196ff9329e GIT binary patch literal 30720 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 Y;rb81T^3DI-Z$_;R#~P@`qP*H1Mydj3IG5A literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-512x512.png b/frontend/public/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..7c00a5a88a2bfff63ce3265dd949cf71d8f90a23 GIT binary patch literal 38780 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 IWzR?d1GhlVo&W#< literal 0 HcmV?d00001 diff --git a/frontend/public/sw.js b/frontend/public/sw.js new file mode 100644 index 0000000..6b40502 --- /dev/null +++ b/frontend/public/sw.js @@ -0,0 +1,189 @@ +// MealBuddy Production Service Worker +// Cache Versioning +const VERSION = 'v1'; +const STATIC_CACHE = `mealbuddy-static-${VERSION}`; +const ASSETS_CACHE = `mealbuddy-assets-${VERSION}`; +const PAGES_CACHE = `mealbuddy-pages-${VERSION}`; + +const CURRENT_CACHES = [STATIC_CACHE, ASSETS_CACHE, PAGES_CACHE]; + +// Core App Shell & Fallback Assets to Pre-cache +const PRECACHE_ASSETS = [ + '/offline', + '/MonlamTBslim.ttf', + '/icons/icon-192x192.png', + '/icons/icon-512x512.png', + '/icons/icon-512x512-maskable.png', + '/icons/apple-touch-icon.png', + '/icons/favicon-32x32.png', + '/icons/favicon-16x16.png', +]; + +// Paths that must NEVER be cached (Dynamic / Sensitive Data) +const API_ROUTES = [ + '/api/', + '/v1/', + '/sanctum/', + '/filament/', + '/livewire/', + '/admin/', + '/storage/', +]; + +function isApiOrDynamic(url) { + return API_ROUTES.some((route) => url.pathname.startsWith(route)); +} + +// Install Event: Pre-cache core shell resources +self.addEventListener('install', (event) => { + event.waitUntil( + caches + .open(STATIC_CACHE) + .then((cache) => cache.addAll(PRECACHE_ASSETS)) + .catch((err) => { + // Precache error should not prevent registration + console.warn('[SW] Pre-cache encountered an issue:', err); + }) + ); + // Do NOT blindly call self.skipWaiting() here. + // We allow a controlled update flow initiated by user interaction. +}); + +// Activate Event: Clean up outdated cache versions +self.addEventListener('activate', (event) => { + event.waitUntil( + caches + .keys() + .then((keys) => + Promise.all( + keys.map((key) => { + if (!CURRENT_CACHES.includes(key)) { + return caches.delete(key); + } + }) + ) + ) + .then(() => self.clients.claim()) + ); +}); + +// Message Event: Listen for controlled skipWaiting trigger from frontend +self.addEventListener('message', (event) => { + if (event.data && event.data.type === 'SKIP_WAITING') { + self.skipWaiting(); + } +}); + +// Fetch Event: Conservative, robust routing strategies +self.addEventListener('fetch', (event) => { + const { request } = event; + + // 1. Mutating requests: NEVER cache POST, PUT, PATCH, DELETE + if (request.method !== 'GET') { + return; + } + + const url = new URL(request.url); + + // 2. Cross-Origin Requests (e.g. backend API on different port/domain): NEVER intercept + if (url.origin !== self.location.origin) { + return; + } + + // 3. API & Dynamic Endpoints: NEVER cache + if (isApiOrDynamic(url)) { + // Network-only for API requests + return; + } + + // 3. Page Navigation (HTML documents) + if (request.mode === 'navigate') { + event.respondWith( + fetch(request) + .then((networkResponse) => { + // If network succeeded, optionally update pages cache + if (networkResponse && networkResponse.status === 200) { + const responseClone = networkResponse.clone(); + caches.open(PAGES_CACHE).then((cache) => cache.put(request, responseClone)); + } + return networkResponse; + }) + .catch(async () => { + // Network failed: try cached page or serve offline page fallback + const cachedResponse = await caches.match(request); + if (cachedResponse) { + return cachedResponse; + } + const offlineFallback = await caches.match('/offline'); + if (offlineFallback) { + return offlineFallback; + } + return new Response('Network unavailable and offline page not cached.', { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'text/plain' }, + }); + }) + ); + return; + } + + // 4. Next.js Static Build Assets (/_next/static/*) + // Content-hashed files: Stale-While-Revalidate + if (url.pathname.startsWith('/_next/static/')) { + event.respondWith( + caches.match(request).then((cachedResponse) => { + const fetchPromise = fetch(request) + .then((networkResponse) => { + if (networkResponse && networkResponse.status === 200) { + const responseClone = networkResponse.clone(); + caches.open(ASSETS_CACHE).then((cache) => cache.put(request, responseClone)); + } + return networkResponse; + }) + .catch(() => null); + + return cachedResponse || fetchPromise; + }) + ); + return; + } + + // 5. Static Shell Resources (fonts, icons, public assets) + if ( + url.pathname.startsWith('/icons/') || + url.pathname.endsWith('.ttf') || + url.pathname.endsWith('.svg') || + url.pathname.endsWith('.png') || + url.pathname.endsWith('.ico') + ) { + event.respondWith( + caches.match(request).then((cachedResponse) => { + if (cachedResponse) { + return cachedResponse; + } + return fetch(request).then((networkResponse) => { + if (networkResponse && networkResponse.status === 200) { + const responseClone = networkResponse.clone(); + caches.open(STATIC_CACHE).then((cache) => cache.put(request, responseClone)); + } + return networkResponse; + }); + }) + ); + return; + } + + // Default: Network with cache fallback for other GET requests + event.respondWith( + caches.match(request).then((cached) => { + return ( + cached || + fetch(request).catch(() => { + // If offline and not in cache, let it fail naturally + return new Response('', { status: 503, statusText: 'Offline' }); + }) + ); + }) + ); +}); diff --git a/nginx/default.conf b/nginx/default.conf index 44b523a..fcc76a5 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -14,6 +14,33 @@ server { ssl_certificate /etc/letsencrypt/live/meals.monlamit.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/meals.monlamit.com/privkey.pem; + location = /sw.js { + proxy_pass http://frontend:3000; + proxy_http_version 1.1; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + add_header Cache-Control "no-cache, no-store, must-revalidate"; + add_header Pragma "no-cache"; + add_header Expires "0"; + } + + location = /manifest.webmanifest { + proxy_pass http://frontend:3000; + proxy_http_version 1.1; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + add_header Content-Type "application/manifest+json"; + add_header Cache-Control "public, max-age=3600"; + } + location / { proxy_pass http://frontend:3000; proxy_http_version 1.1;