From b39c712f717004cf9d456b8dee12016692ff0c4a Mon Sep 17 00:00:00 2001 From: Gustl22 Date: Sat, 11 Feb 2023 14:41:13 +0100 Subject: [PATCH] fix(android): app crashes on asynchronous errors (fixes #1260) --- .../audioplayers/example/assets/two_beeps.mp2 | Bin 0 -> 47648 bytes .../example/integration_test/lib_test.dart | 28 +++++++++ .../example/lib/tabs/sources.dart | 1 + .../luan/audioplayers/player/WrappedPlayer.kt | 56 +++++++++++------- 4 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 packages/audioplayers/example/assets/two_beeps.mp2 diff --git a/packages/audioplayers/example/assets/two_beeps.mp2 b/packages/audioplayers/example/assets/two_beeps.mp2 new file mode 100644 index 0000000000000000000000000000000000000000..6fc543795c14e3ef2a564e40c8219883509cfab0 GIT binary patch literal 47648 zcmeFYbyr(k8}>_Epm=cz(v6p3#kC4S0)%2gg0xs5Kmx%jRB#A{k^ljM6qi6kvEa1D zio08jYfIg`_euA&pLaj+ALj#{G0qwpYenW*YbE*3Yu@)Y@A=oSQaUv?H7Fbog@QmJ z9Cg(Me}nGtjfM2jR^RjE^#A3tAO1gE_i5C|m+sU5yyL__(BS{~4oO}8{rIrgLjIq| z;eWTK?f!l*^q;m){DXftroO!92V4B#=Kuf6fB%gC-~L&q{^sg08gjO9INSg#36fG% z1C@fMGX6sxZGYkI6*{_SbU%dd57yV`AMgFRdw=0^OW$kd9}il8+-myKbM3=}*2&k` zUcL$bfxW+dyM6IZ$dB&(r;j>UPeXq^=w3Y4_<_B)AJ8^?8uEku$2}U4FQ4B3_2bL$ z1MS7#rBxbL(W_4UFGf9nW7*?(TZ8NeTc80R^>52xG?YIzP~W_H^NmVXd_?%0%IJk2 zTEiCdy)PSI{?9po{h%>_?15ZgU;lvgcltvS`}=?TMvkU6^n?94?LPhQ)oC|DgLq+Z zwX?HxZ)J&k%}Mz0egXUT`}!?kUPf*FbDzHtw4Oo6w$ko(yrscEnyUG`TkN%b_6`!WleUig(YhP03%$%fP5sLG@>$}qp7U=G zuW?38P&H|{I;d$k(D2@b)=)Trxbhkyw9xV-i`N`z%m_A8RAx|Q)R?*zoA&3KD<7|k zoLPGR@w{xYP~L(5IYx;T7$-Z-t5O3C(?BiPX*U)d5^9iv)77a--VX5tMx*79MH+~F+6bRj^36Ke(Tc-Hw=^tNUFeP(&otY=6=x5NO>FC0KBbN*ZsTqcQK|zM< zviRhGfxGbg>0cA7lH#~H&pT_-fzZk;hmT-;Gwnf*3MZ+s{fQ3sMy!9Clkdz5m0GA+ z=2ScLz2&J>OQ+MvPP3DlFMW#UfBMw9X#2eGv+ubO&4pFRc|F$mj&0ynYwE@To}>UL zm6M^;)$6QMv3b!y?Ujomux{V^6EE38Q=M8j+t1I!lyT2hh#Qr>>7E_MZ9Xefo<6#5 z4b9iA+EU~Je8I*wcxC@POVeOy!a)#Pp~knKTLaTREOdI#y)hAhj!dXtA>RF*WqFNK zpR0bir;OQ{AE(`2+xe_be})g6MM$>J&Gzwo{Z$oHZHIW0Nm?JcI@{ zsH;w*MJDTbqgP+`I`uj`mOAQC6RQD2G%WX?zPjA{li};P@YnNPw6 zQdy~h(O2sA_KZGpEMxr6CtN!l1T@c_B|5)s51sE0Ph8P9G`?C(O?Nr9PA#JAm}OkZ zdzZN_E5cE`u*^fU^#jf&k1EY`{63BBe_(v1z%53A(52co7^cNq1#RF^Uw@aqr3#>RKT6JIsjd!d!P69-yZ$`d7&H z=V_)6LOzo_7caz3WdR+^RZUq|T47jSO_L?x*FRRDSx!f!COi**AH)sTx(W6^!#rs+ z!Cej#5#xlR|_29k}XmQif3HGyyW3Y2jREj%*S4UA7xl1)g9mjTH53WXs3 z;!6BmtU}ly#mlo3wufdA3`yfbjURpFyj&2Tw+iB*0tBBj&B?p#eFs}QIuikN`~Zk% z^T2rj&B}aOsXv@0BmN!TQ3J!yyWXuZshl~`%u1_Hov&v@Nwhb3ZbD-#P|CCU*HbV0 z(O>2nNvOwdX?=dsrnXvY#moPzVkXz>h88X^McN1R1B@baYzkB z@A(3}3y0`U;f^q^ALqIw-NGp=46-jt^SBmRfkDKEaxQ=WEK7GcwDw0$e=)nz!tQgA z%kg8eeYejfOTBH7LP-kh3!8blO@Q4UFZ6xV<-Lq7KO8NX@Fhq}^&hSJZsgv=%+Fj7 z7sF^J#$5Y2i6XRVD)C7N2__n!@#?t*;P|hniC|eNC*n z%5g1$BM&n)r-!wR=5zuMw36+6-LM@7CSQ`lqQ36~q`tbnZ@!}GwFNLEUFu)PBecjb zypg4{S(l79zH)C(-WLIfWozrc^}cjXq!P>c_Oq!O5o-(rQmU2t7(je<^BNv@z(kGn zN`#zT`S7b3H0xGaWVeLlyMjFgkzN31x28_@R-CzhriBhl*mtGyq0BDV08GP&a>-T%KUBbvzWL$m4*3swmA=*R)NTd8NpkH&YlzE~tGYebt`C znw5*ZZSK1dWSTlu(X$Rq11Fl@eMuOJ7q`}IX@4^^M36^nV!efDxuc45o*9dZxKX;y zK7C0ozrjE#U%3+o1>gTqPDAf^~ z2srz5BBvZ;fm{uDrf6o!DJMVsG>`Dra@TSaweMQ^**_WTym#(7aJ?--xJzsX2~4`K z@UXUcsw|m=emePXB18$JY3(_A*?zLJNFY7Hbj?;vC~O)9BPx!12nI7)NxK7wIUlkF z^=4Uc(vLxSlqRGv=_>#gl#Ax-2YV1HU|}A++bdbAow4`oF6+#&{Su<@AdVHu@X6&SWleTM*Qc7RuqMGxVJQi`;iosXK<(K`dQIiioHxLhMuS z9+cj#p(PgeEXTd8caw)?uanI+<7)@*S47t?N(Nhq=~rV@@<@4JO9g{vhNNi?+>1mP zCC_A?RMX6**atv+xSpwN2K<4a3Wn z&LF27Jf#xNN!U@#tV;|Dw$4{5Edg~;hll%U_(BGc5gKef((a&qgz36(-!65^HQ~-{ zz<&1jefgJf4Mq4l&gF42A)Op}GU#^8p{NmFpD|<0%(Ki42{YeTt<(Y$x@EeImnjpr zOeMWByxloP*@Odkw1KT5K1J17GS-S4`pZLoL|Pg*{3BZ#6OdP#4EsrhYLs4-QI8`u zH*B!QCT)K5w)faF#ZeH4V^sSc>Os6AOG2B6n&DOZ!t<%J9h^Zy4O^Z4SL_|Cjnp>0CMd@;IS#>y z*TUF7t`uf{C`gvyF=VK0A=1w6)Q{QY;zlFb`E0vnJhZT7GY-b^&^* zR<4Fw-w9QYGeImo8TqmnJ?0U2{{F!n$_0k)744I7Q3SFWXF>rcurwI~VXVC!UlOTL zqG18wLsSQ-mHuVO!*cnxjAC~6^JY3A39tYX`-{&e(FY&_WWyM;#_n?1?^q3%S@v2j z_)Qtu>@CxMdRQClob@&}k!|a6UetGmsw~E}C(Z**9DTSB#`3>zUItc(ujV~78K*Oz z`Ug1)+NerPT-9*YmH(4Iu#n_PwWK2wNuePzk=dP~L({iCqOV*L23VR8B+)+U^lyAt zdc>o_glbZ~v>sje;|ZV8B5LwnQM;{?t>Lq6w8I?Yg)p2ejwh{4RJoPI51_BIm5_D$ zV)gY|9_07ltD}N0&a0}eP9z{Rf0{}PM6LvYG=V!oDr@aPu5Vge>#jwaJ%~$cpH?{> zk+`nw=MKvFBc*QYsmWk1#6(e3a28QK%8ZZ^;Wkt-I>T(}XfT&KklPJj4O7-VO{hZ& zCoYfNv2|cU6plCNBDB#VEm&cF6_1uSYi_Ovd-ECLY~%!2@p@s^>UQ~Gkf+hx5LV_m zCH13FH*|_-o{q?O%?>h5QGnaDf~#B1WU*#0-XmHCG?6HmJKfUp$xuO!f%A;I`QRc; z4GC+gzM1%av~X(4t$A*?kV4e_30p1+cpLdtB|XAO)aAnw;S7?x#yDkCkx#BQZ|Rt^ z=q%*G9UR-?9Y*lpT8~nMKPtbqznDteo(>jlkN&QKB}|or@g`UqwX4H&9pkhppR%fcyn0?VSWw?jz`+J6O%GG24DH zrX!R9kD766(@53gZ(vGMJ=oWrg>(CKRdUIGa3r}v8(}*^_QL5hhh((LEp40fhib#x ztAsd7)QlU`?Mh*@eaVcoH)d)e4ks$r`4Ebklb4PZZa}R8;%_$oo)I*+BX+T$9J8GD z7Hk@R2!joK-N3flg6)pI)yyXxMg#&i*$lhLH{;{!v_I2n-}sFjDMCW^_o%9-u7+-& z`5)wHT88N$l`21f5%W!o0Ny7?R+gq55{U@Xia%-OxN%jXcU1SS?U75HbQpv2$S1w6 z=aP7Z9MhoUcuy28AH)6^VEa z%&fI+z7bR|Q>qm^(g%6rys&@uMx8z78B~F7b8qe7v=gn3&obGzljhdHu-V^kE+Zo4 zl0H|fxvQir^+FT1Bzi(R>Hh+SBZbzk2%d7hTi8av+ZcLMY@kf)y!?*30%=Orkk7cX zVg}XDW`r%Urze6LldL6Yr@>7Jjc}utB=4J+aA7&meDkyGGnF9Qsv^~9qrYf_Q_3@02d_9CH}IHQ#*kCoaz+{uE04%G$OuH;mJ zZQC(XWdlnQ=9fFs9%xejZ84mgcv>dntWjnozGaQxULDm4C=gopUwK^%!E1-aSCg0} z@Eovb$ShMCl6HQOj?k}*7MI4^wB&)NXD?ZVeBs%5BeXlFdfHmm2zRnJv1Nckm>meK zV&#evccku)OBs3P^~$G}rGAA^bP6GVBNr~A1~sIOtLo}VYW~0JLlsTrIw+(vh*)xQ zEI|4S;)G0?=HTwc%mELcnCo|ZO^BH%emO<_>R-=KouqQqT`GFm4 z0cM8-BzapqMIKYX_Fc0|A;hP7ww>?w3j0sw4@-7Ny}FFcf`4I`SgPiH<)MSP1T{}5 zNbz*aRXf=+>oRwlm4Elg< z%}Q39tv_0y$mpW|u?1JK1$rqGce3VNVDJilZVbV&{C!?O*&J_&DX|79mim{&f@|~N z+CkU9kjM?>?&pPrIJs#b*;3-oaelx^N1;i%dmt`UbE&@!F>}<#UgdYJ$3Br#H2A>c zN@1#AVJf=qy`wb5zWGjJwtyB^^Ek+qILdA8M}^ve32Du_abVG9-*Vs67T)nQAG^8s zY{64+sdwQ<;1zcGvnP&EmYF4)mt%F08`_B8ikKG~WgG7Ir!HHmt*etZ)JUrQ+rDO{ zHToZ+cEfOeiC0g?R^HAz%w)|Gt*O5TxBMcWiw#7_V>|>Z)-F|y$x8(`TRS9123W0o zB)FGYF4X$YE=Vfp@{A7>5oXN!yTMm6D{ZbVLBJJd+11O~!I@zn{RB0u649|0FV)7# zHe7C&e{TYm732kO;VHx#9Z3!*-NiZC4X(lm7iN*5yjnm5AMY?J+e0s!Z$#jzE{y`4(cgCu&mae(_FLIJ)i7U^W^7Egx zPK-y*NBYf2!Vsz}EtQLB)#NbmGuz*2*qDym6l(lF2QmZ!7p4Nc?EYb&QckfM41 z$R_K3i;UL&BckK9ju3OAe>~B-N{;$ z=x$$9gI96bWfFs&q*&KbjMg?Vx88h#$m9@I)UK(h-Q*rN698wbPSYc#Z?EULd%h=V zAKln?G(c}7K(!ERaLZm{7;)9KGhR=oUl?9ooVj{&K+e=t;IqiC(;}y-o9Ai@mC!u> z&?==lAKA!Rb^6}Zs?7>mb=Rdj%9+q^&2v-O%c@N}Apdhq9j8!vhIBf}rxIJio2X8L zrsX<5(5utzap^f@vA}G!hHIN?N<-C^$Y?9XT}7yQX+TEiYs6q}!@SlRN}yJF%+7+cdC@)ttn@ciyb} z-dXm)%@i-?ccdo4+#9%~qry`PQz4lruKMhRw7whQ^3^9H9}53PCtUFxIbyi#-=ium zmP2V~{yVVJOp?zen$lf)kBN2gBsfZ!rtFdK?vpTxQc@j_yT%SO^;i)L#II=B#7@7G zFWI?NDse~P*PloyyHQ`+m8~bne736c3PBDYMtFF6u7^9Pb;pxOc_$B#AJ<-WAay&` zN|oO~lw31>n-=ws8Yj&w7bUDAdjBPL$`a zgUd5ahpSbCRcZ<=nhUsU&H$XU2j|G}{vVrh=jI3W6Gs%_GYbBoVX1F`Yqvb{!)1dg z?t#)?13sflK~8oJy4evlluUlj{C&Tj=kAAV0WWSKNAaJkJ1!gX{m>-Jtngtbw1icw zw^eQ|n}b?vINH&^6OX;lS>2aA=g5o}VR|oIt7=Lpvl<}G2jg2?wDXN54*g4T(+JzZ27FC_WsaX&TU>I!Ks!vv}a6)DsKbXwlO?Zt<2y17423O zpb0C*gY}E0n`uugt+g>m>$-;XDduznQFH?0|4}&_ay01FKn6(a?7u2UA<0w9k7~;% z6>3Tn!O}!pt{QczC<<6f^e1)JQdUkHJC3QfN+t~w@lvw+AcLo|%sR#+&}Ou-rR3-0 zYLhJ^*ITM9DXI{lG{s(MJMv0Vd66~t3%kJJerl>{wm?Bb71=yp(XUjyQ}H;;4_caM zU|4L)Yb?98W=e)yRla5wQJi=PAAEi7gYR0@){_^pubm)HKI_l@-XCG{)797shehgc zr?g;ZgHg6zwSgYotQ6TGGtIa`zjs|^#%vV6R?FDiBxjng{f--F>f|fInl~+{Q};To z`UL#}ffW*I9!|T4a^J3Db>F`QSf+aBLFV}P+a@y4nj7he1jfFlR@t&#l5AJ^pp^O5 zvi`K!sQ63%GM($MlJy)YmO9>$=sY?4A$mvu$XAPdj$o2(&w{9&tMSY>g{?iip~DZq zSWw-Yc=aqwgL6iFDhyRY87)dz2yAnWy0YI|b1h+B0?40lC1*lY(KW`8Hk5P0*EgBX zC&Zv3PPgfFr*-Xc)Qm(wO<$<+Uaj?P#mw4_?;d)?s?5v&S#G1=0XUkej*6AzE;QQE zycyxTs*uSm<^id&CK=crvGSx0`UO^t5XKWCY6J(JBjUI1D-^w3x?E3I>TBGMaIF)% zKRcT96kiDW;!4q1g|Q3AC}VMHJ~;P#1^quGs5h?9`Q$`&kUT@LUfI?kj-q?kp*rjY zks{ZcDVpg>qWOd^q^;Z3hXdV}JR)M4`+eY4q+f3G8uQufjs0Lv2RmUekefo`c|D(5 z3{(+4FNC%6s^in5<9+)Zxx8=*Tac|S6l4cNYvRTJ@kr=cNHm%IP9kR9XxvVB^daO` zm8R?$k*X_B*JbxuLFV1&uk#4?e7H8d)oo_6fVqp~ zq3Am+4_PY@9|~bO+sPQu?q0>bA3SpBNaXG?hL=b>P@@V&uc=TP+!-{I|H=w8r$Y`& zA;u(aQd*cR3DN6^^}>rkAP;o<-XPu_-F%1(;J zW=?p_tGXPl+XB@tFa+5if`W@eO5tZC>R+btO=9LJG1F!W3e@U%bqz|2U0Oq9q~jxF z7Ko*@%%M@wW%Sg_a26ZcGfZ{&-r~6M!GzF}Wk<=f$Zh+fytvKp9636{O4CM5;jTH- zi!zeVj_TRlQLx?1U?k5ku;Qwt;v{98rI;3Y)(%wr)T*5~lmgXInlKd-) z$COS*>c~kaD_LNbL621wUm)0Ikar4Z5$BM9-l)8hR>ap-;6>iXQOg__s``L&@af(t*~TIdaLYlG}N9QaRs(aXW7??w2%nYMiX&_m;`y;QpJ8h!*!NxJ>=}OULki0dVhj9 zkcyp}?{~85*w7M&;>YKXP~3eY9z(}FUJ*gT`eXx%dm17H7*w8kqkLF>fJtKYDsx>K zbS8Ti=_ZM*<9`d2<0f3X4z1D?fY?BuR~Eb|6x31`oph~(RO zD)HMW8z8_;R6!8&{S_tCZz-brn`E;ibHba66A)hB5npQLn%-q2G?1N*$Ol*0q^vby z0mgXw_58c}~ZEX%+qz$K4VKD=9FibUUuos(KuR3t}_X0QlFYLw*V^begVt z7G{U3Tr=>?SQz~<)z4&LYl1F>)PCz=@ zNS)@9sH-7m{x6f{5sf$!$&iPQ;8<0J@ugy_Dt!?onn_YCPhC}@be>Wt@9>4!w=xTV zs>$K1$pOp*oj_9!f|7wZ?5@dX*`4Lc(9sm;QqLWL5Jv1j*O)$X`($a9@xBK86@!h$ z7z&zxVIlj~VkfFe zL`JjxPC3fYnu{rwZ#!>7M0Fm1~@lwt%3Vw0hpro%&Y@y^uJ%Mw41=9uP>T=RUQye%DT^~X|*^A=y! zYQ|qZ z?*O*%1?L?-Q_Zs*#{7cVjiy`trl~E9!e7_0{4+Q1QESmRF-><58D5B1KiE0{$v@|l zbL9#O=1gCmVcqv3dJJk&d5&?rsMwM*-bJn)Z% z_LLJI=JqNl4>`c7nKT=sio2dez@{cBX;Xpjf(jkSr@wv`)6xgEzmcO^bJ%9$zp-4g zFNQ>tt0~8;uSgX|%9bMbi--r*$fHV94Qb>J<%d6I)vvL$Uf@r>3jAe9e+VYid}73tk-L6uikc%^x`^ z#mJU+kVqr7lu`MPPKCzKx}Ht0KQn`p>+SfSq2!v;HOpyx(P3uXz4WsTXUwsnMt3DU zqDn^tR|>@k23o2}b2K5k(@wC()Q-h+H_a zV@9=lhINUvTdOOFRp$jv{o>Gf2G~`EG@BVH$1A5vuTST~9L;6FL;P-kJkA=VuV6Ez zm1)Eo!_YV!B}e$wVXe-}(XmJZ<{>-GsL+v4$ za?fs|4{SpAjG{{LfX(kFxDh8kLHuxGz$jQ;gXPVd~YAr=2iY1pE#8DJD z--hOnA#M*2H`$u7CMKXNKW2=Iy~{1k3Lm>1uUDp>WA13kHN8H!Z~@w^Fs_ylDThHG z-I|t?9Xj@w4U^sNFbzCoz9L9hgpBk<%Q2iQ zdFA535<$me`Je281{;V*ovj+OIrCqUtNx9gS8e&M_MsQaSGEXqL^DPx9ktZe6YA0H z##R50&bNL~xR&dC&$~97rT6OPrw+gPZXaB-b5qDO9D2htJAu0)3@JF~t0UgLYg*eb z`G=VC;?*-ex6!UIf?S91FCLqZC%8E{5Gq{54<`T*i>dc&R*Ij_S{i1hkur*@XU3{o{YM?~my7lnACbrcMH0{}J?XP_2W!J-!_;oJCb-JCp zm4U*j?XARjl0&HxDSKb>fQa@|!fdF9npL^1!y2)@?aeEh5A_Mc<5ohGR`BEk+-@9D z^zz^_u_I1-?6!a%!DJJsor%((wZ6)3s>>7c;fCQZ+mfz_gRX~3WL`xKLXv4f9NZrr zAkW21$BQi;_HMIgbc`-37}r z&2eRoHDi5Pxf-$2k0wtWO&FL0+HD(JDO)+4qai6b-g3-6%#(|@W^N_+$_dAMW!IRt-!gR4H3`GO~>@+Z{(5< z{;mk72^}qa_^-&((Q21ENF6;SD}%{WQ|U^QETz_;(s4prr7_pg@k5cis(44pSv&@z z{OU#VUH;FH*u*muuJs2K8*6>$mu71%f9A*@9o$wg0rRt1sObX1&+^|S=-(RQS}*X+ zAH|}|p3oQiUXV5|uu3SILC;GY%9~j6B~n+w@hd77VM1Rt<7XIGxxWgiD!qj#+}Ei} z)?ihbZ`6|7>#gmi>r&byYF%jNHzC&P3rM*VPLb(nURX}PVev5i~9MGKkwJ62V%Q$kq^(o3ZU_#q{H56s++O*sO@ zbKTthX9tEVg05bq%tr;3uy?u^E5EVHFeUn)x7k%&9BK2)4A3|a)YF;pnoitmt4zu8 zRgoI;HJ0#+S71cy@d$omGxykIO%vI4QM@t+&#tozb8sB9y(h|IUU9RT;4IXCXTc9| zasuU%H~XyOrnsEI-Y5ZWHyBxZ(SI}Ok!03$kT{d}J65q`VT6PU6)J((a>9U$ZE>d# z*2~>E1MkrcC!M?J{a=W$Z2$@nC9D>`_5JgO`G@Q5B^Tcr<)^fYVpfJ1>s=X|l)@JZ zo_P0Yu|>!Xhz=>#C}g4tL)&_1pVg~F6#Om{$k+rHq>-8UCmWLtozNZG<81@a28 zS2i!9q`c%d#5%(^z9_}}^MMfeQONU9Ou}@3Ii)v;(1p47&?^d^dP>pA2Uc}FN`Uj1 zR3!cCH_nY|EMC4B6o^k-4;ig7yJD0i)@11UV1h5SDBh%TI{C6Y)dsJcq+s0|Bog|k z^i++}#W>#N`w*G0E{5fwPLkNaRkI}>m8o7k+ch}^A?EsG8oy~AA_(rV_{Vg*7hfma zUZ3&YeD&6zyVWzgz6;VEI^C+$2fp1}U%T-6%z~UkXdvmQ&uj#oQ%x=-Hi<`M<+lB@ z0#x<6WwJx0ptbg&j>hGH!0=6Oj;>PaY#7vtEkrs;WUUG)9H#!Q9a>ojWFrQ)A`0;C zObnHV>RVU2=7tJkcbV%gp1n~`Cobwt)X7yC^Uq{MMO5?sSMAoRXl7l7F>dKB};sJwdO{$w6$u1whdN~ieC3px6 z`e$s7m-4f}A|OtLa{z8R7@!N>QJUz96pn#5iKkD>Y@_wQSd3zwKP!Z0j(`mVPh?sGOE~dtk`q>{;BY3$4~Sm`#HAFAXc@3=|8&JCBrvE3~j@`5*?XvF}-;J zka}*G>Zo)O%YCuH=F9>u5i2g(%qtHw`^2=3v+R9?*V`G2kIl`ymMPpxmi?{F&d9Mu z9X690qf%r>Wp~J-rNM1y{rT=^ADn_Hsubwp?Wzt9v@pB7)!y~qf#;y1Nyzp+mw;k4 zIN6v%_QmNjyX;$NddYJ;ht;<0fGbtqnV>ujG(_g_a#hbcU!0d8vUBJ!+t(uWcI~K(bM27O=JtYjXtJ2Ow z7i8Wh{VYUZdXMtlaEqx?FJJEc*kT|Msp#zHs*R{-^ujx~Gfj#d6mg05g zi}-?-t@bF%%8Oe7To=2uH}kFB?=pM&+b4CVGM{=fG~Jrh8I!n_OrCa%Z0-F-KdVWS z6;*#VbId$&1$}OUNLAC|9~L0hycLL-$CR@3yIsG?*^oxAI*7bl>`s3QH=2B%e3wzz zD%;jrPbNOh4U)|wWu?%f9Ea{sAcYRiToh3NC4h@?dX@KY27tlz6_S5s&1N;Mj(5#T zb>4Vl-Kyc@KhGAtjx_UpAIU7~&|eAQ=ws=ONIm+rWxSsOiy5gQIo%wH=Z_2! z(8ueiX~4>L>Nk3<7#--zbo7t^MlM$!{<}gGq$UBD0RNXbniKq8h*VZB=MpkYBKpw^ zm0DR98;{>mX_g$@+dh%NzANf4%$55ti=q3ja@BLBa9SkF#2h}Bj7V%b^4O3NKNxmZ z;qj_*vX>e1wLK;V`K^3Gx;4c6A{Wlov^{$?aZN! z8U0|`8(lR9^q*r;`_o$&de}{Z_wX+;r3c_i={Xn+-axz5S(|u~Ic89T^GH|(@fn6^ zsb1P3^*KG{RsGBh$-A@DhhKa)jw#{5(gy>46AaEeC0H^T&K(PWA&=*u*OR(GiQn8d zFmv)diACNvZct6qV1j6QoUV8fL#wCf%51?&h+1cm$PVth%7t zQ^BOK+@crKK;|>y9Mo1lXJoIrmNEUY9%1hX>%WFd=3Jf-S8I!D8-F3J){SHUQ&Mk- z9u*HhueS{W)FJuj(A9Gd;2%3RZj3i!eP$K6FDPon2N^F(dM4KmkQC~&?+nSu0M9xW zR=U^=gAiQf^V+_x>>tCPk563~d0=pr1c+px-93Pq>oxduIEbjjN8rqHGlxD7W3wvm zAX}qWc7K=X%7vC9JIr)M-myvY{Dt?7b>9Q`{bW-iw#J^uS45I1fH8ra(!pz=om9K$ zz@Mf(gr?4c>CRpIja+UX$jghi@_|;n^nW4uyAG4Kd1dob>QEi4sNUlzeG2HOY$2lx zO|v4P2b|8F-x9LAbhBnH-&>JT@1`X(;yQ7v%EXJT0BQWWIGcLoe2FdFo_g-?4|bmZ z`2hqkt|RpGs)=z9|w*t{PndX`M|S(!W*tmw?@Moo7rNtBjyi zzJ<(Yn-x@l^tZ^b`VD*mX1Z&qCEi&nHV7@pI!{5B{lS@61Z4QE%A$fOQ6FAc|P7Y1+xY+jZ8kPHT`hQm?4d=@>Yv?0*w#rz;oC`%VEX zh1D#u;K16wnb1@pkql9zmd%Lz;$cY%!x%-tv5cU$F6nbM2=AMJWRoJ`4rO(8uc`WW<%G;OsI2UsQ_cg`4EzYo14Z3 zjfB$ojgO8$Ph1a_X?bH-Id4{nYAcub1qax*dWzSw`I_Lhgs~&MPnJHb)18&4J1g}Y zxnz77AE=}9J;Y$JTiN_*M6Ee@?ix7pYxG^sL~TZhKG7`4SzJ5LmCDB0Vi*KPb? z3K>!n({kl6x=h6EA?*56}6m@jY}jIawND z_nD}Y^UbqlwOobdF(*_JwRqiOVbE;B*|Rw!E)z#eg8RG7tn)yElQA{@zQ|PZgu>fT z53A%SUD``5=dAgoHs9)I#P&Q#$kEz0S}j0bU0GowsEdu?X zozbBUNBeRIR+F`S@JjWan(K8-A|@YiKYs4XRgql(fSW^ASjf!^1(n= z4IyFruSr6x{o5v~D)P#w^szOJihP*#Z=O_Co4xX3^2*2AE6vlpkurLxo;`!+l<)v) zEtr76&;CG?qe%RSsqGeU+*{IxO$p*T=x+JJ$lt@cyBlZmxJ`Cm#|WI@oGRXzlNx&d zB4F!nf1!BeMO4Osdcj3Iw6;>5Q*%*|kI)+=#Go3HdyhBo9rr`ih-nQ!jvb=wMTsTU zS&bqoJ_d_UEBs-wO^N$TR8ODhD$?qy`*p3?=UeCT9Z}zhMD<5Lw)$1~2}3sfVR5&Deq+lSPf1U=qbBJQzALxg1b*k10-CTnQl`EN}R3azuw_AOeM~BPM2gu4& zJr|m4Jr=w&NG3YU<*)Y=!54Zb<~{C_^&QMB^TQ>s&q=zGz0Ib^0eGRE;&zQ-%aA;$ zSHq?#eptdC?otKdpn#mo;X4(q0fbnv^wR*gIMrRDsM1ooJ*RW8M~LI;A6@oL%?cBh zUx!08#?_Tsg~+pKwcWD3LiKoan4Qbyx^A5Dp*wTw?^q5lL0iab2L-7cfbcQ@Czhl8 zi|)c-f1QrMi;KQ9FKV@)nCoAvSDilMF<5;{Nvo^;-drWuP%E!quh-P%6w>PSZjn7; z;urZv)MPGug}pfA__(H$zY?-KpXuC%5OFWMGr`hw(3XCqjor+t8#QNK(0%O8*dhW9cC>q`ENCySZ#FG)z`q#t3A=h=)QPSRbdl_nqWGxb zV2-k?lXsoxbn=dkht+}9daJNrz_ck+=E(H%mo2sjFOyYy1uXA$V2w7<_gshr(39&} z3Iwrf%5N-o9mbV-Aff1mhG7(aWGOXe9|QBb?EO4S8xI~{FKc)6efC;kC{4WRR@@b} zj=7e^>8v}=@6tT}(CjriBpxc1Pk3lYam{T7vD?C`dpM(uzILdFdACnYoE)rZt_E1~ z&+e^^M=v&Tf7_S~o?W<*Yw3mm(7cgX+l@lo%{uejr;`_!rQy51DylS)$1LANhsF-TL9>(JPbidx7-{wlG zQp@lxsZlE=JRKcjABX9bm>lUyg5`Cab2X@qA?IBMrr6`1xe6_#j|$k6dN26H=}njx zy`Dlp+q;%;pBlbPfmJ%Iqf-6Y80mhmDg5&{a_exqzkNAc0)dvo)BktnGz*F5%Nfz@2z zCf-;yTs_BVIp!$y}4DnV2u92g~(Up4n0itmEz9qPc0l*10zp9OKz2`G)9C;nG^S(==EAYzQ*YZ@}Su=*xUpJ3lx0x)+ z%Dhre6rXWEl)#(Q0TXXCSlSM-fQ$YBTT%T9d&Kivx9ei7?#;oMju=7?TVlEm*-xaa zU|}v>qDW(xOGdYFZ(PFkvln%ufx>(ww3)!IO+=e>~p6p=d*{g9t;TxNguT~$HFa~$nrbbd;xS?`_4H$^D?2q z0qQ3-=y`tQp!f32XIQ$>4Z0B2e~{zy{5|8PZeTz|?tceXS}aE@Euj~Q5Kjk75*%d+ zi0V=ju#$At^MgXmUpo$!X4a?D&ExCUz4r_*=>z;=-6o&8r#r)1dXJlw$Cj2dUibcK zD1m)D_o1fQX94?k?N!FM$(PUKv5{OhCYXiZwgOxUA3<{-6C(Xp-Ar|S&rzpP*bx}m ziONiMN+}cZZ`mH|6V{n`ldWRDvg@0w4}oW^n9Gxnwk}g!)-AnS4DJ2We7p>M zv^SkP;Y#ZEYF+nx&QUoFW7z}244K_ZarryhO28K8Xsn=$wsAR!*!A*VvX)a&Niw8( zeaX2mbS0lMf7(=Yu3TST%!JGIfi!{>=Ob?_?F(#9x$-V-pf)hcpqzcLezxtK&Ui=V zy?M2LJqQC_Rlq@%fj@^Y#%x*QUHM7?v3&@cU!}y+?8p5rI~JJLSP_Xyx+%J15)kja zCz*Jl;HGT;RMHnl2o9DiB?B2Db#mNy(szH=)h+zNz)*W8B}RKdrScM14VJTUE-Oh^ z9akN*lwYyTMX;BuRCs?kKq&hcHgpIDH2SvM`pAu>btRiQq}nXmv1<=bMl8L$LnW8q zCw44;dZ~S4zD+KzMp|4$a|x_v{i2L#{4`KV0rya(*t6Xz_FRCOBh}BgL;ZaqtW>-O1V`SKq zxF;7NxO>#6i!_ULJ0k^88$J+t_`kk%YC!A>ST6iZ!0VifYSqcjSSUmTo$zo$aAvs7qcPwBUkI2t2VXWO%YP${+IC^QuI z7-67)#rI(GFzB{x@Gsrf;k>ts3$Ynu>-+8wxn`JKu0*Iv_JTjHC~dCTqVtQjU?zwN zvNB)}beSG1a+Hx|TS+(Y%FWTe%Rv&qfKIr^wdio?aq zim7~$9qz=7oLe@Rm^W7$%_W|l@ zyi}Mj!&Gk(wY+GnQ1Rf6WK-jLSl&YA2BLPp z-OiM821=+4E&jrU552w@Bk{r8#Bb9~{~-RA?qySvma1ENc6T-cL_8D=MMqf7_Cz0N zqu3RTuLvx%FNkqBbYsKl5775~vpszYhI2kOB(}6>Ro09V$h?P~=}Oz0`&bpemLWv( z#TWgLK71cc5~YKiHIc@aQx-{Vjj-b$6KNO^U3F!skq!1Sw9dkLh$rJ=XnUie-^mTX zSm^H028eCQbjPZFb%5uB*l#|oOz7aptjSc7dEZTA4&!PS2nB0voZqBw0##^9*dGU_ z7k#DYl`TC3JA9UT{VVXVDMS23>oClOue8~9d-J>$CP*HVtzjmR8|#5ic4N^!XMrhm zn|p@s&+%OoFsxFjO|w046f*g1E-a~e{NSX4$0TR3M?UMEjTT$dJbdaR|}vVv83qt#yxi({?qRJ3UCsTrM)$F%uBLq*VytT5?JgSmCbfSh}}T6 zh3NDMm71@mgv;!P=GCIK$ZuRgj&o(cy80d8EeG@D1zQi>95FjsyKssKbVq5f$w1|+ zFEQIx?zv~$*XR1W9M4RW71t*Xk6@y#3+JGTWHf?@8QeMt!wX|JU=kfZxEsQ4*7(F> zFokXsh0e1J$gTMb>4Sm53mq#0nDSrg1FoU?AJp-Nq^3&xqM*Kcg*#=?j~5yo+#!J^ zOI(Gw+`lSW-StkFzWR+*foJdK(X9|$R^vU^;NDoEhsXpyaq9N_(P5p*e9 z%fto(WfHM>Ei-_fid&gswidY06xuyfq%+zLLfKPTQEajG3s5Yd`JClmtI4yHOU6v! zS1C4Ao%O9ZdFZ_be8Aq`lUZZ++Y||k@;Lyv#T__l6id zANKTZ5$_yy&Pv*;I?K><7`xWtpa0Pj z&1Q`pVM!ib#h)S0CKcksm{N_Qq!siUsC5 zX;~n3M^|*bzzj2ZB5RZfJau>Eji#>P3KJ&V95NEWziI34`GIkfr*S(GnN(u5OvG)g!_Ie#yZnpq}V0?>giO z`Nh3Bt>#J8X;XIdcSvPt9^7m;MiE?#Lhoa+LMhbypXzm5+YEH~{4~aO0m2WVJX_X7 zYF(Lw8Vq_FG?X?xAs_QlF0HHcwKZVhw_EjX7SCrcSAW~PamnXv!Z%LwSM#{>p+3yV zuC9i9OrGtZ3?sG-`Q(?ubcupoF6^E~tCOZC?@`}|k~ThH3G3j&m<#I?hHLABc`8?- zH9W&r)_GVF3c-^$%0$}(K@lYPhew11s?fgvwO+SJ`@hb*a>lq(VP)MSc#bTrvd^n3 ziLc0EMQc(0%A4$TmQF49E3qucbsMo(w_?V^7@TFL*RIKcb{+G$=(>4-mRh~avt!PN$clbY$sR7rt!+SsN)Z7FO>D`JX135h}`1u`Q*#iecE z;4{vuTf(iVzxafTI&5tFi^}er)6h`%#p(<$m@>O2ST_`42Q%|0JB7n!xlt=qubY{= zc!6q(`yv%H%2X98V)NiGX~MzHTSStV`tQ!=>z87yl^tmn>%@X}&Q}((EBpkVkDsUr z@2s4nQ`UGGG`mFFRG};%y@@r|o)s*LsIE!jbKshyYo%jFt=c;~#kk~nRX~-r6~Zd7eTK3o{#|*&agRfAi|U zh)b!Ymhad?nTX~^?NvtY;fi1lI5>e+*R@*zVjh%I7zd^nQz8-h`o#28aaf zlFPV!+@Rcm^-36EPwo<08F28Ij!jZ}V(t^sbB+ukLr?=A)OjrrwD0fU{DG`?iRNHC2Bm zKm=uWrR*cS*m~P1Y~qe%fHOS2VW;@YU!x*he*IirOOjzJZ#)*y&fmDDCiu-EKml~g zYV{hDt|72U|87|&!;Y3v;cIWo|6obYE6~=;A<|^=kAqJpfuRGKQGYMNO-m%Nw6Jxc~zWg*7@9E;aZGG8@s}XAF(@!;+fL;^zPSNDf z>BtEFXk4HF!SYFMsYUy1rZ>LJe?94(ibiAG3i~a$6}sNwXvD^+Khi^r`Le!Yn%~{T z+3|GD08sl#(I+X;c%#cUeCQ`@w)h;AN*&>J8?uCBu+Fvyzc2xoY@irsN#4-P#nN`gD4#?-WgloOW{w&r!)oeE$37k2ROJ+Y$F*gjTc>uEHi>*Pvw zdPo$iMT3SQSfF!qXJ&;ZX22cQoJ;*^MaL>>2%}}X^7>X?hLNp=%KaqHD4q{{ZRPM; zK)ZK?5m&;E6{LBmjp4~v(RB(@-+v%?A-2&YljX>UhOH_8?HXyAuU__Cr%p>JW#S!Dbgp-#KH%NSSMr>mCEcv~_U#DzG?GEjxNZa$FBA$4_5n zEcIlDFn$=`*&yoXTs?Vgsm}jnWuamHQ{KwnJ4r8AZ&8+QbbNpEcUmOnB*0EP6Qd7U zX*Mz#l{dre7t3B_?e>RFe&>5M`#$F7TWI^P{u%hd;upNG< zaM1)ONOAKP1^++#u8Bx8DOm3xOA-V+^}mq2;E|ADWh!u)Eb#IzB1gGYvgeW%Sv5@{ zAqb?K8>Xx|FNgC#(9!RUT|W>#TuRCF^YML4wji2-HIj5KWxz^V#(PYOtJ^fT2KY^Z zfXAxCO?|(GDP0-qJ*kEB5OsFv-N7>A@PLloL@!yk6f0xQwB2@Kg@}-QrfSb^bqbFk z%Y{2#TlhwkS1@s%1J)Y%XqmH3;xXa`gy;N=5Avav@lmQ zHFBW$l$i(L+C9C)ZE7GC%n?h*s3hk5B`<&@o~g!mbcNrwpILAnwZ4(J%J+?X4@dL& zqiIMXd^ndwC|GPzXx@t^Z!SdoxNW|UgZA&l7mD+X^r70#*?^6Bq|y5a*NDg}z?eeq zRt(yV=#9re0ElW7Dz^OUtN*x8ZM?B#JV=m*y?n;(`EdPXCQ`!~weP*q za5HCXvNp5h=LkoyXX2w(1+(Y|`^05(#pN?j>O|KCCz%vhKk&CW;9G>O#JQ29YqD6U@b%mN zo6O6TEJUT|l^X%KbS5pVdTouuBK;D{4yR;W7nOAzJD4(0ssk&7jU-InxYELT^E4>g z&WE(=UU65-d1~Kz=dELl=UM(~8c*_z*bcpiF(>u(CK+JB?m zg^CqybJ0DZQTqSWuTs#GAqU&X;e=Av_O?-u_bwopvUee2EvhGw{clLpFG%XIG8F16 zlC$|88&Vw`#>GH-msA72fb+`1@~B)~;+S(#N19G63D2>9CYpj`HuvH;n`=Pe7gMZ36MMmh_avR#R2QNI!NxE{o z-jrZ?Cugh#EX}qb-YIO{4;KD>`vJWT@^NSJ`#I_9-Zlg6v-m$Asq)D}jM?AX8-^3z zKZ`Rh|sK;%8(i=U=lZ_i!l}MP?;y5ju zEJJF&MJ{C<&!Cf-CnH*+=huS`ZSp=9IRjRl*{7A|%&$!6cxUViS&QPvRJQD}!iY)_ zh2isJ)oTZ>xr*AlG>j6g-$uJp6YY7Dyyh_UO15BBL%{<>c6R-1E}%@lw+;hc=9y4?~3R(24xwk!YAQ~cD9+# z93{`$udbpXpQ22!FgMPloZrYhWYfP0Rc|}uYS!3rRm~BqY;>h!MP>-Qjt=aR_aBuU zS_5D%=&MX zBNItr7o%Vj8FCq9r41Q!bl!~ZkdcTx_~n&%cr~8p3mLWS7p2K z8G^{+7sZ(E!L$a^K!vx!x2?@IvreT}p)s29+ECnS|ewVsII}T(oQCKK0yhxUPFZ+tgYHftF)Zo2Hb=$P&R=Vf10P zX9+>b0nO%^5ysd3TCm>^d|6@}OuHM9YFy%%(w9!wJL^`GdBhdJQDZyYSYi*pAI8XL z1*U)Rt(RD)rnB_8InlT|SsxE;mt7zUKVsGp?GkE}I6 zGtEtW5-S_SA5g&%;eAgD_{f;01|&>L_3bTjRo}@r0Mo*0=pyBW^N2Ml{>+#Z)&8Xk zp7TzQ)m=_`V72K`>Ib4K`J{FE6?BMu??uzjelM@x^L9p6+|cS`yiG*!+O2l{w-m~g z6iUb3BGXKJeZK&ni7TRE3PNuZklq=pbzNHLqi3eOZArz3nRJmk;S|wcE*e#QHYBaM zrOhqTnxD*EZ;+zQhIwjlx&aW{OQ9ccn7CroU3jHMY=;LF0emyJdFQmnD`3SnVZi|= z)=->({2)OjXjC5906JhAK!|8F*WYtW{NVM?!TsAOo}a&Ye*Q6C?H{hkfyUWVNKA_G z{ldlr>!0DVlUA>hL7O)w;S}s@|0A3xC)NwZk+% z)b^0^!CKEowObdPVQpQ;BCq@`H~r-3>jtYa^e@O^cz-0BH5 zJ$l#_|3@`)g`mkI( zA;I`b`qL*l5oH*`-UM@f1cyPEST^EvlJ{Ykq(v^w7AVepA8)Vnq59c2`vPc-1W;OW z(OdE5x|3@H5kjK<#_y`V&IsexYB)z2+qqY^c1(3tZ!|tA@t$aGx+i zI5L%=F4oNmfADeZmqwA_TYZfLa2Tt=Fd04|3U&Uy4I^nBtKY!+>Yq~kp zx^kue6v2$t*aR>)W`ioOdq=tib2M#fDoPnR6e>FuYDEvn3sPK1vQb`=o3-frtv0}1 zrI2skIX*&%m=R=KAK}$)dC;Poi(m^*$^Me!xV~J-wiXGrjMo9!;sYeM`K{ACIU4#r zORa!;<~}8Fmwt(=_cq%(y%(I_5STNVhXY7obJhYDIL_Ly$YhG}%9NDYiK3uV_V+r< zk*wCLg96Q=sGy= zm|Jb&4z39F8)IK-&skMd7^rt8goa?F7qU9pQn-yRO2+PNYTMMKoA_=$&Po5PUS#+7 zd27arHg2g6GuNUl&9q?qAl!g6zHNNRcpA6alr=if;f`Q@WMXaC)?_vK*lVd$;TQk! zORl9J{7;V=nJU$06xr1WZLz|jzj?3$Mxv%ldGKhdq&K>>kTiukqaB)2AprZF5!-@6 zqIy_KQi82*vPoao7>6=kOK~<9*rh9Qa}ig*j)ry8De*Ogyn1zX6&>x3PW7C_kIUSF zGISE_;3$oa{@U0PNIij}Ek--#HHh=12_V)@J=d&}41hb;-eeHccuIRj2Yl0I?s zQ{J}h9=wyHP3^|*ynjlqaba%P)NSv4wFtER5Y0t)2buyO9mt;~Zr2G~#Ony>+05$~ z{o%S&MM|>EuD&y0aak8O5#y}2(ENEzIx$k37|HF45g#k7c4V<|z|0y9BP7pniL3xO z&4}^ITO&ma^<|yncPo^9xFZ*egY0>N+HBSb1oNdvi_PAPm;$zZ?FAKYFmrhz>j^h| z>o)+_tttI8KC$9?ez$wzs)JA#rVY;u=Ln;;Q`mAn23?5-2~={k2|}D>E9BSO0WZhA z+e>3agI{*}*+7z&BE~Xg2+J^%t71HM_)wb?LlcDry%-Hm3n&6QCz$)45}p0C7FJp; zQf!A(z{3%3MKyXV{7#EwxB%5_p~0Mnm(fF~ezpl1En{STP!F(;ioCsAyS?wmS z>I$Z(j{Tgm68vHNz;z?4dMa6}j}s@~cIC9%5P2T^GnzYObGIW}Cvc@)0OLYTyV=h@<6q9+U!8qJ_CG#$L;H_U_SLf-zv!A| z5q)aLlPsF(w*CREgO78c^isglFWkJ@Mb)N}sO*E{;vt@JV5hp7*)^?c*@Tq&lBYNj z%$Ju}?k%w7zmM-;Q@r+T@G_nu;u1^LZ#jl9%sOvoTz9nmy`tZl@H*HA1g3?FDTWyt za022UXyzb~|9&z0gmtko)jo)p#v9@)o+2?nDLJJ@$vC6%A|@;R%cVQlY=gU&meol7ECr?9i3XT1^RvJw@E5%QkZ|Y>SOX42B-pL3oe7781frm3bfF(Ge zMjYQw4ZH!8yWu5zL_ZKT{6S#$R*H~~Lg5p)63Wg>hegqGj_}gg+MGjuLBV>-*P!g1BF7&MzJ!i;v>M;9 zvuif0*eAv)_7haO7(%nW5Ijp$^U#H* zrN~iEevl~-hAoP&!D06rqR1{^H4Ui;gmE$*{fM}FysIGlkv}rI9eWl?$9|Vi?I05i z$~c@|yn2$wL#V4f@N25JOw`Hz&~a>t7t_5OlVp0?z!@a{lKR0cUEutTqd1L^s|)^3 zu5H4cXg?%}29;?p>rTILYt;jkufZeM%p=&Q;_ZIvFWO6gCC>pA)_64rj}AoYNF|33 zd2G?8u8p?y58~HyrYkkRf0REu-7PT^UFf~~qnDk!O%j|LZWKPIL_Bz;M>_i`odEW- z$`+B(&l`o$WtIq*EQfY+=FMBQ$j7zI$8^&(eZDr8x7l9kq$FmA?ylY+sYWgJcO7Y% z1_4Y+#a6Q8vu(l=(x!tw16Q>#&ws*fnB=m~7~zi`T@1k4?}Q5#uuNfmm%-Ur1P9_} zwx=RprxUH-eo#mVGzs@l@3Wd8I`$R(9@ z``q}(P-uH7tfMQveVEq9ky$b-+2{9D$U;YvBykn?u0?^Cv&V`$e#pQWN#`Yb1RT=V z@%|kHnuFf8I6aAPRQWC&DJu5U8OT+0HBCwauWStiV-;Df%YS?qZT;izHR^VE!rs~i zW}CI{s~92rmMe>@GR@B_#n9WTEnZ-`6!#mfvQ%>a&eN38L5~Ab6C;r^BN40K!-nx9 ztW%0gel%`<##~z|PQqPubFL%Ku$rAd%ki#{C$dCihG37aa zDEnudk4u%VypXaUG#q^HI#|6l055G=lb!fEr1s$I{il0z7N72ULh?rYvsu(+v}y?8 zfZUR}H}BPjl1A{e++NPHH+>n$`(C;E&A7o{^ALTqux0r>=P>K8-A=!x1iNXYeQ;p$ zwhnWW87$+;)f>oLU;4b}Z$RQkAlVg!!9_T*GOxOkm0Dyh0!xzKB&nu3!T!i!Z^a7x zEmsbX>chm$&_;*!A%}Edo29)y5+zb@8D{6Tt$3YOm~C zs;Pu6jm(&*!)>RNFmn znqz2|j4!bg30VNHWBrOpm{n9+lpE5AW^BSU!@C$=hyTU^9NiF(Zl3MBSR4vC03P(7 zwx63gth-M336Xt0Yl#rP%hr4V(f;Y1s@GWSm!$HnR1H}+JXvP15UH;NT+Vv>>S?Zj zL|{e4(UnBr?;4FEIj~r+UopOyp8sHTv(}#R1Z+B6t6ENtH>Bpr;=J@N;_#ib;0fB; zs*<;w*I_;fP-)i~=<(!1?mKp0VT*gh7UsdZ5xG#i<+iX6mgf3wTjh$VYEdIvE6Zs` z8)mB?cPQxMDd^n)O{`?dUHGYfeBpw#Wp2RbTL!CXh$hI%P;s0ls#ei(cQ?8lGA{X8q02b#W_ldixE=&T4E%yH;1umwu2 z+qBqIZ>nWfWetDK^O5pbTxqARtn;hytN*?-DEvkVU)J+gZN=z5@!eC*{su>qfvt~k zS=;iPHisNcX1?m;ckPph@5k)=+ttzP^iO<@@5~WvAJhBu(@VYO0^xlO%&g%9;vXX9 z*kIhrj-I}mabs6~xIl|z^#d+lJHHQm%Lx=@N!&h$HW$5!p3IC`EC`UU>ly-t%M#EwT5*dorKVexslr`3G{z zKs$pAMWK>D9A$F#Kbe(m^;KC#j&d35Y~(TU2OO-nvJOh#=f5CbSS}HJQ|#+3PhyF<+|aa1zd=IpXnJ8udRu$Drc(53f}%DMHc`1wHo ztNl-y9caf&x9Pg1#`q^@ADdw}-VY9^tkr3w7;C9C;7oqdXkTVnDE9X7=Udt1ClKcU62HB74-do@29j&76kqNemFNo~jU-J199&s-vIE!N$ zbE9M(ERh|_Fk6}3;y$c0$U{F=@6p8Tj(>48SIvtE_xhAsm`XoX`Jez@J~zRhlGOpW z;2D(7H(apZV2}o`N79l<#o=cow0}A_JVP8x1BgVIpzZs$iB~1F!N0Mka4~C#++5c1 zY)D_LM;C9*&}^;IM(ZAi=sZt7_P8z}0>V88t4%zIn|B7FEn2rj=yyWGJAhgEU?p35 z(LfEBU5C3rV`=`j)D{jYd~NninJ2-~*Kpta1oEPmSJp^Gjt*_(Eey_8l(HS66RLJ> z`a8gOG?2FNT5gFY?%*M}6HPo=as&kcARD}-qdFR-vQ)*C$815Y$=75`)Ry4c)&;4a z_ADIDD)WrSk}WiX2PRR#s`wuTTv+~Y= z5Jy2<*8st3bXC1Jk=!qXN#IiV31k404?c7^k(~_5gt-@g>kHPiot;qjQ(6F{t4E&s zS|9o_O+3|?l`R=rHVx~-r%znDWF`0hSc;auMo3ZN!K+0jcFj*wkpn${Gr6HLFoAtT z73hmuP#Fr9mNMXcgD zkX^I8M_ZF*hi^bS-MdV8MUS1VeBfOD``p96|1NjR_p$M{#tp;9jeP+hG>Wvy3vI5t@hlICTXI+Yw#A*(fujjLTZGH(8-|h z0PEc5ORg(?EFFAIX<;@Ct}EJAf#sbv2jt~IX)Q!{ioiKO?Deo|AmDYj>W8Y9*N>z1 zwV3TC>cw_*U7@}o#MYW88c}01zD;!ire=n0F_>sw<aZzyVkbUG#^Rms!eGQ>09zqX}onM%Y1WD&0Pr?_+fcc!oNdWBy+eG@s)siY4yA=Nq= z+HQsk$q#Bh5j zq&-i13}22#O=)AnG}}j%G2@E{VO7-M44+*+S4woimbx7Hl_+}$YkjC~*0Sf*m1=`8 zGFd7m7~E9Q`8~l0EP2*9uD!Li{60l_Xj02Ulop~_?kr>1p0CSZU=Ip*#F2jql@&tE ztAt{2=nS^kU{d2dozgqOfQP7Q;d>4diIYNw;?OSp>1hFD0i;+QqI^{)GgV;tRd{rc zr{S*#$}t^=5(&ZCr1)b=q`AWaF%n1a8R~Z*syd^t)A<%X=ySh=GUsv0S1*cLX-Tg= zJ@(6?(pN9H3^j~hR`_#;o0WdUBU#G9#fRq#;q=iC zwL?PEOh&;qeoTz(*s--}osuWNt*N5A%+d2k zk>W%}p?|`?d&TfLE9_r!bqXBBv!z^E+DA1z&X?I`wf-&3^pP}%xInwXhXtZdzS6J1 z{@(QTXno=Y)q6UH8{?iejsr6an)GR(nB@=uWE&kZEaEvWSaA`Z4%P4$XuoY4KdUXl z;VK%x_+3XL$6t4+e?#HhLYX)}UsQ(4tiqV0Yo;=9INZK9Yh91xJs(#YKi{g+mtL`u z8!5m-93lcpaqTh1wSU+8$@)IzI?jMhm`nfv5-T~Vkzb|`@IzTDoPfiVF-Kg*caeff z*FSe(t|DSKB@W<-N$SPkYR(_R#k$|4OR2}W1*!Y4kH23vRj2!dRB7PS<%Pt#&nx4R zL85n-?76M_-a_M*-^dNormiNHEsdeimhKB1LAgLubqJ@BsZX;iS4%en{^@#rYEmPFNFG)$D!9gsMhdNtgILLX1cA-J!X{A3(e{rIl zMDy(7E+EBg>P%I^6vMZqo290_f;Z`loi-<~MR~cXATx6Iep@WtWyWuFhK=Y>b!=FZ zr0=m!82(YV(0uq&-qN#8(pgUsmdg&Bt3z3SF#Msxxvn zJ^PCs!qy7RScZrJs;SZRGU*B1abE9tYt_!1>IUR0KqvwH(BQno=;U$hUVHyIzv}{O z-f*1=4`M*CrEf!9J25jul9E2emammgv)US$8NmqUo&%M&8;<8ttZS!vZOXB=1g;oAY;JBCfGsBGu2IQw~@6CEsc54I+ z&Td8BREBp^xxaWxI8$7kpn|-ChD732yvijzo8SN=_1*EG{5~lF|!7O#mihQ!parDw8Gb^PRc7zMbW9i-kSr~{N zaHmt3{&wwX?A+p#l4LX{TVsO_`^fv$fV;^3gr*j4N*G-U?pPROiJf~YPeFyFp!$cQ z+5Io%{^6mc{%`y6FXYfd@<5nlzmxmrIh6b|dV$ zio&u>#A!QVPm`uSaK&7#*uoxAzw4mVJLT^{{~4D1gr9uPMDXnsxY8_SjW}8#tJSzW zOPwp|S810gQEb(<+Bu#M#YNa~D)ET(B~I6b1i7&`nWB8@gYRnuMQ7Wg4jMr4^zkQ)!4@_lr`SjQ-Q*K=ScT2svvq3JreE{m|&on?)hz4IC z-U_E4m|VWzoYw-0W&==sKpdkDIfFUU`201ybD!PBE7gH%n{BUCdlkx945m-zMV7d*=(efo`zLKy{vvM z{?|3amP49tT;ksB}n+~j>oZwcJdJA*X`7* z^)FAuU&<-kfj^BUNzAlPhP&A2;r*T0vbympOY*`vMca)wYhzv zOg)Q*t&x z$)n(Xl!+}AN6x9M@E0T*!huZJuZC`3`2pTAvPZ;=<{r#7M}8ZM8$a|aUkZd|hS$(A zWf~yVzIksWWSUZ_bm~0KM}&Qpt7#b*oEP4s6jp@48Met^0v*NC_`odX@pOQI_O#}nubRdp zBW1kb;wRlOpYI-G*i@6bX-SYVknOI91LcnI_H3!7ITO;-uJAns+U{9RV>N1s#lNNc zM)+KXfXu0F#>VlQIpd(4^KK!0S<_l`Wn2Q}R7%iO zBJ`NG%)M56R>V;Pc$(|PsizK|stv+=+jPL|3jVM)a1eaxYwPlR1{Z!UX*gULM6Kk<0U;sA!C$@z<=5YT5=h8e1yYgoBPz0 zuhO*&zRS~feb^x+@F`tK$}~kB%Ml^$IhdS z^Vn^$zQdjKrtu8A%2L4`)UP`pu=peb=B7DRXHA*Phb?jFI(nC7b>#pz>4QyBb%xA$ zzf7g6$Cniqy5}6vTq&d;&=<^VshHmSYCgC9!oNCMc{&UlcvtYd)qmj-nI(b=btnde*C>8Un9xpcwiAi%{nf|Qn z822k|0NYZ})>yqVy^?pUvW)#jS%lp;`llbAM}1l! zD7J!C!0>fJF>_Y<=z=Z)J&w$KjC7M!I~F zTq;ZzqQ;k5BCAi5ZDEBoTpx6(Um+SB`n1^O1p_Q|g~LpwGJhzuM3Q^n$;2g+7Gs$fT0(b%`s?6j%P)ci{?w|JXwSm6V_?|2@V^i^IU`Fc_>Yr|0-5;$Z`MyESl~ zj5dYWbU`C#t*?12ShA*>qTufDIwarSX3CDMgE^)=8b2J&Zdr7<7Z;6mUd@Mm+px@; zuO4-D;NE6`5_XmS)-B*Okos56+V9(r!{3)p$1RoWZQXOn+~?p()$Fzy>Qpfp#AN!i z)rWT(@bEq}dXlq3tP6CQ#`Z9>MM9UUvUm_=lAV%TX&8gc1C6%wW(*hOeFd9#M$fTd zc^`qVlrd_`mH*9B{cbO_1xHCT>rJ zUqv|b$n=O4+bmgD6kx?MWf-${=_+o!)vArj*}tNX!F<%aOcXBh+Qj8RM@01$46@cA ztx3h%R^=IG+hrzsJcbsCE?|{8vs=#*prMqwans9fM#d#0*)#V9Ely_6Z257WIsP7n z9uT$;t~})ym28$*vSPDH>1mwsefiHzQLl!)3VoT~eC``OGRT#cN4q$z8779k^7T<} zcB&IqYN|BpmGu#CYq&9~u8eIL#(}m1t~@a6Kq54q55G2tn3gR?3m)zkB9(u)#d!O- zAk@%>OSuO&8_H9&t(OnQfBMRVUX^d2u(XY~IWU$DcJHaoQ)#omZF|*+Gq{<4bQ@GT z^T+`CzW%+{8UCC467G3`%g@}N2=BLP{E zaTEfL$z}{Zzhg$*t7F8zx!9uhj`vkJwQKI49fKYTb{IfDJIGKjEM4^oydEI&f~tq* zohroGhd!Jm*9xDJM~Z$!?^XS4o9#Wrt=_uC9mGKdt_tl-?Y+aGB=W3d@zt(avy7GyH(@JF9k2Om4L^$Po<72 z&X7f(5{jPF!@KsAW-iNp#MdcBt{+Zc%2{gt$i3Zq+4ys=tEmjfV2v8QA-^AK?we;g zYcjZnFMqh@ub;tdjA{)MF?Dnh50gCpeOf-m>`@mDBq-#m+M7W~{FyoJ?g6-%lZiW# zSBK~unsIW)e$Q?I2KCu!LKrMXmjFVAv|eVb+^sm3`!$}KG|HUUMUk~7!CjAp6E)j* z*Db=N-{RF(DAQW*Qi)A#@`LP53(2OgDZa6hR1kXuL{-*awmFucyR!e;!}D3c##{G+ z_RqDIVz)$In>u5Im-B|rB~B!4GUG+P0G@O=Y;9&Vt&0pEZ~C9@G*9k|-&q=cEYyuh{0F^S`*RUCv-qBRP-0=2ajYF1?mHA@PRIYPXQILq_)(sg$Zb zZzQc{LHHF#y+6`sB|D^MIAU%<@8ioSSSe#2R?H?%a?%NlCSr>lJ$v8FPQ8fne`c>a zU$Wp0PU2PYv0hMsHyNV+rPyu8`m@=?hrI#)pZb`k6SGc@#eRtLm$;X9n150A5FYdM zZZWBfwOqd@A5Yfoi0iVlA7v=XB=d^zZa2@Qt@}d2u@J$?XZ?2X^>1os1 zQ#?p7N4|xcBr)EkR%BT_07_F(vAuLm3io_su}ITvk^FEOB6;flfj@v1@C|QmuzC+g8VVC*e<^1@yqwwHMn>D71?Rf{sn zW%Ek;?+VDmyTljwo^nSG4G#9_OEc0y0JI*nZL1UIZw3e_3!asEIwY3L-U`$$xbtdb}m z8a(LgzSApeJ^Y$E+qEu8GkBuNtgGH%*cuVmizhs#Sfij=xQKFv$x0V4IAjBUMFg2h z^7Ma-IdUym)YXNzh3_?6K~VD` zYi{RdJt@TjTlx4DEh1RZ)4D_Kfo^7eks`o_yF}%0%0zX``1i>NE#&j&r(^eB3xye0 zpE<8rK+=r!!E0Z_*;?(0khv|G$PvU}w$i@RSOL$aspIW>WT31St&4ePLbF{|C;4b& z*CXbQk0bXy>thy#$CNsAn2QEeIKp5Zgq7+4hDeWnN2z zdu-vGZ$g{bRyen9Z|dScZR^@D!Va(b)HO$nz>oG)%8jh6pYw)m8YXq5;G*3*(&iCQ zCgxefQ4*~wh!xAkHs0tIsUX;Ps#wXYKA0ydT?>~LNJVTkH}8^W@-QPdcN~di!G9qX z9|1%ZnrRU5*PUly#Xdw>qZqoZfz{c((kh?rB-UL8QCSFp45Ip(;cS33Qk5_Jq2ffg zOvm6C+&Y`#52eR?bcj(=x-nDIbz3sf%QQ$GZSB((jQT4EJ%G)bpZk$9iRv8w4o8lN zD)hOhYgxVj?p%*Ve3U_}X?J%@eeNYBAd8=7hmQ_SX)Q;Bnu-&1!@`QFAQ#-qi^mOejWVI=x zdqP)B>Y1*tum3M=wbg}96XUL5bPxl53W_KSiiiuyB}W1ce97Iz1rMEU5AmNUM|m+K zA+J~~_Q;2(n_ij`NG?hwZ6z|;$o5N%=1L@U;3}Y7u<=Ha+=o#})R=P=(Xlx#ew^#4 zMtLx=bg@s~P%*uQv@p^zr(s$0fk;SZy2PqhA=jP_2W3y&PRTJscUoEk+o|AQ5xZm? zu5aA4BEpevFqjjN&3wGq_KxXOw!u8gud7~jLSJ>li1OG+1#^&Eqh#vs*3I;tdT{!x zgp59c%St^DD*WzT9vYwYfhVa^MN*$7YFr+z6qq znJTfHE51ux75v_(9^}$sat&p1T{|~6EkR~i|5~S4V0MJIO`0;=L+xvdHN9OH%x`%m z`b^8h^^Boj*+Pc-TzV&8w%1Xyuff#Q5Z>0G*Cx1NS_m~R33k~-NmcnBMf3|<6ohF4 z>FUUzibAVAyL($yr<&Dcqu|mcWKN2P)U>5Wo2EJ5?ZFzp_%Vjtes2H-?z#i+zOB)! zi)WD(Vxm1_6djdB--ddd>e`E>0#}(O9=Y8NJ4eG!ZdWIZw{c2DaQdl8T6U;KKXl+i zXe?F9a*aeOOH4i!Nfl!^Lv&?@v^Kr7{>1t-R@d#mdWh|p5ZglnqhI4^Qwi?xEK6G) ziQ{hvi!v-tKw_yVyBY2%DiK>57sUh;&b(7~3eY}<=aBM4hj4j8G?;WNl5~&E^~che zSY_?J%+=QYz$Myii+3m}RLS23vdnhtE?S+cF2l7ZTT3e{xdZ3M`oJm z@RZpLS!5luH^wPrbS*eOU8&&X*IoJNL1Mr3MCHgK%SI*F@90wU=wZguyiB)g#2V3r z79?0wJhQ_CXEm@o(?!zyzsK{6{0R1vN#iqv7dX5YTD9c4b|)|G>KkvAjF?VJ_J!>RaudQN3#($*>UYs<(Oxd zC#Bq-%G7z@oqKVvXXBcHtkOOCDSa-t@>F`Y+_!#yW2WLZQBc>zK*hdMmDfrtZQ|0c z(g7FNa=qz0$$jXhPG@d(a^O;_KIz`iPXs?d-)t`Z`|5k&_kxMLKydBo#++y|C;?Hu{rs$JTS0PQ09U>n2zK4r zrrVtaCCtEPZ~OT<>KaH63?K%B^ppbu++d&;#~`Zj+hs>x2g!i}Tsg>XuVDs*tbnM# z{rqfp6wKl8pw50@4R#p9**VeD5RcaUT$>#WarWK2Fkil}2Dxl4+}XO_$q?1~^G(-g zgIx_G;L1S`1MaIrxE&gZpPy}A3vo4&goh#6aY%up+dC+O`~o;#L6cl)S{is(A0^3w z3ONv1k0qr+)82Eq_kj#()Io&s2NqIzft4dd7i*#zHGEhE%V?5=qhVkHL~aI-DuTw&AmfR*^I$HAjVMC+7-MIU@x)xX%c064e2n2rNS|`3203_C z4t)PFa3mO(;zoz%kVlTOjlKfY8IB}3+6aXVlB4BBq+l7XSK-AL)tkxJ5k^zL4L)=Y zA5C(Ibb+IeA1&p;1v(_0s4$x}n&d{4+yM0+z_a?JZ8=a6f@<0MIwCcXR;-9IztK_- zkuF9n*3l_e+RreL7DR~Q9i&brO@n2$lp8JOM%!|uQ>?>#&~LPq8!hEVOS#cfZX}d) E0KzJ-@Bjb+ literal 0 HcmV?d00001 diff --git a/packages/audioplayers/example/integration_test/lib_test.dart b/packages/audioplayers/example/integration_test/lib_test.dart index e5bed6738..245f43610 100644 --- a/packages/audioplayers/example/integration_test/lib_test.dart +++ b/packages/audioplayers/example/integration_test/lib_test.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'package:audioplayers/audioplayers.dart'; @@ -200,4 +201,31 @@ void main() { skip: !features.hasForceSpeaker || !features.hasLowLatency, ); }); + + group('Platform testing', () { + /// This section is to test issues for specific platforms. + /// This can be used to set up scenarios which are hard to implement or + /// reproduce on the native side. + /// Nether the less: common native unit tests are preferred. + testWidgets( + 'test #1260 - mp2', + (WidgetTester tester) async { + final completer = Completer(); + final player = AudioPlayer(); + + player.onPlayerComplete.listen( + (_) => completer.complete(), + onError: completer.completeError, + ); + // The play event is handled asynchronously and therefore the error is + // not thrown while preparing the source, but returned via error stream. + await player.play(AssetSource(mp2Asset)); + await completer.future; + // TODO(gustl22): check error via stream, if supported via #1352 + // Unexpected platform error: MediaPlayer error with + // what:MEDIA_ERROR_UNKNOWN {what:1} extra:MEDIA_ERROR_SYSTEM + }, + skip: kIsWeb || !Platform.isAndroid, + ); + }); } diff --git a/packages/audioplayers/example/lib/tabs/sources.dart b/packages/audioplayers/example/lib/tabs/sources.dart index 5bbc7e355..191bdf8b4 100644 --- a/packages/audioplayers/example/lib/tabs/sources.dart +++ b/packages/audioplayers/example/lib/tabs/sources.dart @@ -24,6 +24,7 @@ const mpgaStreamUrl = 'https://timesradio.wireless.radio/stream'; const asset1 = 'laser.wav'; const asset2 = 'nasa_on_a_mission.mp3'; +const mp2Asset = 'two_beeps.mp2'; class SourcesTab extends StatefulWidget { final AudioPlayer player; diff --git a/packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player/WrappedPlayer.kt b/packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player/WrappedPlayer.kt index 9018e2d79..2ba0cecf0 100644 --- a/packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player/WrappedPlayer.kt +++ b/packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player/WrappedPlayer.kt @@ -247,22 +247,47 @@ class WrappedPlayer internal constructor( * Player callbacks */ fun onPrepared() { - prepared = true - ref.handleDuration(this) - if (playing) { - player?.start() - ref.handleIsPlaying() - } - if (shouldSeekTo >= 0 && player?.isLiveStream() != true) { - player?.seekTo(shouldSeekTo) + try { + prepared = true + ref.handleDuration(this) + if (playing) { + player?.start() + ref.handleIsPlaying() + } + if (shouldSeekTo >= 0 && player?.isLiveStream() != true) { + player?.seekTo(shouldSeekTo) + } + } catch (e: Exception) { + handleError(e) } } fun onCompletion() { - if (releaseMode != ReleaseMode.LOOP) { - stop() + try { + if (releaseMode != ReleaseMode.LOOP) { + stop() + } + ref.handleComplete(this) + } catch (e: Exception) { + handleError(e) } - ref.handleComplete(this) + } + + @Suppress("UNUSED_PARAMETER") + fun onBuffering(percent: Int) { + // TODO(luan): expose this as a stream + } + + fun onSeekComplete() { + try { + ref.handleSeekComplete(this) + } catch (e: Exception) { + handleError(e) + } + } + + private fun handleError(error: Throwable) { + ref.handleError(this, error.stackTraceToString()) } fun onError(what: Int, extra: Int): Boolean { @@ -283,15 +308,6 @@ class WrappedPlayer internal constructor( return false } - @Suppress("UNUSED_PARAMETER") - fun onBuffering(percent: Int) { - // TODO(luan): expose this as a stream - } - - fun onSeekComplete() { - ref.handleSeekComplete(this) - } - /** * Internal logic. Private methods */