From f6172268797a5ef9aa5a53dd86631463204303fb Mon Sep 17 00:00:00 2001 From: Patrick Tschuchnig Date: Thu, 19 Sep 2019 08:58:21 +0200 Subject: [PATCH 1/2] changed the default logic for the buttons and contact pins to inverted - default high. changed circuit and circuit diagrams to accomodate for that. --- gametest_rev2.py | 38 ++++++++++++++++---------------------- pud_test.py | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 pud_test.py diff --git a/gametest_rev2.py b/gametest_rev2.py index 17cd567..710809e 100644 --- a/gametest_rev2.py +++ b/gametest_rev2.py @@ -56,23 +56,23 @@ pin_blue, pin_green, pin_red pin_start - Type: Input, Pull Up + Type: Input, Pull Down Use: Start pin. If this is active, the game starts. pin_stop - Type: Input, Pull Up + Type: Input, Pull Down Use: Stop pin. If this is active, the game ends pin_error - Type: Input, Pull Up + Type: Input, Pull Down Use: This is to be attached to the game wire. If the wire is touched, the pin is pulled up and an error is registered. pin_shutdown - Type: Input, Pull Up + Type: Input, Pull Down Use: Triggering this input causes a system shutdown. GPIO Pinout for assembly: @@ -117,20 +117,18 @@ Circuit diagrams for the contact and button electronics: All buttons are close-contact. -+3.3V DC ---+-----------+-----------+-----------+--------> ++3.3V DC ---+-----------+--------------------------------> | | | | - | | | | - start \ stop \ shutdown \ error \ - contact \ contact \ button \ contact \ + R2 R4 R4 R4 + | | | | + +----+ +----+ +----+ +----+ + | | | | | | | | + | P_32 | P_37 | P_32 | P_32 + \ \ \ \ + \ \ \ \ \ \ \ \ * * * * | | | | - R1 R3 R5 R7 - | | | | - +-----+ +-----+ +-----+ +-----+ - | | | | | | | | - R2 P_32 R4 P_37 R6 P_36 R8 P_33 - | | | | GND --------+-----------+-----------+-----------+--------> LED Strip controller and driver: @@ -190,13 +188,9 @@ and the other 3 the ground connections for the corresponding LED colour. Part list: Resistors: -R1............1,800 Ohm R2...........10,000 Ohm -R3............1,800 Ohm R4...........10,000 Ohm -R5............1,800 Ohm R6...........10,000 Ohm -R7............1,800 Ohm R8...........10,000 Ohm R9............1,000 Ohm R10..........10,000 Ohm @@ -454,7 +448,7 @@ def handle_events(): exit_application() # shutdown raspberry if shutdown pin is detected - if GPIO.input(pin_shutdown): + if not GPIO.input(pin_shutdown): shutdown_raspberry() def exit_application(): @@ -715,7 +709,7 @@ while True: # event handling for if the start button is pushed #wait for the user to press start button - if GPIO.input(pin_start) and not pin_start_inhibit: + if not GPIO.input(pin_start) and not pin_start_inhibit: # change game state to running and not ending game_running = True game_ending = False @@ -753,7 +747,7 @@ while True: pin_start_inhibit = False # add errors if error pin is detected, only once per 500 ms - if GPIO.input(pin_error): + if not GPIO.input(pin_error): if not error_added: errors += 1 error_added = True @@ -791,7 +785,7 @@ while True: #pygame.display.flip() # if another push of start is detected (i.e. the game is ending!) - if GPIO.input(pin_stop): + if not GPIO.input(pin_stop): # change led colour to red change_led_colour(200, 0, 200) diff --git a/pud_test.py b/pud_test.py new file mode 100644 index 0000000..9e5e6ab --- /dev/null +++ b/pud_test.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +#coding=utf-8 + +import signal +import sys +import os +import time +import RPi.GPIO as GPIO + +############################################ +############## END OF IMPORTS ############## + +# GPIO for Buttons +pin_start = 36 + + +# initialise gpio +GPIO.setmode(GPIO.BOARD) +GPIO.setup(pin_start, GPIO.IN) + +while True: + print(GPIO.input(pin_start)) + time.sleep(1) + From 97bbaba5ba9012f6769e3fd0544d827c8c2f2964 Mon Sep 17 00:00:00 2001 From: Patrick Tschuchnig Date: Thu, 19 Sep 2019 13:51:58 +0200 Subject: [PATCH 2/2] renamed 2 functions, their names were swapped. inserted the metallic logo --- gametest_rev2.py | 21 +++++++++------------ img/metalliclogo.png | Bin 0 -> 13866 bytes 2 files changed, 9 insertions(+), 12 deletions(-) create mode 100644 img/metalliclogo.png diff --git a/gametest_rev2.py b/gametest_rev2.py index 710809e..82df16d 100644 --- a/gametest_rev2.py +++ b/gametest_rev2.py @@ -527,8 +527,6 @@ def enter_name(): # Caution: this includes all sorts of weird letters, control sequences, and other unprintable chars. else: name += event.unicode - # none of the following may be needed - # TODO: Testing # if someone presses the erase key, erase 1 letter elif event.key == pygame.K_BACKSPACE: name = name[:-1] @@ -582,14 +580,14 @@ def check_highscores(time): return False def draw_border(): - """draw logos""" - screen.blit(img_itlablogo_image, (screen_size_x-img_itlablogo_imagex-20, screen_size_y-img_itlablogo_imagey-20)) - # TODO: Metallic Logo - -def draw_logos(): """draw rectangle border around everything""" pygame.draw.rect(screen, pygame_color_black, (500, 200, (screen_size_x-500*2), (screen_size_y-200*2)), 5) +def draw_logos(): + """draw logos""" + screen.blit(img_itlablogo_image, (screen_size_x-img_itlablogo_imagex-20, screen_size_y-img_itlablogo_imagey-20)) + screen.blit(img_metalliclogo_image, (20, screen_size_y-img_metalliclogo_imagey-20)) + def show_debug(): """show debug information""" print('#############') @@ -632,11 +630,10 @@ img_itlablogo_image = pygame.image.load(img_itlablogo) img_itlablogo_imagex = get_image_width(img_itlablogo) img_itlablogo_imagey = get_image_height(img_itlablogo) -# TODO: Metallic Logo einfügen -#img_metalliclogo = 'img/metalliclogo.png' -#img_metalliclogo_image = pygame.image.load(img_metalliclogo) -#img_metalliclogo_imagex = get_image_width(img_metalliclogo) -#img_metalliclogo_imagey = get_image_height(img_metalliclogo) +img_metalliclogo = 'img/metalliclogo.png' +img_metalliclogo_image = pygame.image.load(img_metalliclogo) +img_metalliclogo_imagex = get_image_width(img_metalliclogo) +img_metalliclogo_imagey = get_image_height(img_metalliclogo) # initialise led strip led_init() diff --git a/img/metalliclogo.png b/img/metalliclogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6e9335f19c1b7ece85a6adc89e38054d7b9e1f GIT binary patch literal 13866 zcmXw=WmKD8vxb8Q4-|)D1xhJU+}+(>ixvy+R@}X~6nBRghvHVO6n7^`arg6lKMsoo z7J+1EKeK1<`l{TYwuM7#X;~6dB0?fv^m{HFR9nOgtzZ zogFN#?JOu=y&NqlEj+C)K_JiNrVQJp-B!$yw_`jZcv%Rd6PeHlUj&K`idjy6{>H{Q zqHsg}wF)g+Ur^+D$RqFDBh2r$SAO=l`keRGJZ|mL+}NhLvT<##nbOV6%dZl@Ut_{Q zznlC1qR+;SyS(|vpL>h~yLrOY5{ALzVHEngPLJR6rU*BXlhfPIO}-O65X<~tczAwz zy12YC`A--MyP6T4m{K%0e!2GG460ALC=%F{Nxgn$HYP-^grxPd`d_sT5O2BQ@3hFh z+CKjj7Q2fE*}S?v|9v!|+UURF{L=z$%H6)^&AnN;@F~28;qP6x75TnV8~KzdGrW>? z`*?KU`JUL%-a=|_mu6d-e&x0%^k{iG*mlNJ>@{{dz}9ADqN|`KS=e4WODXj}M#YWO(fV zP9lyWd%O4d7rNN^^_}QoJpww3qwo?%a?B9;B^4(ldc#0c?DAzmW8;1wcAVhvFKHTz zaYVX5i7cIIEI$6l)6YbHT|oYCxV-ISMVj3cJBZ5E-hx$kM8rmyqb0ivZ!Cky{gPeB zD^ZV*c;wM)sj5LEQOemnvaN0S(g!+y=|j%Q>wPR@CBUGk*;H<= zy)a!gS5nPs+pFF`P*Kjwe!S1se!bk(V&CO))*p?|Q4-J1eRe8@{3DK!$ky>?bAVCZ zGKX*FzopWt`hckld2RjX$4gH4rH1@~Z!ORchmDWPub35#5XZTRNy+w};CbkP(oYs0h zNzUJT9%`*4O5)?H6RFV)Gm{i!Cw(vrAF`5FEJvAgo2NISW<4^xiha-&RTL^?#j0@<4-FRPxf7K;c)1g zBY1);XMu{Z+oTwrbD-5#-?VSL&whE$OU2rDb1f{ZPeiU(_e&CHv`)5I%s&06K2+7w zbgET4GN7{Sri8$jgkQ$Q;>AxMuylMBes5I;L1)`F`kUVRqPuQc{*R`k_HT^il;M-2 zrsy^jso&YMGcCU3Eqz@4y?I^}d)GLc-Vytxj^2|PecU(}-H;9Un4J&I^kiPp%-<>| zaWQ**OR*FGW_p?YNiG9bq=sM7mGC|K+TmxLZ)cKP%OlIYRX<8Oku3OgD@T-$JVW_= zzK->O8(m2(WD7isl~|=-vDb6g;pJXwnw;GF9zEg~>-4CEpL}Yvhv?q;!H8QpA|;h~ zpEVb`pl#fu5Bucj-x}t|IR-hNcP?4BIGYXeYAu3y>OST5Hw*QN-=sd8XDz#T8U44< z8pgx{s?{FQK_7S8^04RQgsbJ}_f#EY5pSk^W4%Ho%ff8Y(lYpgjnQCQc}Tu$wBB{* zp7WCX8$uJm^zF=1aw{FQ`?C_Zv*}HIV4j<^=SqDtyG(0v#|Bnct@KIS{M3wcv!-U; z)bAtuDZZC5x%?+@bH2C`;k1Y|A?b*%yah&HvN0sJN^~`%>4Z!l@U6w9q|n>UJzoP$#mbAQ_b0=`+m8Sv5;%$QnY$`_HQp^ z>2gIXdQ4^lh$FmSffFV|?F_Tfw8%J&mz|$OKwWeyE%6 ziD1NpE!yw?>q`rqkWy_r#KNLfCHiP~nOio(&#gqrH=V=H$=J%Wgg4Fc8stb%slx*^ zDyend7wVnNil9MrsoTCNLXTI`%Ntg{a;C0UZ&q)f_29I@-RHB++*e>h`aoVMzb4w$ zJPRc-RKCh;KF-GJ;J1Nu2aN^U%boXxT+NiB+)hhaBP6vc=q)>yE5lsb3u1hJ3a6wTa`coKbN zFkhP&!53ZOF+sO)Z~Y6qE})OHuzKk;Dn4)OPO(P_hDYq*RQnjqlpDOg0g3NTWBjS1 z!t6gblZw@gf$t4TRdGkDWH|_>(p&oYPt!E?-qWV2h}2!4@5*=HW5-{er#Bf}-zPkq@1#)v4uL{*q`mQ2lO<$jiZ=q0$Ys{-3 zpN6#Xb!{A`FiGeQhQtJTArD_ildH%&UQ%qzD85v(H8aCqvY&!-Y7d#V?9d&M2qJ7yjX3s+zcE}LUHtja2g<&k7yzMlKPhU=f>)o+ zYth+=G|i%nkM<*_H};x|6kH_cF`+Pss;4SWXZi0BNerLdEE!g)Pg$ua&9qVb5kEcA zpQ`i3d-&#Ns!7dA6Aio&1{@We%e8~Cs2KZYN85avd-%o{?!lCWeY3cdLJvL}sU7*M z_4Wq+aOja}s2D#2g--xus=D`O|ID44GI((8j!WPyd7}|NuD8Ev01n! zxVpHsVIm~5odT1=6;txlD%rd&mv-oK^1-_UTVd;#G$}7>oy2%!@tR zeDs(15jdiE&1=}B4%K+)>+1BEC`nbj1Su)x($E!3Db8PFuYs}lJKt?AfXv#-phlCX zTr#B~L(F3qdmZA)tWkr8DF5r>Lw&uxS&$xSdS4O7pv)iEEwK1~0jjA%FUvHkkyk30 zxsyE^LG@1x)Hxmaj|@6v#5T$z$bE{$bfO*JIyubr!hOQ|j0d*0;T8EG%XESk0>dQ! zG8Bh)noef)A*|?Nrivd8rVnbW7zcQE5#k z{O1!!Zl`VXkoT>Z3H{FEQ?|u#DdiRZJ>^J!D_l%bkvk2$8Z#vNO~)Zxn}Gx3`6Az- z+vmkWP+o7Vp)a3e?9{ySVGK6bSJCI=qEKRYvXl~`#C&Pn-u$$(4iar3hw6vg)Pc8tSXB`0qifOH)@Fv!R`z|U8}OO= ziv8f06JC;hO3O!Amul1AeYBbTR(>w)48oBQS?3k-yh4A0EvEea7?aDo^y>yDaw_(vW4{Ty# z-J;!eH9^R5#$x=0Ym7g<1E0zN7#=pWJ|ni8y7uKyt!~kr=C?E0_GG8FklNn+S*Cby zOBe@RN%<%>&7rgg++-N(L}*rNyaQt$qiAeaWHEF>BcsA>QgA))@gdyz;zy?n;BWctnQ-ar4~#iSY)GvfA3mFgw;XNZt?@2$;cG>FO&Pj zMewezKdaOmIeGDRAi{>(p`~!3rnu6-5h~Yv*Z-zIZ`I|oP|d!ZQd0SfL5Ya^Y5e`0 z6}W??wN@%$jmi}+x+&Dxv{YaKCR)#uMi29vgP-Yw1dztx*?AWEIE#BMi??Iip$qVr zBa6WEZI9;eLm1i%5&gG~nc*h`)N`t?kE!O*$a1^8^Y9B~F$$iT*&PaSFW?rkL`0T3 zm@EpA#p9k3X07K^PDE77Xilqfk36x$rvzC-CD8vZS}caZn@lY*v?1Uoh%WO?dHqGW z+w3~HJ8UGd=Oc_k=+r3G>mMm7pZ<3jiWN$gZz{#N=VvqG&5^05^V|!TO5hJ$!aOpd zNAfHf!tbJcV7H?D7^C{E45sa?+QiDMa%ACse60JdEMWCJ-!fgC(2km#9Ve`XI;5t- zC-!@2{tyehC7LILVBs%1rJY=cgx9JmhfSryCSWhK{SpOb`bEeFjn#|&HOT(uZ71YM1tY2ANLP#DFofvkYoh#+@6MAI z|GT|S-%3FCtW(9;%5!|Q$p8+bpk%I5iegsVeoGRICc=(;x;S0mIekw#8>P^=JOros zB`Z=#L!nrEu;(-1bhv$tsfcAN>ql89&$wEj`+IM~E!}n4E196pkZFK2%}{oRj9)4TU;}1!h6(qH$5CSr*)CY<0_^5=@2&=@Oj#HD^N%z@ zYeW0Gt0RI+Vm^%hiqhTD)bQh-y&4PJf8C3>!z_?Rq$AChSE1&UN7T*l$Tim`-5Lm% zLbA17P3Jg&Ixr0kxH&DbTUX&8b1{~Z-;XM*k5~rYu|Jk@{P93{t#0e$ymfj6(Ue!- zV>&v5V|M9%)^^t3S9iVmluU16+on1ffjL{b@ z0s;}@{_h6&E%)#LhyjYLtfC~!4(dDfFC2`L-c2A7B}i66RKs)m#Lp+$T+{2!A=jg; zvc00RT-1FJ)z8 zh+;GXUE3@ns4UoFUd?OlFJ=DPnhPD1E@yskWqgu%JpI=kLiUZ1`juMRHx+&rliJ-^ zCmVN9zq+vNENyQII40X@s@hB@)(cW8ZH06ijYDH&V(u~fzb4W29^Z(~aFE0gPZ;li zle4uqZZw9cg@7Ezz#HA)yB&OepQD2)JGpTqBeGo*S;OqO^nYe%w&yoB-RyBX)-F}B zih*5n=#X;Lha{?nq!pjrc2O@q#5n7X$COKmHg^ zl~m0Ffy@|x^QPIY_h`^ zQ_9lSl(2Hr=Whn3Xku%K1K!~0FN{l*@1@5b_uK@`;`LDkXRbQ~NuSu`vw(@Xftq}Y09;mNVPpVIpL2d<7ImnE2Yn&SV?CeRL7Hn z2#P2GYijoL8ehI0$zu)i^1vX23&W2u{xq<^vI%$@efuQR7Jl(u_h7QIj-$nCFeg&?F)QAjo1w=DJ~& zV2C762&7fE47&2i?WJyq=S>E@HC949hI)}|k@HP=-T|SEWr&E%oE`#x9+rEr!JO7X zYzD&>6NsrtmQ8w{JHDB$75(Ox4qb^?R8;h1z(Y%vp@CP$JI*t*%XUc~vq+Z1KWN7q zBI-2yB4G3dOqD=`>Yqy(RlrQVbLmOAy5~&Xz$m;iJL{@Nq?@W|nrS%`h=B5I^Oq70 zZt>{osQk+EvXLR&w`gT$)24^A-0TX9x&Gq}U(~x{{ugBU!8_TCNdhG%ZRTOd|`SMfLCQ&NLSj;UTLL zq84?WOdW@hVFi{OQLyOpeD9>};86RDj?_X49%w${>(0#1zV`6&c-t%$emP8i&+pE7 z+)rODfhQ>>DEKmHz`TK#ptrA(S5e_g0=b8-aM8#X#IUjqMeOjLdw2cYy(5U0%y40b zh|$BcS%zeI$eL{u!$1LyW6wpz5@nyHsA1VWas9T>i4ZXfu?UO+_96NJ5ETst269@q z17^{rEPKunQ808xi4tOtBt`r`!BUz4?OHj~H zmWAkM{Uf{b#fjq7B(Sx<2HCH;&c&86%l+3h-!c+ z@z4)5B4W;IJcqvabvMU00W*ve>w=O@15xlp-}Ccx&V^_8OJ9%ShwB>{C_#bliOX*B z93S+(GutepU<3w(y>VnH_=m90-b^lw3t+x~>^H6VB!#V-#_)2UCp|nopn(D*eY`Nd zfU09}yZ~?yvIvdrUukLSjrp}T!#b$GY0O%x0-XzpLlmNiBx=P>5M3RTKp((DB>}fN z8z5~%Yfc!0OGN{mAGm<{U(;Sk?fx|;L>n$-!^1?ME!i^OYBU&HfRAr!J0FLgerc6! z)J&MOxfIX~L9oKRo5VE5nNs8yROGlL3)25^oUj7{(7JjtC3t6`&XwgSlDc>5+!o`? zH^B=lDX}J1D^J#*;TUN!fDMZe$A1t`3(P|!T6Jdbe5EXUV6?=h2>o`A7~+b&i6L>- zv$BYhPYX8;6KzXJ;J}AF5_hJKT*}b3TW!U;@FYuCgNWtPqtO>f(MRR#>gX(X`rMtC zN~$ud$nlzu(}W28g03`gNA+O#obh0RsSZv~-1hhPi%jbymX?-QfN%Y0XJ@Z>*xys8 zjX|^1)9)L0cnTJdm672CJsDEeh|ThnbFfwux3;$IBsEiOK$bD0BXGG-0S418R#NLS8&iNi|#fHgVCerqbhIsl)PjdP~)90~< z=D)T_FWm|8pb$Ok_n>+^_)d*;VZz0Z;ut4G8510i{ULWsTouo=%Lox3?*7HUtO89^ zHG*+W?1W01Ix)Wc^7rR@d`bJE#ca|@&>uUlr{2lQNyYyDem@`%m=F*U-q3q6OG&au z%|`|X1{R##p7Dby^YW=KLn&SkF4p+n|3NBLvx4f?XK;tocZ1s7+K6XnW_Idz{%NY> z5mSOg0y-xTGyd_!DJMy&LlB2K6jwMV#yo ze*QCf$165prp}rR)4|P}8;90cq+$i#Q=QzY1qv`CGNCb9EedX&0Wp6t(G8Pbr-55Op$2flasR^O*M&v#wYU!tEj zyWgZoCW}}d$0m3ZGQ?cO*~NMxaTLOFSCjnMC43Aq_>om)OwauX>RPGDRwrsO}B%M&C!qScerSw{(o0i zuI3O>whbUMp{ykuAGrAq#dPBrW9t8E|GG?36n?#kkN)-~es_Ic2h_!5mo_qDQqm7D zE-nTOijI@`xl?y(P$-n51xgx3DY9?_`}Hv4V8qYD@^z`1Y29rhXG~4>_g(`ZC+CfH zdrdF|CqscG)uMmrqNjn8Me6(81I)wkuwjf@&>z_mW$k&0<=RCX&0Z9uk^?P2?zafe zav^6^R3}8F+B{l}F3mt$3V*=L2Y&J&FXSzT$r61$gzmI0eb~w3q5h5Ns>-P z(wkloQRlPJs7j9Fuf~r>Dm`T>aoAoac1bi&ZQycTuItLCs?F>siAL zJB;qbOo*`lDFnD98Aa%oqc;2|H!juYHBkqPabvh6S2Zunqf|5O8EjF0c)zx2B z=&!pBm|K|0u(FcX-lhwsDMl?DO*A#V(kKMq@ zw5)p{e_!{zTYEdX@C;LhlK!#%9!Vp65|WTBRXCmV4I!YWChpL=&2FW+SS|@Mzz3)a zOTYX`^-o!WQ#`Y~yG!V1n1&=8VnVdk<#Xp>Ut6nOlx#G}D?Ho`O)qhp`6=l0`V8z{ zx>sSI?TXgKncbjXYgU$q3kIyJ2NR@i=r;F9U0Lu3YiMzyqrF|oW`zJy<}{;u$pvcV z0qR(ii6Rj(q1v}1yLiurggX*#VBH^oR^}qB^;-%`OHqV!u^SkJAwfDEK{_;1+D2YT zm>0-IVSzv0x`1b>?s^~S2+AxFx%5s{pi`yC10v7gUaB;?#Le(cf2EnC^}G)qriExP z7O_X?{!zPN`(h{_$Z9{i+1MJ~tgH@v!Y3ZkT z(LC>271fPs=5v|z$?Bn`F|1_5{$wEuSAc|?GOn^~wJ=hg`Lnk6(gK=9TdktpU;*~{_&8d* zhTie%=_5-($41Y>?A};3!l+z~8X8c%YEUvFl3Isb22J&&S+d|(K3!nf4^7E;# zZ*Hh?BPp{c3YwbmqY7p}G%=3R6GS`uD6LAj8O(o9`F-Z@>MG!|Okck$vdNW^`_EBR zb7Fmc-S$J`NVat*5ednofrG=@RbgSFhpHS-tkm7j&COc9XUy;p9F>H7yhnS1RCQfL z*=WvuZijF-l>dgJPKBQSBVk;slRaPYY%?Qz+>S_6(YC3z6R`n58z-mR5B>2vMqB%{ z^)BO%ow%uU29bwCqgszny#y8&MuInU;DJc)Oz{6IV!^&cYU=D{G>+KiXI?3`3`U69 zWvWGQLzSNCDDb<0f@XUl!zc;Xl!K&$reUGF^$;}V>DgICZEWGC(gJ!hEpwt0xcHJ@ z!ZLy=Um@e_=!6~?42am#%jf9B2uiT{lHKitu?)_zro7Ue_~zYHX-P?m(EabvwE{nt zN{iEsysb&iFnYhXw)($>-N_}H=V0g!5qXH}ea_4NEx_!^ZO1cw`}Be>n`8&40#`QY zWU!YlTR_idxRA@==J;PWXqdOO20>GEboGBp9xJ27`gQ31+;QBA?7yZa6DuGdxxZgk zU~+Ffzy8!=r28C2jUPSu?!vRm$J?6(NCEjb#|s-soAWb@bg33?UHFq(JUbHBY!#k)e%^#SV+}`m4Wt0~`xe7xY3<5+6 zL@n2lz8DDcmVfJAPd}r-{NnMdNJSuA&35rBh7It3;fvczFQMg)6DKn3Z6p@v=9d2H zeN=9XBzliWHDH^$pHwt?c87q4Ldc_*fpneIjkJ%QJ9uEGycsn0iW)bmK$SMu+YGhJ zY$!@wVOk+1yreYxq817-p&MjE#G=?pt|F-#LJ2TeUnPbR=!c)#?sA z-4`@#IJF^k-*uhkv;cs|2L%PC_K#bRrvP~;)+xh5!8Co;l7L1nTDaOhmmN?K^9$dB zC&&BFZbXu3V&dXVUmn*V<;Ysp9i5$V8_S8WZ*M4DzkV<~WMO)Tj*hOPiQm8oSW%WC zAk=N;V%4VVd0C{2xXT5M^!vTvAUv>&7;X6%CA60Y_Iu{Hs-gxmv*=6vlU86qx>jT#rOWI z9q;~+I5w)EpC4ekG>ew6;RC+7eQE^Wzu`Z#AtH>i5J@ORtjOo=#kRrgiq6&56_PuJ z;-TgAp?Kl=Mw20Bu^(Ibx&LIPga#Lt2P@QiIe`YbWeX^$z)Mn*#}%l3GD}st zf8E9Y>i5#2bKltA+xGoVSEG}G=K~RWPQbZDo-2Oz=>oWBVG8rUD8cn%a46d#AVVcBN0L6G8Pwy}nUu|1&rcDo%G zr>RLMN~|=enAVqpgYssFSu+2tsb{vOp9{~iA*R-4*)&*HpRKR#~(p|`N0_ndNEf#+iq(ZeZr z@9T@#J#R365-YoKd}1Qbe>8lXn)+Y)>E>&Vjg{#MjU$*Xa1g1gtd|9c<0&ZM&&TDc zxtkc}%UF|*5%D3!W(Ad=AQoi=``bsoJ+=9!Z$X*AKfsUv_YE@1A>S`wA#rmBSWB!>|0Dfwt zh4+7ni;Md;!GbY9HRZQ^zEx=ap6p+)p6g`0b>?RFPEQ~LkmTN$7?Xm=|Vw1Yr=q1{2D{`V^k#7f4B?dNCKcW~-ae6JO{`lB2R+dgmquGr9ao94TsUB>Ni_h{CphL+h$4 zFsyVZle*)?O;)gocIeZ_mPbZLGAwCxSe4eyAk^8a`6K3R`o{hbDfVLx)9dROHa#Ztm{OaXVklcUwu&kQ{^~8+1#oMHec&NXPtCeka%0M}j~Cj|YWk z(Gt`?wVjv0?-jYbu(b`GcrnDoq51&wO_4*|awJMK_UH9KZt+LwUibXa3|&Fi4*GX= z)PD9SUmP3Y4tm}0b8qcNy72as#9R(Sgkkv~$gujbKJmEw!n?q3`tNeSh(8ZJ^^}7X z!RLI`&p+^GED*+bdh9R?F5=>;Z+iqihkkF3zM%YpL{s6$<+Zh;w&xdicT)gJPJ=;o z!A%3*q}JHnJ}>9zPa#$o7RPf~!TcqIBYrJ(MPEYImELV!hQ@buB7i?f$;U$XSCk90 z1zSc7%(*SR8K9@I-8&$Cag8-_IZbx$Ia?T(YuIxsvMYSjBs?rB;!-5eb_r#bvs*z` zm3t{xyBOeKcbY?)%=5fgoOuv+TQW3d{X~qVb-LOyJGU8*6-GqIe&ey;PUm^A*aqa&T|} z&b}K`(Y%c}0RQ6vpW|`2=CN^6S^MizKTsrq78kXwf<&ft#;?slsJSj-5XdgU&COaN zVxs9Kk=n+BAYCosRD50HVte2q38wmwn?s~5Sws;95s?d~VnI<>wRJu~&sJ<;xDhAy z0UX{BoU!Mtsc^sK7^*Up4%)298|}U zCY}?ks63T0I{HaLNvV$mbJel`toq2s|M9RC8-RXL71d;KI15z^>?ONqBP@^7C%Ix% zOiWB@>%WGvAtjI1juDgv ziv}<|Em0dagEvy9wv@U6nlUA~dpKN#Cnzio8KBxKHvMOJg|)TV1@!Gm^ese#w6flx za+JRJ!LDMx1%3h~`uFT?GEmjXNyx}tweZ>&>~0oc?lvfZZKeQPAT9#9k&K^w)a6u} z(@Zky@FaDUa)DRWNxhlsR%XDdpTN0nh>xq8qz}?Ob?fl~@-Z zx<1MS>LR?oCYn4xTpK^-qTbFbJ!OwHV03R7pM7xh`0f_% z{ZX6UPl)30;k9lHbyc7b{_=--fdV&I*VTM$J-@lQ5^EK_;z@O07!fgX@AxZ3dhfwl+3m93-I?6*q`iyC?W!`3YK|JB;6f5&Hr~zD5eP z&?{Gd45%Tmwq8y`A7Qd-bKc*6)12ci^~Z`Tpd^p~A(rom0DGnYQx$VMc869sHqMNi zvu&i&9J)mFpV~a#^ftdI6XXjqU`DB32p6FY5TOKVYKndeT{y1(i>eyNIHohQpE$~x z*VTm?8yoAUvS6+q?DE<>Jw1K45apWoy8%N}^LTpxM98&rG@8?Ml9!;8tA@GT%2Efn zd<}i5%c>Gx#vBlDcB^eJuuzbHgMn~0w6qxwdOTkpXQ68>LcV>;xbNulVW@I%AHr9@^^PLtALs*)X^o17AYDR>Y8w+ZV?^MnS2=5Nc! zAIWO_@Onu_-VGJ>Xjc!uq*Fu6wwp%9%}zT*mjJxyjH&N$Gr$5mj0Z~!dIEa~M?)Zq5l z26iLRk;eemT&{uEUQ<|HjP!JOCe1-oU28LC&bHWKfzF|*-!MvBJX@~8Pzdn!v(AHp z=(sO1A0-6^0mRJ`9Y!tKX50>ChJxDU!x<(P*6VTkP!5k%5Fm_zC7C%D3+c(zYbOc< z8YGEEcH{8mWKHbTiIuIbIznK8%3gyAS5~MAQ3B2MnlW~gMlmT+E#!;ZJq6;{Iy?Z^ z)jIgoQ{b0GB>)U=isD$2byJH~=>IcHDnbV_qOSrk@V55%uk(+U=o2FyV0pvqS3mCr zyxN_BW5)D)09Raiu1S->D7+bfVYpD9p>v_I;FgvS}ws1@fWMTj| zfCtIE!7Du$o&&;a3TWoIW*t^wqp z>fpt>--i1CsSI){Ua4?p2{x~u`R=7?>w$hgyWQKyy414yJYNiV&#kULD=E%AXO=vC zNCcPD0Yd8EQm}KI!IuL-y<%Y9F0_~ev>2F304{4dHbq!P1>mAsFc1Po@|cf-K$+w9 zi2Xo1XnG+IGAc>_X=QC~QrW8wgh!}lX36d4*cTtrv$(wc*qKk45q(tH=qOD|={J#b z1kE|%OtSFs1c>w)E8~5nqf?>B`!hd}yy6Z3B%me6adJ}-Lmvg$%xY~C#Tj2df@s4D zqIZa*Un>WdZTapPI5ah5fq@GSpf&Io#i}*!_CC%mA4qr&jPrN5?27LIuu;CT6##)B zYuLQ;u552L33BRbcz+P4TFU~kwb`s{S3~K16-UA!RTWyBz}A}npg9EibOsVgQWfYu za@nu87R3X^Gb4i-0~6E4)fKPzD+IXcO}{Ce9NeRv+m;uBCL^M54YRe|jiYRm|J_L9 z2MU3#iKuz2(ah?_pFXF&R1okgVf3I74j3^)zk)7gmH<&X2omJnhLN`{2Nc{$fTx3l z0sxMG5h)9(1BlpHeL6nAW!n__d@RQWS3?iA@>vIm#kwtF?TNu|fD*^Llq|_4d8gKwX|9{zuJyP0-@a6S0insWSY@Y z*p(~iT9pkDv9of;fBiKzT^bmr*L*nJ@udip0sk8@ypx`rE6tqNKda$JSO&BdH8pYK zhqtaY5Q-f4er?j2UH#UBgb19CBVBoa>eGz2*Vz}y{--Ufe)3mVRos*D7s9%t)oPJqFjZV3{eFX{pQGSWy~TwD|qVn!Zc`s?>v1EYE4 z(#uDsY@RoubRA@8WGtEL&f@?>8$H0xN}?mr>b=&*u%6fhL6d3yy(f?Av)dwaY+V|r5S&E*5l-R8lCb#A%dQSl8vrEoW* ezShpXQq)MIlLUj(fmtOGNLErwqDJg%(EkApOP}Zf literal 0 HcmV?d00001