From fec3abd5d81ee9929fbd82d37d8909a8425e32c2 Mon Sep 17 00:00:00 2001 From: Patrick Alvin Alcala Date: Wed, 26 Nov 2025 14:01:40 +0800 Subject: [PATCH] Updated --- frontend/.dockerignore | 3 +- frontend/@dasig/images/logo.avif | Bin 846 -> 0 bytes frontend/@dasig/images/logo.webp | Bin 626 -> 0 bytes frontend/@dasig/images/ocbologo2.avif | Bin 1389 -> 0 bytes frontend/@dasig/images/ocbologo2.webp | Bin 1688 -> 0 bytes .../@dasig/scripts/node/generateFavicon.js | 23 -------- .../@dasig/scripts/node/generateFavicon.ts | 26 ++++++++++ frontend/@dasig/scripts/node/optimizeImage.js | 41 --------------- frontend/@dasig/scripts/node/optimizeImage.ts | 49 ++++++++++++++++++ frontend/@dasig/scripts/node/optimizeLogo.js | 33 ------------ frontend/@dasig/scripts/node/optimizeLogo.ts | 36 +++++++++++++ frontend/Dockerfile | 23 ++++---- frontend/Makefile | 12 +++-- frontend/app.config.ts | 14 ++--- frontend/public/favicon.png | Bin 2273 -> 367 bytes 15 files changed, 141 insertions(+), 119 deletions(-) delete mode 100644 frontend/@dasig/images/logo.avif delete mode 100644 frontend/@dasig/images/logo.webp delete mode 100644 frontend/@dasig/images/ocbologo2.avif delete mode 100644 frontend/@dasig/images/ocbologo2.webp delete mode 100644 frontend/@dasig/scripts/node/generateFavicon.js create mode 100644 frontend/@dasig/scripts/node/generateFavicon.ts delete mode 100644 frontend/@dasig/scripts/node/optimizeImage.js create mode 100644 frontend/@dasig/scripts/node/optimizeImage.ts delete mode 100644 frontend/@dasig/scripts/node/optimizeLogo.js create mode 100644 frontend/@dasig/scripts/node/optimizeLogo.ts diff --git a/frontend/.dockerignore b/frontend/.dockerignore index e8ecee8..af50d2b 100644 --- a/frontend/.dockerignore +++ b/frontend/.dockerignore @@ -2,5 +2,6 @@ node_modules/ .git .gitignore *.log -dist +.output +.vinxi Dockerfile \ No newline at end of file diff --git a/frontend/@dasig/images/logo.avif b/frontend/@dasig/images/logo.avif deleted file mode 100644 index 2597894674835f5b510194b35b97f74151a42c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmZQzV30{GsVqn=%S>Ycg51nBLl8SRGZDyVEXYkQNd$=lfnr8VP7#F3z)+BxTmoam zXug8Xl3Xx{5lEV3=Hw@XcrFeMObj3q2F5868pv7(6axZgE0_p_2#{-$nVAQ623S@U z$Vmk&1L{sJGcW|{KnMb5V1ny23yKPWl3kev$@xHG4{n?UP; znsY!(KmoycC^sdsM2LZl!$Q#dnt;HCOrz<{5)7;&46FT-m;^pVzeMKva6wt@iSL>nvBC^Le)8-;T?% zo<+|-Wr@$O(KLBc9s216#MG_u z-xhoRYMJ}@H#3jc9ng*4zoVwyVX5PuVAWQS!|&4nwcW^AoA@_rH{X_d9(&u;6t{ok zPEz{nf9BP@W71FkU(2SP`Fciu@h#`Fs@3Q6f>vxYDHQNl{T0i!xG}UZ?Sh2!*1N_g zELA(V3#m@B(6Y)`Tv)(Rwf6J=SZyB*tr8u_fl|WMC|@N&sU?)QD38 L7;_AqJo3c=AW0N^ diff --git a/frontend/@dasig/images/logo.webp b/frontend/@dasig/images/logo.webp deleted file mode 100644 index 8fb02ce5c88b95577352197ea18ae595d8918282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(DrNk&F$0ssJ4MM6+kP&go70ssII4*;D3DjonH06uLjlSU*Wp`j=ZP=F1I zX#f+)-&N7)UHrGqzvCa-zs&zt z_yPV+{PX;8^Y7h{hc93st=`0cu;JP=nE4lUv|$DD#rbyDQTrqwEdB9_V=<_zMKfjq z0RH+_+r!gwMtTLm>%W*9=`J`s8C3bOOcs*{|48@;DVHF%)vN1Zbi)}2U-6BX*9YQ$#hOZD}CRwvB-nVC0l@%jFfUCnZuD*>K*!C8e`X;_&&y+uYsF(B^+gQQm+Y=MUJyXaYm9C7e>Ioh^x3x2hRvmUVQ{P)d zI8HIblIyDI@`UX`buKRa(?Tb!d|^P9K`VtO+YSb%`4=&WnnMY~e!5tFas=UNLKv1} zQ%rz4el`=u9zD?yPl%I`kdRd`#TJM1ICWPkn;NFxz|VLl2n?zkF+|y(w<=`HP-KdO zOxY9szW+Z}3QLpkP(zfn(=DSERVDPL*CML()uY`U$Wi^9#(#r Me~p7t!&5*208&9Png9R* diff --git a/frontend/@dasig/images/ocbologo2.avif b/frontend/@dasig/images/ocbologo2.avif deleted file mode 100644 index 1c093b759044fa3ca088bc02630b08d6b8f39dcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1389 zcmZQzV30{GsVqn=%S>Ycg51nBLl8SRGZDyVEXYkQNd$=lfnr8VP7#F3z)+BxTmoam zXug8Xl3Xx{5lEV3=Hw@XcrFeMObj3q2F586nt_4o4NwdSSQ=m=3~zy4i_FYCurt82 zqCie6SQ$`vVwr&z1__rI8#GHZ*aCpgP7UY5%K&?REGdD6ZGcd8VFtN4)1*9^IQX$?1 zS_jme15yGC29WSWKiGjP9^XFz^^mVr96ib45p9>Gm?=+{xA} zyA7{gH=1hZ?q{s8-@7Wq@`#blgii7If3*L!YxqV_e0AWqbv5I%T)UksK3V^3w#WCgl;B}DWyWXor8?_a;W3$sZ(o{B|*s*j?obkJ6ra+s9(B~AT=+EM#g{$T|4g`e^~WQt{2-_BpR*S`%=!OuhQY$0v7gFZ?-d3cn>%zZ zd7*WDy-MYtG|v1>>G~TKAL(nHx1PfC{`$`wmY1Hb+vRw8)k%kdo=G1Hjy_a=smoTo zOXulJEB7yTC8B{mr!Ce>z28&Ou!eiNI3LT+TP-UL-bxq#XX0xJOnBeqbnHUa#_ZFj zQ^h9+zIbeNY{BB1E3seQ4s28C%)TKIE#+}oZ+}D9O2)vaiQI>q=OpXYvu$1Z`VOz< z|Glh_4i`<@S@YoRQ_=c`{Yi#N>PA-^AN_7M%}t+uY5oj>YsdXRe9|kvC|$qgaPwh( zL1xLRikebJaeMDuPEY^G%jYCvcB1J1#oOGI zU8FwDJS;TX?N()LYg5Zl)wiqlUt7mEWIWcfY5dm8v9M?XH~Z7GJ8c`DY-j|3Fs-*b7(HNgV_*>oxF#Qb`pAc^J^c$e z2iz>U{>yQt!pr$}kAK|0EbC>zK&g}K`lCMvjQqU1l^Z@Ot@{`UYfn zZ`&a-<=L+*ryUPCL@Lg>>5??Jti*8EYNM60(^43=M})npWbjKrdhp)mw_!{B^cF4`g}2yBvu`sc}n$S5?c-9wRwFT zb&WdOn9|;=SLDp7n_;-ZF^gl-KTV;VTui&>-f7AS{_p0x`p9&v%5_)w^eYEXyR<8V Q$#nJJmgUC(?O4Pb0LJJjiU0rr diff --git a/frontend/@dasig/images/ocbologo2.webp b/frontend/@dasig/images/ocbologo2.webp deleted file mode 100644 index 63e4ec1d245743c98672a2b79d629897bbc7525a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1688 zcmV;J250$FNk&GH1^@t8MM6+kP&il$0000G0000n001!n06|PpNGJjT00E$FZJTL3 z`u?iewr%GcZ1V@GFPDeQ zAgJ&P3&x^a;0xs;{~_Y9GqC6dUUDM;=CPH52?lP2`xlQfj7-rYhrt67H2#X31eG7v zg#Zrw8JK9`E;u;!enLyd_@FbK!)Zn)8+il{Z6DCmG5*#PSjxzRBj-Urpr)jJ3vHj! zQZhbhHi^olm1A}>q!qaFRccz1*Y2mLy!$mRE#sHpr1#CY|AVj7`|>_DE#;k;7}JWp zzMUbhzzvhAX&FbieoRZr_^_FLKusy~HDDfNS~Gx_ztPe${?ZH%#~ITJ+z02-?J+GC z_yOgRu9|Mb|%LJEPa;qmX{F0)|8vcS_2 z{1?jKWWkDKffq|yLj~foEkI_jml5@zza(3 zQG3^8GDfp3W-%HcY^x5BJe{E3;a_Rg5LL}oV^A7@-QODGkgs^4{^YkGF!O^qr!<5( zLGI22Xf%A~rT6cB_0_%i&aWKW5P)~c4pvY&AVLHH0Pqt4odGH`05SkRZ7`HaBqJgr zC>#4wfDMUh0Mny?z3ur~_RN>*U;OWs9sSDrm=6jZMt0SCOL#E(A3o3ff8)ID{RjVV z{CB{A>i7EpS`S@*i{Gt-UHGi-UBC{|diC7(+iX|j%XyEHL(+KQ;VcAKBTZ z&Fv&>4?#L-96rVl3NCMkH{U6pDNO29kio##Su`0Y3NsCg`hRqux_mzMG2?V~5^5rKrV__-!0f;J zSWQJe*@B+3RXDWE3p^Ss6~h!MQu*IkKkxX}eo^16eTIp-d#iJty^-65ym*t-OLBz7 z&-&%Kvs?$y9;AzLB~$$vj}s(CrrXkF^?&W?B72M?boZZHaG3g?jLd!@37|xza9-^1 zavt($9Q_RtePyK*FalDeSoxUTGNLNj|2? zV56q;?Nr{bLuWmfsGqwa?PIpD01E_Z1{TSa1t{f9wC$}eQCZkBM^m#bv4c||OH!b= zm3pE{T=NB2)TaOM+t$A0S}UL))r)76W8wCWkQFH%T8fu_2kar{_h5m?a!*L8?F-Ry zZ>rBK7Z3x^yx{TkYJ)QBrTpJXJO2u$9$wm!Q1kfryG>cQ-Ph00zn=U0XibOjYJAAu zgdlFl%(+4{qKmG(=la=9B-w1lYZH<7_|K1~za|my1AO#ka0aa9NYFE1&;__gsbrQu z{O!J1>;IEmGj}avXldQT)o~QZs<9VC$2WO_Jmx=dQ_`@NV?{997YZaK#-|hqM6te3 z50M_hX6g4_OSb)Cdon=f3A2)1xC_>(Mo9ea&Dw#D5FL?Ib2XI^i(*9;KShL2h)?7L z{ov^LN}K9~P*2|@OF{pC&wdiZ^80<0AJK diff --git a/frontend/@dasig/scripts/node/generateFavicon.js b/frontend/@dasig/scripts/node/generateFavicon.js deleted file mode 100644 index 6a75e0f..0000000 --- a/frontend/@dasig/scripts/node/generateFavicon.js +++ /dev/null @@ -1,23 +0,0 @@ -import { consola } from 'consola'; -import * as fs from 'fs'; -import * as path from 'path'; -import sharp from 'sharp'; - -try { - const dirPath = path.resolve('./public') - - if (fs.existsSync(dirPath)) { - const inputSrc = './src/images/favicon.png' - const favicon = dirPath + '/favicon.png' - const faviconBuffer = await sharp(inputSrc).png({ quality: 90 }).resize(48).toBuffer() - await sharp(faviconBuffer).toFile(favicon) - consola.success('Favicon generated successfully') - } else { - consola.error('Directory does not exist:', dirPath) - } - -} catch (error) { - if (error.message.includes('missing')) { - consola.error('Source favicon does not exist') - } -} diff --git a/frontend/@dasig/scripts/node/generateFavicon.ts b/frontend/@dasig/scripts/node/generateFavicon.ts new file mode 100644 index 0000000..51d8642 --- /dev/null +++ b/frontend/@dasig/scripts/node/generateFavicon.ts @@ -0,0 +1,26 @@ +// deno-lint-ignore-file no-explicit-any +import { consola } from "consola"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import sharp from "sharp"; + +try { + const dirPath = path.resolve("./public"); + + if (fs.existsSync(dirPath)) { + const inputSrc = "./src/images/favicon.png"; + const favicon = dirPath + "/favicon.png"; + const faviconBuffer = await sharp(inputSrc) + .png({ quality: 90 }) + .resize(48) + .toBuffer(); + await sharp(faviconBuffer).toFile(favicon); + consola.success("Favicon generated successfully"); + } else { + consola.error("Directory does not exist:", dirPath); + } +} catch (error: any) { + if (error.message.includes("missing")) { + consola.error("Source favicon does not exist"); + } +} diff --git a/frontend/@dasig/scripts/node/optimizeImage.js b/frontend/@dasig/scripts/node/optimizeImage.js deleted file mode 100644 index 439f907..0000000 --- a/frontend/@dasig/scripts/node/optimizeImage.js +++ /dev/null @@ -1,41 +0,0 @@ -import { consola } from 'consola'; -import sharp from 'sharp'; -import yargs from 'yargs'; -import { hideBin } from 'yargs/helpers'; - -(async () => { - const argv = yargs(hideBin(process.argv)) - .option('name', { - alias: 'n', - describe: 'Specify the name of the image', - type: 'string', - demandOption: true, - }) - .option('size', { - alias: 's', - describe: 'Specify the size of the image', - type: 'number', - demandOption: true, - }) - .argv; - - const name = argv.name; - const size = argv.size; - - try { - const avifOutputPath = `./src/@dasig/images/${name.toString().split('.').slice(0, -1).join('.')}.avif` - const webpOutputPath = `./src/@dasig/images/${name.toString().split('.').slice(0, -1).join('.')}.webp` - - const avifBuffer = await sharp(`./src/images/${name}`).avif({ quality: 60 }).resize(size).toBuffer() - await sharp(avifBuffer).toFile(avifOutputPath) - consola.success(`${name} successfully optimized in Avif`) - - const webpBuffer = await sharp(`./src/images/${name}`).webp({ quality: 75 }).resize(size).toBuffer() - await sharp(webpBuffer).toFile(webpOutputPath) - consola.success(`${name} successfully optimized in Webp`) - } catch (error) { - consola.error('Error optimizing image:', error) - if (error.message.includes('missing')) consola.error(`${name} could not be found on image folder`) - } -})() - diff --git a/frontend/@dasig/scripts/node/optimizeImage.ts b/frontend/@dasig/scripts/node/optimizeImage.ts new file mode 100644 index 0000000..9cca41d --- /dev/null +++ b/frontend/@dasig/scripts/node/optimizeImage.ts @@ -0,0 +1,49 @@ +// deno-lint-ignore-file no-explicit-any + +import { consola } from "consola"; +import process from "node:process"; +import sharp from "sharp"; +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; + +(async () => { + const argv = yargs(hideBin(process.argv)) + .option("name", { + alias: "n", + describe: "Specify the name of the image", + type: "string", + demandOption: true, + }) + .option("size", { + alias: "s", + describe: "Specify the size of the image", + type: "number", + demandOption: true, + }).argv; + + const name = argv.name; + const size = argv.size; + + try { + const avifOutputPath = `./@dasig/images/${name.toString().split(".").slice(0, -1).join(".")}.avif`; + const webpOutputPath = `./@dasig/images/${name.toString().split(".").slice(0, -1).join(".")}.webp`; + + const avifBuffer = await sharp(`./src/images/${name}`) + .avif({ quality: 60 }) + .resize(size) + .toBuffer(); + await sharp(avifBuffer).toFile(avifOutputPath); + consola.success(`${name} successfully optimized in Avif`); + + const webpBuffer = await sharp(`./src/images/${name}`) + .webp({ quality: 75 }) + .resize(size) + .toBuffer(); + await sharp(webpBuffer).toFile(webpOutputPath); + consola.success(`${name} successfully optimized in Webp`); + } catch (error: any) { + consola.error("Error optimizing image:", error); + if (error.message.includes("missing")) + consola.error(`${name} could not be found on image folder`); + } +})(); diff --git a/frontend/@dasig/scripts/node/optimizeLogo.js b/frontend/@dasig/scripts/node/optimizeLogo.js deleted file mode 100644 index 5a62dce..0000000 --- a/frontend/@dasig/scripts/node/optimizeLogo.js +++ /dev/null @@ -1,33 +0,0 @@ -import { consola } from 'consola'; -import sharp from 'sharp'; -import yargs from 'yargs'; -import { hideBin } from 'yargs/helpers'; - -(async () => { - const argv = yargs(hideBin(process.argv)) - .option('size', { - alias: 's', - describe: 'Specify the size of the logo', - type: 'number', - demandOption: true, - }) - .argv; - - const size = argv.size; - - try { - const webpImage = './src/@dasig/images/logo.webp' - const avifImage = './src/@dasig/images/logo.avif' - const inputSrc = './src/images/logo.png' - - const avifBuffer = await sharp(inputSrc).avif({ quality: 60 }).resize(size).toBuffer() - await sharp(avifBuffer).toFile(avifImage) - consola.success('Logo successfully optimized in Avif') - - const webpBuffer = await sharp(inputSrc).webp({ quality: 75 }).resize(size).toBuffer() - await sharp(webpBuffer).toFile(webpImage) - consola.success('Logo successfully optimized in Webp') - } catch (error) { - consola.error('Error generating favicon:', error) - } -})() diff --git a/frontend/@dasig/scripts/node/optimizeLogo.ts b/frontend/@dasig/scripts/node/optimizeLogo.ts new file mode 100644 index 0000000..c80c8f4 --- /dev/null +++ b/frontend/@dasig/scripts/node/optimizeLogo.ts @@ -0,0 +1,36 @@ +import { consola } from "consola"; +import process from "node:process"; +import sharp from "sharp"; +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; + +(async () => { + const size = yargs(hideBin(process.argv)).option("size", { + alias: "s", + describe: "Specify the size of the logo", + type: "number", + demandOption: true, + }).argv.size; + + try { + const webpImage = "./@dasig/images/logo.webp"; + const avifImage = "./@dasig/images/logo.avif"; + const inputSrc = "./src/images/logo.png"; + + const avifBuffer = await sharp(inputSrc) + .avif({ quality: 60 }) + .resize(size) + .toBuffer(); + await sharp(avifBuffer).toFile(avifImage); + consola.success("Logo successfully optimized in Avif"); + + const webpBuffer = await sharp(inputSrc) + .webp({ quality: 75 }) + .resize(size) + .toBuffer(); + await sharp(webpBuffer).toFile(webpImage); + consola.success("Logo successfully optimized in Webp"); + } catch (error) { + consola.error("Error generating favicon:", error); + } +})(); diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 5b75f16..0a616ef 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,12 +1,17 @@ -FROM node:22-alpine AS build +FROM denoland/deno:alpine AS build WORKDIR /app -COPY package*.json ./ -RUN corepack enable -RUN pnpm install +COPY package*.json deno.lock ./ +RUN deno install && deno install --allow-scripts=npm:sharp,npm:@parcel/watcher COPY . . -RUN pnpm build +ENV NODE_ENV=production +RUN deno task build -FROM nginx:alpine AS runtime -COPY ./nginx/nginx.conf /etc/nginx/nginx.conf -COPY --from=build /app/dist /usr/share/nginx/html -EXPOSE 8080 \ No newline at end of file +# FROM nginx:alpine AS runtime +# COPY ./nginx/nginx.conf /etc/nginx/nginx.conf +# COPY --from=build /app/.output/public /usr/share/nginx/html +# EXPOSE 8080 + +FROM denoland/deno:alpine +WORKDIR /app +COPY --from=build /app . +CMD ["deno", "run", "--allow-env", "--allow-net", "--allow-read", ".output/server/index.mjs"] \ No newline at end of file diff --git a/frontend/Makefile b/frontend/Makefile index 46f831e..33d9aaf 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -1,11 +1,13 @@ +.SILENT: + all: deno install && deno install --allow-scripts=npm:sharp,npm:@parcel/watcher dev: - deno run dev + deno task dev build: - deno run build + deno task build && PORT=9000 deno run --allow-env --allow-read --allow-net .output/server/index.mjs & update: deno update @@ -17,11 +19,11 @@ podman: podman-compose up -d favicon: - deno ./src/@dasig/scripts/node/generateFavicon.js + deno --allow-env --allow-read --allow-ffi ./@dasig/scripts/node/generateFavicon.ts logo: - deno ./src/@dasig/scripts/node/optimizeLogo.js --size $(size) + deno --allow-env --allow-read --allow-ffi ./@dasig/scripts/node/optimizeLogo.ts --size $(size) image: - deno ./src/@dasig/scripts/node/optimizeImage.js --name $(name) --size $(size) + deno --allow-env --allow-read --allow-ffi ./@dasig/scripts/node/optimizeImage.ts --name $(name) --size $(size) diff --git a/frontend/app.config.ts b/frontend/app.config.ts index da0289f..377e62d 100644 --- a/frontend/app.config.ts +++ b/frontend/app.config.ts @@ -1,11 +1,11 @@ import { defineConfig } from '@solidjs/start/config' export default defineConfig({ - ssr: false, - server: { - static: true, - prerender: { - crawlLinks: true, - }, - }, + ssr: true, + // server: { + // static: true, + // prerender: { + // crawlLinks: true, + // }, + // }, }) diff --git a/frontend/public/favicon.png b/frontend/public/favicon.png index 2fc620ccb7a7f3fd84c4f20b6bac7510535a49e1..14bf930be5b939905c07e060e2bd91f11d7241c4 100644 GIT binary patch delta 351 zcmV-l0igcj5$^(!8Gi-<00374`G)`i010qNS#tmY59$B_59$E~KLYXq00ALML_t(| zob6h>4TCTc^#IfnL){{j^iN_T7n#6CreFj2S%An1NQgM*XowHJ;)%w7zLU@IKElC= zNrU13NZ%)XXr$}i8t~x;AL6`5!xPgU`Q~ZT85*7iX%ig)Z-1a?2u*y%o+{)hqu9?0 zrzA2cbJIJKB|*xY;NzV&MkH13Y8l2I3K$mQ8AG58WJoI*R6i0p;j3kE|AEg=~4pLi#f4gPD=$w2p#AQhY+lfRbYLvHC!N(O{Pl; xup{f)kxAwaFoeL4EY#JJ4gA?7@CJ|xp%>u)4$UEJ=db_(002ovPDHLkV1kLImh=Ds delta 2272 zcmV<62p{+F0^t#m8Gix*007uvZqNV#010qNS#tmY3ljhU3ljkVnw%H_00@&wL_t(| zoXuIUue7=rMb%;Ikw|ns|3Ez&S&74-5G0c^*y<`Qh6IN~R-sUpbv1-cxOuF6eSFNE zbH01u6>p2loI*Q`{bTL5Il=LNW`Y0qdcF3q?e%&c$MMzT>wmQCrR#xzc=#RAKeN|) z7684k{{svBW^3&*4C5yohQS!KZQJ#RVHnnR-S>SQM{BKf4p)a^nCJO84y`p-_I)?T zd~>+9*2DM@Ab7Rwy5N%$LV_TWQd(bgFTBg-NP0>nf#WjNvJxC_-V6uIrWVj`K5$B0Q+iAtbeb)@#|{vJKyxrU}E)v$p><#!yPX^H3B;@tXxf(6;Ti zZE2eJecyFmk|g6e=6N25;WSM}Q3xTHWr?B)KDpu0fc1zPhfPra`-Q&IuuW9|a&|OrGbI(kP0A5XKnq9;AN|1XWcvO_S%jl=8~P zziDbzsTa9)+qQLG7e&!DO(Be*xF1{dH?oxVVEN$CDEq#|m$P7;# z!+9cfMHq(HPpEH7>GcuO%g~$Wc?Mhhx$GtmopaXO+tB?1kk_C}DSy;L(=?EO>NKby zbbBdfp66)bLWnR78Dnt6IF8OaL<)dVRz*=@%PTpiz2+5O9hR0;9oa`QdZuYW!E-dSQyO^;#O&#=fp= zS(aYcew^e{_VB%*5q~~tYHO{2v-QkPaQC{d5I1N~d7dXp0>ouma?Y1!;hdLciNf|T z8v^8xb&y<=Bw3b0EZjZhCz9^X)UVVr#-K(Xj|Ws@9LH$pN-5~czVGuq$KxKy zA*F;Hj4|uF;#Z*px~{|h&bd6#f5@Smk<+VaPuFP+ZTR*&27gCmShzOV$K!Dwr3oQ; zs(0mo9~9?#h7beZZQHE1*V!I~O9(-NBaTWb09x1e`Ft|QuEdDAV{evapf1LkS1*w=XmL-Ph=kvL)D=0?@k)~-FhUoLi>pai>#w1B_ z+T-!4>l*XtcYnnA@nu68hM+qH5sPsg`w;*=0R<1C=))byF{Ly-4cv&UP@a_1ADH^% z>zMEY$n!4(v92p21ndWt(1F)(4rJQrivgCOVL5MoX zT!2}k>$)tfvxbzNVtVpw~B;r}oEYr)(1 u_x$1dzwpnO