From ed0bea6528e92cc1647dc738d12c5f11e165b6e1 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Tue, 19 Dec 2023 16:14:21 -0500 Subject: [PATCH] use renewal template if applicable --- sponsors/contracts.py | 7 +- sponsors/tests/test_contracts.py | 23 ++-- .../admin/contracts/renewal-agreement.md | 115 ++++++++++++++++++ .../admin/renewal-contract-template.docx | Bin 9323 -> 0 bytes 4 files changed, 135 insertions(+), 10 deletions(-) create mode 100644 templates/sponsors/admin/contracts/renewal-agreement.md delete mode 100644 templates/sponsors/admin/renewal-contract-template.docx diff --git a/sponsors/contracts.py b/sponsors/contracts.py index 7bc9099b3..9402b5e09 100644 --- a/sponsors/contracts.py +++ b/sponsors/contracts.py @@ -33,11 +33,16 @@ def _contract_context(contract, **context): "legal_clauses": _clean_split(contract.legal_clauses.raw), } ) + previous_effective = contract.sponsorship.previous_effective_date + context["previous_effective"] = previous_effective if previous_effective else "UNKNOWN" + context["previous_effective_english_suffix"] = format(previous_effective, "S") if previous_effective else "UNKNOWN" return context def render_markdown_from_template(contract, **context): template = "sponsors/admin/contracts/sponsorship-agreement.md" + if contract.sponsorship.renewal: + template = "sponsors/admin/contracts/renewal-agreement.md" context = _contract_context(contract, **context) return render_to_string(template, context) @@ -66,7 +71,7 @@ def render_contract_to_docx_response(request, contract, **context): ) response[ "Content-Disposition" - ] = f"attachment; filename=sponsorship-contract-{contract.sponsorship.sponsor.name.replace(' ', '-')}.docx" + ] = f"attachment; filename={'sponsorship-renewal' if contract.sponsorship.renewal else 'sponsorship-contract'}-{contract.sponsorship.sponsor.name.replace(' ', '-')}.docx" return response diff --git a/sponsors/tests/test_contracts.py b/sponsors/tests/test_contracts.py index c41b048fb..c330c13a8 100644 --- a/sponsors/tests/test_contracts.py +++ b/sponsors/tests/test_contracts.py @@ -12,19 +12,11 @@ class TestRenderContract(TestCase): def setUp(self): self.contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today()) - self.context = { - "contract": self.contract, - "start_date": self.contract.sponsorship.start_date, - "start_day_english_suffix": format(self.contract.sponsorship.start_date, "S"), - "sponsor": self.contract.sponsorship.sponsor, - "sponsorship": self.contract.sponsorship, - "benefits": [], - "legal_clauses": [], - } # DOCX unit test def test_render_response_with_docx_attachment(self): request = Mock(HttpRequest) + self.contract.sponsorship.renewal = False response = render_contract_to_docx_response(request, self.contract) self.assertEqual(response.get("Content-Disposition"), "attachment; filename=sponsorship-contract-Sponsor.docx") @@ -32,3 +24,16 @@ def test_render_response_with_docx_attachment(self): response.get("Content-Type"), "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ) + + + # DOCX unit test + def test_render_renewal_response_with_docx_attachment(self): + request = Mock(HttpRequest) + self.contract.sponsorship.renewal = True + response = render_contract_to_docx_response(request, self.contract) + + self.assertEqual(response.get("Content-Disposition"), "attachment; filename=sponsorship-renewal-Sponsor.docx") + self.assertEqual( + response.get("Content-Type"), + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) diff --git a/templates/sponsors/admin/contracts/renewal-agreement.md b/templates/sponsors/admin/contracts/renewal-agreement.md new file mode 100644 index 000000000..e28bc9178 --- /dev/null +++ b/templates/sponsors/admin/contracts/renewal-agreement.md @@ -0,0 +1,115 @@ +--- +title: SPONSORSHIP AGREEMENT RENEWAL +geometry: +- margin=1.25in +font-size: 12pt +pagestyle: empty +--- + +**THIS SPONSORSHIP AGREEMENT RENEWAL** (the **"Agreement"**) +is entered into and made effective as of the +{{start_date|date:"j"}}{{start_day_english_suffix}} of {{start_date|date:"F Y"}} +(the **"Effective Date"**), +by and between the **Python Software Foundation** (the **"PSF"**), +a Delaware nonprofit corporation, +and **{{sponsor.name|upper}}** (**"Sponsor"**), +a {{sponsor.state}} corporation. +Each of the PSF and Sponsor are hereinafter sometimes individually +referred to as a **"Party"** and collectively as the **"Parties"**. + +## RECITALS + +**WHEREAS**, the PSF is a tax-exempt charitable organization (EIN 04-3594598) +whose mission is to promote, protect, and advance the Python programming language, +and to support and facilitate the growth of a diverse +and international community of Python programmers (the **"Programs"**); + +**WHEREAS**, Sponsor and the PSF previously entered into a Sponsorship Agreement +with the effective date of the +{{ previous_effective|date:"j" }}{{ previous_effective_english_suffix }} of {{ previous_effective|date:"F Y" }} +and a term of one year (the “Sponsorship Agreement”). + +**WHEREAS**, Sponsor wishes to renew its support the Programs by making a contribution to the PSF. + +## AGREEMENT + +**NOW, THEREFORE**, in consideration of the foregoing and the mutual covenants contained herein, and for other good and valuable consideration, the receipt and sufficiency of which are hereby acknowledged, the Parties hereto agree to extend and amend the Sponsorship Agreement as follows: + +1. [**Replacement of the Exhibit**]{.underline} Exhibit A to the Sponsorship Agreement is replaced with Exhibit A below. + +1. [**Renewal**]{.underline} Approval and incorporation of this new exhibit with the previous Sponsor Benefits shall be considered written notice by Sponsor to the PSF that you wish to continue the terms of the Sponsorship Agreement for an additional year and to contribute the new Sponsorship Payment specified in Exhibit A, beginning on the Effective Date, as contemplated by Section 6 of the Sponsorship Agreement. + +  + + +### \[Signature Page Follows\] + +::: {.page-break} +\newpage +::: + +## SPONSORSHIP AGREEMENT RENEWAL + +**IN WITNESS WHEREOF**, the Parties hereto have duly executed this **Sponsorship Agreement Renewal** as of the **Effective Date**. + +  + +**PSF**: +**PYTHON SOFTWARE FOUNDATION**, +a Delaware non profit corporation + +  + +By:        ________________________________ +Name:   Loren Crary +Title:     Director of Resource Development + +  + +  + +**SPONSOR**: +**{{sponsor.name|upper}}**, +a {{sponsor.state}} entity + +  + +By:        ________________________________ +Name:   ________________________________ +Title:     ________________________________ + +::: {.page-break} +\newpage +::: + +## SPONSORSHIP AGREEMENT RENEWAL + +### EXHIBIT A + +1. [**Sponsorship**]{.underline} During the Term of this Agreement, in return for the Sponsorship Payment, the PSF agrees to identify and acknowledge Sponsor as a {{sponsorship.year}} {{sponsorship.level_name}} Sponsor of the Programs and of the PSF, in accordance with the United States Internal Revenue Service guidance applicable to qualified sponsorship payments. + + Acknowledgments of appreciation for the Sponsorship Payment may identify and briefly describe Sponsor and its products or product lines in neutral terms and may include Sponsor’s name, logo, well-established slogan, locations, telephone numbers, or website addresses, but such acknowledgments shall not include (a) comparative or qualitative descriptions of Sponsor’s products, services, or facilities; (b) price information or other indications of savings or value associated with Sponsor’s products or services; (c) a call to action; (d) an endorsement; or (e) an inducement to buy, sell, or use Sponsor’s products or services. Any such acknowledgments will be created, or subject to prior review and approval, by the PSF. + + The PSF’s acknowledgment may include the following: + + - [**Display of Logo**]{.underline} The PSF will display Sponsor’s logo and other agreed-upon identifying information on www.python.org, and on any marketing and promotional media made by the PSF in connection with the Programs, solely for the purpose of acknowledging Sponsor as a sponsor of the Programs in a manner (placement, form, content, etc.) reasonably determined by the PSF in its sole discretion. Sponsor agrees to provide all the necessary content and materials for use in connection with such display. + + - Additional acknowledgment as provided in Sponsor Benefits. + +1. [**Sponsorship Payment**]{.underline} The amount of Sponsorship Payment shall be {{sponsorship.verbose_sponsorship_fee|title}} USD ($ {{sponsorship.sponsorship_fee}}). The Sponsorship Payment is due within thirty (30) days of the Effective Date. To the extent that any portion of a payment under this section would not (if made as a Separate payment) be deemed a qualified sponsorship payment under IRC § 513(i), such portion shall be deemed and treated as separate from the qualified sponsorship payment. + +1. [**Receipt of Payment**]{.underline} Sponsor must submit full payment in order to secure Sponsor Benefits. + +1. [**Refunds**]{.underline} The PSF does not offer refunds for sponsorships. The PSF may cancel the event(s) or any part thereof. In that event, the PSF shall determine and refund to Sponsor the proportionate share of the balance of the aggregate Sponsorship fees applicable to event(s) received which remain after deducting all expenses incurred by the PSF. + +1. [**Sponsor Benefits**]{.underline} Sponsor Benefits per the Agreement are: + + 1. Acknowledgement as described under "Sponsorship" above. + +{%for benefit in benefits%} 1. {{benefit}} +{%endfor%} + +{%if legal_clauses%}1. Legal Clauses. Related legal clauses are: + +{%for clause in legal_clauses%} 1. {{clause}} +{%endfor%}{%endif%} diff --git a/templates/sponsors/admin/renewal-contract-template.docx b/templates/sponsors/admin/renewal-contract-template.docx deleted file mode 100644 index 3e36801a316f85a4a0484c7b4ed1a227a9fb4285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9323 zcma)C1yozxwhiuu;_hDD-QC@3X>kg{f;$us?iBY@+@-j?OM&99#hre*|Gj^E@Bi

E*dJc2N$B6)ouG z9`pTi^LMS+F(X$}pO!fCS%)GHDHfE_P zwo<{g1{v?72%Hcn)>l~Kj9?t8hEbv#4;H(Maj}Ht@t0N;^&6Lc$WeLQ)K8pG*f@u9 zgmjfR=j4@pYYtlzr%>wz>w2J-<$MzQ6id_$tl7*FbVYP15c5C>(H7a5=utC~F;Hwx z`Ypxb(jNCYq$`INWBLk>)jl!LJtE@}1^QEPM}49jd2MJI+fQ62@oOkVDU~~wX z@jZ!VO56~JpGAv{UYasY6%fWPR?H?n_Epz49P%I;y~GN0a~B?4G5j;aTs$`{cEN;E z8Z?0`g(=+}?*dODU2mdomKoO>;?{tZvDLN!2h}XtrwZK;z0cSnz}TNRNWV)3HFDRQ z?#Ad#eZf95bf1bS%Al?Sxqn;jD+QZ!q1|L8Q^p^vU7D84ul55H0_@sWr0;9u?w%05 z(}fwERmHz7XxfYPY%alX!6rk!c7<}MpJQj<>)Nmi3ZqntWf|?H)Q;H%ulUw{zFX|eVxA; z-kGPI;0;NPxYK3*WHx%h@**W*#IjiQJ538<30%?pnh1}#+}WY4Ma^b6BuR0!v3hq6g25C=-dfJ`$ ziBdc%+V;ez0*JZa%E-#`d#9i`z?_8IvI}S&BTcZjeVXI62x2Zkls3Ze6%@E(2>3`< zaZOwthTYH+RBpf&v!x~^%);}uECklqF6lPHm>Z*%9d2wkpJkYot8>kYIXNQBzqstS zd%e4Wdx;$@u5WZI&umEkBO4gMvtjJy2(q>LgOJfm#7-8>z_lNR@ZT3T;9@3g!g=^L zuA`UhARKM`6~nzeDEyBjgGq#xrUW0wOVGZ*wrXU4LkD0)c}2r$`i0m5 zTXIj{+tYo{NBLJKDT`|^YNc^0{Zi(F18LP%s?lb z52g;5K=YSj{m@yoS`s z{1S&xPqt2zCd>j^^O9pSt?`hTqNEZCB!Rwm)*vV_@$a#uZu*sh-$hZGEL=4O3pT#0C8lIkE2PTaIM&Bm>Ic&eky+zib~l*aZ6-6P4$`5M(< zv30c@V(p+&wl2!#pN4fAWufV{>--$li3oj6Ln^m-sSmnsLTlXsu(BW^romB{Fy1&P zZ=`FJ7@H zfX@}`uSgJ70v_6k~Jm=MiNCwadqPa0lIH+{WYF$unwZPNA0 z`&|F4hX3X5YpEvL>8DgX*UY@n*V0Y8_a8ggerfTwRVKDJR7?4^RLkA;sog1N6iAl` zQUEguJE^G0>3!7igU-tJb%NV#4>I_m%M5Xb$n1`q5MKFxoSU(MH)uZA6JK3$;>CxY zD_b1?HE`+q7!5p%F3jx5=a&(OUXjemmmDjUEVO(Y2%hS(eQ{--8r78W=kWB#`X^U@ zDQ|zc@^g)IvM~jMUOf4TXiZ!sa-jQrBJq~`qFugc8HcU3#{nh8kRjg%Z%@Tipbw+@FJj@pQ;^%fpilG+bfy&}^^T01-puNHt;m7&K)BGd}1zbo$_!bHm z`A~HJg@cNa{n`)@IV-$mPGu>6Hu#3V$tbl2v7pX#-9 zhH(L)lFJb*ClABQXnbF77uS;N<)#(64XOC>Z=WOf z8L7dKn~dv=;KMfy1b7aF(NNcR^SP~)rmv)6+GVuIt{@+6G-&QVf-HuET58P?j&P{r zcn%oPfb5GQ#mchaH`q{8`U0B;wlqS}R>mK>im2xfy&oeEGb6NJ4vg4ONY9)j7sTin z5dC5S=>Ag_*#<`FK^g?U#)x-Cy1 z9~)#x_xmoRYOi&s8tz_=Q#rH}I2>2+3LXzF3jqpEcAJ#fbs%txI@sC{`iQ8{Cctv@ z;39t#M%ZESdwzpRfJ(x3M!R2^o$N7ikm+kM$~AhuBnBXo z?Xd~O5Xa}BfFU%R$ak#d1=g>1jJg5LAsw&@#pD*<-f)HiUpiLl-iMZ8y59OR;R7Et z$!(Ciao`ENM2f)CQi0Q7<_13D+ri1x?^&Vc6}^I&U@DQ4s{!MN(V;+2?ie1^a3J4H zRQl3kex~K%MAo%7$n>8-5@uDjH|r zf&5Gv8Nig6S8qYVsfU3V}Pso{i@m3 zBa3oZ;F%3th!HRy0OG5?$z`XQoVW^F4(;oui^}!xknwK33fe?Nyuqy*lEgHJ0XiJm z38X=~?2?Ve??G#JDQR`sY{l3ipO@|Fr$$oF#-Sx=ld4Qym$%p^jDCRmt*RGX!<4OT zdXifd$2Z#1D^JJ$!k4v7yp^4|jxEkPCsN<>$Gyg)P$y(;*^uafg()#DX@B}*3KLr* zBGYj!j+bPYG58X!JfDhWno4eMnh zq8=i^&9fn~onIF^6KB{b3nLe9zb)wA5t?VWSB!0BkYc%HpaqN@kNNhLJ)@Eb+Jezo9?$JDr%QiH0K0!~C0Q2} zWd26RDuq|TFxn2KbC{{^B$6cPNDp~aeoHnasb`08s`8tzMRA=f4h-oUoLLB}}6FcO}t>E*LJ*6BlfX65XH7W z7{?#@Q28}#Y<%6F%H%G=8do91l{&k+3xcQ!v+LyUT!&66Y_-w#l1vV9iC36WBO|UJ zzN$gSH9s@__WEdbE&1mlTA5Q@*VLE+K27>1k1Y`22xJ(YlobpSIJj%_r^X18uF#<$ z!t$3HTgqA)OO>bLb&bvt6VtLnqsTTXu2rfs!tn>a;bg!0zCV=i+uTq+Z&kX03&L~^diWTv{@_Vw=ZN8E@21(DI$JG1jTD_@(cUH5j&4Lft#v$w|yJ2l$g zA6xl(sUzaLw)+-z(+M*?d4!5Mqm&|tU}CjruS6|?a$PZz!~@rMrwycI`q~k z#KSG{A5^LITC@nJ?wCL1hRiDMvo6x5F43;*37T*f@cQXw#OKp`l~dnAq^=gcYn1xQ zM0KpTJ}SK~v~=aBq;})6QBLbYn{2X3A8LuywwU5??pgwIb&mvHIg;2swCB^3AVd&sD^KRq`BpX~ zE@KlTQzMFla?^9WpomQ)Xr`c7NxL*Uu&wvq)NZ*V487mq1+2O<=J~yaSBx}3Y>H0n zKyw|zn{5c6%UwipL9rwZUaIc!W6AfS;s9~SNv~2=>O%<*eZP4OZPU|P_jz=0&YCOQ z_Gr);x~}^H%QZ!o)4p*G`-^)wNTNnqiI%ZP7wsx^Y~0GCveMevwNY4WQdxjd%5()G z2M*&MMhAMXk#O_ZyJN=JUdXiY7{Vv}2T493{WmqJv#p2N_9|HnjPcoJK74pJ|3gIy zM(AqkO}}reZvXnLZ6^PS*$;?eEHQ8&ElFv={fyF&6t#TADnWyb%U{XBL@z26*Hta1 z9qL7gP2B0k>Xx6&vfy0YqAd^Fgsl#=X*r1mW<*>VYy3Gp(ttC8iRF`5%?+2 zt#|8jQ^ohTQD>}jmjkw^RqMkmUCl%W8+%>7sq7VC^QjkSuZjVw5Nu%={_y2-KgRqU z0)2hS7AXOm$C$G1KJLavs}tV?o;)tmPLF6Ntk`3!zNm+bJ=%BTWSbYGEd*xKD z1++?%6y#>$aHPqDOZv(Y4Dg8#sF5fu8F3gVUx+nsE65HZ(vU;1+f(Vs=eQsRrV&=M zNtH?i?O~9-(EwZbHMWVrfRY9{G+uRlr`xY9!m{oTUlEH_9RSe_MHd|`o>X~VbO<^B zlZO4RDb@}948U#33YvDtMkw5V-lm^KBqSVZc)5k20*-2~FQ&Q69sNzF^$k%ge{8Wg zmsv4$J8fFf!YH=nc>GM|8MWk=ngj##cja@Zb2?Mvh(f-02-~$M&N1+M=6pQdQ>}8@ zHdE=3Kz>EpzWrG6TgEot;2p1%xPUO;K$zK}wQ`KkxP36PjopFC=JCe({7 zkRh1>K~f;XWWCB=A!2V-Y_iXg->^WBRCY{ya1^T7o7?r64>uY$0;=k4CsYa}0WLrj zuA|1jk=lFxL6|V0w~@`O>a40s&U0bRShN?4DT^Bi-L{$o4+ksC9cH^wLHx{e`;sj5 zXNtpH_VfXnluxa-AZ^#x8kDcEIg&Y@bZ4EhaJr?X3AW*$3LNQ(ws);FA5PjfXL^UQ zTJ@YAcmn9(t(Qn6H@Vc2yehBmfEo`zylCZJjm2Wrov0CEPC`LhnNXEcikF?Ho!AYs zl3a==g=p&E4ar67S1XZlSH#qpTicp#o0&!Rg*)&+x*l%0qQZ5fwWkbW10CoZm7;KW zE?rhYG}#LXtlRaHX80sywaAqe;zvD}vN0}IwI|L(;rGUl6SrpPaGp^7c+N_Xt;$h( zq)#R~rX;X~0Fe1Ei7a6vxFvF9H5~mG{V{g8T(iY-LWO0&E%uhqEOJ?DGMHWqt?%&g z+LZgNZ5{TO|7CCQVg!wMhkLGAkaVV7)xzQGq_Se-DNdT_;~88w<9Ac}`nBps<|Jkn zB1_)4fnlz9nr*lSZ-dl&>j&EginusO=zs{*Y-kEqzvkLvdWFPJATnK<`B~Z_4%9>! zHBKi>&3Lz?Y8q;KGLr{S&VZwJ#Kz-3$0bK3i$svkAM2;rK1%n+y@BQbWQZxdZ4jrq z!E9p8QWQNjgqeGjN}F}>15fI5^90GonMFMQ0BMKi?~aqZq*@5-f)Wd%t~WfDk(}QvO|4=V%>!45-F*v36kSRd z{7%Z3tu?C=+tf_!^^9U}C&|@Moy|AR`B~|nD!rQMj!-E!-q(r@zUN#mk&@c$0u^mg zTJfm_z&Bl|^f}&jb=|8|jbLu#CdVS7)|*4owG^2R30~!2hp#tK8Cpb*L8gA9UYsag za%I^$DuzK?xmdCj*xK4YIO3**t*$kYZhvfjgnXnfiaU8EdFd;>wjJcfd+xJ7#{W}a z0rlT~1xJvZwW;GvSD{Bs)pmge&3mOhER4kta~f24dgSGhHnI$ww1I{-G|8%ABr=l@&ZoL zt#0FyfZA?s-Ql`E97%FhU)rr$NgN_-rNX=d@e~6&fkh-BRtBlt6&2Z!-%6BGHUucI zJrVJ{-s~xgoa2ekt!t$UGG+BH<12}?sX71~x$$_|*~uDb(hyH%9X4UU*+@G3_<|u-lKe;6~^NxkS7u4K9)88uX_aOLMQl9aCzJt7tj1&%j`POB6(W^g-9i zJ4}_3RYD~?b|iQ9J)Ae%YkpI8h!eq~V7hEj3bv$*kbwv9hN5N#%%DG68h`Q407^Yt z1SKEkya!Vz0XiPNpMlsXPyjYiN}LhqhTrG{@>+jPk-M900Mc2m6tms{DDN2Hg2|<1 zY=YzRxn%tddI8;ogTMBuMfv_T^b?{b${^Pbp=%4p>d+C4!%1LOi{lc6Q@vqzNN20i z)U?ROvzTP1A5*c!;V13+D<@}WIp`cY8vF*S&M@~o`6zR-VvYy#w?+yT%PWpgoz;>T z5ZA?2^w-7&TlYGAoHG!LX#)7)6R*Tq>)~6!sZ=VrH_@aBI=Ddk z1T0;@i7(HDa=d5((Z8j@>!|XZUAP;o;Dho1H7h{EQ6gM&nm96MP6Xcnw4r22z!EH+ z`Rc02PmUArD1z+kMR%$blG?~xR$1!)B%)p(Rt=PXYs!J}OF%w3u*GRW0RUbo{}hmf z{|?Ci*86^M_x(%z8+vZaqe)(SOFsWw{z^`+_#5eI9-CKWY{K(+G7m1%aMB`hTP>Q0$RE_80tpR%OV(P-Z*VA@CnN1d2gm%$r)b7 z1|ub%9u++6dB}CGTwvrk-y!l^-%*O|VCIK|6|Q7_ParU4NuiWCEU#D3SsJ;WiV7Td z84ndwcWXp5XgIhTt(*V8!bwwb9w3yOQ1(EM*fUKz{3>^s*U9t{X15~PKAPyTUQCvb z23PM~M{tYW0tZ1vYHHHuuks7V-Xi0QC9 zA$7r9xdfekkCUINgG&lHmpzkDmzXo_K{?+#X3htj;n8&7&UY;xc@+i;?=QM&ue{7- zpDs2p!n5X+^L+e2v=K8~AV}l=2kSos(~)?2;InrHT?p5vw(p~@p z*vS$fLIhqh)tAePXiy=AsqBqjfq&g@zgITP)T1H*QI-yTw@9vnj;ILaI7sticn257 zK!#cXFh$w64(~RbYL@Mn`zSzl+LX<(S#s7o%0r`?4U4~kuUL~XYx&duU{*j!dwLX+ zGHhS()IL?n4rQ{U1Fe~MW zR)8gu1WcsePBlbAH3#)Fk^j$K>|ICfJUZ*F4hv6Vvu~O(j5AkueYGD-vlHKH1fQeu zAiN3W$2d_@ipJJ&sVYv|+^@{Yk@qP=iY*`wWrB8#djqn`jfLUUty9Q)5YR*A6ZYu2 zZ;&orieTO-dE4l);@6=vfPsJhn6jQ?J2p* zC}*HU`YG1A!x+IZp3~t-)+&UgDt+=vaHAkh1uHcXJ8@vRWoJ|(cQY=bIF5>kIfAKQ zlZza|0{CfKQ}nI5@*ZOfnECAcg1>Tw_PsxYScOZxdn=&F(~QBQB)*pp`{#t_G}}`L zeb!v=1j?2a+&CG^L;(04j#gJac+)07Da9YjNf5q&L%3Q1-F170asVl_7OJF=cf76#ZLQEFcegd+)(t7#EXnNpg zc3b48(B6MvYNTV0H+?wL8Gd_JaN!HzK?$5Vh}e8=ToW_Soh2Cc0RQ1uy{0wb=4!B& zc|(|~ES*rSy~Kz0e%6geEOZ?2^ITiQT{d$1C0Dnk61NZd^bdithgO!#>X|Ad*cYlG zATa@d?#%doL&D3>jKA7%`!xOz{9PM=$zy*S#q&@7uiXoOhyO0-z6j`l+Qf6p{2%zg zsnaQ_AWa}E1<@b9(drNaJc2L%5D|A%_}_bdILUH>`?B%*)c#&4DB@9^JK uz+Wd(o%mnyza-?p3o*ymGZjwy)a`s>Q`g|M!