From f34be7bf16ec69310fa9cb26a4e64ad2aa0ebc23 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sat, 25 Jan 2014 11:34:41 +0800 Subject: [PATCH] Create dummy files --- plugins/sfxr/CMakeLists.txt | 3 + plugins/sfxr/artwork.png | Bin 0 -> 44968 bytes plugins/sfxr/logo.png | Bin 0 -> 1109 bytes plugins/sfxr/sfxr.cpp | 592 ++++++++++++++++++++++++++++++++++++ plugins/sfxr/sfxr.h | 157 ++++++++++ 5 files changed, 752 insertions(+) create mode 100644 plugins/sfxr/CMakeLists.txt create mode 100644 plugins/sfxr/artwork.png create mode 100644 plugins/sfxr/logo.png create mode 100644 plugins/sfxr/sfxr.cpp create mode 100644 plugins/sfxr/sfxr.h diff --git a/plugins/sfxr/CMakeLists.txt b/plugins/sfxr/CMakeLists.txt new file mode 100644 index 000000000..6d3f61a0c --- /dev/null +++ b/plugins/sfxr/CMakeLists.txt @@ -0,0 +1,3 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(sfxr sfxr.cpp sfxr.h MOCFILES EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) diff --git a/plugins/sfxr/artwork.png b/plugins/sfxr/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..3938592ca936dde89545f1d2f63b67ccbc74669c GIT binary patch literal 44968 zcmV)$K#sqOP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT2>}-v5CPB(J^%m!24YJ`L;(K) z{{a7>y{D4^0Iw)XL_t(|+U$L4kX^@hUiV$zKJ(rT1_KZTK+!TmYy_wzbU9*3iMA=y zq$sJ%<=DUND!HQAik(WO%8JTAvXoq^D7I`zwq(iC;wsCcol<0p5_hpAN0vm900@8- zNpKN}bq0f3-n{kR+xgBp-F@$SvyhB_v1;Cc!#D5U+qe7c?z5lM`p}{MI?!rNLkj1VI=CX_jfN@t$rBL)>Bvu2Nd#U!d_O2r~D=WkD1LftEkR zD9B8f8WZ5skeV?DAE%|bl%&HfGq^HPL7L(r=&6aL((>|BwOqxeVTc=oUawoPHwMX| zTrOic80P9~yIig$$q>Vj;u!a$SLI4&WqEmdWw}7$bu-MB6diEtLno{uXF& zMbN^T?c35cNoB;qD-4xUgFzp6Vuba29pChOJ;E*wCnqLKD8Bk*{*ALp?^De>}X-1)$0pa7x+Qp5Zxbwa%6Y{wsNo284j`M zLhMmopqVI954bD-W#qTvnc^4dj+X0rqVPFUE+RRa|2FuZMo4gHOy~e`z!N}Ifo%<% zf@YE-_IHGy;Twzs^OvAQ!vSu?HMkq^F%uXprYPeH!8LdaI**~0;<7wZpu}q6ZbVz4 zy%j-=XtyPaVj2*HwDEuuo{f6|1)9S+!CBB>^u1cGlxfdJ*Y4Vdy?%LquHWzD&TFo@ z=K8l?4-moKfC_qvy@(#5ZM13<1w=C8m|!Sj7zkl-ThHY4Msr9+h+l3_jh#p^UYc2^ zRz%3?&mp6aNmQYx+0~&5sHGsrx8TJ++zvj-#EOVbk|tpkf)5g2n6V_G1rlP)Q~VF4 zhR^^mab$=%K@>>wXGSE3xn2(O03u_NLS!lm*?i{-7a`mx6_@Nm_S3_ zUYA-ALhLQ5=8cI48o`#mcjL3JuB8r5a;Q@F&8p1}$=1y2Az*kU* zS39eC444si_RgIC9O82u7k~)JcF+EmxHt2#oqyBhoAq=p6?88(d7d&uX_b)tUm=z*PXE*Xv%ry3px#F#hJ`Bz8aaYupPZnpBM- zz_%$YF0#c{PJ8q?iBgu^%AQx&mX`59AqJWaTv|C(1U?Umyb$xE{XHNFG9=}x4_*wm z7_v)a2@&zo|3S}O;jNWV|EG!yMAx1cc}&3Uo4E{HLKNRc%r;6IaJ>S=|& z5fU3olXM9nBdVatKSG8rvH_Q>l?qzG)5~QtZvi9hepX=OD+>$gA4pU{jSN`Gqa{M> zS`d)YjoBi3J+hPy5h0l=vJAtTnwoy&pb_EJ0fDB;V$Gm+r88j4n6ozsni_jk5J_23 z-2(0PL8CpMI@^s%e&}(^wi{-SN?W9iSOD;0*6%eYo6v}f22`s+>IxbNqkgwX7ONoa zb~-)qAhtY30a&LAtgxt9dQ)N|7&ReVje?8`q+COl(IJbSnGT?EMR6!fnQ~@k5j)wl zXod+v?^LCv#DXBrCCFC-X)=JK14!^2Gd(>$4U7O8NEBv{Xja^Tc#mPTQcs40 zjP`E?;!1DvpXOgV4~ZrD;b&C z2vFwd>wqQ;6ax>u7&`W%ISz=ld*-Lpv+h=Cx=jS;NNdt4dnV6WUR;t*~qw+d+6~s?y zfvmb_vx)9)-#!aH2mQHt@gmkl!sa=dGxEO-1|Bpb2gW+Xm9yU!7rGTx6qyE9AmK9E zkU`6~KwA&ApjNM!Sb?Bz!lp_I>q%Th4>h5zKWvj1NIh>a(yzhn!~s#MRGEIHVi+m} zdTjVgSiWNqGnvN7vS7$pM!XWB8nz0v=~t9)W}`gXAOx~gQ&Uje!AzqN$`<6#B~oZe z-Jv)N=BGR(w~T`lZ&))MMep>M&jt9&Dw7jPL`z~eRtEoJjFbrUjl zma@eIk|)@86<^ltHC}K%wl?&Sn)Cm18S_|pw0!FZ#jn3lId+ZZ&k zshBhg-U<#nuaP4qK?G}L8aI4ZN5xUhWO$R3yf1_xB1A~P$s{xiJF2tT!Tzq-8;x3HcKfXCy+(baZYKJbE_kA$ z$UD;6*|Dcsykj^($p!;x`s|G(<%~@Sw0f95Ml^-xvWT!%R?5Li@!;11twf+Y z%7<6xui_ux{Or%Z9YPx(5B;5a4)6XjJay{1u}M09{J65-4|VkD&DMm>iyQPLR%}3E zfCJ`hkotgEsY22rI0r@xd{q`SYOOd3Yvo3>)dCa7HoNwky)}MaxpL*)`EyZRT3TLe zG#aw~#ZZkorXbRll^P49U1}3_Zu;E0*RVo}J~3n6KDz@f8^fqKCKeVJ21$Y?vN>pB zK%liITeS0&gqd%O8_@Y)Z_sQ~cq-YaV^F>--mtelBw2#uT^j-#IS^UEC7F;tCL~gm zeLdvJTZ-4U+8#7cP#LXK>%`$$bvD9pfi?zO)aiA}BTz0=v?sVjsjN6E0>3JiGRE1^ zjcTphz1l4*MmGAwtV627;IIucj;RoylWoL?mG!cXni-fm+qi8T4kD9C7F;$gh!sbX zIfCNs(0&k?NOU5npjsWQE-o!$O15p=M&Wy)Pt}llVkXQ&qO_rSMI0##b!MgA#-H1! zryKP;g;P&Wfkj@tc%fRYkO_=JTdfm^qLgY?G`rqXUN$|~&kdIi?0#W7~G^_Dy62Z?}MRCTd@iFs!&6JGbDz-J`b zKqpSv5iNw121t>m3o?-xLoybTx&xTlj!B*ia6n93$P%R33V_1w>?|quJP(*QaAd$& zD#Z|0!D=TbCPCYX1=nh5;nL+x*X_NIEpaOnMM%LoI8tvjM=-~BQoq@|&_R%9p{rh9bj>+OYa?=sJ z+y`WtA%f0YDrQ7tgZwQgP8>H@fH}JE9`GIq*`46c?0wMUs?eOWAf|ncxwE>8&n3SL zd$Pvb&BVkcx?QbQyS=W6o5bU?41?kTXuASdR+dZrg80bVQVK${ys|7x578v1Tg0X- z;8&R#-NeWKMnEGSt488+r@bo1X^|sAQ_(AY0zPfXf0@X_$|!p%u^vD-e2JqKJEDtx zDN=_#cE+VJ83rxb0&Oj5k!)O1EO0aSeV;Yo66X5)n~~$;Dl6HX+_&8$*}xb~}&>EBwOzwO2u6+8_)Q zjS1*IDf{+7W)>G0@gc5hHCy--;vGH#tR*tH4X3B3fhp#}n~*VKM8JBzlmG!0tG_|e z%H)nCr44+4a&l5xuLXKo7QXB(ec}yK;QrDn^DcDjvn89K&=yIUt>9x!7q zU|XP#fkuH4afx;zdMO$XxEneFCUtpkjyzYCyG0>sY6DU%l9PIquZ?aYt|ZP>P8`-c z4=17kpg=>01CH41Q`1vGe|~Nr3>h3yu|WWzQ$P|cDBM~=G1DCU1ep>l`~3Xem4$^) zXH|?&z^-1ScnpZ1#E#>5&+a{~W)q^~BJn$q7VTRLzcwKk}Zq1E>5tp<8q>ECaI^+ktZR( zHehlKw6&l`68XupT33v$6lfO5;3w@@UdHp#*6Pv{KDqU_Td|>+7MHLQpMU;&PpZL9 zq99a1#j7>d!ti5uNrd836;GHJhp_V2Sr8M6rXVq{4jrl9UF|?-;^c!=6gBecW?5@? z7Sqt}QXbmnxyx)6s{!9D^YaPo&^->R6BZ9rMA>EJwJvj15A8EFzHNG&X74(9D~MjX z6a!3&irWMk)Ws}Sxskx%GA^+Ni-|V%U72cL88Ro12iQi zj2+bE3IVv-(v*7KA9N@Hm2PY_Ca_3|jRqm!fc$I@nwayT_R(0B!pyP!nsK2E5*ygp zSZ<ywQYKay>SF=iQ^pBeMuD&v9*gE&$^j-r|~ST zE7&NB%@Eg};@koZTl~WkXxeJEz~exz!24LRTfr?r8CbLO9z(mq41pctvJwRlm98!> zf{9~Qb_bq{CqZcATtiYO zn1l48)?ldgdr0o9gvrL541-jHt{siRUSjt(m+}#dqS-)Cm0}4oRp}`+OR`id;23Mt z(i`=U{QgIc4~u73Ej=e1CM=9!=;z%0JXp;?{@?Fjx0hTMR~F_!{;`iM@(YG(q356Z z+-E-cn;%@?I+{m@OXUXjAO7RN2cUQ~CgPdQ&0Vf zLQs?RUBC3MU-^|^b(z@(ON~;W{F6`q?!WuJ+zh_~XeUmb`14PHinBce5KhozET!xA zUI)-V`jL;yh{ix0GdV0REj@kw>2Eyn^A zhOr-C{mHA3JodS$`^fMAC-MgHEgOM`7O>MUUb=YhwQ~*wz!PeT~M6a%9 z{k@A{M~@!;?C1Uxss;t_iN{KhOHdnFjz-;J{6H~#DY7aI2E)F}vmX($#u51h%-a@j! z{`%{2?=3%f%U^%#OXtp?=Wqi8ZDC;nq8leSg*K9&bGZaGa#2yVP9Ma3$lm6mYz`|) z%W4gvr%&LoC%^yX+A&MkH;GVTpl#A5IX|pT!0v1#c3&r2g&fqOi?&N|zC3*Rpy(*j z5YV;GY6m#tAzWd(yi9h-TIH_N}oK;}l z+y{U5sXvo1e)~hevvz0?KK$VG&;J;^6dDMLyo?FeDhWnF6DuqaCh&_6gPojgx~#0A zIAQfpLLEUo8&xsAh zu3mAYu=n}##~-sLz?df#LHo{kzjOZL`Ct3hU(?Q+{r>yj|AjAo0c}u`mtg|dkNvjN zZd=R!C};rWg%_T`;f8&8-Fa6LsF|7V@4ffEU;f*_feih=`|jI5v)wWjC6&t5LytTJ zB!S9@{>{I2vACQ#8|ZuPzULEv^xq>^+j#bZG0+}+?6EU1o%yW~{+5%-^VJWY@EgDJ zo1gou&;IbqCoO2~fx^;puG|_$8^=*XR#yl-ohYTsH~~@dz-G;2*bwi;j>~RQC0X9< zZgDAbX5To`+$stjKV)f`&3n&;%=7YC*Uw58Vvc}TQgjOFtZ;;oXxf0RSSIe=`E$=c zciPcmV`q`J9W9On`wu|aSh%_%s(oR@*yVrf^r;O^s9L@D+G{6IJ)+q5UWuIQsWc<@kXb+ufsWVu&P z7b%>44q$)z?t9kl^qDg+g3(KWd&U7{MbKV)`K9Mycpl5$@Bc%G4(;5r+8UKLSjik1Km{N6UbO$dV>g2^{3 zZ<`H-8e_vP%23R8%)aiBOIeWby$D(^O&A|oZ6NP0E-p!izZF}ZiA?O=KAyy{W04JZ z@7^t{l@lb43!SFl7%$%a{LlYON~Lq5L`8w)(Z?PYN@iE79sv!M8`7Qi2|Cbz=@;+( z^Y_dwV6DEKd!YI-(t}I7MZo z4jnq|h~F#n=9XLj1r!162y`)=GHrzvZ_b1Cv7|-Pq0~bUJ#_if=VyW-kX?5mYq#@o|DwnIZ>YaDq`c&KL3A8bMQYuOL z;BdXMaq<91>GK}W3iB=kee4BylP7j~zp0JMBsMb4ygV@WT3K19cpIR=aZpwebQ+-) zv&H9Cb^;VRK7K*^eBz03|M1BlL|mcMOADru$7K!DPC{5q-WhI+?dF^@n|T9PiM7sU znJs9dB^UUxC0-PEp>0f}Pb9@mtgI~IGpet`h3ax8Qro}@md?}SnvmROj2LRtnzp1*)UfJ$Ju%RBKYsTBJCWkUUm#T=EKk5wwh}Zb<5rq~MN$ zc6siy2TjcUEY_DMCnj6X7C3ypUXLgZ>Oy3*T2w|^FIfU5OmkR+6bj&tFkC-umt%A! z+lt<2>3ATG)hLxDt&Zj^C7#sTkjeEH9CXx}9C8{Xsn)AZY%=3HoulK$#p-C1lJZfQ zzp1Gy*?8VW;K@HpwHy@~g~6yf&&FR+DTE*_Mdgf2-Ik>+7RE+t@SG|kpxMjKXiPKh zlm2)bH81F4mXI{f124{;=DhiOeFCc0)x|}NkW+qy)I~9ugt0`}>~kkM z705^*+?vio3*)FPu}`Dcr-KI$Zl9e!d-g0O2jB_Na-pLDnikNkL*7zw4_ZdKOR>9B zJL8-icp;a~I29`wEDiL2nMcBAWGzMEN@v+8ZLJ0Ex#ynqph2d>hMb_F%LW!Y)HVr9 z!(~&`(^$+At@4mcdvI7U*Xj;bq$1u&N*72kgbn}h1nIHb}2Ntv-UunigZixr8xC1ths_yU2fIvWI*k zvc7WiMoJ!sOljrydd{3o#n2?zjOU?oB6?EDnW|9c0cE>3IN`TYA;;1Usod!dSfkvB zFA#efWi}||D=~P*lvkwYw8>=5=B{m3w?JwMiPKFC>cVPAK+A6%G3t|l&B+5o1zjl! z@u`It+d^q6D!UMp+&{22hRm4Z8A9mL@kSR7MO5Y4=T5))(u+{VT2s^YT0_bndC|^~ zOh)A7`Vr6$A3D5e&t6g6oS-odTEH~IDm!M}QNf~J=pvEF+1fa08?H1x1{#qD7HBOs z9|i5NKL5X#mzF$eK@@=Tw!0ndhf<{!uxo!}auT3nCDkC+_>>Q&jje!YeP8rEtlNU> zW;i8Mj|VVnXLRD=mP}rMb8G{DZGusahf5@9=`bxyM4;RO(LxID_cd$_ za-pUyNzXO4i+gphiaopc^f`&kFGtsT@dH@$DaoCdw3vc0!ww1#99O0gSu5rv58Ar^ zDNd0N3MC(MgC|zZM1zi|C@gg2X|1u&vM@i7KG|Kd}WU7sdu#7*l!V}H%4Qc(oW$o%>V@@zqZ z76IDteCWg0Y0BGF8vo{l4?OqdXN{K$M?nLn0|HPq$r$CTvv|<3OV6A+<3a0lbVE6g zw@q)Og585Yh-`&J%E0%a_5>V~WfGEg!MIbxmZmV{{L&F4o$Lm)MoD2s*y<>fsABED zY33*sn;?b8OW6gI*GKH`VxkGcpeVbGzbPdfNK%k+RZf1$>K_&G*STh9Y+zZ@Q0N60 zBbmyIB{!nbYs73VX^JGCr|w@SwWBjt1Z@o-vI-1@>@f=M!kIZV*Lo7HTx+b{N7Z}q zhK$g~{bRYL>GV4~%xett2^{Lwv!|Aqmuj`@;^N}ml{qjZh~Rle!XjvF2Y&RiN7aa% z(vBTVXZM~x<95a(XhIE(qtv+-OHwi9EDc+*&-dSfcJRQV{reB#-@*L{Arc=ta2TIJ z|K^ou3KCEb8rXZeTz>5FM~a_&&~Cf+)^fSzK_f%Uu%BrxvjkYJcH7X}msghn+92tJ z5CF|+^!!Uv(qh$&zGfajB)_l_> z#l=T%I&$>L&Er--tC{7MJfKDcC=iC}sci+W=wu2e01`mw%a9ex()kPL$T?fBjQQ=Y zt#CLL*-7Um7foS#NMK#yYecx(5VYirpyjDVdW4fx8E9uV@sg@s3vNaBqH$S;284;H zK&a4?PK$VE`wT6JovGRnSd*>&;Wh__L-L-dQ!ct}LRFrBdeDFsmd=lU^yJdg(z>9% z@80`ju0J!n`Rzqy#_sopPU%9W8~lHHdAU?7W5MCgdetQ|0ZkPJA%_+AYD`HdVXplY zK;sys@cTdbKKg9(5>Xa3NO!;R?mIkaG{8~}1m@=F78kE_1q8B4l82jY%Ke~FC|Ubd z(SXYelb{xi8(FgrDrdM7NFv;G9dS?U{38+8&|Iq zUEaHA&%PV>tz$W2xE_AwVX7-@WfSFNGj&1q;2_e>jG9ZGSdnoRDwp#t(a6rtQ3S2{ zXkAz!dXzfLd046F@y0sFRMCXWxeH(m2^SSA$O=|)*|TT&jr;cbDMxQko<8;3h4byz zc7HI4N-^$TrpUxa<7%N6L5qU0QLBRrfBT7VuM672g9mr*+GWk4Ye3t(ch7+X2XK>H*j;Tzk4j1Ir{VAPEn)!Q`#N{Skhzq z1}nuIINho2qr`z_F0X{yKbB3Z?CMvWB<^v@n=Z=k=y64rIsUA#Tri9i2??LuZ+q8m zx7}{tD1|^V{C?n@51b(9bJiaW#Yk`6t&Ws(DY#PZ%VE{Xik>`+90WQHbnMe-GY51L zv{8M+zGJ~B^%ieaU?G&EA4rW}XQA^!Buw4Gf_sBrp0!kf=ojy}6aR{lVfX+2S5{Zs z5KpBt3R#x<2uSU#Jr_XZM5GX${(Im1-tGVD_GYU&1{$9C{`)@gr~mU$yZ~JU?U(Pq zx2U6d8~W9&3*UI)>s_wC_|^aOcL(+#oSE5PoY}kYx*PxUh3sfNK>C|6|1~&9#2wDP zQw7kdT0Ga2`R+e{=dSnMU8~l{K!XB$`)#*>{hMC{XzlI_?rzj4G`q~GJj{Sq`vBy> zN=YFF;>)p3ZuD3UX)-A8#kFY}R4eAhap~WYn~uK0+@%vIkBjx`$l=`8dQ;)OU+#fe z^iySJdRNq0{&Ocx6-;K>!K5QciS*~8^(TlubsAANh@4a;1uPj)G zK_pzu??E=W8S4QkfL0Xwjg9-K_-8YEzJ{fj9Eo7WP9@KBfpz#}rM<)gb~?7!i?$#C z=;J4kUz)#6l)|Li^BkjDeR8X+02Nfa*Fd+|IdkU4Z$0?H zE3dwcm6jv}tpk^UI|5ot4u?>y47WV~_@npUd*52nuyw!jt$&c%V=`}q_E?Z4OQ@t; zM0}&$@1hxf^q(CZ3H7u>QzqqUAZ$N-a9Fx9Gk$&BBPn!H5SDTg+*T8}XV4MR4P0>&E?`^X7>dEl$})s}5yK?Ao@oy) z%i%EfRzlKkD9JF^VYU`DYi=4{p;itGW3l8&RoGlZ@N}AmRPxjYQCx~tsPe>O@jqEQ ztnyU zrg84a!ilQ7Ak|9w8R_2^Xd|G}DJ6M;l6z#3+0sV1df)z^k>aRaEhZHc-sOvPV}~RB zG;6)Jt;I3+;>+QmkSikxPES-^CQeCFj+_n!%GJPBHqx?aT2ZbDs4qFBY)NvOgSZqE zkL#|+acN>=5^qEz=Y}%x7mdoXxN_nwN1fDOP`rBqlQ5x zNjF$bY;vu#yIXPOaON`8r4dnbQ@!RGh&pT3uY6=W*Lg=3Ei>L5|mFB<0!xbKe4#!Koz8r zj&<6*T&j#>Z-%lF$;%x&i7{9Qv=N7&Hr9iqZDo6zTvxTzNaM29*p(Sc{HhRQB8q`E zk%^4LC!c14Yg8$(tU01%oYzRZ0%KdCtpP1^rzDxR6=1j_!XOKbE1x9i>}2a^E(%`j z3MqOt$a&3jk0e)> z?VeA69&#-!Z2hde+N;)To&?JAhirdIUGT2x@N8|xT~zmHebBtW*4H+&p<2qvR8j9a zD1E>=BBdy*G0#l6V0j>JFQRM8`*9_4PoffxQo)9ms=o{&}3!4808(Athc|q`^SU;xk99|k&7nRX&*q}F|I}OwZ#rOm@W22O; zt%ePXfmDYR7AOLp6k3TXS*M0a^(gIhAO?Q$=s~~F(FA!UJ%txbo+Haw;#3r_y*X$u zLdFXTbX*aWSUM+58cGw2vgSf?bX-MBHIKa-2g0FP*OUA&iKu01G&36%m9=)C+()_v z+IpbrqyPMXJI_^ONW5Q2`=~T7$}So-+6)I&m;kCd{X6&C#sBYWN>ei}Isu0(*pz6$ zh7!IKh^(h9L(&qjAvy(bXIICZ84io41$D>vT=*%UaH}K{6P&kFEn{1CI;#W9+X_o@ zg~iTHlCL>|EpX#iqmfYBr9P2e%!WK{0GhTr0GS*zN^(IEafGOt7YwJIqeqyzGVOCd z%3TN~EsJa@ClF{GPp7>@M}lK{jtdEJE+@i;?`dU&;ne+P-)`P zMh%92iUJOaT)ZjJ3{_bRx}A2ZQlT=7<eNC_LzFK;ZJ_Ch?#@rM z+{=|R)_Tl4l}}8Q{2ZlypqKHMREr81jwF#vif$`Xypm%7bsp>hT0&8BHdvewZLu}} zy&~aksK!?D_PP6HD`uOt>UBFMtb&NPCiK2SLdolZmYc1Nmb1Yqk5TEtutyaiD9vD4 zZ!|DZ{o$b7>tab&sRmFPpGa1Xk&G%T;6pYt&g&3Md8UaL1d=|lvP_NnXSP7w0JLbm zFc!U@kx`4~2<(LAJ!s|8U=Z#N`nkjwW3d~gq0bbO48uf@!USSjqm zDRfqh(FJ0YThvCd8rsMy;3iD-}fYa8sg(MhAM`0`pQN+2p=RiET>Q zlM=X4EgQ3H)^SK|2pXL*N~z_N?-!VXYEHKLLy8ik!n^?))Tp8qNp(?|5*50osAMHc zEvFS`a=NmdO2C00F0aEwTL>240&OGEqCBNRs{&h5g}TbcxGBZL29+_u!>YCFj_o_J z+?SV^Iijm0W6M&`TcMpL5}PmEXC*u_QE53EIdI>y?TL=uTjRAdtTZc9M$%kXbv2Fy z7Z2>Cr6s|fwI#N)iEWq}xOUmM1v{=yi?qa0Z2h6FY~xO3NI7T4SWD5H1WkmE!Jtn{ zO1Zpy_iph@My0sjZl_e8G_hx#WCp@ngZTcEuW&?0BQ z9m`G-8CtC=vOwn5G96+=X_{E^6O)r*F7-N9q`!FiqBtEgKC%z%xl*pB*+7Cv$V=)P z3}|b*Y^EU36lO|cbHj|7k0qDESZbDqnNo$sGq$bz{3c^fIdY6i%*uSKT*U@aj#OqX zNQJNv!}a$0_y?8wj5w|Umv%edfDhR!$7Ne4jU!&(ENIYkIGlBe$*Xd`^K!X@C%4_T$N7@wL5>x$rYhoxSuyKCoc5HV5^jO^MnDU%*|kIYPz0a%wzhnn z<3k*{Ol7GhQHZL>aiSgciOX}BL+I)BfKm`ZEHBmTwN`5?iUXhdAGibDQsS{TWWp86 z(sE=}p0KF$KyaJo#U#rViVaC-iMzz@Zhn#}WJ3nt80RX;6`~_;jZ2|Z#J%0cl(it~ zBQC;T(id`t=1qb&=nte&Bd6gKl{$anJcmF*q7Eq$IiOM~&B><3^!dDRiC`nMHwWB% z1!oJiHw9XF&9ytchgL)!*AKVnb^a%lj7$(Aq560H^&+#o}p{l%WL+)X5Wu8odxzfQ^oF<#e;XB6WCF(*I#Ww{S9hg`ygCqC4 zT`Db|W|uBqM%Nb?7r_wgwfgkbbgMZ9ia>GReL8}IGUAj@B^YWj^Z}mQdMdX-dlR5p zNjVRp_SNSCUqL~{G&}Y=Iiyk&q55Npi(?n##?EoHfIN)7c^FN5B5eHy6L{!*Oy#b zK<#3xV;N~eSJSeXPi%fk?C4}0SEHrpZT|@(Ew)sAvF9M zjDma=_8O1y8{A-H;Vf?$lh^n?=0KYYP{025Z`$JASXlVm+cXLg=M;!!CZow>InR6f zbMb`8Crz>ixi-mU*&9=WXFM9SeqWT2PmfJmAn{$U7D=!7HhsA`yL_9z5df5?Qp1fZ z;)3WAXyGt1DjOx>mAQu95Rr`M!bmF>~8s{MR13FTg1ULPJF5y0RBq)I?J zkTgoKudeW#-+ue8stVFKx9xN`&5{)NvtBN6x9io4DmQUVip{pgb85;uA$fc=8K2-S zSfXXt^Z7iX_)gV2F_zd#wd_5WaGx=;n>X8&PVa_jtu*ApMs3#tk8KdWs~WUzNBP_h zb3|@}FY4qRk48HzqkZSs-4<;OVK7svVSCPolqEu<@#N&=#~*+G1q1*hW(nx z>3Y3{1rdjhN24^&5FJroVY}^#!O!sBM$BaJxVC$29W`k9&2zMRmi3k$YQ)F5?H(aU z8#|1W8T>+gRk+i*S`F@t$`3{N&{H`sxPjdwh7p zrE$^A%d4}qb0dw%19*IV5QsiOVu7ID1jX;}e#c|L%Qov3w&wNK^-rIEzP`S~4cy<~ z&!}+Hu9r)r1i=b=Jp_EodcDFcNs_PUgn++0Z@vPheZ_qc?xgxW?8wRj_5djD8K<7= zt=+E-2rTVX1NKI-qqYt9ukFAXVQ@6sAsQ_)@&R8MViDA)2E|6nOdXMsu^bQc(aHF< zD9ZJE^V>iEft=v-;_~AB9BIVG`2}3vXgI?DlMHuX+TP2DFZav!ay%a6#@Ak7e6?O7 zlX#m>H=E63xxkO$Wh8DxA7))WO2bJ`t}H5wGnIvKVca<&#Z*H zX`L#gF9?K=85*gT&9nHfgqi@gpOpyz!~}md+Tj_Eb@#@{Si9Dj?@%{V_!iekcyV!o zH~;AgKH@EB6^7Ql+ZxK=Y8}2Y6k|TCBu+l`Z zDq6cAh6X$C>v~7L8k)w7y@WkzvBg`#xqB=YVoFKMTHl=Bs;z714=bm{Zet2ZqaC2p zl7GUYLBE6OekoFfswz`5?2YEL`C_?B;#6uj6r0TlLuAL(>FlRZKjONx=^G-j?P`ro z*(eJ?e*6KJ!hSVM`Qdmto=iF}^I}tyueELG(|JD3PbX)QfCZcN=JYhgaa9#%B>p-c z8!@x^HgpV7!JdpqutzW3ey?+(C(sxltS>q!K*pE1zQI;g* zo6Tm+)$#&CmcmB_SkF&S@FSeIbUZmvl+^Cm)QnHP%erd#S3WUGf%Y`d6*&l|aa{RX z2V+RI2{ET1*oONG8T-soN248_(KsV2H~={bNcvNdqpa8OFBc0AtCMw%jMZ73U@a#4 zvRck4c=`5%*dOMG-%PU+R*&y|`t%9zhD|kP+yRBaw>W_$NXu#Km)B>k73(-ZznGj% z)|=Jm`ZOE$a;`DV=Y&1xvgE(H%CTrsA6DtPlxMX3QaYQfXAdnUYhk z*N3T&Mmt2KC8CqWa??(ZknR0u6H9hW+*59g!;(l8dRgz^|JT1GXoQP|+jxC_#y0xl zEu|M8#jGH2)KSJ&6L?ceWy$DRE8*I%*W zrf<_9KYa=$jVT03fcL)g&&#$fL~JskyrX4KuHkH&9>gStQb}*T`kzf3Ag&cvSD40G zFN=hkuC|*E_1Si6AFi7n3(CqaU6u|8gTT+5VHt6lT3^tL6%`S{@@Ua8B5 zU-(&DcIo`2mTQ;$3NDVJ#Er?YKw-kJCe&z=Cr!*5Wu9d4hJ!&~kP5uCJZg{SwKei< zewH#en0_%|k`5?w(!2O6<=t@aZFw}>AsQ{dzPTj8Kumn4hG#jD!6coC&5YCIO`0aA zF^lC2?n0e`G|lj%Uw{13z+ec!aI63L{WlW@XAOYNjO1>|!muj561NI-cM}bbC)$zbW1VKHp^H7+&6H+oF}OGD}t|UQ?2V=T?H8gI zduDtz+F=?kc8vW>znhLsM|zRWiZuwxdD6Gp%k#_gk3W7w6lJ-`X1l>l5j8Fri@*Hx z3ygw|h0h4cWSe6VuWzpx7ni2siYsrZl11S;_}_=ehx7AuJS1$;`C^WD{kMPn@3077 zjKk^i>1nlI-CW;XU0&O+{dy2tgU9W+mEF)yr`g;B);Hcr-NoL%Snq__~qhAHASLGC5IKAYjVBOWDL&jq?9h@-(^eO4aC0WI2I z^%0}sXtYB#nr%&kwYgp2I8NtQf|8CW4XH*b#Y(=OI%x$y+nD|hCxq=N0#l-bPbn(f zXsfM%|KoRKXc~=1QYauGlMV3A8ZPGM_O{s4wGHwdkBy*+*_4HXULPBJOBxgQmT_6L zny1F}!Ux3qC0v6Lo;HSqw}_$KxT8#iNg#WPAy*-}ubi}oC+4o(8cunVjHt;`xwy7s zTuUtAX1!r%#>-Y_GNTVV8tveWmLN!CKwlYkW$XwnBUUGI5FoaK5v#h~tk(2S5>FH5 zc7;;}7d<&S!6zYALSpeYeS3O-MhInUhFk>m47lAzp676~R8x6+EDCB9VCfg<=Qs>V ztI+QuCc`RXg?G4~agqtC9Em0>4h<+*8&y1qCyjxIbjf9D72%3QyOA=OLe7))J5uf~ zaOQ-%AVugCQUw|xNh|h;Mz_yrQ`h*784iZldQ3$41dG|ZXitt8&Elic4$)}w`}a4- zhODs6DnyZyn8n(XR>TeWB!arJEm9IWEpGbcfV658e1BVV@$Bbm${H#yBcQnSfeSm5DkF z&7N?W8r70aGm4W~6F_BMc37vXCh;0}KJEgk71ATDVY6A|J2(=Ik=cN?mh&+)I~wf( zjh5KZ%Ab{ZeAlfFJ#cfsPxd`2Z6_ADKcf{$m>jG5e19K)xu?crl5niNm;G^fS8>Cw z@tS-v{NJTu(m8fBxxboLCPJ56Ha`lPQ0%T;1Z`tlVwzl^&p1U<|(k zJ^7k(=*QSvP64&SPM2ny)7A(bP5IYM5l5pPsL>MRu-?rfhE8`fu`I`HHt#6n zzsGs%HHvR+Z@J8ktd#Jd;6lf) zC3t6#ovw+$KoA2wBPHb!mq3?eGZ|@d;=8$8*Yi!1jh!^uk2JQlUz;{C17o$vOr=T< z&!Z5FueiU74XAvgiL}U;r+%^%e^F9W^70Ba-qqpH05`MJ%1=%BTZR&Bg1zIAfbTCE zu5)#c$8q=EoJ|WOtK)HGfhmL3u#DmuXry-)i3}8HIg*|po3pdl5mt=@v%X;$hZ!Q5 z3K^HTj%(T8uK@T~m^blFZ_RZejDQ>-mDPFJv=`-tIDKt`!;Vnk#`_lcWuk3H`O+u~EzRPs}=E9NAoheHJ$E-|#| zHQ$sac9rWWP1<{|WUkxG!Z`FgN@^sTcB4VZA2j3ZsOf>q_mV7{m`)4eY&!$Gv!k$L zgo*NiOiQgz1#5eTdfmVlo!VsD>hThs$7EKAF>bgd(Ln90mhr&?nl&xKud|cacNGih z!{t#egaFS3$&Su;)T4BpwaEAiDz)!D&|SOE(th!~*n8gWCGC9OJ&!;o?3lqHBD_LE zgE*|$&&Pb@P%%&&3=i|`cjxAUQ3j(?HUT`9;KHRh?)M^Jy(P_a(dx(AqH;>QySe%5 zW$vihKit258!?l%qo+?I_`pkb80V=2j1HvBkervgWE9uk9n*C+<^gXO0QQj)_zua|$| zvbq8viBCJ)+W3U{1~Ux}jbbBZ+iQ!t5?qGtf0-ayj%Ajvk-Wb&XwK(0r_uFG7zolq zG}2zf(=TmsM_5-QWRc&-Wp0WRQnt!#)I*}fy~K7HFUM~VLpV{K`mDpgsmGvEvA2u# zf6*z)!#mGPzKEi1Ma7d_0_Qj@&NL1_m>t?vTM(zipdz#y=6*cOE{my33L><>C)?hB z|Lfz*DM|`uDf4lM*JS`$4RG0HMh}BDOj%5!VhgT@q6>8ZZ~{Kf;X~sE7k6^}%{g6B zo6KdHH+?Rc;fmdK=%>QfN;i$#(QeMuiRifO_h8>nw@~HIypR@MM!=a~e9>@ZGr^)1}g}C)|j~brO-p)4oiPk6ANXKgk zsh`AJ2b-8E;nO8W7gQ_>NHtS7hD7m5msNmV>RAr* zFw#QRwsO1A-)_0SeC==Pi!6ry@cQ13CrW!Y;MSIjTGB8FK8n_j1N*8SyQ?GPN5(me zCDHYWPJ<|@2EA57g2Kp&8KtAXO~moT;Xf0$h|Kf9P0P>2>HLfcykSO9rYb1ptcudeDeOATKk)yT9x^KU@45X^0tPnlfWj`Z z2*u=u6)6}yQqmFWl~lseQ?LTB4-eP`v%D#Zyk?aq{kx5=uYNGetIhyR6nGlJMgEV9 z%R{%Z4mlg*Jl}4Sq~OdH@&#g7$0#REj)%&n^emQ-KlRc=qSvnhcHWG;u*S0#OBt{m zd}(M(E3i_WoNBwO(vQS8FgthjKM7UXW@YH9JH|At<#-lOAl=o^ys`K z!gC{;GrAzpoV?j?g~#tt&hBD0w%Rk3>MY-1UJCF7F3s6{FQfthkK|F@*2Dp})uA)} z{%@-o0a~u>pC!JAh9kG^mqD9NyY8WIu`iAJxCG)97wIGl0ztGyd}&0+)VSluA<4-Y z{A1Vq$Jf`-&&BEYNJyt+W=J>Hjl(LLz71qppV++Uad07`s-t-gZL*)O8$&pB-)jH7 z@DvSk8#bAB*y{wWp<8SEpp%$7${RqR_QYJ_g@`)3odxSpUtP1XOv}x3xsWDx0bGIF z%HkCdpVYS_ug{pqnMUBCnsd3Az<}&4R)o+>Zo#NBKFZ#EKDqluAGTdjHh(|X)p3`h z<>|nM7DTde^3=!cZPq;rcqpGCi&WEV#`aOBCDja7vS5w}Rh62lsVQ({OT5q}e!1Hd zq@&F>V2v9%JphvEKCZ|-x8&p#RUgiEP-HtOeJPJiHf^9nP{*y-szmZjpjV3emP4de ztB`>^hui4T`3PcRgm8`G9-HC!i&d-vXj(3Jvi4y z@sWBbY=E1Zj^ShVmb1te+$ku~SH58hztb$W%r`G6aJt*t1|QnHyMwa&GjYa!`fbr* z_75^6Mf)9_F~`Jh347ESYqvircNot7CAr*z5L;>T! zPfIqRquqtYj>0`8JT<-pH+j@>?^&p-`~LJ4$pM+(!{ym%9XU;BmsCjOUBgk*+*_#2LrM)oE|_CX`5;(0%p`TFLqU%Rr;-rOhmJ!_6{Qx zx*_e=%Fmi{H>$P*p-0`_yTaU={VdhDQ)5*+X|B^%{SWI#Car@VJ!Xi|DYo9#)choN zN}TG2CUGRyJe8B4fY;#Xou>hL^ie+rl@!qRKmdn)slMrqOkQC^kz}tPy6B(1m3##7 z*HtbAviIj>g();WeQ+?v$qPX+5x~|p6~=uS(5t7y6La_Q0B`}X__D~ex;tLQ&cN0A z&J#=5`boQf9L^G2tv||yjAIUUvy7LZ1cAR6O=okt48`bn$k;BajfeNn>-b=w?kbdq z0=}JpBBjDYpIk zq@^{mL9l6jx;b%eGwg%O$;kuFJ>BD!29q&m98IMo;0_8xQB-x zAEjEu*b2hrLmaru3&?x5!Hl~xQOwLe53h?Zu+1fQ5FF?kOOvGR&nJ6vaNO`Esi_7u z(wdV{PVONWO!BL&hgK&iIrE&u1a*{;AwM5!d+QQp@VMKVXK1LZsz`M@&83Z-K6B?x z9o@#n#LP(tLj(OxF?^`7JN*y1h_AAOkD>z&v-9G^#rn#pr*_CMFGWzG{SmB)2qi`_ z2pO3J{`Gef_lAu*OH8wzb7jUmzm5;-Ws{1qvV3;5XY@^o=%4XK-+hHH%q#i7ui!J0K2LELWIX`0ksTOCo^>5#nWgry&d{CG&|2Pw7aN5eD2u(_UxB-jM68ST-GDX zo;6LF&kqK3IVfcx7aHCm zneExXf0|>RU67g9N4zDAcWO@a*q=v}qN>^Ga}(rMiBQz(L~6fLG43}ee%&qc?39!> zKB)LS!^ixzFHRUv<@$W@dw=s~ko>LpR*%tTfYF&XR?2K&s0l)tki*Hz$#nOG;$=Vt zZEIIRTZB21fKNm~Y2>+i=zR??0%i!(zMxm z*$&M>%Ko^YFDHbGxnR>iZ8+aGF09aT-27ccyhwI#HmUl6SW|x$ZHyppjYrm=k>WqO zrwV^luWD{4X9%*ife);Is{J!iGq_miTmN8u%7U#;dlp8~tL)v%jP1|P*UQ8fFJp?U z*cd`q|Kr}4$=PNHErTcm4m7E`?VQ6(11izAIi(+1LT#oTuV~TP`* ze3mG)=xN!TIR$2*Rz>N7+e@SX$zlh{yB)>4JbW%p#c+zLl?tV_WJ}N768WG(o(>@A zW+<}EUh=)7q7numkijB)vegz7CWpT|D~FA)C2qUa!Hlkti+-2->pTd#hbeGl_CQ=Cyo^{1kJ{MXJxCIA8-7w^G6#4igfB(ruLxO_u)0VaKJcKITn<4k>(iscQEAT-s zyM=tdolKgae%t^GXK{a0YTowY@CJZu2jxPEOULcJ?3s^bJzqXQyu1WIMb&}MB`07) z*GxEa@(ggjN1(f|*q?^S$K~veI=cxzc6YX_uL1Gnhk03dE=>Wf;pkHX1ukL2iimz` z@|JXo#rV`QgPPoJ8Q)V-vqX*2g1(lPmR`B=R`0xGu1sEAYU4F?yIPs^czKU*Q;pMA`4iBGAv!PC z8IiO3WSNbA0RhdKA0#f9PgACOu|jEC6?F-j>c&b*M0RCFekxmJYcv=tF|)e}W+xWk z*z2^whn^#{n&-XDazQ9>`~VgvsPJ2t<11^t8~&47z$&LF6M>UWQY9&Vq$A6cAeP2v zAL}&Cri*EuWRNlTi;g=Z+O|C2Lp53e9@PtSlmn*t}Ujwzh^ixXF;f}Kt zYtkoTa$QvshtS%(QMXPMHY3?xGKdT3gC7TFrWHU)jQXSkR1VhpM_@O;Vbo8(r0+%a zHcekSgPEc0M&BHzw?X?T^5!cwD$_uukOlrHu3hVy zN!l;%3U}FOT!e^&iw=Z{WUjXu8cpFR9#P(*%&B`d4R~m|GW4|QQLcU=Ojfn&u`j7n z#~B?#3dZ7;Pm%}8_q=V=1Dme-8Z!ua2Kwq1<-2F~RJK&Hny)9KJ+0z*saT!3im=!X zLuP~?-$y&BYzm8n+<*Kb0^}F;tmKlbd549BubJUnVSUKOb|54Ic$P`Z*>)+cWjoqp zYlQ+3hd#ff_HIWf1x%od9F(XdD=U?%5q@Z2jNFXw?dd@*@A=H?qeO}%h>k8GQz)Du z5Q3FPPJzuF?~C%9GNdB!B1ZQcl|D2QV`MSN3V$BLc_T*<+HL*p|Xb-E#pY^9qd+RaT$?SfXJIE;zcD5=xhO1*O z&B$tD>L(t+#bJoO#%sk`BtRS50>8uvo(R`W+G?1kqBz{?Pe-E3v(WP ze+4S7$39Fj#;NxLS_~1O94S*e7v8_j%aed$#jV$^3j(b8q$%wv5Kh@9{HRjD(FG+U zIz`oSBtY7S8$>?h`$5>;o}Stn3BgvO#AWabm7iZdU*A{V<5x1tELNcV@GBy>HpDR? zZyy3Nvp#5^gf@})F&*9x`o16FN2#Rsrg?Xqw4TPPY`cW{W<)tje)6Sk;@WL77nG;X zB-Wt5i#e|ggOdlh9VY!9`hBK9VbMf6G7Dq%34Rb9h zc;X{3Bmcm?0-&@uIHrhOIlLvYqIRm+uC4uiT;PV?eSM?j1O5DZh|Gl4CFG+X8ddPQ zMaLik%6kX?pUd?_cRELt`;rbPq>{J;<1cKmU z4Yy)`WDE`xZC{t?8E*I+I|Plp~DjmPUp2S$=e@5 zd{^!jidjA>?nuVb*n838&;1iZo*zy#lc)(9hTg4o_LM_EeoaGk7~PzHn;HuGXHf@n zmXFw057kVlHzU6#E6h{I*iiMzgNtp4=E-o5XiZ4=A@sBQg*+r^n4C#V^AR$c8|-85 zxDdMCg&661Q*ZXaBRo^q7k`Z4e)i$Q*~R<&^T}!r+^bo;=5ola2aSYG^R9(M&yXH! zpC}8ieJiRZi+NwEDGA6##j-T6Z=c(lT}-V$uMnwdTFfK0<1iF>xT`}y)ewNv ztFwN9k1N0P&koU96%|^EMizY>(E!39v3ehrd%(XnO@d&StMBGFLVFaSH zB(?=iL8_#|uZW}T*8v;S(zV5Q7)EA&KV@)n58essZskw^MIBQ(z%RoC+EZYwJ!RY z$Ar@7K_?3{hSJ%6&EzuTMzNz4hr9=c`Nx4KiB;wSU)!_K z{_BPP?mrinas4Ibhj$)Dp|$`O)hS=dcMDjNu%-COlT!X<#?$;-O&#`C^aQiPK%Z2B zMW#z;-X%(?y;HovnXBy%?oUEqG_cpIp&V&ty)F1of9&C7XOct=;3hYA3vjPhrA!oE zZAN@oq(jN(4nM(8s~4UvKBR`tC2Jj(nB&lN=&KGZH>f=Ym9iIhN{JC71URGw{5ON) zxvUA!>66)sIu`?MtCB{$83AQl+ImqjV)mTB8KWf9Y6Fqa=x^m#^z9K!k6pX8f#%|X zGC`7Pm9*U-K9aImcQ8;YBmB=xG=LLzhHn;2Ax|s zLUQUpiTpnL>Ca^3^x;QcB3G&f4|V|ESLu}(_;>D9->iAtp86d-+q6nk5h(c{gC;IU zsS3JL&CY9Q zA>NajA>#YAStGmnNAnEA>hSu#h73tRb!Z8s6Uec@icdmHe6SPQSCS$u?fsj5IDfZa z9)I?hG*5gyZ?#;{F^X=rwIF*l+VmH>>I+706V>$FpO-;}>A=&OZ*PHP75 zo#H zp}!I=nVRGoVSh`qnpu{*tb^R=sE``@?78Rvb%wV9rZpS zmdf{us9j8H^+efI(Sk~S3_UDhYpFwdI>^STadNAouP6DNXNp)*AtjC{rySSmXV2Da z?_idqJ3QU%2}xm_ABOZ^+a(H&d_$}y+@ODLA@R8^az|_YpW|W_GuQ1l4#tr`W`Zk+ zmX6_QC5o$k(=Z^TkPa=YE!zo(-LUw*DnC?5y-7d@l0J74^B$Ki$vkC9nMN}u1%Mo> zb9^x8l3eURG1Mm!w6Jl(TIhc9^pVG_ch5LUw2XFkcA5yc1?*NLkUb{;Jn9p=)f;*)%CgRO z&;MD$oelDSNye1u2sHN~GcaA1U*VPDqlbq=?|%=!+c1!z_?4>iE#h#>9p`kCo@8G& zka^G|ES2;0z%t=z6V2MMps%@perxSJF2AazJ`dI9-zlF}BiI-nbhE5i#(H+{=CdW} zh~UzM?4VM2Zqj0~BruceQ%KTHQbK^Ai*BR-2>bo2J=c(HfK0lhanQx|Sld=8{=A!; zb1G{^6Ep@(?6!$3mBJytJ{yB8kiD6%v08PLP<-s1A?Lu*$cL|IrJ*Uw+}-bSYNrWk=tT&RwnuV5EZAp zcO5g1Jk|>%jxk$;NO#S_8pod<2I2i%`gP8AGh}!1xQ%CoSnKPYOse;l>K>*eB$i{_ z7wqyRZ(ue~c1cu2qmto@t`8EMDo~g8ixeD|HA3Y&f7!VV>=2sOoG7^Oautgmh#L8$ zvg@LF^kOkUO44$VQHF0Xvv?>|8B=dV&{IzZ%h`ck=rkQk!#t)QR)S42&-6EaJrl{A zMj^AS8B(Q6=Lo*buQ3ZiF>Ah9bVbWV8oP=@{>O{PhJz{@QDXWhHJKW;;coS4T^nd5 z*y|n#btJrdu6y(sZ?<1UXGp)KDzM9E_ec{HpN$yy==YIgi*El*3m5&9xoIt4AsrV^ z`&~sE?wgFHv)tmCSmEZV^nqo?tlevA*$En-Q=6J@8OE~oa7v?|M_;x~etl8#xAC;^ zuW83_Z$a=_7+HiicqCI-XcJK3C)ba`4SR|)O>Vf#JICHr?NqFwXZ_k}SUBS~XEs&6 znvbd1z`kX}4gOBnk`&~wPCb4i1t-xj-8IEts1&-u)tC<2aa&G8o9uz-W$8~sbgT3Y zNrgIkudEb-H{_`KP}EW)J{B_pLsIZTJ>=Jk7xWfPrAWS>j5>_#D=xr7W$;Bwhz*~AKRIQ57I>L3LRiM10$}K` zsEPQ!nQ-FwF3VG6sEJ`$D>;1QJ>yFzLhK4{Yl3dSFgU&ScvSq{&O$-j#d&s zZkolGu%W3@#qcK^p!SA;cVUu{nhV5UQe+h|O>(kwEOHPFjW)RjD-TjY7?G|tjdClF z+C^BQY|pV4o^SXjoEDE_4y!xCI*PVrH~H>#?i7oclK-D<709_ORSz2M9x@^YTYh4T ztox11GO*RtmNctagHkQw*<0Ry^lN=BjYDjTp|VN^FDO5Q-{wiCYIE%N^ZB;z^Yv>; z4Blb?ZNu$+GRG&ifh5QBk_2nyVs3pU(f#hPmNm!N>&_-KyV;Dd^<%F6*uh!W?y#u5 zd^B;6+9K(J5&5-)O#;d)N9_Gw(fX~+CMp2Fm5)mLZN8+?+_UgLLR(YV;6gcbHfiRl z-$AOK;t#gBB?n1K+gBx!eU}au934qr-o?+2n21oPahPXs!Cs-U`~49uXSsR2-|~qS zj}mVE*RryuDU#fKs$VG}Z4a<00@a(0B;1-xf4h|H82`l&nndS`5DaAGK(JNW9tzl} z0M1@76`G)_W^MfD5@WQiO`t0XYhR|&MTx2D-)XUIPzBVkV2IfmG)ESsR=vhbVdx_e zFih40>BDE>AN(10TSn3v+o?8xO zj<^iR+#->7J=P2jg15tc?9%N#yWfQG5J(@(15Z7t0Gt!S76qDv`0Fu{+d-?>0~K)@ zdWM*(a*Zcu6!36!^Kx~?o1=LBk$zPbnG!H}TFKCP*s>i^SpiYbIl+;m&_Fr(UX{N8 zL8n%8-;0U>+Xcs4Q9*}B2U?5kKeV7cW#Z^IH2F&7bU@pbX0iTJJv;tvZQcaak11zs z5ozTud6^q+$T4?fh!o<|Hl*vBWBZLmREnp^^Y4*A7x;P6{A&m(i3WbUX|#x5E>s*e zIyxLL^80Pv$kA#0=)JQfX~&a0Pis9X<>|RB?;bzQeWY-Eb8C;Rv%9NXP{^%95L>vm zM7sa~i57&X=pNpG)v?U3(X@uo;qpo?LGEf7Aw2FM7y@Yd`c=idtUEut>n*dYUsB!W zSMO9I%dG$qz(bz@3gDI}4<60&TAW>a6>{!h56`2c$M=g!OOH>VJz(_jZf;J_&Nie$ z*B^*UNIn%PC1^8ZyVY(;_}ieyV-tuoQm5$ z&!XhVvRKb!;L7XNp=1){=)w#sta8d3KG3bB*~`+(^UoixGyknDhe1;nF^a^Kjdux3 zWiFv@9Lt@?`#Kp?wC5x=rDr##=5-{)sF)Qu`j~nlr|wfIVt*o1RR_ZZ($boq&o$;m)acy|#v zg`)vR_AMPo0qDI4ZHH}@%DBBmy>-W~2dzjVBINSC- zBa~Z*x0{YFy0u@>-|tqf(oi@GNdAEdE9vIbbPs9hO<&q9S4iz=b9+Vl2VTS&>V#QB0q?s4LVq|sWjciXH71$lUCM)9B?=$gpI()MQXpraL$Vchv-XxSQCSDuCcSTSe9*ONi_(Q2fEGRZ@Di8vD=;Za|!PF#x*{bWcwKU%j5M z{QEnsv0WfluLvLhwB+lhQ{zAyj!%^y$ak=cLBeJ(p@9-MPDQoxHMYA7cV)<2wQZeAuu4Y%X^w)@tEmRmCAUBPVCT@{JPA@vMGx88Hu& z3Z^%Oz4^7r0ss9-Vry30&%sGe3$hf7Sa<0-Rh57H;A@(9h;oqwp$bQo`)<#m@ZyT~ zhtZ8Ip=>%rW>v9_lYh6ZK2ce1VqtxkoHtS9(v(gbD)XR5h=CD3OmXQs{?983EdDO} zF1Mjk9uOcL_!4E>@cw)M2K}16d3k<(-m<}jhb*p6$_3*6DDXFt;h`&kS9e>l!ynH_ zf{T5pKQ}z~tr=oc1%v-OG1^yl}!L3up=?0c+D-9NAxXydx2 zlGL*Sp3#zWWjfi{(e|RaN~J+f+qL?B-(n=v`G*%jZbU4@Vw;#aH!rWb zW3x0q?@HEy`)z1?Y_<3n{#T8`1w*SjQu;_W{ti0LmpQTAhn7Dobrx#)Dg1BZpG~0H#xAa9H|Sv+*BG}j&ZWES zWE&P{r1?X6CFvY5`%Z?FMkf(84#aO1dighO=neb6VLa|rqe%OXh@iRNBqQZm#5#1# zQOL$4=-39L0tPZc;0rKsy$8=3AF|kF&JSqDZ^Nb~N$qWQib+38KgtVu38o!$jW_7- z2ZIVVnw3AnY#u8-H?}aO6A9vr_Q2`-slBHKd`%+Ay}13;+hsqf-<_Y!<@&%j%IkeP z@Q=~|q7)i7H?}qmjW$u8~oiH2>jkL}^6KtVHf54Gs<%RH!v_ zG2`J`{vS|b)D{Z|gwRQ}TsokSPBK$!;(Rq*Lq=O68WHR9$H|7^ERq(Lc(rljSxj~@ z)g?2fNLR7wm~c1FJ4Kmgxe1a=MR)bHvPNdT?60S&f`57Oe>jE9MUj#2W$#?hBK(rz zzGWW5ltHU;&eYw|IwBvC4u4z54v7qnTK_}Kb|6Pu&#rSMXWxhK_TMg>o!MG0x6a+# zn+<=)4^vyvsiyWbB#r@aj|$IFj@q6imE34K?rqBRuP z!*1$<4)f8J0T);my=f_TiOJQB2HbUt-YEcM!|0^jWI*q%pF%<+6rm^9>WMMNxgT3P zP99&K>sQjj!&B2W8cGlD996rIm*<|S$tGC9J^}q{_03TAIB^WD2<4w>*&a5H zTq-O~g2oX`H&nkdpQPVGgs)IXOJWA7MJ6 zqS+YAIWDM7TgX_di!|VG+&3-rqnaod~r*Wg-FB7#it+@fUe~v`n@o1L%`ypLf2F&wkA$1O9 zKTT4WuuHb`^A-dm$pY`}Liro&vRe#M=h7S|vpj?O0jP>#6v9`F^O# z;AhovLXDTTmem}jS`9lfRp?Zacp3egC5&BypP1)3>Z4xMly|NFk_y8pbKVpqrDC0-(qEE=C(Fe2gzMC>~&5|-qmp`R#WlgJa&+G z%Wb5sPr`4|gAxt6F0yabvd**Py_()S`2HPUu#0E77?nSbg<5u`(Lh1~(+Uj4 z>#tA8x10S!$jHqH!O%3Lz8#{O5c6FV+X+;N;MwV5*1iLUIkU^i21#Dl5U|`t1*N$t zjrXgK41Nss&twny6VfAZgl_sJHI6Kz=0i`$wjQAlJPVbEbXr8>aR;pWl9E2PL8=&b zmI{9&b?s3=e|}+#Z6_By%&M_6jhI;5mQ89ET`Uip3u+Tx90hdBt_$OzlgpJF zG=-F$xkAs|m@w(KQJ{qZJ+QTwDKs#crdROSVj{t!(sK(!;t%Ql_C(yzG{Cm_U7+Ys z|1?lZvr?mWJqyg6KvU-`mN4Q}X*$=gC^_A>#LV(~Qk6;vj|dZZ33dN~BKCofeCc_r zUi~P=WG$om%V&_F)}e1)a_aQ^K&y?(s4ef7Z%(dOJ=HF0?Be1Zf}$uS{VuT>j?Pjw z&J-1LvEEZw*OD{A)>Cx4s&} zn|c&l82bs85~Z-#_#H=~zg_l+f<`0?vr+!PAr84xAAPW&pvSf~GQr-0RNHZFReFli z#-!>Z#v0y@6%Kg%*7f`9uB^c6>G%7q$e-hBR@0=UNyy3p!=h%U0@_aCzI9qk|M&H; z#nbIJ$M~5P_EH#}QWzZ$$~F@Lf+w@vYMiuQ0o_@}`^k|^2erk$d)hm;Fyi+Vi3+rF+`|s{ZLq=5K4qPWePPu4B+UZB|+ka9#J8X zN699%1+H3>I^ivQIFU6w4aCGGFwztA<{hhXk`(>hlqVm|oS3jKXc z@)-W!$HavY-QI}7gf27yxl4Q|zPPN8YEV$UBzvWlrmW?b@qs4CB#TfiO(vdzc?=F1 zmOP5tYm|G*|NpZJ>GgY2;!)yAQc^bB$(recf^#{M?!W&9XI24Tp}6OGLUXekco|@0 zPKl1KP*?nBL`G!jwDg3_OL2DQb-86ifgiz+Ze`D9&zp@6_F%^B1U0i~y<2cfT#Dc3 zo33>O-g+Qa-akyC5K_f*g&JEU$7h0hqL7)GeYwxeZ}RJEA;+&=sD zn`$2InHK1ZUOzmnjq-!dJ`WU2E2e0C#ad9RcZ}b5W5v8R0fpK+o@R9FEI|Ek|aW^r{=pgX~bQ_2p%p#VY|E5SypSja?^>Orz-Sm7X0{ zX!Tf>z}LP&Wqao>?i&cixKb%8Kp}pt(0G){LQ(aXqrvwst50|wKBmJerp=53J@Tw+ zz0kurIPNKh*YhCI?X4WmDL(#E>agv;o=rp{=c1z&J*?@4Iy37hbUiGW&RO2ue+lMk z`}es~af>BXNl6ZCudW-!q^#1O*n|SDFh&(5OP|%9uYZ;q&c1I@JorIP!V$iy=T z%*sW00c20O_+rk$r$gFy_FhhmAkQ;UoZws8p7W=5HBLNPkZ7lfdT5-^iYXFrGNyH? z(xp4Q9*yTu^o+aj?#PjUpwU?BwGyoKHR-Tf(D-t-u|R8Ml=|8w%G(z=uD*YNK)~0| zn|h#4I-oS{g?kyH5}*L|>czqv=F6lr*x>y!do}^jUYTp6!IF`^bJe zv-dGg9p}ij|E&@|42`fiqUtRO)Hb0>jX0r~F^fp#jcny3=jGim*dTZ_vXcBxhq~WD zSt#@!CM@+}f+hFPoqw>a$DFs|Y9BZL!n1(fW?@av24#vrK_^THv(sF=%zlDS#zM=g zFsEo1bwd8Z$FLobemqk`plnU~=W@vMI>ND&ji=1gIkW5T`nuPOA=ubEyJ_Frc2(&x z?S1Ri$6&KwnN0fv*SW)IJb3d0`JoAk8zAyP8g`Hp)aO_Vf+gsq$gHfmc;HW=CF66Q zk%&WQ-;7$+BfB+rI0JPe=FYgbtsDxZ&Q%N#OJ(D=Ry9Fh3(d}L{Eo`9lP~+Ag2|_d z!*?Z2^?`73QrUl*Ogs%P1cM8N7ZyfK~-ft=Sw)9-H z&)Nb7`S{2$Pm7){s|R`;I1@0#G?q!yhn0`7rkwceM&Zm8%w!VoeDE^1n4MH;cPw#4 z?O=C>!G+JjL8z;;q8^1ZL+yFZ*NWN(tf_UXqsA7-aWkI>Hx^^w z`#mrS{}g-aIixdOu{W!D$9f4sxFzY8#yQLpDa}f5FT&N@+s;Yf#Q$*RmBuF`etPz8 zs@HtTt)Omd>ejG~(}4M*qh_v-@B1yt(aF(y-1|D>@$#B+IjiZO)CCz&Y%!BF?Alwf z<`eC(kgjLA^8G&txIlu){y)e<^Iv2k6^tx+$!^JQY1Bp-Aw&D8J>KS^9~or*ACLv9 z(DCg`DQnLRwGMAc|6=h)`KC!lhy!gnJ0)Mix^eIyi_UopPEii^OK$L4ed%|nX&SD5 zt3t;t61!kvlkW)*(`7p0kAU_#xoNpt7NXhCw(xcR6c6r26iCX|1%D}e6qiP*F*fGW z$1iVHfiVSk2%>Vgw;H2lb|5X{#CW z7=_jZ2#t2ak(Y!SJ>%Q7L);n6cE%HwtaRb|HLC?l*q#*^`L#dmlmMx@Dk5a|2j0Qv zd9GqY%H$AD@2W!6rD?g7Y2wJ;BEZbGWG-lCW$Y)u%A5`?LWdh-8>!Xeeu0!x^eDm=T)tF>i1Jh(*(}DY=AIt<=7pt zm|EQuip`=!Q}M~SMCFXIz9zSPi2|zkcz?*VAA8A!QCQyE8MO{iC52bYyQW73x*}g< z)ta}vGdq#9t?Z?1_s%sO6Q-q0w|1UWuSS#CyYELT3W{*&pKqrDT|XnLX>gKJ%oCZN+3hB zy;ZIs1mK7F|Nfzrnd>K|J=k59_rI`(kf8q!TfqK{EvTv4)Om^ko%*hR1bM{1xiJa? zkR}M)x!5P@>B>BT-W-vYF%pGC>~AHwHq1j(C0&qbbFBvXyFwN zFgEOM?7mUB;Qj*=n7M<8jwnn+-Mg|3xm4lesO734N+o&B|`F>0Z^Q=-5ko zZS-cdbcneVVpS_T0yHIt6f>GhBz$SSVeAym48u9)xLVmsH0frPb3xxt!H*xhN_Fpj z50Gr0butQgDUjWmQw~j4%(;GoK->QtF6ZyI7)cJX#!x|GtqBjCsTQ|47olG$UpD`I ztAOvHv~}>%M2K=08~_R)Ixg2?SrzdWsW%IMXV_U&F%NcBoaTNq(H0U64hpT#O^~!v zXc*JQ%CF?B!wHsiT(Tqh$>o^SU7s~;9lO})u<;#;b zIu@@q_IMbDd-$w}Hbnr5K*_%$?DQRKz((z_gB=Yo2p_#4Oe6lT)mAqb#vS5SDG zKwPR23|dgZQ!c$YID4#&3FA&JS?M_R*t-bRPEA8-4Sl_=_;Cr3>hMp_6P;aMQDK!a zzcBtpT_KC~zPN~PjNG|qCfqv2yf$GVqr}3jIBLz3@(x0Sqb!?+4c+-=XOOHaALd(M z9Zr_L&<~=RGvPvpl_?}Cmo33hmb0JHSHW>oZHX}dF8Hu73HqMz`{7Y_hYpI%Q&H0? zE532#ne|tVVs2FQ$^)W(9lQJV{2P8Vy(#Ys+ShkiU$|2dA>m%Ken@sWrp{v z>(~qK6C4}WGkYE};4>zk5*1&xXr4D>Xs-LP&CB!r(dZ!57YRXifr*E~ZW6@ic71239Y{})D%#Ku$Sa8|hSjPJ%_3BY7x>Wf<|3DF zM%R{u`V`!f!{D~3Y>8gB-q{RKq)L)OJpFnYPSM3J-k{HDc;v)eVBZdN+LFjx?f}Gs z0QE_^-SKWa!G1mM#t)Cx*0hvdY ztRrh)9zJRcOjTgEq^26MMAa7G*)nGjito39+Ai&JjN<7Zt7}RWpy=qu2!8D!A5loM zsC9CpM0)dWp|WgekGZ9-7!xwnWZwey^x%c0gPjNm-342fTh}*yLP-gckZwV`JEXh2yBh(KRJyyQrMpw4Q&PISSu9dg;yD-Y zeO-G$&wbqQ%O_Z@<6P&QbIkD@e>R%Id&pYBR?r&c+}7IMTeuOAUS~BE^CN&yGO7;F zhDG0`6luLN2)bqzS2-*=*nufB6)*ozY4xBzPiBQTyVz7bOp{d`yCZh5tSroskwWj& zwsX z`n1?VE?Z=;`nz$pXvUIUbKlL4LWx`!6YG&e^`hYMBH`xy2bDmZ&4Yi9iSvr(GN<)b zm~GO_-O_}>xghf-7tXR#pFW>ccmnsG>gPFwZjwY)A2}{O7uK*C`&ax_o+uu$POkXy zA|Xq6!fNH8J@m+kzRKh`fsBO$EaH&DL~{sM4MDZDGUE3WJubt`9dDS(FuZcle({+0`iBXIwc z3yJ@d3-*9qaQI6u?9E0#$%U8ykqfpw-C~~i4|fkMJ9Ck9KUvYmBv{{}%9qYfRTH~8 z_5>DtELRuN(d>T%e*JOcGKLMU5V=4EkqcEg@$$te!N*SaBsinC4PLdq_|@lhSsiIy z>1yOc^F>?rz2vyx$-741p;qC#k*?UBAm)u!R#xg=kW>k98E^c`Yv|tXpRJv-DQlom zqeb4@=i*)))vn;WOX*j(h0!d2H4}!=sL7zQ2yVou5Z8j!*#MVp+UtmW_hTIxy=lXJ zxfiQC6EOC}Jw=g?pGIyEcWB@B_tRRsv3PZyXJLh*?li&|JWYx3fXMYiyoh;)d%_Fp zaw>$kO!(pS?2Hb-`J?Ea=$*ox16|Wbrqg9dMki~DDWj9O9Hnvv+*B^iJA~D0hjbNYEZx5HWsZMn`&j|V%KjH=}v-XA)P6t1_ zCmAq^dP|Ct-jWWu%BH~4ckU!@JwgxB=;p=63JWe}hMa1$Cj~Q$s z%{k&P8(B4)X=5whJ0U)^V=NX^SW@Xs`X2z9p*IG&<4H`=PZ~v6ldk_zokcgLFqrFnO9^7Edbzo;UOLPWZ zm-q8a!Mz@)Plq zqozL12#YQ#kv=I}XH)fUF4Iq}&IWZP+E!D6KJG-m3h8jpC3=yb9UEP}@QHsO-T4dE zoHV*9JdoUGfuU?EJ&V1JTDUERY{d1QQA!@}@WQ?uol&77YqKcVhmGRM>SRpG@G6r1)wWRFE`&hSW6TMThiC1=;#LW=T4KFIiVb)>cSsQWY2*?z~B;;L+gI#Un= z5jGlJ3%a_PX(DU#LPu)aa?o-x1zEaXqh7fN#yn!Na$J7tG@hU+1KO)fb<=8TdU>(DulJ+!g^0NY^wKW5%+RKRTwEegtHE=oHlA}SqXPRxSqtey_|g$Nl1Moh-_gx zDICQr+NM`bs6Z87EVnmHpxxm|mmL*PlF(aBZ8UndIg5|g)t7A6xRN^XH^Z5G4HJD< z__+}^ZsP5;$R^HON;$k#_Z&*OH6}E@7@y<1>DAj7QQ<}S;K}mv0}LEM7bTU$h}Z7PuH4a`s)Lb>R#B9MGhjH}GgHi;p0xiNt0Dn!PpVl(PRNG*N@@pwZ%D(Ex^fJ$=h%0LDkbIQ)&v+y$$dkQ0Sdo3-4WmI|Sv>O}@j?Tf)AQmWX~1hGgAZDUglo&07ZtS)8d zr1#K)?(5n=de$U!xuqbBCNS{~{2R2E?TF!S{9AFe5i?|CNyB!+&Yr2KCx?rGWKM(v zNxclVW$+Gz181?z>f1^M2OX{wdC4kq$lr9q#nUrKAY?V`l|V^Zky{;7J@qT&467dWe8QiW>yHnDj}NV0txO&6vg`2Ix~g8xew zHvdZ(e5L;{x==rhD>&g{9|55YIvxKI1TFNk!l3+6*k{Ss z5xBh`@KFweeAw_Pg#H1UUsF_Vz2*J7Vi%m<=q&@gXiw=7)(@#)l{@WOis0t(U?W8a zd}$-#4OOT7*-k5WBn}5-q&NTrNA%v>b#H>1|788S()*{vDh=fb^!$!s4YLw$Wi3Gf zI92-PIbqN5sB9-u#w}jCsmnif!Ra4#0p2Azvu671VfvtSQ355>{rB<@Uo&AR+pG?9 z)dD|LLEF6zhLMnBIJ8W%p80&}2s-)L!C~MJk7$p$a7OLYxE!fNYZKmt z!#%t^^W=A&P>PH{VUF&>)S>C{%aQ?8;!c_%lqkS zM&6Q$hJV`yJ=#~RUvuR8P4REt=R_ zrgK)8_a(mM+xf;3MQssNkdMRc#?``DTBEg1Dl^%c%~)UlbH~y)!%PXU`5Jn*{8;Y! zXa+;DfRX#tT?KR4(Ev2IuwXPWUPOYZb2T993vY$4&#RQ+F!uE!GF25EED0*P%QO+) zYiI`*t}rG6S*{vK?0QS9#;dC%rN4(Y(thm!7Y8)}=mZ6A~LX?e~&Ly6Byb=CrDinSwA=6jwaz?VoQX_uVr) z@CCJ;TjeD$3(G4Dslk`CbnG($_X7PRCXL`Be%&<5v2S8>So7Z1X#c_s91y&q{uf@T z|6lL|HUux=S;1XE@InIn-*~~Y|6h2);cvWPTNe+^cY4?a$3pNz@W1f_8080v>ccx3 zBdBh^2v~AtM!H!8 zc;U>lp{Bwin z?Dcp35!gi3obLWx^04r}5!It?W6WJNm>)AiogZ4ibzF4ICGYXZ1T{Sef4vTPYxy|& z!OH7YX4hQDrgUlnL04erPXnIUJ;!wgOaAvxo@v1{m}C)cy3si@^12!-QF+c7m#F%4 zN0S@-XkcccJo*0@Ua$u6LizuU7aAtXtshzbi5CpwyNvJwyb$m9gcn?&el0$a>kZ`q zUZ}(C9wAnBa}vC^l`q-#jLeA7cyT&uUH|R3hXkc(!N#*5%9mRF41G9XUlYO@$XAID z8rtLCA?eh`$Y-BW7w{oTBz~H#Wcl@C@l{1h29MDmM+0$HgqK)X7Js>ceb((McP?Ds zdVYyI-6s*A)F~IfK@QMIRV7}0a9u>7YCTGxtV2&__wmiiNfr;w6hl(F+RQ#(a`>{F zOwv}#!zCEnXBP}cVKDzm3|tz=hs!|l!j7tnBwMgDZiR)yKk&lFAG|Q~Kj8&-cts@; zOLuOVuKN@OFK|Htc;Oq>UwB~#8`vZN!3%OS|Hca~ixhw1g=Gj{0A1Yz%fc1)?4(4S zpH3>{3A;qe3f2fpKkeHL<=68eGT_J;MX?$YcS_SnwC=HNV`=sxR;P%JN zH(!DRVZ)9is5@DK%B+UTIZ(Np>1~@m28MIxO@2&kA7-dr*>QLVm0vvNm>buWon!l= zBO`?X?ekYP-2H^}Icp8N_eS|2MrL%Wq^Oi8B3xYIlWd>=`T?V_!=HP4SNDRrHtLis z`F9Dzp!)bJ z;`<{P?E2?JjO_{AL=e4TFbvTPwzFGM^Y$G7(F?9X{y3l)i1Z-A2*n9>$wPo%Fx!06 z3(mg)yHxV1-HNTLhgU{0_2$oqdhFyjn|t*lF?Ad#7SvkB7}->h64!# zx930;*wJ#ZPosg76q5m6vYCDiM!Vpld4@JA;n^N!G}yoRLXKp&Dc_foinVCstjrw; zhq+3tbo)jdO?0O@OD@?-+jqrg`t9*%ef!pd1wXaU6|JntOZ&TH1!T*X-ShkVZ(lbe zqA4^wp@>}Q3llFOjUH45fSY1A)^?swmv^YXM}5{e_hh=1(milsf%c}9CEZnH?`SmD z4;^Ba6%~w(h2nV8@F&;TBMTyin5rLshLuI@ zbIK=<<2-vI-X#?>@D7LmTgY18;Fxs4dURwAurC|4ENht+=(9F@0q3qrADT`iDP&kU zZyUtV z(3eyfk#x7t(D;%;^a{i$L7|!?wvg|5&MB2HZ4v-9m9Id}pL(@jPbOzME(ank zosD3Bac-PV)0G$WzLotP`|y)`8$P$wlCME!>*B(-owkbn^nBZEp7 zDaJ+<&DHbIW5x_m(g%7;o#R>_;N_8@g8>A4R@rwMH%P&qyi5Gk$7H*SdhJS*#WO^itI&!Ys52$)mEO zOqQLPBLHkK5xVuPalXGH0LA$9o0o@=bLe~IHGkPPlS#*rvWCwYCbX6lFRm7Zf^$=~ z{l7FgG*aAs!?^4w2{Fx-k;c-tRAGv>F<`P6r|PLQn#aUnDwzJz5e4iOoW;+(J8+Ju zoiP+Y87UkM7fsHW%@U|H&S8=t4PS44%HJ;m@A&&AJIM4rFmc|QqhC5+UH@2KCWPpP zI453An6WC@w}|);Ena$S`cB00KY9(h=JFSV`=cr3Po~1Rbvqxg(5{pScBP-w>cHy+ zw~-3VZ=vj`xpd5#)pXGd{lN<&NM9^IV*k+e$`6*(fNgoMul>3=kUFDqK9f?vA8Udm zs;F4>+geAUcgf5+R9y4ACzlGBZe9=*aDNTlPWsXc%LNrT_KG=@l}blaOLDUe>9Lnp zNn++O-S+!F!U~b=QY`g>KrlmlXj$!wwj5I8o6H+xbd@*GZOiuaa!f=s)Na|n59bCa zEWkWOp0xGq_7&gW_`BOegX*=F)s^<8Wp1*_;tqa---DHANymY66a~s(&E*@`hs!%l zL#3R>C^IhTx}DQP0$T{>Q^&L5f*^8XTP&$y%EIP*BPCV|ZEl@yUOCbRms{#b)}QGLNj_T zz%R&%eXf`4({>-BFle<*rB7>;T%q)?5qwtQCo|*tvN;j1DdZLDKIvF!E|9Qr7-AYG zWA}|q{*qgQh&{T7JIU;85vG`)Ods52r3U^4bf~Gu+rQj`4`jU=8LnVJWI`va(FNSX zg6a%>G@-M{cO)1Cc5|l|9yTl`B-)-zpZklkIWcrW#NQIoS%DYl)f>rdY&1Q}*Xy7~ zorzE&?xsur(>=UCoc?oM#1}y)$kDfpvyUoDjx$iA&oI@|#pn42LM668si*aFit>^f zXu=s~TT;wJ+``gI^GvkZ8_uD88Y+ra%(CuyxGtGJ$BoRTEmSGA8!BOWpPH|=5!FKz z9l5`nNMtV1aS}Tz20Ya1_7GtX^$7n2U9SY- z7G^<$50HR`z(AX|6MN21IY9a8>*|*Hm0ED?6*E9T{=Pfo`y#8V3xwdT7qvfv+YMiO zy-u4P@@iYQt2Eb`9QsnRP@wAwwbpzQov1f7U)DpFN~%_$;V{cJm78Qi8eL*b<>zCj zM@}VJ#5iYZ53mJG6uG%1`he+LJ;?ih%F^7!mGq#p{(yn{HdtVw1nkZgc;fxLD_tEZ zu`dhqkumDGF`TAXv5+DeA?(6fI5|1JRKhAk@HgbiSXo&iD@hxvsFE7SIqwBI2j*?w z-+z4IJ4CCs6~sez>g^AP=bN+T=QI{{kEc7CJ>}F;J@{QLHN7iI5uK`5Z~dKU z=2IC%F1es<;jqME3NQ;AoP1W2?5fWLvnsi%!)?N?qajAkRa9D)xy_%=q;30hqFh zE-c1UGLZHp7Ubie$zy}g%pS;Oe+T60%f6Y??f@_fGwxBBqsY+#XN!}D zPBcvtO!$6VkpmD<@n`$|{{8!W+ktv{`$Yyu2eIqgNNgv)-A_bz{okG$Yd4%X^Nf;7 zs||{-i&Nq~Be8ADCRGqpNl=+=@pN{(1F?!};Q#Cop`-(H^EwdHljIg*K8_gTk`WBcx ziKbw-<=8dSMIB~Q=o#x#DvbBQc_VZDE@|+g$#Y3jQk$ma+qQ?Z?(XAF+=Vu=zs$5b z)3c+U_0w^0j~)vc2wAvu^EGhnjE$iPZ2=-p`k%M&IPy!S-`!1)%~b>XD%O+q&HF?m zNm>ozpR&d@W&x$?=84gu+VXO+yS2z9G{!^DXl2@kIC|7E&v#GIxqGBa8P#c8NYFntxLd zO+wq-BmOLwgw&4B*=sGNhz|2&{Q&yRg(z-rU#Dkn7c zeUbiol+$qI?@Cu!e^rrG)M@h;F-X2b%)`3(Tf4U6NSo%<%N6{d-z9KyA z3qxe<(Awl3cyY^#ewM|v`?RPzezG%emU)w8g*B@Uy6}GGb zXqpG9v+^)_?Pf~N$GqqMeS>x7B}B(uPJpyDG|PI zH*@PyMz)UI;`qMdnrqiJ=`jN;?rE|%3Z1TM?NwT$o{w`x?>iW{Lv|B-PP2}yhp(j$ zhy_ssOkY{D6DxQYFlOsPMtIW^(6nK}c7AhSp8G6bczzsod15QPoUl&i5{n;(SkgtA z$-DpN@x1-fZ^T|;dF`R1qC&j;<&o9RH&wC{-6HM!&k_7@@`IOIRg(S|3+aGZPzyQ- z!~()kzIG+W@tp=9Q9HdoOs&nLdBPrXze!APUXsjrS*MtXx7EL!Drv`)OKG766T3o$ zaWDLMF;+{>Z@*5oO{+sG)uHg4{evvH3=bk$8+6eT0A#_%UH%%G9Fx*Xw%3U(cQFmW z>|*yO9MgMQAxq#Mcq1_75XX$beh96Xw9^q);;LG+Orj2EZFEQwDE*diQxsiASg%4X zci145&(gA>-&7cfl38^$c}t5Uy)5NUDAVb#^}^W)4#zI z5$W}KaBzFS2`e$mP^f7tsn7)#8z;q6cDC_w5+X%#4qJ;mI^T~J#S_<$?o)_y6(IJk zQ%Gs#CJMATRf5R?fz(XA^6n7da&d)cHaTj*4>j z#e0g=j+FkL*|VDjTy);vuC3bTC)EyDtIsCSL!Kv7{OCV0Vac>CB$xSsq}8y^^m#SW z>_)G@Gf1NWbz1%xPk(NA1)Z);yzwG784`|r6yc+qMyaGN>DY#ha0Pj9P~;vg7WwEFD?Sqmy_EQK)OP;RFyY9q71{H zMPn?&Z8he0LtaYoU;@@}TZ98wLDmuZ!nrp?G5HglVc|8xwnvt1LMO>)R-y|+*htr- zraYvFit0-^N@QPya&uM7q)KIui1y{(Yaah13)X@4+ZHF}2csbu%y3jl0TCrJ=}_&$ zJm2T-9dWtH%MO7Fl60cmisBm)`9aTvmp2~PiQY`E<9*?u(^)TGKyqB*&>xCEW_vef z4z&v(h0&Mlccf@en+T8v+ESwO#AWSZfGlurVCM26T%yhBIC&l)AM0S(=BztX)cf6m z!R$!66#E-r*Pa9G9J!jEgv|Gk4V606R=k6{q**{s5i`2Z7vIAfb>Bu+rZ)6WnCLeuqW*0l}z0~WSG7kIR&ZccxL1?5gQ ztj`UHn@N9xg?P&etVsBEAY-A<$S9nBO)>8szb=26aH~R@kCdU`^L+yJM_2w#Q%0do zXRYT=A7939Myat>(5rO?nj!5kM)t=8yXkRD-Ayx<7As9nvk)cb2b5O|Nmy<{(zWJa2@@6+G5SwDJcVv;QuSh7 zTl{se4-W8#Y&cr{(z^L8IZMN)$xsKvZOGtIO0`s|p&8i-s=EFX3yBc1V3zoKNgh+H z3+^gpr=*O>NfeT>z)QGA%`izw4oO&09~2m!Ttg{WCvKrjRMrMcL4N$Oh0{R70+n{^ z&}!rRNC7O8GrsO4vZ$7y?es_D6W;_O(rm}bX%D?+;u$R`Gn#!L8hcAWWAp6|Q;ryQ zp!bg#&TYkJKc1ThKQcJR%0^ zxZ^ZMLdZgij8)Egy|}Q*H0aIsG{bViJnGo<^UhO5)=;XQ(#zl9SBduwg3?p;gv0in zG2^DFxq5K+vY4^;fIG5KyvRgc)N;u=RV3nU`NIt!u9r!h`u5DBEwLv_rW7V81(Uc( zp@C!3A515&u2uu?yWL*VJ(_JcEHETb4$OHRF|U9TASnxjdwIMoIZi{ENpQ|Sfp zDfkWDu|+Y(s1<}Pj6+fu+%D)YN{7>VlWfkf5R%(9qGRTbb^QX!5EHu8#6Fy)+ z@HCu_7*RV!t;IeaGX;)Fa3(y-@}5^@8*-)tW z0k671^JHkFgN|<5BKRV1#g-?&GfA#;@p$IGtafn{NLtXk0g@Kpf_cdg(wd}9Zzlk> z@FpKt$VBEr4Vf|{sH%#$Kjyu&I`E#(5ob-F92&8QC1%T%b+o>_K`!(o1ELlxIBZ^v z@dHr{sns}{ta7Y&AIfLbYyq_J6|spnl)K`!7@?V~8EB-i7kMUB8k&ES`Wu>+hJqR> z*3a-mjY*3=GDs1d_zl|}!d%1v@*(+>#u_nU@z;+=?VPWp86{KGlcko@A{c=(cJ*wU z9C|?M1s;AhsP1fibfgeJ{R)^x-#~;S!FbNS(!ag!(yY7I1?0E~9rDeC!4~O8tyN9F$GjIh^2El(|2P1BA8`mRspMEnjC}OzWOVp z#RbW5-Af_ApLOVVGoc4z(*B9}p+1}6;8Ds7nF~4ivt%m=|n+0RY^AmN82?z-EI7xJC zAxp$=A);ba0l#$2$er*Fi6xLqwVY$7&&YRPlg*Lq0kkRP7<_zALMr>&>BMJO&>tEW zncp8@cu>L$DHMDVThl~1!NTf^6nY9yVQefG;IbM26S}7p^5TL^7f5<|eFDw!heD~UYpg9!qCnY8?S|M!c_kRE^ C7=(xb literal 0 HcmV?d00001 diff --git a/plugins/sfxr/logo.png b/plugins/sfxr/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2e84cba5a1377f9a65f4b1db243846c05b713dab GIT binary patch literal 1109 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4NgXJQJvX>d|!Zim;!u4T!B&}8T|kM|KEoPYk)xzQWE4B z3=9-z7FITP4o)6kK7IiqVKH$DDQOv5Ie7&|WffI5bxkcDJ$(ZsV>5FbTRUercTX>G zAOC>Bppe+Ogv8|3w9MSR{F2i0iptu$=C+QmNmCXqHI%PT1Dem6$-r|AKVTYt_};w_U!NXB7K(*S6We|JSFoOiXsz8FdcnrTOt2&-)|dIM-^*%*&JceQt?Pec4@e;H|XO%RORm zJGWT29Px>-t+FOzYLvO;^eNcK04<`;f1yG=XO=pJT7uNUR(9=-MyZ|evNJ5+=Dl~Z4JU&4-aUTUP}up-@@>18x9vZm z`?`a3wX0b1{r8`b`8V%pdUGe>(P~!Sf0F`#aQn*cpRcO&&I6RsJzf1=);T3K0RVE& BY2^R_ literal 0 HcmV?d00001 diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp new file mode 100644 index 000000000..080c424f3 --- /dev/null +++ b/plugins/sfxr/sfxr.cpp @@ -0,0 +1,592 @@ +/* + * bit_invader.cpp - instrument which uses a usereditable wavetable + * + * Copyright (c) 2006-2008 Andreas Brandmaier + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include + +#include "bit_invader.h" +#include "engine.h" +#include "graph.h" +#include "InstrumentTrack.h" +#include "knob.h" +#include "led_checkbox.h" +#include "note_play_handle.h" +#include "Oscillator.h" +#include "pixmap_button.h" +#include "song_editor.h" +#include "templates.h" +#include "tooltip.h" +#include "song.h" + +#include "embed.cpp" + +extern "C" +{ + +Plugin::Descriptor PLUGIN_EXPORT bitinvader_plugin_descriptor = +{ + STRINGIFY( PLUGIN_NAME ), + "BitInvader", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Customizable wavetable synthesizer" ), + "Andreas Brandmaier ", + 0x0100, + Plugin::Instrument, + new PluginPixmapLoader( "logo" ), + NULL, + NULL +} ; + +} + + +bSynth::bSynth( float * _shape, int _length, notePlayHandle * _nph, bool _interpolation, + float _factor, const sample_rate_t _sample_rate ) : + sample_index( 0 ), + sample_realindex( 0 ), + nph( _nph ), + sample_length( _length ), + sample_rate( _sample_rate ), + interpolation( _interpolation) +{ + sample_shape = new float[sample_length]; + for (int i=0; i < _length; ++i) + { + sample_shape[i] = _shape[i] * _factor; + } +} + + +bSynth::~bSynth() +{ + delete[] sample_shape; +} + + +sample_t bSynth::nextStringSample() +{ + float sample_step = + static_cast( sample_length / ( sample_rate / nph->frequency() ) ); + + + // check overflow + while (sample_realindex >= sample_length) { + sample_realindex -= sample_length; + } + + sample_t sample; + + if (interpolation) { + + // find position in shape + int a = static_cast(sample_realindex); + int b; + if (a < (sample_length-1)) { + b = static_cast(sample_realindex+1); + } else { + b = 0; + } + + // Nachkommaanteil + float frac = sample_realindex - static_cast(sample_realindex); + + sample = sample_shape[a]*(1-frac) + sample_shape[b]*(frac); + + } else { + // No interpolation + sample_index = static_cast(sample_realindex); + sample = sample_shape[sample_index]; + } + + // progress in shape + sample_realindex += sample_step; + + return sample; +} + +/*********************************************************************** +* +* class BitInvader +* +* lmms - plugin +* +***********************************************************************/ + + +bitInvader::bitInvader( InstrumentTrack * _instrument_track ) : + Instrument( _instrument_track, &bitinvader_plugin_descriptor ), + m_sampleLength( 128, 8, 128, 1, this, tr( "Samplelength" ) ), + m_graph( -1.0f, 1.0f, 128, this ), + m_interpolation( false, this ), + m_normalize( false, this ) +{ + + m_graph.setWaveToSine(); + + connect( &m_sampleLength, SIGNAL( dataChanged( ) ), + this, SLOT( lengthChanged( ) ) ); + + connect( &m_graph, SIGNAL( samplesChanged( int, int ) ), + this, SLOT( samplesChanged( int, int ) ) ); + +} + + + + +bitInvader::~bitInvader() +{ +} + + + + +void bitInvader::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + + // Save plugin version + _this.setAttribute( "version", "0.1" ); + + // Save sample length + m_sampleLength.saveSettings( _doc, _this, "sampleLength" ); + + // Save sample shape base64-encoded + QString sampleString; + base64::encode( (const char *)m_graph.samples(), + m_graph.length() * sizeof(float), sampleString ); + _this.setAttribute( "sampleShape", sampleString ); + + + // save LED normalize + m_interpolation.saveSettings( _doc, _this, "interpolation" ); + + // save LED + m_normalize.saveSettings( _doc, _this, "normalize" ); +} + + + + +void bitInvader::loadSettings( const QDomElement & _this ) +{ + // Load sample length + m_sampleLength.loadSettings( _this, "sampleLength" ); + + int sampleLength = (int)m_sampleLength.value(); + + // Load sample shape + int size = 0; + char * dst = 0; + base64::decode( _this.attribute( "sampleShape"), &dst, &size ); + + m_graph.setLength( sampleLength ); + m_graph.setSamples( (float*) dst ); + delete[] dst; + + // Load LED normalize + m_interpolation.loadSettings( _this, "interpolation" ); + // Load LED + m_normalize.loadSettings( _this, "normalize" ); + +} + + + + +void bitInvader::lengthChanged() +{ + m_graph.setLength( (int) m_sampleLength.value() ); + + normalize(); +} + + + + +void bitInvader::samplesChanged( int _begin, int _end ) +{ + normalize(); + //engine::getSongEditor()->setModified(); +} + + + + +void bitInvader::normalize() +{ + // analyze + float max = 0; + const float* samples = m_graph.samples(); + for(int i=0; i < m_graph.length(); i++) + { + const float f = fabsf( samples[i] ); + if (f > max) { max = f; } + } + m_normalizeFactor = 1.0 / max; +} + + + + +QString bitInvader::nodeName() const +{ + return( bitinvader_plugin_descriptor.name ); +} + + + + +void bitInvader::playNote( notePlayHandle * _n, + sampleFrame * _working_buffer ) +{ + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) + { + + float factor; + if( !m_normalize.value() ) + { + factor = 1.0f; + } + else + { + factor = m_normalizeFactor; + } + + _n->m_pluginData = new bSynth( + const_cast( m_graph.samples() ), + m_graph.length(), + _n, + m_interpolation.value(), factor, + engine::mixer()->processingSampleRate() ); + } + + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + + bSynth * ps = static_cast( _n->m_pluginData ); + for( fpp_t frame = 0; frame < frames; ++frame ) + { + const sample_t cur = ps->nextStringSample(); + for( ch_cnt_t chnl = 0; chnl < DEFAULT_CHANNELS; ++chnl ) + { + _working_buffer[frame][chnl] = cur; + } + } + + applyRelease( _working_buffer, _n ); + + instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n ); +} + + + + +void bitInvader::deleteNotePluginData( notePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + + + +PluginView * bitInvader::instantiateView( QWidget * _parent ) +{ + return( new bitInvaderView( this, _parent ) ); +} + + + + + + + +bitInvaderView::bitInvaderView( Instrument * _instrument, + QWidget * _parent ) : + InstrumentView( _instrument, _parent ) +{ + setAutoFillBackground( true ); + QPalette pal; + + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); + + m_sampleLengthKnob = new knob( knobDark_28, this ); + m_sampleLengthKnob->move( 10, 120 ); + m_sampleLengthKnob->setHintText( tr( "Sample Length" ) + " ", "" ); + + m_graph = new graph( this, graph::NearestStyle ); + m_graph->move(53,118); // 55,120 - 2px border + m_graph->setAutoFillBackground( true ); + + toolTip::add( m_graph, tr ( "Draw your own waveform here " + "by dragging your mouse on this graph." + )); + + + pal = QPalette(); + pal.setBrush( backgroundRole(), + PLUGIN_NAME::getIconPixmap("wavegraph") ); + m_graph->setPalette( pal ); + + + m_sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ) ); + m_sinWaveBtn->move( 188, 120 ); + m_sinWaveBtn->setActiveGraphic( embed::getIconPixmap( + "sin_wave_active" ) ); + m_sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + toolTip::add( m_sinWaveBtn, + tr( "Click for a sine-wave." ) ); + + m_triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ) ); + m_triangleWaveBtn->move( 188, 136 ); + m_triangleWaveBtn->setActiveGraphic( + embed::getIconPixmap( "triangle_wave_active" ) ); + m_triangleWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "triangle_wave_inactive" ) ); + toolTip::add( m_triangleWaveBtn, + tr( "Click here for a triangle-wave." ) ); + + m_sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ) ); + m_sawWaveBtn->move( 188, 152 ); + m_sawWaveBtn->setActiveGraphic( embed::getIconPixmap( + "saw_wave_active" ) ); + m_sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + toolTip::add( m_sawWaveBtn, + tr( "Click here for a saw-wave." ) ); + + m_sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ) ); + m_sqrWaveBtn->move( 188, 168 ); + m_sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "square_wave_active" ) ); + m_sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + toolTip::add( m_sqrWaveBtn, + tr( "Click here for a square-wave." ) ); + + m_whiteNoiseWaveBtn = new pixmapButton( this, + tr( "White noise wave" ) ); + m_whiteNoiseWaveBtn->move( 188, 184 ); + m_whiteNoiseWaveBtn->setActiveGraphic( + embed::getIconPixmap( "white_noise_wave_active" ) ); + m_whiteNoiseWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "white_noise_wave_inactive" ) ); + toolTip::add( m_whiteNoiseWaveBtn, + tr( "Click here for white-noise." ) ); + + m_usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ) ); + m_usrWaveBtn->move( 188, 200 ); + m_usrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "usr_wave_active" ) ); + m_usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "usr_wave_inactive" ) ); + toolTip::add( m_usrWaveBtn, + tr( "Click here for a user-defined shape." ) ); + + m_smoothBtn = new pixmapButton( this, tr( "Smooth" ) ); + m_smoothBtn->move( 35, 200 ); + m_smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth" ) ); + m_smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth" ) ); + m_smoothBtn->setChecked( true ); + toolTip::add( m_smoothBtn, + tr( "Click here to smooth waveform." ) ); + + + m_interpolationToggle = new ledCheckBox( "Interpolation", this, + tr( "Interpolation" ) ); + m_interpolationToggle->move( 55,80 ); + + + m_normalizeToggle = new ledCheckBox( "Normalize", this, + tr( "Normalize" ) ); + m_normalizeToggle->move( 55, 100 ); + + + connect( m_sinWaveBtn, SIGNAL (clicked () ), + this, SLOT ( sinWaveClicked() ) ); + connect( m_triangleWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( triangleWaveClicked() ) ); + connect( m_sawWaveBtn, SIGNAL (clicked () ), + this, SLOT ( sawWaveClicked() ) ); + connect( m_sqrWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( sqrWaveClicked() ) ); + connect( m_whiteNoiseWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( noiseWaveClicked() ) ); + connect( m_usrWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( usrWaveClicked() ) ); + + connect( m_smoothBtn, SIGNAL ( clicked () ), + this, SLOT ( smoothClicked() ) ); + + connect( m_interpolationToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( interpolationToggled( bool ) ) ); + + connect( m_normalizeToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( normalizeToggled( bool ) ) ); + +} + + + + +void bitInvaderView::modelChanged() +{ + bitInvader * b = castModel(); + + m_graph->setModel( &b->m_graph ); + m_sampleLengthKnob->setModel( &b->m_sampleLength ); + m_interpolationToggle->setModel( &b->m_interpolation ); + m_normalizeToggle->setModel( &b->m_normalize ); + +} + + + + +void bitInvaderView::sinWaveClicked() +{ + m_graph->model()->setWaveToSine(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::triangleWaveClicked() +{ + m_graph->model()->setWaveToTriangle(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::sawWaveClicked() +{ + m_graph->model()->setWaveToSaw(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::sqrWaveClicked() +{ + m_graph->model()->setWaveToSquare(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::noiseWaveClicked() +{ + m_graph->model()->setWaveToNoise(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::usrWaveClicked() +{ + QString fileName = m_graph->model()->setWaveToUser(); + toolTip::add( m_usrWaveBtn, fileName ); + engine::getSong()->setModified(); + /* + m_graph->model()->setWaveToNoise(); + engine::getSong()->setModified(); + // zero sample_shape + for (int i = 0; i < sample_length; i++) + { + sample_shape[i] = 0; + } + + // load user shape + sampleBuffer buffer; + QString af = buffer.openAudioFile(); + if ( af != "" ) + { + buffer.setAudioFile( af ); + + // copy buffer data + sample_length = min( sample_length, static_cast( + buffer.frames() ) ); + for ( int i = 0; i < sample_length; i++ ) + { + sample_shape[i] = (float)*buffer.data()[i]; + } + } + + sampleChanged(); + */ +} + + + + +void bitInvaderView::smoothClicked() +{ + m_graph->model()->smooth(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::interpolationToggled( bool value ) +{ + m_graph->setGraphStyle( value ? graph::LinearStyle : graph::NearestStyle); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::normalizeToggled( bool value ) +{ + engine::getSong()->setModified(); +} + + + + +extern "C" +{ + +// necessary for getting instance out of shared lib +Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) +{ + return( new bitInvader( static_cast( _data ) ) ); +} + + +} + + + +#include "moc_bit_invader.cxx" diff --git a/plugins/sfxr/sfxr.h b/plugins/sfxr/sfxr.h new file mode 100644 index 000000000..7a3217b47 --- /dev/null +++ b/plugins/sfxr/sfxr.h @@ -0,0 +1,157 @@ +/* + * bit_invader.h - declaration of class bitInvader and bSynth which + * are a wavetable synthesizer + * + * Copyright (c) 2006-2008 Andreas Brandmaier + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef _BIT_INVADER_H +#define _BIT_INVADER_H + +#include "Instrument.h" +#include "InstrumentView.h" +#include "graph.h" +#include "knob.h" +#include "pixmap_button.h" +#include "led_checkbox.h" + +class oscillator; +class bitInvaderView; + +class bSynth +{ +public: + bSynth( float * sample, int length, notePlayHandle * _nph, + bool _interpolation, float factor, + const sample_rate_t _sample_rate ); + virtual ~bSynth(); + + sample_t nextStringSample(); + + +private: + int sample_index; + float sample_realindex; + float* sample_shape; + notePlayHandle* nph; + const int sample_length; + const sample_rate_t sample_rate; + + bool interpolation; + +} ; + +class bitInvader : public Instrument +{ + Q_OBJECT +public: + bitInvader(InstrumentTrack * _instrument_track ); + virtual ~bitInvader(); + + virtual void playNote( notePlayHandle * _n, + sampleFrame * _working_buffer ); + virtual void deleteNotePluginData( notePlayHandle * _n ); + + + virtual void saveSettings( QDomDocument & _doc, + QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + virtual QString nodeName() const; + + virtual f_cnt_t desiredReleaseFrames() const + { + return( 64 ); + } + + virtual PluginView * instantiateView( QWidget * _parent ); + +protected slots: + void lengthChanged(); + void samplesChanged( int, int ); + + void normalize(); + + +private: + FloatModel m_sampleLength; + graphModel m_graph; + + BoolModel m_interpolation; + BoolModel m_normalize; + + float m_normalizeFactor; + + oscillator * m_osc; + + friend class bitInvaderView; +} ; + + + +class bitInvaderView : public InstrumentView +{ + Q_OBJECT +public: + bitInvaderView( Instrument * _instrument, + QWidget * _parent ); + + virtual ~bitInvaderView() {}; + +protected slots: + //void sampleSizeChanged( float _new_sample_length ); + + void interpolationToggled( bool value ); + void normalizeToggled( bool value ); + + void sinWaveClicked(); + void triangleWaveClicked(); + void sqrWaveClicked(); + void sawWaveClicked(); + void noiseWaveClicked(); + void usrWaveClicked(); + + void smoothClicked( void ); + +private: + virtual void modelChanged(); + + knob * m_sampleLengthKnob; + pixmapButton * m_sinWaveBtn; + pixmapButton * m_triangleWaveBtn; + pixmapButton * m_sqrWaveBtn; + pixmapButton * m_sawWaveBtn; + pixmapButton * m_whiteNoiseWaveBtn; + pixmapButton * m_smoothBtn; + pixmapButton * m_usrWaveBtn; + + static QPixmap * s_artwork; + + graph * m_graph; + ledCheckBox * m_interpolationToggle; + ledCheckBox * m_normalizeToggle; + +} ; + + + +#endif