From 2b12bd911c8ca41d5e9232b80518b2f7db263ee5 Mon Sep 17 00:00:00 2001
From: Daniel Woelfel
Hey crew! It’s time for another edition of Instant News 🙂 Here’s a slice of what happened in November!
Announcing enforced types on the backend
+src="https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733450241867_image.png" />Previously you could define types for intellisense but there wasn’t a way to strictly enforce them on the backend. You can now define these attributes in code, @@ -15,7 +15,7 @@ your schema we’ve got you covered :)
Comparison operators in InstaQL
+src="https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733450981289_image.png" />With typed attributes, queries get more powerful too. Starting from
v0.16.0
You can use comparison
@@ -26,7 +26,7 @@
to index attributes for comparison, which end up being footguns)
Fuzzy-search in InstaQL
+src="https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733451107349_image.png" />With indexing and comparison operators landing, it was a fast-follow
to also enable $like
queries!. When you index your string
fields, you can now use things like startsWith
,
@@ -39,10 +39,10 @@
$default
keyword it’ll be much easier to apply the same set
of rules across actions and namespaces :)
Instant at Clojure Conj 2024
+src="https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733449686289_image.png" />In last month’s edition we mentioned that Stopa (CTO of Instant) was giving a talk at Clojure Conj 2024. Super excited to share that the video has now been uploaded!
diff --git a/client/www/_emails/html/oct2024.html b/client/www/_emails/html/oct2024.html index 8100bc6d5..2c1c65be9 100644 --- a/client/www/_emails/html/oct2024.html +++ b/client/www/_emails/html/oct2024.html @@ -1,5 +1,5 @@ +src="https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730238267270_instant_header.png" />Hello and welcome to Instant’s first newsletter! We’re going to start sending you updates every month to keep you in the loop with what’s new :)
@@ -8,7 +8,7 @@ Francisco, and are actively hiring! More info below :)Open Source
+src="https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1729122912083_image.png" />We were heads down for two years before we finally open sourced at the end of August. The same day we announced on Hacker News and had one of the biggest @@ -19,7 +19,7 @@ energizing to hear your feedback and we’re excited to grow with you!
Fundraising Announcement
+src="https://www.instantdb.com/img/emails/s_B8A06116D3803694CDA0C13F9F97E92EA0220D4E377317F0F00D7831E3E41E9E_1727988124731_image.png" />A month after open sourcing we announced our fundraising on Techcrunch. We’re honored to be backed by these @@ -29,7 +29,7 @@ out our hiring page.
Clojure Conj 2024
+src="https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1729123513053_image.png" />Our very own Stopa (CTO of Instant), gave a talk about building Instant at Clojure Conj last week! This is the oldest gathering of the Clojure community, which @@ -40,7 +40,7 @@ when the video is ready!
Announcing $users table!
+src="https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730244149277_users_table.png" />With Instant, whether it’s magic codes, Google OAuth, or the Clerk integration, you can set up auth in a few minutes. But where did those users live? What if you wanted to query your users, or link them to @@ -53,7 +53,7 @@ docs.
Announcing queryOnce!
+src="https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730244001267_image.png" />useQuery
is great, but sometimes you just want to get a
query…once. Well now you can via queryOnce
This has been one of the most requested functions on Instant. It’s diff --git a/client/www/_emails/markdown/nov2024.md b/client/www/_emails/markdown/nov2024.md index 98e10ce97..39498eb50 100644 --- a/client/www/_emails/markdown/nov2024.md +++ b/client/www/_emails/markdown/nov2024.md @@ -1,12 +1,10 @@ -![](https://paper-attachments.dropboxusercontent.com/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730238267270_instant_header.png) - +![](https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730238267270_instant_header.png) Hey crew! It’s time for another edition of Instant News 🙂 Here’s a slice of what happened in November! **Announcing enforced types on the backend** -![](https://paper-attachments.dropboxusercontent.com/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733450241867_image.png) - +![](https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733450241867_image.png) Previously you could define types for intellisense but there wasn’t a way to strictly enforce them on the backend. You can now define these attributes in [code](https://www.instantdb.com/docs/schema), or in the [dashboard](https://www.instantdb.com/dash) and they will be enforced on the backend. @@ -14,8 +12,7 @@ You can still use Instant without defining a schema up-front. This is great for C**omparison operators in InstaQL** -![](https://paper-attachments.dropboxusercontent.com/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733450981289_image.png) - +![](https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733450981289_image.png) With typed attributes, queries get more powerful too. Starting from `v0.16.0` You can use [comparison operators](https://www.instantdb.com/docs/instaql#comparison-operators) in your queries! @@ -23,8 +20,7 @@ In order to use comparison operators, you need to set the type and index an attr **Fuzzy-search in InstaQL** -![](https://paper-attachments.dropboxusercontent.com/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733451107349_image.png) - +![](https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733451107349_image.png) With indexing and comparison operators landing, it was a fast-follow to also enable `$like` queries!. When you index your string fields, you can now use things like `startsWith`, `endsWith`, and `includes` in your InstaQL queries! @@ -32,18 +28,15 @@ With indexing and comparison operators landing, it was a fast-follow to also ena All user namespaces have default permissions of true. This makes it easy for getting started. Once you want to start locking down your data model, you’ll likely want to add permission rules. With the `$default` keyword it’ll be much easier to apply the same set of rules across actions and namespaces :) - -![](https://paper-attachments.dropboxusercontent.com/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733451831476_image.png) - +![](https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733451831476_image.png) **Instant at Clojure Conj 2024** -![](https://paper-attachments.dropboxusercontent.com/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733449686289_image.png) - +![](https://www.instantdb.com/img/emails/s_B097BA2FA68FBDBEF71F30F95558A3D23729AED0A557430F53FE49A682293BBC_1733449686289_image.png) In last month’s edition we mentioned that Stopa (CTO of Instant) was giving a talk at Clojure Conj 2024. Super excited to share that the video has now been uploaded! -Following up from [A Graph-Based Firebase](https://www.instantdb.com/essays/next_firebase), Stopa discusses the common schleps developers face when building apps, and how Instant compresses them. [Give this a watch](https://youtu.be/6FikTQf8qho?feature=shared&t=8) if you’re interested in learning more about how Instant works under the hood! +Following up from [A Graph-Based Firebase](https://www.instantdb.com/essays/next_firebase), Stopa discusses the common schleps developers face when building apps, and how Instant compresses them. [Give this a watch](https://youtu.be/6FikTQf8qho?feature=shared\&t=8) if you’re interested in learning more about how Instant works under the hood! **What’s next?** @@ -53,8 +46,4 @@ We shipped a ton of platform upgrades in November and we’ve got a slew of upgr If you’re interested in working on some of the hardest problems for modern app development drop us a line at founders@instantdb.com with a resume and a side project you’ve worked on (including a Github is a huge plus!) - -![](https://pbs.twimg.com/media/GZd_xO0akAETvju?format=jpg&name=large) - - - +![](https://pbs.twimg.com/media/GZd_xO0akAETvju?format=jpg\&name=large) diff --git a/client/www/_emails/markdown/oct2024.md b/client/www/_emails/markdown/oct2024.md index 663cd76ab..8030ffaa4 100644 --- a/client/www/_emails/markdown/oct2024.md +++ b/client/www/_emails/markdown/oct2024.md @@ -1,4 +1,4 @@ -![](https://paper-attachments.dropboxusercontent.com/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730238267270_instant_header.png) +![](https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730238267270_instant_header.png) Hello and welcome to Instant’s first newsletter! We’re going to start sending you updates every month to keep you in the loop with what’s new :) @@ -6,28 +6,25 @@ Two months ago we launched on Hacker News and open sourced Instant. Since then w **Open Source** -![](https://paper-attachments.dropboxusercontent.com/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1729122912083_image.png) - +![](https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1729122912083_image.png) We were heads down for two years before we finally open sourced at the end of August. The same day we announced on Hacker News and had one of the [biggest show HNs](https://news.ycombinator.com/item?id=41322281) for any YC company, amassing over 1k points. Since then we’ve gotten over [6k Github stars](https://github.com/instantdb/instant) and over 1k of you are now in [the discord](https://discord.com/invite/VU53p7uQcE). It’s energizing to hear your feedback and we’re excited to grow with you! **Fundraising Announcement** -![](https://paper-attachments.dropboxusercontent.com/s_B8A06116D3803694CDA0C13F9F97E92EA0220D4E377317F0F00D7831E3E41E9E_1727988124731_image.png) - +![](https://www.instantdb.com/img/emails/s_B8A06116D3803694CDA0C13F9F97E92EA0220D4E377317F0F00D7831E3E41E9E_1727988124731_image.png) A month after open sourcing we announced [our fundraising on Techcrunch](https://techcrunch.com/2024/10/02/instant-harkens-back-to-a-pre-google-firebase/). We’re honored to be backed by these fantastic technical angels. We now have an office in San Francisco and are actively hiring engineers. If you or someone you know are interested in building infrastructure to power applications of the future, check out our [hiring page](https://instantdb.com/hiring). **Clojure Conj 2024** -![](https://paper-attachments.dropboxusercontent.com/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1729123513053_image.png) - +![](https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1729123513053_image.png) Our very own Stopa (CTO of Instant), gave a talk about building Instant at [Clojure Conj](https://2024.clojure-conj.org/) last week! This is the oldest gathering of the Clojure community, which is the language Instant uses on the backend! During this talk Stopa discusses how Instant works under the hood. If you enjoyed reading [A Graph-Based Firebase](https://www.instantdb.com/essays/next_firebase), you’ll love watching this talk. Will follow-up next month when the video is ready! **Announcing $users table!** -![](https://paper-attachments.dropboxusercontent.com/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730244149277_users_table.png) +![](https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730244149277_users_table.png) With Instant, whether it’s magic codes, Google OAuth, or the Clerk integration, you can set up auth in a few minutes. But where did those users live? What if you wanted to query your users, or link them to objects? @@ -35,8 +32,7 @@ Well now you get a nifty `$users` table in the explorer to manage your users. Yo **Announcing queryOnce!** -![](https://paper-attachments.dropboxusercontent.com/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730244001267_image.png) - +![](https://www.instantdb.com/img/emails/s_DF8F10A9009F2A236BC7D07C4EC05DDA50E4FB82F40AA98593D3B98A1A7EA3DC_1730244001267_image.png) `useQuery` is great, but sometimes you just want to get a query…once. Well now you can via `queryOnce` @@ -52,6 +48,4 @@ Stay tuned :) We’re a team of 3 right now hacking away in our new San Francisco office and we’re looking to grow! If you’re interested in working on some of the hardest problems for modern app development drop us a line at founders@instantdb.com with a resume and a side project you’ve worked on (including a Github is a huge plus!) -![](https://pbs.twimg.com/media/GZd_xO0akAETvju?format=jpg&name=large) - - +![](https://pbs.twimg.com/media/GZd_xO0akAETvju?format=jpg\&name=large) diff --git a/client/www/_emails/replace-images/index.mjs b/client/www/_emails/replace-images/index.mjs new file mode 100644 index 000000000..7cdb7d754 --- /dev/null +++ b/client/www/_emails/replace-images/index.mjs @@ -0,0 +1,65 @@ +import { fileURLToPath } from 'url'; +import { dirname, resolve } from 'path'; +import { writeFile, readFile } from 'node:fs/promises'; +import { Readable } from 'node:stream'; +import { unified } from 'unified'; +import remarkParse from 'remark-parse'; +import remarkStringify from 'remark-stringify'; + +const scriptDir = dirname(fileURLToPath(import.meta.url)); + +// Resolve relative path +const relativePath = (path) => resolve(scriptDir, path); + +export async function replaceImages(markdown) { + const processor = unified() + .use(remarkParse) + .use(imgModifier) + .use(remarkStringify); + + const result = await processor.process(markdown); + return String(result); +} + +async function writeImage(href) { + const fileName = new URL(href).pathname; + console.log('downloading image', fileName); + const path = relativePath(`../../public/img/emails${fileName}`); + const response = await fetch(href); + const stream = Readable.fromWeb(response.body); + await writeFile(path, stream); + + return `https://www.instantdb.com/img/emails${fileName}`; +} + +function imgModifier() { + return async (tree) => { + const visit = async (node) => { + if (Array.isArray(node.children)) { + for (const child of node.children) { + await visit(child); + } + } + if ( + node.type === 'image' && + node.url?.startsWith('https://paper-attachments.dropboxusercontent.com') + ) { + const newUrl = await writeImage(node.url); + node.url = newUrl; + } + }; + await visit(tree); + }; +} + +export async function run(slug) { + const path = relativePath(`../markdown/${slug}.md`); + const markdown = await readFile(path); + const updatedMarkdown = await replaceImages(markdown); + await writeFile(path, updatedMarkdown); +} + +if (import.meta.url === `file://${process.argv[1]}`) { + const slug = process.argv[2]; + await run(slug); +} diff --git a/client/www/_emails/replace-images/package.json b/client/www/_emails/replace-images/package.json new file mode 100644 index 000000000..310c99457 --- /dev/null +++ b/client/www/_emails/replace-images/package.json @@ -0,0 +1,19 @@ +{ + "name": "replace-images", + "version": "1.0.0", + "description": "", + "main": "index.mjs", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "marked": "^4.0.12", + "remark": "^15.0.1", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.5" + } +} diff --git a/client/www/_emails/txt/nov2024.txt b/client/www/_emails/txt/nov2024.txt index 9d870c8c5..6f3aaf3c6 100644 --- a/client/www/_emails/txt/nov2024.txt +++ b/client/www/_emails/txt/nov2024.txt @@ -25,7 +25,7 @@ All user namespaces have default permissions of true. This makes it easy for get In last month’s edition we mentioned that Stopa (CTO of Instant) was giving a talk at Clojure Conj 2024. Super excited to share that the video has now been uploaded! -Following up from [A Graph-Based Firebase](https://www.instantdb.com/essays/next_firebase), Stopa discusses the common schleps developers face when building apps, and how Instant compresses them. [Give this a watch](https://youtu.be/6FikTQf8qho?feature=shared&t=8) if you’re interested in learning more about how Instant works under the hood! +Following up from [A Graph-Based Firebase](https://www.instantdb.com/essays/next_firebase), Stopa discusses the common schleps developers face when building apps, and how Instant compresses them. [Give this a watch](https://youtu.be/6FikTQf8qho?feature=shared\&t=8) if you’re interested in learning more about how Instant works under the hood! **What’s next?** diff --git a/client/www/pages/intern/emails/[slug].tsx b/client/www/pages/intern/emails/[slug].tsx index 9520445f0..fec2f59ea 100644 --- a/client/www/pages/intern/emails/[slug].tsx +++ b/client/www/pages/intern/emails/[slug].tsx @@ -17,7 +17,8 @@ const TextView = ({ textBody }: { textBody: string }) => { {textBody} - > ); -} - +}; -const HTMLView = ({ htmlBody }: { htmlBody: String }) => { +const HTMLView = ({ + htmlBody, + useLocalImages, +}: { + htmlBody: String; + useLocalImages: Boolean; +}) => { + const body = useLocalImages + ? htmlBody.replaceAll( + 'https://www.instantdb.com/img/emails', + 'http://localhost:3000/img/emails', + ) + : htmlBody; return ( <>
@@ -41,10 +53,19 @@ const HTMLView = ({ htmlBody }: { htmlBody: String }) => { />i*tSR50L8W z;eP4iW(eq8eUxegzPf+zH+^^D)(YTTltc^ei^5@jLst>lWy-lP@KNT42C~aRqij3A zQ0IMf4q`_fx*hrKjfUK~>hH{FwNoO1J!bxfak9r8 T97tYbN7qA#9bbu3@+QA?UO(dM^rxi5FdtK+Q(?!G}bUgV}LHB)Chf+vZvdA=5 z7LH>DF#3hhoy}5(?F^TZIAlzUV&PEqhV)077w%wWXH2D0kRY=QHn{mj_lp8fu!NCA zPAm<{*0gEdOrw+Y)sdsoAc*^rN$f7{*H#yiqHevz%J$Dnf33SYJIDg3?=jwx#uB1r zM_xyv3kZ(k+TADXYVgaFJw};XJ3e26d`TUt43Lp!zqeQV?Ntla2>NXI5)}K7c9cvS zv*;CxogQi06!G-a9$LN(#&;Eu>xN^X(FnRd@`8VR(z`JzjP(p8(?G%R#4j{T*h|WN z-qFC2yA+EI=EraQJx(_pVEJmH U@Kf8MBrw_c(0ujejl8UHs$ilWbbOYFn|#*o6is%Xf!<4_=F>RBjKaB!l!=W-HS& z5966)4_6~gN5TBJ_ilbPVOQ^II*lZHgo<%BeEDRj;ELdFy{CQa7DZYiGSBEnX^jdG zDQ(4EhK$U@K_bM0g5$)72nvzd!nn*mYTL%7+3c3@3BIa|jnRI|U%8MAdDP^SoYgt1 zUV2~xVF-IicJ?XCtbcR*>~Q*B$@2yu1&}nOJvJ9KHaAFBXGQWwu?r7OyRStEOg80q zcCzafDn|{*M^yIw4ws@Rk;V`qQV7{Ikr `V_K)%Qo44_BE?uifZy=jIgi>X_aWlU7pzZ*96) zjxH;{U-5Hbye8l7&8FNJ7XP*}DNu^{J+p%q&7> 9Y@lJR)p zHw)j7cwa*KXAuZ?h7yv{Ge>%`>c2ukZJsov_uOfyiIfJ@J`Ph3qdqgAZoZ0wzLb@> zKs>I#(|kGdmPzcY52j%N_)><~L4L97JImt?QV^b0v|BifE2)Lk8`V0j)cUH!&teZ! z1 L?#@O~(6VMi#8Sj5y@B5+tQ;74k3tujJA|?OXCkjgM)06L zjPjduRiHaPw_IDa-&t^#*j^E{SHF5^gVQF9{O#;+cSb&8Y2^!HK3d+5i9W$PkJh+2 z@?tA`gq5chVKO$~i>i=WBSXb!YNTvoQlDg=dh}$NebcuxEaUZo&4D@7r`#!7$is={ zFzcoTty9Pr2J~6W;$a^Qu9q`yCx8ByK{!`fy|(;3cyrz7uH;{B+D9mw#G%)dz(n)w z6+0IXC|GzJ@+fC=;;oe>O?8O*jjXUrxTis#aY|<0s`}fvf{%7P>RC>HPB^__lBq%H z)TCccBR`o<`MNUlNt9;w^pp~9c^4Hq(T1;%4g)O~xh{oi48!*^&%aRlUakP{QfcfE zmy%xforVMK5Vk#hcTFE|O);!@7RWS4pY)}$_ZX_9fr=*Ux+HYp{K?4qyr1L?{p=6K zTb$zRqr?$c -#iRJ-vW167g9^s=pKQz5un3{)gG` z{u1YE+x=yFiy8r6q|q5{Lti{uSM<9kdQ|d7q`wqa+T3&`cDwSN@t5eH(Q~lSN$s;A zl|$JuyW(bLAD1)sAw&8a99(1nx2$%u6Uramn%5|w3++|>mQP~ATlRnMO%rm4?cuNz zM56E6XO_y=(h^pq(TapcdCji{Huh3^MPs7=l)On-A4n>l_K9kOo|gg{q98No6v`nV ziZB;WhzBBKj8_1^E#;-hn7YEb%+yk&AI2$o>F6T17!&_w^f6k_ef@ndSR~Vfy=?(g z31%?Atx1^89 uyd3=vt-!>xje^=z_2D1rG@dcE zOvWF7fL$!8TqbJmik&F39OecQi4w2G ?~e!5TalkD)Tv`ZH`hfC zT-~48jun|MWtj#+LL)6jsmHR+{RkQS`0RsczEka~5R-H_Gc)6>Y=5idvaSW|U3T`= z+6#RzZu(r##!EU`LqUH wJteS+U8 z#(RtM0B_c)A1*aouZb(Wva!-|R0r@TyoO>$x987T<9Onc1!8wr)#bax_mxpTd;37Y z8%5ufIAfuWcoj+3cAG0!+;!CVCOSYUFYU)mtuc)>)5Yd1fcN+j(64un_zicT09GvM zlzT*QVtj&5;9}m1`3sN|*tB1F(Q*MrmE3z+arX@WjP;Y;T5{%VlPSo-m)lqS+?mIN zc$|$#+qqGqo5?0JMUTZU+e4^43om6$c3 3t%wm6luTj$HIQ^to8j$fxw~I6>v> zpZi3ek(FVOC*65mw%luB_jVrT%iZr}-pfWWPfI9S1KcXOzXJK}bUu1klnzcx!jInR z?epB-US?9e&406w$6{1F2;Zw&Q&@Uvzc??Xm2H5j>uB-YR0H^R8f}Z>I`DZ4c2Mgn zr2P?p>lNToFVh2=(m2r+$g*~`c+rwfY6~J4@#3?R9!qy?_n<1-9`0E9MZ)pkTGp!* zE=R(_LM3URoR$<$g2vRJn;47OCHX=WlHSmjVH~;@NTleXq;)iSiX*Hgn1JeEz0AvX zCha$a0V4n>4uehIro4y+V!8_ IYd76!|cmlU-8z9{tnkvLVvnk`b1% B}3&&I`DqJVvs% Qpy9^5)4+_VX_G3VwM zuaV~O#+=&xqjIdm9F(8D<&6hDQucg#9wK^1%WAGu*NDXk+hU)%Up%C|^Z9w)Fyd3z z4X#`8oMRYBd{HL3*R*tJZ{W-IYo? <48eYBf}&C|+v@76j!cFtRfgB{ ^@3_NYa5D=p2@1BDC{3TYYeH*goS$&Iw0Q1^ ztj@GcuV9Bv6FL>#q#t@~=;V7=VKvzHIS$CD$SoI7A=@yXe^^#}Y^erftpq)>_jx+h zh)4zF%yvE(o9_m$SpL{g8sf9cAwm!sT#vufu{%%O65cZ7^h#mH6wxSeD{DOIcQrZ( zB|ALA@ qHPcaPi&>Bv&>Z|MBQKXUb8jw@$CrdQ)SibmbaXc zC#l#uP=4zo7# )J=P<8%-ICaQO%#P4^j?lpT*k@z+q`emxr@xpzI zrAut3;xBjO6ep@xYF!0g8nQ2`IZkFvn~<^m3>q>)j0%iQZ0iyLE77VPhBr{ZD hyW-SI-)7aUJMws?p?b?oQ!wOd z!fNzRuHeQKg`C0$I%M+)S%0MGQmh9^uF?6p3R#+xvB>FHX~nIjZti6MT#d1MMp2 DC;X#_?!jK>eUz}W@&^bVnjVlWE7E|iS_{8=L-5Vd2w6H%T2O`>N`XAj B^e_maih1+!v34IwkZTAZZ#mC1*dkP4qMRqsJU)4Q5|nOXhPaQeQS z9LC2f5ceFN@OfQDOFZ*9{$;>MHqhde;Fj0NqKAK_{1szyi>-ze|Dx{5`M5Rn>h+4; z-L-NhSsyQ}{vlkq_NeuKx7Bnn^XQVPM#j@~MDV6Wqj{CM3lt^X*TSLGoEG;JV2?yi zdg-iyTeaM;uZyLA4>>N^R8~-)tnQxtW_{*$;iVVH!Njc26kln1r M23YyI0dOjU@nqJ%W`fRE^sdy-% z^%~Ve=fiIOR@5is60eDs@nAYrPMhIu1_xs!wHlnZP@4g-#{nweHV=nS!aEIEKSA@q zKoo9f`_g$WqS3G|`f`2?I>xf&Sm^(d(DXs5giw%wY&i~yAVEbrXBa_B9pHeWhktQq zZJzWm9yKq1?NLIFMQ8f2tL+(sAJ)RT=hKtW-Zf3%uKb0h*!QguH)7|u>r8$(b4#gL zT7&_wm4U#o04wM9lugD^7SI9fnp{WGif%-3{`c`{LNohg*!29&+{=1vxvFY4QeQ%C z^EA;7X2q3{e2Rg9bk`GDY+OF;fUEkfN@NV+X`Z>(sZ}tGU*H{TYW-+j rFIdB#s1!5ClI}y{n z2N`61M2<#P6;*AA+|JRiE7Hc|$K!SdUaL(Tfhf0m?9Jd|Qa^q>nTDOeB^3pXyed$w zh(UBuAG$)CuK2i2uwwYxE$s4!wJgPf^*c2Rg>lATd6;}IQ9u)-Hs*dkk$E4R)EpQ% z0n}O?ZSOa@-Id3;MSE|m;>X{*VE!!A@tV1+30wXVhkmo<@I)>Va`6=-%-41ATg{Rb zh@<{~w)>PX)hn}UDQVr6P~^kglYZ>_DFv`{8g}8}xJMq#3fJo)vpx1WMpEn-?9}>o zJ5nHRja$Em3%^5D9Jnv1i7?}8&w?~Ht@?MVo&l>mJ`l1{$5?5zF #U$vt?dgPWugz_DCk z-fJNB^x@p#A>q1qP*d-Am;5v0U)19=5H+xFA>ZV|s2REy1N~rt`EBZGjS-Ng5zCEQ z(e {vQUgnUKEEa)y|@ZzPV@SaK#o&33;Me4(t z6uka31mn5z5%kapC`(ZM<27A_mHc9}{8c1sLHj<+1E0GyUcN+Nk!Cb)Grd2^x)3kJ z#`y`koUJy--ZQs)3@Bm;4PY$ABR@8)quTcd(X>|wt{AzzBXcZf%5YbX2*6(Sd$@z1 z?l5iWYIX5VFMi|JUOMT4czVFRGXC;ZWmU?>xz{G%Sfq=d7b!A)g)-bkJzPdfY6P8) zhKR;LdkMNsr$I&slzi0*DlI_^J>qfJK90#g&^~U>aM8$$P1Lr4{R*0HU~Ut&Sq4 zz >{WiuIBEOoH!MsgWNDZ8rcDQ?P`q4V66GU2$+e7s#InZ{tt^qH2 zv%`Icmh)8j<2!RsFJroDz~QxV?aJs;Gj47Bp>Tn?p{?mE!DHbQmvSNJ%$t1^c7Ac) z&feQ2Ca0}otvcHVcQ&@ImC!*~3NRUdmy
yXaoP}8o4o=?Kn7T=ZAQm=lC zX;1@()V`Tv8vS>Q#(zn}c0uA^znK5QWz93<{^5+FK4{)i(;mBX-eFk%n6EHHu5@Cn z=WngWNLDfa=HPr`V@}0@P2N7{F%L_rvSXv|y06uzUwkpHv;DI%zviun^_|Rr2go6& z=iV|5e%6#uNx*lK@y}8l Rh|ljN}MIjToNRZKZ#C$8C> &Z@+KxSlJB%{}t-$?xf`=+IY-~#abtxQtJVXS=I%y@@xgHjo`l>|eggenpA z$e-0zPu>=mm+F{j1+&IgihPg8cf---x-SL#fVGy)WK-s{bT$l!9{4$+IA7emZf*2W z$rY(3n-=QkD7}x`Gw^D#(>*%u8j2#x3oc5&FmmG;{ZRCpow(mHxc~f-Q~AO@Hl}%| z&1wi<348I{Ic$piSxo2@m-d?+Qv63x(AD}Oo%v>RrOak#%y{2zWZpq+!W#E>(@E`4 zGg+zizm?VMq#rb&4s%{ZNPb>zaQe-l=%R>$9-Wq+9Dxwlgn|KE)4=x{ywR?%!h$=x zfjagR&Lun8#jn*IptAdX%tGQHo?p*NTKy`;sd4f*0!D2ym%TTM|9rt!O;RT!@&0X} zZ}sj_#?hNl+gCl>KNQXW#bnNZLP<)NK7F^MLZ^M_gIjOl#;RDZ-CJKn9V0Q&pjF^8 zzpKN1L4ChM{Z<09 eC_OOOL` ^s{@AVr7#7@R(~<++ zt^@AB%Bi;~X#IrEtC~q;wMFsEK(Xu=OUS9@)<2jAnIe>aGm@ub46^^=BEpXtIyIeG zBLdl17A0gB?sh|e4Ou44NPOv6Fw{+1?(a!6%7I_2t!@#?@(lJf!c%5Sj@}sRP1Zl* zmH%j6HcktwBK^S3E!~8*F^iT*TExf_L#+@<+sVl+_qdD$y+IphIrIR}6Lb+@7dogn z`5`uaXd))G=-Zp_I=jQ)Dv;YZ5GH$1>+*9%CWUxYyx(Ri_kBIwz9?Y(```xr>0Dw!f$!NsQ7f0Zg2>yMZiY;OgQ0LtJ*f7S*Vy zdh$cDIfAwytu>#&oSH2s9!B~cwK(2Sdn$s6qTZPLaJKHTcoocfKN=x62jw(7Tk-pf zf*{H(Yik@gUVA=K#PoIn{9^jd7d72Wj6_cZEht%|($?GD8aovtnjs}2vx3&AuLc)@ zt#`AK7^&G#=F>Fju}zSj^^6xB^Y&+@(Q|a9*B{?=vVz*4%>I9IaP |8SsUHtG24rbnR{RiB#h@Ji~D=mecgZ5;q-Okms0c!L@OIf;SsChH36%HAY`g z{?IIrHg?o@EorT3_Dt(96885WA;xP)-Q&n}jTzy?QO}6D$0kaO?^EGJAo7f$ys+!> zhbJ%+6Hrym>}l7u`dM+yl|k*XiEdiOw@JfvfEN&vx+?E-noqxGoOPkLKXv }T{W6vEJY<3 BDIS<}GQdF$hkzIBD@ zQ%!hZDwL0XCb%zqNWPVPmK4OV5a?7Gmg-3{A7+zFp|xoF<%{Q&wL+CWVFbF9!6#*U zG_i)?jzY|E3b#3vo+@nvdC`qYl`jHyPin%pUvp?R=j_-4ACTu-SwjrnB^*}tRj@FJ z$*{`7T7EZJ=%~IRd{N8Z$XR{X(P$KAT&P}pB_0)q_9uFNetdABE)8a)XBmZ$WBB~5 zuGKwx8N;?}&_9J?ZJu-}CpSa92PJ1~JEIrZcp=l`vHQDU8Ou1{fD0pTF{^+6V1k0- zHogy=TWLh>!P{+}?XG4kkM;9>7x)|e;Ds0eaTn;u>*jjLa)t+1gV0+dH1uV$)Lgt} zGXrOp4$)#a&rDBWa>9%_@gGshd{!$h#OisInd!;%s#H^*RcXx8mgP-(M^%YF%NsL9 zcb)-2?n@%t8YV}={7GNQ6&YpBOI}5ot FpfL-lsRd?b`$SoS; mjLMS_(% z!_QYIr}>A|3*Nl7Iw&5UGRtZ V*1uwm zdTaq>`t@?#=xjE?s0TJd2q)K$p4B&Na_pH?>(8GoXDyy5ua%b}MP_7+k8LVk?EJoS z8F=+?ZsR}XBom?EZ>(n6Iluf2lZ%O}ax+k1Q?m4RB@PIXQ0-0eJHuY3K5*2)6OFj4 zDfe CFB1+d3TJTwnR+lnt _TV~3%L z;w=EY?m&@`Jkeg&^-s&7T#I0TJ@U!3W7%gr13J0-e#B}-gp>*TiJx3l8+8=MX#rgl zDl UX$45+xpDheeM9p@Gl zK(VlX=a!dxf5^)!1-isl`G#l->vsL!K|)>! zmolKOk}%BtZ@d`Bl>h=@TuwJ0JqXL`)#$H&&C0Rz({3j{QkyePF&FLjT>{sqyx$5_ zKSbTO>9^kqs|nE)DOX7>Y6Qc_uxChOvF9dU?e#D*Nonx-l-)D->~0tlC9unzi Fg;r5egJHXHIv@o%^VoDzc%=ei|}4rxcy`7Msm M&n<9(LS39dypvdbSHZxp-i OHxMN;* z@D~i^8{=-78*JhPoccCPJ*SM!^AZa+Decz8^TwNnLwjP@v^!Ikvon38Nkt>oz;hK+ zzOlL^&+9&}OuR&zgs19?C9)>u3sg<}-zMQLpJ!sWlk~i2%KffDl)zS^=bs#{b_RI% zQu_xI&?NQSJ}Yl2WYZPdj5PJ0Pbh^s-vXF6zjpSogBl!;gOX}g*&{xTITfV4QXwd~ z?50mst`p1qrg`$JCGP52s|#9x>k3h1sue Ugic zp^;*H_n}{-g>J<5;8sTdQW0PF4g&lb)h7+o5@D1_Nni#h6iNDQqm-n2lQ^_;mR5*6 z3(_4M1y)y6NI^%ijZz?l*HhuO{D`zFNZ*Ktqk^w2#t2?qbaEe@>H@TkfSnj|x3Plf zO}%ew97n{ D>z~-aV-AULmR6wx_=qw&J}CoSa3IXtz4^j_o0JG^Ax@JxI+?z^Yzq zcAHe=kXQ{m*6%@i;!jupMgDn?5skN8@eO8KccuUV3>D=U23zYefFsg}ty$mmj%>s^ zE$pO!Ar|)HMV^4^CV$EOR2mxH%kP{Uob$D3{LR-JGWWoCzD_0?k(y;AS0BedZ#fZh zmXqPfve273_`=n9>9U8PFdEU 95Fbf_YCi!%B(}IiJSTRTlc+deZ|Gb#0ynG}+g4Y(b^%mGM5kzG-Bx|8EvELns z_YBIrkmkmc=*os}TQ(aX6=4T7U673v~>aQf2R!hvhqQ?Hmd8B&N+%`Wdhb)aqGsIZOj znt})RYjlVRI#1G^7I`h8gGZ$S*oG;O1tx=>+iIApZ(tPBUu-;U0Os@W@#b;76unDP zY~n`ptzvEIyYE%@61HLWv)4voj>`k!^Czx4+WW|)f;&0sG)?W9lV;VQX8!ZmI&Wq| zGy(qhPL>)zwS@z^ZuT3j-}7|@JHn$?irmDA_rPo{kb7rd4dbsxJv~`ZoeT}jp~%?! z8-zxyc4nhXFEEA{5g vZC8wL?MJ_oyJxa|{xxIEQqSI^L4w>mu=hlaeevUWb`q6)1EDu!1}n#xfa0 -Cp3E)$V3BJ_^2-r6IlW&>zJE )?RJ?{AzYGsrA-O zzRSbV$kMq!TPqY?9RM%X2x2chC~S?*2>)>1r|4Uy?m59}v_~ZO2@zf UiISd@v@alhh>4Q9f z?NHkfw`itypm<|g`5FPQk>#%?43?6~dHaVK=H?Uj!fmBxwCN5x*W~Z&HS|5@#u0#n z&3|lgIlgsQ)1dNzk{ekf*kmOPEq6s*N;xJQtdMb!$*OZB1rY&G9P^&wQszgg{;y(< zU3L}G$!0G-R1KPuG9dCt%rhVW-?F%PwwGoAcF=UjIJmb*@%prB&g6&zGC(TOga>Xm6*ik zFB(zq37zLnc=IGjL@D{8!k|HsTA=RPnL-j)CMzx;8bpEtF-L6U=uf$aEx&t<8I5n( zN3qqMTKmm-RXv65b?7RF<;&|or5iekVv}JvMY~U?mCWALtCy}X>d}__o`d`JVu@d5 zQX=OiNmFllUf$EK16TpYc=o%(#mttzRbxpWt!LHT+wqS&_CZUx=IeTa*24X?mnl|- z!Jf{7 19c>+BH0WuRvtq3h~=dWbFlp1`>Taks8Zy;ScaVPG18NHU^b*sW8t6(+HdM zaF>F7J*vC7ni} kn+}TWj%8zJxX+WZ0}b* z#lfa^#m>_XLsTsD6eVvt_&nk_My#R#p6A!p!Ohx?-&wEfj%%mLsJx->x2psf(1O0y z0e3 f{6m}DY2vh*^3`(z S}KVDh=$r -*hv=611}C*A3F6fS4j%ru!MKZH!MSvjG0n(D#PGHo#Q9{k#!Ibp)gq} zX}Q>9`GPfw{i5+Eqor3Rx7wi5G-a7toU6w}RppS7|3_p7ZQskZUO^uPvoMYV*vv7O z;rKuokj(aM+k?#36Sjt1U4mED*BQ*l=g)hxFESDAV_Sp8CVc oO0 zrH|p-@DbrlvVt_%DhujDK~Tl*UVY{a#HGT^a}&s;sJdQWy?i~{Kk0zUWBY0Nlx+8N z6y$TW230EQO+kUkc|W+!9mTo3-mUJklhvBe#KtKIgn<+L_xF#n^m4QV%e~K8Gmc9N zo=4S{Q~NLHL0AK`cDcVJv1*)6NlXamd8B+)t5m{phPij#@0< zdawXoL{|cd=H@2VL#Qa-M9MYaf1&U~9G?}4EnM+(&VJHTC}f;Xq@M3G lGqIxZ6EPRd=&NiRaY*e5?u_VH|YwslZNrL!(~}!L49A+x!%Pg`yPvg zeYHLOS+x^tx@E~w6O)*4pA*y!vJ7k4bjTAKTb7(rI%8RTlA21=df7c(8=#(i$yi~^ z^ VVjJ U!y}o%so=V<7PmzcHR_SUA#bTjU z8um&-p>f!)1-)w7`cn%Nk1Rft# 1Rpja=+ljfd4=vsAEho5a8gJMuli7fWf<-?x%D2HefqQ zo_|PEgyvN0%PC2T9Wy2pH9yYLETH^qu~8PuP|AMm!~KXavU->8-2|R7(yehKy@YfB zeISjUb;bBsR);*JrL%ngh2545=R{`x=lY0nHqCcS-R9O%XF*8{c1tF>xcgL{LJIj0 zJKvH?m@F@=$#x-mQl*?mDC0Ej_itGYfw3|tM<~&_=KFuY3*e4*Y$gqdq&fHBpiASA zv~|ILCM5C9|HX7PrnYE>lUs{tfi+ukv**x~E@OW)8;i)UK3uO!M;FqKV$@bsEYdbI zrWM`B^=aZaVL?J`<8f^A{?T-2>tRfphW8dj %0ouVjiX|r6|vM8RvZ;y@dwpf>#GVD7~A{ zVUzqt!-CjVd>nwTv~7M$J}5<9oB!JUR67@Z=1`R7LtVxBbkM^`CO;tl*XBH4A06|? z@>8SZXrrci50V%gc}`k~*`0zEUO?m5XE@ux5>=KIaO@_uK4?S-j1^%)2R)E)+c7ny z+0mqeQ Be *v71|eM-7TdBUsT~mD(87q-AtGat!=1~GBO=PmVDn7 zD$KkPPSW)Z<5|OH%A~;tq>+!%H%m5--A26G?J6?5gZD3P7FZ!j(!IXzXcmXr(mV3- z(@~*xcA2`~$KCzToa_L%6u8egGZQ(^B}-{YUYG njQVa{8q8+2Cs)6{`b!s$_tA8qexKTmd3oqur0BIJuJXhr;46Q-d(^@O+D}E_ zS=E4HL>H3ph43>?=ewK;{#jC@KG%U_Eu2|7ll^dfd>MnL??y{bQ6j7nY{46>vk4^v zCmgZlmnejhNwppq)UHKO O*{M-Bg#)D+X^Lv|r&=Pz zT~=GO28tA1p=9K`H+$7lt-(DyenAWmB<#(L4EvHi03m_C@g+7fJL2TUb1?3A3Ok+$ zf~b?J dGF{QGmvlEoyyp4|c$ z9*y$WgnoiH2;p=+ib%NR_SextYs$4FG=_D_%*MWR(3wAs<48X*LzK 2Lh(1I_l8I zo394nzTS|_g&B5F1uq8;Xd4xFMzbnhmJw8Pa@&38AXREt4sfV)+gQWy;ltoGxvP5l zW94m ;I}SZ<7KaBby}r-_FdrW?k xiXxiza7$XFwmxm7-sHRa8ojMM5jDNW`PcOqGGVe1Q@OY+9LA ztPQ&z$(Z$0x|wbg66UeaZ(3Xglpkr^uCYESvvL*6=q}zTT7ji%VC7X{!;de|&0V%G^Z?V+G_QAmttL=(b9C}0;YW7N{+GcV9 z7g{PaK&n~6{JHMO>z%h0!}2VlKOINsqvgp3wC(U5A-d>;N?7;Awof)Hq?lCgVNTo8 z`nG~FuZXhUyotushy{hB+ij)x`~(C{2sJxgpOMi_Bopfx!K5@G{3b%j(;9 uVul4M;YuW=}WcLODd40-1@dc|zR@=O24%v%~0^DN;O~hkb2r-dfVM9PQ_9 z*2ze_!MHf8DocIrG@K&C;u7?S4fS><9gS6ljG3F$pEc0Ih^O-^@Z*x?KnnuA=fX~S zFON%9h`syPcvi5#WNi0~OxbS5Gu+tUA{0SYXWm#AfN7`h3=6Mv(&U!xmO*!Q_ =}w;=sQz5B8<*K^lIWv5V9Q*p}&9@BrSOp`q@ z@4ew4PJ2)>I@AXKDV+L mwT#5vjb_0!8n|iH KVBokCITV$pxb+e(8sX3G$3n^cVU8FZRPHMh_dNv)fQ&$ zb(aX>Xb|gl<(4~N?rDjy2#By?)}ov0GN<5Qw*hDzG?pxCJS(U^Xbi?yV?pT`6I&_( z&rj(yZ4ENyWx$7Z``6839fINTZwX6*xv&4Ztv5LaMci7fTa9E%EZ50r*+ hL zKGZ1TVV2Pbr MJ1>aObA_ zolocBhEj?jpBNkgR&}Zg=iodC_6A!9?nTYS5g6WYV3-b>Np-wW+6?)g=$@nuuoCu) zt-HLWt-5s6rTkz&e{FE=|B%qLs=sx{MeY95Of7Q~*4L7>v(P%51kLc@Z>efuVEgEe zsYlx|&InHJTF>2GRO2_A?~XHp;pMF1u-&F-8s)bX{Wdt=Wg!$qU Z#(m!IJA%zI)hQVhCulyd|)w@mhOfOIz`PTyOrhm<`Vr*thI}8phFRpY}xW z*n=pe328H3a^M#sv5>iIZ8P?PFVazYB13N_o+UzVsJOh`$pa4#$@*hhE}k@ksF~w^ zWQ#Lv{b|0Rf@rXMYdH2suhDpC->n{+lt{T+oyuB%P|%MgR=lu)jMg4bIX~H_G@Kx} z*PQWn!O&Uzs_y^q*KD+5(^p*kwY$vTg$RPhffXvzktqJgUJso@3Jp%$__JfA4DH~) z)01fJWnM17G`&l@vzd|0ER@qAx5)+Ob~is8WS?f^Tq6jEJukIyZ5%?JgXhZabMJvv zK*$PW7??AEH?l?E2Dcn{X&Ppp-+f`Yd*U>)P&(E>VvlCS! -Kc& zXsNU{C1|lS0ay`N&L^l&!r-&Z^dQM*X0yOnq?fQjrNQY;jc+wvqHam?f3f$LQBkjN z*eIm}79mmsf^>&~bSl!)-QCjNAt4|QQqtYs-3& _*O;V^3kWUZZc!4_t(j*H173N(Bq4{yr0mmpm2R#=Y$yUuJA^dSoP8 zLG9~ecH(jD?(n-VLDJH^Mb>PgQAsSMj+|YNad9wr($v9r$cjCs$|bk|ba|b;+ZFS! zs-Ec}5xL6M_|$sA@4om}i}q9I&3N`8R8;=8v4vj&535>x?O=aSx!^9A=~_iKYmExc z7qPvwXO)6<*#=9Q`*=Ssp9NcrOkC&RE(TgF9N&2U1*-wprS! cTZCEL zc3bIh&gHzY*Sx@a&H0t<8h;WyriJ>pAn17wM$?^q&fdcIu$`VnaG|}LQqor?K6$>W ztu*SV_YbGJLZ{MX6&>Bg2iW%nB^}i|8m?GP>-ntQaz9iycURHhFThzE>S!DmGTdYG z*fj6{9z-27uaPM4U;KW|%{b0`xow5^wD8099pR=soo6B^+khhN>L7dW^xW0MS)*9f z(wnKzvvQdeFSk{j26sbwN*V%wR}FeLCz$K~slM1EuMjLH*cP*lq5%b(-4AC0-^C~; zx$G-9iU?v&*rInKGmEnkou0@No(SygR{e{H$2Fn1Yv-pmm(nmqBlz=Fy0vAuz;V_+ zGSSgXsVC9~7Irgv=V7&a_AFtz{7+V4ehuabG<#n(L&_jte~38$hmZytOi}BPhxxak z`S;)dzoORvFL3ss{qX-~y}9{rloQEn&kf7aTZ>of0sn9vz|+@ofW&@Ho!obLkeMnZ zVPxWD;$`M#Vw>R_nOo#yEO*nlbCPhjX%uO? rsF47(2tX5{{kDvk3IbIyw&*3xQQDaE<82E9fu>Y;KU(>xxR=Wf$9dR*6 zvVTLH_;NH@rYJtoIy%dTG2ieqa`mCI *AQ)P`cb=BJ>bn8HcI6SEBM zKfSg!zr0A|u)U$F(d`OWsW3b}KMxNL-PCn+Yb>eAJG6Cjif?OlJ{Dg2xieFN<>Klp zA|mqW(W3&3iQHGXxMfrNcQ= 5KR#yu|WqUqs(1o;y!j zI2Xm?(d-6J(%!q~yND5V;>|e8F2&fv7jKF1UdbvmHR_%f&Y)sO(X^Rv=fFAP6XLEV zWMwSN^SvEcrBkbxNPBi^LgVUx81&HZz8U&5k+I%4U+5vF$Cqj3st-M$H6LtK3hMe5 z7spa4 eO8$1M zF-i6;Vrh=mXiRDDLqM7U(hV9lcAKLQ9>1LbO?d9qib(hw J>hT(6^T){%r2?h#snmj1vzqN7#5FyyYzF~IBTqC) z7BW$Ry)p^NhaJzj<^i2$(R>WD@oRM;&Z=_c!;^~@vGDH)t;gl7l2~!mlhrH%XN#G5 zN};)5tBU%W75fGaU$DMiWt$FrQPO+;(CQ$yCd}F4-!saR+&YfB6vGjm;DNz>2WD@M z1inwLJ@SfYyRd@y7*IX|f1vqltDuitkFLmRB|?Prs 1j~MsGlDRMASbr zj+%hv-KuJ0_0IP1wi~?%5b=jxrWt}{9t -Qrap>9e%ALbqOUH&D?lq=I1a?39ZaVljDw&6)nrQ4xa?RT_ zZk#P;g3>TQua*&5XxIyvWSDmjewd~vVD)t~Fvt8&ZDDSnu3#y|I<4=8zxF@z&apt4 z)DI^v3K?*QZZUocLX3F#8;_syoP1J^I}VdIla=&teY5*<873tFq)@tG1WtfX4T1pO ziGd%ZMG9|j#qX%(^2ZrWAS`)#hFL4yyKe|)zIDdLC`iAr$(wSg(`k@pce!@b_k(xu zZCTT=X4H4z9ES1z?(g>Rhd8bQnG%9AF6s0AlKX9E?Fofm5wa4B>6W8*sia3WQ05tH z^C&06#cetn9k>Ivwe^!R>3dKTayxHW)UZ|A_^zu_QEs0W(_j2f=~D(&k-32@QMIW& zo`anp+TX3|H_z5I7qRrD)5J>rAx_PIh8_%tUdc&-LJo%Rj`5>YUk;Xjm1(gfpNdWl zYKtte+kb$q{u#&tMYUD$yRCDrJpq)D`x R5IZm2tTw{gF3rySqe&FqN z5AWGwxM!nHz8^`9D=cM-7N$t1A%eD7zg-OEMXtqb`x_#CvIGHUN_!;z{TeA|Dn`Yc z{9J)n?Pnd=yxJP8zH+h&edxS%l3Wg8k R_CtqvYyTD7w!Yz55xnz z0&ozkQsJs1uc;>or*5*p>Hl}DSi%G6PYsSi5`+lZ?C=T7`?sS`ey>8$2aR}-3HF^H zUFM|JS0rJ@e5CgPn=orn9wsaGvXkV2=sQ-Mc)wR|Fs3Sz!?ex{QQCDcDB?R0yAtNj zWb>b&1O5r$-5Ps~^Q=jZC{+bT5k$=cW`NcST`kKlUmo17Os9UEK_X4tko>K6vy2Tr zTK#6kF(<;kj1C=NxV3D!Uyf^G)Vqunrymhd9GoBP*qLg%t8zOH(Yn!PIFU`!FO}rJ zVx=^VompCfi=Z{+6a56)uN@