From 8c201321c0f9a06fd4c440073f49b54aea2f9eee Mon Sep 17 00:00:00 2001 From: Zeeshan Adil Date: Wed, 28 Oct 2026 04:22:20 +0500 Subject: [PATCH 1/5] feat(motion): add scroll reveals across the site and more motion on the homepage Sections, cards and panels marked data-reveal rise in as they scroll into view, with a short stagger; anything already on screen shows at once. Page titles rise in on first paint (transform only, so they still count as painted). Homepage stats count up the first time they appear. New page content is picked up as it streams in, scroll events back up the observer, and if the observer never reports everything is shown, so content cannot stay hidden. Reduced motion and no JavaScript show everything. Also adds async image decoding to the voices thumbnails. --- app/globals.css | 28 +++++++++ components/home/count-up.tsx | 59 ++++++++++++++++++ components/home/sections-bottom.tsx | 16 +++-- components/home/sections-mid.tsx | 8 ++- components/home/sections-top.tsx | 25 +++++--- components/home/voices.tsx | 5 +- components/site-footer.tsx | 12 ++-- components/site/page-kit.tsx | 15 +++-- components/site/reveal.tsx | 94 +++++++++++++++++++++++++++++ components/site/start-here.tsx | 4 +- 10 files changed, 235 insertions(+), 31 deletions(-) create mode 100644 components/home/count-up.tsx create mode 100644 components/site/reveal.tsx diff --git a/app/globals.css b/app/globals.css index 2c0dc1e..7b64333 100644 --- a/app/globals.css +++ b/app/globals.css @@ -110,3 +110,31 @@ animation: heroFadeIn 0.8s cubic-bezier(0.4,0,0.2,1) both; } + +/* Scroll reveal (components/site/reveal.tsx). Hidden only once the observer is + running, so pages without JavaScript or with reduced motion show everything. */ +@media (prefers-reduced-motion: no-preference) { + .reveal-ready [data-reveal]:not(.is-revealed) { + opacity: 0; + transform: translateY(18px); + } + .reveal-ready [data-reveal] { + transition: + opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1) var(--reveal-delay, 0ms), + transform 0.7s cubic-bezier(0.22, 1, 0.36, 1) var(--reveal-delay, 0ms); + } + + /* Page titles rise in on first paint. Transform only, so the text is painted + (and counted for loading metrics) straight away. */ + @keyframes dw-rise { + from { + transform: translateY(14px); + } + } + .dw-rise { + animation: dw-rise 0.8s cubic-bezier(0.22, 1, 0.36, 1) both; + } + .dw-rise-late { + animation: dw-rise 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.12s both; + } +} diff --git a/components/home/count-up.tsx b/components/home/count-up.tsx new file mode 100644 index 0000000..42563ce --- /dev/null +++ b/components/home/count-up.tsx @@ -0,0 +1,59 @@ +"use client" + +import { useEffect, useRef, useState } from "react" + +/** + * Counts a number like "2,100+" or "$2.5M+" up from zero the first time it + * scrolls into view. The final value is what the server renders, so search + * engines, screen readers and visitors without JavaScript see the real number. + */ +export function CountUp({ value, duration = 1200 }: { value: string; duration?: number }) { + const ref = useRef(null) + const [shown, setShown] = useState(value) + + useEffect(() => { + const match = value.match(/^([^\d]*)([\d,.]+)(.*)$/) + const el = ref.current + if (!match || !el || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return + + const [, prefix, digits, suffix] = match + const target = Number(digits.replace(/,/g, "")) + const decimals = digits.includes(".") ? digits.split(".")[1].length : 0 + const grouped = digits.includes(",") + const format = (n: number) => + prefix + (grouped ? n.toLocaleString("en-US", { maximumFractionDigits: 0 }) : n.toFixed(decimals)) + suffix + + // Already on screen when the page loads: leave the real number alone + if (el.getBoundingClientRect().top < window.innerHeight) return + + let frame = 0 + const observer = new IntersectionObserver( + ([entry]) => { + if (!entry.isIntersecting) return + observer.disconnect() + const start = performance.now() + const tick = (now: number) => { + const t = Math.min(1, (now - start) / duration) + const eased = 1 - Math.pow(1 - t, 3) + setShown(format(target * eased)) + if (t < 1) frame = requestAnimationFrame(tick) + else setShown(value) + } + setShown(format(0)) + frame = requestAnimationFrame(tick) + }, + { threshold: 0.4 } + ) + observer.observe(el) + return () => { + observer.disconnect() + cancelAnimationFrame(frame) + } + }, [value, duration]) + + return ( + + + + ) +} diff --git a/components/home/sections-bottom.tsx b/components/home/sections-bottom.tsx index 6510e97..26fdf58 100644 --- a/components/home/sections-bottom.tsx +++ b/components/home/sections-bottom.tsx @@ -29,7 +29,7 @@ export function Qantara() {

-

+

Qantara
The Palestinian AI Fellowship. @@ -51,7 +51,7 @@ export function Qantara() {
    {[...qantaraStages, { name: "Virtual Career Fair", text: "Graduates meet employers who are hiring. $0 cost, with a monthly stipend." }].map((stage, index) => ( -
  • +
  • {String(index + 1).padStart(2, "0")} {stage.name} {stage.text} @@ -64,7 +64,7 @@ export function Qantara() {

    Partners on Qantara

      {qantaraPartners.map((partner) => ( -
    • +
    • Partnerships

      -

      Build the bridge with us.

      +

      + Build the bridge with us. +

      Great engineers grow up everywhere. The teams that need them cannot find them fast enough. Dev Weekends sits in the middle.

        {partnerCards.map((card) => ( -
      • +
      • {card.label}

        {card.title}

        {card.text}

        @@ -132,7 +134,9 @@ export function Resources() {

        Resources

        -

        Learn with us, free.

        +

        + Learn with us, free. +

        Guides, courses and recordings from the community. Some live here, some on our other platforms.

        diff --git a/components/home/sections-mid.tsx b/components/home/sections-mid.tsx index 90f1517..f8419e2 100644 --- a/components/home/sections-mid.tsx +++ b/components/home/sections-mid.tsx @@ -16,7 +16,7 @@ export function Products() {

        Built in the open

        -

        +

        Products we build, and tools we give the community for free.

        @@ -55,7 +55,9 @@ export function Communities() {

        Communities

        -

        Specialized communities within.

        +

        + Specialized communities within. +

        Smaller circles, each with its own focus and people. Find yours on our community page.

        @@ -68,7 +70,7 @@ export function Communities() {
          {circles.map((circle) => ( -
        • +
        • A community, not just a classroom

          -

          +

          Great engineers.
          Greater impact.

          -

          +

          Talent is everywhere. Opportunity should be too. Dev Weekends is a free community helping engineers learn, build and open doors to the world.

          @@ -118,9 +119,11 @@ export function Reach() {
          {reach.map((item) => ( -
          +
          {item.label}
          -
          {item.value}
          +
          + +
          ))}
          @@ -150,7 +153,7 @@ export function Network() {

            {placesLike.map((org) => ( -
          • +
          • ))} @@ -180,11 +183,13 @@ function OrgTile({ org }: { org: Org }) { export function Impact() { return (
            -
            +

            Value created

            -

            $2.5M+

            +

            + +

            earned by our members. Free to join, life-changing to finish.

            @@ -232,12 +237,14 @@ export function Outcomes() {

            Outcomes

            -

            Where the work led them.

            +

            + Where the work led them. +

              {outcomes.map((item) => ( -
            • +
            • {item.value}

              {item.title}

              {item.text}

              diff --git a/components/home/voices.tsx b/components/home/voices.tsx index b0e5006..05e89e3 100644 --- a/components/home/voices.tsx +++ b/components/home/voices.tsx @@ -51,7 +51,9 @@ export function VoicesRail() {

              Fellow voices

              -

              What they say about us.

              +

              + What they say about us. +

              Most started with no network and no resume worth reading. Here is the receipt.

              @@ -108,6 +110,7 @@ export function VoicesRail() { src={video.preview} alt="" loading="lazy" + decoding="async" className="absolute inset-0 h-full w-full object-cover opacity-80 grayscale transition group-hover:opacity-100 group-hover:grayscale-0" /> )} diff --git a/components/site-footer.tsx b/components/site-footer.tsx index 1e1a7e0..0cb373e 100644 --- a/components/site-footer.tsx +++ b/components/site-footer.tsx @@ -4,13 +4,15 @@ import { usePathname } from "next/navigation" import { HomeFooter } from "@/components/home/footer" import { hasOwnChrome } from "@/components/site-header" +import { RevealObserver } from "@/components/site/reveal" export function SiteFooter() { const pathname = usePathname() - if (hasOwnChrome(pathname)) { - return null - } - - return + return ( + <> + + {hasOwnChrome(pathname) ? null : } + + ) } diff --git a/components/site/page-kit.tsx b/components/site/page-kit.tsx index 654d29e..ebfbda3 100644 --- a/components/site/page-kit.tsx +++ b/components/site/page-kit.tsx @@ -57,8 +57,8 @@ export function PageHero({
              {eyebrow && {eyebrow}} -

              {title}

              - {intro &&
              {intro}
              } +

              {title}

              + {intro &&
              {intro}
              } {actions &&
              {actions}
              }
              @@ -96,7 +96,7 @@ export function SectionHeading({ action?: ReactNode }) { return ( -
              +
              {eyebrow && {eyebrow}}

              {title}

              @@ -111,7 +111,7 @@ export function SectionHeading({ export function Panel({ children, className = "" }: { children: ReactNode; className?: string }) { return (
              -
              +
              {children}
              @@ -139,6 +139,7 @@ export function Card({ if (href) { return ( @@ -146,5 +147,9 @@ export function Card({ ) } - return
              {children}
              + return ( +
              + {children} +
              + ) } diff --git a/components/site/reveal.tsx b/components/site/reveal.tsx new file mode 100644 index 0000000..90be591 --- /dev/null +++ b/components/site/reveal.tsx @@ -0,0 +1,94 @@ +"use client" + +import { useEffect } from "react" +import { usePathname } from "next/navigation" + +/** + * Scroll reveal for anything marked `data-reveal`. Elements already on screen + * are shown at once, so nothing above the fold flickers; the rest rise in as + * they scroll into view, a few at a time with a short stagger. Page content can + * stream in after this runs, so new elements are picked up as they arrive. + * Without JavaScript, or with reduced motion, everything is visible: the hidden + * state only applies under `html.reveal-ready` (see globals.css). + */ +export function RevealObserver() { + const pathname = usePathname() + + useEffect(() => { + if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return + + // Once shown, drop the marker so the element gets its own hover transitions back + const show = (el: HTMLElement, delay: number) => { + el.style.setProperty("--reveal-delay", `${delay}ms`) + el.classList.add("is-revealed") + window.setTimeout(() => el.removeAttribute("data-reveal"), delay + 800) + } + + let alive = false + const observer = new IntersectionObserver( + (entries) => { + alive = true + entries + .filter((entry) => entry.isIntersecting) + .forEach((entry, index) => { + observer.unobserve(entry.target) + show(entry.target as HTMLElement, Math.min(index, 5) * 70) + }) + }, + { rootMargin: "0px 0px -8% 0px", threshold: 0.08 } + ) + + // Find marked elements not handled yet: show the ones on screen, watch the rest + const scan = () => { + const fold = window.innerHeight * 0.95 + document.querySelectorAll("[data-reveal]:not(.is-revealed):not([data-reveal-watch])").forEach((el) => { + if (el.getBoundingClientRect().top < fold) { + el.classList.add("is-revealed") + el.removeAttribute("data-reveal") + } else { + el.setAttribute("data-reveal-watch", "") + observer.observe(el) + } + }) + } + + // Safety net for browsers that pause or skip the observer: plain scroll + // events also reveal anything that has entered the screen + let last = 0 + const onScroll = () => { + const now = Date.now() + if (now - last < 120) return + last = now + const bottom = window.innerHeight * 0.95 + let index = 0 + document.querySelectorAll("[data-reveal-watch]:not(.is-revealed)").forEach((el) => { + if (el.getBoundingClientRect().top < bottom) { + observer.unobserve(el) + show(el, Math.min(index++, 5) * 70) + } + }) + } + + scan() + document.documentElement.classList.add("reveal-ready") + const mutations = new MutationObserver(scan) + mutations.observe(document.body, { childList: true, subtree: true }) + window.addEventListener("scroll", onScroll, { passive: true }) + + // A working observer reports every watched element at once. If it stays + // silent (paused background tabs, some crawlers), show everything now + const failsafe = window.setTimeout(() => { + if (alive) return + document.querySelectorAll("[data-reveal-watch]:not(.is-revealed)").forEach((el) => show(el, 0)) + }, 1500) + + return () => { + window.clearTimeout(failsafe) + observer.disconnect() + mutations.disconnect() + window.removeEventListener("scroll", onScroll) + } + }, [pathname]) + + return null +} diff --git a/components/site/start-here.tsx b/components/site/start-here.tsx index dfa5f05..ba7eb2f 100644 --- a/components/site/start-here.tsx +++ b/components/site/start-here.tsx @@ -24,7 +24,7 @@ export function StartHere() {

              Get involved

              -

              +

              Start where you are. Who are you?

              @@ -86,7 +86,7 @@ export function StartHere() {

              Apply to a program

                {applyPrograms.map((program) => ( -
              • +
              • {program.name} From 6223565088c1d854ffab17f068e58b8b0871aeea Mon Sep 17 00:00:00 2001 From: Zeeshan Adil Date: Wed, 28 Oct 2026 04:22:20 +0500 Subject: [PATCH 2/5] feat(pages): rebuild links and careers on the page kit The community links hub now uses the normal site header and footer and the page kit, with every link and anchor kept (including #open-source). Careers is restyled the same way and set to noindex; it stays out of navigation. --- app/careers/layout.tsx | 14 + app/careers/page.tsx | 514 +++++++++--------- app/links/page.tsx | 419 +++++--------- .../links/share-button.tsx | 8 +- components/site-header.tsx | 4 +- 5 files changed, 423 insertions(+), 536 deletions(-) create mode 100644 app/careers/layout.tsx rename components/links-share-button.tsx => app/links/share-button.tsx (54%) diff --git a/app/careers/layout.tsx b/app/careers/layout.tsx new file mode 100644 index 0000000..0656c7c --- /dev/null +++ b/app/careers/layout.tsx @@ -0,0 +1,14 @@ +import type { Metadata } from "next" +import type { ReactNode } from "react" + +export const metadata: Metadata = { + title: "Careers", + description: + "Hand-picked opportunities for students and professionals across Dev Weekends and Dev Weekends partner companies.", + alternates: { canonical: "/careers" }, + robots: { index: false }, +} + +export default function CareersLayout({ children }: { children: ReactNode }) { + return children +} diff --git a/app/careers/page.tsx b/app/careers/page.tsx index f634109..fb811d9 100644 --- a/app/careers/page.tsx +++ b/app/careers/page.tsx @@ -1,277 +1,279 @@ -'use client'; +"use client" -import { useEffect, useMemo, useState } from 'react'; -import Link from 'next/link'; -import { Badge } from '@/components/ui/badge'; -import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; -import { Input } from '@/components/ui/input'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from '@/components/ui/dialog'; +import { useEffect, useMemo, useState } from "react" + +import { Button, Card, PageHero, Section } from "@/components/site/page-kit" +import { Input } from "@/components/ui/input" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" +import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" type JobDoc = { - _id: string; - title: string; - company: string; - location?: string; - workplaceType?: string; - employmentType?: string; - audience?: string; - description: string; - requirements?: string; - applyUrl?: string; - applyEmail?: string; - deadline?: string; - tags?: string[]; - createdAt?: string; -}; + _id: string + title: string + company: string + location?: string + workplaceType?: string + employmentType?: string + audience?: string + description: string + requirements?: string + applyUrl?: string + applyEmail?: string + deadline?: string + tags?: string[] + createdAt?: string +} + +type Audience = "all" | "Students" | "Professionals" | "Both" +type Workplace = "all" | "Remote" | "Hybrid" | "Onsite" +type Employment = "all" | "Internship" | "Full-time" | "Part-time" | "Contract" + +const focusRing = + "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#0A0A0A]" + +const fieldClass = `h-12 rounded-xl border-[#D4D4D4] bg-white px-4 text-base text-[#0A0A0A] ${focusRing}` +const triggerClass = `${fieldClass} w-full sm:w-[190px]` + +const primaryButton = `inline-flex min-h-[44px] w-full items-center justify-center rounded-xl bg-[#0A0A0A] px-5 text-[15px] font-semibold text-white transition-colors hover:bg-[#262626] disabled:cursor-not-allowed disabled:opacity-40 ${focusRing}` +const secondaryButton = `inline-flex min-h-[44px] w-full items-center justify-center rounded-xl border border-[#D4D4D4] px-5 text-[15px] font-semibold text-[#0A0A0A] transition-colors hover:bg-[#F7F7F7] disabled:cursor-not-allowed disabled:opacity-40 ${focusRing}` + +function Tag({ children, solid }: { children: string; solid?: boolean }) { + return ( + + {children} + + ) +} -export default function CarrersPage() { - const [jobs, setJobs] = useState([]); - const [loading, setLoading] = useState(true); - const [search, setSearch] = useState(''); - const [audience, setAudience] = useState<'all' | 'Students' | 'Professionals' | 'Both'>('all'); - const [workplace, setWorkplace] = useState<'all' | 'Remote' | 'Hybrid' | 'Onsite'>('all'); - const [employment, setEmployment] = useState<'all' | 'Internship' | 'Full-time' | 'Part-time' | 'Contract'>('all'); - const [applyOpen, setApplyOpen] = useState(false); - const [selectedJob, setSelectedJob] = useState(null); - const [detailsOpen, setDetailsOpen] = useState(false); - const [detailsJob, setDetailsJob] = useState(null); +function Fact({ label, value }: { label: string; value: string }) { + return ( +
                +
                {label}:
                +
                {value}
                +
                + ) +} + +function formatDeadline(deadline?: string) { + return deadline ? new Date(deadline).toLocaleDateString() : "Not specified" +} + +export default function CareersPage() { + const [jobs, setJobs] = useState([]) + const [loading, setLoading] = useState(true) + const [search, setSearch] = useState("") + const [audience, setAudience] = useState("all") + const [workplace, setWorkplace] = useState("all") + const [employment, setEmployment] = useState("all") + const [applyOpen, setApplyOpen] = useState(false) + const [selectedJob, setSelectedJob] = useState(null) + const [detailsOpen, setDetailsOpen] = useState(false) + const [detailsJob, setDetailsJob] = useState(null) useEffect(() => { - fetch('/api/jobs') + fetch("/api/jobs") .then((res) => res.json()) .then((data) => setJobs(Array.isArray(data) ? data : [])) - .finally(() => setLoading(false)); - }, []); + .finally(() => setLoading(false)) + }, []) const filteredJobs = useMemo(() => { - const q = search.trim().toLowerCase(); + const q = search.trim().toLowerCase() return jobs.filter((j) => { - if (audience !== 'all' && (j.audience || 'Both') !== audience) return false; - if (workplace !== 'all' && (j.workplaceType || 'Remote') !== workplace) return false; - if (employment !== 'all' && (j.employmentType || 'Full-time') !== employment) return false; - if (!q) return true; + if (audience !== "all" && (j.audience || "Both") !== audience) return false + if (workplace !== "all" && (j.workplaceType || "Remote") !== workplace) return false + if (employment !== "all" && (j.employmentType || "Full-time") !== employment) return false + if (!q) return true return ( j.title?.toLowerCase().includes(q) || j.company?.toLowerCase().includes(q) || - (j.location || '').toLowerCase().includes(q) || - (j.tags || []).join(' ').toLowerCase().includes(q) - ); - }); - }, [jobs, search, audience, workplace, employment]); + (j.location || "").toLowerCase().includes(q) || + (j.tags || []).join(" ").toLowerCase().includes(q) + ) + }) + }, [jobs, search, audience, workplace, employment]) const openApply = (job: JobDoc) => { - setSelectedJob(job); - setApplyOpen(true); - }; + setSelectedJob(job) + setApplyOpen(true) + } const openDetails = (job: JobDoc) => { - setDetailsJob(job); - setDetailsOpen(true); - }; + setDetailsJob(job) + setDetailsOpen(true) + } const copyToClipboard = async (text: string) => { try { - await navigator.clipboard.writeText(text); + await navigator.clipboard.writeText(text) } catch { - // ignore + // Clipboard blocked; the value stays visible in the field. } - }; + } + + const applyUrl = selectedJob?.applyUrl?.trim() + const applyEmail = selectedJob?.applyEmail?.trim() return ( -
                -
                -

                Careers

                -

                - Hand-picked opportunities for students and professionals across Dev Weekends and Dev Weekends partner companies. -

                -
                + <> + Share a Job} + /> -
                - setSearch(e.target.value)} - className="sm:max-w-md" - /> - - - -
                - -
                +
                +
                + setSearch(e.target.value)} + className={`${fieldClass} sm:max-w-md sm:flex-1`} + /> + + + +
                -
                - {loading ? ( -
                Loading jobs...
                - ) : filteredJobs.length === 0 ? ( - - -
                No jobs right now
                -
                Check back soon — we post opportunities regularly.
                -
                -
                - ) : ( -
                - {filteredJobs.map((job) => { - return ( - - -
                - {job.workplaceType ? {job.workplaceType} : null} - {job.employmentType ? {job.employmentType} : null} - {job.audience ? {job.audience} : null} +
                + {loading ? ( +

                + Loading jobs... +

                + ) : filteredJobs.length === 0 ? ( + +

                No jobs right now

                +

                Check back soon. We post opportunities regularly.

                +
                + ) : ( +
                  + {filteredJobs.map((job) => ( +
                • + +
                  + {job.workplaceType ? {job.workplaceType} : null} + {job.employmentType ? {job.employmentType} : null} + {job.audience ? {job.audience} : null}
                  - {job.title} -
                  -
                  - Company:{' '} - {job.company} -
                  -
                  - Location:{' '} - {job.location || 'Not specified'} -
                  -
                  - Deadline:{' '} - {job.deadline ? new Date(job.deadline).toLocaleDateString() : 'Not specified'} -
                  -
                  - - -

                  {job.description}

                  +

                  {job.title}

                  +
                  + + + +
                  +

                  {job.description}

                  {Array.isArray(job.tags) && job.tags.length > 0 ? ( -
                  +
                    {job.tags.slice(0, 6).map((t, idx) => ( - - {t} - +
                  • + {t} +
                  • ))} -
                  +
                ) : null} - - -
                - - + +
                -
                - - ); - })} -
                - )} -
                +
                +
              • + ))} +
              + )} +
              +
              { - setDetailsOpen(open); - if (!open) setDetailsJob(null); + setDetailsOpen(open) + if (!open) setDetailsJob(null) }} > - + - Job Details - - {detailsJob ? ( - <> - {detailsJob.title} @ {detailsJob.company} - - ) : ( - 'Job details' - )} + Job Details + + {detailsJob ? `${detailsJob.title} @ ${detailsJob.company}` : "Job details"} -
              -
              -
              - Company:{' '} - {detailsJob?.company || ''} -
              -
              - Location:{' '} - {detailsJob?.location || 'Not specified'} -
              -
              - Deadline:{' '} - - {detailsJob?.deadline ? new Date(detailsJob.deadline).toLocaleDateString() : 'Not specified'} - -
              -
              +
              +
              + + + +
              -
              Description
              -
              {detailsJob?.description || ''}
              +

              Description

              +

              {detailsJob?.description || ""}

              -
              Requirements
              -
              - {detailsJob?.requirements?.trim() ? detailsJob.requirements : 'Not provided'} -
              +

              Requirements

              +

              + {detailsJob?.requirements?.trim() ? detailsJob.requirements : "Not provided"} +

              - {Array.isArray(detailsJob?.tags) && detailsJob!.tags!.length > 0 ? ( + {Array.isArray(detailsJob?.tags) && detailsJob.tags.length > 0 ? (
              -
              Tags
              -
              - {detailsJob!.tags!.map((t, idx) => ( - - {t} - +

              Tags

              +
                + {detailsJob.tags.map((t, idx) => ( +
              • + {t} +
              • ))} -
              +
            ) : null} + +
            @@ -279,80 +281,76 @@ export default function CarrersPage() { { - setApplyOpen(open); - if (!open) setSelectedJob(null); + setApplyOpen(open) + if (!open) setSelectedJob(null) }} > - + - Apply Details - - {selectedJob ? ( - <> - {selectedJob.title} @ {selectedJob.company} - - ) : ( - 'Job apply details' - )} + Apply Details + + {selectedJob ? `${selectedJob.title} @ ${selectedJob.company}` : "Job apply details"} -
            +
            -
            Apply URL
            +
            - - +
            - {selectedJob?.applyUrl?.trim() ? ( -
            + {applyUrl ? ( +

            You can also open it in a new tab:{" "} Open link -

            +

            ) : null}
            -
            Apply Email
            +
            - - +
            - {selectedJob?.applyEmail?.trim() ? ( -
            + {applyEmail ? ( +

            You can email directly:{" "} - + Open email -

            +

            ) : null}
            -
            - ); + + ) } - - diff --git a/app/links/page.tsx b/app/links/page.tsx index 20a946b..14aed6d 100644 --- a/app/links/page.tsx +++ b/app/links/page.tsx @@ -1,29 +1,10 @@ -import type { ComponentType, ReactNode } from "react" +import type { ComponentType } from "react" import type { Metadata } from "next" import Image from "next/image" -import Link from "next/link" -import { DM_Sans } from "next/font/google" -import { - ArrowUpRight, - BookOpen, - Briefcase, - CalendarDays, - Cloud, - Code, - Facebook, - GitBranch, - Github, - Globe, - Heart, - Instagram, - Linkedin, - MessageCircle, - Palette, - PartyPopper, - Trophy, - Youtube, -} from "lucide-react" -import { LinksShareButton } from "@/components/links-share-button" +import { ArrowUpRight, BookOpen, CalendarDays, Facebook, Github, Globe, Instagram, Linkedin, MessageCircle, Youtube } from "lucide-react" + +import { SmartLink } from "@/components/home/smart-link" +import { Card, Eyebrow, PageHero, Panel, Section, SectionHeading } from "@/components/site/page-kit" import { linkSections, linksProfile, @@ -31,13 +12,10 @@ import { socialLinks, type Community, type JoinPlatform, - type LinkSection, type QuickLink, - type SectionIcon, type SocialPlatform, } from "@/lib/links-data" - -const dmSans = DM_Sans({ subsets: ["latin"] }) +import { ShareButton } from "./share-button" export const metadata: Metadata = { title: "Links", @@ -73,106 +51,32 @@ const socialIcons: Record = { discord: DiscordIcon, } -const brandStyles: Record = { - instagram: "bg-gradient-to-br from-[#feda75] via-[#d62976] to-[#4f5bd5]", - youtube: "bg-[#ff0000]", - linkedin: "bg-[#0a66c2]", - facebook: "bg-[#1877f2]", - github: "bg-[#24292f]", - discord: "bg-[#5865f2]", -} - -const sectionIcons: Record = { - trophy: Trophy, - "open-source": GitBranch, - briefcase: Briefcase, - code: Code, - cloud: Cloud, - palette: Palette, - events: PartyPopper, -} - const quickLinkIcons: Record = { website: Globe, resources: BookOpen, calendar: CalendarDays, } -// How each platform's join action looks: button label, icons and colors. -const joinStyles: Record< - JoinPlatform, - { label: string; buttonIcon: IconComponent; badgeIcon: IconComponent; button: string; chip: string; badge: string } -> = { - whatsapp: { - label: "Join on WhatsApp", - buttonIcon: MessageCircle, - badgeIcon: MessageCircle, - button: "bg-[#25D366] text-[#04140a] hover:bg-[#3ee27a]", - chip: "bg-[#25D366]/15 text-[#4ae38a] hover:bg-[#25D366] hover:text-[#04140a]", - badge: "bg-[#25D366] text-[#04140a]", - }, - linkedin: { - label: "Join on LinkedIn", - buttonIcon: Linkedin, - badgeIcon: Linkedin, - button: "bg-[#0a66c2] text-white hover:bg-[#1877d6]", - chip: "bg-[#0a66c2]/20 text-[#6cb2f5] hover:bg-[#0a66c2] hover:text-white", - badge: "bg-[#0a66c2] text-white", - }, - facebook: { - label: "Join on Facebook", - buttonIcon: Facebook, - badgeIcon: Facebook, - button: "bg-[#1877f2] text-white hover:bg-[#3b8cf5]", - chip: "bg-[#1877f2]/20 text-[#7fb2f8] hover:bg-[#1877f2] hover:text-white", - badge: "bg-[#1877f2] text-white", - }, - github: { - label: "Open GitHub", - buttonIcon: ArrowUpRight, - badgeIcon: Github, - button: "bg-white text-[#040404] hover:bg-white/85", - chip: "bg-white/10 text-white hover:bg-white hover:text-[#040404]", - badge: "bg-[#24292f] text-white", - }, - website: { - label: "Learn more", - buttonIcon: ArrowUpRight, - badgeIcon: Globe, - button: "bg-white text-[#040404] hover:bg-white/85", - chip: "bg-white/10 text-white hover:bg-white hover:text-[#040404]", - badge: "bg-white text-[#040404]", - }, +// Icon for communities without a thumbnail, and the join button label, per platform. +const joinIcons: Record = { + whatsapp: MessageCircle, + linkedin: Linkedin, + facebook: Facebook, + github: Github, + website: Globe, } -const focusRing = "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white" - -function SmartLink({ - href, - className, - ariaLabel, - children, -}: { - href: string - className: string - ariaLabel?: string - children: ReactNode -}) { - if (href.startsWith("/")) { - return ( - - {children} - - ) - } - - return ( - - {children} - - ) +const joinLabels: Record = { + whatsapp: "Join on WhatsApp", + linkedin: "Join on LinkedIn", + facebook: "Join on Facebook", + github: "Open GitHub", + website: "Learn more", } +const focusRing = + "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#0A0A0A]" + function CommunityImage({ community, size }: { community: Community; size: "md" | "sm" }) { const box = size === "md" ? "h-12 w-12" : "h-10 w-10" @@ -188,41 +92,40 @@ function CommunityImage({ community, size }: { community: Community; size: "md" ) } - const { badgeIcon: Icon, badge } = joinStyles[community.platform] + const Icon = joinIcons[community.platform] return ( -
            + )} + +
        ); } diff --git a/app/dsoc/page.tsx b/app/dsoc/page.tsx index 7e4860c..eb88844 100644 --- a/app/dsoc/page.tsx +++ b/app/dsoc/page.tsx @@ -2,24 +2,23 @@ import Link from "next/link"; import { useState, useEffect } from "react"; -import { - ArrowRight, - Code2, - Users, - Calendar, - GitBranch, - Rocket, +import { + ArrowRight, + Code2, + Users, + Calendar, + GitBranch, + Rocket, Trophy, Github, MessageCircle, - CheckCircle, Clock, - Zap, Target, - BookOpen, - Star + BookOpen } from "lucide-react"; -import "./styles.css"; +import type { LucideIcon } from "lucide-react"; +import type { ReactNode } from "react"; +import { Button, Card, Panel, PageHero, Section, SectionHeading, container } from "@/components/site/page-kit"; import DSOCNavbar from "./components/DSOCNavbar"; interface Stats { @@ -180,635 +179,447 @@ export default function DSOCPage() { { icon: Code2, title: "Real-World Experience", - description: "Work on production-level open source projects that make a difference.", - color: "bg-[var(--dsoc-primary)]" + description: "Work on production-level open source projects that make a difference." }, { icon: Users, title: "Expert Mentorship", description: "Learn directly from industry professionals and open source maintainers.", - color: "bg-[var(--dsoc-secondary)]" }, { icon: GitBranch, title: "Portfolio Building", description: "Build an impressive portfolio with real contributions to open source.", - color: "bg-[var(--dsoc-purple)]" }, { icon: MessageCircle, title: "Community Support", description: "Join our Discord community for networking and peer support.", - color: "bg-[var(--dsoc-success)]" }, { icon: Trophy, title: "Recognition", description: "Get certificates, swag, and recognition for your contributions.", - color: "bg-[var(--dsoc-pink)]" }, { icon: Rocket, title: "Career Launch", description: "Many past participants have landed jobs at top tech companies.", - color: "bg-[var(--dsoc-accent)]" } ]; + const liveStats = [ + { value: stats?.projects.total, label: "Projects" }, + { value: stats?.mentors, label: "Mentors" }, + { value: stats?.mentees, label: "Mentees" }, + { value: stats?.technologies, label: "Technologies" }, + ] + .filter((stat): stat is { value: number; label: string } => typeof stat.value === "number" && stat.value > 0) + .map((stat) => ({ value: String(stat.value), label: stat.label })); + return ( -
        +
        {/* DSOC Navigation */} - {/* Hero Section */} -
        - {/* Animated Grid Background */} -
        - - {/* Geometric Shapes */} -
        -
        -
        -
        -
        -
        + + + + + } + /> + + {/* Application status */} + +
        + + Closed + +

        + DSOC 2026 applications are closed. +

        +

        + DSOC applications will open next summer. We are always open to passionate talent who can demonstrate deep interest in technology and a strong willingness to get things done. +

        +

        + We review exceptional cases at{" "} + + info@devweekends.com + + . +

        - -
        -
        - {/* Badge */} -
        -
        - - DSOC 2026 — Applications Closed -
        -
        - - {/* Main Title */} -

        - - DEV WEEKENDS - - SUMMER OF CODE -

        - - {/* Subtitle with text outline for readability */} -
        -

        - An intensive open source program connecting aspiring developers with expert mentors - on real-world projects. -

        -

        - Learn, build, and grow with the community. 🚀 -

        + + + {/* Stats: only real numbers from the API, so nothing is shown before data loads */} + {liveStats.length > 0 && ( +
        +
        + {liveStats.map((stat) => ( +
        +
        {stat.value}
        +
        {stat.label}
        + ))} +
        +
        + )} -
        + {/* What is DSOC Section */} +
        +
        +
        + +

        - DSOC applications will open next summer. We are always open to passionate talent who can demonstrate deep interest in technology and a strong willingness to get things done. + Dev Weekends Summer of Code (DSOC) is a + community-driven program inspired by Google Summer of Code and LFX Mentorship.

        -

        - We review exceptional cases at{" "} - - info@devweekends.com - - . +

        + We connect passionate student developers with experienced mentors to work on + meaningful open source projects. Whether you're looking to build your first + open source contribution or mentor the next generation of developers, DSOC + has a place for you. +

        +

        + Unlike traditional programs, we focus on accessibility: no complex application + processes, no geographic restrictions, just pure learning and contribution.

        - - {/* CTA Buttons */} -
        - - +
        +
        - - {/* Quick Links */} - {/* */} -
        -
        - - {/* Scroll Indicator */} -
        -
        -
        -
        -
        - - {/* Stats Section */} -
        -
        -
        -
        -
        - {stats?.projects.total || '20+'} -
        -
        - Projects -
        -
        -
        -
        - {stats?.mentors || '15+'} -
        -
        - Mentors -
        -
        -
        -
        - {stats?.mentees || '50+'} -
        -
        - Mentees -
        -
        -
        -
        - {stats?.technologies || '30+'} -
        -
        - Technologies -
        -
        -
        -
        -
        - - {/* What is DSOC Section */} -
        -
        -
        -
        -

        - WHAT IS DSOC? -

        -
        -

        - Dev Weekends Summer of Code (DSOC) is a - community-driven program inspired by Google Summer of Code and LFX Mentorship. -

        -

        - We connect passionate student developers with experienced mentors to work on - meaningful open source projects. Whether you're looking to build your first - open source contribution or mentor the next generation of developers, DSOC - has a place for you. -

        -

        - Unlike traditional programs, we focus on accessibility - no complex application - processes, no geographic restrictions, just pure learning and contribution. -

        -
        -
        - - Explore Projects - - -
        -
        -
        -
        -
        -
        -
        - -
        -
        -

        Project-Based Learning

        -

        Work on real projects with real impact

        -
        -
        -
        -
        - -
        -
        -

        1-on-1 Mentorship

        -

        Direct guidance from industry experts

        -
        -
        -
        -
        - -
        -
        -

        Discord Community

        -

        24/7 peer support and networking

        -
        +
          + {[ + { icon: Target, title: "Project-Based Learning", text: "Work on real projects with real impact" }, + { icon: Users, title: "1-on-1 Mentorship", text: "Direct guidance from industry experts" }, + { icon: MessageCircle, title: "Discord Community", text: "24/7 peer support and networking" }, + ].map((item) => ( +
        • + + +
          +

          {item.title}

          +

          {item.text}

          -
        -
        -
        -
        + +
      • + ))} +
      - + {/* Benefits Section */} -
      -
      -
      -

      - WHY JOIN DSOC? -

      -

      - More than just coding - it's a launchpad for your tech career -

      -
      - -
      - {benefits.map((benefit, index) => ( -
      -
      - -
      -

      {benefit.title}

      -

      {benefit.description}

      -
      - ))} -
      -
      -
      +
      + +
        + {benefits.map((benefit) => ( +
      • + + +

        {benefit.title}

        +

        {benefit.description}

        +
        +
      • + ))} +
      +
      {/* Timeline Section */} -
      -
      -
      -

      - PROGRAM TIMELINE -

      -

      - Mark your calendars for DSOC 2026 -

      -
      - -
      - {timeline.map((item, index) => ( -
      -
      - {index + 1} -
      -
      -
      - {item.phase} - - - {item.date} - -
      -

      {item.title}

      -

      {item.description}

      -
      +
      + +
        + {timeline.map((item) => ( +
      1. +
        +

        {item.phase}

        +

        +

        - ))} -
      -
      -
      +
      +

      {item.title}

      +

      {item.description}

      +
      +
    • + ))} + + {/* Featured Projects Section */} {featuredProjects.length > 0 && ( -
      -
      -
      -

      - FEATURED PROJECTS -

      -

      - Check out some of the exciting projects waiting for contributors -

      -
      - -
      - {featuredProjects.map((project) => ( - -
      - {/* Project Image */} - {(project.featuredImage || project.imageUrl) && ( -
      - + +
        + {featuredProjects.map((project) => { + const image = project.featuredImage || project.imageUrl; + const repoUrl = project.repositoryUrl || (project.repositoryUrls && project.repositoryUrls[0]); + return ( +
      • + + {image && ( +
        + {/* eslint-disable-next-line @next/next/no-img-element */} + {project.title} -
        - - OPEN FOR APPLICATIONS - -
        -
        - )} -
        -
        - - {project.organization} - - - {project.difficulty} + + Applications closed
        + )} +
        + {project.organization} + + {project.difficulty} +
        -
        -

        {project.title}

        -

        {project.description}

        -
        - {project.technologies.slice(0, 5).map((tech, i) => ( - - {tech} - - ))} - {project.technologies.length > 5 && ( - - +{project.technologies.length - 5} - - )} -
        -
        -
        - +

        + + {project.title} + +

        +

        {project.description}

        +
        + {project.technologies.slice(0, 5).map((tech) => ( + {tech} + ))} + {project.technologies.length > 5 && +{project.technologies.length - 5}} +
        +
        +
        + +
        -
        - {(project.repositoryUrl || (project.repositoryUrls && project.repositoryUrls.length > 0)) && ( - + )} {project.wikiUrl && ( - + )}
        -
        - - ))} -
        - -
        - - View All Projects - - -
        + +
      • + ); + })} +
      +
      +
      -
      + )} {/* How It Works Section */} -
      -
      -
      -

      - HOW IT WORKS -

      -

      - Simple steps to start your open source journey -

      -
      - -
      - {/* For Mentees */} -
      -
      -
      - -
      -

      FOR MENTEES

      -
      -
        - {[ - "Create your profile and join our Discord", - "Browse projects and find one that excites you", - "Submit your application with a proposal", - "Get selected and bond with your mentor", - "Code, learn, and contribute for 3 months", - "Complete your project and get certified" - ].map((step, i) => ( -
      1. -
        - {i + 1} -
        - {step} -
      2. - ))} -
      - - Contact Us About an Exceptional Case - +
      + +
      + {/* For Mentees */} +
      +
      + +

      For mentees

      - - {/* For Mentors */} -
      -
      -
      - -
      -

      FOR MENTORS

      -
      -
        - {[ - "Register and get verified as a mentor", - "Submit your project idea with details", - "Review applications from mentees", - "Select your mentee(s) for the project", - "Guide them through weekly check-ins", - "Evaluate and celebrate their success" - ].map((step, i) => ( -
      1. -
        - {i + 1} -
        - {step} -
      2. - ))} -
      - - Contact Us About Mentoring - + +
      +
      -
      -
      - {/* FAQ Preview */} -
      -
      -
      -

      - FAQ -

      -
      - -
      - {[ - { - q: "Who can participate in DSOC?", - a: "Anyone! Students, professionals, and hobbyists from anywhere in the world can apply as mentees. We especially encourage underrepresented groups in tech." - }, - { - q: "Is there a stipend for participants?", - a: "Yes. DSOC is a paid program, and selected participants receive a stipend during the coding period." - }, - { - q: "What's the time commitment?", - a: "Mentees should expect to dedicate 15-20 hours per week. Mentors typically spend 3-5 hours per week on guidance and code reviews." - }, - { - q: "Do I need prior open source experience?", - a: "Not at all! We have projects for all skill levels. Beginner projects are specifically designed for first-time contributors." - } - ].map((faq, i) => ( -
      -

      - - {faq.q} -

      -

      {faq.a}

      -
      - ))} + {/* For Mentors */} +
      +
      + +

      For mentors

      +
      + +
      + +
      -
      +
      + + {/* FAQ */} +
      + +
      + {[ + { + q: "Who can participate in DSOC?", + a: "Anyone! Students, professionals, and hobbyists from anywhere in the world can apply as mentees. We especially encourage underrepresented groups in tech." + }, + { + q: "Is there a stipend for participants?", + a: "Yes. DSOC is a paid program, and selected participants receive a stipend during the coding period." + }, + { + q: "What's the time commitment?", + a: "Mentees should expect to dedicate 15-20 hours per week. Mentors typically spend 3-5 hours per week on guidance and code reviews." + }, + { + q: "Do I need prior open source experience?", + a: "Not at all! We have projects for all skill levels. Beginner projects are specifically designed for first-time contributors." + } + ].map((faq) => ( + +
      {faq.q}
      +
      {faq.a}
      +
      + ))} +
      +
      {/* CTA Section */} -
      -
      -

      - READY TO START YOUR JOURNEY? -

      -

      + +

      +

      Ready to start your journey?

      +

      DSOC 2026 applications are closed. The next application cycle opens next summer.

      -
      -
      +
      + + +
      + {/* Footer Links */} -
      -
      -
      - - Projects - - - Exceptional Cases +
      -
      +
); } + +const CONTACT_HREF = "mailto:info@devweekends.com?subject=DSOC%20Exceptional%20Case"; + +const footerLink = "inline-flex min-h-11 items-center px-3 text-[#404040] transition-colors hover:text-black"; + +/** Difficulty in black and white: outline for beginner, grey fill for intermediate, black fill for advanced. */ +function difficultyStyle(difficulty: string) { + switch (difficulty) { + case 'beginner': return 'border-[#D4D4D4] bg-white text-[#404040]'; + case 'advanced': return 'border-[#0A0A0A] bg-[#0A0A0A] text-white'; + default: return 'border-[#E6E6E6] bg-[#E6E6E6] text-[#262626]'; + } +} + +function IconTile({ icon: Icon }: { icon: LucideIcon }) { + return ( + + ); +} + +function Tag({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} + +function StepList({ steps, onDark }: { steps: string[]; onDark?: boolean }) { + return ( +
    + {steps.map((step, i) => ( +
  1. + + {step} +
  2. + ))} +
+ ); +} diff --git a/app/dsoc/projects/[id]/gallery.css b/app/dsoc/projects/[id]/gallery.css deleted file mode 100644 index 9977f78..0000000 --- a/app/dsoc/projects/[id]/gallery.css +++ /dev/null @@ -1,58 +0,0 @@ -.dsoc-gallery-slider .swiper { - position: relative; -} - -.dsoc-gallery-slider .swiper-button-prev, -.dsoc-gallery-slider .swiper-button-next { - color: var(--dsoc-dark); - background: #fff; - border: 4px solid var(--dsoc-dark); - width: 44px; - height: 44px; - border-radius: 0; - box-shadow: 4px 4px 0 var(--dsoc-dark); - transition: transform 0.1s ease; -} - -.dsoc-gallery-slider .swiper-button-prev:hover, -.dsoc-gallery-slider .swiper-button-next:hover { - transform: translate(2px, 2px); - box-shadow: 2px 2px 0 var(--dsoc-dark); -} - -.dsoc-gallery-slider .swiper-button-prev::after, -.dsoc-gallery-slider .swiper-button-next::after { - font-size: 18px; - font-weight: 900; -} - -.dsoc-gallery-slider .swiper-pagination { - position: relative; - bottom: auto; - padding: 10px 0 8px; - background: var(--dsoc-dark); -} - -.dsoc-gallery-slider .swiper-pagination-bullet { - background: #fff; - opacity: 0.5; - width: 10px; - height: 10px; -} - -.dsoc-gallery-slider .swiper-pagination-bullet-active { - background: var(--dsoc-accent); - opacity: 1; -} - -@media (max-width: 640px) { - .dsoc-gallery-slider .swiper-button-prev, - .dsoc-gallery-slider .swiper-button-next { - width: 36px; - height: 36px; - } - .dsoc-gallery-slider .swiper-button-prev::after, - .dsoc-gallery-slider .swiper-button-next::after { - font-size: 14px; - } -} diff --git a/app/dsoc/projects/[id]/page.tsx b/app/dsoc/projects/[id]/page.tsx index 0706a97..d05c187 100644 --- a/app/dsoc/projects/[id]/page.tsx +++ b/app/dsoc/projects/[id]/page.tsx @@ -3,6 +3,7 @@ import Link from "next/link"; import { useState, useEffect } from "react"; import { useParams } from "next/navigation"; +import type { ReactNode } from "react"; import { ArrowLeft, Clock, @@ -21,13 +22,13 @@ import { ImageIcon, X } from "lucide-react"; +import type { LucideIcon } from "lucide-react"; import { Swiper, SwiperSlide } from "swiper/react"; import { Navigation, Pagination, Keyboard } from "swiper/modules"; import "swiper/css"; import "swiper/css/navigation"; import "swiper/css/pagination"; -import "../../styles.css"; -import "./gallery.css"; +import { Card, container } from "@/components/site/page-kit"; import DSOCNavbar from "../../components/DSOCNavbar"; interface Mentor { @@ -188,7 +189,7 @@ The project is built on the MERN stack with TypeScript and integrates Google Gem _id: 'pathment', title: 'Pathment', description: 'Pathment is a SaaS mentorship platform for organizations that want structured, mentor-guided employee training.\nIt connects mentees with real mentors, uses task-based workflows and progress tracking, and adds gamification to boost engagement and measurable outcomes.', - longDescription: `Pathment is a SaaS-based mentorship platform built for organizations and learning teams that want to run structured, mentor-guided programs. The platform centers on three roles — Admin, Mentor, and Mentee — and supports multi-level programs, mentor matching, task submission with feedback, gamification, and analytics to measure learning outcomes. + longDescription: `Pathment is a SaaS-based mentorship platform built for organizations and learning teams that want to run structured, mentor-guided programs. The platform centers on three roles (Admin, Mentor, and Mentee) and supports multi-level programs, mentor matching, task submission with feedback, gamification, and analytics to measure learning outcomes. The codebase is a monorepo consisting of a public marketing site, a backend server (Node.js + Express + PostgreSQL with Sequelize), and a Next.js + TypeScript client interface. An AI layer (Groq/OpenAI) can generate personalized roadmaps and weekly task breakdowns, saving curriculum design time for admins. Real-time messaging is implemented with Socket.IO, and media is handled via Cloudinary. The project is contributor-friendly with many beginner-friendly issues: UI polish, accessibility, email templates, stricter API validation, test coverage, seed/demo data, and analytics improvements.`, organization: 'Dev Weekends', @@ -374,21 +375,20 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st } }; + /** Difficulty in black and white: outline for beginner, grey fill for intermediate, black fill for advanced. */ const getDifficultyColor = (difficulty: string) => { switch (difficulty) { - case 'beginner': return 'bg-[var(--dsoc-success)]'; - case 'intermediate': return 'bg-[var(--dsoc-accent)]'; - case 'advanced': return 'bg-[var(--dsoc-pink)]'; - default: return 'bg-gray-400'; + case 'beginner': return 'border border-[#D4D4D4] bg-white text-[#404040]'; + case 'advanced': return 'border border-[#0A0A0A] bg-[#0A0A0A] text-white'; + default: return 'border border-[#E6E6E6] bg-[#E6E6E6] text-[#262626]'; } }; const getStatusColor = (status: string) => { switch (status) { - case 'open': return 'bg-[var(--dsoc-success)]'; - case 'in-progress': return 'bg-[var(--dsoc-accent)]'; - case 'completed': return 'bg-[var(--dsoc-purple)]'; - default: return 'bg-gray-400'; + case 'open': return 'border border-[#0A0A0A] bg-[#0A0A0A] text-white'; + case 'in-progress': return 'border border-[#E6E6E6] bg-[#E6E6E6] text-[#262626]'; + default: return 'border border-[#D4D4D4] bg-white text-[#404040]'; } }; @@ -426,15 +426,15 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st const spotsRemaining = project ? project.maxMentees - (project.selectedMentees?.length || 0) : 0; const canApply = project ? project.status === 'open' && !isDeadlinePassed && spotsRemaining > 0 : false; + + if (loading) { return ( -
+
-
-
-
-

Loading project...

-
+
+
); @@ -442,151 +442,141 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st if (error || !project) { return ( -
+
-
-
- -

Project Not Found

-

{error || 'The project you\'re looking for doesn\'t exist.'}

- - - Back to Projects - -
+
+
); } return ( -
+
{lightboxImage && (
setLightboxImage(null)} - className="fixed inset-0 z-[200] bg-black/80 flex items-center justify-center p-4 cursor-zoom-out" + className="fixed inset-0 z-[200] flex cursor-zoom-out items-center justify-center bg-black/80 p-4" > {/* eslint-disable-next-line @next/next/no-img-element */} Project image e.stopPropagation()} />
)} + {/* Header */} -
-
- +
+ - +
{/* Main Content */} -
-
-
+
+
+
{/* Left Column - Main Content */} -
+
{/* Technologies */} -
-

- - Technologies -

+ + Technologies
{project.technologies.map((tech, i) => ( - + {tech} ))}
-
+ {/* Gallery */} {Array.isArray(project.gallery) && project.gallery.length > 0 && ( -
-

- - Gallery -

-
+ + Gallery +
setLightboxImage(url)} - className="block w-full bg-transparent border-0 p-0 cursor-zoom-in" + className="block w-full cursor-zoom-in border-0 bg-transparent p-0" aria-label={`Open gallery image ${i + 1}`} > {/* eslint-disable-next-line @next/next/no-img-element */} {`${project.title} @@ -617,241 +607,217 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st ))}
-
+ )} {/* Long Description */} {project.longDescription && ( -
-

- - About This Project -

-
-

{project.longDescription}

-
-
+ + About This Project +

{project.longDescription}

+
)} {/* Requirements */} {project.requirements && project.requirements.length > 0 && ( -
-

- - Requirements -

+ + Requirements
    {project.requirements.map((req, i) => ( -
  • -
    - -
    +
  • +
  • ))}
-
+ )} {/* Learning Outcomes */} {project.learningOutcomes && project.learningOutcomes.length > 0 && ( -
-

- - What You'll Learn -

-
    + + What You'll Learn +
      {project.learningOutcomes.map((outcome, i) => ( -
    1. -
      - {i + 1} -
      +
    2. + {outcome}
    3. ))} -
-
+ + )} {/* Milestones */} {project.milestones && project.milestones.length > 0 && ( -
-

- - Project Milestones -

-
+ + Project Milestones +
    {project.milestones.map((milestone, i) => ( -
    -
    +
    -

    +

    {milestone.completed && ( - +

    -

    {milestone.description}

    +

    {milestone.description}

    {milestone.dueDate && ( - + {formatDate(milestone.dueDate)} )}
    -
    + ))} -
    -
+ + )} {/* Mentors */} -
-

- - Mentors -

-
+ + Mentors +
    {project.mentors.map((mentor) => ( -
    +
  • -
    +
    {mentor.picture ? ( - {mentor.name} + // eslint-disable-next-line @next/next/no-img-element + {mentor.name} ) : ( mentor.name.charAt(0) )}
    -
    -

    {mentor.name}

    +
    +

    {mentor.name}

    {mentor.jobTitle && ( -

    +

    {mentor.jobTitle} {mentor.company && ` @ ${mentor.company}`}

    )} {mentor.bio && ( -

    {mentor.bio}

    +

    {mentor.bio}

    )} -
    +
    {mentor.github && ( - - + )} {mentor.linkedin && ( - - + )}
    -
    +
  • ))} -
    -
+ +
{/* Right Column - Sidebar */} -
+
{/* Apply Card */} -
-

Apply to This Project

- -
-
- Duration - - +
+

Apply to This Project

+ +
+
+
Duration
+
+
-
- Spots Available - - +
+
Spots Available
+
+
-
- Deadline - +
+
Deadline
+
{formatDate(project.applicationDeadline)} - +
-
- Start Date - {formatDate(project.startDate)} +
+
Start Date
+
{formatDate(project.startDate)}
-
- End Date - {formatDate(project.endDate)} +
+
End Date
+
{formatDate(project.endDate)}
-
+
{canApply ? ( isMentee === null ? ( - ) : isMentee ? ( - Apply Now ) : ( Apply as Mentee First ) ) : ( - )} -

+

By applying, you agree to commit {project.duration} to this project

{/* Star Card */} -
-
- -

Support This Project

+ +
+ +

Support This Project

-

- Love this project? Show your support by starring the repository on GitHub! It helps increase visibility, motivates the mentors, and grows our open-source community. ⭐ +

+ Love this project? Show your support by starring the repository on GitHub! It helps increase visibility, motivates the mentors, and grows our open-source community.

{repoUrls.map((url, i) => ( @@ -860,28 +826,28 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st href={url} target="_blank" rel="noopener noreferrer" - className="neo-brutal-btn bg-white text-[var(--dsoc-dark)] hover:bg-yellow-50 w-full flex items-center justify-center gap-2 border-4 border-[var(--dsoc-dark)]" + className="flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border border-[#D4D4D4] px-4 py-3 text-[15px] font-semibold transition-colors hover:bg-[#F7F7F7]" > - +
-
+ {project.timelineUrl && ( -
+
-

- +

+

-

+

See the full schedule, milestones, and key dates before you apply.

- + New
@@ -889,44 +855,42 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st href={project.timelineUrl} target="_blank" rel="noopener noreferrer" - className="neo-brutal-btn bg-white text-[var(--dsoc-secondary)] w-full mt-4" + className="mt-5 flex min-h-11 w-full items-center justify-center rounded-xl border border-[#D4D4D4] px-4 py-3 text-[15px] font-semibold transition-colors hover:bg-[#F7F7F7]" > View Timeline -
+ )} {/* Discord Card */} -
- - -

Have Questions?

-

- Join our Discord to chat with mentors and other mentees -

- - Join Discord - - -
+ + +

Have Questions?

+

+ Join our Discord to chat with mentors and other mentees +

+ + Join Discord + +
{/* Tags */} {project.tags && project.tags.length > 0 && ( -
-

Tags

+ +

Tags

{project.tags.map((tag, i) => ( - + #{tag} ))}
-
+ )}
@@ -935,3 +899,38 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st
); } + +const primaryButton = + "inline-flex min-h-[52px] items-center justify-center gap-2 rounded-xl bg-[#0A0A0A] px-7 py-4 text-base font-semibold text-white transition-colors hover:bg-[#262626]"; + +const secondaryButton = + "inline-flex min-h-[52px] items-center justify-center gap-2 rounded-xl border border-[#D4D4D4] px-7 py-4 text-base font-semibold text-[#0A0A0A] transition-colors hover:bg-[#F7F7F7]"; + +const sidebarButton = + "flex min-h-[52px] w-full items-center justify-center rounded-xl px-7 py-4 text-base font-semibold transition-colors"; + +/** Swiper is themed through its own CSS variables and class names, so the black and white overrides live here. */ +const galleryClasses = [ + "overflow-hidden rounded-[14px] border border-[#E6E6E6] bg-white", + "[--swiper-theme-color:#0A0A0A] [--swiper-navigation-size:16px]", + "[&_.swiper-button-prev]:!h-11 [&_.swiper-button-prev]:!w-11 [&_.swiper-button-prev]:rounded-full [&_.swiper-button-prev]:bg-white [&_.swiper-button-prev]:shadow-md", + "[&_.swiper-button-next]:!h-11 [&_.swiper-button-next]:!w-11 [&_.swiper-button-next]:rounded-full [&_.swiper-button-next]:bg-white [&_.swiper-button-next]:shadow-md", + "[&_.swiper-pagination]:!relative [&_.swiper-pagination]:!bottom-auto [&_.swiper-pagination]:!py-3 [&_.swiper-pagination]:bg-white", +].join(" "); + +function BlockTitle({ icon: Icon, children }: { icon: LucideIcon; children: ReactNode }) { + return ( +

+ + {children} +

+ ); +} + +function IconTile({ icon: Icon }: { icon: LucideIcon }) { + return ( + + ); +} diff --git a/app/dsoc/projects/page.tsx b/app/dsoc/projects/page.tsx index 068737d..b7ab386 100644 --- a/app/dsoc/projects/page.tsx +++ b/app/dsoc/projects/page.tsx @@ -1,21 +1,19 @@ 'use client'; import Link from "next/link"; -import Image from "next/image"; import { useState, useEffect } from "react"; -import { - Search, - Filter, - Clock, - Users, +import { + Search, + Filter, + Clock, + Users, Code2, - ArrowRight, Github, - ExternalLink, X, BookOpen } from "lucide-react"; -import "../styles.css"; +import type { ReactNode } from "react"; +import { Button, Card, Panel, PageHero, container } from "@/components/site/page-kit"; import DSOCNavbar from "../components/DSOCNavbar"; interface Project { @@ -152,6 +150,9 @@ const SAMPLE_PROJECTS: Project[] = [ }, ]; +const inputClass = + "min-h-[52px] w-full rounded-xl border border-[#D4D4D4] bg-white px-4 text-base text-[#0A0A0A] placeholder:text-[#8A8A8A] focus:border-[#0A0A0A] focus:outline-none focus:ring-2 focus:ring-[#0A0A0A]/10"; + export default function ProjectsPage() { const [projects, setProjects] = useState(SAMPLE_PROJECTS); const [loading, setLoading] = useState(true); @@ -180,7 +181,7 @@ export default function ProjectsPage() { const res = await fetch(`/api/dsoc/projects?${params.toString()}`); const data = await res.json(); - + if (data.success && data.data.length > 0) { setProjects(data.data); setUsingSampleData(false); @@ -214,21 +215,20 @@ export default function ProjectsPage() { fetchProjects(); }; + /** Difficulty in black and white: outline for beginner, grey fill for intermediate, black fill for advanced. */ const getDifficultyColor = (difficulty: string) => { switch (difficulty) { - case 'beginner': return 'bg-[var(--dsoc-success)]'; - case 'intermediate': return 'bg-[var(--dsoc-accent)]'; - case 'advanced': return 'bg-[var(--dsoc-pink)]'; - default: return 'bg-gray-400'; + case 'beginner': return 'border border-[#D4D4D4] bg-white text-[#404040]'; + case 'advanced': return 'border border-[#0A0A0A] bg-[#0A0A0A] text-white'; + default: return 'border border-[#E6E6E6] bg-[#E6E6E6] text-[#262626]'; } }; const getStatusColor = (status: string) => { switch (status) { - case 'open': return 'bg-[var(--dsoc-success)]'; - case 'in-progress': return 'bg-[var(--dsoc-accent)]'; - case 'completed': return 'bg-[var(--dsoc-purple)]'; - default: return 'bg-gray-400'; + case 'open': return 'border border-[#0A0A0A] bg-[#0A0A0A] text-white'; + case 'in-progress': return 'border border-[#E6E6E6] bg-[#E6E6E6] text-[#262626]'; + default: return 'border border-[#D4D4D4] bg-white text-[#404040]'; } }; @@ -249,54 +249,60 @@ export default function ProjectsPage() { return project.repositoryUrl ? [project.repositoryUrl] : []; }; + const activeFilters = (filters.difficulty ? 1 : 0) + (filters.technology ? 1 : 0); + return ( -
+
{/* DSOC Navigation */} - + {/* Header */} -
-
-
-

- DSOC PROJECTS -

-

- Find the perfect project to kickstart your open source journey -

-
-
-
+ + Find the perfect project to kickstart your open source journey. + + DSOC 2026 applications are closed. They open again next summer. + + + } + /> {/* Search & Filters */} -
-
-
-
- +
+
+ +
+
- - @@ -304,27 +310,29 @@ export default function ProjectsPage() { {/* Filter Panel */} {showFilters && ( -
-
-

Filter Projects

+ +
+

Filter projects

-
+
- +
- +
- +
-
+
)}
{/* Projects Grid */} -
-
+
+
{loading ? ( -
-
-

Loading projects...

+
+ ) : projects.length === 0 ? ( -
- -

No Projects Found

-

+

+
{/* CTA */} -
-
-

Don't see what you're looking for?

-

- We're always adding new projects. Join our Discord to get notified when new projects are added, + +

+

Don't see what you're looking for?

+

+ We're always adding new projects. Join our Discord to get notified when new projects are added, or become a mentor and propose your own project!

-
- - Join Discord - - - Propose a Project - -
-
+
+ + +
+
); } + +function Tag({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} From 428d63ce03752f2ad8139580d51dc39d2dc11048 Mon Sep 17 00:00:00 2001 From: Zeeshan Adil Date: Wed, 28 Oct 2026 04:22:38 +0500 Subject: [PATCH 4/5] feat(brand): add the week logo and a kit for partner communities The brand page now offers the logo with the seven week bars (black and white, transparent PNG, built from the high-resolution source), a co-branded lockup guide, In partnership with and Community partner of badges in light and dark SVG, a one-line description for partners, and guidelines for the bars and the tagline. Includes the page's share metadata. --- app/brand/page.tsx | 104 +++++++++++++++++- .../brand/dw-badge-community-partner-dark.svg | 8 ++ .../dw-badge-community-partner-light.svg | 8 ++ public/brand/dw-badge-partnership-dark.svg | 8 ++ public/brand/dw-badge-partnership-light.svg | 8 ++ public/brand/dw-logo-week-black.png | Bin 0 -> 57722 bytes public/brand/dw-logo-week-white.png | Bin 0 -> 56841 bytes 7 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 public/brand/dw-badge-community-partner-dark.svg create mode 100644 public/brand/dw-badge-community-partner-light.svg create mode 100644 public/brand/dw-badge-partnership-dark.svg create mode 100644 public/brand/dw-badge-partnership-light.svg create mode 100644 public/brand/dw-logo-week-black.png create mode 100644 public/brand/dw-logo-week-white.png diff --git a/app/brand/page.tsx b/app/brand/page.tsx index 4bc6b43..51dfcee 100644 --- a/app/brand/page.tsx +++ b/app/brand/page.tsx @@ -1,14 +1,16 @@ import Image from "next/image"; import { Download, ExternalLink } from "lucide-react"; +import { BrandLogo } from "@/components/home/brand-logo"; import { Card, Eyebrow, PageHero, Panel, Section, SectionHeading } from "@/components/site/page-kit"; +import { withSocial } from "@/lib/seo"; -export const metadata = { +export const metadata = withSocial({ alternates: { canonical: "/brand" }, title: "Brand Kit & Speaker Resources", description: "Download Dev Weekends logos and the official session slide template. Designed for speakers, mentors, and community partners.", -}; +}); type Logo = { name: string; @@ -21,6 +23,22 @@ type Logo = { }; const logos: Logo[] = [ + { + name: "Logo with the week, black", + description: "The wordmark with the seven week bars. The main logo for light surfaces.", + file: "/brand/dw-logo-week-black.png", + download: "dev-weekends-logo-black.png", + kind: "png", + tile: "bg-[#F7F7F7]", + }, + { + name: "Logo with the week, white", + description: "The same logo in white. For dark surfaces and photos.", + file: "/brand/dw-logo-week-white.png", + download: "dev-weekends-logo-white.png", + kind: "png", + tile: "bg-[#0A0A0A]", + }, { name: "Logo on dark badge", description: "White wordmark on a black circle. Works on light or dark backgrounds.", @@ -56,11 +74,20 @@ const logos: Logo[] = [ ]; const guidelines = [ + "Keep the seven bars under the wordmark. The last two are the weekend, and they stay taller.", + "The tagline, Great engineers. Greater impact., goes next to the logo, never inside it.", "Keep clear space around the logo equal to the height of the wordmark.", "Do not stretch, recolor, or add effects to the logo.", "Use the dark badge version when the background is busy or photographic.", ]; +const badges = [ + { name: "In partnership with, light", file: "/brand/dw-badge-partnership-light.svg", tile: "bg-[#F7F7F7]" }, + { name: "In partnership with, dark", file: "/brand/dw-badge-partnership-dark.svg", tile: "bg-[#F7F7F7]" }, + { name: "Community partner of, light", file: "/brand/dw-badge-community-partner-light.svg", tile: "bg-[#F7F7F7]" }, + { name: "Community partner of, dark", file: "/brand/dw-badge-community-partner-dark.svg", tile: "bg-[#F7F7F7]" }, +]; + const focusRing = "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#0A0A0A]"; const outlineBtn = `inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-[#D4D4D4] px-5 text-[15px] font-semibold text-[#0A0A0A] transition-colors hover:bg-[#F7F7F7] ${focusRing}`; @@ -80,7 +107,7 @@ export default function BrandKitPage() { title="Download the logo." intro="Pick the version that fits your background." /> -
    +
      {logos.map((logo) => (
    • @@ -159,9 +186,78 @@ export default function BrandKitPage() {
+
+ + +
+ + Co-branded lockup +
+ + + + Your logo + +
+
    +
  • Put both logos at the same height, with a thin × between them.
  • +
  • Use our black logo on light backgrounds and the white one on dark backgrounds.
  • +
  • Keep the seven bars under our wordmark; do not crop or recolor them.
  • +
+
+ + + Describe us in one line +

+ Dev Weekends is a free, international community where engineers learn, build and grow together. +

+

+ Tagline, if you have room: Great engineers. Greater impact. +

+

+ Send your draft to{" "} + + info@devweekends.com + {" "} + before it goes public. +

+
+
+ +

Partner badges

+
    + {badges.map((badge) => ( +
  • + +
    + {/* eslint-disable-next-line @next/next/no-img-element */} + {`${badge.name} +
    +
    + {badge.name} + + +
    +
    +
  • + ))} +
+
+
-
    +
      {guidelines.map((rule, index) => (
    • diff --git a/public/brand/dw-badge-community-partner-dark.svg b/public/brand/dw-badge-community-partner-dark.svg new file mode 100644 index 0000000..c311ceb --- /dev/null +++ b/public/brand/dw-badge-community-partner-dark.svg @@ -0,0 +1,8 @@ + + + COMMUNITY PARTNER OF + + + Great engineers. + Greater impact. + diff --git a/public/brand/dw-badge-community-partner-light.svg b/public/brand/dw-badge-community-partner-light.svg new file mode 100644 index 0000000..8da1242 --- /dev/null +++ b/public/brand/dw-badge-community-partner-light.svg @@ -0,0 +1,8 @@ + + + COMMUNITY PARTNER OF + + + Great engineers. + Greater impact. + diff --git a/public/brand/dw-badge-partnership-dark.svg b/public/brand/dw-badge-partnership-dark.svg new file mode 100644 index 0000000..d1f94db --- /dev/null +++ b/public/brand/dw-badge-partnership-dark.svg @@ -0,0 +1,8 @@ + + + IN PARTNERSHIP WITH + + + Great engineers. + Greater impact. + diff --git a/public/brand/dw-badge-partnership-light.svg b/public/brand/dw-badge-partnership-light.svg new file mode 100644 index 0000000..a919618 --- /dev/null +++ b/public/brand/dw-badge-partnership-light.svg @@ -0,0 +1,8 @@ + + + IN PARTNERSHIP WITH + + + Great engineers. + Greater impact. + diff --git a/public/brand/dw-logo-week-black.png b/public/brand/dw-logo-week-black.png new file mode 100644 index 0000000000000000000000000000000000000000..72c3a56b6a8fcbf8af5914c325493f2e920792e8 GIT binary patch literal 57722 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 PjR19JEu|U-^RWK|O8*_B literal 0 HcmV?d00001 diff --git a/public/brand/dw-logo-week-white.png b/public/brand/dw-logo-week-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe4b5c65955ce43e757c4c7d7834fa3f22f12a9 GIT binary patch literal 56841 zcmYJabzGD07dK8L(jlFrQ`l&v84c16B8*9Q2uOpD?ie8m2-4jpQbPtvhcrk_hk(E{ zKi}W)dG>m3f9$^R>ps`%^FHT_*3niWd`kNi4GoP@O;t$`4GjZ?hKBy@2@dKXwB;Zd z)Gwa9s;L(m8s_f5FM3m;o)a1xGn$%`yusVtLrdI7KEw2&o38vn5G;8eISTUaTrWyp zQZL`ZC)YQJHw zeD$=ay4|O*oAVGPiu!N>KmZ^=fc!SVg6WtCkWZ5QG8$0|-U8ji=8D|kX)BFQIz6_+ z-l;0Bumaqul3QSi9PrjNz!?^4TLjF)T&bD|@F5!UtkI=(kU+sa7Qq%mxyW!W_X@R4 zC8Jk>=F~mj>Z-!3ThO+GRb#-&QMu;Gl1@PA;n*| zv)e!^_&GpU4{$+5>fa2b=LO7BB}afE70n*8@3>AE=o$CAL_G^5+26UP^w>UVGpl<= z>`4=S=v#MZL#rnfgyRhbfg$Nn2q{l!`Ohw6nBLtBRg$%tP8@Py4Y@5Xf~GyAiVzAYB#u!qP7Uvk}F4mXysQdq6@@FUIc+h zhp8>s%gj#mG!z$ebjsEYX_GE|8kY|aUA}Gkwz&ZC%!Vz!R7xOAcJU4|tCm}0l{TZy zTJ!wobniSx(vgm$QJg*^qV7p;$A(G0=vTe4s18bh%K_W;N|2Dvn_)Z>FL_g-L1|Cj z$h$`}(wk4PToyngS#sZAH$q@R;js@=xi0368(5JUu%q(x2I7O_L>^- zj+T=tnz-7S7~+qHduU<*Rg6e_Ns&w!IZxa5rosEMByG((+;GsuW0t<}(Ct5#U0@B8 zMVP=n*hPm_HozoOQ?SnJjn`G&&Q<90Wq!4t(~?Q~b^x(F3%`o@Y}gf}JK!xlb?2+b z>y+b~RGNQGH=t#He!B#ni$q(~O-vkC+Qp*v7NfX|O)!(51aRnBr*pVtiiFO;o+u5toAK9@v09mBIU{BQT` zyPUbmG}=oTHPeQJQS@Q0jMgaZRQ~lJZ_+kOZamiD64TE)7Fwx)Dr^4V(yT>{a`aEF zF?M1QHi7edL05S9wsPtVKosiF(pTg4S}~3rrnyo zJ%!r-XMdOxsc`k8FX4i?=+8-qd+!jTPj7`^>f$5$)ETqpv$xN+PeuMm7zK*S@ve?i z9+E9T&cW%0`6yd z-dkI<3%S$*VRiqP51YFwBr|(Y`nL&4C6w+ag_SP9glIX6rtw?t4eyBel{3p*`oYyGkgaO3U2?xYX@ryv11oS+1Hpnjr>tvie?o5c7Wm(*YUvJCnn z-pp>1B1~F*{-5Zjqf%*9aJ>OQk*aT_9wJgoTW}?acu-)B2H-z+p8%oWMBxsyOQwaq zSigU7=D5NGz;$}u_yc!n&0CV({HH!2dxzs}F+D&P>W-B0;U})7H*qj}#rwFa)|Sg^ zTq%@vZMW7TgLOpijxGFQI;;v_&9Egd0wC#vhLY&P`EWAR+kcGQWynQ}i^8y_m4=Z| z2PPt~$ElKW?O){-zs=^os-^pHoix-s6Rg4jA(7sDiW5Ilf5CxK&74VGEsc1!%@vtW z-T(Ai4@FQ>B7|d&%ts>1COwh83+^!c`O|~=8~wKbJlO6N6n7X?Xy}-oD?D*+&JBM1 zdEJWB4F{avYX2jJi|F6=Z%}EEWzH|yxZz#^Y|J4Z*AJe!jBNjztc^QxbC>lKDZB89 zvc<6;>5UlRIml}J>%Z3@yhrhr={2us4OboBEF52Hi*5gd5&v78`>w@**IBVqi_5U~ z52JB~)T-7nImYO_DmSP8lNx>08ft$k(}dAsO*p;1y?WWlt&*diVKv=|$%=;eW&tsVod@8V+mk?-)~nVFVZvJpzC^ zdD-I7H9YAO7pBYggMSO@GK0DlDDik~{JB`+`_E!5WPy1Kdl7E2i1da=sIVZlVT-iS z&wn&!_6=*!;WrdrXTb3ad9x=YRK$t7}6e5np3GX5J|@X;gCn zRALb80MAI7=K+zAfzqUHT`+o1Kq6)G8yG?ZyyZ>mp9jlj2lUJ+#KbCT8cheVs%vKK z{-tH(Xi-0U*6CISWR_7_t-`ROJr|@+-E23FK{Kvp_NT`YC{$``hMi;WLF}dkTb8j`j!6))?b?*9`A2E4y$A@WK zQi;qBrO0aZNX@v*&rpoSiqKAG`%j{`-7pJMmp#S*oQoj~h~E5lg!gKqQ>>}MQ!_j0 zZr1nPKqetBkdJP3<4~4E@>}=CX11ztmFJ9=e(tcs6G(dN= z@%x`;7&3zhtU57;#8WF--JjJBV9ll@S!cmCT!yE0I#2QCiYU01ByEHNJjLR#;ic4cx(8Sr_A!ihibw_4!Q~4t_K;6n zdB}gBvgiWBVYGvL9P(r3RYK6-K-Y%@?oCkt_xZQ9V=37P`$uUJ_dmY@XMybk#lb_> zJuwjFivX5#WBnAr>_Hxh|1uJlyGK_-(W6~h-%horp=#lMgSutdW|_f zkh2Y1p41*c?Q;;&p{aEA60U`-#OK)1#a8`Kh^o}u&=hu1((imdh8$Ef{L>(p82`n= zw8;p?P)^!2=Cal?c7W(B-IgUbhw;#*HEGU&NrKQ*cOYoGnQ5FwSTyu)tQlLk68?++ zUu%x$1=u~6M;tgqW5^0e;EBSNOwOp&e~;)Ycrz%kp^_E_@=D;(y^f>{V#??@F^C&l zHj7`9+RQ)^#Yv-?OJ9N+Cxtuayp`d&|4cR)S*+!_dtO2}&{|N<2FRa_x@S@ru6=6Q zVm#AiASTdcH)Poe(P)7~&=LAq#lhN!(f9XvL@Khnmk<0$P@b2f`UK4g_O2H8 zvt{UPf=o{|?44E(Lmf!;C=y>hgIkVTsRYU={B?ngm$XuNk+D~AGXu_|oq-+GdgTLT zygDYPv+L=u&kyO*y}U{e|MmWl>{~})1wjTfQwirXc;mAo2lQ2QB`Y=n6)9frOlziE z=yM-FxS3(?WUV0%jdmiqgLw=wj11*W9Sf51b>2NLeYopW=2M)6YLvv4uja?wU?Gs+ zrL0#>sQijz(V=v-pWeoa@l$Vat$n5PcUA+iH}PzVERLPEOC~gj;O@Zy-J+gVaXny= z((d!ll%o*lF#X&g4(%ehj6VgBQ-IUIVrBGd=6Iy{1nSG17gj%4<1EPMEE{^}{_;!q zKr6GQOY2gYO}O`N_$=q%e#c$L&ppp3c&T#GEm}1>?bpK*1 zYXag$rjUQ9&zZh9KL+1&eGiL#?8t}F0|23EgV6u z&?3gydSSI<0}|RQk|^C{tsLL=V}0ppZ;^07om*d=X!9gzbISF_`**@(WJ)Gxn`zZ{ zuQ;02=L>zv^N?xugTRJ#jt&0o-xQRXCIOXzGCJX1F?5hC<|}?Kh#- zO@>KlXPXJNJvnwhmW+effHPF=hrx1-diOKI8_oN-D}^a10sUsMtmiQ0v(+zqj~#L& zq3@LO#`VElM*vSt2J%4bFt!nmoCUKg6@5E)Aew2F0$r!R(wGkL50pJIFF}mp=4}6c%x1({K7%W4s)nFL0+Zc*EWDS^-Z#*$GwIc!4o;tB~||?+=~ify_`QS%ZhYl zzh5*=C44a@)>w7Y7F3O*N)A%mdcVK%LNSWrQSk&n zbHW*jq&d|kiMcNoXJAb7Q zZnW;@xUat_9PszcMZ!|4`-_JLe!xp306FK1;_AqLgbBii+?vuO z`qBaNdq6nzWLd7c`?J*7Kp27)Qn;$OJw3EPzyC?bE=IiwmoF1~bAy!R(36(L5eCPQuj6`@{~ z35qAb(9K+K$pGkf#At(sADns>ZqHt?Wb#0zb|3MKVk_)(HEOT!bNQZU2twMDj6n5M z)RkAr>qUXu+&ySW&S$(siId}>y(qyt6Cf5^096SliOL-zDtE!6lKQx)95mPZ4i-w*pYC_cZUz=Mw-N~ zlIpI@e9OpEMrU_4-;+_+j7d459VQf%sITGAVC|=l#O1iDiA78`2HYDt7S)r`_G?E5 z-Z(Qn??hK!0NUc6+VPMqPR`N#WHBE*1Tb#I29wh0k3jW>oJY(lG0+3Mt?>D@UEqmz zgQz;slNm8y0#yFHz20!I7^eJN5Ea}<8u53qkB9B%7O2tSVGaQR1<1EIb7aYnB*{!E z*d?FvH$E>OT|QZWncAI5#{!JxI$Ad_J#p)89yuO*f|#Uw1KxwtVuNe#gSC|ysVent z+0jj*eL-Dt*k942AU*K1$r~9nN`Sl}_)%f^*W{5qthus~bJ31jeTI?YJ5;lmg!R3)wb=PKv?)N`}7-$ zMe|sbw`tt_k+hPN6&3w_KfMk>#FP61K1d7s86Wv!!n)8Y$R$4z=eo+lnAcw7V=|?a z7`@Zvr@(1kk}uNL0`+nT8-Zqn3Bk=5kn-iwpY%bUUk2LM1#i`JhG`$WwZ4v! zQe=s!inqR~zUZW)VGbA8%4;!X2Rp?*{WDplM3cN2m9 zF7fDBVIHuuJqvdm8>w@^7kJchUG6ZsnhGQLNPJ^v6CPcvB6us4of(u{HRz?T)l`Iv zS#6^FHJ?)FDQQo%%0hyI(n`uOr0j<%&&x`2WH_-RfimE&ctiUl$5g{eO15Pv0{=iX z^6QC8G{TRyw?TvBA<9-qISP5=WKxPo1bhff$#zQm`jgV-ShOOH(dB7nQ2X_h4Cj@Q z`{h3HRzCETh6sA-9qpi>qNUbPz}~P+wyG^FMqBRJldNFzHW$6NOrhGJnf#wnkWLZG zy?6eAJn!W&L6}dyG1;oAB0o*h9y@2RNA}w=i<`4sjMN3>@%v~t4x0@0rlL;=?%gLn zJ5!yBkmo>e4A|fIg`CS!dS1k$DyEYikeZcIEHXT}+nnEY_XEqHzrS7sMQz=*qT^NR zjbBC+4(NPceuA$>Le7WD=P_vG_i4=BiS1Nn_}0-z4XTFsCxQYuV}Hq|*J)hEU(aYYgL}UfvPxUDg&+P?Dku|E(bhJjj1UCf}`CxUGsnhERkt()X?_{!n3sw_)s+osJ) zE_*FL9G=Igfr-!6kOYez(3tNyFWxVTlqgvGkHoEvNK~tE0E~_5TTBY;77I=(PE^}D zI6Pk})@K-si@;9z?z3$5K%sYue9C+Q zAjfq4DEkpK?Hk-^3PSgR66b*FK@saE4Sj%TXLDj6u0EFe#OWUmc8E^BA8->=GSh4R zOg)|^;}VaVDoFD8*AWG1q_5lTB|7`!j@NrkV{rA`eG!g7f)X!YDg~>%H2mZW|5j+H zf!lu+w15AJ2{IU*AMxzQE4WAA9Regu@3W3ZeFO_%{y8S=N7f3cFE_fW z3iY@a*V<^H`%zfO6pob-JX6g>_J2>yb>$88o1#8~mJ6OuCOMEjA>Z{8mMY>y|C*=y zOVe4V$S_UlC&V2IElx5Aj)?$M@#TKsmEORQdP*J3# z)VmK=VjbRfZRE?c#r-W$tp@cv=N4pbqJZ*_4|z*(OjVw)$v8UsO2>s){f2%%JHy}3 zzMiuE$X8vKN`pg2z*sQ12^qA7wlk7Ae_AMxWy&dVspYI>HlpS?3{6`$ukq-t6auv) zw6^S>t%a7VW4gW!_2D1c;Bj`;W1#nI!p4l}rsQ)kDLOJ4U}~QpG<*VESDmKgsPhcNw0cBGEti)@O>^6;AV7 zhvbAp%lkRUlt6fxi;)VCRLcvw^~)JHN@Lmz&G#hcAe_N3p`Hahgd&RkX}%DeZ-nd7t=0{Qv+>ib zDb;doi;F5SYy9L}9yfVsUJg$P$Gna+qk%X4hv+US_GV0Dh<7f+yw6n zO@7F&DYDGS8e#N*U+#-is%e>sY)%{;{5xebwjD3?bcm@KSZDZb=_pp&u(c$k;f?O? z)rz-U3zx2?eqsrXZlHL(Wjbo_e61wxt^&G2{ap^K@E9a+=`<4mLKH)=PDdpcF+fUY zi35yi{X#d{BvKWv4HXzd93WAMT{z9EAr<&5)He;Cx>m4*v2@NTX6+R#Mssx3NU71BWUoZjy zJwoBBmr6r#orQ>Y{xGr!S?IQ%odVI*=7m@QFNK6W{FOMOgc7srPu@1Ks2pu-LmNNk zA}Q!d+`Ag}#L7$-c$@eq)_*kH{rIwmM^pCGjc-axrTDX!24;Y~LB_@`;0(KKRwKHz zGCS^b9!JvTu;ydfTN-+y3PLR2aXg>8I6Xo0UuN70?7Nrd0ldH^u5&vJ{Y!RM@fYm< zl$+V#36=^fJ>0uOVTTpbbj)vCKlE{cz`;xz-*@(!4%Oy(BBdo z&jHWS%Gu_~au03R!n*XSVku)JA9WKb%TJQXre3nINaG?C=|Li^L}<-#b%*tv(dR)Zmn2zD`*;Hy=W zs528Wo~SH%Vb7xHgGmb%f zWK4qN{l;f1^xe3)ogUUyyjzN1G+rkS#a|wd6D>}KuMn1VW)Z~vUhg@#1ubyT~(*V4+?KrU+bM^P#Jk0dQk?q|d z;wRaTe8v@mM**}*{RRejP{iZ|i8W7q(%CooS^p6JLpjmMoRSUW<6;Jdl5=UF4au)x zZWhUiw4vo-sLtQ>3V>(2b@%}Nj_U1w9+N>J0e5>gpSbVwa*6vJZoV3@ z90ckFaSg8K{>mLaI&}B|brQN={Gj{Xz3;LKg-1Ufbb65`X%FA3cfsBj+|5s4wB%H~ zYgUNdI+9XQ>edK8WuSp@T;8q!32|rUWx8UVZ9-d}*mB%5*gCyTqS2q*(V{Wc;x3Z+ z(tVOEV^Z^(tZ5F7#7LhdP){G;qZszX)WfU~<5n;~pL#O5(@Oumd+&U-Ynm4CUslj( zv_#-8rhkm1o629|a3`0iQ|H7RYlm|mhWT1H{Tt-X5~fSp-0hPoryrO%*=+*V6l1FQ z!QwHgGnra;B zYD=bT(J}f2YV7I(_dJ!nt=e>;hL3}uz)i#fQv+mjNj~`;6=_7@oVlL+vCwfv{nXaI z>x5^`U^_JoUjMb=bkQVA8W;zF63)nI8DGL|!$#B$jDJyDbZ{8;mBlV<{Rw7PljXoj z&$hRs-1i=1YOyT~rzx${#;KV;@AU?zu3C4~w)amHZ76-- zEiS$*L&+?SC{sohQVvMhks0{e{b!Tq8;3Weg}QeYqS~E=Spo+(q9eg@I z;m2{@MW7RUi$e$YEtBS5>b|25cf>ThC$YxqYOPwCj`9>iGS!O7`$=|LAUGtm%ta3m zjj|}DkFLJMM2)1vXV%3Q1o^ zLw9{(wG~_m_f>OAjkxRg0QI^AN5M$AZoRJYXixR9Aqu5^3jA z!ib6Q#u^f-17sy%|1K(Y$W%f$S_~`=YhLn$c)cHu;|ETIei#e&c1HO%aS+)u5f;aj z?xgh!923t||ELc?(n>{UjcW@De3q1c$xcqVGa)EYg3X`a=kW>zVX=7S*oA6aXg|uK z3BpDxt1$JB3xspNTWgB0p#}v0Hw*9`AcDUyAQh>Zt2OM`e$9L! zqtSL&7NF3ykK&RCf4&~E>0&ygPyDHFxOX$Pu6&_+C6#6NSZF}Vb|+=B>vdt`w{n&2 zY=co+!xyFT=~&*c-hN!vPzu&dIc+H43D=_Lvlly3v2Dv4PM#Ap!|x)?A!qf0+N2)W z_DWG2@w?hX5l!*D@%U1%CT}aIRtr|MHwjSPGBu@#!ks+`w6PaIb*AX`oB|hRo9re3 z?vKhkZAh`lxL!|>6ltW%=t->_nQAq&|6%cY|VL1LQ0XYo6n_BL{GQOu6A)yV$$ zzwaFdQEf3~Z@-T=svQ6ZHw(m>$ci&R#}4g;Maw>sS@J4d(aH(wnv)M_(EJ<5ERzbj z&&22Yn}Mwj6@8xt9<-6a!^7YUVH)JPwdifj=T9YZ`YXR>RiX-Y27B6PcaE6Y$jz$j zw?t!R?REJje|IxQAj4%uN2o6NT~G)$YiS5FiMu`hrr-cva7 z+*hA$$3|&*h&zP;6{Eo)&1;nPw61EJEDj$~ zts6M`8{EpF-`PX~QQm<`WM>|IzMjuWaY$nmxg!r6W%B}Va{Z7slLQGPN`&Ld88X-_ z^oOB5!1;XDxu!Pa-(n0b;i`E-xOPRgi@a2^8V)vQFYnCeB4^mXZH$zEo*!K}K6^yB zsV2^8?@T^_j#-=3;BLkYATBv=AK=oeVL4QN!?AJhQa|P%)L^iPyOaEk>t2m#p=;MRh1LyWjCorns=ecW02Wm z5;eRAiNV_lUHYi$E1WEfk1>gL`Bv|brD0}f7PyEY)sWFh3RXM%Cdq2IEOeJS_(=%9 zPubyP-SPV4X9#$go$sas?(w$y87Fyi#C(t@K0A}UN|(apN{p#oCOO{4I4fwU!U>vP z->F_iq$yBuo!*vGg0u~GNwW?%nHhRNo7IsrG3^OdT;qF&hIxy8?Kg;u!Tq7{2E47D zKB?s)-=$e-x}$4dCm|cT2@Y0?vDreDcZS1*Ej(E+hs(MCNG74c0fG(btUuFUh$jz6 zj>^pT8M|~Xeuj(bybE5r-*6S-7yv=$xhm@FxQpL-qmJzcKVxjy*9McZ@CXw#e`GS2 z%yo!tOTJ`i#0w~}ngT5UoZk7+F7y68knpm1yUQI&?#9Onx@XWdBFg3L5}UOCZua7R z6u>o-i3Gm4moVD8oi*KQMHR7}Ho(T7TX|;9&m}sGLCK}8#V^V-Ghg`W@y$mYi9e6F zpTL23O_q*AOb6IQgmu{Xa|E7m3lnDeeP1WWIix*zFe3$T#oo4vBbrlhuLYBSF%sv2@n&9LOeYlU>O zHaJGGmQ<9;XTktgXcDO}ouzfoF4Cewvoj8v(x*nZ$t31nE;^8n#21^z1*Dy`i;v50H%)+peNqDsOG zm$dD3yLiIHt?Asexj2^~dTj0LSu+W4t zIe3AEi#;s}$Ye?}f1Q5|NjH{) z`JMW(Cw%&TPM%(S$N;*T!k}B0cM2SvEPneIu{4qWVu!aZ%xi`H zjRB|roPu(A1a#^269>GONN4D%#wRL(FFxm&5=$61&M)7U_Q}*fzeFPav!Gr+lcS?< zJ5BtY^yNeYoFErTkc`|dCPB{j2uU6PB1?wbH9bLIv7|brP)1p&--LUhqZwtzMTF^p ztUN=={TVw}+NuJ0zC8TinukxRprq4m=&5XKbY==6U{XGot1>==XGOm;V#vfiG z8dcT%$J*wJlFkRM&GlP#0(tB2#Sv`k_DtnQaHHtZ*K>}A4>5m=jY5Ia#IqKkS_Mrg z^c@~)r3Gm7ir%+J)=gyXR#<;Zr5VDx8>1Kqb7yucC(i{dZaz1;4O*6bl12zrtEnlh zV=)Slu>(e|z5)*X^`#rIu@a1k-4WSWSk$OuqdyTF(Yx)U_BSfY$0LI8)o=h3r_bnO zq4F#8bA#2X^{^C{6F;?MLdr~V`%A+6zhVd;Zkz4Wz$P#|^~rS>b;**2rNl+2!AGP}z}UAa;7o|XH{?rvCU)Ywh-J6&2G4E>uD3c{6I)0vfv z)3b-42={+qYk%wP-TEL>Cjy~a!^nF+y(-`NJ_&4_1>rarTcGW`_U0s=^B0Ne3DdmM z@|1U(UL@V@vPx)=bM9yku(^Gab(mlNy;)8=WwuKyd7$u#iSheoEqq8+yH3NEYtir8 z&#@2jbtEyL)Y+W)F0bTsA`fJLv<83Bf^r~VES3|OCeBS|k$2a?S~S>8sGuJbFThogItuYBE&fd>#0 zV`9t30!+PTaB_$U+#Bbq3+CO&Hy;h3pe!nIndGrrdKDT-{QSJ9ZgY)=MG%`vbiGvJO-H}J&|i=VZ_ z1giKoT^6zjN}H5Tr@q{cA*{BnQf~DKIh#cb$1YbLR1Ot?k*@~m=62GBun>IH-!HFu+a}DaWycOwjifX9wZ#6pW3DPFo`Eg(=%p)~;9}z9&BSesy#4!S z8UI@R!{eD5tht>Z!vu3YlXJTjL-tG-h!ch4$p_wT(%<*Zsx)|GGTuPjHP;dr#pS1B zpT#j()QX8TpS)2H4~cDs&-2?=#C#aoXiEmyf7C$|U`k2DYG0$zSDC%2MgFC;J82^{a}=iP1- zBz|P21=ZrEmu3cuF|WTED?m+24UMNrG#;SIe}rB5%%i`OR|=*-_41nNra%w`<6}Xi zp2{B?7)PO;pMF>OZ*>AFz|;a>C-}sZz8}Me%E>Y=r&vQ4f1C*b2$?$AOfyzvgL2e_ z2&xU93lcrXM&n-&i_ox3K%n7^uF8ozSt8FSnq8;ns6@D$M)l^7yXQXznalUQtxCLe z+-7(qGYik&Ines2ctr z#G=J}Kn-;|#1C;{igPI2PcCU)3l*=tGOellyayD8P{-4BVCEv#acAz%smp&iDpb=Z zwac4~#h6$*cL^|>{~^dIPP#cOwrYO9n5eprNg%(&3a*o=M2--?0q{Q zi^nIZN!F^vO_`cx>MJ|TzxTSMe&+PHe1B>0oxZ6(dtnK~;z4%+f87JwZ1hrT4yzXZU(=fzKHW`ejqN+WtvAKS4s|}gV8w80ZKV;(iMxf{0 zYOKipH+u;rpUPKd$fD?WxYTWL^<8PQVet=Co1ALXyDmQ+4^hzPCGD3|EbAKeK71V! zMYJc~{0*7ac)F9M_D+cGf}U4X;&1>fgSGojEmw4j#;d6`@A(Rq-y_wTl>Rd&MPS>} z`YrZnsJT^`%zJ{qinVr4g3+)136S3eLD%oqo2kh6Lcl+%GQJHFRxteYB#R+}Xnr|F zAHQ4khP&-2G#q5n6w!BP;&k6vDMkJ9B|8m=EoDwOO?w(AX(KBc6>B6dbb5U|R*H0> zVVsuL+)*YJB-sFthe0&kY;jE2bjlqats9cASy7CLxcd0!=hCanE&<|dL}>Q1%<1zq zjZ~R7Pj+sY_Z8j2S6ZLj?U$&YT`r}oK8|3j+Gq{PCmw=Vf2!KHW7OKR-tTafRBJ6b zf`VpRb=%FpXtf_JY7{q+vwmDvyl1qa`~7Eut>+bw;(Jv)J{$n#eP>j4;vM(UP^}$Q zM+me`Qo{apmMHOfQl{foKX4xTVjtY0ch|gRtnRqVP-nAX{fpvj*f3%H}VTJ&5Oj`qqsEQu5L3 zQ1sU`Yqdb`jnIpLH@od(*JXL6xlhBrI_qfHU)YX+z+Pe<(?nIV=Q-6d1 zJE3)~>P|i++)F3zGy!?G%EZlvg%h4B2c1OZHa)2X!JO)xRPCBC zK=_(N`V(+qscLs~8Sy>Jr*~MB${l-+B|Pgb2}>%$@b76-$}WAaS|?+NC`o%_V=D6M zKz4Ls18p1C;kU0hc?xrrF+J3DKxg!B*anc}WpN@C2jI;?lMjF$Y@r(Q~5hJO?gXO+FUC5&{oy3^mYhrV~n#6U>SaFp&qgL2kXop zEINY}@{r!Rs7eTn|6M6f18ZqgNrIfD73`qSC&RNkAOH0A8}{gAniUo=YhHIo2iHbm z1`Z8YTLP_UmZ0h5wwW0|eusI^;&&H8F5na%;XbE^5*DQcJ@(vc^0ZivNXo?}I;Q<~ zGtX8Aa@TLg&Z61$2>JT!$~ZM#La`=VLzG|=*r0Zq8|+NsGqP6hw!2ApX$Ix4{>~4w z{5Fgvk;lLJa2YHZruG`h8(s^`ogZ#l-n(_s3#q%wNkN0xt+gxG&j01a8_`N_a#=fy zQ@tx3B*Xory<12$*#vIb8{@!;rr755(|h{sDQ$8qTw|}RB^p7RM%FbXIJv=^L37~R zo^SrmeECWkXjJgyCUHc(0s zhNUv2=gvwVX3+#PQCmne)PTojxl~`t*9h^E1*%v$>EmIc;p+Jp!2Z^>iMAs36lU)U zu{Nx{t45oTRMs4e8RVfW$~y>vcb{_6*DyW7(FZvXXBWc*Tnu6~U+3CK`Y#=Hd;pzp z{@5ID&CVefj8`>fhTiqoboBgyo^c&{1`c=_MYnW~;iyf3y3&OkFg*+Y1immBn*dwV zzrRevMssYprT0Y=1jmAwDk-O47}66ZqK;q%UC^4R=cOa+e4uL(P+c`OoSf`T;ujk;*5^8vLeKaPAj8*XG`y)#1&61cW-H}#H9@f|RO2C( zwVecXwcYNwX9E}hs?oT~{=$}bSCs?I*mVl{@e(&e13c;2%pj?BgA+jK>k+nLdQEV6 zoIFz22FAZpqL(FWL|A7-<(l5FlE5Y^_^a-C+hCWtAo4Ys*Ug%M^UHtA&BR9yE3=pnToyf$Vxl z>_w=;rnZiI&BrhH%p1Zauz*Pugl@(39JymHWQe>PwXFDa@ny%T*1Yp9Yb58EVH ziYY~oi8=sn$3$8kLzJ;!=&O$&MH+TJ?=To>{`_ewqS;jOhZ@`S*4!199dr!_otH^S zVS9laX3Hs#F|5xAe!wYg6nayg#Z<~~J1HIh_d$U&+JK{8IqczF9rUN21+;$GGSSoI zjL_t9VOBQhXw9llR@fIg-qp+*LjecIjz8+P%o#-C!>da0M){TFgJ2l|6?;vnOiMi2B+XFD7&j0QyZ;0oiX0K>K;{yXx?JqTl zthF<;xA!#C$K7xG=b68n=oAP<(wqOFtSCs2^vk;H6z4p!{{g`X8ZPIZ8~sKh6WGK8 zq<8w-u?S42;e)mm-!QWS^RZ{6o?dTLk+2o;^}H(w);rewZ2dE1E)$7X(iM3c z&?tp7KmerlC8rLA;vpS5*@cJFRu219wCzO`5%%Hh38y`^LxQ1=bzMtOrUQ3v@q7v$ zF*SzQ)q$**FGtuNs~h->%BWmSi|gk4pYA%D<4J(U;WVy}zA!O0hqYh)l6*Toh1Ibc zgK-OXn$PH^@&&hzd37=|NQP>^xYm^@J=6}z2`p8<4D+5*Y=Ua@<%CxNiF1$zFZrE* z7FLtl4AvIl0?zpyGkGUP&Z#$BKW#O@?I$)4(~b9hGJAoxnCX4zQQF-MVVV^SphQfjr zCCFA(s%;@uxr-(?Xm|7F^s2g=0qA`?qU%<`{8?%^sx-&GMF=C`U#z5hleIt}=g(gQ zoG=K-d(>yqK7Ki2q?$HYv=_$T=Y&pZsl6F0!41(Ir>WDy)ZLw4wE*4d|2+C!Lp*Et zoPIY42oJ-@``yuJkVFKz5e;y;I}-@11i<>k=?gY_e0!YLK2ZD++yX6)OYJoYNtiS7frWQTf1j)S#1d7Cn!H9GtJu0A{v%U$h3h*`KoqL!P+z|j zp0_~A6!TV?mvldyY=4E(2EJ_zzDRobP01*sQslaoKF8+8dVI<^E5EWDA;Y{12b@;Kwrj0_n1!S|yFt-4H z!LUt9QiwNdV>S_Qy$?~|U1Gj?8*7EDdQE`pe_7finX`Upo0&`q%yaXt5j1DGLy6x_ zzpU5&bGrzgcJ~lZ;O~IPsH}_i7r!Z0+WH0w%AB8PvPK&I#8R!lH#VNA_b+10!+;Op zInV5-3mX(Z1QZWoT^}+krI};++kGI_#J|27q%}te_O)wdtQFh%TW>s)Lvq2@O>lxb zqLh}riMZHE*8yk<(kl06weY6wp))f?0I(>*+Yci9e;!b)-zo!qdVdB)SQA+7x4lw3Ck}vb8LGuX=Ow zUXL{x77)ufagXJg=1jdQrjA?*|F32L)%xS-yzQMPuQvlD#TYq+eU#a#B8G)wFkYBM*2TR@T!$XJuzc_Q+3nXyvFRWAbN;>hMPyXWUmlIIdS7Hl117h;SD}m3} zU%Yy1jB!iMGcpyZ#Ud2+QPZW8k+Q%}WBO8Q>-n_uyAb{Fp<8#+68sl+OgLxbb86$} z3W*XfQz`X7hN$3#hWn5b`Rk*gCx5k?k0s$A-n(>lhk2=G4MQ>1>NY~Gylkz_N;_A| zT_qW_c!P?iSIi2aGDu1C8Wux?X4h;|79lPgoeh;#2?*;n0d)4DkqoZMcmkJyHb|cs zp~1Jk>*4N-L26U;+*`JI$4Q$?w-5@!=^J9{AZ`#T&5Yu`_b-E+qr(Cr2c85W0yp9j zu6P*U4Q$=e0#DY9%c4z=b&Q85FMsQ56DZ};wt#gpH8KdwOoGaFNMu^@!KjbNncrRb zEakQ=;tgsfw{uSZ0X4hBWG5iQp4BYNkt{b_fqp3XbLRk0iV^e=Zd$<4dNhAdCa5I4 zVO6p0K^G%eDtl^wo4a``Ky@2@e1=Fl`7M!hQu_AIRls!B23aE~U2oz=aGX`t45nG- zK=`XBhHkH=vWkELYSM5T5Yc$(Q`%|jfD)G59YICDQH-I4a|I70Z$-8#>VqE9UNW_p z{8&AT5uM$UG`?;~t+3H#KHUkELNaxLr!MafI^ykm5NEfjK&w-fTJjQ?MG!x09IrjC& zF=NwOtmsmHvdf-jmVcjHJrTD(vyTi9A$z{n3GoT#4U4?{3ihgFsOjRE4-CR@hVXWr zVtW5?xd_LMBxWA&7V`;6& zF2eMsD+qNj#=$`F0fNI8^Pb4Py|N&A)`A6DbZ~eCz^gnsug&(OYk9&o;AT*eJ>AY8 zMC1}?jjE3BIutuavW3L;=7T5_(?d(pu0LeT_Shn z79lOCbge!f!Ym;p{mK`wTK@;dkx08(BXe4GoQu1}X3HK9h8Ol*X2IdoR6_Wxu)7oXN#3SpIx>I2hb&QXd^A4)fEVdnis z!9-~>!+}qyA^^d^cjQT~Ut&3m2m^k12&12%O_~fb->BTRF<*KRlhUv*>R6jr{Cu*i zGxEWHWXK_eZ)jFW>Md=L5wli^v9NpzF~aLz84xMIUm{-7U%3V+N_vYLzPn*VbB>N9 z1meX$5yHe5NMC|Y2JiEdj-2SNSxfQqtAsF`y7A(Da9NB|Dijc4eJK#cu+bGJO5KvZP*r=nkXrL- zO##TNi4QbQ%3zeVdDt|yjzI}4)ItcGrv{{W$gk8}fl&vZ<}4hnhlZN={T+D5*m1s1 z5<`sPDw{%H7J>$iPCJ5#-1;Iv{*i(A)*QDt)a;qY@V8k%4%h~4n@76gagWz|UUySc zDk_&ByOAvaIE)Wgk;qrfqyEk zkmebN*yu8aPV{`|Iw~r1eHhI0jdY%YJb&O!z91$s=b|cUMVYf`gVVL?34v7)Kt$h^ zqJb-ji@Tt@H}ai1Cl*R2y#e0Z>iF>{MpQ=83a+93#_+iuVuu&_Sm%&v&2a*Q+Op-| z9|QWRk)t%=#=0z2{FegDVn2g}-zp!!{+OV?X=9mD-N*1t*1Sz$lA>$zTU|!TEJQK- zpk^a9UKU>W`m@CAhM$L8zL?vbvW;f*Y+Z`=_v4ubhdsdVsHEbl6qp3D1j}lF1Anbh zxT9vtI_7z|COtQ%k4<6tm8^EXqZ@ffnw~WAPhvSz8t(O7w21y_TVRPBb;HtP^SVl7 zB~{u+0S*8wjyWhNX4c-qYNCU$7w)qm*){fEQo6w+9_9OC3oi0+5UJR-L>Wwyi`bs4(>@@qrFMKd*w8}a%bY~JOKQKN8Ga72^$+T68 z$8Z9dqRdkV17M{SYwA+@vxoOw`NEeA zY)CW4iRqZM7=I=7SsbxAxd_QO(j-jx?wrG>ycQ%gGloC66;rZ*THnE!hwjab!^jCL zRlU4{7TFycF>M2E*{q~Uh03VxY&(r1Qf|yYPgpFj@1FXE!=9ESJZLYs&@Q82%yX{` zYSDQ4d?^Y%7O&5AwkFl21V_UKE%69 zsh>HGC9lD;V8|AX8SbpCAP>qA6hat@bE{m%qUFk5OM*MwfZ~rxkak%xNao9rgQGEoQJ#t<+?QKQF@G07tXTo{KAK z9}F_i&asnKu^pfiP`z{VmzbEd3i*w+ZK#qeet@?-XnkAyg^xp zze!?&GifxyTUtlZd-?sxl(LtG6<4HRt*BTy9T4MlXm31v<*z0kU??}S+f(YSuHrq& z%F~Afah{$--;lHGtp&LKrLTjHJA0|v**|4KR95<<3R~zE=`(8X;LLLY4zep%9lx@; zjJa#LKw-?fmW%*-F$2hSq!l`f6=@RNmVXd^$#T z&$))@JA>|4dlw9Z7AHeP#pclar!gNY##QT4l#`WXp^o_2>XE}%HU5I~^)WS2{&+UW^RIqj(bq!&I+JbEoB5zIn$DpPTJiL1*B<~I; zkQ=hlVjs}+QGoKJ=zDb;B#a`K!G+UHtOw7`Zw$fDOlM^)OlRB*oYbw_$kDS?l>1i; zAtS4V8z>s42>jnXL9*@Mf@C5m#7>U^%5-|%N3v6YjK)DIz2+kU_rDT?M*q;!x(1^+ zOd009&Coo8#f8=iAm#j+Ac8G1IinptLa-yU$4rZ%zku_av`&cjSO1kVsBsI?2s4+5 zgd;X$L2ao0nYvzGnyhXRIzuf_jVX=LNF~Nj0PXbek>CVRl1+U3v@Mb#cqwPqWZ*W4 z$7yW4{*1qx{IuW3V4+fRP@wUyYGST7Bi|6iOSS~5^n_-dM>OAX7W-3Jzj{vdD#1RH zm=>=$(|*5vBDmi%PyQ5k&D*srXEFt&d@6eOM#Ac{it~9;2EhJhY*|Dsp$&B>f$7yp=H=conMjdL-Q&e98(EBO#SH+=&AfyJlIt2&IRkc;Vo&SW2u1v;wp@E zc1$HxB(6`qOtW|K8C<?1{mb(BXfnx=Xy)VjdC!u$v(V}6G4-BJyy7j_#@uC zQD?QYs{&xmyQM9s}FL9who&D;Fdv zwv6zt;o5zfz2!{@Gp-0H=YM{u7=`27|7#RZ{4wuG+GUz%FmtuQ&8tc9nV5GA9SC$8 z85hve0h>(&I!$tzYZ(VdRs@w2#mh!9`WwUl;}3l8K=y1VVf#y zkL$bPKK~8${HU{yqw);}35#GYCOE*nfQx<2LN?5l81i$>U%bt*z4LLHVZz9jGi;)E=n8_fM9d4YPmS}RHGrcF`_}P>z zz)J0H`7;ejfD9X>P$lPyeMwwDrPpZZg6Z4PL7BE0pFm)OWCeGbaDPw|M7j7ZgNZMv z1koh-Jh;M%=o1l>*Kj45x63Ra;uK~S^yjRh3Z}T&H--;u#eV7EKnHB?f_tAn5~xPu zxj#iuVx92n7QW4tjTTGm2SfHN8I%9+P+1N>)(>SQRh#K}sI*fPx-(H0BlcB=j0^)- zO_Y(DFdj(wf1)U={oWTa`a;$n(a&aKOi)VjxO?Uy_=xlB$k>-a5`?;SOlfS>@^=f- zQ7%iZ-_Z&-O*azQ)y3VyN0g7IzE8FT3RrI56^RU6pkk z-@Y;}-tsxIgna#;gj~5)DQOikfzDJ5P1*m6_hsRV04X8sdl&HRwLiJG+#M>gG2Lo& zO4--^3w5{1UnkK9s`5G`>~;{%;dKfSJxV5>~Aw zlDq7>P!YyQ1K+G805!L60#8711S)ix?OxPA^uk|+mRfYm5(C*AgXtfmev%oi@sH!{ z;$}f?W;i5#)SyP?TW+gji&WXRjlhRr#o~;~OJbD$z z&*fx|<`1b?!68LWgeR!fi>`kq=^d#cmXQ9CqL09R)W)yA$P=_ry~w%O#EysL|x zKoi{KQ~#tFSZ%iR`qWvLv;#>`$D+|oH|VWHr{t`{boa2ShA(Ppz= zyw@TFB3d2`4r?<|1(&)_JoDjFtrR`)S=2bx*V&NAXIwMjZgXh`oxt$pSGRjovl^ls z)sSX;X-uoys7H2GXuk2SI9&HyPq0|2@gO@RWfB&&WrKXrM&EA*K3JO;9|iJ};sAn;N#;c51P-@CC#Wi)1TC zGZBjq1#3SYm&_}9C;eFeVir4ID!W~u8o)vAT4v=E5cB)n8JUHoM^{YWW*a?-H-gcZ z)1=%VL-dmk=HVfyuC}^59-xDDU}Z4R;QMAEy;Xw(CXPueRt=-%mz^jh`4rFV|xNCuR z()r?gTA&<%rx}4VA^r0vP%lT+{?(n)XU6wZjW{$*(|-f$A^%kg{Io*WnjLUbM3q-( zJ(Ms^t?Rg)ppq=D!Ka+%bI@$6w`{husq}CZiN@e)8LlGO5L2*_!#ps6amfj?4Jc*$ zhb2-t4l||vkA`?ocb z(6G?GZ|g}jo@V9V*`9k3)BC#!1IIVwiGb;o)d`kaI;u|UyV-^X^94B>u*OmBa}cLV za>2m26xS#qd%` z+ejK-)>0Da-weojNkKh;Ix3ht?xv&bXW3h)`qxX*KeD&TH}W% zKxGFe7UC9=x!WFVB^y|}thLOoV1ZsXqe|PKPMR$(INT?DzTfHx86*d*jh$rLEc6 zt%Hm|79qdW%X5Mix|n?dUk(WOH2QKVnm^yGe7TK|L+TV;!+8N3WR~?H&)e+d_ac#%tE8NO?vx9X7GcRV26!S*2mM= zVU~?^P*EwT%=qhVE2j0uonq-Pf)x$^kdunH`o>l;HK<3mZ$U`LcH)A{JzU}MmZF|- z(iwPt`VN)W?&-0XI?Q7xMd|mE=#@f9$KA)MuZ_D89Sa&NLB=u`48)-NN+4C|6CrL# z4{f&^#r2{fcAYJ3n!1Js z?-MZ^LwEr~{UTA~HWl)_2Z*uhkPM^!)(%wo?R{U2W8gKTHY-$HU;-14f7TEu1u9Qq zF{MIhEu9;m8zneFa3j2{lEN21tv<@*c4;e0EVOHLc+|lZ>2)qntbf_bT#RxCZtxSy z=2*(?+{11aU3&VH!Ve5^*>dHeEHO9zYut<9Az0nS5>Km zN!203-}rwCg>-B!S}6cI{s^XU3PkRlkjflrl_8Ga!WvO-hCyT0irZkUCa_f8yv~6b zB#yAg2~a&#Y`zGi^&WPn{3Y=QW^N}yaj@z4kY7{3;~lwZXz$_^xX0}XeZ_f{q^G-v zNcF`SuRPS2Dlq*D;i|K>@fmJ^MA>@IR#z)6!;m{}J&6_V1%KYVQiLg^m}f~XE-vrfs;fJnn_&>cT=*+V}ov5X(hi$!L1jARhkq4P)z zZwonrogjttX}HWKVP9e9L)@;hh*>S^LAh!?797Pwv!o4GU_}3OJb$JrT6dg z+8#jqAdCB(11<%%45r8AO&GfVUykNo(=AqDK0Rxa5$QKYm7^v_SK7<;@peB%va}1R z!waOg$;PlKlAB(cCBS=K{u#Esf%`PSw#tBRV2-jgSx zsNYD-tJP@bt;B6o@^9sLR9cw;bjKRN6kwZi$$_{hr>tRKZ6-@59cWD1o8TLz~CpsqE87C{e?51S5U{djINKZl^)N1N~h@R34+IBe z+B4dE{xMiAe!ox==axERuT2e*p`$Ic`;gc2G#s(Ew8J8#1DL1&BkxC3Z6(c^B0$D? zzvO?h8Cm{-umb`1$f*$DQ%lhSD73^~mBdD@ zo_Tm|Eu1o-Y|X7}m($@4KS!(9H)~e4vp;#``W}lV&VP3ck`HTP{Gg!+#F|Hv?GK{y z-MsHuvEnpMhm`HTIL<~l?(UjCQmA629y2t*T1)rEKvQZgz{7mC1OJQA3ArGb66e0G zNaM)JC8$5WHmld$*W z(q?~K3b3HMvL{~_G5Vdi@ejsW{M$j1y~}Ob*kh|%hB^K$tUc;jSi5XmWz5LmBJqgt z;m4F%uj2_nYcw_xa3oS6iz|}pwcfzaVk~QofSzrB>{G`d0q~VJ}l6Zt*xdw74v!QI`WSlf_s}j>!`GBVM`eu zOSUQapD!7>{G@t_l=(&KXc~vz4WWF)g}G;MBJ9#DU<9j`zSb@c`RIzM(x%qvPhR)W zV%WIOr`%bN)cwSH#W7SkU9W5pvW9nO72-1^-mD_18~(&=w|upwClaeU=VJ{yFk0ut z?^{|7517g!DISm@LvSF5llt}KR@uX<-z7QgwBeF9XYEFesXizP4*o;mCnsJ2dn=4E zCBZsBL_NzYeF!fzO$Ft^;gby_&2Yn~(09jcxwHUoyKm65O5p{gG zwH8Ii?%=0O%+hbqey5en9D!xrdK0Jq1F`X*lQ{%TSWUl&*n^>0?&WtaKYXOhBqET? zRLk{Iy*QU4kx%GLh|`v}4eRLL%V7(unu2b9*)DQm_mWKIXU^yDuq)!5c}|vua7}3H zH>Uq_TQ^H=TaIHF?Ds1{rF7k6^{X>2Rb?FLQ}gYbw|c(M%sn7#j^=lyXNq$Li&^Q| zai3C#r_^a$c>VG>BxyRVgq=3WGY%vV+Br zw&VE_G*;%C2|YL|>LbM9FVQ!RK*t_KSi_u(sMF}bIP|Bh><3h~V8Rs&&6V6RlcmCl zb0FDo!4EA~8aZ_#r;@#GR@g1P_}z$&L-LBpG}Sez#QUB-OA-TSMnfZUgO&+uL)$3E z5L-(s3lHV4tI1{|`gTV;MQmBv8#^lQg;G??_|QAAWUjb6(?R5N*EW^s7+c=|c-1G6 zXLJ=%nepN_WEOD7=A0v6#Cs`}f4Wfmz%{Iw)aVGL1ax@jmHMdYORg`pozDP4QI)h zJ2M)B+)x&Feb?##zghq}6&0Zw$b3WV zM=Trw%od6r`me0Kqe(L0s1tmb04CGQW+uK?y)eO@QfjrDq?wxDSdU#LvbKW zlzsRv?un}JgwDxCB9jC!4lzK@EMsPn33;0Q!ZjmU_wX7cJ3KUj>}eJh$wC;@k*u(q zHL@e!jKqq`kJ%00;Nv&V8B1;LaZ_ZdE>bhvp^=f4wpzVl-E??4bg4cobvfM_De>5~ zDn%pB_A28+qMM)JtEbXrEGV3ccDp;~(SN*hUu2i#guIlf!ZSMr%WpN6D_>_4Mwg21 zr7x#+d*b3f)<6J<*{bxzLVt;=wyH?elY4i6v2$G;5G!aCad;uKLg~zz?){h4iKqwMc~u%A=SFHRcQBZ&d7Il^ zh8{njqz$f*lR!hT%kmyk!UUKk2lQ}6CufO3{G4uwAGdwIIAYqEccN))ZIMB%jbVZ0 z9s}Jt=uC9r<(A9)d&RBQOhef={=uRGWKsNGc^L1wV`ik3bk6x5MCIQ@{vYZa(8OUrZ2mm#oAbT5^J!e4igN{5ey*V6+&))) zRq&pnRNAn#W?35n;tEfPnknAZbz4~{u#x3U>}*UDBZirgmTP;ziS!c{RxA4ROgbM- z>Kz;)XAPz#>Vk(JaQU-1Im?#Uo!GA3T7(HKSx*v;M`F{2AZO<`uk<3uAiRv<($r$y zK@bEkR(r3US2^)N4I}j?hRuvEB~kq@6iUos77pSXn;Mf|nubYJ{4lc&ymzda(TMLu zLxj^MAm;h+HAtPEm4jLtxjLIXn<*?U$%1BRc%{o2tx*fTO`yK zDD#%=MvcB$9ctV?&z?7M1`oz zgMN35ytwQW%b6Lpj=bo>rr__%yGin?KQH%@<#YLxlp+gVsi(#6us??wwq97#g|xU% zXiMY*a%A&oe+pRWv+nZ|5rZ{{ZVwxCZQ^4`U#Z;Xv`E({Cb&zlCz--XB*ULO;y}=L z8bpzMrgAIfmfW8kh-;u4~1<9jVt3kt3S~U)Eih?^W zJ#K(j7(exsx4Kf)T&RwV%Thn`me;Ou)43dFLJ>&|k<>uo+I2>`&9p8CL@sk+U|EU; ze%xRTlWf@)n*DWvnzS=mT)0AdhNnHzpAJh0c=g*9CMzGu){w}v{*VjA7mO26h+&mx zdi~`iRoKjv#UyD{p}~{SD~V3=5~e|p%|fQ9TYhlL5(B_qO6s*>hq~}E>&bFcE zE|AxGMl%f<0@}ty3p*BP}h2xf6}n@&*cMck*{bi zu(gslU{L|LYSJ2xRqg0#yuWgIWt`sXWM{SWI?S|qLLw13uiecY7+JsDpoqd3zYOR^ zba-Xt%~~ak;d~JDd3_OgziPB5Uwo3p%i`5ryZ-&_bM!36l_du&drmthmy<9U z;8`E~P)OW7Z6(skh36&OrJDgGxBegcpTt$>m;i(P-VReh_6xULclu-hVC|oi=x?nv(zGg?C~RH z2A_h>?EowVDASA+7^|^SRptemObbWtJY&!Nw7sg*7DsOeY-c8~ z?J(HibTyf@PbvTXr@0yUsR>K3@nJ~se?f%d9$MmF9G)Te?7@W|&N^1^#)fi310_0a!oWlo81~mCH$6NqY_ka7dfpXg z+oZ4zsAic`3jr}D>8E4wrQ^~{oE@o0 zPtPQE{*+_p7Jkm?ohZ7QzCqCgGJLQPRVr9!$B*RO%dz|HeGVK{v{10sjw)g z<@gE7V85Ws9NcrKno0(as9rR+ShJR$$DX=cB}*YEaCUfFC`+9BPOWl*7uG#*gactSaTvrB&7X7js7(uo&oI7&WvbfHqq5E_H94oXLb{P+1kh88ktkp24R-vpfhMxA8Z-h9p=sIoFG`3}Zx zLq`50fhI3>lq^VCZABVqEL0HUEx6cg(JL}`2*Cypmr85|gGTgA-kP;y=K!GkWp}CN zcXqEHFLaP{{Nl;i&ef-F^UWTnz`Xh@af&`jblJCr`iwCG;KvfUv9DMfLu`&OvMW(D z2rdKDM;kD#>UONq{QdzPPFN679F{R)qkEit=(l9-wVX=9hdcW!00(WAf1ocjNE)$V z8&Hq9XLUZyz^Wtbxnd(TUp+q^N6D$(JPQ$1ITA%X#zxj~*$P}6lfwfKp&^=)wkWd0 z^p0l7O|7;2w8cIwd6xCxLqT9zt{xslfGFU&dz@43-YA@>G zf4hjZpX95|j#lt<#=lG5^72u~jHdlPzS`mI+}{%FuT4{vmzW>q%Gs|h_d9!#Zj4qsuEL&OqX*1`b%sGF}oxk~Dr#5P^ zBxbkm_6=yYlRAqH*{$jSLEE+DBD|X7W@goG=cvD6&51ARBiN}cOP<>;xoyi+Q3jG z9W9!<9~Ow;kJ>DEOr;Ch!Gk&8P|qQh*Hvx&03UiM4K^UN@UYWS|6q(%{5a5X>f6-t zPFJTBa%LKk=MMy1CO*Nlu{MamA-vwNF?P*^nE0@J1Bco{X6pQ2eco(!Zn1yS?Q~Lr z^BXr%oYT@DIk_|au&BhhirrzLj$O(13Sm~e+EDv=*g9{&}SeJ>XUs#7g{%q3r@EQ z`YGC81v#qjZ!*WZrW-ly==smw4f2A2yMFhrAZDAKQ_YWk6G>W-R~RnL>qW^bwPD1@ zf1}KT-68W7@|UTfnhkHyPu=&Qwr`LGML$^qhR382!d?OY-kXp=%POuUZBZcy((=)^ zOi2zGcg?u$p`kKBqK4A*e9l-VDL!ZZ@}v#tZ`Otse%%{;pV7Ar2Q7!k>i^zLV}y;R zpTaFzci_ub1c9e>{0NtCI8+eKxX2$e!GTLvW6EBzowGD9z^VH;Ni`U0cm$ZE-kb{m zucg?dw;Y_8;7LVm>azKZ%JfzuDoghmx*j5!0{YVPYoe`&k=UUu@i4u`nv=4VUrl6D zcrlS{x)LHENL27em1Ac~c9{JO^JeP?Kh?7TmQbkNtjFQz8S&&MoEzRMgB8?N1RaMH zS8PpbCY(Wj7`ez9V=zxa)cuobDKc`E$uP;*Opb!fvIhh0-H62+qq}Rz7+-q_;BZW& z-%m6Zw>kqchU*v;k|mM`;q*-~l5HmUyA2{9Pe6g27GbUX?(STzx12-EFoo;>+ORVy zN?*C#Oz>I!M8yEY5d8R~1$Bf!Ua1rvM@H`OF<**ewuM&D)ODA6$Hub#MN6^IkK|2l zsd=38$2EE&_7LoLq`|#rCgnm>S}Jzz)Log^qY}iLI^Bp_ocH&r?|s?jM_jB!uU&g1 zfXhUS7@a+iw*FqA-}>i9;Bz06zO^Hs7D(9Z@X_l#F!3z=Z*wzPn-OlT+M6*HAS121 z8fhDUHIhqr3FtyPEr`LrtUMd6R$#>{z+Iw4a`)*nP>axg1ot7bH~TO z(trlz$w6vAdyxGzu@3S zhV#6gYNd}P;yA%{>*UXJgjU-b&91jK9VaULTg>v5qb*Ln{!IVHCk+N1^Zpv#S_LsS z@4wMumekp%@Z3giS>v#<%LwMR>sZ5T-1%JY9;Zu=jYr5F z=u){?oQ;4FA{gG3*sy4wP5eJ_gQYU_iyUr|5)t>)KVQ%Uc}^xNM7?LN5^2fM^Cu{< zu?k9?AXqf;@IL2uaIP)tRq}Yk-276R8Vc&-`roh>n!m$!c&8)}iiW>3Dyax3y;2Ub zNj?D08(C$hp0Kn*vNv75xh&#l3DZ_5ILSrE1hod63RbIVFc2k97HO>B&E9wIpX9J) zlutB*zENM!J{PC%i9&~(6d5k1TacPwtj<6(H1VkM0A$9NarTqaZB1!a{M16NT@y`< zaM%*E)90!ma~??8$i&H-R@9-_;|OUP92in2H-3!Yy@Nty@>r?ZHIN@AxOJUrk;T8* zE>G^7NkCpzF$7b4jot?~)R(%T5+ksEmd9)lrT5)r%OV@XM-=QXU;tHTn``9gZ_v=v zUiyH-S&UwrP-S!|JqtBt<0{}WZaI=WC3=tbk;tAm&2=#!vigu zkc6LTQP227wi?_ILP|9_uYB63fyonn!t!1W{8(Zzw^x=3M|oJe^)^`v#xcD>lJ{)< z3G+xZC@0ac%&JxY0`d%;!VHhDC&t5j)N5Zq#%(U@PD;YB^_Ue={+i%v7$jJAu-J1P z^2r>q{@0e-mfVq>f2Ts}gMbYk-anz5Ov0x__G*WdbpyobQK~ySOaT??50$yq^_8iX za#o47-z3&l=1@*ki@9$W^eW&JgBNw_XC0;r&F`>*t-3GD9^*PvL!%WZ>X_Z}NuhwY z8crk=C|-GNXG#phjv=${VV*V&{klxAKTTTXpVi}EM%ms`6^*W<>M(>R7((#>aAc;A zWiHv00_XwZkeFEl*dWpJs~0g0;GsHXOk$?_`->`wmpikH4oIdB$b#1omA1DRkzhq= zE?xPmEsz98$ucze7G}b9bsE%Pu~Bv6rV@jPY1w;EUODN|KL{YLM!wQ3ul#}anV=9? zS(6J)3_S;f3R0U3k1HJEa#x;n>6{CMP)>pSFVbSi*De|vKekT!k?^KHYYfwI6{IYpgcbwt!)kf^AlK|^9Bh4L zX|8}j+^sYr7Xn!;FT|qoPtWkX_ti-?d()T1r_#mX`IUi)po}|AUQnev`54h}9YSP1 z_y+;yimP}Bm%{D3qLLmKozZdSs>KRh;NzU{&mGgNz&l4IIrfxhGeEIy69+bgi4k2) z4BuPliy?p)PG&dS8EaeY@8{qCB>OeYPRH}lQ-6N~C`&K1%?Q|2A%}^^cjE;cB9_^} z1Al(7PuoLLuk+kei=X?p)S56MCeOxRE|CTFWqn!J74^HMcC1t6Zyux`I?50GzcDY>h_VcI`w~o#Q;k~`~Q5Spu(o&qNhrG?RlwM;B$GH9NDeBR$aPx`YR#= zPtW_m5U0bqzYvMVKN_yz_djqZ6CX6Zy!I3NiLg@To;*J-PR{s7ecWW;$OMFlsUJk# zsp@=wpae;YZK1S)S^odsUecY!syyTs>AY?;b1;@ zt}Q`M?#>_oyU$d%1Mtq=M#Q}5W_1zoIUvv0!Wdyy=>b|QA(=8Zs&-VegdQ@}F#p)rp`hYAwM zl>>z9nU&4YBURgv^yA8x>JAOFyX3Q(911(iB zeY_%>7{dsA=Be)u0VMd)@m2bOAWxoSE#S*1^sK<&1s*SCuh)IrcgKQ{vX17pxI($awx3>wlhvup&A z#?TJGjB#afFlK|-wRLBwW;p&4+?bl z^!oMCZ3i6(m<9uUu9SV&sxMPCj{h@I7gLaKILKTN*%ixIa^ozsYhFb|pyu?+9pA}2{J>RT` zCYk>g1jl<*8lgTDZK!xC!2o2zmmya7){lFh5@5FhBo-WJ^S3Zus=uU`s86LY1s=}f zE@Q|i@W_fHZ34gd@6V0^Wkfx|EBMvJ!dq7JAx~IYFQI4w!jk;S(@$KmyYRT-3^`%tb2homLPjV;}HTWtG{eEHIhrT;5;FID0i**EJ zv4=ws^7iXLLsaL!(^Iq0n`01sE|k~+EtbMunjgafe_d$~TQ#VOmfrV8Na>2c&<<54 z-8%|mLXqp#6Cwr*HA6+3>1kj_83+03ptlx!UWd$)Fq@MLd=U}F{x-{y2ABF^;cuh} zn}38f4nGYMsU9|n(MJJvPKm{Jnx5Tf8Zr&P2&FhB`58ca8Nm!r(?MVYie zI2~_W&vzH{9|!H{y;XZ$xyPb@CVE_<-+iF4m4Z)2DKF)v8L8h98olS=b3LxK=ex7` zk3Wn>{ed1=8MNyTc^)pV^Q0+h)=e`nS!pP;ZQZ4F8bo9Z*Xx4ECTzO;Zzi<6Vmbq# zZTLVG&^stPb(IPVXx75QB zgC*x#?k@|$Y|GX8gw;KJ$U}MRwKTRMOyj+({B#yXBJ* zfqf0|Qz)Ntx3MNd=)nkWBY!z6nv?&DEycP-K??0jD336S$irtLg zRaT6%Ar&(HA(}9m*Eg6HVZA!6Tn%hIdY7X^PhKXFjl8F47~@_2p#M3W>Hp@CxB$Uh zXRvVn{5R3>^HpV(>=W1SZ5cN|z9?hp*PKIH=QclhDm?pz7`EUd^vU1%8{BV2gDFfQ*M&7y^sm2ja5KI0ZHSLR9&8zT)RTaTo<%Y=J3=K8EHt+U}a@eFMBS8?$Y0c zRMyT}`s#Tb=nt?~^hy`@BV^F=yA|-a*aISLm)9Yyqm!w~cnXn{C>E zAiLeOAw+abtuqR8&Vi++FyFp&>jFCgT@U$WyL}s+F80b4xi_IrXWzjZ3lo-sg)epN z)Imzu^j^eKkVFR?b%fdK?cqP@g2>i+QQ(SW3J=g8`s=Yo4B@MlVFp%kQN`?479S6@?!Yz4YrE52`ulH(;IG3R2+T)OZ_7UlBX;NJ8A-C?%GeL(HN|dOw{P^ zYW`GhAr#zaTbpq`9k5(M)It|FYTcU|6zG=EIi$Y`BL~Iw!;1{o4*J4}Gd(AMV?$%> zQw1dJ*flZz=@neM@14-CFV_0!m=9gw5U>(Bu|_`kA^d-}0NbXF@4qDKp-F*_SPF*G z-^i-HmOKB*YecXdTul8WmueiM6U%VD+4@FHmnO!TyQWM-V7ruPI-RSDRLlwuxXZuR zgtPGEW%m|IHX#*X%fpTu?WCtoY^hYEo{kCX)a<_toTo0rT^WFd5_1iCm7Io^z`L$z zfWE_`NacgWEhyGb=<3k?lb}*Q-QSwx_u{{$$APtRrCA?whhOU`iVT4THx5+OQJsc> zi!nBf`r9k2mR4$ozga)KYEZGEPE5IroYP!XSH)|k-wFFuc_M5oCkI#!!LUe_VWiIj zJ$XlpYQvwUy|EU%`sEIlY+rQisEw75@hk5!4n-Vne15`d-dNg4r&mFghYS^xT@`HJ zzH4{>vLNJ`&$sNo7o{Hg376kz zgxN4buHLxVX=xWzKJ$cQj!WOy?QYeevSaI2AV*w8Gc++|W)4Wxb}#bY)O-W`J+7>d zw}lP_6$Zl3X}VRJyMHk^Rx07-4m{~jA%$1ghIRbG3B!(Funnx?FDqntXYBc9=$`R- zjkCYtpXUKztwMihRXYTqwVsWY@@}%fYge*yA0VXlt57w#kn#GZ^%&X{)Cw`+`Z-!| zwzYAW2RIZU#}h5UbQ6I>RvdChyD7{X&Xvgd{Dm!Z^@}w?r1?Ow`#_LYQ+6T!)-YNt zC?TqTuPM?kpc^!yKT_Ljmp30{yETPnJG9yANS(^n82<2cAmhOhzSEPG z_axZT-K=lW;|k_@yL-O7^YEq&DYyx4(DdkH(mFi2w(i_V8@~RO$&3#d@tSbVg&I@M z5B-2;xcH#2kG_M(;-w>Kac>}dph~LH!qy}}w*zljb)t%Dm1*RDOo2KJz9w+4jLSyz{&Y#K7&*Oviz*F_P~A z)nr7uJ5)S9+@nNGwDiI9#RM-N+e2}((s59A?ou8wm9(K<`l!bY-E1~icBBwzv9^n^>)x7RR| z!cIZ6BdT&9Z%F!yl9}Xptt!@Y=mCO3-M+AZljEbM(=tel;NcS<;Ua~9>(Y^MwHTTS z{D^OlcK;tuSK$|B7p#{~>5y)aP!^UDX{1v+g{77jY3Xi|hFuz@LAtvnmkt4uknZlf z``zEY|H1p7GjnFeQ@1hY@s=07fI1EXi`7ALO+(k9$)iFtJZ!Xy8Od_ew(ErUpX(?x zhmjcoUW)^)FF@26tV=i9!tG`$J_c`g&Fyq8j4u=z?)H|GYm)tPmTx;`NX_spN2?TN z0^AZL#ta{ygP+Y0H7>=21ob8s{{AZoI>SxjS(BQ(Jsccw5ndB&kN3K~JqXI!ChRS( zzNJ>9Q6Rh5woq~%e}_W?d#w%{a&?=_u?9=B_+_L1U#t69theL; zGWv^mp^fXLDEG(7jaEC$p|j+=PMYOjwP4^zm7J+hsi=03^5Bc?ig#UHd5Ly~(zp3D z08WkX8>GEwF>;InlxX_HF)k(pkPF8hpS8mV3VXVQ9gZ2lrU?_VeVRd6?`=;GSb3Y_ zo)^LF=)aZRE7P7-&8|@xIJ3>pyKPL@vks@tQYrX#Q72{kbR0QM+py^(+gS})W+gbj7Nhfd+F(kl6?h#IHs5l>8XKS}_jCv47f)A5I;>K7}b zba$35nr&VkWFLZ19YC&$l%D>Kv8C54G zqmc*WQ~`}rS!s2H*YvMh@ILL*mnb4;-^~kZJr%HY;^(LPaF)7eVJ5sh@SoG@?A4Js z`TGlU#LUvk zY;4;!@q*=IxwZ?Q3NM~<-JLa(-5-@7?iFzM=Y;>R@My1co<{T>f9yA5h2ZU?%#HCC zg}V-yQ%1;5vCj}LaZ=(s;CD(=wy_pYC?h332A#=z3Y1fqFFYA0>a=j4k=%ZqIP<;d zeF{rBxg!Z0e8$hL9u9_OAp3A;!0QzMx>Gkfgmf!&^VtKFg6J^@*;kX*0icuL4Zk+s zycKK+nEdVMooBNT)MsJ_mCI8ea3TBC&H#{ulj`;-kIioVV{p;C6eK$9u4fLBB`&Ia zfjsF*(eHxA#{lkZRKFM;?ATk^B)~rHI z5?0wm@NRtRM*VP69GsGPo8)bKidM^7^pf7ZJmF8Ok_i!dKgmV<)iEDd`5`1oGhblz zvhu?0#^5HF&j}$0$nwb!8EO*?gx=9NgbQXoV7`t_=o$-j-B8U3H4a~RmO*bPyOnF~ zvj*=>cB|_PgDH;X5_GH>fV!IKC0`51bv7UPIl$Yjwi8Xi91Gnw{>ZOLyo(<^eCmzU z!*C-9`kMrJhbyamC3=j|P|-#L>0OS~peB`o;xw0-UEik~Amg{c`t?x3P@>N%DT&J@Q=!QlNwX4W`&RJkYj3uYLLyl z@@oI8Q^;cUJ?$8C`|wDWysQ}=P?NxKt$ku~Ysz=eW$3O3CH-BBm3iMv!~DQzBA8?MAI+seQYCZqurqCY;b z;Ilu-WI(ZTuc1QG$72_d74pEoCCOsEw-Z0y|8>Gnlw~ORfJtf&`oE7k+yAATtNe!d zSH@XNJQ^Si<4|{`23h;v*$Gaqt&;4y80`X3=Fp=W7~q z8zRE+)puPK+F2iI*AjTmFyZs^fPovK-U-6jPFmECAv+I#z!=5~Fv7v~mUdsvVlGDa z)|p^8NsUIZ4;5nti{;d*7Ws5pEA-%BYnycywX$Brzy2}z6SoIxM*YgC0f45qi0*MA z6mX0%YoLs3n-&4*3Ui;A}JAp2joJ*QIN5oC9i zSlm9AIaBTmv+0FGAdWT@+k{AAx06g|Ny3;64(^zd~QG3s8+M zy9PZ@ec(Swr61DM#=$-k;G*N(*j5zac9O}eSW(n9e~(p>{i9j8yRqz5K?ch;MBMM%c}S6c&3u~$BNp(osmp zqEZlRbOi>Njmm)0PwsLL_Wa8(L1sS&{AwJ3J=NuaA=xXSU19%EU+A^m%?p#QoJ1S_ zjj#VUt*v}cjwu@of2d=Rr83?bmKKT%GZV@_*Z z{CdAPqW|vp%tV(f+3Mkuyc}!uj9zSK0&U+fqg3nxw+JHaFq9n`j58I7sV>p-t4;>0GxtTbuCW~^G?~yj0@32Anyvxv5`Endf z3!en^?RhApBiXF-U`7imzr;ezKY`==rk_Ds)Q4a+U zCyz0K56m+PNjw*QpP)W-FdKrf%4ICo31R4e`hpMqKvz zw!`%)Tz1 zVm6APD4~O_rcKQ>GKs4yn~@NQ>`&?sLxj-w6*z|NO8@tqoWa5A_lQ1cwX@rOKe*`U zJj}(~!4?_1-uJht+b`%WLwm{NDT^00QxZgR%q_gXzxwea?&M1W*YeK@D_mlDcj%Un z+pXTAr0|{0=O+w&(DN5^-P$yyu?%A24I{}EMOv$wbpGjQw^+EG}V zb{i`?03v{N;{q2mlq=)it{uf8`h8=~wrT*1&2tS2X1D0S4a< z+RcrT4mf5HoD@ds_MCBMcp#2Me9*Lr0UUM*Px_K`+;f zthGL!!skSXqHAa9mWG7KFD~_jnh~@7Exiwi0TC(cYF&dXuruq{MH4`%s3|S@dJ>=S#WKv-S>&a&R5*)Qwq@>Ha64d$={2){=GHs>R#j}V= zxs)m#(KBqZ-=r%9 zv3kxsV}QIWO#R&RhsWmMchSyxn^>IQD9)SP%y!2xS?$P7fvIK8+YM51TG(tXy^ug} z8{%+#;jZt_XdOx@ryeM*_Z9KmH=_eJ>(!=7K7P$~<;x>`vx+OB;hwH!>BzQr78@nc z?RxIna_O6OYAUEtedm4ORDm8=?2F_1UW$4>lrs`Cv(!}K z#XC$YWh{(by2SGnaIydxQ`TGaaUX8m@T*~akPvs~l-v1RtOjN+Phu_VG#1dh4QjB+ zW+}Is33o=%vc@8s7`#FTfkp`DA4Ekz9XF|pI&un$7*!nq zsM-QRz(i)^MEJJXlNcN$kL?ZC@#LIPm_Z)^#E9c3-cjG1J&0N!zBBO$0WYWBMJ5?917 zgMjrlw56{p$#PJ7&Fq^(CytLi;pAk5oi|^|l8x`?F~*dwda!P>7-HRc!?(nsu+#mj zt_Voc305KcE-0AC^Jf$?EH+u3tNx;QwUX!!Q=%36r5x5@>Y>|L0C+W-L&Cs1AR*3; z!^Sve=C}k3t5@pI56DoJ{LEYGX6frTo@G!|<@2JB1fq{wjj@JY$3OJ=O!yhiBpT{Yj`Nx@oc80WDDgF*%_AbSnameQ0fL2# zbpNb=6fGYu&SixL68H+_!XjfK$ib_5$__g+K@?fJq(NtvOX@5;i8JB5mT-x0ah-9+S!fd*x0 zkFqcTvh)fG1cRjQw7VRC{&E*gu`-({sZRi+%vfNRe&~pO^!+~FTR&?w5E?+88mdof zlZgv2xq98{)u|kDEgajBA3(Pv(kXn#I5TbyoJn~drM1~+6phr7f@2Q{@agg8 z$mETe?>_ff$I(*UuLodrqQk2}n~{7xNMa-1xEDxIzpSz}E0#}=^PjL@>5yie9F)ZV zKzy0TbjPR_B;dOxI^L0q1t0^a@|c%m%? zj}?Kc-wc+URHX?+O@$=>{T@sF<|evTF|sc{>}G)fh4iA}@55K@QOx^FfNUD8aWe9< zxUsj{P;hS5^u-7L7A)zlCX+e6Gt5svN(thTk|sX|P$;+0eLxQHZQSQ|5s?$6IRM~# zq5M5j$fqpFhAh>u-2z*WHnY7ojZvRfaiQyeG{2RWUc~Gmyugn)hr;nw6FeZzPhzWV z?Lu0cFq#v@Ypm*b;hVS<*}q|(4*PdEF+5=4JY>XHggg&F4Xm6)1^(FfK+o^M4>f!S zhXo4*-B)Hi=q^Ym0!;G63kXh@&@OHqlmCSNnJpblehuHHj02dh6f2QGO8+q*8a>PS zNV#5l%?WY3_obICi8zlJLnT!0!e!1KYca}fY$b|%YomMuH)1J7me5W*4^Ykb&i=UH z!V4nKF4Zi5q0p{pVW121&s*5}oDr6@brIZKEQoH~y@}A% zhrDF{qMUCvFCLicRz7>&iP^X?dtTKPh&I^_fXPB(w?fVgBZC>sh`Z=nHXl5)d*l85 zEw^zg*?PB&Ud%16$E4=6ucz93hteby8WyrACHC6!idFLb63@oL6R72nL8{lm;yjej-2>C zwK5U1nsmt(>+eM}ZJaRuASXmMJK>)lXOyvPA`QA2eTxat{j#F>(FgLrIjn(P?CW;q zCP0K0JCJ|+JsT%X?)yt3TfBA+5(dmiG=jE8mpoWS|^JV+3L87?XwZ}x27 z4bS|C!FJaAX|@NS{?m}ESIrc&!}{7m0aM!cW)hXo@vX`n+ z8_7j2Bsdu5s`ds@Pm!UBeV61-2_2?0`R;0Zbn~$3icspcW;R$Z22&VtU%IHekJ7<+ zJqM5k#qO_|GuuSUdZdjz$#;A|l~crt!li)0fZ* zdifBl(0O0;qu0t343ULFo973rP_=2LMJ(h>UIT-X&8gJIZ4ro+p$}x9X#b=jgxnOb zluiW%dJnvCALe!u9j0XSj!EcJN#t^rv(dFoG7G__gklk6kSym5JUJ?vsYxrGLkG4m z_3*%u;Q_83K}paC@?3R;(5>2di>B65_f_(tJC~gB^cHXL#;^2CX|QaSIj1H5EzF>8 zVT3qCc8zPiJgkFt!Ec;GGU64^e4_@3#7@$pawGS5SFKTvqq;> zsia%Op=v40{WCo;;3K5^);qlAuMGo~tL0Lv(=EkG0RVZA()3Ok$jR2GiwV_-JM~BB z-Dns`9TFr0DQi^G!EzWS<%Rhk+qyc=vE@6CzX;Qq2*&zbED0ddU4oHC*BF6dbl*=L zt*Lf=Gn2j$E${B|hY~&-2BGg10z8V2dkKP?K=V_++%R+~90}JMcBwVDk}Mn}WQ^ zFgeuKe;+t2Q%=l#VLI*POBt#D8zDDOiODR@Rh`>6c8XG1=y+|QDx3^F4@r?zmPrO=p^?v!fVIo5&&MCr$r zG37Vn&)Aj@zYbaJzBaMeF)7pJ2w4(A1qQ2_Cu|R8NwM8AJ|`_^+;!QacH{b+6c3(m z+`TYw8q+blNvWcMo~Ga-iZ#n=^`|nt)F1&W%Zat8YYkXj+vt5O8O4IO@cd3azPdVl z3YGyV1m%DSwcXUTyOT15Z{ARl_6G@r67P`9$N7DEw4LQ~4okk?x+`gm)1Vhq$*dpw zI&b)(tpz>M1=5cW(Q|M(&gm_0)>i>t0EjE|bWxvqZV4Y{HMWqfaA`I4UKG0lwv>Oo zlAU?+0Z_yoQsu&1^kR7pR*qSyLDbU*Ws`qNv4P*yjEpd=HuNwkP6%VP(LkOyL{h6= zfh)Sh>NVgz6IHGBKnCIz^X?d~jw02eU|Nh4}a8P;E(=5)s)q+0uvsx2qJ z7E_i4>l{G4cav#`oY)yS))0YdUn`3ZX)R5zb)hce02p7mQob`fek$?VcjqHkOQd6t z6OXk1KyUfH-j1!Hqg0yq{2vxXHV}G{%RiwP)Y65v;`*+`B^karC2V3mdC-rSdAvKo zELZf>yQ-6(^CvcT!hk;2qFP!c;E%vRDT&vQUl`-sQjGi_-BZpslF!VUEFisl)dOgh zXOmCod;<`~qGUCCWwNXP=K^Rx!0Fda3vc0Ynfs9B*jILZQnl;Ms1JLVo%SQlDa=F( z{72s!{W?*1cKc?P(MBVQb2`Gy9^AJCMpgTf+{!0j-}9%;%7F;g1@xGAQZ_1nVCK<4 zBiYN3NAkO>a!oV!x+8cYW9)SFm-w^`JkgR<`J-&iufSzrTDwSc`wjQ|u;1SeL zjs{qLld<-*HerQp!zDPAqmuX~IT%aiKmmve(k$8CIboKYTrK!1^Bciduw%|+n2xpD z!$4mH&5U5(4cc`4>>l+|Sa~xKygxA>+K{|HWme$ssY-8vy*K+O=p2zw=*ihyNq+ZO z9+J&O;%+MqS3V8yz3&Mm&5PN|3>9%d;?04jJC|Rp;um}#4n!iUtICZB%^Rrx?4GJO zAzqzQm?Drg#LXeg3M;&(tze91b*|_0o4Cijk{NY^(=M^ft*KV#v4CZ1Tl=}zGQD|A z>mkVl!9Uy3kZq{&hj(DJN-dL`uS97qOL zyuBUVq{6#pgvg+ZLOYDxiF9O49@f+)py!ouP+#sQM6G& zzVq<-QljwMzsVEI+34ci(}{pLLSkcNeecmm@WFd7Zn7g~x0(F6BTEw}yc3kpNKiC*fmk@i8LNoCwwi2Bq3tFhMlfsgRb!MI zrJqOrmx%}{EJ}iNMj5P13EdNi4(A8#)dl~m?=5|37yz+e$qn6vH8{P?P5E4)g=U;_ zMz*so`b+X#<~95$(WNifIVkR}G3(JEmXMX^cNTonX@u3? zVa2=@EOQT==}PyO9KF%x2@ltugU2vR-l{kH&Xz%R=X7{zI2`m6zp>XIv7f_98oIEd zzNRIgQ6}ND4D)Nv0sHsS9F{2XUrN1u;ZUoh@!N*Tt_j`om<=Yfv041{|J=%}R+wz4 zrs1cBZ&$nzmebnKqn(Uj@(0IH**;BgNQ2+K-IO-m=s8ka*de0aZ1-heH>IE~&&qTW zkG*6;K5Ip-er{d<$Q|nbldxfSAV8G!WZIAKb#osARvIWg`eeQrlr~BOf4{y*VY{9~ zNeI-ue#y5Z=~m9Vz7S1if;yqir9N4mY&JSq!bq{$C8yi-U#Ot$+i`)gm9114Tem{< zc)nM{*z(UG0+TYd$-W81?Z=$+g#T)szOFWRP!gR9F87WIK5dP!QtFZ?in^zdjCW^; z;0fQr-Zkw?qiF>w~ryM5se zGfK~QG|eD_-HhQ zAy4(Sd+x;2bUE%+sGa7trXG9isj5OPSQIz?0Ms*^RTs8%m5gRDN;=S6A|;RHho`^# zIq3h4u&89290%W8}+ ze#*m}??o{M9vH(<+8at_=oPHCFy4QoT2|7^_%RZo#bN*|VsWK;{%P3{J|_E>#*{XD zmV|f664@1yYUT^cETcFlQN<9Gz*uuaGPhRKL=^3}tEJ;p3lTvSqNS-+(5WNG4^XVo zYbnr0-lq`#&lrnh!7$^2iKIXZ6p-lXJGLxsmqN~(4C-^CjvmC)#0$mr;16{!w7J7c z7pYOH=?wJM^qn9&jyFO{&W^*_okafawHw-`+kA4P&LrD{?V2^qHv-u>x9?LjoyojQ zRQNda5LZ^VfPxH4swc>w5m`W7qA|URv~71q>QqDkY*HFKlzHDyt6SOl!8|}26K;XC z%=;CvjcS*9_F%2?N-h+PCp4kVyN&l;0AnrE5w? z;eHq5K`w*RuyymHoyz-haB`b+Mj%x#Q%D4)9*xYB>a+NIlB=c1C%@bb0o#+@g;&Y^ z&}>T!MB=JlQS#21U9{okJu2u=c>hDnA(BfdK7_$CZ@d*8cGNE7>8c+*>4urXTqrt) zR}|Te>lpN5%YRWeqM|1ogFD|{B6uD)F3S&2T83>C&yL@eC)2MCi51gWpy zY?Oar1)RfAZ^&G>jcCq~YORaBYBPo-Mt*6v%FcK+F-8wukGBjCK_+V3b88JJv|pPS zU!TQQz6MOCXQxy!9Klx-QSlvSc>j(oU`Be1F+Kd-5WY}{ONrADEOQAil3+m=^4=&l zh?gw5{c0vo_N`$LD0+M6eXZNLs6GsUHwb)MjuV}nj1PLpd*+MxHof=FZx>?Yaan1J;298oHA+i`!jzYG;Rw-3TG?vfN0XP z@mJhGF!BO5)xM;Wh-kTdtJpM9u=`-=P{cf(S(R|BPFcmd`_x+!Orf?ccb7rz=*L-o zT{|CnaRhe!%|g>YF-1w=%S~*)2CjptW+57yIXOMS=~OR&O~Pn?u=;U_?#L!A5$QCg z?VsFY2Eaa@Gr0@kT!nTV;o~pF{kYg=zJvv~e-!Q^1jvv}boq;hEd`AuyY^S1W#JTGxcCLqHwcq<8e8j=vbcd+Q5n)TC@92O{iMDfDUh=07 z@HVZmzGYp%z4bnJriVLoe({z;8nHyGNYLJ9}U=j1H&qXuQL_W7;c79=H*l7?A+o5Dx{jA zHtK$xc3>jzj`Nom9{+86?HLsSI@R#+9Io1t7zp!nZX=33Pfj|yPUy;+yod>yJd(ky zDf$+>UYF&Pb_EBs z_dqz_A}6#%`?iz!*}JJ2F(y8;QYhs;pLbnA?M}qlQqx@m%kRDdV7Y$>@luZiht0(s z1Qs>oJO<6#)G4Opq8H#jVE4Vrf*1eZFIvx)$Sfnw+he~ib^?l!m$?13%E5@D;< zaCn)Oed=8%jQ>G}-wrhPNnB)i_0xI_=iIHE>eBgQnX%L~aWF+uY+!$w+i3B|Z`GRi}7D=~@Q1~XYg+(4sc;ZCspk+zid={k-3sm=xA~<7rX(9gh!b!nIwy(|u zdMeRPLiK(rpAhZ_OQch{^Ik;vAJ^B!rWs)h;mWjEa40GABZI@9c)k(pOMfo1%!RGT zKG}9HxD441hgMHz4>$tA1EbsADd^NW8L(18^t^f(cdO3aZ!!GzOX=zgq zyA(4Vf1XN$VG5pGr&q%7cg8h^zBb3!32otK0>qlTGdXUS@$fT>BK=gzZvv=CjB$yNH)g&1=28z3-kom#)A)(HQx^>c7OtLO&1KZBDT1gD z{L3}5j6sk?NaD}zmKKjsNPci(9c|@|fA%Nf=DzZe_XLJ5bfFic=SVmnWCH6p7eDT; zP+^|&qrulGa^^^*U%_8P6{MkUm?{`gw5)=OEuA5Dj_Y7_3072y-<$ER%qZIL-R$%4 zQ9%5I1|5`8^@4934ZK}Hl4*IqaJ`*|(}xb2JM)BmQ>r3io8jar8D3J9c||&vWGbgM zMWb%BVy=*7;ZanJ8;xkG=$CL|p}w1eLm{kaHGe6i!;;W;2svQn@M#4mvL-MPrLzfH z*ARZ~;WqvhsQU2X(+@lfXsOWr{#-Y1!Us&x(BVi%kES<5+!w>YS~t5qoQ718@b!O? zmCfu1@`PAufA5C>+63hxsch9>c@`WWj9I+MDO>ZS!oOvA8ipdt3JuAgPr{WAD`Al| z0StDC@r9jHe-vBb@E}t3=&LW^rL}!E>midXV4wZ}JM>p@f*Kox{8--+4D!=x z_Kbr`>30$N%tqGwS?!OgKJ=n|5RhETXJxoyOGNInhxQw4XBia@srq2V+qRQ|3|WzU zf^%5?-pW~?>4u-9fh^A{g#GnXTMqllOWxZ5Q{G?e3Js=sWqsQwPP*bREoM@XOo0vw zqaL#W7eQyeu4VNNbD1Nj;P1EmFD;!+^)rMA6@=>);VNt;!>Jyj*f{w}4bqv)Uo=08Y3w@DKrh&IdH^IGQ3zEo^T)WFn? z+GciD{#9zy&K%1Oe3ts)tv+Z&(N;~pI!+D#U>8bkrqN}MGnM31tw10*iPEHzpmLLx zNo5($fPzlj9ZN)brspMFtmPp-LW6msgB=hA=KBTT^nBc(Y-ahF6$pDv1%IzSgL~sv z>qIMiwBbX@NqlaqgaPt2_k=B90LxM{osW2cnl2S{<$)AUsPJ1vj7PbkXJzN!h&sV~ zW59j$nVgb9%n8Z*wiY!f$_TfmSK#HSAb;!V{SQ{R+Qu-}c(#8`uW-f&a=VnTKr94& zz`892o)=Ip;-b;0tDaGd*59qX+Kro$>8B96&^%ON1NrjD(2D^CYU#0tSg8EbR}_37 zH4^O3iVg>>wr5A_xZ7&)4a9^K`6;Z#hif8>(w)O`XvoFvc0_#CHSkuGRE_ohU?hZu zt|sl-DX%T)EmF$AeHpLu4OeY+!$NuSK~7f?G(Z83QX&X;`rCT6LJh4<{?OMHSE~=q z87Z#QT~KLfLLcCm@@xC&2!Rl~>Dx2A8Gg_y@$AHzP+=n~FzLwYG7~>02sWH_y{g3z zWi8O5%pUcLZV7gND_(XKPFa5t@YJTz1qCK_`Jyex&BO|=WMBYTX~t6mfDYWr zjykLrXSq=&7-rs#rKN6>p~)e!0qT(5S<*KB{&<8wPiO4AVPJR>On(I&rgm}f(*EzX z=b5YquOLlf%UFO%Md<+-e)$`IiPExTz%DgZgs?>lOA9b-&*R_T9{B6u#`)HNcoZ(Z z5{C9O74Kgk01mgFvi$HSK|%zq2xjKUA5M#_Z>1hV8DFsN4?V%?Y#1iG)+Wxp$L|k{ z%vg`vtBRTNKBLlaMEsoe&;z@=%73<1N~EVn=&wAjz>vEjifl(p3A=}SO@8ys9_F~m ze_m>HUkaRnz!?+Z1u+NQE43^qB?uSJ4DB-Hg`V}h?e9AJuXzTEAS4k%{T}a#;J3~~ z_i5K zw-bI<$?$_hC2%xOg0qU76o-USKx4=t5e$EB1oL3{?MH)og7pmXTCuJa0HM<*cq zel6F8ZQ`@=BTNU8BpS^No^&;r$CxW3Dg>98#YBD(A%xZBFO_Tgz7;O?Z1t)0HpVgq z6}8;;`S`;(4(%!17BIFKkqlp;>w7C&XirGTypV^7!Q+~65(kaHPH~Trhf!{r0(OuW zZrP*VR{z6Aw@2A6Q?j}tV{c>H^V`Tb3fJ4d`Pcn*Zb@5=}K6sadernpF^pv1T=$UPk~-7_f#^dW?%|1;Y3xb12j? zRJJYVMA-r0ZRA+9PklIcNZ6df znXU=C;zNUep;Se0uJ!fq2|G0}HzBc6e_sOmR>{lal!p?iPO%h-( zp79|B?G<}w+hL;HU77~y$FUF>@DnL~_vBu)|L-kHJ-i1FbI$48qBSsoZC*EUu+vY- zZ&cGrONR?j4xm_{ak2JwdIbPgOj*G$*lsb{FJykRvf8{)M~7r0gW#He{;CS%f0&RV ztQMIBuVQOt(QaSwLk$b#UD<*nJ!z?Nqp*WgH*O=|VEcis0scE#y6bVo*e4akaD}T@ zUHa*=cMQX7hAZAGbAG&^Jkn<9ANBz9g~(c~EDd7ilyZ3R-T1#zMPyTs7N4!Z4j zhCtZNmY4_mPvXsFnk92GKkl2Z6coI}^$jKfq(1$51l<<00Ke?+SMBaY2OT;N=j`Ej ze=fqkd;E*|4Uw1bU@C+X;N|kB-Wn2h4r@ReHV@YxUjrf)1MT{piR^}&`)hxwJM~kV@t2!zxd@amJ}6o zwP-@#Y^!{}$F8Ld^T|MPt&PY4pp8*f_%2tnE)%XF0UtdO^v-s_YG$XET7hB$vgH+3 z|C8wj>+Vx=CQ|1gB4C~5g*)s4UO}XPsv76vJpR;zY?Ar|Qp8ewP4H{NsX@1+ToM7| zyP2!b*#`ti66L_IO9CkF#%T(uC6#Cj%(%#LolS~;T%3DiRKwh?rrrmvFSXBV;Qt|! zf3qXmjk8O!91l0rNQ1d{@i>hD5EG26uqr8{Px>w{3t3B@<`-~6ahibj|X7c$)Xw4p@`fPAx) zvBq;uW&4SZ)yVfcBq*E*>O^t`_=)Q0k>&D*t^o-JL7jZVS9%X*U`rDpxzJR0A7^cU z^W?+$YV*CyvI^Q`>Br(JY4j2bI(1;5m|kJV=f8f;0FYOr$ww?~HVuSCD;VZtqnw>L z+g5|M5N~U0oPSemzh3%AGEd=hg991lD@cr2k}0_j;Hsi~*DOcejSE-C*MMAACLwD0 z7<2@@(#8u)(g0W}Knfv@Y{T|xr%l{o)B)^^De0Yst-?aBIgmxB*jyyg`6f zLST|L()!JZx}2oYX7dy6i44U|EA(75jYk(h%>;cJRMQ@dhr(Mruqlird}{TEVXisJ zyEElJ9kwrv2{)nzfb@r>674LrI+>9{?XQiLz>r!b@HPrx)5%-YXRcx%Pg<~X7CBw> zD|QuStezNRpo`UM-Rg!Q0C=I9HPS0|W03Y;771RBMd#e8o+t|Wg39r+gS*bf=_5a= zDMD>q@zUh@RnE-Sc#9+PDw!N9e6rJrTVJ?2rv{adikn>Sydw=ataeyMA#@o>yMr7W zE7hpdJ{X*pTdg^}jqbLWF2-`WmyD723GzjW#m>~K@iXTh z6Y2-zbA;mIz@=MxF-6-1FV+Em%LV`$VLerSrKjnKyaxbX1RMl}g?2i%dH4+dkF!?s zUrPdm#XhTmS!L^V-sB+ct8*e;yk&<_OVqn180MZkJ5VvS7?`YN!Se7bis^ptzxPRB zKlf>4B_DIm{;_?-2bSjJrsr{FDYuKAn6-hv1 ze~C-^Em4%YP>4Cvrm48si)Tu@CJ6~w)IfvNDx*Q<_wSJD77vX%^*cdIiEE-9Y9!!B z=s6WKVt~~FlmU}kEwS%1*$623g{f=(bY?t~8PVzKhF2g%Zl?0K(Izk?Ru$6F*zKCo zMMQ&OymzAE$46Cy!zb}Fjo1vj{TCV;Uu|VU4n<;jEnOaSt&V2d;{va=T|MlF(kb2p z%*BpaiXw`ju(g-Ii^;e>CX1hAeC^IJZ4q6{_Sprd0TlN0Jl<~}RVWrZOjsf_=wUv{ zfiUP(Icar?Pr;Yf@>98$F4%2QM~h;1d2Fqi$NUnD9T(OJ3D(91JCYG@9eqfq$(BdZ zz&##>q(o1SN+JeQp!hs%pXE2+}e+iSnylm7xv-$aVJ;i2At`&s(@wprp`l4&q(G{y7R>c#ikPJ#a@ zIJrx9md~u(y&Yly{D@M$o0H>P;(KSxZOJfx!b;18(%D|s+<15+#&@hcPxup?z;e{Z z&5l>`PA%xcvNp-t(%X#gs}VF^jkoJ!0Zh=VzS^X^$EV={(T)gxfS6I=p3im0E~t+8 zZD{+8D?Ku2oY{R7`zM_M?XKt6@Q~1PE%=7ItT8w)(MmESAvuS?2Uqpihd%QPowD)# zj{pFTi-NSI*5Rp$i-a=6v~)T}7TvCw?W)=EFA=Xu=gDl=*daZO2hCs@s8mHW->sv@ z>V25H&9g&mfPM5cp-X=sfJg|P^2cz$Df za#Y>klC`~Q;O~LUXy5A#Y>Ng_pu%(Ar&yPSo5PmIE-9}6P;tJF?Y62gJ5+eldA^G671%694FUv;B@%)Hx$sV!T zwH)80%=TV-#b1XslZ#6HG3V|=ouqFbKZph|>4dPqB9s;yN>KKYnx#k#is|T7!)G=d z`LXbPCvzc>%#)cwm~{ISiC7bE!Rh^MzW$~>NA$mrF>|#t+V^KsO4BPZY7A=#@|)jO zB4XUFP-EsKu2Dr%WbpQrGq*K$kp)A!)Ee6ZAGHu8q{wsYM-jXG<92}-AXCLjo&pUR z%y0GTCqK8x7!v4$LwvC!b4C9n5~7=^xl_GB%P@v3|ByY70mw;(Ee<_2g`+{_S*uya z)M8EHw`azk^mixj#?A|tR5h6E2UrY)yrYDz*~IvdM>by{2Ka~=b#RzK7TCaGZzCqa zTNm6yq~81+)Fpss5DcRiD?YnvHpBZp7$QlQN4EG;KXhW>|1@mw5r1&u42m~t6*h>( zMsvv|>)nI)@?G1L;X}qmd=GB>ON-vRQ}W!0R09sRes4K06rgGo&U7co6w&FGH|+qD z2o)lJ3B62%@P1lzP-_GG`oCZ^{Ie*4dener9gm;yZBzWVFFVRr<4+y^wULW=(>3uX zcbOQi*H;I&$=_{A84kpP zY00eBT=nc3ftrFGs1w2l4GvqF?*UBdrRL_T2NLIkCDU?nr>;Gp*nS~C?2^>E4QoN!j#7d*?-u#>$Br zMmw~x_DkC_{yl!YrrV1FE_L-p`JWrwZg{eFWtTAniqJr8*U8>nNl=qC;4aifmz}kk zP<`rG0_ry~Tg@0fT)Do-3NLcJMOSxW(k#UE2Q%FUHHUsB^_6{&?eZ|QG7_YcJjGxz zRc%5Err3!GmF)V8=>H<)?p!S@5b~~c3!6reE@dl%HjuB&AW;}g*lFAgUUJi>e7F_#kX9^aFq|FYQr%?6xkw?lg;j+r)%}3hzs#!yqP^1 z^TM9^JPsZ}d(1e8hb}|l6M7)D$Lpodr1MaYC-|Ol1=3m%^!?(G1t<73vI=miRS$4m z&(1*x=OXHQe8B&GHY)v zj5EKlIrdt6tvU9bd;XqvYA@yrJdkzd_>ni9wT{@IadOB{KHdI2irTT>sa7OWvS%gjf~Vk(eDMe zsI8%oB)7s+G^}lawzZ|}zj=q4EjiF9+fxi^DSurjq}%l@kjbnzHM*Ix2OaC_W#WBq zD)dd2$gO%u@zll{N;iZM&nj+#r)=$ba*=e7N1qJoI^TL%Rx#xe*m7T1Y?3;E7W59~ z{INr3DcDL~P^W9C9_&U@t%x0VQGg|fU1O8S?}(@}+zj;(0Wtch<5GS;Fal!)Ciu3lba8$;7~0kn)=Q2v3qe5pkqn;tm5dhH`&!9@R)&J>vk~MP6^hhoNx=_y9OM` zwE$vDh`Ogt#-j)dsIi+ARFxEEA!RK%SskUM5%SwNcPx!bzbFH5vRoM@7rrFKUxhOV*xU|K zmM9DQe6@5U;}O*F@S)-5d%Aij2Bdi?09{7vI>{UP^`sq~nfpUuUz^(|qq29+Ohdj^ zkoSB3Jtw2%Gdj>`Vx)?SZ^5LH?WdFokYZ!G6twR9^2OnWeHteI%&4ExMh~y}6_$I; zneikPmi;m``uS+d;)eG%N*i%b{Izc`(#?DgTcJlA15Eyv%RYWTG8$>c zcs|w3+nRa?@Av{=GsNWwI`#k<3{TNTesHk9Z^?F(fE4?dH2tiDl~TlKMO-fS{alGmC!6Kv&9mirl}=4SB4Scey*^pB%Kprt?FB zjwt-Bt7muAiC1|ntZc6KF@?&?tn2-;L2+{EOqrDrH;~lhPvHt`{P_fB+&Z~&$o*6? zOGIG5KbBJIphez7Az*4D_eH39JSWkL&yta?msaygHwdr&ZCLm#t7)<}@Y=!e%p1J` zX1ma5U23}{EQGi1I^tQ&(MR0F@jc0E*6IpAe=L=0XNsh&w-Syq0g0m9y!!H8T3=*~ zBl9L`d>fB}goDq=oDQlhQHk5R0oh@h+1VlnPfyp$lwsX}t0-suD9+U=!G`T}?1xk7 z;`~J!mT9b_n|5~T&`?u3jlmC#=JQv20lZx`iqf%>+>cz4@|G!0zy@I9brgxu7topm zKz`tkybptDb65PxJU$uBA_V&IjRu*NOIU)^dC<5t_6>2jqr2#bXs**ITsnR!Qx~Xp z+AznR13p~;^o#&-clX-QN{%|t5dgnmfgTtU^_I<+p0l4-%lwKTa3a%h22j05So!hC zpc?1Y6M5J2@e2dhMdK@;Z1!t7ND;xS;Qk8aIhh1SPjxRk%LE(!x;@ic;43TI^9D`u zn}eXFc1h8kqzCqz`mpFlw^U=RI!1YmQ)gQ~{0_I^#<@vmqWoLPwM0jz0ezRNCtP5i!+H=9iXCas5qcnpZe2;Bxc#^M*4Phuv?>~>Ufrc~b*OO{ixv9U;BGJ6s!UM$- zFls3!8uT3h!Ym#YgzPI(One=da#S&a5DtE<2+U)!JdYo*@4=Aut-^jkvli*B;JLQf5ic5S+*4L2 zXC<56_uSvMWTyfp|7bV&yTmp*I#1+0JK=5Jgn<;)0ytPk2F5H#cCV&e$s!zw4*K3^N?mKJ#773nm1ra%qybm(@V`2%Dddm;00@f z$;?se2^zI7x z$bS>hhI$_1>B{t((4;@!NtOiG&<`=8ja#pWc@Is!otTOY2uLx8rv0}29Z(K|w$R9j z7TDg}F&{BXV1@h`y8d?SlaH*N0uxTb;r%ZcJ$~6@yK3j>)W^^14f^r83D<76X?&CX zGj`r_{?kz>*yH4wQ&(2UOb4QT&&zeE(yR?z$#wV_llWw5`pGJ4go8NCXxpc9I_Z~s ze;kLDHu?|Ys^BE%KP{3lt{;IY#GYY!R0T>)gYfhAH?LREs?8LMi9c!FtsT}sQT996 z6+J1+9Mk)Ne1Jwa8kv|oHv#M2WGKU3%hW54A7bD!SRyuR=KineW;$oD>a9$te`lP` z64kkLl$L`6?%idSul-)}+3HO6n$AVUvhmCmLEx=N7*Fab=)IwDw4do%H6z-+!7c)Ay=ox=~SFl41 zG!Ai?F0V#{tVKOR6=n<(r9qz=1>M)GW*<;^sqBztv%Nz>d)q*Vrq7j?a8$di}hYR5<}$pwBd#h z&HaX7Gnic7a<#MJpo=H>;lD~ok`NcGCg-#aMe_oY_#ojAz8n^_IonbFPks&)hu<7Z z4J=qFU*c0Q=8PBiL<+rm$DD~fmwwKH?C#8!F3Spczwi)eYzkiDHK%%4V#8IPsqI{? z6HW_F*)zNS(wz6i@FafZyxwk8gDAh!XjtYTA3IK5`X+gv(pSaswvUBxCC`SM@PK1l z#}6FYyU)9y0CYlk#k!|+CzIzjREJOZW?MVv+{G-rYq$j)Z@jbixa|(>9(X2a(czoQ zZ8xigV(F?p zz?nT(Q6o0fhoTcxx}EA3qPySYymmf7B^C@`Vs3oLpLI}ilHNsbAb7WgTsIL(j=D(poTZi+`O zgChXb75c7%ou(9keE(Z;pG!8ODVyQ2NDpVTs)HX5PN#5`yMYZm<@vgUNL)0A+n~`q zFFDmn{kG%Qi9mP7KQZ60xqiOh+!YD3(PlZaSZ5mkL#`4gP;bqY!d0`;Hym+0S?Mnq)p3Z2YhDB^ zQjIzYbL*L_vaNu0?oA04CSgU~og8GKH&KbvOsg2pU+wIDutt^vZ5leu81P!hukJ^! zhNUXA2lOTfLhNWCj{*^dWJcA9BZL+bs(n$AAKDSgGl8E>X?S2(kTllhLTri*q|)g4 zndtR4@sCO>_BaI_WIED75s_LF!3lGaOT$a883djEw6kjsxE zU3GG6)0?3&*#llP0sw4TN9TYn8#D7F9fhr3mib>>py|Onmketq6X>*~T)4kfIP>|) zbF66NTwu1wiazUh^bvHYAqATa*l+A~WPd%ni~#O}{P`Tm=}d)%00j|H9NmPx?krObVZ4Ws-lu@6S$I?C2!7 zn)PgQE6R(vx!TjwH?o!<`937}fN4)uPofM7VJ=Qr=cmySJ)lN+E($$PGsNognZi~^s- zjfk;x1<&z4P7pZsAva^w=PK?U)atuoElcgQ^h%GfMq%^{b3YX)uY>-v*TM=10cG8O$(_2l77a6&yMC<)HJsS;YS7XL&VRcx70h}hH1N71 zfwRPL$q;apwFpRDf?mHY4ZN`QNYI??!Z@75adWdIeF$(q*fwP$L~D!LhOfbCYGC~| zN)XfbLjnI(zDEQ@6iSvb&35~nrj0;Mgq6JQ+CSpBn`>XoxIZ?$loIb zN*742uYq1nm8y;Ce?NmCL@Kqw`qO`|i$k8ym)^TqaC1N|UxMn6JXJ)t=jc2}0e`}} zq(1x=kGqSTJGtWT2Fb}N6fTV)LdYnn8F-FV0AqTvTG&@H6xo0=fI8e46cLI)nvtR^ z$VseNuN-o5fPnNy4M@uyFymq=O_A$p*Km^#ZTo50yRhLSX{OzNd?+c^YD97{#&Hz$UkCqPga6!pu(x#cQ^Bo}PG(SK&lAr7>+oT4 ze+N&}Q4_QA-eg$p<>69f4Jq{Hj_gTP!ZE)XRSBi?M;!)s9=iwADc=FIZ9d&CAG0rlYB^QGX8}`7Z|w BWcL67 literal 0 HcmV?d00001 From 70d01f5be300f22305526e5a8a1615c015ac1574 Mon Sep 17 00:00:00 2001 From: Zeeshan Adil Date: Wed, 28 Oct 2026 04:22:39 +0500 Subject: [PATCH 5/5] feat(seo): share images, structured data and caching across the site Pages set their own Open Graph and Twitter tags through withSocial (each page used to share the homepage title and lost the default image). A default share image shows the logo with the week bars and the tagline. Organization JSON-LD covers the site, blog posts get BlogPosting and guides Article. Blog posts are pre-built. next.config.js is the only config (the unused next.config.ts is removed), with image formats, caching headers for static assets and no x-powered-by. Robots keeps logged-in areas out of search, the sitemap adds /brand, and analytics only loads when an ID is set. --- app/ambassador-program/page.tsx | 5 +- app/ambassadors/page.tsx | 5 +- app/api-docs/page.tsx | 9 +++ app/blog/[slug]/page.tsx | 26 ++++++- app/blog/page.tsx | 5 +- app/community/page.tsx | 5 +- app/fellowship/page.tsx | 5 +- app/fyp-roadshow/page.tsx | 5 +- app/guides/[slug]/page.tsx | 15 +++- app/guides/page.tsx | 5 +- app/layout.tsx | 87 ++++++--------------- app/mentorship/page.tsx | 5 +- app/network/layout.tsx | 5 +- app/opengraph-image.tsx | 9 +++ app/partners/page.tsx | 5 +- app/projects/page.tsx | 5 +- app/robots.txt/route.ts | 38 +++++----- app/sessions/layout.tsx | 5 +- app/sitemap.ts | 1 + app/team/layout.tsx | 5 +- app/testimonials/page.tsx | 5 +- app/twitter-image.tsx | 9 +++ components/testimonial-card.tsx | 1 + lib/og-image.tsx | 42 +++++++++++ lib/seo.ts | 130 ++++++++++++++++++++++++++++++++ next.config.js | 37 ++++++++- next.config.ts | 11 --- 27 files changed, 359 insertions(+), 126 deletions(-) create mode 100644 app/opengraph-image.tsx create mode 100644 app/twitter-image.tsx create mode 100644 lib/og-image.tsx create mode 100644 lib/seo.ts delete mode 100644 next.config.ts diff --git a/app/ambassador-program/page.tsx b/app/ambassador-program/page.tsx index dd91f48..00ee58b 100644 --- a/app/ambassador-program/page.tsx +++ b/app/ambassador-program/page.tsx @@ -1,12 +1,13 @@ import type { Metadata } from "next" import { Button, Card, Eyebrow, PageHero, Panel, Section, SectionHeading } from "@/components/site/page-kit" +import { withSocial } from "@/lib/seo" -export const metadata: Metadata = { +export const metadata: Metadata = withSocial({ alternates: { canonical: "/ambassador-program" }, title: "Campus Ambassador Program", description: "Lead Dev Weekends on your campus. Activate your university community, unlock mentor access and deliver career outcomes with playbooks, support and recognition.", -} +}) const APPLICATION_URL = "https://forms.gle/k8JtSqSh2SWVMwJ4A" const CONTACT_EMAIL = "info@devweekends.com" diff --git a/app/ambassadors/page.tsx b/app/ambassadors/page.tsx index ec7ff86..efe752b 100644 --- a/app/ambassadors/page.tsx +++ b/app/ambassadors/page.tsx @@ -1,12 +1,13 @@ import type { Metadata } from "next" import AmbassadorsClient from "./ambassadorsClient" +import { withSocial } from "@/lib/seo" -export const metadata: Metadata = { +export const metadata: Metadata = withSocial({ alternates: { canonical: "/ambassadors" }, title: "Ambassadors", description: "Meet the people who represent and grow the Dev Weekends community around the world.", -} +}) export default function AmbassadorsPage() { return diff --git a/app/api-docs/page.tsx b/app/api-docs/page.tsx index 3022994..62d6f20 100644 --- a/app/api-docs/page.tsx +++ b/app/api-docs/page.tsx @@ -1,3 +1,12 @@ +import type { Metadata } from "next" +import { withSocial } from "@/lib/seo" + +export const metadata: Metadata = withSocial({ + title: "API documentation", + description: "Where to find the machine-readable API description and health status for devweekends.com.", + alternates: { canonical: "/api-docs" }, +}) + export default function ApiDocsPage() { return (
      diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index 0ac62f7..d95d287 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -7,10 +7,20 @@ import Link from "next/link"; import { ArticleBody } from "@/components/content/article-body"; import { formatDate } from "@/components/content/format-date"; import { Button, Eyebrow, container } from "@/components/site/page-kit"; +import { SITE_NAME, blogPostingJsonLd, jsonLdString, withSocial } from "@/lib/seo"; const backLink = "inline-flex min-h-11 items-center text-[15px] font-medium text-[#5C5C5C] transition-colors hover:text-[#0A0A0A]"; +export function generateStaticParams() { + const dir = path.join(process.cwd(), "content", "blog"); + if (!fs.existsSync(dir)) return []; + return fs + .readdirSync(dir) + .filter((f) => f.endsWith(".md")) + .map((f) => ({ slug: f.replace(/\.md$/, "") })); +} + export async function generateMetadata({ params, }: { @@ -21,19 +31,22 @@ export async function generateMetadata({ if (!fs.existsSync(filePath)) return { title: "Post not found", robots: { index: false } }; const { data } = matter(fs.readFileSync(filePath, "utf-8")); const date = data.date ? new Date(data.date) : undefined; - return { + return withSocial({ title: data.title, description: data.description, alternates: { canonical: `/blog/${slug}` }, openGraph: { type: "article", + siteName: SITE_NAME, + locale: "en_US", title: data.title, description: data.description, url: `/blog/${slug}`, publishedTime: date && !Number.isNaN(date.getTime()) ? date.toISOString() : undefined, images: data.image ? [{ url: data.image }] : undefined, }, - }; + twitter: data.image ? { images: [data.image] } : undefined, + }); } export default async function BlogPost({ @@ -76,8 +89,17 @@ export default async function BlogPost({ const fit: "cover" | "contain" = data.imageFit ?? (slug === "gsoc" ? "contain" : "cover"); + const jsonLd = blogPostingJsonLd({ + slug, + title: data.title, + description: data.description, + date: data.date, + image: data.image, + }); + return (
      +