From 7f9d836f1a2df2af4346675d32028a0760111ee2 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 17 Jan 2024 13:53:12 +0100 Subject: [PATCH] play connected sound from sound file --- .../services/CallIntegration.java | 20 +++++++++++++++--- src/main/res/raw/connected.ogg | Bin 0 -> 10581 bytes 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 src/main/res/raw/connected.ogg diff --git a/src/main/java/eu/siacs/conversations/services/CallIntegration.java b/src/main/java/eu/siacs/conversations/services/CallIntegration.java index 548a1507d..489d71256 100644 --- a/src/main/java/eu/siacs/conversations/services/CallIntegration.java +++ b/src/main/java/eu/siacs/conversations/services/CallIntegration.java @@ -20,6 +20,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import eu.siacs.conversations.Config; +import eu.siacs.conversations.R; import eu.siacs.conversations.ui.util.MainThreadExecutor; import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager; @@ -33,6 +34,10 @@ import java.util.concurrent.atomic.AtomicBoolean; public class CallIntegration extends Connection { + private static final int DEFAULT_VOLUME = 80; + + private final Context context; + private final AppRTCAudioManager appRTCAudioManager; private AudioDevice initialAudioDevice = null; private final AtomicBoolean initialAudioDeviceConfigured = new AtomicBoolean(false); @@ -43,6 +48,7 @@ public class CallIntegration extends Connection { private Callback callback = null; public CallIntegration(final Context context) { + this.context = context.getApplicationContext(); if (selfManaged()) { setConnectionProperties(Connection.PROPERTY_SELF_MANAGED); this.appRTCAudioManager = null; @@ -297,7 +303,9 @@ public class CallIntegration extends Connection { @Override public void onStateChanged(final int state) { Log.d(Config.LOGTAG, "onStateChanged(" + state + ")"); - if (state == STATE_DISCONNECTED) { + if (state == STATE_ACTIVE) { + playConnectedSound(); + } else if (state == STATE_DISCONNECTED) { final var audioManager = this.appRTCAudioManager; if (audioManager != null) { audioManager.executeOnMain(audioManager::stop); @@ -305,9 +313,15 @@ public class CallIntegration extends Connection { } } + private void playConnectedSound() { + final var mediaPlayer = MediaPlayer.create(context, R.raw.connected); + mediaPlayer.setVolume(DEFAULT_VOLUME / 100f, DEFAULT_VOLUME / 100f); + mediaPlayer.start(); + } + public void success() { Log.d(Config.LOGTAG, "CallIntegration.success()"); - final var toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, 100); + final var toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, DEFAULT_VOLUME); toneGenerator.startTone(ToneGenerator.TONE_CDMA_CALLDROP_LITE, 375); this.destroyWithDelay(new DisconnectCause(DisconnectCause.LOCAL, null), 375); } @@ -323,7 +337,7 @@ public class CallIntegration extends Connection { public void error() { Log.d(Config.LOGTAG, "CallIntegration.error()"); - final var toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, 80); + final var toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, DEFAULT_VOLUME); toneGenerator.startTone(ToneGenerator.TONE_CDMA_CALLDROP_LITE, 375); this.destroyWithDelay(new DisconnectCause(DisconnectCause.ERROR, null), 375); this.destroyWith(new DisconnectCause(DisconnectCause.ERROR, null)); diff --git a/src/main/res/raw/connected.ogg b/src/main/res/raw/connected.ogg new file mode 100644 index 0000000000000000000000000000000000000000..29e9fabba379b3d86fcd7205318e8c6039ef60b2 GIT binary patch literal 10581 zcmb_>c|4SF_y0|{Y)O)2%@WF*eF=l?VeDgzvBX$Hwyb4I42dyzg&9joXtHG~8EbZf ztRcIkEM@)Pqv!KH&-eGo@AdoRcfanLIoEa0b*^*X=UnHy?t2VeT#Nxy;9pmxP^<@$ z9H(Y3AmJeK_wsRY^(A(YwAc`T0N{xo$?0zii2-rszc1oQBB!UYiT9lP$$ww7Xa4Gu z1lbm@_wR`q__%PnyE>SiYUk4Ck`R*+6O$2>*!&t1T)7AudJYG;9K);Y#O zIv@2XnF7QC7&dc5A8p~KY~KPF^B(VIE|B`h<=>3sx=a*voa z2NIoFf?LnyU#>< zI?fRQsO}2H704zoSR`XDb19=@%1D6-03ZY9Xf-RD^tX8Xek%6;`akc#({cd-@L0f+ z<;*`JpyFn|td;|1w5Dc;u$@<9hxDqIU?XP*qxs;2#$~Eh+##Dvd(*+2e?!0k0QO9> zv5(q$skoyYn69aN7jl8rH(rabpk-dFsYnJ$ZFX>X9XR3?3ed+Et|$fwCm z!NPQhIKg%{-yZRHu1H#m<(DaUiQQ=M@&6NcRlQOJ!VFnW_Fz>Mx1QWPE$A!8-k6^sNes-PhF2710oU^K-9roD-okb zeHxr35`Y1SD3Fbt*8<~_$Y+_%?}~N_LKg*P7C+@U6#)YSq6S_O`KMvywL}-X<`xly z{pwX*VacmkZkdIy|M#0TkGm8A&H?~?yEmJrH(R?m(W_I0xy}Gw0H9{Xrr~p=Jy}v0 z^l?bNZ`;~P+RxbBU1QD$GHh&jj04nu&91dGK70z1p4GDNr5Pa*(me zmP!xNVUI%T=m?`xu%7IcK~+s`WD-=H?_Dw!$(K5&qa%(+Ik*eszc`dhfg}Dhgx|4R zA*D2ts-P-xax8I<5*%n1s7juaFBRo*gAbPuGC)<7+}LEOJ0EroB3S;HG3L;N!;QHK zl(Z4&z_M5&aqq_5)-i9Hp-(|`9pWnq1Xy_WMGuaiUw0Ki8U zEK6iR7X}4qV2wgK&_l3H@Luf_lmiGu1{_QtK6tMj6<;)ijy4|_j4mJ61g!6m&HySA zbeW9tXP8*47y+uY02c!^PJD?Al?>H657CpO;EsYq-GsqVFS11$>gbf4>WPCCsHFs_ zBaY7o%a5QS4h@!LVxJ(EAhGzj4?7H_1WS+(I1vH1MyyDJSj;dCaoUH)pkVRhfBTZ5 z2yrx&I2Hv(2;-qTf<#KUye%Ch!LeW;i!n%nV=LQO;2;D9a4en$q5lsBF9(Y|n=Dw6 zSyZoGHf6RiID3gB;xuKAK%~TD#Xqt5B&v42RPPl(n-SF^r-@BT);^n;N{|rDOHGC? zfO%%rRg6MITr)6(uzPs`@a7C9_@T+`Pf7(;H~`>L5)=vg2ttF;_N5oZvVdR~vA}!4 zy~r3Tz6fqeL zS6YV{s0PFu1+FP75GsK-mQzT5=}((5Jj(+{BI@)I0V0q{_Ndb)ivlPNA}8)oj0u+D zaN`taaRQ7eOaPY&h#Z)+FoaGCjs;$ZBai|u7ubLZYIh6vub6u`-kkbK0kkjxpjp5f zdT^uUM?E^NJ|#r>h>k}=S+S>aEs@lb1LF#Xc4em+f}sLK53V=R?D9x3I|OmeaLPOs z3d|ThJw%AuOkh7vAUum2D9j8;;$n#T1cp!el#5%05u2=t&tOtVQ4mqTVx}o8$VziV z(vc5Hq6Ad9K7o6Y+!K@o@gSfECS5uaZI-`igT{fUhQB8SBIDoZg2aD^;XeWC1?#!c zeXtU~F>>^M{QTvqk6-`#*bc%AbxVH?qRofthZLj}Lj^)9v5di(fO+3WbQA-Hf)rSz zi0Oy~AwNw~2PBT@yl|TZy!_PLavTeSju-}aaY81zw!th$RuVFG!Lgu7-J&(<@;eJe zxfEC?z|dqOdK-%f4nz^(?~MSELP-e}lU;GK(3Zc>MkjKL!xbQc>l5f7arY%|?x&0N zltMvuFyK=EhYRA5we1TX)Kp(B8eVw68+oIPb=AAr^1?^*=qR!&b0e;KGj zqAD=9r%gWM9RFfKb^bE~GLBjwvGp2Em072h&@y15*v2zv$o$ z5Xzh=Cbwd~!WeNX?gzxQdS~HFk%s{*q%hth^0N|{YG5S=h2<{IgH;_n>`;nZVncpE zE!o6;``&o3UmINeFyHS=ly-_>c>vQ-iINj3mXAU^lvNVgLeAf2G1Ac$#%Bh9Ze)Q+ z=?LOs!M$}$*2wd>u*~q+b$c8kA|HRxfqTc^T;#c1RQAXu@x?LUAB~sb$a5b%tbIj3 zvdqVeef-VkUS3COhXnP(LpG&;zYG@tNX3H$zovW#G=76C_BM-M6bVpwo*sy$xy=Z5 zxopPjJ%5(vY7)5iNC0uLW`k!DOcDq-Slj>Cu`~O$k^(>r8F8n(K9*_;!x>EuYuj$C z&R&prxGAv!6>|2uy8N8gt&(xQpW5>W>1ingE(5><28DtNvqHL5U8Q0>xW4hW@m_@| zJsx~qlq4Rj-Ng>4<|Z%k?-!3|Dqw|DXF#dlUdhEIiWiGt`wBgar2sRB0pQ}|1zG^r z543=otO|=9!!i}u{d;EsTJ;XSyM|PB^b#bqBv&CqfR>&iO5}km)p<-jS3IRicJ0yLA!JZkXBg4X#nyy}j;rvfU#EO?ycCb^oQkx}}l zwxy$gYE8#)2*J}XfcOAO^jV->0n5Utg3SH;11bPtBB0Z_bn+g5*&c_zCtRWMyTU+cq}VjoaEy!|a-V zb_MtYDuqjvJ4aKEZjidh%-E|pf3EIsRa))l^==+XyfuF)e>E(1)ctCKxZhfU&e_se zrtS|G51f=s+uQMR2VTchWwz`JY!}8WpHH-RN4>qFnR9=py*3moPbXaU*+DUb4os1p zVCv4wO+T&m&rc+He;>Ax@<}&b2+VsU zz-IM$avn;ONZv?6&7Kj;L4D#dgmsvPwv(1@vVc5DQq|hU`_T z9~$`XU-TZnzgqXNRcYrP=vB*n72kHimX?*&@UAu-4eV9r=B$(pRA?LscXopBB{s*^ z$$)J%q4ERz&f4KOjuMiB(_Ux%nV?L$ekQ z-IsG$Hs%wC$3$daam+XRfN`x#t9$dSY4T-fM&UyKNd1v@bP4JB$mIiZKx~$EnaeG0 zcGKx;x<&~!2>NS#Y*#a^!}c0;DpLr-AwIzVu|lPCS;xhyC;^6U!CC8io{#`M&j<0$ z2i&~cQw2;SZi+`y>I`*jHlHe8@Uy%uQF=O_(&Lx!CMk&RsbOoaJMdZK;WGVSAIs|a z3`bqI(3=lOjCiWU&}AR`VXD`?%XgV(|rI2M6a@+<6mxOQk)8YUreU`||lOtN5?+qlp}9uF~^AA~W_1LK@Rq%@^Q-SFgJ0 z!1;kK=L%Zbm+Q0Bx-{tB-j{E^>kS4F6_qkYJ1Ey%=UOFLqh0V;A`}JsKhCiB(hFoPE(`zsen{zh zTCt5}hS4}Ome~7+@)DU>Bj5Dpi|Nf)7=kybg zI@fp{yCP+fSNoXegh*44h{qj~7Ca@9W zHGRus#t3G7&|Y0Mu{)-)AdT!sG&>v*TJ9c>{PI2gaZxJd$r11P@IE7V#t56`;ft-; z1-tWM%OZvqD4ASCJN;UG^-|WYua6-iE9HY3HJzM7pfNywQC+RSW`J}#?}3|VXS^ps z(PBu?HBf(rRIAJ|;q`JsEszl0GKQsj=`v+@vC)IDJ%YJaGd=xLV`e3N+RD4(70+f> z6gy{_pY&UGoWZh~RFuKVkz-h0tUSJn7bI-DubP^__bV7{E~S3mcAosmB*mm+in zr8zej)?}CGe)7!3(hE8ze;{1R^CGTazA(lI(#t>ZsJpqt(aM+hI3hyb`r+BANP*y) zG{YzUg32^d3!^51T2#MCM0O0xX*wWoPIsOuqv~tf&$%O1>;@7ItdAsc5l;I)| zvRQber5gxnn8jD^N1V-2BDlxQprv@ES>Ty0-I=331DQPMLMtmFlP8Gtn&e5JjsQR~ z>bjv`{i2dWYjc-{QsCms`{sA$j*V4>g`CCS>hBhvCTdh#MS_X!FM@Qd=A-62hh`}j zF}u=aUHLM%%Jl%T(4LqyEfUh}ZTu(^vOS7)L;7=1Qm)TS0oE@feikpjR|_4=`pT5v z!+&k2cnJ1P*;blk?k!0l-q{*7ufX;upsiqwul1G$tS#OqJ{S*Ka;oEqUauk_=d4;B zmscW(OjDDA?~++xE*yIUKx>4*$%FN|ILUXYSD2Z)7@W&M<-$Xg+G!6v&zNosEvL+H zd|D-{tO>KnDrbLcflsdyQ#|oTWQfCWrKy)GyaFYi63}l%KYIm`REnykNZJhs|9)rj zl;;WuI(({s@}7k~tD`w^?aduI(-TJbQW3Z+zk|{j65GYVSpvS|X~B?ux9Icq`UV?m zo*Skz2F>IbY%h^$PjVUn%O5hMlD*~ufFfdD>1$lsn%gJN)~(volg7!S$sF$q1E&pZ zZ)2U7F`ekqI|5bAg}uQSah{euI>w(E8qL9@9Z!SxNu1@wU$~W4j_Yhbx6w<^oZ+^& zSl1RUg4gV}sPiS&xrFtQFpmYrW6k@mCWS!l^H88EHSh=2;gf9(q3ILTYnLVL`mhc4 zQe6$|HDU7=$y2mbXV*TzC@-p^Gb`T4 zL_dc#V3-JdgV^1Xine^LD(=4hVe-nIOw1o@K*ZzSmSbJrVf*pErs+}RZ=c4)8@l*u z3YpQ=Df#j3z{-`G_*5M{vD>GvnBIxjWt z?ziW5oFeuUgGRDx`I`^RrG`~fR9uD0Rm!SAn>MiYS#Er4-D@?+E;VWHg}UYlOchnZ z?ZTKCA=CpR^mkZoR7Zu(XpJz}Is8hMc#Vz{t+U;PHfOwVmIAZ*qwhjS?Yi3NmQkgi zYI}|aD;dg2XU#Z;oF6~0-up6X7{N2;&Zp8x`(dlNHPEdwDpd%*E)o`+@(!NqpZ;8i z37Af;U3qnvI`hsxw7LHvMOpR@g%7<8_luN1#+MtU+jq5Bs3--LG#pC=w}Nado5qLo zZ{=n(U8*lpG%(qCY=&85h*T}p$Sh8@^1n&ouqm;NuhqTq_<>n&dF7lZa_^nK)6C5f z>=d(|m1`g6kY{!4eX)v>n7Avdl44EnD2w7hFF9wF^M{(MS4XeCxomYT{HMG|h?iSB z2};^+Lx9oT-y{bZtWphu-`;;7%@{BP)6unm2rY7%+KW|Br-B?3x*v6H@31Ng|Fk4E zIfw30F%luCZPh&gVufch_dr*Am_pd8aSNMk9)584tF?a*t3?z4l^WO}PXIG>o4W(1 zt<2|euwrSqsEy02o6c`-^36x(nVjtkA*i&)*c{TWKp7|9wLNBlK!#09DLEZ~-jk>& zNZcun%pJV3N3KF|g&V^5Q(rKT;?2=f9X-tQexk-vrb61X9aEtI0E+ZLGx(GmCRO`K z-7k$Sso_S&ttPt|BXnD`RKfUFgKlP%hjmP`M%gUL=36W_LsmZ?{-!KRsj)w)({#kD zJseqbmcp;Rr;gN1>ngGp-A!@7nIiwrb45obRYafvf)btgG1BK=++FXu zdu-vjxp&7~`3B`y>_LO@M9H})N4w_nk7$L|0I@UI^tdMSi3(Sq zp_9H~H~QoS6A-cginPU?6)aOuwSjHf@5x%QH@2UD^gV0iWPy&}qp{aP0s6qVdO!e@ zJv=YEivN5ebs%8q{+s**qj$;8Ggp?(9Yplh zPY4Zkk;Hx7z-l8v?ah8&fDJVGOdvDay>0OM9tiWRUFmT)UgkQ0z7Lza)z@ixGu7s} zvV~uc`JMt0z+QOiEbx8#=JC&X)~STO#WAZOmTWIG%uF1Mcvlu3x1MJzYk}%KTZ-7) zpI--_L*`6W$M=QADyD8U(wkAQkd0XR@-XH2nHzM#5#EgWYSXjxGsdu1=wV6s{LJ_l z#7@PyF+ywXRP;5|zR2@MI9ex?M>3R5QVH7=Mj17S|J-pSR7d;JS(M|MYr zX3nNqKHhH{+BUfkq(Zu_BzL!MU_tFPl}8L7AM|B=_VGVAZgXH1bgGYZl5WNg%pFZL zOcm?NoD^)Pc2TIfllQzEwr5c0*lQ}Y6xkSe4offyIj|Al-Qsjo7`5F?>#I#q7{(j1 zuQ>!|n|>(FVK`SbQ9rNAeBAqHe8BofSge zPcCrDog_v3HKXXc7FMJI+EEN?OWjbKGTVbqW9Pz|OLN)@=+Kl#o-9vmeN-Z~^}44K z-Xtgfp)*za=$o+ni1HA#Z%DN_<4P8j<*p~9x(aRn#bL+`u2yqi76xW^OB8O0E0|V$ zjUf)s@6u~nv-P#N^z&PRn^~V{RDfLD^v(n+4kS+0Q?wu(`RlX%OS_6QiYF&e&jYu} z182#sb;YNU9+ySx#OSyYJJw|x$(u9x~&0Lk=tQR1mLY-8L}kX`}x*XH_5Yy zb_J#jW*ejkLeHFl>CTf$9jYk;CkuDf3!CGoXwRd z)RBn2lrIcs?%%Qp3%{Fmc22SEP{rT>NLeGo%WsUfF+lH7WZ6*&A2ir@%VOOpcXmX& z=yw}wxLknpS8K*x$7Hpx=aSQ?^JjjilQmZ|hLc<*{FL!;VqVjz5m=W>_ZJRHPDSCtx$&E5|#p9l8 zgxc19>voxmA2$~oJWhJM_LsiiiH$uwJrVtgW#d-e$h#1Mt`P?gunXJhUcWYtF_rm7UmK@+;A9M51hVJAmh~_9-x5J zcM4~~U#eKMH2TVSMTM_%Z~FQNM+V-v9y8Vc`6O7T|KO*Hc!2G#;&Aaydip*78YxS( zN`pum9z)`X%qU2+$$bHpxW3Pjbs=cLQmeAD>#cU@fl%yCK!*_@Y*1uA@T@)FvJbYq z)L^C{JJO3De(UjMsVjPfVQ=(!;r$`X^7_dnd@1XbXQSoiY=XA#>aFsoYnJglE7{iE zMgiQHSE;|$&3nXqk|{cgqdn+rJ)+bZRd}Tn_-7Pa$E=fdVH3d1+gk>}EHfC9Ag|~T zF%E3ot<5JEnEGB^*?48^2laL)(gP+@2MtDKJBsORKN(6&d$c+35M}n z|MSpul<5sm68B$AjviU%C!YrO}jWhUN@Zlt_IWE<+0Y-K`P1J?Q>Kw9Aq6Sn(N>dqSe51kA&6Iu1VuU)c{!`@n+{#dNQ7QQ6 zY9+R?uX32g1nn>QgHE#|2`|zo`)j)SYJd+DX1d5kO}@P2iD{*N5TBy(h7nC4r1X}O zDtmR_^VU)w`w%g6^)il=f<2$!E_CP4pLC~s$(RRHbaLOufsAwX|846=k*h<_Z98`SYQ90KmFDV&`Kq=c<3CD?6CMFX>;C0@Gx&Z|^DniDj!Z zII+D*qmr}Bs>nntNn%o{OEU8Q@V6GF*NH=s!Rw0cFKZcy8s?H7{h1NtB0Spt;$)Ra zkz*P4O-awX_@5}0y_I=#Zr%$w``FL9Wm{`i)1^-Sj8kUDucUM`s(SePFk~(TcdDVP z{LDLSb{pYop+ThmqOoC9M%^$`#N&tWy7}}O-ctag(N@6h%m*@^$0R-PLJsJD1u{kO zY8B}6BzOml0S(d;;uvMcI7*)P0XvHLcGg^E_S8gT<_ zGCaW|5F?S-;bJ6ykSiusMF?}1D`!FW8fO4(iC;e1@I6_COaml=H~NN`@zb$J>F2uQ1pVV zVZC)LNtgPUL&?_e?(c(~{!&MKCY2}mHcX4cvwQsw%5L7wGtPs}x_aCJj-JM(y zuAY`&Q{XY6*8B5t{@Ukz)t167{O=CI;A`pK17?I?U)sszx{_ioE!G>VtiI#afb`A< zrX?*dCm5n0lcm-D`u^J3O5<8Jl07i05BPG2>pD(1-L(|0BQ@z#cD*~JN$}5O3hFh2b6K{=Aju`3p-%VM&<0uhXvB&z7j4y&^#g%Mu z3ucVZN+G%r3kT*bh5a*7YxkV1cq|uhm0ybe=sGek2kY&t5A`exIB!t z$*Zq$KMscD{cv$wqtX`{joFqZIc5^cTcTh8Dj3kz&Y|Q~u2K?F4nO+DJ-l=x8Vo*2 z9ZP29_Q$)6*}vGapLDNmu8~EcIqO$LLsrUQL%A!0d}baEo%5c9ulKE^L?q&6c7q2B z^YI-$N#+v5zp5-BREKZG4;xhJc7z&VS{v58<;7P|(C0jN+iN}xcBJL9nQ~a_aAUk= zl3#RbE7?G_f)(7v^qG7eY5#=wi$`27>dvdTGYGSBBOKHmuJw5+vMh?RyxGtlRJ#z9 z=}}%p_X{_!$^RmBnRm1?Mo{Rd|pbd!pNk**QQZxc*MbLauAfwHFNd4T52~aH1P-67H_l zp)-E0A;Isl6&@4BF2lFBk#l{a5`C4X+2lrQnSq#|TW=4)S61W>!?fu1?crUxvcZ5N z<-plL?%{?@*3S6bE;}E;ytSKO@Swt7Xtz-iWg4olPc~pnd0)fwB8=^wOiF2uQp3Ia zvXM&1x6>w5xo%|}&h8LlXw#M0uW#7fGvq!r+f2!*{-P_3-#H+tWffjqk2%sj(Wpw0 zz4si9(Ds;oSNC9yFTeHvA6T$Q-dwuSz^1Un3VGFgMQoI}2twIE5X#iBq3`D&wg)X& zV7Z#I!@4H8uxR9ouBaP_VT=!UT>|+%y6+*C6g|7IW*3LHehS>SvR9V3Q|R5O^)|fb zY+`<3^+yF3(#bp;Yh^7T?|6((ef}vhc(+quO^zE?BKPJOSxJ)qdzns?JzX2RgfGE! zJcR>SHuJpR&AdpvHOP5#usyGvo9@5rIm%DZF16xgj{DrSIU!L|>jaxaAr32#rNSpX zWbDJtWtYI$YPbB-*TuZ*u4-BDcduP@LpxcbozNPtKNK+(%X)pu54B^{Tm8>mhzW{T zIv(w*uo^wU(sP?X|DKHOA71c{yUiDxt=P%yN)KyeNEOdIe$+ADHzt|8JVJZ1H>Bsq zuR!6aQWGAR8y_|nZTClsSSN@u+fLnyacM~S#^TtZ=<+@I$AQM;y+HpfA1cOYoa5yO zooSXH%u7!kTXb`7+kGpy6aKQGVDM=+)blycQcw-&EMt-DCcF0RsrRqEL9gi@B8Fv<;S}8H#7;i&&L_!r``9cH8ul<;%{-@ z&UMqetG{hv_Bp>tsIQPzZqhhyGR>=zaXyQ;Y4X#pzVPo~KXT3#t7cwFljg%+)GzZb zI-kB#nwas!b1B2Z*4*Bd264p!F=u!7uoC$g71%ZnoP%?J&C}7YAYCNBc%3G*P^v#D zKYZ22?7L4Z($pwsu7cP@G8k0k=cxKS%F}im46Wk{u{D~eMRyD`7AxQB80pq(qT5@C zIz!x+MR*UM(_pp=Y<9epM{pYpy2w4d@{)@Ep+AbIij(($WEbTOuQttnp*%o~mP!)Z zwGX%8-#o*^ofOMbfB)>RpU^-YCqZ(2UJdXPR$Rlvf9{Ozbn*mT#Am=l_l2>9XCM8t ltuz#cnlOB}KZk