From f128f08c2c986ac35dc3a8a6dbd44760dd2bf495 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Mon, 30 Mar 2015 02:39:28 +0000 Subject: [PATCH] TinyMCE emoji: catch the inserting of emoji chars with the Windows 8 onscreen keyboard and replace if needed. Fixes #31627. Built from https://develop.svn.wordpress.org/trunk@31922 git-svn-id: http://core.svn.wordpress.org/trunk@31901 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- .../js/tinymce/plugins/wpemoji/plugin.js | 77 ++++++++++++------ .../js/tinymce/plugins/wpemoji/plugin.min.js | 2 +- wp-includes/js/tinymce/wp-tinymce.js.gz | Bin 138269 -> 138335 bytes wp-includes/version.php | 2 +- 4 files changed, 55 insertions(+), 26 deletions(-) diff --git a/wp-includes/js/tinymce/plugins/wpemoji/plugin.js b/wp-includes/js/tinymce/plugins/wpemoji/plugin.js index 4010cadd84..d3784ddf89 100644 --- a/wp-includes/js/tinymce/plugins/wpemoji/plugin.js +++ b/wp-includes/js/tinymce/plugins/wpemoji/plugin.js @@ -1,7 +1,18 @@ ( function( tinymce, wp, twemoji ) { tinymce.PluginManager.add( 'wpemoji', function( editor ) { - var typing, - isMacWebKit = tinymce.Env.mac && tinymce.Env.webkit; + var typing, match, + env = tinymce.Env, + ua = window.navigator.userAgent, + isWin = ua.indexOf( 'Windows' ) > -1, + isWin8 = ( function() { + var match = ua.match( /Windows NT 6\.(\d)/ ); + + if ( match && match[1] > 1 ) { + return true; + } + + return false; + }()); if ( ! wp || ! wp.emoji || ! wp.emoji.replaceEmoji ) { return; @@ -19,31 +30,51 @@ tinymce.each( editor.dom.$( 'img._inserted-emoji', node ), setImgAttr ); } - editor.on( 'keydown keyup', function( event ) { - typing = event.type === 'keydown'; - } ); + if ( isWin8 ) { + // Windows 8+ emoji can be "typed" with the onscreen keyboard. + // That triggers the normal keyboard events, but not the 'input' event. + // Thankfully it sets keyCode 231 when the onscreen keyboard inserts any emoji. + editor.on( 'keyup', function( event ) { + var node; - editor.on( 'input', function() { - if ( typing ) { - return; - } + if ( event.keyCode === 231 ) { + node = editor.selection.getNode(); - var bookmark, - selection = editor.selection, - node = selection.getNode(); + if ( twemoji.test( node.textContent || node.innerText ) ) { + replaceEmoji( node ); + } + } + } ); + } else if ( ! isWin ) { + // In MacOS inserting emoji doesn't trigger the stanradr keyboard events. + // Thankfully it triggers the 'input' event. + // This works in Android and iOS as well. + editor.on( 'keydown keyup', function( event ) { + typing = ( event.type === 'keydown' ); + } ); - if ( twemoji.test( node.textContent || node.innerText ) ) { - if ( isMacWebKit ) { - bookmark = selection.getBookmark(); + editor.on( 'input', function( event ) { + if ( typing ) { + return; } - replaceEmoji( node ); + var bookmark, + selection = editor.selection, + node = selection.getNode(); - if ( isMacWebKit ) { - selection.moveToBookmark( bookmark ); + if ( twemoji.test( node.textContent || node.innerText ) ) { + if ( env.webkit ) { + bookmark = selection.getBookmark(); + } + + replaceEmoji( node ); + + if ( env.webkit ) { + selection.moveToBookmark( bookmark ); + } } - } - }); + }); + } editor.on( 'setcontent', function( event ) { var selection = editor.selection, @@ -54,7 +85,7 @@ // In IE all content in the editor is left selected after wp.emoji.parse()... // Collapse the selection to the beginning. - if ( tinymce.Env.ie && tinymce.Env.ie < 9 && event.load && node && node.nodeName === 'BODY' ) { + if ( env.ie && env.ie < 9 && event.load && node && node.nodeName === 'BODY' ) { selection.collapse( true ); } } @@ -73,9 +104,7 @@ editor.on( 'postprocess', function( event ) { if ( event.content ) { - event.content = event.content.replace( /]+data-wp-emoji="([^"]+)"[^>]*>/g, function( match, emoji ) { - return emoji; - } ); + event.content = event.content.replace( /]+data-wp-emoji="([^"]+)"[^>]*>/g, '$1' ); } } ); diff --git a/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js b/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js index a8d892b77d..d11952eed2 100644 --- a/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js +++ b/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js @@ -1 +1 @@ -!function(a,b,c){a.PluginManager.add("wpemoji",function(d){function e(a){a.className="emoji",a.setAttribute("data-mce-resize","false"),a.setAttribute("data-mce-placeholder","1"),a.setAttribute("data-wp-emoji",a.alt)}function f(c){b.emoji.parse(c,{className:"emoji _inserted-emoji"}),a.each(d.dom.$("img._inserted-emoji",c),e)}var g,h=a.Env.mac&&a.Env.webkit;b&&b.emoji&&b.emoji.replaceEmoji&&(d.on("keydown keyup",function(a){g="keydown"===a.type}),d.on("input",function(){if(!g){var a,b=d.selection,e=b.getNode();c.test(e.textContent||e.innerText)&&(h&&(a=b.getBookmark()),f(e),h&&b.moveToBookmark(a))}}),d.on("setcontent",function(b){var e=d.selection,g=e.getNode();c.test(g.textContent||g.innerText)&&(f(g),a.Env.ie&&a.Env.ie<9&&b.load&&g&&"BODY"===g.nodeName&&e.collapse(!0))}),d.on("PastePostProcess",function(b){c&&a.each(d.dom.$("img.emoji",b.node),function(a){a.alt&&c.test(a.alt)&&e(a)})}),d.on("postprocess",function(a){a.content&&(a.content=a.content.replace(/]+data-wp-emoji="([^"]+)"[^>]*>/g,function(a,b){return b}))}),d.on("resolvename",function(a){"IMG"===a.target.nodeName&&d.dom.getAttrib(a.target,"data-wp-emoji")&&a.preventDefault()}))})}(window.tinymce,window.wp,window.twemoji); \ No newline at end of file +!function(a,b,c){a.PluginManager.add("wpemoji",function(d){function e(a){a.className="emoji",a.setAttribute("data-mce-resize","false"),a.setAttribute("data-mce-placeholder","1"),a.setAttribute("data-wp-emoji",a.alt)}function f(c){b.emoji.parse(c,{className:"emoji _inserted-emoji"}),a.each(d.dom.$("img._inserted-emoji",c),e)}var g,h=a.Env,i=window.navigator.userAgent,j=i.indexOf("Windows")>-1,k=function(){var a=i.match(/Windows NT 6\.(\d)/);return a&&a[1]>1?!0:!1}();b&&b.emoji&&b.emoji.replaceEmoji&&(k?d.on("keyup",function(a){var b;231===a.keyCode&&(b=d.selection.getNode(),c.test(b.textContent||b.innerText)&&f(b))}):j||(d.on("keydown keyup",function(a){g="keydown"===a.type}),d.on("input",function(){if(!g){var a,b=d.selection,e=b.getNode();c.test(e.textContent||e.innerText)&&(h.webkit&&(a=b.getBookmark()),f(e),h.webkit&&b.moveToBookmark(a))}})),d.on("setcontent",function(a){var b=d.selection,e=b.getNode();c.test(e.textContent||e.innerText)&&(f(e),h.ie&&h.ie<9&&a.load&&e&&"BODY"===e.nodeName&&b.collapse(!0))}),d.on("PastePostProcess",function(b){c&&a.each(d.dom.$("img.emoji",b.node),function(a){a.alt&&c.test(a.alt)&&e(a)})}),d.on("postprocess",function(a){a.content&&(a.content=a.content.replace(/]+data-wp-emoji="([^"]+)"[^>]*>/g,"$1"))}),d.on("resolvename",function(a){"IMG"===a.target.nodeName&&d.dom.getAttrib(a.target,"data-wp-emoji")&&a.preventDefault()}))})}(window.tinymce,window.wp,window.twemoji); \ No newline at end of file diff --git a/wp-includes/js/tinymce/wp-tinymce.js.gz b/wp-includes/js/tinymce/wp-tinymce.js.gz index a35349c21bc5dcc548aee060de6e262b4505f689..4de73c0a7bed301997a11a6f60d24e8be9f6e176 100644 GIT binary patch delta 6498 zcmV-o8J*^xxCr042!MnEv;yA(P*$%pkMrCp7Y>)G}W0x-j z0u_Hkr?dlmSsuC!0IHUTwpYMcVXw>^Nr|bG6N_Xn!^p|0rn7^^!B_WOqWuR@pc*?! zWQzGg@_%q*fuC^jk|z)t;p&|`&`L!(oXt3jb>1GnFNjAPe9ZBG{6_5&j!f4G9_mpb zGWB}PYHHqWhkIn#0NlLsVPkh-(nuP^0JeXp+D)6h<5k{yM^$bmxO}r|utGYoy)4A6 z_PKUnk#Z_>q=z=ebV%l4_S?q%8e&%aI`KE>|H)(YTq>&a<8nSminOW%E zw!4U`P_eQ>b_!=pD#`;LLF$8HRBAP%#)KoPczf&@ym7FKLvqj&$HrbMLbG41gin95 zSB*Znx_Cfyk$#+M$UYZGXlX2zQf3Xmls-m3pW5d`tSIO)RhM)aEuhzMJ|zVnTuR}y z+H5H7Tq%6k>JrYX1iQLc=Uu_4mb$AlY9)e@@tvFa(uT?*HT#4XRh0%x@0}P{w7PnO z$$IIPyc<-p*g%=yK#B9^!rcz~>vw)1Oc$E}iKAJf5N(*rf?P?FaA)rx&U|2X2JZn7piHuxB1cl+)LNkEU}( z3w(@J{?`XaUM0ER8z2`MqCK>~(H>u0_n8#d8oPpL_9E3=EL3|87=L2oC~AK~u=>IN zg>8gc0;n@YA60yP{hnV^zmr70vOL9#r12Gt*t0C0r$(4jFpaK(X8L$;0;REMlQTBfkD*IZM_G8SO zfcn&=h^Y#>PuFo)MNEbe&j#C&)C87728=0rf8MT*c;Ri~K(w$(^~=I*@})=urG6&I zVRdy-VuoDI!DnA`v%4Mi!ULWwXbHc+AQ|28%%uxqy9@3XSrP`*Kg2cx{~g`nS-+;` z;5IfQy}zC+<_Wl-qEeT=1_CL6H$Exs@lf;r$YZll;RsEE9kd8d0_*45yGGFyw5sTlQPf{5>QMd{FQVviLc`Dseq{4hH4^&j{P+xxt|-}D*a z<4XpCu_{bt*)w#fz>-&gSd!?tOQ@|rejN8O(CAk~_>Kp9EjG0_|K4tI}Eb1DjP9ydH^8xC2%XQ>a#dkWlb zR3zQ3CC&nlJ>lln#~$5hO=(0q1JxTa6(#w6_SHc!#<&RSFOIGvZ2);TuAgt5Y|S6! zqp?lS0lkw{c1sh>xdZEkRlG%dTi!dPB#RFZOi4lo4{QO(Ci(ol3OfZa=lzlnI?S-v z7_x3#TU1<-XpJ6!L;($y&p*Q(r`6}A$BB*u%l?ngm6ztX$MNg}NCrA`pc@5ylHxB) zU62ISx{iMG2Kt2j45{}Dlr`zfWQjONy}DRpuc|A0!JBHZtX89DSU)gyC#3SX+nMJw zu8Ay+_o#dguUK0gIto>MO8Ee@o&m(5{oXNJII@ytmLzz8c>G@h2W}aNVddmpN;rb6 zg_)GM7x~OtFG9mJU>y&dGG@bPI1o4*AUfCr>dI6UsQ$nq3v$jm{+U}tA0~qaQRw4G zgc=6E0ywVW!MH^HWBWW1gef{0PE4kE^^3!{uzU&32uk~?v%7^g>GUZ3at0;mo1xK& zM$)$QRZo6@-)nW6g6NJxWoKD9PR}Ug7>VP#6jn);DxKAH)>t_4G*cGBcGYi*Q7{p? z_mC12h1GOQ9@&Ku3Q?p=y@9odfSWLFbc{l37azKOaYZq+;ceIRj&DobfV$51S`!Bo7umMDWxdYj|DfI0tT*l@=I2 z7Mf;<&2z|65M&^1-Ch>`F&0S9GZrn_*H*-|qNN;=vL;Isq+v6&vm2^rbBOZw}wr*O{L=w;aIhbTaGw~slku`Ysvh|HdkhL$YcU(QCv$EQy_zOA0a_mLv z$7)kDo$Zv=*zHnZ8b({0OAEmk6+X7;G$$+N`#(Cwk)jg{1`vx;s|^?Nd}*%vnt?EJ z7uLsx^$zCLsP1}RRD50xtl&`^!K31T;JZkU>kiP_nxm3MIHep!I8Z2W+l22nCUz8o zur+psE#FyLBV9xa#*P(X>>TeU%d{@ty;!d1%a?P`_5)R#iPWMKlF+fS5(kWd`&Sr!NeAVIU>Al|vGJ6Vg0O7i>rL(d6Yr&;kC!S4uU2ou%mEVpa5qLNX3 zF$VVGVjOd7yqr-9Z-kid1&wglsGJL0uL?^-uUFx?ez6`;4}bgVgtCp}Vfp;kyXS8r z1*NYhv2@mOQCqKcCXKa~g$3q+Ft7O`jqS;{jyrswIkN89L9!f6BufF*;3xc#dc7A6~3X>VeAHPzVoxB_hrl=CR0V(22Lz`o(PcRPjb0 zMM^C>YNyIr}+!y}1^@R=ajq&QW z$iT zJDrbADymYwhh~R}VM*uIS0qOt)~n&!Ua@s>Nboa=hCbGSe&_wm@vx5pgBS4B6HLe* zV|a;i#^cB^;Da7h7U4Q7jg3T66+5rqb-q143{T7G$mFO&e46*Y5085)2MTcTIWn)* zLi0l(f0)m?G(5{nFO;x`ls&osO^^1tg*M7TBJi;d1sj5L>9dF)$JS->-aSk~3rjwk zpk`X0j2%w{hN(F>sR^jJztQ1{@+e~swE}Z6xw3tG_-OW8jcKd zM%d@4f0)nDX8q+E;&2U67h|jBhj{S4o0}?qf3k(@wt7R&4QTJ*Y^Z7qp0N1$(f3Gk z6^^(_ms2?sjkJtMW=yxBTmxY%@Wsu&pmsp+LAs_*NYW9xF4LBTR;k!W^-*B6){Cu> z;I~e&<ubd9pQx!LkC ze~I)AX#5quA|5J8oGEH(6kTDr)_ zr+aNcA79|>gF)cLv1!g?iyM{58Ki>3?bl@NjM?l=mTQ>eA7vA>oS;cCR|L{EK2`=U zrkRWGfLIrA>1l+2$eZvFq5{G{6x(V9f2^JKOD*>gc0c|4PuGPsfuOPp?34~ zmeIhRmA<@7a^YH!mS^MDdfBJf9t_}S=W02|#&l+!a!5hJp_9pa|1BbU@BeN+Tq-9a zmHk2oliYL8dw&)nw=tAlXGcp+P9FJaOY=;^p38A{C0cv;0P%{Tf^#91LTaKheEB^fg3iT%5_y-hSW7orgF7R`R@BOspI=r(+m@@unI+|GWs{TlV1Ei-=gkvvHoO z-j`Lg_ZWGMVQtNcpx}D=!;yedfA%=~IuwzCkqMpu+6}NZs$tUcIU^DnjuslLK0ZSQv*{(x<%_WF}9k7B(=!Z}x!ksMzyjM1|U$vfp})GnXu zCVR=bo}p$WHTEBRrqSj`#;%Is6-&&{i*9PzzEyi4;`UWPAO_QVjlxmUf5?gVV`KXw z4pEEuo~F;UIS4BC%p%UQTsr4(X%t1s5SrX-CWAfWHq{GnwDAG8TZ5(^eBiKMcA5u` zY0mDGEYD!L6wPBMeBk|bhMBFBupp!r!^HUOMp06Px6N^?dQ&!gBdsWf=uO$^4S{y* z_Lubqt8e~-ai9~$`?RZ1 zUN2Tz5@n}H@bB&ZS4U$Oa0|+k-1O3??r`5heBp>Xru%%Tg#{aJ>*C^H*(kWP@3K*t zrQFHeAuFb8A6zZ_e~X~WrXg(o34tVA&HD*yW%|-Vj51DR*x|k?Mi_+1>cik>PDNU6 z-9PC&`F<6r)9uwbESTu^d;uhB(I55|s<&iF1YeT{Ig!f%R^Wh~hbt&NPI@QfaF?M@ zAKE6ai^jz~!Jgw}`meS`>)w;6k&qmW>s;%KgnF$pnD z-3VgMR_bJugpUuaYO3XG*R)R^o2I#w3Q}TKnX^9b;ij+J+nagt&@i*&I|! zuwGtN!HwGye`pZu>L}XNzj6>u6ykE_7h__-F;9%yF6P{-C-SezXNon985HZBlh~ps@>V1xS zW*f6(%5T%*4#~|O!`*WHmRS;0?~)*gVV&?nMq0Ike;i3wB=rW*uJp8~j?^eY4dOx6 z$N;xES=UseItz(J3QgOnGtsCA-#td;hkh4#GubGAc=ASH)9%(6Y|_+M#-s_;^UZgU z`|oO-+w^=_Z~dBcdz&G7`{N)-}mm_`~Dk!)$84dyWc#7Yhv*m!TnCo z*o(SZe>=W3CAc)+EvxGH{`9O`##gBQ`;6MhKbt6mnDzZ%>CyOgzub&p&+*R)#3U7+ z;xWNQw}_D}DvVgOy!Df^{Po;1gVLb`^kMxH&Td%J7?L%`pN887a!Q4|j=AC25Z}sv z$svA(GOFKp&48t>_-}RXK#;4h%Am_s^4`6pe?LxFUn{0Yu{2O%xEh&_P%#X>-M0*Y0e!SKSG@Yf3-a`jZ(es``d0BjG8U%qrV=A2`c9I_$JyB zm4&%!V#kFuHafGPFV@7O{gQL4zs*M7VBGrp?US9P$8cV#uL(<`J32wMw(dX%?_w~V zQ-BjI5Ze`-g#>_J5(Jt*a=m%b0UxLiDoHQh7sl@E$)^_!LQ;%br}?sB@2qFDe^Fkt z>-j}7YGmetAwG6>V`Q;be1zgE=+Vk?L+o26sx}jv74?~>jpCtUF};|P?gz=15MAQt z`JkGJ-!Ud}An6&df@Fjq{cW_R-= zLsn#Pk3Q(F;~GJcDh zAhLj#lB_hXeCD{B0PAKLH`rX-CsE}^A&e%Qk`I`JDX|D})FZ0HPt~7zf6QaHQuqlg zZB^$m|M4x9tTvmK<{Iw<7rAm^&)eSh4@_Q-iIuNXIAkbq4(zi_L6YJL%7pS|D21G? zNWOjf{Gaa>t)BR4HP`#~HQ|)hKnU_?8S0cN;;>$xgtWo*f^1ZvO?4?e6NXTSXZ3VR?Se-?80npzI8ams9~>*Bss4_zdaZLK&9SEyyfK*cy*S=9o} zd1{3ZeI@-VJ#V9EW#U0SYocWpQ6||`tc&c9n8eS^lCn3mMy5an^5 z2Nt=LPw4_N#m}oZNZ;-@x$#nd;1iDTb2x;S&PQUp60rU!e>@1eNfgQ<8U_2H z(W+1EN)HtqbLPAg&Wwq(<;*@$>jI%Vo|V&Yi5Nb_2h`Vmr1_gk4R@n#;pybCN1Uuk zb&^Lx7nxyUc*`B1_I!#-MK_$KYineg#6d$0SK2{*UpJiZs?93IC=!bfSH8ZS1MO4f zWV4y+3p28JAu&B4e~DRJsHDct=GWE+O36d4z8InE&S6J(H4W0lp9xoYrtkgwTHhgx zY{urcbnCcIw{AnSwo)uJSJ)siTZ-h4!d=gaX&ts!&fvTv@G1B|MoMvhl9L;5a3Szk%8#1i(y#fM2`hfTSu{x)@YF(Hm zb(*`Wk=0E>e=F$#F-j0`hLtfeHXwsfB8-e`Bi=w)Mg)iJrPf^vjq0`<2cts5<}@_Z zz%2lUBQ|NizaJ}7$N?kBqs-G|vOJuj0^C!2(yHP+wZw1+Q8sW^VoR;W`J%VVP5cn?WNsCoe`oxHS|U$TgBdQ<)_Em&3JW(x z@onBIu2odKm^N$(TqFW^eo70w&$cx;j|*k9n9{tC$e{Cy-udbMG7D-`3}Tj;$KV6% zUOAe)Xh5>*(_2}P9iTE;SXE=tO|O70HEi*L0u=RqVCYlg6W?N zN(pEzXvRg;(i$c9X-1-HXfJ$Ed3-zZ6JHLjY^rtnO4~|~T>W_Jg-N4Ne>sFU_%@0@ zH#=ajR_(A?Vl3+I+l^Gk7Ezr-YZ_ZPs#Qzi5zO6h@Cgh#Qa=&YF)Ki}1U4HP;bMW!r9u)4NOErh zq4e@=?6I*uGi1m9FZZ|XFWd9z$7!i$&m`QUim_TPsh_9M^E=kDMrCp7?2q%fWtT4l z0u_Hjr?dlmS>AOS08}lFY_EW?!d{s-k`hxVCl<+EMv;?KO=ky-gRkzmMEiH3Ks9!d z$Q1K~pp}YnIGb@C>%2XDUl5Np_?Y8g{6_5&j!f4G9_mpb zGWB|^YG&SShkI<-0NmX9u(3NZX(Wwd0Na04?WRrM@hb1Uqbj!&T)y2lSRtL)UKV0j z`&_%PNI4Zb(z`arbV%l4_S?q%8eo%oyc|Ku@xE)`YzakW@%7{(rBv7^Y%%q(W5N+tygiN!-Z)srAvx%XV`Hxrp*gNq!l!@O zt41GOT|A(&YHqbzCpv3ud;cf^0^;>^z?JlZU1-Sdbv~S?{LGJ%mlw2AVLwTbMr-^w1 zhR4j(OMyv%r$3=iTsqPJc|1cmuuBtong#F)rx&U|2X2J3n7piHuxB1cl+)LNkEU}( z3w(@J{^tiqUM0ER8z2`MqCK*|(H>u0_X8=cHFgEh>_w`#Sg7_GF#g2EQPh8gVD*FJ z3)={@1W;#)KC1Zo`aQp-ek+N3ZF!0{N#ko4vFC$ukzU%BW&}jfWx5<3v0$-8QQ`=B z*-09p2pV9Kk&r5%7`5%82`b}%3@E-uwHPX$0g*$H`4;_o=;$(1znZPg2sOufnrPIdPSnyKa9YoxOVuM^iE5&Yg1PuFo)MNEbe&xZSu)C88o02ov9{=8Wm@xt4}p=e=|>X(Jr z;5IfQy}zC+<_Wl-qEeT=1_CL6S3W81@lf;r$YZll;RsEE9kd8d0_*45+eXn7wdp48)6V z{>dyxK`=~eJiSv(6A3LO->R_}O|_bi0%at9$3$<`JKVkZKBuA(=W)w(w&f7F_qkF` zR6?jtYJ{dz@d6sRiG9#vA2%$hXQ{{cIDDrk&@8MVc8c^eathUd3UbO=v*_-J+P?f? zora*>sE&|!wP z#*lT}+M?ouL~HbaAPQ)peDN9HIIBJea;(`>DF37rd^9t7<)NhV=tO*C&;~-OfCh zaZO}lyhr70c*WY{&{3%3Q_2UJ^$Z{e9rsSr!Z9dGW=Vp7ho}D)aNw4K7*J+e{7!zf-pk|!>P&iu6}XY7M8Do89`|ub#^zfCcVEm_;Lm%=bNF? zh(^-3^i@xn-w6T*e}U+ZL1kxyaFU);#xWAdb1AHnC{;SE=d7`C;@Lo12-{V^B}TzS z%Dt1u4qg)qC6mH@?&T=Vl4%s__3~!H&}-Ty@PIXSd|hfz?R%^xG~;Xbd624()^uljh<>moKg;W;VR(dOomj zJ=0tIrnhxKOMbs0?YKkkI<3!Q&VVys=3(=Me~sk9f`m296?XuDW z!^c9??67$bISPUS2wS(h6-^}Z+@FIPy3DD|2Zf*rLM67QN5OO8M^h4soRDgn|LYV$^EGMLb`cYrbYE zOx%U_abdlKIW?-=o);CL7egy}lt%EVIQTA-f8%-pbhhTGWD!m&2N4bw%G);KyN!t* zM<8rX9AV3MR@O)tk%Eb1MVL6pd&x4bOLs3;>&5Ejg0uZVm1ZKfs813)Hdf+*F>s#? zA?B7T{4rH1RaVqTl%0zfHehJXd1Ixw`W6*hFBex@p%phZO!ZY0Yb}Xf&fQ9dwDb!M ze`hW<{=V2@z?lsK!2l#^797S0mvv{*qN0-g{_)6j!q#b4d`9p)0vW;4liA&0f9O-TaXc)a|Md3x z>qtTAt4S=KHC)uzE1gLbZDnDBIm~N*e@GL1vTfoHpJ$G&J8_UKClbk005$jt|D#@S z5Cq8)O0y$wqpg`(QZFA z)X$#3eE#LCIrB`|SDD|PTW8_kk{oCk8ksh4670x*A>%{ET(dx29!ca_6h0TkT& z4%3~^MP0p7WuHqh5oyD;}MHVKyP0oMj7N49Ll$c1jp zMsCYSZp((@2&YP)HTu`1@32*jsy!0PV@85LRgRrFGVR@i`3$Y5xoxftwH|U0?lUb( zk`>62mlh~|T}1+_j{?)NS?&eMzHz!KXGhqyP)2{U^yNA0wsr@exD?#78Lh)d*O9 z=V$9R6nCEx;WB{;M_nT&o`LjGNk_4aI@E4|-7^}P)X|riNG@FK^6_l4-mEfu?a2^s zcCJ}k1*Cs+GB(*SbTA7%Cx!Q?$#EM)*=G*4#3Zee zkG3?=WVE@QR9B+4w~w$MWwTke`r|ePLOs$-9lSQd_wUqW9OV3U^!|h2j#!XSy7@-t zgk%*i>DBOHGAyDq9%9GhOm>crGbgzm-uz41uU7;^D=~Q*|Y2@B4UM^I&{ca1;w=LCf zandJHthY#buc|TS=Lr)AV`1xL8;9)EmyRTsr4(X*4Ow zBbwx6CdE4g8`TSUT04*GpJ7u`JapJDJI%w!G!O2Ru*+z%BxRThA9_DMz|?=b)zUL!kZ=mRlO;jy^&^yLiDC=^oCF^b^FWug4M}E15c z)E(|Sh%X#+#&n+#wXk5TW?fwTGaChW_H8x_vy=yUJ7mRF?USojwhWqV8sfV52}Rhd zru(F!$)pDrrDVpqykk*}I02E3-h`Vu6=}V0*3X=TxQf&1_G%m!O!Q{41d_DOMwx=W zmJEsDYX(71d zB}yClm`9*5kowSIABo0!si%CWP@5v`As_9A-TC@xLXczGD~9ST@vI` zt1}|VP^4BAAgP_C-ca89_caZrhS6yd528i}*~CdprZTx%%ph{3wT(Ixje79yV}wS? zy11Lki1&{tuk|(UZhgTvKYe9velR`XeET@tZnMV^5cGdLdz{|C|A7AX9z3{nr}yv_ zzChRC_3qsH?i+p8>)nUD-#mnCV(}Z%?@m(Hi@M!6zBDDcG~TYN>bGomR;}VI)c$=& z?c*O!m_1C3{;%}j-5MfbaNSEcU zpOob<=Z=4!kPaQ751W^8cEgg!n57y1G~6zbQ!3PT%niSW_(ldkj)5Z>PW`rPM)YJ` zK&$TqqCj<3idm+TckbN#{r&oD#ndR41_}&UBh&S1w~B^u1lruY#dh1h_d70Z%ASX7 z_Q~l7c#~p}Tnk4bEF8vdLY!_vuoFoIB|(KP`(uB$f)%kAjoZ1bVOt_j9qFN2Lry;8 z@OgO)KZxv~J4|+rB1hPfnF7622*QSY)M2=knEiVEjB)E@Z=XW>UjI)#F~9#ep2}&B z&(i6hR9;gg+UpG+Gw~cQae2}e(&afB-Dj=O57T+;y~(3erJ)*u)Hov-=Mc8+h%x}z zIoy9_@_49HXQ?OV>WN<46XEy~XM);p$B%U?GV6XpHY@+B!i=kTIkfafYq}TTw4yJ;|Lwy=->dLSmKpxD!0bRcXAleffLZ+4cPOJUvL!^9xOqOPCgOLDc^pXk09SuO zGDa6`TsmRsskYtPw%by4Yzmc=v;W<6n!sBlmGlbAa4IS{B+sM;KwkEQIOY=t{SV`P zcfm`{@qtC)G>80v;3Gh-jxEZE|JN(C5E z8vOhJg58buUN^O3qZd0df`bO9Xuy96C8PNDpbaTfTM?8pevg?TvWSn8tTe5B=D3*x z>t+}?*j(CaPbCf^5F?wj4w!=(u?TR~BkaKs)gO4wV>(ax2`g<~=P>{NHz-+ew`90w?efj*KZxw&7p89Du z*Zbua0eRG-^z&vJ>Xa!YuU?*nw88X(Y*e64btzoOqU3P1UcdPMzu&5Ja&N_FKmYa< z_CR6~9P%POK&tEpHQ@p%dh8;^f4#$a*PflIFX8jUkCEve;Ql*e_VROC)RrAq|eKCfOQ zeY@S{#w+=OPdL8M;SgFmABpLbGr_7!!1|x?Amk=dtb=G2?1M(DKC!PkRBX(d^G-N3 zrp}f#`#h}+gz9)!Ua=*D+z=m7U-OaXZ>BY1in4{LlfxcyHXqeV9tD40WQK+D9}j%m z^C>13-Ef|6tdV6J2MsY?X$SFr-EeWJHmeY$NGv*B`TBAJv`>+f?RKs&%*ft`#Pob5 zW@E908aJC?+Ze1N53%}UgsQuM9of}1NE3f1T-~|8_sc7NhbXcco14mR{3CY?^ zvCLdygT!npk~Q~xs1t114gQ`oW}oe@*b zs13asl|M5Fe!)ka5Z-tz$+S2IYLKW=fDEr9QWIJ3hLnFz5vIR9l>7@30(wRS)<$bPN7Y>p-&E3|>>b9Vjbb=rr z2*|?97#JIn!KV?14z&?)petj-i}h0LF2xRYTaANJA#r6InrYw`fWi@*v^YMF6)EJ1 z3gl51=_y$r&QN~=*x03#D^-uup+S}9W~x<0veh5jB|F7f+<6N7%}kZFs`ySVF`Pj( z7&p6(OYE~KSaQl8wIc#zo3@TOw?e8tF(1q$(_RD@lXJmcZzEj)h?zD8v+-J zh?bwy!tS$u&CTON*(_!>uVXUke4=-Ldbb(`wJ8QMOU!>`@BwwN9By4SFw6Amtt`k6 zk{7J3Rs0D*<g!VJERqR;LCF4Vdm7fOspy?uwF uoY*3&b4(=7VvE