From eb58094e8b196325228e7903e60d45b9d188f3d3 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 10 Jul 2020 13:35:41 -0700 Subject: [PATCH 01/16] ignore this project. --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index b300938..d0f4d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -122,3 +122,11 @@ code/09-working-with-files/.idea/vagrant.xml code/09-working-with-files/.idea/vcs.xml code/09-working-with-files/.idea/inspectionProfiles/profiles_settings.xml misc.xml +.idea/$CACHE_FILE$ +.idea/beginners-course.iml +.idea/modules.xml +.idea/vagrant.xml +.idea/vcs.xml +.idea/workspace.xml +.idea/inspectionProfiles/profiles_settings.xml +.idea/inspectionProfiles/Project_Default.xml From 1fe55545edf650ce05fff35db7cdfd8b821255a9 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 10 Jul 2020 13:45:01 -0700 Subject: [PATCH 02/16] Solutions overview. --- solutions/readme.md | 17 +++++++++++++++++ solutions/resources/branches.png | Bin 0 -> 60332 bytes 2 files changed, 17 insertions(+) create mode 100644 solutions/readme.md create mode 100644 solutions/resources/branches.png diff --git a/solutions/readme.md b/solutions/readme.md new file mode 100644 index 0000000..b1a6653 --- /dev/null +++ b/solutions/readme.md @@ -0,0 +1,17 @@ +# Solutions + +## Proceed with caution. + +We've decided to include the solutions to the practice exercises. Initially, the intention was to omit them. It can be frustrating. However, it's working your way through that actually drives the learning. It feels good to see the solution, but to make it really click, you have to make it your own and work your way through it. + +That said, a large number of students have requested that I add these and so here they are. + +But, I want to you be sure you want to go down this path. Ideally, this is a *check my solution* type of thing. So we have made the steps a little bit manual. To see the solution, you have to check out the `with_solutions` branch. + +You can do this on GitHub by just using the branch dropdown like this: + +![](./resources/branches.png) + +Then you will see a solutions folder below this one. + +Best of luck on the course, Michael! \ No newline at end of file diff --git a/solutions/resources/branches.png b/solutions/resources/branches.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bdf0f48a33f850fa3f09b609157d9a731c3c27 GIT binary patch literal 60332 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�w8Sw5D#9mW$>&z(NcUdsOWm(9vfDp1Nyc6YQ1hIZCRl49~Jg{-tvb|VE znZExJ(%*80<~r|Qm_cco=?+U7b|6?_RC!B`|0y5^&m* zZf3gF?Y8M1W6!LdHL@qEKrKcL=Bv#@iR8nvsCETCAdvuf-RIF`LI9z9>@sHYQgE_S z{l(R-%j^Jg^B(+Hh3sTYB_PzFc~RC;4KpS#?X(SWmecegBiPI z!er?J7w;*^0#`({wb69u)?y62y>3nJxCG;n&-4uM_MCQgtv~dS#%%0omBwXZD&6$5-sFbjy9VZG<@W#+UXq8-EooHfT;-TU-0= zYps9s(|jObMRtVq4uwA11W7lIsD59(7bR&D$^R;I(ge6^y{ zk^D6{5>KWPVtz8O)pCL}&W1Xj>%GZsk44)AsGx5b!w#uK18a<2sBl4!$#72_6C=Rg zRANxk?`c6VuToMSu&&ej0x|{pPnSNd=b{ZKqYGuy3O(G`41VI!+Z0oN-gsa*D( zXK6*%_n)w|&}J!JscJIB#UM=J8+ZoJIqq?&mZ;NZTx=C)4Zx#6$DbpKC*ZQDl&ZC7 zs$ZP=;c}qRIIVcM&EU12y17=r=$~xYFVX#3R~Bc#=EBf^jT(tYy9Kd5_1XNoe2Mq(R<6Fx?cyJo3{?yD|cJ+-3q9;fu^AxoWK}?Qu_B zxt>g{y@7n({BQ=JlA-UF`OAw1PZ1+~-pi#AYY_v?ab_{R{X=y(N`hxmEu7cS{PbJB zIbNRh>>S5=pC9@9-^^dswUe~p_17&chCSNH2*9fK9#{YfsWYFG?eruJxs%PVRxCi| zbtb^?5v(c~{1C}8tRC*pC6 zl8nYeW~L0=CN^m9?-04@JKviXIGg*hQ_(1^OG}26Kzf_$w;!BMu4MR@UrQ>SryaaE zUsHHW`1z}32BdPV;7&~3eKG? z%gm388O_?THfWuENF@#REJeI`NDB;RmXBE}ScWag7Zq^f2UL+c(%7z)}ww zUct604*tQ6hDOg{@yqL^kL@@l&ZR(>)j+QC5fbN>?GKtY9ig*Ful&a1oTsVqXU%pS zL?_giUNwlGpU|m+)&?qh^N&2pV)zzT3@AHsAyv+z{0>u9toBkEE#LM@a<`K%#%}g+ z4%Yh$v(DDK`HHkED^3qa^&Ac3^~uuvJwxWWXk|Y?_cAVmFps=8kZWdFOlBW%SN~`P z?IhpU<@#`KJztV2pTWsg1daEo#agPL^ZYKy;Gt0E{*w zH1cYD&rFG*ZiN4)g$8}4%Dc7%qTRZGQP_NQ7Uy1=RZza^g$c>>7nHC+@GWegP3hgt zm?i7a-9epBd8PrV&^JV=({HH<0rd%G1WcOOM(yD4732Vh@6Es* z-F)yKzbk>jH1DHx83bf3)z-*VfH}M{4hl1!A-mPR`!l(>-(rRO^&Db3y1jk+W$f}l zMEuw(uyHtyI4_|09WxMUYSzHozX@g}=!ni9AjMm?O2ew6_42mk^*Z%&WI0k>WsL6+VhT>@=9=N^-l?s;vSf@Nx1EVNx1Gs> z6P6hDi&I2BOTfm(Yv4->y7Bki$t(XA3`6XDAbe+={k-kA^=jh9%lku$g7CJH7f8M; zmLpe6o3Z|@3NLZ}$77?A#_^L2`V-;lr2GQEwn}vR30|HY$aJD+0W4k?bYj4+1!X=?gK8t_ z29lphGp=!&KiQ5ho(l1)H?iq>#U1kF`2BZ5Pvy+MAHuK#2f=@TTO!*^#Q z^FEcWUzEz*iGyBrmB<+IF7Bh`tpQf4)!qI!uG_Fomi#$#deXMW9fy{IRg*?r3yDo2 zi0yT%o$-Ueil(Z#qo=F5_}FgkCh^a!bH##G8f#cKvXYzgZQNQm0>(@XH);`_g&$j- zE=BeJD!vPioAf4r?+X=k;oHH%uYLE{@dYAvmju7n6+8Ev_7M1&ECnEk#KgxZjQ*Ym0qk?7WpJ-mCo{$ zRm9q-npwGnOo83%=|IO@Nk0)0dcA_OHtLHj1$W4#O=WBnnQV4C!m`)MyZepr_GA%A zizGT$2T`Mn@vwI{Q_k&R#B|J9e#+3&U&Qi9fc4+A`Arqj+oyot^^9F187$GjRECf= zSa#{Upx6#p7~|@i-=fJPXL>FqU!qY?pfS$^@^RfG2Yf015<~iz+M@MJ56yPi?Ns9| zppl2g#-AHqZ>vKmXSn8kOZN($;(LDfVoKlb6aPvb!*SR}mN*|-eAsU5r_%}%Z1tY; zzgs!Ewy8||_FP~rDV<0g-C^G|y>`Ee8Nc9pE>(wzOV41c^VHW+Xmu}9o_PAC)YMpX z?HSs%w&-55WoBY;mhX%^_CP?bQhT%c+|8<8EBXQnjoXfRKyfuLocrwxW~X{L6nU>_)-!cd2pL`8tw}t4C{s@ZePIr^l{|vD0PKSS;wdJySC|m( zH#sVKPn@f~?exI=2>W;P8qg*?ht?}<9^;3*ImXyn#xgTUc*k;3W`UogeMg zE5G0~3>%3n|B0Xw0+W(rLCR7c9vs>+&?W`*=e@ zVvi681t$ZtEcRrcV!TufeYYQX#PO@}t3_8DU@dgfQsU8LJ*AOva-pHQGRjE5PRV%a z8XZXyOMSghbd$DV@nl!Hq0*pPu@S#aO$Bx#nMPfR`f9{&3R6mV5^gN;ZOc;21KmYb z{1*M5_Z)=+eQHoc_(PHP(e0d?WN;Rf3lm6 zol0m$^DY6$Mq!qpq9p%O!Vo$ZB*pe(W7dHoYlYP%~?<64iv=LCC7%Fh-r_W2$bkbwt^0hySP zDrU_zt!ZGeD5n@YQZp4SRu~X6A|LGL#y~HwgBi=}S)zP(i2c{9gN87VvPbReCH=f)B%$Oj(_5C_G*eXk zIcm$@o0-)PRH$-LQ|`X7Xw@5fLW1t%hCS~;l6>S zINY=SfmNVD1Hanf=Ip5Foq{BE1#Qg9jy#UxkaOkIES95Csi9S(yRuvF#pg~O2zLNK zYx)p5o>?In5s~`Q6a@mUgarn#f_LXHo_}n77^)qa%?|XCE7z?(b)pwN&u}{E^BMk3 zHhAB@eLRqBh-(&zcxt0c9mII;?gu(KNo(gun;xiW(e>A0@Je;P%EvE7#-IGk%i@;BnDnie%o$cKFNZ3*q;o1bu@^Qp*>Ki&W(Fr2HVKALwvS0TRpwQ(vhzTYJIS%zt*$r*afGe_efEBLX$Gtw>=)1(;m$7n4ih z3JEzU7>mFMSi9V^I{Sy7-|v?3D{4SvUh--71RTb-CfzpRHDG6aC(A|17UCka-)ik& zbiRL&$jPTBdfs}px}M>&ShM*RR0XV2l2?ZJg=IhB6EtQhA3oQ)qUnU)wLjcR=@wxa zawHB&l=P9*lE%lk&LP8y40M?8HYD$jTxIntbO2uHP;g2+^_d21AR(7M==mOAPA3N2 zASI)x<0n)li;qJ4JJFLyrK=?A&NY6ZF6>N1g7`S z3p_Dt;o4#?^Hwx{sf8J~&uiRw@F8Jr z%5}El^7Qa!Wrq2=c#L`_-QAxKOJp|Q&y;wUZx%O{Q#WcVw0E$(4Z7bVk@TljAEb!2 z@=jb?Zz)ksEU6ws%_#UM*wlv;zy^TN?s_mjTZ4=+M>MP~mqpG7PfmEt>em$Izsl4) zlltdIwC%|IzM3yq3c6OrLq~o43XZ=dj{LM;QYMqRA>G{K&l zuhUCuUq<@w)QUcefo54ebpDj z=CR<5d*S*gBImbm&t7BO%K}n+NsNcnuv!K!t%{EzQH!HA@ zR`7II9!2L=;A(Va4C~8}%5P-SWL>u?6&UDGi7D5|KNeEwkCOY0mJ;`)+9-1sIeS5a)p;; zWQ5qGVigs)usEXQ)BU3aLRPYzOf z_z)`ysT6T~mB8G(M*i~ZxU`NoUKEc;((9}V?>PPRfXBe_0DxHrklwx@XgwHvFGPFDnK;(vnvq4!eZ70 zWMBGs#P3g#ljImXn5s_cLYnl>#v#1LdM-7{cAY*Ek-h220UejdBdhh|xo_0|_N)>f zi(&2nRwG`@^R}CNq&?GjllAuRm0NywqPZUWaOJ)OT*<;?Af7T)aI^w#!o**RcDT+8 zux7m(X=k@>w?JyEK`I)b8s2fVPf%jnj`BRFBh;l=Ifb88dSTN07zE>qUhvPui||~| zkDH;7^!eU6YWJQ>PfaFEDV4l_o*0D*Z$QeuGn7O|i6&{kq1s{gyXyYcEgHGJYLd)r zR+QYsYMM+SNYKK-pjGjD+IzN1gMsP38rqXMsc$*3@Zu~&Sii}t6*b)b0sh(Z>^db;r!Gly5(IPzzhs_NLxGx$Q2Dp7LWPZLBb9l-=vZZWv zFN!=BKbuLL!Mi}f{nGaEP7Kk%ks5dGJ@SUHgxBK?`8Q~e2f3F<)Y5luGc=v39b2h8 z*MzGN$7+)A!<=g3(84Ra%$*&pQ=I2@-x^udwJexuI@>{vq$<;Ilr2#&{!C58f%4_n zd}BAq@T>W9XYfz)MrWMbAntPQ(_H;V$hDlZqT(+Nzmmzoo7ZMN@;Z&C`MXU!%+^+$ zA*#9J;R#KFMFx4A(F_{7pVigmp7h$F2W)wr;6t%$bBRO;_UdLUbPlK!u%Z}C<;l{` zxq`lt1)2&!24l4&mMC_vzg-`A4H1m5w>7uI&fK|q%Ky%Lb{y*YK6%XUWC~Z~K|1#8 z`>!2f%d7p#`5!Z$fyQuOpif*(fS|VU1~QHh8QK@2``h%E`w4BG3PX>ypmll{?)ui< z;#=v|KdBQez*|um4C4TP{gitrI|AT}{E0PPWvWC%MDmF_S?12C&M5Lo#Wo z15JUa>ZTUF4Y?mPKcABUm(tq{!Ufdb1+2c+U!m`=gC^}u; zAoAadL+De$AR2TuucTB?L0AdqW*l@%b-}kHlQXflr>Os(Ot}O|p*;{gB2X$%A)xAB zTC{@mwV8IMK5qWbA+0^q?hUU65?NT#Am|VQncm@hj@t2{h#j%so!^WAp$J2h7j``b~P3cG&|#I+uE}& zKoa+wx=^ZtnnjaNJaX*-?=e-aERIs9SFZ?U)TnV8G!r(4(r|v1E>!_ld?W*>VGOrJ zqiJl}$wA3XM$BmV%t@aJx4ZDmBt$+JNHyG49fBW|PmqKTAg(-?-tbJd zUXck1DZ3}deEdcpnDIfF-z1qyD@A*E!(gdtGE0-pri;*!^^VUh$zr-lg@VqY$@Nu5 zwS-L*V(CkxPhYFTerMWACEywx8`&Hd_~%P>MyaAVENy%nUDtfwRC%=V{1k06o0Xep4Uo6ToYfN)M!h|O-0vwHSOz(NZV0*#{S`C*<_-bUm-+~D7yK$!i+2|SR;QQ0# zO?qy++^h-yA@&vXbz60q=J(G|6m(h@WeId@1xrsl*dOB<0)gt{_O>R3w&e;sP-+I+ zdfRDwz_w57mP^`lWCUU`8kkS}sSx?5T`0$2GW^Ntfr2_VhSJTCR=Q`5VHdUK_nEXR zKHaBh#bHC#fF5Ur2t!slwWlP-?S6`K@;JS8A{4%hCgkcn#$^BvrEy%N>qQfAz%kYI zof&XnFuyQfjtaH}JQ09bWH55OsAm^`q24>1jk37ws>)(O46HcVwk|4e6_^W$SkmhX z4fW<5u^%z(MA8^@zzT{WNd!jb@pqjFFt>UT*G9Y=+7BbPwbmNrBrU4kj9?tsWmcu# z)`XOC?cczK?l_qHf=b<5-3f*)ZOX7IAW(xU$biAcpNgKh0*#)OhtrWEHJy^@=Fi*1 z(v%kq2HnTJu)|k_Zb)@BO}^7oI*bRTC4*4|8?Gug=(|23ir+DxnKGpdUKV zP>Ne&Y2-GUKlz={rGX0*hlg$Uzk4$MS=5#+QCYCMc3j*LJ15(A8iHt@O{;k8RZgj_ zjPUViEi1jb>aQN`Iu%h)4cPRzOTW+q5UM5Kd`K*vc)K{wKc7JA2`l@CltHP`jN*@K zcnhbY?)si!yj0gnJ7Vgs)%qR9IR3J`YWRG4@aS5>w@ketp9 zW_VTCSX0Tt>k_Y$m-nOjGnr?PGuPOX3LLLyD4WPg zg*&GA1=X4a6IDJpjDxa)3cyQ{N|SDETIaq=WTD6mkw0&-7}SM6K~Zv$!km6_uoiwD zDB->{Q9i@FvuC89$wK2S>*Vg2xI#irpmaOI_&DBx^C-#7=k-~-n zn*wYjE*PnLiTJ8i32tMP8M6xFqL17cFeQ19_u%YOFA+grC@a%Ypj5^S9~MR5*y{U6 zVIQGP;!&*!E5VQ$rxZnw6P#R|XkKc4#RPXK%96&U$@z9)S=%-%tslJKj2aftK+`0FG*dr@^p>u1%fFkEed&dVoG zt&{_XrtYo?W}e>(AdvXnC}eZPN5Dh)X^zhi=vH9=*X!T9O1ty>(>YY}_&_^j3&&vb zyXNxKHq6ZPSMI%P9GdL~b$E~hmQgmHWs9={rO-70s_6OT%DBBjJEB&SEtZg5S4f7z zyvk=g*Y>TUqb#1*)*4{3{bxK@6g#9F2b~YmWJYuZkoLJn5%25lpN+I(=GF-{ua@GK z0{{)59CwJR($27Bz>oQ!?cPaJlp}(dN*y}B^Z9J|7^&|B#Sl>fBzqF8=o$VRu0Tv_ zUEwD&wA$iNG~7na^rngGC1^*>50bpk<1uROg^0=0qqu8k)T}y4U%r?N&EvL1$~5tL zPVUET>Dcr-k>X4~rrB+#X?pptsLrXRmk#w;s?Oum{$~TQ6L4qwFLNuu<3fDx3$)Al$;F;&YJrRbJND=-rfr?kMAb0u&l|;P$Wb7wV3U5=F+AH4I>kBo(v2Y0G z*ixKT;aCy$LS+ZHY%ID@d2z8(wF|jwZDMk7x*FuIzBooFc=jIb(P%O`5c=TcHPtKW zrStv8uS5h>RI%7Fd5d3hPpYrKaCGu5c-M_(4kqkiDLKJ0Fd>xl^t$6pPn`dnmC@-E zh1n44kVNYW`}oD2p5fyTQBgT|O-RYXo0u{5vsD}~z75R(Boqf8&Y$(IctM+MKu)Ms z(RZ~)y2nbbyRBz81=aPUXE!d)KsuVAqj8sAHYsHj(iC>-r|>`ik0)7p4z~<3EM4h zB4w@HCpN7j$^O<1(!~vKzPM|}P-`w(s4f!$DS2M7LBmJ8wY@nC?u`4EJ8^{1!yenI z3*=`MZf-i4-xF?R6RD{wG>* z8tW?hsy5Nhr;Z)lhBbs*uHt&A7st>zBJrTaWHx6-s&D<{HgMl9qt*oyl`o)-Kf72u z#T^eVDL?tdTR@{kLd`x$)!*4%K-uza-Fsw}?s)9t0&{A3v@>Ao;H%N_Z`947xk)Px zhsl~Us1t4c#tmK%2_!iqfluC>B!w##sbU~;S7k@esgrKG9n|x3>l><0sZ1j0$pCw0 z2bxyZv%!3%mg9Pj`BGZ4S&i9f0Nz%hpa+_*v)f*D&%oab_xVpQgyFgag=N+il}prR z&MFhu5?Bf!g2nB`g;u5*EJP$xbmh+>X=5~|6o^mqGzzG{*^9Yp@O&)CdkMqFT4_6; zRx8_O|9pH^>3<64w^}*GECQ=3mS`3;Vl-luQC}h2p_o5=mKf4qSe!zGNhsElJ90+I z)n78cBY&YZMy)`fCo?#x$3GtBcvW5uw)SrlvT&6E2%iWFn6L!2)8l)$~F4E_h!zn z*J`cR-PCIZs677oJpX)mh#B97C_qfdt(jO$HH&F+U7}JXYOBNo14M$tzzU*WGxV5h zEWRdgBqdL&SJoLO-(u>uD=GlSbb{qO{{OY-H|qkm5$fo7c5|r)YHfo>zSvH)>3$>F zDT~&9_ne$ulc=L{Vi+#cm81k)wQ9R?^oi86*}SXNuP)iuiDC_dCDq5^kKb_px_ev|B(jiI2iq>*-R$EWY%1Ci&MCz6SBdd zj^P5H0D!Xp2auShqzG=aw2f=kQDh9o)`v(yE zPjkT}a5fsWlZmC1viT9XpJnq=n@YnZIE|gP==TvOutm0(sRlGUE?=B%>#>$Ek%thf`_x**WjG)Bpr@gCewI}qZ%X-a@eW*l3*-jsLCqloT4*Xpd z@L^?zgQF6?(2`~8a9gwOxxE7orWw4QwTf=QITH;(Bu%?SugM#ev|Xx)`AmRV}QigZJNwmmVX*9u9-%r0=4Bp{@dQ|uyN`})3nz*P$e5<>gi zx&7ZjUr}LTLTc5u=yw^CilW0bw6#tA&XjIZr;Riu2x&N>Sds2;9Yh^epc@zN)dGKa zmdrSaQ8Q{Bja)nz&r_o8Jk4#)8bXdI>p^CK_SC`t(Fp$E_EWqARi^<@oZ2VYo2!Wf z%7W)5UCmg>EA-j_48$^)FM)@X^6$gI$xo3EWk&jC6Q?WsG`s?l06ySvb@Dmz z9VP^~bSzB%Jc3I4j+|pf5JRskcbL4E6b>ucmSF!y^WW|Ij!*_J*M-kSR3+!)!Y9nP zCQ~#ql~84dr)$FbRX4*cM>35ecK@GU`3NP0r2sAKX4hH+VkTfCXQdqLBW#=e-ne}V zeE2N!M=fbaeU#rHhw@Lu-T^I|sD%;bOyb~#dQ9wuV7#|3tMAE{BO3^f{%;(lN#_yt z$s*h2)=K&e>2%D#F(XN?nG#}kF6WdC|Ds6WpY6H-n?q&bT0sbMySaREj6)e_NlJ@( ze>4ZD>nkT#W#T%r`XI-72{|q6pPzOUui-D|FNC0Gu|iZF*6PVIT#K|oOiiXW-nZ^C z$i-Ihk%$+@C-86sLQKd#vZL&mexY?tYd1n+eGf z^Zwn0i)j4co(U!RC7dQyv$$fgdKnQj>Mh5F#;2LLda<+buu5Voo+%-tMQRHyDDzk3 zuIXk|H}@?*+%f=Z#^&3r$wk#lLj#^)@9xao@6MSV18dC(@OUl{DG>EO-;KXmAigVE zV1bhOU85&V8U}pJJkApGue;frvhvwZW%C(+HLp=qps>D*a!`;rn*oVkoz0{MBG;3X zbq9hz15;d5xYIjxRVI0_Jf|?-Z$BImk#2r+D-hUt{(Ghff5pizMDaooJf&f(ZY)Pv_o9*c(qoR zKifuz6YI2?v>?X{X0ZkXjw_c%_Z!^7lt)a;D&wpkz}B@9qkyX3sjm(7w$D)Jf0nf9 zH#%n?yS|zmzp(eZi>|lT+QNhMe)5Dc>NiMVD3RH)BJDSnq3%Q~EOi`%c>rinhzU@i^@xUY4DdvviCl#bG*OQ%Y@@{dJ)l7iFU}Q>*g(+GM5r zXiGEJtIz^abZwFz`xsa*&|O8j4QZMgG_N(gfqFje!!m6*X#o0>+kHIB(mpeJQ*b*l zLM@vyQ#)kRQ#V`hkjzr(N0msgneYLf_w_cvmQg^w?|pYNuMpIfaGVtVB@V>vT~ZD; z&~m#U+b?u#y=$r6#&MHnVkiyO#(J`iJTf*PUlAdYdX#0_0$o>x0`;}31T|I zV*2B2F%2=rP&y~X&)m5e7a|)2ApdR4q^o_+qB$nQ#vR>iMPBGmo(ZE&GrBWfF85}w z-A1z1N0~Tvhi(M+vrK$WEY<9L#e^yW0!c_l*vI-DjT zrO3;)f_^gt-CPH<)7A2HASTq`))jz@f9J3>b%d>kRU<-v9+VdgZgpSG7w(CQ|INdM z+aU0K!Ixr`99&3QE~#!qNI!X!o(4^op*z}iTxAQj$D#{~_Al3yXOl98FdUv02jt4&l*fZUG>P_AvLJx=$3*C7fa^ufk@cGW)hS9jtzntCb!Sdp*gE zbFhHm-I&_vZj&7Jvz%`vaR91d8{&5{Eq6b;{HpcgHj)ByPm*DATp}`gs*cE^QRP6Z zTvdX(d5t{X!5w&YgwCObL$d99n~=lmZD0bUj;Nlu$)3P9bmC{Wh@aZH{Rc*fToQ94 zkPjAZOF7PW?|ZvYR*Xd++Han0m;e#VV;GK#-F=UURy)vTnWYr>2$Kae#A~1HXz1$- zi&&Gtn6dMH2zfg0pU5qEwpMqYW?Y{?-|F{$w)g# z?`TdP-OTNvdRX*S1)cY6<@UI(@X6_XPgv}8^; zhHyS;{sh1|fC+_lb7-bC<-Yk)`C+$pGV}Ze-=$CZ$;0IdOIq(OBHHO}T0y_T3V@^< zh$|<@p5cGy_1nDBktD@sO@Bs?clkcJtga;FURW%HnnLr34wwV)YT7o=@3zkpG$j^m zoWkp-Ou~OL?^4fmYD=cgX*-pDLSKZT;wU8Se0Sw;wIDC(`#_Z8;Q!^ou?>%JW6Htr z{nC5$@y|#k4I>fD+DUX=i(gJ0?&2Z-w_BEthd&w0g%2k~vtJxRKd6X)WdRALUj}~B zn0SM&@O7`yaGsa#dOYqivCqY~-^MUZ3JQHnfZ_7V_}Ld`^+<_jF&mb;_FUgt8&pi zYFXlVz$>XGdYRJr8R0o*9lYa4Xb(4p#GhZqzL9AqJ=96)jjOb%jpi>nF(JN%9}?8Q zhjByKcbf-g8dx=z7krnFdLbF<_6?f$2cD5bK1*LiA2G7Ey^D%B`T!2DB-Y^T_BCqL zRb7q)ph~M|YWZ$jQaZcsw$VR4;tNYFaHs4d{g8_`v%zs-2+6CMyE1@O7}ZW7f4 z5O8tv?7oW!Md3ry%L3q4wK8q8@>o0Ui|ZjCbfH~kul4-R!JGx^Z?I9(BrF71!L|c= zG5ApwD%M_}XkJ&rmRK5QJdc(M2r;`ZYc&J!aLAHphwG2Go zR(Xh9B|1T)ufc**d`UtFn3b~tY`L4*OaC;KOt4Fdf0^6LPh5_tr8_6EGW9IDl;oi0 zCUb6D01Lov2&ELcb&pS`mw4~QK5Xe04wkx&cHov(fV*uS8aP^BALCvfv^N$soo!k*QYxySsi z`)`VkDl?;e99n8sLv+J317lKu^-*elO1;Jyuq;i<&pkO@|4Pz~^U2%2SuJuL5e>h;Xmat3J?XFB1GGI<9T(!T&uU6M zGR^$_ce`ku!wmhbPkdQf>Dn*I!*GYuwZecL+d$1o`_k3NWmL~7lUDCM$4;3-pDz5M z{Zz|O)L}Wd6Dc12N!AZ1muu`JUUSABr^f@#6Ukf(I$RE0W7DW|bKh8~18kY+?S<}c z(HhS~p!huOPFVXW2T^De%nh4uH+Di*QHDO_xJ?3c_)#`rmykmG*hgC5-UMs693RWo z>V3smE9eKX*XviJCnp|8C~dT=QumwZ_$lN(`zd+r z3xRi^y=$#!M1Ax&D>%zu(Kjx4+fw{l%agE>v1$?-G}NCYoMmF-7ld^S=LXwWK%gaX zcG2CMcb2gk8DS*lC2JdE)7M>goXvPeKL$?vh4u~4zP@A;0e_lZW^CMDiOe-j|3(f! z5G7MVh1!-r(t7xj4x)F7(3u;$7V+8_Lrgmr00*ZXgQ$I4Z?|c;gdD+E-ePnJ+& zYtT|_xw>x8DWKVpqTdo9HBC__lN~$mOOX)Zo#_S~eWYT$UG9}VFWNHSV>UNpUeZuXPbk z^5OwgisXQ&onh$^5&2?<5?Q5%%rXAKKj3b?a2qYyIajN%)t|q;{q8b4X4Y~h^!96E znpk70RDF@p(m8tE_0?x|JHMLvUyV|&T2j$A#}F#ObtD&$x;<6nYSi>#^Q))Q|MSbWEWF?6*>Ei6FR3-O6>Yut#DS^N_)+Hh(ZV zm~%|jMw@d`RX+GTNdkp~6EU42(lm+Gj_O99My0<^nkcgnL8#Odp+yZ$EBs8uDSm4q zc6C%%jZrI?WLaqw*hsdzkVQK0b9SWdD4!aDR!T$trJ>KjsqgYO=XQ*JBrf0~Bd4^} z+2WP~^Cc|aL~4!2Kwn{fy}{SQIX5@ydu; zY)q9-in<&0E7F#kmM7`zkyMCWIyOZokypy@+I56zlvn~y{O!sh?vDZigcUNTSja^$ z%e!0A3EbF%SWvx|fk%91SI9NSD8_s0M$zY9B(z7XSyN-BN&zqLHf9ULdwDY!eU>fH zR_oQ=-g5e|)qd!UwD^g0ycn>_bhnOpvtPSBh1H=q+ z0@}d`sME=Y{u)o__@*=$rLG*lC4RfRs|}t5-eDjOB$tITJwIc`K1Fc3z>2Z;3VYSy z@U{Y+ZuI>|61t&YQShvkH>S*q;q`T%6> zjUkwA+Qz#K8gGzVW(;dAq6bwf2ztl~m7u0kFW|{l8v29+G4Sq9W8+|8c=R6s3&23z zJ?_{CFhQ#HmF|2$?oZyqJ{VoXrk@V$RnCTo->39d&k5;!;BtNJoi$rbv={J6uh_$L zV0WG5~CxYGldLOhpXmL$oKo&W&3LsC-Gc?%7Nfg13a?rMfs&jE$;GfG>c2L!sK33an;FRnf($Oy3t<$!3ZIdsX*k6#k&<2>Q&Le(e zr-IwdI?iH0Qv1U*ea6I2!*3FHp6h=As7g#2V4~Z7X!}IA*dA2@ydZPmqvs$uvXH}4 z$o*W_@xxZZ9I<|VaJKg##p499rNEHuN^`RKkm3d)V{!2yQ)&;LsGI<5S~l9w>sjrQ zu3232kP6xuB30ro$=kPUx(Fsi^A{c8Y>m*-n~mBuuoDIu3u|h!@v+EibTm-qA}?bj4Oc<{mCK*lPN>}+PXhTFiG0UEoGXRnXh+%-5?V$dE}zK z9`*q(_z=Qzzyh8*lz4N$h=i1u@EnuMxS49ZdM@8w=iGY%N2+iQ-E9Qdz;euZ`@m|Z zAgAGMOD&3s9|D->?e>hF&nI$Z?oZhY`ewz{$&1==$G_x40qX}O1b*dZLZqUZ7VmWc z>=s(QIIU8*(?-lR8K-C5m;+dzzE-1!M(}?U3BH94_)m?0Df(PB6yAx;53LjjNwWFe z<CEDDq?gn#3@`m!sM9Ql_gHLrCUNfzEaXaXwINiH>XVu< zQgdT8--M+GAe%~rCjPudm{S#Z91NGciZoK+C8z0)7f3`U(blw_iCMchL+pAskL$p; z*BpIgJ4tH)VWxhy6Do$Kl`@d3>u>Veu#eZM`3i*_AP0~>H?Ov1)O_8dcQqf)QXEy% zd=5$<^`_JaUX}#*g7ud)5Othk`wghIQjcc4Y*%~Fm6}u=@Z-mvk)n_>@=qKP^v6R( z(2(~A$Cm@KYqgye_ch}cS{i*u&M=l;^{eE`Qnw?R=hN_n_g$UVZIk4hXNA!AgOFV! zUC-YD6bpPbv>oQfSt<@HrK>hJ)z3eoU90zBEd7(ye)!y%n!t*|1x?`&i+oQZ0em?& zf)$*P)m%yJ0qPoh^aINYx+SAu91LuRZKZ83Yk%EK`DW=iwtMYAmViz*JE^^)d_86- z;sHt&XVq-;mlUT0Ku<%L#XWa~r)@Xf>iaukMi_cen+=B&H>5N1oHP)beWwNrAs(rl z7rUALHr2CFtG{Btvb_*5!g3y|N; z0TpQvlhWRhqBSInzT66_A)I}1GhB7 ztSEf9XM2~-^(0!syS#Z-<=gw0r(HpdLL_P!s-E`tpIN{J=hUuN#q8|qYO{wqB#GDN zyw9%7rua^8ckHPtFxrU9%seNanuSGHer_zK7JrxVMIq9g^;1dIt1>+tWt@$d$zEWi zSYPLkr)TfNmE)esKjOk1O`qD`Dn^ssgOZ*{?rS zzwzFjf4QfJ&vIdghi`hzJs@m6FM-BZ6)rxyYaSY#JXtNE=lVfoiEnzSONv!A_Xb-E z$_77gBn4Q^(7VB#$$LAG28Pp`#Q|d|En;^5c`#FMPe3epoQv{u2OG|<`dN9JN>RxDq!v@)~#7VAg#JD4VaZeO# zsa1|%SX%M$@Zsqk{@PhFn$s&DjX7VGGj#px=PKsladkUr^+xHi|T3gJmn_Y{(|xrVN-g!Ua9mw^78r zdhQbcwVnTJUm?yX+j;BkM(O7*f>l!);3R z**g^cY&z-YtXXlJ$~<1-GG4k4#mEF;%WK79f%Au5x`|U%i8UR#N28$N_`^X|pZXB@ z&2?D^d1zA{`+zMCwx8y!hg3TTib!VVhvM^FwVgW~BMb92_B2R)-m;d5pjrna&lkU7 z7KE&RVlav?)0KM{Y&p3?uP4+j*9Z4EKFnywKi9u$Qh~;1*?_oyRnL>ZZ#N~K;@x-AwRd^D2|5^Fj3^izJVi)TDIGNE2fn8mZ+11D z{s9=h!&gRH=~6e<5j_pp&T4AP*L>ChC;6jvuZ2aYAUQ*`8(dsKid

S3TY(BQ#bXBPC`~;Tk4nDIAB^tO*{;rdy-T&l!)8QS*_QxkepsMn$sP9!e^= zD1}ogCsv0Z2x){OJ?LLhxakrPd8KJ0iBB58ky6ReYZsFci%vSn>t!-vcaRGllm)jn zbDLo>_-)sAQc~`3R5>=^Icxu_!!auC*%M_fl!reSY^p0GbQ(5Xt_lZtY3k*~>|(ut z;d#IVHD4Uc9!G0)%QF0tBD8o)7B%7jP1=GPADRX_; z+oVD?$>`zM;wVq?Klq3czGfc1c%-)?K#@uGtG<`w6Og9tnks2tNUXWP@A*+%c+%gq zRc29ATa^D_>89_5!6finX3M*%1*%`)W0zhk*BYr*_$~ zSytxh$ourQ=Gk08{OfZJ^e~*yy=mn8@1>@7{Q5fueru!6}eFgeTp(a$EhH zFqBYJ<#9}IQ9uG22k6|YNoR2*q=@ggy?YBc1<3QlW%yssMAUCI-)Bj>FnW2o{RP@n z4n`Fe2Zc#UvW;V<-`OTNY_pp6FWgYTG`y;|ZYTE&nW&={r#V>7{~LgC@CHcrJH!^O z)oK&az)+w0e8r?GnWTXN_R5=0TjofNLU78qz8P?$!) zlDdXwRR8H$^^p6(IO*R=2wK3~G$&ZLwDEb{JXqm_MPDA44J9>*(rgarM)GX^AL!5< zQeQy;s5+>wt$`$cA_5ATDcx%i6zA2e4n_VAGI)fNkEs>0>9ZleIWjH|(y@%~&57ix zsr?&<^oI1V20}bxqf5WECUC{_dm6cF2_;KmamGhuEUg%^j=&>oh~D z`~HPxrItAql)iB#+TR1YbcwC~x8bp$=#q;mI-q~!2gFf7MY3s>eN-*89334ks+A3u zDlGki97MqcAzDtzNlHKnk1KNtz}vKh&He`$0{%#(#b*UqDhE7JM*$&8LuB!1$Ckg) zpkYnyy<-A%J5P;s{AGVpS#e%)AWn$RJFU-#l{j7c!^)6fT#YKGPHfM!{~yK&I3G?? zV3EI{g(geQL}SHT2n{V9+opc_<(nqBC@hX-0;TbbAlZM9c}R*Pg@7Kma=`C>ZUn&K zSkjs~S`z&zQVD@RU$c~}Mk}6$o(+)GP*`rp{iw{S5manY{Lk#qUIM>9+3_xUWg$+3 z?FEY|3{eKQ+|`}qiVV++{OWTA{}ML@@M<8$Y?1#~xF^;`MmxS?B9M}$#3L$+{twE5 z6%9Z>ymrZ0f&6dSqPAgSsXZ$kN<;CA1Z%>tAxrQt2YpBcJR6tnI{0X3gk@Kpq(R&k zeYPFHw7UgBvGDXW;B1l*6*kEKS6OObd7@y93F+9#?ZmoB^|X7u^n`F=5k67(&o0;h z@KwH7_~SJe<+j3Lw+A$#d#Gt|(1gcOuqLkN&2|1Rt${F@1zc%{9K^*C;koz&e>tO~8m=o=QvN)Bh>h zi2zX(8L*|-6m1Xw>D)Sw_g{BKiUtD)x`&Pz`+2egQ{jXQq&Y^rSv+hyPj3ln9)o83A{WQ-5v-MFtgkqV5)C%=&=zkyPbm;m)CF{AsI`~E)<=TZcQQqw*39^3kz zXn)C3`8`#MP~h!4=8Ipk7}dn5IjOY2?gqj$9XLqvE9j(-r2(#?JBAXWc`OOs&6MyE z-o6{MK>Qa>^)A4#XQLhz#QD2L9)P?EY zl+UJR0~>iEO=r!t$}J!aj<(pX$=1w(EuNW z8hmP{tXOI*1_d_QOj$rbe9>hA%80Xc0XFT!n8-f$N$1I49JnQ&9_9gLaU$)%hhl|_ z&UEK2mFDuRa;2x;my|--s>h9&nAxh*#>I`dc&xeU|J7}6!`9CBELHu`(R^e%g5z8?wxGVBNwaUpM z^+mD1Hm;?vaBcV9%8&k$NXS0Pxg1h1hFW{>+&-+~xOMWix|ZT!FwICBlqb0PtgDq@ z<6<&|zN+wB=+fB{eS_;Gisu^igprUB)=H(N-<57`qJI&^_iU8jY$c+DqEFD(qjI~y zoYe@ifY*4-{?DLNx|yVQjI)b%g=*97UNTNoa3 zxLlKjOEt17JvEC}0Zs0xsg(BGFf+jdwsx_3dwNZEO!V=lF*D9+j78R`Ul{baa4NN+ z{MT>PzJdg2GVRwQMr)7R%=SA3(~|ER_wZ`OO}ted#hQ51{or!{=orq=H%=KEqF3Ei zr+nEa3~|4wZLC(i`8T!|?e(3w37CN{^8boEYl8|&?jHK^&$ZWS8;<+Zrre?u*u@wkSeA6^`XnP{8p z>_*e^u*AxG3~I4}7tcG%=QRDtJuY)QWDHpUk#_v^+lRQmj#9lNUuqZ5yK^@flPkqf z>iLtwzbs8XaNa~H>9bQI%f!|wDDDLPwFrw0K>bv*C3E>Uk|Lsn>}AUe^YslB=QCbw zEb#M9Eeg}F$$5H z=d}vhit*;_?#B5pezMgmeqC0pwDSbRH}P*5n2^pmI{tZ_(J}pai+r+F+k*e;cUi+7 zbzqlxHJl}@bzB^ePGUS0NB995!M87XUnk|p#6|trQ05y6DyT6Ja zKYUT-`t8O@5u0?irO_d_Rgid9DZ>1u!EvQOo(4}SUrDv@EtC7Z_jA2z&*ePwfNF+O z|KDm>VNAd{gp_dk-;3-%VfK>-6rJ~S={dnzS_BsehW(7Tui`Wm_a2l3OOOLeA92tx zmVR-U^>RYXgA&Fc`t3j_U5>&fMnm4dHW>!Eu-WwESULr&>=Yz(_! z(!o12_?K^$l4PmY@!|O?93xho$KUa9fCQbqcL=IxT`|+dDyQCR>v2w22{`@IZ{ghz z#VumI{ljg?3`puBg!iXexL5=!&Qe?$<$5IW;7Yp!iz0FPb5|J=0|J{b_|JU2Ot&tn zdXAc}W83B8*YUVK=QRp6#S~vwRaOY?Je%Sj?dO}jDQxvB(r)ZfeA|jz;dL^p$1ZeZ zJyGXuHOT<^)r!pOQdse!R$1BOYTHumG?g#(4h~*22AArsK$eILzy7 z-0iL8GL@6qAYhbvg#^TL%N#13gs1bY*aZxBld15d?HUEdu9K^kxut|(dj(+e4;8e3 zces#Yd@}(zl|TNrO|{V!L3a9uRj;Y#+R)w1p9 zuw>qeOn`8y3(0&EIIlP!gxA(khRa(*@t~LF!kaOYw!aFov zXaj?Pxy{6nJ;ePsyv_q+tg!bFooS}*2H&&Ezc-&sb;wK^TG51jPWSl5bADdEesMNV zr-S7mfaz<(!Y{B_zCE)HVq}D4e}BGJW)3J6+|VXA31Rf=sGpVmiV!iEJ79iD%BIC| z%97rzkjyvLD4l-;1xu&Iixc^#g?z$UA`^V-Z6`X*=%94^4^|t- zy8>k$%d?+b@r0D2NF+yu=xYu1t?GDP?{>+mv9UR*lCXxcu)d$$#_YP3Z%L(yQLhB0 zhb*?6cOvAIu*a-@Iib&p%}HwGZfqC@9m*)lOM%Os#-M4ZV|vB#H_*CGM=Je+fM@-`2_zNgsF1?ALoy*5PxggRcoOo2gXUhxiWWnT!2zYrEUaJDhx z^+L6Yu<)u$@$M&6k=!Ydn*;KT!l%%17LB4&gRfclpY)41%+?Rj(Ryl`+%CicS`H97 z5*KIz3GWX9Kc5E2>6)6hqQ@jFs``~6Eo^338*c`Q23TN5&z?8vVC-+4_~JQenkvYu zKg*nXWvaDle~KKv0AKh8i*m(jeU7jq8)}BcD08-aA9k!h^YMSF)4(x^B-@)U< zfozc_a`s%Jp`Nla<~5My?;s_FFP<4RrR<>Czg^|f%}ytdueU-9T}9qoZgCu_$dm6( zurcR!dB6K=&N-qoILY!6DGAy{MjPKo!rMHM!uk}F*D>K}l-O{EGPy$vT)Qep_6T=p zPQjr&o=^RlH+Gc(8{>97 zlT!_?;Kh+#E;h3Jaf#KwHWBh0*9oWY9TZmed@RWn@L(xHw?_>k%`QSOS?==Zlx#Ue zm=k5kVU>quli?3zomC&NSmML(U}7RP=r5m%lkH)ao7Q2Lc}sQJJ2C6Fvh8R6{bvyj zJ(nBlGHy6G%_n(XU(mPn66Zr(tn9*mvOmb}|Bk+uHI2&tJZRw~_UDjIE69}!{4}lJ z0y}13AVt9Y%k=5|Vr~*i51#=fe`~TKzyE{C0Zex7`e>7?s$aMuBDtiomy$!h7!SEa zVH;t@wBy-Rsah_@lYHt6e{16W@-w??<`IGpmpjNKxiG@|RmT>;{ihFj3|{PuF>--2 zm%HV8x=@ct-z7&nkC{RQJ&*7Iaq2`FSj5wbNgW29eFz ziTQZ;l%52fD9AC9YxpS%Nqc{_F40=xFYW1HyPk(U@ku+!Knfu_oD-t>c=3(_xao4A zR8PA^(PrJPmDrbOw?VE}%HIo8#!O0!mmNI~330*K`*7h@<~MW{z`-eWF;^0A#_QfX z;^i9uNpacT9}=#0T(WG0j@Cr)o9t*Om@80{ zxU>d^P(L}dw?SBFYyRF+cj!RaNZ3)6`PbA6f7yI2EzK8Uc(fgYOFKKG-76yb21jXA z*Khf+*FaTCERPLCHr}t~SFw&fX-Mj1@%U_L8c@me%qVddoeH9;73bi*Uo@s?G=r^c zAJr}7yUQ(n^?|T3!u5#!UFh?5_EA)7ov!M`AB+YV4Cpl9Eg>a@R<^PrMBRW&Zs%4w z$7mBvA;B!J(T=JN^zLYL=Qd~agY%iY{Q{d#{2&FX7fh)GS?h=4Y4fyN#JgRg-zkoa2vuiG}7E&^Nk(dG=!?%Zl~M2g}A3wOz!8Vs#od8$E}eJWPDt$4byPlp*9{bAz$OXQy>IACIk*|FnKyKf|K4on z3~H&%_v&-F?yvV6@j57s^KIMHOpgy|gShs8a@Z&qjG2<^f$Dx@J zk2$h;NS?6i%XrHMwHhw@YvUxBF;VZ>kxyrr7tY*zn>JkHRn(nZWV)X|6v;jabMwf) z5;BP^CRl={UE&M!xM}BEqum0WkR(10sc>nG?V{614Ox zEw5r5yJ0ed#m)3-lVCQum@s5VZ5QfRBTgb*G0^a$8|1Y&J8R!6_{(|su%y9aGmrUf z+WrhFWRut5{|%ioHXt-^?ePtIHsBRqyd|fpD>A#n0uB{d8RFD5XyiB}l?deTQ0Xl&=rF6$v?g!@@ z%kgtJ!&;T<(}PfJCNy0P9zsk4@gCZAE2uAT;KXYh9tPkp?u_R*Y@N4M*eL zbjR^%!(z`~ye@jq1k99nWcWL{oDrWD_WiB(y>EUVPuGj{{-6NZPvG5`n}D+`BMQs` zA(r02ToDcqWN?b<}q|HIn=>r?0lXG2KJbF%af8s2EWn{#rKG3qYl|weYOg#yR$UWV7kh}u%(bxWM9;ud4V`G=xr=|JcmlI#KLJ<2 zKT}Uhq@+{Glx@RM3j6!enkp$zURzCrx;bc8QGEB|nzoAqdT@<$zVX_{`(0*GFF^wU zwk85{A_GDJg|%|Gvq$#l+n$r5q43By1_U<2cn!>9j0GJ9>cRLQd$QjK6k3IeC1lOs zCBT-S8+X~}eluz}{M*v{*5|7rSP0lt3wK-H8KCoEG?}+xRTE1n&ZcHEQdwpPZ&^zk&AqtZwxp)=W zm6+zdWyKEN4#*$bkvKxCW&VZUQdfW+uVImw7+#jhwP^u>eD%Occg(c%pL?cXpZrj1sa~9; zS)9bca8I!1fFfo-eX7fyvaFYRfg~C51?QqZP1ZZmbumorASX4u=kneDkqTpu0E=*k z@b<-U9gyXOy;DU5Qs!%lljOMKJZ9EZCB*c55QSQr;UjWxBAO|vPII~2%l~SyeqA8V zAk({@+4~BR>;1s5ky*rowLeKtQ{eX+$2djtf|c;sw;f4r$pST7QH>GOt{9)9Hlhk(l^NvpY6; zZ;#O$rn$iR#H5Nbq-@b!Za#v_I_aFP4d}Nu*LX7pCsut&T-VLIT575Rbn(Q*n61N? zvH=;~p`p~aY#?oHS-Ve9IMNj{8|g*eZ$(5EIvvw(X+j4f??d)W(gOEsY5eYcu6%%s zsDzJf%x|W>Bc$Kp0>&fwR_of??ipAD?;Ws5+VM!zroni7<`}eWl1OA(2yF=>1mM3( z@?r(zB-?e&D$DFn?`J2NDf6^P5DIn?m!cu<`MfL$92%`(h5|CBi~aLb>NT3vF0HX? z&v5s;+7?h4cr2Bb(3~Uu$7LlE;=Q8732%YJP}cL}w0K7KmP`VLr_tj|G;?6TKDd`+ zrJ91|9Q3gFmhXkW{FZ4+IEmx&-XG_e{}naOW_9l(biV0K4Olwva<7dOYlt-sH(#CP z3Fd%K9L!JiBoM}|ny-jCL&Gpy_-B=i838Qm+xoa9w{an^ef;w-;RxuMUk|&Wv^J$j zzVMF`L(<+^23(7Dp%G zUwZZ+J_)rLQ=PZMsV{Cr*`*XP$lY!RW@kD<&SUnEZ{kQMRo`K=vBdZSE`n?%L(o1e4bMc2+-qz&ikCVB{Is*D0g^_V-Nuj^$s0tRZ zLw{C!pp0d+&fRz|oF{O68O=dN>qG+*U-j7Hc9h+qy zQB|hcYJTxk&}uG!C<3~0L4o@~r7$Dg!uA788T+a1q9304brTm3*ctBv&$13TtXKmj zN39swVGlYicx*|NY$&@5efz|4#ty0~!6EceukJSbrs%{(7cMxQ`5;~T02F`^)<^cogZ z^U9GE>1|&YbQ%HOYHXjzqTi_|`BZSe%ab35v|u|1*$e!zk~WVwo5(z06nWZ^hzV`H z0;Q+cpWWaE%v++uv&i#Nv|^`)7Vfj`>G+`IeAwkl`VpS$O_}UW?_0<_s$5Nez^gul zJ`vYP(Sa6v&AX0@d(E4#Kk{DIpe)Z}5FK{Webv@!`>49d>7G^?;mM*+L^uVT%{1;k zq5{ReR10dDM>j|1mXbRgujen^`UxDN$LT}0R5$MPI3?AQ zXLtB(lz6VygbvjD#hEmG3r|wlz0!+Bd7Cy=JgHD>1V^3H_Q)2~|{t6b+`*T%`K zl+YJWJeYS;vDAD-NA;?|qQc3i^ovq{Dtx!~IO0iavOHAVV-dsQhn4&w%z5iuSf$1^ zMpVqg?p#2X{&vQ2@xnRxzWg=>CXINtsdaC_>8S7z*eNnCYt{Q!e zQP)6FoSuc~lPZG|rV;do?|gV+v4iKEOl}2^^cAOe+TL0rDWfv0NoSXDnKCYXy_OBo zZQi{@qzj!CSOSWVAm~d^gl^H<+2;W_~}__p9GY(JC9-Mk9BiT*JmRN7GcFd>t@D&eb0s% ztY%sj)3_mbnyRcP4OxUMtgT0!b}B=zkme3^=s{SDBN2s^)8XmXr~MLP%fs*36a2=& zeMNjzb(Pf-Y@=R#gLG33K{&`872-(4%52J05&0W#=iQjvW_2M{gRYyIvU>;j@1ioO zQviUZZ^N7X~4;iSP1^eVz6`bqUr}Mz6ufh2se9 z3e9{6@nL~1ED|C3@2bd(JrJ=^g@#jhH{cd(dG2_G*BbRkm)$Q0j4nT==NT$~SF&-g z9HW*Sp>#+EyVo4sz*tL4+xxH^>K1EX=2BuE#a;yL*d|Xs@7y$#7n=m1_=+IKP#2q)8-jv3u97mNLRs-O#e|SMC{d);k^i(U^)-i zXtw_q5OT-2u$3lK!6B#=@xVuQZ|7wey+!U-A$x=8*M5cwJy3%~FY47C!P{{K7& z_)P^(JsS+~;W;R`Gu-3VhKr0~gsJ_*%c-RfGrpDc~uA zGPRB#e|wd;J9JH3fyeaZ$I8b+QzPz()R)VB;nVn)m$U2TKWE}w4y<)<97eTgcgjgA z-&HB;@d-ISF{Az6;@g@?&$qWWx=dANRb6bzUiPnUNN|q|*7t%~pZSTN80s`vI^zbV zEt%8{Y}o~QZ1bJ+OnC8)_!qaz|FOj#-!%;DImq`WI5OMI<=p9VBX3ij+eL5jMg1sJ z{)J@K>l2Y(9L>$dFN23K-3sR@uYZ!&FJ6$HY>klw{y)kogjDpUc{g@KOI^Z?bRX(( z)EPr-dBzk{-{;a%AeyE)!FFknFodGM|4Nua!WL)YqtbDc3ojI3ItBH<{$nwGM550^ zUCx}<@yShZ92##?;nO2cKKA0$jt%&&iGY$$jv~f)=o*dOPgaCR9A?vm25nA@i_7M0 zEoEycvH$fFpgaZ*!$Ts*?ff|GsvSCRy)6($QX&(3Ril@CY;0^GdaV(KByXg;nQOi5 zccFW9M(0(wq-)T{(_Jl%ISgl0iGW)l{Ow5cO+E&Ephn^=4->VPq4B`PoRfVR^Uv=0 z+4m+|w?DWn9T~O|9c*@wzD&@Yv#pB7Zr#**I(_%Ax;QXobX;0NJ%-t9{5rwTCb7Po zq%l*O6GSCcFdNz@h!ec9@#344$v5&^I7(3BduZiTJ4tdJ_kYRvO8zm;0dq$5IJ!#( zM9dn_jMhCotXe+cnb9q)-b@|#a9tF%8dXTaej|u91pTDYOPvVPwR%bJbN;H~fBte# zq}*CeRX3ZH=HzS~tBO{p%{XIQT@j|bbZ;WGID9L#_=g5uRVy{Pfb4230Jo&SFn3p% z|L3I&DQ>lXPX;Cz4b30dtHnPH3LOcryK_?eVP-ZW{L8Ddxw;~DBMlv>@LTeFGp$&b zScQ@opebqLNOgvY6!MDJ9Y%H4d!?x*&hCw5+1l~Te@5;dlv)C1rmY#6B_Zz?7Nv6z zjH3Q|UtQVt2^s-{xtu)u#9HYrvhup?tYpLdWU%Y5mHTGq<_z_U%_hep@t@%*N?nga z?&4x58B(OLYTA?B&G_&eGdi|;tm&|3vmwfa@0Wze;Yo9^;=7N4IqqL4$tXoDV96b4 zj0fe;d}DDNMI%Bm|3tDUc(up&x-hQk@VXf{NdGZEesHd+o_hXFP0bJvG*asti#c*6 zAGdxI?Q(9rJUo;LW)?|?r$hJ0LKtARjQreQ+xK2KN{P|u`q=D|BTSvT&2Y=Bk&XLu zZ-&~fS6*%1{a;BQ-@6d3YT`Nh9tkbP!E5nli6Fbsd}uR7!I#pJ$q zqXp?vMyBI?5)Y+B;Ft%{iLJY1+oOp)a=FoyhmCYDO%Way@id(G{!|U&>r;R`{5DRz zhyuf?%Bq*gTuQ4WtX9>ud|nQ$mP*}2@H;RAhWZGs9jacIu$ccZ);(;z<7@rHz*rIg zPjSx_@1g+P7sV;Wf1<4N5fITOy+ioL{?{=t(J;WFhjk91KP?vhfsKzKLDH|F{&|}3 z!b9pvw*Jj-t^YMrl0%eQ=O{jb=zrnl|6PTA8}7qniI>~+5&xBiv80z#;{8p)OntQ(G4HAlXg%w5_!ba z>Y<_%M20`aCVBf1+xvCdouL@qq0o$n>yl!kDsS!K#b*F`5xjWJB=EN=)*d?WR_(34a;p*kzmKOPAQry*W`gDq5C+)# z^$`Jdxi3C&m5BZKl&ABKC}K=t0$$b^thzT6!h%jri#|*gCv7AFmvFtY5z5$^js3-w<(x|7E4Z8QFz-py8e+Z+93bqg`0YIAZu;)yiSqjw6)&Ox8g>uU*M}4?)z%XB zynZt66A4SYC;PYz7TvtZ!h1=(CkmX&Ew;Ep68|(l(i#;-8?g{C;LrNnx;XN2w6I#R|Vg8@GA>&Xh0Z=Wnp|-WzJ_fUVlY_@`GF&RwzG0(=5{ZaP|zwopqgT57T5 zpGsUDF&j&t7^btYO8@IKl$b!Jh1@Sv(&VojY6TTP20V=<$Jo0Ov#jY!q5H?%M6H3e zu1QwwE5bM5fxp!D`hE@mcFZerz$-Zt+zANxgaD_V<2H@>?eD$-Y=gIShg4b)g#`Eq zHX8Tu>-jN&em!&Jeu~Td?Xg`~5Cqxpq3|>u_{YN8zBS<+ULfPy6_`f)8-?_S=Jt_@ zu=(e2sGER47v(-}|Awaeg#ozNF>wj{uq552($c-)7tDFQn5s9WYRX{!xBAEsW$!)G zt|j~6&wc-l-L^@^aS!QCYV;Bs;AY??Ai_Jmmf9o zmFTe1(D180`Oqf+G6x%YYvMqRSd9_BXctF2faQs~^|$_!pX3B=5SFOmXW3+Mp4Bk9 zeXKdqm%y17!=VA%7-`h0bK0O@kF8M%%ipq5FS4-Hy1@=8lx(e+mnDVY3ydHRp776> zrhLcHx0|0HspkH#5*stnip|Aj9Ga>8O)LFV4@k}wcn89*mJ^&6d3<5AP-gTTdjdU) zCz|ARcF}&8^-t)L0J<`A??=5JB3CY6kszK5hQXC+mI1ftgO`tNuy z1)5v=b5CrR9b9hKN84DwJg%u%M~9ZCKZIDG=)0>}j@JCNjOgu9 zNM4p!_g>pGs&!hAK4@iQRA<(Ru76wahlW*C+5UZ*MFTv0g;po%x}$sGw8^-%l&=O? z)C%*~s#i3~lTRE{ZPtI1Z&0mRak!24Xmiy7n$v#%gHAf&ApuYSCohq`z;-~hid$;vugCwxM$%KweIb8UW zn2p(WteEMP$BqPs=a8^a2SrMq1N)H65hB;o6nu8F`^J(v9>Z4BT=)L-~%MNw;*{1(zkNG0J?naMlZmDv^$$ z{Crk(3yb5o6xEvpMrwv#8s|L2Kwd|=< z4gvlMJ_EM6tMh{irJv_?vhS-QWgoVtnngMsSNqeLs?`hex2I#2@wdcDXdMm;YaO<= zH9ys)dsYOzDAegOL7wH8o9=pF3XRUFHx^uHo(;_2I0=PM2_4qxOyQBRN8#vH)y7WX z$;Q@5dbqfE>9+~~6K;LdZx;oRYO2LuMz>Cvx9xY=V5A(-(5q6<{HZs|sGK>*EQ zLB8gtnmwf5VW`ZD!V&Rr&=3J)#xdvn`pAHn{y9IgSvKMijZD$57GOE>*Fu5PEgYQ# zBFJY+BLnQpJOUGkqbE_0O!JsVs<=$ zYhyMTWp!wV_GnLgr#EohezIV8p|Qf!5x$BPJRBxcy^1sLRyPVgqIjuUtXo?EOKobn z*`DIS6TC{GhZ~J-|2*We_{!Q0Ik|?d)~+3L$d7T^PwO0fL$YH($J!Pr>3lEYww!a~ z0Ll62us2V$e%WDYV=DDzsM>%diYv#?`N`L@FLbjpcp}>GogI4;(Ip20ec1qzTok)(U?tU|T8O!33^9A+wyh`M4}A7eqR_b_2s;}k1;{yU*&Tv$!c}t!wU3&cEyFaM5EP6%_DyMvzE+Lno z9@^;~2;R0@Xx-{mRn)Z?B+=|*rl0t-l@wq?tFHtUbotIx`$Z@AtF1>mnSH~f=05Uc3NBKF-W3k+a9N@3rU>+M4g5Kq`8q)M= zoYkAxH&g=7q^@0L87h*CY44h4FTP4FH_rjhNP)^{yzQzF6lv<;{R#pO$To#hlGVI0 zL}&j@4f@64^A@IW(ldGKaJibJ5wVk-cnrNbve2sX3=r;5h$@sRb}(sgIuV<=FaKCW>ll%r z-PFn4a$Cq}hy4Zm%7ouFx!O^s7xRsb|@{FK_GmD(j}$U+2j` z&ZF9#8VF^v6QL4rQRIv`B*@*GdP6gv-zs;YJ=R}0)um>R$j)bnk?FqN7^$6FTm~WG z9q<$!XjXcK`wG*H?e+!EP%)Bal)p4Z0-sJ?VmrxoJ-}X4eJLO&MfC%q9?JF>dUA=x>ym@ zWyaUvrPBu^5GuGdCr#RkcF}r(5khijuZ0gA`49TD^R-LKs?i{gLR6n41J-8GJ4;S- zL6i}D`_HJlFtk|X>dIY)7iWoknxa+dG!3G*#81M$ zw=R7iAd$AB(h=Kaq$EB2k@Ui*qn^uX=%FJ(1Tx2`w?0Rv+5}8-u3^s@LyQeqK9r@o4qY}q$7VdO2flsMk(eBD8+hFRg z9uE}^NV_i!Tpl3q|~1u3z0QWjj-VqE@0ck49j-cf2rQ3kJ=#p4ZCrMUesc zAE?V2HA%`efn(F~mmQO2pxVUCq?-V_{0tUbFj~rvJ*RQ@t%H#s;5nrTD&)$i=W_&| z)0)}n=4*Y1Eafxm)ba>qki>db?5Uk!2T{$C#3f3V4nr?~csAnq#pJ}?hGXuzn>Wy# zo=T(OUtt02TEpyyds!VQ#YB0E$;_PMBxofkpDy44U-0c_g2~!GK*xP@v&3yvL{O+# zIrK4hBP>$#!3eYKXccAZSc!%PJ}vC1D5p^P|Hs~22F2BNU4RLJ1PiXg-624L-~@Mq z)3_7df;+*2yGw9_(@5hGf@^}iOK{gl=91)j-{+f}U-M_anwhGuuHqI~&N=&@K4-19 z*H%d9qdR}aQ61?;W&G0s@GCB}M8%)h%k*ljbt1B5`-~1Q@c}XHtL|x2)>G<>e6Eiz z40PEf)BvORTkTF-v-y0J@V}RHU{+$^=({5>6~+nss!Q^^qa%$=!NwdqZWM!57vG|N z*CkxGV(~3e3Ye-qjy^Dir_=a_I-*S?F~d`Ljia2S-%ttLh8_*v$bruxf=p9zDlO9& zbYImrIF0`X?XB$N(6z4tuHYE2oo_|?{R1?NT@Gh*JM_fh>|G8}f+F_~3hee|$e^8L z57oD}Rg!z`*iP+qI4ekehG$y!HSV2S($sQzC8w@Z;n7{D=x9)CYfXr>!&biuO4+4M z5{qS)G?so<%1r#zNzORg6z-rRqRU}pqFH2 zG!Ba?5kAg^K`Ur_@O3S+YPM4!tR-Ckqn zs0_e{J5?X0#eu24u9D-R+%|*VbllFZ)MUK%eEN9zcydIOHy}HkC6LimWd%U8$r(sH z{G}@GIBne9W;M^!nH_G5sKtA8M4BcV4Fga7i;%8_^)Z~G{#|phReG;&BWKGYjqOZ1 z#Y3?XAqc1?)^_`S2aUdEzE#W2`T6?T;E)L(eb;f^Ow)*6sR10t?1{=XT<3kZOYF-o zW@GiT1==j;>+VLKnQAjkt50EKnjy|dL!l%lW0OU{h(3J41s@JQhTt2OvHdI-(2B{RK-QCZ8;~bknCiO#qN;FK%3)S17d_HoiXb@E^qVB1s-wJ z2M!AjJrqK|A}*@RLrGKAg}^FGH6TH-QgIgW3F`^GN5rKssvEV=S>4A$ueW|o6__-A z3Eu=4NqtW8R#ZT%S(KzBH2lMJAoC^G4%^16HuR&uuw(YOG>RbUk{-=eW#vI2JU~wl zuDfZmvzJr58bcZ(VqsXZM)c%8WY}91_dYKofK^D3@?r)Huk-%9N$DGNzneh|^{1+# zMq^Pry_s*_G=n1T`RTs(rLddC^VA-w%n@!Se3ytSi4gWqIO-k3tCSoi{yy1=_ZKtq z2J#hljRxh(2-GjH#NImYP?}GZ(!)F%J_eemVpwLBbik@xFuYJZFYI-#)VrFK-LG&d zwPAR4iEV%(EByW{Naj%n1Yo4%m*s7b+x6r*NRXBa=Na8pSD37UuExN=}q2#KP#X#6R?{ z-Nn3{r7|#!i}5OGjn9rq5NF|9MG=e{vYB}h|Bds^$2d=Mr!cPiKDnP@69<$p=`)Jr zW2E8_CcYEt-ou{=WuhihqWSQtp=5gDJU`dt?S%I`( zJ5(+9Pwc!mVb*P?1zcXrAbGWd2Vz;%d{4ES-Dg_{nT;Vf8o8btj?+yOZqRPHizBUz zAhc>D8rgBJgV_P}`@NqM#IcL~y2@I&rnTzZw@{gZRlCUik=a0+K$;Ltn4B_^?ckF1N-LL9mHLRSmoXvs|;{6^NnH3JvhiHj#Pie zG0fUB42xbr^!iV_Ycw*jYmR%;xR8UZb=eK`>uW?y)bwnM<4@u=^1b=76~VG*4NhcYkUQ-V8+$^nwP&H>UTmo+Ww;#O-5`>R!q zD~F4v`%f0Z^W@Zw1vS#gZRwBLSFP2|)LxLX$G$ghtVUd!>C8)#hipaY!iz z9ftOWcWK(5?U9qASUyzDJ;cwDcv`%KtI|iu{EH!zRsx9k^U1r_4^r&_%w?HvH;~Tb zr3URu?O;q{mpSLPNkTNSojBHm(4#}4S&9M+)5ZpSNB0HXOMjLIFd+c2_hf+)B>{F1 z=;r-5^QX#7P@((9hPjp>-xY7pw)0PAtn;n5V~H(5e_*=kQD8-0aK_tt93%8NG)7M_ zLCvP$ajs>%;#!FD=?4~H3DgE6ZYJ3f=|&UISNbP1WlAocD;6e%+6BZ2f~?$^(DO17%75o&fU&0V!AL_dm#+; z2PF~#J^uJOnyq^ozj+1H4Pb9AcYPT`LHRTaXc)ht!5?-(=n+Cp3$@`ae5DN>|FrAv z!1?DM$3S`{fsZNQCs-v|z+eK)p5QI~A1K`z&_nL7=VY&y02b z|2(f4=21!XP%L+xg2DPo+Cbr56*~qzC1CmRd^DL`?Jvl9MCDg9CG6zl=C~FAhCYd! zk&%x)qF+pOSua4tP0{U~M)>ZV9%Wn)nLKAtISmvUNz@@ zG{Ms0x_@H)%{~^#lohC2@}e|_Dh>nUmq}~<><-1@_D{4?qCJ7t_u_Xv$eFLV|Ne@p zG!T>!2viG32KXSJZ>({)2<`n|I;^NjNJ$Jk#M5Pq+gPW34Gyq135mj!kSyE_@qef^ zeTpY5?mK&MepEO>GI32Ty9Z}qDpg#6VRfzXBnhmYV7d0o1f(S95*BQ(b1H+Bp(I{2 zp+!`Hx%0Ge{Zo?{nC${#mj#|MSc!@T03d<5*29rT8l4H6-C~xfn=s5Uj|^EFn}7@< z-0xTW2?8v(U-cGCKR}S3rB}AoR$xe(CnTFlgJ5lnS?~)-(sAp(NdwmhnaQ}p`K9l= z*#MSNW4SW)pSU8uhm~hghpA3xsBkxyW3al#zkwppv&?f*0$&gzNg$N$lHQ8{4JCLq zm~IRtb$=mG6(Z8)IOF8X{!FDwP`!UUJ<_g~v;r2G?heJ?^Pheth22wYxpi}dOK&sr z)t4VN5FX6r^OD!2Ksz7{w2Jj6oc`^%4zM|SC@>l?eb%qct%q`X-{~(oUU7a01CVr# zznk*MH-MVI{l3)x?C*7>$>9kFoz#M-J35#(PLhEaqZC{@O#Vjwn`eXao-q*Vdu1!_ zeKoo>bu(qC9xNQao(UHy`>Hc;qeehy5I z+sb_nf2{+AFwow5?!_-w4UjOy?dxtcXB(6cVe1~Agw6xttb*Ccl~pP?vz;ce(Uc9u zThQAlb$ey)5(lQWfU2fEps>TsT+aAwvvYKxeBeuM* z49Dk~S5QaE93bR(mwol7L0tiU?$yEV+SGCip&8)wB?R+SdiiYTl-_iYqmL+7gx`B4 zb-h|rnyhJS$&1bIN^6pk&7_}F)wY86I^OczL#B;M0*yK~Gq7)4hUa$u6+*1r(q!3R z!UB;wdmo|7sWmxBUuPwm13h(mfdy`*-pLjWndaP|9f-_mDxLieKn=P|EVui88eMOF z;bepeI!vy@ehh0$j;9oqKrd`1P3%k28MkTH2@BlsAtBA|nXge=CdOCi+h_~dNjzjb ztpBp-_trxIiRSw5!Ydu;z@2+YyR&8q*4Hj`TR#$f@O)KWnA%f|y)kZzP|E+3^Y&nF z=ZS2gBn@7%Jkck3mP*tL!okwgTV;v3r#O|!q909ehJQp|b%_ZRSLwOtGj!}i(p9Elx zo00$<7Q5G4^RPA3J`DMBaQo>EcL$P3Co(O0V36sUUmh3IuLoAxvrwt zm>2j%mDSRHFc7h7#Y^_VEhIxd^V_*Dp29B+ww+=~OtgNw5J>8iDpJ5<5`?C%oB z!}EZ7?WgBwwI|k@ZqhwX)rcz3AGQ;j9^_wliv**}1R>++i5{;uKD=^KgK*WJ2v*#S z-QRl@3fL@`e#QbwhQ~U8-dD$FGu18?Z!8_6ZVzV)%Ps~VNm?NbYPf&E`C|& z$)$;h;xZI_qbA0<*IG&gfR~)|?p-yN-oQ^Inlt;7M5a8+6=AiEzS5-{RnC$I3e|EI z#aCQKM#YrWWY7(+rM|CYX0VQG&!rYxg#g}5tU-)4J1f;?G5Zw3jkT#ZzjL7#sHE;7 z(ejq2L6kAb^pa{QjwVVr?Tv1x#TfH!k>X{S8OgvgCe3=o1q)JVDLemCUBubp+yIEN zGE(5dLE?_MObL7W=R>J^T>iVe#-GJegxtmDm!XebktPx1Bazh1UA6g3^t%;wm^BiPMx^)RaHeaArWN1FZ6xn4)?gM*Yaxxf2k=(4 zr=^qQi~$&8IKB=8@^^BPgtvuS+jXH}Jp>L7Wh3d_Ak;(}VxPg{pe~5~Cl5YEy%I%Z z)8VGEeD8%K+cM z3vQl1SKnS3&uiH>PRs-{dQY!tHS;U>&YHgltWlz85t1c_;fG+46Q{>*k7#FHmfwdj z=u@?V5~9S1i{Oep$_~*?zHs9kkresXI-N|Tt65E7!GknpY2>nqEFX$GHG0~(MG>*X zL)X!YgmDz!+E?6d3uDkM_X58`i?JtQ9fvRt@N5G5RH+Z?(Ydfd2 z!Yj)U%fwjW=CGAm(FUSsU&=80To0h>y`|f6a>}Y)THW%=#zYh_B7iUDSuS*<-^t)t z@6W^#EBgnpli_++wK=gYAF{heJOD^?3#_nf0Gphl7Ff4gCz;K*>g%}ZKM0K04Y6Br zl+My0?t!>VwUK6PJbv!%_FxZ`-ZJgjql`M87j2Q5d|s$Fs}Km1%;d3e9xqbVVb*D; z&HB0+TUCAmDtPr>*!rA%Dr61+7?;JHb*YYl?T5j}hDz ziZ$t`5x#Qb8xU>8BDf^p1#S@$oYgyCqX%7&u{5HvpbGxb&QxPYr>07X=C?bl)K(8l zLQpo{wqJIKsM0cw2yC+ne=8%8a^R4aJ=tiHAAFm>m1=Kal@uon6RGSU(p8xud=cnu zov(LDJQ+TmA;{vgu+YvE6!uL)8q0JjwTqtMt#Li$?Z+5_pyl~y?^@Ltf^)UIle?y50%rny$@A--cA312>B%@goB7U19oWl27F-`gRbBwf&#~e#4*I>|6ABMG3XHA| zYd+f^8;G~3prkaD4`U;~bJ@NQGT9UAvdqw{^ArSR8KgvwVr3a0?ykO%o_vFrp2mQh z460>Qu3J?(eI`Y%16bimJewt#Iep``KDU`;&S%YL-?q4s(1jh+8E<4m(?H%ujY2K$ zRU%HcL)q|j^I&-MpAtZ&Y`n(%Q0ttjO}ej?$rNLJ-A zBV|FNl|w_iTr-57Hz0a4pD_-+c}Ci%-%W~!{+v|cW2Oi~aY&=bk;LDnfi>_ntjkoK z9Mg0n0Nu@qM0|UNRKkc6a2il$1dF3*3&REAq#oy9BCS_DmJ2>(K>53yb(fEe_YTtB zC*ND1A~?<+L)CU~oXL;|c5?zrW)=SK!rR5$L*Vt`X9}|pjnBiA%PI?aFmX(V9(qlT z-(~3Z8j?+HSsY_yFy@oAa*1tauvqII6yrY2ZI+l)uj!hqITr6ttz&Irxj!KQopo_F zzM7jIPQ9(0h!>s|Ua1bhMpo*j&+|E){@OJsb`IaDGiPQZq<2{7Eh9yalZ9LuU5g}j z+PD3)Da*5V{QSe>wJVYJku}(R&9u=?R+#h68XW+gp!hUn zz*qO2ATLAnmx+SwtsWpNX=qZDYk6DxA%^_Ig5fYC+8Pi(?9K*GSo}cT=m%}hu?v=k zf?ro?TqJ0sYYD5*1zPo}>&8ztQO$ENdh>5SZl_4`5b)4rG{~B4AKqU zt6mNVguv){ysQZYnCqws^zA1I-7)@fIiAX8m@3^GGK!Nm_Fm>oob(uSo&k(GuvXKz zC3}mf6}s(kQvrYoU|Y=e>Mlf-tb~(BG1`Be0&e)0W#O2|S3t4boO~-vmxON+$hTnxcvL97=CIsORL4+uWec+?X01P2P8#|uEOp7~{! zN-e^Jn#6Ee^<{Xp>1FjUE{BQqVk}%#Cd9D7&TNB^$brxvtS7ejz;@Hkibq`SZqn&a z2<6yjR}qZ~pgTa-f}8U9bUWoyh;r60lcsVzn4u|iunn*Zw(-gdyy!5j1kkM#F_V-8 zr;AwZ2^x(6E7E|a#)8si^YIMXb6yWO22icS~bGTy9c) zYi<1br{&JRI3-B-K*wic1>s4HQnnE3N~c}Ul*<*EZ-y*!#p+EW0-)C;ggdU~_STBL z7H4xO_nt|5yVVMUbRy4DDu*wrMaXtvQq}!NJ8+-sS%>&e7ax&uY)33ExX`ny;Xl z#9dAMaZhqUJX!oejYM|UfcAqyt3P$WU2{e}DK@#W_lepYn*puoOvpn+C zYI)TSfv7*e`4MjYQ-^C?~Dy?K+2 z?I>%rvM{$8DQPl~`&+oL_AXwQSRrIcmq>A>oFuk)rKFunQsTXaTC?;MmY_*(D{)^r zggx`sb#pe88(AF{<-iN!bWmJ+;$q4ebsvAkt5l1-$bGBbrLlQ>5kk$*+*%swbEG4( z#YX#xMHqBz04~i-{%z7-kAO#}So2;W>fnj}<+6nVs#aiZ(kws4<(pEojQhK&5|iN< zNM%OGk3@(a?`wh?QWU06#?oqP>zO*8ZaIg$$akQ^q*>71kJY!#WYF4Bc4!O}&VKJV zuLb8r2XR$9M37aU{_42!lPCg?UhCj0MI)L45}*C{_a8$mqHAqwpQ;CQkM*RLW89)- z21hk?MC6O&DxO}i8M2^4rsI-_Vkm-1i~XeN7~-UId;A` zKi81i#Y+K0RGoNj#=o>KzRv~(6>8i#dj>0+QVF&dd0bZQs1bl6QGeq(fn37Jouk<1 z$q8&1oIorv&a2;IhIR&+!jVjMX2U5;7fBQozrmde?#x$Y4(}eabISs?Kg2Ovs?llY zMH4D%rFqPXFVGnqFa=JGQ(l!PGU-U4Yz;7Y+%M1sqmXc@(u-T8q_EnDJB7>5u(71zEWQgx;VI$i$yxn|L{^g7)% zA6O^56tvI~s8Yhkz4oz+o2!4PWBwjeM;AE-?UJ!j&N;=MXz68ia}4g>)%JN)5FPOe zOv7p^FZG!m$4JJ4tmz~;E6*s2cIAU>@+FVUlmliM@G6SwYD8mCT~x`v;)?&gwiLO^ z^TVZ`l&i|JykU35`sRfncU?~jhsm&us8}+WS)xgV7+`)7hw+=dCv}F&&Ngtk9S2!Y z`>JxXZuh8Kt}ir@bWOv-Qk1)JjB>O$RO8BPpLHpLZu89`Y-6mP+P|PTCH<(7X1dWs zdj!xM2Ti#Jp7$>T5pgPE%K*ZqY{6oO54Q)c0!jhdj;M&fb6I+d|D_fAt@4Jn#pQ4& zf+M>x2aeiI{4X_MH>F;l!@6K21w+pKPz~gVtIwE96^iWqad|+^mGdd<(WVEXmL~(G z-)l2{$|F7=o)pjPmKD%BSNGwO3&P zpj93QFIPerb0Hgw@#k7=?F0?l^K111MnT1~R*Mbk(T#+ye67QGlWMhI9v>5nAxoyI z8i#1rGHp8eLmdbMW({oldFq$)u^cjI_J&AWR?1;mW5c>dY5WgHeohnhtY460Fb-@N zMYV)hgnhAc0xrW{<^!p`1<6$KL}^Z_S6qH6mk~c|40~~9l6F^Pscd4ng3s9H&Twj| z)ymmFCY!@f1u6(W^q+KzaZkUi@8QC?EM@WhvgToJJEz?1F4fQcID4Nv@CaB2eHr0( zxyvOk36QKZ6kFRTak`l2-jDUwY3)yBqQJM7zqEge@e{>HyNwJqj!L0`)MM9rvCr)( z8cE1cKNH`k!tL~O3#O{R{QDn3+;18oSxnDWMYqPzTdHIcGcB^1165*Nu>Q$>F=v?{ ze1xsPOvg77iE(l;0S}^Z=6u8IoLK38RXcK(_^p2UE`37VIF{q0AYVWF88eZ|Vebi*?!UkSAAj)xWWwB~qKajy zE?sMkoPYhw{g!F;4f}i-2FY)|JKSTFgl`Ph4QM*$5Be4jUD`RMiYxQ;->e9ink z*-+Y>kf;+v`ct{7bTTJBaz2LRHx8R)%gy_jczBBO8g`KRedXrH0A{SA7sHV2HL=(e zJyH1#?uxP<079mFSl?4jpnD@hmL_bA9Q=<7w4Zc)XJXgYwkaB(%g=gD{TezB(^8sP zEO2H~W%z%fW<}U=6PyhFry9B@8RueeK8d~zrIDcU{RLZ?fQ>V$ktbBunfm#C?<)+? z|F927bWfqV7WJ>zm7FM5Vy)utVBnau$d+6gW@dgDdPe{RqRPn!DlmRaO` z$2kYum0;m)Kc{7)ES)=tXY5m{%}Dz{_`7r`c~k(J){$9v3j%Ure2}RSRgq1bgI)fpJQ)2Q(AhXqX;geI^EyWDq4wh{U8i%Z ze#SmLy-4>b;o+aY%))?IHQb3sJpOpy&yjU8Fx*Vz+oe4-5t*7Yo)jVkfaQMPFS!3n zT!DWNgI3$E6e1?!Y-!*tPuKO5Kuw(y%$|6tk5=K_3oHs>{azIQ8BzfEf27QO8&nBt z{}KU@Bkh|3a8Vi0PyYht0N4Y7x`48YQ{M*rh4eo(1#nm&AmuCzzx@#p|BaINN0u;I ztIO{%{QdjzG(Zyl!90Fn?D4{AuK_aY*`}KPmw(^J8DO3M*FT~+HWJ z4435VNB-};;r|x@_t@`$KE9~%SE{|6BS}3kL`-r2-8qz`4#37d;u{MN2odDH{+F5n zc2~Zzo

iq&nryzunn=^?+W#!RBK553>Yx`!WO2!>#0f|D%S$tu%0UMZFvAzuTh+ zn8}@EOI`fQa{4oF%j&?{-d#gsf9HhXPka>$giD1a_TqOW!>)D?g{=22EkC`M4v3vhaRgX<=uK>=z3r)lQw>A3_HX!HG`#)71 z@TLOJR-bRi`=?8R$Mmgu%vcMhg#MQ^eTs3!0G!>ny4m%=tSbxry_vP^X#vDNdcMIS z-+$)$Cf4JO@imSn-!7)ZkNat4>fh;V^&RkD5?3lYj%BG=B$hAePQi;u;4!1t)eA1Z zeZ^tU3}_l-dq_M~ZqB!{4^N-11gxj80pR!gJq{`$>rCdm{~&|U_bWn3sGId4!pa|r z8)`hA9iA%7%c+em)spi(V6RQ>Xx2tx`-H<{;wO2D{hBzN{q3}C7708JRZQ7XrL^3-)< zttV3EDq>fu^ux~&xwb!wJ_Ct&x)$>woy}%022Fm%SfzEhW_>m+>J7pc1JCPzY;L<{ zUzO7LWca2dGJl)y>+|@^B)R<19U_QHh$m;s_m%7CcK`l1-){Ns-ymrxd5pt%Gf`9R z{#oa{I;}Ar2c^_vp;(`t&ux=@XfzgdbFP?_YAq5zoC9Xa2^2f5P6zW1dBCQ)@&0U^ z9qhc|p3zolFVdIE-=y8(psIF%l*>%OX_$B6^N9X8FSevHGbq(Zj~Ce&4zG35o#^w= z*X?u70DO%A#Pb@w<9<%*)9N|N{duTe`nHF}XUC@}ie#$fnnA6U^yRqIXr2_N<>d=h z;`l6YT`FM79#i?_{m{wq&cud%7e~Q*dan89QmdB*vd{MS0=a{jQc!g={qEiEH4@n3 zoaLroZKx?v{~OG)Y4gWzwg!B3vIGY8N8PQa*BpC@K$YQ!^bEwdP5ZqkV$p6qgO=KX zV(Y;6Sm7h7Q!-T=<7hS_)8Jr|FMRFbuzg|zlmsZTQo20Y9D-NX6>mrwPk^~T)!KT? zj&7mdbh(!xcz>&We|yT(7fV$=uT+}cXk)~${vZ8Tw9umtWQ`n4|6C%HFa|o_@09mY z>!#*@?mA@s9LL#sD)UGSwFEksp5UA&HaEXwr0|{v;;-Js3Ih1&L=n7S$Dz zf6D{Gr<#$X>NrnnMg?!PW|iWPY1PsQ)oG(mdOn~kLz5aFta*n4rju{;GcZ37WG}d9 zachRs9{j@7UMq6FaIADGcucR_EzFwe3VG|>`|Q|6J74pqmjJm4GV$AXH-zh7Yk_Px zOe0A9Kne!!;cznbMDYUpKA)%Q(abkoUo{0jQ?bfQuFe*MD{&t{h

w+xq_F!K{w= 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 Date: Fri, 10 Jul 2020 13:45:51 -0700 Subject: [PATCH 03/16] emphasis. --- solutions/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/readme.md b/solutions/readme.md index b1a6653..ae40779 100644 --- a/solutions/readme.md +++ b/solutions/readme.md @@ -2,7 +2,7 @@ ## Proceed with caution. -We've decided to include the solutions to the practice exercises. Initially, the intention was to omit them. It can be frustrating. However, it's working your way through that actually drives the learning. It feels good to see the solution, but to make it really click, you have to make it your own and work your way through it. +We've decided to include the solutions to the practice exercises. Initially, the intention was to omit them. It can be frustrating. However, **it's working your way through that actually drives the learning**. It feels good to see the solution, but to make it really click, you have to make it your own and work your way through it. That said, a large number of students have requested that I add these and so here they are. From 4f84789e3092b12c0109d6d74020730751729fd2 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 10 Jul 2020 13:47:38 -0700 Subject: [PATCH 04/16] Final master branch version. --- solutions/readme.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/solutions/readme.md b/solutions/readme.md index ae40779..6245c59 100644 --- a/solutions/readme.md +++ b/solutions/readme.md @@ -1,12 +1,10 @@ -# Solutions - -## Proceed with caution. +# Solutions: Proceed with caution. We've decided to include the solutions to the practice exercises. Initially, the intention was to omit them. It can be frustrating. However, **it's working your way through that actually drives the learning**. It feels good to see the solution, but to make it really click, you have to make it your own and work your way through it. That said, a large number of students have requested that I add these and so here they are. -But, I want to you be sure you want to go down this path. Ideally, this is a *check my solution* type of thing. So we have made the steps a little bit manual. To see the solution, you have to check out the `with_solutions` branch. +But, I want to you be sure you want to go down this path. Ideally, this is a *check my solution* type of thing. So we have made the steps a little bit manual. To see the solution, you have to check out the `with_solutions` branch. They do no appear in the default `master` branch (this one). You can do this on GitHub by just using the branch dropdown like this: From 8d63be469372e7eb88335e4cb641597a1a0d6f82 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 10 Jul 2020 21:55:03 -0700 Subject: [PATCH 05/16] No dictionary here. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d0f4d7c..d8f641b 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,4 @@ misc.xml .idea/workspace.xml .idea/inspectionProfiles/profiles_settings.xml .idea/inspectionProfiles/Project_Default.xml +mkennedy.xml From 8cc8e43b42e8101e25002f668dd2f5157468ff42 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Mon, 27 Jul 2020 11:31:27 -0700 Subject: [PATCH 06/16] Try to fix colorama on bare windows. --- .../10-external-libraries/rocks-game/rpsgame.py | 17 +++++++++++++++++ code/11-error-handling/rocks-game/rpsgame.py | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/code/10-external-libraries/rocks-game/rpsgame.py b/code/10-external-libraries/rocks-game/rpsgame.py index 213097d..ece7085 100644 --- a/code/10-external-libraries/rocks-game/rpsgame.py +++ b/code/10-external-libraries/rocks-game/rpsgame.py @@ -1,8 +1,21 @@ +################################# +# +# NOTE TO WINDOWS USERS: Please see the following github issue +# if you find weird characters instead color from colorama: +# +# https://github.com/talkpython/python-for-absolute-beginners-course/issues/7 +# +# Apparently, even though it's supposed to adjust automatically, it doesn't always. +# We've added a test to force it to do so at the beginning of main(). +# + import datetime import random import json import os +import platform +import colorama from colorama import Fore from prompt_toolkit import prompt from prompt_toolkit.completion import WordCompleter, Completer, Completion @@ -11,6 +24,10 @@ def main(): + # See comment at top of file. + if platform.system() == 'Windows': + colorama.init(convert=True) + print(Fore.WHITE) log("App starting up...") diff --git a/code/11-error-handling/rocks-game/rpsgame.py b/code/11-error-handling/rocks-game/rpsgame.py index c3448c1..a62d336 100644 --- a/code/11-error-handling/rocks-game/rpsgame.py +++ b/code/11-error-handling/rocks-game/rpsgame.py @@ -1,8 +1,10 @@ import datetime +import platform import random import json import os +import colorama from colorama import Fore rolls = {} @@ -10,6 +12,10 @@ def main(): try: + # See comment at top of the rpsgame.py in CHAPTER 10. + if platform.system() == 'Windows': + colorama.init(convert=True) + print(Fore.WHITE) log("App starting up...") From 8a6a41f3a1bb6c9c4cc44f7edaefd5aebf44f3f7 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 22 Sep 2020 14:37:22 -0700 Subject: [PATCH 07/16] Add more details about the course to the readme. --- README.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 430b589..326ebdc 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,106 @@ ![](readme_resources/absolute-beginners.jpg) -Code samples and other handouts for our course. +Code samples and other handouts for our course. See the [**practice exercises**](/practices) for following along with the course. -See the [practice exercises](/practices). +## Course Summary + +Learning to program can be overwhelming. Concepts and facts come at you fast and most courses don't cover many of them at all or at a beginner's pace. **This is not most courses**. Python for absolute beginners is our premier course for beginning developers. We start at the very beginning, teaching you the big ideas and concepts covered in a CS 101 course. Then we move on to writing increasingly complex code and applications in Python. + + + +## What students are saying + +Python for Beginners was really well done, I have CodeAcademy and LinkedIn Learning (not bad mouthing them) but until I had your program I was really struggling. Course curriculum is very good. Thanks for putting this together. + + + +## What's this course about and how is it different? + +Most courses teach you the *facts* of programming and Python. Here is +how a loop is constructed. Here is how you test a condition and make +your program choose one path or another. Often they assume that you are +familiar with programming concepts such as data types, loops, functions, +and so on and that you just need to learn the details of how to do this in +Python. + +**This course is not most courses**. If you want ground up coverage of +software development using Python as the technology, this is your course! + +We spend significant time setting the stage to make sure you have +the big concepts clearly covered before diving into writing code. We +explicitly discuss how to approach problem solving when writing code +so that you don't have that *deer in the headlines* feeling. + +And the course content isn't just facts. You will see a lot of code +written before your eyes. That code isn't boring `foo()` this and +`bar()` that. **We build several fun and challenging games covering a wide +range of topics** that will be entirely relevant to your professional +projects. + +If you never had that formal computer science background but need to +jump into programming and Python, this course has your back. + + + +## What topics are covered + +In this course, you will: + +* Learn how to install Python and a proper editor to write code on your computer. +* See a quick, high-level overview of the *big ideas* of computer programming (e.g. data structures). +* Understand how Python executes a program and turns what you write into executable software. +* See how Python defines data types (integers, strings, etc.) and how to convert between them. +* Create interactive code that has a *conversation* with the user or data. +* Use functions to make your code more maintainable and reusable. +* Choose the right data structure to significantly improve the clarity and performance of your code. +* Create a basic AI / computer opponent for the games built during the course. +* Learn many problem solving techniques to help you dive right into writing code productively. +* See resources to help visualize connections between data created by your code. +* Work with multiple file formats to read and write data as our program runs. +* Use external libraries from [pypi.org](https://pypi.org). +* Add error handling to your application for a polished, reliable application. +* And lots more + +View the full [course outline](https://training.talkpython.fm/courses/explore_beginners/python-for-absolute-beginners#course_outline). + + + + +## Who is this course for? + +This course is for **anyone who wants to learn Python and computer programming**. If you haven't had a formal education in software development or have tried other courses and programming "didn't stick", then you are a great candidate student. + +The student requirements are quite light for this course. You'll need: + +* Basic typing skills +* Foundational computer experience (installing software etc.) +* A simple computer (macOS, Windows, or Linux) +* A desire to learn programming + +**Note**: All software used during this course, including editors, Python language, etc., are 100% free and open source. You won't have to buy anything to take the course. + + + + +## What games will we build? + +I believe it's important to learn programming in the context of something that feels plausible and real. We won't build a bunch of disconnected loops and other programming examples that don't relate back to real programs. We will build several fun games that cover meaningful content that any elementary +Python course would cover. + +1. **Guess the number of M&Ms in a jar** +2. **TIC-TAC-TOE** +3. **Rock-Paper-Scissors (3-way and 7-way)** +4. **A Connect4 clone** + + + +## The time to act is now + +If you've always wanted to learn programming and are considering Python as your gateway into that world, this is the course for you. We will fill in the concepts that would normally be covered in a CS 101 course without wasting your time taking semesters to cover what can be learned and practiced in a week or two. + +Dive into Python and become a software developer with this course. Join today! You've got nothing to lose. Every one of our courses comes with a 2-week money-back guarantee. + +Visit the [**course page to sign up**](https://training.talkpython.fm/courses/explore_beginners/python-for-absolute-beginners). From 0d89e43df486bbc4aed60dfdd68256a5e6e73dff Mon Sep 17 00:00:00 2001 From: amcinnes87 <75340385+amcinnes87@users.noreply.github.com> Date: Sun, 6 Dec 2020 13:48:40 -0800 Subject: [PATCH 08/16] Fix code to pass string literal to float() instead of int() Triggers an exception when you call `int("7.2")`. --- practices/ch04_first_lines/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/practices/ch04_first_lines/readme.md b/practices/ch04_first_lines/readme.md index 7fbb3ba..65268ef 100644 --- a/practices/ch04_first_lines/readme.md +++ b/practices/ch04_first_lines/readme.md @@ -55,8 +55,8 @@ Data is converted to numerical types using the type name (int, float, etc). Here ```python text = '7.2' -whole_number = int(text) # value = 7 number = float(text) # value = 7.2 +whole_number = int(number) # value = 7 ``` ## Exercises From 7e0b1a1d066dfc39a84e1e2933c3046e534f6e35 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 28 Dec 2021 14:25:54 -0800 Subject: [PATCH 09/16] Ignore these pycharm files. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d8f641b..01b4deb 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,5 @@ misc.xml .idea/inspectionProfiles/profiles_settings.xml .idea/inspectionProfiles/Project_Default.xml mkennedy.xml +code/08-problem-solving/tictactoe/.idea/tictactoe.iml +code/08-problem-solving/tictactoe/.idea/inspectionProfiles/Project_Default.xml From 83c18e082c0e90bbca34fd12e315739879d6b4bd Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 28 Dec 2021 19:07:24 -0800 Subject: [PATCH 10/16] Ignore some of these files. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 01b4deb..c027ab9 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,5 @@ misc.xml mkennedy.xml code/08-problem-solving/tictactoe/.idea/tictactoe.iml code/08-problem-solving/tictactoe/.idea/inspectionProfiles/Project_Default.xml +code/07-data-structures/rocks-game/rolls.json +code/09-working-with-files/rocks-game/requirements.txt From 5ade083397321a6e8d20dc2ccde0e667006dc986 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 28 Dec 2021 19:14:29 -0800 Subject: [PATCH 11/16] Brighter whites --- code/11-error-handling/rocks-game/rpsgame.py | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/11-error-handling/rocks-game/rpsgame.py b/code/11-error-handling/rocks-game/rpsgame.py index a62d336..39fcbf0 100644 --- a/code/11-error-handling/rocks-game/rpsgame.py +++ b/code/11-error-handling/rocks-game/rpsgame.py @@ -16,7 +16,7 @@ def main(): if platform.system() == 'Windows': colorama.init(convert=True) - print(Fore.WHITE) + print(Fore.LIGHTWHITE_EX) log("App starting up...") show_header() @@ -30,17 +30,17 @@ def main(): log("Game over.") except json.decoder.JSONDecodeError as je: print() - print(Fore.LIGHTRED_EX + "ERROR: The file rolls.json is invalid JSON." + Fore.WHITE) - print(Fore.LIGHTRED_EX + f"ERROR: {je}" + Fore.WHITE) + print(Fore.LIGHTRED_EX + "ERROR: The file rolls.json is invalid JSON." + Fore.LIGHTWHITE_EX) + print(Fore.LIGHTRED_EX + f"ERROR: {je}" + Fore.LIGHTWHITE_EX) except FileNotFoundError as fe: print() - print(Fore.LIGHTRED_EX + "ERROR: Rolls file not found" + Fore.WHITE) - print(Fore.LIGHTRED_EX + f"ERROR: {fe}" + Fore.WHITE) + print(Fore.LIGHTRED_EX + "ERROR: Rolls file not found" + Fore.LIGHTWHITE_EX) + print(Fore.LIGHTRED_EX + f"ERROR: {fe}" + Fore.LIGHTWHITE_EX) except KeyboardInterrupt: print() - print(Fore.LIGHTCYAN_EX + "You gotta run? Ok, cya next time!" + Fore.WHITE) + print(Fore.LIGHTCYAN_EX + "You gotta run? Ok, cya next time!" + Fore.LIGHTWHITE_EX) except Exception as x: - print(Fore.LIGHTRED_EX + f"Unknown error: {x}" + Fore.WHITE) + print(Fore.LIGHTRED_EX + f"Unknown error: {x}" + Fore.LIGHTWHITE_EX) def show_header(): @@ -49,7 +49,7 @@ def show_header(): print(" Rock Paper Scissors") print(" Error Handling Edition") print("---------------------------") - print(Fore.WHITE) + print(Fore.LIGHTWHITE_EX) def show_leaderboard(): @@ -86,13 +86,13 @@ def play_game(player_1, player_2): if not roll1: print(Fore.LIGHTRED_EX + "Try again!") - print(Fore.WHITE) + print(Fore.LIGHTWHITE_EX) continue log(f"Round: {player_1} roll {roll1} and {player_2} rolls {roll2}") print(Fore.YELLOW + f"{player_1} rolls {roll1}") print(Fore.LIGHTBLUE_EX + f"{player_2} rolls {roll2}") - print(Fore.WHITE) + print(Fore.LIGHTWHITE_EX) winner = check_for_winning_throw(player_1, player_2, roll1, roll2) @@ -103,7 +103,7 @@ def play_game(player_1, player_2): else: msg = f'{winner} takes the round!' fore = Fore.GREEN if winner == player_1 else Fore.LIGHTRED_EX - print(fore + msg + Fore.WHITE) + print(fore + msg + Fore.LIGHTWHITE_EX) log(msg) wins[winner] += 1 @@ -115,7 +115,7 @@ def play_game(player_1, player_2): overall_winner = find_winner(wins, wins.keys()) fore = Fore.GREEN if overall_winner == player_1 else Fore.LIGHTRED_EX msg = f"{overall_winner} wins the game!" - print(fore + msg + Fore.WHITE) + print(fore + msg + Fore.LIGHTWHITE_EX) log(msg) record_win(overall_winner) @@ -162,7 +162,7 @@ def get_roll(player_name, roll_names): return roll_names[selected_index] except ValueError as ve: - print(Fore.RED + f"Could not convert to integer: {ve}" + Fore.WHITE) + print(Fore.RED + f"Could not convert to integer: {ve}" + Fore.LIGHTWHITE_EX) return None From 98007d7d6a62ae163bbb8c685457af9fae3b28f2 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Mon, 3 Jan 2022 11:34:46 -0800 Subject: [PATCH 12/16] delete these pycharm files --- code/05-interactive-code/m-n-m/.idea/.gitignore | 2 -- code/05-interactive-code/m-n-m/.idea/.name | 1 - code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml | 10 ---------- .../.idea/inspectionProfiles/profiles_settings.xml | 6 ------ code/05-interactive-code/m-n-m/.idea/misc.xml | 4 ---- code/05-interactive-code/m-n-m/.idea/modules.xml | 8 -------- code/05-interactive-code/m-n-m/.idea/vcs.xml | 6 ------ .../rocks-game/.idea/.gitignore | 2 -- .../rocks-game/.idea/.name | 1 - .../rocks-game/.idea/RPS Functions.iml | 10 ---------- .../.idea/inspectionProfiles/profiles_settings.xml | 6 ------ .../rocks-game/.idea/misc.xml | 4 ---- .../rocks-game/.idea/modules.xml | 8 -------- .../rocks-game/.idea/vcs.xml | 6 ------ 14 files changed, 74 deletions(-) delete mode 100644 code/05-interactive-code/m-n-m/.idea/.gitignore delete mode 100644 code/05-interactive-code/m-n-m/.idea/.name delete mode 100644 code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml delete mode 100644 code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml delete mode 100644 code/05-interactive-code/m-n-m/.idea/misc.xml delete mode 100644 code/05-interactive-code/m-n-m/.idea/modules.xml delete mode 100644 code/05-interactive-code/m-n-m/.idea/vcs.xml delete mode 100644 code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore delete mode 100644 code/06-organizing-code-with-functions/rocks-game/.idea/.name delete mode 100644 code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml delete mode 100644 code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml delete mode 100644 code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml delete mode 100644 code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml delete mode 100644 code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml diff --git a/code/05-interactive-code/m-n-m/.idea/.gitignore b/code/05-interactive-code/m-n-m/.idea/.gitignore deleted file mode 100644 index 5c98b42..0000000 --- a/code/05-interactive-code/m-n-m/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml \ No newline at end of file diff --git a/code/05-interactive-code/m-n-m/.idea/.name b/code/05-interactive-code/m-n-m/.idea/.name deleted file mode 100644 index dcf0a95..0000000 --- a/code/05-interactive-code/m-n-m/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -M&M Guessing \ No newline at end of file diff --git a/code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml b/code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml deleted file mode 100644 index 4bb64fc..0000000 --- a/code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml b/code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/code/05-interactive-code/m-n-m/.idea/misc.xml b/code/05-interactive-code/m-n-m/.idea/misc.xml deleted file mode 100644 index a811725..0000000 --- a/code/05-interactive-code/m-n-m/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/code/05-interactive-code/m-n-m/.idea/modules.xml b/code/05-interactive-code/m-n-m/.idea/modules.xml deleted file mode 100644 index 4943257..0000000 --- a/code/05-interactive-code/m-n-m/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/code/05-interactive-code/m-n-m/.idea/vcs.xml b/code/05-interactive-code/m-n-m/.idea/vcs.xml deleted file mode 100644 index c2365ab..0000000 --- a/code/05-interactive-code/m-n-m/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore b/code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore deleted file mode 100644 index 5c98b42..0000000 --- a/code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml \ No newline at end of file diff --git a/code/06-organizing-code-with-functions/rocks-game/.idea/.name b/code/06-organizing-code-with-functions/rocks-game/.idea/.name deleted file mode 100644 index 36f3bc5..0000000 --- a/code/06-organizing-code-with-functions/rocks-game/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -RPS Functions \ No newline at end of file diff --git a/code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml b/code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml deleted file mode 100644 index 4deaec0..0000000 --- a/code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml b/code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml b/code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml deleted file mode 100644 index 55b4798..0000000 --- a/code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml b/code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml deleted file mode 100644 index 66e2a58..0000000 --- a/code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml b/code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml deleted file mode 100644 index c2365ab..0000000 --- a/code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From c14e1669605c7cc4b79abca3ae60f3df759e0433 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Mon, 3 Jan 2022 11:35:12 -0800 Subject: [PATCH 13/16] Ignore these pycharm files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c027ab9..05ebd69 100644 --- a/.gitignore +++ b/.gitignore @@ -135,3 +135,5 @@ code/08-problem-solving/tictactoe/.idea/tictactoe.iml code/08-problem-solving/tictactoe/.idea/inspectionProfiles/Project_Default.xml code/07-data-structures/rocks-game/rolls.json code/09-working-with-files/rocks-game/requirements.txt +code/07-data-structures/simple_dict/.idea/simple_dict.iml +code/07-data-structures/simple_dict/.idea/inspectionProfiles/Project_Default.xml From 0d01c89284e2365cd0114802554484cc82a4f202 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 4 Jan 2022 20:06:52 -0800 Subject: [PATCH 14/16] Ignore this pycharm file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 05ebd69..13765a5 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,4 @@ code/07-data-structures/rocks-game/rolls.json code/09-working-with-files/rocks-game/requirements.txt code/07-data-structures/simple_dict/.idea/simple_dict.iml code/07-data-structures/simple_dict/.idea/inspectionProfiles/Project_Default.xml +workspace.xml From 579194196e768327e89a32c66337386d90718058 Mon Sep 17 00:00:00 2001 From: kofilpy <109137758+kofilpy@users.noreply.github.com> Date: Mon, 7 Nov 2022 21:39:58 +0200 Subject: [PATCH 15/16] add "in" into sentence I --- practices/ch07_data_structures/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/practices/ch07_data_structures/readme.md b/practices/ch07_data_structures/readme.md index 95297aa..0d4486b 100644 --- a/practices/ch07_data_structures/readme.md +++ b/practices/ch07_data_structures/readme.md @@ -10,7 +10,7 @@ Remember, these are for your own benefit. Feel free to skip them if you don't fi ### Creating a static dictionary -You can create a dictionary a number of ways. How you do this depends on how much data is static and how much is dynamic as part of the program's execution. +You can create a dictionary in a number of ways. How you do this depends on how much data is static and how much is dynamic as part of the program's execution. ```python # Static data styles: From f3d4ea5656e06fc1b588156f396f54102a4cf1d4 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 21 Dec 2023 16:28:06 -0800 Subject: [PATCH 16/16] ignore pycharm files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 13765a5..c742bdd 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,5 @@ code/09-working-with-files/rocks-game/requirements.txt code/07-data-structures/simple_dict/.idea/simple_dict.iml code/07-data-structures/simple_dict/.idea/inspectionProfiles/Project_Default.xml workspace.xml + +.idea/