From e2299812af93c55a7a77f52cd2468dd23c0aff21 Mon Sep 17 00:00:00 2001 From: "Marie-Eve Picard (she/her)" <77584086+me-pic@users.noreply.github.com> Date: Fri, 21 Jun 2024 10:26:18 -0400 Subject: [PATCH 1/9] ADD theme --- docs/assets/images/favicon.png | Bin 0 -> 36895 bytes docs/assets/images/logo.png | Bin 0 -> 141267 bytes mkdocs.yml | 34 ++++++++++++++++++++++++++++++--- 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 docs/assets/images/favicon.png create mode 100644 docs/assets/images/logo.png diff --git a/docs/assets/images/favicon.png b/docs/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6a24954863badeb6b61f6f95bf68a55768d493f8 GIT binary patch literal 36895 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 HR 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/logo.png b/docs/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2de90422625df307a7420472d22ae1f565acdd GIT binary patch literal 141267 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

G#4!kcN>r=YC zveH#}Wmr_4OOdole3RME3rmk4TT=c>HH-(ehL{L)}4`Q)C=JCqMBZvHd{M@3-K3^$`y? zXBycKC<|EdR5MAeSf4YtJ=DW@Vj(b<8kJ+3NDBJBRGRwlUL-h^`Z7Z^EaW9d#MvCm zsXWMo6~?bqC7g-5;Zoqb-WM_P0EGaeO1tJ*|9nU#a%MOKmxMO=T9~Y;Z``);bq#+G zuAWo=adx+@-ozYDW@Kq;?0{8+0$jBGYLLFvwus$XG2|k2ccNc{0vkYS^}^ErU@$j3 zJ85(7c z`!lD`7W{D|zkQB3P`wfYe&|S>$xR4f?bMb?c>P9OSmV^D&^7;zFmly3AxvwsHpS?R zjA5$LlA|0`xUFlzehf`eOinR3UWO5HH!R#R_W;WT1^!e$VH|E+*Y)aQYOH%fx`*(A z!tb4dUYrwfcCW}Fm`1+AAfF#p%z??jLl8nUq?Y~SE1@ineXE|zfD3+jL+-+>&{Kz% zm4fAeGC?=Ip%ApRwJ!~65Rftb*$pi7SFQ>o>-P5n+RH)2J@yv*U2Q)$5+Wz^DQDz@ zEKHm*DS&-$%Hw_*${Anm_J<6WQVNPmu6c7Mp|?IOuoBCxo*&xOxv#HZiaqNfC>Hkz z+S}5m8Hw9Ej)R?ycJ7um4e9%Sh{v|FREOqJU=4TC8#p_OwC;vt{n0#?Gp~68MnYXz?5X{VAk~%o9kgzwfoq;pbH=sJN=eBA zY`aCaQVLC(jR{RW+au6S*i@eZP!qv&PM2H1T;8bHhn>2&c>jt&nX6F2h|D3mXf$#6 zsX{_pbJDYsh5gnX885jl{7R2x>_&Tdlj?U6qNOq!=R7e-pJCYA3A5CcsjT|BEnP07 zp}D@7$-0S>XK&Ts`mywz39ixwh6O=QF@V%V`JQWY9zVKQ5ZifwSX2%S-2&>RHa!`TPsi_anN!UzH=S=*bRehh~dXmTy-7 zly#Cny*vanUhiuKsw_xi)YwCW?XRWXbQM?G@5h0{!5eV6sE-63A5G*Yxd!Jtf0v{y zLQSl)Rlvt`ae5U1G43D##ONfVfIE=u@GG@2EEQz%5`^NJRp|6C$TW9o{1DsxR$#0F z+s4KAwyH5}cgu;o+~H8$)9MBzZiDEVw>N_NH(H!~+*6|b^VJ;Iim7@+%Yhu-SW`?C zrQ@n71=L~smEXCIlwweuFVs~J^OuIk2Uld{m&pb=x!J1LQ))Z0Rt@#N5JGHxSPt5^ z0#!$~6^-hox<4;oYQhZj*d$JxgFJlbR|JPw>;8+O!(QwZrb4qVJq9CM12T*PmY3fI zX^5BQ9x$>J_y2u)esL3R85zD}$ab}{i}koxPPbrNe^xsn6pOQeXWib;zGL+q8?e8IMex%cL0n_gU_^rq3~4ZSydZstRMNE00r$s#)cGqP zX_re{+6tUor1cX^2YEr9NiGMZ1xFHmw@*6AR?B_aIZPuqJLGii1J3L)-53)BK zhH5PLZ$o{AYWCM3|L}HO#T&pM{Jubhc$|2h$q<0B>Wy%-t3LyDCgbcA({iXg0PFzk z(X9(N`&gHKqHyD0Zms4|)d~m6%S3b9Kx*9^#FN8O44nzT?9_6p;NveBkN)dm}l~uHfnjcM!XWQXyoUm&Rk$vmS zW<%}j=x{x;>4n%YAvL4LyE};z3%JOv0!3Qv-iH?msDwjyq4*OcarImN?@==dv+1Ag zY@xzf`z&0i$ybZDMjZ0US&ma5?SjthYqzL4mBNu1vZU-HPkrmfydk2tJylae;eTFE zg6^#;Y}+RH!)yQtb<1;pN?B7I;9Nkpi}%$r-eh}wWPgN$zOeSDDvHeFN18I*N8zbP zPgXaM;0xSl(?JDWolZ!&X`(! zL0DfJuQYWb8(a{0Y~PYHt~j53PrQXwFb)yQxOVj2CshMxp57$p#*iww`o;B6G%pW~ z->Z~i_qBRJ@tAd*W|wMZ^xQ~uY2G0VKhYLW$()3-q%dgT@6HavVq!=8#iz#?b%L5q zA;A8V>-?b#l&lWgmzd(7f>QxED^Q=7$)~3<_fN&E9sK*IcoG&Y_V!vb)@sGGbP!-T z)Js-hIRH2b?6)JXrayQ8$_I8+eMsJe!$J3ag2}I`Ngt78JPRufo}U9+8IbyD%D{ok z+vE=1N4MQt2CpesiDo}TzXZ2MJ26j%k$NS`?6i=Wc=%(-7$V;rK8u(#y&V{S25DMk zX#flatUZ$scw{A3J6n4a)8=!5#H40O>yM%4`c#*5*_}#5U>ve_a&XiVP=)Lu@JL|# zKZ~ml&y+lyt!kJ_>%ing2%^(<9yHZAkHF$06;erVc_r_T^%Xxs8~SKln05%7q4up0 zht{TMvb0sRH#Q#&5!aztgM?GgS-OwK7lqh3l=(`BXCxF-KG>amd{j}mHI9N|Y`Y@M zM9)i3iXu5v42lV%NkYmAQ7_W#&h_{P{kLrDuGRC#fHe+9o!$iK#==9`dw||}0!|O7 zAiqZib-o?F4SL}2)5Gf85B#7{cH2H#GBMOPkaIi;DX-RCIPnPSn|jfZ^B?lLJk)nZ zP1XI<5yW4=o~^Za!kwnVD40hE#cz5&m16rY@_sVj*8%g24}lj~b*(z8XLuA<>3h(^ zu*2!XM692TrW)1I>r5!aCDDWGj6+g!$|th|u=A3>Ym7SK>RPQrH>|QTfJ+#Vw_#O9 zO%P#gDG{2HVO6txSUqNVa$)Wsh&$6`0;i-u$X>H>ezJ}2j9Xo>(5{fCMQHi#1;H(Z zzwWu_#Ch@iibn-ohj4d{N&%wbCA#2k z{PH7yJUDe{q6XDA;U$ZmL{^sQmXpKG)4Ft}H;3#BhuWQYrB)$T0v!bOo60W2q0Ag_&;1i+pTuJzcP^9#+vhuElL}_a6{EuM&Q%|BN(UY&hM|^aeMT zB9TSN&oAxL&yse+8}YgCk?(l3i;P5Pw>tZIk@UP?J=Vu8#E?D1BGP;*KrcF_SAPAuP=Zg_jh5X>{>qZtIGV zq)VsuZOoDA!oS0YPQv0>44fJ7M6RwHXoCje01zKDR4 zZibuYs}&myAw9Gx{LCu3E|*~Eao%MJN*s=1#c@;&qN~^)j$4ggkU*CPaDk5aJG52Gc^Zm87nP5 z&>bEzG$&wV;veu+?<2KpBuMd`cd%M9iJIRQInp}o_E!ST7vZU+f3I4OIWk$NKl~Wp zd2PqRAJpHcjb+UH=dD9L;);e^RY3k{>G!Ajx?w^PeV6}MS?Y(FTmBVp z=_K02F(N7lU)V{s>$U)6xoDr%p76*3v!xrHJh1HUo~kV*N4AMbX+zk|*E|Jw?iiOr zV}AmH{=Bs5p*Umf_PLdxVE2<?0jwZL=q_@zuCvK`Ofd;&|#V%L_y3 zCGVTXm$}P7|0MX(8e`AV2E(oJG-2&jKDg)|AK~h?=Fsd{Uh8%&-YHOiuTZg?m|P2L zlFg6*elR?}g0>h`4s~!&=y#0{Plx5o+D>1P&U33 z%N;6hFh!BQ3%q<{XUbTXwvgb@74F?aYUrlhy5yk46?o#w}QBjiQ>*S<2 z0P0)fJ=G^e_T~9jmwgC5e>s(gLgd@EjvE=C#u#u~{um~#x#PFB^X4qe0gN@SUqt`` zu%Ai&pDzfrS!2%%l!AE{CIKpe-=Cz2UqzKNb? zc?N^St8^u_E35ot{Pq7+M4vbsZn?Iavt=%tnc#tRzQMk`$3>A6uz&Fx|9Rj68r zs`toxoot*#wIr`W@eUqD^8M2(nhb=-%Y*f2{8ED)T-4wpjJdfs(cC#sWI|*bvu~yZ znlYBPd$ZYARo$jMzLOit0HTxur;!hBoNTc1lQA7a(@6TfY3XK7`inxf5T<_S*ux^V z0R^g$$h9JM{BlCzuZUt=J2Mx^tQ1o-FNn-Hz@^pC`-`l#*CFcdD9lU7>ah(8{EjSzY@> zOeaAD{#nfbmuqveMyFds@zN7s(Pt;GM+YzltU9{0%_+qhl#`|&gIVh_2xDdC#`@m$ zr|KDjYbd^n!QPnpm65B8>PM z|5k;nKE)Odl@pF*GL&9M8iwfbU^1^i@LR_+z-%uPifT5|kRIerCB$V)R^}OsKutdt zK0Uom%Ddsh%%VU$vI-ax-=*ykBn~g#*YW*zZn3$VF)TGZ*jy!{7BRY zVCB8d0d3HiTfv06uljWR^7mo4D7zQPxQRK`nq_%{ygka9S4YqFef)amDIddG1)o(^ z$gik&|D2vhn_L{w@#rhyx2V7$EYx3|Hvtx!Xf*aJ2DgG9TgIS5p7;`!OH4V=y2VU$ z1ZdaoDK_SzpXDX9{h!yaBq<;TZ7u0%?zOax(pIQfG_bG86_vPpW1N@k*TkJ zvjcK{xC%s%$PBVMie;a9)@sEFdxVx?*@^wpv3)ki>}Ms^YFZ^7GJ0=qrjgZBQ?t!A z+Y7jy28O`|_P)42)tdZ#TFfGr+o>Bw#Ps&D6^U#;?@xx1(RKf_om_4Z^(%qxB+$kt zBT!YWWPQbboNmvvHUYT6H^q}DJ0<1;-0+bh-PFF&FGkk#bEW|sU5qb6z}RvVBNAEfi%UjegXUFLD*O4ub$?>|-4|qhpXR70MDVPNhRlkqg6yHjPx44l zEF1*4;yFAYTxl#QPw&}G2T|GlU7^PNLZH271_Bi+tD?A!cu?+<$&%3+Puh1cx zd)!v#mQJ4F>u^&O_Y+zK1vQ*3+sXua{?~YrJsg|4at2 zhoZm(y4ZAMKQ;_>#Gh`be=nk?HfTf{F*?&fMk-)ogMDqUl5Z^t7S3~a!0B#9N&?Ok zWWZ$vatB^zCz$@F9%Fk}nf?alEa>?bhGNXCw8h05iB4uYZ_#?H=E;eSJ_S&jwLorCc5Rn7;!|iqHYVtjbxg0|3+? zh)_7Ko=REN9EF-aG>pnd-E4;EjpvqC<)~B*tU{u}|GaR1yJZo_94THxR}9gg52h5P zf8PL9O{^2~bE75~f*efcu*1Ve(JNEqy?t>k!B^0oUP7o(PDj!T!3h4kZ=<5xgF-ho zk8-PP8o59IQU2bZ<_voKf;Z}ks&WaLd`y!n+L9hX%keXaICFUfb%H$?H8C%i)uf;Q0-qiJGk7YVuyR>>pblPH^@@c zf8+mi4d>NDrYti(kl0q6YeUG=a9KbB5XEj&<^$B1pK6o&MTbV56O+al9^r=ftj^V( zt_S@+7}+}Sj|r9e0wJlG_VU-M3e@K(n=p>8LB4w1uGPe0;t^UA`=f29Bi~r4?c}7H z+U6-R>wM_7pTy~sH=x)h49B@#cok|&EO6((U<5f7mVTsd8XwPdeqHASB`#{Ju8Dy` z^?e~7WXkJFksXNl(o)kFY8hYjHu1*XM{f@9V@8j%-%=p;x%644{6eMziIgrlF&jU- zdBoPJ#Fm96ig4-A9rmxz6lOwxUa=1|A ze;y_HgO9gQnE{2s6SVm{&&EGr?t&5_!!D_lWtvqg)juA-@dj;C&PN; z=}JQSrlj56Xi2lATC!#{E!`SQUI&*K%tfS=;lt9e--Tx@P;Mp+>HLS;veG{tne9(l z29i;1^$p-#*LY(zy}?a?=mqHwb^JhTY2j(w`#;gt3){(vR@g|W6DBQmaW;e+nPoaQ z0(nf?HVIH>WoJ`^VD0vo93Y3H(kO@q|4JA374K>5x^db|QORk@6JNrPC6JL>0*PULhl#F{TxsPu5WC`pf$pI?I=l^t8vt>xEF=hNJ#tVWm?8W01 zZ-?n&giHF&z7fNY91R!lfkG1~5DmAUp0aZo_dMNJnNW369Mqv0kqs+!h_`!#l8T@RKcT(JC8 zVXD>6CHn+cy+9V4*bwwlXY%6oZq8X0sgeiKc-l3RLjL=Ipm)yxmzj3EeXnM0P8NXe zPBB2CZ+LpyhBHnGvLD+02(L7S`ymd*bCcW;wm)pk*jjoI6+Te$eLWop+Cx?8et<mwy2-;kR|s5-HGD@$m@INfcwlDn_IGByaXBQmKPe3-^IBLB(5YbSY=$=?i`z% zKi#2xPJ`QO3a7_bKYo3PcjJ)?T}=L{N!a;WR7Qurd_7qPxOo5j!8mxZ48i;V?q^s4 zd`RapZ#2hno^}3zI} zEJuZZ`mh+N@L2x-hZVfaVcOlTb6i9``uoMZ|5q7b{{cMMBNi&@ zb+=+i1rJA)kD(`Sm=XppL4zjIz#dB}SSYV@uGp^$*;*`&@rN9b*JfW(7YJd_&q*q> zCJITdM(s1q6iv#S(UuU=(ZL=_hr=q~-@gd&xAjZ-wbcqgg$9&ufj?1mR*s2R57_xtz`L|2t z{*NQOvfyXl-_YFrpgVU+NCwWqybnsIkR3m~*W?z;=MI(gBruz$=w&0gtzq0*Q(fnZ zEiEd}2k0@hX3Oc>D8Uj2YNW&athfG6nqY;_Ft%6BFwKyR>aZeX3(3s~A)7P1v~qZh zuV$B*UXQ$VxCX*M|GyT%t^d4(k~qEh%oJJq3rHa2&nr@IOieFuZe;bdj2k;cGX^2A15$z3 zs>YmKv^fl}Q#?94g-sF;NxsA_?2JD-(^8iVg(NFQBg&PR**sT*p_CA?52&|FtVo3FMY3vqqRspy2kisMM z@Rg9ZaL6f`;FxMgrbAski7pRAs7)@!y}C&l|0=Ba0DuQpc~)J#v!2TY)`J;x`G2<- zpy}~PTkKwA(;6Ds6OBjJ;2vvkQ<S^fE*_{~php?in(tJOeIWFZt2YTHu-olNB<~5v$Us zqPgB_mzbKD8=Xg?kf`1YI3iTI=|E;>m4`iVZ%hvGFOF*sK?*WJ)8Pl(kW^J=fG?+3 zfw5qmLN<<1I(p-P<}QOc=RCT%V*1S1$)TBKhZ;oF>sJ)69$%S>V5?Gx9Xh>{F|Hz0Mp=AzA_qMH;1y713xMLz zq9&aj$%bRA$@EL6_`tVe@lA->(LR;%XecJ)5|%Z+*(hhz+kf~VZa?1VP!3&6dCS@> z?gki_^BE!guy6TF;HW_nVYpy%V3OvrL1vML1omTqv4^O48VmbmAl|HEZCifUyV|Hj+{>N$#em?oP7?`iDcr74h{A|PZMQF&r;Kpkb4yl+N$ib-F7Rc?dV#$%+sJhY0pC1X${1aS?2a4 z1e^|$CNIUA9=%xe3uGBB6|9#=rlrr+1Ci!n#n@aJP3~m#12?-Md{EvJbzL11hM!4< z8ensKAvrL}-c>v9RT)8B!>HIl__`pcR!x2^;Kt60w7YBFfL2~hQg$rp^N)trhT;|q z;B)oId}b#|q4&U{{6C-D58m(VQ(c*VH8J7kE{f&U5@#+bj;l^0o@`6(CD@?NF2|&M z#wGEORiN%w>UGckrsR|P-l5uYf4rG}d9N>nX>Wj!^PGP8^M-r{^T;mqUzmooqGjEV z4`GIvB}R-K7&E&}bMwU`x1KKSE2f(ycEN}t%y64GnU$=d)(tn(mcu|ACSwQ^sM2M*~+ z-7k27Wena-)gDGPAk5EV9`KVGs$*i@+lYI9tg0OQE8U(&uQ80{hQ|0-A{fA*1IcmO za}u;Gyh=L>E|FIDrVk8+zPlT4fsT((>cxFBuz}o7xO8MGDrN?gOM3?BC0mLcC7+f1 zoNExievhrL)r2)iT6Bxy(5Toe_$ae9I#i5Ph39T1haQ-8~MujU&QO;3MD zt)jY$&U385zxHZ=Pk)AgTl!6@1nrnLl|l8zyyUN|Kpl=I%?%OaGO@NlR5&$o+jV-n zZ+fm$q=C zF;W(v&8HG(K_xvs_fR~LF}}OOx?dbouDAB4_U!6PYBoS0R)G-q`lOJZhFh}Qy5lk- z*PJudwoSfO2(+Q0k+*x5eko=xTKuL`_E}O@D2KW%VG*j*)wXjN$V#s>Z$JxQ94~hH zleU-{V-13}WFsH@@#{6dEBSPUoZ zAS8dKY=DaB*f7~vus{F@9dUvT|dg{!gq=sm-pfj)gMvGEh(SzK{3pia^s3j!IU zk)OiYVUd({R|New_4oB4cd%?WRCUO%-M+TC7u8g?->KXs7{}?lG9hb6-Du5ZXUopT z#yNc#!n#f%8AIIhaPJ@1py^bcNzxcOEjr8TA>`YmWD@A;Xhx47n;+?1(F$hmkr!9= zopt4Y{GPcbH^J)K`+$!m2wb$2v&TwxAb)(@=j@Tanp-@wOk3}u5;095-jm)!81DH#i}i$B1D!It^Ood%GM_o)i9a+;G*fIa^ zh(6HipKdR(jzfhc(pw2Jo2Rrjf$Aj-^+_!B9VPFLJ794ZQ_xF(>VPkBS*9v09r2xC z!fWUo{Wj!GVm%Pun%O&ICE65hQxx5ZGTV_N7Y}$JIwJ^Cre`G1I#m}H`^xoHiPyY&rM|Bl=4OcsdShxns(_cfp0Za` z*NfZC%DH9kiwwa}i!Xk>@+`6Ia3tU>{)UyRW`{cgb=iV`bZnGM`$gCRhKA%n^+qp4li^Mq#1nM7ue2b68<* z@2t2z{1Rdo@MY??cmK0t;;P$}QiVf{Oio|k!#TxxIUb|$fjl$m^HGYmZGbSQ4#Ca- zaF`e_7)M&BIJAdn5fXG+M`FxW|BUf`rfDwBvV=9Dzeh2`rzVqq77E0QS(FRYZ4WbA zfWa(SH2tkh(jG|(6`O^`#xg2++)of2|Pd4!r zl7B=<&{(SdwQ_vW`Cr(_s5h2cmcockK{H<#jc`M{et)K75Upa-(^5>Zj2CWt`un_; zA^E{3R%K3Mk22#el11j1dxr;d?BjJMd3^f)`8d)y8Br}Vzd*Si_vHBQuRETA+x;Z^ z%s{ww74XUA*8a(ZC`_!aT>?ks(_Xscwtrt4fI+J`!)Ur4sOPSK6rm@cFjR=RZ_Cxa zsN2Oy0va7nNrSXkKH5Y(2laaBJxd$lIze4rTFRLkHkfSt>US-1aFpRcE`G2cD|dBw zJqnxpB|5BU&zEq9`k@|2?`Q;u@v0^Uheb%&*u6{l&HqqGs8k6Zl? zN-=E#eeq;{d-%Kq;|+LJy9x{TX`rSRE;p-A&gS?55L=N@5*OnG?7-)c=24T7SRx<$ zABF!ZnZO^Lt$MqcbeiWt(Bw&Qu28+`#xn;rOIPN9Iaa8;vDCU;+DrO`#`7&2c%#$r z$!{VvDQ83nIDvB#b9H6TPXQOyPuTmt&L;}sa$j~FAjW&{%MJ$NMD1RM=}(~>-z40M zszCjDjgJ>gwVb?*f zwmO+A+3;9S!GZXn9*L86hrSmai8NnY?zD%q{c2IK@mmiBohKV_6WROa(7FfSDDM&F zb?S5d>pGLV5wT(A{Bnj1IAxGhN_;BDa(4?7D%?&=Jrys{`uhX>vL(!}yD0ffIAO#R z#2v?0mUEL0aptl0{AtfwR%4Kyd%9A4bQ48ilG59{d<9;d%2;j}9D*sPQ{b3q+se1e z9ZMOaQp^b1nSqTUp?B^`WxNFSBM}4<&gi_!>>vmKEV#<`>=OgZ_n<2q7e<);47csb ztAiZt$4#13dvn?~G)+(syqB5Jy|0SlJe_|#h+|$kor7->cF-iq347( zW;(+Q5;N`l7X-xU=K3pOQrLz3OuPj7S_3@{*~QgR&4KiM&{%ui!>(|T^g6@+51+VH z_A4VzZs&8W{-~@@zC4{cSj6rF_Z-=AR^xKbCI`+rY2IsJtyiOZ-|IU znT2d=WsPs@wN{58}!TL*46h851jq|0d^pJfz(4 zHwu^MYO{A>-y1x?449!MpmmO;kcO$4rm?u0b)58)Bp5SoPP_!eOZDB^>G5E67j+@^tHNxKDxc<++gi@KSWN~$T_Yj)5V#~K zo1DlM>uM5eM}4=OZel@+njNOvQr0xLpCx=7Yh4j^`c}c~!-6oMfcPcmK5mKHyr^Ms zb}egK6zyPpf3^iYSXKk8OGPiLl|55m%Zh+vujqO6Vt)y3c=T9G4R&Gim&!V6W>eMI zz1i52<0JHmh05nDNy7V6bGaen^P;%+igSYo^&4r2Lv8W1Fj4_^X?5HzX;pH9n=0IQ zRzBR$=~Pe3-oHO`{(s@?n$}U-7@QjwLec63=*W!(ShYW5)~U14LiH^X_S3_-Ty8kfCtHf*Uf?^cuMOkAu8PP8!&-F$ z?dElMKn6J+I~-<{lE`q>(n>tbY`wBU(*87Fd;8y?(_j8}PNo7#o}uarhNoo7^HUVh z$bgSW8O;RRl?l|u?Dyp7JBsULy|{MiBLsQi=#H4cv-n~$2Okp_EAxWe-uQ<9?RJA* z&_fQ!8N4S1hsmcG9!wVLT0br;9i9-xh@W0CL}I=QG6ikpzs<_n1T|Z8Xg_fp_qQeOk)%CvW zsaaubR^Aq@D_x{3rx)|!h*aa=1aWS`sh}1eW^Y6`gvWa#Sa^mCTxz6!pBC#0tFAj3 zv0t?2Mvj^7B&gzx=Jw9+sRV>~e5A7p6e?*vhWfl&Q+3!x^MzJwt(R_guzW(OQsel%|UE72Ztuo*%@ra_}0^ibt8XYH(%gk zcAK@?D#q%WmOd9A2Xq_HSWZEKUl$Wp*{a;9fSkEti}TUKmhfGJO^HbT3-K&w%OXQ) zF9Va$mn3@O?{eLlyoYRkN(IojDw{d?l^7&&9}UhqEh}NMgy?>(|#ds z_=fs-^x+MuF_-kjqM7TjrYabf?B4OfU*UA+W3fd=M}F)id8kEUe5QsUX?GzCxLYuH zP~oI4#mqkX#3rYyOokCLBynZsT7$q~w%o8Bqg(GC!g?mlr-sgKJUsdMFGW_1ApMAoNME^==S-q{`+#^%(;bFOJ-+Abj@w%(`m@=X*sFvtwinanh-sWmc_KC#EOg2*?p_vHH4$*fi?*&nN zP(2GTjPr^jbAw#+Mq85au4189J>y8?w)B`UYbg37voR`Ra6Pu@Inq8$<4@x>(;6nK zP)Nkyj&tu&6(BiqIJ1hfCU~k#h3ViDdeQr$Np8GxL-a){Mxt+4vJWt4BjNs$9b2~Oq6g763v z%cwOnU>)=Zc2Ac8sGMU?*WvGx6QEBDF&1rUs&Uo}g1R*R?ld-+(E12P%pI!G_dx(B zUf~aKf(AeHXRDg_NV6-&fElsqUvA&C!6~FDGL3eR3bU~KT*oLA-Fe;?PDG*Oy{3nE zbGEI!stNL~t^5bLFJ?lADeT%&)~A|c|FJXo4zz{0H87e&#DIslg>bH>wgm`ckMg3lc;>uIT@ME ze(F@YrxV*b7d&Mjilb}KFNd(4|B;gaI+=3jeo8`eZ+O5DsT*nAo$U0$qSebU=E$tr zEx9L@WBnRZ(4iHo=WveUAHAmz#N_imIT3&vA$LTdl;(HH*J)4?cTiJyK8vJL=%FL; zD(^)dmKAGZGkPV>ogNX*feLF~xZDKOQo~2)i4?6Mx=z8~frr-a6yyHtphv*&bXV@OWPMk*wXIju-@+-elrSPW~#avYn@_xb*OZ=c)u{qFbv`C~W#UeD{g9@pb> zf7~DUdqq|h&~`pX_Im*z;8mWDaCJ1HA%AEx&>VEW###9gRt6_Ez$VZnE0EVbT~TTL z)&6IBzVpAIx?fw;clqjX<3WC0m~4O2U3UC%#Ed~cAA>@V3f2_6zQ_PZS@f!kcx$); zW>J^o72)Ukt&5D~~PSiUyJT)S-Nwp65Bj&s!oX19-Aw>5M$ya0P3 zee$e#E^_v{#Ej~x_4)mj9Q4PFt#d-> zbB47O)32U0LbR0;@{wk7|1uBxe}Df{syoFQBQk1;M5svLocDlNON{!#ZI4+?1KiPd zUnq?V5}l`{fC)({c!5sjy+Y@Sw84vjJClADs~MTzU!ifz00(%&oHn?}tLs^sztmql z9`3s${^2Lpos3katTqK)4qGwi^%4~?4Sm~^-@RCux9}8E3-=AqH8<-J@^aNMFT&3k zI$ybC60Ca#Yf-Mcu3E~i0^0k*^%6~dh7CdhEt;Z*{!4x@(Fy_2RN>R9bKTmZO~J}o z`YP)Vv=n`~#3Gq{=nEj;;m*8PZj=>7+8zzq*ALUrnq9Z32WF~jrvTkFO@L4+xE-nZ z>HjT$-MTaI>^s1#boRdW<2$ zznfNC4A&pxU+TiXVFlFs^l`2TBc~$c=<&Q)>>M6HE6P*0i^w_lJK9>uz^TMJGuUkT z-L(QJxc*$J3(L74$f~OwDGj$H?#5sjZdD>+I457qA&K zvg3!w^92wdcow=?lT+8UxUwL|^R=crZ5>V#CHD{11aL1ES7QIj{k zCsJF$+kIQed68~2!oEeWY{xi58z6hlQ2!RiIuENJI1Jg~8R_jUebriFV0JFDR6~Xl zT2mg-)UwtD532$QOxrKVR7e%DZvz=NFs6TkEw}#ZCobl|1L@Zlz>TnK1lUkUCBoBM zN6!@e3ZuPpuPX?qM7*x95N!wS71k?*gCpKvD2ck#|0dcX&nf60RB*#jigVR#qY+$x zuMc}B6#ZFx-l25r_HdRt;5$BS|EiS`WV0C9I6C!Bj4ddtbB%s8+_V1LftA%Za#8L^ z9qOek>2#a~a5zp<%zj}zCuuP@%rtSme*cReAUx~nDgBqZ zY?kh>E?vGsj?|77@opmA5^8P#7SIk&YLAN=O)zk~fFZ2BU&yXBRo z^0sUh!}Zy>yaAx&|8fET?LwUC`UOAP6VPsuflc)@BRHRfgkWYkFP)pe>OcvZIKQLf z9EJGH4Sxbt(O>BcJ(2nSY#VHv>8VaKW}@r1^+P{R01vGlw+sJX6t}H_z7!lUR$X^q z*UwBpE#&E8YkQDa8pv@#@zjMIwH8N|nKbeQXsem>x|7z!dSz-u2RiLKAzuXYSvFN{ zfC$OK_7bCJZfczy)?3=mrQHBXyADbljvY2y2}(i*8Wo{fOVq>Ec`GmZDI0^Q^r_bd zS1vv8;8j#6L%lwn{ohqRT*Ef$V;lTmGuH}Bx+8ilCJ+;)2`8?$<1gpKz_7z%mv^N+ zm%9AiTHWL%P8MwbB-PULMC4ujC+Zf8QPBZS(OCYsrd%{zptv;14O>GuE&Z6vt%|Sd zzY)%-*O;os%9?N4SUmmpr2GhOJ=2zp3nRpEF^@UE*|&Lev5wf?FTfB9Fn=a*gPTmEN-|NFBa<}_?-|Bt#?!V6~0cTvuDEac`4 zwW?v&^yvMrsP5p@D9f-n89tpXwy9%-QID~~MQ_ZFD9>wh`-fcXg+a?pm1ck@YnJIv zKnC+uqv2*SV2jnr|s|3km;}`|T;*UkAV4eIFjw zH8^8J63H(%* zqfItIljg<5Y5q60F?$v4F;Ut=8NCUI1?laDS5ILRgZR81^k(&?(#$i)y*>)0O=rr1b# zRWf;&*UBJ2sncowYA_+DPWj@R z#JdalkW2G2{%rr+@r8|rTSG*(u33vUEm2>jS?Wz+J5zv`m0aIoX*_VY|99vA^&f1X zXS{;{ox~TMotk<)7txk?Q% zK}M8Q7#?pk*hYZ7g}7d*8s`B58Qk6W)dE;ztl9Y_jgGaf`O5f6ds=0Mtz$L4tF02r5@av~uipi+QdY&NzZdCNKRvQZJm0hbcXu%9(7p>_FkG=ZpDI%K3 zX}@&#jt(cS-$rroAx4G$xjb~h>kuP5-6|15|E)8VTBMhWGW%mx%6+jj@QhJc$XzH8 zqcM1V$I6f!gaIOCE}xRPWiJ^R6^pRS9~Cgz;wYS`@5LFv+CFqWEOL4YrC`Eq?? zKJ&9ySMCcRY01W4{*O;2YrgL==XYw@BOUoimIq&3%l>pGGfbl!UmT<8%r}(SB5lgR zZQ1CTc=Q-Kc3}9d6-w0AnMZ^aEk~2M`ambs5;byp@LGMz!W1I+W+Qk>JU{1agrlLd&kw;#X9NWOKciY;kkux6ED$XCeK zbINkPO9_3l<|cU5=CIgIZfx@HBRk|P`~ksIZHYYA`C!%|+{Y|i>+#<*>8+j$H_vTE zG4oAXJ=rIRG3gus`~&8!kVtIPW^UAc4TJqdxZoLhaeqnUjZU$SfbQF)e5ErHT^s2N zkMuBt)6wQtvs}G*RXU<%cu@=0r^Z>UFmHJ|W_BX!YPk;Joow!ev6$SNTwl54-;Wh= z%5*$I%7|{T#97qHRQds^kN@B{&T8)6jqcp_L!bS&%}4<6P_z0(-vyWvT*x#%*!I!F zvhV)VipCQ3{8En(c*7k{CsT_g^zRfzu8pRrEQaunP>_lOtwx7>PeKz{?L;wo*P#qj zJf~+RG;?8No>n|GWX-xBw_ta5#*5d3z)(l8VxX3Z2PYu1YVT4r1Z2Jm3KP~9wM%U! znD@%nPz%`T!aWZ{zF>O`4!$(rAusg#d=|142|9ixV)c0K!cIo8bTGO_0qLoLd0KD{ zs!BH~Gr42L^8O$mJao0(cUioDnrhF`v-N~=+Fxz-_as*^o8T*?k^X6aLKKC45;hGu zON|}TEUBxd7G^)l50S2I3^39*c%2(3iS`Y&e`1KV7KD+8J%?ZKR?T`JQJ(P>pn-o< z+x?$+RQ4a(w7*)(27AKzZ*(-2+ZCNbyF0aZX<1c$x5ogtas8oS1F~PwE_OT3V|+j_YOho#eKs*>3cduT9Z=Ud)w)Y@RgcUGP~w#WN=%BH?*(Kfl*-`jbZY$POpJd(zURr(6>jmtx&HzXfH#cKx~JeKsCd|FwB8f{G58 zQSvv~Q!`%dqUGNBXZDE^;atX4GkbZ*)qb0bBlzwAKTkv7HU|0kyq_Ez6770)+>VbW zTF(3=kR6lIQVGr)qooQX)j+`DDI-AVsBklF&0sl-^~@uu?G!%FiU@7vW|ZG7V0(4> z<6PA=9p#}#%M=Tu$fm%(D|~>TTC`0{o|?hB0f}i}KT50BgJVf_HZvQfLJqiE2ofc3 zoGfyQ+N;&OyLeSv4q_^J-S4RWE;DoPP}F6))DGZOcpVvD(>Y93O|&?Yyn(NmnBaDA zK#8##yYKVIHpt3>QX|A@`@Wqjl`?L4Kkowl;WACHuNo8}Sw;xey`Azj^WjPJO>gju zN|IYs^2ganSB()D*rtzt6*Z&sT=m3lTS#}0gfw&jsmHYt>43)zD~NobPvCDy8`s7n zX6}uj1M0Le>ijXf^0V1%`wk6Pd=!$5Ur!aYLyR62;<=*|V}pQ6@{hlQ=a!5U80k{a z!4q;DhcKJbWfivy(qn!_GT88rOJmYty5eTYql8U^*Mu)=pML8`mMLf{;7;A=V+oMb z<;bNRgSzgT=5jpCuKO(9PyLy97k-Z!Bg zC)Fybjgo5;EY7?N2kFPoH#W;b#V4K2?r|&K%#y8#kBTu0B_Zm~))wISUsOVaEmSYJaO$QAi(>@O6@MzsQAZ`uW$MZ!bYF-R~yba}7eXv>5`M zIEB5$w>z^JP>T?;bYX9?s zQ<+*qK;KU0I@vNa{_Ict`vU`+ie@M8{+?k1H(5*!w@q)jS%?4Z77l0khoT^EH4xbk zwONYlb*h}^B+)~t;dBeX>OE@0RZ4>~|yObILyzp2qP%=$**?b0)g;tdrYqLR~xNTM_mhvj42_-`xN83BqG; zF1z4fn`isu?f0RavaPSgV}EBuPxL2iSBh?Kc3Mi%z}k>uLa;U!GzEuuJX$zgO5Yt( zq(JR*xNky!^*t^BK$A@;=v@{ZdD{1gONYc03?{!F$X~R}Tg#AGbt>J@b+LwZeESsj z00fuY`&Ph$H7ba677q88j-t`L& zvbU^}&0i<|JbI98=f7rLazwOd3nmjL-Yxnz>|GMQtpPA7GW|`DH{)tZ{zEjMLLA%o z(p3~VxCbT*eh0L+sU1vWaqHrh&cb#HC*k%J1=LNniJ8ZE>&;o@PMUwd20|t$6aBTI zVx*d?_N^Lu$IC#nx)?`dWiEABG?>{&el92d_ICrq)4xine>=20@Fc6a#g-jTGkd@f zvUJj&9@`X85v6Ps|72h2RO&5&x%pG5VNt{dS+sx(ByT3F@t8Q1NmrbIpezU{-s$;Eh1!}uJ=P0e-m~lM7~cOSL71dHCFMBU^6GqFqX==PHLB`t10_ z+!A1-e;gx(UwB$;!x#H1KsT$ystTJSaDG$6Arl~Uf1HYTivGRo z5Wm|YIXYRn$-W;2SgxwuJ5)`dBfnqe#O7$fk8_0p=4(tX{ib$RX;|+>%vZ_P@>2T6 zro5lzQ4!G?+Zk!M?_mDzJtf>HKtjdQ9o)V&kKjeh<9D6|A^zn|hoU6Z%_Jz!5r+}cT6AMG0M?jAW) zrFB5M^gmB$?6Hf3dv<=`zJ1`m^{(Z)6QtjAd6s)Z2)C%FdRCWLuL+I8a_{xBqU>+Jxai1SP>w7GbGdy2+?ee?bA@P-tFH1y}eo1 zJp514(h36fExHy}V+{%Hs%eih_1iCu;eOc!T1wuYutk7$c0g(wf{xw=Ex^6in@XOz z6;xYSq(wOyW>q^`*4BE~GEw0E%f0Rta#VYV@H!ZJZ-7D?PuoDhG=B(;c{(Vn8vH2? zq|#?dtgBp=chS{wHa_3Cpno)Z1E6o`bE8FMk$E9)#;a@QOgqFkY&qH5AMd9Z$n|vq zk0-I5k}Q&@Uh4=>)tu0UUO`GSJ$}C4U9LpA(C{hKhfRO9>%SCIzA5#gC+eXD<2l(9 zMm{iiI`q|{(_{=+F#lsN8!=4SRau*;5U)UCPvtBi{4|^S+-3!L4jLr?wYp+qylM|W z;$mmctz0v`Dij~LYik>FEIhyW)_dGWVuHOyunsJ$Dp)uS#?3;qO|{y9)PhM%E!P=%`CMPlK_E5L$ zE8x|q;UPvyG*EkwP@jrk1H5pb@%of1pH_jV4_F`Std?>c30a2Ra^br?pGG|}uJ^b2^OYyxJ#peTS zQc}%Ug}p2Esm0@>#-*v+v30|rG9xKIaUxLkOysvMB;t*8;xC4O#o_8)B+&jTIw_c( zBCv70Y>$;>=vggX^ivV7wlNf!R-)n2hc(k48N8F29SshzvX71D>i&9?#U9LDJEAH0 z_y{qas;{MoUhvZtKU)xARms1#jcBtQYcm=WaYl%15n%A6FIv=U>cqOvI+3IWGAW<@ z5?T?iAlVBHKRznspGtdZ^SaowdV(0drI3dgMyh8bZNBYM>)402aZ(>mtR_a+UjPhd z_7Wk1kLGjH8o!;%A>N{z-ic%gx5(MQVt z?AhPphE=2F>-8fX820yDaec9PPPpg|7F_pLtw5>%PeCWPey77p5M;f3+J|ngSyW8H zR+*|b*-eVi`F?S&*BC?x2T!rRDMQ}p!)xB)vt15|z5M?eC(TOHxtPp3R=HydviI=# zJFOBf6p_yk>>5`oe!|wv0JYZ`6@B0bXQm3#j6rI~PthaJDn@s_MczyF)99~FNPb2- z$2L~9+@N=OJmoGpO97{&WSbqH+x{MLa6QgmW^j&m)o-uU(i|lGfsF|(6qS$+9)BLz zSG_4P#$d?u*E_NHjTM=JF!iVck8z1^+oJ_jFxo5nD$M?=D4aFC3&fWB!3A;;@aNom z`po$q+&IuJ)y&a|Thh^!T{8&KZU3w^qet^|t~?h6rWFRv^*sF{fZ?w6Q7>8F==Rue zzNKc?9E`&+P-?mtr>FV*5xJKZw8lsgHGOD>FMKg<64#ZSWh`|EY;f0UBqaQfJ`Uh# zpnNk?9@RS6x~Vv4$7CPH=;KkdQ@*U5t9FquB&lcxDUS4#Nv9yppBl(poW2l;s^Q=| zs{P02hMXrcv4e#!bJ?f7xH7o3E>ciD%waYt71UPo9yK&Ge{VBYnzLyzyW$4<2HF}* z%)auWpchZ8b;BN21&@R8~n9nCzA)+ z!V7Vt`#*qzeZn@{?p)o9)DwIEXf8E0jx4or0G&k-a#bn~vUKFXM&#nj&DrT_UtTZ~ zl3IUu(`)XHIkK6Fx!)x)&IP0gvdbD=s%+Y8D*!0`_1FL(hbX=lW1i3*2q#F1y1K5A zp0b>!283+ej-hpyN8a9C+h|~;S4q!)x|a*;?;E;`5f7Y)MXr=(7!77(Q{Ok`mN06< z3o?{WC2rZG*7w-@e%X<`Gd{w?8z2O&3{l`Pj6O39#WBaKKiU2<;dLNTW+4Y(a33y! zGHV1fzxQ&sFLj{}jNOv-?`b>nITfUjf#V!Fs(R$|$I6e(q0T6GJj!Z4=Lg-kW3zSB zh$wyMiG|rQJBHI+=jnd%JJlJ;O%T?illf*)BlM%-Hk8*zWKj=ZtD)dQ_bTwZ;IdPW zb_Ouq*w_P6eD!zam91>Hk8kLE=`Djg7#Ye1>9e^e4KO~Afn^NWv^_d~y{^15TI>d% zeqr==kRcIC^vjpC@w1Yqt5L7XTqcH|@Buj|Y@2825yN5qB$Nn-G#)-$Ms!)oz57#O z?!jw%%_9n{*`D&Vs zKX8(9MI>EABk|aT-I4J`)`1dPbgJ%A&G#dlc;~@1-H9jSM`CQNk{jy&2;`RE>|WbY zjbw*z<+D;SEN)kJ55Lha$>LWTV#$A_14a*b`L_%X)cD9FoLf0fMogjuTj|>ij2b^J z+IR#PXH2A;baf(!O;B+*ct5#b6>{tBtWBo7bsb6b<>}aCrXdIQr%&KwA%uJ0>$k$SOeT-3|3lWyU<`MB#_on@=7E+p^X3n4NY8kD1DdX#6m= zjs0e`s;a!2y;$RAKYF+iV|}cbGSa8!ctGR=zZ0Yrf~oD_^S!nWx4uuy!^6Ee?Y7oo z=AqSkHP1{gBmZcW3&P*^h>07_Oz0zu>Hzm$t%nxvEBLDS#hx^6cr=CbOf4a-_58W9 z}v)Sr<(){j?4~`mhSHG(0 zJG9>gz}?CJR$>58o46;l!RqH60|PZf8kcEmj>c~>L>>6Jhfx6Ik`_(lk5Q<(69PC} z+of3lc+RuT1B|qGS(K3+)Q-TS`i4WLRlo@j9qh3xw=CL?)iu7V+-3m(($jRLsvy*( z5)RI-xxLpv4ykO`5Xa)787AsKG#-3p|6J?B^DAAjKf=}`*W56zw~Im4I8UA7Q|7rs z1bkEU76AJn3@<2BjaLxAtX;E9aYk!xw)gm~(S3b}Bg^LxZM7tfZ7a4MbJe>Wfy~6) zxPZDGdc1#fl6gzPk~M5j=CvEJ8O6`qmbqb@0w}pUK~!JKu~8umI!cYAihr zlqnc5?lZYq;kP|nD)^02eIe<#MxBiTLT*cIwS?z^$jmQDs5Xoj14jYoj4 zpo;s?b#$C4z~@dS_p=ngWd=1{c7Wqz;uWPshCAl}qaB zmY><7ibsz}$V6{RD-{s9*Md1G4=fR0Vy zd8Z|VEJ<-hAkUwm1VEl=*=J!GO_ZG+wDE#_c!Asre+@`?2*kk@K6rv+6|JaZT!GTzeIhdtYkJ;?7bW zg6=ymha<9Ni3!qrd^vd)_n5ixwfA?Uuv?B#uBV+`YH*YwmLo399kF|w4B$t8Ax3=i z&P3p}J!T2GJ_r;@uGFd1eMH&~yDzurdxcl0^W+$$(LOA0;TG=-LO9Eu4sU(l5M>Wg z$vz_?b&0Ftn1CNG{E((!Sye=xkS6zt*!esppG$~`nIQV3sTydhQ_^6o@0sefOQdws zX4L5is%INU*?dRwh+tLa3p%BGNNrpM7?<=CA-7GW?5CF(KS$x-?2A_r#QRoAwR!-# z#Qc{%tV?z?ulU!=r0?3%x-GK@(p0p10|e{>jk@%ub-X1+?rb$$TD*bzZDCf2n#K7^ z3(pT8NxtQLBg{`7E#4k-!s>pP?^dO@ZvI!b!9TOF_VeEl?T+jp zD$$K)kHA(->ASpnxPzvS%Xx@g>)M57Gk$8+RhXaZ@Ij8V`i6eAfh^AY4pq}df@Nz` z733PC@w*aN{CKw*X&a^D8KV0Q37`px^H*MqpMR2g+>4_A0xtK)^5LIzY<5VN`VEuE zcl5zH^`S{AN~-`$k5U_5r?D#<33QQehC`ai_P5${<)&lme~MR61nc7XU4uf)q{-nH#E!?7p0^T!dvmseOd@3O`80%G^L zD3mvjKxwAF8P#Sq5odnRCSMY|XJM&KJEpGLd~-bE>uC#t51jm3JRZB|2^T ztVCpIN^7^Y(3PZ()enxQZd2=fVjVEDW%zQEeo^KY6!y+-zW|{YN`2>%w6d}D;PGnj z{ZUcjDX}{oipDO-vf zs98xnVzzT;NhxmPMpScfrixENZIjA^5=F1268S9PBJJ5Fj=196#}neo+>I8=MdN96w_m^(oUR4v;+yqahCW9JYX>GDer(+B$0%!<0@A zeRe-%M4j(`>Z>TFYag8ZBRcDZZuWh%)}>?l9}8R0n;7#W>J>`lIVVBJ-N_eE_=Jdy zhwZ+zE&+ZlqKX?R1L5*bCEkVUc@j%2bnS^oYLHmP8)akn`2X8vKch%JydHE!@}yT| zg9&0hnn=%7xidaQZV}Lr+>f`8l06%c1WYh@5g^#ro)ry}af5fqM=RYY^5>P+rB|0_ zJI?rRR`+RlU)%H-zEZ(rVv~zEz_8 zi>erHe0a#BGxyItTr`cJ+@sdtb9Vd&>ag9Cputy5T#jY7+(eetV}tuoMgsUKyMh>f zvdID__GIy-A)gD;*=gY!OAlvNrPryuC`uXTx8Az8_!=+&c&a%7C|qG2Zxr6wYl@jR zPvvv#*qr8cks$>O$_hJv1!5nywmfN0CXI*|cY+1;oJ^-y(Qc4Nzl~#>aQQ9JsWOTh zqMQ>R0qYOt9&DR^P=lX!->PbsfjU-idTa9Sf$^2C7+T6(P=5h;MmoKf>Ym^5bkVrt zMt|Q*4xUvpmfUu{tuA@#aaiXX+N@;_NqPSc_~sD^)Z*f{MOuM;QEyM>)M6@&?|h-A zyKcRyN=Sx|!-a`o)$+OJkRnL5Z?I%3V^FI1FATD9B>A>97-Ryu4Cv`jWG-%T&$Y6= zGpxCopo-mhrbBMQmiLIEYGbC`bOvVWQOi2hM4O$)Nk{MtmdMtxmj&0?fYBbr5|+F$ za)j4;6=UYqndLq8i&J({p4S8+%t(d z8=)TSSGgFI-`cn4xs_+dxO+d+Y2v4hTD2wa<^RQnB+d)pIX(i_zS6tTnp6ax#`CS8s-XbJKI{)eKnV*2{#84A77rL`~` zQ>I$Gh0Zv?4YE1kcZ#_S$ro7=gkg+q##q|qPKs*F@ec7t??ah`v!ZWI!W&zY$BlcW z&QSh{CB*^3ycek8pqTmZJslrbT0_rc4uCd{wUDnHev`xmWjUKcaBg1pUY=J6WF)}@ zR3xj=RTNrcvTsqmkvUGD_+c8YJE-TyB{!3s0Y*Cf21@qyZVG#xtg3%X=V0C>no)eI z^AUB2Mm3i+v2JEN5`eb<18t9e#K`xrm28PBb95uWqybVT|XR4<}l;7maIk`QbugAk5@hgmdW@$eF$cL}z($;L? z?|Job?Ry=!Azlh1Hk(hs1i%7)QXs4D&<3ZhwcD7`T%X^n=#RU$n$H|pKiWa8X%r6= zfvnMTn3FnhBh7Zh2+EdLUa2cGcg^lK-=gxP1~}2JDU3l7LWTT!c{C6qgkzUIeh*X! zHG4DV|B0cW`3cb7Gh%hU2lZH6+m=?=u>1Y9_61AI;bi2;Jafq8vyY=25y1Fd(-6{g zAI&TmZ7KQQT+rHrm4{{wxqm0UxXIS@2>5ti|E;3Yy+^Dc5W=}Ds>^QbBGpsG$Pa3b zDd1zbW$9`U4zR&QlX2mP(C+yIppNcW@2fL{S#smhCoK=aDZvp>H2VF-UKO-Lgx_^` zxx0x-7h3dS-;B?=iFHKpth23N#%S{EyB;YW=1sRe;`DtZL1PXtd}9j#+LbTIfY)tv zV_{TwH8Yon9ta!WL~(%~lw~*ccZOSj*+5!N#T)c=+lD6L6KeEe>?4{R#;-E~P_#X` zb?TvY2w*Jy;a`l3h*Y5Q2CZ5)TZ(aZfTRFDP#XX;`wCzPmd+-AlShxXxs#g8s9$3_ zDf8rJJg0r-lj5Q>Pjy=Gz;fiiC=PGHqr!sIPH34ht(y+q+7@9ZzB?C3%I6rrw%I<3 zU88U#wiIrytGeqv>FI3-pZ2bun<4maS2>GmeVhxA-x-V+J`reJHsUPgq>kH{mN6>xA3#>Q7dFT z)_qjF0v}s?^;0;~jB9^D;or~Mh?{!2l%;sL`R@4VCP_#`XE!*xs{M+|Bq(s^Fj8w* zw_p7`Z%UygBzlkaG$1u#uJ70)k%FiK;z|wf$U@-ACqp{~*fgv(-=XO+B2e z_T6Zzj^Lh~S9sB1`yqR-8)8I=(pYR)p_i_k2^dWga0&c$i3@COgiaVUuZI~Hh$VTX zh-QWOFEj+o=&f2?VGQTVn&{oaX^{)aHp2h4KWZiK%JjUC?}`J%4BnA9j&rzA2ZVWB zf=+1Ge&30pNul?0PHLnnmB^!?w-^wt2e|1e0fH?rea<(5FsIkt4g~k*BCux!?FW|D zHi(qzi>K}n3~!#ECpX^QQW%*0wDblRXh1}WY}car&I@C09ZQak`VzEZ2rh7wPA!a;##pW_n*W6QtNqyNOrHWI;K_ZB@&FvvYRHaBZy zPA@xSx!pc@H{t2C8SkWx_Y8OplF7`S$1=9agE%K|9fyI>3x~j>%2#-U21{eNBW>QX z7E;`P!zCk#OJ>y?WhgW8nc-(sLHjogg5_0Tt;m`H4PH`lQ_HM485|;=><7(xrKMs! ziL=B$4=dkj%7tW1>=)#^J}6p1i6RDYUMkQJi)T%oU@%=B|8Qe~$?@ZNfuKI>{kU+k zDQeB0Lb`pC(myTG>bj%x>mQeLaDj|Z=ofC;X|Gx@e!`CM#Dx&B*wzvFK98yZ;g*xbEyP6UUE&ifj5}f zfs9)?0k(gwqjlIwu6wsQ0&EY)6j?Kj@3RF^+eaLW*x@k5k(u|5P{S(o@-4#) zUZ~c5d3-eo(a?~E7Zos;!&yLS3hG#S0CmNAtpodzsu-)it^j7fl#@d+nT1i8xd!{BfGe-D{I+>ED8$SmO|6zWm#D0;5o(Rj z;@!*mT*igtaU`qL7^C5tH2r>Rik+gA!A|;$`JIzwKLa2a^baN%e3FAVxS?nmrD4|- z(tkueQuUiCmk(b_zwKZA@oy{`hsx>?{WfFuY}II?-c{tE-cB!thfiSIRBc1ch1O2& zOwk!WrH&r#d6_v`iN#)cKfZvDe4!KbcR&WpzvJ)os8I!|b3NQDfpBkYOnM&RT zZ^HZJwn+{}T7hW>G>n2L?-QR|Fa%UUn zQ-P8(lHl7_xqeueBOCUnPnqWX20H|zCI^!;N1qK|HnjG<71s0UTBq-6-2fwd;tPF{ z^j@39F|GbYYeUS`Y?-ouaEI@ov)&-xrV-AAnH*XcgH}T<&`#-P9}r{kHnY(|pXL2k zOI620q6+$yKiAZjzWGKv4VE&J<&5#i2e9pZm=6n%+%{)8jSpVz|mj z*QbC^Ao+Ud<}3Bh`^=CgD!|D17dOIo7)593>?E}&h)b>eDcD+Ti>(GsF7HckQ>CWC z1($hKWk4Uome-u-oLJ4t-}rzvDNl_H+C}AOUIi>tLMKMWTH+36QnR<9$gUMjCn7-m z#xhlEr(XNkIXnsasn)9)#}}dBksvx!JE=nj1wt{*dv(P^{!CnJ45}t z0;j0)q8QSI&88WDUVpTXI4{GeD^vyS`^Nb1aNu68dBgL>pF_PGIZ;4$S^us~&+4G8 zqF^U4Wy#D7e2d2ZDS%Y~nt0p{N-}{J6NhTfQ;{<`s+CMhEFbTwrhlvlEIC}7xpG-+ zsgehe->bzQ+t#Su+@Hxzv!Kn|+|2E5fU`ZOnEP#K+ia`jqgbdm{F?978pO5FZAsK~wY*HQd6-gg za8a0%{X+Pm?&OWXKDN7M_tG-QcYEKoB3<)?63rhLTuT>^EBm)3+CVPXQ!*;1drB#C zD$H#RE#tJuTQC;@oo*p=BD~uj7EArg=nn>_5)?yX7n%XnZ(r>1h1qrF&~{B^cA3A^ z!J#`yPlsC0acsbD-fP6fF*iG4V|a+%%QZ%G2|pWMVA46;36?C^qiy7$bupadqTKm2 z1db;$oXMA!>sV2u{@C+8q1FQO@^t#}!LmikoxWwH6Ch)z5TA@?`m~9BK_I3r@)qfo z^(})&)1L{F$9T@i#cSbaV~c^+7Stie!AK4s8Q_feNk-B$6iKJ zZf9m*$-m8|AG~Tr6uVDg=I@K^`r;okzQv#7DMq{@ABgREI*nz&7(--X>#?6Q1ma!_0!sfR09i@kI<`j?pboy1y-iVMo& zynFU9E;Wpq4}a~*Dr}wov&9~>mn^S$IxzF3i+Oz`xFB6SK+VbZ4D60Ja~%COOC4^K zmKJu_j3!~}H1z_a_TK>IFnwaTx7&V4Au{4q-)y@N=%UCbTF1nuJ}t6fw&xDoElzR~ z^&%}thxSVHbNW>O6rJcZARI&=3Ny0`xA8Mm?}C%#m@q)b--GlUnsu+OAnU^g0!S*i zrbGD@6h`IWX800j`d-zzcq`?~(3GYRa;HLgx(q4882;93TisTz$*slov}Vit(tt=F zgW<|l3RW@k=sNbp`E}DoSa3;+2e+1|J?jFLdM47>wLB$qJp&y)uP+ns^>06XADB zy#SMb!r+0oy_dT0@^B?1uZ&e^dGLws^LQ=>XbhX#jP=!7284y%>#9yfQJkNXOTvp3 zj(2de&+YdJ9Z{Eid|~3euFl!eQd51J#;!fq3esTp?fmp%?Y#TanI+FMCs+kX``p%) zbMKDf2Q88`WQ`f$=}y1&OkEEO+U*gOE;AOwm|FJOHb6A;q?232?JuHJOK9s-z9&;u zgV3!68rSXv-<@xbHDAAwq@gBVD*35DbxePoxUByTQqj#|bMObzywc}j)l`*RQw=U! z)kQPc^isI{vdVOTcOes?{mn5D(yxn=Ii*G~>I&3LCU-Ji^N!|9(SMlEa5VT-wqECTwsWHave}8?P=o_=)*{`IG=lHhMXS#)V~T;sK&=N;RHIm=4*bO$M6;-vpKSwu+dD zPx;)p_k^=cxi?%d)c35g^;p>x=uSPop(`*YG2H1=}bmBc_T*5g57xTedzqo z3O9WMB}-Q$(DVK;8B^M1riDtgmiXNQmK61Rx`;b*Cp=87JSk;=MEHhC=wgOVGFOYc zK|eX>W-5^PswdmLQCWDF@z||9=MtH3L5A14L@r`;f$affC>Q2-z&E^s)4!KvFvBJn z(9r{?C;Vg*{}V=%ZAneEm^7Ph$75~TS~}yavs+$<6S|u^lqR|>S$@VFJS@QI3f+5C zV7KS#%T)~V@916ERn7P9&NsT}z`H;k8&q`sSH<#+UyI9kpOSY!b(QGV6~(CFkFoV$NJsJgsTHg={_y zOa+z4Auz8TVHZ*{@W^@2A0#iF===150148Mins!^Z;Ll7ELdI~vp4=(NB_Fj;nCDU zUWz1F=7I2!Gxr$J>MBjyPE51AJn8t)Vzgahj>FD-*>Z*8TascEjPub0t=u-d=ciZyr$K*af^&!rpl~oO{&8 zZP2G_C1ydBk+XeG-h4}Ii^%#9>ymHcjso4`Vfi2RO?aD0%WHAZ0cX!6Q1R9D6VivY zCh8e0M)DR$tszu2I2qo6Ks~47CD?_7+WnVHT%7)hAd?1iZI<7^&nPS)1ehzgmZrRXWPa?M#a~bY;M2EyKa%RF+E{*Ct>@ZWdNcX#Qku#s zpV?|9jhB6TQBL)507hNbIfq#rcj0l=5!NB!DRGj~=;@4n&Ba`J4M!TF+sDJww};o^ zQ3_w(qAm(y+Wn-kt)?1s)FLPQS8OLL>Kk@JU?@~Z1r#_EY3QC zD7|gWOEVW9T=pnV_dYh0q5XG7@eD$!=lC0E>jM(RPe{XDyiU{gD9Qo{XzFWp4Vr^@ zed9XEF;)ayuBq=LWepFGuK^t9YavFKl;GC^>%B`=cdUIDZ45p?zrrb2tKK>Zowlq^ zxZPQHXvn!f1;6AqO#4)4L3Ft0w`~|Re00b%ET)euktzC^r#=?6@;u|sQ0Y&B&RS|3 ze8kz?iGSPVWp4JdXNpBSoC1W2CYMcQunI8$(6&?A8gphEktNkjpkt;g#V)*{yjkZs zkphacdR2I4Bpjp_Ey)T~8GJ|wooO<47M}C=FwWl1XGb3zx-s}2NxzuzUkL4kMIlet z`&%YHY=8@;c^wR^x5m`WtSFVjx#M8DKtN`y3YFOI^$&6W>?Vfw^gO~ctzTxcmr1A{ z6n0zf2ZE%^+07MMqseouU4;hiRx8`Va*iE6vV%J~&UDSTkPeNVic&5fLQURtz)eFh z!;~6DUt{O3vrAmJIPG$yJ|7s`2Jdy;r(-$6*3sN+F%3-8lo?|KGB12Qn}f?jdd5Bd377Nu?k1T8q?E>05b+Tmyur-f`QX*cXN?m z8hyc^vE7hA=d}B)k+ZL6xnxMIL3+MsPxoer|HhmiO`TK@COIFDtX*&-4J)6RdFQ^; z%TQzpu0z#{D{D8@UG9~fwAR-{njMXd_Ph$C9mYapHWIl^K2>qI`My&sa!r{F8CP{b z>NJf^i<}uT1PX36H^t#}vOIv~SytCtJMYbU7G+JSlz90Ga!|mcCTFpmE{d~Z7 zzzFmIu=O5(Nw4q!c%4q!X=t|0a%5JDv$AraQfUq>&5?Vwl+2YlaAIYpnQ1C$PAb8X ziMho^X^CP%p=F9niio&ypoob4UVT3A_j!DO=X3ZAxbD||U*maQ&*wGU&?WkCdoFR^ z5337pY5krAF5+Mc0$7GHx0$7M(cEHlj%K~L+!#BHEpHm5;$&7G(V1C~dFQY=hs=w* zIvH1i8hvQsxtjYI**Gn|I%zdGduyBC`>;nkcdR+DfEvY>UgQ!xe5iLS<`ItvC! z5EGzxUHngH0Qka5d5l}8E{2h*bzFq18B0`)U02|=(GZs03^?8}U5A&|e>t+psDihP z+zF5`vkyeIlQtd#bYv6l8w1kDl`cIdUCyV;@%dIZ zXFZ%6b3;`)qsy@aXQ&=0{nz4jQB^I79l>rFWQmGRPEbmI7(g73$BylddR$XZk;Q;w z#{HuHI|~4e=h*=)1H#!gb+qT=to)U9%4PbOY@tTAzy}s)^E$cxpXYw1;moOt0KQD%P}tp*n`_m zwl0m#e5=L+v!72;`3H}YdRhTN6i8NMq1wYMDG!(BUb^cR_)XpgTy6!La+9$r=h)sB zzr_hfQ(!(%iig+S9Tc@rO957jyh}Yt^VYj})q5XkFiFaD(K)W_rjyJ!ys(a_%L^}( zjc6HkZY)9jL7U?3uSp8m!a25fJ_?PEbKtSM`MeBZ(qRs>(lEA}#&;&zQny~&ZXCaV z=36cR+P-lGu3l2q+M?I;8adN9QjXka^J`ogYd0>W0-xAc9^=#K<)SUl)~3;vju(vKLcIv@M8A-g(=T zQ+;)1Rm9bME=+6@RY0`YtI*7-C|4EU1>Zq4YgeDP)eMwSlA14500hPV^A3QZm}9H} zvVQo@mCWw?Cb{3^|9he(@egtufkXkWavmNu{#!Q<3r(f40 zzB2l$2xmf#Zs8;3d*#`_T9$2oF>SG2(JFhMeNd=Cy%-~2$UFM5i>Y%i7(&QAO)24w zP`+%&H9;BbOWC!wIO}u&T5o)ZL~NR*WFaiLnMl*gAiRs##lVH8pv*wfu?LHEnuLE- z1ZN`TTm90`a`3B|**MCcka?nQBL*N}-Ce`n!3epHI!TLbO6p!@7vOCbcF5Q9bQGlB z{ca(8USW!f5zqFLwh(Y@EA_Pysq4EMZYIqi=~GPE-;uz#;%lu@-sRc7YYesKm^f<9 z0A4XqYs^$o*eh>WJ8FHWW2fF}>w~l7J9ZGgZW8+{;k6i>xx=jO0s72VpI=PgF`RnJ zHMfF9NW}vL6avFE#ZOB2>}nfRa-z4}!OwAFtTlqq3pw2UvKEbM6?{Or!*}Fg$;xte zB9gpK^IxLha;YJal$)%DJtOpKorM)yoZ+N#jjO}zz+Rs}3;x)a>&+~lUuZxzz zw%&`4rRc@2=0r0E9d9E-n#Nsb*XM=vv~Dc%dDLtv z@CQN9rViMoZwi;@lwom$uYe5jFVi;dV=cqv@266N4#^=_&1bhG)rb5`+;k$E3j&UK zZ`rm?{1Igdejk>y$^WXlQ&UJ{I8}K(E})x`8nDH9-P3ZFcReUkRlhJoYbjPZSW(tn zysIb`Tv%{Sl!-p{qanKetp+*Bb(5{Hd{^>#Q&zf)AL<^8lT8bp$Sc<+Kq8wwJ0+eJhI7w* z{Fm3o#-eh?UL!R4M5pY9KQ$yvlXY|NV=Aotv!l+umAe%WG+`UGGSlD~w=xrQJ>n)u zuCDdRqC}0CO~&x?me1txt(brhQ>?~EOYxEh+N`g`9!WZ6*s5hp$*xriew?^J4V$~ZA!ux=)XRTGZAagRH2ev;Roe4yaS_BBaZ*!9d19DNZEP0 zB6Hn6Dv9?8r)4?rSc%RW5uBW7_os_*HgoCr_5P7B5aAQ$J60U>qnQ!@Peq1;*eg|a zVCqjwj7-SSzR6IHad{zysP z#75x*SzA1`V;{@HvlVW$N}Rd^4qgz?BPZnnz14NY>Sg2`&e!32_ZNA|>oE}a^*{cl zHGE96bc88+oVqXU1Sqa)iZBfV)atn+0^#0E)_k6pvn z$r;lFTC+!$%(+7});89i_WTHqCX+XHiPxy*T?;pW$@BAeZ{q5IRxxA}zWwU^rh}tS z+Tp#fc&+u1061YMGm>hOzv}{VK3J81A5#lompi>fB1jRDu5k1d2qRqlS8b7Ci)RXX zXV&3!P|hJNB(v46@%l)#f^=6DVyi7hnI4hR+Q3=Oe=>qtzj_7Zw^Ca7SuQstR(~Ks zXauLGcH3XNuWuY|8ayb9`#F4_-3xT$Id*r5b*SAV6V|zPBWaeir-9-(@l7m_ZvpXV z?S8VajW<8VcIVh&oBCIg?1eeT^(`CWB^^rNFRce|s|91BD7fbL2VSs6s7xi*k6y7G zsTh->S#0FH#glP1J-sR5D>ICGEV_}WCuAf@@We{VI)>WbPT-wF~2420Pzzz_t>HdKJ zZWB;jPl(p5kno}oX3@I-%KSV$wZAH;I7_8%X)9;mF7*~qzh)0;|Amr$K~#*^(4a9F z@i5N*E_+u5q_oTm6rs=0smjOKS=IUBZRYI=cc z>{s$)G)~Sz>ERXi;lPZHyH|zH0q50+z1+20>{l+Fh?5^)ZP3}uM zqKNpBL_IpE&T*k-NlwHK1$WH*G}~yU3H@X7i{CE9^0Q@f1}ZM?Cl*){GVg>vbAr4R-(v1fTG$#{e0qH z4{>?Dcb={C`PRD!ye%Mhz*~9yfast9=gXUE2HBIc({Cn)@SpR9c5?Ppmi1>ntOf#7 zM&kObz%SM=hl5Bcd$ROZ@`6r7Z^js1nc*t0BvZDWnT+}iVD3ez4zBc;~r zAG;^wx!aK}>$4hrkXNK%PC+s1#~!o$dDAC8FzJ|_^2ndSvA$V6wvuxvWz6;3 zV4tIkm)m>Ui?dE0rR`Bg{9|s*a%XFq)ZDd52e)ON(|ZuWf^vXD`Wh9ivQ)!axuh@+ zE9Y-)Xb70gdOWyoLvWq;>6M znVw{V1KfFO@+~|tZQV1fk|zhUE+Ot~rLI@z-xT>6JUp?#LFf8O4luU|EHWDVK5sYv zzF09Lm3IrIf551!tTY0tA~y8dE}ZJ;x^}A8{q8;A}GBey#5iD$n54mrJpsvF*tWmW(S~6 zzokvxKYOZ-A!&@b=6+063baKVzR7>V?Hf7{qXzM+=*x`L>DKiq5cU} z+ZfxLu1S3ks5O2u4tf~c?2XE7M%lz3+ch`469(zsfg|xauDOv3}8H?CF`8J35 z_Y>_OPvyxPMy!)XegT9Xv3Y==i8=0b-npiZ;F3=p&$@JO>^?*!egwe3+zJ?mlZ$!VLlRdC#;E{|t)r`B}v;t{oM2A)k3a4Br$iv72DN|9MnOG4ex*Qh{(# z+Xzn;>)e4#7FR&|Ra7svV=_VvPEH)`%V_7#vC+MUd^D8I>2TV4R^p-4vl9kZtG4R= zlfY=hKz<#s+IaSrXxL%3*!uR2$^R)*ca1*312H`(7;I>+oLRO@@61cMEH?NulcO-U_tb)n{)X9=#374`dE*olf8%6008@{j7Y{=th7SXPaH#;TT1UyFK%ANqGzp z>{BQrBYk@UlSxo(k6@-Pfh~e}-!=N;-QBAKua=gLcwJr*Ajj_e6oi$5dfj5J?wjY# z>`NN}Tk7MDZ(f*@tZ|)VdbqU|sC`DA%!(c61z+T>-c4|Dt56(B8_V(AGVIwLZXxa# z6hqdtc{xfV@yk~X9y2-_z{D_?w@-5DSRp^I=fcxh!{4Y^D$ZsV9M1QGM!R>%9&ado znytHB39r#k&IsmlRlUV@fLSMe`3%QERS^TazUYGfJw=;m1@{C-+@kwGqFS*;anVBx z)XhLidL14y#?`_40YsudOB;Ho;2e-6MYs=By}F;1iyL#i705mRWdx$CN1V+=KH;%x zMp&7j{5xUq9s*t2t zWb^iNcQ<*3%P{v8Fr{Pw?s+eD`#1pFi6WXt^h?@r&jtVRp~+bIny(toVuzcQnG$vG zQ+m%=XZ!dcfVpJj_y-J`G^?cf?iOHNd)uD#Ex)2hRzJ;0)Sy;f=&{GX2Cam1HAV5| z{Q0l-I6dqE$laD7t1+)n&mNbNm-HWy#(cY_QL;4l_#Yr26o}_MXcqx^eXsf>j!qw> z;Q;pVJ}$-@oi2Pwm-}Lzuzn2K*-2FKFr5rB(UqrEvtPdQyxTksItG8nL|c5Fe>nAc z>ZUp{PC&I~M~pEh?T%zf)iO$lzJ)ZR!V{L;@?Z3PlD}>0o^G`*q1XAMyW=^xRX2vz zk=!BQZ#g3pX}t;hqb;ZakXc* z@`u=a$R;&Tm>csIskwFk6bVE!5)&;rGN9Mz8{WW^lV zZ#pL3mC!!A6(sF00Zd0R8{RRVybV-Q=(oU*20BtIh&1k6cV@QE`dyAuU2A3(iyn#N z#efJZjq=5%qiN`h=SY{R_?ldk(>u06Aho?yT^EQ~qD^%^>rC!EusfhUwf0xaHo1>< zHv*D>s9=-yU5%B`f7Fg2Se!BL%+#L^`N@{!CIlE!0_E(C@s?tPf)!EkAT7w!OUG~i zPQLBE_$MU6al_7@}qIv@NaRiUxmr2TBo;)-JxWnXB81ccTp~?ne{)d*j%!#`Y z6amrE;t%$+f&Sk3tS5HgQH#i$i0I1Vz2=mc9cZ4(u(9Z4=1|v_?b9-%`8wcMF)6B~ zRH4;0qB9m~RYr`=6tTyQ92;|ZCwp9hm7SQ*9YrY&{6We{@clxeEV#jznG$x_TzC8J=4zm<1c|%mDwiY&n54Hvo ztt91+yzzTBab)xhdlmVL=MFSyy{Z?C*?ecSnA#1K8`GX!S;YpfbQ#1N>h{La&H#se z=h=znWu8B02B62)NQopRdE&SXR31WSCeF`@Qfr&^Fwjlhz25tSi>8?9vQ6EtiTAuU zbT>rwR%4rXaKy2OF^_moK*OmcxFDmfPq=YF2WX$@t+4D?mr93&9{MmvbfUje-;6Fc z1RC4y}UKTr{*5=O#-3+0HOcmM|>w3JuKGo*ape)ucg2DYQ?rSdAb)>sehb(YRDjM6{P;R9l_4w;aqF>*R-68XvD{8LD^|95T?GX;S$RqF#!VpELuJTppkkOaN{a7`NR*7O`_OYGLs*rCkDG z#J$;^QUN}3who?QgqM?Aby{7N$BqrF>EFJPzw%i+&k5gSf(-)bHcM{whNs8}Q<&h- zn`z}(Da+_EvyFYy#HX9m+`s5y*N`=J%&o)28tNYB5B?t+m#w1X|D&PvDnH`SZ<91Z z%Qe=nO0(x*Fj%7ES8?RS{bC_NFa`vpyM``4l$Fk`{S{IaZK@r@4m#{@Eh@xL*PCx$ zK6qZ{@usDp^k)c5ggP)vpO&QXia577uGsgTmz>R{fMa*$4WZz8ZoJ={X*FPQlCY|B z=-a`fj=Z6#HGfbE&fr?J8;ExP6!B8~wP1-at~9&Z5@eqVxA>Pzox7iiFV{F0=uReI z4j0F)k;T8Bzrv^>G?~M7W4{i{=u!0$3RO#V3!>^$_NIo`I{`LU6jdLEe%B~sZwSSD zzoK>?sKv>ky{>FI{K;}WbJ?GBtbHiYXV?EZ3qVkywRR`q72C!pG7E8lPT75($z?6p zs)%TMp+F-R&9eZ7T-+mjb?U%p_WR=xQaXE-abRG)Gc+w$n}Ex?4;GbRv@?){Ela_M!p&^7SOxLRm=+rl8$f8xfpYXHH@gAn)?1u_sc|q$ zej4(8`OR4gL_mb(#fYZRKu{m`C7dc)!2~Y~9PvNoEM}kIh?$(3a|kx?gwon^6`75j z8Z{~3>P88#@0xv45j_mWP~P5cp&@_VS$*m8(z9nhPbs#Px6zjf{~U?0KZJF%(9Id= z>TagWcZS>x!;%19%$)P(GFJa^jwKIW3qyVrxKEr^xWCC55j7)ON|Rf0>R&z2#jrnL z^Zz9Gb1Yd2(S64bVb&X^Fvu~*F4fV#V7)Q{ecf)P3c>%eRhR6iNMT(sRa+V>Dhfzz zpS?%0TXo}v1K`~qi9w~!V}F3HSJgS8AsZe(88PIkpCWRuFce~Fc3%p|oEJqUwV2s0 zqUAvwSG7wr6_8v@L@iZ9luVftmfCgTL~!HNnpl;=u^1FQ)+q3x*;97s z(!7+;=3mLKpMFHA;9Td0&Uo=2?B|I2#B#2a@V!{bUAJpYLzl@jQfrTEoH_n)I-UQE zem2b!dN@-?2@W$2%71B9dP5ZAA0(94-0VZ_rghPE=FA?_yg!iNrsmDoZ;EHA zEM&QF<)#IUnZTL$Pir^_qu=wOg95;Lpy=FKyYeH3)XQc=Y+f9k}f6#=ZcI zDZja(dfwCxzZ9i;azX^C&71Ee_y^|+gKZ#S_ZYKnDG(+GjdRb^!x}iIFiMTs1=Qa2 zqA}xNmmQHmDP7zB2|t84N%Z?H+@h7(xcRcIQGkBw{~zhx`dgpycW1C>J0NH^>a!V8 zDB5blSSLa&YN-kNi}z>Rq(3-MZ2?Imys}!`TDgp}ovCuXtzThQsi;{kQ4MdbjlbK) z;EZ0NyTq(17*GTqh<}sdu81@as_~w*EhpfB;1z<^YrCtlv(ado`RwK*3s5qp=P1J* zere>1Ev;%3h!)&RYA!HTpKxl1;`P?utwL%*Aede(!qmIY$(@O|(tSsjm`T1dXc~9- zQE&d%fNqxHdFU19LF%V2F7xzAGxAGo*5I>v9DPN`94I}7Rw4u5qH8qd3i+?6)!f)+ zeWB597>d#7p{4mO%g;zEaGR^0fyuu)%hx|9=)XhirDXFRnpz(3tOx^hokMgiA`GPK zpZHeUE_Fs3CPjHE!YVv5`_rwQ-5oNvlE*rfU2p{0mI=(o#O&x^wZ(94+vmquqQ+(x zfKgTO&nW8sA3=8&8g9ahH2Yi`@`wnLbyPMg3NjI875mcT!-o|m0Pg{p$COLf7Twdi zqabY7T%u2D>e~-0edk4uQ7+f<9o0!;w$Ts6eVb$e$fHIPVJ7{TSQ^knJ{*j&$Umyd zGJLx)DCl-pXRvOe&VjX+%C)N?{&hXtkSqz_L+>tH*lUmA-G$Uv0~>r{&iX_f-)@~n zyOhQjtXDl%Kc)SSRP!)Hqs6+h4!tN$be&sPVE5giL8OA+%&h;VQBcDQ_@4yx_~XP} z0^r$Vd6UoYY*WZ4FEnADfDL@ROD{cCyjkZO|0J|<6l0OcHAegg~~ z2zN}xkv3BfvC|SGs9)^Ms*4T*5N|!{GKt!Kxo%qW%>Y$dcwSijwd5?;`--;VsCc_w z%HlitW12!FdRTv`LUG9ay_zqJ>33q+rZSPI=dqmbSt@nV1@k( zgk+t$4y7PciQp0M94Kw7{Z2)*=%-s$lCK*)X~%YM*8a>WNmAXPk5<(RfI5b@hM#)sdXAk=hM7$~eS}}U*=T)*^M@Z(*g9AaUvT_m%PZ*hl7d?Yy zx$dA(Pfkos{Uiw{fXxY(45d$%<4m1pQpkgpL&o-hlDbGL?l8GNHa#jud8s`=zIJ43 zC}ffrHfxFP`NTEvXRv?{cVY35^Z(THE&&vEexGN!4zWfv zC5M*Bjaz)Mlcb!X4`BmZ?&4TCp^W9pJ&2@dQ*T&@k@Nd zyhOgqHbBcXCB`x8KFWPlE$fdv+uSh<^YqM@S1O8~p50PkO{iZS`*?)ZO#`&CY~hBQ zf!%~*l>~5M=l6(r=tJR>d$~5j??+F}2VZb|>D4YcPqa#*UH2f#dEvp6BpsZJWoib} znY{8NP9jX@lAG#GG5A$ytx%1Fr|m44Tgr(7#yN81>;DwmHfkH1H720u&*~H#4*Kr* z#K3;@C2fX>wT!NpX7*%e$o}KP0V@Jt-}&FL9+DchY0E?Nx*-o|2CwrxV(i4(CXdFa zJVRi&D=@6b*smgY-rn@oZl$jEQ*7bEBC+x@Kz`N;W?Aukx4`)O*17b;(vQr|OH0T0 zqw(56YK#tLweb_T;yjb@;A1FAoHu@j@}cqcehxY-GR zx1*w$&fhX~hZUESz=F=o(;+LlG^b|Ij9ft3T>5jslehfUhD+CD<rrAPdW5 z@ch~*6H2MGiN@bE>2?@-Vga?9bv-pppQ2~qZ2a79n?xT1>y?$hsgqwuj|lymBHoS5 z-T+;>w4oJ~9750@aA}Mg;WsGAvTHQ6s;Du)X2@V1rkXm`)qlDfIee?T+Ku2!*JjMh zD)%Qz@A;P`@jpeQ55A3EYqs}(kQlOU%I}E<3>>T$VY<+VWkVs#$NKip#bV-H!V7Lp zN~2~=qEY}VJ;W*)DsqKtVRGLN8rdPHQF+!G-qyhK9d!$*j4ILRCpMJ(yYu2E#U*mK zDT*p7Vu1&_R{qHMC%14&Deyv%IBV+|!-D9nsvF2IJA^d+F;Ug(Xec2$!`kVHKWqMs zD>K6hqdiM#(%(dyQWi;3qTnZf7<ua*hxHNsMy8*WR&5WED6Mo1)`>mYTpQ>dAV;uA9f#+@*C~x_U$%F z`bRPP6_~U7O*S2PWWIx7@@6^lb?|))$dQt*N7`K4rERH6w2K2J1l)dT_jgBPJ7H^$Bi#oIj;9rlO#U&te@ zmCB)7eYN9Hxr~dnGHjW}Q0d9rB@hMBI*1d5Gkviqn9(cuXZvF&TYuIOgesE{@`6FR z96LM*1wZcL%Q9o#n${iG%24*x=UmO7yLC6eN6d5Yc=H_e_h5YSF62uacx;4aY5f`oT=ya}K6s&-CR^u0eQw-?LI!^TlxiE= zNG-L=am7#T6{q=2w0bL`yHOk9ZkBSJD1{$-HLdZr#X@)>?B=0=I5^k;WFt-UouoR7 zthjgfqU%QK8^-LlM?i5b0cB`qp)E&5DS)PxJ5RtpYo3!L%XEyS2QwzsM=dFhGkm@Gz?x z4VQVAWS4Sumb(_ibatil!j@z4H{pIGrXvW#tk|0sY)u8RB1ZBi!`3DV&tf1XRx3q` zoz>SK1k8}o6a^8%gQT9?=fGu|kK8K#kCQO_PlKvyE-|-`vXdLqLVdS1t8v@Sv;rKN z_%Zg}>UjE7QXl@@9@_^jsl>>OWu7y`UQG%5X^i~Z*Gcbess2kVy8-u zJTj8`aF+I4&p;j_@rd8#M~BDh<`&rh@43 zuuGYCkc*U(%h;NXLbzFE$^|`>sETsMEM#BEsVYVSki9R}_VUH2L~+wYux1VK?4^;N z@nd=C;gSy$4_rB_nsoSxrR|60jhEv8TD)g)Jh@Q$v2^N@7rX9;?)`JKblOq1!%#Da zb5-e*0?~WdimE{>N4~M?O~I;{*N=)OKkkr+M=6!SZ51_Fhmfl_G3v9D^E4~CdFQ?L zx4#LH_hn{Qe`q$wJGRAH^zdHZmXiXrUhrGYF_y*Ay}YnYla zqIl?UBTv{}b_(9G;oi45VUHagC&qV_wk`QI*u+`G(z)pI)IZ0M!O{uw z8?OZbWFhVZ(qdhH-5ClKT18geZLxpT)f+2=hL1 zY<{)CGV6`Iri9bq=GE+#x7)Cxx7?wBU`f_W(ClQVgkiZD6X}4#v>_&;*pX`EyLFdbdaLx;#tyhJZsU zx!n{acD#bupH(?^12^@E@o~mZ#ls10(B{AHj4$guG@L3jh*^)rE-cI&=XZ>KHuT~* zpA&p?HU>Y)&18Ea+JqtZQc1B>?<^u?7CslqsMkAX;xYG2=a!kwJ4mE~d*nNs&^Ius z7TIHISzw-(O0Nwc>`~hMw{<(*+};3NRo~ye#rnFF+=P0XJWoirbG#BceqX)UFW2{^ zn~U_M-#MpSzy&g43DH!C#zan_H&Vi26$G9)1ST1D7|AR@PTqk`cg2EFW8`ok29)nn zhE1(Rz_D;Vt$J5XbHs_NsfE~|&e{7~E)%_~Su>|$WqEz?Lu8Am$3oeoVPrIE#oern z4hz2!RAi``S%&tiuXwtAMM1v1w*00cZ1=#);M}R>5;MufEpHoSZ^mYELruSC#)9$Kagua9M=pX*w5EO zo#6G}nJ7VIGc*fTyYI)g+ zJUNTkHTTi`D+%6%c<*TIe%adUQ{d!*AF|&4`cwUZkW^Nb%YBGc|9o7^f(aR+UTyM5 zGoO4rAuo+XQT3w6Itb3=U;#dCJt5l!PILta*3TG36fML=St(OrU;k~}e}31nB|e)s zywq|D4#`-+yT4<)J1~<@JB>$=f8dbc-g;ZxhA2`<4D}|eKaz47ZbsdQFYK{r%V9H7tP1GNc(p)~^ooET-f|T%WZ9w> zBBLrkb&cS9OXXKKSsqmzYQYL$b@nb`HzAE!Y%af>TLv?Wb;}k;(hUkV7zsB=*PHR} z?cVI=XcS$w-YH6?sdwMFJ1B83_yZ}!9#yb!sca=O&U0zG_d9c<f-m3$XFj7pG6j-7*~<-C-ARhLaz(zT5RlDGa6J0HYlV6*Z`~!T?osUt#2BZ^%ew~jSo2dS$zddsshI{$S+J~M znWsn$dTkx)!OA{duP&3yYINmI%^2|AsI=e&hd`+SCj3Tz z!p|nu6YKnKaIz9^>Y}KoVbD#&@X*P-mRin)=|5MWE+EJ%sx2P9%dL>Bkq@iX^KEC{ zyRtPgR}}X0*~uU47K9n%O#UMvJVCvSdu7RNkZ9*dLhLut_kjK`6qj9r=Gv{RDikZ< z32$DHk)H@MbbbQ>o?u7W!a-b zEp|GU-XwF|1!T6WS4m70yxMsfeYf>E&iRc?|A%qweTYAsFGZ%O%kFExYM?;1Z8arK z-(%5>PKS)2W4V%@)Q6rhnHLlgIqCWLo~mN@cC#+M#gnbG)lqSB@7&AR)}z78g4w@< zg}A=czq^Jmeq%DQWZ5@$(skTrj8@-=DjgImg(0mq+K;miEf&^ zWR8Hwx^ei|@$eC8i1rSr@CLyOB4eQtif|m3>Aw6?bRb2gVQqChBJZn-EuBy}Q$fmW`PHv&u5NQh;blxb z{L@P8IsuQ^A9@*&a5}v1z_HGJiWYbX4rp<0v=l;BI&8^(>P?O(bL96S^Jks)Y&pz! zn^AVi+0h1Xm4PkfFIzPF&fvCrQZKtZKIyk!;hGxC(Dns=pi%U;eWIjFqxA8R&0pGuE*l-PAAo#`o z=vi8-a_Wf7NaHiOI;)?YxADOUoK@LZU2!JJalM$fuPEqh>xFDI(Z$ly>XCa-)y=O{ zB1skrrD!|6uiN_(sDr6PZb6r+wqQbWGzcH2sC(8H=_T06N&&KXX9FrCDYR#{c5ul6DZC@Qw(hlYVWXND?nO0cw#4=91FzR0&2r+TxK zV3)#XqT1yDEC4n)(U>>&Dc$W?SC8LQRI7JHnsBU}4IyEyHTPVJBa4jpHuegyKfCxF zd#PwT5qh%9(}_Bh232{C-C$x zT_9@b?+Qqh--gGol`LdbHZvG_hjmy&f%?~>Z@*H2hs-GAY3LksA~}Rx7#$0Y7CYa4 ztyQn4?ayVWmCNFZajS3pHsr)`x)zgumj^8B;)WA%oB~AHwvp=xW zV33FHBy<=bKCx2m8~$RtD5iO#9f~mhthrW@Cx6nue`8e+e5wuZkwvF}Cr@9RqQA|F zY0*{HwgXacis^LDV1ZH3%>W#DXH2tfxXO9T7y}2XvIjd_#!*cH%BOBpw{IkBp1Oq3DY&>jfk4&R-=q=QswmB zrQq@@p(W>#8by)6$9Io$&8GjJ#Wif>Ix!h|7*Ui&I{wNV7C6VlpV?Ra3a-e4-OyKq zlDfH8zWY&Jh_%23r*7?47K*D=R}w{s_*`W?t*H8gABqEi4RpvHmZ&iaZ*Ekc_(Hyn z@>2!eJDPngC{^hEIbYydcmHVZWuTxP+}F#H-Hb`(HFBX86ZYmbTSu%6H-!qR+`i4 zbUsQ2G&Ij$T;5HdzD8<}j1@K>hP4mj^9n-~2EJFihu;br0(%nH>+OwCW=^dVtzPgK z*9N1`Z=&MP=uP}T`P{_wKQ_D!bopx*D(93$cs+~;*E&SNNPSPyURT#WIDSe_gV&p@ zHnpv_t~7lTn+xPw+tEVxp~_#-8wN!R=|W=tB6t*8QQxHU)o0iyCNKQc+7yc6p!Fv7 zQ;ZX=Wb89xx-&9|R-M<1H+1Jv6e=XRVwY@iNso#mLn#muYvktJ@j-jEuFs2MaH`7w z8{Gzv+02~BdpbpmyZb5&X+pQ~qt>;XzR_(dyDM2h8m;g)6lUqE8yY6=p1N8=-OOCJ zLKR#cqwJ#4XP&eFBE}V54K1PRfZ3{wWz(zkHynU>VMKg)3PKb_@J`}jIM-R5m{~uw z(oNw+AR7upM@BEM&&({ow#=M))*7oS@!w1G{>2ymulQ=wwtx*AzAEA08+sCQtLmUw z+NHOf(D;|dCU1t^4X@^;{mR}?wQqG7G_-LSsY3pD&pejsF!-?8hLbdvi<*`ix{@Pc z&4{h$BPhG441)TQ9+AV1o}46(GRoy-fTy;UsSk;Cii}Y+>c(d-lqsKL$z^R|2~X!?f-LA6x|<=lB@dEAZ5*v%&9w{e97dc z?Pwb(PnlGH?P!zwmaER%CRt;~m_mLNY$VDxbuWI;8 zUsOk9?8iT22YejHG)mrMQ*Pt@Y+mAUD>JwWn^OBuv>%`o?}tjT$w&fH#h zEQeNz-Jpo+AGG-^27%LW4bOA3&4#V37FEjM4mtq^@6H?gURjZlGTe<}sC;IH6Y{JA z+o1LkeEC&9gRMIBp((;}cxkcI!N|GOkg~E8jHLK zMH|$Li+IT;Vnc6&c(EOiBD*8pHt);-7Ud|N0^&US@PAbaxn3?3zP4=(A*x8ONqG75- z=W9_5Gf?WAGVgKoR!NN5P~>&+@(M_?)4zxKD{Ljeq%KM`5gfLt{^6|-d>3+ zrS0>@Wn0yDLUD>9gi~Wx<>`#gL+SbUIN2Qq*DK2wHj@L;Pd_dQJeKhOQYYt$U~#iCT)e#Wsg$gYCaH1rBJ{+D`B#QA*_K{Tc?Y|{hkKw&0Yoio`r?j` z>6%%ztK@_KTD#%)f6QG=8LdSZNLQv*)g^hVhuxEZyLNlf=AvgldN8b6Nk^0^3QzJ)l#3@k))BxA0r0yV+7jbP{O*qT~1{IH3zudPeP0(0O zxBR{@axkYbCi@il()_Lp8LoW6dSrm{y5rgeQE8ckk4f;I@Pn-w=pWztAVfH zdUxC)Q$nbCWHYV0Cn|Q3+nuoeZ%a=<{GA`I;v6_@mMo&WU-?As+vye$Lhiy|@9_OE zt^5D7n_TI?LP!9Tg#8&B;FI$e)u$S(6un7V>U59(hOC7<$Ap%;D1(7P0bBChGv+)k zxpDyQv!VBO@5yOOiGDC--&96O!acCkvI9~#^H8sC@74ZqzZTC2RD|pzuIGWqXWH^t zFe#X+utzZoD{EQ#V?uS}-tIn{Y*^ea-;OaV+RJIZVxh5Z!BczKYgSt$A&|@*5Ta&3 zSJdi|7a9c-I0$5Q%{eDvaC>Z%#ov~_fAPN_%iFwt4;o^pRsOc+l(83MGa05R@p z(O3Ub6loaHG`J2W9YegQ+BUW`Qy;NHh;xjQHQV|;fZ4R5!HOaez|6hbeQ5F*^y~?Z zFwf;}iUN8gIUN&Ox4?u_H*}J<3~;MT z;MY(_Iaf6C(1Ln9`Wak`l|H{XT(AbnNm+8)89E!z+A5TVs=Rq{A_LHv&*z^Tim*2hA!%cq|k zTmZsyv-QN8{|9$DVfXoW+R0b|C(GEaUlH_1G;7KqDojUTUPiK_naI{n2gMrdW>)l1 zOw{a)C_Ma$Geuqnf6m|PQLJxKZx?|0AXNKp8cQAeiTO0rr{a%H{2GsH|7X7zZZR*_ zg!GZAuP&9bxRe3@tKgO4$xQXIl2`I;>npMDdJ5v|1qjOgBhy&X$9&sB`RVOiFf)Nc zQ7?$GA6YOgDU(EsCBnuP@IYHZxNt~EPn+jPXmI=~*$0EJ;txQm{-xnvE{VG82*-kQY&s&Us_<*I z4&|yAZn`_np>Ib{B~vop1RZxZ(?{dA8(bXQ1OU5+l6AEWjQrSsX_k^=pS1~v0UmglEUuO;nyrR%^ zcFO=5?R|{UVj>u6z-&|fY~^T|<#TBoSXBt0if9fHUN43JMBm3e6LK0R&N^8$_V9z= z^1_?E42QE^{s_n-rP6^Kk(x--$6UUw(C6gj`4VgLCO<~b?Zhm^LlDTKjs`omHN`(% zbk$`ErXP_DZxCqHEk!#gUqbAFsx)%G!OI3|zlE-IJcHh4Ob+URtYo61C}ORZD@(FKGes*!^8~3WDk|%sCMc9?3_&Rg2~kK;k@N3vd$#Ah-}lSk zzFywS`i00tsD>L6<@>hnu?Z22HxR1!>S?+DcCj`nvRmiol7< z1b31&ZuLk~phoen@!+rZghHD(+}-8>SoD7^kG@lqpTRi4u=epzq+Li@z0D5qJ?7+!hS;^ToaNUOQoxV5=3!thS33 z)8oJqA?!SK1Ek=TT~K(bsWUn+L|#>)LUzdU{bm+v6i}Tz@W&C==ME;!S#_%1uju>3H#!RelaMua{ z{l~}nbDjLz0W8{f+x%kJ@x2E$*32%LF@9-1_t|Bpi(U2xPanh=@tYCWcM!|5Hgcy_ z<&DGWgeZz2T7!s_rrtNZ6kpy6mof+Efa(9Mu9Zhq^|!t^W_&7*%gls1?=b@BJq%0M z?$L%3i!`vsH60Qta2NX0OL%UEn_NqXjYg`5nCWsm|Hq6tSkWPI&;hQ8unSK)CQT(>ykM zHO*E?)&DXmyUm36AE++>;J|z~jzgA-H8%V|4;QDO(7P#YF0>L0`@`R8Gv9`IT3m@oQ<%rmkyi2F;Dx*Lw|J0_Tf& zHQ0Qvd6iujwzw9aKIDJ;f_tJqOam8_eakEi?H}OXM@}JzHZ!*nIIx1QH5E?2WeE3Y z)3Ls6@azBMWy~Y)chQyWrr+@x1PMvu1Jk8y~Gl9CvR|GnItYApQ)T@=_#6( z1c)6K-&?eGc(r5REV>Bf!U?f@fc?RJjBB~9yr4IiY8&&Q#HrDV)Jf)M{W?h6OO80W zK5uZ22sz}QEBBdc6|S~+X=P95boh-#YCv(3@$cdhLlI08kp^^_V$mwoy<91fy$13x zw!?=&4<15jy_6ZRL9Zggs`jfY);BNzOORg3fAGhSdpS2;2_YCjubqO&tXVFhXMSHt zX0jMIo)7dL%CT@qhOTs_%aLthCH!BwpHZ1{!A)bRJvXMS+CNcpTkP$X= zi&-}-);mMmtP~;g2l}E$WK#uz8{pmql~Un99FmOvr0JM2@D!II2i$XClAa{TVvtq+ zv%fum?wJ?Ew<|84E66r&1}K42v4m}d6#f=+3K1L~(|J%Tl05J&;~J8)&d1vhyqz;* z+IJ$7POQ+j2mTjLI`YRFd7W?ms@68U1|Gwk?Z4ZS_K|gg86MgN^)Z0J2lp!bXN!v9$TZuuFr&Q{HFZ7`eWAWqPeR>KFL@v=vLzK# zg1Zi54!D zukQ1G=LA;c#R>J_u$d}-`prUXr zE><-?@$N}b7Lyy zPAzaKIiG+Z>OWGA0f*}OlfJNoPBx8?&! z)U)AoFMZD?Tkv*uP}e@pJ!MARdC*qT{Jv9ctt(uU3~cPvYZy7I!46DkdZ%M8mNM8& z9AR%6^X$x8z{+GrmGLiALaUu88ASQ1j!@~GV(xJ7i=PPW+9(f2r2t6_m~dHkJ(Dru z_n1%Y?MA^@&qktmi0eF(eTHO2rw~U=mZnu&6r7^;bA*)R?qd=5z1oeN9ZUcITswk7 zE&>JdiJ!d7!0otN>}@5OxpW0978M;ssq0rPirKIETC5^6LU8_?CE_?{(9-zoaOsmD zA4i_q_MF@R5BmY%t^_U!gIUf9LCtWE{FMHbz}Tqt@wIcvVVOV2M9=hFr_FZwVIHDv z>w5F++J1dr9_r&HH%l+2l9u2W9qRPCp3aFRcme^#vqv+-AH7>w8^`j zSNUA{R95`wcm12;XnVTuh(p4l$J*)#%?m?Pj&klX>2P*a<^0u-Xic)%pMU^6 z1-9S91a#ALNy-h*kbRA}uUUqQX4I{t1?&=v+=MCN@7L^%V>2VS;GmF-9dO>EyG5RBIG6NCOABgUBwgUsHF5i%n0o)7(Ej5Ko*$WC_9D@n$o3EIn zHw8($d|%F+OyW+&#V;o-kiJsD5F1|R9RX#q#`g?-Haf0;t%$@~(Vcc;H1&i`+tGY_ z;yZ~lBi`70qq@&;%*jS#V=$(Wogd%+2b1z}5;zFU-(GvP6i@-J4ryPD*cyla`gpu= z_dyLw9G&Pbj?Sli#rP3}es4`Ev_snHN!1&MFgqS9ogm+h9D4#uY#W=fA#h=Ar7pt;Pw+Gjwc~_-sDOwy!kl3vbrc}=ANX|&@Hq)0UGR3h( zM$p6*rG+JtncbT1HHEl6X)0ZJU6);ly{zQ;B3+=Kuh;C3ZnLJq!r2NwjKBzKzkP3- z3&U7NRpcXPs7h>7mS93JbkrREMx)sUfgF~!brU0P%4!6MG!<9-G-~nOin7~P+o?^e z;s|}){Dr3+njxKgCad$;|IYe5e{6CG`^+Cx4rob(&Te@@?c=rQNgJDOLT826(q4-o z=r-lBZ(2Z9{cPGhdif-t$r8;(668O&9(JAbm9}u)PWwhO&O#B9%_KYm+T{Uj3$`zm zVa&;DDkb&Ga8EDE-GmLs+*dX+r%$#`?VVnUdCeiR-TVamXzZS&@JFH z6Hq>{4z${!&TK0gxIFW5p2YP!+jBnq_LB!pnyoq@L#G&-3yqBb?fuNhme!*=L#N+Q zy(sB?-;X@@!tCLoF zq#kL(`D^+wTJLP+nlD;(-HSc8_gEWI`R!IvkccR}5nc1ut{6!BIL7dT6pLXfCh3F3{6keO5)Es_@mRo0I7EI)?i8lpcHDUc#Kgf>^eN z0c;2RoEc>jTX9JUOZ(BoNAoW+D^}CR-q$~khKZLGpio+8`BM%@QI5d5Z!eJP=C0y1 zp(bG+HeZ?3(1AGo%5vDO%|Ka)cUsSyreNEZ6$_dcrXKk1P4C!MM+t|&T*!jv#ryc7OHS_XhIlJHzQumH>>tP6 z9|i99OW-Gs>nFSb{fc$<)Y)##YdGc(DR{!SY3d$R5zkTVi*ZDao`E_cJvC8s%B~dh z{81*yhOv&(%b_|6hs&tRR~O^)hpm=V^7!N;i=!;R6`VJ}?KAzqwCqX<^Tk!^C#oeppJ85XLO>F@{Jm}>tawQD!rPRehn2&rsZ~ZQ0MnmKu)uR zwe15sFG?AuL)gqxy}8DmdjG=gc-py+2&q|h3woa5w%+6h2q?X=T}5zQ@UwFm51lq` zs~7+@<#7MD6N2d71;q(D_o!R+8G3hY)T?>FXB6;&R(}sDAB7ffkgMm3dZPH*3mXkz)>V5M*BkEwA;Pdw10O&s(c8>n^P18qcRf^C4#O2LQ zzk^6csRxkPJO$i5le8Ccfft>`cfPsKYWnq=8}2c>bjdYk7C~N-Bnd%(eh<{>m0&Ku zby;k{Wk7yE)OHELzO5|yn>qCCg!d8p+Nrlpjz{{hTvj=8qfKF`HY59c@vS6NP?AZR zPv($uDBHmSI+U}3=fPaj^pAD#AM0ML$6fZpQT4SPJD)eac z7n4t3ba;YCl3Ti62-a2~b-K;qQP?%UDB9X}qkMx{43LuB+M+yKp272?95i=15jh^*`;DfKpPz2d1`wx zP3>e8vzC=fj}Hr>i!pso$-ba$oT;-+D*@O)ubO&Ey?ac|23oNllQY+RL?D+*N~a#{ z9`A&_^dS#PcMT&^A7r{WVbDZP@_ob$(0Z08i5>IhA5;B5d%&Ny>iVjwnX>n`0 zHUzS5D5SbjsN-HtdtVc*w<9(gZ= z0u$br>Jo!6L<&5GyPQpleD>ixq^T5o6oz#{{BjW*n7IG>T@RTa{xprFP?ZDP+m1`! z|BbMG-z>}bO*=Tck=0B-nI>rbdWf{)Y_~yF^Ob$*X4AnU5*$-<+7}v=mLlJvF1)5k z9lTM$j#fQ1wT=-pmYCI{@f7D0g+Uo_@@TS=Yd9fHp`1C;0K!n((g zzg)pu43MNB(wV+5R@(|K)#^^?no|yOVF&TGdk2UwG(6GM*69^fEgjjs{WIspJDF22 zzjw2qsd`E%Srdh zIwqZ-jAfRb@TvO77$HZDLEi)pemA_i8UFd-T9!a+s1qM%u&AJe|Icp$gS$EA6 zqa!GIRC&BY*bCgi4W2p5bZ0lm(aY-HOV8C|>y)SBUQ@Zf-@$%IQsIF`AY}6lW>CVl z{?sVy7dqE|Xq@VZ@JL+kCVX$y{z!&gk=XFxyql7UMAK9v6pz=r7t3Cej+Nfn1uG&w z&dQhgQ2!h6G<7f1rGO>dL7{K_KXw(fh=!I%lyouczTfHt z?LXRq2N_kfM{-#Ji1@PLnxK*x-+X=}t+Q+0hUwQDQ={_Z2C;STthx#e-ez5n{lVU4 zm=hH7`3I43oXOuFaH-_}d&A2nxfNA#P|8e9dz%`?K9>}y3?>46=S)>K^SwTkZkFD$ zZp_NirH^Qfv6rZxj&8|5xPGewj}wkwZF;&Z+dmq%u+TySh^^kHmXw9}I4n+JmA3p8 zu50E9#{r*AE=iY!aj*r|N8xB zd&#LAf_t}}S^~&mB-gxQJx*Vpu>gBk=o8#aofqGw{C2*$ZWa7co0q+d{K4b8Rb3$% zFM+T??OdjCOoBl6E$f?`772rVfysJ{WFz0@`XlDrAP9wlPt}xk#zT##Bm=GB+Xi(< zmqjqN`4QZq1J|_WeWj`VuX;pjBFbAraw*d_3%g;AI*LNKp7!_pOVVyjv`Mz1m9W9E}AThrI9VVwKaN(B;%Bh~7!D?v=GkRIJo zENSuqy97kv+oYED^X&aYD3+|$EW>tWj{FPFr)HB1oZ*wVxTD|$>{+#DubAf{ztFGB zc&&8LASr#xcps<`uWNr%TB(27c)qFi?!+9iw*gGxgR`JnG}NmFk7T0JJ&2!Vr795i zqs|8Ve{TBU^Y-O0db3Q}Z^L2sBJS?fZ;r4JC^POjH9F|q<#;}BjLgj}RoaMM2;3f& zyaH7f8tH}@aRi@<2~Wog$`&`qj;~IFAn3cc0;Y+Lu}x1=z)1{x$8J`|x(#-M6_30flP!qIkVWIQaL1zTu)lb>}_VqYgUKUl@)Gxs3OT#G&(E6-~_MIG4u!ka@ z@xt;*>67`baglCVnaz0r@>{!*P09$&8pWOuljpG`cGTj^Bve6p#{yKFQmRE-Yf;7h=b1HJwcB5 z?af!lU6$U9*z$V%u}x@==XxnK%VZpEu0V{J)amn-2qr&PqxT5;#m^r-pT5VJ4c#zQ z?Q)JhJv;uXWxNN+%RhXy|G5YqurSxQq~DX_cfxh3+gu>m>uU#_RA!-X_8hk3M9M1` zPP#)Ud1uCi%8te?L1KIC+22uDc-gj8fX>=S36^KedZvr45GYTcue2yg{`_pa7gLFW zj|{ENpSlx$q^(N%^j}9Vb84Y^nk*wpsqsydgDS8EI}sz=^de{6_HiSnkCTMSmd>H0 zx=P~+@|y|#etLAx`SQQVVjt^|QW+SFf5Wcxn?trCw(1WtC3dDt;If4g=Jrnz=J=3v z{K2e&J)=wp9bnoyA;tq302Wz$o8?zq;(eKiNfxjb0_#GoC(zVylb3lm&Z^4Cph~sp zo@w>P z4}e!LJCIn5C8E;Ekl`S9|4~<28XV9vhQZQIe`x`*b|B7SE|)Ci&dJPJeg~{+1*NAV z{uEyPRayMuhdNI1CEh)JLwEIhc-ZkG@U2lx@mx~!dn%zUkWwc&0@RJMWC&PrX5yL? zY@yAIWjIhxcjXHexQ&an8os4B_L#p+Rn3bHGyZ_9L1%l`)lr+O zol8eQfY=HSK_)GOB4(yV@4sGBAhUxh>A`Q;i_3`R(ZbUO9A^wP0+Psiyk&DXL#;Xr zoD>NOI;J0S>Sl*sfjYIj6>>nS04ir|@tRm1G)gk}K~+b4t>1R#^=596oSf1-Bmxwz zL~fZaq}i8)tWikri4SwTw;Hc}mYt~5{3eODwoZ@|nCekkF0i!j|IbrlxFF%sBEX4M zN9bq1rzCrqQ0oQXr(o&*R~G`d$#I||6>3hf(N8)pUq^P7`MRqRtHO{BM){@tiET01NT7u}cI{x3>Lm!`9|)`;YFZ^I?~)OR zzUIC)Q8!bWcl+76hzqElX`+^x?VzGmrm6_?*_#{U_zYa1>=55RQIZNo+aP#r#`$Ew zGp4MxgFI_O7yF}er(CwxGdnx_r|s;EOe)x*SE-gvIMDo&IT&20uV&`QG_&(nf@sZY zGD07}JTzFc2FWS3GYo9>3^o3M@z$5%S3|AouajDwgZZ2B5b&z>O|e6BH~uRJa`5>C zHm}bafmA5xF!4k6m&H4SacWFhg&Q(=Q_GaQZRi6tdLu|R;kN|#rV9{s+jCQ9BEoi1 zYf{7tK)e=|Ts5@Ym$QQ&B+c{U>{6w@&GZD&T?xVpw!W|noDK9@Yo8Ib5xd0`zOaXb zPk^uXlc$$-dQ5l7!JH{Ql$04_Zfdh`Qzg}gQwoYKdGC_$E2ox~t{i#RbmGmgIt0B_ zk}3qM@7)G7+cIh=NT(2Nq*XCN_FaieO^bsB#`$c{s0#-ayU9J;bCcp}Cyoo0kwI6X z(I?(#gGU438F>e1Q1HhrydET_PgwLVg*bw1$MK%BqSvbg+i8y6OhFC7-EW1qB6Prm|rGxCn$tUHC6 z%;YNhmXoe3$w7r@*O)p9TcgmWK)!U!<3};%HWBAOZeCw_%w^|aW!s|12O?{>Enc*b zF@*c_mT)ojT*$%s+}szaOs&6IJCh!%rcPb>sr$^COt#-PScW6us1_TU0LB_<4A(3n zGtM%GBHmgqUg>weH<)N0pv`&@nU)n0<)vH2X4RB5d3cvunqB(*709zI9za73mUqB+ zSt&B|Dfrd+Uv>U?zU!8ysWa#j9cMm?kLS$m3v>fJ^SO2^_e5UN$c4=Z_XS;XJEE*F#!5cvpxcFUaxNhRenK0{PLgi zF_@0XsJ6%o{7Tl5BOE}2sCIxH8QF&S=}L4B!&DA}LgCieebD>FnynDxvH>kgE_6se zIWVi;mCXjh$4c9A(e@F$64MOYn%DnO1vEF?0WUjL9by|685dL?wDyi!OfCIuRIGUW zNmtKO=K~4(pa5I&qbB8R?{u(D%zf-dXUvbE zOk$WQkh17nL2%pi=N&}0tl$&<0$l6xF_jdVR3s<((*V?lK zcb1A(fElJX#?&TSr-%Kn3Py3$NC&CYSDGg>5Hr8Q;j^I##gSF53^WElJEII{E{VlZ zw*z6&+Y$_dyVM-hk~8^TprOAR=pFHT#katwT}8?6oe%kP^7lpCM1DmjOFv@7BGF7& z+QFltXR`Yvkgnwk0-fRwbB<7GYbdHO@UwJ(E_qUS&O}5N0#4|L(&v=p@`S)Mi3)l62q5yW=5=*-bp7t0NDn^! zB*I9l6wfe8Yb3iq!e5qj;C?^YmMHL?l)WmsahmsPbk2|{@NH^$Kdbzj%-I;tkRMo5 z`M^nd{HcBSI_YG${ol*f?dO`PPoKW+sOQBsK+hQ*c$cVj6hBGwZ0b9BRv;VhzNof~ z+TT^IJUr7%v#@iQp-Yv%;t^lii?q&%yC9i+LUA#!uX%ySER8Di`Sh{)hPbV|%S@HX zn7KWmNni%J;d)0SNWE2;w?(aZE#|D1{{j!!93>+HqN`@-KG%6xKIOx>RHtR{v~AuA z!r%XXvX?t*(7@igR(_2irC4|&Q9Q7wH18-1s$%VDu6}Ol&#Q^F@@xr(`eDL=nqPWM zj0B3WN$t6ulJ7+#UQa^_Su7$vMI8kQpzXE(;jma&fEvE}hs^9ZVmp-PW zjKHnww7i{QQx(M7fh(+G&Yf&KX7`)Q;OUYWjD@?zSP05zH76~%a#yFSW(F0eSfZRT z5-62jTN;a*jV$#{n7-+&`O@L^R~G-}-`3mKYz1uhdryg#!s3k0TW%5Kf9e~L6bg~yI2d|ohPNt+XT8DGSqQBtK3@Y-f>PqA+LqRNX}pG zwZ8M)@2Od$zqK9vSgDlWl&K1M@ls`(dw*$)}CH z6Os9tdy@7Qdz}(r1P~GP%^*@y>SCDC!D2mm*CnA0=kiX{< zGm#WWdMcc5$C501rl($dgHY(9CL+HV)qGA;eyf)#wLsgflT<>^w78EMW0MBU z2s;s-_7MZ*!{PZ+*`~w7mncGxUBz?*Az4{_I;fHGVDI7RQE9CUn!vkYT4NYiM+>_T$aE^>eyu zc9|)p%MHh7(NDHW)j|%R6c`bhb$1ZtYBBIpVP69elp0P1lMxARC%K@@a)OOHN25XX zM!YufdsfiY*MZY_b@%{+FAx^@f_J>|ISOhPw>*$bbgNKmkKgPjy56plb+_US8suI{ z@A-J<@K*eCoed3;=|D_hqOvRSmsTF|8;)W!yvL$n$cSAy%ny2K+P@w4zN(udptg_h zWZouHgN?L7E=-e*ZSn#sGrs2(Miqiy&#RL>*AP+-4_5uXRQ~FZ>K-P?y@QJ%tW8zg zlk{e3DbE<*6FT)Oz!enTxB{-&V$x8Bd-xC1!21n^9?6mG{zd$s+XYql>%bDowXc(ZsAL z%I~!A#yL{AzjAO@{r+a7daY%{)Fbrr_XD@>bFb{m+VS~cgR)QD9vubDZoun;riN8DD81L;e(oMWad6ByHT@AoJd$0hVt1GxhT4WaS2+2kYh$l>a+A4GgBQiZ6+f?*rP?Hr~>DrN*&f7a{m@L z8NCC8;q2J!02G1S!DaP=LsGx1_D|`aas_i{8&|fH;A6)Lh|jTZ7hi0hw%nc_NZA>f zBXEMj5+8IVo{YD$rtx>OkS!>aDNDfi^Gyjx@361J`kc^EN*KP4xB0p=(fIU<*CyN1 zf2Ee9YCr){&k2nu;y8eo$+Mvh$FK0&UedgJFQQXWyR#kDxp?v+XYOrY)eS{qN4wymiFWM5(0FfIW zg+vsSqIs@j(TjiO%O8KdUJba7JUpF{*@taosIxO$!PM$-c|nj*1BBeN zL6mGsc8|#@sDPBh?z zi7Zchz)AH&MaD0I^`LMavL*{vdWmzRFVzY1ZHG1W7?73JSpMA6O1<{Uj~c_ACecH@ zzd`Wx+R>Y&_hidMo-o{gsbwI|58$_OG3-Sk+SKekqdCK)D=+~GT;sLSi7_}& z%KTO60^zrBk=TW+s64=jqG@w1Lv~qRhe=ibP{5fQ56wmvYP1^nv3o7p*8d*$^l;%W|vzh?3Qr~2dg?FbuUych2ckiwx3b6m&LNDR81tmzW-=7@jA)Yx?S z0WQ*FUs&Ck;bV6$>0}hq`MbKI{V7$-aB&i|%B~YMRe7$)Ik86Xj_SDt(W4;83qok= zy7`$N1wRxBe&JY?C5#Zq@NlU58JXB-+SAEkhoRw_3?u8`tOs-yB(=Bisc%`%h!&ZS z!;M8Z-DWkF2^P<}#<9O`9F$xPlBDoY<=lzELt5SWsxQcpO82#>*tjmCtL!x%KdB04 z|I+R$&#p%Ki*tx&q47C5HvD`|c|B6O(f3>~K>5<@dyDq_a+mYk3PBU6_c@q8{EeSq zD43iyWqh{if*bs6+S#J3`QDzC6hR0k-kv*`M@*WTf3#14uKE#up>@mj8DGwoj22Wr zVEuaF3-S#nHr;Dn%OpM^pH)T@7(p4!o~Vgr%gx3toJW@QI%daU;}1NUczZtGE~W~5 zWhW%GG4{S~+i3a~LQHQO5Gb_+i!rLsJ+2E-vyoJ7{RW zDEawa^7edctRRpPW6y0djOywk^Xu|@6#=-Tm{#S_;f{zOhS7jw)Efhm0dTGa3_K$? zAGJIVU8+&jmkh|hr`|@??xM3me$d410BHoNEX=A}AF1!4UNY#KmaKY~4+_FD_MCYO zq-vd+I4Rv2F*0^0;-6ltKWrDkpf0wVnzr#wwoCS!Hjw}|b2XlMlcXFG#Y2H;PnfRjSb@$H&=-%fo57k*h2FpvJY zgv@2otU2*YW!Vsr%4*71&Ps zO{U)s3d?Uz+K;2V5A{Q(1nr$w*EnB=U~Ts$`# zKW2tCqN`p9=Hp>q0n(zvvtU)LWV%PT8*$%EhJ7c=%6^{#NQSaNV!ub_M3)`~%gl*d zb(Q=vMo`Nw^(;WZxJV4*3mGS*LFU3p`jKf|*ml z-%Eb?T?DVd{P|hCw2%xm`!)e=fun+xnm&82S2v2j1xqLJy5;AqfFs>`+FtBLl-N4u zN{X!3(4sWQCf7fE?`zH+bA;d5r;;Hz%mTUs+pzks%Dl+2JcD}+OioGJy3<+KzLm2a z8Z%Y{M?WybU{iAl2>sD!FQ)VN%Duc)ja$c>tm%x>WNcAW zV~IJos*Q^pmyGJ1CHHd{+Mn?EN0(`hO&^_d0@ z+nH<@WL2)O0cgBLYYZt^8~>SmiLh6%@2ua+xcER;Mo;dkg)pht#CM^TlMi$o|C`A7 zXOPGazlgqhn3%}Cv4WKvy3W*kN%D#*v`bzVAOw~>cn*G5XD^OsR@sc&5<9G##*r6W zNtJHpPt4O@zy{C)fW>!3SLgxZ^J{nmY+RDx^y0%W8*VJ$oV<;IXl~sM>~M4;(h94F`=;4~POL++wkgqW49)rB{R8q6^$A>STOcS#~Ma@dh8* z#HlnVEUpbA&kh!_c^5>txF?`x3mAAEwn=FMH2g6c7)D-Kw9pU620X!As6H`iR@QAl z50ZlYVcK>~u=rl~O159cV5*l?+vB{bvjbA8PvZu40iK%R?KX`2vvUQUY+F3uRn)BL zz@bch$3)usu+c|wvi_`qbEI+IA6B~m9BY5F^{0Ob8)+*)B>`AiWopJm4#LWSejo(0 zOh#rg%rqP8-2+1UzEf8bOQWjv!2-b9&U1kE8eE=FM^>tL<$`um1hG9oIHNl0Cx;X) zS0IYVDYy%uyE^N3S*MBtP{=<_i@`aRE;pA=7nqO9AGW$$)E!~pwCkH|n*E~m@W%I= zckNF_A=or8wo+Bc0Ig)*ID94^uQ2_pG%(v%$LLK?is?tYbYH%{4GJC;CRg6FR;Nmn z^5xwO|U^AJ%8Jx@RvG|JY*n z2o4j=e)6eeeD^H_^V$EQj5_@Tx<|jwij(&X#p2cbb9bYNWq|-zuO>Thqb=dQQPx>y zTXaDP9no;WU{t|~9V7Xc8bpc_Mzqv#J7@f(B2BWNjlM(CYz_{~dobF#lc%eu(Vgs~ z8Zz&oB;inm`wd_8DS!!z5`%p0y!j5`4nvpO-TmC%n39w@V7}c?t`qqKS)xCP-aX# zpyg6b!hKS#hTclzDozJ*O-X;JY%Fr%&Y6}14Mb||k5UCR4RIX|bQA|}o9FrmK)o<^ zI}s~~9KmYGfW-2Y%UGPc1Dv4<8e5C!pwauo?wU=eY#==J3j3Hr|2Qx8?e8R%UYw5? zKk!9XMI3Us$8^lvS4(X0c?|!Y5C|rd#pX@jtiA!MSeE+h5g=O=1_9;)ZA54~CPudw zqaw-pXZSno9gwgtKP7I0VTu-K_i!{AjefXLHbhyUGFrrK!Wh*$Ohkoe*}r2rr>cgw z5aka?0@}Jz4rEUW22CjAgqUtCS(bfPcm*Uf9zbglQNgCO3yP#z}627pp_9sQtXpvSjd|y5+mQv{@1Vx@&$R zB2c^U9q#x}z{1W6lM9l`nl>ih#^qX>$_TAn5o#)R9|NMxN|coJl51)-b9!8H+c6Zs zlz1urM{>z`!>JhKjPV$MRl|sQ=64jDKs8<24Y5N!6wlo-EhM#d&_oa-?4UNI>J)|ysR;|Cd<858IUB}tMRk%z7gqL=i>JR+Se&7!=BmlGrv`1lDP{rx)V2`siDP+VKB{fq(U|ra0 zv!I$3mhVd)AVhmcXu98FFi;1HA4<lAUwQtU9sJOap{2-q2Z;tfvH3)ny%(7D2`+g74qS{N2j6-%$$> za|bXaX!a>16zOBkayc07{=HR}&Yc*&mgbS077i*ppL|t0*;>ZA^v|B=KkuOTL&7K| z5G#%x&jmk;3j7eU_^?e>+k7$^+^T(J>+Q4pfGzniEx_7@n@#tzo07MFR1th^%IY_v zs|cnp^>$A@kgJIA)uB72HN_${my_FPI@qvqLEL!h;k;!~DG$X0Af@=N_$pTj6Yt;b zjIF_vikwf5)#(oi6lM-4I2W?&`wgy;5PMQXmo;qtT4KZ<26_U)}eTrO!5%~r7iXdkY( zE_nj-DSfBjCBD=kctmh3pAWSHsdXI(B#RE7Xa|Lcx#7RmZn{GX&ARO@bKk<&VWbN$ zLp3+RXkUSRBsI`!NQrm*d!_st&av-y7<}zfAXG>Z zV5X&{E}E7^933;6Dgi4%B;a&7ZU-SO#%YJBexoug!%HxabFa(3&5F1O!)3xs{KvM(7ZH8K#;!CX4aV>X+cpJ%$FMwJsqC0>B_r_hh(-J_ z16C{4^6Sd}?q?@mt+yxWXr>a9ME2%(tSfXoZT~g zc2EsjwgbNX+-XDQJnvfn%>RQLfr5$K>e%W*|CNdqG^2MS#n}Gw`3xnKT z)7d;4+UG<$ys%jHtpWBf*62BRV;%XfcJm$)w z<>DD*#tx9DX926o|22^mm>np$U}@5$`AMJs<~fhFMwXUiW9=ofj$@wN5y=BCEAg+t z8#(z8di9S_e16<_TTHp&zP?}(6x1Asji|o#ZY@(r?Clk;KKR*(Qg^fV;P(SeA6ru+Ik(}>Dn!t+#d%m24q1AyoDS=Y{{ouZbf zEDfpm-s8IR`1gR?lJc$R_XTNWM^ezfGz=rnr{9~Y2I%A$W|h@efDtRfLyTr3zrlIl zZGPC;q8htrR(-3h|0XJDl`a;No;hH-m2R8-hLr+Y=gURr*!br$p7q<@gF+J*_KvGe zX@tYwB6&qkXsLR_21uyVB%Fu zNPmr9GVyam$6VZ%q0PREsuFH7v8j9=OnxjJ*RDgbzjpV=oVM?s3b+S#UCZv>$T1r` z!YgFkP?x8zpl_M{5T3{B1pNct`|}{&T3V#sEWXC9`$!E9>#x73Z&5B1b48MlXw;j< zA34iX;itskne#;N=1O!kI-)-SJ`fOBkIXei1J^ER)!I-U^jW)NUp>i989ajc5tB*n z^h!8ER(mmksKuV)c(Ay9+$c2`7jvk_HV9!k5dZe;!z}cMm)psP5mF$~zbwRLA_!v1 z4TYT(=+UNQ*Z<+n`?Nmp4Zv+DSG*P4N`TDDsYq`EgbcTo^OhzPY61Chf5hjj4?M6& zwFIy~XHK7ZiR(Uce}>7_un5*6R%`H?n*H9t@=i2Rlrup1fa1PaO+;?@^x&#W$_r5r z=d7z&!poV;7QcKfiTB;*c(Dd0X$6F^_peI()Q02Y?irojm_0q3R#LYV<04;5h<|qN z!DsV%onJpVsaZV#d$-luu^*4r1;(Dl4xD{<=VQ;^j)&`y+BbZjxj1v>wQC!?KeMxY zxEKt=Wv6EkCnuLW(i%=>DF+>xCS`J0k>8_pupF8=DdVuPKU0+&t^ zFoldJ)2Q@L>lyKFJO6WPAot4dWy+DGUM+>we6bka6L;`v{MVz8#Q8)YS{Ze7I^2uM zrPjMYR6>`qIFtAKGV)h^?7x-aLm!oOwrGKi3@R$O^)}tN48lMgvsoE!HqI66#QOO1 zNgboaXY|bRHnDG9ww=Ky~>i*x7CSrLmYQ&r3{ z%iUDaEATMqu*xVBoo`DnxC8kscVj(qa>JtIR74Kd2-R`09%nb_C$PtoJE#AwBjk&pd7!ps3 z!aQpcpiJC1h>BAl&52*(i9mp<>h<2l)CpP zQ*?t)%zVb5dy_ktKfP1dZDHpetDu52$!Zk%95oO_WKt;~jn_pdWrjru3+A-f&Bu^o zKEoY{mk&5b!ml;V@#1vNGFXPONX47#EeqBNr!z=_XKTw$(KX8R#KJl~TAW1m3B^6w zDLKk3la?H_&+>c;!IXw-1n8_XTiR)DMwyygR@Xm&vT|(GUrGAEJ^XZbsQyj7RBhv4 zt=vka)^z+7i3`mA2}McsqnDUf8^C~DxeUw*=Yd^ys+yDkue~q-OFG@+w`s~dEqbdd zvr=cK+c-gG=`<#8w{f(^QWF$cumvbnncN5$w3>9@4K-85i?}Z{*=b z28Va?aR3JPAknHhjpR$U>W2~-6#WBNA1i;^$%Tv{ zIrsP!`e**?&YSo8zU~`%1|%Y)j3ZyEP;GvSeH|5Y*wHx7PTH7VnP z2A4pjI|`dP$_{XAQ&#R&pvVJ`6u1q2-cMQ%O$&31ccYk*N#bbMV4l|T$gEjmLGIXQ zNQ@*#K>S!t@RDk{=U9TPQxqew$WuS|XT$OA0#M)Wn*k~67RLEWU2!|ur?rHh@~8H| zTv`b6XK5OuEN-F%pbg9XUnP>br5Cu@ijg186LQ`qII+XCc-LD>b3*pG>r^sdrt0B%fP*?z{MI5BLqdAfINTynls(y(l!<_C z-_>fCjoGQvBOL47RAw}y;+-tpSPbM&tgQQ1JC`>i?G(kP_MgnvkNL>8>`LB_`uGRt z6vCcb1FXD9x(ra$c!rNiaL6k24A;HtNG3SG#@&w?FP)aF6H{GfW0EZH$b{tdKgSx6 zlxrNIHlafHlW#Ue&z;L1+bZzD7L!=vc=o;}|8;LLvPW2#Dyxx)^$F58fEE@u8|?om zl`GzUCyVA@oAQ%%3?lK@)N<$n{CnE~$pEx%tfrVDNSYYv@GI|mEy;~jRs~=;^pXG# zUvoBKiYd(`ULeCgD1PCMB~i%n`d5hnwbi4Q_u@4=+cB_gW;(qwEX^)Y^*~V2>JwV4 z@O9KCI@7hJZIs)&!7|gj7xu}R()F*)1*lWCvsndEc-Vvf1BJ#(cXf;~cXKzcXp}ke zvaw)9_Tr{lX@MgpNb{6q5ir#~l{<1;v5$W)L6D=aIZ_^gy_)*a-U`uy;NK%V0y9%8 z``#se0);N|-hhL|W%?z@yGg2bT*FH~plF<+9Fx%JMU4geKYrPvb;m41`ilCV1 zFzf=#PE23U-{rQ?8FNfZ+&uCA&~*3CP`7d=8zKqS6mjT*hS;}b{3Msno^(H(q(bbW z=V*v6-j6&s(=XQsum9kYU4o3~-@~k7op3Hh5~EsEOVixXZk2f|BDgzf&IoMkmWeI$ z^*zCOLX}HRHz_`hwRNk*FG;1U-UrIGz)S?%h)r0<%NIY&Qxy?jj{h9AIhB2HBmsuQ zCj6o18_>u(vvi&{EbhvU2Lvp$St$m_PbsWkbO}V-#C+B0H-HX2651w6cI^?1i|+7G1wp_&4Z6g39Whe-sfyV(x+zNI z(Vr~TLTQTn?b%es7XnHvD{`$ulh%BRRhLm}MCoAm8C$Fac!XtbfbAH>i1n{}# z8j5OAasaZ*{(*a17n@6(yb9*;gu_y}X$*C5&*dA(Pv`U+YnaJWPmw&h4X+r#&Y3J8 zG0iy{mRmIp-hEZjJ?IsJb0@lR2UoX*wGKOzq&pe{GH} z<(QM*;RD@qP--|?kAziX$7O=o8t`j#G$;5-HQv$|VGSpf;pAocLb{WASWIT5;-^g$ z|B$6g`lsmHMEl<0#F$nWnc|furL8N1&2hotY2TO(22sUk`6ffvnAh zJxG#b6)qDLe_F4M;t#EP$5SZQr>4&JBvG!7O{@N>#|2`S=kY5v{m?7!0h%06rumM6 z0dp9SBZb?vBYNAhAbVN(7AO}{h z%mh-uT{BappccZ35zWS z=W3GYga|@KYN{={jD#dx|5@@O2G({PA-YAJWEwUgwMhfs4@UM*+_{TK%&L^Wlr+y{&JG&c{LAdfd9 ztir%pT7grGy_LUvbgskFxq1#7F`92yM|G>h7++j!lW<3Px(g|n_VdxPq}a zCm*1m5J_COm5~*HBnNK$co^MLB+Z2E9gB8-l~kBT=6!zNKXjMq#){`>-qTNF59x8z zOSoY>k!%}sX8)e=L}*1p^Wjz(1>;tRbsBaMOv7z#1vn%lw+YYfl+E-CPSysIv(jyL z>?w0GI@!J2!MfJjjFzMsQZcXtNx0QBG=f`dn{phmi{#Q(j`r`=v;0Cs=dx6<5NgXk zE^Fx-)N1`3O>$hJ3%%pUjc-MV3I_@@-HLYRj)`>H%l^~X`7=aRr)8$WezFcHuNVn! z5IIgvQfb}fA8JwLJZ_plSz%DWk@wtP@fL9q_rufQ!TdkmQYScgO}r)|uoHw7y}JM; zp1V5XGr={tksWTLUFPy!tu+4I0tDHon5eipVfCDRr5MCwv#M_$&T4nu+mSo-auUyQ zGkAxJ&n1Rvr$0OgbV%&CaF{z`lYULKFqYkNpYYFUx#PO)4Ms|zlk@DpB-4!}?-f

QW%J#TA}m+8vN?^_dv~bHOCw|XK8r^P7P50 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 literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index ce1b5ae..5f07a30 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,18 +2,45 @@ site_name: Physiopy site_description: Physiopy site_author: The Physiopy developers site_url: https://physiopy.github.io +repo_url: https://github.com/physiopy/physiopy.github.io +repo_name: physiopy/physiopy.github.io # Copyright copyright: Copyright © 2020-2024, The Physiopy Community +# Set up theme with Material for Mkdocs +theme: + name: material + favicon: assets/images/favicon.png + logo: assets/images/logo.png + icon: + repo: fontawesome/brands/github + features: + - navigation.tabs + - navigation.indexes + - navigation.sections + palette: + # Palette toggle for light mode + - scheme: default + toggle: + icon: material/brightness-7 + name: Switch to dark mode + + # Palette toggle for dark mode + - scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to light mode + +# Content of the website nav: - Home: index.md - Libraries: - - Libraries: libraries.md - phys2bids: libraries/phys2bids.md - phys2denoise: libraries/phys2denoise.md - peakdet: libraries/peakdet.md - - Community Practices: https://physiopy-community-guidelines.readthedocs.io/en/latest/index.html + - Community Practices: + - Community Practices: https://physiopy-community-guidelines.readthedocs.io/en/latest/index.html - Community: - Welcome: community/index.md - Getting Started: community/gettingstarted.md @@ -22,7 +49,8 @@ nav: - Other Tools: community/other_tools.md - Code of Conduct: community/CODE_OF_CONDUCT.md - Team: community/team.md - - OHBM 2023 Tutorials: ohbm23_tutorials.md + - Tutorials: + - OHBM 2023 Tutorials: ohbm23_tutorials.md From 6ea0b3d812f3c81b4a362725574ce52803ade364 Mon Sep 17 00:00:00 2001 From: m-miedema <39968233+m-miedema@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:02:35 -0400 Subject: [PATCH 2/9] Adding basic pages and navigation according to Contributor Guide outline. --- docs/contributors-guide/codebase/index.md | 4 ++++ docs/contributors-guide/codebase/labels.md | 4 ++++ .../codebase/opening-issues.md | 4 ++++ .../contributors-guide/codebase/opening-prs.md | 4 ++++ docs/contributors-guide/codebase/plug-ins.md | 4 ++++ .../codebase/reviewing-prs.md | 4 ++++ .../codebase/roles-permission.md | 4 ++++ .../contributors-guide/codebase/style-guide.md | 4 ++++ .../codebase/tests-code-cov.md | 4 ++++ .../documentation/building.md | 4 ++++ .../documentation/community-practices.md | 4 ++++ docs/contributors-guide/documentation/index.md | 4 ++++ docs/contributors-guide/getting-started.md | 4 ++++ docs/contributors-guide/index.md | 4 ++++ docs/contributors-guide/recognition.md | 4 ++++ mkdocs.yml | 18 ++++++++++++++++++ 16 files changed, 78 insertions(+) create mode 100644 docs/contributors-guide/codebase/index.md create mode 100644 docs/contributors-guide/codebase/labels.md create mode 100644 docs/contributors-guide/codebase/opening-issues.md create mode 100644 docs/contributors-guide/codebase/opening-prs.md create mode 100644 docs/contributors-guide/codebase/plug-ins.md create mode 100644 docs/contributors-guide/codebase/reviewing-prs.md create mode 100644 docs/contributors-guide/codebase/roles-permission.md create mode 100644 docs/contributors-guide/codebase/style-guide.md create mode 100644 docs/contributors-guide/codebase/tests-code-cov.md create mode 100644 docs/contributors-guide/documentation/building.md create mode 100644 docs/contributors-guide/documentation/community-practices.md create mode 100644 docs/contributors-guide/documentation/index.md create mode 100644 docs/contributors-guide/getting-started.md create mode 100644 docs/contributors-guide/index.md create mode 100644 docs/contributors-guide/recognition.md diff --git a/docs/contributors-guide/codebase/index.md b/docs/contributors-guide/codebase/index.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/index.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/labels.md b/docs/contributors-guide/codebase/labels.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/labels.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/opening-issues.md b/docs/contributors-guide/codebase/opening-issues.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/opening-issues.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/opening-prs.md b/docs/contributors-guide/codebase/opening-prs.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/opening-prs.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/plug-ins.md b/docs/contributors-guide/codebase/plug-ins.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/plug-ins.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/reviewing-prs.md b/docs/contributors-guide/codebase/reviewing-prs.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/reviewing-prs.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/roles-permission.md b/docs/contributors-guide/codebase/roles-permission.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/roles-permission.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/style-guide.md b/docs/contributors-guide/codebase/style-guide.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/style-guide.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/codebase/tests-code-cov.md b/docs/contributors-guide/codebase/tests-code-cov.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/codebase/tests-code-cov.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/documentation/building.md b/docs/contributors-guide/documentation/building.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/documentation/building.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/documentation/community-practices.md b/docs/contributors-guide/documentation/community-practices.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/documentation/community-practices.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/documentation/index.md b/docs/contributors-guide/documentation/index.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/documentation/index.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/getting-started.md b/docs/contributors-guide/getting-started.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/getting-started.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/index.md b/docs/contributors-guide/index.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/index.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/docs/contributors-guide/recognition.md b/docs/contributors-guide/recognition.md new file mode 100644 index 0000000..3d36cc8 --- /dev/null +++ b/docs/contributors-guide/recognition.md @@ -0,0 +1,4 @@ +## Under development +We're still building this section of the guide, so stay tuned (or help!) + + diff --git a/mkdocs.yml b/mkdocs.yml index 5f07a30..0bff1ee 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -39,6 +39,24 @@ nav: - phys2bids: libraries/phys2bids.md - phys2denoise: libraries/phys2denoise.md - peakdet: libraries/peakdet.md + - Contributors Guide: + - Welcome: contributors-guide/index.md + - Recognizing contributions: contributors-guide/recognition.md + - Getting started: contributors-guide/getting-started.md + - Contributing to the codebase: + - Welcome: contributors-guide/codebase/index.md + - Opening issues: contributors-guide/codebase/opening-issues.md + - Opening PRs: contributors-guide/codebase/opening-prs.md + - Reviewing PRs: contributors-guide/codebase/reviewing-prs.md + - Testing and code coverage: contributors-guide/codebase/tests-code-cov.md + - Roles and permissions: contributors-guide/codebase/roles-permission.md + - Style guide: contributors-guide/codebase/style-guide.md + - Labels: contributors-guide/codebase/labels.md + - Plug-ins: contributors-guide/codebase/plug-ins.md + - Contributing to the documentation: + - Welcome: contributors-guide/documentation/index.md + - Building documentation: contributors-guide/documentation/building.md + - Adding to Community Practices: contributors-guide/documentation/community-practices.md - Community Practices: - Community Practices: https://physiopy-community-guidelines.readthedocs.io/en/latest/index.html - Community: From 5130722f587a4afe804964ad2e52c3c0555045db Mon Sep 17 00:00:00 2001 From: m-miedema <39968233+m-miedema@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:19:21 -0400 Subject: [PATCH 3/9] Re-wrote the welcome page to fix links, typos, and wording. --- docs/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index 233e346..00056bb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,13 +1,13 @@ # Home -Welcome to the main documentation site for the physiopy community and python package! Please also check out the package's [Github Page](https://github.com/physiopy). For questions, you can always contact the project manager at [physiopy.community@gmail.com](mailto:physiopy.community@gmail.com). +Welcome to the main documentation site for the physiopy community and python packages! Please also check out our [Github Page](https://github.com/physiopy). For questions, you can always contact the project manager at [physiopy.community@gmail.com](mailto:physiopy.community@gmail.com).

## Who are we? -We are the physiopy development team consisting of an international group of volunteers. You can learn more about us by visiting the [*Community*](/community/index) page. Contributions are also very much welcomed! Check out the [*Contributors*](/community/contributor-guide) tab. +We are the physiopy development team consisting of an international group of volunteers. You can learn more about us and how to connect with us by visiting the [*Community*](/community) page. Contributions are also very much welcomed! Check out the [*Contributor Guide*](/contributors-guide) tab. ## What is the importance of physiological data collection and its impact on MRI? -Physiological data provides the representation of the participant with respect to extension of bodily information (i.e., heart rates, respiratory rate, skin conductance etc.). Monitoring one's physiological activity helps us understand the percerption of cognition, emotion, motivation etc. Additionaly, physiological data is a key component in understanding physiological sources of signal variance in fMRI data. Collecting these data helps to provide more accurate models of fMRI time-series. It also provides a real-time method to monitor subjects during scanning. See the [*Best Practices* section](/best-practices) for recommendations from key personnel in the field on physiological data collection and analysis. +Physiological data provides a rich representation of a research subject with respect to their bodily information (i.e., heart rate, respiratory rate and depth of breathing, skin conductance, etc.). Examining physiological activity helps us to understand the perception and embodied experience of cognition, emotion, motivation, and more. Additionaly, physiological data is a key component in understanding physiological sources of signal variance in fMRI data. Collecting these data helps to provide more accurate models of fMRI time-series. It also provides a real-time method to monitor subjects during scanning. See the [*Community Practices* documentation](/community-practices) for recommendations from key personnel in the field on physiological data collection and analysis. From 3e0ed87c8e256346b872c649a85898262384d963 Mon Sep 17 00:00:00 2001 From: "Marie-Eve Picard (she/her)" <77584086+me-pic@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:31:13 -0400 Subject: [PATCH 4/9] FIX broken link --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 00056bb..429fcaa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -10,4 +10,4 @@ We are the physiopy development team consisting of an international group of vol ## What is the importance of physiological data collection and its impact on MRI? -Physiological data provides a rich representation of a research subject with respect to their bodily information (i.e., heart rate, respiratory rate and depth of breathing, skin conductance, etc.). Examining physiological activity helps us to understand the perception and embodied experience of cognition, emotion, motivation, and more. Additionaly, physiological data is a key component in understanding physiological sources of signal variance in fMRI data. Collecting these data helps to provide more accurate models of fMRI time-series. It also provides a real-time method to monitor subjects during scanning. See the [*Community Practices* documentation](/community-practices) for recommendations from key personnel in the field on physiological data collection and analysis. +Physiological data provides a rich representation of a research subject with respect to their bodily information (i.e., heart rate, respiratory rate and depth of breathing, skin conductance, etc.). Examining physiological activity helps us to understand the perception and embodied experience of cognition, emotion, motivation, and more. Additionaly, physiological data is a key component in understanding physiological sources of signal variance in fMRI data. Collecting these data helps to provide more accurate models of fMRI time-series. It also provides a real-time method to monitor subjects during scanning. See the [*Community Practices* documentation](https://physiopy-community-guidelines.readthedocs.io/en/latest/index.html) for recommendations from key personnel in the field on physiological data collection and analysis. From 1d918cc31fb3812f533fb90a689bb147b4132329 Mon Sep 17 00:00:00 2001 From: "Marie-Eve Picard (she/her)" <77584086+me-pic@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:36:57 -0400 Subject: [PATCH 5/9] FIX broken link --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 429fcaa..30e1d74 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,7 +6,7 @@ Welcome to the main documentation site for the physiopy community and python pac

## Who are we? -We are the physiopy development team consisting of an international group of volunteers. You can learn more about us and how to connect with us by visiting the [*Community*](/community) page. Contributions are also very much welcomed! Check out the [*Contributor Guide*](/contributors-guide) tab. +We are the physiopy development team consisting of an international group of volunteers. You can learn more about us and how to connect with us by visiting the [*Community*](/community) page. Contributions are also very much welcomed! Check out the [*Contributor Guide*](community/contributor-guide/) tab. ## What is the importance of physiological data collection and its impact on MRI? From a3d0f20e249356c19f6721eabbed58a3bc6c2da0 Mon Sep 17 00:00:00 2001 From: m-miedema <39968233+m-miedema@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:52:46 -0400 Subject: [PATCH 6/9] Updated recognition page. --- docs/contributors-guide/recognition.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/contributors-guide/recognition.md b/docs/contributors-guide/recognition.md index 3d36cc8..d6875a7 100644 --- a/docs/contributors-guide/recognition.md +++ b/docs/contributors-guide/recognition.md @@ -1,4 +1,11 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +### How it works +We welcome and recognize [all +contributions](https://allcontributors.org/docs/en/specification) from +documentation to testing to event organizing to code development. For each repository on Github, you can see the current list of contributors in the README (kept up to date by the [all +contributors bot](https://allcontributors.org/docs/en/bot/overview)). The type of contribution is reflected by the corresponding [emoji key](https://allcontributors.org/docs/en/emoji-key). You can also check our [Team](/community/team) for a summary of the many contributions that have been made to Physiopy as a whole. To ensure your contributions are recognized, please use Github as described in the accompanying sections of the guide! +### Other pathways for recognition +Physiopy frequently submits posters, talks, and other projects to academic events. We typically extend authorship to all those involved in relevant development activity during the corresponding time frame. As well, we explicitly collect detailed authorship information and credentials from contributors to our [*Community Practices* documentation](https://physiopy-community-guidelines.readthedocs.io/en/latest/index.html). These kinds of recognition are usually coordinated over Slack and/or email, so be sure you are connected with us there and responsive to any relevant communications. +### What if you believe your contribution is not being recognized? +It might take us a little while to update contributions everywhere they should be, but we want to make sure nothing is overlooked! If you have questions or concerns, contact the project manager at [physiopy.community@gmail.com](mailto:physiopy.community@gmail.com). \ No newline at end of file From 30951e71d5199f45088d8730ebd1acbae9296508 Mon Sep 17 00:00:00 2001 From: m-miedema <39968233+m-miedema@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:22:22 -0400 Subject: [PATCH 7/9] Migrated getting started page and removed outdated text. Updated some links. --- docs/community/gettingstarted.md | 123 --------------------- docs/contributors-guide/getting-started.md | 120 +++++++++++++++++++- 2 files changed, 118 insertions(+), 125 deletions(-) delete mode 100644 docs/community/gettingstarted.md diff --git a/docs/community/gettingstarted.md b/docs/community/gettingstarted.md deleted file mode 100644 index 045a06f..0000000 --- a/docs/community/gettingstarted.md +++ /dev/null @@ -1,123 +0,0 @@ -# Getting Started! -========================== - -First of all: thank you! - -Contributions can be made in different ways, not only code! As we follow -the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification, any contribution will be recognised accordingly. - -Follow these steps to get started: - -1. Have a look at the [contributor guide](contributorfile.html) page as - well as the [code of conduct](conduct.html). -2. Make sure that you have a GitHub account. You can set up a [free - GitHub account](https://github.com/); here are some - [instructions](https://help.github.com/articles/signing-up-for-a-new-github-account). -3. If you intend to contribute code and/or use the `physiopy` packages - in any way, check that you have `git` and `pip` installed on your - system. Then install the package as a developer. This will let you - run the program with the latest modifications, without requiring to - re-install it every time. - -### Note -The following instructions are provided assuming that python 3 is -**not** your default version of python. If it is, you might need to use -`pip` instead of `pip3`, although some OSs do adopt `pip3` anyway. If -you want to check, type `python --version` in a terminal. - - -Linux, Mac, and Windows developer installation ----------------------------------------------- - -Be sure to have `git` and `pip` installed. Fork the phys2bids repository -in GitHub, then open a terminal and run the following code to clone the -forked repository and set it as your \`origin\`: - - git clone https://github.com/{username}/{physiopy-package}.git - # or in case you prefer to use ssh: - git clone git@github.com:{username}/{physiopy-package}.git - -We also recommend to set up the physiopy/{physiopy-package} repository as -*upstream*. In this way you can always keep your main branch -up to date with the command *git pull upstream master*: - - cd {physiopy-package} - git remote add upstream https://github.com/physiopy/{physiopy-package}.git - git pull upstream master - -### Basic installation - -If you use python frequently, or you are a python developer, chances are -that all the necessary dependencies are already installed in your -system. - -Go to a physiopy package directory (e.g. the `phys2bids` folder) and execute the command: - - pip3 install -e . - -### Full developer installation - -If it's your first experience as a python developer, or you just want -to be sure that you have everything you need to collaborate with us, you -can install `phys2bids` with all the other packages that we frequently -use during development in one step! - -Go to a physiopy package directory (e.g. the `phys2bids` folder) and execute the command: - - pip3 install -e .[all] - -This will install: - -> - `phys2bids` as an editable package, which means that you can -> modify the program and run it without having to reinstall it every -> time! -> - All `phys2bids` dependencies. -> - All **interface** modules, that deal with the interfaces for all -> the file formats. -> - All **style** modules, such as `flake8`, to help you linter the -> code! -> - All **documentation** modules, like `sphinx`, so that you can -> build the docs locally before submitting them. -> - All **test** modules, like `pytest`, in order for you to test your -> code locally before committing it! - -### Check your installation! - -Type the commands: - - cd phys2bids/tests - pytest - -This will execute the tests locally and check that your phys2bids -installation works properly. - - pytest - =================================== test session starts =================================== - platform win32 -- Python 3.8.6, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 - rootdir: C:\Users\sento\phys2bids, configfile: setup.cfg - plugins: cov-2.10.1 - collected 61 items - - test_acq.py . [ 1%] - test_bids.py ................ [ 27%] - test_integration.py ... [ 32%] - test_phys2bids.py ... [ 37%] - test_physio_obj.py ....... [ 49%] - test_txt.py .................. [ 78%] - test_utils.py ........... [ 96%] - test_viz.py .x [100%] - - ================================= short test summary info ================================= - XFAIL test_viz.py::test_plot_trigger - ======================== 60 passed, 1 xfailed in 142.58s (0:02:22) ======================== - -Do **not** worry if there is a xfail error in the log. This happens when -we know that a test will fail for known reasons, and we are probably -working to fix it (see -[here](https://docs.pytest.org/en/latest/skipping.html#xfail-mark-test-functions-as-expected-to-fail). -However, if you do encounter any other error, check that you have all -the extra dependencies installed and their version meets `phys2bids` -requirements. Contact us on -[gitter](https://gitter.im/physiopy/community) if you need help! diff --git a/docs/contributors-guide/getting-started.md b/docs/contributors-guide/getting-started.md index 3d36cc8..b346440 100644 --- a/docs/contributors-guide/getting-started.md +++ b/docs/contributors-guide/getting-started.md @@ -1,4 +1,120 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +# Getting Started! +First of all: thank you! +Contributions can be made in different ways, not only code! As we follow +the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification, any contribution will be recognised accordingly. + +Follow these steps to get started: + +1. Have a look at our [code of conduct](/community/CODE_OF_CONDUCT). +2. Make sure that you have a GitHub account. You can set up a [free + GitHub account](https://github.com/); here are some + [instructions](https://help.github.com/articles/signing-up-for-a-new-github-account). +3. If you intend to contribute code and/or use the `physiopy` packages + in any way, check that you have `git` and `pip` installed on your + system. Then install the package as a developer. This will let you + run the program with the latest modifications, without requiring to + re-install it every time. + +### Note +The following instructions are provided assuming that python 3 is +**not** your default version of python. If it is, you might need to use +`pip` instead of `pip3`, although some OSs do adopt `pip3` anyway. If +you want to check, type `python --version` in a terminal. + + +Linux, Mac, and Windows developer installation +---------------------------------------------- + +Be sure to have `git` and `pip` installed. Fork the phys2bids repository +in GitHub, then open a terminal and run the following code to clone the +forked repository and set it as your \`origin\`: + + git clone https://github.com/{username}/{physiopy-package}.git + # or in case you prefer to use ssh: + git clone git@github.com:{username}/{physiopy-package}.git + +We also recommend to set up the physiopy/{physiopy-package} repository as +*upstream*. In this way you can always keep your main branch +up to date with the command *git pull upstream master*: + + cd {physiopy-package} + git remote add upstream https://github.com/physiopy/{physiopy-package}.git + git pull upstream master + +### Basic installation + +If you use python frequently, or you are a python developer, chances are +that all the necessary dependencies are already installed in your +system. + +Go to a physiopy package directory (e.g. the `phys2bids` folder) and execute the command: + + pip3 install -e . + +### Full developer installation + +If it's your first experience as a python developer, or you just want +to be sure that you have everything you need to collaborate with us, you +can install `phys2bids` with all the other packages that we frequently +use during development in one step! + +Go to a physiopy package directory (e.g. the `phys2bids` folder) and execute the command: + + pip3 install -e .[all] + +This will install: + +> - `phys2bids` as an editable package, which means that you can +> modify the program and run it without having to reinstall it every +> time! +> - All `phys2bids` dependencies. +> - All **interface** modules, that deal with the interfaces for all +> the file formats. +> - All **style** modules, such as `flake8`, to help you linter the +> code! +> - All **documentation** modules, like `sphinx`, so that you can +> build the docs locally before submitting them. +> - All **test** modules, like `pytest`, in order for you to test your +> code locally before committing it! + +### Check your installation! + +Type the commands: + + cd phys2bids/tests + pytest + +This will execute the tests locally and check that your phys2bids +installation works properly. + + pytest + =================================== test session starts =================================== + platform win32 -- Python 3.8.6, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 + rootdir: C:\Users\sento\phys2bids, configfile: setup.cfg + plugins: cov-2.10.1 + collected 61 items + + test_acq.py . [ 1%] + test_bids.py ................ [ 27%] + test_integration.py ... [ 32%] + test_phys2bids.py ... [ 37%] + test_physio_obj.py ....... [ 49%] + test_txt.py .................. [ 78%] + test_utils.py ........... [ 96%] + test_viz.py .x [100%] + + ================================= short test summary info ================================= + XFAIL test_viz.py::test_plot_trigger + ======================== 60 passed, 1 xfailed in 142.58s (0:02:22) ======================== + +Do **not** worry if there is a xfail error in the log. This happens when +we know that a test will fail for known reasons, and we are probably +working to fix it (see +[here](https://docs.pytest.org/en/latest/skipping.html#xfail-mark-test-functions-as-expected-to-fail). +However, if you do encounter any other error, check that you have all +the extra dependencies installed and their version meets `phys2bids` +requirements. \ No newline at end of file From acb5affe04f55be9a7fc9f04156ee7ed6c9ab34a Mon Sep 17 00:00:00 2001 From: m-miedema <39968233+m-miedema@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:50:48 -0400 Subject: [PATCH 8/9] Migrated contributor-guide.md and added basic landing pages. --- docs/community/contributor-guide.md | 560 ----------------- docs/community/contributorfile.md | 572 ------------------ docs/contributors-guide/codebase/index.md | 18 +- docs/contributors-guide/codebase/labels.md | 115 +++- .../codebase/opening-issues.md | 22 +- .../codebase/opening-prs.md | 85 ++- .../codebase/reviewing-prs.md | 109 +++- .../codebase/style-guide.md | 22 +- .../codebase/tests-code-cov.md | 53 +- docs/contributors-guide/contribution-types.md | 74 +++ docs/contributors-guide/getting-started.md | 32 +- docs/contributors-guide/index.md | 4 +- mkdocs.yml | 3 +- 13 files changed, 509 insertions(+), 1160 deletions(-) delete mode 100644 docs/community/contributor-guide.md delete mode 100644 docs/community/contributorfile.md create mode 100644 docs/contributors-guide/contribution-types.md diff --git a/docs/community/contributor-guide.md b/docs/community/contributor-guide.md deleted file mode 100644 index f7eebdb..0000000 --- a/docs/community/contributor-guide.md +++ /dev/null @@ -1,560 +0,0 @@ -# How to contribute to `physiopy` - -Welcome to the `physiopy` organisation! It's great news that you're -thinking about contributing! - -Working with many people from many different places is great, but -sometimes this means that code can become messy due to the many -different ways a contribution can be made. For this reason, we have set -up some guidelines for contributions - to help you get involved ASAP! If -you lack knowledge in python development / github use / physiological -data handling, don't be scared! Try to jump in anyway. Most of the -original contributors learned these things exactly this way - jumping in -and hoping to fall in the right way without breaking too many bones. Do -you want to jump in but don't exactly know where/how? You can drop a few -lines in [gitter](https://gitter.im/phys2bids/community), so we can help -you find something that suits you! Already know what you're looking for -in this guide? Jump to the following sections: - -## Aims of physiopy - -`physiopy` is a **very** young project developed by a bunch of -researchers from the two different sides of the Atlantic Ocean (for -now). Our main goal is to help collect, analyse and share physiological -data, interfacing with (MRI) neuroimaging. We're trying to do so by: - -1. Writing packages to make a user-friendly pipeline to deal with - physiological data. -2. Writing packages that take into account the use of this - physiological data in combination with neuroimaging (MRI) analysis. -3. Providing documentation containing tips and strategies on how to - collect such data and use our packages. -4. Help set a standard for these data, albeit without forcing users to - use it. -5. Be an excuse for educational purposes on topics like Git/GitHub, - Python3, physiology and related tools/topics. - -## Joining the conversation - -We're trying to keep all conversation related to project development in -GitHub [issues](https://github.com/physiopy/phys2bids/issues). We -maintain a [gitter chat room](https://gitter.im/physiopy/community) for -more informal conversations and general project updates. We also have a -dev call once a month - specifically the second Thursday of the month! -If you want to participate, drop a line in gitter! When interacting in -the common channels, please adhere to our [code of -conduct](conduct.html). - -## Contributions - -### Contributing with small documentation changes - -If you are new to GitHub and just have a small documentation change -recommendation (such as: typos detection, small improvements in the -content, ...), please open an issue in the relative project, and label -it with the "Documentation" label. Chances are those types of changes -are easily doable with GitHub's online editor, which means you can do -them, or ask for help from the developers! - -### Contributing with user testing - -Another, non-coding friendly way to contribute to `physiopy` is by -testing the packages. There are different kinds of tests, but to -simplify things you can think mainly about automatic tests and user -tests. To know more about **Automatic tests**, you can read the [testing -section](#automatic-testing). **User testing** are warm, human, emotional and -opinionated tests that not only check that the code is doing what it -needs to do, but also whether there's a better way to do it - namely -better reports, clearer screen outputs, warnings and exceptions, -unexpected bugs that have to be corrected. If you want to perform one, -open an issue on GitHub or drop a comment in Gitter, refer to this -[blueprint](https://docs.google.com/document/d/1b6wc7JVDs3vi-2IqGg_Ed_oWKbZ6siboAJHf55nodKo/edit?usp=sharing) -and don't be afraid to ask questions! - -### Contributing with test files - -At `physiopy` we always try to imagine and support every possible -setting out there. However, our imagination has a limit - but if you -think our packages should process a specific format/setting that you -have, we're more than glad to do so! To make it happen, we need an -example of the file we want to process, so you will have to share it -with us (and the rest of the world)! The contribution can be a full file -of data that you already acquired, a part of that file (pay attention to -what is the minimum you need to share!), or mock data. The file -contribution should come with a json file of the same name that contains -the necessary information to run `phys2bids` on that file contribution. -There is a [json blueprint in -OSF](https://mfr.de-1.osf.io/render?url=https://osf.io/jrnxv/?direct%26mode=render%26action=download%26mode=render), -you can download it and adapt it. Note that the frequency list **has to -be expressed in Hz** as an integer or float. To contribute with a test -file, open an Issue in GitHub and label it with *Test*. We'll help you -add the file in our [OSF](https://osf.io/3txqr/) space. We're extremely -grateful for this type of contribution - so grateful that we asked -allcontributors to add a dedicated category! - -### Contributing documentation through GitHub - -We use [readthedocs](https://readthedocs.org/) to create our -documentation. Every contribution is welcome and it follows the same -steps as a code contribution, explained below. - -### Contributing code through GitHub - -This section covers 90% of the contributions a project like `physiopy` -receives - code, documentation and tests. The best way to make this kind -of contribution, in a nutshell, is to: 1. Open an issue with the -intended modifications. 2. Label it, discuss it, (self-)assign it. 3. -Open a Pull Request (PR) to resolve the issue and label it. 4. Wait for -a review, discuss it or comply, repeat until ready. Issues and PR chats -are great to maintain track of the conversation on the contribution. -They are based upon GitHub-flavoured -[Markdown](https://daringfireball.net/projects/markdown). GitHub has a -helpful page on [getting started with writing and formatting Markdown on -GitHub](https://help.github.com/articles/getting-started-with-writing-and-formatting-on-github). - -### Contributing with Pull Requests Reviews - -A big challenge of software development is merging code accurately -without having to wait too much time. For this reason, Reviewers for PRs -are more than welcome! It is a task that requires some experience, but -it's very necessary! Read the [related section below](#reviewing-prs) to -start! - -## Issues and Milestones - -At `physiopy`, we use Issues and Milestones to keep track of and -organise our workflow. **Issues** describe pieces of work that need to -be completed to move the project forwards. We try to keep them as simple -and clear as possible: an issue should describe a unitary, possibly -small piece of work (unless it's about refactoring). Don't be scared of -opening many issues at once, if it makes sense! Just check that what -you're proposing is not listed in a previous issue (open or closed) yet -(we don't like doubles). Issues get labelled. That helps the -contributors to know what they're about. Check the label list to know -what types are there, and use them accordingly! Issues can also be -**assigned**. If you want to work on an assigned issue, ask permission -first! - **Milestones** set the higher level workflow. They sketch -deadlines and important releases. Issues are assigned to these -milestones by the maintainers. If you feel that an issue should be -assigned to a specific milestone but the maintainers have not done so, -discuss it in the issue chat or in Gitter! We might have just missed it, -or we might not (yet) see how it aligns with the overall project -structure/milestone. - -## Labels - -The current list of labels are -[here](https://github.com/physiopy/phys2bids/labels). They can be used -for **Issues**, **PRs**, or both. We use -[auto](https://github.com/intuit/auto) to automate our semantic -versioning and Pypi upload, so **it's extremely important to use the -right PR labels**! - -### Issue & PR labels - -- ![Documentation](https://img.shields.io/badge/-Documentation-1D70CF?style=flat-square) Improvements or additions to documentation. This - category includes (but is not limited to) docs pages, docstrings, - and code comments. - -- ![Duplicate](https://img.shields.io/badge/-Duplicate-CFD3D7?style=flat-square) Whatever this is, it exists already! Maybe it's a closed - Issue/PR, that should be reopened. - -- ![Enhancement](https://img.shields.io/badge/-Enhancement-A2EEEF?style=flat-square) New features added or requested. This normally goes with a `minormod` label for PRs. - -- ![Outreach](https://img.shields.io/badge/-Outreach-0E8A16?style=flat-square) As part of the scientific community, we care about outreach. Check the relevant section about it, but know that this - Issue/PR contains information or tasks about abstracts, talks, - demonstrations, papers. - -- ![Paused](https://img.shields.io/badge/-Paused-F7C38C?style=flat-square) Issue or PR should not be worked on until the resolution of other issues or PRs. - -- ![released](https://img.shields.io/badge/-released-ffffff?style=flat-square) This Issue or PR has been released. - -- ![Testing](https://img.shields.io/badge/-Testing-FFB5B4?style=flat-square) This is for testing features, writing tests or producing testing code. Both user testing and CI testing! - -- ![Urgent](https://img.shields.io/badge/-Urgent-FFF200?style=flat-square) If you don't know where to start, start here! This is probably related to a milestone due soon! - -### Issue-only labels - -- ![BrainHack](https://img.shields.io/badge/-BrainHack-000000?style=flat-square) This issue is suggested for BrainHack participants! - -- ![Bug](https://img.shields.io/badge/-Bug-D73A4A?style=flat-square) Something isn't working. It either breaks the code or has an - unexpected outcome. - -- ![Community](https://img.shields.io/badge/-Community-E2C7FC?style=flat-square) This issue contains information about the `physiopy` - community (e.g. the next developer call) - -- ![Discussion](https://img.shields.io/badge/-Discussion-1C778C?style=flat-square) Discussion of a concept or implementation. These Issues - are prone to be open ad infinitum. Jump in the conversation if you - want! - -- ![Good first issue](https://img.shields.io/badge/-Good%20first%20issue-4E2A84?style=flat-square) Good for newcomers. These issues calls for a - **fairly** easy enhancement, or for a change that helps/requires - getting to know the code better. They have educational value, and - for this reason, unless urgent, experts in the topic should refrain - from closing them - but help newcomers closing them. - -- ![Hacktoberfest](https://img.shields.io/badge/-Hacktoberfest-FF7518?style=flat-square) Dedicated to the hacktoberfest event, so that people - can help and feel good about it (and show it with a T-shirt!). - **Such commits will not be recognised in the all-contributor table, - unless otherwise specified**. - -- ![Help wanted](https://img.shields.io/badge/-Help%20wanted-57DB1A?style=flat-square) Extra attention is needed here! It's a good place to have a look! - -- ![Refactoring](https://img.shields.io/badge/-Refactoring-9494FF?style=flat-square) Improve nonfunctional attributes. Which means rewriting - the code or the documentation to improve performance or just because - there's a better way to express those lines. It might create a - `majormod` PR. - -- ![Question](https://img.shields.io/badge/-Question-D876E3?style=flat-square) Further information is requested, from users to - developers. Try to respond to this! - -- ![Wontfix](https://img.shields.io/badge/-Wontfix-ffffff?style=flat-square) This will not be worked on, until further notice. - -### PR-only labels - -#### Labels for semantic release and changelogs - -- ![BugFIX](https://img.shields.io/badge/-BugFIX-D73A4A?style=flat-square) These PRs close an issue labelled `Bug`. They also increase - the semantic versioning for fixes (+0.0.1). - - - ![dependencies](https://img.shields.io/badge/-dependencies-0366D6?style=flat-square) Pull requests that update a dependency file - -- ![Documentation](https://img.shields.io/badge/-Documentation-1D70CF?style=flat-square) See above. This PR won't trigger a release, but it will be reported in the changelog. - -- ![Majormod](https://img.shields.io/badge/-Majormod-05246D?style=flat-square) These PRs call for a new major release (+1.0.0). This - means that the PR is breaking backward compatibility. - -- ![Minormod](https://img.shields.io/badge/-Minormod-05246D?style=flat-square) This PR generally closes an `Enhancement` issue. It increments the minor version (0.+1.0) - -- ![Minormod-breaking](https://img.shields.io/badge/-Minormod–breaking-05246D?style=flat-square) This label should be used during development stages (<1.0.0) only. These PRs call for a new minor release during development (0.+1.0) that **will** break backward compatibility. - -- ![Internal](https://img.shields.io/badge/-Internal-ffffff?style=flat-square) This PR contains changes to the internal API. It won't - trigger a release, but it will be reported in the changelog. - -- ![Testing](https://img.shields.io/badge/-Testing-FFB5B4?style=flat-square) See above. This PR won't trigger a release, but it will be - reported in the changelog. - -- ![Skip release](https://img.shields.io/badge/-Skip%20release-ffffff?style=flat-square) This PR will **not** trigger a release. - -- ![Release](https://img.shields.io/badge/-Release-ffffff?style=flat-square) This PR will force the trigger of a release. - -#### Other labels - -- ![Invalid](https://img.shields.io/badge/-Invalid-960018?style=flat-square): These PRs don't seem right. They actually seem so not - right that they won't be further processed. This label invalidates a - Hacktoberfest contribution. If you think this is wrong, start a - discussion in the relevant issue (or open one if missing). Reviewers - are asked to give an explanation for the use of this label. - -### Good First Issues - -Good First Issues are issues that are either very simple, or that help -the contributor get to know the programs or the languages better. We use -it to help contributors with less experience to learn and familiarise -with Git, GitHub, Python3, and physiology. We invite more expert -contributors to avoid those issues, leave them to beginners and possibly -help them out in the resolution of the issue. However, if the issue is -left unassigned or unattended for long, and it's considered important or -urgent, anyone can tackle it. - -## Contribution workflow - -There are many descriptions of a good contribution workflow out there. -For instance, we suggest to have a look at [tedana's workflow](https://github.com/ME-ICA/tedana/blob/master/CONTRIBUTING.md#making-a-change). -At `physiopy`, we follow a very similar workflow. The only three -differences are: - -- If you see an open issue that you would like to work on, check if it - is assigned. If it is, ask the assignee if they need help or want to - be substituted before starting to work on it. -- We ask you to test the code locally before merging it, and then, if - possible, write some automatic tests for the code to be run in our - Continuous Integration! Check the testing section below to know - more. -- We suggest opening a draft PR as soon as you can - so it's easier - for us to help you! - -See our [complete documentation](CONTRIBUTING.md#contributing) on the matter - -## Pull Requests - -To improve understanding pull requests "at a glance" and use the power -of `auto`, we use the labels listed above. Multiple labels can be -assigned to a PR - in fact, all those that you think are relevant. We -strongly advise to keep the changes you're introducing with your PR -limited to your original goal. Adding to the scope of your PR little -style corrections or code refactoring here and there in the code that -you're already modifying is a great help, but when they become too much -(and they are not relevant to your PR) they risk complicating the nature -of the PR and the reviewing process. It is much better to open another -PR with the objective of doing such corrections! Moreover, if you're -tempted to assign more than one label that would trigger a release (e.g. -bug and minormod or bug and majormod, etc.), you might want to split your PR -instead. When opening a pull request, assign it at least one label. - -We encourage you to open a PR as soon as possible - even before you -finish working on them. This is useful especially to you - so that you -can receive comments and suggestions early on, rather than having to -process a lot of comments in the final review step! However, if it's an -incomplete PR, please open a **Draft PR**. That helps us process PRs by -knowing which one to have a look first - and how picky to be when doing -so. - -Reviewing PRs is a time consuming task and it can be stressful for both -the reviewer and the author. Avoiding wasting time and the need of -little fixes - such as fixing grammar mistakes and typos, styling code, -or adopting conventions - is a good start for a successful (and quick) -review. Before graduating a Draft PR to a PR ready for review, please -check that: - -- You did all you wanted to include in your PR. If at a later stage - you realize something is missing and it's not a minor thing, you - will need to open a new PR. -- If your contribution contains code or tests, you ran and passed all - of the tests locally with [pytest](#automatic-testing). -- If you're writing documentation, you built it locally with - sphinx and the format is what you intended. -- Your code is harmonious with the rest of the code - no repetitions - of any sort! - -Your code respects the [adopted Style](#style-guide), especially if: - -- Your code is lintered adequately and respects the [PEP8](https://www.python.org/dev/peps/pep-0008/) convention. -- Your docstrings follow the [numpydoc](https://numpydoc.readthedocs.io/en/latest/format.html) convention. -- There are no typos or grammatical mistakes and the text is fluid. - -- The code is sufficiently commented and the comments are clear. - -- Your PR title is clear enough to be meaningful when appended to the version changelog. - -- You have the correct labels. - -### Before merging - -To be merged, PRs have to: - -1. Pass all the CircleCI tests, and possibly all the codecov checks. -2. Have the necessary amount of approving reviews, even if you're a - long time contributor. - - Note : You can ask one (or more) contributor to do - that review, if you think they align more with the content of your - PR. You need **one** review for documentation, tests, and small - changes, and **two** reviews for bugs, refactoring and enhancements. -3. Have at least a release-related label (or a `Skip - release` label). -4. Have a short title that clearly explains in one sentence the aim of - the PR. -5. Contain at least a unit test for your contribution, if the PR - contains code (it would be better if it contains an integration or - function test and all the breaking tests necessary). If you're not - confident about writing tests, it is possible to refer to an issue - that asks for the test to be written, or another (Draft) PR that - contains the tests required. - -As we're trying to maintain at least 90% code coverage, you're strongly -encouraged to write all of the tests necessary to keep coverage above -that threshold. If coverage drops too low, you might be asked to add -more tests and/or your PR might be rejected. See the [Automatic testing](#automatic-testing) section. - -Don't merge your own pull request! That's a task for the main reviewer -of your PR or the project manager. Remember that the project manager -doesn't have to be a reviewer of your PR! - -## Reviewing PRs - -Reviewing PRs is an extremely important task in collaborative -development. In fact, it is probably the task that requires the most -time in the development, and it can be stressful for both the reviewer -and the author. Remember that, as a PR Reviewer, you are guaranteeing -that the changes work and integrate well with the rest of the -repository, hence **you are responsible for the quality of the -repository and its next version release**. If they don't integrate -well, later PR reviewers might have to ask for broader changes than -expected. - -There are many best practices to review code online, for -instance [this medium blog post](https://medium.com/an-idea/the-code-review-guide-9e793edcd683), but -here are some good rules of thumbs that we need to follow while -reviewing PRs: - -- Be **respectful** to the PR authors and be clear in what you are - asking/suggesting - remember that, like you, they are contributing - their spare time and doing their best job! - -- If there is a *Draft PR*, you can comment on its development in the - message board or making "Comment" reviews. Don't ask for changes, - and especially, **don't approve the PR** - -- If the PR graduated *from Draft to full PR*, check that it follows the - sections [Pull requests](#pull-requests) and [Style Guide](#style-guide) of these - guidelines. If not, invite the author to do so before starting a - review. -- **Don't limit your review to the parts that are changed**. Look at - the entire file, see if the changes fit well in it, and see if the - changes are properly addressed everywhere in the code - in the - documentation, in the tests, and in other functions. Sometimes the - differences reported don't show the full impact of the PR in the - repository! -- If your want to make Pull Requests an educational process, invite - the author of the PR to make changes before actually doing them - yourself. Request changes via comments or in the message board or by - checking out the PR locally, making changes and then submitting a PR - to the author's branch. -- If you decide to use the suggestion tool in reviews, or to start a - PR to the branch under review, please alert the Project Manager. - Bots might automatically assign you contribution types that will - have to be removed (remember, your contribution in this case is - "Reviewer"). Instead of starting a PR to the branch under review, - think about opening a new PR with those modifications (unless they - are needed to pass tests), and alert the Main Reviewer. In any case - **don't commit directly to the branch under review**! -- If you're reviewing documentation, build it locally with [`sphinx-build`](https://www.sphinx-doc.org/en/master/man/sphinx-build.html) command. -- If you're asking for changes, **don't approve the PR**. Approve it - only after everything was sufficiently addressed. Someone else might - merge the PR in taking your word for granted. -- If you are the main reviewer, and the last reviewer required to - approve the PR, merge the PR! - -Before approving and/or merging PRs, be sure that: - -- All the tests in CircleCI/Azure pass without errors. -- Prefereably, codecov checks pass as well. If they don't, discuss - what to do. -- The title describes the content of the PR clearly enough to be - meaningful on its own - remember that it will appear in the version - changelog! -- The PR has the appropriate labels to trigger the appropriate version - release and update the contributors table. - -### Main reviewer - -At `physiopy` we use the *Assignees* section of a PR to mark the -**main reviewer** for that PR. The main reviewer is the primary person -responsible **for the quality of the repository and its next version release**, - as well as **for the behaviour of the other reviewers**. - -***The main reviewer takes care of the reviewing process of the PR, in particular:*** - -- Invites the reviewers to finish their review in a relatively - short time. - -- Checks that all elements of this document were respected, - especially the part about [Pull Requests](#pull-requests). - -- Invites other Reviewers to respect this document, especially - the part about [reviews](#reviewing-prs), helps them in doing - so, and checks that they do. - -- If a Reviewer keeps not respecting this document, flags them - to the project manager. - -- Decides what to do in case of a coverage decrease (in - *codecov/patch*). - -***In case of missing tests or updates to user documentation:*** - -- Asks for more documentation or tests before approving the - PR, *or* - -- Checks that the appropriate issues have been opened to - address the lack of documentation or tests (1 issue per item), *or* - -- Double-checks that the title is clear and the labels are correct to - trigger an appropriate `auto` release - feel free to change them. - -- Main reviewer **Is the one that is going to merge the PR.** - -***After the PR has been merged and a new release has been triggered, checks that:*** - -- The documentation was updated correctly (if changed). -- The Pypi version of the repository coincides with the new release (if changed). -- New contributors or forms of contributions were correctly added in the README (if changed). - -## Style Guide - -Docstrings should follow -[numpydoc](https://numpydoc.readthedocs.io/en/latest/format.html) -convention. We encourage extensive documentation. The python code itself -should follow [PEP8](https://www.python.org/dev/peps/pep-0008/) -convention whenever possible: there are continuous integration tests -checking that! You can use linters to help you write your code following -style conventions. Linters are add-ons that you can run on the written -script file. We suggest the use of **flake8** for Python 3. Many editors -(Atom, VScode, Sublimetext, \...) support addons for online lintering, -which means you'll see warnings and errors while you write the code - -check out if your does! - -Since we adopt [auto](https://intuit.github.io/auto/home.html), the PR -title will be automatically reported as part of the changelog when -updating versions. Try to describe in one (short) sentence what your PR -is about - possibly using the imperative and starting with a capital -letter. For instance, a good PR title could be: -`Implement support for files` or -`Reorder dictionary entries`, rather than ` support` or -`reorders keys`. - -## Automatic Testing - -`physiopy` uses Continuous Integration (CI) to make life easier. In -particular, we use the [CircleCI](https://circleci.com/) platform to run -automatic testing! **Automatic tests** are cold, robotic, emotionless, -and opinionless tests that check that the program is doing what it is -expected to. They are written by the developers and run (by CircleCI) -every time they send a Pull Request to `physiopy` repositories. They -complement the warm, human, emotional and opinionated **user tests**, as -they tell us if a piece of code is failing. CircleCI uses -[pytest](https://docs.pytest.org/en/latest/) to run the tests. The great -thing about it is that you can run it in advance on your local version -of the code! We can measure the amount of code that is tested with -[codecov](https://docs.pytest.org/en/latest/), which is an indication of -how reliable our packages are! We try to maintain a 90% code coverage, -and for this reason, PR should contain tests! The four main type of -tests we use are: - -1. Unit tests : - - Unit tests check that a minimal piece of code is doing what it - should be doing. Normally this means calling a function with - some mock parameters and checking that the output is equal to - the expected output. For example, to test a function that adds - two given numbers together (1 and 3), we would call the function - with those parameters, and check that the output is 4. - -2. Breaking tests - - Breaking tests are what you expect - they check that the program - is breaking when it should. This means calling a function with - parameters that are expected **not** to work, and check that it - raises a proper error or warning. - -3. Integration tests - - Integration tests check that the code has an expected output, - being blind to its content. This means that if the program - should output a new file, the file exists - even if it's empty. - This type of tests are normally run on real data and call the - program itself. For instance, documentation PRs should check - that the documentation page is produced! - -4. Functional tests - - If integration tests and unit tests could have babies, those - would be functional tests. In practice, this kind of tests check - that an output is produced, and *also* that it contains what it - should contain. If a function should output a new file or an - object, this test passes only if the file exists *and* it is - like we expect it to be. They are run on real or mock data, and - call the program itself or a function. - -## Recognising contributors - -We welcome and recognize [all -contributions](https://allcontributors.org/docs/en/specification) from -documentation to testing to code development. You can see a list of -current contributors in the README (kept up to date by the [all -contributors bot](https://allcontributors.org/docs/en/bot/overview)). - -**Thank you!** - -*--- Based on contributing guidelines from the [STEMMRoleModels](https://github.com/KirstieJane/STEMMRoleModels) project.* diff --git a/docs/community/contributorfile.md b/docs/community/contributorfile.md deleted file mode 100644 index edbea37..0000000 --- a/docs/community/contributorfile.md +++ /dev/null @@ -1,572 +0,0 @@ -[How to contribute to `physiopy`](#contributorfile) -=============================== - -Welcome to the `physiopy` organisation! It's great news that you're -thinking about contributing! - -Working with many people from many different places is great, but -sometimes this means that code can become messy due to the many -different ways a contribution can be made. For this reason, we have set -up some guidelines for contributions - to help you get involved ASAP! If -you lack knowledge in python development / github use / physiological -data handling, don't be scared! Try to jump in anyway. Most of the -original contributors learned these things exactly this way - jumping in -and hoping to fall in the right way without breaking too many bones. Do -you want to jump in but don't exactly know where/how? You can drop a few -lines in [gitter](https://gitter.im/phys2bids/community), so we can help -you find something that suits you! Already know what you\'re looking for -in this guide? Jump to the following sections: - -- [Aims of physiopy](#aims) -- [Join the conversation](#joinconvo) -- [Contributions](#contributiontypes) - - [Contributing with small documentation changes](#smalldocs) - - [Contributing with User testing](#usertests) - - [Contributing with test files](#testfile) - - [Contributing documentation through GitHub](#documenting) - - [Contributing code through GitHub](#code) - - [Contributing with Pull Requests Review](#reviews) -- [Issues and Milestones](#issuesmilestones) -- [Labels](#labeltypes) - - [Issues & PRs labels](#issueprlabels) - - [Issues labels](#issuelabel) - - [PRs labels](#prlabel) - - [Good First Issues](#g1i) -- [Contribution workflow](#workflow) -- [Pull Requests](#pr) -- [Reviewing PRs](#reviewing) -- [Style Guide](#styling) -- [Automatic Testing](#testing) -- [Recognizing contributors](#recognising) - -[Aims of physiopy](#aims) -============================ - -`physiopy` is a **very** young project developed by a bunch of -researchers from the two different sides of the Atlantic Ocean (for -now). Our main goal is to help collect, analyse and share physiological -data, interfacing with (MRI) neuroimaging. We're trying to do so by: - -1. Writing packages to make a user-friendly pipeline to deal with - physiological data. -2. Writing packages that take into account the use of this - physiological data in combination with neuroimaging (MRI) analysis. -3. Providing documentation containing tips and strategies on how to - collect such data and use our packages. -4. Help set a standard for these data, albeit without forcing users to - use it. -5. Be an excuse for educational purposes on topics like Git/GitHub, - Python3, physiology and related tools/topics. - -[Joining the conversation](#joinconvo) --------------------------------------- - -We're trying to keep all conversation related to project development in -GitHub [issues](https://github.com/physiopy/phys2bids/issues). We -maintain a [gitter chat room](https://gitter.im/physiopy/community) for -more informal conversations and general project updates. We also have a -dev call once a month - specifically the second Thursday of the month! -If you want to participate, drop a line in gitter! When interacting in -the common channels, please adhere to our [code of -conduct](conduct.html). - -[Contributions](#contributiontypes) --------------------------------------- - -### [Contributing with small documentation changes](#smalldocs) - -If you are new to GitHub and just have a small documentation change -recommendation (such as: typos detection, small improvements in the -content, ...), please open an issue in the relative project, and label -it with the "Documentation" label. Chances are those types of changes -are easily doable with GitHub\'s online editor, which means you can do -them, or ask for help from the developers! - -### [Contributing with User testing](#usertests) - -Another, non-coding friendly way to contribute to `physiopy` is by -testing the packages. There are different kinds of tests, but to -simplify things you can think mainly about automatic tests and user -tests. To know more about **Automatic tests**, you can read the [testing -section](#testing). **User testing** are warm, human, emotional and -opinionated tests that not only check that the code is doing what it -needs to do, but also whether there's a better way to do it - namely -better reports, clearer screen outputs, warnings and exceptions, -unexpected bugs that have to be corrected. If you want to perform one, -open an issue on GitHub or drop a comment in Gitter, refer to this -[blueprint](https://docs.google.com/document/d/1b6wc7JVDs3vi-2IqGg_Ed_oWKbZ6siboAJHf55nodKo/edit?usp=sharing) -and don't be afraid to ask questions! - -### [Contributing with test files](#testfile) - -At `physiopy` we always try to imagine and support every possible -setting out there. However, our imagination has a limit - but if you -think our packages should process a specific format/setting that you -have, we're more than glad to do so! To make it happen, we need an -example of the file we want to process, so you will have to share it -with us (and the rest of the world)! The contribution can be a full file -of data that you already acquired, a part of that file (pay attention to -what is the minimum you need to share!), or mock data. The file -contribution should come with a json file of the same name that contains -the necessary information to run `phys2bids` on that file contribution. -There is a [json blueprint in -OSF](https://mfr.de-1.osf.io/render?url=https://osf.io/jrnxv/?direct%26mode=render%26action=download%26mode=render), -you can download it and adapt it. Note that the frequency list **has to -be expressed in Hz** as an integer or float. To contribute with a test -file, open an Issue in GitHub and label it with *Test*. We'll help you -add the file in our [OSF](https://osf.io/3txqr/) space. We're extremely -grateful for this type of contribution - so grateful that we asked -allcontributors to add a dedicated category! - -### [Contributing documentation through GitHub](#documenting) - -We use [readthedocs](https://readthedocs.org/) to create our -documentation. Every contribution is welcome and it follows the same -steps as a code contribution, explained below. - -### [Contributing code through GitHub](#code) - -This section covers 90% of the contributions a project like `physiopy` -receives - code, documentation and tests. The best way to make this kind -of contribution, in a nutshell, is to: 1. Open an issue with the -intended modifications. 2. Label it, discuss it, (self-)assign it. 3. -Open a Pull Request (PR) to resolve the issue and label it. 4. Wait for -a review, discuss it or comply, repeat until ready. Issues and PR chats -are great to maintain track of the conversation on the contribution. -They are based upon GitHub-flavoured -[Markdown](https://daringfireball.net/projects/markdown). GitHub has a -helpful page on [getting started with writing and formatting Markdown on -GitHub](https://help.github.com/articles/getting-started-with-writing-and-formatting-on-github). - -### [Contributing with Pull Requests Reviews](#reviews) - -A big challenge of software development is merging code accurately -without having to wait too much time. For this reason, Reviewers for PRs -are more than welcome! It is a task that requires some experience, but -it's very necessary! Read the [related section below](#reviewing) to -start! - -[Issues and Milestones](#issuesmilestones) ------------------------------------------- - -At `physiopy`, we use Issues and Milestones to keep track of and -organise our workflow. **Issues** describe pieces of work that need to -be completed to move the project forwards. We try to keep them as simple -and clear as possible: an issue should describe a unitary, possibly -small piece of work (unless it's about refactoring). Don't be scared of -opening many issues at once, if it makes sense! Just check that what -you're proposing is not listed in a previous issue (open or closed) yet -(we don't like doubles). Issues get labelled. That helps the -contributors to know what they're about. Check the label list to know -what types are there, and use them accordingly! Issues can also be -**assigned**. If you want to work on an assigned issue, ask permission -first! - **Milestones** set the higher level workflow. They sketch -deadlines and important releases. Issues are assigned to these -milestones by the maintainers. If you feel that an issue should be -assigned to a specific milestone but the maintainers have not done so, -discuss it in the issue chat or in Gitter! We might have just missed it, -or we might not (yet) see how it aligns with the overall project -structure/milestone. - -[Labels](#labeltypes) --------------------------------------- - -The current list of labels are -[here](https://github.com/physiopy/phys2bids/labels). They can be used -for **Issues**, **PRs**, or both. We use -[auto](https://github.com/intuit/auto) to automate our semantic -versioning and Pypi upload, so **it\'s extremely important to use the -right PR labels**! - -### [Issue & PR labels](#issueprlabels) - -- Documentation: Improvements or additions to documentation. This - category includes (but is not limited to) docs pages, docstrings, - and code comments. -- Duplicate: Whatever this is, it exists already! Maybe it's a closed - Issue/PR, that should be reopened. -- Enhancement: New features added or requested. This normally goes - with a `minormod` label for PRs. -- Outreach: As part of the scientific community, we care about - outreach. Check the relevant section about it, but know that this - Issue/PR contains information or tasks about abstracts, talks, - demonstrations, papers. -- Paused: Issue or PR should not be worked on until the resolution of - other issues or PRs. -- Testing: This is for testing features, writing tests or producing - testing code. Both user testing and CI testing! -- Urgent: If you don\'t know where to start, start here! This is - probably related to a milestone due soon! - -### [Issue-only labels](#issuelabel) - -- Bug: Something isn't working. It either breaks the code or has an - unexpected outcome. -- Community: This issue contains information about the `physiopy` - community (e.g. the next developer call) -- Discussion: Discussion of a concept or implementation. These Issues - are prone to be open ad infinitum. Jump in the conversation if you - want! -- Good first issue: Good for newcomers. These issues calls for a - **fairly** easy enhancement, or for a change that helps/requires - getting to know the code better. They have educational value, and - for this reason, unless urgent, experts in the topic should refrain - from closing them - but help newcomers closing them. -- Hacktoberfest: Dedicated to the hacktoberfest event, so that people - can help and feel good about it (and show it with a T-shirt!). - **Such commits will not be recognised in the all-contributor table, - unless otherwise specified**. -- Help wanted: Extra attention is needed here! It's a good place to - have a look! -- Refactoring: Improve nonfunctional attributes. Which means rewriting - the code or the documentation to improve performance or just because - there's a better way to express those lines. It might create a - `majormod` PR. -- Question: Further information is requested, from users to - developers. Try to respond to this! -- Wontfix: This will not be worked on, until further notice. - -### [PR-only labels](#prlabel) - -#### Labels for semantic release and changelogs - -- Majormod: These PRs call for a new major release (+1.0.0). This - means that the PR is breaking backward compatibility. -- Minormod: These PRs call for a new minor release (0.+1.0). This - means that the PR is **not** breaking backward compatibility. -- BugFIX: These PRs close an issue labelled `bug`. They also increase - the semantic versioning for fixes (+0.0.1). -- Internal: This PR contains changes to the internal API. It won\'t - trigger a release, but it will be reported in the changelog. -- Documentation: See above. This PR won\'t trigger a release, but it - will be reported in the changelog. -- Testing: See above. This PR won\'t trigger a release, but it will be - reported in the changelog. -- Skip release: This PR will **not** trigger a release. -- Release: This PR will force the trigger of a release. - -#### Other labels - -- Invalid: These PRs don't seem right. They actually seem so not - right that they won't be further processed. This label invalidates a - Hacktoberfest contribution. If you think this is wrong, start a - discussion in the relevant issue (or open one if missing). Reviewers - are asked to give an explanation for the use of this label. - -### [Good First Issues](#g1i) - -Good First Issues are issues that are either very simple, or that help -the contributor get to know the programs or the languages better. We use -it to help contributors with less experience to learn and familiarise -with Git, GitHub, Python3, and physiology. We invite more expert -contributors to avoid those issues, leave them to beginners and possibly -help them out in the resolution of the issue. However, if the issue is -left unassigned or unattended for long, and it's considered important or -urgent, anyone can tackle it. - -[Contribution workflow](#workflow) --------------------------------------- - -There are many descriptions of a good contribution workflow out there. -For instance, we suggest to have a look at [tedana's workflow](https://github.com/ME-ICA/tedana/blob/master/CONTRIBUTING.md#making-a-change). -At `physiopy`, we follow a very similar workflow. The only three -differences are: - -- If you see an open issue that you would like to work on, check if it - is assigned. If it is, ask the assignee if they need help or want to - be substituted before starting to work on it. -- We ask you to test the code locally before merging it, and then, if - possible, write some automatic tests for the code to be run in our - Continuous Integration! Check the testing section below to know - more. -- We suggest opening a draft PR as soon as you can - so it's easier - for us to help you! - -See our [complete documentation](CONTRIBUTING.md#contributing) on the matter - -[Pull Requests](#pr) --------------------------------------- - -To improve understanding pull requests \"at a glance\" and use the power -of `auto`, we use the labels listed above. Multiple labels can be -assigned to a PR - in fact, all those that you think are relevant. We -strongly advise to keep the changes you\'re introducing with your PR -limited to your original goal. Adding to the scope of your PR little -style corrections or code refactoring here and there in the code that -you\'re already modifying is a great help, but when they become too much -(and they are not relevant to your PR) they risk complicating the nature -of the PR and the reviewing process. It is much better to open another -PR with the objective of doing such corrections! Moreover, if you\'re -tempted to assign more than one label that would trigger a release (e.g. -bug and minormod or bug and majormod, etc.), you might want to split your PR -instead. When opening a pull request, assign it at least one label. - -We encourage you to open a PR as soon as possible - even before you -finish working on them. This is useful especially to you - so that you -can receive comments and suggestions early on, rather than having to -process a lot of comments in the final review step! However, if it's an -incomplete PR, please open a **Draft PR**. That helps us process PRs by -knowing which one to have a look first - and how picky to be when doing -so. - -Reviewing PRs is a time consuming task and it can be stressful for both -the reviewer and the author. Avoiding wasting time and the need of -little fixes - such as fixing grammar mistakes and typos, styling code, -or adopting conventions - is a good start for a successful (and quick) -review. Before graduating a Draft PR to a PR ready for review, please -check that: - -- You did all you wanted to include in your PR. If at a later stage - you realize something is missing and it's not a minor thing, you - will need to open a new PR. -- If your contribution contains code or tests, you ran and passed all - of the tests locally with [pytest](#testing). -- If you're writing documentation, you built it locally with - sphinx and the format is what you intended. -- Your code is harmonious with the rest of the code - no repetitions - of any sort! - -Your code respects the [adopted Style](#styling), especially if: - -- Your code is lintered adequately and respects the [PEP8](https://www.python.org/dev/peps/pep-0008/) convention. -- Your docstrings follow the [numpydoc](https://numpydoc.readthedocs.io/en/latest/format.html) convention. -- There are no typos or grammatical mistakes and the text is fluid. - -- The code is sufficiently commented and the comments are clear. - -- Your PR title is clear enough to be meaningful when appended to the version changelog. - -- You have the correct labels. - -#### To be merged, PRs have to: - -1. Pass all the CircleCI tests, and possibly all the codecov checks. -2. Have the necessary amount of approving reviews, even if you're a - long time contributor. - - Note : You can ask one (or more) contributor to do - that review, if you think they align more with the content of your - PR. You need **one** review for documentation, tests, and small - changes, and **two** reviews for bugs, refactoring and enhancements. -3. Have at least a release-related label (or a `Skip - release` label). -4. Have a short title that clearly explains in one sentence the aim of - the PR. -5. Contain at least a unit test for your contribution, if the PR - contains code (it would be better if it contains an integration or - function test and all the breaking tests necessary). If you're not - confident about writing tests, it is possible to refer to an issue - that asks for the test to be written, or another (Draft) PR that - contains the tests required. - -As we're trying to maintain at least 90% code coverage, you're strongly -encouraged to write all of the tests necessary to keep coverage above -that threshold. If coverage drops too low, you might be asked to add -more tests and/or your PR might be rejected. See the [Automatic testing](#testing) section. - -Don't merge your own pull request! That\'s a task for the main reviewer -of your PR or the project manager. Remember that the project manager -doesn't have to be a reviewer of your PR! - -[Reviewing PRs](#reviewing) -------------- - -Reviewing PRs is an extremely important task in collaborative -development. In fact, it is probably the task that requires the most -time in the development, and it can be stressful for both the reviewer -and the author. Remember that, as a PR Reviewer, you are guaranteeing -that the changes work and integrate well with the rest of the -repository, hence **you are responsible for the quality of the -repository and its next version release**. If they don\'t integrate -well, later PR reviewers might have to ask for broader changes than -expected. - -There are many best practices to review code online, for -instance [this medium blog post](https://medium.com/an-idea/the-code-review-guide-9e793edcd683), but -here are some good rules of thumbs that we need to follow while -reviewing PRs: - -- Be **respectful** to the PR authors and be clear in what you are - asking/suggesting - remember that, like you, they are contributing - their spare time and doing their best job! - -- If there is a *Draft PR*, you can comment on its development in the - message board or making "Comment" reviews. Don't ask for changes, - and especially, **don't approve the PR** - -- If the PR graduated *from Draft to full PR*, check that it follows the - sections [Pull requests](#pr) and [Style Guide](#styling) of these - guidelines. If not, invite the author to do so before starting a - review. -- **Don't limit your review to the parts that are changed**. Look at - the entire file, see if the changes fit well in it, and see if the - changes are properly addressed everywhere in the code - in the - documentation, in the tests, and in other functions. Sometimes the - differences reported don't show the full impact of the PR in the - repository! -- If your want to make Pull Requests an educational process, invite - the author of the PR to make changes before actually doing them - yourself. Request changes via comments or in the message board or by - checking out the PR locally, making changes and then submitting a PR - to the author's branch. -- If you decide to use the suggestion tool in reviews, or to start a - PR to the branch under review, please alert the Project Manager. - Bots might automatically assign you contribution types that will - have to be removed (remember, your contribution in this case is - "Reviewer"). Instead of starting a PR to the branch under review, - think about opening a new PR with those modifications (unless they - are needed to pass tests), and alert the Main Reviewer. In any case - **don't commit directly to the branch under review**! -- If you're reviewing documentation, build it locally with [`sphinx-build`](https://www.sphinx-doc.org/en/master/man/sphinx-build.html) command. -- If you're asking for changes, **don't approve the PR**. Approve it - only after everything was sufficiently addressed. Someone else might - merge the PR in taking your word for granted. -- If you are the main reviewer, and the last reviewer required to - approve the PR, merge the PR! - -Before approving and/or merging PRs, be sure that: - -- All the tests in CircleCI/Azure pass without errors. -- Prefereably, codecov checks pass as well. If they don\'t, discuss - what to do. -- The title describes the content of the PR clearly enough to be - meaningful on its own - remember that it will appear in the version - changelog! -- The PR has the appropriate labels to trigger the appropriate version - release and update the contributors table. - -### [Main reviewer](#mainreviewer) - -At `physiopy` we use the *Assignees* section of a PR to mark the -**main reviewer** for that PR. The main reviewer is the primary person -responsible **for the quality of the repository and its next version release**, - as well as **for the behaviour of the other reviewers**. - -***The main reviewer takes care of the reviewing process of the PR, in particular:*** - -- Invites the reviewers to finish their review in a relatively - short time. - -- Checks that all elements of this document were respected, - especially the part about [Pull Requests](#pr). - -- Invites other Reviewers to respect this document, especially - the part about [reviews](#reviewing), helps them in doing - so, and checks that they do. - -- If a Reviewer keeps not respecting this document, flags them - to the project manager. - -- Decides what to do in case of a coverage decrease (in - *codecov/patch*). - -***In case of missing tests or updates to user documentation:*** - -- Asks for more documentation or tests before approving the - PR, *or* - -- Checks that the appropriate issues have been opened to - address the lack of documentation or tests (1 issue per item), *or* - -- Double-checks that the title is clear and the labels are correct to - trigger an appropriate `auto` release - feel free to change them. - -- Main reviewer **Is the one that is going to merge the PR.** - - -***After the PR has been merged and a new release has been triggered, checks that:*** - -- The documentation was updated correctly (if changed). -- The Pypi version of the repository coincides with the new release (if changed). -- New contributors or forms of contributions were correctly added in the README (if changed). - -[Style Guide](#styling) -------------------------- - -Docstrings should follow -[numpydoc](https://numpydoc.readthedocs.io/en/latest/format.html) -convention. We encourage extensive documentation. The python code itself -should follow [PEP8](https://www.python.org/dev/peps/pep-0008/) -convention whenever possible: there are continuous integration tests -checking that! You can use linters to help you write your code following -style conventions. Linters are add-ons that you can run on the written -script file. We suggest the use of **flake8** for Python 3. Many editors -(Atom, VScode, Sublimetext, \...) support addons for online lintering, -which means you'll see warnings and errors while you write the code - -check out if your does! - -Since we adopt [auto](https://intuit.github.io/auto/home.html), the PR -title will be automatically reported as part of the changelog when -updating versions. Try to describe in one (short) sentence what your PR -is about - possibly using the imperative and starting with a capital -letter. For instance, a good PR title could be: -`Implement support for files` or -`Reorder dictionary entries`, rather than ` support` or -`reorders keys`. - -[Automatic Testing](#testing) ------------------ - -`physiopy` uses Continuous Integration (CI) to make life easier. In -particular, we use the [CircleCI](https://circleci.com/) platform to run -automatic testing! **Automatic tests** are cold, robotic, emotionless, -and opinionless tests that check that the program is doing what it is -expected to. They are written by the developers and run (by CircleCI) -every time they send a Pull Request to `physiopy` repositories. They -complement the warm, human, emotional and opinionated **user tests**, as -they tell us if a piece of code is failing. CircleCI uses -[pytest](https://docs.pytest.org/en/latest/) to run the tests. The great -thing about it is that you can run it in advance on your local version -of the code! We can measure the amount of code that is tested with -[codecov](https://docs.pytest.org/en/latest/), which is an indication of -how reliable our packages are! We try to maintain a 90% code coverage, -and for this reason, PR should contain tests! The four main type of -tests we use are: - -1. Unit tests : - - Unit tests check that a minimal piece of code is doing what it - should be doing. Normally this means calling a function with - some mock parameters and checking that the output is equal to - the expected output. For example, to test a function that adds - two given numbers together (1 and 3), we would call the function - with those parameters, and check that the output is 4. - -2. Breaking tests - - Breaking tests are what you expect - they check that the program - is breaking when it should. This means calling a function with - parameters that are expected **not** to work, and check that it - raises a proper error or warning. - -3. Integration tests - - Integration tests check that the code has an expected output, - being blind to its content. This means that if the program - should output a new file, the file exists - even if it's empty. - This type of tests are normally run on real data and call the - program itself. For instance, documentation PRs should check - that the documentation page is produced! - -4. Functional tests - - If integration tests and unit tests could have babies, those - would be functional tests. In practice, this kind of tests check - that an output is produced, and *also* that it contains what it - should contain. If a function should output a new file or an - object, this test passes only if the file exists *and* it is - like we expect it to be. They are run on real or mock data, and - call the program itself or a function. - -[Recognising contributors](#recognising) ------------------------- - -We welcome and recognize [all -contributions](https://allcontributors.org/docs/en/specification) from -documentation to testing to code development. You can see a list of -current contributors in the README (kept up to date by the [all -contributors bot](https://allcontributors.org/docs/en/bot/overview)). - -**Thank you!** - -*--- Based on contributing guidelines from the [STEMMRoleModels](https://github.com/KirstieJane/STEMMRoleModels) project.* diff --git a/docs/contributors-guide/codebase/index.md b/docs/contributors-guide/codebase/index.md index 3d36cc8..b15e957 100644 --- a/docs/contributors-guide/codebase/index.md +++ b/docs/contributors-guide/codebase/index.md @@ -1,4 +1,18 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +## Contribution workflow +There are many descriptions of a good contribution workflow out there. +For instance, we suggest to have a look at [tedana's workflow](https://github.com/ME-ICA/tedana/blob/master/CONTRIBUTING.md#making-a-change). +At `physiopy`, we follow a very similar workflow. The only three +differences are: +- If you see an open issue that you would like to work on, check if it + is assigned. If it is, ask the assignee if they need help or want to + be substituted before starting to work on it. +- We ask you to test the code locally before merging it, and then, if + possible, write some automatic tests for the code to be run in our + Continuous Integration! Check the testing section below to know + more. +- We suggest opening a draft PR as soon as you can - so it's easier + for us to help you! + +You can find more in-detail description of this process in the following sections of the guide. \ No newline at end of file diff --git a/docs/contributors-guide/codebase/labels.md b/docs/contributors-guide/codebase/labels.md index 3d36cc8..22af767 100644 --- a/docs/contributors-guide/codebase/labels.md +++ b/docs/contributors-guide/codebase/labels.md @@ -1,4 +1,115 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +## Labels +The current list of labels are +[here](https://github.com/physiopy/phys2bids/labels). They can be used +for **Issues**, **PRs**, or both. We use +[auto](https://github.com/intuit/auto) to automate our semantic +versioning and Pypi upload, so **it's extremely important to use the +right PR labels**! +### Issue & PR labels + +- ![Documentation](https://img.shields.io/badge/-Documentation-1D70CF?style=flat-square) Improvements or additions to documentation. This + category includes (but is not limited to) docs pages, docstrings, + and code comments. + +- ![Duplicate](https://img.shields.io/badge/-Duplicate-CFD3D7?style=flat-square) Whatever this is, it exists already! Maybe it's a closed + Issue/PR, that should be reopened. + +- ![Enhancement](https://img.shields.io/badge/-Enhancement-A2EEEF?style=flat-square) New features added or requested. This normally goes with a `minormod` label for PRs. + +- ![Outreach](https://img.shields.io/badge/-Outreach-0E8A16?style=flat-square) As part of the scientific community, we care about outreach. Check the relevant section about it, but know that this + Issue/PR contains information or tasks about abstracts, talks, + demonstrations, papers. + +- ![Paused](https://img.shields.io/badge/-Paused-F7C38C?style=flat-square) Issue or PR should not be worked on until the resolution of other issues or PRs. + +- ![released](https://img.shields.io/badge/-released-ffffff?style=flat-square) This Issue or PR has been released. + +- ![Testing](https://img.shields.io/badge/-Testing-FFB5B4?style=flat-square) This is for testing features, writing tests or producing testing code. Both user testing and CI testing! + +- ![Urgent](https://img.shields.io/badge/-Urgent-FFF200?style=flat-square) If you don't know where to start, start here! This is probably related to a milestone due soon! + +### Issue-only labels + +- ![BrainHack](https://img.shields.io/badge/-BrainHack-000000?style=flat-square) This issue is suggested for BrainHack participants! + +- ![Bug](https://img.shields.io/badge/-Bug-D73A4A?style=flat-square) Something isn't working. It either breaks the code or has an + unexpected outcome. + +- ![Community](https://img.shields.io/badge/-Community-E2C7FC?style=flat-square) This issue contains information about the `physiopy` + community (e.g. the next developer call) + +- ![Discussion](https://img.shields.io/badge/-Discussion-1C778C?style=flat-square) Discussion of a concept or implementation. These Issues + are prone to be open ad infinitum. Jump in the conversation if you + want! + +- ![Good first issue](https://img.shields.io/badge/-Good%20first%20issue-4E2A84?style=flat-square) Good for newcomers. These issues calls for a + **fairly** easy enhancement, or for a change that helps/requires + getting to know the code better. They have educational value, and + for this reason, unless urgent, experts in the topic should refrain + from closing them - but help newcomers closing them. + +- ![Hacktoberfest](https://img.shields.io/badge/-Hacktoberfest-FF7518?style=flat-square) Dedicated to the hacktoberfest event, so that people + can help and feel good about it (and show it with a T-shirt!). + **Such commits will not be recognised in the all-contributor table, + unless otherwise specified**. + +- ![Help wanted](https://img.shields.io/badge/-Help%20wanted-57DB1A?style=flat-square) Extra attention is needed here! It's a good place to have a look! + +- ![Refactoring](https://img.shields.io/badge/-Refactoring-9494FF?style=flat-square) Improve nonfunctional attributes. Which means rewriting + the code or the documentation to improve performance or just because + there's a better way to express those lines. It might create a + `majormod` PR. + +- ![Question](https://img.shields.io/badge/-Question-D876E3?style=flat-square) Further information is requested, from users to + developers. Try to respond to this! + +- ![Wontfix](https://img.shields.io/badge/-Wontfix-ffffff?style=flat-square) This will not be worked on, until further notice. + +### PR-only labels + +#### Labels for semantic release and changelogs + +- ![BugFIX](https://img.shields.io/badge/-BugFIX-D73A4A?style=flat-square) These PRs close an issue labelled `Bug`. They also increase + the semantic versioning for fixes (+0.0.1). + + - ![dependencies](https://img.shields.io/badge/-dependencies-0366D6?style=flat-square) Pull requests that update a dependency file + +- ![Documentation](https://img.shields.io/badge/-Documentation-1D70CF?style=flat-square) See above. This PR won't trigger a release, but it will be reported in the changelog. + +- ![Majormod](https://img.shields.io/badge/-Majormod-05246D?style=flat-square) These PRs call for a new major release (+1.0.0). This + means that the PR is breaking backward compatibility. + +- ![Minormod](https://img.shields.io/badge/-Minormod-05246D?style=flat-square) This PR generally closes an `Enhancement` issue. It increments the minor version (0.+1.0) + +- ![Minormod-breaking](https://img.shields.io/badge/-Minormod–breaking-05246D?style=flat-square) This label should be used during development stages (<1.0.0) only. These PRs call for a new minor release during development (0.+1.0) that **will** break backward compatibility. + +- ![Internal](https://img.shields.io/badge/-Internal-ffffff?style=flat-square) This PR contains changes to the internal API. It won't + trigger a release, but it will be reported in the changelog. + +- ![Testing](https://img.shields.io/badge/-Testing-FFB5B4?style=flat-square) See above. This PR won't trigger a release, but it will be + reported in the changelog. + +- ![Skip release](https://img.shields.io/badge/-Skip%20release-ffffff?style=flat-square) This PR will **not** trigger a release. + +- ![Release](https://img.shields.io/badge/-Release-ffffff?style=flat-square) This PR will force the trigger of a release. + +#### Other labels + +- ![Invalid](https://img.shields.io/badge/-Invalid-960018?style=flat-square): These PRs don't seem right. They actually seem so not + right that they won't be further processed. This label invalidates a + Hacktoberfest contribution. If you think this is wrong, start a + discussion in the relevant issue (or open one if missing). Reviewers + are asked to give an explanation for the use of this label. + +### Good First Issues + +Good First Issues are issues that are either very simple, or that help +the contributor get to know the programs or the languages better. We use +it to help contributors with less experience to learn and familiarise +with Git, GitHub, Python3, and physiology. We invite more expert +contributors to avoid those issues, leave them to beginners and possibly +help them out in the resolution of the issue. However, if the issue is +left unassigned or unattended for long, and it's considered important or +urgent, anyone can tackle it. \ No newline at end of file diff --git a/docs/contributors-guide/codebase/opening-issues.md b/docs/contributors-guide/codebase/opening-issues.md index 3d36cc8..0201ba9 100644 --- a/docs/contributors-guide/codebase/opening-issues.md +++ b/docs/contributors-guide/codebase/opening-issues.md @@ -1,4 +1,20 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) - +## Issues and Milestones +At `physiopy`, we use Issues and Milestones to keep track of and +organise our workflow. **Issues** describe pieces of work that need to +be completed to move the project forwards. We try to keep them as simple +and clear as possible: an issue should describe a unitary, possibly +small piece of work (unless it's about refactoring). Don't be scared of +opening many issues at once, if it makes sense! Just check that what +you're proposing is not listed in a previous issue (open or closed) yet +(we don't like doubles). Issues get labelled. That helps the +contributors to know what they're about. Check the label list to know +what types are there, and use them accordingly! Issues can also be +**assigned**. If you want to work on an assigned issue, ask permission +first! - **Milestones** set the higher level workflow. They sketch +deadlines and important releases. Issues are assigned to these +milestones by the maintainers. If you feel that an issue should be +assigned to a specific milestone but the maintainers have not done so, +discuss it in the issue chat or in Gitter! We might have just missed it, +or we might not (yet) see how it aligns with the overall project +structure/milestone. \ No newline at end of file diff --git a/docs/contributors-guide/codebase/opening-prs.md b/docs/contributors-guide/codebase/opening-prs.md index 3d36cc8..09e6e56 100644 --- a/docs/contributors-guide/codebase/opening-prs.md +++ b/docs/contributors-guide/codebase/opening-prs.md @@ -1,4 +1,85 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +## Pull Requests +To improve understanding pull requests "at a glance" and use the power +of `auto`, we use the labels listed above. Multiple labels can be +assigned to a PR - in fact, all those that you think are relevant. We +strongly advise to keep the changes you're introducing with your PR +limited to your original goal. Adding to the scope of your PR little +style corrections or code refactoring here and there in the code that +you're already modifying is a great help, but when they become too much +(and they are not relevant to your PR) they risk complicating the nature +of the PR and the reviewing process. It is much better to open another +PR with the objective of doing such corrections! Moreover, if you're +tempted to assign more than one label that would trigger a release (e.g. +bug and minormod or bug and majormod, etc.), you might want to split your PR +instead. When opening a pull request, assign it at least one label. +We encourage you to open a PR as soon as possible - even before you +finish working on them. This is useful especially to you - so that you +can receive comments and suggestions early on, rather than having to +process a lot of comments in the final review step! However, if it's an +incomplete PR, please open a **Draft PR**. That helps us process PRs by +knowing which one to have a look first - and how picky to be when doing +so. + +Reviewing PRs is a time consuming task and it can be stressful for both +the reviewer and the author. Avoiding wasting time and the need of +little fixes - such as fixing grammar mistakes and typos, styling code, +or adopting conventions - is a good start for a successful (and quick) +review. Before graduating a Draft PR to a PR ready for review, please +check that: + +- You did all you wanted to include in your PR. If at a later stage + you realize something is missing and it's not a minor thing, you + will need to open a new PR. +- If your contribution contains code or tests, you ran and passed all + of the tests locally with [pytest](#automatic-testing). +- If you're writing documentation, you built it locally with + sphinx and the format is what you intended. +- Your code is harmonious with the rest of the code - no repetitions + of any sort! + +Your code respects the [adopted Style](#style-guide), especially if: + +- Your code is lintered adequately and respects the [PEP8](https://www.python.org/dev/peps/pep-0008/) convention. +- Your docstrings follow the [numpydoc](https://numpydoc.readthedocs.io/en/latest/format.html) convention. +- There are no typos or grammatical mistakes and the text is fluid. + +- The code is sufficiently commented and the comments are clear. + +- Your PR title is clear enough to be meaningful when appended to the version changelog. + +- You have the correct labels. + + +### Before merging + +To be merged, PRs have to: + +1. Pass all the CircleCI tests, and possibly all the codecov checks. +2. Have the necessary amount of approving reviews, even if you're a + long time contributor. + + Note : You can ask one (or more) contributor to do + that review, if you think they align more with the content of your + PR. You need **one** review for documentation, tests, and small + changes, and **two** reviews for bugs, refactoring and enhancements. +3. Have at least a release-related label (or a `Skip + release` label). +4. Have a short title that clearly explains in one sentence the aim of + the PR. +5. Contain at least a unit test for your contribution, if the PR + contains code (it would be better if it contains an integration or + function test and all the breaking tests necessary). If you're not + confident about writing tests, it is possible to refer to an issue + that asks for the test to be written, or another (Draft) PR that + contains the tests required. + +As we're trying to maintain at least 90% code coverage, you're strongly +encouraged to write all of the tests necessary to keep coverage above +that threshold. If coverage drops too low, you might be asked to add +more tests and/or your PR might be rejected. See the [Automatic testing](#automatic-testing) section. + +Don't merge your own pull request! That's a task for the main reviewer +of your PR or the project manager. Remember that the project manager +doesn't have to be a reviewer of your PR! \ No newline at end of file diff --git a/docs/contributors-guide/codebase/reviewing-prs.md b/docs/contributors-guide/codebase/reviewing-prs.md index 3d36cc8..af831bb 100644 --- a/docs/contributors-guide/codebase/reviewing-prs.md +++ b/docs/contributors-guide/codebase/reviewing-prs.md @@ -1,4 +1,109 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +## Reviewing PRs +Reviewing PRs is an extremely important task in collaborative +development. In fact, it is probably the task that requires the most +time in the development, and it can be stressful for both the reviewer +and the author. Remember that, as a PR Reviewer, you are guaranteeing +that the changes work and integrate well with the rest of the +repository, hence **you are responsible for the quality of the +repository and its next version release**. If they don't integrate +well, later PR reviewers might have to ask for broader changes than +expected. +There are many best practices to review code online, for +instance [this medium blog post](https://medium.com/an-idea/the-code-review-guide-9e793edcd683), but +here are some good rules of thumbs that we need to follow while +reviewing PRs: + +- Be **respectful** to the PR authors and be clear in what you are + asking/suggesting - remember that, like you, they are contributing + their spare time and doing their best job! + +- If there is a *Draft PR*, you can comment on its development in the + message board or making "Comment" reviews. Don't ask for changes, + and especially, **don't approve the PR** + +- If the PR graduated *from Draft to full PR*, check that it follows the + sections [Pull requests](#pull-requests) and [Style Guide](#style-guide) of these + guidelines. If not, invite the author to do so before starting a + review. +- **Don't limit your review to the parts that are changed**. Look at + the entire file, see if the changes fit well in it, and see if the + changes are properly addressed everywhere in the code - in the + documentation, in the tests, and in other functions. Sometimes the + differences reported don't show the full impact of the PR in the + repository! +- If your want to make Pull Requests an educational process, invite + the author of the PR to make changes before actually doing them + yourself. Request changes via comments or in the message board or by + checking out the PR locally, making changes and then submitting a PR + to the author's branch. +- If you decide to use the suggestion tool in reviews, or to start a + PR to the branch under review, please alert the Project Manager. + Bots might automatically assign you contribution types that will + have to be removed (remember, your contribution in this case is + "Reviewer"). Instead of starting a PR to the branch under review, + think about opening a new PR with those modifications (unless they + are needed to pass tests), and alert the Main Reviewer. In any case + **don't commit directly to the branch under review**! +- If you're reviewing documentation, build it locally with [`sphinx-build`](https://www.sphinx-doc.org/en/master/man/sphinx-build.html) command. +- If you're asking for changes, **don't approve the PR**. Approve it + only after everything was sufficiently addressed. Someone else might + merge the PR in taking your word for granted. +- If you are the main reviewer, and the last reviewer required to + approve the PR, merge the PR! + +Before approving and/or merging PRs, be sure that: + +- All the tests in CircleCI/Azure pass without errors. +- Prefereably, codecov checks pass as well. If they don't, discuss + what to do. +- The title describes the content of the PR clearly enough to be + meaningful on its own - remember that it will appear in the version + changelog! +- The PR has the appropriate labels to trigger the appropriate version + release and update the contributors table. + +### Main reviewer + +At `physiopy` we use the *Assignees* section of a PR to mark the +**main reviewer** for that PR. The main reviewer is the primary person +responsible **for the quality of the repository and its next version release**, + as well as **for the behaviour of the other reviewers**. + +***The main reviewer takes care of the reviewing process of the PR, in particular:*** + +- Invites the reviewers to finish their review in a relatively + short time. + +- Checks that all elements of this document were respected, + especially the part about [Pull Requests](#pull-requests). + +- Invites other Reviewers to respect this document, especially + the part about [reviews](#reviewing-prs), helps them in doing + so, and checks that they do. + +- If a Reviewer keeps not respecting this document, flags them + to the project manager. + +- Decides what to do in case of a coverage decrease (in + *codecov/patch*). + +***In case of missing tests or updates to user documentation:*** + +- Asks for more documentation or tests before approving the + PR, *or* + +- Checks that the appropriate issues have been opened to + address the lack of documentation or tests (1 issue per item), *or* + +- Double-checks that the title is clear and the labels are correct to + trigger an appropriate `auto` release - feel free to change them. + +- Main reviewer **Is the one that is going to merge the PR.** + +***After the PR has been merged and a new release has been triggered, checks that:*** + +- The documentation was updated correctly (if changed). +- The Pypi version of the repository coincides with the new release (if changed). +- New contributors or forms of contributions were correctly added in the README (if changed). \ No newline at end of file diff --git a/docs/contributors-guide/codebase/style-guide.md b/docs/contributors-guide/codebase/style-guide.md index 3d36cc8..250a3ec 100644 --- a/docs/contributors-guide/codebase/style-guide.md +++ b/docs/contributors-guide/codebase/style-guide.md @@ -1,4 +1,22 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +## Style Guide +Docstrings should follow +[numpydoc](https://numpydoc.readthedocs.io/en/latest/format.html) +convention. We encourage extensive documentation. The python code itself +should follow [PEP8](https://www.python.org/dev/peps/pep-0008/) +convention whenever possible: there are continuous integration tests +checking that! You can use linters to help you write your code following +style conventions. Linters are add-ons that you can run on the written +script file. We suggest the use of **flake8** for Python 3. Many editors +(Atom, VScode, Sublimetext, \...) support addons for online lintering, +which means you'll see warnings and errors while you write the code - +check out if your does! +Since we adopt [auto](https://intuit.github.io/auto/home.html), the PR +title will be automatically reported as part of the changelog when +updating versions. Try to describe in one (short) sentence what your PR +is about - possibly using the imperative and starting with a capital +letter. For instance, a good PR title could be: +`Implement support for files` or +`Reorder dictionary entries`, rather than ` support` or +`reorders keys`. diff --git a/docs/contributors-guide/codebase/tests-code-cov.md b/docs/contributors-guide/codebase/tests-code-cov.md index 3d36cc8..10fba79 100644 --- a/docs/contributors-guide/codebase/tests-code-cov.md +++ b/docs/contributors-guide/codebase/tests-code-cov.md @@ -1,4 +1,53 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +## Automatic Testing +`physiopy` uses Continuous Integration (CI) to make life easier. In +particular, we use the [CircleCI](https://circleci.com/) platform to run +automatic testing! **Automatic tests** are cold, robotic, emotionless, +and opinionless tests that check that the program is doing what it is +expected to. They are written by the developers and run (by CircleCI) +every time they send a Pull Request to `physiopy` repositories. They +complement the warm, human, emotional and opinionated **user tests**, as +they tell us if a piece of code is failing. CircleCI uses +[pytest](https://docs.pytest.org/en/latest/) to run the tests. The great +thing about it is that you can run it in advance on your local version +of the code! We can measure the amount of code that is tested with +[codecov](https://docs.pytest.org/en/latest/), which is an indication of +how reliable our packages are! We try to maintain a 90% code coverage, +and for this reason, PR should contain tests! The four main type of +tests we use are: + +1. Unit tests : + + Unit tests check that a minimal piece of code is doing what it + should be doing. Normally this means calling a function with + some mock parameters and checking that the output is equal to + the expected output. For example, to test a function that adds + two given numbers together (1 and 3), we would call the function + with those parameters, and check that the output is 4. + +2. Breaking tests + + Breaking tests are what you expect - they check that the program + is breaking when it should. This means calling a function with + parameters that are expected **not** to work, and check that it + raises a proper error or warning. + +3. Integration tests + + Integration tests check that the code has an expected output, + being blind to its content. This means that if the program + should output a new file, the file exists - even if it's empty. + This type of tests are normally run on real data and call the + program itself. For instance, documentation PRs should check + that the documentation page is produced! + +4. Functional tests + + If integration tests and unit tests could have babies, those + would be functional tests. In practice, this kind of tests check + that an output is produced, and *also* that it contains what it + should contain. If a function should output a new file or an + object, this test passes only if the file exists *and* it is + like we expect it to be. They are run on real or mock data, and + call the program itself or a function. \ No newline at end of file diff --git a/docs/contributors-guide/contribution-types.md b/docs/contributors-guide/contribution-types.md new file mode 100644 index 0000000..fa2d8c5 --- /dev/null +++ b/docs/contributors-guide/contribution-types.md @@ -0,0 +1,74 @@ +## Types of Contributions + +### Contributing with small documentation changes + +If you are new to GitHub and just have a small documentation change +recommendation (such as: typos detection, small improvements in the +content, ...), please open an issue in the relative project, and label +it with the "Documentation" label. Chances are those types of changes +are easily doable with GitHub's online editor, which means you can do +them, or ask for help from the developers! + +### Contributing with user testing + +Another, non-coding friendly way to contribute to `physiopy` is by +testing the packages. There are different kinds of tests, but to +simplify things you can think mainly about automatic tests and user +tests. To know more about **Automatic tests**, you can read the [testing +section](#automatic-testing). **User testing** are warm, human, emotional and +opinionated tests that not only check that the code is doing what it +needs to do, but also whether there's a better way to do it - namely +better reports, clearer screen outputs, warnings and exceptions, +unexpected bugs that have to be corrected. If you want to perform one, +open an issue on GitHub or drop a comment in Gitter, refer to this +[blueprint](https://docs.google.com/document/d/1b6wc7JVDs3vi-2IqGg_Ed_oWKbZ6siboAJHf55nodKo/edit?usp=sharing) +and don't be afraid to ask questions! + +### Contributing with test files + +At `physiopy` we always try to imagine and support every possible +setting out there. However, our imagination has a limit - but if you +think our packages should process a specific format/setting that you +have, we're more than glad to do so! To make it happen, we need an +example of the file we want to process, so you will have to share it +with us (and the rest of the world)! The contribution can be a full file +of data that you already acquired, a part of that file (pay attention to +what is the minimum you need to share!), or mock data. The file +contribution should come with a json file of the same name that contains +the necessary information to run `phys2bids` on that file contribution. +There is a [json blueprint in +OSF](https://mfr.de-1.osf.io/render?url=https://osf.io/jrnxv/?direct%26mode=render%26action=download%26mode=render), +you can download it and adapt it. Note that the frequency list **has to +be expressed in Hz** as an integer or float. To contribute with a test +file, open an Issue in GitHub and label it with *Test*. We'll help you +add the file in our [OSF](https://osf.io/3txqr/) space. We're extremely +grateful for this type of contribution - so grateful that we asked +allcontributors to add a dedicated category! + +### Contributing documentation through GitHub + +We use [readthedocs](https://readthedocs.org/) to create our +documentation. Every contribution is welcome and it follows the same +steps as a code contribution, explained below. + +### Contributing code through GitHub + +This section covers 90% of the contributions a project like `physiopy` +receives - code, documentation and tests. The best way to make this kind +of contribution, in a nutshell, is to: 1. Open an issue with the +intended modifications. 2. Label it, discuss it, (self-)assign it. 3. +Open a Pull Request (PR) to resolve the issue and label it. 4. Wait for +a review, discuss it or comply, repeat until ready. Issues and PR chats +are great to maintain track of the conversation on the contribution. +They are based upon GitHub-flavoured +[Markdown](https://daringfireball.net/projects/markdown). GitHub has a +helpful page on [getting started with writing and formatting Markdown on +GitHub](https://help.github.com/articles/getting-started-with-writing-and-formatting-on-github). + +### Contributing with Pull Requests Reviews + +A big challenge of software development is merging code accurately +without having to wait too much time. For this reason, Reviewers for PRs +are more than welcome! It is a task that requires some experience, but +it's very necessary! Read the [related section below](#reviewing-prs) to +start! \ No newline at end of file diff --git a/docs/contributors-guide/getting-started.md b/docs/contributors-guide/getting-started.md index b346440..3fd0282 100644 --- a/docs/contributors-guide/getting-started.md +++ b/docs/contributors-guide/getting-started.md @@ -1,13 +1,24 @@ # Getting Started! -First of all: thank you! +First of all: thank you and welcome to the `physiopy` organisation! It's great news that you're thinking about contributing! + +Working with many people from many different places is great, but +sometimes this means that code can become messy due to the many +different ways a contribution can be made. For this reason, we have set +up some guidelines for contributions - to help you get involved ASAP! If +you lack knowledge in python development / github use / physiological +data handling, don't be scared! Try to jump in anyway. Most of the +original contributors learned these things exactly this way - jumping in +and hoping to fall in the right way without breaking too many bones. Contributions can be made in different ways, not only code! As we follow the [all-contributors](https://github.com/all-contributors/all-contributors) specification, any contribution will be recognised accordingly. -Follow these steps to get started: +## First steps + +Follow these three simple steps to get started: 1. Have a look at our [code of conduct](/community/CODE_OF_CONDUCT). 2. Make sure that you have a GitHub account. You can set up a [free @@ -15,20 +26,20 @@ Follow these steps to get started: [instructions](https://help.github.com/articles/signing-up-for-a-new-github-account). 3. If you intend to contribute code and/or use the `physiopy` packages in any way, check that you have `git` and `pip` installed on your - system. Then install the package as a developer. This will let you + system. Then, follow the instructions below to install the package you are working on as a developer. This will let you run the program with the latest modifications, without requiring to re-install it every time. -### Note + +Linux, Mac, and Windows developer installation +---------------------------------------------- + +Note: The following instructions are provided assuming that python 3 is **not** your default version of python. If it is, you might need to use `pip` instead of `pip3`, although some OSs do adopt `pip3` anyway. If you want to check, type `python --version` in a terminal. - -Linux, Mac, and Windows developer installation ----------------------------------------------- - Be sure to have `git` and `pip` installed. Fork the phys2bids repository in GitHub, then open a terminal and run the following code to clone the forked repository and set it as your \`origin\`: @@ -117,4 +128,7 @@ working to fix it (see [here](https://docs.pytest.org/en/latest/skipping.html#xfail-mark-test-functions-as-expected-to-fail). However, if you do encounter any other error, check that you have all the extra dependencies installed and their version meets `phys2bids` -requirements. \ No newline at end of file +requirements. + +## Where to go next +This section needs to be added. \ No newline at end of file diff --git a/docs/contributors-guide/index.md b/docs/contributors-guide/index.md index 3d36cc8..2ae5d22 100644 --- a/docs/contributors-guide/index.md +++ b/docs/contributors-guide/index.md @@ -1,4 +1,4 @@ -## Under development -We're still building this section of the guide, so stay tuned (or help!) +## Welcome +Welcome to the Contributor Guide! We hope that this will provide you with the resources you need to interact with Physiopy's codebase and documentation. This part of Physiopy's website is currently evolving to include more information. If you'd like to get involved in suggesting or making changes to the guide, connect to our conversation [here](https://github.com/physiopy/physiopy.github.io/issues/49). diff --git a/mkdocs.yml b/mkdocs.yml index 0bff1ee..09f4d2c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -43,6 +43,7 @@ nav: - Welcome: contributors-guide/index.md - Recognizing contributions: contributors-guide/recognition.md - Getting started: contributors-guide/getting-started.md + - Types of contribution: contributors-guide/contribution-types.md - Contributing to the codebase: - Welcome: contributors-guide/codebase/index.md - Opening issues: contributors-guide/codebase/opening-issues.md @@ -61,8 +62,6 @@ nav: - Community Practices: https://physiopy-community-guidelines.readthedocs.io/en/latest/index.html - Community: - Welcome: community/index.md - - Getting Started: community/gettingstarted.md - - Contributor Guide: community/contributor-guide.md - Open Datasets: community/open_datasets.md - Other Tools: community/other_tools.md - Code of Conduct: community/CODE_OF_CONDUCT.md From e8927e3ea7d0390d7a0e8f7c129cd9d05a90474d Mon Sep 17 00:00:00 2001 From: m-miedema <39968233+m-miedema@users.noreply.github.com> Date: Fri, 21 Jun 2024 15:06:56 -0400 Subject: [PATCH 9/9] Minor re-wording for clarity. --- docs/contributors-guide/codebase/plug-ins.md | 9 +++++++++ docs/contributors-guide/contribution-types.md | 2 +- mkdocs.yml | 6 +++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/contributors-guide/codebase/plug-ins.md b/docs/contributors-guide/codebase/plug-ins.md index 3d36cc8..958ceea 100644 --- a/docs/contributors-guide/codebase/plug-ins.md +++ b/docs/contributors-guide/codebase/plug-ins.md @@ -1,4 +1,13 @@ ## Under development We're still building this section of the guide, so stay tuned (or help!) +We'd like to provide more information on some of the tools you may use in your contributions to Physiopy such as + +### Pre-commit +### CircleCI +### Pytest +### Pypi +### OSF/test data + + diff --git a/docs/contributors-guide/contribution-types.md b/docs/contributors-guide/contribution-types.md index fa2d8c5..abbbcf8 100644 --- a/docs/contributors-guide/contribution-types.md +++ b/docs/contributors-guide/contribution-types.md @@ -1,4 +1,4 @@ -## Types of Contributions +Not sure what you'd like to contribute? You could consider... ### Contributing with small documentation changes diff --git a/mkdocs.yml b/mkdocs.yml index 09f4d2c..980ce83 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -39,13 +39,13 @@ nav: - phys2bids: libraries/phys2bids.md - phys2denoise: libraries/phys2denoise.md - peakdet: libraries/peakdet.md - - Contributors Guide: + - Contributor Guide: - Welcome: contributors-guide/index.md - Recognizing contributions: contributors-guide/recognition.md - Getting started: contributors-guide/getting-started.md - Types of contribution: contributors-guide/contribution-types.md - Contributing to the codebase: - - Welcome: contributors-guide/codebase/index.md + - Digging into the code: contributors-guide/codebase/index.md - Opening issues: contributors-guide/codebase/opening-issues.md - Opening PRs: contributors-guide/codebase/opening-prs.md - Reviewing PRs: contributors-guide/codebase/reviewing-prs.md @@ -53,7 +53,7 @@ nav: - Roles and permissions: contributors-guide/codebase/roles-permission.md - Style guide: contributors-guide/codebase/style-guide.md - Labels: contributors-guide/codebase/labels.md - - Plug-ins: contributors-guide/codebase/plug-ins.md + - Under the hood: contributors-guide/codebase/plug-ins.md - Contributing to the documentation: - Welcome: contributors-guide/documentation/index.md - Building documentation: contributors-guide/documentation/building.md