From 5476da8aa3f4ee424f56f4f2491e7af1c4b7b758 Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Thu, 21 Jan 2016 03:57:44 -0500 Subject: [PATCH] Fix a bunch of rendering bugs. - 'clear' polarity primitives no longer erase background - Added aperture macro support for polygons - Added aperture macro rendring support - Renderer now creates a new surface for each layer and merges them instead of working directly on a single surface - Updated examples accordingly --- examples/cairo_example.png | Bin 104401 -> 104184 bytes examples/pcb_example.py | 7 +- examples/pcb_top.png | Bin 99269 -> 98827 bytes gerber/am_eval.py | 19 +- gerber/am_read.py | 7 +- gerber/am_statements.py | 125 ++- gerber/cam.py | 18 +- gerber/common.py | 3 - gerber/excellon.py | 62 +- gerber/excellon_statements.py | 6 +- gerber/gerber_statements.py | 54 +- gerber/layers.py | 7 +- gerber/operations.py | 5 + gerber/pcb.py | 15 +- gerber/primitives.py | 1091 +++++++++++++++------- gerber/render/cairo_backend.py | 255 ++--- gerber/render/render.py | 8 +- gerber/render/theme.py | 4 +- gerber/rs274x.py | 74 +- gerber/tests/test_am_statements.py | 65 +- gerber/tests/test_cam.py | 26 +- gerber/tests/test_common.py | 8 +- gerber/tests/test_excellon.py | 10 +- gerber/tests/test_excellon_statements.py | 173 ++-- gerber/tests/test_gerber_statements.py | 145 ++- gerber/tests/test_ipc356.py | 29 +- gerber/tests/test_layers.py | 2 +- gerber/tests/test_primitives.py | 441 +++++---- gerber/tests/test_rs274x.py | 9 +- gerber/tests/test_utils.py | 25 +- gerber/tests/tests.py | 3 +- gerber/utils.py | 41 +- requirements.txt | 1 + 33 files changed, 1785 insertions(+), 953 deletions(-) diff --git a/examples/cairo_example.png b/examples/cairo_example.png index f33cc69cd8068bc669e27c0d8c7addce40a499cf..671de5c9da80a4b1daf1be792a497ad209802b26 100644 GIT binary patch literal 104184 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�(OsI2_i>gwvdEk}?st1c?;(@u-uw-qO| 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 z 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 R!@$76;OXk;vd$@?2>^GiE${#U literal 104401 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

jQ?}Go& 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 z z2ThtBTPpb{$x-i1p9A;#-&d1Q_%~HHZocqWQ@)*FMpK?qMcq2P`2E9U->=n|-Q3%6 z^XtVd?d$gnzwezabGD27-0wGs`x#xs>wi>S{o&weHoY}V<=_$HPe*@+tv(waW%Uni+zt8mGu=P2IG8{rLm~o);xiz46!bb8}ChKFhh|@j~F|Yt5ot zuD;pZxM+ooQsMoJtEQ~lbZOG8Tf0tfwtMMbsQJTNX4M)kO}%d`{`+3Ovg4)`YkJ*r zgEMz8ESaFaCF<>g0}j#EyEAL<)CwNkVArI;%)IO1LdC8{pFS1sO>Vs-+dfg>QG}V> z=ka4lJJHJ`8f_=<$UQrFaN)LZ-<)sTtTVQJ99 zs~LO3|CH^%oAr736|qj2J6bz#$d;9rHh%c}hPxw1uh`dDqAN8$l})TfJfYwq(~Ujy zx4y_6dnqo-S@7>p!m4kn>8U%_gD*Jr&-6Jcup&h3>6*P}k?LGs3$7m9S6!B0lXP)b z@AW(N#Z{;3Z?CfWve{y@Dl#&BsjAJ6-o4wv`tYx) zwQLL$`|Z3<;y)a9OYUea|1kU5p2hTl<>O z2kv76b`wNc8J7Ha`J;N0H9a-#ht1Tb9y`{R>^y#OYiqZ?-Q#1=r>{-@ce~=5Z+dFc z_fU5RMpuqQyq-r~n07R!?v<-a@@uL7#@^^~ASa~BDbZ++HK*7UCc#~r9S0H<6*|f_Y0Z`6t@THy_~v9+~@ffILo@UoWhZwYdzk9Q6`f&aHniUVS zS$h>c9335#lOM0Rcp~qiytH(7{`(WBPJQ9qyCrJzE}Kgqd(F#hLg&ogz4PsY{cM|s zjD?SGT5qkj*Z-;J*5%8m?+x30w=|_P>*9Q`>HqKC4zRy;TxRCn8KuwPZ2on2G5Z&r zn;t*gw5J?NF)A%9W&No+`|9?~dsnZHev!7-D`fT2JpF3_c>R|)$5PZLb28)v%XWzf z_$`nBmTGCb)poOjwRZNE3?8$brUQwQhG)(o+CYge)0R7_N? zB1CI(=&+Ez!2f)wQ*!%-s4l|BI5a*=r5#?<+fo3CKN<=Q)^g`{Dgr z=C)7wz2A5<_gz1urp!~cW+e?El$9+$`K6U<|FO$0e zZ!G`(EbQH>O*Txff#vHrgjA`lDLow?pa1jKYtOQ}W2cJm{IB_W|NPv-UzzLd_4hp4 zbno6iPWc%VA8y>ZI7914L)bIlIg@9!{yx>_D&Qc{vaE5@iU~|B0&|=?Z`XycyZdg! z$tCajIud<1o;2|jU@E^T(X~wD+M&-6U(b}4=-ZuddQD94oxDUr+mb7FY77iFWD+FU zCySmbE3jyk6l!Z?VCQ5s5?rxFfv0kLANL29wbyKyHnAx9d}u z-NW7UqV^p>$6UbE-QO>5w^PJVhwtZMr|s_Maa{k)+m8R7-g(Y<>+INizIZEnwYIsB zos{&;ofesOEzpo#lP&5V$Ph6tYKM;L94Vuxmp43@aQc~>99$65kh~*CP1<;KR1YX6rk)!={veGic*PrrJk#yUoStz~xH!@D!AMW$TNxc-t8 zj{^h4Nl(v{Cp|fu7HFKZ+{nc+i-&oqSMSxA4+73RTDNoS@mh1Q>}yuOW*_cKhkZQGifnzl$I%V=iQ?OP5?ElXSXJFsX+9&KRI(G}5H z`Y>#Xcw*Djm9A#?pM)+ls+d|zGIHFTZZCP{=*m02HIomD{;!@pz3xU}aJadd*|Lin zcV2(px^4UG604mtaZxh6N>%>YvUe74o_YV&GeySZ8y6i~WU%z8UC_o?SN_aooc;FA zirq<%HyfVf7q__bb8A%Y!mvZU^S)+hWv5S>{!t~TVL`@*HS4eQzxtYYbE6QG*ruy7 z^U4G`SY{n@VVF@gS3_)p#H>kEWUlR?wawt;&+q{iD$(CMs4|QuggT|Ax(W`qR7pJeFSCbZL^t^wvHGiGBVer}O{4{Oh#9<{?y$0?D3zgizMIN^4ibtGwHqOrJL(7_e!~) z{19CpC?fh`M`Fp8cyFWNnRQBgFPqJlWmpmz`C~S#&StT8PF*A0cCKYsJyEjvFJHcG zZy?~atLVgZhY2cc%}h;M)6broC**Rsp-=jTv)*h*zV>9JN0;u^)qdYBx8}Uj>)4!5DGZ3krXK&DkGyWzq8G=IYkftK1D!XQ+;5mQh#DxqYYpdNnY|Q<(t3y_u>G=|{ zc#~4wg{2i5_mgA|1(*)qjX07hwfXkjcZzait6OW$Tm(W?<}8@DIA~Q@H`nV|(h}Fc zXS_f6E3NzJ!_du>*s6Tb?Ro7r{r`Rb_e@POGqxX?KcT^)VfXYij)7Y?ELgB}X=z2p z4f)rnQ;Qx;%$GV4%=-P)6RW*)$3K4gV$$z9e~CwtP?6FeW=4m=DQveA%YRIEX6tgw zFo-^LFI|SunrYs0mmLp2s!m_gx@qDO;xzkc)T((A7rOz(EfvrJ&w zYUQ~0*@xam!kwI*%vQ0{)z$g&_h+1Z66hr0ys==pR57#Ox8JAIHHFhvQc_k=W;-L? zG~0kBHh71J=9C@#f4uu$Z9HM&InHFY;MiJQ*FYA>kTV+n=k9BTTyWUFb^Gg*DuxSL zruRyNj|8sYC~s3B!#~-2&i#4mYAHH?=hzu`I!saQUoZV`aYI?alVi{JvfZAjx`sh~ ziHhoS71iFE$9NaFT?~Bu<3~kc(yh(UW2(O%dtT-CH%&yDLusnlRIgUAm6J{{d9zVk zqsi^?HTx6s)8^GRY6SB-zVO$LZ+*tWSlDu%@s_pKvD6vmJoZfrCJxEL#g27yhks2M z(~Al(dNg-`-Vfj7wmUQ}EjvBylho|;XFvbQvewNwPwx85FFuBf{MY7}?a02a-mkak z!PKYW_cr{!TlZO`Sip6{{{*&!hYI&>SyB=8KSOT^ zXvjKYPUK}iSf1RRocr*R@TC4!*7JU6lKx#ZHT#mA{`JVVju^Gcr&C_8Tp-e6XYuzJ z%f>(NF6-_2zhA!MOXp*znIT$2oKK4?MJir98%wiT-g#VhjZa=cuTA`3UHVR+unF_o z8B|`b$Qale;&r#6(P}e?Q57-O1VifBe(k`?xJ6Q-)!MtC5If(9%M_ zt}BsEXEPlc90gho;|wpy`(69^=2hCM!;j>9cZ7qx=2>o8dv-wN&0#^T=zfxaNzKtb@kzlPok#^x%m$1l+Erve(9ptQZ9y= znbmS@`V%vPf`s}W`z;Snb=A|3;bGuEXMcb3WMA#PWsK+k|N7au__ke{#T>r!^r?Q! zr+Y1lI$Jn;C@OGskjWY~7xKAj>On&wXe3ko5Kc zqgJEMm%j_&Gr08pvjxMAH`|UKQ|ns9!sJ*O_^|M?lFWsd68roERu>m-+FN_5d+{@ek{p)vkh0uQY9qdI+4t{0R z)Gij6W^cc}*z(@Y&udc4Z>$a5_Fi<~yq%4a5k0fd9^1%i<}Gr#;0?zWrJvmDanlxi z+__b^qOxRxiJj?>e=~P==zXyH)j7dy>AQCuzVrW)_>=CutcK^PNRjJ``CW<<6)bB{ zq;5L-T~mxxJ8g>b#TuPkHNQ3n{ykXxPJW7r#oW(x_P_a``zhI=r_ZSP(MQI)e(5sO zpQm?NnAqf$TiE>h<<#`xVx6(!XFI)AXtTL5%e^q-I6a{^vH`hEOc{$7RhIFG-^rGkH3U%T@swf!wAQREfnxjOK^(W(74hdK@(@Ni^#QoS># zFEPU7+JYcow~cCVKhL_GqM>G(|G+|Tve%okc6TY!CIuEn3FBVoh8VT4c?v?EkFI{4 zq``4)o=rsBT2H;02rnzw!;?-lzdszct{_Wr@t=amMNZq^UJ&_zex`^xQ-jySlJJ+B zdRjpONvee@lO}noY)(J><;0D1zUK}W)TABdxz}zY+o-_N_gJIp)|+p?epRhLE5`GB zx`?>%bc1!1FMG+weQ0-Foq6?I`j5AjXHvM@-Uo`Toe_9WaaR86Q@4d&HhtN$<$vkb z59Y7#YeuB$@(Iu4Ho2fPOJ?%Rnff*+|M$qaK6KtgF*<0gFC=BlpYBEZ5&{ zU=O?KyK&xXyI|6XzGQGbU4ai60v z9F$)Eqi@-rfc=*rcN~71@XwrUu|8+hgE^u?yMDwC<>3+evQLIOkNJMD zwYK|nUebJD$)l(1noTa$*Sz1T&;R~dAt=7<_4gc1ySRDPihuJS$}t=~_iORu#ihKw za&@&bv){a$Agpxi`(fq7zGrnAf66&dkW5WgT4$=VSeQfMa>=BWnOklASU>Yj7P)!h z#*vU!Un6@GDvmHPXiYu!SD`Iw#)SV063dvx6cw8GnEEKpV-WYb9Q~5t@NnG@1(l9~ z)RQev{|-m^@Xg*{eyuBNX3gKj?b%&jT`eq*7pGi)Sn~a8INz4o4PPzq9XIxEROoO} zD2R__KmY5p;jH{g5~fnkPk#UTv**Rb>aJxne9L!dN2&-_{!YzU5F44o(Zo@}*tFN&xcL6CAUM4cy)EUEc&!*)2dfltIw9L z*koiRKKI>$!a1rp6%}5ao0y4-`_9hTck)2iX13(>=|Al5tvzyB#gX}KfyJ7z)xWD- z7R{*Mq|IyM?4-xhs?;P9pmO!jrAKqUtjf>jyx*(iIcaLBT+~{H>8HKBx|jdHn>ur= z)2s^_3#4Of=D#@k-Q>bsSy`XVvp;t1c$_0G`?MplZpVRzYUT0&9jdZ89`R3Zj8IuM zBkjxOl}{sij6M8N_=e+-^K|WP9?G z!GSsUdcgTojt&o%q8o1yD=RYyBnp<6e`}y9CX&y(6Po26u`|8!|Rj#s)%`Nga z$^Xt=bd0(h2)!HQS=?_{xwssv_slXxJ+*U2yWk z`|EWEk5i;FW}iKm*l5)1Ah5*3?&k>VD|*M#^W;$&NCh{^+)%g&F^L?%8KG_ zpXg#A_T=23)E!rU@0g%)%FCNCG_0|?<>3Nmtu0<6uBW}cCEEA0D{^usxm8A{hJICv zwD+m|YdE>{o&3Z%@8?)oZ~Gp(F(M{n!h3)2)QXB7H_eo$dN48wxX9W^UOHr;V`_Tz zF?-4V`_rdQ`4H!;Zm0L}mZiFQ$KzCCQ|(lvmz+EIu+EdR-%FWNs&0ZbKeeJ1TJzGrT zj>$TEfD`8;Gf{^3{~zVf`^x!QwLAA{YtsLV{%3xtm0HOJDwG{mX3uq=v*UyH>Dp7hrd<)A81O_d-Nf^nzMj^TjX$`AW9Q79_U+v4^@Tqw{_fbv zc5G(hv*%Agnrew3JNvlwE3aO4okftdDA&(LpU-JdQrl!M%)w%Q_k;TT$LmY}Z@Yiv z`=MFIYQ}6jb6gXYnWsf+KWK5g7&4(|eSiknC+-S=MMs8nXJ^J*-ng1}rF#BU&K7~L zcke%TW&ZDR(|t49eHpv~?5R}`_sqFj ze%5aG){_&(qcudXh03P9U%TqphsxFZEed6sg{v&~MeJX>bEkp*{PmIgGN~Rvn%M8N zzu%u8%U*4ZoPX>8)%fRg zzP?{N{ol*q+hbhkY!>0v*NN6X*y($=`v3Jf(Ug2c&3Vclo*!LAZQ|tS>jgDFs0f}s zBTC~*SER8vlbAY>%-QAFqu0#4SQEVDlCanWk;vfa<40bfonv@-cNG^?hxvVJH+N|% z>6dlPZ!#OrWN*x6U|{ikmJ#)wf4l0+Q>RabnMY`$x{cO`&Yu4zzpMBu5@&Cx%jEsH%cRuR5?jQX<=<0Xd$I4P0A1#wyeuQ)B z`s@F`guOlgFU@JK%S6T50?TJgPiJ9h{iwOPk8{fXq$|A9%L{-0c$`wy>GVLb@J;7Y zL%rv`6&D_gw=@)dtTJ)=+^L$xaN%W1zs;{1-*5id@#D`Q8=23woppB|o)-B3vs7nh zV7Pnps_D#$3=Ca~LK|IdHoO5tqR+v7HnDKqBT|KuV*I1h6vr?SyF3GrOa1de%bg^AhmK}*i|>~IxpVu&b#v!`Fu9@W z(DUgqYo6fmg-o51&;BZ?T3W_U-4Y|YLui4T;m2Ru*K_^soaQ(>=}rD9aW*_C#A0T2 zr;^5sCCZwYwtxToVE57bNc;8E?r*8#W4K^)_xAPUl@j+H1eUDW;Gj62{ql@unQiYM zzxuL%-~V@aERS#EpS0!HQg6Q<8E0Qf=j}^nd9Y#j_b$8nYz>W!ce~&3<#LWuU8HTK z==kr{>)U#}3QYB<=pWT+mR2xh?H5Uh34yyS&&b8PB~Od&{tzW_*+kUlzPOl} zi;hUL^W}RM3r!+dNf}5ByA&A;Lx?(B2&IM0~)=D&Za z6C)@JDgy;(cCfF$Dx}@}SXlDqOV*&TZ^h?4dH%<6e_qg}Z+-jklLUNOBu-_OGH zT7D*II{0Bu)wYN;3B@fFCca>7Jk8MHp&}GF>1=>VsD?;p=E{S&b4sgZZ4J8qUisoU;{U8UHr99dM^)aw zYQN`Zo=l0XrFr$WyTxIZ;_eH;*0L>DL;_`TF96 z#P9D_Cwn>HbYsc$47{@A=$kqg*MN-?Z{|H;9JI>I+biq!E47oqnw_0Ze4jsiR^jsW zhHTmTm0}DI4UgZ&d3G&2m~=hpP;}lt!;bfMjQjuW`aFA&}XLD9$_bua@+aZ zo3#HKWgl&}HvhZ*u|cs*LsGv^Bx zd%yLaJGfAhay!aP58Tq6~w--l~%%pFW)$I=T0mw3OU7YZMg{t*`2{QT+jXU~4v{JY04&s*@@ZjFOr zOJ&`)Cujc`AAQOH|J&2@y`_51U9t}v_s+N9{AAMF=l`Eh(Vxe2`0LIF+n@guQd861 z+8h*KynfH0RzH8ngbA}BKQ`z8w6af8rlYdyaI3=OscM`T3qw+CemQvvu(JO2DLnM6 zjqUP}mWH^tuQOk$?~S{E>)JcLrDrzm3tP>|aBRJQ+q&5*e5Orzxo6COu#cmOZL{o~ zb4^V(3^#UG_m^`YJHhYJZ5Y$|am{^kI}U?2mrb^;y}Vhde{RXXsvqo}a=P&?Y_}|q zJxg7nv1;w!y&G3*dQ{i>m4!vH%P_Ma(Xfx{=*hD6^;ggR^H@Twb(4a9zy7s!{q+xc zvo7^J9$96ax9YT#kuwR?2hDl?hueH73o&prBt_=eQsctG1r8=5CXPKTS4uMYMQpjS`|P8| z?7B;ed!DSzJE=d%FFiec`q8A1;ZrVUY*zCQ$qM{pbv>hDTOZ%tIDXKY{i-BY#ikES z{%G`E?^g71>Ha0xwMe3EvBs%tDR$S(CccIoufvWxAJ;PautAk&{XX-x4~0yN|HsL7 zh3u`Z-D`W;cmBKmf3HQ~sJ{I2>-s(a*#3OYnHe%`$<>{kr0xb$^D-NuhvPv>F z^{T1qF zht>b>|5J;%o=t4;>@VE$(AGE5Xx%0fM-}HI!dAT2#u5+6Q zh#WPP5jb|Gh2esUZ?c4#PmFd7NY5x-!rJ(%>m6INnFWUD! z$$H-Y>qnxG`HJ|c2u+x1_I-M@S>pfSNy1{{;-X9k-tDcvU;Cdq>ur*S+D|{` zhQlx4cu)T}Gne7tO4rpNi=CJ?-KYG|4U1mE%Dv{Ava+MV5nExF;@MjF*Z%){@@Tf% zmN!@ZeNOIP@`9yn*|HB`RWw&E-1xDhY@Yr$xeG6O+LEW7Kli<`u+TCx^4?2>%l^Se zUrtK91~@4E%9XzS%1nlpcgy9MC027)JcU{W4hOI}F7nm0GkRFw`rNdBp*zDz9k_v71h)?0W6yaRWC-^H9$SYT^!uWuf+>6qb% z7LBDfQW?AN=1ItwT1ga@|NSpmvBh1$MM>=R)1sL^YST|wtUq>^apKAq4<}BSKb-QQ z;6qyVlfb3R7cShmV@Jo`EhlVpDtB7S*MEpx;r#c3y}bSJo9@AK``8&Yn#4rKt}yp7 z#8f@Ky82vH;k}*DMZ}(f&V_y~K6`u4-(S*MiF%uMB%~eXxo-XL-|0J5r_W~V@6)*Q zI&RCiPiYJSj|#pPy<4pQ;mVYh@67+>%63*qsJ1N<<$Rfc^>50SXvT!pYiB+er``Yb z`FE*u%_&(neyJCnHSg!2mSlOnzkge8IM2Nfvs25DpMBPM&Tp}yiL2JEWyjAxE8Hx} z#>UW~z_AnLy{oT&oH+g1V200;f0g1avt!?uxK*!Qx00#vu^+?iv(thjm>7z7?kT$8 zvS)qYxpR~KtUsTS=U`&^cjtgkMa4mRKkx4k+1|;@@BFemTv0wEqWj(3{_9iF4m6eU0Ia6oN`H;Vd3~cP|?5?bTV7E%MJ!qkhmR62~fL8qPr}LQO z@BLW2dJW%`jD)wG8IxA+SaG7-_xz8GDM6a;@eIj1=QxgHTXWfW)&A|m zM-7@3Qi4`S$=b)-h+j1F+I)1)<(KU3Z55rLHr#&eeE6{Q;lpobWhJ`2QjK=TOj~l* zPxNnl+v#a6Hv{HQ7ZexI`TFs`G#A&WY+bV*HJYE7hbrt?|Fil#Te8~Z*E-Exu1pD7 ze<@jNrOca}ZJ(^aH*-1FWFLKbUT5!#k#duui6`FAE;BGcr#Vx!rfzv3>*Sy z%@=HrSfdkqOnv@zdE0k#laM zqoha5l)z(t__=g`qc07LU%grugRGF9=SnRF+`CgF3 zwKTcHe1}U*yqCwSh=_@b7DX(dY?4}Z9BC} zkE=>IKYL&Q)+gP==k1il)c2TC_mA7+jSDw!+_B=qb6I}VM>?k(879q|GilPCoXt09 zo-yATp(7%6@z0iElUBd>Iq7vj;}!@rB%k)r^r_lgmr-GHVycM#hTCs-b=Ow?O$bYC^UsZvdl+?%i>h3qo{m$BWvNR9hJq;epq)W-Z=F0bN@fr&(dWkIkNSOzb&^;o6E`|wDHE> z_4`wv-4UM_do5pXZ}xR{eVyHB_VVRBTzmiG#hEi_KFmnWHH-H5*Jp@WGwrac=|aA( z+tFI?C`Vsu=8Hqy}=Q)k7t;K$*;SZA!KZ9bVxk^(89cy zu*1s)9qOwIR-8|HT`*cc@NFw^rb9%m@^jevNiiHH}C0ldvJ2Qwai&vU5=)Vt+UR2=~)>Y z*Y4eQe0f;Ij$YC` ztiZ6P{{`Q-EhUm)=7+tPF<|ZMSeRLr;9zcJ6BH4kFx9K}9;4KY3DfH2q{L$zjBZ^IO1bI(D5<+!A+-Zp7>X5YXm{d?}*jGQq4$j4hJ zwVwUoo_lxBym?}m+;{J)K4(!a%1}~T{`!m6P9M80lWD6j+wK0ApTGC>Id=0qg-c== z-3gf$XP@med)Az(GdFI1o3KvlW2^A>f0f7Ew;ta6XWznmRn|Ux?tM7H@!{Zit*NUN z^v}=t3o&6hUMO>TPdY=_GM=`J-}?Gah?tkN`(FP0mw9p9#Xo;+IwRf`mo3sb^{|9R zrRk;OQR4;Iw{9*AIemxUZk!kw-bfiq@sF|>BB zOcy!B)F6I-|3OEq{p;?VTiAX3{{Qdt(+kpfPB{F~A|_Z_tlQYwD8%dhr`sF~g40fH zxGj5U-HE#3y7fUeccx!DsNMcRqHp1h^N9)#JI>FTS@gBoTmP+u^qsJr(@$?8MazCn}1lqSBpwe@$s{SOT# zJA(zUo9uQ}9Xfcz`y&fKi@^Qar~l@@RJi!->g|u+vu;Io3#5Pg)T*@5L*$mYcxT^E zxg4|IXU$j+FWbwXe`ibPjf3?*pAm2jG`S=B zY~l`Q5#Oy_x4-_{{O0VWCx!Jpn}b|M}_a-TUAAdw=ZH zYB-v-GC!lEJ2*8h<-?ChhFPx^9VG<6&XZ7LV0p0S4A;!tw|^gb#JyE$Y1pDQe@}bA z)8&3VX}w}k^1r{=xBuZ?EEFD7_VQ|YoZzeFVQZ|`Hy(HFx&2`B-5b(34(;6h{QRtgGTq(X zr_Z0?{o~Np?|1%h*SGtZ_h!@5yG4~%QMb}{e}|==ee&_qy$6Gum+^Q&KT1)ad`8O|DUucbdL1F}7{YU#U5(Xu^|u=h_%2Km2@n_qHqVOm8yZ z$nkmn*mUbw&a6^5x2l%c9PM*Iy)CPD4i?^RSReZF&+X}Rx7%!=^K-M~{mdoT$M|fqFzAZLr(PHCsV91+Wd8{V)o3FjB@UfkL_OI_O zn6t64SIRv)>Xt^=t+Ka=_w#M3xf`5om*rZXUOU&1-=Ohp@(i{cVWp4G>|{_7c(C~K zvixne*Kb~(I&t2C+ZERuNRqXQr;=%cL>u-LIp8oz(7Y|!|o12?kP*BjM$&+@ZRuno^ zXx@LfA^iH44KFUl8h)R$d)ohv5tI2C9+$mdUA?b1@Axynu)fMWSp{b-%-9rPv$eA9+Pe1bcbWC>%y+L`IpbpR zqnShf-^NFqE`Lg&sw(Tb!{DZlv{w0-**x$6eA_?m;lG4A7de`q98-_Ad_P4c@=vR% zx6xyh?{oJ2nm0LI{@wc@`Ii?~@2@<6*y1gdXJG8zyHrSk`{Bo(#$}r(g z-Bm^fll(T{lsT#0#?|Q}q&n~M4vVXc`R%u?`{up*@O7<9UsXUS7L)?chSi2hH!V zW|ijoZ96_CWBcvJih2@`0uw!SJ`^pvCHt+-&5U_-lv4fgL($WpPdVM1#E@~}`Obu6zvW&N9+Sf8d-<$$?f3fMj0|gTf2j$Z^X&cd_+1K%H|S_?*3m4!`{(lZ?P2j- zAKp~l{N6!k_SvxL=;W$f2v)OmwNxJGy^|D;Q*QqYuKqUCY-?07!hoF?~ z?AsSMycZG=a{BV=r+JLo^Av^`hJ1HF9nGFEdr$I}ffJMKWqFw&ADfx&|1GTf`1yH^ zxwdKg^|Sta_y0dGZC9UpXZq#TBMBK9IXXHs6eM-UI*%^;kTs|B`cgh2p^Xv;-rqQ) z6nG%oY_EcyRKn5U-<=pHdO8QhmMSgSK6BgGYew~Xuh*_M=K~#WqR;HhcwB9&$I>9q zCI!aQAGdGac6W2T@~UF>*?0MOGjCouS##em|6ET0W3Qz~hK7!6)A?V0y`S^@T(xQO zic9W>ax#aPKQ{h+_}ly&+e_>g%FDFeDT!lSpxSrGarxz)+27^*H}C%TW}ya`>%~8N z_B5aUZQ!s@+xBEl$$#-PSEN*ae7&!(rt;+3lZyCOg^m?lz4-Wew{6?{J9_u&)<^yN zdp}Rv!=Q_7TugP`C5oh5)#rXiIJ-uA}tdua5c<~qN%uFv5A+04nJ@l){GqW*JY zwr_Rqq#rObb}f?XUDk1?`rRXIlcb-nx8pwDoMc?lfBp2id46@OQZM?>`PEPS$oRBA#RR{e{63K7X3f*Tx7XFWbZ~Fm9F3?zg`N|z3+s?Iy z1;^T!+3JVZ|9^3aTTJySYmSasC-CT??eIy7uwU_pU!670`uP8x<41$ji;MoV z&biZ_u+ur+y6Cq?SJak*#^X1G{VY|Dw=39MzrU})FXa2p|6)r-?|ivjUFDsjdgO-S zyk8ZU)#Cb9PVV|uRbR8;VDpO$YtP@`^(AIzz@IPY6&W0zR_Y;xS*?`IBK&R)N#KJ;Xh{J$^#-F8)*?!U+sy7KyK zVd1I@(dm~=7f$#-(fm~2_V?BW4hjM+nx}$eLNunj1WInnIJ~2B&pNvmU$l8#PoF+* z@uRIhcUj`8uGqeY3gd_e#V|>DY$;$ zzh!lEcKcVQ9Qkm?_`KPfNmd3=&hDCa>(=?a-=ELEs`z^U-R|e7vey;w{CxTH<##(j z>&NDvjg7q<9#gElDXme#d2zt!NU?6VjQ1~o+&%U>&?GcA`0@ICM|``_*HvA$Vmkc2 z%=GTIr(fs3EftiTmsj&eKl&D}z5i35rBTug`4|3| zimpygVr~Cmdn#)y1A`;SU1hb51=-oJYuZ+-Yd_M?ueJ+ZWpm^9u3vwTN4G6oX1B$B zU+#_gKUaEZU%OYEGnzP?IQ9k2 z|Gm$*;jvGm=rjN0>bn(o7#w>g%xml)_hy}H!p11gQ=8Ko&*n*+x3A8+IORZ@$-JX~ zs~2jhl?exKj9Pou{%zy@rmBr|If^EfoSSEQy0$6#=fxSDBsmo3Z~YOwCokjHVTqrS z1?SiGp0N+{Nt{+)i_ha_|8st@Y)NkjU|`7o{jK!=#m~>O^`EDt*MI*y zEr0*-eE0P9G`C|jm(N!d>dXmyJ@@;a+dX~Cevf5B*Hzn_?biKK+w?uh`C>?L@#hmA zj6WV!zu(O8pukE=KkB(KM^o2PrSA^|MYjHb;5c72x@AYg=c)X2;tWndEZMW`_iSmq z`bw^+OUt)i*R6QCUVnc5&Y`O>Ryu_$^-WvssH z6*$F1vaeKlQwigxcJ^Xmn-! zkEPaScYYk1b7jx8-Er}M9?7;>McdxmvURI+Lxxa4=L6*i7M<`@dECYI5rQm*J98Kr zqS*AJY8@Q}H;TtqwZ?f?6AYi$^&>z_S&?%M_}PEN)2r>1p(!Gqj4BkvW@ zU=Vjn|64doNqhCG+E2BUY}UQ{RBwy&En=E|Ngvu z`h8xU!Rpuhwx`?tt-qI4XuEeWN7Is}%XalCH2B!H%#lC5?`m49zk6X~n%6n=*K$JK z9l5>iVS9cCluUcK!Q##5dHes)&i+^Dc5qGpHQOzZdfEBEZmZmqnVo;Uz(-cxNlaH! zr0M?$+ueuX{j1u|p2c{;H9PFQhJNz<|5LBuQ($a46tQD|zQKN;zQ^_ZeyV+&7J9Ya z{@xBwhGlz>Z1sLMHSw?H(^Nt3=X2f}1q7PZtrWPX^XJiL`R{8ZDz8qRK7T_-VpEi@ zg~^xG=VJ5se~#-v%OS2GrlPK<@(=esS@LPipVgK9 z+}jzH`Z(eIp6B`IQHwR+e>pzw)tck$e!iWyoLeZU{QjRS^7pFWIP@ZISxjPF+%SpA&G=zBSR-^cCh+w#389eum! z<@}Re{#na2ckSGH^r8LtyV7qw|7~8`ETw{lU#nY@bTlDAMIA`UA(#Y%#rj4b^hId4lYzoYkb+K;u`Zb z_k1_&q1;~f_y1-ETb}NC{BHgIxicpfyB&OU>h`?v+qPUVi4Co-__k)I^& zejAWF_56}G?{>^@mfw6dEAWK!!kZ><6E?QR%)R+=Lp68RhQpp#md_&}NKBhIPfvwI zszK@GynXis54R{yFq{2$``_Q8TB5#z=N#_bzxMBRJ-_YYMK>ve0=6y{r`P@@#RnU`@Wo;9KZLvGw+3u|KH3luMz$#eSE%j zWbUP@W_PRezv)%KS6rl_;QWoBB~UOhAhN4TgGov2Fr$*QSw~QsW7*4=cYANExgIWn*@Ymw`v`{B5TFQ^n32 z_n&K=y0u76GQ4r&gO3(P|4yHc{!#VyY)|lSl{QTcgAXVFNNn7`d2@fq5{*@HVfxdx zcf_pY?N7gZm3@-R<+bMf%S%On{`|E~_iqiui4$igy*xT|7ne+*Pwc{t-xrtH|MIa) z6I)zfUzPK#eet2)GL^}$*Vo@)cC}vJ^V7d(c3JB!+fQYjQJU;OAtfwq+P+#VtK8K2 z2UhHEjoiCkKR^0f_o5Z|ZcmS&yMLps8nTNnO$qWMDl-jb8%Qy*ph z=+4ZTG+lU4;@mhJ@4Pgp#>AuNmr06oFO(B_Tx?_CdGej1okjavdwyquBiD{?vt&{< zef>Rb_Wj#8x4Krx#{~v1UHrQ*!@u5(@51+*UIS7CkgIupSn87eg8PJ6AE?P)GJoxsU{jTM^r!HF2)#Y_p@w}HmR-|~$I zr#c3HmQ#OQ@a?T?ckQ0D!8xj$pC(_G*FE=h^*jS*ha()ezxw9wTsC*@+QipR6PHB! zUgIp znUqOWLf`In5RekO^X!eSqrlF}%3t&4s~{3wvz9!T5=l5rmA|q|m z&d&-q4x2yY-^7BiDYN+M3q3oRFL$5p-*M;(OPKehO;fy<^1h$Bv}kLZgo?oBNnd6y z*|Fou9p?;3!7KO9@f|OeS@W3fagimH@;o-4!v<$UpDfyc^x!?YDBmB_$tHixH*Ej@ z#bCFR?&&QTE0Y&!+|n~!#yb7L%ATGx|3CfO+t#$m>952rR$Dh7zRY;#)o=fNoutOS ze!CgRq&I)QPP+5GUP9(lonyb?FD=`jt*vfbw)wOyJh{BV%h&sIy>E`Z{ru+5dTFY2 z{i=`ssuC-*di(9@nk9COfwzyJpTDbq@;kLAg|4oy()&6hu9{Q0WR8~#=l1S*-fLrP z`j~B})4U%Fp2=SqD=VMvy%?Y&C1KVYw6H#As@GL1uDD3ST(g#Um5LmTW`FnCZKP&) zJ0fUK(9$()Rt0H>G8}kZSU4v%EG#VdmR5Cii;8FJ>#~a*Bj1Q=8|KM`Ph4@-XW6l+ zY%li6y!Wzi-a0!qWq$mb<#hK}%KpstVGJt-yT7vExm$bKtasK@l`D_Gugh-z_;Z=U z#OwX{cfWhH#^0=WR_SsBV@30|2g5pDbf(^j4y*2*d2)GH){)Yxt)|sK+I(MLSnsE~ zz3K={lfuS#b;Y~*xJy5NDK6Uj_!a|$Q=?1Z{MguOabX)CADemPQO@ggA#U&gZOM2# zPgC~STMvuUwGWr->u3pe#%x(7!qGHi)2{WcN0TZmt1`k;cgW^&ADrQ zmc2Pk>db-$FK_SscNMlWi*H}Q))u39J$#|NK+5kQKXZ8Q&nsAE`r@s@GpA?GvH$1I zzFzy|+sDth>$lEGyHZqCl)PxMPGoE1r^`VNDJfDbgtwNyv0;d)eHX6Xx8V_!l6n6u z(YMczo0W)L-Q@Z+C+0V++xfS4KCUZ-yNjpE+%L7XzNytd?ZoTw`M*mapOB0`e)jc; zt4Vi#RXnFnnR4lhK<0zq_EbxY8?W6GA4tf_iA|d{YgLHW`#XELe-3+lq)Yq>=bEGVduigEh_U|yOd%4MR$3T|M=YkrKZvVE}!Qc?* zTNyd`M_i)XO&;we?!I>~UWnc~YF%;p#7ytL_m}RfOg@>Fb)=8)%x9aKGis)Kt*k#9 z|Ng@Ez3C1McYNa3zIr_RO7RtTX0^^A-){L|$tta?s!B>q^7Qm{b#3kL?)FgW>h0y_ zK(V_aYU;`isd6?c7AmoANq zo98x9a!Xa2^CBI;6)2z4I2S8Oro z#R`w+VEO1dfB&8-<&o0Y(|l=Nz@by6b0*L7`y{`2HfOh3^-Y)DG->V3_ho-S++8O> z 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 diff --git a/examples/pcb_example.py b/examples/pcb_example.py index 5341da0..bba030e 100644 --- a/examples/pcb_example.py +++ b/examples/pcb_example.py @@ -24,6 +24,7 @@ import os from gerber import PCB from gerber.render import GerberCairoContext, theme + GERBER_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), 'gerbers')) @@ -33,7 +34,7 @@ ctx = GerberCairoContext() # Create a new PCB pcb = PCB.from_directory(GERBER_FOLDER) -pcb.theme = theme.THEMES['OSH Park'] -ctx.render_layers(pcb.top_layers, os.path.join(os.path.dirname(__file__), 'pcb_top.png')) -ctx.render_layers(pcb.bottom_layers, os.path.join(os.path.dirname(__file__), 'pcb_bottom.png')) +# Render PCB +ctx.render_layers(pcb.top_layers, os.path.join(os.path.dirname(__file__), 'pcb_top.png',), theme.THEMES['OSH Park']) +ctx.render_layers(pcb.bottom_layers, os.path.join(os.path.dirname(__file__), 'pcb_bottom.png'), theme.THEMES['OSH Park']) diff --git a/examples/pcb_top.png b/examples/pcb_top.png index bf1d6878f60827834715fc33b45b75630e4b38a2..60bc245e8ad89858eb423b9218466a63eddcf5bb 100644 GIT binary patch literal 98827 zcmeAS@N?(olHy`uVBq!ia0y~yU|Pn&z<7v*iGhJ()08=q3=9lxN#5=*4F5rJ!QSPQ z85k58JY5_^D(1YITUsF;Dc=76%#o$Ou^HZlV$pZ@9?hJ1RDAi4-Od~NBgEP_{W$c< zuTV@QDyBPl!3C$gkCX4qGv6$kwCrTcB(YiFUmkW&dpBq2%rj@+pW6A{LDbQp;K6}L zW_Ei!(R$srCqiH5J6d?;ZBw$foV+biUo=4VbYx~2pknYwH&fj0&b?2RKIodp{ ze2sWe>WajN6N`Vhec{atE@Sxm@k@8^yL;=}jwZd^|MG5uP2WSEt9Kjc7I^Ffne~T9 z<>+!IhJSPR>6&}5yZz$f<6HSL)9;3df6KRvT>i^XPe@&SWuUU3o>2PU*p;1yi8~$dd;nw#??XUhvSg71@WM=29V_Wg?dvLYh(i-3E_v;>>=-q1` zHot1$+KuJk=lE3Gxl6k*y^^vlRsL3yTm9pOy6N-mE38Y88r+{0w^yoX^S)<%Z`fjP zh(dzPOy!&Fop)Q0@386fP)a%dtk0gmzUq6c{*%qA7aD5|zI>9kD0uKdUES1>nZe-! zOSjqO;7wP&OuN}+Z!o&+gPkK|p&@2b^^;G=qTs{i!{Q$zwrh%fRO~2S&6m@?c=~&A zq!fSHEzc2~b*B!CgA9U~X zFTKTSUw8}4rlzGok-E$3*r5O9_w;WI?LM*Ctc{A^7xnV#?&U}K|ChR!#`gMac|x$v zB#3RyqN}E|F}&%I^SB)~g?*F!BmtO?>-oARbrtIX}ZvOUdb2BY?0#-HcKXdlw zqu+P8yj|HTSv%Wr5$o6DfG>rxcssJ!mw|0z#T}c}mzt43U)Ce`)=!=;E37x9y`aT z`bBLOYfFr+WKu0EDw3O5=~G)%^6urCv&pZvuDZ7|`?K+Gz1vS--(;P{B57$ES#+97 z_%Dly@^{<(@agj5?->~kSSoj4YL1=U;L_;DTNJQBiE;L?lv|s&uZ~=GX2H3%sBNY; zde<+zhTYg&@ZbQ)JUt`lz1v0f`i;wvxBR$q{~kef35-r2g`kdsFO zCAxHF_dUF~-``E=-StF=2~$foTogEVSXwI<7zR0XC0#ka{hy*{Ny3lWVv`!qu%5iB z5Xfod`9XIN8%u&}_PB$ioA7-OHCeJ-fJZ;f+m#(rLM}=1GP2Q=Mv`p3v3S4(|A{ z+MQ`7w7d>1T9a`5Knqa}l5YV(n<%5?7B@#)$5yIa2$IP4U9 znmy%OZsqSEd)?M9mF>&g_@6h{yzuJ_H5FFufH*rf1CcMUk%IW6@&b%J3^e&cHHm>XXUA2cX*Jn8XS>c-6Q;ro{- zh24Sey`=^+{wL3bWXeqXzqwhVV|B97rYK%S;geGj>W0&$!XnbQSV|>Tl&u&6)QD6zRCCGsj17KKVe{Cv5Dj4ci$k$ z?%JWhGBf1$A*F7BU3}FgQ+%54yZXgG)zd z+m%HbSz+6vRtGl9sGhjMq{_%4all4Fh%sETKm=pFx(Jzc?r=jgnDMg!E zj-9=EGE%3l=V$w5l?w}6&7LtkZ}_)DcKZ3b+fqxK7fA8HzyH7Ltx?~sqIDM=3oPdK z&bpR;SXRHlDKeEO_Z-7Z0u*_8(bB+PO? zzkI!S{qE?6=k+ZL5;*(>;xAv)y!ySUbRq}0U*~My>C01}r!*fa`7rTGhBnKO>0drQ z`n*F*_m`&S&$G`fI3Dk83_5q<_}!Z)Bc0@J4iwBO+GO};^TumNZOJUzvUwa$6*7Gf zwPU*%#b3TudQM>3#@P&_T&^CUR$p5waA#@YaXZ~wCY#dzl8zJR-&1uE`10nSv|j(` zr^!Nn!VC;7jowo}xowTux=Yk!l1}8g_x9%tCi(oCQ&e?-s`v5yqj&0)e=RX!Ik`k= zrb|-Dk8UO##{6sBHg26AzPs-4ufL1iPgPXUtj~FK{m84iyV%&-r9*4y-iuEDnfc|k zYxA{LqLoD%n}X68Ps{a6%gb}~(<^wfw^^xw->cJ0gv`~|gTin!zI<29I4>bc@S z{bag#_jLVQD?{a>O=c8^-*5=Qyv<4%t`y*Kxkx-0)tx zyp^q-ug(8%{+%)T0h`Iy>o50yoi_h|t?<42seZE~*BGDOg>WBdXDvJ6#rBzro79 z>gwukI_G)a(eZ}|u1 zparjzE#g*{t?W3_D%P7cNySpD3yRaxDsETdY{@HPX!V13wEGFqs z>k5;d5o^DKt^fSd!bex;d8?QIuYP_?_?myn{?xC2f1_K!@VW^^taf}KQ)jdCx{zz$ zzSm(#nHslC+eXDKTyXi^^YZ&VS+;+D&%F&htMw)O@~I%}|1m$l-_OoJ&5`}uq^@Q= zYyG>~u7B$zen)QXs=gMXr@nIc-#0<4=6ScToxdwlCA#$5_MG6W?uKuQi?|pX&OiRS zYv)t*e0KqtqBOOxzXo+ye06*l9LG;zRo$PqV&ALZJ9c)m)coBmDm5i~Te(%kf!)8q zZ@KwJV~^WI%hRW>uH^PG*!z9c_VVP<+F|?RZa)2;e&djl_6)umu_>%4_-;ghQskJm zG3!Xa^R2F>N;2x(bnSQ8D;fRtp5^QRD)i9a?<+2Bcxfxh681!^KhJ)D&ZYRDcX@>t zUbuX;^;(guVUNN2ug#(<>-_5H&57RBbpP^feQ}g#WEb4wyR6QCG*b^h42= zm#5GFJ+PihvHtQ(*RRc48c($*x>P*>^mw9T@l`Efri!fIr;|L+ero*p`Tx8h*^j-l zTB8)iHiV|vo}PbC#pmS~4ejPuGovZjO@$^X=xK7Qa|q6V|M=as`+>jo!`S)W@Jv6f z`S4wz0_*C1>vzwd@Za}qw%K~C>f06^Y_q5RU9WPzDei0a(yA|Sc5?HdY1<_)xF@XLxcbTesQ=ShXRC*-2%DvH zGIn);UUZ#-?a?*Q6t#C$o;tMbyNtm{bB?BaHopz(f6Q859w(`*DaNrUCYJl+{QM)2 z>SWp3>g#@|I{hwK8znt`O3vOV%nU3}|8{P--uu^Pl2Fj?sq!vs?`)3y#JqQJ1=GE0 z(x>m%##|OMZZn;E&TDSzwCi(t`8DDneYrpV->lF5OP6uEbSHh()MRJ~vb*>5=SVLGw$e}zK06=&EpxwS-dd~II`i+=rXG1z zcf~YOHtV50)8S_?_V&+S?cwlKtGlojDp zVvIi`uCi?TVu^36y1MpP-4kwHzuUVj@bczjE%P-N`OjS>+S*IxWq&_fxx|mR+fPf7 z%YJW_<$}{4vB&?<`gr|Cs`9_f&u;0iI(y5EuSwyWZZyB20O!h;KYPXgI54FIzft^Y zV`r{Z6u9`>Rs#|19Y4P`O?=H|sQ&Wt3vt`my>s_x#$0#IeV!+A+i1(f6&H54WvUcS z)nak<(XZVoYthEcVDRPkmcqK}+IpHlpY+Z)d~ctoDPpv7N7T$q3w@=4WTYSsq6txt~0>@6>yRCm4F%4p@0s*~vgo@X5k9aJ9d zw(>MCDmokT_t!zwYqGQX4}WNR$E~dFZ<-e{>7Xa`o;~O0+uJ|f-kRNi_IjrA((eX5 zzOOdUh&|2oM&gsD=1hZcw|)w;o+!I<$N1*m+ooD|^^31@a6+=a_g`(1 zxYzsXeD@2UUXc~ky`CRDxlvY%Q*));*MG-F6{Hhy$JH&J_4Jzj?Dwx8%6vClSUvaR zr#Xkdge)mEf8`nQ;C=i1d>)65R|`gDG}r^?T-?=_8z zi!U8uXFZV+qit9)^%z&UKv@NbK9@O( zG3M;9jN&V&oPVmeEPcj{*V|v*D!6nj(ZbE=&BhmAPja)AH*1>R4dh>cOhz3~MelJ2-;A4M|wYXi9Z=LRCCzpAP-$Z13{D>Fc)w=a|b#kf4)D12Do?DDoMn(#- zc)C_T3(MV`cl*oamZTef#?L?B_MY_Q+~()6LRXzoXm$wP#>1G(BAq}fqcOO4De zE5tNTPb*s){!*N+bjR;cSC{j1^8SOI*8NZui**VSHUuN{t6jUsbhKHnzX|UH>_^l6|GXn+o7jvyyT7RX zx^q}fv2^iy+bb_^qo-o2ZC=dBa$ z_z}4L-5J?kr`*yv%E_od_#JTlL^K0kcEQ&JWogVz5d)a|11r8pAfLqtM zJ0JeV^J>DZsefNO=hU6M(Z(`G->~@ejFXDo`)hu@XZ`r>;_sc-$NKZl<7fWXJ&^Rc zuk^RitD3Ci`#U7>Up&a)=%R6C&WA5^WEQWQKWPFRLr1mf`q|gne|FRbxw)PB-M`ao zX^6_Iuw`4Oum1Q@^{(-cFVDKw6iesdt8u)YxA*Ce@Q=G@88@h$xT2#R_uYOn!^Uo3 zmHTH;ryl-T@T#bvYi@RT@P^YXF6m)-~GRGv#fSLd)@lrfS7}U$iC{LnWq@Driw8rOzkY! zwXP}qKJ`DB!-bx+$*ZocUJ$f`kwGZ^;>ld`@9XUn`wCB;HMYNc-ErkUC+F}xGOb0Q zPX=#~-*d$_UVz1PMNno%M#n>*Wi$QFyQk@@2J4yE6x10pCW(JjoqzoKysCXykKXD>=4N;ZEV=J~@Js}UgSPVol_}e|>Fj)e(QeYu{RNy{x60mr ze|o}cqk_qrvuoy^Hk!0q!}=SKN-8@~c!Yq;$%-dpjtPhJv>hj$iSbaBklI|bK*{~$ z`fC+gGdnlWE;)HnGHdCxOADn#W*#iAauj$GUaZshh=F0_3>em3RjMjhv$`b#$(f16p@prEn8Oq%83 zfhSiltk@E4t-I({Kv~y`rJDt>9d|t;EyBpakRV}{>~)-DZI$WYrDZ!eu6;g<#WVKX z9iO9n?6lkTUzI;Sq07*)yMOiO)nEDpXLJ0CW}F&hyZ`I_sXuYylH!?=U#NZ5PQhP!mnh#@vl?M_x46ze`RcS#lXWU zZC#9(h+!3f1nb+DQ19uBuDyH~e($Ph)Y1@zW?{n(bM7DAu~0H*zU7*i?3h+xTgImK>f{okus_bm!JFdktNfqT{!U%`R7Za2#9#GMNylz! z-p+K_EDD{u@}^j?7RS#T{+T+a+TC7k?`PNV$mm+q({o!tZkC3?-#@NJY0IYH+azc_ zKTk||wtrUGw1)={oY!?&b70w%@ce+xW2+{v5R<-L>NqiqFVXIk%+nj|xVObdSS4RQ zF}*)&{+)Bh@{1*w9SpF$er3x#-36VD(+^8t*>`tUb9*n}A148m9nRKleqYb%Jijlz zb=$db6CGHzcH{>p%=}~YF@ipAVcW;*BY zoGoI@B1(n2Ihs7qpIjJn|HYvaS;P1Cv;Os|cplsH|3zrD|BSQMyCS#bsBulbWsq^o zU*BQPfmu(S1x)HMSLpR`uD`r;ci@}lDx0Ls7tfQqSGMl^i3vYvA1hyL*i@#S{^ZH8 z8@5;HJ)C@JN7U4uoi)dAe%?~1$8)&(_V(P6sShtzvQ7J3eL5mO{qlSLZ5JM~rXRcf zXokQCUy+2R_8$+IdUbJFv7b4$l!?`5-qQBfTchU6rtzk}UU_%Xtp}ES)mn8ftlefH zKi7P|nCr@nKR+iXAG_neEoR;Si)WV4c0K*fVUohp1K#^*a7_5Rp{)CSgz2J3>z5|K z+aGCCWgBhwwJ~u;($`IS^Ni**_%k>>dOqdLlr`7=lQ^4d6C+HjYM(|uU3GP>Me@~- zrNZVf-v_O_n$;V2;Q#xxO~Nd%IYZC>oM~;cCVpwj%E{*WNB8`np*sDv%A{4PUZr`L zEDm&^jH$l3-DlF0cW-le4R}6(x%Z|;(#c!9IZ1-&@V36Q36J(EB`TDONyqg@on2+O z_b=DwXO>(?3wVx4?ksU-;b{6&{W-^UYDSrf#;G^C-ANjK!q4JA>~g$%_|R{k_Zv-K z79U(4)o_rPhhc)JssYdPwA8@0^Z#VMRS^@pZLim|v)4*HEWhTzxh!r{82@z1Gmq3q7Z}&- zz1zR+_Km`Xf`ISGF7MX6_^fx)*{2FJEE`WQ)t1^|%ILEBaK*pA(+`z6a-OlSzq{zx z1=juNU;j=I3z}xSf8ykbCEW%S*G`bu4c_Xb$kco2K}OMb=h^2sO!DbpCGCIUwb343h6SfTYt6_jemTvq-pgx$ozTFLpnRSAD(K zQe!9jMegW_^_eg4tHZ58h z!8u{-1_KMt;^I~EAB+#L*Dri!<-@N>oI?cIUT1Ggy~!w}{)+wTgq;^Z zznnSGc=NpaY4Sh6s3|U}>HJym|Aez*jmJKR6ZcE9CT^eK9<=V$x6e09vL-HAAh*-f zf#Czoo}cypCEp7}wXeLhTbFY+GTm}PO{agp(7(vKBfoA*S$iKe)!oqZ*Y;bn@l$TL zHFagLQ{QafaU;FZKW`7m`|Uv=@1}A(Z!Gt>589nKZ(sS_C$g{pZ}hj%y7KMx%~bgt zSpu6=-Jd-aiMZImEl}Z6``P!4_qWFGT`ur(zwJe>-e<{4K`}{}b}1kCbN?@%S6PwK z(LcNJc%8iY_J?z=E}6~J{HYVAC$O~5?q56)>j|ld34c;|FZ=l8&f3#_5%R_>Ts{6) z&s1-+GH*)cIR24W+H8tWCoO_79mBJ1YPBRM&2$b1~HDGf)lx4vtO+!uvOa;vj6sU zxvTuEHh%pRH1X=Rolf`m%oVQ7jd}U=u6eVxPvXXNzox0T>ud?Ue`Suv6V_=P>%Z7C zICwclJ?X2@pSQ34^OwDoZ|kMJ_^Qh>XGiTn#jURo{mV`-k6-w&{`DK?ZO7!g`En{R zZAg9o?B(xMF;^RA-Yt!0QL6i4KY8;Pu{*b&-j}`zlYYc9anj7C_B`)Y#B}8?wcjXL`p!gpte%BX*H zkJ#N&aPQd0z3#0+|NA>SW*DV*d8NLK{`dL$`Q&3gGp$NrtqNW3)+2H7X`$KNs4ezN zMGH&U$^2GUYCrcPba!UxzJ}!|ch{+@8h1b2wLbOL`(%#kr?0Ns%FVuZ=JsNzuWD13 z{dC`4+UGuNqu^R5&+{iIa?Djy5;x;m_wzy3nGN4Ihj4veaiQ|cw6p2cN?s;ReafpY z7Lp(I^XFajhkwIXO_dUR?X%fug32kkSppJmU)3L<{dqDY_06+=>3%5(k~mlx=iPI$ zj{X;HV%;O3-Wz7U`@H;WrRVv3w>r&R%D_B+$tr_3j9%sbP z(X?&O@A$`NTNxQTJ3D)&&HsIP$jof5H8tzWiHX|b>-Lnsp0<2>`uo6z|59t(x6VEq z(HXpNnft%um8TC}n>>xru;i}0q0j%s#~b&?#V`N0b#{nt&9nLU>)#(baANtBE6o$# zzkc<;{@?^`Er1-ug0RezRrzb5E|9VcP1|{{QunaHk?oEDTPzLtXQaM)vG2Qa`q3J1uP0)%Q=>8MjXFr|KTVQ|o)Rga6OFUwyU2(_1%q>(@`;4dxzea>{(LBRq$- z!|Ob+Ou!n^ZQRUaM?ocJ2K6_s4pr85)k|X1(9@ zr``10iuG=_zEWDe-0$+2Efo23@$2)iv#;ITS^mC#NlG_g|KC|Va=*V*JIMRx>%69* zzqhB$MP^z)`<6XdYjbqE^XY8|Wd7=H;L*0Ni{_X9vu4I*?u+xvGzxgmpFA-&UHi$+ zt~VuB7f!C(B9k@!pM10HPm@RYYgIir<=z)7ZC=f6c5B%b@65XoUh&?(%EVxj6W+Zk zXYc-1=ZbFc)Ag9tQ~!PI0q24y2VS?Y-J2N<53kzpGxgTf(_wsneyH7>b%FhKneXcB zi>w$P9O)F+joOls`a#U~V%phRu5NBj46nAX$U7Tz;_eD{`TIwvua${dT2^^$-INjI>M5 zvTpkPaGG}{GUwj>6DM6CJy9~;_5HWr#7yN4H!Jgf8I(8NEKPgZum8t$+S`q$v%_{= z{2rnBDx#!f|5O&gGqy>}}Nbb+M5( zuRJEbxwG^0*6i!EOfrRT>Hj$P^LP3;cSGZ^U(T%#68+P>+obN_gSG$4c#d;6ZE>Cx z64HF`&E_}tzn7WvtXjM>N;G)(Rp|#Dh-t&m(f#f#{~ZhFo)J0k?sI;_@Puxw*&AXM z44C9AcORXn_*#E{$Gclk&9!^~Y|Kv!c;2?=%5fQwNpD0fZp`s;ag~{(+RrX>ICB2% z&Gw)HAIVK+-@bh`{wFne(#);De;6MQee-NVz)HabnRm9GTa)`ZK_bek=J4I_{`)pv zTPLO#^O?L!5-ny-Vha&uF}C|rbVu&~q_~4if7Nwv&iOFSNk{aqhmD2^_oPXan3$L% zGUF~jDBAh)zQoGC`^EhwkSF=|yvD?i zX-||b)nDJ(>}zDMxhhE1;{DQ#i((cUXxo}^xwL`l`hD(}KPRR~>ukNV^_GXe`pkcN zO$r&pi_W~t$(WfHJJT+Pz5TT1>ti5)UnV&5`PH#|jKgrjMS!L+GQyrZo8 z9-m9vxcSNcA4wLD4waWH_SHy#SNa>)eJqu2TYhqy>ervY-?Xlny>aSYsc>f+2Io8NWMo-s2vys(w>n)>U*!Ql0#*T1!& zPZTTIUjE}z*Ppbz)omRu|F;?y%IM#T+dqB(@%`-U)0aM-QO_~GIY9Sr)Y;YN?%ByT zEl{*QX4AQIhe6JSrRno`=cZ5P(*18I)~K*ypVsXYMxK+lI96-CKf=-`Jb%)pjAb%R zM;M;%t=SmzMEJqV6QM@C?=Unx{qG~*#mdm2<~!@gqatR80Fm5VTVBpK&u>XO`04KD zVyNtt(@{WbV-pU)kL@D(Bvw;_*^{6uiKEVXyQzo~*nttjn)u z@yG3xsx-bed5r?I>Y0se!ZM?#OHE+iHzWTh?>GJrpB9N4lq^XKNMAh7l7s2Yyv(JG zzNRisSzdouV?#lo)67{@k2(stWG>l1d%~2ShdZLwf;)X}SAWWBbx64C71P+De?Cm* zX2Qv7flK_77#R8wH|kE=`mHwV%iM3#vn0i@JO`uep-kK#|2-`HcvdTjR= z^>_Q$#qbrWJmP6iF0K9hw*A`oS9iVF1$nkOedeFOI%KI<=)d0uEIfy|#O>(SaTYjY z{PR7uWjuSr8OB9(^E0#n~Q{Aw-fA?%lV=1@S zF{_;_>;3&#ddyfIa&-9;o0`wl8dJ9!9M9C=Z{*au!1sOHRjJTV+RvRGZp^q}ZM5## zVe^XyCp{~s|9ErlH23fIE1&qZ`Mh-~a*BF2{ma7MWnyKn|Co<{_q;OQUx0CD>|G>(EEAChU@WzCSfuDCIyb;A2oxQ8LVrb*&}aX_u;`oj;5Y? zlY*l6{|z@d)Si8y*P9t0v)ENP>q!*n{L{KGpH7`~Qh3$e;-@FY*YD2?U%#*Y^!6J* zkvqG(ug6<92i-exdd`BPwvL81A}jK5ZHiF%QdDRdKlNu!Uc>VABr7GC{a1e;`I_;m zT7!?{fYJk}NU;wUcI)yuq}LTZYo2L1(^vcO)52F<*I6dGne*G1_XY{e&z9KuVE*Cf z-~R-)d3p(TE%^0z_x88<%YB~T6Sn4`bJy5ZG57i=<#K&HC*7E(v3EXbzLboxd~o`n zOG4~(cMTyE-nHW29~D1R-&}P2kATg-Z#7Zxm)6V8F)e!bru_T+%*|)3!avVRm3?)E zRb|Gd?32H%kJVn!O}Dh?nf}}ol(1Cq-#yLBP*8HblI{2*1DC%E^?$!k|M`$lVsX&Q zZFzUCl8$sd(CbZz`durC!*~YUk3UITuDaxB)pK?aW`ZH(Fq!!g^<)5CNC!h1j)E0e|WN|KSTE$+PZIbr$z)ER1ncFq*&a6A_nx(M! z!bi?8t75j-oX+b#6{@W|h2znE^|-!WKM(Dyo3(s>_5YW5|D67@;>oM>^LBBTMX!(U z-QMZr-qX#epTAe``|U#=Ct9aUnHl}pn55#~daiq~bheUE+gly!riVKozG7%+Fl^rW zBz$%FM1>PSzIXEU{mu2T)~flqDfP5O_yMJ9da+hXM>yo>|Gqt;tbO~utzSNz-x$x? z^k?fo{Vi`b`X(=lJbB~B(NL|kp<0YnPia2Cts}B~bx%)J*;Fq{X^~Gqo$T&kX3Yrf z@tVTPc;NZRGoCrg&S!qURR~zL<@@`|yG=OPet&lH_grtjd3S4Dy%G*{gc-8W z!1?Lk{{HuWf6qAneB1l`n+lKby6aZDL$I>^{i(@LComYQ~tyQdzrKdSa+we>yw1J*m-h5vurx8MKWqrgLNzb^i6 zxII4By3YDtDU){m!G9kr_e|d&=P$qE3Ve~oMuYpU2FS}KPDiijUHs(M@lA?u%5l~# z9g;lvx5db{AAWjduWy2y@f8)Xq@*OLrn&Q$o}X{8uC88PS-F)b_rQa$$tpiz#yXuW zs*90xuU|7&#dDI1!ijs1A#W^ipZ!%?8RMsTdXF4yRZP{dUAi}|b_VXg#lLu-uFQ^K z|DG;yOI?%m`ReK~r+=;pw{R3tS;<|r=;{LXZE+SGzdFrb5O2-H@$2=iO}oYAT+iH_ zJMoOuymj&%eA6!%$9OEYdb-;5m#Vey^DF1PrI)?$sTN(YePG&oo#}^9`kb}f^U>t1 z;Ro^mRco_ac(~q~tvb9pdVSoz`s#waE9DKH8$(of)xC*pQ+lmku`g=Jy6nwrYhPVi z+(rtdwLpY{26@HGAsvr|Bvlm;MD_=F-kO(J#NYrLS{FIS2d9 zt$8K=iErcWDz>ZS+?~ta|4BPD^-MVb^n88COE)H5{CnE}eSBTie&4fthi|>xv-{PZ zc`MdF{QV(Gpzgl*fyKvfOxShss_MB%*~jzyb4`zD9|`o%KSM>;^pmF~B-)l3aWXu3 z6WJ|oeXZcvmzRRdZWcQ|W}IDSv-|t5l$}B{dUuzHcQ4w)`lXCv^UbceOy{%HzgtC5 zj{mnM>g?*izsUxiji$wA^X}B#^VBhm>S5Zhx4<{++4e8$YIF47$5fO&KeRY+u~kdk z)^+!HJ^PhuEf?3j@!1mBnLIe2)oGzZ`|~wl!xAk|${Rhh zuTf%PWS+t9vTs3~fCXnojk&sdW2>I&w#{ppkG|wz3G#Trr;i-D@o~b<1;@tJ_fMu?R zo5i)9ICy4f=smD#6lT#rEywA=#9+WTtm%m9r-;&hT_@Uh(_I1i8i5%j(WXh-~|IZ>f5l@^%51m)V=A zzFqt0%>s#K^;x=I^X^tZy|Zt{u7g+I|K}$hZ#>v;HqUO)$0;_qZpB|FYd?J0_i%@k>gli@FDIEQ8|X~#aAj(|xUTylw{HAtiFE8eb+J3Ax24`;hy;ds{VA*i@<^SLBvgGc2 zyx3LTzHY7T{?P9iuX=BLf3j`1xSYhZJg#?_GX8G-P%Eu0-W$o!u;NGd%jEw5QleJx zU%j+8nVq}aJhrsJ?{`=8Ntwk}GuZ^Z)w7liuz53zh|*nYlb&dy~;wzq;jh zHD4=e&$btkcXtw;p?V zKsjL?*6)7W;;vs(v$lC?8fP>3y8^Zf|G(|EuQ@AKsw$?WA-X_8U*eCu+_M{y7$G7 zg3~TpA69wZwtC%n?*9)pIfey+nfs-Wr13?(d-TpG`>e*_QxLe(J@7FB9_x4}D%FURQ^gpbD_vChys-Uo}Z*%U|+wA?SRr7sG*xp%D z@r_Q73Xk|_-8KF*|Kv;0nTKcj*>5nrbV<%QIy+ovtFzFP#;p?%&+_y4KgIJu{nLV* zwya94oAj(t^dE|x_hs^-fKQhv88cpPePETI+}Mz~$|UWD-|;iIXa3rBMg02m0IPix zeUnvoR=iq8iFra83epvJ}k|g)c?@p+%~;QDxQ~_UnzS|(rUF* zR-GMI_xDdMLqp)_UuAMPo_(GCy*b*~_!jToEfx9Q6MlVGK6ZEiHxb7PH($Hi@BaPk z{nU2fD=lHXyj{0U&o)#(XkcMjpt05%Y3EPj;mYd`0U)gdg6*o zi?;J}f1W@5EuFqjPE&w$$+<^N?O!sVn|`s-<_dUM9izAWK*?T)hO*kIFEaNOlOE3d z^F>ZVXZQB=JNTFmbDX~ucJ%CtYE`DazkOcG{5E-a>S8qOwB^s%{*2K(bfWhB9PVtU zmS&!rw^!HxpO#)0drxW~KSM&Vd;o1oPrc4xGBd zDZo-_A=AxtIVwr!K*7B0B25PI&+@WQw?XQL4^Lfnc~^yPS87h?Y+B;7qW1Tc8)$%zoWft=@0$p1d6aN*0@6Z~FRm zqhQj?g1fD*N$D4-_;n}EKN^`oVeOalH8*Zb?bCl1@#WFq%dfVsGF*2y=JnszvJ4D7 zpI=#l;_beXzT7@lj!7FQUw`~UoT1@<-S6I;56`@~w6y!(6&?kSCWRB?{P!ZYoj!pFqwFx>hqRDCNrF|zcG%YxJy8YJYJ+0km4p+W>IJ1A<(KYiw zmp8U@m)tk@`FxZitmjQk(T9s$XDn?`KV>t+#cZqQzNLGn$@8JSSelam5a0q><+-%lg`T57+PZI^xdZVA{Hb1oBxv2bfBcJ1hGl#VFd7^iJInZZn0+5&LC670*jAT1|b|J_}9HlPdmxX|m|!f1AoCS-%hI?ydT% z(H5B;*`0Ja`pleNbw}n;{5-Ai#sLMZPv2iu+j}bCR!We#G~d}oO5!kNsN|()Btyfx z=38s#Z9RM`nX_q6$)B{}ak_2%@^-1GM55Dm#5!G^+xb`-Vyx;W-?Z_X-njPQ_w{S~ z4c5Px<8ii`QF~wSgu))}>AjYv;^og-XRGh2lG$DSRFH$oajx{)Zi({$zc$bLbKUFW zxo8vR&jAacT5u#;uzDEgB;GH&>dn8(TJU(mksfVN?PU3Ow(NIHrzZcuRhj>FhAOjC z+FPTjhF@GZeC*pkWIj;fU~&8zd*jas-KVD2pKr9>IC52Zn*xJV#NJ#BowH9bzu8cf zzkc3^)T19QH*fEmd!_K;_5PD$vcGMA#Rb+JdBel*n82~Q!c%z<5hA2qwEEXpn95HOyxKXu)_ecqE&Zp)pWA^Xqr+v};5 zFETVdJlsBAKYm`JDc2IGR<6XvM1}_KiQDauOZi&{E96$2D0_Z-^>X)?w>d|@ZxflM z;wtoTTJitKMV9>%sUh62u55_yPm>n^^Z8w+%+{x0Cx4HgF8{`Ah41CEQr|h#BU`&U zWcZ9S&tACBpDgcUyLj7-$BZEfGY@ecO$JS)?y38b_h-KIjaMwj&Tmv^i5Y4ct7d;a zvUb~r>V(7vN!B+OIto2`)fsIZylI(hkC64n($kGIIe4!5fJZe|<0r26`7=jpTGt8z zMxGh>{_{_D;$_%T`C09}nfKitG4Hl!UuR&@YOSi;|MX1H6pk-K-mabVgGF|JX;9oY z@50gt-9M(jo+iJ!X2QGtJ6(#;@BfS4`%nMB^uB)|j$NK6RZ=!p?}p98pUvBEhs#{L zzc2IRyz=vp#d2mUOp~fNzp1#e!S|*4UTKDeiwjJ5={~Dj%yfFgC4r>9rdtypWHl-L z_T9WXdXt@uUi#UctXey(lG+Pii;F*Xf9Q7Km|fTk>X`Ce zKp`!{bXrB$dr^i1Gd}z~!x#QU>p5Sn>!c;^?Z>aK4v&0q=qyn3^pvQ+zWyYY=X|k8 ze^dp=Px!UTq(Y|p$fCfftLEHYa&>mdwZB)h!mi#7-Boq1PkQVqa^dc6X#A$wR%3C?=?GLx$ftJcQ#wj zuADpl)0$~!&$<83h>ubYpMSG-=jRRETA%K3#^eNzYn$&y+&zB&{r<9lr8_Q8(wE=6xJ;7Q_i)&a$xeznaqn-; z*x~%z|7E_(aqra!jMnVY&M|Z^DTqy3D|WT*%-gL+chbJCo&Dtd$=F+8a}C#ie)Ob5 zZR4>s?Yii_@Q zynUnoBd^d8>#r}eN>(;z`%`HCijzUX#N^AZt=TbVNjr*m-kEKlA9S(roty1U!w3Aw zmc81#B5qYv{hRI`&-q^%3d}kBEUhhV?x9bL8f!jB^_MreZ$9_6-)+uP+e^=m?9tx9 zqaD|4R@7^=@oCLxJ>EUcJxiRn$=0RT)Jb1`cxT><^7D4Le#IDgHyYm9l-yK)-frG) z;jgz>@YSW(F)o3b1+<3S+AYl!^1VJ?DHXJ28YRNzCuDm zr>1SyDvQ`z^i)VlNXjgSgJDPI!-ESJWL}F{yie+@X=X=jneUM${JYo1x&GgC?Q(X_ za`o%+F7vA$Zl609W2e2dEqBTWi(hw|)y?C+$cSfgKXw!JZhiRQr_b(t!s$J>Wfrp0 z6Aj)>RxLWc$M)iLxt9ONH-G)nILa&0#_OKc1)4g&wQ)_T@%H~_OL8;zKQP@~zNE%C zJ*`FMkF4F0eeQnLcFb5`vZ|*L7GJEGm zPSvofz3cRwRl8{F>a@J&Z-uy7w*2<*PFix7>5^0B=NgePp=h4tUxQy}1a9G|`cQv* zNqeHymuMSP{`l<+l^g{$y!U^acs5=9{mfm( zKObIs@2_#S1mfylCpWd3&yw7#?$AxD>zkT-YP8S+cin z&#hL^zx&_h(f5_H*U$gC?P91U(%-x8VLubQGhd+l>uTU%he zEV8|7uY2pd)LkzoBt3lb_4@g{@#Q6U(~nD<rJFoy{FBw ztNr!i;o+6yhO3SqD~}c^ebs0Bm673#oM@NAhvwH4=Q{Af)&dwxncn?>!r3jJKkNJg z$qjGWZz$R>H@*8m^Z8bj+cRo^O!MqNd~vIv6@T8}hew|;zaA&y`8R#%@3^|j`#N8~ zERVl*IJt7y39p}j%)5RY8XBrjmh)FOynA9bS6iZ;_u8)I*W->HJ5nlj<<)%qzM$w8 z>krsWj{CR2`YM~~?eE!^%fEBQG~ZUgs1!ZfSK#lxZC4-nWPkWs`#+|t;@I8p{`vRL zm>Wuob}i3PTdkur=jfxHolf=M8$}f)+FWb)xvk#1B{|_;F0Zpd|LIU^?|U}M2js8s zlaa7me0|W=l5pnI!PZgu&Mg;;^Ja=b#--lyP6+|TDc7k z4Kp({LplQZ+8@7r7q>QQt6A=?lK1!Ka>es7C~z2Q8C9Kn?|s#)*VL4eVMpaop1Bvj zS3B~iC(Svc6ei?r)Yg4tTczXcqp$XeIE`C-e-?361PUmPs1dKX`N=~CWaR|f+V z+oUVA-QUl@Uzxjm^MxOQcfNnA{QBVTZ1?xe*U5ucJWID~|ImC`WFf<{u(wdmnNf(7 z#V&8%mH)=Y#l}TNXU(&(#lF*-xWn3-k%578-;$*lTkN%MpPzer-1qi%S+m90FLlm7 zW4}G{ir3j0dJpsFZDNg9Gs_L1e)@4mWo56VaoU*~hRgU}w%+(!{QVh!^jWVECx!zX zB=-ui>??if7*@rXJ3aWJ<-6L$)8^K&wAJ3d`{`TdzS@R2o17YBUu|8tFmUnn?{TKP zuFtVcYD~3BG0M$SZKHSnZpSJzo)i;OstuC|u$lvFoa3b)@ z%NOF#jGwMlho4Xh>Q=eGX5B0Ez3dDQ2d>{eyWzl+IPWKxr~V1=3d;{T`KNfcf~{({ z&-0(As)~!P&sJ9`t63{we{qX*lFDY|BKdnAl6N!Xd_7OhIQRMHt~*zyLtfc0Ty5iS zx$?TuEj`Bm@E417x6MAi{L4JEr1i6({rSiu->@%um))LEA=w5-Zh;BYY>H162rOB$ z9du^E(%RY-q0XPBlRZ_I*4Cby@sFrrMcDGs51oToJ+pRf+`&2FpTy>+zMyZ7maFcyOcdbK6JZJ9FlIv43Qd*gj>GK*Ntc|5I+b&HL>3b)Eu8 zmZeVr>7_r{WNumU)<#V7Fe3|tL-(SrwP7lvzgVhrqxZy{o3uXp`r9-;Vrm%MQG+Ih z%9y^y_wr2&=IQD?y_RNAK3KCR%6F#ADOQFP#T!<R+?b9=uBv4pa{bPx2-c;cUlDUD0^Od!4m&Iaqi_wM&H-iCa(1LUT7)2;VavM zn->?XSbNy}ePr<-*X?d|+qT`@`DVhyxJfF3JjPWkyG6Hz%QGE58q*Lnw`ae}nU<4Z zrfy$-dij!+S+8_ve+j=Uc6IgDwHD=%Z?rDHA%9buxxHXt z-u1&*UWk`J-s9lP_n`aJ`I9V;0OrTKVq6@~123{tw!}sp0ftotR~(pB5-^ z810#%s{P}ujP$OO8&!M_mfJdGXUXr9J3s$7zoeaba{X&1!P?hur>Cy^>i*KOpya*b ztn$8Ew@+m{RtCkVZ@e((x7+Kv;BAva$LWVp%I}M%ckN{0{26vv$Y%<3lY+mv_${|d zD&jpc-B}yoCB9w5*%R>MN_ODh+Y`!Gh(#L|txe1}+@CjdZep!~L|bCKx%sR!FJAB6 zzPh{CiFcFt-fO1&YCMcCPJKS>;l6Y~$=WGWyfOp`C*~;hWIDg+*Qo0oT0inJH(e4oejitp!~J-f;D-vE8SnYL>Z_V-E0!+( zYg;+t>yJ9Muiu|IPD^a`&o?L!n8p5?+coBWT+N($Gj1k2O!({n_i@l1))QB=7?W;9 zig5l=V%*#R>B+a#sgunLcg*>E{F!&%nK^+%>KA_{f8J?xZjxYXU-XdntQkPoe_x8ti7slda47yV4E`~fuFS2~t;@KPjjPHea zYle#FB%?<&!{c_H`F7;;r?`Q8GOI_Jp*m5%T**4}T zg?j$^mmX=Qs)X7;-1Kh2mVfs@t6TEFUm9G0e*TjS->MF!p7vNZO)UK5_YazDPE4Ae z_Ll42#T$!T1m!i^e+JsHcAS3rVU3u=v&VEj< z6h1usExptTbjZs0+#VAhg~?JMWi&+$zU^U8kkEViHdP=@qyJuaz0Y3#$b;waUjKTP zIrwnlnjP<7PM$V*F6X1zn4ikKTbu-@OqsZ`BL0_xGgaOaq?&cegyB z9XidznR)Y##qSv>Pyf!pTN~pY_96Lt&i|Kpw`9F_cJrJQ*?9b6#fg-6=gu|WyVo|i zw1wGoNlc4#cnM>__=~r1-@SRGI63maTI!kR73oq_x6RkJ)vovITF9_-gQCNk{1U#V zA3Ju|c`ki^Mncr;d)A?U2R_wtoB7WW-gau&tD93SnY2^Jo5UYkBtW zbofTj_-nor%0e7YQl>YGf3>Z)Vo>M!E15C-UI?fBe_rfaqQVBnuwTqj%2v-!2`KGmA{4{q9eay;pr8DzQpuc#xh1p3h%de6ks`E>JYfrN0PyzSV?I%e#M`Q)Op-+MT{|ogxR*CpVpcwL#)5yH$RjX;w0N&gy8u;J_`y z`Cw(Y_Wk3(_X|kvvlBX@`ZoEQxP8D}c9(#El_hU#+V5M{*1wT&{_Xc_lKNpe7DbLA zmvvbemqc(**e-1yY=4cf_JoSi;pu5rMbBpFJ#|hW4d58D{rqAX&lpwL6 zvq?ceJbZ*NIZ0vH-LN3bw> zoHa7a^Uq!K>_=h4Ez27RU$<|xv75c`#ne~R`t5!n_@EjZ@kDE?#DyBReyM93+v^TR z{4K1r>)&4Y=my)>)3t2;h6_%H8l8zhXBEXORr}3x>8_{TyOr$aj(RjiRQX4&mJwi) z?3McVsxZf6s==#8`nRlBp72|(z_BOewaTla_7KkMuNK!f^epc_b0Ks|L1N*X>1GX{ z6Id7=4m=k9xNeW-kLjOl|L}%d$kQT=$Gb{b2A#8)+;eWy>F#r1u1xGOzAE+SQT(~>8?-+)KNL{#PJHOp!OFDq zL`QYXq2o*L&-VHAOLJ#*#O}-b+r=Hly*ekq_;UK~-9xu(|4#W+J-Ks>XFM1GOdlnk zvWFWd$nUA=XJ|+~aWiz*T(|yE&*rI5cK%XtWjw?_DShL6Mh4#1Var&#i;K&$BDNYa zJji@g%{bu@!^Y2-j<30rlWwlQ&F|JS|Ic%LD(|eW2wM}`AG0)QauMqkGm|CEEROL( zmyfNB-2d&vMds;?ugTe2m7V>yKJ%pk4?piqh4xD(OJed8SDD-v{H|rE9(-?^|K~&N zPV~1sH|R9Y-PYgklV(zM^tAi?s%!GoC(e?Mxc9#3&ON2AF`MGLUrm4fjcwZZ(;jEv zMb^)`Xu!SiU7p_~rSioL-!`>B?f!d5D7W>BE7QRX?c(#fHPS29Y=sXP=sfv6xAFYS z=6_%Q%zpcWGj*$Cf?cgV?%5G`z=d&4kx`kcka-i$BRYvxTfxU z;1sstO2(TV5(m|OuvJY|nK^YlkgIng@j;ijXmmZ^A?C_?yXDJvO^vS1 zkf=2aBFvw)=xx*3W7yu@!Rllm@b}u}>)mBwadcl(R}_kJ|S zA7xtjS60n{=lZHZo>WDafTK~V#*;SN?f;v!S96;~!i_VAl9N~_5jdu=#u{ zMs7{?dj3QezMeBy$_y8)`6pSN_`IuKVA65-FZMxhQ#8b;f684pnYoy0@1D0dEV-)p z80S4Rd46`z>Fq0azJ2@3YuV(+S-alf-z&GdD%R3|KZ8F1B$khwE8hzVsVs3&t2Tz>DPZ&<91{rOXVm(}K$1ekT{II>LXU7^9WDMaK+>ifORH%(WN78GTj zxK~tw#buch_bI)*+L_;KuKjjbSduwwNo20#{eJltb@T5#E05Wh&-rY9{oI|byGw6& z%BG**r6?+7lG0$a;ELM()X3A9s`Xgs?JK?A|4VZXQci_C@A_K* z{Bz-5d+EOqw|AH4#FrcBpAPgpxc|rz_d1(5&5V<)6D3w%m-?1tw=3gL+a$4dtTu5y zCWj72Oc2Q}P32c(X}cMHbB|Lh-{<*UT|TRp)fioTrVzH`;P z_`soeqyE;yvd4C@ahv}Z|NS?`d%A4!s&?a#f1L8>#NJD3OFYq_`r)gfR0P9?*F0*A zZ~9nu7HqB0*!$szy5=cIE>8E2i(cwX^qM$Ps<|QHP1n^uJwN49xW$Zu4@y6I zT5Z-{kg3#voYdzes6LtZ#g&hz-`8)+eSX}t28Ra{4wBXzqYpp5zb5?q;Gpkf{Tzba>Nht;c5n;|BiA)PG7bi(b%?VIqVQ@EO zcp$_Q<`v2yb9{}hL(J0*z4_H?=UX47%=tXQU}3;QLC%{eeA)ZYy!f42lk()1p|bv+ zf9BzV655l^R)02XSCDACS@NNyqxX^0B7?+V7>33b7@!H^nJ3szPz1K zW&ZftQtQ>}`6sL9Jb!%i@#JK;x{KTIz23U|ir1ET?>@bpefgJesAf!Sj;oi-(}Mr^ z+Dh*S9(a6AEz>LvAkuSijP9UjD{#@C)qOFoi*pKlala-&B3)|HcXuo}QQCn5?gLn+%^wZ`0rSheJ{fIcG$-yMFFhEHso?mqO z`KMeprQBJ!|ME6pi;y@{8tCsJprRGyq?Nt=&i*}F-}gO~FMB57vYPE{E~}2p&a(H7 zxA~1GFZ2xAvE+>HPMHAF6}(Z&yXEr5CO+g2ta4&op~AG{na6_)r;w1ig`1YBEYxaE zyTNX})8^a`SLRvU^CR~96-|xmocnuE>IKRA+l9Ln!gs!JPnP5_wkec#7f{(46?6Uk z{l2c=itXXqjW15>-EF?ze}4XsZ&#<}pH=IAz3h}q;!~SSpPOa=eChq3Jy~~_$)zrQ z6W+$j7x@3|^yBL!b|k$~TOPLm@bR@(y}uqjdAGkQ;ZyPD&$d-XHZz`0(|+i>f5Pl( z?~{2Saa{Z>y|ON|r(WDpIc+%{KTUDev%qBZy5vF7&nbFl%d zPpD+5JnNdvRy^JEd;YRt+AW`0)l(Yg2t_cai?}{cF=`E4eCd^!R7SYISNLuvf# ztNUI{zpuY!rl+|p`hPiN!ig{b5^cV_=XWZcID5LBlW*SCS=o0ZjvAQk^U}#&_{wzU z(M>r|r8vz>1*fHMzWj;r|DWTXwa z;p>n5t*ewKp5?syNbJoVqteG6uFlskxgNj%wtAbywhj5O>Ln{B8}C|fZh9;+{rthg zGg~k3YoGarCBW~nsW*3DvW%Q#K~3$))q8_}zM2_bmpN&^qk^BBGk4&jDG%a3k(&!SW}+t2rQd9AUL+M;`}x2_F0-kH`ZX)oEf z)Z^8&rPiNpo_5yO&$TMKxZtx#h<1>u+kVm-+60(zh^RnD9-3 z+fksdWr2cs;(yJyMc-zBT*E%`CSR&YSJ7V;<%R@}uEY$_^@gW6nVh}ABmAeO<>JMO z98EU+=5sQrU2=-_dcM{zNaXY;weF==d!HD$>#=^ZtKwrB;VkM4A(&KHn9p2?vyXK^QwNK?DPtEH-{_u#Ga?FWSN*om*jpJnuL>L+5948!I z7v#7rX1!qsm&rEn8=HzRZ#>PuMrQlVKMVI;f5~V}j&NAN_G<0)A8Dpm7A*49;QANh}s<&IxX?6l`+Ey4!%&YR6eHTf-Ic<9EUmoJiA$c z`m?pugNhOtmz0Vftty(cjv4ki3uJIM8@%7O)uG_?oBb^99TVCVIh-C;SZ0R0E$B!ADb!|PC$anGnSb5?awla=w1tXisZLB>*Ij61aDU#El^QMXo>#bf`&SiT zeXYjqkXO}Me@nz8V9A~vMf@jy^%Eku-O@gpdUwL}2@@Eb6lT{j94PdW5))J8GoIlq zwfA5G*P4Pgwj50@oUB0`?-zBk%-j@u;Onn9FTZbc-*0UFHg8$|?Z=#w-#3GDOZoIv zo5(2sf1j!!toY{jw1?f&E=)*J*YM?8vFUQ2ihB+xZJP1rS%-$X^HqU+f<_Jp&3=Xn zu(a6Bn{a$_MpU*z#@DunSGyiaqjV(jO znJ3=8**i2JH;VPPE@^pcHDj^JmAsJHr+T{=ME`J#i*sY0@hCjtlhM;X&!07FPv3Kb z?S%SQTYm=zFD}OR<*Q``lMH>0wf6e0z5F{{@3blhW52rCheDp>!iAY_3p01s_&qA% z(GHh-@a=*QH$&Q_q5$^8oH?&{38qbcx<8wLE?2uDkN3sKt0J3My`Lyj`sMlM=4UmJ z3iRBM>iN$zzjm>0k=nL5?0)uzMSU7E5%XFf3OE$-lxhi{HQ;fb z-uQUQ^A44!Hr;s6mG6JHKEK2;)%vTg{sDs!F)=Ycp-7LQd=tqtX|oc&rk-VW4U}tt zP-tPp*M9oplqbs{SHy|vZcn>9ag(f~n5}i+B8Cf}{;H|%m1JN^vgeXI5ovH^l?lJYn71j!+>QWonKFh8g@<$ zoVvu4|MMFAgV|sA{_(M#ethMELj@XLMW?=N|9=q{73b#I`zzGxRkh>cw1zV(nHB4J z1Ae~RV<56MO|1S?zF5YzM2WUEiPyXv{(2ho9NuuP(S}{ULZHXRiyE8Ap?BDM9es@3+qkoOa zscYSb`uE&lU%Tx5zG?;m$?!BwhIp2iM5e@uquiQRe3f#%0XyR!a3%JuFEUK6_$Dv@ z{$J_olRIy#U(E?HwebDa;(dJm(eU0IH}pU+`q9YpVPZ z@oHzp;kvztSKBDQfAVgB&3dhUSvfUVBM`=%`hKX6!`kLzr}pQ~`H?%i534@=XH$6P z_U2EI?Go8I~FSkIMBO#;n)t-NgQkSb)uB>ER>mIaV-Nff2pPU0z7@gM}N|YQs z;kEGYWPyL`DW9}?B%-FhtL97BKcN?6{Ih!QEzd{K^Y`EQ_o8gq*)0-Vj6{tA1=9J^iih);0F+#|yP&AGaQ_E7X{EPHV#NN#8k+Z}_p| z#DU6;q8%=a&Ax{D-gqewViC{xA@ex9?S~lQ7evH z`1xJK`Ny}G@47C*qx!V}lx|2{w<}+3uiA4>HC{Dik<&}ugTGwNT|ReOdgQk!>(W;r zk6N1ddedG%Z?<;tIjIr8!Je+ym9U$0H)iL*5nbd+-#r%G(g zQRav_pv1r+;v0R|(lc=PHMzX&kI&jl*Ry7ON$)D!t?Fn$(AmwFU4CG?!Bcw_2u&O1sww4c1-(T`1$UoI>tf)eQrUWM=3$Y_q+p3 zzE0v=@xG(}*SCwC>rW+TJ7_Z;c=OJPo#k4ys%RNkqhR4CCF^dDt_2yEwLAqf>M@n~E>`8ZvypK607o zMenb=`{XBc*iF5Tuj&F8eN!&|WH@Z#AaKd$n3`MbuSN#J*%F?!JRAhhyp!Y;Jfz<; zZ#frplfp^E!fk(UN^~Vj95e9Q7nEw-k-uXW1N4r76PH%p{FAfn#3c>3qs(4{uMbY* z`fM@hMMr^%Yv!zNM;Cv#nDc1?U#!*}^9N6FwyKx^ySlT!{gK*z{h42ELT+(6srtRN zS#Y>hHvQ?%)@{o3DhzfwL@s#9xl?tgd&>t_zW&3a1-0j!1(aHXogAw~IawUnylSb@ zo9-+i(IsRNry2B2zq&`kW2uK^<70`gB9234>$+0kOSWyCp|e-LrsMJXWsmpQ)Gly5 zZFTm3?wf!cljlF%))T+Zzd^6)bGfv6Mqv8!Rn6O!E&9IB`>^n6issaLD{T3Lm&iXj{ z8vo|VzjwYgUH+|CBL8pRVSW|O?{z^uuaBAha-FB|AXOjBzP~u@ePwiBwTScabuuAe zpDua$cA2r<4?~NiOUwgR{${=2^)EZELw(P!U3!@ddv-lgE#>{_6!@yOwk=Ut?#m>_ zKdej~?FEy~Pp!1BFb$-Sl=Q`1ZVa@EHkM+&3l}Z1* z_s+CES5=bVgtuEgC0XKF<}@>VC*z*?>!SA_FI#(a!K*d&~J|E~|M ze6#%CZrorH{qnA^a)FGafL#0JD(l5{pQl&Oao)GZz@<=X&&Q%y`(K8=mt;DA`r&NR zMNYy|H|pg+OmFeNsrLG__0O4~R@#b()-U~Zq|`s`M}5>DX@;~q`(t6pwr0<}8XvXv zvZT*Cv8cb3{#|-+X_EfmK+JXG{Aq6(8LF%2Pky$yu7P*0SNP(%%88+M^H#)}M}9X6 z4eb!9Q&0IcpZ(9&lUH7TWAruFnya_kVcxvy)8|c}9;y)jvSeP%=IQJ*YwTPvo<3d^ zygTsgvD{aY+!6Y*p1;*LUgF?$WN_$Pv_U0S`NQR}-}9|*vFX0Lk{9#%HRo*2E;qxH zJJ*~4WV~m5@MPV7mZUn3~{HpkdbHu`<}Y2A6#clzhoKf0x#H8*Zy*ldUO%}hc* z3=RzODVrX&bBqe_ZdiKwTC8>P>mT3jm*>mfU4JrSYE1Ip z64jsU7HdRl22IlqkMIauc(K5uCD`Bdn7sKF{izY0{XDbxrr!BD|NNiYPiTFR?D3osD7fO{dE}x*68-D}$t_>@0BaKas7frsm?#?BG^+ zaBokylG&t?>t-_!C8Y-a)-3v2V`CIle5`!#?wtE)K4!P+$Zh*JJ2HB5wz|(vizK)8 zM{D%h88X^5Pb%|o-u%n5$aTr)Mn8o`G7@cydnfI5F)TSWOOZcFZvDJ(%!dsohx4ww zyyV%Bb;Wx>UoUQ0lrb&!tO_T?_W%3DgDp?}`YuqXxUA^P+x_n&^)*j#5^-(U%a3ea zsL{1RXT#CoSuBnM4ieKi1E%ywTkMc-&l9g$yzjW`oz>HArq`JKYW6=?8f%vIcs{${ zE&2KPvOhM-PF|ibVfnpYJ6HAotD8y3j(f}9smalv_Ame0ntP|k-p>>hRiAtLxpw`w zGxcWby88ZVoQDH_mR`=(IaRVFYJ1wH1AcqoUj1Gq(&fwEzvRyTIVpK8Tpit0ZkjHc zV<)%D=IfSu-D2;|8fh@5x^*FW}uoC2r3zPcjs*0PDEv#z}Q{>y^t@UgX$S#$4eZ{qq}6ki~-`R=35 z?E1B48>4^jxhp#5SnjLb*lpLVJOx<}7V4B#o}MMNJ4|Fl*NZ+TrZ}z|A?}{IBOstoFc3izbHFBrd+~|mm zEi;TBx^=hdpMCRt<<)ze-%MuApW|b;`2F&HlNED0uYXNTcI{NI+O$62yzg@ zzurH8FJbh3^Of5#e{cV{E+G4in9=413U)@9R({<&|MhcGt(gU3C!QPf1P3J@zVv9T z*u36rv9oF|e%$3XuHRMuH*mpQTZWW7=l2zVP25~Awe@ZJ_hF^!zPK z1u^+XzPEQouBw)4yTdVZtLVZD-y4?bG$y_oa*;byDkAQ5Rfi_VJwN%>!=^Tg+0 znR#rTjKpM-t%V2Ab8T%~vO;I)9pTmS3xY&f{JCXx|6StxK=~S@b*H;F&h~r1Ux1}L z|LM7@?DAjUC#-)aeJI=N@A~GyUWpw7a-Z(GubsWM{%Y>V?C1Ia3m-UTB-%^3xOgT_ zUKE!dUVm_%=Knv1$x-W%rruRDH*lEk7{5Nsl)++t(e1SNYc)(}6>Dy1ToAW4EA4`z zL$ubE$rG=>3SS?ddg<1}biSBBxvy9DA1{6R>1Om)rBsH5t-n-V6>qKo@LN3oNo`bl z?zfLS^!Df4mR9|5E!1Y;`>D#{jV*)B@1G?REgCU{n0x)!Gu4OXi8WFl3==q583Gm*8O_`(H-)41+96TDnfJ}E&)-t^V$#Fc?_;Y? z>aIRGA~p3|{YKOE0WW{X-0$}_nyhlV>T$=_V%s;Kj z5~DZ&^jeLVZqA$kG&oPZqW-n5J|z9d2|i<9tII8>&TowO{AAs4-4`YNa@AKhh7K-% z{Wt|HB_@U|ReQG;1pCX8juJPfbY+SJW&uGF3N^UKfy6`tI#s*);BzS6*#;+I3~lotmYWzVDG} zR5Llv&z83MXwH@wSAM;e*ZueE!W-7z%luwho$vozEq>rFlZb&{N1k293<=q*d-CSS z`~3@CQMqlK{^S~f_o}yz?|t@`z58}ZcXC`-(Bksb z8(;FzIU~YqlNVA^q2QKgz0dB)H}$pAWqDOe&m;GT|7*Ii$vb%Ou?@+g8i|e@6g77_ zEH#>Sc3=3>O>3?tT#@Rj(KFYwne*ZMo^$aP%151p{(a|PFK~h9@TN7bU+QG0e>8Z0 zWZmYiQeoP0oNWv5t$xjtpr+oq!}+;hNyep!6OVNzOdhn~@4Hv=YUBUPvwAte7lQ}E;UNx3vUSnDlWb@5`ee05Sb3A|EKhs}#x9rsI_+YC5 z7R`Nr$2KJ>dQPglWWeM4v&^bf=k%?9uimuHzAmi?3YO2*((K~9J zX;Z3{SrcTl?~9ot1A`;O@i}Ka*NEMExo&B{#Mx(G_Uu{lpzxG$#x^^AR1Yqs-u)7#0vecpWA&o_B%R_(SuF00>*N15jccpkCe@i5R{fk#;9 zUuxFd@YV0{6+F59^R}hVwxr)ZZ25a^o;B;AX+0+K()ePvh$E+rvp~y|jGa-riYH}S zout&tE(jjF5Y%J3Hpqt0|NXY5)zM{Ddv8YbuAk%gaf4j_A*X3E?-Y6uJQd&!4BS?4 zwMT)g_gLb`X~!QPad*8X|MB;`Xit;8;Qr&!|Lm!me>ilj*T+2@=H@yCzAW)ttGD1> zIjh!Gr^THD-G^G0sx9TSn~ofqdtDb)2L?=73L3gBv%Obhq1Ve9zoYuq>wJ6e$t&W_ zD-WL2+#0|3S->W@y;`}uP4&-w^;g;6>ky&La)BkI;N7peJEOO)DyiCV%14QVVMWO< z{rVp-|9sue84#~E&4zt%P+VJ0)Oq#azjO|K|6G3NZ;fk?)0O=4{qhDor?;wXe%f`Q zGh6NW(LHlwB9A=Z{rCOnk9X^LZ80)4%*xv@8ZG`_u%L3YSzq3dw7HqK;;W0V^0l(s z=rumJX#2Qx&XE@yiu2hSTBX)H|7m@HqL|D7-LLE$htB_vUfV8`wY92yAH%!b|Jz+P zW|>T%`bA!BVS&c_?JuTE*~g3VOYU0mzH@H9Xo}{kCvWtncn+sL6W6#hOTpr{G0)r~KKZWH{mISN|B`Q)_+XCzu`{o)|Jr+ffBe4RZ`Rkdm#lj~YgzvOTcsDQw@Qcp z&wahpx43SZrqt1Z)%)*Vk?St9xp2O}b3$4mYucnOyHYLAe64+QV%lU`yUedu?QPTh z;y)*EowwlP>r4gF3D>rq^OpFPk`-qh7`8sKGxDF@>(oCz>U!5roa6WWozL>U-`jT&Sb>=)|Fd;+0&=T+0`~(=XO%tUoz)jy`zR8 z&&=R^6YodH>(NpJ&I*|NX0RVv+Out*igX z-7o9Cb!B(So2>oUkBdHA$#5X+{cE$;Zx`-mXJBdE;St#vleqO4lid0KUvD$Zjmy{D z8olWDUq8odVbkuvIj5_PcDb9&9ak1T!GAA@?ZTN~<&%#Vef(zgq5M;l|AE4s18@Ax z)?3agGdDi5ypAz3!tBSleqSKU@- zs=m~wYu&+5#I-aH>>D;SeDM37w^k}-du_?HU%gYU{TUoeGbS$9*dn(@^j*O6j}3ag zxvkgV+gJSjWPk0DMM14r%-+Ju&wO)R*FTxR|HBpo*Who_!D*9tTJ#eyc+}6ZUHZIf zX?6OIHFb&evOYf8I{T5boz(5hulsIlPJb6?SM~M!{C@=!4}Z$?O@DD?`Pvs6t_jX&7rytDE|D6@DS(pA&u|SC710~fcWPa(udsOe?JE16 zIR9y>nq8Y}x4b;B>S_AOmu>U?P}_OVbL`Kj-q*LR&)b_3elaV6$5iqTyX=)!;id1l zeqCzzQ=_TCR@$rm17Gy6Gm(FPUGeeR@P9?&+o;XIzW)65TfVzKJ8ZvQ=f%Kp?p0ed zuWmVax>3)^xaV)kM@x@Cp%WI)xRrcy(cSaUelY~hSQ=yeZuip3X0=9dn*X1D@%7@3 zbLRhkeSh+ac;emq=Ie%=57M6=6&{w)d|eUG>GYhCwp5O7iWW-4HEgxfD8 zasQpf+Z-N!y@H>*z8rFrTkn;#=5oI3@naTm&bfK1SiHLP`bK}N_9Bk{=pwo2wih36 z-~3CXYg5(d@L==xGe0Na=AYFYd!hc8xpGfc@TE`k)ZFCpZt-4r1{vqqrabRwi2S~~Z|$|e%6c6t z(=37$7fm?bKh?9g^Pk1P(=*Sj)mc2g9XNTn?uT8If|?cVmZ?{S`3ubac{igit?&Jh z%ZERixISj7`}sZl|G!%M1-#Yg5+cHuUas7jeV8GWQJFPO%7aZqEP}y-!IANJ!-2-r zjCNd0=RH*55YiL+Sza8l@M1-Tk&Tm#(NDVrO|436tyYHZU^)2IqLSl`*d?=acYy~& zGEB$4cfCA#Kllr`QfI;E)>Lk`wfjC^-#@P=WOd@!RQ5EbGVNFqSN?2cQ|qlF+E*Ku zt*>@o7614%LSL-KJ7kiE_ zY4!bU{`dRcbpBk+#0!>!PaF+Pe*K#G^?pU=lj_ZK)f;|yFIv%YetWz(Prt&wR}r2< zehddbJ#_9#>vme~S^49|g`M0hPpx4oW_CMgb!634u4#$l{L$v+zn8G-zKXH0zWut& zt1`@fufAi=`?$=g-C>JgZMKhn_ETtLY3#3GH*d4=|7|9dQy7KgYouWZXP zeKOH4ytQRw#gsgaB8FByy@kq59|25|L+WaiD$Lut_xanrmC5R>CIjKN3Dz0 z*V}Y0a*77PnFPN6AvAHr60T(7#fu)Na$bF8B>&7pcS6y_ za~IbxUzRU*b@|7P#pj-EIm68te`NOG!#5U3`-{rU-1b-@CN8Sq?c1ZZ(t*Q2AggrV z?P@6v)+MVHCNui)PhyL;yEFap;sTG37OfTOtDlMZuHLfigHc!MC%@YFt->u@>*i0G zHhX!a4YSBC`5H~DmuJnhMgRXgxc}YrWuh;awJP|YZq52QmFeQGghvYk+%EcUdKLNC zHdp?rn(NuWm6P07&c2YE=lE@N!ISvybEE1KuFVqu%)WKblvt_tTMm5u5%=s#9=F*0 znP#<@PsH!DdvWFN^kp+wU;lSn?}O*&%PB_Qi&Y9eFLE?3;5a2F`$JK~C?RNl+u7G& zvh6j$<}JHDr<$WFBJ`JM*QsgRkCam-+V)nv=WSf9{uud$ugUxSTI%-hc1KW?$R% zUTn@-Vg7D)-oZi}4o6|0(?N|dUmVkwSQ3odz9$ykJBeT&brR29cMSaNBFo+bzrdE zGAWTP!y^GEu@}D|lD*ZR9P#mZvjWHOegUzae|~S3pZ+FHJmU@bbDLAYD}U}&{A}0l z+c7C!)aj>!xo&+{e`~hCUdE@e!;?Jf#*fZO9U%hy|`UtPw%;SQbPUFXU2rf z3zf~P`5AtCUESW^cjndgkN%Bj|3CcXW;n3v&Dtx+`Hlw3 zEsc7g9ON^FwI{Fq-I}ofuVzMbm-+aul6=4A%(kb$>uy(N-RnDP*m>_abCnBg;r(vU zo;ll-KjlaJ=SIJa*{+cC{%?o6-y5C_k_A`$zuoI%oFZ9pSGb+wyzSe+9w(kuH}Bsg zIp{|__nD%Lg_WeYthl@@d$VYJx_juPbAM7+UM_KYD!E^xn<4WDcSVfMVTK7# z{3cH##RSf`70!$J`~KO#MVeRqZW=V5uD>|dW=GArDZI)it+(Dk`}b&z!-;#p1?L|0 z*tx$g$83qj!No`aUrJ&LHM>(3-LoiT?ZL|_H~%T6eA?UCEWByM2C=WN_62?y)!%n- zPu^UyudhxWI%Kh9@>yxYesx~q?O74~n{sab%zEdh_s%^3_Y%(4?MGBx-^LVMR2+=e z=dsaiXa4hLPYr{Ez>>VHT70ap!d7Q}Wjl4^yn4g?L?O%VVe^$%8oodGth++H@65qd z*}pz0G(5b~rCj_&>E4X;bnClYxNcV4AKEnGy`xtQtIf4Wn}V|!92=P~-4W9cSlP5^ z)$9LTkDOz^_pc_(-*@3PN7o~oEbRP~yXqr0d_J)K_@8@|4jfc0;8V={R8%zgR$pbZ z?ZU#hQ8t@@En0No5m=v5-m+$@e;NsdX zr`6Z}UYhH8Sbz6{#@k-gI9i>YpX}}Fw&Zf1<72iU__+T5`e*yZg#`^a1iLewm~{Gm zdRl1XvU%xu3U{wxe_di4Pqcac@hKa%+4SW1Ufl21D$2y-dTgD9grKb5-s?(xj|J=j z#fSLfn{Ucyp5lqJwBai8e)7SA#Yk@l*RkZtYZ+$T6?YuWkG0KD|LJ?n{Dt{qala`^ zF8#t0`z80z+LHfZUq;8LcKxK>uq#||n`ig0|67@z^nB;dm6e<8B%&AZdu+00&g1D{ zsv1vUJg&+i$I+VeWLdMjL|bQnPmFEalNs~w+GSl&^Escl`dClLbB+2GtB>BQevSevF*<5nw+6q9 zkK0;({{z2uF~_3N=3m>G#3se;{(j&s`^=LURAO}W-Wr^H8)I*6n*VV_>EvrXviq|> zbQ#Y6lXLsj>fds0$;sh-J?o`*SKP2#{wheZTApJIo4U8=w-*j_3v~ZHl5kkb-YSry zcPfLoE#cIs3dN(3YfSF!@ZFnvzt1T!<>3Rc#B;7k_J&U%tue@U>ApJXTzKnQv23@!}5a)-InWx1_uoTQbg7 z%u2KA@?V&6@&)hXaGqKFlRquV``o?yON>=z?Um}y;s4FbuWrro_3|Y#dp2j>usZ+N z_Nc+MBC$hJ+Y~$|?sc8C=x&*8t6a{;--4_*Wx1bpMO=eS5}&_u3Yzlz;d1@;4dOvI zetdQtzjGLEe*dX>|KH$SR{pX(Q(o*%`M1qeHL{k+*^p=L{Xa{~?K1y<{#1Ky%0s=1 z_5Qn82wz`6*H1Io+iA+I<@_y1@wpeIcJozzzcn-Z+f4f<7avXz<6o$0^*L^vDPQk_ zk8JsS_SD=zqiHMl>}KTORi%^cW`9_CGb1oXn^|yU*hYuImgZldl|s6v6kcUnn7t|_ zEzh>*8qfa7{$fX+#vNJ{1QfX@d&;yfG2l6BbMIfY?Z@4Qr`dJx8sB{xvtJ?BZt3r) zlds#>+E`RyoUqk0^QYavMGZ{~9oHBC*>UP(uo;hgV2RgvR#wSRkG|e`{WgK4sj@~% z#?`r)UtGc`&t#r%fzW)BoUtu4w#_G-IW_VwJ@7}6Y@0jK_ zXbXIdnXb8A!bgpp`FU{O{;=I*f$!q;nW`^2?LB6&*Z%|+r9juUmx{(?T4zfyGuI}O%l1(=|EHhSuK)Y!#kJtD`O7|NoV+c+{nE;>i>uF^JI}K~ zJy+pFcU6#p%8Zmr26od=U;ngZnu?eNmySh&fJ3E>UrWTB-TV`8i~c+QKh@{QgVUkM zpRM~*dakE`y3LNCH;x-KF?21mNKoRFFPx=zSC&IT$xeQI!ixDavsYdBp0~YrQe3XY z*Ka<1H_y}BGEd%uC(V4+eu&vZU^ z-hKP!^qNg2PbXU1y6wrg_Lw;3@SgpP9!xKNrl1qX+|Y1b^urFG!x0*%R((Hnu+ZMh zf5-QS*QMCE&bd?n%>6Xq8JkT{pDeSq|6OtH)JDTe1&iF@Z{PFVYP$0ulj2wFa$jam z{a(#$#&+)KlfC=i*8Tn1f3~>3FzcN2H@gKh?r6TVOmXGptI{Y*{$wk_^+o*N?3$@z z*Eh!B?(}BgtYe&bE?9C3jD^P)P+#|LYY&he9;I+P0f8w*Fl8&Xm3K)6sU#erwfQxfN-w;`>*;VDacWuBp*= zYx$QC`gv>Zd@tTVb1%&-%8LJmfS_um^;7ocn;&+y2Aq-K_u})i{QbM~A79k%F0<4X z-t?XE=q#^Op^OPV0c=g>ZULJQ?22ejl31pqZn^*Q(v#s?TUlov;`C;FWU(#%?yqg3 zLJPeX>A!s-;4;TYN_{fZfrGx%yLqJz6HgwH-*@jQQ+BtIny$#{OGIXjtoQ)K_mU(uCz5XJ#*F1Zn)ZVzYmp?ar>ki1i`6yw<8I{O`Pnh>I9p8B1 z=#|KYlE?gK-VtCr?)^09gu%6(nRa(i996#V`=jc^AKA(3br$+>^U^*t-LKjC_Ihr; z&Mnj2(^J={e~+yD>hEuxZ^5F@F<1F?Q|p&4%#~YH@9Njdtk=83muI|G)Ix-cy=ti{IVrRZ(X5&X~-_K%n-3=$9%K&1EwLDC7c6abN!#suD9&| zX`>aqG3CNjZqC=eF7oP**k`Hw%53&qudO)}JOodNubS{qK<_|+2=@)g5r!}2x;ES0 zpHi$jZ_}a4bE?&vfBybyz3y*i_L*?zeLssoHs<%gji_DW)bT}8<5G6Y@^j4h%x3Ep z+eN=~(y-bxPhRHEK1ZG@ku}P1-(7L6{%dRW^V{#OY@2VMc@;XraAkD;c5iO3-n4tu z*7g_Av-G@o`ox~;6DvQ>Uw!#^ofdcTq^NsrO$Sco#V*giBXdw~hK`t>dBvobyp4C~ zZ8i@&ckhFmhyl~21ueH@7^`**xPJ7uI@mSU@uIWM#$OBtf8V^VTi;*(eDXEt=if8` zCVrL|d!zGwRgCZby04!zZM9X8ubKbv@x}T6yCoL4ys7=!sM#G_tG$N3^J`PHyPExK z2RZHD1BG`|Ha^kf3Y`$SzUu0&sgq;syO(INSLZ96s+a$pwzj*SugLcL`dG`AabH(S z@*6$P@=Pk3@>QWp;qS8Vr_N6bK4+A2Uvo{vjnss~G^NNhGk!^o-U$3<1 zk9%ddp#qHRnhD^R>^&Z*lbI0~%SE4HvmeBXZXdC`t38gB~|Z#@or z9S|w#z_LH%4cp-jVp=O6-DXU^c%oEzzno3|@h6#gti9R2eqsG#}jzVvOy_a7H@n#IoMpLKb*`UAOpMV~J4@1Oo;S^D8; z>$hKEueW9Qm{lg-{>>>-zT#0?Ne7!k@0|98cYbd#R9r8g=`0X;x?;*Np$iU^64u1t z+*|)|=4o@!kT|K*9S=Rl&`-( z!=`c*&#DFf?Y%q~xH9JHi=2!+?x>_J!oH}WXsXuMNt4nN=EQQJ7jj+xqw%wq=6RRa z_TUiR$^0)3D`b?k_IQN3iMTR}yN9bq?EN`y`kS-q&hr-jsC%csKhN@JamsQ=V|%&H zIR|Feihs+u`t`%FGnsXNvx5H_&!V?2dd&ATuWp^`w|0NUn^)(qwy(J)xbA)5-u-fo zNiEy|Rq+W(e4Aq{T6g4ak@E4SEO8EnYxl7qm6G4FJ0@$gelRpU>0IkJ{L zxAZi9*znawBqBiMXHC@k?RHr^|Ic20zi#K=C7*V_Oy{wByrlGSTE3+D!p||=zy5C0 z_wLi%_xt7ty~WeNZ5Q|0zWiskoTeaaV_N>6k4I(F-d@o?US}73EmyPpky7l*jCO|p z@E^HPmWr>L_e0k2!Ctr0s-IhDt*)QHd|EbNZT+K5@2|`KpPs0#7QR}PE$i<;X=ba^ zEt!s0e4fGg<$i_EmOVUSNA31$e}W#p&NqE?W&K_iqc_iX{x4f^yC?ao;_{pCx`m_8 z>kG>)YVUGxU|=-)QCP*XAkTN-?PI^W^~J6JY&!Vt zy-33coKKdQo`$pLM z{Iay?Ga~*TJ^la7>mPoZo677Pm(6@U{r^g?vy~ki+`caPW*eFQ5JwVu9FR!!NV z|Eh<>Ow&iRZ>rZ@ekBg0vZo3R7MuS+y7ch1W}92!mAZr@8*~mESady|o@rCBwItTE zELr!DLE+g8VX?FNVl7{sXP$m)>g>>tqHgi9`==gT&+Hd}$JDUn$qXystZi@qxozGq z{dMlG#~=5e`M=lv-$my6QK37l4wbu4Q@`$G@XF_V{<6I2eeb_Lt+wpHtM6?|(8E>heCt-TeZ4d9onI6i zV+{|7TwqFmb84ixSsUxMwLg+F9R*l4vuYU^xc=RxZ1*PU)~ajoY$p^s9~I$#lX-Wm zWM6XC+QOF|UmGlL&TInHY9(VBFAmJ{a4tg;Lk;J&*$E#6k~X# z#@me4wfAW?~UD%eQK?D`Lw?Zn*B@^P;PH;%%6VPGdWgV;8V9sV{z_X1_sAH{)e7UJbB#k zjGc!+Phk4G`x&3Jn6KY|^&#r<7ci+Ml;+Cvy9{xC*ANAKfo~^-sd(*6QH{Ip#d9A*^rtGhIyxrFC zHeCu24*n8J`mNkz%rrCp_|<6Pkcb~uhn|7@fVWJyh7{Mb7hU>vK7L1HQZ4U!Ln)vA zZ!LnC2Hn~0%&}nU&A6>+-%s!V)s}jLq13MN-L*Z7Z>%brX`7~GXCMF4i+36`6Qc`D z@gn^Oj_uMvmFgxkty??0zar(+knE(!7#UVwUH9i~qpFSkC3g3)NpU~kp1L$qT4I;X*+cOr0xSm& z&uqQ1k7rVI=BL=_7nm7j4mVjkeJYuj|9f}C>8DDE3d{<>&Z}KKz3%C*m76wfP(92h zzyHtqnXk>){`)yKIXUXu`s)illeeo)PEGteulC`D6Rs^xdi)F)F-#1%N~)dLmkHM% ze_C8|=)k+a30v0R>OGnr@N9KXeVB+=(ro7&!jYadLMBsPl(no=&~o zCp1~sF7Img6?XOV|4+A`WM^ngo7Q{h!@~#VwT0WxPSiFE+PwGQuBkm&-iTh__gVFg z(z>EA`+E1czNwvg_<7M*w(wsbP7^*V-r+d-ViSu%;5xHU2c`RKSr#2q?b%c{>yNy$ zC)Zt5@#7o%&c>BX*T1h2Vlj<4(^|C2D5RfjdPJ(fQqm#D1^2hin|DP(RR44SJS!2$ zw^ze!?yoLd(U=(d`kme34cn$IcD?>lB74%&Pc9$L#90q|cbM@6J_|5mJ`iPW7hn>6 z>9><{pZwmdtDkOQt(E^fect40?;l6IUHtMbl-=vAD39ygbk~(PEyb>dpH=FfX|wUW z{_ob>X{pUK&)sm&*tSGm_kl%8!_wBo8<&2$RdhJ3Yd-lLGrNYNqxDw*!=MGOhXovx z7Hqqnv}lp^&v_-EB)VA3^zSonbU3g{XK|K>P$x&zf0QH&6AT$3--rKGx5Mz{WVMc(Z<44#2rYuDLW zOxzow0NQ?R`64>nJvr>Wkc_kUu4aj-CyT$?M)yQq%6~e;cddO++alGv)r*p2mGoYR zSu{=E95zuT)nqoW+UBcX3ptb?eEbpPSEyPl;u=uCXmg$8iN^~yUfnu5k$aKHiZF(K zt(7~JxmFb)JUh*#YY~&&`G+13)|L8?KOJsyn%o*=mU;Qe(q?-Ji;6=Xf*nDDyNf32 z_`GSgmSzAif4}GHovxg6`kK!&jjEeVd>=A(n&z(SeRCzK{VWT|ePMaq`k9yS9NLsq z<+!csqtPbA7X1ug&(LJynmeXBH+R15I68m5%bv}tIDltt_8 zTJbDR;6q%og_Y8u7t@0K->0s>XI*`B)>irNZ}w*W^pcOh{POO(-E~pD3`Wb2-l72%xbePTHTIeiO`-&jN!ctzEv~-5QyV^wM(}xdBy?u{=oMiG|xKB z2$)f5TO0LWm3y1-uhi$~7gt}isCuxZTv~-gA@_dn*0T38BChFQVy9L8oOt+;9K)m4 z$I9eBd^;8yefQX&ZxSE>9iFmfb^0F9?AMA*&KGV6`D?@9CogNOekWBsP2uWVR(<9V z6NASo^~v+=^sB#EZ;n+tsww?vtEb4VoKHPYyCRlIua;;3Oq(4peS=$6e8rXJ z>*A~nzRfu`C-!83_+f+085SpWT?AaD#HOt;c|5J3X&T4+w1d938h*hr-Zmkb}e`ERE{?ldJMR)I<{%)UN|MACF?)}y8y<=o#4trnP`5uoE^>-B5aR0@^nc{ggw)pc4SLbVSHf38w;`8q;ySF9ZJ@W0}rH`-AnRc+yM@5Y3 zz-{@hWztKI3l|&}Qrzyebk3o9zx*FcJTsG*ZBmF?U!(S??|Ckp#@ub59RDwU`)i)2 zBfGcu=)Yq3f7|3X_8qfe;bVwl+HSGCnS-IxdjHO_`DdS-mMe8BJ^ir!p+r>MTBArE zu3k0ipj9fK&-q@Y8*lVlYi6r2&!BbuNW|LRCO$U#3Hv2y?>m3W;X~MIEv0Qg}1Y;VQ&DpX#5AN;SGu2{d@`tzrF}uHIe6z34 z-;`Lfa?L*VZ}+@no@RWo@K_%tYA)4oC&ZyS@ALF&n+I z&*@(&&}Oy0s?wztv~kCU&3~RHb%-^EF!oQKaM0nUm~!9&C54N2Z+Ap5Nh*wVjsLls zdtZ@N>ct19#%BHVHdb!&T4yMEr+-ETQ(i@igtPJIU-h*=kCa|-mA`+I0X7U60~!W& zJeAxpEvIzkbAPF!Oy$2vE>6`y9UD_47vEgdaD_j5Ph#x(^I8-9Z*K5RH@PLgyX^nL zCtvUD$QUWu83jqH{d;is*>C@U%4Y7Hb)^5)zW!ja@mRu#fRhZYHe9Q`7jBX&x-ub| z?Rzq-T*qMrKc+&7DM@#kj&JyoB(3DQIOfbQo1RPHLA$Khu;+P+_mh-t{dYf?-N&6I zvi_i!{*5nh!{5i&e|b^1tN-hCXPuA@-)o&)I39}kq;<3Mh`HR~7U=wXVlO+t^^I!n zsOH4W2bGKeT^DD#WmZ*sTzpf4SJdVwMovqdYqiNVFF60y zF+rZgXXJOB`YN>7wm0hf+XYz0QRD8EO{M@U}KJ!+a zME;p+FMfPOgWl0#le;@=YZ)@`Y^!^`?dw&pv*Q1wD?c|azGuh8;rJk>s|t$Es24Ne))Q5H-vD0 zw_Q+Bpk(o``e{K+)TM4Qj*dlqr=yw=vb?gGdF9po^#R#=wqCj~cbm)GXWX2~&m83YEh64JEnW9bH8m=9&0T zUYaA_uCRx%NN?*&cR>~db@k6R-uD={`!PtgB}uR|G_;Mx4|<;knZE{LD2U1*am+bg={WcgZ4o5!;Qo@1w{cUSj*YEcm6mNC|fI-|ny zCZ_hqjq~YhYh`aeYQAni`^wvMQ`tqex6k9|uu1uJS~*(mtx-mAah=qEgQpt<)0r6N zG+$p6|Mbki?$v6w$L)A!x;(q2tlk^XskoFGvUajayzV-`$+NE2zuJ22sj_**{D%pL zo)?~VV`iI^di&cgzJ32bc`NS<)q1JT{(n!+%lql?Mc8Cm1nMqKpQ|m#(#EV{w)<^e z^1ZNz)QRfx`o;kwD@8OeXTmDRE70{!iKa?yeYN%XGv7G-nrF{X=g-?0dS{`bjn}2xjN@n8-#ymLn6*DtU*><-lBs_5%kg4~&YqOt9p|4aF_;|YsIW1N4+wgyb6QVs z8y`bd&4*uGe3k828S5nMS6)#eQ7WbM<4sg`gp#mu%%K(Lj0}DcSR=WrtN9t&)_y#A z_PE7!&*cj>uSoHxMaRYNz2z{qbyvs~m6&{!s}0k>vG?-tyuDAm@a9bo{}qgZM_+S# z{GKNsF-^5$ae)2F7CCv*P6ZE7;aV2QN6N};>!+{2Y7wIK+1HlOamv)I?txn-`GmzC zT2=dV)4`N=AFH;qMyo4nTv~nn_;0><-#qN_bnou!`{#Dr_ekH){xEJ;k7y+P!x!OO~@dPSBCG-ini$7;p?RXu#& zyn6dY52YUOzLS+Pag(@zI9XmX<4k;fTYvj*y#=AKw&~q|z02prL4z$`OD)#kOE8$7 zTh{v6Nao7FU=~M~m~{~v9GVWh+nfbzIO;X_&s`tl>fUnt(4kjhYl}WVR9@ctI&^i` zTWRi)Rd<|HLn}`1zN7uG)mgyP@S?kof zZ6xf*)^PZ)`=I`#8+=)y3fBfif=i_pZ`Yf{aW4&SX#{kix12X57U8U7zX*4?aH_$ZX~r;XFm=S@GpY<+Ee zdmCGW(A+4{(UBF+o2#G6IK!FixMKA4+|~sT(6SBBP8m5uS4qMjSY%fEIE#G(h|we zCT<}H3L0D*8x{mj+tj-D^6xvpem{O>U~OIe{M?zjHzjABkKb+ld|q|hvwNTK6wmvl zyV*5km-hG5wK9iS<#dXFmzjR`PmiKb-MQ&LZEE|kKP_Xo-L5~wRp7_&^S1SI$+{+L zywfH&HL0v#BeqcCBD;6|oJP8tjh|=# zFr?ej{zzK&pSIWWzdkI^{T;>fyH~&}^~i_F%k`0ohRh9zU&n6!sIA>&@@h*V_q>C( zQ$i-C)TXu`e*KlLX=lYJ2M)-4_7 zHOAcfayg}T-yWqIU)lBdAJ3(rcAnKN4RhF3pGl;`%Z zuPFYvCfl=V#ipotd!Lo(?T^>k5gi_wcS%-rx&Os4O``da1oz7I?TfHbXvuL~9JqRG z^`47gcq1>Y2r*l{Fk!m+OrF)}-@a@W>+TJita5(&4e5oF&n};h-hbnw%wDx~lICfz zj&MG@&vCvuYtoh*C*rEPpUFv@{`@fcYPiNp@AdmH#N<^ao%<|V!*cUw@orneboMs} z(NjXFx|>U^UR`n`$Nq&?jIgBpu8*5au1pkk>Q%qObU;0S&Gh;s&5WnT9;Ib+cD5)9 zRz8(~EH=yJFvmqX6-Ob9I38&M*51R9OMm~>RL%3XntL^4!X?GV$8Kw<@%H59-Y+_T zY5My;zqU6WzPIG^QOVNw>$?+<&R+X=oz;wtD_PvzcI^0Y#mRWh?f0MAonyqb>v$CB zy5(Ma$!(+WIq772q+XP*f={5J-GjDo)_VK(p4z_rQ1yKOu0H|ca_94d2{>U_g3j|ukU76)AYD>BVNR!?2nVfZiN6ghWgq> zK1U(D?fYx%mrn^)WZ>zZuTd#y(RX(4Wu3e;%xx`6ul=5^_~F)hCLz*KWtY-BrSb}! zyZ^47G|Fsb(7!(IwMkajGFdtOa~xe`@5Z!<6)|JW*@edtqXzDdo2-uIt=%GOO6>5RT+FLl_UxPGJcJo`nv zC9ZEioARVmu1T1G`};Yczbx`TZ}<65@Uf%oQhwcecYgofZCQ`QD_r9Fg?*)*W1hHd zdHzQ^hMC#?wkMOm@yt^_%Q&3fHMB$)GCkZdg}1(CLfFzEZBegQC(j8dx4o*I_dKOH z_JEGuk>ge-GpeKQ39dR{l z?N{x~^SONC+cdsje|giNQG0(iiWbjyyKZk(ee(M1{jy)4ySJsv=J}hyk+WU&Zd&|* zE=8A%U&43Sy(qNO)|qDPXBX%=Y5SjFM*ayu|JCmH+#a+#=%{FW*FW7eF%oSaO#+`j zRnDvb@=Nt*ja!St@>01)$+Vb-C@4J-M`?;fYN4t<;bKx<29(Y{pz4p9pH`6>5 zmAt*elG8f3-r-Qa`d7<%_7pDGcXIE$zpRVd{B(Y{-Fl&K{0wj8@~0nO$h23~?bX6P zXHtwZ9tTf!t&&R-(C`fMoYb_IvsGE-aEoSE!W8+wM6K2)6^_n*Q7r)v-$Z&E{p2}a z_T}c{|GyUGpW2bB+5fBL^RDtdU;-uwHF zv)S9Xe=B1=P+Y%r>nW{%m0NAH*3uP|fVk=%qmj*F*89J##Us)pyKm!YqepPIBd@%i^FGcmA) z@HPjktT6RjdNe`9;cMc{6`@|H8okV?mWWwr`XAJ}VAA4tb$Q?U`2Bk=Q=6x#)rZvT z@+yjDOnbaW^qG3t-RQ8~$h}E(Pp%T5x${#%m%7)CMSl|HBcrvKNbCIlu=qyE-ni+% zm-5^Hy1jM(`fZWz*RSlj{WkH`v^PexzI1u4sh1 zB>vvqpMJ^gCrVhcX{uUqRDT#tqcn%_%jKF%Mt3r%stP%tn&n?n z;liMEeBZAdw_k_lb+srlI2iKiTk(D^xv}%kk@m?dh6iSAyi|MmljUth-{P0bj=7Bv z5)5WFTb{PRkJ==w%CLZ?$=l|9kC(ry%}I6AJj*gO9q*KN&-sxhmM%;8Ze zh*_(4PR7`6!}s-T|9$z(8}D{`x4!lBHTPpbbWfI&J||~g_4`{`@9`DaGmPS%pVq!6 zw`|41uFujHi#0uz%!2RBbEPU5zUFUDy1dw;Z}E%8irZBjJ^KH5w5IM{v|>-EL5nia z;Y%8I2MT45e|C5B`dk{SapKHTmCI&7Su_|9Jp8(>7s4l(jOnsy|b_Bv1QjX<8QpDt^YZO-0-ek%zAiYj!Is0V)mMo z#|?a@y;PdNtFn^qutAPPmAB&LZz4U+o=sKd+100}1t078yqFNv#m2B<_tv>ArhH2# z>0Ho0w&H5m!EM|3E~%T&WR|z)VWEC=O%$K5yq2X=~>;`W!txPuD&&q#W4R_ zPkVf<-Gx`?VWH<{TPiP(yAz(3q;lSrT_8KQcxLwap-Yd<~o_uv(@FV`#J4^O2vx&>!&X8!SC*65F=hXSB z8eB`(eOg?f9pa^WY1WThN8hj8^R;vN5qYJxY=@hq)9ZItzW(+0tW!;0ZR%0WOQMXx#Baow7e-&GQl?^(tO1dwaV+C)VWenUl$F zyv8rL?c|IU-b%cTXYB9r^N-f|h}NJlq^tyq0@!-~i)(z2Xoj!)fGn&RRpv~%q~ zardQ14_VHNdK>L*vNm*?#ze;lKU^pKd(W(wXLpL2&}H$q#MUGJFvV>){3 z5sMN|y54!(zc#n~{;vr~U$C#AT^W>o_`TkbqmjvO+&dpXp4Da=63TR79W%SR$@^99 zop(Px{<7K6{_hcCm9ll0GdLc-m{IDoKl9c1%XJ@DYo>d>dG%Vp?oY{MJqC{8kToZd z7wT;O@HI!Fz~_(K<&{^LXy`s>viR-$g8?T3?YIvcEL|kBD_S7sQ*l;^ z*W$2nX^HihUwTYR;ZdtR`bDDIbKymWNo!g^x~*Lo!IeLCrf<~NsJFq9E3D)!*ff|# zI1HvbC0={o{WSQ=6ejUG8WVYJ%{1jomIhy zkD~ceKix!MFfKTi)v0@ZGVj)xITyG83$a_G@yS=f$*T93n2+-#F$OSe#trPNAq5e~_J2B~Vo=MNvUo_4M_>D$rGY4`2Y`HC#vu3nGi{dI#q@nwL? z+Yi6Wwr~5G_WF=&xe?Fq4}DA3dJT17?sRlt9F!H})%RGVEiq!+fkIYCk!2sgEeN=E zLqDkK`{tVoD{MKw@B4D#j^P8DUiaO>{oy4!ucXLqluY37wGF8lN)p*UcU zg7}OrR`mg^j;v)6yJ$Ysz3kRoo#V2v-mTNr_THJPzFsH4bI-(|nTTHL=+bZq#abKR?-z;0xpSYH#Hz=qx8>V!Df}&M zfAW=p)dsTzE~-afALLOwDpa#7WP*@t9_t;ySD(*UiKqnTZZ5ket8-j-+wIp{r(6%M zwP|d)`_@zQbhfc1x8ko^ee+J?{WI$F6<_u9_kBIKHk>bhZ&q%aYKOpr z&&zx(zwK=|;HiGV@4r3IHbtUf?T1aT_)i`6pEW1wVdaC#I^sU5ZVU#~#V{)x!t;3hr>6RoA47hXE4wWZFS zFV<}|Pt~30RLPOgHHV~i^RzFf8BJp0lQZnR-FtTTF*DxK3(L;izg?!m#~`92x%F4B z?cS+k-cIEy{imODR;ix+w9CC+bJd}gK5gq+73(ww)|0O!NMnpT=Wl`S;Jq&(qHzHTd%4jq2^|Z@q4?sZO%evl3vMazs-@gTrTb z;kvCst9Be+VEpn=Awxi9xZ2VBz)w%bMI@X&m!|w~7RXw$!s+fy)`wmTPi0+P5yFsQ zDitxU_ksz7hA7vHmF1CC^;oTjH~c z8>@e84BLPE<(dsMwrYjuY_HARuKr@G-sx!ZIUR~3&*$s@v|<;mY|_~myZ!US*Yjp> ze{+pJ{^$MU|GvDrKEG!AwTHszWQ)IhZ|C^-Z?^yTlSWIDQjQ;!Kezu=&Q!OZPtHwe zuht3rdA(ns;Xq%ny+`Jp#Y%aqpBO*~Pn?{+pg(zr+Ob6sEY`i;KXXms%2Phe0#uCF zEn9ghYvRW%msW0xI>wuyWOZeycJo|i9k#t;ONA!xU}dwC?aNwiI`iuL!d+RXPcPb7 z!E-uI?R56Fm)^IkSetT!Hza(u?A!mkb++IB2O=-or@g72QmSok$g}$5>gRep756Gv zCPe7v?e2MO(UvNlvuyd*h$%b0^Dex)%5!*K^iEH&YBO^uchyhLZ+71Z3OmWRcG;n% zecu*wA2&5USzG7XlbyBe+ahjloo7ir7X(%EUTbTu@(m4L)uwn#(0PjTs;j-G&$1F5 z&lScjKP))?wSGjc%;Ac8`S0IyyDG^XZ`EA2c>8|L?B` z;p=w09vqw=FKm{^5*Ziw^1I{u+wbM4^v5SDWUl{IIZu4v7sHlEcW&HYcl+m!H>#iG zc0HY!x_#H%dj$riwc1nNGB-&^wAKFT?>1Y1^WJ}#1E22{3O&|!IrYKj|CikVGj=~| z)0{rf?%Nt+^V)B3uV-(wtbQ!4P$<){`(Ki${q8>oh8ZP)g`}Dvb`&fRjnuukbL#WT zhiyLBEZ&vYYaHQQVV9Jsvwukx!aJ=%Uv3`f=eT*xV8agbHt zpfg?P6PxsgMx8UiKk+prMk;P}y_ffy`S{130umzaPb)wEvS+Th@X#yFzLd#d`kf;z zK4tCw%yO6b^8wS$1M;rDPF~*R`14zzWC73Vcul#M2|sja9SjhXQ~I%|e|ztPukY*E zUed^~`XV*?tijt=#mi$$-zD^W@bo>M_xH8->-+z$etC6eD?gqwS;*3%>X+%^O>@iG znKMOJPGw@ca_zG9mQ|}H)^qbXOFa3V$m(zUcNuG2;#X18wYHvX>wF_`ChoTVHDO|} zPQHRnU+puADf#PJPCPv=KBM5>jNNf_4j0}zyjjfi{v!LY>5HH1?*962sd>5pOM%a) zi?8R~|GttP{^#qPZoNGho|bIezWwOF)5Uw#1q_^dzg^Bh&iJ^AuQ{yxRL8@OthICF z?r+=s+othA!Q+z`pGvkJw)?I(@fc@y-(}VnYu6e_>&Vys`Dopro1?LMq8-JSoxt9rO>(pB+<$h?1lemdXmh+Mz^#s6uypYMNo zk=3`rjL|*KlTAr?!^8jothS$i{_55Jh^L?Le|XX4EnV*~@41>Si1WRCh3}HWL-QU# zD$?vP?mz$k!(#4P58iCCyZ%u})8s`)i4=oD)EB2ou2E~^cVCtL!gyfu=Km3y6V-e2 zE`PV*^XcGo1_xuGlTY}SyjUX>4ZmB&9+In@bJd+=W~o*Cb#4X|msOW0J{1)cHJiNg zwxHwE>iq^2jz5v#_?_df_2-lN_V;GJd-(tFi`fsZa?8aPx}SXIyz%IcjXLVJQ{yLH zlWBelUXP&mjk@tcm*D)zZPd@+o&y3Cfe_mgjE$Cz(UwB_#J|&`S`Qy7~;Rimy zIrX#LuKu!f{h#04vuCr%1r_cpKF-78_$Jx(u;}F26pJuUcXt1aC2tnj&zU3_9U{Nh z#qVO~m9JApz1Tg!@M}J(+^2CWU!-GFoKt~}xA`IOl?t!5PDSsoj_CXRgE?%m;xDnU zleeC8n`W-JV#AWP(|Lb}UFv?s%i?E|{N(TYKl+C*uaAz;bPJ72#t09VM<+|%h#@7@ne4cxh)br zE2F)W|9n`sF!gKx`i$P{y&7+9MOICUE1UaRt5wM-uyEs-i=lI*QYJsu&3w%(Hgoo$ zxaq$yMFu~&Go1Z==k4crLRLSR_xp72&C{>W?0x#I)q9%F-)px1XKFwGT{>SZbLQV1 zjden$nZ4UY_JuE*z_K!Q^)WME**A?-PUw0~>UpKf)52nzTItQhC25!bb=RGD3!Z;t z-OR!CKjCHfbJJ_{s!#3ETCHka&CkF!Y0ajnbGE5>Dtoue>(owE_;6eNOcA^7UOkZh zDH?%Fy4&8}`+VnA=-e`Q1Eu1=qNtKOp|v^`br@x{I7a%_4xA75}5+q5V4?$@cJ z$D50{P4K+`5jH57U%a3iRx^BGSpOt9w?#9Yf;^Oq}<#U3nNhyseT~t);`Z*Ku`fWZ0snK+_bx)3}kp;n+rU_4O%N% zz0V!~p46ShraX~DzQFmn?DY8QpO)~gFaNjtG=FKSd;HDY_cm_doBa0L`)6n8B#QE~ zI&tLf`?G0xd`#N2Y@0@hoU9)k-wNsJy`8z^Vpnxp!J01(@rxolx$RUr=A5YhYw_}7 zwXNTDbrs)7*Q}#%teDQh=OPPo$kT$b8E2!uUhIu-Q7B6cP+IQsYZ3qVo7%c*O$vuZ zuD&hUwJ_P|@`b>!rH|Y%@(8EDUo7+HRo#!PPy6o|?A`HEE;QbJS!PDHce~mG`4yKc z)+jwbHa&3l-{-a8_k2H=ILqphjzVG0&%NcRci7LomeH+kw9#csfJ)N$iu=*~6JIUi z-1v*{xM;jqZY)v;$eEPN{M)bn@SJO{OPZFEL z0~!G3FD)&%p2P5cPi)zdFhv-gNx@w*H>^ zB8eJtAB7dyMyV#NuG!*NJ*PuOwwlH1VchiBU;XX8U%sAtu1(f@ef)IIrB7S)FKu(o@@Y*$i}$|RcKf4=ZC=&pck_48+gVaeagGanvUewu3aiz=Jj&twmm*80|YGc3}0lQKCL}vD{sLq0}Elx zRaJZfw(J~FR!Fg>n;ppXI;Ny|;rinu*GbFSrks$?wBNqT;j(~KX#DI=Pk+5Vt0^60 z^3&v_+2U8(nH(D(+Lflbg{EvYp6U2}?>=|43p(0&&j+nK5V|BKEZ$q`(Z^L6mmguC z8yjE$fAJB!vsHIb>{?QMW!|>3>H4j6RxjOCGb?KE+NTE^&#l`rQN=m?g3XRcWi1P~ zAJ!|Jv-7~aZ+}z@t7AhReUq2}Q|*5GU&ic@hi9k7{`tRZjhN%3Z_k#C|5Vyrr6K+@ zY;n-hU;UygfvKB~c%*w=ni4mEFzHX85w>)Z#IdKJmx{cw&MChVI%WEzpPzhgsm*8P zVo18{bTZ@pThaUr*Dg=qB>d2YCxGWPgN*4ifz13Eo9*-UzV%o4bF46VZ(p#(U#_}r!RFu}%6XUiSMOUM zy84YAKjW#==za0qpH_Fy?a!4eyDd81{r}R)wj=%LO5d;fsdeq2>XO2Y$Flwhi}U~A zep#aFsNbWq&2i43)#nyezUbXq(sFb2Uk4SRrz;HZJA91cN!)lz)a39lXV4(0t8d+* zzk5(;ea237`(J@+y;wx(Qxk9O*P3(!>f@v|U+=TYf}$`#*#=YP|web9SD{HxmC zHNXEqKlpU}{qMh*A8Oq2LCGoO8gux3o60M~#q;cI9(c$!uf1jU{Nl`Fv6$UY`lc_v zW45EF@0)?^+B+LIo=;w=?C`+i?1p&;zmLsgo<6sD+OGeTOOGuvz4ge;O+)bLf~!`0 z?y1??K6KI4;80qcyy8~c(u`x`JYMntGhMYSGeTEQvG#M)6A zw*TYHH<|q2F3H`zkL8%@d;^`?y+_t|ob)eeQ{!|Jc;T&i`Za&+msv}m>niGJ&aRR1 z5W2EE`gZWFKbnt^cg+5y`S{opo4fC>l?h$3m~i7kBzNCarhNh4pBL`9{{G+D$Np>P zZ2xh&J#DUKc*Rrm?LPMJKN-Kd(6LQ?x6WQ$Tp!J*|Vn)6=%E2s>14&!FL<6!t>Z zyCkdh)E;IExe$ z@?6+cZT^9eUfr!K9|T-Wt>;u}MDMRXzH|AKfV=ao3J={{dtcT^Xv_VGP|MOwEmM}q z?XPW@JH;W>AFc50^8LdfW$X{MvN3$id!FsT$NKrj>_z!+Z)~Z4d_0=}?+v-@MfcA& zXWzSLk#y%m%Hh7+rnDPLU4_XJYG%vB?o5x5X=UxNJi?sxD6EvF@v(&3d*|7Xt6TqM zy!fE-zB6h4XXk2bxqWpPF9v_KIsViuMSrRO{Kr3YRPtO;oSC^gbY#Q?IctdU9uad~lpvM9f;R(BLq)udK79&EDqa?hg2(F-hUs**PCS ztUk>i_4nASQ}^yQs3q&uT4-L)5} zoNPPQ)f{_QY15vK2^@*4<#p#Kl$<}lZo^crpw2C7D`Nk=J2l0);c7xe!Q(fPm+LJT zZ3|l(utKD3V(C`UjN8H9%}2f8Gcue%{HQ#9)`GCkEl1=2E>4TMTDjk@d-Asj@iB&Z zFEw9I&B_tg{TJZzZ4=kO1dX!W3O<3gdF9dm`O*IV(f;}KZwG&3S=#NmI<$G^<#z%s zCs{ggr}REn$-AmBt$k{5w&-C4MKh&^I`0*%a{HZ)W;UJnaXWYQO4fa;MVYy)tnyg; z;!S>Tney{{p+XDm%8tu^*PVlBYL+@ZNSIX9d^9F4WR+;Ca@(26g16Vsm)rb(zVy;B z?PW&`q83k`v^a1P!^6sbr!((!|DU=&nl)p=Yo65y9fVp=zvmBJ$YA00;98%)=${!;$`$x^sAKb zj73?@k4vp&Jty@XR9QbmF4;iSM9O8-R)c#hu8QWQusgl@qkaCGln{TvLg(~-Q7b~U z84kSuqC4+*y^MC|$wOY*VG0|9_KGs7#{XNeC`6OdVR5i&Z>Goh8`q{OTYf2zs}0?G zQ{`TS(*3tLe}7A#4VuegYLK@2y})&~sylz~m28uH2?^I5|JpX*O)U|=>w7(Hiu~H#zS|GxkgDp*1X)mX2T4|0}sEh zyY*wLs9V=}8IIP+r#8A|+w+6edCml`Tjg7Ed^BxN6_ItP9=Tt5up8Wwu}6zI$u0d9=9R&dG^4TFZ5| zzC1gP@%R72sNBki)X2WakGtHJTJmQ6-@P$?ZprVZ{Hj;Bbp?ERx;SmJ*P@z^xBtTb z{n_80W?%DHsm-sT@VMqn!^+}0b8t&y|lCbK|BxzLxj*-P8YT`T`hV zxPBEC-FT2)=J?YuoIwS~?ip$i@9Hug|HyNCS@jebA+48!7Gk@(lT4+Y_6DiuY0iq< z@W|I@k@)(<%nUrItC$&^!?+o2&X-%yJy^iPpml1C@8Pdeyo?M76*ia8SH2<6*LGNH z>ZVIcf@O?*8yjZCzPF#hS?2f@P@xdxsjn#3ocOkjxBXk0UfuhBt={wYzB;v9-1g`9 zo@(J4c5f$bkB{$RxLbDAdAIpH$&B}kQ^TV5G9)66t3IuGe%(gtPjq1R=W3=UldjAz zDUbX2;omc7&#h}C`uKv{zn9)CzS^|hZqNIZ-~X2#PyHM`PtR||>I0q9Yk#Z{2K5A{ z%(0q%=YnL=w=?syHAS*;biO!DlB_{*QRJY)gym>eVYczW+_3 zUs!c&*3wP2)wl14>sO>4l|>%!EiDj4jQ8$Ne|D&OHvbClWsCMLK7RLlV*K7m9m>UT zBGu;_zP<8w^}c`atK)fnuK9cTN8hi%|F`JKj)g%|?#z$)O22QA5#K#C?R&+o>fb_g zr7L#3FAX`CcDr5URYLhAo|7fg-8{;BKkU79FQ;(QZYeLB4Ye1HelN;&UcI_v-v5-( z)4rS6+cnY_Lg~uAdZJHidyC_}jkjT`p%Cdvm`sBSD>OYEyv6uWgGB^Z57uxpl=;IB&<7M=zrD z|Cj$=K6|^G&8vgc<7eBy=2tg0bBVVs*zx(`^!Uk3H=Z!?60B4;N`AztEWdN#tM<45 zZr7XLOEY3Ta7y27-@lXThj!cgUFTkH#}jyEY5M%ie@BAvM{G6|C}>fBwr6II;`X-_ zx4-lHp?AD!d(02>g-pjUOnx>0-}l;xp34u9bRJ%Q)*}3ewG793i>KEz8qe(s%ri>n zILw?Rv^`8>WqZ-)xcm!Q5!2ol?#xsx4HOW|5R8oDIczlHsqRGcCqE5|9;=?S>D5wy zh6n4!pV@p{UdNm#b+_Q?*~{;D|LVMZ|Eus@3A<$<_nba|W1r(B4UV?NtIxO&mD(}v z*nfRb$qvU(FW~9_|NaSi}Ifs7Tw{`iGe`O@sYpCquV@Oq-9JP|i zRjD?w{M50g3#{iq*XEsHG2w>6sk6(r$eml_qoK+*Ax7o&N)fKvCnLi9-NWb0=l-%< zcXt2&TO}`VrazJ>D@uMmFIFyIBjwU-wl7nJcSTh%zaFQ&^y$C3?Rx9>hk1F=aVY(I z>yy{ipvG3^nEdh`dvy;O?d0@zN-&oED%E>=^%eJ1nH;S$^W@xF7&ul)u`Tup$e!Z0 z`l7}T0}h$>y87Lx*t!I!KJCrBwX?=f(QCoJMNU5&St9RMPuo|sqc&Z)NBsQ+-PZR{ zCvNezJO0_`IKR##!L7f__Z9?4h1oCNn;xmBzRc;P1fgIZx3~!{=Y9MImCX$pKq$=`)}=f?!minR$^$e+}>}CpZ>4?caQP(i}`uq zEJCaIx;_5#YZB|81PQg4TTBg6D`lc$pMGO!dRQ=Lxs3CSpoJG!hPci3i|Cr%;=szHVMcT8#FVKUIAr8!_z3nL>E=1QOKzz~-*gR!6#YZOu1l>ptvp>c z=kn|B>gx|bZjxzFo)Ne_^?<1Q?HQ|QDw>Cw3LN$eT4CA~cJzV7vWF2%do`uIw%7QV z%1-*FnbFp}`)Ja^LY;Hv%R(lEnrR>ZC^+jIi_W3FJ&7{{SBFkYi7AtD@>m?C>b+F> zM5|7|jLzw4LDfeBd49ZIGI`s{;{r@JA5Vf3<;I)d?;^`y+n&xVy}kG0f{3GOjNoB= zi)pj#?;6j(p5uRm?YN=L`PIz&eEUzoFa5#xPNVM2Cn=`m>GwXqe#UF>5?}N7V)?4q z+V3L%EWgpQ{OtVP>ePSxFWs6PqUE7B<;Sl6;2#bgGrwAWZn)a-w)6^5N4o>Z5_7S0 zq8zI8n1tE{S58{p&%n?(bxxV9=etLGhaW17TlOW2HQSwg72V6G*mL0RcVUNPR}V;h zndxY?e158RWzM4~$2KY_J}>)j9`7|tMU6A&kC-<{o8s0W#YH?Ks!un^>ZMdZ4vV+w zo4)7w&czCQbaqBNpEy(>_uJ-X^y;`@E;pX^Kiz0=t9?9kvfYt|He%~UZNqOJ)>wC_ zNp;baMG;;z7QM;Kf2~*_${dzvrqu8<-LLNJH|e{`a7BmBhO1BB`S1 z1l1)Tz1cfqlEB~cFBX$;d%pd7arXCxN0t9MKlhlneaW=h{!dJP3ZIiLzTRDI(N|q@ zP3fiH&)|Bqs(YKF-^W!IvpF&xH&8kx^mC1qR?#}1CHg7rZ$vGsxcTYvJk|fdRxtWi z*Pi|qIX%vz^iqrWIji8c0sHnpJRP@v_o19!Pu>_W_nX7OFhBRE6puk@g6@q~F-ig| zW`&<7da-c^3$fg`FWj^>b-sRhUG2$&MMm>1Cp{Il&*ZF}c=k!UOw;s2fddn0 zKQm>|;RV7gGp1|VFEcAL6Kh-L3q4>vnfseQu%m+w{=^S(RCdm!eFR9SW!RTg+RYskSzY z#X?Lzm6`e5uS*T~i~J6LZn!XUm8R3z?u>dTQyvzLU4_%v7@oS4f8g_<1NlaNHs+gW z@v5@To%8OT#6l}4)@Of{Z<=1#v#5WxGB7b<+GD%ho4#J{x4#+?>b8Q3p)Hj=MK~g+ z+(K;XywB}TR$JL7EmvV^u$Qi*-BN~e#Ghcpiw?pe6UYeS08Y1vnAPbKiCguGrH_?@ZHe&GpyssGpf!>qog zw*1<9i2aM&C5z38DwoCkT90rml|A{f(86C;PMLHv{?rxi!HJ*isLMgj5=~&by1s&`=&jT zXH-;;)K+WWkmi_EaO{NpwDYbKzs`z=ul@62ZcbJ7wqLX7o&L6G^QX1#aX;_d|9|%I zS?TVUs&kf2k1fhi++~u!WE*fk)WKZnOU>Vf7ZPtgZJt+Royj#f_L!urT(XPaubO-O zpZJtx8@~w|330kJD7@hJ){&I-E=jAeIclFO6SSuOI>*(j6&x%wyUQyr3LZPWSh$ia zN5k#G?6euz=52Yu_02(nRhuG>S2L*?sxmStJv?~cM|l6rs|mOA|HpB-2&7cb{x0uv z!^m%1xyGCcA3eQKct2CS|L~*V{&#}~v=s2@BvSSyg-2TLAf$CfL9j|_Eo^$ICAH&9ltAf>ie_WliS@qk4 zkH6p7)M+vp=q&fh`{cUq{U=Qu)%ONoze`=YoK~DlIy~q3^DjCQ52`f$XI!|-cl*$U zZ*6m8R#ey)&AAm2I`iPh+Pm&|Z=4JgVyW5{ly3T5s_=OxC=Yp6{Zw(D{Qe`mOx^Xj z+-ZU=|K1g!pMO1qyLao&9%si%p<&)ruQD;n>(qYyB>nu(zJzPq=lA$N*bz8=^47W% z{gr1@q$13WB%`KkJ?s`u`+VTK@S-0lyU%a%S#v68j()t2iQ2n($;~o>|6~8qeYJ^?IiksG&w#DPT+WH zD%I;Xb46j-%p+`{PJen<;v}r(lJseBqr?2;SNU%LsoNj6 zQf1FO9{+hcK8U%FO0@|r6E}GIOfzWS|7gmqJ^mNFJGAZkJtU7k=-=eRBjJ>JG%xe& zs)I&983Mus>rQn%{Ar)R{xs_b>vyg#44&HlM~XlE-FD#S^GrqtMH2&6Mh1>K8UL;w zEd1CX$?V9nRP>6-GL7Ze#k*WIINA;zW@2Sv(YTW+%$c<{DAQDG(V=gLCO1~JS51hY zR{kJer-f73+ki*(S;?Q*M&Qmltl9yo&NN!*l9Ay@j}I}BndO0K<2v>E!tL!a4{Xf>gDRFdBD^0 zl8DS~Y2h9hrJ4i0Z_8uqVo$jnwqLjYfAwkmuD(^9-sQf(ar@rJve)IG)6Q*>I`ZcW z$HBAHqDU*KPNmup{;FV%vWvuNWUVTsasRc`yEdj@O&ovxR?d|BszMO((xG!gt>D!y=+x zE=?0XS{5CZc2C|pg)3-r$f~JcQ=I}uW(!a9`S;MSdg)Og0hbwzcFFpgm-J*xS*_aV z_eWz^;-fdUQ<`J%^6%gE=cDvG@%V4OtJX_jHrcXw>0%i-nQCpGX-{38Lix8B~wPHHebzio<`F!rL8}{CP*mq4}@>ioY z1-<$Ag+Fz9+?h7BXQt-@^VBxSe99J()6c##l_z7cM^3;MaSDdQe zUEJ=vZtuVRjWWkiq0Fb#&uix7bl$0%kr;DaF8<4F)v{BdQh?E z{^UiH%dcziKBCJoWoD1lBa`!=ZT-YsPJa#9_su!HT6o=6AqD{sgX-uQ-U2CxjH|1- zHb+MMsA6uk+peCuf9ISF3=E1M)7+00&bj=0vZ_<-^U8RGC){m4QEQJb@ZVPIc(LT$ z#?Hd04=yR?-q+$b;awQ`b>-vF*YorJZYnH2DIXbby=mRIuc_?C6Su6oDD=PhrOM6S zQ$1qNq#ir!Qpj^yw0Xa=TB^j%_LBQ;)htAA`v1lgEFpc6!dsbUbL@^>-hiI6azn;A6%@k(Pj^R}XDibN6j$OTg)S zi~Bk~STaMkW}lSU-I{qJE7orRk*hUzY9#IU$n3#B_zI-&1>2%RTk0Xri`kfPZ?EU<+{>ZKBAD)lCZMe(F&~#)i^Q5dN96Ua= zl?wJ;%IduQBve~;YS?Lq=}SGXh5pkn;nZZ?x#4@@o<@gg|Mj=u>u*tdEP2m$(-U8> z_|FTOeqa04G-uV;NQL(XUaS8IxzDKi)Tw@rr@q>C^^{}V|5b%mx;9OcP<^yO!pdD} zdt{qmx7@t_nT?Ns`0ciJTHbMP^2?YxhaZ1scfM*C{m?~k`QHlH1||lXdsi-<+xk@V zl3{j`X@?MxY`I;6*-y0@C!$&HcxGv8z7$nmx~cPMlfHyk_#-ifK94(1H`dHcoiO*r z!^+tgEav6EetEKgZ@-_P{~S>$$ipDT*#Q_1`6_Dy(}fT@i5gJT9c?(z2**zDOP zbN$*~<0WUrp3iwyId9SA_6ut6j*}$wrBgO-T#s06?q<)XZ_=x^miu|l zo&Wi~>HO{6FFaM)s*o3DAn>#5^R@f`{@kgVRl{UmRR614Q8CZVaFY3zLK|mgUCzk% zz@Dn-stgR1!!qCfU_3m*Yi8#uziAU#^y=aq8LicYwnx76;eXX4w(x~tyK<`S<2wh7 zV%+ENy_MA)%e3$y2h-UnerAro#itwZuFZXP)}v{Ld9hovl5Q7t>|Z1RGWLIf#Z;1K zQ^Li}E56Qc3=M~0e`Oc`af7ALQ+00;OW4F9i+Lx69%*`<;&uZ0qk;nvx|^u_O3MDO_`$MC^Mr>=Y{XO^pySC?SRh1&Wbd)<~YHONgr{nR_= zyO#^EO}x{?PyCAuWTI5PWF~8PIPos?+wH8Oq33Z&En7yta5dXTn>9Mi=N_DOfyH@t z`S&rYTVAIFVYI=tsU8y#EnKw?^C?DCew z4h>0@^L{#=4%Aibjd^n}=V#%0ZTY&qugm)$vNo{C|NPU%?Kj&fZ_S^_Cpvbl{yT4a z-rKhuj1B#_a4c*KH0}SB>3Kq4|9PXpuhYhxneQd2h%hp=1|@Eil-vK(QZq3|=R7}8 zZU0>fb;;!oV;qu`2dm(PqtWuG1bbIsP&A&t0cuYVr&P3gTGD_0z**JFpDvPyP2| z3h!P$bJfbPGYt-3mFN0u5!@M|m~tg6q-*g)bBVUl+iT|XrME1SiCgcsv}>)e_M=ao zzc&gx?JREVv}U?2%hox)=BF!X-^u#MR?SoIzDX?cUC-BVE~42{QPj9&_1`t|es}gg ztls}TBU8L3QQc4G978Ctyzznu}zul#fC z`MWyZr%U?1cbq2HL|Nx;o#nEX=|Y+BpfBAAqZsCQPT?GfM7GC9! z6*UOrpET)o&A|nZi#vOdoQcjT4h#P9`uv{yjPnnVYQK-)@#N;}b$hBVPOd*+WO8|V z?5A(9y9F2AuKWAoxqQy4P3E0+K>ORD-lj+I^Q~0qOWYp&^Y!Lqb7X2+ z4{w-d6g~a0Bu~5buV1gUPI1bx%f-}fd^F{#^uFo;jiOZ-m2CZPHuu7Y`sWKp{rAp) zxAAwGjKIHw-+wmtue~|p!^@o&m0vGz|8DyIbc6X+N%^1G=ko6@JkGqo-spk#r^IyI zg0Gd+=NBGN{Tw}u-!-mzuUI+W_{YE<3Ee>=DJ;GYwi_&PW`SQSNVT- z{@%jZQxAu)kD7h+nJ!bwy)ByO_k9;=OWYniQN7x~p~%9=^ZSY&^EY$(t!W9I)c54U z;rg$6ziXCzE?=tTzJDp#=9dZK=I1}Jy*o)uKz#kAxRr}eD+qmIXFTxsL+(GFx2L{c zlz;cGUT1Ql$MJ}iJehZP=kM;X{IgVl{*J15Pyhe8UBs{%2(c3u0=IN$ce zbM4NptBnG0*reZD;`;vXbpLAo347l&Fv~c63fAI}-K#f^aqh2-B|KinFD>(A4}9L! zGc`!SY2)vlN2NAF{LBk)Y&x~{RW&Q?@y{pse$g;9_;BsL!{25K=X>9XKYh;mK=bvd;{B$NEA0}Scia{em@@k; zOW)&t%0k=u)_-sF*6-W5|IcL8_?&yn9(SU8+4i~}HpuB;@!a}uru(y*E>r$p=J{ZA z|82=Kn=a;UvirCli#qrBa5Sx!-FE#@h0fI27iCu2r%(T?_dejgBD_se=W(?AJolaz zSL=VRt^Qy0)cIx9--DaJH#6~HcwLgYI`m?^m3Omj{dRt#OKpZf9_t9QI&-MRTdK|N zTa@|o+{I)Wk@$HW&Jj*~Lmuw)P+KasG%Z3@!60f<*E+Xq@0+0_-3J$3&$w0P!2k4K z?WxlFUtLu5_Eu|49bjSjI#u-0KC5*HvQD4oFDdhSV^ew6u9LkTqg!1o)63it=?t+y*H%8)&l5mkNtRI(s%iYPyd+v;>s_~uX0>)apl^lYSW%R zi>bQ5tG-_MaYA3>2ALNB^n!IfZGl>k!mjXmh5po#-TTdg^~RpL=8uyFot_yjUV2F9 zQrd|Nr`+%DdJS5?vgfI5nBB%64XvPwI)B|=kGUsx>8#&8r|ijGPnQKVuY|rQwQdI>BFdj@G?1@?5iBkAyvO^P60MZi{Dq{qMNGr+GiG z{=KyQ#rb^&j~-3^u3zuRi+`!~J^pLt;yUk`3J#qIk~zdbi&@7uTW zId^q0HL#y!eYnG5LGemsgehV=w%2c0cqg<>J@B!Q1tY3bsw2l$XeK*l2aBn)S}vWt(2k zTr_h^HJcx&UYTU!0mZ_}=QrpaHMnS@-V)$fpH%5nH%+lZb@hC)pE?=Mk0n$hLsATQ zSOWz%U;TJ;gRm6CgDdlU|CJwK{Zg*_|C!~t;(nVm%rSlTL~HepKdQ1*ofMNkX>ybt z;M?r_bGPw%N!yYYp394W|F!-u|Kr1HU-sDc?1VWJF2|>C}kfvcJI)qd+&d~w4AnM?Q|Ai1&NlBsX?i# z9C}htkAAV5_&(R&64`dyn(}Ku0?p&fJWI3>Ex39mbc+96lZQ9Iht=->616R@JM*_7P3)=O zuaS!Xp)voPoD1)(1JM@c->d7=CQVs-dG7_?>pPb`Zq3tHxoXVPz;QO?s2t}LmFUU( zH>z6}-j6A~dW!$v$z`ikSMPthGv~au_Wi0~Ypeg&JpD82s=u3I`}?V0A4ODmYRtCS zlXe2Mb?#oiP|lw#y=m*Ds-9{pw=pwyE!%(Vt8@S5$i$6v3O{vnP1^JH`t(Ys)8F6U zwr!E*u4%kh<&pOFbIyB5lR3E$bm#0=*!`#FePxj4r{)Q}T>9Uz9MH`BWZUSFQO z^3;?6@2+{{TZH{>FK7|=*YrzzY;`h+ie!}U-*FVENb571_Ef^`-lF3_mtI=y5U|K$ z!p1$xQ@mC`eY5e`yV#F?p_5%dzRoN?bie)g8~%NtW-0vTWB8B04PV3V0XOT{zpGhQ zWU}PUnAzUtt*d$|+ya_Bz4LQ*`}aJ128OG>qTTkh-+yN*Nqbwn{;%aaThT@0_kJ}U ze<^IqeRz}Ss}o90$JzB>{JxX7FlxTnMgMu$)pM7$e6QAF@k`m3Jb%;kh$)6${4tX* zwFFi?a5CVCR9F1);XrpzT7k^*k2N{0jvuoQs(2>-Z}(D)m18p+2bfO@A+;SKgYTY3$DH}{cF~@IegQ^qW#Zz zrrTYO6X8{qV@texklEeYBPOuvxkbm%K$U-|BquC9`Mfc^J-2Ru{OS;)xbj!bm!u|N z_hoHv^jIRh?do9`%~dYPMOh}gtJ*4MzVT-}d?Nj5r;yR4^A{|dKb~+s^!d-a=JrST z?p8ifIRBYr;jXSt_rBd@x_K@B^LpNs_kO*4y!PV$+II(>>raH`g>V&q+jl0VD_el0 zoxx#o(6POG@Bhx5KX368olx(C3#NAaWqvA-O*i*y3og*#5|OiHmP&9I!v&ttFQ2WA zf0NPYWjfzD@644>;Unqw^PXQ($=o<`@3(1O5)*GK^oQ=4qpG~LbRAFI!Kqn#Q$1ME zdvAJV!>^$nKG9s@3k%c5&eeBv{506_WR|;ZpYGYDVLUS_{FunuCDAEPO9P(dvOC?m zSIyj*V8O&7HC5}KZsq&$f4;~#chy-)Y>7}Z`?~V8$h1kFCzmU{fF7vA`UZNS%Jqv1 zC(#a6aeNZd^5EHN{oTKhrlzg1+~#U_+4WBR)a}Ko20T`wHo2XLROXvb`EyS>+p*=s zi-o-aO_fybgAW>#)1jmH}5X3ytTkbKvy}{e(V8TdHW~P4Cl3p6rINY(IE`gUwER~`B`;>3^Lnpe=n8EYq|V5=8Dbz z_b*vq&tH4KD8@kMU88NDg-q?oHJA1F{5ZqXm402nV*UBrE9>}MPuAvLd0xiMz}m<> zq3o-mu(iv>fG?{b9baDS{^9Q<;m7Yo<~`p%cU^)7Pt#s=^{wB-nh#Eiop^l;sQKh+ zl(aoAsBY?w2R}OkR~?#I*eqUObMnXT)-yi)_ht;N#o6E9X>SR&3!21o{G;A{{r|JC7TTLRY5Y!*>3n{wNP;Eq(^GNPogKU1 zlv!+lXZ3>j$nob@%m>T=CCgj+nAaWoplEjc(e1o@U;gsnb2zZ>c>gnk1$i?5DE#TYKMKh!S?W;&=cHMqg zCVFzjoTu~G+`Rgx=e(Lj=JF+rpKMRD|G#&|-s{;{PQKZ@=X-TsRo|pfT1VOZgW3E` zU+p;fJkQJjw{}9~GDVYBcBM7{eu0+FFERP4{5s41+SPsg-Xy5RbUeM;Yn2=ApKmAp zRB?K^bJX)w2@)=Hui2(em>6TR@O!CD-QUUQ+nksdzFpTlu|D_Dk28gf^L|}b<(f3d z=-msgIg4JV-;e%U>+R0$vq_34GxAJEbgx%rqFC^DW`^7TdB;;s-)f&xd&zmyX~7($ z^wyB2x2v}XSr%-!?}EDc(i3eL?*~ssKEA4+a6D((7GFDN5r!K*$EN7suC6{Rz2)l{ z51W-y&Em^Wx^wVuylM68S5e?<70I0*llzkgiXuN)K#rO91|2KAJ{F*uWIFEGNrOdnk4)jg?D_^(sm$_n9QwGYW4hfnZn?F|RgWj1KVhMwsI&c0&NbeGlh%9VF4gZkeRboX`_f7uHh$P8 z^u=vOR*Tf!sNh7i<7eeN7ab62I~rHlyeFsQLWzab$|*+6V|LfpMZU33so#HG;j_=A zmK&=@6k8Nk9%Z^VTuC@n+*`{K&>VQDx%un=bqb*#%558Z7XL;Z&=GQdg|7bn>lYO- zEm*cE=8sKC+H{A6TYH3orw04GOgyVMm3m0#z?@{`(r+H#Wg4~g}djnT*of(vW*313Y z-+AxnnQBe7SD99`p3(cC?>;e|N4#ul-p}48`Q3i<*kRIwdv|ZmyY$3g(%$XP6MxC+ zQCijh(Z6S{pS}04=*wQC;|eV^OKwGohk$%@CGARP?Lmdpg>U!PhK8L!ursJEN!;_& zeJ{6rR~C7l=sTJapgHB!yMtPyOFF7&t8^%)n)M+z$)^~LzB0|)8dUl6rLX#&Iag-R zWzT3kS+To2@n#EaZqVBIqC#(>8Svzw&&csd#h~W zi$E2}GqWupKMbGFzvWkN=+w_?=R71=?A*O|?arqT%06rikl8^;z5@pf=RDqF;93Y8 zBR-M$Ra;lA*Xv|a%=E*a7q^^#Z~p3+X3Md8i;lkx3Y%cLH^wEbR8r;UbIYv@T{@W( zPwm(!x}^N^E)l`ANeV0sR$HS~?%8?Gzx|e%<)M1DzHQd38;8Fe@CaJy-CHOs^(phy zQPVFB4F^8ftZRiF^fARt75Si#^{T56Zg_C)=KQ>SyXvYp3(Sv?k1RZQ!!TIg*CX?N zrJUIQ-IrLldM#PIevO8PtJt)sQPou`+kc6sZ4O(@#K3es`}8TklF~w%>$kvj0NK}* z{V(3T9Uh$4?Jf4GG9f~3vw*kE`}Iqv@0lE+;`qbxbYae!zik3tvXv*Fh>QH6zxOp? z|Dvkh@29-oyKF*>LhLRPK~1HjTv{En)r_uzIT4J3jNDvF$JF;)a*L}Y9#T9+d|FtKiGuj^3Tw*!L z*}Fu7MbJs7JLn`+(#z%NwoAGEh*O*@_Of)3`pMr;m;c|Z++FeZh*G_-`u+(%N*{mx z_3R68aAdp1@MMRHPs|C&>6a#+|9pN~@o%L`IZm2#JYGCi*KWP+`1+l}RWoSkWX~px z|2>z3pWXkg-}LZb!HK-3x15(7P2RZRha3Y3Q+|9*$r8QeYwn*Y=wdAAY)kErTH~n~ zcsJo;U? zhfZzYmgMroZrv`sCBK|5yRW--vhsAyf#6TcT?=m~{xH3tv_K-k^@8rxM5)xpF_-_? zM({b!n&zn@)w)UMm*!NjjWK?!i)FZ-S8q+)8M88EnzMbc)69MMT!Whqd<<%4JZ#YS z)%l^Dp{a~&`mfU;B@F+1U%4%NvN?>USvsgvO>%0?IZKhdb@jbRXVr!FZ2Pd+Y>Q%j z!S5Qu>V1LADG`1~t*460rtY6sIibTvbGn#NfYicdK7A>1wHGRlB9{au+MfC^(9~n$ zJE*o+OtIo!qxt*#Z`(d@zf*R9OXiHj*VfjyI<6Hub|JBA(@xv!z7WN^4|l5aUo!c8 zhdDp%>8ui&@UyHdU1FA8zj|ACXVmM>I!YaG`q{sxXB1cz@^t%tJ0X-5^rU@)zQhAo z-opLex1aO39o}jdz4GFOdtCc+r`~V-uVj{Uf8$^M?)x*3X0!<~R4_C8J-3%)@$2w7 z^qT*Nv!cbr{o-i>-jnR+tu!l`yj6yKZcyg;ib?Xx4c{0GDi2P&?d`sRX|mj{fZX<5JPjMdxi@Bdc(xSy&uhzy4l-E(-Xo}AZzz8Jqk3M|!w>oGNmorY zXDyp;og{zUVB?Cw7cDVbn#Pj-QEP5)wwt`*NBOVmE3z^)OrL=g8)zaWyOF_4;_mW_R;sX+7j#YZ+`xAwp+e3``07?XEt@sX`lc9 zRa-Fk;Nsu5KM(%3=sUYR_hh{NKiTqWT1qDm@$47vb`f=bw(3`#PNaS3d;7oMGMjHH zP5duoz_W<|oQT_6HyxqKIevN?ZO4DjInsXm`DfPV<7>7FH7ov#eR4N&VQb>Q;}g$D zUla=D_*8SWs`ktFnRYuA16PMkndvJz*F(s~j;rwL%9}A;b*6iT7FC|Iu#@R9dJ)Y3 z-%4?2R?M#pjx!~9Ejj#MYiG~<_M-~Vlg?~Ban}69asS=(c4Z27Ul4wOPQp5IMU>+C z7yCEs%g8+Z9e@4b)X93Lh8|5C*IrL<;&S6g;XFMg79t9s7YNR!W7t=Z-mNBvUg zleqc&;nMQ08T+0qO!rcn5|h38V^-cImB7Fhzm4ZSQZIJybMd-%KKG{HqSA^3HC%HN8@yzU#6?*TF-%>4 zKtOa!w5gl!bnef~Q~G1}HP!#wlKn5&TQ08Zy0Z8CP1mhg7G%};c=){P-okU(uJ-ez z-23_G6Vqq0%BWty`F2j@-YXd$=i(0-_$&{(b?2SS@?f61MnCk5I!ko^h`K(DIlI7+ zN89klPN}&kb^jbJxbdoJ=A+E2?XB-kmF+5Dul9@8+W-5-au@b5Qg=e*mqh=6`RqpQ z)VrtMV{Cpjr`z}ENEY2|ILYtx=j(3!?{6)RRG_>VN2II7!jDR*4Uo#i}1>6tvkk_AD|oorqlCl0u~3AJqeX>`$OSxt+; z-H5o}%cmawyYubuxAJ*0g?|rEUwU7`*YLgFUr&?!$}JMpas{=Wcnq2p7BTZb3G)1{ zR23H(+uu=y1^#Q4Ugg$-N~`KmEb9RHvGQ8@?U&Rvr;cr?on}cix)q< zA!u>q<#&GPe&x;YU-t6R46nHNt<+l7dz54xJgWrFvr`!BEcS}_IbE))9hT|JvYz=8y zX#W1r*2?GWbfo9+%kca%pFghl=mWXsZvSe2^ez=kUmQ@NyXCQGlw!-J_yeJ5`OS)-^X)n5SW?zDV1m9$qg`He0{cisJvvrQlo(4sh z2cN1~GZt=gXg}!h+`-tz%ErjeAo0LLfThD@LWg4?_X_X!$5Kltxiil!rcNH#d=NL^|fN&bJ)=4-F0697MI!|bE``$zCKLNo}T|e_Rq;hSO2zs+wtRBaowMq>~+8A zF+Z?aH^K94qn_G}DKB@rTzR0!R+%nw(E7pm_cLql<$L~Qe&V~}w77rn5zja!?Y2ah zTQ^HsJQ)tWO#U_3ZdtsWZN9VgqQDpXmWpw$`x9;;^GwxI)&IZ=jYSbIlQN@zyq4`# zy71H>Z-vKt@5_hcvo}wd@(=si)go@Q_03@?j`{!k6*j$5E;f1kE92oQm)+mqTBPWC zZ_kUqyf|Y0^r|B-*LMjqbeldg5)tE?`{zcXi%5iDKLA%ojMb+j7bC*P8g`jniiP?p(EGlHKd-KmT65iC{XSx!QA^j)28E z&z+{b{X&EuNGuE0`n+q}q!UN__ZRc~UMyZ0J!AjsCoEb!_hf3sU)>^Ae^dG7D&^A; zR{hyJM{U#k96bq(zUflDzH64w=g6HBA0S|)bb9F|lhCSF(mFN!>&$AOF8UdxH{IOT zB;HRie8z+h*VJWamIOwrTI@3yc`Y~3-2BB`F69qmlmA3wYGL|<$#FOz~;=PhyZ z>$h?m16G{W)0*tz)iTZI1pBQ&D}OdI9Il&GvG<7r=b|$yJ!h}~Px$SJ|m`yeF^EJ!x^)^4kPI*h4N>xhz{Iyo}8I#`cD=8Kyzfa%Fu+N<%DgKJi!mtyS z**k>yU2T$ldD(eVp!bGD+54i;aY(Q&b!+xqoynvcz;xU<%6H|)h97db!hZf_o>%D< zW%l&RQKi5&t?}6*+95?9;%Ap%(+u6!A}XuqWBGp1$@I&a8rlpFg;ip82e*fv$l!K5 zGwFS#*v^`L4jMD+IMWUuDCjv*SZ^>T+Pmn^sV^~Vo0k}f9uihQxk5F;A$!&|R)@6# z8mUIRk3atQ^Yg>70|q{8C%g__#Uvvibwm1QlfnWUk;9vAE;)bn*Vo10KSkJ|?5;bR z``owg!6nh|eS2O^E55ul?^j)|VtMF|f(o0~nERIZPfU6**=8FQe_u(&LP$~X{_a}4 zb4%{WaAh}Lw9szEgOktFP=#4nbW|yevSO`*D|j^_w}d!HE=!3CZWV4e%I>Ttl#Q3WoL^e z*u?J^`6($fHXT@;KP|cTT=s;HuSp9PE=&WjeDB<_$VMS80&gn-M$8M`m^pvZu-nGx8`hLsKZ@*G%VmPhT_r8$l z^2!j4zSf|dvc5F~~B#cXWf!m$uX{k1$M-hz z|Mzz7zTYvAA>vo<0fRLW>&vV5m~FrP_U ztJmM1{&I!@PkVo4E{EbI1+A_#H+O8|;)=N@$*@AS>&7O%L;GGFVrhI_S=9b~+f%va z<+2v5_!%^=d@5Tm^8R)qhoVdS%d7e8i*MUb)XtjfwKhnSr~U8200j}Qw!^Z!!)?Ai zdfR{JM@((6sps#YjS*@SPb?LRJNYRhK_ZO9RczLN_O+r+_in}9Y~pBoP$A2pqZh8> zbM)AU&UimJm9e!u^N^+PeD`*d@EMCgAKJX-`S0e1 zR=Z^tT^>|eFW&g|<6a*n!^}rlW@yx?NN(M<D=EZ*?$ zxc(2Ri9s79w8WTKn7Cc_&Ypi|_Ez)zy&!FM>Y@UZpf<&9Zs_oWYUw>K8n_=_rm|^$(`rYq5oC{ky z8NQ_H_9Y(`RhyNxX6v_>aIc>KOs|W}#S?4i9Vj@>ysc(1{b666>IvFcZ97} zD43HNS)Bg)$ZdUwhTn0s4rQmjy!Kqc$((QB^`OK3JRRKg&a~csKE1=`RoL9+;%9$} zwO?LyeW}gT1jpbnb6&?=)PFkBw)l8`-rB&w`|tnjeOAp-@qDFd)MT{>z4BkS)IVR? z^48dA?OT=m+oi-8-hTf0N1W#LnOkp(*}TmzeORqGyWKdNPwFy1!?(8wT)FEjm1vPBX;H z#j_oL=+m9l>8f|CD05hI*1FzK$t@PK`y2u^rw5uG7ODAop+rD>OX{U8!visP^VJ0$zCAu~ z^NV3t;*MP%zPE!FIa-|L^`fT!nbG@yyY5d$i?(jpKOBn%T(3r~>HIM-O=9}>>HHJt z{86-;Ak5$swbsfl@BI<~_yqzsSr>UG+w?`dOgbcHpcyU3mX{>R)n4g%#GGRw|Ey3SP|F`>FY`m;S=5Wd+ zkwUIq0k(Pm+Nm}kRsw=4R<~;SX5UWCR&iXl-o!v>_wW0MZ+<^0&-F9fb&VbS_Ve-_ zt-`8GRm_aD5-aLzCn-dg6rOnVke}`Kn?9GC`+I&pw`_D<*zvSFW3PSfvhP#(JyrJi z@5v5U68qfUIltlBioOqjAF}eoQ+cFTf4OoiXQ^9r(CUEs0r!QwUEX$gODwyXop`Pa0yers=S`E~uy*I)KsDvQIW9ZhF`*z#4Bd*Pb5d%N>jzqs^n z_fzR^_dy#yZyDc1?U%*5=V6 zR*+19v{O)aIOXV$;)@#Lw6Fzx`Kx z|C9LsoVzvrhpv2|-WNw)+v#v2Xpt#ve^lZ9hc~VXIF**MFV9#VcA~OyePMj;G}oUU zpP#CUbtWCdl_j21Q6zrM0ch1^ZX2n>i@@{Og9u~FEfZEL_=S-D9)QHyxO6*NRat+RRq76z@#*B2k^)rg!r ze(jgSk-v?zR_xo>p>q1{vR7=}u9riN9JFEMv!2`vV3&&+VTrO)b_;)N$hFV?XY2@kKz8%|?Vjtm(|`_d(zIh@^i<89K!6?by1DkV;J6FXyo|Um({sKzfCJQ3xteaf3-uuLNsn$a`oE}9-^WM_f-|*l=MZ~mF z?I$`;ovW_7H9Vf-q~)8ZEoYf{V!_2){(tMWJSDW47D(=Lec|QSkXUhi-rM@P-^X|P zo6Wt$A>k>&(im(Kn_kYr%`DdKk~VkRfx=m78Pg6jD0?;?_$c6d^|ox}rhT`c^9PsM zefsJwQhK52Mzc=gH`bu}dQ6(G^5>78TXo=LXL0bS+SZ$M9zPN3Kh9e!@*!2}Yf$L@ zf3ZsSY)%jDv+6r-V>#V~RQy&*-r6m`Jml=dEAygygHBrCczTrm>QtA1U)Y^zm%lS| zOmDw_`;w-8waKUZ>QAfJ21!QeY~cOrCjIm|w}f6wMETE}ulshHB-e&2X_|M7G9{^NP-osTO^bPN(dEWIwF#wyyDn7Zt7>)nctlT{q2 z%szXSSJQ>(@|V}o=X`B`SirE;=FzHmZ?%)Yd$}y?dbG%eF;#E<`D+f|E_1$0pWb)C zurJwaYS(v$#Xt9*NjXz_qsvK6+HT9j}z@*%l4hME@x!O3d}lKI5FjlSGt4u{P(Fsp3?Wt zxo>IM$3F=2V|`$d<30J)?O^7NV>6BjAKMtNA+RheJd$N%gv!Lu$!AJ;qzf^f7wj-r z?_gge-80Es#q+jG*Oy&yuK)Vk@$B)U?(Q$Uj_2ZvWzNzeF z|IRlb)f?ElmIbrz-(&gvaK8N?&w_L=f#-3x*S4^lFDYKqp<-Y8=;M>)Z|tLr|7+(v zNNFW-tuzT=6Q5r$@;vW~_LD=pHv9bVf9Vwv?{jBt=uqLdKhb^C@8foX3BEt#_8y*S zcmKI^wQKsdJBI(O)?fa9LX?~DU$E%j)oYSZ&V0_#z_4_gY4}$k_S_&FOXm2tMV@;e z@44TUHX~wvO^hig&tVRk|L>RdE^RJ3wL^2srJ&}<#~X4Y?u+w8fyO9K|7N`u^75eJ z90k99Ijqr(CM8 z-6GZc=$^LT@7L@Oz4a|No~NFON%lmYRQi43RZ(H$?2|v^^rnivF0Bk&wrc&xegA&2 zZ?`QxJ6Yb|qWIEf_J4MVa`j(Fe7e%bzLe|btkl=rYd%NMTD#Trqm27((EVKB4<8SG zpIMtFbe4Oi%bk5EYE(iC4_&!fQ&&IZnfqtX;Fp?b))Y*0H5JpI?P4$A9I@{^yK|{o zG{YS;i$~1b+&l~q95g0ge7|OjWoT+zvE$VZ6T6N&SAVzJ@ixHXO2>oGDw@F=9{20l zhiN=|<^Mcj=BwA``;Hg>nRYYW_V>}n?`^g&T6Zc*=VJW-52;a$e;s}vu2-KJx@h8s zh*kQpBZT%YT~ut%V6im%=Yff}i?++(E54Fh_;ktkvrX6jyP1hk3h6tgcqC0C;bM5dW)7(TSx@w6w3X4tOy=tA=w?*vzSFg!WV43^q`~K+i zlOGn|WH;CrqwM7uBRc-~>TSR;|3G$Fa}?6I}&!ZM%yCtX%mkT;oedcCt> ze|UlUqY|FOUSFy-&(E9Bz`=O@yJF?v$=B~(*!w9ZW3S`dcei(5p3(SMyynNoqx>g? za#P$G9(?*~7q!=vr7rRB6(?&>jcs{1Ov)ZK%n8^RqR9K}hh+0nQFT$K0;clYd*i}q zNvis`sOTr!{P$+7iO(@GxtXx_*V?U7i*Lo`ZIRpjx_e99a(&DD%m=DJ+uOcf6W9C1 zRCQ68-dn!+mR{~py_Lms|Eitsc);WeDwchPKRR68vSh7^pN+(oSBsKf?l4S!DPvjr z=Ee4J@6Ue`x~ST@Ipr@~yYcLRp9a1g9hT3Xc!HfzUA!P^qK5j(G>HVGPM7szOY=8> z{ZY&K;l{^R>g#vTd;GikcviWb1p~ug>oS|ATb8)DpJHFX@6pDk?=>a{a{Up}=W1%2 z&%kZ@?RwpZ=ZmWK<^=D3zr^Z-W%%6E=f=HBezkf3uT12>`Fifoy(MNRG-}o#eCRX( zeepWii880fYNlQMxV!G&=GV_{D_{9IDkh&wj}%!J9eON$or2Pd7agmXG5Qy%`2=oE zd@gdBMOb`wUgrY89=nU*RYg0CclS7Ow61VlZ`GEVG^r%`JYWopXLH=b+zy0?+x z#=$k0KTV6|IUMlOEitZ!ty_ROai>&l-M14y`NhZoG2i}gchE;dY;EZDVuhANUkdN4 z^Bi83zM7-)?9*)r9}3o171r#3b9?J*v)oRZnv)+EPChSrd9m};KbqVB>^{D;-u;Q~ zaRvw7>G6f{E}ZfzU9_fZR^qF-W!W~3heYlFoY+zPr_n<+sMANL(%wDJDCO1U$>QfK zk}qGsy+e0N$Da2`Z$GR3bz$%HGh46SDz5(eMNzPGQT$Go)qfl`j%>&|vM0ZE=blD} zC6B6?`b_&5eYed-QO$M7g`C4Zn)1hg&bpeL;r3x#K%wzGSC)&X>Na___V2kDzQ(3H z#=~V%mr`-)wTm_P92(Lj=Ecuf=!j^}(%BIlQuOnNBlD$w`yX=zJ)Asce)@+DJ1L&i z8#=x=mR8&^W=J?can)35bN6pbE&Fb4c=;uGcd4fS`=GdM3wLa(yMOTUkD{`vp=>Ggtbj68)62S0vK|I?eCH?Q>Sq22d?WIjDVaj!@K_p&`U&zpbW zyZPzQlDzFt|9xtjU^C~bN9^9f#cBnIUVdG+d0+U+r_W~Wo$xLCZd=WQquK5vIp5Xod>Tx{%&sZqb+7}*y2D9hKA3tmrr5uaQzlI=d8YR za|2r!>#{{FI2g+0EF`K=^!+_<-sQ5x4qMZJ#Z@mZiD-*=f$# z(Q{_DmMqmd6!PN$gR)}_b71U!P@bDBRPB?JY;lIIx%ClGTEw<{?>K@>7WH3z{AJeZ zUaMe7{mQj|({I0LXV~hrZqn(+g7i^n{#Wgy$$b`oVv%f{r2Xf!^`pvyp+TWmz-8y zsv*H9;V5wN{hAmpP4n4(W)Yj#?{qijF>ma!Q@Er$@0Z+mBfG4P_clHF`NUkh+d+fn zfWLP((?s8OUWrfqC#e+hgeyF5du#ox?A?{Mi;@m?Bx;-I^|ieBl`&l7U1`a%XYaGw zbFHPXGzv#v;b3gI`?jw1X1kKB$0UV6OdHpnecQSF^uw>S4hocqn*j4dEaJ4{+`A9#%?t~|j;zdm&uzBq*bJ|H_q;0{SEl5Y z6_~Iva4x&Mvf5jCgNF+2kUiP<~{iJIn>;0tu%-UDg6BQQU zxhMYqw3r%~n$pQlF<0(oIxKYGp)csI+|s@m$$GmA zbxv@eZ$l`k&$**U2sGP?;66)ZImhvEbUl zyhPb)&Fcj08 zX4%)<@%6ty{oX&zx{9BH;qZbZ3)rP2{(QJ`sl5H`%gV6(cA`gJ848xHt2-QTZT9xh z?FKF18=Ac$zZa)zhxgh2zH^y9t?I7(y_(sX3`{42AMhNUtKM*7rJom*Ld(3Uj|pEq zTqhk_*}O}qK5^>tm&^@@;XL;5XHD#n+m~?voO6@@EY+;bmybQaAh!OxRY1WM`9&JD zPm6M-uIUk6v_inO@V&gJfXrX*r<;~t+||#T)Y`x3`~FW=v)ngD#w;ymK3eIeJ{^D@YBfs`m zl~rY*E}p;l>)SoM;~S5xk>_aD^$Y)0qn@|P>A{YuiG{frOs*EpW;?FE^0q^#&+YB< z_xAi%3xIiR$y3}KhZ^bFfQ#)8~7@3YsGBEh?9MWDrYs;+{F`r$(?-l*j zUZEGeHSXj`TZTWM?#{Q~{%+m+O&t4@rfsl@-TCx)nB@B7n{>{85T7&g|6>cc2Q48w zL8nr5j}`}NOp#xvvHkpePL@aO9vHKpHMr++K$;^WR!`=zO47ytn&1m)$@Kl*cW+SPo(?As|qdKwxqk4=buT*+_vu)6T`|yKWjvM)mIwn z<+*N@GU|LXWs*>Pxa#+;h-pg|c^FhW3T3WqO|@ET)VO`i%%5(m`65g||91JF?Eh}D zN6uaEwB!>0eYW=2`>tz<9J@BD{``g<1&L3r&5B)KDSmye$N9ycdoFtTPk2q=^n8=g z9tSs_kmlI&_g}z0k;KRrriB3tB1IK8DvmF%X5BkJQ=MaTVWvn|QER8GM(QomzU2Q; zC&gag^zc0?i#kZ|r zfcN`yi$@t^-L9M=lCxOPy8S#@aO3gkYGy{psN^O`W1r^34?q6yl`4(Ny(Q!1VAJTg z^vde~$pPAvPvnYeEV=aJfxcXU%qOHtxCmma!pVhE>4ijV0^OzHCd2S3b@>-E=~l ziS_mR*_U-6aJC#0VPj}G zeXajGZSCsqIidwsoKp-ONe;VugNR#eOFqt0pFd+;#Z&hG?hPF5 zPD*00L$!8>FfllvlP@@|Jl($PsWE$*tXR!OpTPX`EkEBgG6?)|a@>CY{7S(m(maQ+ z+?JJSTPa%99Cdlmc^&;A8;JxKLHF?X)SJm>)ox}r&J*+A97$Aty6oLwtF5bbm>MP( zZNB~Ts-&sk?C7O|SHjF09L_%cb+`WQ`nB8E{H>Y1)~<9B-y^P>EX}G_wIucRN3X2rwAVJ4prxbNgFB0z3zIcG)@!uImE0_4s*Wk9%nyC0@UPFtP8#vm}&QIEM)u*CDXm~*t9Fg_kWdgOHAB+dkL*;uZ3N?K0?bzJ#*jLrjglKdMxS%BtK_Fh-rox$sB*;wK78M-G!|(3|1w&@>S;; z7%Kiewa)Ci_o4pwoUrSYEZ<)bRp;(Vm3X$|sFIpzv)f_cy_FeBojh%c#{H7)9$y!4 z@%)(5^<}EF#mN&t?jDdjX*ji1XXfvVe@)q6i=C-B8?okaLCpHAU8+h`{UT!$i=ys6 zXrHo1e`<&FIVZUzQ32r_Hmm;?4tm}4&mhUNc z*y_bz)oXS68s9aU!FtNuB;-~Qg$$L8J3{4Z-w z^;=(ly|Fny_vguD55bH19{lT1hlivwHT+sEw$$z8^=tJRT|b}q*RR}?tr}nw zd-sBZV0Vv{@0#yohd0!u&oDn4e)ekoBe#tz24b)E_rGm={chfZD;hieXDyuRT)n#d z|JMH(?k&DucPnx2=Ib)+_*tbTIaPuRcb`&9-dJ}bvev3Z_w~K?!LG+I1&Z@BHgKBH zdtLhTUiHUr(e>*$UQ=D;A-n8l)NEhHsZu7dWcZ4iHZgNK`YqtKWNb@ZtS`MRVEz@Y z`Y&%^E-PaTwmv-TZoa$x&5hwtr+$yw^X_qP_q*!u?bnVQJP6zoq~eXiv0+ON~rYG3;^>)>8dgLCplzkV3Er&L|L+a1q${plKhla^Hv{F@Yf z7~iv|%lJPC(S9Q8`fOt}+nzs1r$=x5A1EpJiv(pr_bc~ z|2q2KSBZ&}L4YgRRBUySp7DySzBX^3&;69ywsP}LXHQcd_de;GzdhdUbFa4l{(Rxy zEBoz#Hvjtj{{M|F-Ipain*t1K3jDtww7q(}?$*IvMUFlHH^eMP zZ@1jMp7%TR_-=0d-yc`U3vGSO&GvWUgt)brw5E3Uo#b%h(bv7Ke~nGffM<8=xvRD9 zUn?>$?KyF5_c1%QiJdzQ)dje&TFY=OTzdc9{cYdYm!39ft2tiVb#cx6Z$BA-teL;w z&itV1r_Mt!>t)}(yt@(l4s%aTQl@s){~4@#5^J7bo^DmS}r> zXIr?6S~lO+!YM8S6}$P4hRk?pyF%M(MeXxVjEAck5A2-WrreUXT58|F7wzxE^KO2< zeNQF)%P;1C4gsr!vZkI=>wa@u|LJ9(;w=X!9XVM1u{1fq?!%|PyV?v254hJ={C%C; z9d<3uG^IGOEphwbEzPqTr-aN{Kez7W)9tYqFV@&KpLUY=_Sa3`SofOaezw>Nl}Q_$*>-$eA<+C# zXxF0Rr=g3_vo)-`wd;3$jb@Nh;m_}{)9)6#5kgze|}Keo4JPG}C+kzZdOuvQJ(OGu7Gg{cHOB z`p1V>pPOg+|5@K%?Pq(d|8KplKePDvBia2tlk_^WeT>?q6f0F$|Mj=HMMR88cb z_o7wPs&k*d>*Y?F1G*v;3wG}K?)spGL3S@k)5C&aJ9mCPp7ZtUwDtF*kN>@yUvWNB zoafiW?zQ*pw`o>2^@GMmyZ+Ta4f3>}EXd%@p&I_A^!Fd3i5?9rV$2dE&32})yQwJH z$#tZ7&9u|Y<810~UUGgYaC!IqybBW^ANw=i?w7?bm!jswJHM9^Qh0n_C@L_AavW<=N-CzcZg7Hn(}bW#{90e#Sn%SF^5Un0Wn5_q*t$ z^WNi#(!t{OJ??HYhf`LnDeE|iwSP{DDNH^ga_Q!JKY9B~6NW3-Bj)dV{j@Yb=iC-) z$;Q-+ulTR6|CjK02B))pWR3gxy191$DnGvZzJI=LY2c9sQoQj75!stRA31l)Ur>za z;G>2l!I@8%i%d+J)FiJfI8k0n{`=I4N=`TAx5;f@A7A)~HEw^>=Y9M6V*h_g-Cy(D z{nS2B7o|=Q7KtTS9&U#(nV6iB_xx7z8;6SDE8l8Y+@5MQ({Je{Z&knb>8H=#WvH2a zd;eAUR&xfCUTF5(JMX-KjILC({%wo%pFW!k=I7$D{kBJ8t z|LRm#YD)~?yZzhg)Yo-C6RX#)i!0ty_pJ0h!+{5zf5(-)ol$tbN6s?uL))zW`pEy+ zd$i|$s(iG6QP}j;Z@+IhHoL?kJkcf3*}C|AqKNPHn{PWWy*n>adn-HMUUOOp)4m7Z zo9|UW|9QUXUZYCH_oL5B<8$^syyyLXPVwCzCl{aJn{#9exBTCqzwMLzpX^zC)M{_S zaZyi!nd>Is;`zOnAztq0|95Ts=kz^d zHKNeR6g&2 zPQ}Zox9e^xPV1OfXa0Zc)#Ar&DZiKwvMo0*tDYsGa3>u>kxJ*ho>PWH#CSL$wk(tqCZpFg|f(aIYxcK!F)Pw*5CQe2unX?0LS;I-xx z`!m}tL!#YEku3V5{5XS4ihn;SO$@}sW1`(B-W zFVLi&9`omSzxCuf?>6j^3ELi{rD^ygJC`&2-Bj_Je-9>nDqrNiah3D>;7J@jyZ`)K zwQJW6o2B)9a{sE!kDWWsDS4 z{k8n`wbgF(*9L0jS=8s0I@ccVe7O5Y!j75`3rg4Ptt`Ire9zuBw)f_L>2{fry!u|f zWgNd^$(1Be73;FAvX9gC=4c5`w%-1BX8rl>`rNZgl_EvWz36^``@VIx+S(zxU0)Ykk7b&nPh`Z#)~^ES2&lnFuGpem~3^{fK{$* zs;1IMor~XF&BOW^X8cMx{E*G#@`c`wrM0)Gi@5U_c*;q!Nr)@{s6SojQF3Ow_x{H{ ze>^{Y(bX^fKfzN4ysL+8T55LgwxGp|Q37oT3a7@*ThROX#SK5xJ@K3N)G)lL^=jX7 zJ6UsnYGC8^SAv3to0eA33DQ*1|KD!^kE^=nyNUqU+PmMX(=ECgglax~U*E3#?Y#Wn zceBde9(!M2{`b%M|F3esB{l!+kz3y7y5x9X^}oB{rTHq3B&^rb>@(YZiD&Y@s@OLf z&7dWUMN8K&4?EE-rQ82bvTdnwJEys-l6(RS$HK#A2;N@x9Z+ZHD|+;+gtN*KRO?F&+wtrMh}xk`SVY# zGjQGe=jinRZ|tKun|-Ww&##)|YZ8<9_dC~0le{<$#|JEd0+B*C8#oG8S0$HAc7Kh3 zSL2+2X@~5+-D>B4emy?t=nGCZr;Kk?T<@>BvEj$($n?Iq|C7Id>aMykm7QExVI$F? zH|y(0nJFjF^(M|=l<97>wmGlXdf(5pmxE@ed@kRAzv|xMvliREni3RDG9Sq1*L?nR zp_pyY&$E}e&-q>ubM5?=2whJB&opzM!xI7vXIyNIVlXIs(BPN)cGC9$Kihl{Y~%c< z%JMy>KxTi9SU+h+(5&1`?<V?J`gZg@1USYFF#-}456T~F_{Pt%J? z)VZdAf7gi+q2)>`&4*_OaT!Q?3O!|fFyrc}*^`&auMq8>qb<2bilf5l?7uFz{?p(! zSF_)I&waT*@ZpzuEwR%Dsq7Lwe4p9l^JneLI9ckiJ7ZtQ$@XlsWWQo|i&*um(#Wlcf4%9^v!j??%!vJg7dXB_C0@4`di=T>$3CH>Vj|W zdvVxTe@bbGa7S|K&PTJ(vnsQ%u32v{!13{Siq5t5w?49M-&bGv?9!X{msl$5o?XhT zwdS);Kd?$R|43AnfYVhm@6Izo{E}bxa@ob4tU`|T zIGYKH5{$v?s&>alFd8x)|EeysE%Jz!O3pP)jFPd{@(xF^UzBL)1y_FGt&av$y}9_cD@~Z@Hm(<eyg z<9U%88kc%y%zv!jKRwR$%e%YvZ=cH+pUGNnF#DuT>hpB(p9c$e*e&A|?@Q*kuXD-2 z^ylyI{oCh#FPJtx!|P7fy~Fc!qAwLYOmCI9FZz4)`^Re$JclFZoQqjGUybYhyxPO1 z4NLcDXwG@+yHN4He_QIsg};(Z*EG0%c>E!9SJFzI+3N9Nx|q>CDQHTx z(b=`O@rwf_qC@`KwzIVxo4MQ%SQ5Rd$n5y{?fvy@BCVzg=E?uRp}qQfpNx6M$x}C{ z&#hBm|IgZK#j1r1Hx(9aOh|G4$+0lQ^(4o%HC0IuI_~ZMf6Kn|M^Bphv^18M3r`*z z+ui!~=z!qf>1(Q#zLggK{u8xSOV)BpNl$WN&8pRG(ZpRI|M>v0cla!zV+pF*r0}No!gC zd!L9RW6muX{8}b&Jj^8iW=_Awg_z&(Rdpx6x2>yRb8K~l(yv$V%}d?RKF_cH{Nilu z?tRZ6e*4&OyR+ojk=f^dzj|+eUTgOx@x%QBR%sij&Gfw)uc3Wt!_K=Kjn^2v%{P10 zbUCwYU-hLsPTlAI*$+Crc;{Js{Y_o=5!U7N4S#Kk$hGUgKmSOLl;f<%(!$A`F7cld zUUTvGE3l6a^`vCR8JCqT6ZF?{+8$f-aQW%16$N=N34Sjx6`ttmUdkC#BBzs?*EJU{P^6olrz2T>;6x6>yt3vP`~W?xyowEY*v|$q>lA{lZ06Mwi`>f&edkH z?7yyUc%(B;-yRbFb?(n9KO72FjU$(BFf21(yRqJLh_5XIkA+i=_$6Yta{olVl z?)R^g2irJpWb3A1UmdwoSK?vrO;Uop2tq?N#8Y|8fEw_EzTs-HrM1spL}0U#j_j#!tWZ| zg)Ke)?&B1%O}tiuem{?|*>2=;!3e=C?uI2Oak|$It!u zU@P~c@{Jspd*bGLN#1M{xWME4prT|^Zc%@m-_l3Vctw1}%_A(X=^M{9>b>|tQ2MOF z#_OpOW)qb{xm{CMO4Y_ow7EvRw}|Mc&2-5;ZgThs6XUE@MhBls7Ja*G>*_BpnxiYl zp~%R;LDNylrBPsN)WQs_eeMZ`JByZXSDx-=vGMtfy*j74xZTgnTWs9)LboyD#LK7d zxnFD_Uzy3hJSg$kInH7(13P=!io5@;)z3u!y1Qp4_ws-5&;Pw$|1bW_JqHaDj@Hd< z_Nq+y^!H$bh1={k_b13bR`2Kg(PY^_fSR80G7QQqR~Z|$pA ze7kUOv3A_=toP@fclJu}sQr^H-M?1CzVgfQ^|fb%(@QFBvRZ9Ei6up(%}bu7ptO!r z&@)U-Tz1{+^oVW8ves%CrC;&9_gw0_vcrQ4?c$&A^J*sj7COLQSjz}rB=~#%Rl5UH z-jdrCIcFKgyqs}%+Ul=+qZW2V>$B(YDbaKYFbPh7-X4=6VfOm!OC`gdf3B|Qa?E!( zsQX*^d%5@iokg#9M6UOne<7di{o75u<~)6N#-fS6F}^hB?*HS{e3%&4r9Pj@P) z)bKy|pHb78u=nu6+ER6?oG+|G5?VnoSv)2g>SUMhIwa!ybj6}xbAc_p?pQ4~y2vQv zYq@vdjjg+l=XHc}w_bj1dn@7Omo+Y__Lp03Kfk;>#8<(4`t6!M(?aF-rFi+=*R1(* zrZsriSIgAv`PI+weGIbG>v|lqecxQ3v|P_tNrtS|QaQZmY;S*m?rfR-PFDZxi~Bpj zFUT_%_nTRMe)YxOheY1;vrXRlA;^&<@dA(V?<2?KjaOCg_xoykZTtM+AqDx141cck z&Z~Z+)%^2GwD;vN_x4tozq=C|9-h86%2#dj&760am-}B|7wb7m#Wkh>-(33}J1*oE z?)~r?f()J+}xQ>JtseVP_r z+T7~;;_v%w-``bu&6;w5)1-{qLQL~`-uF0YocU<$DbU&V&O_zLWb@?$UwXM$pEiBE zQ@oFR^K+)%ulo1y{93=Vznk6iMbxkCBVX&E9y_aTo+nmN#kpklc0uv>*RQsCsrEhI zxb6HKM*)jY;du@X**4+-e$V;7IkQ2aYwEJV6;FioY{VJn&HLxY*Q>XrL#FQD0qOU% zudH-m8nwK~R7R=g4&VEK^?dvP-dQfa|7Y*Hymu0J-|X2PAG@#gVvF?o*grq2?fe(3 zZn^wAJL^>c*=~l0X!%`24D)uqPCXdgxxoGZIsID0*|U8Z8;&ML?kISeKEJl?!GXpd z_UdhkvespDOfoO^NE-LJExxy;vf|=f^E=fq=L)C&|J**|)5D81taDFJn!0(pO_gc? zr^ptjgA;TLv%-YJHGGfXR8=||w0PmMNs+3@4Sct^zCYT^pgAwYUeamBwKQiAL5sLF zp`euYor=u9h9$yfdW?_41oka&=9(JttnbNFZnrhrmhwOHU%hovUKg14@OZz*)laGV zbq9;!*9F zFmxma{@VCiqV1tXAH&VNa@)^~GfeNj6F;x=*}BuOi+8tjRBzOgK6P=E8-t3{By;{^ zhp9eikBF*-pGtMLvYn`K;@qQ>jbcnSJ4KG3W`7dYX?Cn|vfzE~RHMy)r=>S#v@Lw3 z>%_%kwDCtul?c=F{_}QG%~c;()bSkNXZZi|8-4Yu-t&HcSUB-!ZGC;DQ}}-U|Js>8Wv`vX%WSs( z-O`<&dU^G8`I_Q`zm3=LPFL#xBss10XU#_Wg#{`5t~~0kDs;7XQJI)JA$_6ZqRL56 z_O+}%Exl-o3TKmsu~hNW;+Y((Zq0uxa@sd+vYX+#dST`*(Waoq4}WF`2hYDKv3h$> z?8ax|jN-=%_guKQ`s3j?4vl%-4AR%H|KF|N&9v(*OZVlM-{x-lrS`mfYD`|=P41ha zAF`8J4lTT~^3R{|asu8i>utXZ`fu@LaO;!a^I~)4om2A?XN1Sse!ZDKf9vlfbS06e4Gui+D^SSi(wcMMVmZqPdw^&c=(>wn2 zarNK+HbwvbwOBrFf7$m1n}11kf3139PD;`uW;@2_y8Tb44`}#M3%`4aM z2;Z+;qc6Ba{qUwYU0?0h>@Pj*Q-0C-xZ<}`an8RW1rfKv;LQrW(dB9;m?XA`@rSd|kcsbbRDr zm$Hp5r{g1QPoL3d<9V+-vCH|O+xI?!uGfkFom)5-A4|Hr`l^uNOKz6Cb#*5HrUoBp zJkWK0|2eg?!jq?N%G|I2|M&azImLe8ECchl@AjW>mwj!G<@Ymg-!GDEOTD>+`;F30BATTj{)ZgfFd zAxrb}=Vk1k0xTUVYyQ3dy3*KU%7N*AmoZxh|`@@AS2-qGPSOVe&m+uBkOo zcV|oY9lhA;DJ;=ec=R&kf^FN%UR+qn&Mzl&!B0V8hE?gS&*$y;r=Awue6!~1+sCJ^ zr=iGCJq zD;{Z?96s`?)=ywr#zC1(k?ei_2LOrT73ykCBPbS!tvg;w#n9m&W0=Gj)?`~PO`>+oDrHRhT(9)BO! z_iuZDXWf=s!S{a63kzaSiLU*UuiMjhn(RX8<_}(lR4%3Z? zlszYHG})GXzp-G(|5cAA!UAKKOgSlJTKXX3?M3As$Ae$Y)K3!Ze7xiMd;j_GuX645 zT>NyWt;DocuIQ+V%#Feq^()u-?|j~%H@7N8?pE~N-f!pre3yIhqweaeP+>Kn6P%2J zBBn`4Izm^6^~&4-`!cci`Tp+*&b*!{c(Ae6uKawf6VpB| zKRc@@@y7hsPOq1iid{-`;rFVbepm zekOmuKQ;DLUj3V_xYA`U%CVC&OYf!Ku{rnHLC8hh`$_i>w_4;NH7}Z1JLhZm#w|s{43dpWcq3?9F?3 zR-Ii}dt0mN@4+^&9`)kghCJEd%6-^g?frl2`#KX)ky>b(-h7?_4uY@{Tep zx$WQPdO-Za>*)S{DH;rKez+zudNS;IaBAXX^?tSnUTL!@UGFUwTJ-k)c*HAh#v^T( z^XJLM+57(Hp8X`^=-RpA@$|d0yQcN;OUdxlu)i%Imwt)qz^m{3#mj!RNT1Wpjb~xF z9$&xLdgFTq?;SDgr1SR(GTaIk^WE`KCb75R`-!{xCPIOALi)Q`oMntZ5TFvrr{>hL z=#b?9@;_To`W~x)r#6w}#^Mdh5&Pfu$CmRR|IVS9r=epgA-DJ4EaTs0)?Bx17dot& zx>fSxqqEm$DlfI&?{Qr!OR3m_~H0mT|Uv*?m7NDbaTI>eXIJW3}gp zPI4>^Toz@A*8pLG0g+E!_)eCO+qTlAA8rrQLHtZC&Mmd6{`p0xUm{ zF4vDz`cY(ADXB4QnW9Eeo1VqvFE{pDZCy3@-~(Q^)vsP9A9g8|UwP~Edrw9U_K??K zCas*_bKGFfxxD)4|M%V9`CozI%gZYt+diMyz4ZFsjDm~rl)Gj77Hh3{TBScl#g;{Y zp?tgEv3GB^D|TNpdh`C6EwAoLAvLk1nsaXadh}JPBQ{bqk|e3J@`^`SD?I_4iXEmsn5B35Yqx74NwB{NwbH8KPR2 z{+<2|n-FWnF-{i(fYk2lMNU28 zoXw>-sPN^9lvn$icm1ueelC08z9zrFVSWQGkzPfu;xVp9J*-0J%J`1rk5 zUte5YynF8ryM=LY?wZ&gOsTH3H+j$-7aNyx`nL6hBkLb7JAS~Aq2Q^``QJymeq@-; zx^m@8QTey|i{1OPwnja#tUM6+ax=44(YEP=GRIe5IaDWk!6Y_7gdy;l!c_(p7RmSj zS2~^2x*TBXaa5^vMN{u&CyrNFJ12AXz8L!w18-kP{^862_~bFehLn>+^}in2@*LjqJn8&t=5Jm% zSC<`KJjZVLs$(Btw0kV&nkmBYC9OED@!0H?JqlBOQct~P&w3f!z#cborNi??gH-cP znp%7c^2?S!p4EN&Pn<~H=dWdV7G@s1dr?kqDN}>*{r3+qDzqtHtEu~Z*8JYj|0sKT>z)@+0{feyDnEd3mQtK!D-H=kxZzFSF18 z@pO7TLxX@ou9f-Y!XGE6d}g??!8P_=S^u=zYbRuHDw@BXW9g)=zruFgx-VXPCh4~0 zp2px?JDdz>FdN?qX|d@$p77pdDi=dUd*Rlgrm7Ts+b?RHi*4_l?tPSaD0!dH=54&0 zvrc-Pe|YghgL&1)RlDZbew(>}?&m&#`@bR#ElLL)%&R_H{K<o2?O!Rv=>xc7%8nWXPN-k{&< z5t3psW3AcVlSfvzoaS3rHTh=N_UB?^wrljWc#l509d4h@{*Td=)yhpz@b~_82d<@^ zxt4MN*QsWg@VQZj%GEa7qTO#rQn%e|c=$x#=vLC~AU|e?!v}h2vledT>WsLuFZ1#J zZ}J7Yw-)k+ZpptT!EkQ*(r!f-W|`Gy%ckvJ^0vKS)~fp6-*Ej?uUwi|s-5i@WRf|& zw#-`k*vAh?U++vRUwuzSK&Yi*N3HGT`%^l5%CMIXJJ zm%aS*<;#*KOVsD*?M%9770;i({z`4?F~6X9j=zN_2Ix(c(4EEslna`8!f%pw-!d%)Hx-dZlio9V22S0Up{h`D zPI`G$Mf<(HZ&O}nvz=%+>bjj2RKT%t8QayiQ>j_58prQkHt`L8bU`Y@z+v6fHFs>6 z_eQHGN<7-T)` z^-(e3N?-aubJ}~)Te>BAM)R_twGDc6jWln$_x|0Zba%G*H0Fl2OQK|)Vt5_%9U623 z=CFs?+D>rg;g3U&{;9K8Ppk7Uee=!5JHG!{%H8z~Sa}X-xx3q@Y<$Ph?$q>q$;PN;wbhb|4-S~IWY=~zf9y@l`}9~NB2d<_VZww3d)Lp~v0piDF)M>n{>Pby+jhvagh!lkpFPt&r_17YqwT)gHDQG( zQa)Ty`jz^rG-_|esnCW`Lfd|=KT=*8Y(LR!>AB6H4`gkO^pQ*Z*%##Xf{DRN!%gMmB5L(4E^VzqasZA2P`Ka5?t$J!4(t?&ME}JdZ`Xi(_-t z3$AsaVPNQ+u|hz!f4!c};YEi+oR|d#Cd+S#;AQdJ8KXJOY)*a$3}A;d0IO<`HMY7&`i%x$O@(c_Vpq^JfR8$q(iUO|}U1HaWXP@9X9; z`~4p2TO#&s`4xBQqwVI#mN~T=?T4R*#jSCB%=5f(uU?<{obm{bzQm0Wv;2NZzOHuW zP<3(L^-o18QNCX*UG$*x!-Wg)@3DQm+;sb!Z9?k|XD!>yeg80v9&`Ku(0Yr-%bnDw zdaIi4j!h4lEW*jath7G%aV-!0^EmPpEAJ3Jv?ekD)9mc=n!uQ}{J?Re+o=_k+A#8lLdb{=t( zoBXUPC)erjjcK~IWqW>}6!y1aWcV2wC3n2*h!c;qrR2|d_JvOC?yxJj1cc1sx~#bO zq>RJr^O5y>YbVY7FM4yesNdq~W2J@fdZusqHg9vmAp@U@7daRVv)(OtIB?LwN9D`T z=WjH80{QxXS*9lMSMQNhB7ORAllKH`xS_d<>eb~XA)0MpSr1=x(Hi2iQ zZ&cbo*0vSye=o?ybiB5<^GOjx6w$5^vlQ6l7vJaVg_i&At_P=H8vyv`X!^b;Iv(RgVukOY?sc zjO}mqm>As?F(Ip|TCF2QukknYruB1n$LE;q=&X5kYWuFmVXG}=KXgWQ1~Mpce=Ju# zrQbZUR{j0PwvVqgMENJ5*SaalGI7F$g5TeA>vui0-I{$pZTi!jn}2&%lt?h7+A;@sSWb*u_n&s)`H@a=B&)nBx-tY5o>gG(@>MePp(@#Cx2>+Ak}JpQlbaCIB6G#i76=f?^6ntyjShM!+ryzRHh-q3YdzjIo<+NE@V zYdqvv`8u{QMC^)5yUX(#3|{ouO#1Zj-_cLSTst1E*OzAy zntZBLSHHJ-Wq6eR)sk0NR&tB!tYBGL*>YiuX7G*ApRybG27Ox<`;g<%gelFMl76j^ zcdU+KbJ8%2iCv(5ZMIL{~+#f`?Nm&@=ypIT)T&fB^~hSh5B`uZaQJ9S*D z{J);|n%`p=)=bA2-kNfWQ)f=~kAOJMvj*kd zMV~U}pPt*@?WEMpS+w#<&eq7BZAm9K9%_EXEjz2!tLLLadqLXgKt26~Q%A!xGycKZ`>hvt+P?VGZ&c1DVS>?jml9G~|nwqB~m7X3R9X&lM{%0Q- zv;@5URVd>5Q*#4<-K?72IKj;2La&ZJvN-m*Is5;%WUIAtE5mBO-!1RAmurx6O#S@# z`+epHzt#8m_nv>w+L!#X|LBCWF5Pv(pVa3$JI`=RRM(t*b(QY5?C$rhlY0K&*N^v+ z2+oVM>wd6MdMXp^d+WmnKGWO|-})`Fbr(-{zCrXCv8>Mv58F<LW ziN1Iu;oRc!m-pny|BII_JD>RXeLaKy8yP+;@8Ac%o0bamER@)K>uzPr)|>rA|LtwE z?YiJ?dxZ10-efr7HtG1k-AmeTxowWr{C@NEqmTZ@|9(t0n>$ee8a*wuPVfJo;zxV7``_4W1U^e5MyR{QxDGTA@* z*841dUe*??H761@j3j>Qy8Jc~vk9uGPybZ9%RY!t{B@EmQ`54UO3jUF65mB?%1hju zTeryEt6t%JS#95}n#D&q<-NcEbz!%Q!ngZRs)MI2%*pzd{G|T>-aYMn?716e_=>G= zE@NQmduY_Tqve7vbEK57S?OIKyN=xtdjz)VzB+QOVB7PIt>rU|`93I4_j$#k%=Iy9 z-Xg0x%2!w1J72ke`IpP{_J4a?*t$B})I;jt=bP34HJ-lffBD(wx4bLc;f??G81J)- zDxRq|TYvUCqr?B}RXX#&?p@D&$z*f>>50$VN@T6e-rUaLAA3=0L(s~SFE1`KY{)+? zSl9QbPI-Ro@9A&U|IPZdh)I^=i{!Pr^H1LYbNC*oJm2c65?jmO-mtk{3G@8Ta5SgB#C1N zXD0F2J-E(PJ@farg4$CyAFjvLn&!v;zh1rV)s2>N?)ByM<>!01CT;w2Vxscd+2;He z1p;k}D_5>mn%I#zE+gIt;`Z7(w_c_x43PoHa~Gj(OI*$9i_(vorET8xUD^R z?Ze6Y1x}ZHerF#w@G<4w$t7~mI_A@^3IB_7So+%A+p6Ylx@^+?C;H+?wl>CN+?uve zu8A@oSrWM8seax@hI|3$aP~u|^FkCk3YA|SS+JwZxA?16zqyA5(^H*G20WA3UX*&< z7PBMEX%^eZkA)K_GEA5lUts%q#~e;|UfymV)s*g6*Sg+b)w?+Q8InJ!=!R^>Z+lVf%2JJUe%r3Oe!6tlROKZ+c-Y)BV;pPlY@suO{8uug)RE&c*QH`TlR7NB4zIMCX#PD$+^Mh~g4<@YEy>h$z-J$)ylZD*A z*Qp*;{bb|5I(BdE^`p}2!V9JfEJ-y9V%z+D&;LIc)-e?PI?%fN`g_aee?5gyoY3#! z3Kq0@S8zeXi9>Pm)ki!MtF$bxKmMDcIoV@DN@~jFgL8__?YEVMtUaQ!?Mcu2GZO!P zKAgiVG!vAx3JVKG7ama;;NX+BVqp-QTzYIn>mR9=QzcZnC#Ky$X)Jl>U%4iOp!Vx& zxpO}}Tz&Z7o82GQ=KtLK;qd=|8CN%+yj*Mj<<-^K>-YbAb#wFb#Zy`}=N~Z0xxOye zw(1K*!{6xse;@4UHU45SsPVFA_>uWi?E8GCRVSW(-tKq6d8@os#hsZS0`eGtYzjP; zsx~{4bL+p|2bQZ$7s^U(_}GzF)PA6lYt4>3pJH}z+b383HSgHg*R$FcYR)qq<(+g$ zTJ6a1syFkG`vo1`{dRrp+a*3TbL8vjOUKRpxM6S&%5;^V7L_S=@svkqs! z_3`(c9R>d$U6|hff~#xmPJW)*_Fttn+m%-zSg-0Vud#kM6XV5wnaRI%Ezfl}?xx4nnUm9b=bDuNs8-(p;NpUl3G-~LE{gBpBQ7X7andAEqvF7`F69uf)` z-d?A>tNeZ4yE{AiWUYQ^wn|7z&6+jq)VcTm%jV3#lCSrEnE?;4)Mp!pKi|&!o%8?R zy^57>`SQ2xgO{I=(N1638GCtIhSdvD|NAn7!{sk+f7wsp3$Fg}>1_9lbxG1jAC=B+ zAN|b)yIX<`&qqyJw?XTp*Up-N?Rxv~`G5fkHzx$84Zt&Q({O|XZ?pDNS-WRrN z-pFATlDO#O-(LzXMcmx=KZ?({Zkf$+VNcxM>+@bqiY}XVkg{I+@KB^7h?@*f`_*8e$J z9A}qtVS#-8pNYE38|rUw^sIgU;hiYMo)4!k3(fqIa;ozC7n`Lq=WYf?J@CogaZcBu z#h~ShPsOX1)=%X$8VzJv=7gB^n{LXO^>J(XRhj40mx3F~>ED=SjyozWJY4o}e?(q$ z5y$a6`|e7#EzCStdc(EB!mE4Z!-qVFZ@fv_7WVpbLStftQ;JIes@-y&6%k^G4gRGw zhGZ}B>y>B0U+ja8DB&WRxOWXhZ#ry9r*&X-z$hO$%ITjUt@#1NH zKWwb*7UfmxlH9VSegbZK90HG@UrhdXBk=YP&ym3v*RRO-m` z*j<0`zdYa~&7vmy_4v`*lXjcbXFtrS_pxK}d1ak`OMU(RkM9yXT{aayJ|=CR*CS^; z>uYO;=ks%Oudj&=ULR-6P+;-mz1{r-%B{_Zqv!WBHOPzSKgv-rxD$K#@_essj)k`_ z239y~=etF-2uPnhEA@THtlq>Gi(c;!HS*hDC3#&{p<~y?P9fh8^Tld?iG_j>WrUjq z4(-*DZ4(gcZrQqcao+QSZv82aYd?H&xLK{Sv}uvO!j}!U#!rK8Y3-V;l38%$z?C(5 zu?!YvA17VDw>jhMuf^i}wwISp4bkyirERBm&051vRB8I>6MJ1Q>Ns|^`%@Ws*+EV!V*p@9O{lc0p0eh>yvhmB=l)ef{-@0hd?w^x?pWj>3Hrwx& zw*U9H0+OrumFgajHPsAS%Cn=1vn`P`(8jx&<)MNIhfwm5E4Lmo_9fa~ZFwRX8^LC` zav#e_kIb9fBo4_qFgdL7;bM^M{=6$sq`PqP#OI&Bem=abRQkrp=7saSk2IxLKmT9; zXO;i`iTt*!CQR6KNXW6K``+)o1Jbs?d0y{(^7sAc%|EBOurstJx_z&Ce^_*KyWb08 zNy*B`$9h9ohxyL6x_Z5)c4f$}l#@bctnv)k*5CPe@yOFZyN(D+u6}2{X7|a2xG(q0 z|805fbwG`MwO#D~g1cwFPxt+D`3duZrN-vFuGXdAnEm%y?FX+2mlaWK<2EE5Y+~h> z;XD5I_4V`f?dMOQK7Iatc|k!zVd2YbA~!Etq7wesI(Of@+pPQ7ML$!#(#O7e|11`U z`!#3Io;_@!GebcBi0FJHMb9p-DO{VHm))#P@7wlauBcu61u;q9Mva!ZqZ|I-uX}Ri zVe!-7g%(dTxUVkI(>*MF+(3qfAt1*{JH@Eqb%RnU|Fg4U+W*h5zs#;*CVgXL+~y3O`tjFoeb=j8`-{xZ-c1zLnjBiu zS2kf*v+>Jw-kVHrSzWxiZneu%waND~irV;GG^PqoY(KKU=MPi*u{|CNOC;OQhEHn< zaknLAxduALbS5l1ZQ8x8r3?#BB=DF&-nZ`U^Yl!yo~U0>x81a_`{w>?p0UlL?>%YW z6AuO)Th%`|g5 zYa%zx*;eiOa>@IRksZSYlj4Hk8@I>*ypr`T*P*~&cBzzYamQV^U&34u{1jpvKC9P$ zeSJ}N@-x2wwO92P+c8MCFcdudaI|r)xpPBzf^tn2ZqFMGjrBnOWMAJ@1sc(hpU{} z|F?XzP2XrX!PWv4pV%B^_UE5=4r8ob%;W3zngw%ro4gHm+^^;0ARx0il%@Raf#M_m zjcz87Z!T<0^iUCLyOmrf<6CRCb1U}wt>Ecv9d>z`CE0)dzJLD9I|&i}={2v|4jUYe zI{c#Vz19DhuUm60Yo5G!zMkc{`BK?}1KZx7F1^41d*An_-Jo}V#1QxY8 zXo*RlQN4D%H0tlizv=U<^eWGsQJnAh`__5A$g|r#|2|u#JoR&!Z}qD1O%5I|uCBhb zOjh2RRlQ{Huk`OHEtAFAUBtv0j-8QddVJ&J-sPpY99C(v6s6cyzq$0S^!G2G*ZYco z|9KdDk1OFc&*2!``r>;(mNMpSjtR?~uRpPK`}*6@tbEdOAY@bT!+>u$Ic3Cm zPF=L>qJ?was>7udMW!y-_h>%6Pfp@d$D&x7t(FBh8Tdt9f0fDK*_SE%eR15+jJ>OQ zB5hx|9N2rbL1Jswv(?VEZ;u_UKmWIM#_yJ7iB){xuZ90Adv)V$r`SHZuQ$)Xc8m@a zs#y}0dA5Il=#;HVpSPK_f9vK7K3kEx!dPFPA!AnD#?g&r{~rGe|oIGZ2qDe@oK$ZF@G~DyRG{J z^XJ*6I4-!A!ntALEbF?=^Nw?Gm*jm5S^uQIY(7uUPVP zgwCaf*Tme<&($>hYqRV7=Zz1umNT9}nlt;U{Ga_msLdC5hKUD0o(jIN{r;t*=c^k> zy}v5>G<^-VSsxbpA4uB82vyR#dk-YxZbb>LfwS%LK7 zfWu;6uS`5Oqs4>a#Ln64&t8wUo&N0nqr6OomNebD3=FgP-xn4*Y8%d!^GR3j^$u~n zh|S+Oi{5@_`~QdZ9@f0o(^__I)ZTV>ac0^bZutnGuygCVR+_vxTK~c@a*eCo;oILk*+AD{e6qetuuVRFf zU0ptPaj)7C&RBUyY3iyoe`@-~j;3GU@A>Z5qR67dH?`I3O%fv&&IL2gO4IxQI{)AF z>1W~$cV^CJ3qODVPtGrM#(bL(r!TJj{m*vGYnSWy-cHMz^S7vdWmxzAK%S{R5lT^; z3e6N1_}*E}+tojtw^N{K`hCt%6Bb?+eeKhxbV8#|Mq1)#uhN9}Tghu~RV>v}iTUY} zdi2@$g7$PRZ51sJ@0&}-1)VlNeCWzH@xX;cXme)^g{FSF;jUz>UH!dq{i_9c&h34E zAyML3snx?dYv=7Oi+vqC_2QQ`ISdK~cOG|5iBUSax+7_6oc(G>!=Fq{;q6*nC93OM z5@%FCp8jvjr~T92zTVpXQNI4tm(|m@#YXegEEdmP{;W4%>c$I`X+-zx2u~&yR*jX7^`r0)`lo}uGTY2oUlJX|g zsD-{&w!X!-XK(kU8ftLJJdY97UZh&4!8dw^T`_3z;=llMz`W8NUdj7o2YrknXaw)F&dBXMb)7fGcr=)*No-%TJ z6)bo1vGX;)+^%z@EHQNQHP6*$^+vm%SBn-->q@x#&VSYxKP?@Nd3Gs{yC<_9H`uz! zWoBT@k16}PEhO4by=Y@NzS>!xxg$8uLg9MqriflK?$;a4Z|9WVDiZ(q_Qs}%Ep_@< zkCjA?GMz%6Y(BX*Jm+57mphVYX2j&^gg#ia>cpiCH{CyzjyJv&{2gE`mlOZ_HVW63i2Klr!$+P}~?GA-zs-@z#i~wak$$xQs7thXdETF1CDNvF+oPE`g z)^>c*dKodHOWA#~>GU;MCvu0+R#V+$xxwD)gdb?cdro+Sgs9lHeV)n-9X>oePK*0_&%c>+=4+>C;pcsG ze;r)m%4ieoYW)88%1+Nh*IAD^YtzE-L~0pqU8AtPAmg{@>hgM{tYZ(_bYJzoG+n(* zSKHE&W24mRS$7Uy+?yu)WXH|wh7|^(Pg5Sv%-v?xRb_e5KxO(5y+?mL61PO$3C}iY zVPR@Yl*rvUuax(Ms?f@al;s)%H-ulQ@4K^C+DT)z!{>{)=6~vb*PHtK``h`SZ*|-# z_&Q}e+nW3J2MU~DY`9x3XW;ZFqWRj?Iak{RI#`%iM##uZ2Cgs{Sh&UF*rEdMUknTq zekN;$=Z6NY`1pi>+r+Zqz~1STQW&@%>M3qMdBkqN2&+|W%VI{~<6$nxSBY{s*0^j5 z(f?|C&c;QHbD|d`!;^%qw-+)vDIWXz`sih~i5HrsJv{A}HL%a0Bs9@O>_Uusr-#aP zj~><3!nbCd$|qmkKR?3mL2q2*#8q6T^BGf~e)}0)z5VpQ$>uBGrtDtJlp3OStu5Ae zy4|kpYrY&s?^@h<*(MCjuAc5(B((EC{%d*7M9ezmjYd#zH4R=?sk z#^nL|Ck#`nC7%hYarSd^>)A~4@>{s}aO|4#j|$);GU4uIWlWYi*`=N`GJV-kOiDjE*kt zm2uy`3vCRDFgKf45>PfNiCMuW>@!n?$I?l68xIuPE9ZDA$4F*vyluh#`@C9e`>Or_Zd}r2wqF%C zvzoIsd3w&AzZIveT3L_Q&h9Uqf1lYQXUDDBUsKW~IF2l8%}&sLSs)_Gv;E1y*g zZsFT_BIfxole0VIPaE|3?>q3Szj)`0C#8zl4UcAQ%+UQ={-EThFYnuXxdGeVc$n|6 z^1Aqn(7@;SEmJM9KQ+3~d5_DRV!OwhV zM& zzIS%dsXd_&L#JpZFWsfE{KL_-WU;^B>SmuiTNe8>&uKnC|9i_&&gZ(*{cLZqx${p@ zQNd4kmqG0brt<%`3@)oe-jZwZefdi!#gDHSt)1ii%FK7p z_s_RkXU@7EzT=c%z%%ZkuL=kLT#zbK5)pW~aN#?@)n}r2t}mIjt>*Kb#>G`z>sGz= z&Q%NBE>XABY1hXqT}PJecw=2T`SGzw|;OZZhPjVjmWnG8Lq3>b7&uZian3R;vavru!-Eum_VqM&s z*YZ4?XCo6#BhA;{c)CI^bhfC`%5xb{T;4Mucv_#&llT4EHty9zlOKJ%|L^Hp#?Pz# z_to8Ar#mfo*5ZJZ+}vI4+p8}>ZrQA~!X~w1R+`$EnSWEhtM9w{v#@CTv;Qgi5q8gy z%m4fCzO?kf$?SaIIX3w%E^6CupD5I?d9ZH#VWsI_F{0sGjK|8~x^*qfF1r!h>iF~3 z=>&&-Gg*semazqIp1!;5l)5Q!@BH5{+Swmg2Wnk?aqm21!?}!@{r?v{bUV`g!B+Y2 z*K6F$Rkqrqta=X)i)+fYCCZri2J-P7epf%a!1S?Xf==12WjnG@n@u{SZL;#|)ucDi zcz-{O*;mT`z4p-x^O;8%d{ax?#`W|4kE@HCl41`w?_6{F-uju}U$413d2f!omffP# z>uFQw7KyfqbFiMZHk-Ar;>)AV)pNu42hLt1CM$i@Tl037>FolU)oN<;icV|zlY{kR&s`OBTYY$5 z&K(a8feR*kpM3W7)3qb>=jWxh|;eq1y;eEMpX=L3mjk)pzle-1sJ!#%yY!bFW- z@cG-tnX~lXr>09RkbEDf$CfcmuiSr|+oHu&Y%^z-S;)NcpIG>Ce$I@I&#zCp`nj&P z`lD6c*CR>Wm=643w$A8j ztr&Lx#l8lG;7`jPxET{w|4!v_e7oYr8K&N9R*&7iGFOwIofiImCdQ=h!wqpM+ra;q zSH|xa_g*a%wJqPK_~VYWlf0hRruCOTb)DX?->bFaf0|)rI#2wM*QeeVhwb}Wak}cX z+1Zn)FX_zMnf81=yVfEXMur55s)tYWF562VmHMrne)*YiMA^R|Q!jlB_gE^Zwe^tJ*uJJs{JvkP`<#!~sd3Y{n@>)hp@02<-llup^E%qv#PjFGd^67X4_nhyG{U=si|NncCJN!-jg=CNC`>)9}nej1%X4kW`^Bfjh zq{Llvv}!W@%r)`hIr~eV9ov(?+${I=H3C{6dUx%Jzt;Xv)bB?4TlHf7|O z9{X)Qd9kid<*o=Gvt|CM(>{qp{mTF;$CrF+)e|J(ZY`2Jnr^302V9eAR5*4z*#I z?&IBi(skCAHC^_*vXE<{!-Vyhcg_xNO9YKUZ{n|y`EvXB+j)7GW!EkQ8neCsQF(vc z{C{?J3LhrczTLI8qVR|D-uSnDk7wLvF z`~9b5OOp$kKr-PEJ-T#iIB*))iImxqR+Qk-M}F@LEWK)L72OB)dYc+JC3~CxWH@vOozbB z!F+$;@1MJ5!J$pXK5U;~RlYv$duer>N_oCvN!0z8B~k6$md(3WKX2K~>C3-If4IF{ zp6BnK1*`Xk#p_MwV0Fn$RD7v<;6jQ)f9=28rBNSG^1oLp&%9QCWOJ>%P4(-jW39sB z)6f4jd|ftge){^U5~h{+I?{5bHx>I$K3HS)^w65?`z~bGuKOucu&VWB`o$+=>t<}v zJG!Uz;zz;B&v=5{+RN(ncKS6}d|T%`$GGQi?=s2mlS&>KD|CGgSJ9d=+kkfstA-OP1+4K8``bk9*xmR~- z&022}pM3qblSI*4kw+h5Yc-rCU(Jc|c3Bi9sMMCI!R~w6q%D!d-Wi`? zJxyv*Ia&05%T3R3|83u$oN|xj?Sj2;IIFoM3h~#sWU0PMP_EhR`e?F`47VMxPiJUYFgQx;fKQlC?h9>doE+#lA#AtyD>`T@r0O zXFcg^JFaDWob~lat7#1fv_ETUF+M-CtLOEjhjYsK>s&ZEIb=@tBsqWgH~BpKs@+^Y zmL0!#)X%s2{C%bIoBI96DFwgNdhhnn+E%l4wfdr_6;IUnTOHuMFD&4)^P|` ziv>7Xnu@-soHprbnfKjgsd>}G8PjbO{T0QyPE4{EX0dxbyR%HY@_Uxr?Q?InC71Kh z`JZ)+->O$G=AP-S5}kRws?KiIS6+1Z)0?N~SFRFh30UH#DaaW+b+hG-HQ)S~uVZOg zmMc~A{`$k#>AR1rxbRgh7H8*JhDVve*<4zG{e zcCu8SN&Lu4WtNtPWiMscnziMK@bcb|HZe>M&wBN*USIa$W&e96_OVPi?=kXU(~50= z`Ur^?$!dWG`>~l>Vx7^7Qq;szTxtCvsi6Cq8+tkkb^SRxdfh$J1@>?p*(! zb^9^r>XU2?mjpT^l&)m*p67in6{ubFs<`-*(YvFY?(UoP@uRf2ty$968;lEPsXU$T z-4W6yprvtX>fF-Gk5{&KFJGrS@9W+Wy_dIk$9}JqJ-j&N>@BmDvz19fF`4X_Oq?fP zX%!APt#tjpO~!J^;~h66V#Vz5REqGnxu|gQhqA;zaI`Ss@#lT&F*QhYy7fEtvUZKs z|F?fFw2C@9;d|SR6+1pWXDi(-8rA>S^0AGVj>x9R`hCfT69ua#uY7+aPI(#65eDn( z7e=YJd3N+|+5xrvB^uXBVsg|G-zztm_&i$iOrA*7Vr*(@q@Wni{kGD)-St z=JWp^$b2tv^hBuBN9WqBuSbu4ddz>u?ew~@?B#3iPy7p3P?6g1rNmNk`de@B(Pb-k za4?)Wtuvwh)H%7`E))B_)7MS@mi3mkcxl@H=lhftIt*Mrwyw2&{UNsNxL?rKnzEqK z4+XB)8SHHzYm{4*WDt6d3>DPgW z#%yUzpWo=x;S5}Q?MQcbPr-c+!OmB%YFXWtevGb8jvl=0mxwD(RcpJJE_>C6W9sP& zl?B>|oT5rIwSp`5l|JW-w<`ZJ?_RfuQq`}eeZ99T)}_tZ^z+8s)iW6y9!fCq%(`^qbN$1qR$G#nTU%eyCyo0+tq;HOC$KT~wbABfu)jM@r zJHa%PF(GR`|J;M+htqj#>QcVnbhfXLcx%h;q+w$cqB;5XS+(YykM>$gW-dRsG>)y| z^8YJKRJt!!g!t@>QR)oQ^cLQjzIFACRUFY}vKgmBe;2iDS_+m}$h`Bl(Rx+Qu;cXE zl$!q5CwJ;kJ#^4p_<&==YvHD;L2EMJ{0Tq2Xv$)%J%>AUZv8xLmyqzF<+<&wKXu8~ zyz>n|Oul%U&G+5g?Cp^pGW}eSU%7r-Hp}}xBSV{k--~rYdi)8$@9i-vUzfgWaY*3D zdE61&$|C37^5S=DiwG`#s~LXshV56YWVfhoMoLo(Iqg(gS~lLW$$sH{@FJ(+ zjapUyb?V^>eXUJ4F@yZNzfJXVa;WG@xwo_I{<*Ec?`;1r zfBp5;?Z3`TZ+vm*q4yr&x`dU5m#P_$&))xUk$HIK%@aNU=2vW9em6({{!`ohT}w{u z|4X`L9yjlr?(ruljmgSALKAi_JaK{95z2 zzq<5g?)qcvg7h^h}eC1WN<<6@+ol0Cm&d%CB={)1z?J4iq{JD18c~9k2 zxAV0}cRu=Fpdc{q{pp0IJf2;z%ummLw38#|U481ITfcv<*Dus#V&@F{`RB(=w}l=C z|F4(dd-E}|ZW$Yc#H`3q*Ji!+KCbh#_+Ia4bInVP43`8v@2YLRUbn08^!DAWcb)#% zBp}4yDmHuVpICV%InK%P!T(m|=&pD1_!boD!eJ!sIZd$rgaMC}hl*gA%2jidPV?0I zdAB`+SQO*BA1X5}&~R7fmf)B8f9Le&->h$ICwMJZ*!^L(q`gG9?UGgNXKw%ZZ0YWG z+#y?<<4jVoTAw~Hnj*gGmvGR|CrPiawja2+`Nm22bu8bM6F=putTdKle*KEuf{%Uf z>Z?o*5>9*Uwf1|c3vqaD{?)x~jn}(-kDfiC?aS+oW@)?9G+_w_Df>|1XX6 zy(yI-_|+(&O`D-X;lq8swQIIaW@8C!Xnk8hp{OvR&vyTkia(u+GyY2NboI?--&^3s zTdlIEF>yh_`sa!_LN8aU_}DRIbbr0|XqCA28V;jR-l2y*;{P3=^|U@DEj`O*$>Bn4 z^Xuo`x_H<&U!65?YV5mtndU|p=3BUP-EzDfwmUZ8=X7f|LA0Dic&p*IwRKo7{TJdCiOLeBL_+N*0s(gj77H3W5!oRQY&% z+MP3zyZ>`9-Q~jb^L74ylc$fbPpkit99pUaGN@_a9|cFIPP6#$Ro~0&Z~Q-cPuf1t zs(9{Q3CY##V)tKbv6Gj(S-tCyn4GEQ1_j5a5UC0ao3N|3970bP9?Dbxo^Lzr%9e9q zySH-}ad8)M`Lcb^zyIdW-`@+1`gKp}+El-p6qmlHrH+kL=t&^6Y0JCNyX^{&O)Ma9 zvoQ0QlIoGcIaSd)zqi*MZou$oUEAL`{Ajc=U&*n5_Nfq}u()z4*}Q$iB} D!E1T| literal 99269 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 &|U~d6MnLOYQl)6Js8mZT-pQZR#T6 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 diff --git a/gerber/am_eval.py b/gerber/am_eval.py index 29b380d..3a7e1ed 100644 --- a/gerber/am_eval.py +++ b/gerber/am_eval.py @@ -18,15 +18,16 @@ """ This module provides RS-274-X AM macro evaluation. """ + class OpCode: - PUSH = 1 - LOAD = 2 + PUSH = 1 + LOAD = 2 STORE = 3 - ADD = 4 - SUB = 5 - MUL = 6 - DIV = 7 - PRIM = 8 + ADD = 4 + SUB = 5 + MUL = 6 + DIV = 7 + PRIM = 8 @staticmethod def str(opcode): @@ -49,16 +50,18 @@ class OpCode: else: return "UNKNOWN" + def eval_macro(instructions, parameters={}): if not isinstance(parameters, type({})): p = {} for i, val in enumerate(parameters): - p[i+1] = val + p[i + 1] = val parameters = p stack = [] + def pop(): return stack.pop() diff --git a/gerber/am_read.py b/gerber/am_read.py index 65d08a6..4aff00b 100644 --- a/gerber/am_read.py +++ b/gerber/am_read.py @@ -26,7 +26,8 @@ import string class Token: ADD = "+" SUB = "-" - MULT = ("x", "X") # compatibility as many gerber writes do use non compliant X + # compatibility as many gerber writes do use non compliant X + MULT = ("x", "X") DIV = "/" OPERATORS = (ADD, SUB, MULT[0], MULT[1], DIV) LEFT_PARENS = "(" @@ -62,6 +63,7 @@ def is_op(token): class Scanner: + def __init__(self, s): self.buff = s self.n = 0 @@ -111,7 +113,8 @@ class Scanner: def print_instructions(instructions): for opcode, argument in instructions: - print("%s %s" % (OpCode.str(opcode), str(argument) if argument is not None else "")) + print("%s %s" % (OpCode.str(opcode), + str(argument) if argument is not None else "")) def read_macro(macro): diff --git a/gerber/am_statements.py b/gerber/am_statements.py index 38f4d71..f67b0db 100644 --- a/gerber/am_statements.py +++ b/gerber/am_statements.py @@ -17,9 +17,7 @@ # limitations under the License. from .utils import validate_coordinates, inch, metric - - -# TODO: Add support for aperture macro variables +from .primitives import * __all__ = ['AMPrimitive', 'AMCommentPrimitive', 'AMCirclePrimitive', 'AMVectorLinePrimitive', 'AMOutlinePrimitive', 'AMPolygonPrimitive', @@ -51,12 +49,14 @@ class AMPrimitive(object): ------ TypeError, ValueError """ + def __init__(self, code, exposure=None): VALID_CODES = (0, 1, 2, 4, 5, 6, 7, 20, 21, 22, 9999) if not isinstance(code, int): raise TypeError('Aperture Macro Primitive code must be an integer') elif code not in VALID_CODES: - raise ValueError('Invalid Code. Valid codes are %s.' % ', '.join(map(str, VALID_CODES))) + raise ValueError('Invalid Code. Valid codes are %s.' % + ', '.join(map(str, VALID_CODES))) if exposure is not None and exposure.lower() not in ('on', 'off'): raise ValueError('Exposure must be either on or off') self.code = code @@ -68,9 +68,15 @@ class AMPrimitive(object): def to_metric(self): raise NotImplementedError('Subclass must implement `to-metric`') + def to_primitive(self, position, level_polarity, units): + """ Return a Primitive instance based on the specified macro params. + """ + print('Rendering {}s is not supported yet.'.format(str(self.__class__))) + def __eq__(self, other): return self.__dict__ == other.__dict__ + class AMCommentPrimitive(AMPrimitive): """ Aperture Macro Comment primitive. Code 0 @@ -181,12 +187,19 @@ class AMCirclePrimitive(AMPrimitive): self.diameter = metric(self.diameter) self.position = tuple([metric(x) for x in self.position]) + def to_primitive(self, position, level_polarity, units): + # Offset the primitive from macro position + position = tuple([a + b for a , b in zip (position, self.position)]) + # Return a renderable primitive + return Circle(position, self.diameter, level_polarity=level_polarity, + units=units) + def to_gerber(self, settings=None): - data = dict(code = self.code, - exposure = '1' if self.exposure == 'on' else 0, - diameter = self.diameter, - x = self.position[0], - y = self.position[1]) + data = dict(code=self.code, + exposure='1' if self.exposure == 'on' else 0, + diameter=self.diameter, + x=self.position[0], + y=self.position[1]) return '{code},{exposure},{diameter},{x},{y}*'.format(**data) @@ -261,17 +274,24 @@ class AMVectorLinePrimitive(AMPrimitive): self.start = tuple([metric(x) for x in self.start]) self.end = tuple([metric(x) for x in self.end]) + def to_primitive(self, position, level_polarity, units): + # Offset the primitive from macro position + start = tuple([a + b for a , b in zip (position, self.start)]) + end = tuple([a + b for a , b in zip (position, self.end)]) + # Return a renderable primitive + ap = Rectangle((0, 0), self.width, self.width) + return Line(start, end, ap, level_polarity=level_polarity, units=units) def to_gerber(self, settings=None): fmtstr = '{code},{exp},{width},{startx},{starty},{endx},{endy},{rotation}*' - data = dict(code = self.code, - exp = 1 if self.exposure == 'on' else 0, - width = self.width, - startx = self.start[0], - starty = self.start[1], - endx = self.end[0], - endy = self.end[1], - rotation = self.rotation) + data = dict(code=self.code, + exp=1 if self.exposure == 'on' else 0, + width=self.width, + startx=self.start[0], + starty=self.start[1], + endx=self.end[0], + endy=self.end[1], + rotation=self.rotation) return fmtstr.format(**data) @@ -323,7 +343,8 @@ class AMOutlinePrimitive(AMPrimitive): start_point = (float(modifiers[3]), float(modifiers[4])) points = [] for i in range(n): - points.append((float(modifiers[5 + i*2]), float(modifiers[5 + i*2 + 1]))) + points.append((float(modifiers[5 + i * 2]), + float(modifiers[5 + i * 2 + 1]))) rotation = float(modifiers[-1]) return cls(code, exposure, start_point, points, rotation) @@ -416,7 +437,6 @@ class AMPolygonPrimitive(AMPrimitive): rotation = float(modifiers[6]) return cls(code, exposure, vertices, position, diameter, rotation) - def __init__(self, code, exposure, vertices, position, diameter, rotation): """ Initialize AMPolygonPrimitive """ @@ -439,13 +459,21 @@ class AMPolygonPrimitive(AMPrimitive): self.position = tuple([metric(x) for x in self.position]) self.diameter = metric(self.diameter) + def to_primitive(self, position, level_polarity, units): + # Offset the primitive from macro position + position = tuple([a + b for a , b in zip (position, self.position)]) + # Return a renderable primitive + return Polygon(position, vertices, self.diameter/2., + rotation=self.rotation, level_polarity=level_polarity, + units=units) + def to_gerber(self, settings=None): data = dict( code=self.code, exposure="1" if self.exposure == "on" else "0", vertices=self.vertices, position="%.4g,%.4g" % self.position, - diameter = '%.4g' % self.diameter, + diameter='%.4g' % self.diameter, rotation=str(self.rotation) ) fmt = "{code},{exposure},{vertices},{position},{diameter},{rotation}*" @@ -546,17 +574,16 @@ class AMMoirePrimitive(AMPrimitive): self.crosshair_thickness = metric(self.crosshair_thickness) self.crosshair_length = metric(self.crosshair_length) - def to_gerber(self, settings=None): data = dict( code=self.code, position="%.4g,%.4g" % self.position, - diameter = self.diameter, - ring_thickness = self.ring_thickness, - gap = self.gap, - max_rings = self.max_rings, - crosshair_thickness = self.crosshair_thickness, - crosshair_length = self.crosshair_length, + diameter=self.diameter, + ring_thickness=self.ring_thickness, + gap=self.gap, + max_rings=self.max_rings, + crosshair_thickness=self.crosshair_thickness, + crosshair_length=self.crosshair_length, rotation=self.rotation ) fmt = "{code},{position},{diameter},{ring_thickness},{gap},{max_rings},{crosshair_thickness},{crosshair_length},{rotation}*" @@ -608,7 +635,7 @@ class AMThermalPrimitive(AMPrimitive): code = int(modifiers[0]) position = (float(modifiers[1]), float(modifiers[2])) outer_diameter = float(modifiers[3]) - inner_diameter= float(modifiers[4]) + inner_diameter = float(modifiers[4]) gap = float(modifiers[5]) return cls(code, position, outer_diameter, inner_diameter, gap) @@ -628,7 +655,6 @@ class AMThermalPrimitive(AMPrimitive): self.inner_diameter = inch(self.inner_diameter) self.gap = inch(self.gap) - def to_metric(self): self.position = tuple([metric(x) for x in self.position]) self.outer_diameter = metric(self.outer_diameter) @@ -639,9 +665,9 @@ class AMThermalPrimitive(AMPrimitive): data = dict( code=self.code, position="%.4g,%.4g" % self.position, - outer_diameter = self.outer_diameter, - inner_diameter = self.inner_diameter, - gap = self.gap, + outer_diameter=self.outer_diameter, + inner_diameter=self.inner_diameter, + gap=self.gap, ) fmt = "{code},{position},{outer_diameter},{inner_diameter},{gap}*" return fmt.format(**data) @@ -693,14 +719,14 @@ class AMCenterLinePrimitive(AMPrimitive): exposure = 'on' if float(modifiers[1]) == 1 else 'off' width = float(modifiers[2]) height = float(modifiers[3]) - center= (float(modifiers[4]), float(modifiers[5])) + center = (float(modifiers[4]), float(modifiers[5])) rotation = float(modifiers[6]) return cls(code, exposure, width, height, center, rotation) def __init__(self, code, exposure, width, height, center, rotation): if code != 21: raise ValueError('CenterLinePrimitive code is 21') - super (AMCenterLinePrimitive, self).__init__(code, exposure) + super(AMCenterLinePrimitive, self).__init__(code, exposure) self.width = width self.height = height validate_coordinates(center) @@ -717,12 +743,19 @@ class AMCenterLinePrimitive(AMPrimitive): self.width = metric(self.width) self.height = metric(self.height) + def to_primitive(self, position, level_polarity, units): + # Offset the primitive from macro position + position = tuple([a + b for a , b in zip (position, self.center)]) + # Return a renderable primitive + return Rectangle(position, self.width, self.height, + level_polarity=level_polarity, units=units) + def to_gerber(self, settings=None): data = dict( code=self.code, - exposure = '1' if self.exposure == 'on' else '0', - width = self.width, - height = self.height, + exposure='1' if self.exposure == 'on' else '0', + width=self.width, + height=self.height, center="%.4g,%.4g" % self.center, rotation=self.rotation ) @@ -782,7 +815,7 @@ class AMLowerLeftLinePrimitive(AMPrimitive): def __init__(self, code, exposure, width, height, lower_left, rotation): if code != 22: raise ValueError('LowerLeftLinePrimitive code is 22') - super (AMLowerLeftLinePrimitive, self).__init__(code, exposure) + super(AMLowerLeftLinePrimitive, self).__init__(code, exposure) self.width = width self.height = height validate_coordinates(lower_left) @@ -799,12 +832,21 @@ class AMLowerLeftLinePrimitive(AMPrimitive): self.width = metric(self.width) self.height = metric(self.height) + def to_primitive(self, position, level_polarity, units): + # Offset the primitive from macro position + position = tuple([a + b for a , b in zip (position, self.lower_left)]) + position = tuple([pos + offset for pos, offset in + zip(position, (self.width/2, self.height/2))]) + # Return a renderable primitive + return Rectangle(position, self.width, self.height, + level_polarity=level_polarity, units=units) + def to_gerber(self, settings=None): data = dict( code=self.code, - exposure = '1' if self.exposure == 'on' else '0', - width = self.width, - height = self.height, + exposure='1' if self.exposure == 'on' else '0', + width=self.width, + height=self.height, lower_left="%.4g,%.4g" % self.lower_left, rotation=self.rotation ) @@ -813,6 +855,7 @@ class AMLowerLeftLinePrimitive(AMPrimitive): class AMUnsupportPrimitive(AMPrimitive): + @classmethod def from_gerber(cls, primitive): return cls(primitive) diff --git a/gerber/cam.py b/gerber/cam.py index 92ce83d..dda5c10 100644 --- a/gerber/cam.py +++ b/gerber/cam.py @@ -22,6 +22,7 @@ CAM File This module provides common base classes for Excellon/Gerber CNC files """ + class FileSettings(object): """ CAM File Settings @@ -52,6 +53,7 @@ class FileSettings(object): specify both. `zero_suppression` will take on the opposite value of `zeros` and vice versa """ + def __init__(self, notation='absolute', units='inch', zero_suppression=None, format=(2, 5), zeros=None, angle_units='degrees'): @@ -243,6 +245,12 @@ class CamFile(object): """ pass + def to_inch(self): + pass + + def to_metric(self): + pass + def render(self, ctx, invert=False, filename=None): """ Generate image of layer. @@ -256,15 +264,11 @@ class CamFile(object): """ ctx.set_bounds(self.bounds) ctx._paint_background() - - if invert: - ctx.invert = True - ctx._clear_mask() + ctx.invert = invert + ctx._new_render_layer() for p in self.primitives: ctx.render(p) - if invert: - ctx.invert = False - ctx._render_mask() + ctx._flatten() if filename is not None: ctx.dump(filename) diff --git a/gerber/common.py b/gerber/common.py index 04b6423..cf137dd 100644 --- a/gerber/common.py +++ b/gerber/common.py @@ -22,7 +22,6 @@ from .exceptions import ParseError from .utils import detect_file_format - def read(filename): """ Read a gerber or excellon file and return a representative object. @@ -73,5 +72,3 @@ def loads(data): return excellon.loads(data) else: raise TypeError('Unable to detect file format') - - diff --git a/gerber/excellon.py b/gerber/excellon.py index 3bb8611..b1b94df 100755 --- a/gerber/excellon.py +++ b/gerber/excellon.py @@ -76,6 +76,7 @@ def loads(data): class DrillHit(object): + def __init__(self, tool, position): self.tool = tool self.position = position @@ -118,6 +119,7 @@ class ExcellonFile(CamFile): either 'inch' or 'metric'. """ + def __init__(self, statements, tools, hits, settings, filename=None): super(ExcellonFile, self).__init__(statements=statements, settings=settings, @@ -127,8 +129,7 @@ class ExcellonFile(CamFile): @property def primitives(self): - return [Drill(hit.position, hit.tool.diameter,units=self.settings.units) for hit in self.hits] - + return [Drill(hit.position, hit.tool.diameter, units=self.settings.units) for hit in self.hits] @property def bounds(self): @@ -162,7 +163,8 @@ class ExcellonFile(CamFile): rprt += ' Code Size Hits Path Length\n' rprt += ' --------------------------------------\n' for tool in iter(self.tools.values()): - rprt += toolfmt.format(tool.number, tool.diameter, tool.hit_count, self.path_length(tool.number)) + rprt += toolfmt.format(tool.number, tool.diameter, + tool.hit_count, self.path_length(tool.number)) if filename is not None: with open(filename, 'w') as f: f.write(rprt) @@ -184,7 +186,8 @@ class ExcellonFile(CamFile): f.write(ToolSelectionStmt(tool.number).to_excellon(self.settings) + '\n') for hit in self.hits: if hit.tool.number == tool.number: - f.write(CoordinateStmt(*hit.position).to_excellon(self.settings) + '\n') + f.write(CoordinateStmt( + *hit.position).to_excellon(self.settings) + '\n') f.write(EndOfProgramStmt().to_excellon() + '\n') def to_inch(self): @@ -200,8 +203,7 @@ class ExcellonFile(CamFile): for primitive in self.primitives: primitive.to_inch() for hit in self.hits: - hit.position = tuple(map(inch, hit,position)) - + hit.position = tuple(map(inch, hit, position)) def to_metric(self): """ Convert units to metric @@ -223,7 +225,8 @@ class ExcellonFile(CamFile): for primitive in self.primitives: primitive.offset(x_offset, y_offset) for hit in self. hits: - hit.position = tuple(map(operator.add, hit.position, (x_offset, y_offset))) + hit.position = tuple(map(operator.add, hit.position, + (x_offset, y_offset))) def path_length(self, tool_number=None): """ Return the path length for a given tool @@ -233,9 +236,11 @@ class ExcellonFile(CamFile): for hit in self.hits: tool = hit.tool num = tool.number - positions[num] = (0, 0) if positions.get(num) is None else positions[num] + positions[num] = (0, 0) if positions.get( + num) is None else positions[num] lengths[num] = 0.0 if lengths.get(num) is None else lengths[num] - lengths[num] = lengths[num] + math.hypot(*tuple(map(operator.sub, positions[num], hit.position))) + lengths[num] = lengths[ + num] + math.hypot(*tuple(map(operator.sub, positions[num], hit.position))) positions[num] = hit.position if tool_number is None: @@ -244,13 +249,13 @@ class ExcellonFile(CamFile): return lengths.get(tool_number) def hit_count(self, tool_number=None): - counts = {} - for tool in iter(self.tools.values()): - counts[tool.number] = tool.hit_count - if tool_number is None: - return counts - else: - return counts.get(tool_number) + counts = {} + for tool in iter(self.tools.values()): + counts[tool.number] = tool.hit_count + if tool_number is None: + return counts + else: + return counts.get(tool_number) def update_tool(self, tool_number, **kwargs): """ Change parameters of a tool @@ -274,7 +279,6 @@ class ExcellonFile(CamFile): hit.tool = newtool - class ExcellonParser(object): """ Excellon File Parser @@ -283,6 +287,7 @@ class ExcellonParser(object): settings : FileSettings or dict-like Excellon file settings to use when interpreting the excellon file. """ + def __init__(self, settings=None): self.notation = 'absolute' self.units = 'inch' @@ -300,7 +305,6 @@ class ExcellonParser(object): self.notation = settings.notation self.format = settings.format - @property def coordinates(self): return [(stmt.x, stmt.y) for stmt in self.statements if isinstance(stmt, CoordinateStmt)] @@ -350,7 +354,8 @@ class ExcellonParser(object): # get format from altium comment if "FILE_FORMAT" in comment_stmt.comment: - detected_format = tuple([int(x) for x in comment_stmt.comment.split('=')[1].split(":")]) + detected_format = tuple( + [int(x) for x in comment_stmt.comment.split('=')[1].split(":")]) if detected_format: self.format = detected_format @@ -435,7 +440,7 @@ class ExcellonParser(object): self.zeros = stmt.zeros self.statements.append(stmt) - elif line[:3] == 'M71' or line [:3] == 'M72': + elif line[:3] == 'M71' or line[:3] == 'M72': stmt = MeasuringModeStmt.from_excellon(line) self.units = stmt.units self.statements.append(stmt) @@ -481,17 +486,20 @@ class ExcellonParser(object): # T0 is used as END marker, just ignore if stmt.tool != 0: - # FIXME: for weird files with no tools defined, original calc from gerbv + # FIXME: for weird files with no tools defined, original calc + # from gerbv if stmt.tool not in self.tools: if self._settings().units == "inch": - diameter = (16 + 8 * stmt.tool) / 1000.0; + diameter = (16 + 8 * stmt.tool) / 1000.0 else: - diameter = metric((16 + 8 * stmt.tool) / 1000.0); + diameter = metric((16 + 8 * stmt.tool) / 1000.0) - tool = ExcellonTool(self._settings(), number=stmt.tool, diameter=diameter) + tool = ExcellonTool( + self._settings(), number=stmt.tool, diameter=diameter) self.tools[tool.number] = tool - # FIXME: need to add this tool definition inside header to make sure it is properly written + # FIXME: need to add this tool definition inside header to + # make sure it is properly written for i, s in enumerate(self.statements): if isinstance(s, ToolSelectionStmt) or isinstance(s, ExcellonTool): self.statements.insert(i, tool) @@ -575,7 +583,7 @@ def detect_excellon_format(data=None, filename=None): and 'FILE_FORMAT' in stmt.comment] detected_format = (tuple([int(val) for val in - format_comment[0].split('=')[1].split(':')]) + format_comment[0].split('=')[1].split(':')]) if len(format_comment) == 1 else None) detected_zeros = zero_statements[0] if len(zero_statements) == 1 else None @@ -637,5 +645,5 @@ def _layer_size_score(size, hole_count, hole_area): board_area = size[0] * size[1] hole_percentage = hole_area / board_area hole_score = (hole_percentage - 0.25) ** 2 - size_score = (board_area - 8) **2 + size_score = (board_area - 8) ** 2 return hole_score * size_score diff --git a/gerber/excellon_statements.py b/gerber/excellon_statements.py index 2be7a05..971a81d 100644 --- a/gerber/excellon_statements.py +++ b/gerber/excellon_statements.py @@ -55,6 +55,7 @@ class ExcellonStatement(object): def to_excellon(self, settings=None): raise NotImplementedError('to_excellon must be implemented in a ' 'subclass') + def to_inch(self): self.units = 'inch' @@ -67,6 +68,7 @@ class ExcellonStatement(object): def __eq__(self, other): return self.__dict__ == other.__dict__ + class ExcellonTool(ExcellonStatement): """ Excellon Tool class @@ -210,7 +212,6 @@ class ExcellonTool(ExcellonStatement): if self.diameter is not None: self.diameter = inch(self.diameter) - def to_metric(self): if self.settings.units != 'metric': self.settings.units = 'metric' @@ -573,6 +574,7 @@ class EndOfProgramStmt(ExcellonStatement): if self.y is not None: self.y += y_offset + class UnitStmt(ExcellonStatement): @classmethod @@ -598,6 +600,7 @@ class UnitStmt(ExcellonStatement): def to_metric(self): self.units = 'metric' + class IncrementalModeStmt(ExcellonStatement): @classmethod @@ -689,6 +692,7 @@ class MeasuringModeStmt(ExcellonStatement): def to_metric(self): self.units = 'metric' + class RouteModeStmt(ExcellonStatement): def __init__(self, **kwargs): diff --git a/gerber/gerber_statements.py b/gerber/gerber_statements.py index 9931acf..74b3e54 100644 --- a/gerber/gerber_statements.py +++ b/gerber/gerber_statements.py @@ -43,6 +43,7 @@ class Statement(object): type : string String identifying the statement type. """ + def __init__(self, stype, units='inch'): self.type = stype self.units = units @@ -84,6 +85,7 @@ class ParamStmt(Statement): param : string Parameter type code """ + def __init__(self, param): Statement.__init__(self, "PARAM") self.param = param @@ -157,8 +159,6 @@ class FSParamStmt(ParamStmt): return '%FS{0}{1}X{2}Y{3}*%'.format(zero_suppression, notation, fmt, fmt) - - def __str__(self): return ('' % (self.format[0], self.format[1], self.zero_suppression, self.notation)) @@ -293,19 +293,22 @@ class ADParamStmt(ParamStmt): self.d = d self.shape = shape if modifiers: - self.modifiers = [tuple([float(x) for x in m.split("X") if len(x)]) for m in modifiers.split(",") if len(m)] + self.modifiers = [tuple([float(x) for x in m.split("X") if len(x)]) + for m in modifiers.split(",") if len(m)] else: self.modifiers = [tuple()] def to_inch(self): if self.units == 'metric': - self.units = 'inch' - self.modifiers = [tuple([inch(x) for x in modifier]) for modifier in self.modifiers] + self.units = 'inch' + self.modifiers = [tuple([inch(x) for x in modifier]) + for modifier in self.modifiers] def to_metric(self): if self.units == 'inch': - self.units = 'metric' - self.modifiers = [tuple([metric(x) for x in modifier]) for modifier in self.modifiers] + self.units = 'metric' + self.modifiers = [tuple([metric(x) for x in modifier]) + for modifier in self.modifiers] def to_gerber(self, settings=None): if any(self.modifiers): @@ -382,12 +385,15 @@ class AMParamStmt(ParamStmt): self.primitives.append(AMOutlinePrimitive.from_gerber(primitive)) elif primitive[0] == '5': self.primitives.append(AMPolygonPrimitive.from_gerber(primitive)) - elif primitive[0] =='6': + elif primitive[0] == '6': self.primitives.append(AMMoirePrimitive.from_gerber(primitive)) elif primitive[0] == '7': - self.primitives.append(AMThermalPrimitive.from_gerber(primitive)) + self.primitives.append( + AMThermalPrimitive.from_gerber(primitive)) else: - self.primitives.append(AMUnsupportPrimitive.from_gerber(primitive)) + self.primitives.append( + AMUnsupportPrimitive.from_gerber(primitive)) + return self def to_inch(self): if self.units == 'metric': @@ -824,13 +830,17 @@ class CoordStmt(Statement): op = stmt_dict.get('op') if x is not None: - x = parse_gerber_value(stmt_dict.get('x'), settings.format, settings.zero_suppression) + x = parse_gerber_value(stmt_dict.get('x'), settings.format, + settings.zero_suppression) if y is not None: - y = parse_gerber_value(stmt_dict.get('y'), settings.format, settings.zero_suppression) + y = parse_gerber_value(stmt_dict.get('y'), settings.format, + settings.zero_suppression) if i is not None: - i = parse_gerber_value(stmt_dict.get('i'), settings.format, settings.zero_suppression) + i = parse_gerber_value(stmt_dict.get('i'), settings.format, + settings.zero_suppression) if j is not None: - j = parse_gerber_value(stmt_dict.get('j'), settings.format, settings.zero_suppression) + j = parse_gerber_value(stmt_dict.get('j'), settings.format, + settings.zero_suppression) return cls(function, x, y, i, j, op, settings) def __init__(self, function, x, y, i, j, op, settings): @@ -878,13 +888,17 @@ class CoordStmt(Statement): if self.function: ret += self.function if self.x is not None: - ret += 'X{0}'.format(write_gerber_value(self.x, settings.format, settings.zero_suppression)) + ret += 'X{0}'.format(write_gerber_value(self.x, settings.format, + settings.zero_suppression)) if self.y is not None: - ret += 'Y{0}'.format(write_gerber_value(self.y, settings.format, settings.zero_suppression)) + ret += 'Y{0}'.format(write_gerber_value(self.y, settings.format, + settings.zero_suppression)) if self.i is not None: - ret += 'I{0}'.format(write_gerber_value(self.i, settings.format, settings.zero_suppression)) + ret += 'I{0}'.format(write_gerber_value(self.i, settings.format, + settings.zero_suppression)) if self.j is not None: - ret += 'J{0}'.format(write_gerber_value(self.j, settings.format, settings.zero_suppression)) + ret += 'J{0}'.format(write_gerber_value(self.j, settings.format, + settings.zero_suppression)) if self.op: ret += self.op return ret + '*' @@ -956,6 +970,7 @@ class CoordStmt(Statement): class ApertureStmt(Statement): """ Aperture Statement """ + def __init__(self, d, deprecated=None): Statement.__init__(self, "APERTURE") self.d = int(d) @@ -989,6 +1004,7 @@ class CommentStmt(Statement): class EofStmt(Statement): """ EOF Statement """ + def __init__(self): Statement.__init__(self, "EOF") @@ -1043,6 +1059,7 @@ class RegionModeStmt(Statement): class UnknownStmt(Statement): """ Unknown Statement """ + def __init__(self, line): Statement.__init__(self, "UNKNOWN") self.line = line @@ -1052,4 +1069,3 @@ class UnknownStmt(Statement): def __str__(self): return '' % self.line - diff --git a/gerber/layers.py b/gerber/layers.py index 2b73893..29e452b 100644 --- a/gerber/layers.py +++ b/gerber/layers.py @@ -95,7 +95,8 @@ def sort_layers(layers): 'bottompaste', 'drill', ] output = [] drill_layers = [layer for layer in layers if layer.layer_class == 'drill'] - internal_layers = list(sorted([layer for layer in layers if layer.layer_class == 'internal'])) + internal_layers = list(sorted([layer for layer in layers + if layer.layer_class == 'internal'])) for layer_class in layer_order: if layer_class == 'internal': @@ -151,6 +152,8 @@ class PCBLayer(object): else: return None + def __repr__(self): + return ''.format(self.layer_class) class DrillLayer(PCBLayer): @classmethod @@ -163,6 +166,7 @@ class DrillLayer(PCBLayer): class InternalLayer(PCBLayer): + @classmethod def from_gerber(cls, camfile): filename = camfile.filename @@ -208,6 +212,7 @@ class InternalLayer(PCBLayer): class LayerSet(object): + def __init__(self, name, layers, **kwargs): super(LayerSet, self).__init__(**kwargs) self.name = name diff --git a/gerber/operations.py b/gerber/operations.py index 4eb10e5..d06876e 100644 --- a/gerber/operations.py +++ b/gerber/operations.py @@ -22,6 +22,7 @@ CAM File Operations """ import copy + def to_inch(cam_file): """ Convert Gerber or Excellon file units to imperial @@ -39,6 +40,7 @@ def to_inch(cam_file): cam_file.to_inch() return cam_file + def to_metric(cam_file): """ Convert Gerber or Excellon file units to metric @@ -56,6 +58,7 @@ def to_metric(cam_file): cam_file.to_metric() return cam_file + def offset(cam_file, x_offset, y_offset): """ Offset a Cam file by a specified amount in the X and Y directions. @@ -79,6 +82,7 @@ def offset(cam_file, x_offset, y_offset): cam_file.offset(x_offset, y_offset) return cam_file + def scale(cam_file, x_scale, y_scale): """ Scale a Cam file by a specified amount in the X and Y directions. @@ -101,6 +105,7 @@ def scale(cam_file, x_scale, y_scale): # TODO pass + def rotate(cam_file, angle): """ Rotate a Cam file a specified amount about the origin. diff --git a/gerber/pcb.py b/gerber/pcb.py index 0518dd4..92a1f28 100644 --- a/gerber/pcb.py +++ b/gerber/pcb.py @@ -63,13 +63,15 @@ class PCB(object): @property def top_layers(self): - board_layers = [l for l in reversed(self.layers) if l.layer_class in ('topsilk', 'topmask', 'top')] + board_layers = [l for l in reversed(self.layers) if l.layer_class in + ('topsilk', 'topmask', 'top')] drill_layers = [l for l in self.drill_layers if 'top' in l.layers] return board_layers + drill_layers @property def bottom_layers(self): - board_layers = [l for l in self.layers if l.layer_class in ('bottomsilk', 'bottommask', 'bottom')] + board_layers = [l for l in self.layers if l.layer_class in + ('bottomsilk', 'bottommask', 'bottom')] drill_layers = [l for l in self.drill_layers if 'bottom' in l.layers] return board_layers + drill_layers @@ -77,11 +79,17 @@ class PCB(object): def drill_layers(self): return [l for l in self.layers if l.layer_class == 'drill'] + @property + def copper_layers(self): + return [layer for layer in self.layers if layer.layer_class in + ('top', 'bottom', 'internal')] + @property def layer_count(self): """ Number of *COPPER* layers """ - return len([l for l in self.layers if l.layer_class in ('top', 'bottom', 'internal')]) + return len([l for l in self.layers if l.layer_class in + ('top', 'bottom', 'internal')]) @property def board_bounds(self): @@ -91,4 +99,3 @@ class PCB(object): for layer in self.layers: if layer.layer_class == 'top': return layer.bounds - diff --git a/gerber/primitives.py b/gerber/primitives.py index 0ac12af..24e13a2 100644 --- a/gerber/primitives.py +++ b/gerber/primitives.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -# copyright 2014 Hamilton Kibbe +# copyright 2016 Hamilton Kibbe # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,10 +14,13 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import math -from operator import add, sub -from .utils import validate_coordinates, inch, metric + +import math +from operator import add +from itertools import combinations + +from .utils import validate_coordinates, inch, metric, convex_hull class Primitive(object): @@ -35,17 +38,65 @@ class Primitive(object): rotation : float Rotation of a primitive about its origin in degrees. Positive rotation is counter-clockwise as viewed from the board top. - """ - def __init__(self, level_polarity='dark', rotation=0, units=None, id=None, statement_id=None): - self.level_polarity = level_polarity - self.rotation = rotation - self.units = units - self._to_convert = list() - self.id = id - self.statement_id = statement_id + units : string + Units in which primitive was defined. 'inch' or 'metric' + + net_name : string + Name of the electrical net the primitive belongs to + """ + + def __init__(self, level_polarity='dark', rotation=0, units=None, net_name=None): + self.level_polarity = level_polarity + self.net_name = net_name + self._to_convert = list() + self._memoized = list() + self._units = units + self._rotation = rotation + self._cos_theta = math.cos(math.radians(rotation)) + self._sin_theta = math.sin(math.radians(rotation)) + self._bounding_box = None + self._vertices = None + self._segments = None + + def __eq__(self, other): + return self.__dict__ == other.__dict__ + + @property + def units(self): + return self._units + + @units.setter + def units(self, value): + self._changed() + self._units = value + + @property + def rotation(self): + return self._rotation + + @rotation.setter + def rotation(self, value): + self._changed() + self._rotation = value + self._cos_theta = math.cos(math.radians(value)) + self._sin_theta = math.sin(math.radians(value)) + + @property + def vertices(self): + return None + + @property + def segments(self): + if self._segments is None: + if self.vertices is not None and len(self.vertices): + self._segments = [segment for segment in + combinations(self.vertices, 2)] + return self._segments + + @property def bounding_box(self): - """ Calculate bounding box + """ Calculate axis-aligned bounding box will be helpful for sweep & prune during DRC clearance checks. @@ -55,9 +106,12 @@ class Primitive(object): 'implemented in subclass') def to_inch(self): + """ Convert primitive units to inches. + """ if self.units == 'metric': self.units = 'inch' - for attr, value in [(attr, getattr(self, attr)) for attr in self._to_convert]: + for attr, value in [(attr, getattr(self, attr)) + for attr in self._to_convert]: if hasattr(value, 'to_inch'): value.to_inch() else: @@ -67,18 +121,22 @@ class Primitive(object): for v in value: v.to_inch() elif isinstance(value[0], tuple): - setattr(self, attr, [tuple(map(inch, point)) for point in value]) + setattr(self, attr, + [tuple(map(inch, point)) + for point in value]) else: setattr(self, attr, tuple(map(inch, value))) except: if value is not None: setattr(self, attr, inch(value)) - def to_metric(self): + """ Convert primitive units to metric. + """ if self.units == 'inch': self.units = 'metric' - for attr, value in [(attr, getattr(self, attr)) for attr in self._to_convert]: + for attr, value in [(attr, getattr(self, attr)) + for attr in self._to_convert]: if hasattr(value, 'to_metric'): value.to_metric() else: @@ -88,7 +146,9 @@ class Primitive(object): for v in value: v.to_metric() elif isinstance(value[0], tuple): - setattr(self, attr, [tuple(map(metric, point)) for point in value]) + setattr(self, attr, + [tuple(map(metric, point)) + for point in value]) else: setattr(self, attr, tuple(map(metric, value))) except: @@ -96,120 +156,173 @@ class Primitive(object): setattr(self, attr, metric(value)) def offset(self, x_offset=0, y_offset=0): - pass + """ Move the primitive by the specified x and y offset amount. - def __eq__(self, other): - return self.__dict__ == other.__dict__ + values are specified in the primitive's native units + """ + if hasattr(self, 'position'): + self._changed() + self.position = tuple([coord + offset for coord, offset + in zip(self.position, + (x_offset, y_offset))]) + + + def _changed(self): + """ Clear memoized properties. + + Forces a recalculation next time any memoized propery is queried. + This must be called from a subclass every time a parameter that affects + a memoized property is changed. The easiest way to do this is to call + _changed() from property.setter methods. + """ + self._bounding_box = None + self._vertices = None + self._segments = None + for attr in self._memoized: + setattr(self, attr, None) class Line(Primitive): """ """ + def __init__(self, start, end, aperture, **kwargs): super(Line, self).__init__(**kwargs) - self.start = start - self.end = end + self._start = start + self._end = end self.aperture = aperture self._to_convert = ['start', 'end', 'aperture'] + @property + def start(self): + return self._start + + @start.setter + def start(self, value): + self._changed() + self._start = value + + @property + def end(self): + return self._end + + @end.setter + def end(self, value): + self._changed() + self._end = value + + @property def angle(self): - delta_x, delta_y = tuple(map(sub, self.end, self.start)) + delta_x, delta_y = tuple( + [end - start for end, start in zip(self.end, self.start)]) angle = math.atan2(delta_y, delta_x) return angle @property def bounding_box(self): - if isinstance(self.aperture, Circle): - width_2 = self.aperture.radius - height_2 = width_2 - else: - width_2 = self.aperture.width / 2. - height_2 = self.aperture.height / 2. - min_x = min(self.start[0], self.end[0]) - width_2 - max_x = max(self.start[0], self.end[0]) + width_2 - min_y = min(self.start[1], self.end[1]) - height_2 - max_y = max(self.start[1], self.end[1]) + height_2 - return ((min_x, max_x), (min_y, max_y)) + if self._bounding_box is None: + if isinstance(self.aperture, Circle): + width_2 = self.aperture.radius + height_2 = width_2 + else: + width_2 = self.aperture.width / 2. + height_2 = self.aperture.height / 2. + min_x = min(self.start[0], self.end[0]) - width_2 + max_x = max(self.start[0], self.end[0]) + width_2 + min_y = min(self.start[1], self.end[1]) - height_2 + max_y = max(self.start[1], self.end[1]) + height_2 + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box + @property def vertices(self): - if not isinstance(self.aperture, Rectangle): - return None - else: - start = self.start - end = self.end - width = self.aperture.width - height = self.aperture.height + if self._vertices is None: + if isinstance(self.aperture, Rectangle): + start = self.start + end = self.end + width = self.aperture.width + height = self.aperture.height - # Find all the corners of the start and end position - start_ll = (start[0] - (width / 2.), - start[1] - (height / 2.)) - start_lr = (start[0] + (width / 2.), - start[1] - (height / 2.)) - start_ul = (start[0] - (width / 2.), - start[1] + (height / 2.)) - start_ur = (start[0] + (width / 2.), - start[1] + (height / 2.)) - end_ll = (end[0] - (width / 2.), - end[1] - (height / 2.)) - end_lr = (end[0] + (width / 2.), - end[1] - (height / 2.)) - end_ul = (end[0] - (width / 2.), - end[1] + (height / 2.)) - end_ur = (end[0] + (width / 2.), - end[1] + (height / 2.)) - - if end[0] == start[0] and end[1] == start[1]: - return (start_ll, start_lr, start_ur, start_ul) - elif end[0] == start[0] and end[1] > start[1]: - return (start_ll, start_lr, end_ur, end_ul) - elif end[0] > start[0] and end[1] > start[1]: - return (start_ll, start_lr, end_lr, end_ur, end_ul, start_ul) - elif end[0] > start[0] and end[1] == start[1]: - return (start_ll, end_lr, end_ur, start_ul) - elif end[0] > start[0] and end[1] < start[1]: - return (start_ll, end_ll, end_lr, end_ur, start_ur, start_ul) - elif end[0] == start[0] and end[1] < start[1]: - return (end_ll, end_lr, start_ur, start_ul) - elif end[0] < start[0] and end[1] < start[1]: - return (end_ll, end_lr, start_lr, start_ur, start_ul, end_ul) - elif end[0] < start[0] and end[1] == start[1]: - return (end_ll, start_lr, start_ur, end_ul) - elif end[0] < start[0] and end[1] > start[1]: - return (start_ll, start_lr, start_ur, end_ur, end_ul, end_ll) + # Find all the corners of the start and end position + start_ll = (start[0] - (width / 2.), start[1] - (height / 2.)) + start_lr = (start[0] + (width / 2.), start[1] - (height / 2.)) + start_ul = (start[0] - (width / 2.), start[1] + (height / 2.)) + start_ur = (start[0] + (width / 2.), start[1] + (height / 2.)) + end_ll = (end[0] - (width / 2.), end[1] - (height / 2.)) + end_lr = (end[0] + (width / 2.), end[1] - (height / 2.)) + end_ul = (end[0] - (width / 2.), end[1] + (height / 2.)) + end_ur = (end[0] + (width / 2.), end[1] + (height / 2.)) + # The line is defined by the convex hull of the points + self._vertices = convex_hull((start_ll, start_lr, start_ul, start_ur, end_ll, end_lr, end_ul, end_ur)) + return self._vertices def offset(self, x_offset=0, y_offset=0): - self.start = tuple(map(add, self.start, (x_offset, y_offset))) - self.end = tuple(map(add, self.end, (x_offset, y_offset))) + self._changed() + self.start = tuple([coord + offset for coord, offset + in zip(self.start, (x_offset, y_offset))]) + self.end = tuple([coord + offset for coord, offset + in zip(self.end, (x_offset, y_offset))]) class Arc(Primitive): """ """ + def __init__(self, start, end, center, direction, aperture, **kwargs): super(Arc, self).__init__(**kwargs) - self.start = start - self.end = end - self.center = center + self._start = start + self._end = end + self._center = center self.direction = direction self.aperture = aperture self._to_convert = ['start', 'end', 'center', 'aperture'] + @property + def start(self): + return self._start + + @start.setter + def start(self, value): + self._changed() + self._start = value + + @property + def end(self): + return self._end + + @end.setter + def end(self, value): + self._changed() + self._end = value + + @property + def center(self): + return self._center + + @center.setter + def center(self, value): + self._changed() + self._center = value + @property def radius(self): - dy, dx = map(sub, self.start, self.center) - return math.sqrt(dy**2 + dx**2) + dy, dx = tuple([start - center for start, center + in zip(self.start, self.center)]) + return math.sqrt(dy ** 2 + dx ** 2) @property def start_angle(self): - dy, dx = map(sub, self.start, self.center) + dy, dx = tuple([start - center for start, center + in zip(self.start, self.center)]) return math.atan2(dx, dy) @property def end_angle(self): - dy, dx = map(sub, self.end, self.center) + dy, dx = tuple([end - center for end, center + in zip(self.end, self.center)]) return math.atan2(dx, dy) @property @@ -225,44 +338,51 @@ class Arc(Primitive): @property def bounding_box(self): - two_pi = 2 * math.pi - theta0 = (self.start_angle + two_pi) % two_pi - theta1 = (self.end_angle + two_pi) % two_pi - points = [self.start, self.end] - if self.direction == 'counterclockwise': - # Passes through 0 degrees - if theta0 > theta1: - points.append((self.center[0] + self.radius, self.center[1])) - # Passes through 90 degrees - if theta0 <= math.pi / 2. and (theta1 >= math.pi / 2. or theta1 < theta0): - points.append((self.center[0], self.center[1] + self.radius)) - # Passes through 180 degrees - if theta0 <= math.pi and (theta1 >= math.pi or theta1 < theta0): - points.append((self.center[0] - self.radius, self.center[1])) - # Passes through 270 degrees - if theta0 <= math.pi * 1.5 and (theta1 >= math.pi * 1.5 or theta1 < theta0): - points.append((self.center[0], self.center[1] - self.radius )) - else: - # Passes through 0 degrees - if theta1 > theta0: - points.append((self.center[0] + self.radius, self.center[1])) - # Passes through 90 degrees - if theta1 <= math.pi / 2. and (theta0 >= math.pi / 2. or theta0 < theta1): - points.append((self.center[0], self.center[1] + self.radius)) - # Passes through 180 degrees - if theta1 <= math.pi and (theta0 >= math.pi or theta0 < theta1): - points.append((self.center[0] - self.radius, self.center[1])) - # Passes through 270 degrees - if theta1 <= math.pi * 1.5 and (theta0 >= math.pi * 1.5 or theta0 < theta1): - points.append((self.center[0], self.center[1] - self.radius )) - x, y = zip(*points) - min_x = min(x) - self.aperture.radius - max_x = max(x) + self.aperture.radius - min_y = min(y) - self.aperture.radius - max_y = max(y) + self.aperture.radius - return ((min_x, max_x), (min_y, max_y)) + if self._bounding_box is None: + two_pi = 2 * math.pi + theta0 = (self.start_angle + two_pi) % two_pi + theta1 = (self.end_angle + two_pi) % two_pi + points = [self.start, self.end] + if self.direction == 'counterclockwise': + # Passes through 0 degrees + if theta0 > theta1: + points.append((self.center[0] + self.radius, self.center[1])) + # Passes through 90 degrees + if theta0 <= math.pi / \ + 2. and (theta1 >= math.pi / 2. or theta1 < theta0): + points.append((self.center[0], self.center[1] + self.radius)) + # Passes through 180 degrees + if theta0 <= math.pi and (theta1 >= math.pi or theta1 < theta0): + points.append((self.center[0] - self.radius, self.center[1])) + # Passes through 270 degrees + if theta0 <= math.pi * \ + 1.5 and (theta1 >= math.pi * 1.5 or theta1 < theta0): + points.append((self.center[0], self.center[1] - self.radius)) + else: + # Passes through 0 degrees + if theta1 > theta0: + points.append((self.center[0] + self.radius, self.center[1])) + # Passes through 90 degrees + if theta1 <= math.pi / \ + 2. and (theta0 >= math.pi / 2. or theta0 < theta1): + points.append((self.center[0], self.center[1] + self.radius)) + # Passes through 180 degrees + if theta1 <= math.pi and (theta0 >= math.pi or theta0 < theta1): + points.append((self.center[0] - self.radius, self.center[1])) + # Passes through 270 degrees + if theta1 <= math.pi * \ + 1.5 and (theta0 >= math.pi * 1.5 or theta0 < theta1): + points.append((self.center[0], self.center[1] - self.radius)) + x, y = zip(*points) + min_x = min(x) - self.aperture.radius + max_x = max(x) + self.aperture.radius + min_y = min(y) - self.aperture.radius + max_y = max(y) + self.aperture.radius + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box def offset(self, x_offset=0, y_offset=0): + self._changed() self.start = tuple(map(add, self.start, (x_offset, y_offset))) self.end = tuple(map(add, self.end, (x_offset, y_offset))) self.center = tuple(map(add, self.center, (x_offset, y_offset))) @@ -271,256 +391,465 @@ class Arc(Primitive): class Circle(Primitive): """ """ + def __init__(self, position, diameter, **kwargs): super(Circle, self).__init__(**kwargs) validate_coordinates(position) - self.position = position - self.diameter = diameter + self._position = position + self._diameter = diameter self._to_convert = ['position', 'diameter'] + @property + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value + + @property + def diameter(self): + return self._diameter + + @diameter.setter + def diameter(self, value): + self._changed() + self._diameter = value + @property def radius(self): return self.diameter / 2. @property def bounding_box(self): - min_x = self.position[0] - self.radius - max_x = self.position[0] + self.radius - min_y = self.position[1] - self.radius - max_y = self.position[1] + self.radius - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + min_x = self.position[0] - self.radius + max_x = self.position[0] + self.radius + min_y = self.position[1] - self.radius + max_y = self.position[1] + self.radius + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box class Ellipse(Primitive): """ """ + def __init__(self, position, width, height, **kwargs): super(Ellipse, self).__init__(**kwargs) validate_coordinates(position) - self.position = position - self.width = width - self.height = height + self._position = position + self._width = width + self._height = height self._to_convert = ['position', 'width', 'height'] + @property + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value + + @property + def width(self): + return self._width + + @width.setter + def width(self, value): + self._changed() + self._width = value + + @property + def height(self): + return self._height + + @height.setter + def height(self, value): + self._changed() + self._height = value @property def bounding_box(self): - min_x = self.position[0] - (self._abs_width / 2.0) - max_x = self.position[0] + (self._abs_width / 2.0) - min_y = self.position[1] - (self._abs_height / 2.0) - max_y = self.position[1] + (self._abs_height / 2.0) - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + min_x = self.position[0] - (self.axis_aligned_width / 2.0) + max_x = self.position[0] + (self.axis_aligned_width / 2.0) + min_y = self.position[1] - (self.axis_aligned_height / 2.0) + max_y = self.position[1] + (self.axis_aligned_height / 2.0) + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box @property - def _abs_width(self): + def axis_aligned_width(self): ux = (self.width / 2.) * math.cos(math.radians(self.rotation)) - vx = (self.height / 2.) * math.cos(math.radians(self.rotation) + (math.pi / 2.)) + vx = (self.height / 2.) * \ + math.cos(math.radians(self.rotation) + (math.pi / 2.)) return 2 * math.sqrt((ux * ux) + (vx * vx)) - + @property - def _abs_height(self): + def axis_aligned_height(self): uy = (self.width / 2.) * math.sin(math.radians(self.rotation)) - vy = (self.height / 2.) * math.sin(math.radians(self.rotation) + (math.pi / 2.)) + vy = (self.height / 2.) * \ + math.sin(math.radians(self.rotation) + (math.pi / 2.)) return 2 * math.sqrt((uy * uy) + (vy * vy)) class Rectangle(Primitive): """ """ + def __init__(self, position, width, height, **kwargs): super(Rectangle, self).__init__(**kwargs) validate_coordinates(position) - self.position = position - self.width = width - self.height = height + self._position = position + self._width = width + self._height = height self._to_convert = ['position', 'width', 'height'] - + self._lower_left = None + self._upper_right = None + + @property + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value + + @property + def width(self): + return self._width + + @width.setter + def width(self, value): + self._changed() + self._width = value + + @property + def height(self): + return self._height + + @height.setter + def height(self, value): + self._changed() + self._height = value @property def lower_left(self): - return (self.position[0] - (self._abs_width / 2.), - self.position[1] - (self._abs_height / 2.)) - - @property - def upper_right(self): - return (self.position[0] + (self._abs_width / 2.), - self.position[1] + (self._abs_height / 2.)) + return (self.position[0] - (self.axis_aligned_width / 2.), + self.position[1] - (self.axis_aligned_height / 2.)) @property def bounding_box(self): - min_x = self.lower_left[0] - max_x = self.upper_right[0] - min_y = self.lower_left[1] - max_y = self.upper_right[1] - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + ll = (self.position[0] - (self.axis_aligned_width / 2.), + self.position[1] - (self.axis_aligned_height / 2.)) + ur = (self.position[0] + (self.axis_aligned_width / 2.), + self.position[1] + (self.axis_aligned_height / 2.)) + self._bounding_box = ((ll[0], ur[0]), (ll[1], ur[1])) + return self._bounding_box @property - def _abs_width(self): - return (math.cos(math.radians(self.rotation)) * self.width + - math.sin(math.radians(self.rotation)) * self.height) + def vertices(self): + if self._vertices is None: + delta_w = self.width / 2. + delta_h = self.height / 2. + ll = ((self.position[0] - delta_w), (self.position[1] - delta_h)) + ul = ((self.position[0] - delta_w), (self.position[1] + delta_h)) + ur = ((self.position[0] + delta_w), (self.position[1] + delta_h)) + lr = ((self.position[0] + delta_w), (self.position[1] - delta_h)) + self._vertices = [((x * self._cos_theta - y * self._sin_theta), + (x * self._sin_theta + y * self._cos_theta)) + for x, y in [ll, ul, ur, lr]] + return self._vertices + @property - def _abs_height(self): - return (math.cos(math.radians(self.rotation)) * self.height + - math.sin(math.radians(self.rotation)) * self.width) - + def axis_aligned_width(self): + return (self._cos_theta * self.width + self._sin_theta * self.height) + + @property + def axis_aligned_height(self): + return (self._cos_theta * self.height + self._sin_theta * self.width) + class Diamond(Primitive): """ """ + def __init__(self, position, width, height, **kwargs): super(Diamond, self).__init__(**kwargs) validate_coordinates(position) - self.position = position - self.width = width - self.height = height + self._position = position + self._width = width + self._height = height self._to_convert = ['position', 'width', 'height'] @property - def lower_left(self): - return (self.position[0] - (self._abs_width / 2.), - self.position[1] - (self._abs_height / 2.)) + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value @property - def upper_right(self): - return (self.position[0] + (self._abs_width / 2.), - self.position[1] + (self._abs_height / 2.)) + def width(self): + return self._width + + @width.setter + def width(self, value): + self._changed() + self._width = value + + @property + def height(self): + return self._height + + @height.setter + def height(self, value): + self._changed() + self._height = value @property def bounding_box(self): - min_x = self.lower_left[0] - max_x = self.upper_right[0] - min_y = self.lower_left[1] - max_y = self.upper_right[1] - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + ll = (self.position[0] - (self.axis_aligned_width / 2.), + self.position[1] - (self.axis_aligned_height / 2.)) + ur = (self.position[0] + (self.axis_aligned_width / 2.), + self.position[1] + (self.axis_aligned_height / 2.)) + self._bounding_box = ((ll[0], ur[0]), (ll[1], ur[1])) + return self._bounding_box @property - def _abs_width(self): - return (math.cos(math.radians(self.rotation)) * self.width + - math.sin(math.radians(self.rotation)) * self.height) + def vertices(self): + if self._vertices is None: + delta_w = self.width / 2. + delta_h = self.height / 2. + top = (self.position[0], (self.position[1] + delta_h)) + right = ((self.position[0] + delta_w), self.position[1]) + bottom = (self.position[0], (self.position[1] - delta_h)) + left = ((self.position[0] - delta_w), self.position[1]) + self._vertices = [(((x * self._cos_theta) - (y * self._sin_theta)), + ((x * self._sin_theta) + (y * self._cos_theta))) + for x, y in [top, right, bottom, left]] + return self._vertices + @property - def _abs_height(self): - return (math.cos(math.radians(self.rotation)) * self.height + - math.sin(math.radians(self.rotation)) * self.width) + def axis_aligned_width(self): + return (self._cos_theta * self.width + self._sin_theta * self.height) + + @property + def axis_aligned_height(self): + return (self._cos_theta * self.height + self._sin_theta * self.width) class ChamferRectangle(Primitive): """ """ + def __init__(self, position, width, height, chamfer, corners, **kwargs): super(ChamferRectangle, self).__init__(**kwargs) validate_coordinates(position) - self.position = position - self.width = width - self.height = height - self.chamfer = chamfer - self.corners = corners + self._position = position + self._width = width + self._height = height + self._chamfer = chamfer + self._corners = corners self._to_convert = ['position', 'width', 'height', 'chamfer'] @property - def lower_left(self): - return (self.position[0] - (self._abs_width / 2.), - self.position[1] - (self._abs_height / 2.)) + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value @property - def upper_right(self): - return (self.position[0] + (self._abs_width / 2.), - self.position[1] + (self._abs_height / 2.)) + def width(self): + return self._width + + @width.setter + def width(self, value): + self._changed() + self._width = value + + @property + def height(self): + return self._height + + @height.setter + def height(self, value): + self._changed() + self._height = value + + @property + def chamfer(self): + return self._chamfer + + @chamfer.setter + def chamfer(self, value): + self._changed() + self._chamfer = value + + @property + def corners(self): + return self._corners + + @corners.setter + def corners(self, value): + self._changed() + self._corners = value @property def bounding_box(self): - min_x = self.lower_left[0] - max_x = self.upper_right[0] - min_y = self.lower_left[1] - max_y = self.upper_right[1] - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + ll = (self.position[0] - (self.axis_aligned_width / 2.), + self.position[1] - (self.axis_aligned_height / 2.)) + ur = (self.position[0] + (self.axis_aligned_width / 2.), + self.position[1] + (self.axis_aligned_height / 2.)) + self._bounding_box = ((ll[0], ur[0]), (ll[1], ur[1])) + return self._bounding_box @property - def _abs_width(self): - return (math.cos(math.radians(self.rotation)) * self.width + - math.sin(math.radians(self.rotation)) * self.height) + def vertices(self): + # TODO + return self._vertices + @property - def _abs_height(self): - return (math.cos(math.radians(self.rotation)) * self.height + - math.sin(math.radians(self.rotation)) * self.width) + def axis_aligned_width(self): + return (self._cos_theta * self.width + + self._sin_theta * self.height) + + @property + def axis_aligned_height(self): + return (self._cos_theta * self.height + + self._sin_theta * self.width) + class RoundRectangle(Primitive): """ """ + def __init__(self, position, width, height, radius, corners, **kwargs): super(RoundRectangle, self).__init__(**kwargs) validate_coordinates(position) - self.position = position - self.width = width - self.height = height - self.radius = radius - self.corners = corners + self._position = position + self._width = width + self._height = height + self._radius = radius + self._corners = corners self._to_convert = ['position', 'width', 'height', 'radius'] @property - def lower_left(self): - return (self.position[0] - (self._abs_width / 2.), - self.position[1] - (self._abs_height / 2.)) + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value @property - def upper_right(self): - return (self.position[0] + (self._abs_width / 2.), - self.position[1] + (self._abs_height / 2.)) + def width(self): + return self._width + + @width.setter + def width(self, value): + self._changed() + self._width = value + + @property + def height(self): + return self._height + + @height.setter + def height(self, value): + self._changed() + self._height = value + + @property + def radius(self): + return self._radius + + @radius.setter + def radius(self, value): + self._changed() + self._radius = value + + @property + def corners(self): + return self._corners + + @corners.setter + def corners(self, value): + self._changed() + self._corners = value @property def bounding_box(self): - min_x = self.lower_left[0] - max_x = self.upper_right[0] - min_y = self.lower_left[1] - max_y = self.upper_right[1] - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + ll = (self.position[0] - (self.axis_aligned_width / 2.), + self.position[1] - (self.axis_aligned_height / 2.)) + ur = (self.position[0] + (self.axis_aligned_width / 2.), + self.position[1] + (self.axis_aligned_height / 2.)) + self._bounding_box = ((ll[0], ur[0]), (ll[1], ur[1])) + return self._bounding_box @property - def _abs_width(self): - return (math.cos(math.radians(self.rotation)) * self.width + - math.sin(math.radians(self.rotation)) * self.height) + def axis_aligned_width(self): + return (self._cos_theta * self.width + + self._sin_theta * self.height) + @property - def _abs_height(self): - return (math.cos(math.radians(self.rotation)) * self.height + - math.sin(math.radians(self.rotation)) * self.width) + def axis_aligned_height(self): + return (self._cos_theta * self.height + + self._sin_theta * self.width) + class Obround(Primitive): """ """ + def __init__(self, position, width, height, **kwargs): super(Obround, self).__init__(**kwargs) validate_coordinates(position) - self.position = position - self.width = width - self.height = height + self._position = position + self._width = width + self._height = height self._to_convert = ['position', 'width', 'height'] @property - def lower_left(self): - return (self.position[0] - (self._abs_width / 2.), - self.position[1] - (self._abs_height / 2.)) + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value @property - def upper_right(self): - return (self.position[0] + (self._abs_width / 2.), - self.position[1] + (self._abs_height / 2.)) + def width(self): + return self._width + + @width.setter + def width(self, value): + self._changed() + self._width = value + + @property + def height(self): + return self._height + + @height.setter + def height(self, value): + self._changed() + self._height = value @property def orientation(self): @@ -528,68 +857,102 @@ class Obround(Primitive): @property def bounding_box(self): - min_x = self.lower_left[0] - max_x = self.upper_right[0] - min_y = self.lower_left[1] - max_y = self.upper_right[1] - return ((min_x, max_x), (min_y, max_y)) + if self._bounding_box is None: + ll = (self.position[0] - (self.axis_aligned_width / 2.), + self.position[1] - (self.axis_aligned_height / 2.)) + ur = (self.position[0] + (self.axis_aligned_width / 2.), + self.position[1] + (self.axis_aligned_height / 2.)) + self._bounding_box = ((ll[0], ur[0]), (ll[1], ur[1])) + return self._bounding_box @property def subshapes(self): if self.orientation == 'vertical': circle1 = Circle((self.position[0], self.position[1] + - (self.height-self.width) / 2.), self.width) + (self.height - self.width) / 2.), self.width) circle2 = Circle((self.position[0], self.position[1] - - (self.height-self.width) / 2.), self.width) + (self.height - self.width) / 2.), self.width) rect = Rectangle(self.position, self.width, - (self.height - self.width)) + (self.height - self.width)) else: - circle1 = Circle((self.position[0] - (self.height - self.width) / 2., + circle1 = Circle((self.position[0] + - (self.height - self.width) / 2., self.position[1]), self.height) - circle2 = Circle((self.position[0] + (self.height - self.width) / 2., + circle2 = Circle((self.position[0] + + (self.height - self.width) / 2., self.position[1]), self.height) rect = Rectangle(self.position, (self.width - self.height), - self.height) + self.height) return {'circle1': circle1, 'circle2': circle2, 'rectangle': rect} - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + @property + def axis_aligned_width(self): + return (self._cos_theta * self.width + + self._sin_theta * self.height) @property - def _abs_width(self): - return (math.cos(math.radians(self.rotation)) * self.width + - math.sin(math.radians(self.rotation)) * self.height) - @property - def _abs_height(self): - return (math.cos(math.radians(self.rotation)) * self.height + - math.sin(math.radians(self.rotation)) * self.width) + def axis_aligned_height(self): + return (self._cos_theta * self.height + + self._sin_theta * self.width) + class Polygon(Primitive): """ """ + def __init__(self, position, sides, radius, **kwargs): super(Polygon, self).__init__(**kwargs) validate_coordinates(position) - self.position = position + self._position = position self.sides = sides - self.radius = radius + self._radius = radius self._to_convert = ['position', 'radius'] @property - def bounding_box(self): - min_x = self.position[0] - self.radius - max_x = self.position[0] + self.radius - min_y = self.position[1] - self.radius - max_y = self.position[1] + self.radius - return ((min_x, max_x), (min_y, max_y)) + def position(self): + return self._position - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + @position.setter + def position(self, value): + self._changed() + self._position = value + + @property + def radius(self): + return self._radius + + @radius.setter + def radius(self, value): + self._changed() + self._radius = value + + @property + def bounding_box(self): + if self._bounding_box is None: + min_x = self.position[0] - self.radius + max_x = self.position[0] + self.radius + min_y = self.position[1] - self.radius + max_y = self.position[1] + self.radius + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box + + @property + def vertices(self): + if self._vertices is None: + theta = math.radians(360/self.sides) + vertices = [(self.position[0] + (math.cos(theta * side) * self.radius), + self.position[1] + (math.sin(theta * side) * self.radius)) + for side in range(self.sides)] + self._vertices = [(((x * self._cos_theta) - (y * self._sin_theta)), + ((x * self._sin_theta) + (y * self._cos_theta))) + for x, y in vertices] + return self._vertices class Region(Primitive): """ """ + def __init__(self, primitives, **kwargs): super(Region, self).__init__(**kwargs) self.primitives = primitives @@ -597,16 +960,19 @@ class Region(Primitive): @property def bounding_box(self): - xlims, ylims = zip(*[p.bounding_box for p in self.primitives]) - minx, maxx = zip(*xlims) - miny, maxy = zip(*ylims) - min_x = min(minx) - max_x = max(maxx) - min_y = min(miny) - max_y = max(maxy) - return ((min_x, max_x), (min_y, max_y)) + if self._bounding_box is None: + xlims, ylims = zip(*[p.bounding_box for p in self.primitives]) + minx, maxx = zip(*xlims) + miny, maxy = zip(*ylims) + min_x = min(minx) + max_x = max(maxx) + min_y = min(miny) + max_y = max(maxy) + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box def offset(self, x_offset=0, y_offset=0): + self._changed() for p in self.primitives: p.offset(x_offset, y_offset) @@ -614,6 +980,7 @@ class Region(Primitive): class RoundButterfly(Primitive): """ A circle with two diagonally-opposite quadrants removed """ + def __init__(self, position, diameter, **kwargs): super(RoundButterfly, self).__init__(**kwargs) validate_coordinates(position) @@ -627,19 +994,19 @@ class RoundButterfly(Primitive): @property def bounding_box(self): - min_x = self.position[0] - self.radius - max_x = self.position[0] + self.radius - min_y = self.position[1] - self.radius - max_y = self.position[1] + self.radius - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + min_x = self.position[0] - self.radius + max_x = self.position[0] + self.radius + min_y = self.position[1] - self.radius + max_y = self.position[1] + self.radius + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box class SquareButterfly(Primitive): """ A square with two diagonally-opposite quadrants removed """ + def __init__(self, position, side, **kwargs): super(SquareButterfly, self).__init__(**kwargs) validate_coordinates(position) @@ -647,31 +1014,33 @@ class SquareButterfly(Primitive): self.side = side self._to_convert = ['position', 'side'] - @property def bounding_box(self): - min_x = self.position[0] - (self.side / 2.) - max_x = self.position[0] + (self.side / 2.) - min_y = self.position[1] - (self.side / 2.) - max_y = self.position[1] + (self.side / 2.) - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + min_x = self.position[0] - (self.side / 2.) + max_x = self.position[0] + (self.side / 2.) + min_y = self.position[1] - (self.side / 2.) + max_y = self.position[1] + (self.side / 2.) + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box class Donut(Primitive): """ A Shape with an identical concentric shape removed from its center """ - def __init__(self, position, shape, inner_diameter, outer_diameter, **kwargs): + + def __init__(self, position, shape, inner_diameter, + outer_diameter, **kwargs): super(Donut, self).__init__(**kwargs) validate_coordinates(position) self.position = position if shape not in ('round', 'square', 'hexagon', 'octagon'): - raise ValueError('Valid shapes are round, square, hexagon or octagon') + raise ValueError( + 'Valid shapes are round, square, hexagon or octagon') self.shape = shape if inner_diameter >= outer_diameter: - raise ValueError('Outer diameter must be larger than inner diameter.') + raise ValueError( + 'Outer diameter must be larger than inner diameter.') self.inner_diameter = inner_diameter self.outer_diameter = outer_diameter if self.shape in ('round', 'square', 'octagon'): @@ -681,95 +1050,95 @@ class Donut(Primitive): # Hexagon self.width = 0.5 * math.sqrt(3.) * outer_diameter self.height = outer_diameter - self._to_convert = ['position', 'width', 'height', 'inner_diameter', 'outer_diameter'] - - @property - def lower_left(self): - return (self.position[0] - (self.width / 2.), - self.position[1] - (self.height / 2.)) - - @property - def upper_right(self): - return (self.position[0] + (self.width / 2.), - self.position[1] + (self.height / 2.)) + self._to_convert = ['position', 'width', + 'height', 'inner_diameter', 'outer_diameter'] @property def bounding_box(self): - min_x = self.lower_left[0] - max_x = self.upper_right[0] - min_y = self.lower_left[1] - max_y = self.upper_right[1] - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + ll = (self.position[0] - (self.width / 2.), + self.position[1] - (self.height / 2.)) + ur = (self.position[0] + (self.width / 2.), + self.position[1] + (self.height / 2.)) + self._bounding_box = ((ll[0], ur[0]), (ll[1], ur[1])) + return self._bounding_box class SquareRoundDonut(Primitive): """ A Square with a circular cutout in the center """ + def __init__(self, position, inner_diameter, outer_diameter, **kwargs): super(SquareRoundDonut, self).__init__(**kwargs) validate_coordinates(position) self.position = position if inner_diameter >= outer_diameter: - raise ValueError('Outer diameter must be larger than inner diameter.') + raise ValueError( + 'Outer diameter must be larger than inner diameter.') self.inner_diameter = inner_diameter self.outer_diameter = outer_diameter self._to_convert = ['position', 'inner_diameter', 'outer_diameter'] - @property - def lower_left(self): - return tuple([c - self.outer_diameter / 2. for c in self.position]) - - @property - def upper_right(self): - return tuple([c + self.outer_diameter / 2. for c in self.position]) - @property def bounding_box(self): - min_x = self.lower_left[0] - max_x = self.upper_right[0] - min_y = self.lower_left[1] - max_y = self.upper_right[1] - return ((min_x, max_x), (min_y, max_y)) - - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) + if self._bounding_box is None: + ll = tuple([c - self.outer_diameter / 2. for c in self.position]) + ur = tuple([c + self.outer_diameter / 2. for c in self.position]) + self._bounding_box = ((ll[0], ur[0]), (ll[1], ur[1])) + return self._bounding_box class Drill(Primitive): """ A drill hole """ + def __init__(self, position, diameter, **kwargs): super(Drill, self).__init__('dark', **kwargs) validate_coordinates(position) - self.position = position - self.diameter = diameter + self._position = position + self._diameter = diameter self._to_convert = ['position', 'diameter'] + @property + def position(self): + return self._position + + @position.setter + def position(self, value): + self._changed() + self._position = value + + @property + def diameter(self): + return self._diameter + + @diameter.setter + def diameter(self, value): + self._changed() + self._diameter = value + @property def radius(self): return self.diameter / 2. @property def bounding_box(self): - min_x = self.position[0] - self.radius - max_x = self.position[0] + self.radius - min_y = self.position[1] - self.radius - max_y = self.position[1] + self.radius - return ((min_x, max_x), (min_y, max_y)) + if self._bounding_box is None: + min_x = self.position[0] - self.radius + max_x = self.position[0] + self.radius + min_y = self.position[1] - self.radius + max_y = self.position[1] + self.radius + self._bounding_box = ((min_x, max_x), (min_y, max_y)) + return self._bounding_box - def offset(self, x_offset=0, y_offset=0): - self.position = tuple(map(add, self.position, (x_offset, y_offset))) class TestRecord(Primitive): """ Netlist Test record """ + def __init__(self, position, net_name, layer, **kwargs): super(TestRecord, self).__init__(**kwargs) validate_coordinates(position) self.position = position self.net_name = net_name self.layer = layer - diff --git a/gerber/render/cairo_backend.py b/gerber/render/cairo_backend.py index 4e71e75..cc2722a 100644 --- a/gerber/render/cairo_backend.py +++ b/gerber/render/cairo_backend.py @@ -17,8 +17,6 @@ import cairocffi as cairo -from operator import mul -import math import tempfile from .render import GerberContext, RenderSettings @@ -32,11 +30,14 @@ except(ImportError): class GerberCairoContext(GerberContext): + def __init__(self, scale=300): - GerberContext.__init__(self) + super(GerberCairoContext, self).__init__() self.scale = (scale, scale) self.surface = None self.ctx = None + self.active_layer = None + self.output_ctx = None self.bg = False self.mask = None self.mask_ctx = None @@ -46,37 +47,40 @@ class GerberCairoContext(GerberContext): @property def origin_in_pixels(self): - return tuple(map(mul, self.origin_in_inch, self.scale)) if self.origin_in_inch is not None else (0.0, 0.0) + return (self.scale_point(self.origin_in_inch) + if self.origin_in_inch is not None else (0.0, 0.0)) @property def size_in_pixels(self): - return tuple(map(mul, self.size_in_inch, self.scale)) if self.size_in_inch is not None else (0.0, 0.0) + return (self.scale_point(self.size_in_inch) + if self.size_in_inch is not None else (0.0, 0.0)) def set_bounds(self, bounds, new_surface=False): origin_in_inch = (bounds[0][0], bounds[1][0]) - size_in_inch = (abs(bounds[0][1] - bounds[0][0]), abs(bounds[1][1] - bounds[1][0])) - size_in_pixels = tuple(map(mul, size_in_inch, self.scale)) + size_in_inch = (abs(bounds[0][1] - bounds[0][0]), + abs(bounds[1][1] - bounds[1][0])) + size_in_pixels = self.scale_point(size_in_inch) self.origin_in_inch = origin_in_inch if self.origin_in_inch is None else self.origin_in_inch self.size_in_inch = size_in_inch if self.size_in_inch is None else self.size_in_inch if (self.surface is None) or new_surface: self.surface_buffer = tempfile.NamedTemporaryFile() - self.surface = cairo.SVGSurface(self.surface_buffer, size_in_pixels[0], size_in_pixels[1]) - self.ctx = cairo.Context(self.surface) - self.ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD) - self.ctx.scale(1, -1) - self.ctx.translate(-(origin_in_inch[0] * self.scale[0]), (-origin_in_inch[1]*self.scale[0]) - size_in_pixels[1]) - self.mask = cairo.SVGSurface(None, size_in_pixels[0], size_in_pixels[1]) - self.mask_ctx = cairo.Context(self.mask) - self.mask_ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD) - self.mask_ctx.scale(1, -1) - self.mask_ctx.translate(-(origin_in_inch[0] * self.scale[0]), (-origin_in_inch[1]*self.scale[0]) - size_in_pixels[1]) - self._xform_matrix = cairo.Matrix(xx=1.0, yy=-1.0, x0=-self.origin_in_pixels[0], y0=self.size_in_pixels[1] + self.origin_in_pixels[1]) + self.surface = cairo.SVGSurface( + self.surface_buffer, size_in_pixels[0], size_in_pixels[1]) + self.output_ctx = cairo.Context(self.surface) + self.output_ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD) + self.output_ctx.scale(1, -1) + self.output_ctx.translate(-(origin_in_inch[0] * self.scale[0]), + (-origin_in_inch[1] * self.scale[0]) - size_in_pixels[1]) + self._xform_matrix = cairo.Matrix(xx=1.0, yy=-1.0, + x0=-self.origin_in_pixels[0], + y0=self.size_in_pixels[1] + self.origin_in_pixels[1]) def render_layers(self, layers, filename, theme=THEMES['default']): """ Render a set of layers """ self.set_bounds(layers[0].bounds, True) self._paint_background(True) + for layer in layers: self._render_layer(layer, theme) self.dump(filename) @@ -114,158 +118,181 @@ class GerberCairoContext(GerberContext): self.color = settings.color self.alpha = settings.alpha self.invert = settings.invert + + # Get a new clean layer to render on + self._new_render_layer() if settings.mirror: raise Warning('mirrored layers aren\'t supported yet...') - if self.invert: - self._clear_mask() for prim in layer.primitives: self.render(prim) - if self.invert: - self._render_mask() + # Add layer to image + self._flatten() def _render_line(self, line, color): - start = map(mul, line.start, self.scale) - end = map(mul, line.end, self.scale) + start = [pos * scale for pos, scale in zip(line.start, self.scale)] + end = [pos * scale for pos, scale in zip(line.end, self.scale)] if not self.invert: - ctx = self.ctx - ctx.set_source_rgba(*color, alpha=self.alpha) - ctx.set_operator(cairo.OPERATOR_OVER if line.level_polarity == "dark" else cairo.OPERATOR_CLEAR) + self.ctx.set_source_rgba(*color, alpha=self.alpha) + self.ctx.set_operator(cairo.OPERATOR_OVER + if line.level_polarity == 'dark' + else cairo.OPERATOR_CLEAR) else: - ctx = self.mask_ctx - ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) - ctx.set_operator(cairo.OPERATOR_CLEAR) + self.ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) + self.ctx.set_operator(cairo.OPERATOR_CLEAR) if isinstance(line.aperture, Circle): width = line.aperture.diameter - ctx.set_line_width(width * self.scale[0]) - ctx.set_line_cap(cairo.LINE_CAP_ROUND) - ctx.move_to(*start) - ctx.line_to(*end) - ctx.stroke() + self.ctx.set_line_width(width * self.scale[0]) + self.ctx.set_line_cap(cairo.LINE_CAP_ROUND) + self.ctx.move_to(*start) + self.ctx.line_to(*end) + self.ctx.stroke() elif isinstance(line.aperture, Rectangle): - points = [tuple(map(mul, x, self.scale)) for x in line.vertices] - ctx.set_line_width(0) - ctx.move_to(*points[0]) + points = [self.scale_point(x) for x in line.vertices] + self.ctx.set_line_width(0) + self.ctx.move_to(*points[0]) for point in points[1:]: - ctx.line_to(*point) - ctx.fill() + self.ctx.line_to(*point) + self.ctx.fill() def _render_arc(self, arc, color): - center = map(mul, arc.center, self.scale) - start = map(mul, arc.start, self.scale) - end = map(mul, arc.end, self.scale) + center = self.scale_point(arc.center) + start = self.scale_point(arc.start) + end = self.scale_point(arc.end) radius = self.scale[0] * arc.radius angle1 = arc.start_angle angle2 = arc.end_angle width = arc.aperture.diameter if arc.aperture.diameter != 0 else 0.001 if not self.invert: - ctx = self.ctx - ctx.set_source_rgba(*color, alpha=self.alpha) - ctx.set_operator(cairo.OPERATOR_OVER if arc.level_polarity == "dark" else cairo.OPERATOR_CLEAR) + self.ctx.set_source_rgba(*color, alpha=self.alpha) + self.ctx.set_operator(cairo.OPERATOR_OVER + if arc.level_polarity == 'dark' + else cairo.OPERATOR_CLEAR) else: - ctx = self.mask_ctx - ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) - ctx.set_operator(cairo.OPERATOR_CLEAR) - ctx.set_line_width(width * self.scale[0]) - ctx.set_line_cap(cairo.LINE_CAP_ROUND) - ctx.move_to(*start) # You actually have to do this... + self.ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) + self.ctx.set_operator(cairo.OPERATOR_CLEAR) + self.ctx.set_line_width(width * self.scale[0]) + self.ctx.set_line_cap(cairo.LINE_CAP_ROUND) + self.ctx.move_to(*start) # You actually have to do this... if arc.direction == 'counterclockwise': - ctx.arc(*center, radius=radius, angle1=angle1, angle2=angle2) + self.ctx.arc(*center, radius=radius, angle1=angle1, angle2=angle2) else: - ctx.arc_negative(*center, radius=radius, angle1=angle1, angle2=angle2) - ctx.move_to(*end) # ...lame + self.ctx.arc_negative(*center, radius=radius, + angle1=angle1, angle2=angle2) + self.ctx.move_to(*end) # ...lame def _render_region(self, region, color): if not self.invert: - ctx = self.ctx - ctx.set_source_rgba(*color, alpha=self.alpha) - ctx.set_operator(cairo.OPERATOR_OVER if region.level_polarity == "dark" else cairo.OPERATOR_CLEAR) + self.ctx.set_source_rgba(*color, alpha=self.alpha) + self.ctx.set_operator(cairo.OPERATOR_OVER + if region.level_polarity == 'dark' + else cairo.OPERATOR_CLEAR) else: - ctx = self.mask_ctx - ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) - ctx.set_operator(cairo.OPERATOR_CLEAR) - ctx.set_line_width(0) - ctx.set_line_cap(cairo.LINE_CAP_ROUND) - ctx.move_to(*tuple(map(mul, region.primitives[0].start, self.scale))) - for p in region.primitives: - if isinstance(p, Line): - ctx.line_to(*tuple(map(mul, p.end, self.scale))) + self.ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) + self.ctx.set_operator(cairo.OPERATOR_CLEAR) + self.ctx.set_line_width(0) + self.ctx.set_line_cap(cairo.LINE_CAP_ROUND) + self.ctx.move_to(*self.scale_point(region.primitives[0].start)) + for prim in region.primitives: + if isinstance(prim, Line): + self.ctx.line_to(*self.scale_point(prim.end)) else: - center = map(mul, p.center, self.scale) - start = map(mul, p.start, self.scale) - end = map(mul, p.end, self.scale) - radius = self.scale[0] * p.radius - angle1 = p.start_angle - angle2 = p.end_angle - if p.direction == 'counterclockwise': - ctx.arc(*center, radius=radius, angle1=angle1, angle2=angle2) + center = self.scale_point(prim.center) + radius = self.scale[0] * prim.radius + angle1 = prim.start_angle + angle2 = prim.end_angle + if prim.direction == 'counterclockwise': + self.ctx.arc(*center, radius=radius, + angle1=angle1, angle2=angle2) else: - ctx.arc_negative(*center, radius=radius, angle1=angle1, angle2=angle2) - ctx.fill() + self.ctx.arc_negative(*center, radius=radius, + angle1=angle1, angle2=angle2) + self.ctx.fill() def _render_circle(self, circle, color): - center = tuple(map(mul, circle.position, self.scale)) + center = self.scale_point(circle.position) if not self.invert: - ctx = self.ctx - ctx.set_source_rgba(*color, alpha=self.alpha) - ctx.set_operator(cairo.OPERATOR_OVER if circle.level_polarity == "dark" else cairo.OPERATOR_CLEAR) + self.ctx.set_source_rgba(*color, alpha=self.alpha) + self.ctx.set_operator( + cairo.OPERATOR_OVER if circle.level_polarity == 'dark' else cairo.OPERATOR_CLEAR) else: - ctx = self.mask_ctx - ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) - ctx.set_operator(cairo.OPERATOR_CLEAR) - ctx.set_line_width(0) - ctx.arc(*center, radius=circle.radius * self.scale[0], angle1=0, angle2=2 * math.pi) - ctx.fill() + self.ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) + self.ctx.set_operator(cairo.OPERATOR_CLEAR) + self.ctx.set_line_width(0) + self.ctx.arc(*center, radius=circle.radius * + self.scale[0], angle1=0, angle2=2 * math.pi) + self.ctx.fill() def _render_rectangle(self, rectangle, color): - ll = map(mul, rectangle.lower_left, self.scale) - width, height = tuple(map(mul, (rectangle.width, rectangle.height), map(abs, self.scale))) + lower_left = self.scale_point(rectangle.lower_left) + width, height = tuple([abs(coord) for coord in self.scale_point((rectangle.width, rectangle.height))]) + if not self.invert: - ctx = self.ctx - ctx.set_source_rgba(*color, alpha=self.alpha) - ctx.set_operator(cairo.OPERATOR_OVER if rectangle.level_polarity == "dark" else cairo.OPERATOR_CLEAR) + self.ctx.set_source_rgba(*color, alpha=self.alpha) + self.ctx.set_operator( + cairo.OPERATOR_OVER if rectangle.level_polarity == 'dark' else cairo.OPERATOR_CLEAR) else: - ctx = self.mask_ctx - ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) - ctx.set_operator(cairo.OPERATOR_CLEAR) - ctx.set_line_width(0) - ctx.rectangle(*ll, width=width, height=height) - ctx.fill() + self.ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) + self.ctx.set_operator(cairo.OPERATOR_CLEAR) + self.ctx.set_line_width(0) + self.ctx.rectangle(*lower_left, width=width, height=height) + self.ctx.fill() def _render_obround(self, obround, color): self._render_circle(obround.subshapes['circle1'], color) self._render_circle(obround.subshapes['circle2'], color) self._render_rectangle(obround.subshapes['rectangle'], color) - def _render_drill(self, circle, color): + def _render_drill(self, circle, color=None): + color = color if color is not None else self.drill_color self._render_circle(circle, color) def _render_test_record(self, primitive, color): - position = tuple(map(add, primitive.position, self.origin_in_inch)) + position = [pos + origin for pos, origin in zip(primitive.position, self.origin_in_inch)] self.ctx.set_operator(cairo.OPERATOR_OVER) - self.ctx.select_font_face('monospace', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) + self.ctx.select_font_face( + 'monospace', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) self.ctx.set_font_size(13) self._render_circle(Circle(position, 0.015), color) self.ctx.set_source_rgba(*color, alpha=self.alpha) - self.ctx.set_operator(cairo.OPERATOR_OVER if primitive.level_polarity == "dark" else cairo.OPERATOR_CLEAR) - self.ctx.move_to(*[self.scale[0] * (coord + 0.015) for coord in position]) + self.ctx.set_operator( + cairo.OPERATOR_OVER if primitive.level_polarity == 'dark' else cairo.OPERATOR_CLEAR) + self.ctx.move_to(*[self.scale[0] * (coord + 0.015) + for coord in position]) self.ctx.scale(1, -1) self.ctx.show_text(primitive.net_name) self.ctx.scale(1, -1) - def _clear_mask(self): - self.mask_ctx.set_operator(cairo.OPERATOR_OVER) - self.mask_ctx.set_source_rgba(*self.color, alpha=self.alpha) - self.mask_ctx.paint() + def _new_render_layer(self, color=None): + size_in_pixels = self.scale_point(self.size_in_inch) + layer = cairo.SVGSurface(None, size_in_pixels[0], size_in_pixels[1]) + ctx = cairo.Context(layer) + ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD) + ctx.scale(1, -1) + ctx.translate(-(self.origin_in_inch[0] * self.scale[0]), + (-self.origin_in_inch[1] * self.scale[0]) + - size_in_pixels[1]) + if self.invert: + ctx.set_operator(cairo.OPERATOR_OVER) + ctx.set_source_rgba(*self.color, alpha=self.alpha) + ctx.paint() + self.ctx = ctx + self.active_layer = layer - def _render_mask(self): - self.ctx.set_operator(cairo.OPERATOR_OVER) - ptn = cairo.SurfacePattern(self.mask) + def _flatten(self): + self.output_ctx.set_operator(cairo.OPERATOR_OVER) + ptn = cairo.SurfacePattern(self.active_layer) ptn.set_matrix(self._xform_matrix) - self.ctx.set_source(ptn) - self.ctx.paint() + self.output_ctx.set_source(ptn) + self.output_ctx.paint() + self.ctx = None + self.active_layer = None def _paint_background(self, force=False): if (not self.bg) or force: self.bg = True - self.ctx.set_source_rgba(*self.background_color, alpha=1.0) - self.ctx.paint() + self.output_ctx.set_operator(cairo.OPERATOR_OVER) + self.output_ctx.set_source_rgba(*self.background_color, alpha=1.0) + self.output_ctx.paint() + + def scale_point(self, point): + return tuple([coord * scale for coord, scale in zip(point, self.scale)]) diff --git a/gerber/render/render.py b/gerber/render/render.py index 6af8bf1..d7a62e1 100644 --- a/gerber/render/render.py +++ b/gerber/render/render.py @@ -57,12 +57,14 @@ class GerberContext(object): alpha : float Rendering opacity. Between 0.0 (transparent) and 1.0 (opaque.) """ + def __init__(self, units='inch'): self._units = units self._color = (0.7215, 0.451, 0.200) self._background_color = (0.0, 0.0, 0.0) self._alpha = 1.0 self._invert = False + self.ctx = None @property def units(self): @@ -132,8 +134,7 @@ class GerberContext(object): self._invert = invert def render(self, primitive): - color = (self.color if primitive.level_polarity == 'dark' - else self.background_color) + color = self.color if isinstance(primitive, Line): self._render_line(primitive, color) elif isinstance(primitive, Arc): @@ -155,6 +156,7 @@ class GerberContext(object): else: return + def _render_line(self, primitive, color): pass @@ -184,9 +186,9 @@ class GerberContext(object): class RenderSettings(object): + def __init__(self, color=(0.0, 0.0, 0.0), alpha=1.0, invert=False, mirror=False): self.color = color self.alpha = alpha self.invert = invert self.mirror = mirror - diff --git a/gerber/render/theme.py b/gerber/render/theme.py index e538df8..6135ccb 100644 --- a/gerber/render/theme.py +++ b/gerber/render/theme.py @@ -23,7 +23,7 @@ COLORS = { 'white': (1.0, 1.0, 1.0), 'red': (1.0, 0.0, 0.0), 'green': (0.0, 1.0, 0.0), - 'blue' : (0.0, 0.0, 1.0), + 'blue': (0.0, 0.0, 1.0), 'fr-4': (0.290, 0.345, 0.0), 'green soldermask': (0.0, 0.612, 0.396), 'blue soldermask': (0.059, 0.478, 0.651), @@ -36,6 +36,7 @@ COLORS = { class Theme(object): + def __init__(self, name=None, **kwargs): self.name = 'Default' if name is None else name self.background = kwargs.get('background', RenderSettings(COLORS['black'], alpha=0.0)) @@ -67,4 +68,3 @@ THEMES = { topmask=RenderSettings(COLORS['blue soldermask'], alpha=0.8, invert=True), bottommask=RenderSettings(COLORS['blue soldermask'], alpha=0.8, invert=True)), } - diff --git a/gerber/rs274x.py b/gerber/rs274x.py index 319d58f..b19913b 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -93,6 +93,7 @@ class GerberFile(CamFile): `bounds` is stored as ((min x, max x), (min y, max y)) """ + def __init__(self, statements, settings, primitives, filename=None): super(GerberFile, self).__init__(statements, settings, primitives, filename) @@ -181,7 +182,8 @@ class GerberParser(object): DEPRECATED_FORMAT = re.compile(r'(?PG9[01])\*') # end deprecated - PARAMS = (FS, MO, LP, AD_CIRCLE, AD_RECT, AD_OBROUND, AD_POLY, AD_MACRO, AM, AS, IN, IP, IR, MI, OF, SF, LN) + PARAMS = (FS, MO, LP, AD_CIRCLE, AD_RECT, AD_OBROUND, AD_POLY, + AD_MACRO, AM, AS, IN, IP, IR, MI, OF, SF, LN) PARAM_STMT = [re.compile(r"%?{0}\*%?".format(p)) for p in PARAMS] @@ -362,7 +364,8 @@ class GerberParser(object): # deprecated codes (deprecated_unit, r) = _match_one(self.DEPRECATED_UNIT, line) if deprecated_unit: - stmt = MOParamStmt(param="MO", mo="inch" if "G70" in deprecated_unit["mode"] else "metric") + stmt = MOParamStmt(param="MO", mo="inch" if "G70" in + deprecated_unit["mode"] else "metric") self.settings.units = stmt.mode yield stmt line = r @@ -436,8 +439,9 @@ class GerberParser(object): height = modifiers[0][1] aperture = Obround(position=None, width=width, height=height) elif shape == 'P': - # FIXME: not supported yet? - pass + diameter = modifiers[0][0] + sides = modifiers[0][1] + aperture = Polygon(position=None, radius=diameter/2.0, sides=sides) else: aperture = self.macros[shape].build(modifiers) @@ -446,7 +450,8 @@ class GerberParser(object): def _evaluate_mode(self, stmt): if stmt.type == 'RegionMode': if self.region_mode == 'on' and stmt.mode == 'off': - self.primitives.append(Region(self.current_region, level_polarity=self.level_polarity)) + self.primitives.append(Region(self.current_region, + level_polarity=self.level_polarity)) self.current_region = None self.region_mode = stmt.mode elif stmt.type == 'QuadrantMode': @@ -476,7 +481,8 @@ class GerberParser(object): self.interpolation = 'linear' elif stmt.function in ('G02', 'G2', 'G03', 'G3'): self.interpolation = 'arc' - self.direction = ('clockwise' if stmt.function in ('G02', 'G2') else 'counterclockwise') + self.direction = ('clockwise' if stmt.function in + ('G02', 'G2') else 'counterclockwise') if stmt.op: self.op = stmt.op @@ -490,43 +496,71 @@ class GerberParser(object): if self.interpolation == 'linear': if self.region_mode == 'off': - self.primitives.append(Line(start, end, self.apertures[self.aperture], level_polarity=self.level_polarity, units=self.settings.units)) + self.primitives.append(Line(start, end, + self.apertures[self.aperture], + level_polarity=self.level_polarity, + units=self.settings.units)) else: # from gerber spec revision J3, Section 4.5, page 55: # The segments are not graphics objects in themselves; segments are part of region which is the graphics object. The segments have no thickness. - # The current aperture is associated with the region. This has no graphical effect, but allows all its attributes to be applied to the region. + # The current aperture is associated with the region. This + # has no graphical effect, but allows all its attributes to + # be applied to the region. if self.current_region is None: - self.current_region = [Line(start, end, self.apertures.get(self.aperture, Circle((0,0), 0)), level_polarity=self.level_polarity, units=self.settings.units),] - else: - self.current_region.append(Line(start, end, self.apertures.get(self.aperture, Circle((0,0), 0)), level_polarity=self.level_polarity, units=self.settings.units)) + self.current_region = [Line(start, end, + self.apertures.get(self.aperture, + Circle((0, 0), 0)), + level_polarity=self.level_polarity, + units=self.settings.units), ] + else: + self.current_region.append(Line(start, end, + self.apertures.get(self.aperture, + Circle((0, 0), 0)), + level_polarity=self.level_polarity, + units=self.settings.units)) else: i = 0 if stmt.i is None else stmt.i j = 0 if stmt.j is None else stmt.j center = (start[0] + i, start[1] + j) if self.region_mode == 'off': - self.primitives.append(Arc(start, end, center, self.direction, self.apertures[self.aperture], level_polarity=self.level_polarity, units=self.settings.units)) + self.primitives.append(Arc(start, end, center, self.direction, + self.apertures[self.aperture], + level_polarity=self.level_polarity, + units=self.settings.units)) else: if self.current_region is None: - self.current_region = [Arc(start, end, center, self.direction, self.apertures[self.aperture], level_polarity=self.level_polarity, units=self.settings.units),] + self.current_region = [Arc(start, end, center, self.direction, + self.apertures[self.aperture], + level_polarity=self.level_polarity, + units=self.settings.units), ] else: - self.current_region.append(Arc(start, end, center, self.direction, self.apertures[self.aperture], level_polarity=self.level_polarity, units=self.settings.units)) + self.current_region.append(Arc(start, end, center, self.direction, + self.apertures[self.aperture], + level_polarity=self.level_polarity, + units=self.settings.units)) elif self.op == "D02": pass elif self.op == "D03": primitive = copy.deepcopy(self.apertures[self.aperture]) - # XXX: temporary fix because there are no primitives for Macros and Polygon + + if primitive is not None: - # XXX: just to make it easy to spot - if isinstance(primitive, type([])): - print(primitive[0].to_gerber()) - else: + + if not isinstance(primitive, AMParamStmt): primitive.position = (x, y) primitive.level_polarity = self.level_polarity primitive.units = self.settings.units self.primitives.append(primitive) - + else: + # Aperture Macro + for am_prim in primitive.primitives: + renderable = am_prim.to_primitive((x, y), + self.level_polarity, + self.settings.units) + if renderable is not None: + self.primitives.append(renderable) self.x, self.y = x, y def _evaluate_aperture(self, stmt): diff --git a/gerber/tests/test_am_statements.py b/gerber/tests/test_am_statements.py index 0cee13d..8c95e6a 100644 --- a/gerber/tests/test_am_statements.py +++ b/gerber/tests/test_am_statements.py @@ -7,6 +7,7 @@ from .tests import * from ..am_statements import * from ..am_statements import inch, metric + def test_AMPrimitive_ctor(): for exposure in ('on', 'off', 'ON', 'OFF'): for code in (0, 1, 2, 4, 5, 6, 7, 20, 21, 22): @@ -20,13 +21,13 @@ def test_AMPrimitive_validation(): assert_raises(ValueError, AMPrimitive, 0, 'exposed') assert_raises(ValueError, AMPrimitive, 3, 'off') + def test_AMPrimitive_conversion(): p = AMPrimitive(4, 'on') assert_raises(NotImplementedError, p.to_inch) assert_raises(NotImplementedError, p.to_metric) - def test_AMCommentPrimitive_ctor(): c = AMCommentPrimitive(0, ' This is a comment *') assert_equal(c.code, 0) @@ -47,6 +48,7 @@ def test_AMCommentPrimitive_dump(): c = AMCommentPrimitive(0, 'Rectangle with rounded corners.') assert_equal(c.to_gerber(), '0 Rectangle with rounded corners. *') + def test_AMCommentPrimitive_conversion(): c = AMCommentPrimitive(0, 'Rectangle with rounded corners.') ci = c @@ -56,6 +58,7 @@ def test_AMCommentPrimitive_conversion(): assert_equal(c, ci) assert_equal(c, cm) + def test_AMCommentPrimitive_string(): c = AMCommentPrimitive(0, 'Test Comment') assert_equal(str(c), '') @@ -83,7 +86,7 @@ def test_AMCirclePrimitive_factory(): assert_equal(c.code, 1) assert_equal(c.exposure, 'off') assert_equal(c.diameter, 5) - assert_equal(c.position, (0,0)) + assert_equal(c.position, (0, 0)) def test_AMCirclePrimitive_dump(): @@ -92,6 +95,7 @@ def test_AMCirclePrimitive_dump(): c = AMCirclePrimitive(1, 'on', 5, (0, 0)) assert_equal(c.to_gerber(), '1,1,5,0,0*') + def test_AMCirclePrimitive_conversion(): c = AMCirclePrimitive(1, 'off', 25.4, (25.4, 0)) c.to_inch() @@ -103,8 +107,11 @@ def test_AMCirclePrimitive_conversion(): assert_equal(c.diameter, 25.4) assert_equal(c.position, (25.4, 0)) + def test_AMVectorLinePrimitive_validation(): - assert_raises(ValueError, AMVectorLinePrimitive, 3, 'on', 0.1, (0,0), (3.3, 5.4), 0) + assert_raises(ValueError, AMVectorLinePrimitive, + 3, 'on', 0.1, (0, 0), (3.3, 5.4), 0) + def test_AMVectorLinePrimitive_factory(): l = AMVectorLinePrimitive.from_gerber('20,1,0.9,0,0.45,12,0.45,0*') @@ -115,26 +122,32 @@ def test_AMVectorLinePrimitive_factory(): assert_equal(l.end, (12, 0.45)) assert_equal(l.rotation, 0) + def test_AMVectorLinePrimitive_dump(): l = AMVectorLinePrimitive.from_gerber('20,1,0.9,0,0.45,12,0.45,0*') assert_equal(l.to_gerber(), '20,1,0.9,0.0,0.45,12.0,0.45,0.0*') + def test_AMVectorLinePrimtive_conversion(): - l = AMVectorLinePrimitive(20, 'on', 25.4, (0,0), (25.4, 25.4), 0) + l = AMVectorLinePrimitive(20, 'on', 25.4, (0, 0), (25.4, 25.4), 0) l.to_inch() assert_equal(l.width, 1) assert_equal(l.start, (0, 0)) assert_equal(l.end, (1, 1)) - l = AMVectorLinePrimitive(20, 'on', 1, (0,0), (1, 1), 0) + l = AMVectorLinePrimitive(20, 'on', 1, (0, 0), (1, 1), 0) l.to_metric() assert_equal(l.width, 25.4) assert_equal(l.start, (0, 0)) assert_equal(l.end, (25.4, 25.4)) + def test_AMOutlinePrimitive_validation(): - assert_raises(ValueError, AMOutlinePrimitive, 7, 'on', (0,0), [(3.3, 5.4), (4.0, 5.4), (0, 0)], 0) - assert_raises(ValueError, AMOutlinePrimitive, 4, 'on', (0,0), [(3.3, 5.4), (4.0, 5.4), (0, 1)], 0) + assert_raises(ValueError, AMOutlinePrimitive, 7, 'on', + (0, 0), [(3.3, 5.4), (4.0, 5.4), (0, 0)], 0) + assert_raises(ValueError, AMOutlinePrimitive, 4, 'on', + (0, 0), [(3.3, 5.4), (4.0, 5.4), (0, 1)], 0) + def test_AMOutlinePrimitive_factory(): o = AMOutlinePrimitive.from_gerber('4,1,3,0,0,3,3,3,0,0,0,0*') @@ -144,12 +157,15 @@ def test_AMOutlinePrimitive_factory(): assert_equal(o.points, [(3, 3), (3, 0), (0, 0)]) assert_equal(o.rotation, 0) + def test_AMOUtlinePrimitive_dump(): o = AMOutlinePrimitive(4, 'on', (0, 0), [(3, 3), (3, 0), (0, 0)], 0) assert_equal(o.to_gerber(), '4,1,3,0,0,3,3,3,0,0,0,0*') + def test_AMOutlinePrimitive_conversion(): - o = AMOutlinePrimitive(4, 'on', (0, 0), [(25.4, 25.4), (25.4, 0), (0, 0)], 0) + o = AMOutlinePrimitive( + 4, 'on', (0, 0), [(25.4, 25.4), (25.4, 0), (0, 0)], 0) o.to_inch() assert_equal(o.start_point, (0, 0)) assert_equal(o.points, ((1., 1.), (1., 0.), (0., 0.))) @@ -165,6 +181,7 @@ def test_AMPolygonPrimitive_validation(): assert_raises(ValueError, AMPolygonPrimitive, 5, 'on', 2, (3.3, 5.4), 3, 0) assert_raises(ValueError, AMPolygonPrimitive, 5, 'on', 13, (3.3, 5.4), 3, 0) + def test_AMPolygonPrimitive_factory(): p = AMPolygonPrimitive.from_gerber('5,1,3,3.3,5.4,3,0') assert_equal(p.code, 5) @@ -174,10 +191,12 @@ def test_AMPolygonPrimitive_factory(): assert_equal(p.diameter, 3) assert_equal(p.rotation, 0) + def test_AMPolygonPrimitive_dump(): p = AMPolygonPrimitive(5, 'on', 3, (3.3, 5.4), 3, 0) assert_equal(p.to_gerber(), '5,1,3,3.3,5.4,3,0*') + def test_AMPolygonPrimitive_conversion(): p = AMPolygonPrimitive(5, 'off', 3, (25.4, 0), 25.4, 0) p.to_inch() @@ -191,7 +210,9 @@ def test_AMPolygonPrimitive_conversion(): def test_AMMoirePrimitive_validation(): - assert_raises(ValueError, AMMoirePrimitive, 7, (0, 0), 5.1, 0.2, 0.4, 6, 0.1, 6.1, 0) + assert_raises(ValueError, AMMoirePrimitive, 7, + (0, 0), 5.1, 0.2, 0.4, 6, 0.1, 6.1, 0) + def test_AMMoirePrimitive_factory(): m = AMMoirePrimitive.from_gerber('6,0,0,5,0.5,0.5,2,0.1,6,0*') @@ -205,10 +226,12 @@ def test_AMMoirePrimitive_factory(): assert_equal(m.crosshair_length, 6) assert_equal(m.rotation, 0) + def test_AMMoirePrimitive_dump(): m = AMMoirePrimitive.from_gerber('6,0,0,5,0.5,0.5,2,0.1,6,0*') assert_equal(m.to_gerber(), '6,0,0,5.0,0.5,0.5,2,0.1,6.0,0.0*') + def test_AMMoirePrimitive_conversion(): m = AMMoirePrimitive(6, (25.4, 25.4), 25.4, 25.4, 25.4, 6, 25.4, 25.4, 0) m.to_inch() @@ -228,10 +251,12 @@ def test_AMMoirePrimitive_conversion(): assert_equal(m.crosshair_thickness, 25.4) assert_equal(m.crosshair_length, 25.4) + def test_AMThermalPrimitive_validation(): assert_raises(ValueError, AMThermalPrimitive, 8, (0.0, 0.0), 7, 5, 0.2) assert_raises(TypeError, AMThermalPrimitive, 7, (0.0, '0'), 7, 5, 0.2) + def test_AMThermalPrimitive_factory(): t = AMThermalPrimitive.from_gerber('7,0,0,7,6,0.2*') assert_equal(t.code, 7) @@ -240,10 +265,12 @@ def test_AMThermalPrimitive_factory(): assert_equal(t.inner_diameter, 6) assert_equal(t.gap, 0.2) + def test_AMThermalPrimitive_dump(): t = AMThermalPrimitive.from_gerber('7,0,0,7,6,0.2*') assert_equal(t.to_gerber(), '7,0,0,7.0,6.0,0.2*') + def test_AMThermalPrimitive_conversion(): t = AMThermalPrimitive(7, (25.4, 25.4), 25.4, 25.4, 25.4) t.to_inch() @@ -261,7 +288,9 @@ def test_AMThermalPrimitive_conversion(): def test_AMCenterLinePrimitive_validation(): - assert_raises(ValueError, AMCenterLinePrimitive, 22, 1, 0.2, 0.5, (0, 0), 0) + assert_raises(ValueError, AMCenterLinePrimitive, + 22, 1, 0.2, 0.5, (0, 0), 0) + def test_AMCenterLinePrimtive_factory(): l = AMCenterLinePrimitive.from_gerber('21,1,6.8,1.2,3.4,0.6,0*') @@ -272,10 +301,12 @@ def test_AMCenterLinePrimtive_factory(): assert_equal(l.center, (3.4, 0.6)) assert_equal(l.rotation, 0) + def test_AMCenterLinePrimitive_dump(): l = AMCenterLinePrimitive.from_gerber('21,1,6.8,1.2,3.4,0.6,0*') assert_equal(l.to_gerber(), '21,1,6.8,1.2,3.4,0.6,0.0*') + def test_AMCenterLinePrimitive_conversion(): l = AMCenterLinePrimitive(21, 'on', 25.4, 25.4, (25.4, 25.4), 0) l.to_inch() @@ -289,8 +320,11 @@ def test_AMCenterLinePrimitive_conversion(): assert_equal(l.height, 25.4) assert_equal(l.center, (25.4, 25.4)) + def test_AMLowerLeftLinePrimitive_validation(): - assert_raises(ValueError, AMLowerLeftLinePrimitive, 23, 1, 0.2, 0.5, (0, 0), 0) + assert_raises(ValueError, AMLowerLeftLinePrimitive, + 23, 1, 0.2, 0.5, (0, 0), 0) + def test_AMLowerLeftLinePrimtive_factory(): l = AMLowerLeftLinePrimitive.from_gerber('22,1,6.8,1.2,3.4,0.6,0*') @@ -301,10 +335,12 @@ def test_AMLowerLeftLinePrimtive_factory(): assert_equal(l.lower_left, (3.4, 0.6)) assert_equal(l.rotation, 0) + def test_AMLowerLeftLinePrimitive_dump(): l = AMLowerLeftLinePrimitive.from_gerber('22,1,6.8,1.2,3.4,0.6,0*') assert_equal(l.to_gerber(), '22,1,6.8,1.2,3.4,0.6,0.0*') + def test_AMLowerLeftLinePrimitive_conversion(): l = AMLowerLeftLinePrimitive(22, 'on', 25.4, 25.4, (25.4, 25.4), 0) l.to_inch() @@ -318,24 +354,23 @@ def test_AMLowerLeftLinePrimitive_conversion(): assert_equal(l.height, 25.4) assert_equal(l.lower_left, (25.4, 25.4)) + def test_AMUnsupportPrimitive(): u = AMUnsupportPrimitive.from_gerber('Test') assert_equal(u.primitive, 'Test') u = AMUnsupportPrimitive('Test') assert_equal(u.to_gerber(), 'Test') + def test_AMUnsupportPrimitive_smoketest(): u = AMUnsupportPrimitive.from_gerber('Test') u.to_inch() u.to_metric() - def test_inch(): assert_equal(inch(25.4), 1) + def test_metric(): assert_equal(metric(1), 25.4) - - - diff --git a/gerber/tests/test_cam.py b/gerber/tests/test_cam.py index 00a8285..2f0a905 100644 --- a/gerber/tests/test_cam.py +++ b/gerber/tests/test_cam.py @@ -54,17 +54,20 @@ def test_filesettings_dict_assign(): assert_equal(fs.zero_suppression, 'leading') assert_equal(fs.format, (1, 2)) + def test_camfile_init(): """ Smoke test CamFile test """ cf = CamFile() + def test_camfile_settings(): """ Test CamFile Default Settings """ cf = CamFile() assert_equal(cf.settings, FileSettings()) + def test_bounds_override_smoketest(): cf = CamFile() cf.bounds @@ -89,7 +92,7 @@ def test_zeros(): assert_equal(fs.zeros, 'trailing') assert_equal(fs.zero_suppression, 'leading') - fs.zeros= 'leading' + fs.zeros = 'leading' assert_equal(fs.zeros, 'leading') assert_equal(fs.zero_suppression, 'trailing') @@ -113,12 +116,19 @@ def test_zeros(): def test_filesettings_validation(): """ Test FileSettings constructor argument validation """ - assert_raises(ValueError, FileSettings, 'absolute-ish', 'inch', None, (2, 5), None) - assert_raises(ValueError, FileSettings, 'absolute', 'degrees kelvin', None, (2, 5), None) - assert_raises(ValueError, FileSettings, 'absolute', 'inch', 'leading', (2, 5), 'leading') - assert_raises(ValueError, FileSettings, 'absolute', 'inch', 'following', (2, 5), None) - assert_raises(ValueError, FileSettings, 'absolute', 'inch', None, (2, 5), 'following') - assert_raises(ValueError, FileSettings, 'absolute', 'inch', None, (2, 5, 6), None) + assert_raises(ValueError, FileSettings, 'absolute-ish', + 'inch', None, (2, 5), None) + assert_raises(ValueError, FileSettings, 'absolute', + 'degrees kelvin', None, (2, 5), None) + assert_raises(ValueError, FileSettings, 'absolute', + 'inch', 'leading', (2, 5), 'leading') + assert_raises(ValueError, FileSettings, 'absolute', + 'inch', 'following', (2, 5), None) + assert_raises(ValueError, FileSettings, 'absolute', + 'inch', None, (2, 5), 'following') + assert_raises(ValueError, FileSettings, 'absolute', + 'inch', None, (2, 5, 6), None) + def test_key_validation(): fs = FileSettings() @@ -129,5 +139,3 @@ def test_key_validation(): assert_raises(ValueError, fs.__setitem__, 'zero_suppression', 'following') assert_raises(ValueError, fs.__setitem__, 'zeros', 'following') assert_raises(ValueError, fs.__setitem__, 'format', (2, 5, 6)) - - diff --git a/gerber/tests/test_common.py b/gerber/tests/test_common.py index 5991e5e..357ed18 100644 --- a/gerber/tests/test_common.py +++ b/gerber/tests/test_common.py @@ -12,9 +12,10 @@ import os NCDRILL_FILE = os.path.join(os.path.dirname(__file__), - 'resources/ncdrill.DRD') + 'resources/ncdrill.DRD') TOP_COPPER_FILE = os.path.join(os.path.dirname(__file__), - 'resources/top_copper.GTL') + 'resources/top_copper.GTL') + def test_file_type_detection(): """ Test file type detection @@ -38,6 +39,3 @@ def test_file_type_validation(): """ Test file format validation """ assert_raises(ParseError, read, 'LICENSE') - - - diff --git a/gerber/tests/test_excellon.py b/gerber/tests/test_excellon.py index a9a33c7..e7c77c6 100644 --- a/gerber/tests/test_excellon.py +++ b/gerber/tests/test_excellon.py @@ -13,6 +13,7 @@ from .tests import * NCDRILL_FILE = os.path.join(os.path.dirname(__file__), 'resources/ncdrill.DRD') + def test_format_detection(): """ Test file type detection """ @@ -75,10 +76,11 @@ def test_conversion(): for statement in ncdrill_inch.statements: statement.to_metric() - for m_tool, i_tool in zip(iter(ncdrill.tools.values()), iter(ncdrill_inch.tools.values())): + for m_tool, i_tool in zip(iter(ncdrill.tools.values()), + iter(ncdrill_inch.tools.values())): assert_equal(i_tool, m_tool) - for m, i in zip(ncdrill.primitives,inch_primitives): + for m, i in zip(ncdrill.primitives, inch_primitives): assert_equal(m, i) @@ -187,12 +189,10 @@ def test_parse_incremental_position(): p = ExcellonParser(FileSettings(notation='incremental')) p._parse_line('X01Y01') p._parse_line('X01Y01') - assert_equal(p.pos, [2.,2.]) + assert_equal(p.pos, [2., 2.]) def test_parse_unknown(): p = ExcellonParser(FileSettings()) p._parse_line('Not A Valid Statement') assert_equal(p.statements[0].stmt, 'Not A Valid Statement') - - diff --git a/gerber/tests/test_excellon_statements.py b/gerber/tests/test_excellon_statements.py index 2f0ef10..8e6e06e 100644 --- a/gerber/tests/test_excellon_statements.py +++ b/gerber/tests/test_excellon_statements.py @@ -7,11 +7,13 @@ from .tests import assert_equal, assert_not_equal, assert_raises from ..excellon_statements import * from ..cam import FileSettings + def test_excellon_statement_implementation(): stmt = ExcellonStatement() assert_raises(NotImplementedError, stmt.from_excellon, None) assert_raises(NotImplementedError, stmt.to_excellon) + def test_excellontstmt(): """ Smoke test ExcellonStatement """ @@ -20,17 +22,18 @@ def test_excellontstmt(): stmt.to_metric() stmt.offset() + def test_excellontool_factory(): """ Test ExcellonTool factory methods """ exc_line = 'T8F01B02S00003H04Z05C0.12500' settings = FileSettings(format=(2, 5), zero_suppression='trailing', - units='inch', notation='absolute') + units='inch', notation='absolute') tool = ExcellonTool.from_excellon(exc_line, settings) assert_equal(tool.number, 8) assert_equal(tool.diameter, 0.125) assert_equal(tool.feed_rate, 1) - assert_equal(tool.retract_rate,2) + assert_equal(tool.retract_rate, 2) assert_equal(tool.rpm, 3) assert_equal(tool.max_hit_count, 4) assert_equal(tool.depth_offset, 5) @@ -41,7 +44,7 @@ def test_excellontool_factory(): assert_equal(tool.number, 8) assert_equal(tool.diameter, 0.125) assert_equal(tool.feed_rate, 1) - assert_equal(tool.retract_rate,2) + assert_equal(tool.retract_rate, 2) assert_equal(tool.rpm, 3) assert_equal(tool.max_hit_count, 4) assert_equal(tool.depth_offset, 5) @@ -55,7 +58,7 @@ def test_excellontool_dump(): 'T07F0S0C0.04300', 'T08F0S0C0.12500', 'T09F0S0C0.13000', 'T08B01F02H03S00003C0.12500Z04', 'T01F0S300.999C0.01200'] settings = FileSettings(format=(2, 5), zero_suppression='trailing', - units='inch', notation='absolute') + units='inch', notation='absolute') for line in exc_lines: tool = ExcellonTool.from_excellon(line, settings) assert_equal(tool.to_excellon(), line) @@ -63,7 +66,7 @@ def test_excellontool_dump(): def test_excellontool_order(): settings = FileSettings(format=(2, 5), zero_suppression='trailing', - units='inch', notation='absolute') + units='inch', notation='absolute') line = 'T8F00S00C0.12500' tool1 = ExcellonTool.from_excellon(line, settings) line = 'T8C0.12500F00S00' @@ -72,36 +75,48 @@ def test_excellontool_order(): assert_equal(tool1.feed_rate, tool2.feed_rate) assert_equal(tool1.rpm, tool2.rpm) + def test_excellontool_conversion(): - tool = ExcellonTool.from_dict(FileSettings(units='metric'), {'number': 8, 'diameter': 25.4}) + tool = ExcellonTool.from_dict(FileSettings(units='metric'), + {'number': 8, 'diameter': 25.4}) tool.to_inch() assert_equal(tool.diameter, 1.) - tool = ExcellonTool.from_dict(FileSettings(units='inch'), {'number': 8, 'diameter': 1.}) + tool = ExcellonTool.from_dict(FileSettings(units='inch'), + {'number': 8, 'diameter': 1.}) tool.to_metric() assert_equal(tool.diameter, 25.4) # Shouldn't change units if we're already using target units - tool = ExcellonTool.from_dict(FileSettings(units='inch'), {'number': 8, 'diameter': 25.4}) + tool = ExcellonTool.from_dict(FileSettings(units='inch'), + {'number': 8, 'diameter': 25.4}) tool.to_inch() assert_equal(tool.diameter, 25.4) - tool = ExcellonTool.from_dict(FileSettings(units='metric'), {'number': 8, 'diameter': 1.}) + tool = ExcellonTool.from_dict(FileSettings(units='metric'), + {'number': 8, 'diameter': 1.}) tool.to_metric() assert_equal(tool.diameter, 1.) def test_excellontool_repr(): - tool = ExcellonTool.from_dict(FileSettings(), {'number': 8, 'diameter': 0.125}) + tool = ExcellonTool.from_dict(FileSettings(), + {'number': 8, 'diameter': 0.125}) assert_equal(str(tool), '') - tool = ExcellonTool.from_dict(FileSettings(units='metric'), {'number': 8, 'diameter': 0.125}) + tool = ExcellonTool.from_dict(FileSettings(units='metric'), + {'number': 8, 'diameter': 0.125}) assert_equal(str(tool), '') + def test_excellontool_equality(): - t = ExcellonTool.from_dict(FileSettings(), {'number': 8, 'diameter': 0.125}) - t1 = ExcellonTool.from_dict(FileSettings(), {'number': 8, 'diameter': 0.125}) + t = ExcellonTool.from_dict( + FileSettings(), {'number': 8, 'diameter': 0.125}) + t1 = ExcellonTool.from_dict( + FileSettings(), {'number': 8, 'diameter': 0.125}) assert_equal(t, t1) - t1 = ExcellonTool.from_dict(FileSettings(units='metric'), {'number': 8, 'diameter': 0.125}) + t1 = ExcellonTool.from_dict(FileSettings(units='metric'), + {'number': 8, 'diameter': 0.125}) assert_not_equal(t, t1) + def test_toolselection_factory(): """ Test ToolSelectionStmt factory method """ @@ -115,6 +130,7 @@ def test_toolselection_factory(): assert_equal(stmt.tool, 42) assert_equal(stmt.compensation_index, None) + def test_toolselection_dump(): """ Test ToolSelectionStmt to_excellon() """ @@ -123,6 +139,7 @@ def test_toolselection_dump(): stmt = ToolSelectionStmt.from_excellon(line) assert_equal(stmt.to_excellon(), line) + def test_z_axis_infeed_rate_factory(): """ Test ZAxisInfeedRateStmt factory method """ @@ -133,6 +150,7 @@ def test_z_axis_infeed_rate_factory(): stmt = ZAxisInfeedRateStmt.from_excellon('F03') assert_equal(stmt.rate, 3) + def test_z_axis_infeed_rate_dump(): """ Test ZAxisInfeedRateStmt to_excellon() """ @@ -145,11 +163,12 @@ def test_z_axis_infeed_rate_dump(): stmt = ZAxisInfeedRateStmt.from_excellon(input_rate) assert_equal(stmt.to_excellon(), expected_output) + def test_coordinatestmt_factory(): """ Test CoordinateStmt factory method """ settings = FileSettings(format=(2, 5), zero_suppression='trailing', - units='inch', notation='absolute') + units='inch', notation='absolute') line = 'X0278207Y0065293' stmt = CoordinateStmt.from_excellon(line, settings) @@ -165,7 +184,7 @@ def test_coordinatestmt_factory(): # assert_equal(stmt.y, 0.575) settings = FileSettings(format=(2, 4), zero_suppression='leading', - units='inch', notation='absolute') + units='inch', notation='absolute') line = 'X9660Y4639' stmt = CoordinateStmt.from_excellon(line, settings) @@ -173,12 +192,12 @@ def test_coordinatestmt_factory(): assert_equal(stmt.y, 0.4639) assert_equal(stmt.to_excellon(settings), "X9660Y4639") assert_equal(stmt.units, 'inch') - + settings.units = 'metric' stmt = CoordinateStmt.from_excellon(line, settings) assert_equal(stmt.units, 'metric') - - + + def test_coordinatestmt_dump(): """ Test CoordinateStmt to_excellon() """ @@ -186,102 +205,110 @@ def test_coordinatestmt_dump(): 'X251295Y81528', 'X2525Y78', 'X255Y575', 'Y52', 'X2675', 'Y575', 'X2425', 'Y52', 'X23', ] settings = FileSettings(format=(2, 4), zero_suppression='leading', - units='inch', notation='absolute') + units='inch', notation='absolute') for line in lines: stmt = CoordinateStmt.from_excellon(line, settings) assert_equal(stmt.to_excellon(settings), line) + def test_coordinatestmt_conversion(): - + settings = FileSettings() settings.units = 'metric' stmt = CoordinateStmt.from_excellon('X254Y254', settings) - - #No effect + + # No effect stmt.to_metric() assert_equal(stmt.x, 25.4) assert_equal(stmt.y, 25.4) - + stmt.to_inch() assert_equal(stmt.units, 'inch') assert_equal(stmt.x, 1.) assert_equal(stmt.y, 1.) - - #No effect + + # No effect stmt.to_inch() assert_equal(stmt.x, 1.) assert_equal(stmt.y, 1.) - + settings.units = 'inch' stmt = CoordinateStmt.from_excellon('X01Y01', settings) - - #No effect + + # No effect stmt.to_inch() assert_equal(stmt.x, 1.) assert_equal(stmt.y, 1.) - + stmt.to_metric() assert_equal(stmt.units, 'metric') assert_equal(stmt.x, 25.4) assert_equal(stmt.y, 25.4) - - #No effect + + # No effect stmt.to_metric() assert_equal(stmt.x, 25.4) assert_equal(stmt.y, 25.4) + def test_coordinatestmt_offset(): stmt = CoordinateStmt.from_excellon('X01Y01', FileSettings()) stmt.offset() assert_equal(stmt.x, 1) assert_equal(stmt.y, 1) - stmt.offset(1,0) + stmt.offset(1, 0) assert_equal(stmt.x, 2.) assert_equal(stmt.y, 1.) - stmt.offset(0,1) + stmt.offset(0, 1) assert_equal(stmt.x, 2.) assert_equal(stmt.y, 2.) def test_coordinatestmt_string(): settings = FileSettings(format=(2, 4), zero_suppression='leading', - units='inch', notation='absolute') + units='inch', notation='absolute') stmt = CoordinateStmt.from_excellon('X9660Y4639', settings) assert_equal(str(stmt), '') def test_repeathole_stmt_factory(): - stmt = RepeatHoleStmt.from_excellon('R0004X015Y32', FileSettings(zeros='leading', units='inch')) + stmt = RepeatHoleStmt.from_excellon('R0004X015Y32', + FileSettings(zeros='leading', + units='inch')) assert_equal(stmt.count, 4) assert_equal(stmt.xdelta, 1.5) assert_equal(stmt.ydelta, 32) assert_equal(stmt.units, 'inch') - - stmt = RepeatHoleStmt.from_excellon('R0004X015Y32', FileSettings(zeros='leading', units='metric')) + + stmt = RepeatHoleStmt.from_excellon('R0004X015Y32', + FileSettings(zeros='leading', + units='metric')) assert_equal(stmt.units, 'metric') + def test_repeatholestmt_dump(): line = 'R4X015Y32' stmt = RepeatHoleStmt.from_excellon(line, FileSettings()) assert_equal(stmt.to_excellon(FileSettings()), line) + def test_repeatholestmt_conversion(): line = 'R4X0254Y254' settings = FileSettings() settings.units = 'metric' stmt = RepeatHoleStmt.from_excellon(line, settings) - - #No effect + + # No effect stmt.to_metric() assert_equal(stmt.xdelta, 2.54) assert_equal(stmt.ydelta, 25.4) - + stmt.to_inch() assert_equal(stmt.units, 'inch') assert_equal(stmt.xdelta, 0.1) assert_equal(stmt.ydelta, 1.) - - #no effect + + # no effect stmt.to_inch() assert_equal(stmt.xdelta, 0.1) assert_equal(stmt.ydelta, 1.) @@ -289,26 +316,28 @@ def test_repeatholestmt_conversion(): line = 'R4X01Y1' settings.units = 'inch' stmt = RepeatHoleStmt.from_excellon(line, settings) - - #no effect + + # no effect stmt.to_inch() assert_equal(stmt.xdelta, 1.) assert_equal(stmt.ydelta, 10.) - + stmt.to_metric() assert_equal(stmt.units, 'metric') assert_equal(stmt.xdelta, 25.4) assert_equal(stmt.ydelta, 254.) - - #No effect + + # No effect stmt.to_metric() assert_equal(stmt.xdelta, 25.4) assert_equal(stmt.ydelta, 254.) + def test_repeathole_str(): stmt = RepeatHoleStmt.from_excellon('R4X015Y32', FileSettings()) assert_equal(str(stmt), '') + def test_commentstmt_factory(): """ Test CommentStmt factory method """ @@ -333,42 +362,52 @@ def test_commentstmt_dump(): stmt = CommentStmt.from_excellon(line) assert_equal(stmt.to_excellon(), line) + def test_header_begin_stmt(): stmt = HeaderBeginStmt() assert_equal(stmt.to_excellon(None), 'M48') + def test_header_end_stmt(): stmt = HeaderEndStmt() assert_equal(stmt.to_excellon(None), 'M95') + def test_rewindstop_stmt(): stmt = RewindStopStmt() assert_equal(stmt.to_excellon(None), '%') + def test_z_axis_rout_position_stmt(): stmt = ZAxisRoutPositionStmt() assert_equal(stmt.to_excellon(None), 'M15') + def test_retract_with_clamping_stmt(): stmt = RetractWithClampingStmt() assert_equal(stmt.to_excellon(None), 'M16') + def test_retract_without_clamping_stmt(): stmt = RetractWithoutClampingStmt() assert_equal(stmt.to_excellon(None), 'M17') + def test_cutter_compensation_off_stmt(): stmt = CutterCompensationOffStmt() assert_equal(stmt.to_excellon(None), 'G40') + def test_cutter_compensation_left_stmt(): stmt = CutterCompensationLeftStmt() assert_equal(stmt.to_excellon(None), 'G41') + def test_cutter_compensation_right_stmt(): stmt = CutterCompensationRightStmt() assert_equal(stmt.to_excellon(None), 'G42') + def test_endofprogramstmt_factory(): settings = FileSettings(units='inch') stmt = EndOfProgramStmt.from_excellon('M30X01Y02', settings) @@ -384,61 +423,65 @@ def test_endofprogramstmt_factory(): assert_equal(stmt.x, None) assert_equal(stmt.y, 2.) + def test_endofprogramStmt_dump(): - lines = ['M30X01Y02',] + lines = ['M30X01Y02', ] for line in lines: stmt = EndOfProgramStmt.from_excellon(line, FileSettings()) assert_equal(stmt.to_excellon(FileSettings()), line) + def test_endofprogramstmt_conversion(): settings = FileSettings() settings.units = 'metric' stmt = EndOfProgramStmt.from_excellon('M30X0254Y254', settings) - #No effect + # No effect stmt.to_metric() assert_equal(stmt.x, 2.54) assert_equal(stmt.y, 25.4) - + stmt.to_inch() assert_equal(stmt.units, 'inch') assert_equal(stmt.x, 0.1) assert_equal(stmt.y, 1.0) - - #No effect + + # No effect stmt.to_inch() assert_equal(stmt.x, 0.1) assert_equal(stmt.y, 1.0) settings.units = 'inch' stmt = EndOfProgramStmt.from_excellon('M30X01Y1', settings) - - #No effect + + # No effect stmt.to_inch() assert_equal(stmt.x, 1.) assert_equal(stmt.y, 10.0) - + stmt.to_metric() assert_equal(stmt.units, 'metric') assert_equal(stmt.x, 25.4) assert_equal(stmt.y, 254.) - - #No effect + + # No effect stmt.to_metric() assert_equal(stmt.x, 25.4) assert_equal(stmt.y, 254.) + def test_endofprogramstmt_offset(): stmt = EndOfProgramStmt(1, 1) stmt.offset() assert_equal(stmt.x, 1) assert_equal(stmt.y, 1) - stmt.offset(1,0) + stmt.offset(1, 0) assert_equal(stmt.x, 2.) assert_equal(stmt.y, 1.) - stmt.offset(0,1) + stmt.offset(0, 1) assert_equal(stmt.x, 2.) assert_equal(stmt.y, 2.) + def test_unitstmt_factory(): """ Test UnitStmt factory method """ @@ -471,6 +514,7 @@ def test_unitstmt_dump(): stmt = UnitStmt.from_excellon(line) assert_equal(stmt.to_excellon(), line) + def test_unitstmt_conversion(): stmt = UnitStmt.from_excellon('METRIC,TZ') stmt.to_inch() @@ -480,6 +524,7 @@ def test_unitstmt_conversion(): stmt.to_metric() assert_equal(stmt.units, 'metric') + def test_incrementalmode_factory(): """ Test IncrementalModeStmt factory method """ @@ -527,6 +572,7 @@ def test_versionstmt_dump(): stmt = VersionStmt.from_excellon(line) assert_equal(stmt.to_excellon(), line) + def test_versionstmt_validation(): """ Test VersionStmt input validation """ @@ -608,6 +654,7 @@ def test_measmodestmt_validation(): assert_raises(ValueError, MeasuringModeStmt.from_excellon, 'M70') assert_raises(ValueError, MeasuringModeStmt, 'millimeters') + def test_measmodestmt_conversion(): line = 'M72' stmt = MeasuringModeStmt.from_excellon(line) @@ -621,27 +668,33 @@ def test_measmodestmt_conversion(): stmt.to_inch() assert_equal(stmt.units, 'inch') + def test_routemode_stmt(): stmt = RouteModeStmt() assert_equal(stmt.to_excellon(FileSettings()), 'G00') + def test_linearmode_stmt(): stmt = LinearModeStmt() assert_equal(stmt.to_excellon(FileSettings()), 'G01') + def test_drillmode_stmt(): stmt = DrillModeStmt() assert_equal(stmt.to_excellon(FileSettings()), 'G05') + def test_absolutemode_stmt(): stmt = AbsoluteModeStmt() assert_equal(stmt.to_excellon(FileSettings()), 'G90') + def test_unknownstmt(): stmt = UnknownStmt('TEST') assert_equal(stmt.stmt, 'TEST') assert_equal(str(stmt), '') + def test_unknownstmt_dump(): stmt = UnknownStmt('TEST') assert_equal(stmt.to_excellon(FileSettings()), 'TEST') diff --git a/gerber/tests/test_gerber_statements.py b/gerber/tests/test_gerber_statements.py index 79ce76b..c1985e6 100644 --- a/gerber/tests/test_gerber_statements.py +++ b/gerber/tests/test_gerber_statements.py @@ -7,6 +7,7 @@ from .tests import * from ..gerber_statements import * from ..cam import FileSettings + def test_Statement_smoketest(): stmt = Statement('Test') assert_equal(stmt.type, 'Test') @@ -16,7 +17,8 @@ def test_Statement_smoketest(): assert_in('units=inch', str(stmt)) stmt.to_metric() stmt.offset(1, 1) - assert_in('type=Test',str(stmt)) + assert_in('type=Test', str(stmt)) + def test_FSParamStmt_factory(): """ Test FSParamStruct factory @@ -35,6 +37,7 @@ def test_FSParamStmt_factory(): assert_equal(fs.notation, 'incremental') assert_equal(fs.format, (2, 7)) + def test_FSParamStmt(): """ Test FSParamStmt initialization """ @@ -48,6 +51,7 @@ def test_FSParamStmt(): assert_equal(stmt.notation, notation) assert_equal(stmt.format, fmt) + def test_FSParamStmt_dump(): """ Test FSParamStmt to_gerber() """ @@ -62,16 +66,20 @@ def test_FSParamStmt_dump(): settings = FileSettings(zero_suppression='leading', notation='absolute') assert_equal(fs.to_gerber(settings), '%FSLAX25Y25*%') + def test_FSParamStmt_string(): """ Test FSParamStmt.__str__() """ stmt = {'param': 'FS', 'zero': 'L', 'notation': 'A', 'x': '27'} fs = FSParamStmt.from_dict(stmt) - assert_equal(str(fs), '') + assert_equal(str(fs), + '') stmt = {'param': 'FS', 'zero': 'T', 'notation': 'I', 'x': '25'} fs = FSParamStmt.from_dict(stmt) - assert_equal(str(fs), '') + assert_equal(str(fs), + '') + def test_MOParamStmt_factory(): """ Test MOParamStruct factory @@ -94,6 +102,7 @@ def test_MOParamStmt_factory(): stmt = {'param': 'MO', 'mo': 'degrees kelvin'} assert_raises(ValueError, MOParamStmt.from_dict, stmt) + def test_MOParamStmt(): """ Test MOParamStmt initialization """ @@ -106,6 +115,7 @@ def test_MOParamStmt(): stmt = MOParamStmt(param, mode) assert_equal(stmt.mode, mode) + def test_MOParamStmt_dump(): """ Test MOParamStmt to_gerber() """ @@ -117,6 +127,7 @@ def test_MOParamStmt_dump(): mo = MOParamStmt.from_dict(stmt) assert_equal(mo.to_gerber(), '%MOMM*%') + def test_MOParamStmt_conversion(): stmt = {'param': 'MO', 'mo': 'MM'} mo = MOParamStmt.from_dict(stmt) @@ -128,6 +139,7 @@ def test_MOParamStmt_conversion(): mo.to_metric() assert_equal(mo.mode, 'metric') + def test_MOParamStmt_string(): """ Test MOParamStmt.__str__() """ @@ -139,6 +151,7 @@ def test_MOParamStmt_string(): mo = MOParamStmt.from_dict(stmt) assert_equal(str(mo), '') + def test_IPParamStmt_factory(): """ Test IPParamStruct factory """ @@ -150,6 +163,7 @@ def test_IPParamStmt_factory(): ip = IPParamStmt.from_dict(stmt) assert_equal(ip.ip, 'negative') + def test_IPParamStmt(): """ Test IPParamStmt initialization """ @@ -159,6 +173,7 @@ def test_IPParamStmt(): assert_equal(stmt.param, param) assert_equal(stmt.ip, ip) + def test_IPParamStmt_dump(): """ Test IPParamStmt to_gerber() """ @@ -170,6 +185,7 @@ def test_IPParamStmt_dump(): ip = IPParamStmt.from_dict(stmt) assert_equal(ip.to_gerber(), '%IPNEG*%') + def test_IPParamStmt_string(): stmt = {'param': 'IP', 'ip': 'POS'} ip = IPParamStmt.from_dict(stmt) @@ -179,22 +195,26 @@ def test_IPParamStmt_string(): ip = IPParamStmt.from_dict(stmt) assert_equal(str(ip), '') + def test_IRParamStmt_factory(): stmt = {'param': 'IR', 'angle': '45'} ir = IRParamStmt.from_dict(stmt) assert_equal(ir.param, 'IR') assert_equal(ir.angle, 45) + def test_IRParamStmt_dump(): stmt = {'param': 'IR', 'angle': '45'} ir = IRParamStmt.from_dict(stmt) assert_equal(ir.to_gerber(), '%IR45*%') + def test_IRParamStmt_string(): stmt = {'param': 'IR', 'angle': '45'} ir = IRParamStmt.from_dict(stmt) assert_equal(str(ir), '') + def test_OFParamStmt_factory(): """ Test OFParamStmt factory """ @@ -203,6 +223,7 @@ def test_OFParamStmt_factory(): assert_equal(of.a, 0.1234567) assert_equal(of.b, 0.1234567) + def test_OFParamStmt(): """ Test IPParamStmt initialization """ @@ -213,6 +234,7 @@ def test_OFParamStmt(): assert_equal(stmt.a, val) assert_equal(stmt.b, val) + def test_OFParamStmt_dump(): """ Test OFParamStmt to_gerber() """ @@ -220,10 +242,11 @@ def test_OFParamStmt_dump(): of = OFParamStmt.from_dict(stmt) assert_equal(of.to_gerber(), '%OFA0.12345B0.12345*%') + def test_OFParamStmt_conversion(): stmt = {'param': 'OF', 'a': '2.54', 'b': '25.4'} of = OFParamStmt.from_dict(stmt) - of.units='metric' + of.units = 'metric' # No effect of.to_metric() @@ -235,7 +258,7 @@ def test_OFParamStmt_conversion(): assert_equal(of.a, 0.1) assert_equal(of.b, 1.0) - #No effect + # No effect of.to_inch() assert_equal(of.a, 0.1) assert_equal(of.b, 1.0) @@ -244,7 +267,7 @@ def test_OFParamStmt_conversion(): of = OFParamStmt.from_dict(stmt) of.units = 'inch' - #No effect + # No effect of.to_inch() assert_equal(of.a, 0.1) assert_equal(of.b, 1.0) @@ -254,11 +277,12 @@ def test_OFParamStmt_conversion(): assert_equal(of.a, 2.54) assert_equal(of.b, 25.4) - #No effect + # No effect of.to_metric() assert_equal(of.a, 2.54) assert_equal(of.b, 25.4) + def test_OFParamStmt_offset(): s = OFParamStmt('OF', 0, 0) s.offset(1, 0) @@ -268,6 +292,7 @@ def test_OFParamStmt_offset(): assert_equal(s.a, 1.) assert_equal(s.b, 1.) + def test_OFParamStmt_string(): """ Test OFParamStmt __str__ """ @@ -275,6 +300,7 @@ def test_OFParamStmt_string(): of = OFParamStmt.from_dict(stmt) assert_equal(str(of), '') + def test_SFParamStmt_factory(): stmt = {'param': 'SF', 'a': '1.4', 'b': '0.9'} sf = SFParamStmt.from_dict(stmt) @@ -282,18 +308,20 @@ def test_SFParamStmt_factory(): assert_equal(sf.a, 1.4) assert_equal(sf.b, 0.9) + def test_SFParamStmt_dump(): stmt = {'param': 'SF', 'a': '1.4', 'b': '0.9'} sf = SFParamStmt.from_dict(stmt) assert_equal(sf.to_gerber(), '%SFA1.4B0.9*%') + def test_SFParamStmt_conversion(): stmt = {'param': 'OF', 'a': '2.54', 'b': '25.4'} of = SFParamStmt.from_dict(stmt) of.units = 'metric' of.to_metric() - #No effect + # No effect assert_equal(of.a, 2.54) assert_equal(of.b, 25.4) @@ -302,7 +330,7 @@ def test_SFParamStmt_conversion(): assert_equal(of.a, 0.1) assert_equal(of.b, 1.0) - #No effect + # No effect of.to_inch() assert_equal(of.a, 0.1) assert_equal(of.b, 1.0) @@ -311,7 +339,7 @@ def test_SFParamStmt_conversion(): of = SFParamStmt.from_dict(stmt) of.units = 'inch' - #No effect + # No effect of.to_inch() assert_equal(of.a, 0.1) assert_equal(of.b, 1.0) @@ -321,11 +349,12 @@ def test_SFParamStmt_conversion(): assert_equal(of.a, 2.54) assert_equal(of.b, 25.4) - #No effect + # No effect of.to_metric() assert_equal(of.a, 2.54) assert_equal(of.b, 25.4) + def test_SFParamStmt_offset(): s = SFParamStmt('OF', 0, 0) s.offset(1, 0) @@ -335,11 +364,13 @@ def test_SFParamStmt_offset(): assert_equal(s.a, 1.) assert_equal(s.b, 1.) + def test_SFParamStmt_string(): stmt = {'param': 'SF', 'a': '1.4', 'b': '0.9'} sf = SFParamStmt.from_dict(stmt) assert_equal(str(sf), '') + def test_LPParamStmt_factory(): """ Test LPParamStmt factory """ @@ -351,6 +382,7 @@ def test_LPParamStmt_factory(): lp = LPParamStmt.from_dict(stmt) assert_equal(lp.lp, 'dark') + def test_LPParamStmt_dump(): """ Test LPParamStmt to_gerber() """ @@ -362,6 +394,7 @@ def test_LPParamStmt_dump(): lp = LPParamStmt.from_dict(stmt) assert_equal(lp.to_gerber(), '%LPD*%') + def test_LPParamStmt_string(): """ Test LPParamStmt.__str__() """ @@ -373,6 +406,7 @@ def test_LPParamStmt_string(): lp = LPParamStmt.from_dict(stmt) assert_equal(str(lp), '') + def test_AMParamStmt_factory(): name = 'DONUTVAR' macro = ( @@ -387,7 +421,7 @@ def test_AMParamStmt_factory(): 7,0,0,7,6,0.2,0* 8,THIS IS AN UNSUPPORTED PRIMITIVE* ''') - s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro }) + s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro}) s.build() assert_equal(len(s.primitives), 10) assert_true(isinstance(s.primitives[0], AMCommentPrimitive)) @@ -401,15 +435,16 @@ def test_AMParamStmt_factory(): assert_true(isinstance(s.primitives[8], AMThermalPrimitive)) assert_true(isinstance(s.primitives[9], AMUnsupportPrimitive)) + def testAMParamStmt_conversion(): name = 'POLYGON' macro = '5,1,8,25.4,25.4,25.4,0*' - s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro }) + s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro}) s.build() s.units = 'metric' - #No effect + # No effect s.to_metric() assert_equal(s.primitives[0].position, (25.4, 25.4)) assert_equal(s.primitives[0].diameter, 25.4) @@ -419,17 +454,17 @@ def testAMParamStmt_conversion(): assert_equal(s.primitives[0].position, (1., 1.)) assert_equal(s.primitives[0].diameter, 1.) - #No effect + # No effect s.to_inch() assert_equal(s.primitives[0].position, (1., 1.)) assert_equal(s.primitives[0].diameter, 1.) macro = '5,1,8,1,1,1,0*' - s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro }) + s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro}) s.build() s.units = 'inch' - #No effect + # No effect s.to_inch() assert_equal(s.primitives[0].position, (1., 1.)) assert_equal(s.primitives[0].diameter, 1.) @@ -439,42 +474,48 @@ def testAMParamStmt_conversion(): assert_equal(s.primitives[0].position, (25.4, 25.4)) assert_equal(s.primitives[0].diameter, 25.4) - #No effect + # No effect s.to_metric() assert_equal(s.primitives[0].position, (25.4, 25.4)) assert_equal(s.primitives[0].diameter, 25.4) + def test_AMParamStmt_dump(): name = 'POLYGON' macro = '5,1,8,25.4,25.4,25.4,0.0' - s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro }) + s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro}) s.build() assert_equal(s.to_gerber(), '%AMPOLYGON*5,1,8,25.4,25.4,25.4,0.0*%') + def test_AMParamStmt_string(): name = 'POLYGON' macro = '5,1,8,25.4,25.4,25.4,0*' - s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro }) + s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro}) s.build() assert_equal(str(s), '') + def test_ASParamStmt_factory(): stmt = {'param': 'AS', 'mode': 'AXBY'} s = ASParamStmt.from_dict(stmt) assert_equal(s.param, 'AS') assert_equal(s.mode, 'AXBY') + def test_ASParamStmt_dump(): stmt = {'param': 'AS', 'mode': 'AXBY'} s = ASParamStmt.from_dict(stmt) assert_equal(s.to_gerber(), '%ASAXBY*%') + def test_ASParamStmt_string(): stmt = {'param': 'AS', 'mode': 'AXBY'} s = ASParamStmt.from_dict(stmt) assert_equal(str(s), '') + def test_INParamStmt_factory(): """ Test INParamStmt factory """ @@ -482,6 +523,7 @@ def test_INParamStmt_factory(): inp = INParamStmt.from_dict(stmt) assert_equal(inp.name, 'test') + def test_INParamStmt_dump(): """ Test INParamStmt to_gerber() """ @@ -489,11 +531,13 @@ def test_INParamStmt_dump(): inp = INParamStmt.from_dict(stmt) assert_equal(inp.to_gerber(), '%INtest*%') + def test_INParamStmt_string(): stmt = {'param': 'IN', 'name': 'test'} inp = INParamStmt.from_dict(stmt) assert_equal(str(inp), '') + def test_LNParamStmt_factory(): """ Test LNParamStmt factory """ @@ -501,6 +545,7 @@ def test_LNParamStmt_factory(): lnp = LNParamStmt.from_dict(stmt) assert_equal(lnp.name, 'test') + def test_LNParamStmt_dump(): """ Test LNParamStmt to_gerber() """ @@ -508,11 +553,13 @@ def test_LNParamStmt_dump(): lnp = LNParamStmt.from_dict(stmt) assert_equal(lnp.to_gerber(), '%LNtest*%') + def test_LNParamStmt_string(): stmt = {'param': 'LN', 'name': 'test'} lnp = LNParamStmt.from_dict(stmt) assert_equal(str(lnp), '') + def test_comment_stmt(): """ Test comment statement """ @@ -520,31 +567,37 @@ def test_comment_stmt(): assert_equal(stmt.type, 'COMMENT') assert_equal(stmt.comment, 'A comment') + def test_comment_stmt_dump(): """ Test CommentStmt to_gerber() """ stmt = CommentStmt('A comment') assert_equal(stmt.to_gerber(), 'G04A comment*') + def test_comment_stmt_string(): stmt = CommentStmt('A comment') assert_equal(str(stmt), '') + def test_eofstmt(): """ Test EofStmt """ stmt = EofStmt() assert_equal(stmt.type, 'EOF') + def test_eofstmt_dump(): """ Test EofStmt to_gerber() """ stmt = EofStmt() assert_equal(stmt.to_gerber(), 'M02*') + def test_eofstmt_string(): assert_equal(str(EofStmt()), '') + def test_quadmodestmt_factory(): """ Test QuadrantModeStmt.from_gerber() """ @@ -557,6 +610,7 @@ def test_quadmodestmt_factory(): stmt = QuadrantModeStmt.from_gerber(line) assert_equal(stmt.mode, 'multi-quadrant') + def test_quadmodestmt_validation(): """ Test QuadrantModeStmt input validation """ @@ -564,6 +618,7 @@ def test_quadmodestmt_validation(): assert_raises(ValueError, QuadrantModeStmt.from_gerber, line) assert_raises(ValueError, QuadrantModeStmt, 'quadrant-ful') + def test_quadmodestmt_dump(): """ Test QuadrantModeStmt.to_gerber() """ @@ -571,6 +626,7 @@ def test_quadmodestmt_dump(): stmt = QuadrantModeStmt.from_gerber(line) assert_equal(stmt.to_gerber(), line) + def test_regionmodestmt_factory(): """ Test RegionModeStmt.from_gerber() """ @@ -583,6 +639,7 @@ def test_regionmodestmt_factory(): stmt = RegionModeStmt.from_gerber(line) assert_equal(stmt.mode, 'off') + def test_regionmodestmt_validation(): """ Test RegionModeStmt input validation """ @@ -590,6 +647,7 @@ def test_regionmodestmt_validation(): assert_raises(ValueError, RegionModeStmt.from_gerber, line) assert_raises(ValueError, RegionModeStmt, 'off-ish') + def test_regionmodestmt_dump(): """ Test RegionModeStmt.to_gerber() """ @@ -597,6 +655,7 @@ def test_regionmodestmt_dump(): stmt = RegionModeStmt.from_gerber(line) assert_equal(stmt.to_gerber(), line) + def test_unknownstmt(): """ Test UnknownStmt """ @@ -605,6 +664,7 @@ def test_unknownstmt(): assert_equal(stmt.type, 'UNKNOWN') assert_equal(stmt.line, line) + def test_unknownstmt_dump(): """ Test UnknownStmt.to_gerber() """ @@ -613,15 +673,17 @@ def test_unknownstmt_dump(): stmt = UnknownStmt(line) assert_equal(stmt.to_gerber(), line) + def test_statement_string(): """ Test Statement.__str__() """ stmt = Statement('PARAM') assert_in('type=PARAM', str(stmt)) - stmt.test='PASS' + stmt.test = 'PASS' assert_in('test=PASS', str(stmt)) assert_in('type=PARAM', str(stmt)) + def test_ADParamStmt_factory(): """ Test ADParamStmt factory """ @@ -653,12 +715,14 @@ def test_ADParamStmt_factory(): assert_equal(ad.shape, 'R') assert_equal(ad.modifiers, [(1.42, 1.24)]) + def test_ADParamStmt_conversion(): - stmt = {'param': 'AD', 'd': 0, 'shape': 'C', 'modifiers': '25.4X25.4,25.4X25.4'} + stmt = {'param': 'AD', 'd': 0, 'shape': 'C', + 'modifiers': '25.4X25.4,25.4X25.4'} ad = ADParamStmt.from_dict(stmt) ad.units = 'metric' - #No effect + # No effect ad.to_metric() assert_equal(ad.modifiers[0], (25.4, 25.4)) assert_equal(ad.modifiers[1], (25.4, 25.4)) @@ -668,7 +732,7 @@ def test_ADParamStmt_conversion(): assert_equal(ad.modifiers[0], (1., 1.)) assert_equal(ad.modifiers[1], (1., 1.)) - #No effect + # No effect ad.to_inch() assert_equal(ad.modifiers[0], (1., 1.)) assert_equal(ad.modifiers[1], (1., 1.)) @@ -677,7 +741,7 @@ def test_ADParamStmt_conversion(): ad = ADParamStmt.from_dict(stmt) ad.units = 'inch' - #No effect + # No effect ad.to_inch() assert_equal(ad.modifiers[0], (1., 1.)) assert_equal(ad.modifiers[1], (1., 1.)) @@ -686,11 +750,12 @@ def test_ADParamStmt_conversion(): assert_equal(ad.modifiers[0], (25.4, 25.4)) assert_equal(ad.modifiers[1], (25.4, 25.4)) - #No effect + # No effect ad.to_metric() assert_equal(ad.modifiers[0], (25.4, 25.4)) assert_equal(ad.modifiers[1], (25.4, 25.4)) + def test_ADParamStmt_dump(): stmt = {'param': 'AD', 'd': 0, 'shape': 'C'} ad = ADParamStmt.from_dict(stmt) @@ -699,6 +764,7 @@ def test_ADParamStmt_dump(): ad = ADParamStmt.from_dict(stmt) assert_equal(ad.to_gerber(), '%ADD0C,1X1,1X1*%') + def test_ADPamramStmt_string(): stmt = {'param': 'AD', 'd': 0, 'shape': 'C'} ad = ADParamStmt.from_dict(stmt) @@ -716,12 +782,14 @@ def test_ADPamramStmt_string(): ad = ADParamStmt.from_dict(stmt) assert_equal(str(ad), '') + def test_MIParamStmt_factory(): stmt = {'param': 'MI', 'a': 1, 'b': 1} mi = MIParamStmt.from_dict(stmt) assert_equal(mi.a, 1) assert_equal(mi.b, 1) + def test_MIParamStmt_dump(): stmt = {'param': 'MI', 'a': 1, 'b': 1} mi = MIParamStmt.from_dict(stmt) @@ -733,6 +801,7 @@ def test_MIParamStmt_dump(): mi = MIParamStmt.from_dict(stmt) assert_equal(mi.to_gerber(), '%MIA0B1*%') + def test_MIParamStmt_string(): stmt = {'param': 'MI', 'a': 1, 'b': 1} mi = MIParamStmt.from_dict(stmt) @@ -746,6 +815,7 @@ def test_MIParamStmt_string(): mi = MIParamStmt.from_dict(stmt) assert_equal(str(mi), '') + def test_coordstmt_ctor(): cs = CoordStmt('G04', 0.0, 0.1, 0.2, 0.3, 'D01', FileSettings()) assert_equal(cs.function, 'G04') @@ -755,8 +825,10 @@ def test_coordstmt_ctor(): assert_equal(cs.j, 0.3) assert_equal(cs.op, 'D01') + def test_coordstmt_factory(): - stmt = {'function': 'G04', 'x': '0', 'y': '001', 'i': '002', 'j': '003', 'op': 'D01'} + stmt = {'function': 'G04', 'x': '0', 'y': '001', + 'i': '002', 'j': '003', 'op': 'D01'} cs = CoordStmt.from_dict(stmt, FileSettings()) assert_equal(cs.function, 'G04') assert_equal(cs.x, 0.0) @@ -765,15 +837,17 @@ def test_coordstmt_factory(): assert_equal(cs.j, 0.3) assert_equal(cs.op, 'D01') + def test_coordstmt_dump(): cs = CoordStmt('G04', 0.0, 0.1, 0.2, 0.3, 'D01', FileSettings()) assert_equal(cs.to_gerber(FileSettings()), 'G04X0Y001I002J003D01*') + def test_coordstmt_conversion(): cs = CoordStmt('G71', 25.4, 25.4, 25.4, 25.4, 'D01', FileSettings()) cs.units = 'metric' - #No effect + # No effect cs.to_metric() assert_equal(cs.x, 25.4) assert_equal(cs.y, 25.4) @@ -789,7 +863,7 @@ def test_coordstmt_conversion(): assert_equal(cs.j, 1.) assert_equal(cs.function, 'G70') - #No effect + # No effect cs.to_inch() assert_equal(cs.x, 1.) assert_equal(cs.y, 1.) @@ -800,7 +874,7 @@ def test_coordstmt_conversion(): cs = CoordStmt('G70', 1., 1., 1., 1., 'D01', FileSettings()) cs.units = 'inch' - #No effect + # No effect cs.to_inch() assert_equal(cs.x, 1.) assert_equal(cs.y, 1.) @@ -815,7 +889,7 @@ def test_coordstmt_conversion(): assert_equal(cs.j, 25.4) assert_equal(cs.function, 'G71') - #No effect + # No effect cs.to_metric() assert_equal(cs.x, 25.4) assert_equal(cs.y, 25.4) @@ -823,6 +897,7 @@ def test_coordstmt_conversion(): assert_equal(cs.j, 25.4) assert_equal(cs.function, 'G71') + def test_coordstmt_offset(): c = CoordStmt('G71', 0, 0, 0, 0, 'D01', FileSettings()) c.offset(1, 0) @@ -836,9 +911,11 @@ def test_coordstmt_offset(): assert_equal(c.i, 1.) assert_equal(c.j, 1.) + def test_coordstmt_string(): cs = CoordStmt('G04', 0, 1, 2, 3, 'D01', FileSettings()) - assert_equal(str(cs), '') + assert_equal(str(cs), + '') cs = CoordStmt('G04', None, None, None, None, 'D02', FileSettings()) assert_equal(str(cs), '') cs = CoordStmt('G04', None, None, None, None, 'D03', FileSettings()) @@ -846,6 +923,7 @@ def test_coordstmt_string(): cs = CoordStmt('G04', None, None, None, None, 'TEST', FileSettings()) assert_equal(str(cs), '') + def test_aperturestmt_ctor(): ast = ApertureStmt(3, False) assert_equal(ast.d, 3) @@ -860,11 +938,10 @@ def test_aperturestmt_ctor(): assert_equal(ast.d, 3) assert_equal(ast.deprecated, False) + def test_aperturestmt_dump(): ast = ApertureStmt(3, False) assert_equal(ast.to_gerber(), 'D3*') ast = ApertureStmt(3, True) assert_equal(ast.to_gerber(), 'G54D3*') assert_equal(str(ast), '') - - diff --git a/gerber/tests/test_ipc356.py b/gerber/tests/test_ipc356.py index f123a38..45bb01b 100644 --- a/gerber/tests/test_ipc356.py +++ b/gerber/tests/test_ipc356.py @@ -2,18 +2,21 @@ # -*- coding: utf-8 -*- # Author: Hamilton Kibbe -from ..ipc356 import * +from ..ipc356 import * from ..cam import FileSettings from .tests import * import os IPC_D_356_FILE = os.path.join(os.path.dirname(__file__), - 'resources/ipc-d-356.ipc') + 'resources/ipc-d-356.ipc') + + def test_read(): ipcfile = read(IPC_D_356_FILE) assert(isinstance(ipcfile, IPC_D_356)) + def test_parser(): ipcfile = read(IPC_D_356_FILE) assert_equal(ipcfile.settings.units, 'inch') @@ -28,6 +31,7 @@ def test_parser(): assert_equal(set(ipcfile.outlines[0].points), {(0., 0.), (2.25, 0.), (2.25, 1.5), (0., 1.5), (0.13, 0.024)}) + def test_comment(): c = IPC356_Comment('Layer Stackup:') assert_equal(c.comment, 'Layer Stackup:') @@ -36,6 +40,7 @@ def test_comment(): assert_raises(ValueError, IPC356_Comment.from_line, 'P JOB') assert_equal(str(c), '') + def test_parameter(): p = IPC356_Parameter('VER', 'IPC-D-356A') assert_equal(p.parameter, 'VER') @@ -43,27 +48,32 @@ def test_parameter(): p = IPC356_Parameter.from_line('P VER IPC-D-356A ') assert_equal(p.parameter, 'VER') assert_equal(p.value, 'IPC-D-356A') - assert_raises(ValueError, IPC356_Parameter.from_line, 'C Layer Stackup: ') + assert_raises(ValueError, IPC356_Parameter.from_line, + 'C Layer Stackup: ') assert_equal(str(p), '') + def test_eof(): e = IPC356_EndOfFile() assert_equal(e.to_netlist(), '999') assert_equal(str(e), '') + def test_outline(): type = 'BOARD_EDGE' points = [(0.01, 0.01), (2., 2.), (4., 2.), (4., 6.)] b = IPC356_Outline(type, points) assert_equal(b.type, type) assert_equal(b.points, points) - b = IPC356_Outline.from_line('389BOARD_EDGE X100Y100 X20000Y20000' - ' X40000 Y60000', FileSettings(units='inch')) + b = IPC356_Outline.from_line('389BOARD_EDGE X100Y100 X20000Y20000 X40000 Y60000', + FileSettings(units='inch')) assert_equal(b.type, 'BOARD_EDGE') assert_equal(b.points, points) + def test_test_record(): - assert_raises(ValueError, IPC356_TestRecord.from_line, 'P JOB', FileSettings()) + assert_raises(ValueError, IPC356_TestRecord.from_line, + 'P JOB', FileSettings()) record_string = '317+5VDC VIA - D0150PA00X 006647Y 012900X0000 S3' r = IPC356_TestRecord.from_line(record_string, FileSettings(units='inch')) assert_equal(r.feature_type, 'through-hole') @@ -81,8 +91,7 @@ def test_test_record(): assert_almost_equal(r.x_coord, 6.647) assert_almost_equal(r.y_coord, 12.9) assert_equal(r.rect_x, 0.) - assert_equal(str(r), - '') + assert_equal(str(r), '') record_string = '327+3.3VDC R40 -1 PA01X 032100Y 007124X0236Y0315R180 S0' r = IPC356_TestRecord.from_line(record_string, FileSettings(units='inch')) @@ -98,13 +107,13 @@ def test_test_record(): assert_almost_equal(r.rect_y, 0.0315) assert_equal(r.rect_rotation, 180) assert_equal(r.soldermask_info, 'none') - r = IPC356_TestRecord.from_line(record_string, FileSettings(units='metric')) + r = IPC356_TestRecord.from_line( + record_string, FileSettings(units='metric')) assert_almost_equal(r.x_coord, 32.1) assert_almost_equal(r.y_coord, 7.124) assert_almost_equal(r.rect_x, 0.236) assert_almost_equal(r.rect_y, 0.315) - record_string = '317 J4 -M2 D0330PA00X 012447Y 008030X0000 S1' r = IPC356_TestRecord.from_line(record_string, FileSettings(units='inch')) assert_equal(r.feature_type, 'through-hole') diff --git a/gerber/tests/test_layers.py b/gerber/tests/test_layers.py index c77084d..3f2bcfc 100644 --- a/gerber/tests/test_layers.py +++ b/gerber/tests/test_layers.py @@ -15,7 +15,7 @@ def test_guess_layer_class(): test_vectors = [(None, 'unknown'), ('NCDRILL.TXT', 'unknown'), ('example_board.gtl', 'top'), ('exampmle_board.sst', 'topsilk'), - ('ipc-d-356.ipc', 'ipc_netlist'),] + ('ipc-d-356.ipc', 'ipc_netlist'), ] for hint in hints: for ext in hint.ext: diff --git a/gerber/tests/test_primitives.py b/gerber/tests/test_primitives.py index f8a32da..e6ed1cd 100644 --- a/gerber/tests/test_primitives.py +++ b/gerber/tests/test_primitives.py @@ -9,11 +9,12 @@ from operator import add def test_primitive_smoketest(): p = Primitive() - assert_raises(NotImplementedError, p.bounding_box) + #assert_raises(NotImplementedError, p.bounding_box) p.to_metric() p.to_inch() p.offset(1, 1) + def test_line_angle(): """ Test Line primitive angle calculation """ @@ -24,19 +25,20 @@ def test_line_angle(): ((0, 0), (-1, 0), math.radians(180)), ((0, 0), (-1, -1), math.radians(225)), ((0, 0), (0, -1), math.radians(270)), - ((0, 0), (1, -1), math.radians(315)),] + ((0, 0), (1, -1), math.radians(315)), ] for start, end, expected in cases: l = Line(start, end, 0) line_angle = (l.angle + 2 * math.pi) % (2 * math.pi) assert_almost_equal(line_angle, expected) + def test_line_bounds(): """ Test Line primitive bounding box calculation """ cases = [((0, 0), (1, 1), ((-1, 2), (-1, 2))), ((-1, -1), (1, 1), ((-2, 2), (-2, 2))), ((1, 1), (-1, -1), ((-2, 2), (-2, 2))), - ((-1, 1), (1, -1), ((-2, 2), (-2, 2))),] + ((-1, 1), (1, -1), ((-2, 2), (-2, 2))), ] c = Circle((0, 0), 2) r = Rectangle((0, 0), 2, 2) @@ -49,11 +51,12 @@ def test_line_bounds(): cases = [((0, 0), (1, 1), ((-1.5, 2.5), (-1, 2))), ((-1, -1), (1, 1), ((-2.5, 2.5), (-2, 2))), ((1, 1), (-1, -1), ((-2.5, 2.5), (-2, 2))), - ((-1, 1), (1, -1), ((-2.5, 2.5), (-2, 2))),] + ((-1, 1), (1, -1), ((-2.5, 2.5), (-2, 2))), ] for start, end, expected in cases: l = Line(start, end, r) assert_equal(l.bounding_box, expected) + def test_line_vertices(): c = Circle((0, 0), 2) l = Line((0, 0), (1, 1), c) @@ -61,20 +64,25 @@ def test_line_vertices(): # All 4 compass points, all 4 quadrants and the case where start == end test_cases = [((0, 0), (1, 0), ((-1, -1), (-1, 1), (2, 1), (2, -1))), - ((0, 0), (1, 1), ((-1, -1), (-1, 1), (0, 2), (2, 2), (2, 0), (1,-1))), - ((0, 0), (0, 1), ((-1, -1), (-1, 2), (1, 2), (1, -1))), - ((0, 0), (-1, 1), ((-1, -1), (-2, 0), (-2, 2), (0, 2), (1, 1), (1, -1))), - ((0, 0), (-1, 0), ((-2, -1), (-2, 1), (1, 1), (1, -1))), - ((0, 0), (-1, -1), ((-2, -2), (1, -1), (1, 1), (-1, 1), (-2, 0), (0,-2))), - ((0, 0), (0, -1), ((-1, -2), (-1, 1), (1, 1), (1, -2))), - ((0, 0), (1, -1), ((-1, -1), (0, -2), (2, -2), (2, 0), (1, 1), (-1, 1))), - ((0, 0), (0, 0), ((-1, -1), (-1, 1), (1, 1), (1, -1))),] + ((0, 0), (1, 1), ((-1, -1), (-1, 1), + (0, 2), (2, 2), (2, 0), (1, -1))), + ((0, 0), (0, 1), ((-1, -1), (-1, 2), (1, 2), (1, -1))), + ((0, 0), (-1, 1), ((-1, -1), (-2, 0), + (-2, 2), (0, 2), (1, 1), (1, -1))), + ((0, 0), (-1, 0), ((-2, -1), (-2, 1), (1, 1), (1, -1))), + ((0, 0), (-1, -1), ((-2, -2), (1, -1), + (1, 1), (-1, 1), (-2, 0), (0, -2))), + ((0, 0), (0, -1), ((-1, -2), (-1, 1), (1, 1), (1, -2))), + ((0, 0), (1, -1), ((-1, -1), (0, -2), + (2, -2), (2, 0), (1, 1), (-1, 1))), + ((0, 0), (0, 0), ((-1, -1), (-1, 1), (1, 1), (1, -1))), ] r = Rectangle((0, 0), 2, 2) for start, end, vertices in test_cases: l = Line(start, end, r) assert_equal(set(vertices), set(l.vertices)) + def test_line_conversion(): c = Circle((0, 0), 25.4, units='metric') l = Line((2.54, 25.4), (254.0, 2540.0), c, units='metric') @@ -105,13 +113,12 @@ def test_line_conversion(): assert_equal(l.end, (10.0, 100.0)) assert_equal(l.aperture.diameter, 1.0) - l.to_metric() assert_equal(l.start, (2.54, 25.4)) assert_equal(l.end, (254.0, 2540.0)) assert_equal(l.aperture.diameter, 25.4) - #No effect + # No effect l.to_metric() assert_equal(l.start, (2.54, 25.4)) assert_equal(l.end, (254.0, 2540.0)) @@ -133,56 +140,63 @@ def test_line_conversion(): assert_equal(l.aperture.width, 25.4) assert_equal(l.aperture.height, 254.0) + def test_line_offset(): c = Circle((0, 0), 1) l = Line((0, 0), (1, 1), c) l.offset(1, 0) - assert_equal(l.start,(1., 0.)) + assert_equal(l.start, (1., 0.)) assert_equal(l.end, (2., 1.)) l.offset(0, 1) - assert_equal(l.start,(1., 1.)) + assert_equal(l.start, (1., 1.)) assert_equal(l.end, (2., 2.)) + def test_arc_radius(): """ Test Arc primitive radius calculation """ cases = [((-3, 4), (5, 0), (0, 0), 5), - ((0, 1), (1, 0), (0, 0), 1),] + ((0, 1), (1, 0), (0, 0), 1), ] for start, end, center, radius in cases: a = Arc(start, end, center, 'clockwise', 0) assert_equal(a.radius, radius) + def test_arc_sweep_angle(): """ Test Arc primitive sweep angle calculation """ cases = [((1, 0), (0, 1), (0, 0), 'counterclockwise', math.radians(90)), ((1, 0), (0, 1), (0, 0), 'clockwise', math.radians(270)), ((1, 0), (-1, 0), (0, 0), 'clockwise', math.radians(180)), - ((1, 0), (-1, 0), (0, 0), 'counterclockwise', math.radians(180)),] + ((1, 0), (-1, 0), (0, 0), 'counterclockwise', math.radians(180)), ] for start, end, center, direction, sweep in cases: - c = Circle((0,0), 1) + c = Circle((0, 0), 1) a = Arc(start, end, center, direction, c) assert_equal(a.sweep_angle, sweep) + def test_arc_bounds(): """ Test Arc primitive bounding box calculation """ - cases = [((1, 0), (0, 1), (0, 0), 'clockwise', ((-1.5, 1.5), (-1.5, 1.5))), - ((1, 0), (0, 1), (0, 0), 'counterclockwise', ((-0.5, 1.5), (-0.5, 1.5))), - #TODO: ADD MORE TEST CASES HERE + cases = [((1, 0), (0, 1), (0, 0), 'clockwise', ((-1.5, 1.5), (-1.5, 1.5))), + ((1, 0), (0, 1), (0, 0), 'counterclockwise', + ((-0.5, 1.5), (-0.5, 1.5))), + # TODO: ADD MORE TEST CASES HERE ] for start, end, center, direction, bounds in cases: - c = Circle((0,0), 1) + c = Circle((0, 0), 1) a = Arc(start, end, center, direction, c) assert_equal(a.bounding_box, bounds) + def test_arc_conversion(): c = Circle((0, 0), 25.4, units='metric') - a = Arc((2.54, 25.4), (254.0, 2540.0), (25400.0, 254000.0),'clockwise', c, units='metric') + a = Arc((2.54, 25.4), (254.0, 2540.0), (25400.0, 254000.0), + 'clockwise', c, units='metric') - #No effect + # No effect a.to_metric() assert_equal(a.start, (2.54, 25.4)) assert_equal(a.end, (254.0, 2540.0)) @@ -195,7 +209,7 @@ def test_arc_conversion(): assert_equal(a.center, (1000.0, 10000.0)) assert_equal(a.aperture.diameter, 1.0) - #no effect + # no effect a.to_inch() assert_equal(a.start, (0.1, 1.0)) assert_equal(a.end, (10.0, 100.0)) @@ -203,41 +217,46 @@ def test_arc_conversion(): assert_equal(a.aperture.diameter, 1.0) c = Circle((0, 0), 1.0, units='inch') - a = Arc((0.1, 1.0), (10.0, 100.0), (1000.0, 10000.0),'clockwise', c, units='inch') + a = Arc((0.1, 1.0), (10.0, 100.0), (1000.0, 10000.0), + 'clockwise', c, units='inch') a.to_metric() assert_equal(a.start, (2.54, 25.4)) assert_equal(a.end, (254.0, 2540.0)) assert_equal(a.center, (25400.0, 254000.0)) assert_equal(a.aperture.diameter, 25.4) + def test_arc_offset(): c = Circle((0, 0), 1) a = Arc((0, 0), (1, 1), (2, 2), 'clockwise', c) a.offset(1, 0) - assert_equal(a.start,(1., 0.)) + assert_equal(a.start, (1., 0.)) assert_equal(a.end, (2., 1.)) assert_equal(a.center, (3., 2.)) a.offset(0, 1) - assert_equal(a.start,(1., 1.)) + assert_equal(a.start, (1., 1.)) assert_equal(a.end, (2., 2.)) assert_equal(a.center, (3., 3.)) + def test_circle_radius(): """ Test Circle primitive radius calculation """ c = Circle((1, 1), 2) assert_equal(c.radius, 1) + def test_circle_bounds(): """ Test Circle bounding box calculation """ c = Circle((1, 1), 2) assert_equal(c.bounding_box, ((0, 2), (0, 2))) + def test_circle_conversion(): c = Circle((2.54, 25.4), 254.0, units='metric') - c.to_metric() #shouldn't do antyhing + c.to_metric() # shouldn't do antyhing assert_equal(c.position, (2.54, 25.4)) assert_equal(c.diameter, 254.) @@ -245,13 +264,13 @@ def test_circle_conversion(): assert_equal(c.position, (0.1, 1.)) assert_equal(c.diameter, 10.) - #no effect + # no effect c.to_inch() assert_equal(c.position, (0.1, 1.)) assert_equal(c.diameter, 10.) c = Circle((0.1, 1.0), 10.0, units='inch') - #No effect + # No effect c.to_inch() assert_equal(c.position, (0.1, 1.)) assert_equal(c.diameter, 10.) @@ -260,17 +279,19 @@ def test_circle_conversion(): assert_equal(c.position, (2.54, 25.4)) assert_equal(c.diameter, 254.) - #no effect + # no effect c.to_metric() assert_equal(c.position, (2.54, 25.4)) assert_equal(c.diameter, 254.) + def test_circle_offset(): c = Circle((0, 0), 1) c.offset(1, 0) - assert_equal(c.position,(1., 0.)) + assert_equal(c.position, (1., 0.)) c.offset(0, 1) - assert_equal(c.position,(1., 1.)) + assert_equal(c.position, (1., 1.)) + def test_ellipse_ctor(): """ Test ellipse creation @@ -280,6 +301,7 @@ def test_ellipse_ctor(): assert_equal(e.width, 3) assert_equal(e.height, 2) + def test_ellipse_bounds(): """ Test ellipse bounding box calculation """ @@ -292,10 +314,11 @@ def test_ellipse_bounds(): e = Ellipse((2, 2), 4, 2, rotation=270) assert_equal(e.bounding_box, ((1, 3), (0, 4))) + def test_ellipse_conversion(): e = Ellipse((2.54, 25.4), 254.0, 2540., units='metric') - #No effect + # No effect e.to_metric() assert_equal(e.position, (2.54, 25.4)) assert_equal(e.width, 254.) @@ -306,7 +329,7 @@ def test_ellipse_conversion(): assert_equal(e.width, 10.) assert_equal(e.height, 100.) - #No effect + # No effect e.to_inch() assert_equal(e.position, (0.1, 1.)) assert_equal(e.width, 10.) @@ -314,7 +337,7 @@ def test_ellipse_conversion(): e = Ellipse((0.1, 1.), 10.0, 100., units='inch') - #no effect + # no effect e.to_inch() assert_equal(e.position, (0.1, 1.)) assert_equal(e.width, 10.) @@ -331,40 +354,44 @@ def test_ellipse_conversion(): assert_equal(e.width, 254.) assert_equal(e.height, 2540.) + def test_ellipse_offset(): e = Ellipse((0, 0), 1, 2) e.offset(1, 0) - assert_equal(e.position,(1., 0.)) + assert_equal(e.position, (1., 0.)) e.offset(0, 1) - assert_equal(e.position,(1., 1.)) + assert_equal(e.position, (1., 1.)) + def test_rectangle_ctor(): """ Test rectangle creation """ - test_cases = (((0,0), 1, 1), ((0, 0), 1, 2), ((1,1), 1, 2)) + test_cases = (((0, 0), 1, 1), ((0, 0), 1, 2), ((1, 1), 1, 2)) for pos, width, height in test_cases: r = Rectangle(pos, width, height) assert_equal(r.position, pos) assert_equal(r.width, width) assert_equal(r.height, height) + def test_rectangle_bounds(): """ Test rectangle bounding box calculation """ - r = Rectangle((0,0), 2, 2) + r = Rectangle((0, 0), 2, 2) xbounds, ybounds = r.bounding_box assert_array_almost_equal(xbounds, (-1, 1)) assert_array_almost_equal(ybounds, (-1, 1)) - r = Rectangle((0,0), 2, 2, rotation=45) + r = Rectangle((0, 0), 2, 2, rotation=45) xbounds, ybounds = r.bounding_box assert_array_almost_equal(xbounds, (-math.sqrt(2), math.sqrt(2))) assert_array_almost_equal(ybounds, (-math.sqrt(2), math.sqrt(2))) + def test_rectangle_conversion(): r = Rectangle((2.54, 25.4), 254.0, 2540.0, units='metric') r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) @@ -385,44 +412,48 @@ def test_rectangle_conversion(): assert_equal(r.height, 100.0) r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) + def test_rectangle_offset(): r = Rectangle((0, 0), 1, 2) r.offset(1, 0) - assert_equal(r.position,(1., 0.)) + assert_equal(r.position, (1., 0.)) r.offset(0, 1) - assert_equal(r.position,(1., 1.)) + assert_equal(r.position, (1., 1.)) + def test_diamond_ctor(): """ Test diamond creation """ - test_cases = (((0,0), 1, 1), ((0, 0), 1, 2), ((1,1), 1, 2)) + test_cases = (((0, 0), 1, 1), ((0, 0), 1, 2), ((1, 1), 1, 2)) for pos, width, height in test_cases: d = Diamond(pos, width, height) assert_equal(d.position, pos) assert_equal(d.width, width) assert_equal(d.height, height) + def test_diamond_bounds(): """ Test diamond bounding box calculation """ - d = Diamond((0,0), 2, 2) + d = Diamond((0, 0), 2, 2) xbounds, ybounds = d.bounding_box assert_array_almost_equal(xbounds, (-1, 1)) assert_array_almost_equal(ybounds, (-1, 1)) - d = Diamond((0,0), math.sqrt(2), math.sqrt(2), rotation=45) + d = Diamond((0, 0), math.sqrt(2), math.sqrt(2), rotation=45) xbounds, ybounds = d.bounding_box assert_array_almost_equal(xbounds, (-1, 1)) assert_array_almost_equal(ybounds, (-1, 1)) + def test_diamond_conversion(): d = Diamond((2.54, 25.4), 254.0, 2540.0, units='metric') @@ -458,19 +489,21 @@ def test_diamond_conversion(): assert_equal(d.width, 254.0) assert_equal(d.height, 2540.0) + def test_diamond_offset(): d = Diamond((0, 0), 1, 2) d.offset(1, 0) - assert_equal(d.position,(1., 0.)) + assert_equal(d.position, (1., 0.)) d.offset(0, 1) - assert_equal(d.position,(1., 1.)) + assert_equal(d.position, (1., 1.)) + def test_chamfer_rectangle_ctor(): """ Test chamfer rectangle creation """ - test_cases = (((0,0), 1, 1, 0.2, (True, True, False, False)), + test_cases = (((0, 0), 1, 1, 0.2, (True, True, False, False)), ((0, 0), 1, 2, 0.3, (True, True, True, True)), - ((1,1), 1, 2, 0.4, (False, False, False, False))) + ((1, 1), 1, 2, 0.4, (False, False, False, False))) for pos, width, height, chamfer, corners in test_cases: r = ChamferRectangle(pos, width, height, chamfer, corners) assert_equal(r.position, pos) @@ -479,23 +512,27 @@ def test_chamfer_rectangle_ctor(): assert_equal(r.chamfer, chamfer) assert_array_almost_equal(r.corners, corners) + def test_chamfer_rectangle_bounds(): """ Test chamfer rectangle bounding box calculation """ - r = ChamferRectangle((0,0), 2, 2, 0.2, (True, True, False, False)) + r = ChamferRectangle((0, 0), 2, 2, 0.2, (True, True, False, False)) xbounds, ybounds = r.bounding_box assert_array_almost_equal(xbounds, (-1, 1)) assert_array_almost_equal(ybounds, (-1, 1)) - r = ChamferRectangle((0,0), 2, 2, 0.2, (True, True, False, False), rotation=45) + r = ChamferRectangle( + (0, 0), 2, 2, 0.2, (True, True, False, False), rotation=45) xbounds, ybounds = r.bounding_box assert_array_almost_equal(xbounds, (-math.sqrt(2), math.sqrt(2))) assert_array_almost_equal(ybounds, (-math.sqrt(2), math.sqrt(2))) + def test_chamfer_rectangle_conversion(): - r = ChamferRectangle((2.54, 25.4), 254.0, 2540.0, 0.254, (True, True, False, False), units='metric') + r = ChamferRectangle((2.54, 25.4), 254.0, 2540.0, 0.254, + (True, True, False, False), units='metric') r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) assert_equal(r.chamfer, 0.254) @@ -512,7 +549,8 @@ def test_chamfer_rectangle_conversion(): assert_equal(r.height, 100.0) assert_equal(r.chamfer, 0.01) - r = ChamferRectangle((0.1, 1.0), 10.0, 100.0, 0.01, (True, True, False, False), units='inch') + r = ChamferRectangle((0.1, 1.0), 10.0, 100.0, 0.01, + (True, True, False, False), units='inch') r.to_inch() assert_equal(r.position, (0.1, 1.0)) assert_equal(r.width, 10.0) @@ -520,30 +558,32 @@ def test_chamfer_rectangle_conversion(): assert_equal(r.chamfer, 0.01) r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) assert_equal(r.chamfer, 0.254) r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) assert_equal(r.chamfer, 0.254) + def test_chamfer_rectangle_offset(): r = ChamferRectangle((0, 0), 1, 2, 0.01, (True, True, False, False)) r.offset(1, 0) - assert_equal(r.position,(1., 0.)) + assert_equal(r.position, (1., 0.)) r.offset(0, 1) - assert_equal(r.position,(1., 1.)) + assert_equal(r.position, (1., 1.)) + def test_round_rectangle_ctor(): """ Test round rectangle creation """ - test_cases = (((0,0), 1, 1, 0.2, (True, True, False, False)), + test_cases = (((0, 0), 1, 1, 0.2, (True, True, False, False)), ((0, 0), 1, 2, 0.3, (True, True, True, True)), - ((1,1), 1, 2, 0.4, (False, False, False, False))) + ((1, 1), 1, 2, 0.4, (False, False, False, False))) for pos, width, height, radius, corners in test_cases: r = RoundRectangle(pos, width, height, radius, corners) assert_equal(r.position, pos) @@ -552,23 +592,27 @@ def test_round_rectangle_ctor(): assert_equal(r.radius, radius) assert_array_almost_equal(r.corners, corners) + def test_round_rectangle_bounds(): """ Test round rectangle bounding box calculation """ - r = RoundRectangle((0,0), 2, 2, 0.2, (True, True, False, False)) + r = RoundRectangle((0, 0), 2, 2, 0.2, (True, True, False, False)) xbounds, ybounds = r.bounding_box assert_array_almost_equal(xbounds, (-1, 1)) assert_array_almost_equal(ybounds, (-1, 1)) - r = RoundRectangle((0,0), 2, 2, 0.2, (True, True, False, False), rotation=45) + r = RoundRectangle((0, 0), 2, 2, 0.2, + (True, True, False, False), rotation=45) xbounds, ybounds = r.bounding_box assert_array_almost_equal(xbounds, (-math.sqrt(2), math.sqrt(2))) assert_array_almost_equal(ybounds, (-math.sqrt(2), math.sqrt(2))) + def test_round_rectangle_conversion(): - r = RoundRectangle((2.54, 25.4), 254.0, 2540.0, 0.254, (True, True, False, False), units='metric') + r = RoundRectangle((2.54, 25.4), 254.0, 2540.0, 0.254, + (True, True, False, False), units='metric') r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) assert_equal(r.radius, 0.254) @@ -585,7 +629,8 @@ def test_round_rectangle_conversion(): assert_equal(r.height, 100.0) assert_equal(r.radius, 0.01) - r = RoundRectangle((0.1, 1.0), 10.0, 100.0, 0.01, (True, True, False, False), units='inch') + r = RoundRectangle((0.1, 1.0), 10.0, 100.0, 0.01, + (True, True, False, False), units='inch') r.to_inch() assert_equal(r.position, (0.1, 1.0)) @@ -594,70 +639,76 @@ def test_round_rectangle_conversion(): assert_equal(r.radius, 0.01) r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) assert_equal(r.radius, 0.254) r.to_metric() - assert_equal(r.position, (2.54,25.4)) + assert_equal(r.position, (2.54, 25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) assert_equal(r.radius, 0.254) + def test_round_rectangle_offset(): r = RoundRectangle((0, 0), 1, 2, 0.01, (True, True, False, False)) r.offset(1, 0) - assert_equal(r.position,(1., 0.)) + assert_equal(r.position, (1., 0.)) r.offset(0, 1) - assert_equal(r.position,(1., 1.)) + assert_equal(r.position, (1., 1.)) + def test_obround_ctor(): """ Test obround creation """ - test_cases = (((0,0), 1, 1), + test_cases = (((0, 0), 1, 1), ((0, 0), 1, 2), - ((1,1), 1, 2)) + ((1, 1), 1, 2)) for pos, width, height in test_cases: o = Obround(pos, width, height) assert_equal(o.position, pos) assert_equal(o.width, width) assert_equal(o.height, height) + def test_obround_bounds(): """ Test obround bounding box calculation """ - o = Obround((2,2),2,4) + o = Obround((2, 2), 2, 4) xbounds, ybounds = o.bounding_box assert_array_almost_equal(xbounds, (1, 3)) assert_array_almost_equal(ybounds, (0, 4)) - o = Obround((2,2),4,2) + o = Obround((2, 2), 4, 2) xbounds, ybounds = o.bounding_box assert_array_almost_equal(xbounds, (0, 4)) assert_array_almost_equal(ybounds, (1, 3)) + def test_obround_orientation(): o = Obround((0, 0), 2, 1) assert_equal(o.orientation, 'horizontal') o = Obround((0, 0), 1, 2) assert_equal(o.orientation, 'vertical') + def test_obround_subshapes(): - o = Obround((0,0), 1, 4) + o = Obround((0, 0), 1, 4) ss = o.subshapes assert_array_almost_equal(ss['rectangle'].position, (0, 0)) assert_array_almost_equal(ss['circle1'].position, (0, 1.5)) assert_array_almost_equal(ss['circle2'].position, (0, -1.5)) - o = Obround((0,0), 4, 1) + o = Obround((0, 0), 4, 1) ss = o.subshapes assert_array_almost_equal(ss['rectangle'].position, (0, 0)) assert_array_almost_equal(ss['circle1'].position, (1.5, 0)) assert_array_almost_equal(ss['circle2'].position, (-1.5, 0)) + def test_obround_conversion(): - o = Obround((2.54,25.4), 254.0, 2540.0, units='metric') + o = Obround((2.54, 25.4), 254.0, 2540.0, units='metric') - #No effect + # No effect o.to_metric() assert_equal(o.position, (2.54, 25.4)) assert_equal(o.width, 254.0) @@ -668,15 +719,15 @@ def test_obround_conversion(): assert_equal(o.width, 10.0) assert_equal(o.height, 100.0) - #No effect + # No effect o.to_inch() assert_equal(o.position, (0.1, 1.0)) assert_equal(o.width, 10.0) assert_equal(o.height, 100.0) - o= Obround((0.1, 1.0), 10.0, 100.0, units='inch') + o = Obround((0.1, 1.0), 10.0, 100.0, units='inch') - #No effect + # No effect o.to_inch() assert_equal(o.position, (0.1, 1.0)) assert_equal(o.width, 10.0) @@ -687,98 +738,107 @@ def test_obround_conversion(): assert_equal(o.width, 254.0) assert_equal(o.height, 2540.0) - #No effect + # No effect o.to_metric() assert_equal(o.position, (2.54, 25.4)) assert_equal(o.width, 254.0) assert_equal(o.height, 2540.0) + def test_obround_offset(): o = Obround((0, 0), 1, 2) o.offset(1, 0) - assert_equal(o.position,(1., 0.)) + assert_equal(o.position, (1., 0.)) o.offset(0, 1) - assert_equal(o.position,(1., 1.)) + assert_equal(o.position, (1., 1.)) + def test_polygon_ctor(): """ Test polygon creation """ - test_cases = (((0,0), 3, 5), + test_cases = (((0, 0), 3, 5), ((0, 0), 5, 6), - ((1,1), 7, 7)) + ((1, 1), 7, 7)) for pos, sides, radius in test_cases: p = Polygon(pos, sides, radius) assert_equal(p.position, pos) assert_equal(p.sides, sides) assert_equal(p.radius, radius) + def test_polygon_bounds(): """ Test polygon bounding box calculation """ - p = Polygon((2,2), 3, 2) + p = Polygon((2, 2), 3, 2) xbounds, ybounds = p.bounding_box assert_array_almost_equal(xbounds, (0, 4)) assert_array_almost_equal(ybounds, (0, 4)) - p = Polygon((2,2),3, 4) + p = Polygon((2, 2), 3, 4) xbounds, ybounds = p.bounding_box assert_array_almost_equal(xbounds, (-2, 6)) assert_array_almost_equal(ybounds, (-2, 6)) + def test_polygon_conversion(): p = Polygon((2.54, 25.4), 3, 254.0, units='metric') - - #No effect + + # No effect p.to_metric() assert_equal(p.position, (2.54, 25.4)) assert_equal(p.radius, 254.0) - + p.to_inch() assert_equal(p.position, (0.1, 1.0)) assert_equal(p.radius, 10.0) - - #No effect + + # No effect p.to_inch() assert_equal(p.position, (0.1, 1.0)) assert_equal(p.radius, 10.0) p = Polygon((0.1, 1.0), 3, 10.0, units='inch') - - #No effect + + # No effect p.to_inch() assert_equal(p.position, (0.1, 1.0)) assert_equal(p.radius, 10.0) - + p.to_metric() assert_equal(p.position, (2.54, 25.4)) assert_equal(p.radius, 254.0) - - #No effect + + # No effect p.to_metric() assert_equal(p.position, (2.54, 25.4)) assert_equal(p.radius, 254.0) + def test_polygon_offset(): p = Polygon((0, 0), 5, 10) p.offset(1, 0) - assert_equal(p.position,(1., 0.)) + assert_equal(p.position, (1., 0.)) p.offset(0, 1) - assert_equal(p.position,(1., 1.)) + assert_equal(p.position, (1., 1.)) + def test_region_ctor(): """ Test Region creation """ - apt = Circle((0,0), 0) - lines = (Line((0,0), (1,0), apt), Line((1,0), (1,1), apt), Line((1,1), (0,1), apt), Line((0,1), (0,0), apt)) - points = ((0, 0), (1,0), (1,1), (0,1)) + apt = Circle((0, 0), 0) + lines = (Line((0, 0), (1, 0), apt), Line((1, 0), (1, 1), apt), + Line((1, 1), (0, 1), apt), Line((0, 1), (0, 0), apt)) + points = ((0, 0), (1, 0), (1, 1), (0, 1)) r = Region(lines) for i, p in enumerate(lines): assert_equal(r.primitives[i], p) + def test_region_bounds(): """ Test region bounding box calculation """ - apt = Circle((0,0), 0) - lines = (Line((0,0), (1,0), apt), Line((1,0), (1,1), apt), Line((1,1), (0,1), apt), Line((0,1), (0,0), apt)) + apt = Circle((0, 0), 0) + lines = (Line((0, 0), (1, 0), apt), Line((1, 0), (1, 1), apt), + Line((1, 1), (0, 1), apt), Line((0, 1), (0, 0), apt)) r = Region(lines) xbounds, ybounds = r.bounding_box assert_array_almost_equal(xbounds, (0, 1)) @@ -786,68 +846,76 @@ def test_region_bounds(): def test_region_offset(): - apt = Circle((0,0), 0) - lines = (Line((0,0), (1,0), apt), Line((1,0), (1,1), apt), Line((1,1), (0,1), apt), Line((0,1), (0,0), apt)) + apt = Circle((0, 0), 0) + lines = (Line((0, 0), (1, 0), apt), Line((1, 0), (1, 1), apt), + Line((1, 1), (0, 1), apt), Line((0, 1), (0, 0), apt)) r = Region(lines) xlim, ylim = r.bounding_box r.offset(0, 1) - assert_array_almost_equal((xlim, tuple([y+1 for y in ylim])), r.bounding_box) + new_xlim, new_ylim = r.bounding_box + assert_array_almost_equal(new_xlim, xlim) + assert_array_almost_equal(new_ylim, tuple([y + 1 for y in ylim])) + def test_round_butterfly_ctor(): """ Test round butterfly creation """ - test_cases = (((0,0), 3), ((0, 0), 5), ((1,1), 7)) + test_cases = (((0, 0), 3), ((0, 0), 5), ((1, 1), 7)) for pos, diameter in test_cases: b = RoundButterfly(pos, diameter) assert_equal(b.position, pos) assert_equal(b.diameter, diameter) - assert_equal(b.radius, diameter/2.) + assert_equal(b.radius, diameter / 2.) + def test_round_butterfly_ctor_validation(): """ Test RoundButterfly argument validation """ assert_raises(TypeError, RoundButterfly, 3, 5) - assert_raises(TypeError, RoundButterfly, (3,4,5), 5) + assert_raises(TypeError, RoundButterfly, (3, 4, 5), 5) + def test_round_butterfly_conversion(): b = RoundButterfly((2.54, 25.4), 254.0, units='metric') - - #No Effect + + # No Effect b.to_metric() assert_equal(b.position, (2.54, 25.4)) assert_equal(b.diameter, (254.0)) - + b.to_inch() assert_equal(b.position, (0.1, 1.0)) assert_equal(b.diameter, 10.0) - - #No effect + + # No effect b.to_inch() assert_equal(b.position, (0.1, 1.0)) assert_equal(b.diameter, 10.0) b = RoundButterfly((0.1, 1.0), 10.0, units='inch') - - #No effect + + # No effect b.to_inch() assert_equal(b.position, (0.1, 1.0)) assert_equal(b.diameter, 10.0) - - b.to_metric() - assert_equal(b.position, (2.54, 25.4)) - assert_equal(b.diameter, (254.0)) - - #No Effect + b.to_metric() assert_equal(b.position, (2.54, 25.4)) assert_equal(b.diameter, (254.0)) + # No Effect + b.to_metric() + assert_equal(b.position, (2.54, 25.4)) + assert_equal(b.diameter, (254.0)) + + def test_round_butterfly_offset(): b = RoundButterfly((0, 0), 1) b.offset(1, 0) - assert_equal(b.position,(1., 0.)) + assert_equal(b.position, (1., 0.)) b.offset(0, 1) - assert_equal(b.position,(1., 1.)) + assert_equal(b.position, (1., 1.)) + def test_round_butterfly_bounds(): """ Test RoundButterfly bounding box calculation @@ -857,20 +925,23 @@ def test_round_butterfly_bounds(): assert_array_almost_equal(xbounds, (-1, 1)) assert_array_almost_equal(ybounds, (-1, 1)) + def test_square_butterfly_ctor(): """ Test SquareButterfly creation """ - test_cases = (((0,0), 3), ((0, 0), 5), ((1,1), 7)) + test_cases = (((0, 0), 3), ((0, 0), 5), ((1, 1), 7)) for pos, side in test_cases: b = SquareButterfly(pos, side) assert_equal(b.position, pos) assert_equal(b.side, side) + def test_square_butterfly_ctor_validation(): """ Test SquareButterfly argument validation """ assert_raises(TypeError, SquareButterfly, 3, 5) - assert_raises(TypeError, SquareButterfly, (3,4,5), 5) + assert_raises(TypeError, SquareButterfly, (3, 4, 5), 5) + def test_square_butterfly_bounds(): """ Test SquareButterfly bounding box calculation @@ -880,51 +951,54 @@ def test_square_butterfly_bounds(): assert_array_almost_equal(xbounds, (-1, 1)) assert_array_almost_equal(ybounds, (-1, 1)) + def test_squarebutterfly_conversion(): b = SquareButterfly((2.54, 25.4), 254.0, units='metric') - - #No effect + + # No effect b.to_metric() assert_equal(b.position, (2.54, 25.4)) assert_equal(b.side, (254.0)) - + b.to_inch() assert_equal(b.position, (0.1, 1.0)) assert_equal(b.side, 10.0) - - #No effect + + # No effect b.to_inch() assert_equal(b.position, (0.1, 1.0)) assert_equal(b.side, 10.0) b = SquareButterfly((0.1, 1.0), 10.0, units='inch') - - #No effect + + # No effect b.to_inch() assert_equal(b.position, (0.1, 1.0)) assert_equal(b.side, 10.0) - + b.to_metric() assert_equal(b.position, (2.54, 25.4)) assert_equal(b.side, (254.0)) - - #No effect + + # No effect b.to_metric() assert_equal(b.position, (2.54, 25.4)) assert_equal(b.side, (254.0)) + def test_square_butterfly_offset(): b = SquareButterfly((0, 0), 1) b.offset(1, 0) - assert_equal(b.position,(1., 0.)) + assert_equal(b.position, (1., 0.)) b.offset(0, 1) - assert_equal(b.position,(1., 1.)) + assert_equal(b.position, (1., 1.)) + def test_donut_ctor(): """ Test Donut primitive creation """ - test_cases = (((0,0), 'round', 3, 5), ((0, 0), 'square', 5, 7), - ((1,1), 'hexagon', 7, 9), ((2, 2), 'octagon', 9, 11)) + test_cases = (((0, 0), 'round', 3, 5), ((0, 0), 'square', 5, 7), + ((1, 1), 'hexagon', 7, 9), ((2, 2), 'octagon', 9, 11)) for pos, shape, in_d, out_d in test_cases: d = Donut(pos, shape, in_d, out_d) assert_equal(d.position, pos) @@ -932,65 +1006,68 @@ def test_donut_ctor(): assert_equal(d.inner_diameter, in_d) assert_equal(d.outer_diameter, out_d) + def test_donut_ctor_validation(): assert_raises(TypeError, Donut, 3, 'round', 5, 7) assert_raises(TypeError, Donut, (3, 4, 5), 'round', 5, 7) assert_raises(ValueError, Donut, (0, 0), 'triangle', 3, 5) assert_raises(ValueError, Donut, (0, 0), 'round', 5, 3) + def test_donut_bounds(): d = Donut((0, 0), 'round', 0.0, 2.0) - assert_equal(d.lower_left, (-1.0, -1.0)) - assert_equal(d.upper_right, (1.0, 1.0)) xbounds, ybounds = d.bounding_box assert_equal(xbounds, (-1., 1.)) assert_equal(ybounds, (-1., 1.)) + def test_donut_conversion(): d = Donut((2.54, 25.4), 'round', 254.0, 2540.0, units='metric') - - #No effect + + # No effect d.to_metric() assert_equal(d.position, (2.54, 25.4)) assert_equal(d.inner_diameter, 254.0) assert_equal(d.outer_diameter, 2540.0) - + d.to_inch() assert_equal(d.position, (0.1, 1.0)) assert_equal(d.inner_diameter, 10.0) assert_equal(d.outer_diameter, 100.0) - - #No effect + + # No effect d.to_inch() assert_equal(d.position, (0.1, 1.0)) assert_equal(d.inner_diameter, 10.0) assert_equal(d.outer_diameter, 100.0) d = Donut((0.1, 1.0), 'round', 10.0, 100.0, units='inch') - - #No effect + + # No effect d.to_inch() assert_equal(d.position, (0.1, 1.0)) assert_equal(d.inner_diameter, 10.0) assert_equal(d.outer_diameter, 100.0) - - d.to_metric() - assert_equal(d.position, (2.54, 25.4)) - assert_equal(d.inner_diameter, 254.0) - assert_equal(d.outer_diameter, 2540.0) - - #No effect + d.to_metric() assert_equal(d.position, (2.54, 25.4)) assert_equal(d.inner_diameter, 254.0) assert_equal(d.outer_diameter, 2540.0) + # No effect + d.to_metric() + assert_equal(d.position, (2.54, 25.4)) + assert_equal(d.inner_diameter, 254.0) + assert_equal(d.outer_diameter, 2540.0) + + def test_donut_offset(): d = Donut((0, 0), 'round', 1, 10) d.offset(1, 0) - assert_equal(d.position,(1., 0.)) + assert_equal(d.position, (1., 0.)) d.offset(0, 1) - assert_equal(d.position,(1., 1.)) + assert_equal(d.position, (1., 1.)) + def test_drill_ctor(): """ Test drill primitive creation @@ -1000,13 +1077,15 @@ def test_drill_ctor(): d = Drill(position, diameter) assert_equal(d.position, position) assert_equal(d.diameter, diameter) - assert_equal(d.radius, diameter/2.) + assert_equal(d.radius, diameter / 2.) + def test_drill_ctor_validation(): """ Test drill argument validation """ assert_raises(TypeError, Drill, 3, 5) - assert_raises(TypeError, Drill, (3,4,5), 5) + assert_raises(TypeError, Drill, (3, 4, 5), 5) + def test_drill_bounds(): d = Drill((0, 0), 2) @@ -1018,46 +1097,48 @@ def test_drill_bounds(): assert_array_almost_equal(xbounds, (0, 2)) assert_array_almost_equal(ybounds, (1, 3)) + def test_drill_conversion(): d = Drill((2.54, 25.4), 254., units='metric') - - #No effect + + # No effect d.to_metric() assert_equal(d.position, (2.54, 25.4)) assert_equal(d.diameter, 254.0) - + d.to_inch() assert_equal(d.position, (0.1, 1.0)) assert_equal(d.diameter, 10.0) - - #No effect + + # No effect d.to_inch() assert_equal(d.position, (0.1, 1.0)) assert_equal(d.diameter, 10.0) - d = Drill((0.1, 1.0), 10., units='inch') - - #No effect + + # No effect d.to_inch() assert_equal(d.position, (0.1, 1.0)) assert_equal(d.diameter, 10.0) - + d.to_metric() assert_equal(d.position, (2.54, 25.4)) assert_equal(d.diameter, 254.0) - - #No effect + + # No effect d.to_metric() assert_equal(d.position, (2.54, 25.4)) assert_equal(d.diameter, 254.0) + def test_drill_offset(): d = Drill((0, 0), 1.) d.offset(1, 0) - assert_equal(d.position,(1., 0.)) + assert_equal(d.position, (1., 0.)) d.offset(0, 1) - assert_equal(d.position,(1., 1.)) + assert_equal(d.position, (1., 1.)) + def test_drill_equality(): d = Drill((2.54, 25.4), 254.) diff --git a/gerber/tests/test_rs274x.py b/gerber/tests/test_rs274x.py index c084e80..d5acfe8 100644 --- a/gerber/tests/test_rs274x.py +++ b/gerber/tests/test_rs274x.py @@ -9,31 +9,35 @@ from .tests import * TOP_COPPER_FILE = os.path.join(os.path.dirname(__file__), - 'resources/top_copper.GTL') + 'resources/top_copper.GTL') MULTILINE_READ_FILE = os.path.join(os.path.dirname(__file__), - 'resources/multiline_read.ger') + 'resources/multiline_read.ger') def test_read(): top_copper = read(TOP_COPPER_FILE) assert(isinstance(top_copper, GerberFile)) + def test_multiline_read(): multiline = read(MULTILINE_READ_FILE) assert(isinstance(multiline, GerberFile)) assert_equal(10, len(multiline.statements)) + def test_comments_parameter(): top_copper = read(TOP_COPPER_FILE) assert_equal(top_copper.comments[0], 'This is a comment,:') + def test_size_parameter(): top_copper = read(TOP_COPPER_FILE) size = top_copper.size assert_almost_equal(size[0], 2.256900, 6) assert_almost_equal(size[1], 1.500000, 6) + def test_conversion(): import copy top_copper = read(TOP_COPPER_FILE) @@ -50,4 +54,3 @@ def test_conversion(): for i, m in zip(top_copper.primitives, top_copper_inch.primitives): assert_equal(i, m) - diff --git a/gerber/tests/test_utils.py b/gerber/tests/test_utils.py index fe9b2e6..35f6f47 100644 --- a/gerber/tests/test_utils.py +++ b/gerber/tests/test_utils.py @@ -52,7 +52,7 @@ def test_format(): ((2, 6), '-1', -0.000001), ((2, 5), '-1', -0.00001), ((2, 4), '-1', -0.0001), ((2, 3), '-1', -0.001), ((2, 2), '-1', -0.01), ((2, 1), '-1', -0.1), - ((2, 6), '0', 0) ] + ((2, 6), '0', 0)] for fmt, string, value in test_cases: assert_equal(value, parse_gerber_value(string, fmt, zero_suppression)) assert_equal(string, write_gerber_value(value, fmt, zero_suppression)) @@ -76,7 +76,7 @@ def test_decimal_truncation(): value = 1.123456789 for x in range(10): result = decimal_string(value, precision=x) - calculated = '1.' + ''.join(str(y) for y in range(1,x+1)) + calculated = '1.' + ''.join(str(y) for y in range(1, x + 1)) assert_equal(result, calculated) @@ -96,25 +96,34 @@ def test_parse_format_validation(): """ assert_raises(ValueError, parse_gerber_value, '00001111', (7, 5)) assert_raises(ValueError, parse_gerber_value, '00001111', (5, 8)) - assert_raises(ValueError, parse_gerber_value, '00001111', (13,1)) - + assert_raises(ValueError, parse_gerber_value, '00001111', (13, 1)) + + def test_write_format_validation(): """ Test write_gerber_value() format validation """ assert_raises(ValueError, write_gerber_value, 69.0, (7, 5)) assert_raises(ValueError, write_gerber_value, 69.0, (5, 8)) - assert_raises(ValueError, write_gerber_value, 69.0, (13,1)) + assert_raises(ValueError, write_gerber_value, 69.0, (13, 1)) def test_detect_format_with_short_file(): """ Verify file format detection works with short files """ assert_equal('unknown', detect_file_format('gerber/tests/__init__.py')) - + + def test_validate_coordinates(): assert_raises(TypeError, validate_coordinates, 3) assert_raises(TypeError, validate_coordinates, 3.1) assert_raises(TypeError, validate_coordinates, '14') assert_raises(TypeError, validate_coordinates, (0,)) - assert_raises(TypeError, validate_coordinates, (0,1,2)) - assert_raises(TypeError, validate_coordinates, (0,'string')) + assert_raises(TypeError, validate_coordinates, (0, 1, 2)) + assert_raises(TypeError, validate_coordinates, (0, 'string')) + + +def test_convex_hull(): + points = [(0, 0), (1, 0), (1, 1), (0.5, 0.5), (0, 1), (0, 0)] + expected = [(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)] + assert_equal(set(convex_hull(points)), set(expected)) + \ No newline at end of file diff --git a/gerber/tests/tests.py b/gerber/tests/tests.py index 2c75acd..ac08208 100644 --- a/gerber/tests/tests.py +++ b/gerber/tests/tests.py @@ -16,7 +16,8 @@ from nose import with_setup __all__ = ['assert_in', 'assert_not_in', 'assert_equal', 'assert_not_equal', 'assert_almost_equal', 'assert_array_almost_equal', 'assert_true', - 'assert_false', 'assert_raises', 'raises', 'with_setup' ] + 'assert_false', 'assert_raises', 'raises', 'with_setup'] + def assert_array_almost_equal(arr1, arr2, decimal=6): assert_equal(len(arr1), len(arr2)) diff --git a/gerber/utils.py b/gerber/utils.py index 6653683..e3eda1d 100644 --- a/gerber/utils.py +++ b/gerber/utils.py @@ -23,15 +23,15 @@ This module provides utility functions for working with Gerber and Excellon files. """ -# Author: Hamilton Kibbe -# License: - import os from math import radians, sin, cos from operator import sub +from copy import deepcopy +from pyhull.convex_hull import ConvexHull MILLIMETERS_PER_INCH = 25.4 + def parse_gerber_value(value, format=(2, 5), zero_suppression='trailing'): """ Convert gerber/excellon formatted string to floating-point number @@ -92,7 +92,8 @@ def parse_gerber_value(value, format=(2, 5), zero_suppression='trailing'): else: digits = list(value) - result = float(''.join(digits[:integer_digits] + ['.'] + digits[integer_digits:])) + result = float( + ''.join(digits[:integer_digits] + ['.'] + digits[integer_digits:])) return -result if negative else result @@ -132,7 +133,8 @@ def write_gerber_value(value, format=(2, 5), zero_suppression='trailing'): if MAX_DIGITS > 13 or integer_digits > 6 or decimal_digits > 7: raise ValueError('Parser only supports precision up to 6:7 format') - # Edge case... (per Gerber spec we should return 0 in all cases, see page 77) + # Edge case... (per Gerber spec we should return 0 in all cases, see page + # 77) if value == 0: return '0' @@ -222,7 +224,7 @@ def detect_file_format(data): elif '%FS' in line: return 'rs274x' elif ((len(line.split()) >= 2) and - (line.split()[0] == 'P') and (line.split()[1] == 'JOB')): + (line.split()[0] == 'P') and (line.split()[1] == 'JOB')): return 'ipc_d_356' return 'unknown' @@ -252,6 +254,7 @@ def metric(value): """ return value * MILLIMETERS_PER_INCH + def inch(value): """ Convert millimeter value to inches @@ -295,6 +298,26 @@ def rotate_point(point, angle, center=(0.0, 0.0)): def listdir(directory, ignore_hidden=True, ignore_os=True): + """ List files in given directory. + Differs from os.listdir() in that hidden and OS-generated files are ignored + by default. + + Parameters + ---------- + directory : str + path to the directory for which to list files. + + ignore_hidden : bool + If True, ignore files beginning with a leading '.' + + ignore_os : bool + If True, ignore OS-generated files, e.g. Thumbs.db + + Returns + ------- + files : list + list of files in specified directory + """ os_files = ('.DS_Store', 'Thumbs.db', 'ethumbs.db') files = os.listdir(directory) if ignore_hidden: @@ -302,3 +325,9 @@ def listdir(directory, ignore_hidden=True, ignore_os=True): if ignore_os: files = [f for f in files if not f in os_files] return files + + +def convex_hull(points): + vertices = ConvexHull(points).vertices + return [points[idx] for idx in + set([point for pair in vertices for point in pair])] diff --git a/requirements.txt b/requirements.txt index a7f5f01..014e92b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ ## The following requirements were added by pip --freeze: cairocffi==0.6 +pyhull==1.5.6