From e232fd2d0b470fc6d474a7eb12396a171ff3c693 Mon Sep 17 00:00:00 2001 From: Neta Zmora <neta.zmora@intel.com> Date: Thu, 6 Dec 2018 16:43:28 +0200 Subject: [PATCH] Documentation refactoring Add missing files :-( --- docs/imgs/algorithms.png | Bin 81123 -> 0 bytes docs/index.html | 2 +- docs/tutorial-lang_model/index.html | 703 ++++++++++++++++++++++++ docs/tutorial-struct_pruning/index.html | 312 +++++++++++ 4 files changed, 1016 insertions(+), 1 deletion(-) delete mode 100644 docs/imgs/algorithms.png create mode 100644 docs/tutorial-lang_model/index.html create mode 100644 docs/tutorial-struct_pruning/index.html diff --git a/docs/imgs/algorithms.png b/docs/imgs/algorithms.png deleted file mode 100644 index c7d97885173ce1f234121b5d33bef1cbf15feda9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81123 zcmZsC1yodB_xCUiFoZC4!_Xn!%@EQJA|29=(#_C_bcskS0)m8uiZn_{OLrsP4e|}( z^TzjoS$Exa=f*j^&)&a%h}KY(e}F-T0RR9VC@RQm0RSKr003zpjEcBJ*ora@0AQ5c z$;fCZ%E&-9p1WAvIa&b#3el-)Xgb>ZWF5PHoDBnbv{?h0&@8}^19OOb1umWvGYv@k zQyz~{h=tT6&_f{|ln!909t4vJwFPw)iIia2qXNLndKt{HwUs?1ei^jpck0zReHt`Z z|K;=z4nT=oo>?Wr3ZQ^%85Q!)C<8Z9Q{~DHkVlMe2IyHR#54vXUjs_M?3a@T1@}Gj z81tUooC~@sPg?n2=!O&w)Qnqr=ccV85&Hw>qeco6AOv-wyBnhB#?tMMYXI%;C=?D% zn<^BxPTTG6K}UZs<3j=fhPUB<M~3~0TFuCq_8yLumY>jRUc%Jyl%Gh<Y+lHF6MxW} zk}_;30j~<|kvwm|`OYi1*tO8E?0sTrE$h1W9y3{3_-5_-mCHN&n6=rwXjBHNWy-KP zEcagfB&`4jwkUl(t`7g%o-0x{h+kwMx8MxBeVh-4*PJjBQ~1{&Zh5{NHpx&*o{s!s zXmk_QCpxEHGL3y<+&z9?IBv<WYE4LxhTcDp_uO20RY;s=+$%6Hlb#a~P0>CM-$$vD zn<1c4fWzjGF)2FD>><Cb!p6e)uYL*#AsSu&<`Ey-wO>&PnFdv*)8}N9viS%g&zQNr z>D)(ubBdl)isOn#)r`~d3QF(_S=lUN_8O@(syBP~S2O$LS9FUVOqN{61KRjMEipec zVrHxsTC)KP`{%bzuku`09i^~Z{ner_rt&X|ir@5qXGR)$xr6y=(O<2e46qIcygvB+ zRCCo4n>U~>pUIGH08XocYyhJsDM-~v_M3mHyM+vdfuleVk%;Mo37|lIvj^h<3>fY> z(n&CnD_AFl%$4E|sCS;?Gw37SFqeE9EnZ5J1X$j}OoEmS0WHw5%7zlqcqpLpg!Ir5 zErWevff^73^hYxL2>?79hg?++Tpg@bDfwK3-^9P!+|j=x9m8<)kZeJ|I010nSHNH9 zkM)R6K%dNr$BD7wPn!2#$=+bDwN1@yeFjRP3bv%r8}0>srVe}%PXnN#!;(ejmeY$O z#|xIFc@_oMk0hXFP(T?9uBN5zG=59%6YBqCo{J9)-{NIuhqr|^w~-2&HKp~#LM-i2 zyH=x?>F-!(a@=#3I;9w+V24O63%ZK^aW+S!T99G5cxc0mhIq=>xFuI1R5cu%(8C{( z7V(~acxLzv%{BJ3fDw)}L@=UbiEv-e8_ge(9opYaJb$_nzreY;J0H211GWqiX?ZiR z7)1*PlcO_)iL|1$Qno6$(rZQ($yC#!LVVgO7Cjd=pFZ3dcorq3n8dK2NTERUR(1$g zi=`Ouo_Z8^1Xp2nNOI~@?(%<5^(DnW#6L?6_D3bLfJAGW`6tWMZUH6!cd-Wv2XLi# z8(LY#n!{Kd0`~03JjbNR$pot1vM<=bCmV1+<`|*(kl!fd(=?EueB}Gi{iA#I5zG42 zkc(v$&sQF29*PVPo)sP&D_^T0mUdOvRY+AVRfblZmM)#xKNnWqSHzaRpPxTZeV)F8 zY6n)0S(RHF5*Umd`ZyHvTj(oQma6(&;=%Y|^}h=ao*$$gm>*0WtQ@SZT#|xi(p#+Q zd24yqc&NA<*))vjtDv4OX($gcci3KOXz04?Mm=WMvDNupzV|4x_;=o`x1Y5u_4kYM z<hnHMinY>)q~3i{a!Fb5KIt}EkzPsej@L0Glu3oAj<BY(X0ck7*q4};NRI@Rq(7c3 z;vRl8f;Zy%!B~S_^L?>s$>E6C2UDG(?<qE4xso&9^*rp+d_efX<w4~S+*poSMOE=$ zjo#STv9Hx@6b#tPgvw?Nwham<Hzxl~I#h4gP_IKg^hD4_{5(Y58QqWF+dKp}1vara zS$<a@KR@0$&i<`^oOSf;=;6^W={%Mmsv;^H*4GE-G7sB8ZO_}L<SG(taOZvpYxYZT zNl%4`gcD-=#j^b1_>uAB_y;m07QSS1EMqUD3$Y#N3xjGm&5r!tLfyiyLU~o{%&v^{ zS5ABm{C+OZwtf7Zf=xD3HG9>1E`v|^`-VDsMh|kWatM37=j=Z{t{)L}Aa_Xg2tAI9 ztyQh=4a_tl$|CHX?EdN;Q{z!%?BdsV@+qsvIATVzUUEBjJ9%q!E0TDVJ<izQeLpv} z5V>O^N~VeK7x(0Tg+)_x1b#<x>-v{ZX}tYky3gOmz?JiVa;MjQEc{42#`_W9+0)r! zW^x+Wi}O_almkaNUL&3--X{BX_I~zpc7chm$%lr?Z<Vu+v!V@t6D5uu^=aZ87E7N- z*Isab7aXtaIsKB8m(y83LVa?&KeuvY8Qq81lC%ndG-Hnw?(u1Ga<T7?z5DzQuKY8- z5zK>WfIp0@f@wl%L@Y+NNLD4j{H!RjNT^y|Ma0oZ&uLutv!C}f@1XYls2bcl+Em)} zM0U-yqKcxDqDm{OpC@eO2F^9#%+5mzeIHgmnbs?==J8oMe?0U-=!4oLi-NX-&HSe4 zKq106l_Z`$e_m;RBuB8t-=9&JDTucTF{HTU>7)55<SaBx6ZqsxAw*kRv6Z}$yy@i) z$DruG#-gkiOv__P=ehTD3k(_tk(E-IS_1v&q>{APS(9{pctqgKUt2>bZ)0EhKYF~b zaq;3P4NGKl%l*aicgZL;9!lPyypmSoR$1L?y+oE?t0b$AT|OC`8JCClJ@z{rC;Vg% z0;QySn^h;BBDTgoUr&w=HV?;eR(w`Q9HCAMlY3Kgzhb|WOFCoB4Zkjbos%wk7CMG= zjG~2-A2Qo}l8JL2b)I-*F-8=_ep&0!xlB0A#>39aa`82_{&-d0S~B$yUk$sn;h5*< zHk#MGC)iVLe7*Wpp<b;}owsZH&Bwx-o|*7^$sPTgHMwZ3uDph~4T}xe?*iYkUsj)P zkDu1C<!uFiaqw9ROuaTdQKy)v{OmSxZq`OKBJ(J+kz$p4M|9ESZLxG+{#(2!8T#jo zw&R0wIr@@gx-5?g9|wFO(m5RijTjZz6ql807f+esjKyrq$FWO}225XjD~CR7OO%td z7({oK_Fo*~9BdL3TKB8ECfL+zv&;H**+0-nARwhGtXj~E-h0iS$S!UZ&{tbGS(kl2 zvOKooMz+@7|1)PU5bjQM(>nZpI>y4OwN@~Fk@G=qxqXno@Zv$kL*;UJ<KqV3>(^^F zKPfpViOWTeB)!^peoSPRX7<*Vy6}4#cx0dVZq)G_j~c7iIXTz4PkGjzu<d+t?O5-7 zSHI&`K4URg?-A5>osE`<bK#qQiZJSn2x>-2|5N6}!R4iIOyf-9>Q>olV%k2s`}Hlm zvDc&5YiQGGA~|T1L1LYh{@3ys)TWUKrW&Rx-*kfXMI9ylo!i~sUXD~fktq)^XPP6p zQay3GoZDy;zkYw1lU0CQAhRpGTR7`-oqLvdQLxf+QrTQ-v&6ELj31suAUWc19k6qT z_h)6ra`eg7*pLhAoI%rNU=U9#4?n|lln`$jBI}|cMr-z~R?n3K!ZuNZ>G`MV`oXWa zH*LUIOxfE7HkJ=yR^$L0AHZ4Ol7##4BbiCkU>KkD8ze__n&=>A@xE67(U|F%wTukf z+SCKH5Enpm-E47j*J^RG%VXQhcz`W=&UWv6hR~CnNVnd$>ucv3hu_FI`Ax{}k5J!b zSWb8$^4M%U9X)qFRTU8n7bgyLOP8ls9Ntc@h}0GU5c3v6Tsm2~n?t>w9G%@nyv1qn z-Vi}t-`?h=h2Fj5?jTO9r>X&!ad~b9<>%nz;G&hlfI^{S&n>M*v}EP}evbGhPHXG# z?kd8`>E-3c;l<10^4x}#TUc0_lZ%Iwhld^U2D_V&v%9%ByR#eJ{UHC0BWvYm@!ZbU z-Oj}sdONQ9Qx^|+aa!8jiT?F>Pp6f)-M?pYcKgc~f<eyPC!E|IT%7+J8}X^w?OhQK zJ8vsTJy|;^D`z*v91`4IJi=mkAN-$3|DN(cKGpyCr+mVK|M}&AJo)>j80Req|H09{ zxbE&E<RyV2#`!PVOJK|p4!Q#XFo2@0l#VyjRu<YD@{yXz{vxO2j}1Ew#8{t^evqi3 z$w-6qyudUGsEWaS(nUxn!So4xcm@j4c!=)<#orB6KLk((ja+w~8fG77_^cUir^*}H zJsB$LQMkD@+<s}jGksvJ`o%_#n@ueY1cU<q&!OQ760;h!a3=x50RQKJ;Rb5}BtZ}W z(*J)jYXcz|DeKJzQ~zU3Kpr3v`G4HkC<H+Xn18|L>!kkgTmWgLE7bo%L#_%sj9H@) zIo>%G01p2Dk1*ibga30A91P3A+e@`;8g#m&8;-|drmq`)f;9t#4}-AU6dLgT{?3$3 ziQuCe8Lj^Q_p}rY6Nr~S<lE3oDK7O;3MvltqzNwlxohO|>*tY@G{^mT&zS&uurD{j zfuP&puH5i=LC*Z3kG`QMQ(Wn~{4Q_H@)(IvQB~34ap>;HPqdq0$dr=-E+Sv%bSB?# zDllL{q=Nm$sMJ+pfCX5GSR(SB<bylSx_FM*_Lc9&?Meu*>CIdp688G_$w9*Xas8kk zq>~?R;ir;sD4!)C@S*-8Ja}yLu`({Ut(4TqO<A9Nk-vKckcJPDsUM-<j;fU1Jnf{s zzPURG`;b|e;%_=A1yP8E&B2~rZ2qPm`210(Yxgv{e@&Yj7t3}5Cb9y>xsx)?2QOG7 zSFD4w0rgh-Pw*fQ;KeRRNbul?@;I@5Oz_!R5#OgrD}1@ioF%2DZ(-0}5VC<Apb&Ka zHoodszs)lsNYcQ}Qsn5Z;$Zr?pDj;}A>fpesDe-HczVPWYERgMUU_bfOU1^<4o^?3 z<Y`3FCW12x(IYe0Lu4gxMawL6Yi0|%1wU_jo0kJF>g;`~q5e|2Zp#ZM2y5OHUHj!n zE}<O)&l2_0QdY(cZ(De!0dRhc!Gl!<y5-+U9x#YzBxq^Nb<0)?6H+u!Fv1ZAB;drg zefivtjg<-@&nDngrQ5rA?h%bJQU&^u-TPm0bWj%|hAk)_f`v<vHER09LnK^4RGZYc zw+1HKvh5kMZ4S*z$SsFo5Z;nIEk|*Uax1ZPJiU=`gYVeoKS|}ff&>QD?CtHfS^>`l z^fWbb-9(sM`N1FzL82n`TPmle0TL+FJX*F)cT{pCW%M{c;7{d7a;F3h(N+8cYjTn3 z#G!tFA6z<hjq&yg#&h_cC#2vbfl<2cst2Fk86pjmki6SMZeG_T2B;?5G93^}e=-~> zl=DJ_uZZGy9tuT-o5^EilA+u&YsM5D{W1%6R4O+Bh!>#&Lb?d82-`kvHMx_$*RAX? zIRV#b|F}Oh3$W0xge&ai9eA|bRh3h@<kxSkdvh5@NUf8M5*zf-y8t8`ykJ;!#!`sx zEv>=$2sfT@*ObackbyWB!SlV=6xjYq@M<u9wqW$!FIG^-{UfDpKp2ogvi&#oZs=Rl z3gcF&|FJR->W)Ubz_=qlK?1?~kWKiTdo}&nSwrhK&J-`m+T0KLUuS3lf~~jx7{dP} z2Iam5BVvtKTXf(5iYXT$|8<*3YPYhvHBE7#u5y^IysKA-7%Hjp!zk|wld4(){BU-j zug^?e3`y&29?Dkps>q4&p30wgY?SOJ4KgHDdprE%NS!NMS{hQ(wMgh$nd+MU93$3H z(#2bWNm|qOQ~gtCRiE`ovowdy&U$%dp|oR8q^w&7zz?8^pyTtB*BAX>03k5T9|kX` z4>Ye#sMQxQhZDHJlArfahQ5p_IlI1M_dXVtHQj;Y?4IWEeC_?S=ce3w)v>mG+1s*A zIg@*WAP7@qUR|Cs%N4ch+LY(VX?`=m_Ebv7=N5zdWNEKH+Rb0FmBxjom5|oM5%Xn9 z8+9VRYR>5>%BWNlcxTMdF8>`&9%u2eZ*(+9(eM_GdoxhHjT-ckgjv8lA$6t%KZ8l~ zFrLuzu;(AETJC3hZKiUvob}ls1O@@m3m+&LygeTWR$)`Y<aS@by-aqVrg}RtCt1+! z#Y8`o)%T<G%>#nQ{Q%lgcP{LOi_@LrYLKj9v#%GS{^n~aL;=k*N$dy7D8%d|711p8 z-Y0@##rOy!hUH1Fk?)95hzaI?Q3H&l!b=xCIA_GT>5n8hpHuIwx4{`DDSA1jj>MS> zc}4Km3mfI52sF^tZ?44Ovf=YfT6yeM!NHlypBet9op1MYBxx`nb^5LRS<ajmOp7;^ zbw7jVM-7oiIdv!@OatwNDG3J=CGPza>DDjJ5(XdLSqpp%?0x!MZ8gI$p$mU+pe;vx z{t|x)b5XD>JM<#?{OBo0P(_6Q<!<(y4xXw-siy~Tgpzugh&9hXPAppy9t-@zETu=A zz(B8r!AG~~mx@}R0g(*T2m-NN2?Fg%^_6QM@nc1dChu0jEssj$M0KhmrCBrwl_#>l zV+k#L4a%#r#V(H+=XA2!<k>J9{xIkt3gGg8nhQg3=<Ii*DHzd#*RV^MN-c<b7TL?6 z^`=^~kC#?+rR=Sc%yKZ2i7>3**s|*%3MQu4@XC_Vbv<puG2f}HvHZZQoywc_)9!dI zHwL3$PkvSOLsV@=KN`_ur(w`d9vgk-$|iIC(cGK5#3@O(4b%J@SBEF7SG1qTl7-#G z^*?wf4A!Ojci_0R8P-uM|KnGv2+_TeqV%|psQ~cjh~S$jsp03ROk#>FicU$(q5)Va zb0&`xFIN-1q}6#?hd$RFSU&d0eRbOVZXhTv>E>ZuQpy|O<QlF?BK~!?EOzJkFOKBl z&KJS9$eDx{bkc**D<n*mTiz2Vo(?H4XAW_u&7~;rFJX3B!Xu9t4Dwq%Wc~fadRY(^ zN^*@Yrv7djBU$TI`mUK<_y~ceTTF9Z$D^NSc@gJ({uu1DN<^8wQNj@=$(yx$uz}W` z=3}%Z&53TMHPaTW=n3R>bv9S-4tJ(O|ELNWjX!T)fCHxHjRAv^#>%(G5LV~xANYaq zsHO7W6D6KEi{(4BVUg&nkMam0`8c7Vq&pWhKU#V`HPlsb=~4-h70z0w`?O$_#U*{t zsBxvIU>@)-E~K38eRGyP{joM~c;wCBFsPviv=jS6P%Bl$?gni7cIoqVdqI$yB-%2N zEAB3Or9-$bPTn=^J7CNi_!P{9&b|GlEtw>EcH!jhpltbcv%%HnMMZ|xSt81^WO~-+ zyTq$2qOajh6RR>g$^5C;r0%L*s<!X39IOf^9gb9g#lyc%G+7kB*12?k{lnzA{=-t4 zhbW8pc0Iv)o65lp$^dC{S$vqPnQ%V*TQSa`tp_|eJn2P0)c;K3FyW{VJSu>meW>fY zIK`_{qoj<j9hmftnL8sd6<@f?vC}k1Kg6sm4nJ<y!uUkjB#RbHg!$y9VyVYo`nsjN zi^onUBi_Q4O@&Pd_}tn2eQd$F9bG!UZ|cPLGotW6z0#>m@<n95LF}57NQ7RL@4~36 z2JvX3dMBQW_!wk1`6V()Ci9bD)ln)@jdp5G5~^3^hG(fq<d`O%>{@!!4Vn7c|FHLc z!Oxg*yNW=cfR=fDFL0B8-+UAneex)u0u8rfeMh+Hv8|FE2ny*06Z70<JFB4f1&XQt zpCBRqq`EEC52Km=Y>dfsp6^r7(0?+;p=L@GTx`C#qs04JoiW#Vm>F2mO+7U{t8|91 zd$U%zg6hCy3lCl<UW=mImmFxf-@h>)Ed(zGH(FM}U`b&b1U3=&0duoT(A-gd*u426 z63@BIV;#Lbo|-?0S=`ojCm>9nD^rK8=0n3j0?{)37eUqi&TxPY<Z%#p>Rv^0Fdn#5 zN~<pqIn`A<L*RD^eGeVxGq#<0wWnmb#NxDBVi)tHR-;$rW1)Cp1!11q*4N23JiT*K z-LXNpCZ^#JWFvnUX_Bq@Ve}I^u~ye@<^zf#AOkXRMg0aMR{Kxrj@Fk)_NGISkgp4W zV)Q(+nF1H;Z8lXYIU2U62h7$YM#&$t@Oa5Yo?DR0y20n(7{<1Y7oO;ru58H!Cs(@U z2uyq{o01)o;P$~gAg3tQ)LQgJpJVQNiX?Beq4_AA<|=JEEyYtteH3WMjzYNJQX7vt zlBoH_d`?>TL&A51uc;wTm)@uHeAKc4=xab(SKG!#y9MFZjxvGecH~}UsXpx_Wo?QY zm7!<NYktX-E;Du1L#QVYi!=%SZ6tD~gPVcJI0fSj<(*bV@wHfRD`qc@Sv=4JkZu>1 z>|go>=7&X-L0MV^WJIDv$<d4tb|;;$H_9$q3Q~oGh1Qe>&-+Q0TTY*R;(`a@O$X{3 zM0T|sY+a}d&_QZ$uz$t<ww(EOF*=t$mw^72UI0fyg{rJIr$R>68NZg{(mrZ8#8Po~ z)a7ZReQTdcaapmdJK98F-?h%cf#1t8^hWMDI_Ys~sS6xZ1)@W6CBFQAIK&)36da#< z<A>k*OC)f8Ia=5DGKalM*F3uHZAfXLMNXjmNef+ZV`DZM8QJjrk00YoN=iC+ZF;fe zBU9Nu-8dBrG|&;cb3n%uT|qVYnikLiO=Ux}#Yov2$hWu;EnlF}ler|ZQr|hvgB&g` z;a1-76wvTusi&lJ?DAYfL7cR@EI5_tQX+~?#qn=5a!@PWB-9FD;nKhD+|qpzJ}QP@ zFM2$(m=O2W(_DSjlSrb11v#2an(^XfS&>JRup{Kn%YAVc*YiLpi9eq@CY3d$Ljajp zI#<Ue2PVDdv=hX#XDvRYYtf>)3RjDh!JK~sUIG&k-D^o~B;@Jetgbm6)ap{EV{*n& zowd6>NO>CEHhbRKX0kJ(+;~3sj&jYVcR|t-Lh5%6Jsd>o7HBF!4)`U+29*aTfDsM1 zeCe3a7DDYgLb$_S9ahQx(By&#^o>q}6QsHH{q3_NemiNsTl8ElY_zl?==)<riPw;~ ziT)N7EVP)IJ?Uv)ucjsmT^i>z+XL`yqVTXQ`QIhWuZ{f7-~aWX8SggzMH~kTfK_Cl zu$cUNlBZ>w7rX2gR8Yn<lfKg&v0+!rADE~5<p?$58}9KXrDyFw8b{Ag?MXBd?TF!` zIVyNE)nz`#5O>0nQ6!D^`m`qxiiwtj53AH)6I?0`!?e5%Boq$L!e#vxfiKUJC$o2P z+UYiIwo;@40uHHV<X#FX!TRt;v0q;Ov8Ylbm!T41;L3O(#`;#tllfI#LO8kQQ5i%3 zep{EnFLzBvIiMd-!RYFatbf0FpO?Ru&JGmYpBt5KQ8ry@tiW%-z9`ZNS)GoR#jImy zN*JnhKcKhJ;0x>`3w8QOOBTR&@rC8jS_Ei+Yb`Z8vr4iCe+9nr?-t@s<^n=Gx$#+J zq=XqW9M_K6kQBi^yVnpfW`8ipviTwM;eNPX-u}zqa_~87xx9MoWd6u04t%q$ua6TV znHEvynFqT1H38Db4^#R>J4<zWfuoLl{!T*CrlJ1yp>xCJbYGLs=WQ&jEM!yl+FF9n z8&f`-0)^#T#UjR=;OBd5&;03Mhp0u!N<msWmN1#0;&+lP`6k_5QmnwWMSR?SqJKW! zQ+7md{0l_DB)}wF%`CI*E)w=q89oeVD)nr-5)==9XqcgZV7anjf~mpWhg=6`(*{$r zt7+B;75LHxhE^Na%CjD&=q<_a@#C9JlgIBRc&^29lMU2-)38n&sm~@XM;o~w7s)-N ze??*py_Ob!UmeiKf!73*qb8cJkc_bGnyijd@x*3{!%G(7OvxYWOfGdCiSR#EHh6YH zzB?00J2E`nJZN^&nShTVgA(W|AFBMvhvC6?Kck%j!z1XYC)5lh9`1MW0KyKH!T_20 z3bH`XAQ6?M^oB*IXX|4NdHObHEizASTT8o>YCj1_`cEpOVj_QIp=J8Lgh)pYf3U~2 zaDGHO1O8Ry7Y2ZQ=$Dn~p?ll@uX8g$q8xMW)yT{HYX|eR!2A~)8Xh3xN-6Ds999Zs zCNZDe0@MEcZ7w~y;tTA%HdBi1lL7R9l0y&R00HwcuH4Ok&2Z;WFenNlbJPlMvHtt= zeVulHX7;!(W-q`6ck9<(o&T2@#C1XlqTpm{Hsk%9z5i$Nmm-1~R4E{AQ1X9_svw1c zS_sT4NdLO@e-fpXg&6dmMC)(r|1s*@+gc8TYaHuNeDiET<Li+=dx!xt5Sw1Z>0;5q zibQVO%l~evL6m;72;%ASTD<N_kjMK?Z0l-SKfnxe#e;veW?;YoF4zANDlW6dyqhbS z7g5H}zkCLJcu&wI4HW;iO#SYR8uk{VE`tCILc|Hc?4SgOf9jQLc?2UTzs>Gx4YmNk znRY3$m<)*s4%S9j!N!iVL-7`)s`;31pfNvOTVQ-IyYDmzE}nfZ(7mGzj)lJU%Y&YB z%0eqbo<<a$f&<@YZ?Jnck|hg<QkRc?kT77*RfPG$lK+N47=p^+Ii!1%m(YI;zNw27 ziN848q?|M1gMctpb0v(V-V5$f;-jAVOAJxtV$)-wV$4Vk-$##mBZO3hyc`F3?#05G zJ7?crrT!TC+Np<Oc<Kq70D{Ug&;}jhQNwm}aprqDJJhr5KnxIYgKpC^FIXZ6fb&;x zd<Y%$p|jnaB84){0i$!-+Gs5AsJ-at`oL@MI44drRA4wQlo45SP9zqU{DBfLEDVW| zkWlCG<438fsn0@?5NHlRYZ2P*h|`at60geYC*wx%YnT*VBqusVlt6P|e-uRFkJM1N z!0T(i$@ZGmNG;QrX`4^lN)}|yE)N_jjHlnql_iC|59y8!=G>5kfq=AFMIS%vQtJ~V z!C&Dv`{z;wvH!j^)VH@fI})NHz7rq}7rm2Q?Pt|+yIdIX0F{pd`&ZzM+#rdmslB7) z+rmOddpkSLDY{#Hjntu%A|}NUsNSnb`EZZ?@+hXvg5d^qL>|;;!+c1VarD!N1_;0f zyRQ$0BS5Q^V5lZ@ZhUXhLrvs+T^Zh*S6ZU9=&itVd(b;A<s2|O$u%>sIxS6WWAx!F zFJ5P6vXEdU5n+s@AX~+8uFVA5|M;qxVM8s(QyZ7s3Q3r2kYJK!h9(E$rgb5vgHKKx zFc2ghO84PpHF1^6u-{vlGc6!5I8zSO=@wFh^Dsh_$rNcx29lwdUbqBNg~4DH*%*Y3 z4&Z6Qt!ZOH$H!6N#3#*)7-K-BjJ==d(54_<jHs^QKb-;-Xusg}fXX|x4F;7%h>irK z^xn~hvVyb0>z*6C1|9|=V4eoE8Z*>~hGd}q;FF`RZKrw*Gd~N``OIcK5k{vlR2ncy zk`V7t3<p$$l4#rI?v0NeVL^^u75CWGyg$$Y0%afByihH+1$WA4;@Fx8n}{@d?Kske z0mCT;&u5hJ9sr!Q=#qoj!2_*;GMd~&;@Z@r2Y2?^%zhg$e=6i<-3x&mXg~s0Zs5SD zapKACMXlz7aay35F}w$DY-~I?pu$jAZI)=MyZKY&3d6)WlJNU8{O;*r5LfsX33($= z9dHNX5#tXeQ~JoT;?rcDF$KQ$gMgQV623=J7FU3dcIPC{)r~kEV>HPBD)|<#8%>m{ zzxRriwBR35{Crs?*rHb!@y}^INR7waR{Vhwq+<Q@O{)dNP_p|Mr<D*8V_h7@<b%7| z2BFJklJ+eQN4oH1qtiW*hVk(yypRDj?Jv5@m)-KGp>zw@y&IG@y$@CdNGd59mok9e z)&n`GdjUWbl!1`#wIs&wdsOK^13LhT7*TvQKMD;mymz+$4Bo*o4g?no%CDI*|3`#2 zl0{HT{DA27z1IGFQTRfSh;1Bp`E2+4{jaktE<)Qze0sL5ccQw(DgHI>auOo$e|Z~S z^`DEu-|OZ_x0)R^%PaoN*niG>%Ou9~znO&d&{ueWzu?*8|9Zbn0D$jq*P9^{`6J+8 zc3#NMe<P>nFqkR&SN|s04Kc@W3Q3B4`2&Dfie}Rl5|x4FlNIc>afJWk#OqdW#!KOU zgH&)Z9azl0cOuRfjST7Ustz3xM$qIQM;&+91VFf875%`wk}9^#ShatWpyJ!wZ&;4t z`tM?O2f6*#5S;H;{EW<&_dwi#=?$($hmde_Eb|5OKePRZH0%&KB2-nQ6ZL;Qdw1)- zTI8BXcft1m6Z6om-d^V>+`H0!V(`ydDK@x#SS0MvzjYPaJQ+J>+ehs1cww_{E9!C8 z2L=_+zzXQe^+0qR3#6G&4hyV%I|D*<AuU`pe}0o&lBU@o*ZxS;+uZeC6}K-c*P2ro z@ur9+8Gl%d^Kgg3Oz+L~lz+7mnB*5n4E(lebfkRvZ#&Mc6&Om;cFz5=s?q)Q{Yy%f z-I?pQl*`Kd7Etp!NbO?f`e->br_j+h$GN6@dGJF~2~PqKj_2n{Ko8n9udXf2U#lZX zg`Iw^aqsH-HR;q=Gbi?S=6d`d8%6}6u{S|j`%_CP53VQlBW0ioNpY8+2#0RumWjFd zQ&_Goh(mH)qonMJsm!z*RH!~dw=Us$kKeoEz@O1w4hmvVh}wldQl4KdS6BUtLq4Mj zKn>!c5Y(LWU+fiDGz{$jwELqrCM*8ih}2)#gd5=wOacXO<~}&R2up*J(~sY2^&<mx z5~$w5ogRQm@+=@Y4Mq`{bOy`;a!|<q;<MXzbII#ZD_5Vms0{TRoJI>$qQXg$(voh) zzOz<%DVY9{9bgL7&uf>u73I7wFuD<CUb%U&E!AU*%c6(Ocpp0@`p?K(oy#YmUcq=c zEZ18m?DgIH^cLOL3CWMCe0{#rvOmV--u}HH3P<b!b|kNthJ|He8c^-0*j+*03-}7v zNJ$J6fd}SGN!zUge|@DB9jV?0X%J6n6>x^viLOU*m-S-Pnw{Pfg-!N~Lh!pE`+JJ? z=tT@zv)NQOmB+}@8M#vc=JfeevTgZ70OkOO&Ye^B(FfbspHmZ~%Zz;f5I&pzDP`xn ztC-Ip7Jv2R1(_CJ!Wxhs!Yl~<JW6cceo8VNxf6In`E{YyVm)`i4MUs7UQr2ZI_7&u zpzvafl05mGD3}w$1Em2%?+Jduiv_M{Ed1+EU&?E~DNlbZi|+gOXZI*)&ctXI`eMNE zGBnRb-H0epzX%U>pawJT$4}R)oJ~8GOEE{0{C3T9(d*Tulu8Ka*$UYIT3Wt21Z>Fu z-1BG?(b+-yPMfyh`IC43X!8%}Xh@KWn?RQ5^4oE*yEPPnxa(B}poo7vVE292hILV8 zhwOyqyvDIqW|#M427}BJq}5Typ(EN|Ko#Q)+ORcyj3bhN=`B(-C&l;GGuT%nB~tc0 zYA(-Tj4KVz^k}FH<XXmg@VnEBs%{kcKzgD47=l4yYkT-O*4PkW06fos`5d9zHwtEk zwoKPszb@BXR?3s@Ua2|KPJ)0w4D*#@?glx<?rojC#fDatJ`E-e1dx_sB5YeEDHHOL zRw-yaVuF4;BZ6%VVEE_Jwa3f=!tB<oKB@q#v>_r0J6t>dmEJ2QO=T^h_nFcQ6mlu( z8YpeYNZB-K7uDdin@8VIIXHA)0ND1>cM#cv^WB2+MdI8pQ%*lI6STRZ%ZcvAi9JGx z4tRPY08NSVV_{+pTPfJ07OIv@TkdLFu&emt*T~=0V{ZtxNqd|gFtZaPU52J1lv5}| zG=*TT3ek0pEo|7=27{{FA`6sKnk!)HzK%y$!v%%pk9Bl3ppYnh?B9Oc(Vo;ZtWt=n z(&uyYm9rQV${hmw!hjWr>qjJB9|41J9tC&xajRVZZk;-RJHuxQg7ZLK_j@FVkRO_` zhi2!;Kodye<zs4Z$<cBYM@B|;^!1A+^7*0ExEL_51XA^74h|%v&6uCmHKOS-iI2xw zL>SF|9bY6#s!O>*80Kr*ud;KAAg&TfxG;6^ZLJVP(Y1I&13hoxbIA+89G73&#*rFM zPEIO9P)3wR7eENSH6Go*Cl2uOc;Z=`=86=Qdd%0<X5jn8c{90{jmDxLF+K#%2B+LF zQ)2onL?DZUN}g|q5=7q(00DPM9#&WFftCZ0u0}KXI;V`$0qqmHGv`n~6bwnmB5qNH z7;HKo$fu&g{f#z1=?W1)Koas{ji;va&7gvF8jSw>a=4Q_VmLb3mnB;K<x7Ti9^?@% zZW1%@UU4Fo{4x-(16rm?st8p;#F%1qe-a~UL}z+KqS|4M1Cc%Fxe8I#<1Cn@yrw)6 z3Po_xM}k(}IstkfP}Xn2y!Y$NX<JwFr=W+n#<*ZMbm!d7bO|L<&#hcU?#)1w5Xp^; z)v1b&WATWDKu2E-)aW>=p>-`~1A~r%M&<KQslT8_Yd}e`So4A#aaO)cq@V%Mp}`IT z5=HqvTC@q94gtE-NR@{^5VdTjb+7Qo<%DK8QR`n@u`za+C)*IL<%EYXfJnF{2){!E zBNl2;@YY^6^EO~mHyM$)!Ys-tZO2!b5fT!$7aAam#Opk+k$9McFqCJ%%aMDZgW&$- z=R)}wwjeM;VzV<lxljemB3G{c69`wz`fD(9dzh+3^eXZm`}_+y+fTVg1Jks&I5nF` z(7LgUm;5Npmf@;4x^$7D-BGZQ+y32P%C8te7WAz^J(Ua;QN#lJD)<#f6ttNG5?lxf zBy*+-c4#n^!`NmMfE$@?@)BVvtRZY^D+jRQB?32^Iu~kavi)0&x`8|2A|Q%`#7H@I z$UriCgS%SHAm07Dpn|@9V31R(0b`9+Wx~-9%lhFo{b;l{O{GJ9rH(9g!y6-$l+xwn zxY|PeXc9%vGahz~Kjw_#CVENxc|uTL;FsFNu2RqC`{ah%26#|fNKLe@Y)(6uc%N2G zt3%Tf42A*gUFa*;=`+l3=B+UP{2qDR#O&a}n_=q6;Gpa_bls9Ekvsp0GiiiE?W^R- z4@7sA<@wU3<;RH(R^^TDgM__}bj#kES0Xqk%TcfnPYK}?@b_TY1Y|q_hc%O<pa7b{ zk91vOE9tVesZab8Sqj<@+7s>NH6t+90zLOA>sMfgf}Z8q{)xMyLNsb=Cx@h0)14a3 zBdM-lN~bre<u&y<9kywQ1fyhjkxXU1oP=dwZ#!}Q;7fRR1UVSC@-*_ZDx72@Lt!Vr zitPDrsBP79;t5_J>U*DMU-3_7ya=Y3_^=-N<Fm?NP-osA_~qNE4I6<g{}&3u+41*v ztlS4(7Xl21pGJ$FM%iXN3Q<o8GU^naesxTpdQ|U-R!E{W3c_E`@>5!EU;QyI{a*1U zqZCV(Ld5i$T?&+m)lo#*f^87<R(Gxs;q8%fbtlN%_rh0D&HXfXQ7VmB=&a_my}vz` z*<LmGx&i+C47ai`Q@M`i0np+pCte;btOoe4lrR?o{T;d;?2O5~Xem3$C$w^M&^e$t zWt>(qwiY=r=SZYP)!@0m*sEOq7P~C!NrLFlA6Y+^Up^+3-OP+aw0E~!48Sw_m*U8q zoxBywY~`hTQ(r!gO{ADD5Yfg<{RlHzmh?~Pwx|hXxmu>Jl9(%Pls7R^W5g7Gi96Fd zHfinPfEj*MpEA`Quwr@ifnj$6`AfFQG38CZ0lxv4nJEVOd0c|VS?a$s&HD?2OxO=; zc%Kr@i<t$ZQ5QZP+y`Y$F-+^-=DD0AKJh)4>`3KOjhH8e0}SN}!WK?%G@9S^P9g^& zb_bZ9${K^v7BVHFi(LZ8<qZ4!W({AG47~GApB?fMVR=9PrHYFo)|gOQd~G2OANUm0 z_3cJGe<#&)>sKV3fKA0t7XG$<6IoRpITaHDL=vs#;T$cVO}O|M97igsNBEi0&AA^g z%7n$f1DlyGMlnw*>1OBCmN0ofDm`X1Czrf=b(1FsAii%8N!h}<^qb9|ivmy8m<sZE z3<Upt=xTbydvf@r5nJ~EuWK|^fTWlxFDCSuMz_uJfrtA}1Pg*Y2IR16<aX0wU(tSP z<YcB1_rC0sb5?_vs%=YukMW(IFrn<dZC-C4Dw;WVv}7-x&~HkG5K$Dq8=)BK8xy6# zOvct7WMT3TXPH5n@;t)jpSK}_R@5HAVic6wPaR3|DBx#y5|_L}_FO29ye4+^dYN9D zdoKh#5nC1zP`9dFI^glN8((;~p2F&!B;8y;V{&=`>2HERuIz&m#>-z^T@F4qOED0U z$m+Er0g+T$N*+{P8Xk#)fS$B^ca`+t#1LV~%mVNk-}Ud#(aM{rTjcymT!z;eo%Ayo z{`jQH`F~ImE!}=;0AkO_h>Ye<x}_i`IA$QY0Ns0B2Zj!!M^@jtj>M)f*?))+nn+>O zcOXmEh1>9q{bGeA_%~i(lx&Rx5uKr=E2da2AkqW_8BR$9o;7!D5h^X828$);`_9+6 zvxzhLQ~OO1kif{3&=ypPD-O~Zfv;>Jr?Z9;R!~{vDFIpS2wpS~zVk)0D)Wq(z&CB0 zz{7D40z`d?s1xw4O7+IZRMv&gecz0D2t6&?+d7aYV(|jyvJ5Dunbcn59MbC#U#$0t zGxMaUUjf#gJfwfGbbUSl4NQt|$|*oC@=rB6*qNZy{Z#Wb(x5KQ`Q7}kM4Z!;hmJ{R zPG*uwEJ-|4^J1&@AEMQ$%6f?C9nNMR57MD-3us0WwoGEm<-8t$qR%aq^I4|)wFq|N zZwt7*EFYBWl{~vkIc@)N;IgPClvI420O=08QHq5*fDQJ?wD!j=rj9r+T*piK-o12o z>U~cSVy}$Qoo}(=eIZ0gWBVxd=jUSx(N}AtXFrk>KI4U)Y|?f9HaT-}3+r8_t@9s_ zARM{qdNrMXWwV<H8gk+#a8|ZCBl?(nyCJJN8Wi%RNv66snw9GMHGU@X7$cKu{HHJ2 zF$prQpJLiPcgwM(HXk-xsv|1Vt%*nR1WW<R<9YLjAH1b0X|=D=_m;<bnKxYf+w8B~ zv2WTra`c#?YUq!dWik(8c$_y$<6m-LJs3~s{wRN$hzc}0FsdNVKy+}@4ox+%k;^#s zJ1gF(68t!RX-__mxqK`Ohqdm+H9ent80g0wKC35HC`9A`+YLj4Cr8YbT<wo8Z*&}{ z)LpIQijLH{+T}5IVHS%a^`U(C>oH!4F5~<UDGJKf7uQGDHCygrgTONu9fS~{EHypH z@R8dKcqrc`luI4`%Q#ifqVMWez%bVb=;b2%^fMvS)bD;+nlyo!?Sk?`ns-~hELEGM z$CeyFwxKp*rQR9~KEhaDcnS6yQ@=1tdIgc4)l*DV7fj+$zDBQpja?K`snpbR`N-Dn z<8qgXJQ|nUir~cweH@A~>5>m#PODe2czuBJtVRZ+KaNL@TH5HMc<y%~GPbZJc;=Z5 zynJR?CO?Bu-{0K|xiP0G3zl5;=5n7i;>ppI#ohUkPDg#W>j%byn;?isOOODmj+TZC z(AZAAQF`AOk;{NBW0;Wg9#YNv0$cLi_aRb0jlKSygyT6Y0-_+{ITF&T$G-{D_YJuk z!*?h)Zcz$22&ndr%Ep6ol{g<So06ptfu?jKsdF}=MDHmFCR4jw4(*!vBKhGp0Ta{H zw9j%5N32ah*undjme2zdm?jw4DkBAkFQ*Jk(E2=7mm9prq78!7w2i}A)xt;-ofy`k z5L>=#Iaw~DoXBfxS)mYk7i$#)_i-oCAVKtAk-?vZK~7<Gv#;1HYIV1v1upF8anx#Z z{q~P)NN8*u&~WAxYJYYn?KLEgi_sm81F>sFb?kb=B@L8EuT+<_1YjAH#k(<e3A<s5 ztdpuoP~B1srY~A?ku{6eirHt|m7Wou9b_2W$A;YsM2mvSOCF;1z8Z`)@Z)EQQsox2 z2Rq1TJa;nu-q<W#;9XAjma)AIOwXftCaK&tPwd~Q8)UUTn7A2d%XBI9=JTNFEdA$( zCA`y`FH~+3pEu|8*(uWA6cp}zjNGWkX^g&ZHL835w$a&!kL|pLB26qhE#qs)x7I>O zyw*3D3XY9iOT;fkT&gx*BhC9)vRlZyQ6r^JD<iVSqh0Ful>LJeFZA$x%-n3|%pDh} zefzb2wofT|n0sFL6CJ8x4LWnyQH;_Mbha>)*Entp7y1p;<O)qM3H~`*wyOE15FCJ9 zaovEikZ$J2iepC=sKA?JqQX8G5G{6f(n>PZT!=b|CVca_v~Pm5MAeM*$!LSWX0)qq z8~BozYoZD1@m@l=a*1zt(WeS2s+UFlI!_lXDFcW*;EXnSsY8&Q&e`aO5k)o}7rZKs z9uzVEDn;4w&g2-KXH=tFuv;_)fpE=_LaG<mgiCrHO!1->$xS=hb?0yztKI;;sBml6 zIpx3xP7)nB)~uBY6aL;3;p0tl-=&=wBQ;7aOvU|8Q_a4uc3eSwlY>Me!cn)zq?p|B z9lFJ<U^7eA8c?Fz(=gm_YUBrMgDxzBicxdpwR~~up1&0&*CRlqP92CobFM!)Y{$lF z(xwTzvB;F<y37WN-HVY;F8}@~M@`pSXR+PTzf<Fe<C!$l{$rxm&4Qi>SGAp1iNt9M z$Jm$n7Up*EwHA+GVa6Dv_0MUa<0Nx!Zcxz@?jMVECJwe^y<FBC)LN~5bz>ksOT8^4 zLA1JI$uT9DcXOT)z_~@g(HmmB?{e73iqTNRL)QAOwZ8u2sK%yUxOloBs_Er-iV#O> zq{lgDd$^{K$Qis21bY5AV2OsPZ|Q2Za|C^yigRw`nt8T*zv9deAlrk}R);~SGc}H1 z-{i!V420!88%EO25-d4;TgMO@bo6wN6UQPuAi1gcG^d^^{LGS@`j3%n>+!;mFmI&L zSt>(;$Sz0@iWv73mz@=Ov<$@yn3S>W=f>v86T%C7du=HPPY}@l3Ax!blGf%Z^yL-& zv8S;BZI0)YC_s6|J=dr<y`wNa<jOnf=bcn@ER8LDAmDJ$w+L_k1-=oX{RwrB_SrcD z{b|<Iu-wNkBj-%!SjF*|=27!T{zqpwJPp74aC?c<6K`sVuj4)lb)~z<^|R8uCVj0y zEI7ID=wWlFWguYp8kV|>RX(d?gV~bJCYLB(x<lo+W^HSG|K3_5tr*{h&hz2pq&4C~ z6(c8UB!@n^Y{QB<?#x^r!Z!;|I%5_ra$z;IKTl#K1YG!Il3mxkBm0hM2K}OB6)kud z=RI~cmpR=ODN4x?LbP@Sy?W@Mn)1v(JY}L5ef2n+2|LY}cyF3nzguMM%SRUn%yZ}0 zM86EuzJ`o7Dkn<z=os|Njm`80f1fj~r<ufGb?cfmRGLDB$3fc?ND$sC=c5hRryK$o zSF2fZ<b{lLqn?e>qvAMY0{2S9UJksj_x$1G^eqP8Qh^7M$CR8e!LtW6`V^_nPtmiU zb9BaGJ<OJnq9&`;X~ar8;~kh<S?I8BNQkb0y3WAgO1~+!=4Z~4qS7?BpP_!j)p(mw z!=fRO8}58z21H;ijeaLH;A>Fc^^}!y(3)N))%%LLMnO?gW}u2aKqYFDETnejk9q-_ zjpE1eT55hYwxQ2U!*Z?i%EY7J2Mzw#il*L>9pUSgMpE{lew!#l9-^DS8765|V6T;j z?lbecKCvh-$-e_D+676H{^DFU`PEww0gtb9cCJ6I#YCn!DR2<k6bCSoiKqniQf*oA zqIS(vvT4C(AwVfKIH0W4&<n@Zi*_qi#XqIEZc=QpM#AVr^-D$CZr5?w0vFX`c~XZ! z()aOQU^%%l3yz64Y4BxcP_c>~udC#hO)Ntw3NR^!biewK<sT=i42p=EpOby&=p%h( zxKuk{Do|*~cPUW^h4)Gmvu^GIsF(~});&)R78WkEzfBXk@!r_&_auee){RGheJal8 zrRJr5Jf=8BL*P1Ot6<p9ZO%!Ay2q47FKMu$KOzUsjT>Q=^370#vmDST%d$QIUsq%- z3OU}^X>cu?`5%yKD$Vk020{_tS+;k$fx6h6j$p(lLIPZV?JT{i;qmu4=fd`Jf%t`9 z(Z2Q^AfT3s&1F{KzJ53;&V%R{31?6b9vN1o4XK0-CkwSK+Z^iYkO#Ifa!%8~@d-1n z&Y&oMsW&2iK#HlMFVh?}ql00*AAwhKA>30+By_0<VP`p7madYB#>m@Nxt`0)4Fmfc zB7`Q<X@<Y@xm_9qF9%FvAmBdt=Cg6T%WsBgUGCV`mGr5RQvs`@vf>*nzy8WJ`GDal zx6}4zLU^OC*r#S%j(rM7ZdyY|n#rYZRyZdF<Fh|R{POhiiG-AHOrpnbf(Va3Z}XeF zXtua0vx;*V_fwsEiifWeN(TU)5RF&t^zhu{3hno541uoODu~=le94MQo%Pw7R6O{b z_SqNivliik_EooHErcva_pfT%ekC*)PsVH`zJDj*j3JluNmOYcsA>XuLHO|%rUG89 zsfCMxV0N#|gz%$TiyS1ndRBNyr56s5Fc7;^qZyB#uXZKgnAa;TzjlA4Xy&H0qImk{ zI(vpu{0fPBE5Cks0VD{qPw@Q(fV7l-etpche}ae*kKUepv-Yi#wO_wEYSOScW1efM zX?6)cBS~!vGo)gh_2*+mUrS;OuaBkuL^!{X&c)*F0AF>hLRQD~inN4iy{+=TJz%R0 zpt0q}lFHnApl?_@$j;`j_}U;Gtg9Ur@Oz7hB8s>4Y2mjB5QlY#h9JUC)xgYCzHxl8 z#euknQwI+}<Ie{h{ib4DMjA}q0aZKMWsK*emkyn6*58xbi?cm&T-F2+h%$-29T$wQ z*R~bubK<lZ5uq)nCVgA+94P@^!0#Bx=xaQWPsMJ$p$nlxrUTg$-K+0bO8bvgN_Zdm zNkHwBa(gZr+vVXgQLEu^N5uv?&vFzHxw<SZ$JNIz^Rq?hf=c^B?qE%b<kfu22GY;) z0NLc*Zb36T2oh4eM`OFf9{)`>rh*fA+4d>yl-0W1L1F%>Czc1I?X~<exW)V@JGL-Y z;vQU}|7vkJroAqvsN&GAUQMDl8mCGFMu9uDY8^*Qbd0~0IplSE@&h7z<lr&=9*1o} z%Z_JHSz({h0;l+uUW05H_k@wkxyn3OwNgElTf1sEKNf0DOd276T3IZkp~5LN8H|@O z4kEiSSy*7US17)1sJ)J@KZ!DUC|Vm*99$pqpbXI*cO^y&%VqaRIN}-q%^%W?s{{(X z_jMFQKU2734D&aNzh9uN@Y1_hUWEA~*yMpixLMjY+maZl{npYoY8Rnmoz{TFo9nRl zi4q$<@eB&oe*c%0kb@ZSxkpQj*iZWR5qqbE>gfc~i8?}(hJQ-LxmrJCmRWS7LjUq4 zj9{~Wo43>7?Hxucvw;zjygqak8|-frVxL;wKhIS)im6<@^4^6t77fQi_0?8#^J2v( zxUvwQOj3%|xZ8@xUb|-Zgv&qs)5bMHz|qZz3Sqnw0-xlRR1sPmcC7fP)i()&fhSud za*q+9OFs@{QkP4A587%mnqB4l<C_a8#>|Cz=03}Kgc!p5^r$s(5!QDC8sE=82R99> zC#iTkuUX{<Ynn>I=ctru5dHk)n7L4Sd`!XZyu%}Febyjz3VpW0g<>0fNyNVi=52B6 z;z^<g?x>%svn`uZqv7tmK^3Kw)n5eRQ-5})2p@L|0mD?V)r&5jD?()*h%>e6(a*;+ zD%Sq+{?Lf3;b<>5v(z2t41KZD+~{<*_A<5>|3({+i%pH?lyNJeG*KbU{>DS8mC7HX zK?Qo(-4p!c!orA+&CTMxJgERgd%vjU1w%(*qqpz)VX0~Z%f7ci0)7}*&86R!^j9ZT z?=6-d*x3niXZP;F3MBtjI0LDM*T>l}sR~!ViEHeT9;p5CF6}A~EcH{ZewjU4RwF9B zY@>+RXWF!Azq1hY^Npp<gAO4$OwnZ1u%(2nmckCElK-60?%gX3>q@iXBnKW$(97%* zM_R~kX!ERqgA9JA5ED+FbN~A>QIGyazfF;k@w=qif3_T86m)5}-77UzuYn8~bW(Nq z@F|7bZJZ#7?w{ne#&}tytT1}zNdwmkYnX30$c=;OztwSnbEwQr{B-dkjyc&mNY*wN zgl0E7TU@dB+{H>eVwm;?AGxOWgp!s!EfxH`Gt<e!Zns@HGMeDks8W(^$Rd<$tjnk} ztM#e!FR~5#v6Z?fCfu9O<;LT8dxV@Ba&_c{S8JwuTT83#%BB=?v5g5Y&^k=zz>^_3 z4}TQQcWTnybyH#4;FPz8u)PhhsIwLp4n+kz&*=qmC#>`Fi7@RX26LtH7^W<d*HPPX z&ogK_IiBQU#2Vtz>~_L9Vs<J@pN`I$FC`$|Hsy^J5G-f$+mhhe#G)bgbKL@B3F7c1 z0t{w~8plro&JI0ll|C7D(WPI=nV(<R%RW)}NHK$6E;!sMSg0VAQYa5=r%S?NKfiM( zaesva)3?dTUP%vAKB2i!c}NisU|{or=SQ3V5`6R?R<xAQbq@zRt}ROXb~>|m#OHE# zfMZ=>y#Pn@KToP{-jQ4NRQ--4&P6uISI01=v_w);-B7kJBehY>kNn}5Kn(#z)Em{8 ziQRV{_0HwLy#)Z0;xilP!SDzg(HoeD!slL>D{!&Te;bX1hMOA6jV6_KE5GA@(MG9C zt%TRznoWx-pdGekjMqWJfXJY^Wn!H*Yl8ZlMF<6TzQsi3n8^N!a$a7lAU`4S4UIRh zPrh>eF<^qnnPo2UutN8_Ap?h75Vr9_Y99SFA&ahRg+-r>xE0ST8`Tv_vp<XnYUHq4 zaX$^qK2)AHr{(K5p+-BDaACEQ8b`yey>`Nz^=Zcai2jv`Ipbb)bpgD}Q#JJe$Jtv& z#np7-y3jOkjVEa1?(XjHkYIrX5?q42TX1&|?iw6|LvVL@g1ha`_x-x}e{RkVqX%pB z>QyysmCSmdx7dwslQD#oN(IA%giQ@$3C-ep2*Z1yC+yyNQh(b9k+*X>9yMd9B?YiI z`q#ffal+r>w=^QyBcF7#Fbna3zf$L_-5t3;-uMdNZ&6OUcK&l|dv3?%@BQ_^>gVrT z0!Kr<aWIjR3E=`<E|mS7doW@{z3z6=LmDm!Y!LOk;*5`eB}{k6y@sU~RvUGeUIb_A zE9^dJVLDb)n2<zP-$P0X$;~pB8lvj<qiTym8#};;zBgAO5sL?7N82-oW-LUifd9gl z4y|&{Gryr1Ybzm?N6o38b;$E_?SGg!!&jpZUS=W5R3^o>m)S>+mE}uAN;YYZtDDEp zftdLWrY;&H!ZJi!nIF33+P5l^tw&Q>8K;Px_1z8{mm}fp^#h{hYJ@%pYc2l<BfkNx zWfj$gF$2{D$Vb9--gkOL%u!ZDi3L!GIu0|%!D8m5C9@+7d<I8ByT>-@G=V-shyBgb zDAyEY^S?lrq|APGfelqKvKwbZ_DIXFz_*02IDaMY{_Yh1@fYk4*dfJU54HGsuJwrv zTqGckvZ}~{o%1L0OGWt4#BZu)@Ev2@eZMaD1GjR|!j;IX?Vp@)PmTngH9y6JREGS7 zAK-MsWUxQ(RFC3|zw02yg}iHdDw3SaS$HGO(=-{<6PS;6&QaH<a+CYMZQ%6}HKHu2 zdgE<jLv}wO`x!qO-BT%(T?gDr7aiM59YwbF)RqfCTj>1e*XSWJD?dDF+~wO7a+CD~ z9>e>cl566(>J?hs6W>^NN8<>;aU%AF^<L*Gj*FV0K#KEBqShPzuqtk=$~%$$cW<?W z1{Volme3-Ca$?ya*=8#DMKs}#fTu+>iDis`X=ne@kp6TOOujBFcVDCI#oK?i6zwd% zMtF_7`gRL@`ZJ)7nRz(AxsTdvTqvg%Fd>>q&Dj2+4owM)J}DDB75<v7mZoiU?HX4f zRF9(5w4O4u3zciUmg@0%t!Xg}@RH9e-QIaX-*~Y4j%<#}xQH;^*jQfBE&oDtGF2gx zeIhC_x5xcV24abPgKahnc68lVY*#9y-N2ZFR>GK#9H0sm{%{gfur!c7&Q1l2w(lYA zc7Wh-R9rvqPHVU%3F01qN6P=w^N3A~V=Mg}M?mmjvHnYd!$zvooC+vQwLTuka`F0U z(^e~2T=M8`quypy@Ui{@uj(JEW3&DbD7_7av1U-pvG*;54L4ueg3-4TOY+ZJ^cwPk zaRK{%$FKBDkB#%wKGc(}(q0icJiZcTSE6ORhDo|SKM|yjSx(c7sSbQk6+>_ev=t`G zT(UetGOs_WCb+m-qI;ZP7AP!uZ~f!&;{pJ!0!n1*Rf+XDJTCKvK7yf%e#z7!pudyN z|5XNvu1ZduMui}|vv&(8gN1)E{479tq+}1eK|e~KfkP#f=sGl_UGVLe+p*JezZl#Y ztb2^>7@;}uD{Q91t#KCM7#O{_Ot9r9#ff|jU#QbKza}C*xY!i#*Wscb@gWWKpI!ip zJrNTtxi`1D8DJ}g*l$5D36B)In_MYR4TkqBMxw#5W^qgL1a2SOFEm9w&1J-pV~ehW zw-$PEl1Gz>R6qC?YCEPaOO0v8!JpqoM++>&{l&BVxAy7@1nJv-B9czmp+APz3fy3U zGUvlR%1h4Z!g+AFKYrT_6?{aKNhm8nRya-Rm9P{(eY+6B;52G>Ja|+XX=(^~;#x9Q z1LMQeQMPJo1AI9~P`bywyGHMvVov+~HL#&qz9%a4;`_ALD=U<@Lt%1LKU!C-cY=aH zVN(bB8WMHJ0G{j?%D#hAUelHPRt0Hne~MOnewf7%p>R-ZT8br0<USbkp)rg5h0w~N zQe8N3j5<+S?t1)Kh4yD?ItNOKr2Gz~ev$EjfpD?ovZP+FB4W%$%20D|{pc9@Iv)W) z+GeS}ul2T>cJtgiKBL<1cMfC;tB#(0B@)Wq4)+&~%h<0^BD>@&KJ(ZN7<>KIM$>6C z4}%v$z2^J81q;v%A^m_(@A<L1(aSw7MBj5WUkF45Xo2(X6+#;@iw@4fKg@5Cb?H{3 zV3kE!?F2w)-aS^P#!kcgh8cHuu$pjKAk4=OzPyR0;(A}DRnrlO7Hd;UT%t@RO&~Kp zF#gG%>gIPg_Az8pP2&s@1Q3P-Aw49R(l-@B*nd8@i<xoT9|*7}gKU%kQNJ?6`RW-S z4U4IZz{yb^8lV;8-CsWrIg7x$cj7sEgu0(@G~Mn_g%|I%FvkQ_-?Nc6m{w9d?7DHf z-azKb%*y8EW!B852)i^|2bD%&?W4*o!RW}i9>$LqoWT5cn1|Tj4-b&uPKMa&9Ss#U zrcm_Zz3EDc+}Ogvd@1z=RyfT_4vc4ElxjP2&&STq#)}+bPfS6l_sGFK+a{DXP#p(J zGQdUmj`$dBq-u2No#WH&7wnV{UC-nGhlP#oF3*B@!YPC|%sn@cneCj%?|teSwyoL` zlzB#SdKYow(#&Mok^_6aaQ&P|*4wYZ9iKl`6-yecp}{H>O77+%(+s2{W#++^dXRyt z<~MRk@d+QLGq|XT!~a6`vk_6s4n+z4Gq9o$YpQ_0Y82!CB_?7}Ei6#ozG{RglP6de z*9H6y`?}T$+Yj#yxx}EmPO*ZW1l}f$yOCyQKk|Odra-j9+eB=HARr$vw)Lpb<4NR? zkvokPVZy2RdsgofYWdM-sJs0Uf*Cn(PZWJi(Lz4mI>>a4e>dg)5E<eimigITXINzV z=9jx^|Hb{yp%RtyBqNti2ue9*K!2SJQnwxCs#(>O#duLcB^mZZW_I61e|``|T6?8+ zwGpJyl4_=(E!ijVMEpRL)$`Gg|6|Q*n}=}N8O2(w1sAPJ;D>AMyK7PGP1_L2ctq0; z0FgX?iQX2rQAT3JIzn{{8xRA9uiX%!S_J~=n1cmT9LrUdV99HBEX1s?qJtlggsJ&( zCnE0tnXbs+9r%s)dA6az%Gnq~4ET^$Nwb*e7QzBTyP?{MnnXH_A@V5a!+~slr9aA( zwhwl4jsCHmn4u~s9ZI|6aw<3xk7m`39rc1TQY49WjqRv-LKjrao7}s;9SYR`)HgR2 zi%=I00=9Fi9(t`N0v1?F{i-k;AstSZujPpdZ)?_YgT~EKYCvQ~tFy!J-4Z@F@o*T^ z75d*eIhqR^$NaFSmgYq0u~XSa=ZXl?A;O3&i<X5;Q~a77aM?^%<A-q(q8yBkhRx5= zKk=5K+4)gcLtS0``uci$d^}so(b4gbD&I>O*-fCV7?7YO9Yuz}M+mTgWmSyZwbGYT zUwxoWk-~hX8~wuc4gioOH9Fhss%#*Z^M4kcelE0_tC((ccRrjgCvZHNlw9%l5Xx%4 zU4K!JClxCo0(I86!-&kI0u&(9rH3*Pr1-LosQHy@XOFRvigT<FL6w#d3-VsMA|lUh z*AfQIR>Io;oFD=J1vo9`L#xN*QYqLDePtel08H~qOJOaln80KShXF~}v?^pN4fi-i z;K$%(<9u>ZbZd7?AT=>sflhS0Oa`nHM5;n-d#Or<z?0ayzX<)+e62XriUdL>^ir@C zxI$f%&+>iDshvBD@Z4_k`06JDp)4l<9Y%0;l*RLJehD~1Z2l~JdE#p4Jy1ZG@JK$( z(&PIlT*2<|Fge~H6&ib}TqGc9C`<%|KPns_h`!lp04ooI5(sW8;2U6&^a4FZvX>FB z(B{Tv`TP5TfLsjlyDv4^(7r<6Lm5~PryhWZ#xRSv%YGzA1_56W{iCVz>&Vlx^rD^5 zQwOhoGDy{n?f1)g*c;<P7!iR)Z`_m!Wxbp*Lx6zPKf<A}KXm*=eqctsM-?RuLHzNE z1X*s>_?%aX>L}*%C+qaOve&?!z-`iV_a!Rz@<usCXn-%&0Xh)oF0?5WBFVDGXRNCq z2VS_AkIff~EG&JkG3s3GMguPV$m~+O{8o`blnRIa0Pp`0CJ!cY66!s{Fo%aW1C4uG zb#JhoEY^o>+2~5oF?z;lu5~G?ZkTkw^$*a(j`vx%k%-XX0M?0Q*VM4>j!AhSg&3wm zkcHTjTuvx&E?6QmjYL?8P_EV|NL(&egtX#%)q?kvn5xn=oFOCQ%8wu+t0%TNae4B} zqRN^)(Y*JRZ#9o?qdUlbeKI<spM1C&1vHAShQxIo9qZjhu;Be~g4tR;3!h!eAo-?z z2-!j=ize*)<=xEZ)Wf%OI3LhY*xt|MnFshuCEso?rl*qKG$r{+Zq|O!nh8Yv{8qw@ zD^mS7P0lc|c~3(_gT~B{3^)!^m<>8Hf;!v!+wu&R82jtn)1?SJt>m-MAnkYrep>>E zKP#$%A)oo(JMrQA6VwKXLJ1>e;l650rg|el(QM%vIKCl(IgTF6RvhCXPsN9cVK!DF z{yDmlKVxZLMp035da}D4dX_3W3ZZ6)T$cHAzNd!%A#*Nq>bn%$%<#ds=i}5s`#FZo z5SolHAH$v>#m_M%-}f0vVLyD*u`sWtkbx3!7?<irL`bx=O>^-<17VPm>V6nL5*-^| zA3wluOY-tG&f@7Wa4l~dL7tmC7SlUo$3)tX(@3m3V7N4-ZC(o!5jyc$)CfWaL(GP@ zUre%qp|WWnA6pPMd%T(<l0Uz$Y{(a$KZVglKson`T^*ufF8D9q2s}RDpa(C*o_4QK z4Uh-xoKhiV2@iNpk_Ljcxe}vbXE{Kmb9;ne3Xwc+;vBKJZFgdo_>JDIS@4?UtBE3D zAHK_qQ4w*owwXU;dfu;|Nb34t3l>Jy*wg?R@6`&Yp`=^Z9!%R<)(t|fPV+ckjWac3 zM7u{*q-+nQd8b^-OfJIMSA_lnTEudqG2et3L1eB->IScxn%Z=a*R5K9-8j&m#Gj#4 z5PohqGVl2>J72X)bHH!w#dtit0Ry4ALE|0TdPf=D?=}m8V!qwq!iCV0?8?U=x&ws# z4;L|MDp9G{U#HgD59%V~4(`j@4}Pv=z9U%><rm0RLP#6!e)^~){{d0r#N#gjDS3HW z7#}ZH5pLTmLLhk%CZ)9i<Gqq@<C4P=VukWWcLPDaugDkB_+FF%gIsKAblFj3!8<T` z7sl8C41j)ysI^9qB{e_caB^_))Y?(b(s`0hpod*7&G|w9SR3$^5wbTJkltfvMcG#h z#p<kI<%J<63NQLD(rCSM_YgaSJ;_UCFDrjl-vWZD@1!;GsnNA3d7h!Pl(;f(8Wr92 znRjjr;FVuzbE#uq60>&H*|qwSUiyTdjgNE&nV|(60;?_uZIo5`5SpTV(!K3TCg=1# zf5wMK-%w{O!hfV4^eT5UjLKNsJUqllfJNd^cz7Z2aDQG(GGk*Tgzz|zylUCsb07_n z7V=Izgs~rWqm2E=Ya_!hDl#%Vl5wS08L;r|6N5fz6B6C|PL6K$&?Vn6++bgIaJ;{v zhHkv-&8XL<&OX~)!uz-$Q|(x`o#peb_GQI_G^Mp38x?x~>u#2?IgJhAfsg){=&?s; zE$$=jocZJRV!OfWmHpadSQr#UjJwlr6#qtA<n{Nbyt1Rv4k7gImQ||9llv{CZafe~ z>G4c3+hM0W#Ew^S-TPML$EY|>wD-+}Gc)I4b9=?nC3p_<Vg~{yMZUxf7<GMD|I9-k znt`tN0bxH*Q%Q~&ukMh_k`MVONxhE`B$7D{*NW=MfGf2N(Klf1i?pYgq5};t3(*6y z&X<<CwQF7@LqA-EcqHgY8-v-M1$o1*Yqf_k3(ptnR=Mu<ZV&Kl_7AwnQv<p>!?ly6 zAD<N<des%kUgAd?OiMnTpxjq~L9>k@k*seJ3UG!?(jAT~Bai@o8VI;a`|bsvmd`OU zgfD->ID5!#54zBXkyE0`_I|9<hp<J)29T_0Bi49_mG0qDvw_^&@saguY24DO&Gm=P zZLY+3OIJ3A4+V4AY}%f`Aa^IA#3K6=?{T$_z?Ja>KXYW*R|V`~x<H(xECr#s*4h!^ z>TE@TrWe&&<O{QbTaZ=WBzg9jd>cfB-j->AIFP^y?S-i_*J2sfZ?}NadCJdk%`>zD zL8J_r?aG;#T@LqFyJtdD1AJb}_rj$L0{}O0hl5cJANJxZHx8Th<{g|yXz+NCslWdn zv@2Nkn*(L0L&>+0l}idnRaR*VQRwml2<p_bXyXlJQ*9Kpv%atv$j(pP%D%M|v<%T$ z%TQmVizi;hAjZfXACnAHuf<%*i*&D%;sp6TL*je5=Dk_NQZCB)@6^HHDXC~)-*g1n z{CAH)S>=~&wVS269ey=0gpgYP{BF$g4$opuNPT{I@3;70OIyhD93qD0#X_1doxvh& z!}j$tXx#hh_8T!I5l(Fbas5``Ww!|9zX_`BOW*|=wu~h%l|rb*#Vt|UWj`+EKbW9@ z0Z}5w7@Zb7|Nl^(KlChD?*88(+rRGk*N1$Fi<K{jDCys%+J9e*$N$6YT1iZh{9B{< zueGmC9OSNF{KWnVcKqwYA0Zzn1a*pE49OM#zbo}mVulKG*GXWY<^Q;*V*UqUtH+S^ z{=X~rPrWKa?wXH?wD3Q!Wl#Tcn=&U4`!|sEZ@s8UD&(#*SlBiHFg5zmQbMZrEa6@7 z_&<thhM`mAMlN`>NIgA?>7?~@JT)ED<x?M-Ia-kYJ1Qi40bf@C$MIrm1sadue}oaj z{y?4?-%aB$vTR4x=ppJfr<dW42%Qyx*{d~r+ke{&U@%KAc))@Hw=5jH4~?)LB*OB! z59#8O)$>~yO%6^ndi=Oi?q6inI)qO~;IY#frvk|+8chr-7CZj|5FyhCmcg*=1$s5{ z{8(}*RpmicTE4$r)<!99uU)128|^;p_5mA?Kj*s2&s&D8CU3%w<Yf=L%&Pe?&N z$oMgwJ_WA(%g0S5+vv|DzcJVN+o#QTC9ogrkJAVYBJh>aPo>j$%a7_$U5St)h`i>3 z;#J}Qfl2+lPN5KZq9F|cjS!pT|IJ520g?XDbz&+~ME@hm>mrai^4O}3|G&u;NYepA zS_hKoTgU(WsegQiJRbzR>J$}?`(G^p^ruX~Pt*Sb?*1dQj0Pdud|=>V75@kH=qm<- zP<Q{Ih4dNowGxZt0~@7M)dPRZI-HoJ^)+Y%J+{w9eq+J-{hI;&=R4xd11Vn5hHZZm z<5Jq^ecF!iL|o85)~?s8!rG<!bTD;S)ul!5bMM-a|7p|opRY~`xzF5y9nbQ)B-Mj3 z&waKNfji=9ut>JP#6Nhn|0vZbh-4Bv>E$o<4AaWzqilm=-{U{j_WxBw*@6HTlFw0* z{<mMOeA8Y}XSmA$gD3lUh@#<q72gvaY$Tac{&L;hvgvKe^4gX-gjU~qgU($Esr$_d zEGu7r5^w&|MhLR2Cy@P_4<R1G*Oo_t-|583&HQvWkw~$+QojVSeYwGf{ik|pSbR?+ zT4;=QOJ?;Mb97E>D#kRk=CYY)G^;&zAe<wOCjj-D^DBgYn_4cgSp0eu%b%&XbVIzD z)b6eJxI1En)(6-BXP+<9iU@y})R+F$EAw~}pq=T-v*L1YM?@Tq@}~gN%z*a`Zx2CE zLCxjGybz<WnS{D;897enrAjIAf2fHI`Sm?#LFo?H{dy<*ALreb;|Y623)aNPkZpK~ z|D1B`4Pu7JwLdNY&Aj8@<Y2I}%nuU&WywEYf}93c?<^pE8lx|lOBG~iDjNa#G57VS zI+}H(=>od1NJ~f+76bxY51T^IOAXt83C+LwtzWVqtBy9}&aVQ2@_jB5(p~ml{*F=B z*ZI4TEmgk?fERSwAWERe1ti_!{*?l7P6=M?66hFN+B%v%f=WdN@KT>`siRX(z{w<j zY&n*Ov|Sn|=xW%Pm(XJB=cEiLh^1*5zeEucFifhG1*Lg6O`5X&_3$!^Y#~a64`^>K z1jeG04V8c7N`QW~momC+ph|V=viUOmoK&j<Rno)@lO`p4gPi*Zl~P5i@ez^5Y}##q z9lu6zo&Rp5o#o7-@4Ufk)nEca)kQWCEk6buiz~fwo>+$7!jQcK$dhy+L1xG3h~_}( zeo*xN^4+C%_$4Fw9iWz^2_OdD|4q#rKbAeGQ##92_SMA|uI=L7_}vdXWd0&qEBVy4 z?|IlD8e(5-eY#@rTQ@$-O<TT`kn_6JWYNP-8UXaYi-0O6;d7e{qvS8JiU45H1GzIv z<h&1t(_e%RApAJx@OAj-`5$r-jKgRN?|VUZc2}A;PCIve^M@oX;C+FN{begn5$(52 z)Ca|ldx=z}S4hA~u<dd@>(%2aiL|Ht?7v(;A%GT~$VXaTK<FZ19Ft}tN2*^>!RY5M z5y#aufytl$*`6CE>Q2?0+NU_Stgp;00^Z4IucL|tvI5vD2c!?<Rg6Y+XRZ>mmgP&i ztcInRRHzV|!bCcP-ns1$sefJ`c-g*v)GXpeY^3soW+b%L3?7GAkU~SZG(cV?dnjy4 zAIP@pd_8P7Wi<5w4Hq@A4h*)V4Lq{qEk+3JK@hlq(BnI4?wBH<OBbgmZg#fh*Sb*d zWCD&Kg%0c0ky+&Ud`39FJz1+Q?!3{fgZTuBCTM@EJ~gvt0|kG)kY7_vOAQQ)_*uaT ze<iDjnZf9*w7!wU;_q@|_)_YD9Fo{szm{t7H>YRa2DhQ7$d}H$(qt!}H;G$>;*!AZ zyI8UvDdzBw7D-;VvwY8d2yMrx|LK#(K@OhTgtyS$x5UadF@nZp3VLN5MTc=cY-oTk z);c2J^}d$4znfD*-VKqY86l^y6#602lu+W4|8t-TQw5$bGHm;Kc*ppZ&Dd~rEe{AN zm(Yo^1vio9eWeMpRLVU(G%qPCQb~mYq41dWTyK-v(UwmwrB6&we(B}9VP!w)UYi_w zWGZyK>G##(0o=gDLO4qXJqxx{*{rBgd0I)E;WCNs-yxj|&K)9-GdNe54w3sb^f!CS zK0?d|I)9){yMzi_>-Sqs%}=9d2R6(eA~8k64s&%xsIb0zptG9Z&J<~d?6h{ljOLlS z*i7~L`k3o$vZV*ePGyLC*C5_nrd0+H+8=XR7-7ED8v_1ha|;WI_CV?jYKW|FdXN32 z(@hVftB>nGI6Y?<nl9`s12i|kc<+zH`79j#M0kL;koKido??u=ww1>Bp-XMc&$Z|T zkkk;uxBaCE;`T!ge4#4s5sd{V@czgX8GTM?)ax1c%FF!w9WJzeW`umj^=;ap`_zRB z-<zBH4krub6<EMRaCJuDlkVthb>KQmz51Q4Z79grpIsxpl=8wvoSRRw6LrtLkT1Eb zE0>gICwB=E;ER$?YB7lQX0?%C&|&3ZIxolI3;EuV1}{E0BaBCG4fO~3KSPTe)}6~a z-ya_gh)e8bg?<ao8x%DjLaHf_ghhG{L-pF>9b&tn=F`ANay~hxoLmNNOqZAE`>$sO z&QsD^OsaGFiHW#KfnwO962@}{5Eam#IqN~5H8n=G!*w*t>dw4FeRLVq<IgD&0yZYk zp*^fG^Q>h->FWd1$$YhcYHDiHj~}|fShu~HF2gPN-avqufZ3sl_j=Hbh7n~*cVD1_ zGfT^nwo8%XkL&>i3qkLcH10!GM2I_2AVa0|7|ySx#>kM!&9EFXa%2gkUx`Ft`zlFt zC=DxA0rG_iaJCh=`|v*Idg4acyHe7brGY>iCD_-S(<o$J%0mG39LQz&S(3xO%YL!l z(|r^O1NnW4hpIqoft~br`%dDz%|VO(7HYy|t{@>){r%Zf&j?(>C*<b4JD5o!w6`m= z+0~S}bubcc)aa|Bses?d2`%rQSJogBpyJ>7Y;_G#z*%dn+^n_7Sht_xMFsl^x`sZe z(HQ`WK#468G&SUT0%%m>bQ)`-HFKFjwy4l{P4^=$$TMwvb+IS67nYo`9w}EsOLA<* zdD9nRQeDbp0_p9~^|Ttg8`>*Jiv=aq&7m(8q+s;L3k+W$hLco)J(FYKTbbCyszE6c z!UR&jFjNFB(N3xL1YW~QcZYVBQI%^?eSVRdIm)&=qQoT4^itQZFfsW6pSaN(F|vfC z*Z?94$iO6{xc(eyv7g4UjA!_1vsU4evG$Q^c-tTolF3OeAOWj!W4LqpdP<>ZJHL9+ z-g_FjT}1F+{Vp8dZxp_3UXAz^iUnFC#sKa|sarbB6Sf?#3L9jqqOC}fh=MHuV{IMD zeJGYH-LgcJGW`OH@L^(<>7{{W5pK(JowR%AIrof)hO6I)0(T=GmZgnWW{ZkzB)GB6 z{4oLg{6y2YmkMqP)hgh)?qR{x5m@?zhG4_OV1rcAEXMcJ(#Py<78JqC_@eq2rTc^2 zdy_Gbk@+S!B;t9zguTXSGZ&B2tJ%zRHdg8lcLGgkO|%?erlCrV83Px>wWs`F?~4=- z+!r1r-pWi-N99xy%0Gp@dPW{UjtbagDz15R1d>xdKR%BgoX_n=&zX$>=s%X8>O(Df z7isl0DUE#4zPB3OjTaTfgQM^iqN0dA`!OXHSosUeL|hHfjWenem)j);3c(m3RoUqh zU1b^&4`itK5n<bXd<byh<Ra98_KgQ#{U}+3!`;$TTxb$FiMIIJ$H>1!7GH?Jh|6DR z19QUK)aW*A&}@qJ>(yQ`P5#t84dcBrun+A(@#lkMVdEY{PI*KIJLBm}d7=kHv_bDn zwi;#DT;8tmQ6tA>aF%xp-TMX0wQBl&h4|jDB0?FQnn5byC}E=NfQOwn=I#8TpVSfg zhMCUT$ZrkuNHXnNemxtbUY{69_Y*ZydtTDVeK}s}$eBrN=s(2gZe<qqoPy<OQs$<N zo}a<Y-TEF`KtIY8KiYBd!R?`3*~HaxL3{b0VdbK2YdZgRiqc}ntL-#K+jL^CiK*E6 zDa7k*m-cNT$;vslA~Ao6l7I{0uX|(86V5W`4EuTDVp>wtg;2grm(TL{Ho0u#z1KSA zNTYk(AUbY_iHC_n4#syK^{N@nZtts;ezc03E#cYq@O}6wjKA2(FHCWq%dBJj<MWOb z+k5ZFg~YVdEjG`hfy6K0ueVFQ4-)e-a)yB7t4#B2EZ7$h@lg((`fvk~{u^v0tc?YU zz=a+ocImu>8iad!zSDiE$V$)6v^()c3F^M;>=4c+Aa)7WqHsMo9eZDKbg_BfUq~bt z*YWKB@cAW7>4VGt%_$wU_%BsqWnCrCj&+aU+<247r=C)V&j+5gmkGmY;bRyrDfVWH z2@uA2KdxTShrc{)GtH<2*;~2R6_d&4z}xO7=IhVKr~-MVOsS5hN5hgIHP1HMnWAkA zKQ_9Ao8neeS`@5Ex&eN8-nT^cHdiU!Q+$ba3sa73sY+)0ub@BcUhECTC_zO6VFg6u z#L6WxRQ-~Jwic#>CGR`b#9Xe4JDXK0WNpjrhg3N?$Zo{MZMz-VP{J@D^}X&;I5rmW zGd52!N9Yqnpp8&^&Je0R(C`KuO?rAM!0=N1CwZlp@tS7*wccuW?LlXwj*iQgq@n5@ z@#A?`?f2;j^!A>2>g*?J;We2D;*t#t?B#{yEa~egoQ9BBTsKz;G(ZhaonCr>Y*<r+ ze4S3wy;Nw^?sKzb5<Qvk>DWh>+W3|6+RWPsK8i$XkEn%YWr%reh}83ZfcfCrb$D6; zyz<iCe{YeAdUomc<UzKw#r_L#+pNMp(=$p)zlLf`T%N0gOS1tP`1S5mfj<M%V@x4M z3pWBYJ>4@Q-krs4cCSkv!Wv@Gs;-j<`_EES5?pUxg6g5`L_}^F-?vEabe!i_PWBpR z$<4i<NP336TfN_2x>BA+kV)*J_Co+tSec4;ma^kb6^XX(8=iW72Lft5mqtz9&hub7 zLOp3izWfX-m;dCjK=r7oID1`a>5HAc<+OWWq_j%t@#?Hxlq+em4(3YZbs8eR8ao;- z2x>NexSTrO&0DM+X1GFKT&=1ksiR(btX2QQY5}`^-?MZq{;7B}_YG%NA)5(b`me%t zNFwA~CFanV=Kc5LLyVk*ggru0!`I$t4u8dwu#|1m?w7=z=uwqR&kEc)`a{TGITp?C zkJO`fp5oR}@<+&g`7<yCw_J(jvi|<9*J@&tl|3VKFa<uA;GqTk;h{<8uU)**T6Vtg z>?vvfADZuG`}x!*28rlz)vQV^Z}q>QR@W$Kv%eLC4t^5wa@+kt5qIB1A^gIuWfNxQ zwHa|2XR{MzRhL1%bzPrOE#O{z;FIrN?WSn_FxQfGnbukvn~X>Cea_4?riu3E+3?hp z_<d3WWx17H{mN=)6U;d*@Ipbv5aCia;%=(x^d8+<G8`mgoll?Hn(B4AvbF!)Y?Zzw z)g#AdoE6k+j}iPXfne-v`1E^$1y{dQ8?Sq)@$Mcso03d1F`b$q=+iKVrl9`(t=wy- zKCKbEBrPu9b5M>Bq;^~@aKmX2VSPP7G&es|ql9>K6ebX&>-YkRT5u5to<)D#oq9K< z=aG%rOkJJUR?Q9HHVF&7;JV%k-3>cLX)q&hyLk&)5PTz8jWT7@D;~k<fuA=Je;gkS zj@-j@c|MT$+HiWzv*{B&+RH^*k(v12wtq)^_~}D3k&$=jM9S|?GrX0?%Cqo@!7^IX zcUV6koeM2Gc=d_gmV^!SzVE7(F_Yp(hP*wWZVMX!$vl?dxXYmF)i05^sjS?VH$v-} zkxNVc{nuoN5UQj3=o!=_$59zruSw7IWx^7-Es@v?M`~VoP;los?=}afDFWl>=z234 zdEfWdqbv=l5qr&Y()pZ{baC``U5K*5My0aitI(|pN(V5ZTCd7j@cA_Ev`27j{z$ox zreadSBSvUg+5&#RK!b8=3I{>P3jsF34@T{_8UNF3)_lB=cOz=;@uTsKHMFR)!L$BQ zY~9F>QN=BzA)cpBQe$c;?Tn=AMY%#%VJt~%KF%3hDbKp$JtoMIm`o*(d&6EF=kfl= z8nYI+JeOWc_?wVHm0zZrB7r-mS*BXhJd0dS68WB<G&jE;ig|~qnOp0$uKHUe#atMf z^vKz2+32f1!N_znZXMo}ETi(AkFvxS+d(vFKCuNLWDQJpX>|J7wcp1aMAW5i&9jrv zO388;a3MAcb)S2sylC!Z?zLhr0z#j2a@*i@`}Dh-f{9%}4{dji8$=0E$hs`T=(b2q zHbyQP@;WB0iRwF2Mi9>XTf6RaF5;jRKR>Kx9uLTR)C=7265g!DzE6;ScIs-6UrT9k zA7+b#M_Muc<DzFT-{}>3c&#R+ea%VJh`p3ZHCmmP>i-p2nS#XIlS_G7yZ%?t`&p|6 z(Y4*s>jP<}d{(n(Wj*2)jhFL&YC2z^<FhKn(`!89VWlqVi2-QA;$lh}jP}<I+q2cL zqgS2>!N(5rb;!L>PSk5Ak;0#uKYg#d{n6ORVeg<CRQG9UzUyjQaV=knVLG|PgD8#2 zeSakHMs*Bxs{K{k98vPK_YEr531*H|2eIR^fQKQkhT@fE6Qk!sT;Ln=2afR<ceL-Q z9#Ki3%~f+mrq@!cut?-%dn)JSxHFZ>n@%qPs=Mfggj|_Q!p3B%Lia&jw>*w2sjmUU zoOlX_)J^TlD%lCQ*w#x%)+WxGYa!X6484M4+QSz1lwYp&%HZtuU0<1%wBw#lZyKr4 zkiBguMTbxx(+P;fQv8UUZb6?g+aic)!q(~xj<w~Un)E%MG#2-|*Lv&nuXPHHu}gWP z=pWu0{V|I;&_c}-Y0ke$KQ(g}RK6IL#EdGAja;<BZo4|~ZX$~^pOH%L5J>HBS0^ka zg(OEmDv69BQ49vCGrqS`8??q`8%#`FTp4R!lA^JlorsI?Q&FIa-uR`&4>!a8*|S#e z)|58xD(d$mYv|Xfdfo7uUr%LuRJ42F(;80lBc5a-t~w3{=j0Dl^~;ThE4MbW!J&}d zdUSgG*5B%UN?PvIbK}9cFCiqBhq{{`eoh?qMZrXN0UUSRM_+z@Cpz@~^`bJd3Ztq) zQ}vj$=ipWJS1VMe<Tr{BW-OPaG^J)7kr`2uXmUG&?H~7J=B{JiXx{wxa~h_!HFQvV z5(`E55FWW$dX^M40B;wM2!L$X{75Bgyop>K1o*DKTsmHJJ#9TQsmIhy=rAurIYn@@ z&OIYrAijjHsSOK?uQnWgC6-=~wJ4ZxUYhE{3Yt<xZzpu%VOj(_8#rOM*)B<18sFmT zyFIGYsU;yizP^;!?z6QkKcAs1FNJ51#;bNQ<B+r-D&Tlp4)r#cat&jJ-O1k3KN4Z7 zH>}kLb#vanYI{1hJrTHB+^7|t6cUj7*~%6Y3yHG6J&QP6j6eem{UW~GdCTEbzY+Pm z;CTgc+Cg{ailu=K6|>PFd#!aQGE&1<tcy?oJ-`dE3Z#%5Rh5jU5Vgmafb|j?1R#;g zu#oy8g=A;b(8$IXAz)$yRoP?`X?P#!j`ETgeyp^mwEfa{Tw5I(z541>D>$XEe?5e^ z)K8DCIx*(fdLL-7AK(bz2Lm=Exj%RQdVc7riK6v#-u33VfOd^;&g>geV%tIlRofZ1 zXYFrvt?lKHUV-A%Uq;M^1jXKKcFGwO1*Zl(Iww_Mrk7aZkQat~ob?LabGP@On3CY% zq&rzK9te`138L?^%6?Hf{}7gvyDa}gLE_J__Gannz<_Q63)qbZeF-zU#we-*pjoO~ z^a15ab;$z=30-1Lt$DtgdN=mEEM5p1IO&v+&3vUuI1);+=X@(Gt(>9F+`>T{+nW+K zbM$x_j>i1^ySS;!O1paT)KQlDC>6QO^(&cj5p&NwQdV36e@`~_vl1w(YWH2VT*Nkf zRU!l0uFf8Y-L4^VLP6N=LZXF2tN`UVWyz9pWn$u4r3VQ3d{(r|Rq8Y+?Mh40^>;e7 zcWeB}#oe_w#av*k0%9B5Kp!QuWn+=}j$R9Mzes3|oAZfM;=VdJBb{VL#GGlCuomAO zCI2<(3r~|#e8-}<Cf`m&RM>+N-!NbL6g;os;CrHW4;csU9Fa7(ltn4wt(E^6OYZ3B z_I93wFClc^8MYGzFN0Wa-(KF@S}4;@JI@CX7iknC%8~jw-@CtBNImYMss=1-rhI&l z+-)V!>TlMD`>i_XSik@K6@s8Oc76tjclj15{`%cIQ+Cou`=-hkn6Zz{Pj@p89(yb> zc?#Y-;$5gO8!MV`0-!tUJ<d0q#WueFJTWNOFG{t8hEMA%2<tq#=qdfuJijg8vbz_M zlVO+f<ShGc65%GlGq5y}jF^M-u9Bby+7coYJ7_<BXP{d@gzkDI7La*I>SIzBJ^u^2 zQu4CbsjDFj<KjH2=hhXR2sm$I*9i?SF4wKI3A=a6ZWnLiy_uSk%lq+BPkU!9JUZYE z)_fSfa%WjqB%2I!t|#CI<a0nol?iIP>D1^T#X9afw!V8Do|f-P&hwI855zLGyRJDJ z+3-25S!%x3Nnd#XgE#<^B;$He=xzmhxmwM)g5osFGFvbOoQ<^ZJ*McU9}i0C6fm^* z#~jl4(D7`tKTIXjp72-9_$P4R@qQvMQ*ddI!7np{{Yj%Gqcx@%(#5MA>t4y#I=@9g zH>iV-g0jIJHiLVYB*wzh<E#w>IW05N8*e@rnxc}3*j>X;WB;t?j90N&j^q+agK$At z$cj+J$k3a?42%d1EeZxB$QWKTkA&<8f}CCYHJNo)Qs%@-TXxGcHOl8&uBL8afJ{)W z1RG-Gdnc6%2cDb_a0C5eSK2y1EE5&IiJii_149hoV1Zk6V(3w3kyOOQ2dxtCwta1z zqcM-=xYHOhzS;Y)9sQ`yXD7aBielN(>SN^-i=&QYi-PUl+SYRVwd{RNoP|*%Mu8a8 zhnt8378CB@iX9{r{Y4Wp4>y=WS-!Orxh78Ubi~k=GtXXQK}JFJUZWYQ+7gF6K{n*2 zh1(u!0x8J8K3jEq_pZ;4%!>+v-jDXD?xpL+v7}r5(UwM5eIV#=R3Wu-7NeOZ`8uu! z*4I`7tUK9LcXmChq$%9BxSwfR0cX{!>v0`hby35fWc6fy{b1!DrItr0nUK2`ernPL zlYQ4i@iHD-YmEbFX81h4_Vna_?MkC;N_9>v#$2WK;yse1!r<)`teea2k3&yUD$o5S z*}<AJ)wGANhJ0ffutusSDKc<KKLPU-w_Z-=w6R?cMjVCgvc`}$vt<>@OIYQivr#j+ z6CgSx)F7l=?;6#(Fy!dx0|^lV02jk&lHfPY9m5B|lN3uY^h*aCSg^`?_XS$GrHgbo z3Q?GiHp-LqeCim3%5M=`BhAe?Y5d(1Umrb{7Oq2k3^!G*pd*vahW=3<_u%eR;)~OQ z(#)F6Vcu5yt=RlfEUZ4e3KnSXZoLK+pKxjl>Pw2}tJTZ+&;)2(N~j;CYeLO~F3p&w zZ+<j$X+(yqb%ygpXDvRKT-AH-(EScr)eH6us)}L~s-S3o$<_(}Kz7CSnB9%eX?SxL z@As_h%-TXVKlN*q*2a0SuNECw$TX#|^z&T^0w5*?3flr_0h<VbhSpj&rq{IDQ0!!g zS-}t${UaeMV@YnliMTzX3L%-hMzC_7#8}DK8xf_ArNiPUP{3(hd6%(kkCBUfnbiVn z#<Pyam*W(jtNO~c$~f>Nj$A04K2?ckrjoLNTwXHxi%x%Y*n%r44e3GdsuKiMg-|vw ztz}ETIWue@enIU-M22T%Wi6di6ZMc*p9$b$0D;h=A|M1p0J8UD4$^QcsVVGR!)yj9 zT5dfABhK+MH@k<==TaRHL+(qP`p);gBHwwwwAb!rlnRKB94VFAM;=roA>htkO7Kks z)8W9R3MmZ5NTOf9qO#2441t@-wLXbSMbnx4I)<bGiTBEk^Dhy5%V}W6&MWS!l=e4G z9q>s^nRO8Xh)B@M-$>njH0`cqeHMr*Qd6EI0D&U+!I${xupT63&+9TSCZpy<T^~Kc zbUh{4{qkIk?^al}2vy-h%~#MjKjC56;sH+Z^nH*s3i<_8>pf~8d;}1BL}8X@wfuSS zV4AU%VaP5y-HbvKo<3P-K(TvAtLT!dvZX?&T?W=bzmydq?@^p}h=d{^Oa4_SAfQJS z)GCH8B9J<AfuhxI5Kz)-1$Qg(i=Mqok@0XQzs7K-WpimU%Y_WN!jDNgu`wT;$Mc1) ztD9M<#_321=L>X&e^s(mJ?L%Llc(KDs^KjiGP;grbIsZKC+v|J)$`i7<Z9SP+A+Z{ zcH;EHUl(N-!qmWOzw_(FK_Fl^BwISF-)bLGl0dVsVQ3pqQ_JNQ3NK&vQ0@6@=XU?x z+faJO@n}faS2>}LnL_cQJ#fhR=h;D5!b(@z%uqH14O^!_lrQ==bs5-4R!GNRkQVkB zCFH8p7DP{wX`_{*RwLG55{NzI>(kNI8hb(8!uRdyK0oaA37A&Iw3$G6mlK8n`0K^I zBZg*q5&wchoL<T6hvqT<fe9@TYI%1Z9}1Z-@3X<%0EmmrS!9dXQ6EQ66}oXp=rP-J zmiWf+O!nyA^3@WL9Sk}QTpwlouTWNWQ4fCP@EbN}wjTkYME||M-}%I|zUu7;{iH7? zEUH`KLuw%0;6Mj6HHz+xl-BvUPP+4i$ZI_+-^pbh=&Io!Vl=b|BUa90t#ngVYefVY zL7QJ%^)gdU=60M5r@R~Tj@J*uXeBJMBq*PiY7?!rND+e_RzSuW7?GR!>MliM1DTiw zA_J@V#mSH!M}iK3JZr6Ox_K$pkf(h2DJ~q*TgsM3xax_V!KezzymEdV)e$JpPQ>FS zrMWd!pC&LNT>j=F0tUf^2m{aMVVIF;Qp7j`ZO9kPjJaw@oLCYc;UcGT-a{1&XMw2f z&G1E?aFae!Abpd%NISx7AG83t`|v5M<Mj4x@i25uVO5x$5s#lZqV;+gOgya?kTpg% z%h$@HdPf335?Cuwt8QCPMR+`0<!8UJFEq-#9h2~cWsl!9_$fqb@S_2@<}|vpj!_^B z?_;8$JNzs|4tRZ0<SHubuF);i!~|aK;;a__gG854dx*GQulAK7%dSHxxdpI9u+M(w zgnR^_O7gX;8}(V0VuK6{&P}HR^^2i&i~~VTXHV1V5^{zZ)@JK&0(2wPYDx}+${EQg zr3{RWqbVcnJltsbv`?MxYbvH%Az&2N<#|xS@w7f=18;fZDYMc`DjKnHAxj45HgOke z{BlTQzBo+t5R4pjz=b1acuM6jJjh2Xrk|?czTenX@Wf}9yi>pl4nctoB?mNaY*D&$ zY_cXtd<8S`NMtm+Ag}u+?&cx{`JJqcV;K@e{#@*kfEF4n5D@5FC6@i_9*!M~T6b}m z4mmq#qE^e!CB5{Dsh<@s(MS_YVSuFoegm_c)HkPzwS&XZ?K{=X3Hyv_)5kJ$7o4zq z0%?<G;hfF4{vNW(2*Gf*re4b{Djp9_8C_xRR27V3LYfSTNuaKEuSjg@u5dz$Xucue z76Cof5Ed6(>QNZ+BLO-c&2AAa|M9tI!5k0VmZ-E-8YwI^vQ}~rQOPp$Gnc^N{cvsm z@$)IXB9+pK!^Y#oLxnHu6RTrz>ewx3@rPI68I!=;_xFc7cvPtY3nzK{)DIlSL4^;Z zp?)u6`=sqENc-+aOju()5}+;$1?f4KLd5CY_`%q5Zj%<4m}RA29+D#ag7k55D5eH> zUDhb{<Xw`F+}y4FH-x+eZw^;x-o$-sU8;Jp#%+~eIS($V;2%%d^Bn8?5FW7^E)Y$k zM@Hp+PF^|xTC}?J_8#Kc?yN1>>`y(adX2YAPV*~!y<Z1vvx1RlFU%R`lX>^Xa>|q% zmDZ^LH0axFX1>m&U8WNMXv)zRBE1AFn>3r4l+Jq5{U$b!D4G_^-n{|w=FLwe6=Vjq z_Yuj8RfIm*0|xC<Ey>%vXX7D!u;&`>qx5<Wx94HKg22rp&e&Dc*<K1xxSkj_C1ikK zXPGr6t!9Y^HW88H!BnAkR#6d+Tnrg3rEIK3o6GMO^sW&Jk3f+o!MydxEG9)H(|W-J zmxVhd<d*yGU#XF3BP4R<Jav=wB>chJ0MT_PD&+Jw59E4xtH}Pc^YGE1uD;pu^w{vc z=FkSIzkvriE@vD%cFyH3TRP<)K3nYmlyCeol<8k~1x6qvhpVAiKNx$%I07cdgRmEh zwI)aA?eid=Aub+$rIAqH(}Z?fjVw((0Hobv;^_C<HdTly*#FWQt)hkm2I4EY_j}aD zKK|m>?8uCup8z+|ec?DG50(t&+sN}SARZ8XFZ7fZmd<M5=X^e@x#rKD?1M!g5uKhg zspc;ySu_p9n{biCgZ^?2v8jS}i-Bg407Y8DzrSsL-cdH#2HnZ~Eoj56yz>?y@K}Ir ztws0dRlq=LXSt_0G-Y%}1T<ir?bM1gz*_!f#`~*NUnc-YvW2q><$#TlgPPd<`}424 zl#eUdT5-%Yb3XM2NGY3dHbYeYtOP7V?U<k!(%*I50NB3rC02ThRXv+Md>xbI0{S?y z6{Ga7&y1Ty0Px)5TnV3|{uO&lxgb()O%Z>KnO=vTyq$}Swx4$e;2<I8j!tptW4u50 zjO;=gS31!2ek#R79T_`9Jy`<l<9C&>`&DTV9^gh5O#E^OfNn!PPCLR!v)pBS$qSV+ zsstBK$bl`l<)~|YGQVJ<@eo4PI$>$-WgsIZ&^I6mYV$0U$HA9MXiesR(`Hjtkg9wq zY+K9Ug$B-)AtAJ+!wV0=K_l15>G1L^r=<B;KhG7(R&gk=c0rfT(CB#mKE6w~Zztyz z`X7$IjipGG($m9#^V3;HVAa}*c^YaY*{wj}=StG8i<l*Bf}0R)<}MNWL^4va3^IyD znyg+rwugC?4`7n=@?V-U-7L?-iIO0oYAx#wNRolcGDwCT++|wqr*Rzvpo?dDI_nBn zJz$bG+k@M|7Vh8G57wkW)k(Rs(DlD^HW31k(M6NPM5O-cc1i9efim2{46LEYL$3Q3 zr-tcu8^ykWU#9KkAY)P$>d)NsKBd+;Tn#DPgYmP&;xz4NXa{_#VYetDnJ-fmg<hv# z;;3}EIc$Lrc6VExhr0QdUE3(F1f>nfP60^lyXq|pq`hxdc(hH`o+z^_HNDm!+?JC* z5FM5@ZC&bMz*IZ5jTQ<hgO;Z0%g=te?C?2=5~}FY@t}9}MOTDMpaD4L@p6@egz}c* z_&Q!vByPge-_tYx2=}3ZtnU9z=OL4a>;Z4{>r62lwh6Ec>bD9;3$GP%$H#W%qXrV} z{HK7<V1;QNA8~N`a%&o#!hN4|0mU~<?#mvW7(%|9%BSsnVZJiMl8cWdABx}<^~<QP zO*wGeR#V>glV}_$vt&u+4M}QlBk9fk>U@M^8&{lq1U-G4V|n{_zDRTwVlr*Uvk8m9 znV{xF{=p}QFd)sg5So<Q_+!$>AoD<}NasS<U|ZcZgQiT3uP*@%F8#@2QqKM~YmR(Z z0NN28$c~i4)ST)VKsq-aC|r8Vhi;iw{66e3k?}YmyE7lJ0!NiLt`yNCli?siZF?!p zBo4W|U@y;?5ofNGQ!CqOrbBybi114uQa#Z%t>^FVs70Oj7EdB9!Z>@z=3mdNx)L^5 zmf4GKCa;K&_;S9#Bj_d{m!<MF6(bcUN=|IiC(nO63T^QQ(Ea{-<JnJ3K#z`Z+r;~X z7FPH6Xq`<Y0MqD}a?3-R7UbWSaHRTURj*G1%{k1yBVceaY<F1B=GwX}Gp!}12~B7@ z7kk{9m#smCV)GuwUTxTGE@tBE7fFDqNIXEad4ka*;bVl$2hO|8pp_~8djG)^f{~h) z4bpzd%DIydu+HUD_R1mI6dz745dBkNpA&7Me2<Fu1guiAMBzlxbP|)YpyY)p$cS)~ zs_88e=u)<J3e(MT^~)e)pGA3yn)M!A>+Ba>s^`5ZpoH3CFqR_sK98?xkp1Z-ibWbO z-}?xEC^mayn1pZOKKjPyh8-@iErkV{VJAdu!XJ^Db)jGGw(m>Z%(mlp|Jsk%Jp}z! zNd6~m{qow3K&6(H-8isHBcb{Xy#k)3eL420KUJ=r;F^83wJ}+X@n&tcJ=8f^NQI}B zW9L1UNSjp1Y}N5EYmQLr?ls$ZfX@4Q9343kuRX*TU8%1X(qrGA;#a5}`f7$)3a_t- zesh0nQPB7;9_n%-T%~A*KXc7mF#cv>D7&d==(=iBWPhB|vfj7m3RsOET%UIKq|OoI z?XH3pDuD|KQ6t0Ei*Zyg;2cHhQK9A|iL-$gS)T~DFHK^4g7u_L)r2G>n%hTa)eO2A zmegP=V<7WU9Wf|5D1~ol7=b>N1DhEL7=!|W=3&mzhzu|i!O1<O1&7s$9xFBID)d~% z{YcNzU*r+fu`0IBxL)Uwpwr<WIrQMcIx}+@Dwz!CGsL^M@1k*;pk;z(^K|=042rP< zJZLwbdf}Sh$@h=%t2Q%}^r1wa%)WK|%Dk}|(IqOq!%NfNsEXv)$cLf<f~&leTQ<4T z^4?1JA}_PQMme6Zz#vr4M{6IPyGH8sCUz|7mp_mQIvVt{avR=``ekY8eXUIk;?>t% z!`KkH41J@YX**UHl5m7vBdKiM?krP^0~jEH=;_0DRo~xJ|LGq@ct|1Hsg19V4AVHf zu4je7(u$5AA_9Bx(2aH)g&|~N`lojv5QAcP$;hIS-ddo9+kp38@(eJoeeX+6tItEt zS^O@Y+?eGDN$}3l$VMG_!lNw_lF^{!4hTvh`Oe%PrHcXA52f&gZdZp|OJ;SHnOFT3 zwc&skYU=IgJ?!twR!a6w4n_aFs;rNRj(#w+&>eQ?xJ^96!BkOYr|Hj8@jmtHoBDcR zA?RGS<OOoV!cyDMYp)H;)Dd$x!}Y9$(0o`r&U!|@K~6u%`&X>W^<ME>;5!pwVsH)8 z>bpNI`0QhVPF~h4P<WaCDliQhSk70amHxa)9jxQHQcVh<d+Z`Yo`m%GN{a#vWMa8r zLNIOf4(4S8XBfUNo9vI}oE$;6n%W5S2(@6&h?HV^8bo)}vOLFt4xc`+4&1a}c!fL< zy=wM2>D=4=6uLDP)jJbG!p4@8?I%P4X~$^>c(cn*_JnF`1ie45w7GhgPE|j~XLata zr0Z)u$Jc(0+b!1&Na2B>?D6j(vky_Z&5?~-2<bMq&Z>U$lpcH2vAEi3FWATT>TZ_v zpr4_~p{5%mFjDcRH-!dUXwQx|(^6ZG2@)wtq74c`qE4-IfXc$OerEpNr@8uWHj7|d z?IfF3za|9y8+ZpZDus4uqL<)R{VJv2o0%^W-}<;0*w$sa#!3gi^|3erF_Kd>8)avV ziGMw_eD1CSSJZ3}uZN;8;N(?Su#eETaL`n4Vi&G^G@J<b!2~H*zwtd`;XG>nMF01I z14d{PGopJxx-*=aIa=f1SHkG7N2%JMd*}Ix6gO7B%K=`Vo@|n1H6KZYkrLHuW3Uv3 zntB|^oDTS>7XabgJj5PHgzDS#*oZLypUGV9kGrxhqv%gqpgdTZc9Z|Z)>}r!(M3_B zP2&=1+}+*X8h7`g!6Ct&;1VPdBtUQ{xCRaG?jb;Mch{h=^3BX!GqZ+2^@G*jx9Z$; z>d4;v_87fvv@Lib(QQNYn4ioZ`B99Rp`TK@3^WfpeA(<=p%z5UkAteFxoZoOJ!Q)q z`*hZvjnn(1#-9sN;k2C39vdrE#XqdbWxPCO6bKa-lQ*6e=q=i>qkgf5w9<B0R3?$) zgAZm3*CWC6B1~v2JHZ#c1MAL8mpH?)^N;CXs1~P)0>JU4;6<Eo!@7-Tu2$h&Ri}Bb z%k#|(c6uD6jark?qFCo5C|X7Zv#z1=@lRa?>l2QhpFg{kqj!qtzJ4r=m^~x0Ah!N& zHgU3ALzR5WB>^1W=s^$^G)<6x&^Bgk^d&7euX}K0z!#m_+ImjLo3@4_gVywxz*H8( zpkqni+&rS1%@ZZZXQ>y{!GMiXQ7z|Xe!JsN0^X-FwhEy#3m2FnaQA!OLf7G4VJlZ2 z-@P630=)S=2Kv3elz}iqn%pL5_x|D3m+fG6aa#eq{C?Y8OvR#(*YtDSFaKCu%N;~> z@vx@PN|#onU1z@^b@U}H{vaer6Lgk6-`<RtA;GhElJmP5SA2FL19~oXKfz)b-ktAZ zFgN;{=S$v3g*?Rn`Tg!C%yN0p@ggKR#bXJhWJUE@F>mqqMo{m>@ao8<K_FQE&DGhb z<Jkk)7E$-jOr|Q|;gB|{>xc#q-Mj9jG7>Q!@wgmcE|+cB-2@1-INXe@HbxkW!?=dj zj9k&C%fTDn%VRw}iokP$xw0f*isD1&8nS35#$2DKl!`S4HMCU62BdEXzPzQ%1+C%} zpCj&;)8iqE<6lIo5Q-I>BiUVQmv+rk9Ga?v<;kZNVcz5d);c-E!*6w@FtEm?Z<|e> z{H3J-e(xPjjpGPvo1`hVZre`r`xJFc8A0MWXOS2VD4!Df?MCk)L+GF1`9KLO(fgfU z=Z^-n)yLjXXs>;Qp>Hw$Fw1X!2Qg<@*qM<!GR`Z6^qOx7goYL0u&x4b^Zq}#slx0U zbz0jCoukM<SdY^&a-L`O|A;fT=e<g|iTq7G34Ez}ck--Q(sHt^u(yc%4H<inTKQAc z-jH1*gh94pR3w*fp+P|QuUCdAqv^-<+n{2z(d&*6{rDDD0Xu(G{&*epjMv(lIN{oa z!G<+-K?7`T#^YsGB%7RvWQIZ-mH_#5tHsznQvbRS+&d$QUu0_<dd2tHuzKk17e`Wj zkUHm+3ON0S-yw?|bQtU`Zq&*t$PrH4)skL!o7?xiT>e04`u<yaN+6CJ+(iY0hwU7` z4|IYoTsu$L-!_E~h&;l*dDn!luiEpC{2kGc?{SxgX}Vl5*}dwgma370y-N(6vhiH2 z8y~~^(*S4Od%SFw(?e#qk|%nl48pyw_Rd4elht!vl~PJO%HM_+)DC>TXx}UKesuXF zPu)=wF1*U>C1PAPG7z#GGA}fv_4MIS|MR;C{xwE;T0G1=5vlv}HJjVwLBVJU&P5*0 z>7N61eAC~esaB75q%RZ9w`enKv<Q@edKHbjiypAUT%VI$)qJ3NxZog^EFw;)&%3RI zeif8`pG#KC-AGVi{6(r*d%zNu=hK^}BrY*0DWrOY4<hEY-z-%Qqg7f-flNSnh#AD4 z;;2od6e;x~#f*zL<A`bvK3E<KqS4pa=|Z8R6HB1-g>FPkvugffI5`&wb7VN(jL?(V zWZNos?lNhc!t?c3U-Y!{JTIAQ=P>Hg#FZgcV6a_1-ig1!mQq9>*V)A62e7`MY9xFv zajo?eE9ans3(CZ319>}nz1Qzf;P0WYGAF;?<yD-@uQm4G`61RW_OT(FC`h49<Ik6L zDe@~}@@WtUWlta2dKNdw|8wIHt9*?wIW6*53qmf><cPR=o0%I9xO7(JBRe(vJm2r; z#c;TdQxU0HzjA)DpdIVs%u2$7z3a=d9C2x&_lUM+;vqF6g9=1G1|Iz;ErLFLkQNSi zF!CAtyG|L@&!?PwF;Q~YS<0lS@HoFalUu5!Eq-*NP1~uhdga&-6w#`GTel8e72WSp zS%`BXK~%8*?jnW^U2k{3?ik|OjC^HR+1sZd-hU1l$FVCZ7YXqgGZtRi*c|mm`0>HC zv3Jdf7D)+)yS$Rra|QZitcMFG@2eumJC%WY&Wb?-v{cjc`*%S+Nbf?9<=+HA0`6T= zWnyOim;H*BPLfXC^CH;$7d$|9spCasb@zMXa}<cD@UqB!T0d&p>e!K_QNZeOxlYf+ z-xF%MMh42i5IjY+?!(A5H%T3m2f{&!UpkolS*>`&D!0!$N4zT9CKfHjxZVu5;-Wpp zlYO9j=_!P_zrojaq+lbtn0ECI|LYxd$q})!B=$Ziz4^6|?opkrxqPzEM;sz1>!L%S zDQ7F=cmCzmV^)gR@muxQ$;aq<5Vl|Q-a#!Ghfp?nrT|;5rgj8lBL8`C0uo6;*)JT! zPp9*k8b9yn61~a5kSUD)$Yi=RgtE8kE?nn^p&sALcZ4!-UXGy8L_yW_jxXv{KUE<? z^)6Arme}+SBH`DcZS0;^<g2yWC{Agg1DT1Wj6oHAxrM`%B6yE+{mz2>Zgp?oz(KOH z>)d<W<MTP!UbP3Wtd)uzJzpgjLG${}x8}Hkrz2~b-n?UNhBdBNeX~|<<nwVS(?O2Q zZ8D+*ftbuA$TRFFuf>~3heKzNp2xdz+1Qb!6WmF&z>p*4h;!NUoFohk-)1G-Bt`9H z=&<`2BuD&kU;?mV?*G1xK$S8&;n@N+7vrbvXxw<-II+6<RJ?mn8Y$i~Wu^dLCbOJp zJ+H_$`XP*aNTy(9i!8}#X5G-xTXlq*VxXqnGC=M(p*($!oxx^hZUq|q>qREgO&8Dy zoA9wCc;I?);_3Yp(ViFri)rlXkV~qXCQ#XsaDH{kTdCV(Id%*|J1&QxmX`CvC?C)J z%E>-<t#LO-;zBj0JU$>a+(7|}Lh9N?4yf^8dwHuu^7g_W76Hvd+~bRe;|*;!XY^5c z#cWy=hXPv?Gj;pLLApNY)<tGdu5UL+=j_?z7cJ`mvXF&J%RCZ$E6>S|S)Q*7ikvVZ zsfai~E1Iij4=kCH2r#>H@v+T+*zP__3UZffEg6SB_ctK5du1V>yg=Maq>K^#(zY&b ze%o<=4;BvA36|-rZmq;dcso9?D)h@IV>rEg;-*8@kikZlSAl~WP92>E(Y�(BZJ~ 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%0A%Y23I7O(^%DEqx^k^s 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	HQuW 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 I$yo;fAMy7rT>t<8 diff --git a/docs/index.html b/docs/index.html index a608c52..543fd3b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -273,5 +273,5 @@ And of course, if we used a sparse or compressed representation, then we are red <!-- MkDocs version : 0.17.2 -Build Date UTC : 2018-12-06 14:04:25 +Build Date UTC : 2018-12-06 14:40:20 --> diff --git a/docs/tutorial-lang_model/index.html b/docs/tutorial-lang_model/index.html new file mode 100644 index 0000000..bf81346 --- /dev/null +++ b/docs/tutorial-lang_model/index.html @@ -0,0 +1,703 @@ +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + + <link rel="shortcut icon" href="../img/favicon.ico"> + <title>Pruning a Language Model - Neural Network Distiller</title> + <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> + + <link rel="stylesheet" href="../css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../css/theme_extra.css" type="text/css" /> + <link rel="stylesheet" href="../css/highlight.css"> + <link href="../extra.css" rel="stylesheet"> + + <script> + // Current page data + var mkdocs_page_name = "Pruning a Language Model"; + var mkdocs_page_input_path = "tutorial-lang_model.md"; + var mkdocs_page_url = "/tutorial-lang_model/index.html"; + </script> + + <script src="../js/jquery-2.1.1.min.js"></script> + <script src="../js/modernizr-2.8.3.min.js"></script> + <script type="text/javascript" src="../js/highlight.pack.js"></script> + +</head> + +<body class="wy-body-for-nav" role="document"> + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> + <div class="wy-side-nav-search"> + <a href="../index.html" class="icon icon-home"> Neural Network Distiller</a> + <div role="search"> + <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + </form> +</div> + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + <ul class="current"> + + + <li class="toctree-l1"> + + <a class="" href="../index.html">Home</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../install/index.html">Installation</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../usage/index.html">Usage</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../schedule/index.html">Compression Scheduling</a> + </li> + + <li class="toctree-l1"> + + <span class="caption-text">Compressing Models</span> + <ul class="subnav"> + <li class=""> + + <a class="" href="../pruning/index.html">Pruning</a> + </li> + <li class=""> + + <a class="" href="../regularization/index.html">Regularization</a> + </li> + <li class=""> + + <a class="" href="../quantization/index.html">Quantization</a> + </li> + <li class=""> + + <a class="" href="../knowledge_distillation/index.html">Knowledge Distillation</a> + </li> + <li class=""> + + <a class="" href="../conditional_computation/index.html">Conditional Computation</a> + </li> + </ul> + </li> + + <li class="toctree-l1"> + + <span class="caption-text">Algorithms</span> + <ul class="subnav"> + <li class=""> + + <a class="" href="../algo_pruning/index.html">Pruning</a> + </li> + <li class=""> + + <a class="" href="../algo_quantization/index.html">Quantization</a> + </li> + <li class=""> + + <a class="" href="../algo_earlyexit/index.html">Early Exit</a> + </li> + </ul> + </li> + + <li class="toctree-l1"> + + <a class="" href="../model_zoo/index.html">Model Zoo</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../jupyter/index.html">Jupyter Notebooks</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../design/index.html">Design</a> + </li> + + <li class="toctree-l1"> + + <span class="caption-text">Tutorials</span> + <ul class="subnav"> + <li class=""> + + <a class="" href="../tutorial-struct_pruning/index.html">Pruning Filters and Channels</a> + </li> + <li class=" current"> + + <a class="current" href="index.html">Pruning a Language Model</a> + <ul class="subnav"> + + <li class="toctree-l3"><a href="#using-distiller-to-prune-a-pytorch-language-model">Using Distiller to prune a PyTorch language model</a></li> + + <ul> + + <li><a class="toctree-l4" href="#contents">Contents</a></li> + + <li><a class="toctree-l4" href="#introduction">Introduction</a></li> + + <li><a class="toctree-l4" href="#setup">Setup</a></li> + + <li><a class="toctree-l4" href="#creating-compression-baselines">Creating compression baselines</a></li> + + <li><a class="toctree-l4" href="#compressing-the-language-model">Compressing the language model</a></li> + + <li><a class="toctree-l4" href="#until-next-time">Until next time</a></li> + + </ul> + + + </ul> + </li> + </ul> + </li> + + </ul> + </div> + + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" role="navigation" aria-label="top navigation"> + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">Neural Network Distiller</a> + </nav> + + + <div class="wy-nav-content"> + <div class="rst-content"> + <div role="navigation" aria-label="breadcrumbs navigation"> + <ul class="wy-breadcrumbs"> + <li><a href="../index.html">Docs</a> »</li> + + + + <li>Tutorials »</li> + + + + <li>Pruning a Language Model</li> + <li class="wy-breadcrumbs-aside"> + + </li> + </ul> + <hr/> +</div> + <div role="main"> + <div class="section"> + + <h1 id="using-distiller-to-prune-a-pytorch-language-model">Using Distiller to prune a PyTorch language model</h1> +<h2 id="contents">Contents</h2> +<ul> +<li><a href="#introduction">Introduction</a></li> +<li><a href="#setup">Setup</a></li> +<li><a href="#preparing-the-code">Preparing the code</a></li> +<li><a href="#training-loop">Training-loop</a></li> +<li><a href="#creating-compression-baselines">Creating compression baselines</a></li> +<li><a href="#compressing-the-language-model">Compressing the language model</a></li> +<li><a href="#what-are-we-compressing">What are we compressing?</a></li> +<li><a href="#how-are-we-compressing">How are we compressing?</a></li> +<li><a href="#when-are-we-compressing">When are we compressing?</a></li> +<li><a href="#until-next-time">Until next time</a></li> +</ul> +<h2 id="introduction">Introduction</h2> +<p>In this tutorial I'll show you how to compress a word-level language model using <a href="https://github.com/NervanaSystems/distiller">Distiller</a>. Specifically, we use PyTorch’s <a href="https://github.com/pytorch/examples/tree/master/word_language_model">word-level language model sample code</a> as the code-base of our example, weave in some Distiller code, and show how we compress the model using two different element-wise pruning algorithms. To make things manageable, I've divided the tutorial to two parts: in the first we will setup the sample application and prune using <a href="https://arxiv.org/abs/1710.01878">AGP</a>. In the second part I'll show how I've added Baidu's RNN pruning algorithm and then use it to prune the same word-level language model. The completed code is available <a href="https://github.com/NervanaSystems/distiller/tree/master/examples/word_language_model">here</a>.</p> +<p>The results are displayed below and the code is available <a href="https://github.com/NervanaSystems/distiller/tree/master/examples/word_language_model">here</a>. +Note that we can improve the results by training longer, since the loss curves are usually still decreasing at the end of epoch 40. However, for demonstration purposes we don’t need to do this.</p> +<table> +<thead> +<tr> +<th>Type</th> +<th>Sparsity</th> +<th align="center">NNZ</th> +<th>Validation</th> +<th>Test</th> +<th>Command line</th> +</tr> +</thead> +<tbody> +<tr> +<td>Small</td> +<td>0%</td> +<td align="center">7,135,600</td> +<td>101.13</td> +<td>96.29</td> +<td>time python3 main.py --cuda --epochs 40 --tied --wd=1e-6</td> +</tr> +<tr> +<td>Medium</td> +<td>0%</td> +<td align="center">28,390,700</td> +<td>88.17</td> +<td>84.21</td> +<td>time python3 main.py --cuda --emsize 650 --nhid 650 --dropout 0.5 --epochs 40 --tied,--wd=1e-6</td> +</tr> +<tr> +<td>Large</td> +<td>0%</td> +<td align="center">85,917,000</td> +<td>87.49</td> +<td>83.85</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --wd=1e-6</td> +</tr> +<tr> +<td>Large</td> +<td>70%</td> +<td align="center">25,487,550</td> +<td>90.67</td> +<td>85.96</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --compress=../../examples/agp-pruning/word_lang_model.LARGE_70.schedule_agp.yaml</td> +</tr> +<tr> +<td>Large</td> +<td>70%</td> +<td align="center">25,487,550</td> +<td>90.59</td> +<td>85.84</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --compress=../../examples/agp-pruning/word_lang_model.LARGE_70.schedule_agp.yaml --wd=1e-6</td> +</tr> +<tr> +<td>Large</td> +<td>70%</td> +<td align="center">25,487,550</td> +<td>87.40</td> +<td>82.93</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --compress=../../examples/agp-pruning/word_lang_model.LARGE_70B.schedule_agp.yaml --wd=1e-6</td> +</tr> +<tr> +<td>Large</td> +<td>80.4%</td> +<td align="center">16,847,550</td> +<td>89.31</td> +<td>83.64</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --compress=../../examples/agp-pruning/word_lang_model.LARGE_80.schedule_agp.yaml --wd=1e-6</td> +</tr> +<tr> +<td>Large</td> +<td>90%</td> +<td align="center">8,591,700</td> +<td>90.70</td> +<td>85.67</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --compress=../../examples/agp-pruning/word_lang_model.LARGE_90.schedule_agp.yaml --wd=1e-6</td> +</tr> +<tr> +<td>Large</td> +<td>95%</td> +<td align="center">4,295,850</td> +<td>98.42</td> +<td>92.79</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --compress=../../examples/agp-pruning/word_lang_model.LARGE_95.schedule_agp.yaml --wd=1e-6</td> +</tr> +</tbody> +</table> +<p align="center"><b>Table 1: AGP language model pruning results. <br>NNZ stands for number of non-zero coefficients (embeddings are counted once, because they are tied).</b></p> + +<p><center><img alt="Example 1" src="../imgs/word_lang_model_performance.png" /></center> +<p align="center"> + <b>Figure 1: Perplexity vs model size (lower perplexity is better).</b> +</p></p> +<p>The model is composed of an Encoder embedding, two LSTMs, and a Decoder embedding. The Encoder and decoder embeddings (projections) are tied to improve perplexity results (per https://arxiv.org/pdf/1611.01462.pdf), so in the sparsity statistics we account for only one of the encoder/decoder embeddings. We used the WikiText2 dataset (twice as large as PTB).</p> +<p>We compared three model sizes: small (7.1M; 14M), medium (28M; 50M), large: (86M; 136M) – reported as (#parameters net/tied; #parameters gross). +The results reported below use a preset seed (for reproducibility), and we expect results can be improved if we allow “true†pseudo-randomness. We limited our tests to 40 epochs, even though validation perplexity was still trending down.</p> +<p>Essentially, this recreates the language model experiment in the AGP paper, and validates its conclusions: +<em> “We see that sparse models are able to outperform dense models which have significantly more parameters.†+</em> The 80% sparse large model (which has 16.9M parameters and a perplexity of 83.64) is able to outperform the dense medium (which has 28.4M parameters and a perplexity of 84.21), a model which has 1.7 times more parameters. It also outperform the dense large model, which exemplifies how pruning can act as a regularizer. +* “Our results show that pruning works very well not only on the dense LSTM weights and dense softmax layer but also the dense embedding matrix. This suggests that during the optimization procedure the neural network can find a good sparse embedding for the words in the vocabulary that works well together with the sparse connectivity structure of the LSTM weights and softmax layer.â€</p> +<h2 id="setup">Setup</h2> +<p>We start by cloning Pytorch’s example <a href="https://github.com/pytorch/examples/tree/master">repository</a>. I’ve copied the language model code to distiller’s examples/word_language_model directory, so I’ll use that for the rest of the tutorial. +Next, let’s create and activate a virtual environment, as explained in Distiller's <a href="https://github.com/NervanaSystems/distiller#create-a-python-virtual-environment">README</a> file. +Now we can turn our attention to <a href="https://github.com/pytorch/examples/blob/master/word_language_model/main.py">main.py</a>, which contains the training application.</p> +<h3 id="preparing-the-code">Preparing the code</h3> +<p>We begin by adding code to invoke Distiller in file <code>main.py</code>. This involves a bit of mechanics, because we did not <code>pip install</code> Distiller in our environment (we don’t have a <code>setup.py</code> script for Distiller as of yet). To make Distiller library functions accessible from <code>main.py</code>, we modify <code>sys.path</code> to include the distiller root directory by taking the current directory and pointing two directories up. This is very specific to the location of this example code, and it will break if you’ve placed the code elsewhere – so be aware.</p> +<pre><code class="python">import os +import sys +script_dir = os.path.dirname(__file__) +module_path = os.path.abspath(os.path.join(script_dir, '..', '..')) +if module_path not in sys.path: + sys.path.append(module_path) +import distiller +import apputils +from distiller.data_loggers import TensorBoardLogger, PythonLogger +</code></pre> + +<p>Next, we augment the application arguments with two Distiller-specific arguments. The first, <code>--summary</code>, gives us the ability to do simple compression instrumentation (e.g. log sparsity statistics). The second argument, <code>--compress</code>, is how we tell the application where the compression scheduling file is located. +We also add two arguments - momentum and weight-decay - for the SGD optimizer. As I explain later, I replaced the original code's optimizer with SGD, so we need these extra arguments.</p> +<pre><code class="python"># Distiller-related arguments +SUMMARY_CHOICES = ['sparsity', 'model', 'modules', 'png', 'percentile'] +parser.add_argument('--summary', type=str, choices=SUMMARY_CHOICES, + help='print a summary of the model, and exit - options: ' + + ' | '.join(SUMMARY_CHOICES)) +parser.add_argument('--compress', dest='compress', type=str, nargs='?', action='store', + help='configuration file for pruning the model (default is to use hard-coded schedule)') +parser.add_argument('--momentum', default=0., type=float, metavar='M', + help='momentum') +parser.add_argument('--weight-decay', '--wd', default=0., type=float, + metavar='W', help='weight decay (default: 1e-4)') +</code></pre> + +<p>We add code to handle the <code>--summary</code> application argument. It can be as simple as forwarding to <code>distiller.model_summary</code> or more complex, as in the Distiller sample.</p> +<pre><code class="python">if args.summary: + distiller.model_summary(model, None, args.summary, 'wikitext2') + exit(0) +</code></pre> + +<p>Similarly, we add code to handle the <code>--compress</code> argument, which creates a CompressionScheduler and configures it from a YAML schedule file:</p> +<pre><code class="python">if args.compress: + source = args.compress + compression_scheduler = distiller.CompressionScheduler(model) + distiller.config.fileConfig(model, None, compression_scheduler, args.compress, msglogger) +</code></pre> + +<p>We also create the optimizer, and the learning-rate decay policy scheduler. The original PyTorch example manually manages the optimization and LR decay process, but I think that having a standard optimizer and LR-decay schedule gives us the flexibility to experiment with these during the training process. Using an <a href="https://pytorch.org/docs/stable/_modules/torch/optim/sgd.html">SGD optimizer</a> configured with <code>momentum=0</code> and <code>weight_decay=0</code>, and a <a href="https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html">ReduceLROnPlateau LR-decay policy</a> with <code>patience=0</code> and <code>factor=0.5</code> will give the same behavior as in the original PyTorch example. From there, we can experiment with the optimizer and LR-decay configuration.</p> +<pre><code class="python">optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) +lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', + patience=0, verbose=True, factor=0.5) +</code></pre> + +<p>Next, we add code to setup the logging backends: a Python logger backend which reads its configuration from file and logs messages to the console and log file (<code>pylogger</code>); and a TensorBoard backend logger which logs statistics to a TensorBoard data file (<code>tflogger</code>). I configured the TensorBoard backend to log gradients because RNNs suffer from vanishing and exploding gradients, so we might want to take a look in case the training experiences a sudden failure. +This code is not strictly required, but it is quite useful to be able to log the session progress, and to export logs to TensorBoard for realtime visualization of the training progress.</p> +<pre><code class="python"># Distiller loggers +msglogger = apputils.config_pylogger('logging.conf', None) +tflogger = TensorBoardLogger(msglogger.logdir) +tflogger.log_gradients = True +pylogger = PythonLogger(msglogger) +</code></pre> + +<h3 id="training-loop">Training loop</h3> +<p>Now we scroll down all the way to the train() function. We'll change its signature to include the <code>epoch</code>, <code>optimizer</code>, and <code>compression_schdule</code>. We'll soon see why we need these.</p> +<pre><code class="python">def train(epoch, optimizer, compression_scheduler=None) +</code></pre> + +<p>Function <code>train()</code> is responsible for training the network in batches for one epoch, and in its epoch loop we want to perform compression. The <a href="https://github.com/NervanaSystems/distiller/blob/master/distiller/scheduler.py">CompressionScheduler</a> invokes <a href="https://github.com/NervanaSystems/distiller/blob/master/distiller/policy.py">ScheduledTrainingPolicy</a> instances per the scheduling specification that was programmed in the <code>CompressionScheduler</code> instance. There are four main <code>SchedulingPolicy</code> types: <code>PruningPolicy</code>, <code>RegularizationPolicy</code>, <code>LRPolicy</code>, and <code>QuantizationPolicy</code>. We'll be using <code>PruningPolicy</code>, which is triggered <code>on_epoch_begin</code> (to invoke the <a href="https://github.com/NervanaSystems/distiller/blob/master/distiller/pruning/pruner.py">Pruners</a>, and <code>on_minibatch_begin</code> (to mask the weights). Later we will create a YAML scheduling file, and specify the schedule of <a href="https://github.com/NervanaSystems/distiller/blob/master/distiller/pruning/automated_gradual_pruner.py">AutomatedGradualPruner</a> instances. </p> +<p>Because we are writing a single application, which can be used with various Policies in the future (e.g. group-lasso regularization), we should add code to invoke all of the <code>CompressionScheduler</code>'s callbacks, not just the mandatory <code>on_epoch_begin</code> callback. We invoke <code>on_minibatch_begin</code> before running the forward-pass, <code>before_backward_pass</code> after computing the loss, and <code>on_minibatch_end</code> after completing the backward-pass.</p> +<pre><code class="lang-python"> +def train(epoch, optimizer, compression_scheduler=None): + ... + + # The line below was fixed as per: https://github.com/pytorch/examples/issues/214 + for batch, i in enumerate(range(0, train_data.size(0), args.bptt)): + data, targets = get_batch(train_data, i) + # Starting each batch, we detach the hidden state from how it was previously produced. + # If we didn't, the model would try backpropagating all the way to start of the dataset. + hidden = repackage_hidden(hidden) + + <b>if compression_scheduler: + compression_scheduler.on_minibatch_begin(epoch, minibatch_id=batch, minibatches_per_epoch=steps_per_epoch)</b> + output, hidden = model(data, hidden) + loss = criterion(output.view(-1, ntokens), targets) + + <b>if compression_scheduler: + compression_scheduler.before_backward_pass(epoch, minibatch_id=batch, + minibatches_per_epoch=steps_per_epoch, + loss=loss)</b> + optimizer.zero_grad() + loss.backward() + + # `clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs. + torch.nn.utils.clip_grad_norm_(model.parameters(), args.clip) + optimizer.step() + + total_loss += loss.item() + + <b>if compression_scheduler: + compression_scheduler.on_minibatch_end(epoch, minibatch_id=batch, minibatches_per_epoch=steps_per_epoch)</b> +</code></pre> + +<p>The rest of the code could stay as in the original PyTorch sample, but I wanted to use an SGD optimizer, so I replaced:</p> +<pre><code class="python">for p in model.parameters(): + p.data.add_(-lr, p.grad.data) +</code></pre> + +<p>with:</p> +<pre><code>optimizer.step() +</code></pre> + +<p>The rest of the code in function <code>train()</code> logs to a text file and a <a href="https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard">TensorBoard</a> backend. Again, such code is not mandatory, but a few lines give us a lot of visibility: we have training progress information saved to log, and we can monitor the training progress in realtime on TensorBoard. That's a lot for a few lines of code ;-)</p> +<pre><code> +if batch % args.log_interval == 0 and batch > 0: + cur_loss = total_loss / args.log_interval + elapsed = time.time() - start_time + lr = optimizer.param_groups[0]['lr'] + msglogger.info( + '| epoch {:3d} | {:5d}/{:5d} batches | lr {:02.4f} | ms/batch {:5.2f} ' + '| loss {:5.2f} | ppl {:8.2f}'.format( + epoch, batch, len(train_data) // args.bptt, lr, + elapsed * 1000 / args.log_interval, cur_loss, math.exp(cur_loss))) + total_loss = 0 + start_time = time.time() + stats = ('Peformance/Training/', + OrderedDict([ + ('Loss', cur_loss), + ('Perplexity', math.exp(cur_loss)), + ('LR', lr), + ('Batch Time', elapsed * 1000)]) + ) + steps_completed = batch + 1 + distiller.log_training_progress(stats, model.named_parameters(), epoch, steps_completed, + steps_per_epoch, args.log_interval, [tflogger]) +</code></pre> + +<p>Finally we get to the outer training-loop which loops on <code>args.epochs</code>. We add the two final <code>CompressionScheduler</code> callbacks: <code>on_epoch_begin</code>, at the start of the loop, and <code>on_epoch_end</code> after running <code>evaluate</code> on the model and updating the learning-rate.</p> +<pre><code class="lang-python"> +try: + for epoch in range(0, args.epochs): + epoch_start_time = time.time() + <b>if compression_scheduler: + compression_scheduler.on_epoch_begin(epoch)</b> + + train(epoch, optimizer, compression_scheduler) + val_loss = evaluate(val_data) + lr_scheduler.step(val_loss) + + <b>if compression_scheduler: + compression_scheduler.on_epoch_end(epoch)</b> +</code></pre> + +<p>And that's it! The language model sample is ready for compression. </p> +<h2 id="creating-compression-baselines">Creating compression baselines</h2> +<p>In <a href="https://arxiv.org/abs/1710.01878">To prune, or not to prune: exploring the efficacy of pruning for model compression</a> Zhu and Gupta, "compare the accuracy of large, but pruned models (large-sparse) and their smaller, but dense (small-dense) counterparts with identical memory footprint." They also "propose a new gradual pruning technique that is simple and straightforward to apply across a variety of models/datasets with minimal tuning."<br /> +This pruning schedule is implemented by distiller.AutomatedGradualPruner (AGP), which increases the sparsity level (expressed as a percentage of zero-valued elements) gradually over several pruning steps. Distiller's implementation only prunes elements once in an epoch (the model is fine-tuned in between pruning events), which is a small deviation from Zhu and Gupta's paper. The research paper specifies the schedule in terms of mini-batches, while our implementation specifies the schedule in terms of epochs. We feel that using epochs performs well, and is more "stable", since the number of mini-batches will change, if you change the batch size.</p> +<p>Before we start compressing stuff ;-), we need to create baselines so we have something to benchmark against. Let's prepare small, medium, and large baseline models, like Table 3 of <em>To prune, or Not to Prune</em>. These will provide baseline perplexity results that we'll compare the compressed models against. <br /> +I chose to use tied input/output embeddings, and constrained the training to 40 epochs. The table below shows the model sizes, where we are interested in the tied version (biases are ignored due to their small size and because we don't prune them).</p> +<table> +<thead> +<tr> +<th>Size</th> +<th>Number of Weights (untied)</th> +<th>Number of Weights (tied)</th> +</tr> +</thead> +<tbody> +<tr> +<td>Small</td> +<td>13,951,200</td> +<td>7,295,600</td> +</tr> +<tr> +<td>Medium</td> +<td>50,021,400</td> +<td>28,390,700</td> +</tr> +<tr> +<td>Large</td> +<td>135,834,000</td> +<td>85,917,000</td> +</tr> +</tbody> +</table> +<p>I started experimenting with the optimizer setup like in the PyTorch example, but I added some L2 regularization when I noticed that the training was overfitting. The two right columns show the perplexity results (lower is better) of each of the models with no L2 regularization and with 1e-5 and 1e-6. +In all three model sizes using the smaller L2 regularization (1e-6) gave the best results. BTW, I'm not showing here experiments with even lower regularization because that did not help.</p> +<table> +<thead> +<tr> +<th>Type</th> +<th>Command line</th> +<th>Validation</th> +<th>Test</th> +</tr> +</thead> +<tbody> +<tr> +<td>Small</td> +<td>time python3 main.py --cuda --epochs 40 --tied</td> +<td>105.23</td> +<td>99.53</td> +</tr> +<tr> +<td>Small</td> +<td>time python3 main.py --cuda --epochs 40 --tied --wd=1e-6</td> +<td>101.13</td> +<td>96.29</td> +</tr> +<tr> +<td>Small</td> +<td>time python3 main.py --cuda --epochs 40 --tied --wd=1e-5</td> +<td>109.49</td> +<td>103.53</td> +</tr> +<tr> +<td>Medium</td> +<td>time python3 main.py --cuda --emsize 650 --nhid 650 --dropout 0.5 --epochs 40 --tied</td> +<td>90.93</td> +<td>86.20</td> +</tr> +<tr> +<td>Medium</td> +<td>time python3 main.py --cuda --emsize 650 --nhid 650 --dropout 0.5 --epochs 40 --tied --wd=1e-6</td> +<td>88.17</td> +<td>84.21</td> +</tr> +<tr> +<td>Medium</td> +<td>time python3 main.py --cuda --emsize 650 --nhid 650 --dropout 0.5 --epochs 40 --tied --wd=1e-5</td> +<td>97.75</td> +<td>93.06</td> +</tr> +<tr> +<td>Large</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied</td> +<td>88.23</td> +<td>84.21</td> +</tr> +<tr> +<td>Large</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --wd=1e-6</td> +<td>87.49</td> +<td>83.85</td> +</tr> +<tr> +<td>Large</td> +<td>time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --wd=1e-5</td> +<td>99.22</td> +<td>94.28</td> +</tr> +</tbody> +</table> +<h2 id="compressing-the-language-model">Compressing the language model</h2> +<p>OK, so now let's recreate the results of the language model experiment from section 4.2 of paper. We're using PyTorch's sample, so the language model we implement is not exactly like the one in the AGP paper (and uses a different dataset), but it's close enough, so if everything goes well, we should see similar compression results.</p> +<h3 id="what-are-we-compressing">What are we compressing?</h3> +<p>To gain insight about the model parameters, we can use the command-line to produce a weights-sparsity table:</p> +<pre><code class="csh">$ python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --summary=sparsity + +Parameters: ++---------+------------------+---------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------+ +| | Name | Shape | NNZ (dense) | NNZ (sparse) | Cols (%) | Rows (%) | Ch (%) | 2D (%) | 3D (%) | Fine (%) | Std | Mean | Abs-Mean | +|---------+------------------+---------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------| +| 0.00000 | encoder.weight | (33278, 1500) | 49917000 | 49916999 | 0.00000 | 0.00000 | 0 | 0.00000 | 0 | 0.00000 | 0.05773 | -0.00000 | 0.05000 | +| 1.00000 | rnn.weight_ih_l0 | (6000, 1500) | 9000000 | 9000000 | 0.00000 | 0.00000 | 0 | 0.00000 | 0 | 0.00000 | 0.01491 | 0.00001 | 0.01291 | +| 2.00000 | rnn.weight_hh_l0 | (6000, 1500) | 9000000 | 8999999 | 0.00000 | 0.00000 | 0 | 0.00000 | 0 | 0.00001 | 0.01491 | 0.00000 | 0.01291 | +| 3.00000 | rnn.weight_ih_l1 | (6000, 1500) | 9000000 | 8999999 | 0.00000 | 0.00000 | 0 | 0.00000 | 0 | 0.00001 | 0.01490 | -0.00000 | 0.01291 | +| 4.00000 | rnn.weight_hh_l1 | (6000, 1500) | 9000000 | 9000000 | 0.00000 | 0.00000 | 0 | 0.00000 | 0 | 0.00000 | 0.01491 | -0.00000 | 0.01291 | +| 5.00000 | decoder.weight | (33278, 1500) | 49917000 | 49916999 | 0.00000 | 0.00000 | 0 | 0.00000 | 0 | 0.00000 | 0.05773 | -0.00000 | 0.05000 | +| 6.00000 | Total sparsity: | - | 135834000 | 135833996 | 0.00000 | 0.00000 | 0 | 0.00000 | 0 | 0.00000 | 0.00000 | 0.00000 | 0.00000 | ++---------+------------------+---------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------+ +Total sparsity: 0.00 +</code></pre> + +<p>So what's going on here? +<code>encoder.weight</code> and <code>decoder.weight</code> are the input and output embeddings, respectively. Remember that in the configuration I chose for the three model sizes these embeddings are tied, which means that we only have one copy of parameters, that is shared between the encoder and decoder. +We also have two pairs of RNN (LSTM really) parameters. There is a pair because the model uses the command-line argument <code>args.nlayers</code> to decide how many instances of RNN (or LSTM or GRU) cells to use, and it defaults to 2. The recurrent cells are LSTM cells, because this is the default of <code>args.model</code>, which is used in the initialization of <code>RNNModel</code>. Let's look at the parameters of the first RNN: <code>rnn.weight_ih_l0</code> and <code>rnn.weight_hh_l0</code>: what are these?<br /> +Recall the <a href="https://pytorch.org/docs/stable/nn.html#lstm">LSTM equations</a> that PyTorch implements. In the equations, there are 8 instances of vector-matrix multiplication (when batch=1). These can be combined into a single matrix-matrix multiplication (GEMM), but PyTorch groups these into two GEMM operations: one GEMM multiplies the inputs (<code>rnn.weight_ih_l0</code>), and the other multiplies the hidden-state (<code>rnn.weight_hh_l0</code>). </p> +<h3 id="how-are-we-compressing">How are we compressing?</h3> +<p>Let's turn to the configurations of the Large language model compression schedule to 70%, 80%, 90% and 95% sparsity. Using AGP it is easy to configure the pruning schedule to produce an exact sparsity of the compressed model. I'll use the <a href="https://github.com/NervanaSystems/distiller/blob/master/examples/agp-pruning/word_lang_model.LARGE_70.schedule_agp.yaml">70% schedule</a> to show a concrete example.</p> +<p>The YAML file has two sections: <code>pruners</code> and <code>policies</code>. Section <code>pruners</code> defines instances of <code>ParameterPruner</code> - in our case we define three instances of <code>AutomatedGradualPruner</code>: for the weights of the first RNN (<code>l0_rnn_pruner</code>), the second RNN (<code>l1_rnn_pruner</code>) and the embedding layer (<code>embedding_pruner</code>). These names are arbitrary, and serve are name-handles which bind Policies to Pruners - so you can use whatever names you want. +Each <code>AutomatedGradualPruner</code> is configured with an <code>initial_sparsity</code> and <code>final_sparsity</code>. For examples, the <code>l0_rnn_pruner</code> below is configured to prune 5% of the weights as soon as it starts working, and finish when 70% of the weights have been pruned. The <code>weights</code> parameter tells the Pruner which weight tensors to prune.</p> +<pre><code class="YAML">pruners: + l0_rnn_pruner: + class: AutomatedGradualPruner + initial_sparsity : 0.05 + final_sparsity: 0.70 + weights: [rnn.weight_ih_l0, rnn.weight_hh_l0] + + l1_rnn_pruner: + class: AutomatedGradualPruner + initial_sparsity : 0.05 + final_sparsity: 0.70 + weights: [rnn.weight_ih_l1, rnn.weight_hh_l1] + + embedding_pruner: + class: AutomatedGradualPruner + initial_sparsity : 0.05 + final_sparsity: 0.70 + weights: [encoder.weight] +</code></pre> + +<h3 id="when-are-we-compressing">When are we compressing?</h3> +<p>If the <code>pruners</code> section defines "what-to-do", the <code>policies</code> section defines "when-to-do". This part is harder, because we define the pruning schedule, which requires us to try a few different schedules until we understand which schedule works best. +Below we define three <a href="https://github.com/NervanaSystems/distiller/blob/master/distiller/policy.py#L63:L87">PruningPolicy</a> instances. The first two instances start operating at epoch 2 (<code>starting_epoch</code>), end at epoch 20 (<code>ending_epoch</code>), and operate once every epoch (<code>frequency</code>; as I explained above, Distiller's Pruning scheduling operates only at <code>on_epoch_begin</code>). In between pruning operations, the pruned model is fine-tuned.</p> +<pre><code class="YAML">policies: + - pruner: + instance_name : l0_rnn_pruner + starting_epoch: 2 + ending_epoch: 20 + frequency: 1 + + - pruner: + instance_name : l1_rnn_pruner + starting_epoch: 2 + ending_epoch: 20 + frequency: 1 + + - pruner: + instance_name : embedding_pruner + starting_epoch: 3 + ending_epoch: 21 + frequency: 1 +</code></pre> + +<p>We invoke the compression as follows:</p> +<pre><code>$ time python3 main.py --cuda --emsize 1500 --nhid 1500 --dropout 0.65 --tied --compress=../../examples/agp-pruning/word_lang_model.LARGE_70.schedule_agp.yaml +</code></pre> + +<p><a href="https://github.com/NervanaSystems/distiller/wiki/Tutorial%3A-Pruning-a-PyTorch-language-model/_edit#table-1-agp-language-model-pruning-results">Table 1</a> above shows that we can make a negligible improvement when adding L2 regularization. I did some experimenting with the sparsity distribution between the layers, and the scheduling frequency and noticed that the embedding layers are much less sensitive to pruning than the RNN cells. I didn't notice any difference between the RNN cells, but I also didn't invest in this exploration. +A new <a href="https://github.com/NervanaSystems/distiller/blob/master/examples/agp-pruning/word_lang_model.LARGE_70B.schedule_agp.yaml">70% sparsity schedule</a>, prunes the RNNs only to 50% sparsity, but prunes the embedding to 85% sparsity, and achieves almost a 3 points improvement in the test perplexity results.</p> +<p>We provide <a href="https://github.com/NervanaSystems/distiller/tree/master/examples/agp-pruning">similar pruning schedules</a> for the other compression rates.</p> +<h2 id="until-next-time">Until next time</h2> +<p>This concludes the first part of the tutorial on pruning a PyTorch language model.<br /> +In the next installment, I'll explain how we added an implementation of Baidu Research's <a href="https://arxiv.org/abs/1704.05119">Exploring Sparsity in Recurrent Neural Networks</a> paper, and applied to this language model.</p> +<p>Geek On.</p> + + </div> + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + + <a href="../tutorial-struct_pruning/index.html" class="btn btn-neutral" title="Pruning Filters and Channels"><span class="icon icon-circle-arrow-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <!-- Copyright etc --> + + </div> + + Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. +</footer> + + </div> + </div> + + </section> + + </div> + + <div class="rst-versions" role="note" style="cursor: pointer"> + <span class="rst-current-version" data-toggle="rst-current-version"> + + + <span><a href="../tutorial-struct_pruning/index.html" style="color: #fcfcfc;">« Previous</a></span> + + + </span> +</div> + <script>var base_url = '..';</script> + <script src="../js/theme.js"></script> + <script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script> + <script src="../search/require.js"></script> + <script src="../search/search.js"></script> + +</body> +</html> diff --git a/docs/tutorial-struct_pruning/index.html b/docs/tutorial-struct_pruning/index.html new file mode 100644 index 0000000..680cf31 --- /dev/null +++ b/docs/tutorial-struct_pruning/index.html @@ -0,0 +1,312 @@ +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + + <link rel="shortcut icon" href="../img/favicon.ico"> + <title>Pruning Filters and Channels - Neural Network Distiller</title> + <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> + + <link rel="stylesheet" href="../css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../css/theme_extra.css" type="text/css" /> + <link rel="stylesheet" href="../css/highlight.css"> + <link href="../extra.css" rel="stylesheet"> + + <script> + // Current page data + var mkdocs_page_name = "Pruning Filters and Channels"; + var mkdocs_page_input_path = "tutorial-struct_pruning.md"; + var mkdocs_page_url = "/tutorial-struct_pruning/index.html"; + </script> + + <script src="../js/jquery-2.1.1.min.js"></script> + <script src="../js/modernizr-2.8.3.min.js"></script> + <script type="text/javascript" src="../js/highlight.pack.js"></script> + +</head> + +<body class="wy-body-for-nav" role="document"> + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> + <div class="wy-side-nav-search"> + <a href="../index.html" class="icon icon-home"> Neural Network Distiller</a> + <div role="search"> + <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + </form> +</div> + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + <ul class="current"> + + + <li class="toctree-l1"> + + <a class="" href="../index.html">Home</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../install/index.html">Installation</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../usage/index.html">Usage</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../schedule/index.html">Compression Scheduling</a> + </li> + + <li class="toctree-l1"> + + <span class="caption-text">Compressing Models</span> + <ul class="subnav"> + <li class=""> + + <a class="" href="../pruning/index.html">Pruning</a> + </li> + <li class=""> + + <a class="" href="../regularization/index.html">Regularization</a> + </li> + <li class=""> + + <a class="" href="../quantization/index.html">Quantization</a> + </li> + <li class=""> + + <a class="" href="../knowledge_distillation/index.html">Knowledge Distillation</a> + </li> + <li class=""> + + <a class="" href="../conditional_computation/index.html">Conditional Computation</a> + </li> + </ul> + </li> + + <li class="toctree-l1"> + + <span class="caption-text">Algorithms</span> + <ul class="subnav"> + <li class=""> + + <a class="" href="../algo_pruning/index.html">Pruning</a> + </li> + <li class=""> + + <a class="" href="../algo_quantization/index.html">Quantization</a> + </li> + <li class=""> + + <a class="" href="../algo_earlyexit/index.html">Early Exit</a> + </li> + </ul> + </li> + + <li class="toctree-l1"> + + <a class="" href="../model_zoo/index.html">Model Zoo</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../jupyter/index.html">Jupyter Notebooks</a> + </li> + + <li class="toctree-l1"> + + <a class="" href="../design/index.html">Design</a> + </li> + + <li class="toctree-l1"> + + <span class="caption-text">Tutorials</span> + <ul class="subnav"> + <li class=" current"> + + <a class="current" href="index.html">Pruning Filters and Channels</a> + <ul class="subnav"> + + <li class="toctree-l3"><a href="#pruning-filters-channels">Pruning Filters & Channels</a></li> + + <ul> + + <li><a class="toctree-l4" href="#introduction">Introduction</a></li> + + <li><a class="toctree-l4" href="#filter-pruning">Filter Pruning</a></li> + + <li><a class="toctree-l4" href="#channel-pruning">Channel Pruning</a></li> + + </ul> + + + </ul> + </li> + <li class=""> + + <a class="" href="../tutorial-lang_model/index.html">Pruning a Language Model</a> + </li> + </ul> + </li> + + </ul> + </div> + + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" role="navigation" aria-label="top navigation"> + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">Neural Network Distiller</a> + </nav> + + + <div class="wy-nav-content"> + <div class="rst-content"> + <div role="navigation" aria-label="breadcrumbs navigation"> + <ul class="wy-breadcrumbs"> + <li><a href="../index.html">Docs</a> »</li> + + + + <li>Tutorials »</li> + + + + <li>Pruning Filters and Channels</li> + <li class="wy-breadcrumbs-aside"> + + </li> + </ul> + <hr/> +</div> + <div role="main"> + <div class="section"> + + <h1 id="pruning-filters-channels">Pruning Filters & Channels</h1> +<h2 id="introduction">Introduction</h2> +<p>Channel and filter pruning are examples of structured-pruning which create compressed models that do not require special hardware to execute. This latter fact makes this form of structured pruning particularly interesting and popular. +In networks that have serial data dependencies, it is pretty straight-forward to understand and define how to prune channels and filters. However, in more complex models, with parallel-data dependencies (paths) - such as ResNets (skip connections) and GoogLeNet (Inception layers) – things become increasingly more complex and require a deeper understanding of the data flow in the model, in order to define the pruning schedule.<br /> +This post explains channel and filter pruning, the challenges, and how to define a Distiller pruning schedule for these structures. The details of the implementation are left for a separate post.</p> +<p>Before we dive into pruning, let’s level-set on the terminology, because different people (and even research papers) do not always agree on the nomenclature. This reflects my understanding of the nomenclature, and therefore these are the names used in Distiller. I’ll restrict this discussion to Convolution layers in CNNs, to contain the scope of the topic I’ll be covering, although Distiller supports pruning of other structures such as matrix columns and rows. +PyTorch describes <a href="https://pytorch.org/docs/stable/nn.html#conv2d"><code>torch.nn.Conv2d</code></a> as applying “a 2D convolution over an input signal composed of several input planes.†We call each of these input planes a <strong>feature-map</strong> (or FM, for short). Another name is <strong>input channel</strong>, as in the R/G/B channels of an image. Some people refer to feature-maps as <strong>activations</strong> (i.e. the activation of neurons), although I think strictly speaking <strong>activations</strong> are the output of an activation layer that was fed a group of feature-maps. Because it is very common, and because the use of an activation is orthogonal to our discussion, I will use <strong>activations</strong> to refer to the output of a Convolution layer (i.e. 3D stack of feature-maps).</p> +<p>In the PyTorch documentation Convolution outputs have shape (N, C<sub>out</sub>, H<sub>out</sub>, W<sub>out</sub>) where N is a batch size, C<sub>out</sub> denotes a number of output channels, H<sub>out</sub> is a height of output planes in pixels, and W<sub>out</sub> is width in pixels. We won’t be paying much attention to the batch-size since it’s not important to our discussion, so without loss of generality we can set N=1. I’m also assuming the most common Convolutions having <code>groups==1</code>. +Convolution weights are 4D: (F, C, K, K) where F is the number of filters, C is the number of channels, and K is the kernel size (we can assume the kernel height and width are equal for simplicity). A <strong>kernel</strong> is a 2D matrix (K, K) that is part of a 3D feature detector. This feature detector is called a <strong>filter</strong> and it is basically a stack of 2D <strong>kernels</strong>. Each kernel is convolved with a 2D input channel (i.e. feature-map) so if there are C<sub>in</sub> channels in the input, then there are C<sub>in</sub> kernels in a filter (C == C<sub>in</sub>). Each filter is convolved with the entire input to create a single output channel (i.e. feature-map). If there are C<sub>out</sub> output channels, then there are C<sub>out</sub> filters (F == C<sub>out</sub>).</p> +<h2 id="filter-pruning">Filter Pruning</h2> +<p>Filter pruning and channel pruning are very similar, and I’ll expand on that similarity later on – but for now let’s focus on filter pruning.<br /> +In filter pruning we use some criterion to determine which filters are <strong>important</strong> and which are not. Researchers came up with all sorts of pruning criteria: the L1-magnitude of the filters (citation), the entropy of the activations (citation), and the classification accuracy reduction (citation) are just some examples. Disregarding how we chose the filters to prune, let’s imagine that in the diagram below, we chose to prune (remove) the green and orange filters (the circle with the “*†designates a Convolution operation).</p> +<p>Since we have two less filters operating on the input, we must have two less output feature-maps. So when we prune filters, besides changing the physical size of the weight tensors, we also need to reconfigure the immediate Convolution layer (change its <code>out_channels</code>) and the following Convolution layer (change its <code>in_channels</code>). And finally, because the next layer’s input is now smaller (has fewer channels), we should also shrink the next layer’s weights tensors, by removing the channels corresponding to the filters we pruned. We say that there is a <strong>data-dependency</strong> between the two Convolution layers. I didn’t make any mention of the activation function that usually follows Convolution, because these functions are parameter-less and are not sensitive to the shape of their input. +There are some other dependencies that Distiller resolves (such as Optimizer parameters tightly-coupled to the weights) that I won’t discuss here, because they are implementation details. +<center><img alt="Example 1" src="../imgs/pruning_structs_ex1.png" /></center></p> +<p>The scheduler YAML syntax for this example is pasted below. We use L1-norm ranking of weight filters, and the pruning-rate is set by the AGP algorithm (Automatic Gradual Pruning). The Convolution layers are conveniently named <code>conv1</code> and <code>conv2</code> in this example.</p> +<pre><code>pruners: + example_pruner: + class: L1RankedStructureParameterPruner_AGP + initial_sparsity : 0.10 + final_sparsity: 0.50 + group_type: Filters + weights: [module.conv1.weight] +</code></pre> + +<p>Now let’s add a Batch Normalization layer between the two convolutions: +<center><img alt="Example 2" src="../imgs/pruning_structs_ex2.png" /></center></p> +<p>The Batch Normalization layer is parameterized by a couple of tensors that contain information per input-channel (i.e. scale and shift). Because our Convolution produces less output FMs, and these are the input to the Batch Normalization layer, we also need to reconfigure the Batch Normalization layer. And we also need to physically shrink the Batch Normalization layer’s scale and shift tensors, which are coefficients in the BN input transformation. Moreover, the scale and shift coefficients that we remove from the tensors, must correspond to the filters (or output feature-maps channels) that we removed from the Convolution weight tensors. This small nuance will prove to be a large pain, but we’ll get to that in later examples. +The presence of a Batch Normalization layer in the example above is transparent to us, and in fact, the YAML schedule does not change. Distiller detects the presence of Batch Normalization layers and adjusts their parameters automatically.</p> +<p>Let’s look at another example, with non-serial data-dependencies. Here, the output of <code>conv1</code> is the input for <code>conv2</code> and <code>conv3</code>. This is an example of parallel data-dependency, since both <code>conv2</code> and <code>conv3</code> depend on <code>conv1</code>. +<center><img alt="Example 3" src="../imgs/pruning_structs_ex3.png" /></center></p> +<p>Note that the Distiller YAML schedule is unchanged from the previous two examples, since we are still only explicitly pruning the weight filters of <code>conv1</code>. The weight channels of <code>conv2</code> and <code>conv3</code> are pruned implicitly by Distiller in a process called “Thinning†(on which I will expand in a different post).</p> +<p>Next, let’s look at another example also involving three Convolutions, but this time we want to prune the filters of two convolutional layers, whose outputs are element-wise-summed and fed into a third Convolution. +In this example <code>conv3</code> is dependent on both <code>conv1</code> and <code>conv2</code>, and there are two implications to this dependency. The first, and more obvious implication, is that we need to prune the same number of filters from both <code>conv1</code> and <code>conv2</code>. Since we apply element-wise addition on the outputs of <code>conv1</code> and <code>conv2</code>, they must have the same shape - and they can only have the same shape if <code>conv1</code> and <code>conv2</code> prune the same number of filters. The second implication of this triangular data-dependency is that both <code>conv1</code> and <code>conv2</code> must prune the <strong>same</strong> filters! Let’s imagine for a moment, that we ignore this second constraint. The diagram below illustrates the dilemma that arises: how should we prune the channels of the weights of <code>conv3</code>? Obviously, we can’t. +<center><img alt="Example 4" src="../imgs/pruning_structs_ex4.png" /></center></p> +<p>We must apply the second constraint – and that means that we now need to be proactive: we need to decide whether to use the prune <code>conv1</code> and <code>conv2</code> according to the filter-pruning choices of <code>conv1</code> or of <code>conv2</code>. The diagram below illustrates the pruning scheme after deciding to follow the pruning choices of <code>conv1</code>. +<center><img alt="Example 5" src="../imgs/pruning_structs_ex5.png" /></center></p> +<p>The YAML compression schedule syntax needs to be able to express the two dependencies (or constraints) discussed above. First we need to tell the Filter Pruner that we there is a dependency of type <strong>Leader</strong>. This means that all of the tensors listed in the <code>weights</code> field are pruned together, to the same extent at each iteration, and that to prune the filters we will use the pruning decisions of the first tensor listed. In the example below <code>module.conv1.weight</code> and <code>module.conv2.weight</code> are pruned together according to the pruning choices for <code>module.conv1.weight</code>.</p> +<pre><code>pruners: + example_pruner: + class: L1RankedStructureParameterPruner_AGP + initial_sparsity : 0.10 + final_sparsity: 0.50 + group_type: Filters + group_dependency: Leader + weights: [module.conv1.weight, module.conv2.weight] +</code></pre> + +<p>When we turn to filter-pruning ResNets we see some pretty long dependency chains because of the skip-connections. If you don’t pay attention, you can easily under-specify (or mis-specify) dependency chains and Distiller will exit with an exception. The exception does not explain the specification error and this needs to be improved.</p> +<h2 id="channel-pruning">Channel Pruning</h2> +<p>Channel pruning is very similar to Filter pruning with all the details of dependencies reversed. Look again at example #1, but this time imagine that we’ve changed our schedule to prune the <strong>channels</strong> of <code>module.conv2.weight</code>.</p> +<pre><code>pruners: + example_pruner: + class: L1RankedStructureParameterPruner_AGP + initial_sparsity : 0.10 + final_sparsity: 0.50 + group_type: Channels + weights: [module.conv2.weight] +</code></pre> + +<p>As the diagram shows, <code>conv1</code> is now dependent on <code>conv2</code> and its weights filters will be implicitly pruned according to the channels removed from the weights of <code>conv2</code>. +<center><img alt="Example 1" src="../imgs/pruning_structs_ex1.png" /></center></p> +<p>Geek On.</p> + + </div> + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="../tutorial-lang_model/index.html" class="btn btn-neutral float-right" title="Pruning a Language Model">Next <span class="icon icon-circle-arrow-right"></span></a> + + + <a href="../design/index.html" class="btn btn-neutral" title="Design"><span class="icon icon-circle-arrow-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <!-- Copyright etc --> + + </div> + + Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. +</footer> + + </div> + </div> + + </section> + + </div> + + <div class="rst-versions" role="note" style="cursor: pointer"> + <span class="rst-current-version" data-toggle="rst-current-version"> + + + <span><a href="../design/index.html" style="color: #fcfcfc;">« Previous</a></span> + + + <span style="margin-left: 15px"><a href="../tutorial-lang_model/index.html" style="color: #fcfcfc">Next »</a></span> + + </span> +</div> + <script>var base_url = '..';</script> + <script src="../js/theme.js"></script> + <script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script> + <script src="../search/require.js"></script> + <script src="../search/search.js"></script> + +</body> +</html> -- GitLab