From b8d5a1c1665567cc7e8daac83dffbc9cbac57511 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 15 Nov 2021 14:46:22 +1100 Subject: [PATCH 1/4] disable audio output switching as this is broken for now --- _locales/en/messages.json | 2 +- ts/components/session/calling/CallButtons.tsx | 66 +++++++++---------- .../calling/InConversationCallContainer.tsx | 2 +- ts/session/utils/CallManager.ts | 18 ++--- 4 files changed, 42 insertions(+), 46 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 70b452a27..2189156f3 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -443,7 +443,7 @@ "endCall": "End call", "cameraPermissionNeededTitle": "Voice/Video Call permissions required", "cameraPermissionNeeded": "You can enable the 'Voice and video calls' permission in the Privacy Settings.", - "unableToCall": "cancel your ongoing call first", + "unableToCall": "Cancel your ongoing call first", "unableToCallTitle": "Cannot start new call", "callMissed": "Missed call from $name$", "callMissedTitle": "Call missed", diff --git a/ts/components/session/calling/CallButtons.tsx b/ts/components/session/calling/CallButtons.tsx index 1d557a91a..0469ee810 100644 --- a/ts/components/session/calling/CallButtons.tsx +++ b/ts/components/session/calling/CallButtons.tsx @@ -71,16 +71,16 @@ export const AudioInputButton = ({ export const AudioOutputButton = ({ currentConnectedAudioOutputs, - isAudioOutputMuted, - hideArrowIcon = false, -}: { +}: // isAudioOutputMuted, +// hideArrowIcon = false, +{ currentConnectedAudioOutputs: Array; isAudioOutputMuted: boolean; hideArrowIcon?: boolean; }) => { return ( <> - { @@ -90,7 +90,7 @@ export const AudioOutputButton = ({ showAudioOutputMenu(currentConnectedAudioOutputs, e); }} hidePopoverArrow={hideArrowIcon} - /> + /> */} , - e: React.MouseEvent -) => { - if (currentConnectedAudioOutputs.length === 0) { - ToastUtils.pushNoAudioOutputFound(); - return; - } - contextMenu.show({ - id: audioOutputTriggerId, - event: e, - }); -}; +// const showAudioOutputMenu = ( +// currentConnectedAudioOutputs: Array, +// e: React.MouseEvent +// ) => { +// if (currentConnectedAudioOutputs.length === 0) { +// ToastUtils.pushNoAudioOutputFound(); +// return; +// } +// contextMenu.show({ +// id: audioOutputTriggerId, +// event: e, +// }); +// }; const showVideoInputMenu = ( currentConnectedCameras: Array, @@ -300,22 +300,22 @@ const handleMicrophoneToggle = async ( } }; -const handleSpeakerToggle = async ( - currentConnectedAudioOutputs: Array, - isAudioOutputMuted: boolean -) => { - if (!currentConnectedAudioOutputs.length) { - ToastUtils.pushNoAudioInputFound(); +// const handleSpeakerToggle = async ( +// currentConnectedAudioOutputs: Array, +// isAudioOutputMuted: boolean +// ) => { +// if (!currentConnectedAudioOutputs.length) { +// ToastUtils.pushNoAudioInputFound(); - return; - } - if (isAudioOutputMuted) { - // selects the first one - await CallManager.selectAudioOutputByDeviceId(currentConnectedAudioOutputs[0].deviceId); - } else { - await CallManager.selectAudioOutputByDeviceId(CallManager.DEVICE_DISABLED_DEVICE_ID); - } -}; +// return; +// } +// if (isAudioOutputMuted) { +// // selects the first one +// await CallManager.selectAudioOutputByDeviceId(currentConnectedAudioOutputs[0].deviceId); +// } else { +// await CallManager.selectAudioOutputByDeviceId(CallManager.DEVICE_DISABLED_DEVICE_ID); +// } +// }; const StyledCallWindowControls = styled.div` position: absolute; diff --git a/ts/components/session/calling/InConversationCallContainer.tsx b/ts/components/session/calling/InConversationCallContainer.tsx index 83aa23b6d..4d4702a1b 100644 --- a/ts/components/session/calling/InConversationCallContainer.tsx +++ b/ts/components/session/calling/InConversationCallContainer.tsx @@ -161,7 +161,7 @@ export const InConversationCallContainer = () => { if (currentSelectedAudioOutput === DEVICE_DISABLED_DEVICE_ID) { videoRefLocal.current.muted = true; } else { - void videoRefLocal.current.setSinkId(currentSelectedAudioOutput); + // void videoRefLocal.current.setSinkId(currentSelectedAudioOutput); videoRefLocal.current.muted = false; } } diff --git a/ts/session/utils/CallManager.ts b/ts/session/utils/CallManager.ts index 78c19843a..339ce240c 100644 --- a/ts/session/utils/CallManager.ts +++ b/ts/session/utils/CallManager.ts @@ -29,9 +29,6 @@ export type InputItem = { deviceId: string; label: string }; let currentCallUUID: string | undefined; -// const VIDEO_WIDTH = 640; -// const VIDEO_RATIO = 16 / 9; - export type CallManagerOptionsType = { localStream: MediaStream | null; remoteStream: MediaStream | null; @@ -280,7 +277,6 @@ export async function selectAudioInputByDeviceId(audioInputDeviceId: string) { export async function selectAudioOutputByDeviceId(audioOutputDeviceId: string) { if (audioOutputDeviceId === DEVICE_DISABLED_DEVICE_ID) { selectedAudioOutputId = audioOutputDeviceId; - console.warn('selectedAudioOutputId', selectedAudioOutputId); callVideoListeners(); return; @@ -288,13 +284,11 @@ export async function selectAudioOutputByDeviceId(audioOutputDeviceId: string) { if (audioOutputsList.some(m => m.deviceId === audioOutputDeviceId)) { selectedAudioOutputId = audioOutputDeviceId; - console.warn('selectedAudioOutputId', selectedAudioOutputId); - callVideoListeners(); } } -async function handleNegotiationNeededEvent(_event: Event, recipient: string) { +async function handleNegotiationNeededEvent(recipient: string) { try { makingOffer = true; window.log.info('got handleNegotiationNeeded event. creating offer'); @@ -573,7 +567,7 @@ function onDataChannelReceivedMessage(ev: MessageEvent) { } function onDataChannelOnOpen() { window.log.info('onDataChannelOnOpen: sending video status'); - + setIsRinging(false); sendVideoStatusViaDataChannel(); } @@ -593,8 +587,8 @@ function createOrGetPeerConnection(withPubkey: string, isAcceptingCall = false) dataChannel.onopen = onDataChannelOnOpen; if (!isAcceptingCall) { - peerConnection.onnegotiationneeded = async (event: Event) => { - await handleNegotiationNeededEvent(event, withPubkey); + peerConnection.onnegotiationneeded = async () => { + await handleNegotiationNeededEvent(withPubkey); }; } @@ -953,7 +947,9 @@ export async function handleCallTypeIceCandidates( window.log.info('handling callMessage ICE_CANDIDATES'); pushCallMessageToCallCache(sender, remoteCallUUID, callMessage); - await addIceCandidateToExistingPeerConnection(callMessage); + if (currentCallUUID && callMessage.uuid === currentCallUUID) { + await addIceCandidateToExistingPeerConnection(callMessage); + } } async function addIceCandidateToExistingPeerConnection(callMessage: SignalService.CallMessage) { From c1db4bf06d2644a4e63454234b4b13283967b1dd Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 15 Nov 2021 14:46:41 +1100 Subject: [PATCH 2/4] update ringing sound --- fixtures/ringing.mp3 | Bin 31426 -> 55057 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fixtures/ringing.mp3 b/fixtures/ringing.mp3 index acc7fc274018610b973f355a3b6958ba0ab82b08..547f7133ca264c54265de39cb2b9d982377ac894 100644 GIT binary patch literal 55057 zcmZ^~XIv9a)c?H+p@Vd!cck}@^eVkK5ks$16p*5j&_O_|2r5l_6Qrt?03uzAw97{C z5s?yskYxXOKllCenK!dZKD#@c@0_zUzjKa}o*WGL*Bope9UZTFQ2-$F2o4PN3JL?P zy*z>+czSvA1PAfR$VjP3$x6%0@c0Gs=zIEw1_wz3wl+5USLe`Nonz|u&|5)SQb|!# zMq2vc1^>5!mzMu``2X7*1$hTw{djd5AOQdtTL2gd8PzpfMrIZcE*=3vArT2F83iR3 zbxm!3!&}DYme%%;x9_^Td;9ta2Hy{jh~&>rePc^&d)NE! z-hq#w#wI?`&MkcX{$qK4b9?{S@8i?ISRCQsV6MjOaW!Tcxql!2uL%$>|9^*zE&7Dv z*#G@YZ&OicwvjcmDMRA9TnB23YasyT1KRjRXflix z$>Wx^342Pgg{AA8T|CL68Ux2@%++`4NKm0qa(3 zW$@Zr6IlR29)j$DMFPl>vE2GJ$%v$-8)UwZ%7_&O$Y^ygJ^JTIkdV3$4GLt-AemZjG7i7f72)$Z&G1Zt#`E0V8WX0vhdn{ zw6u`2!sM#CmdXCQKiuRv2AO5!A|_`u@HF}SkiFbKwzmPhIC#rKAXm6EJ^IzHX%Js9 zggVYTso@4MP#DC^F7Wsx0<<~=Ptf!AwrkQG7VV78&tyH~LJS7kNG&wSR=JR{KJO&n zK6}Mny3Hz>XLV+Pj;e=)Li}9*llpO|`m#UI>nh4#BC#>uL!}+n2`;FU zC=tXad@mR=C{Umozgz|4LdyI0i6`*Hgq|#To(i}Yz>Z86tTVib!Q_~ zwY6YZu1uN{eRoMtdN6g?i>;Q;(~526y%#=@*_CK0^=28ibU~Fukb5x@^9sf%DRp)^ zvetnM0F})_(8>Z2W*>sbwrAi)0Ek=QA!mfj4!4hw%ajnM893+TW@lB8Zm z)aLbHD|iYdK)REBKS7MRuywMOkt4-)>`laF{HN*1Q%w$k2K%o?j&fpM{OL=c8T=!} zL_?(Rff8dY+H?+3zTu}+PZgDorS>+`_7`9I)Fa})M|3M`$e;8*BjVPOCJ(EV6ZExI z!$tqQvDmP)-IQuY7w)cQjWnqZ72Fye#Ey1dfSZpHpfC!=6rgG!)4`x`eBAGTq|R{7 zc>3XchQrNwt%OA*D{qFGLlu(#cXC3l`JN_^p0i)j+Pr&u+wMcIW=~luD@i7(UImuD z#Qn|2S&USG%FFXHs1t9(Yt81%NdD&O-#VrHBjN#SJWF+77N5@Z1JujPyc1l<_NM9w z2>*Rq_f{K<^SAKZpLi>r+7g+mykDu0zWrTQNV*N&fqOWpEyRQ;AK`saa#R!+<(D9T zI$}f$mkWZNO*rs)1H|uggM_dSf+KXeePT%ZnrH8}GS_0ZwN2!I^J$5p@glPkP9zpyCUeo^^Hhyk`C z>d|*aXw`Yba4nd^kxKvRrNp+8c8CzS{^$0x#afp`r%E0cnM~zxpRku-7*qKN_`HLv z5B6(y!6uaKHJ)fs6v0sw7s`E74-(1`KqqkX1OW?6=cwEqmMqMPf~>$$PY!akz3t# zPuQ69RE;`I^rPF^Si5U8UD-L%l5x5yPHVuFuDKmk7hk6sDuNY{>RJFB(Qk&Ca@Q+ zI*IL^1^5_Kbv(u~)dLWOU}^lj8Q`9e^Loc}MZ^uAV!x^KyYjzcQnNMn-p5mdZ^||I zPpT}YQtmVagSlDQ;RZql9Ng#aj#?xbAi$y$!lR2NC{G!{7kZNxtH+54l+qsy-^^(% z&1eFvW#Jh$kNyPys-QMEHYR0Sg5Iokg#Og6a{dITUR`1!=e}?`IusQrIQSe*gGUzM z7eH_{8g)9iQDW=fgzJ0;E+v0yWLwbk@QHOKv({sS1{8-6@BNTY(8FeHr^jc*UO4K~bnEA=T7UTo%_q|^2qQ#8w~UAcn)$d%`rI>>)QCzS(r>-KSUBZ7 zkSeuVc1Q0(e$o57r-Wm)xm7bdm`9~3K|sPX_+;8Yy=jyC*NIdi=x~v6i3P#OD}sM_ z&Z4{$NO=lKEW-^wxC4n@EqQ3m{^L=0aawseuBSen5MNPvMaYvDAez)zBKVc%n|#{) z`uP=bZC1slHyJ5&oucMrXFuSs<)J<2*&k0{9mikYi{%`uddY57 z0)$8cPjo{w;FYoyzhgjj?9{w40^Iqk^xtz3Eq@K*paTg( zOST!(GuOz~{vcu0bJq)}UUF*D%TF*U@k8TU)B|KP+%Lb}5A)a>YpP3S5%H<%m zNajVprZRqo{r)`GP9)_Z6aVdwsiMU^cV3scIDql3cn{Tc5JQ*#?yey>UpDe@v&xWo6MAS|*0cMOd?hPvV zU zgo&~o4GJlrrF>6(zK%iQ*iWzTgO~VTZV=oDvG`un3-Au$Hq`OthuH}0z%y08vSF*u znA9c9SL<`vvWr?S!^%bT$tC1xK8VFaOw?3j*QLY^!;$pz9_P`qc4%4~#ElEf5T&kM zpPtu!;dh&JVm0yLXGq%x>g<`mehZXH#tIVXMPInXBAdl9nwmO&Y&%lJ%)CyO`JrHBE$)m?t&DIbnh= zvPkXxZCZL9#{#DhG5(+WLJyBo5co}ROt|26c2alZkpZrklmGF*eWBVZGQy3nwVZc4 zHE17)VK|1Z$pZqOQ{LTY(^<{pdz8V`_oKKKRw(ZLeeC*i?)xt^ua?Wj5p3!Re5}$4 z2x>Ni76i@lty9q!GMSvA4S-(Z@16a+u=a6l&)HVPgnxu60qB;wEt;0e^e*|>6(Lbd zT$TR8R@Fd8d869jl1@Kbf(C`seGwDiiUgy$8oQ#lrEbiO&dQORVbgnQ%9>JTyiQB< zxFm)ma-wSSQLO{T^3A@Li1cBe@e_mVOL1iqX7+lH_ORsI)nUGIou^VG`8JA#oYY60Ti2FCuj&baujn4BaZGft`{xh+i6@ENxI?W& zYwo?-zgPm?C7VJz+_ml24LxJd`}rLn9JfBYzj%`Ozl2tWX967kR$Ydl#CX-e&R~LA zHFns(O^^}B7t|+)ojyF?%j_}|aUh9qm08p3OoPo=(H+(@F)&Wf{wL1bMRvG=W)|72 z6_0lJWvIe*ITDtGv(J6J4Dr!nF(u6n1|~ZZL5*a*x%%RtmBm9LX>u&W+7A|ojczV_ zk=LX;=nsWkK5#FW`;tUg_goNQ$aVkj3N?GfT5_B@&waN{&|04qTHfnCgh;jKa&aM9%VRDPDn~mr)+QJ~ zv-5E6uFRcx`e#}O^aZEqYcZ~K?Wy!ZO`AzOGg42t$YU4Eq?D53oZ#G6uOpVdX$dWDDa?%nH{I+& zzI`o8%qP666BcheUtPH>&OvK?7iPOe7C%^HsAFOLlg$;94^w!dC^(=a9m7DuM-e!C@L;_oHbheXP7Xxt%qH?TCh0Ot?E#ix9xUKo3w|H@ zdla!42%^UCR)FX+-0w%&)7=yRSr!TBx+`dp1AffrY>?=hMeC*bM3N1(`8lV3^*zd2 zHC42;3yl3U-pcX%yFHV}TUUBU)t94v+0QNzd&jMx{zuqb9=M4%A_NvU}7nNt_cB{9#C0Mot z5!d-6d0HS2Jx;L+PuEP!dX^r6zIYjBMc8O=svmPW;@mOQJdM@H6o7|UYhldeZoluMna(G}Zw0bGY^heA3|0JSu(F9uV`Ou{e zsjlxJuB#b@U-g<>sPimiKwCE(YA^Ww0+S|3$6`6Wu(6;&-Z)dVVd!=HusyZ#BS}So zS|h8%Iq%dUbW2pM&tP~5OnqH2L|fQ2zvo9-T8&Bme#V>{CAO(P8>0D#b>cOPM*<-YkOS;0jp+;o}-@DG@v`q)nGgAC#mQ)>NRJHr@sy3cwdOfziM|! zm5xx)Fv-a>2<{fhKAL=zu2Piko4m{{^P*DN(tr&W^cJpwX6UL^L>zzp-O78fC1U9W zo~Q8|MM#-gu7KmEs`kPCi!Q|JWYSlR0CEOg_pUxZ+;tKwx@5h>>|D3dTQPw>b}w)4gHG#`RpZy1#=B&1(FV zdGHKVD{YZK1ukmD=ri@bwg64$9ZxEs6Y|2D9;`2K<&%@vG{=pnG=cx& zue*>>v;?}YDWQp~{}EzC63LmEp$q-nwG4_r`#rIzmZ7$29I^`m*@W6Zzw(Wu{YCV( z6|D7*Z86i7;fy6H)0~vGa*!75I^M}UJLzi$i*-Tx$|2aWeLHp^brD03)W6O|#sZaE zPH!K+5yGDSD3I?ICm_r@Cod26bz?y3kq5ALC28b@z`?y^6u7s~%JJ3O0++QRML-cE zKo?iq$#2RFup1pzAJdpuStCeTu(jhZ@1b!OZN!f*==nIK+X8+dmdTjDXWl|4$@n=9 zhlp9QacBRrVJ~lb_K;nVzq&S9!}TsWZZ&`C`5SO=L`p9 z54Ys`0KkF@@C7Qq~#IbW6T<%}L0mspy^b8cm(8_^U|e)5=}}2vISJ zU5vSsjjz>dK>^WF+ZKBLRvaYJpdx#ZHx7veAgcgJX>sZ%W+ys2A_D6;3xi$>qM=S$ z@Zu2H8OIjCpggaYok|@4Y)CRYE)7~!S29?xJWHuv{pYuAiMI57ve;AUXM?5Q7pZ0( z1zRg=aQy1GP?rM-o6NYfM;}2g-e(f}j1bFl`L19avoA(U`pnAkeItPsmA%_xxwn4K z6ErkIj1qW}VnyH}ppKO}Ea?;l$m)!AZ4|&YIOfaD4wmlx_y`OIrz$q zuCF@&3;06E;`FlH?rN_80zqSAJy@t)fMRd!$K3zaAD0YkXBgIo4d;f3=f~wfH~E6| z2244Kesq)+QY-zcD}IieQY}{#_9ID<_U7mrb)ea)+YBL=6UC}y5Yqb=a20#qMs1n znbtVGTJIu6X73f{)A(ndZ9#pJ~{A^-%(ZMo-)aKIY=0DW$m>vxTq&cY-Q+XzXjgP?U2v z>?O$+-$Vz?L=gn`OTLdjSO)h%pIu=>M607MEZ+U5Mn~@8cOhOL-8B`RD05X5YN}$~P~z3z1IltCIYsC?U9VD!QO@0O->!WaEDO6SxwKxgxfadx z>2L-Da;B$8%#f$a(VkM2k;x~j9yE_T%`OE^={B$6xep1=KJGfS{JHTXo36|iT$q+8 zjL+-O{}FOQLd#T~qtF2ywv`{U0w|0r$WT7N)N7CI^3dwfJH%<(UgdF=&xbUfj?K(R zPMb@{6{wF3KAkHw2)zBeoMb2){R+~kg9oaD=fNQquI(ZntY~P)BX$r~KX!Qj!icpY ztY-Blj0{eN<>Px~_c|&l9Krgu)GBrZ7dlr0>05CG5ia?iiQRS)18a>||F^I~z2HUh z?}6O+!B}e1q#-K=Yn`bGLJ zX&_{w+<1{=I_$rNxx(#;Xb3aup!;1wy53oTyK1bA9kd<*_(L-{8TjU85WwnAc<SX>NOnR#iklsRoX&cZl)QDu&g zyooLleB(k`nZqNRFTjecZPzJx4K7RS&AO;54}f&#?E6~H^1BFY>)`S>yxn^?O#|)v zY_e0LdSBjvqfz!(D6JXQn46itq3+!Eipxa>!&X!Ag@5*h_;ufY&TH<4O-f0(_T!{1QC=cH1n;^;PM?L102a`}0?v ziOQ5bCJiZ6v;*RXOUTIdP03PRN!d&J#XE{qAvE%JwgDlZn;TUEe|*;aQ+%Uh8D*+< zxZ1yhp=bbc4Il;0z8QgFQqV5#8$Ut^Fg6HEwbn0kNbBaelXQlStMfBa82qJex%QeK zi`x85W}Jak4y=VO3jk?J248Xg~z>3nb-JZQtBihpV>JAEv|ksMb#JH1i26TVU5H~H+@dT zDMMZy{m3ygCg+iPGw$0tM>J0?v+Pmd(jI8lv)j4!LzxEc#LKOHRFDM@U7pWNfVre# z74C&9$c&gOC;T>P2Im&uYi&5s4v(4XxbHcV#3T-L@jDYSEsTxd%VrPx?&>0HrncK% zO}49qh+ZoPY&Waa0t28TU-Dmk47JURy(c zM$4nomt>sO?2zzI@?cYYWxWjnJ||EitfoN>qAhv5XsD4?-MGqpcGPF8K&*JBep~0T+9n@t3)Uqw~`*8An;vR zn_%$l`}nBKUBc9}D8SWi`!rDTYv+Fj=K9Z4@=b?!EVE^dLR|AIB4GFa5$Z)kr?oB7 z!Tx2od*2S+YEsfgh~d8!%#O^3#M?27B*h%CFng8qESRnI8g3a{AZi!npzC>7JOD*}j;PtjhH!J_d6|AQdLRy31fbYEt zTI_xY_o@l}HD;w)IbpTXk`-s8#&kZU#n&`len$`9@&YMnSx$o{XgBFN(aHAeKU1XT z4OY+c`$&v=`@9ohDPC(=aaPYIZ*a?+46%^7B!7f+MkpW-akb!)*E)(|2#!6#--R+M zn%P?27~{Dsoe)^-Le)A7(Xlc&*Ka9MN9Xzm(=3F3x6$d5W9Ro7Iu)c{cj)1gZ$fOv zGEG>a2tnHCEX0TcDLmm6u|+7oGFB2L5c}+tbP8~TiX;w3N)%J{C(O&1r}NcEci@(5 z^<;}l$<*4ee6E5Ck^ZI0?HhM(7t-fHQW1Cvj!SZptX}B%Xa7TJ3JKlPw!R|dX;U{r z?Y3`{u7`owtX17NsS%eyN#|M(o!^m_-`&SD2xKIvlMT3=WfzrRA}lr`&Z#I6B-8?c zfEM3e<431*WG36Mb28;|`)kkde2E(*GL;vJP-<^{Ln2ew9^#VM@{`jyoVFicyR+i> z_S&E25z?$#AO6UxMN9GDM(k%f&820!M;2FN>xFjHuZ_hf!3bJi1oWiK=&A zc&E8A*w61V`iD&j>5)JDyzJs98ACZDG`2@>VdQ?U5h_r`q*$3cF5|1x%wScWKwD49mW`=u6@q4B@Y>Cyi!Uq_@8raDJlhac_V9kvBe9FDgK;xU_z(N^hVfz`^RJql zS_$Q}-=IIsVy1;7TkqzsRLBfw{8u1Wzx$(PgAmue0Btw)qQ+b z=%|Zz5>$9t!k(mE2+NIM2(Ri=$&Q2FMsCPT`qNO)F;DY*mncs^8kwn=QR@y2+*~SN zIwSNVEDmiD@VRLtLP@hG)}9cWmkRJ`(b|#Ar_(7X@aqvtv_RBcwjD+BogUQkqcQ)b zrKWLc?+t(c{)&jB2yOc!jLvZk-d9$wyJT4W& z$bkn%yYSzaxVC80=U&;%m}mc{8>lesElJCcHKxn$CEK9TOvmgoqI z3ciHh+y$9=_QR=iD{sF=p&EQOB*vps6P`HWw_iH;eDiV^mA7Zm3?6`l6|jc^)WmT9 z2S{u2tOG;x9mS%SWW*whk3PO@E2AKNDMufuTDnBxX`Azj?W6U+n1A!?p8Bgh$6RQN z&oyz-arKgulD7v|X0oeJF+H!A-9Q562DXcU$lE~R{%0-s3n1dVZ50rxF6}z1Y8Fgw zOxdBL-?XPc@c8Y%dcl*z82xYy1bQA&MgrC_GBsn2qWmkXqY=hg7C`&4@cXm~dF0*thWW$9S}sE7AKyr|w2F=Mn>CpxE%4oNd$)sy5{^QK z`AJ1Rj;^U}zAfZc(Ut?nifh0n&Aq=32qioS&Rqqi!0F(Fv$|-e_A4?1TGBHcDweJQ z`J+r#By&+4t6oMDLFQ;xg`XUmXktOHw@uH6H!%(h6Bs-Gb1nWy`l4`P;R{l^ZPEty z?dGk(H@EOTA7Xn-Fs0zQrW7`(8Mob-wR;w2_Rog)VbE1`s{k`5Ex2j4dN74CrR`7M z%)Kh@m{ws-Pn|ILPS^aQT^wYHTo4#b6ln2a_aJ(sS9a?((5fH#@RfJsQt1tDY2!4@ zPlHs$l9`_YrFK+>m5Mdy(KSwb;@d%J9$Fi>S-xM}C^}R?D6CZJTsJW`WQO0j|J+?Yb z>2%SaFjzKm(tb|$)BT*yjqStf-KI4-tlY!lU=7Z>Z-LXsCPh;&;SSJ8U`^e!v&Cf$ z+_@hhiU&L@Z?&8VGDEYoxU)DuLRPoAs0f8fcJJ^PNoR~N7#&SI6}-D7;wjY6so$HZ z3joANkxvqc?&7pGGu>C;>r^0c)ej?@FTTZS9QQ4M2N6CNXL;zkM@$)jv@6eA>WoQ+j-tpGS10c#wEMB zoDij1+L(vw%G+tO(mYwgnr*F=f|Ie&0#*MJ`VBB}s!eZ1r&+p*`HKgO8dIrLs%Q4J zYd?4;{JuwICJ_Ak_ZOjwm0OD_o)|`}6>so{5&C*u)iEx5w&zFHfMHuoyI!$ExuP}^ z-&$bFS&#=8T}bpyfMFgYO4Ow8V3W6k*aIEQlO7dK@c_Iy5FCqfzHlJ~PmEus14$4< z+n${*@sE2+@jC*pNNoXqGi6uOpT=}llcN2`Xfj^WK%Cy=_utkJGlW^|5{0NB5e~@$ z{1m}!c7YzNL1i`1g4vmm3~~m<7J5X_>MV2-$0$KGIKus1f+1P+iqDQ*cdtr}96$n7 zB^QmpkH`X4)+Xa8*IYg5uv9{RBYgLwI>H;DBuZUAK|39oZo|TEB%BX=o%_@?Yd<>D zB585-Zdzjv<`-4b14kY>AqoiID2qD{VDRx$?DCZJl>K(t)@gkzAj|`hs_m!m-|(DbX2-!@o8E5*pC}15DRqBRbC2)mM}=n8K7YhgZ9){m;N7 zo?3;TVrdqvMrlbc;ZUqbhz!uu(gFk{PsiBmEUAqD&=I9TZV;O6;hBp+t=e8Nj?vQnR$>MAKWMU>`~3asHe|laA^1pgrb9EKp>whv36Pzt9XAufm&O`(zX1 z{x$vOb>vTdY8mx+qbEp)MI9JyZ8}>z!mrf_vl~uoTKdFjCsIH~qwzW_l4Y+B#iYQE zOJ{Zlv@pV_81qz0*=7ZcQ13PTXF_N|j$7AkBkN{Ae5dY5sIf5>v9tbxmQ9>FS53~9 zlLJo_qME;h(g@)Q&>$5_1SKy68Ypdp_Jnn4XbrV_P5{_7(J!*8eq%QSnAJ|iGgBd) z{S7MM5}NEh&3Ghp`Sl^i8@Oc*ERHd$10mIwbK*Y@?u35zsYA7a3K(@mumCJYEg|@q zcEIBovXzunac;@>F1pZEv-@o~=~|JxY*}o?p{9r0rfVq##|oiqfIP*QDup)|-cvSH zfq!4&-A?@_O`(-1=!<(D>#?Us2>96CS*_E(3*-rId%67EvNJe~MQDO;QK<6=6_?=Y z4S*4#PxI^;w#fe=4+tCKwD{%EOr3PPXms7nLnj`D04_ZneO-_bdOY)7=q$ z?@x*(S#K2q0Xx6PyV@`pzE&oL5(1)WC8q2LzMA&%|I_^EeE+cxR`X9#SL`(EGUf*% zqy!117pMs6wXw_+0=aN(TRfxeBLhE-+#SbmF;L_`R$q=dv*Pypto2{AtWEZUy@vEg>~>$X)BDQA39|hy3*5tAxFBJ!bVF#*-f<@?27&+n za^bo2mwBXRnqixl@Es4vB$255etRw5ne0CdnJT(l$v?Mn!N?zocnwn5tBgL5T$%m! z?S>jV=Gz;)LAnP7tyd=h2yG#WDD7tgLTrbe3}0%xRb^&|yErteHyo9eHFTtObbia> zNn)rBt*KWu_;V=o(hj<2w|M7?pRKY=qL;BqvfA#$@)85^O(H@3+w|SO_THdorR>a$ zn|aaS8X%ul;SOH#dohj1Mtx3QQJ&VkVD>wSd_k>?Iu~$$*ZPqYHuk z_bu+;h*VPbIx-(TPr1OlzhEkUO9dh78HzM~Z7{DuEib;z!r2U7HJTX`9y7DoKnRz> zuj<^OINP!{-w>7^DqR6;lXen7fJJyOfm)WI@u6|mKBeKkh`eo<`#L*WsxR@Do!<|Y zPunuv4H713aZXYi#}$N|E}q+68N=X&g%x-)IK6ij*NQN7xZrYV z-u$>-%=GrPlk(bVOo6lZ>{eUiV!CbgSWy^Dq*2zIFK-TpK!fZtza~&Kqp~ZUAI;F` z3P~>UG@z)Jq9v3v-PPx*`iz{;=C>mSRrlM8&qfQlYLPq}%hnH8H9YP2zEKvWK;vF(yclgm-Z<3uBwwI`q0Jfb%~IG&J77Qt zbvp;DUAq~H6G8v8p?QGlnzlWfCP3bL2yJ#HDP+V2nl-J}(b+KU;j6fiXzI4RdBTqI zGf%QRn=5CNuT-5$ZV>BHb4Iw&4W7^l&JuL7-^h?ZY;#{a3rd?z*%J}sIc`hF$Aw#7 z(tF51@CuROYwR6behVk9bQ5=IGNHCyhD+($Za5+Le7} zBvJjZ(YCN@FAeJ>&|$?tCR%rxOMvA>Ij@f6d$jw{eIdN zZ>gdvSU>;8vMAJSLFi2-maV;@E5BpL(xK=>U=k@ue$tnuvkOIwi(!2Yq{V)?$2h`27E%ZJl)6QtcNrMt0tIM6&K!5i zu_aFB`^6wPnq_yaR5JQ=g%kTZ__tbW2M=GAEj>mZOM;+SgpUxm*+2)#u@vOW1i1Kb z_7fT13Mh^yc1=MlAEb~!&8o)!A}og(tgo+p3YPY<+C-)w?zHEPVVp~UELQ+@()wP@ zmUNb614J{9iqg`Gip&pW)!6K|jj|Jk0qq3qVe&^WCo*RuGpKKxN!V{#{TKUZ*P5tR z%{mVd2;EE7x>pAM??%0I0BIhA+g3BdPmXTkyK|IE#dC*h0YsMd*S2s5+&(4k7WYOR z{(*?ZZ8-L=?@AtG#AE62r766|?$@P$8X1y@78numOKISG`V{l?g(v$(i%qV8C{32s z-w(}I??dm}9L`8W3{$V4yYy6%&2$m$;Va)VU1FC@&mP3ssa^#@q*;DWLaoFYH^uRM z&&43Z97LQD2y;WhfXmL`mR0HGOuy)f`u$%la%3Ou1Fep}_H$)5o{k2G>`Qe7R>Ek% z-xe_{|L5g)h+)dNr$S%)TdE{pS`hEkWWNtoy0%xRh07Cr%)z0`nvVeGe6K=E+(TLW zY}5_lg)?Y@oxUovL5v+=tzf`eSpdT0I`2nkk;R<(E)9OmrLr){HLcNlg8y!2H*AW7 zp&?MW2^}p6wKHJVd9@tX&m5Z&<-+u?A60B6o49guaN{Z`JHOdJ>GDGA1kb6txAmaD zIs_;~rhNv;rT^0s8&{QMSE0?g_k97j1D zK}QLR=y9u8;Yv=0x)djDm@a~-X zzD6mNQcl?c+2ehwrXNdU<-t4AlKA4Q434SBj|J=iiCxO# zYfq1fs%K?PHOhHjj(`cIaqs(`ack-*)w|@4F&q?fm>0$q2uCxs(~0dlp5-V~&|b(n z(vLUxpABsQL>9)Dk6!p&+HO<)3$ao?6S>)VR1;^NE!@$=Dg5?n03IyN0Z|x!kPv{| zI9|C@txvxJEVQx!wS)HO4|n8G)^gRp=>74YRCDuB8vat%tsI(0CD_v_X(xGS!HUIC z`d(;f^gL8({g$vBXWc&KR_{@#Gbr+W;&JGOiv}UffnZagHT(P5?w95r%MPHQj1~z* zH4JeoF!H>UrX8u%e5m(DPcdH^nq}g4U(cQX?Tv;cx!b=!va{$QAJ_{%c{4Sr9`xEk z$*{R`)xgAkwpvYQ0ZS-Q3`NklhF-`bz(cJhf;p%h4C3_>o8{oP=G7w{dArh5KuMzwZg z{}I{-hkpQ0X?%?VF_Q$VpT+8TLqmgb?mAbqF>V|!9EbDu)xHktQ2HviDYyfGXChDRe{D2? zH_O-{Bm<~ghM-MRwz3hz%S~JZVn1h301yVq=-&BNW*~u7DpRtt#Qs!bopNTk1*w(l&3CP`c78Knb3)~8H%sz?gauL{wpQEerL@Cx@64qoNuE{qius0pxYrDm{uCHmgO7$T6gXd|K!WVu zmFG1Q*U~l$RSCNtc%0;73Ok;^`PP@M4}{<#3+P!why^>uvyIe>A#h=%1In zvY~LZ&nF+OEtS0<(YWo1MWN_%=r{@Z48+$FP*>9M$bow=dj(`3JFQ6B=p3zsZ-Y6 z(quEKuzbI~-1m;7BcoE{)K9x!{U-oh9d|*!P5k~<^F`So|Hz*EePxG|s@5ccntr-x zO?f_Um?jI?Z*r-5C2(&czJu7V%d6p^Aj(e0#sNUf^*&Ok$)3tiIol=j7S)i2IX-b9 znQ}&%F;EkB!`umTDD75WQkm)sdTYXC-v%bb;tQ}TfC!cKPh)5&S{`01&=tY%^ zs@a#h5VC?_21Kb%INQxc?;J*k`MXf616+kU!O{%e!C)T<>P{NU+yAqnH6-*4+#=x0 zhHQ*Jn0XkgQ7a&BzVR}Oic z3nnEX8r+{gM1WY-*r_(mQ!Ck}hS(Shyw4NaE71C{3>l>6=^?CUN|kIwQuW=4!}A_v zT{l-7_Sb)@k$)mD;l&5O#D_+1Fye0o(cvF>EGM`svpr-2Y1f0^R3B-o-z9LvEE;yQ zE^2E3u1qxV9^Qt7!D!vfeQ^FeD1sv7_Ct|S`PTq@9i)pigI(TC(G@)4*Ur7}Z^$2z zKg9h<%km4v?#|)bsplapCay0rv(|J5SV`1p&Y7?^AyIIxvcow#^dXGw-yW4X^^M z_1c?UtX`}vx5sCyc^R~8s7u#MRntySVO_0^qqpTMUr*}XJW2USXbTA)huhAHTi>(U zdeZBaRQ=QpAw9KMr(JPlN8zc~pAUokHs$53Giotr8z)hk!rch6m&?soKHv(r;L4)Z zxlhSB0X7y2Cssk)pUDyEZ9m;9!&$eMFtZ@#UkUz`NX7a@E9cu<+7Ot9D&DPVo2sy~ z@CES`s>9KZHy`GC${-<&w-4&@93hAsiTtfoKD%40D|q#w--Mczo&@Eqm=5$zPC&)X z7!((mcT>}|4I$r1ki1f>ed~5*`-eE8<;$pnmXd515(R7Dk@|8jNePRa`xKiu=@)2N zW|aGu^;Y0H)Zpp&nF~Cs5c~^b*|D>P0u%v*c%aV%K#=_li|qi8`|tbt8NW?H7upYn z+RwwJBkb%XQ`xNn9RhfX=i@Vsq#z)`{ zvI1P`Rbk~BstdOxIDu#@$ma=3vi;8Utp4!zT&<`8Rk`;0qWGs;t?B8>reUfHzqcFj z?n%?~8&g`IM$D2J*i2yuGh+j+%tP)42a|H%2&SM0Cr+^c2(1D{qHsGjwfddgUeST1 zX4lfUVvK(EHm(J7)b>tx2=^j}`ns(U1k^kny9a{ja#H|{H2uOC=;AIVHK z$6A3*o&geu0EUg@-~KZ>?|ygIFZb#K!bMVWEhs}c<9rN1ZC}&6$@KS6AA|SuFG`x= zCy4I|uozc+c)D^`&7y{-1}Mm2EHePYljiZR?X?1Oy$6-E8A*Fd946cAyCw^X{?JnM z&w&KXvAi_)hIN1ETv1h`^4j@KUO3#*O=&K|G6gdKYVliNk1LqY6N;LbQ-B9=+7nC( zuctw@6v74}4GK;?dX`TciChqTV)WrDo1z1qpvDH7x_afTb>RNu`SJaRXObCn0ensF z(Xl0pOGRW|y|MlE{OYta8G377`#%BgDC)JsjUpG)@1`!LL7>wSG?FW4WMYUdPy z*tctV>14#j0siW}RD)aB1h+~Tu0s45D`GAB;Wz#9~?2whcHz7hvhe+9ERpKNogp6Yx=bZa@`~1Ft!8wn|b-%9l z92fO6J%Pjz?oJ=OWc@3G=LEK-YYI%s#w8jB>0Id*%@z4j)7rg%)WRzt%gkE_Z1#?< zT;MlIfLFJVrnUX?lrE8sC0M{rxA^=rfX&Otm{-=>-;i#Aaw-LZrOTR1*V zh>a8(O%5ng-k0XA_+S<&M|d)Anp^cp-AjcOaU(un+Tz_1gxf~)Lmk@PZui092z7NM zW|(Ld3FIOBvH|rkr|`nvUI^K%FcB5Fa18;$GYCzk)( zpfO~}PaJ3EVEKMZo9kh0=;V`}+M8b0c7Hz%7$lE8I#u>)`)$2ebxbGA|7_A}ErLMb z@qnTnSYlF_&$W@fBm@*MhQlw-j!?j^)v!|!Sl7S4gai%M%WE6v7qPmHS^7VHW|LOL z>_5gSD^$Au)Y5SLPatva4YQi*quwNMOl}tCc&nCp%YQ_k#P3^xp!byfqv%Rm=Hj-Y zwmYO3z)tbj1r8|RcP5Up4X@q~hu^m{Kxjb7$RO~8t}moJzo-glFE>qJv=&~wE9t%zQc_s((3k5poEE#HM~Y)qYu~rrQx(K zxltGa_(u6j9SYcJyMoIAb^tai2qNvfB$m=~{eW}^Zd7s+epG*_vzRbuOBui_fLeGe z*)=iPMIPrCx{6N9d)1C5i86{pHQeTXov=$OMD$Oj9$Wu834QxILfZ)Fk*9^fn1qu1 zsKL+2V#ZXg)XJ^$U4yxzUcS%e|6T4gV+)+sSfdl*?ol5qV+j)ot@KiuM9xGg&PC-W z1Z38pydSdIdC*YP;>t6M_)!e^xMkc6jbMnKxoH07Vd zZIz3-)|oH=J3qq*^g(d;zs$Jb?*zKZF_)XKO^;Sd0^2{zlxFr^j?i1> z>L&~8=a}wkoRm`ezjI)=LId&(l9mFa{e|lqrAy?=-jYl5ZD;K=A*hi(NxkWloNn(W z-RA&yq4t|p2%Qa`{7A0P0zoEfHd*!h7>p~Met?P3=*Qv~pbcwwiiK05T1>2fEB!>| zBodt9i{NEoqi`D|CIV5ap07+8Z2I?cTZ*^xC!_*q>Q411+wg(5`*2us1_9q>+#{`p zu=?<5UrfR4bIYX&o_=#qNM#SIA?gG34}EAcz_OFBrUydO*AZHWK)d8;_av=#91INh z2}5Y8+^A(*cWPscgoVP&}tb)vw|bp*f7sWq%^tV_RQ(y8*Iq4|);TED_wRj#G#6$DOTEVx2MN1KDEyZ8q{rl+l4 zNfb&Oja_{nQr~`LzgbA;Ryeovy|G^tS)1kQiEPoF_ItcYpKtXPq@bZMrjmA9zQ6%i zJA&Z{`j0X5)Pw$M2TDC~iwJJSv08JOvG7cmU)y~oG zSqt0niDlr@4Os+7f&z(M1>o%T3JKOX-A2yFsu5fF@wtW|_g#^PbWy0D$b9F0lkV|X zMXhiDazW!XQ?Fz%Khj-27KMu0z&|9saaIy$kxF$`y|DZ6Q+@7|u{nO5M0R;B9FsHD zo&+3QZj1b>+R|!b?MBnDIw24g`3+r=0g73o!LxjN!pz_*xzqJi7dgSTx9gnZe>q@x zr~Q)LvSXjjW5OCMxZ8}~v^_&KzZYeo3O|IKFiBIk)IN2&bOA7mM{ocDK->)I1lVVD zA&^Wf0ZWCJP1+Tn2DzAmy6~GSu$37?9^@C_yI4Iv+xjpuGe{Z^DT`G*_dl->0!U3lm(tb6OpXYz(cVisEHEB^@- zb3LBmWuG86u0PGyoBgaGsx4FfxsGPMnp4u403?9L9VO-8bAI&TgE!fOlT?Oz_Fs=V zm)MP1adj8T|L6>;-ItIDd3sOT31bCrbyh@rQP~=&(OcF9jA%b~AE2P1RQynXqS}b0 z-Nr?V#F$=)L*2JGH>T>*p;i`)~O>a+czM)Y0u?PC$Ow1KPBN0q9m7{tZB z7$klAG2Eix@gfN`+hhP71H(aY#?5f}+FKB!EDfT*)%NiCg8`v01kSQ&oN2SU@zRXD zKkuW7UMWFTZK8l7fFj84^M|8_AvAQ)F5mt-LVqBH{H7LrK8y_y?-p~alXj*p2s^gO z+jKMvi}cqw{>`u(p+?G*o+BG^W$MUv<@#M_YEc~R`lUA-P(tnk+87ilmYssv=2B4* z=lOS!6uUVKnWU%sT=GLOKiz*5WDQbIyrLwd`*_pjjY-fXZQu~ymVOga%wS`y(u(WH zcduL;o)t<bC&236_b|Ob zpjUzusy{TE|3IkOC~A-2s1yQ9_uq^q&w_)OD*=O<+}B>1VpA~7g+&wA*zAgfOqzbg zn}W$tJ@=#cadr8pCwSDyw}Cr25&$%H0-MK8&Z*E&1jL@Fu1_yD(jmLsPu9(l1Z=@G z9PW*>Q;Yv~Y=3>Q*Xk{3EfkkM`$$DO-*}Gr;cwEaU}53O z)qu-SRn@WekNQxo!ws&pW#GUj9N1F_@CDa0+?}!$oCv~|iHd-Bo>kAzhpT5GY4~|| z;kfdx>`z^u$tVlm!AV+3$&K?jr0e>brv2*ry6-xZ-VyNe+=*8;{~Wt`c64P2*PO=P zK?P#lP*Kcao4wiJTnW+1g3z}6`;fUu;Jmn0^O|-v?H?Ot!YE!2Sk2df!EQHaA&&5i_WMcfKR&)_m7t^WN|r_WXnvIPSqCw=Drc1h4{`(kD&7AS^V5 zrT-FEp2EhCiDu(@J%=1^MIz5EOXX(0gy>@2cJJT00kh{U&HuwVNOl^fXfE5Y)m6!% zMtQ!wDiZ}~riP#3;dRJeeBLI2N6jL;Q2_8_fdRt9Loz^mMijU%Am6D$w_O4&OpeRe z_v|lz_EYu!W!3nD+p{T|lG`#~`P`2^=izxfsEnASM zS~1o37kph&@ji23&A-wU*>tznrc{H-=@_ttEpo)7uo(c(b9xuPr4B+Rb0Ux+#IyIa zf#P4EObWBR8I}&ku>XBl>yT_D^z|F_iTQ5yL%eKYj)_8dMB)(w_F9cChh(Ju^Mb7T zq3yqSZ2Dq~e^`ibxJJWHO>sfw~$k8 zfD4)#j=G#iOA`?gK%md(aex@iPoXnz1EU7y}ybX$vKxBTk-t{`XAOm9jn; zom+bs2>QUZ=QuiOdWP=lR`9)OXF@jk+-lp$HuPK;fa@(_%sB=QE*Pa@5JW6Jl;uZO z&sf6Bh~ZC|{diTL$qA{EjJWK}EJW@y!An{Fq4_uG_Ce%!UMpM&cVwdo-xCGDE0>(7 zDqruC0(TZjiPO(`aJ6Q)j(TnZWW(>~y1cz}Xa{Wj!yr76Dlr}cOx}kqmS1@V1;c;Z zteBot{+?rCOi}nYV_*0evQ!jsOXbx+;w{1TOInxp&RBs{VH3f-fO$yPjApKS;#+^k zZe%mdyZ2sqFC(t$a$p@Ix18{J>tErd?^_g5TSXNhEOQ;9NM6s5?xy7PbG$YD(&Z8W zPRs;n#IDi0w-0%ZJ%Tf`2m~(TYI=g!7Jt;G=0xG!L!nmHyfbXS!~S}I*s(4eu9Rv- zYVg$(%#g7aJr5^F;F>Dz$8yV;wHKc9B?s(N(Iwr9#t(;kJsMx8V&VDiT<{BAV=~@+`ZqRh zv!Am0dmsGOJkST=D8MQM;cL_(xX?ZTy&B~oxf1Xqqe$GKqNn!mlM0V@bo^)