From c87f90102cd6cd4fe69696bf48f60a6f4aeba2e5 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 27 Sep 2022 15:19:57 +0200 Subject: [PATCH] Add more non-standard ligatures in the `glyphlist.js` file (issue 15516) Note that this PR only adds the "underscore"-variant of *actually existing* ligatures, however the referenced PDF document also uses a couple of non-standard ones (e.g. `ft`, `Th`, and `fh`) that we cannot easily support without larger changes (since they don't have official Unicode-entries). Given that it's clearly the PDF document, and its fonts, that's the culprit here it's not entirely clear to me that we actually want to attempt a larger refactoring/rewriting of the `glyphlist.js` code, assuming it's even generally possible. Especially when this patch alone already improves our copy-paste behaviour when compared to both Adobe Reader and PDFium, and that this is only the *second* time this sort of bug has been reported. --- src/core/glyphlist.js | 6 +++++- test/pdfs/.gitignore | 1 + test/pdfs/issue15516_reduced.pdf | Bin 0 -> 35146 bytes test/unit/api_spec.js | 17 +++++++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/pdfs/issue15516_reduced.pdf diff --git a/src/core/glyphlist.js b/src/core/glyphlist.js index c0878b080..1b4ffb74c 100644 --- a/src/core/glyphlist.js +++ b/src/core/glyphlist.js @@ -1828,10 +1828,13 @@ const getGlyphsUnicode = getArrayLookupTableFactory(function () { "feicoptic", 0x03e5, "female", 0x2640, "ff", 0xfb00, - "f_f", 0xfb00, // Fixes issue 11016. + "f_f", 0xfb00, "ffi", 0xfb03, + "f_f_i", 0xfb03, "ffl", 0xfb04, + "f_f_l", 0xfb04, "fi", 0xfb01, + "f_i", 0xfb01, "fifteencircle", 0x246e, "fifteenparen", 0x2482, "fifteenperiod", 0x2496, @@ -1875,6 +1878,7 @@ const getGlyphsUnicode = getArrayLookupTableFactory(function () { "fivesuperior", 0x2075, "fivethai", 0x0e55, "fl", 0xfb02, + "f_l", 0xfb02, "florin", 0x0192, "fmonospace", 0xff46, "fmsquare", 0x3399, diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 74ad3ec29..1b0d41af4 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -108,6 +108,7 @@ !issue10542_reduced.pdf !issue10665_reduced.pdf !issue11016_reduced.pdf +!issue15516_reduced.pdf !issue11045.pdf !bug1057544.pdf !issue11150_reduced.pdf diff --git a/test/pdfs/issue15516_reduced.pdf b/test/pdfs/issue15516_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e4397fa2e7b2c31097fd8b45601a996c22d1a6da GIT binary patch literal 35146 zcmZU)1z6QjusR?gOqePC>$Usa_Y^7&PjL6N62vBym1`z{9EcLAn zOe~EM0m3GRh9Fyzr9KEutVK@@FaVj`0f_+?CYJVKVu0Z%!%rsn-9uye$^3zI-#m=$ zhylub7-0I)Iy|&C53Tbnc0aMSRmFuFfl(5nCKx?h=9kf5KSHi_r_ZP z50L`T3?jq;bD)Ku0Yulw9skK;f1)rmJTD18Q-q!eOvDVV&wNax&(vqj7@n6HpD9d` zo%)Zr{G|4?F$~W#8J~}1c-E2O*$5^EVg~mAmj4?-On7v`v(?OyTYjWKJoh+wb}hp* z55x1){cC&VdDfrtd5J-knBo2bJuEXpJoqqRWQ0(kQb1sMRr5IgRlzUIRV(?J9X0>Pl?q)7}= zGqDt~1e-h)5P5kKL6!y&IhOH%CR)Uj+aR$xD`xetozwh%9p}O9F1(Gch*+ zLG07NPtO0{#sfR#&hLHpd_#|${`b=dfXvNJtRW>0@R0Q(0rap%?$O&o(0`!^uzDo@ zzeoWn8(Z00LN4LHeW=Ix1qUGTC`jPBRssZUA%z?u@<^6=?BpIhmH(I?A2I;=NC)bh z*y`I`7@C8e0Korv9s>aYe2@nT_=iLQ06lJj%pPkq0Q3+q0Fy_$$^Q^#@*mG5AOJux z#?vONCpSLC6Ttp)ul@hn`(Nz`*gwkuf1&t@NglDtJrsEuncugNzxTb}Jqr1MAmjmq z0PZ0O;2wbh?g0qk9)AGt;RoOzeE{yk2jCui0PagT;J?!!Cil%f?f~4w4!}L?0NjHP zz&+*w+(Qn)J>me|mukR0-T*wpjpwlZ4{H1$nDPII7*7ZSa1S2-FK)Qc&-akw2{AmR zYY1R?zzhGy)PoKWXy6ej{7;6!lAi#+XTdFol8df})3$w3TH>kLnHrf0qqI%w~MzXL&l8@%h{*^BJGaV|d!f@U)NN>3qiL{#nmw*FW_Pg8x@-O zKVcAsc;sOW$&dFnywydok%0D_bth=_xo1F~oiGy)SdF+Z}YJ%A2kW_n0XR~LVpFtI(! z09u%sI}=l=%E$@`5X({%KSBax2qt(sMaj+PkHJz2ZC z*tBnKIEVZFj&JEM8)Y)u;bt*cl6F(g+hqM=g#cwpQtmUFQ5@c1?YVRaeReH zJNcnWy`iKdQNYA_Ct2{pSs1GArsbXl_{-2}nwc<-%d}hmP&2Q3R%o<6&5mdn{H~8s zNu9jlF?AxjoYHKBdZkTKVs*G0C^76oU} zaE{z4_7=6>+h0O&M)jGcU!d{7e9QShI*=^?EpwEt0h*sMf`Y&|VpD{0YqX)xcX}|# zC}U!;QMrOXy$uM`@5Ehwe++w!X%kZ~<|@bifl^VdJEqWpL_<(Da-jEJW&D~r_BQ!+ zG+rNJWyVb;KIvslK<|e&h7){euV!Ig^0MfqNXOp8zE(3!GeT1dq+L{8v#=U}rQ2^T zC^Q(9suMHL-Fs-W26YW6IS4suIhY-xW1b2Tz_w-jJsd)$9>i}c-~qGOc>bOwdcDs0 zINbhwj(YSs&W57PX>_XeRk938j_M0~#Xc7Lu)G=urgt4(8)_8P{p-o=6AoUWPY%wh z_&Skn1BGYdL2Z%x<^3%#>UDuu$=bE5pHtNFevba2r%U)zR~|;#-A1j-(JqXK5f`0R zq){Yk5!Is@|EK0eST?0ydb^0Rh}YwrghDsQw1IT`FHDdL*QH({Cknx8v4S3Rd3ytJhTYpPvTG_D+1MrCiOc|KOe z(A6rk-~08QNnGC7U+*RxLU)FhYa+)!i4%-`4d*Y0s(!~`d>-n)Zq?@zTa*nx?$crq z@Hu9tH{@n9TM_A|St3+rp)XR@NBVX}$n~j#MD{@CU_(K(oUbVzysIHwUFDtLCW{yF8+Ixi8@Ah7Ci z$@CU~LpyWVlHleN^(19d;?fze&pE6N4A<8-*0C{$X_MJJ1Z?`+Me;x)1JqOrG&;4- zrXu!3rukE$Rr7n=IxRVEeNFFR>$XfxEln)U4!5+K>JNK^VhV;o{h7}x=-_=B_>u~m zT#TQb-{G}76#EOp%p^})&rdJTUYxz(f|)@)qW08z;exjJiXGk>XZeGt{)>-Ld~!z> zSiE9KACX;=kFY)QG@0>6N3P|oZ{XtvU>EODRkG%$Y&58bcT@I^_fR9_xZLPC>@Iy{?kg&pxl&8{Vtx926j0blg=bweVxIAby zY&Nx!oDER3wjAv6Scn(06z@WWcw=#KoMllzUEPM~FYsd61J4dXZJy&W@^GM&Uo zf^@>~Og9oQ@s17j+B>b@V+&u1qABPoT;_!2)O8DY!ZSpi@1ETycgi;MZnv%Z#ng2n zR%Gf^0Fl8xqmZnrQo8ZJmmOS_EP?QqJ~Bp-JJZ@z*A;DK#_%c^N}r`>c&_^e-IC?#zdi z*{GJBA{&^B-|wo&v$>dD1mWusH!fr@&^GX`b*)?Uv#lLcz|&lTvhvFdjxH7o!F3q0 zm<_@1iE3={7+i~sFB$9u{P(fkvuI9V6ONQ;=>}sV#wt?z56d?e$YczY|{z*xG4F-j@!;{>xD!9WKC~~Us6RiOT+d}8%Z#^W5eSWMWFZfc6qHKXd|GTI@6tu8NxNp# zS|^AT?x2Grf+CTC!;+N>&)H^G* z7)a1i-ZFx)$a2noLa|~Zqly|x6e?y!tEIoV_5eIauXqYP_B~oTHW#n2e;u|gjnI$8 zhX#Iq=d)dgSC)TdEn~G9%>sO9Q2XyU*3ap(^D-ktZ>*s$q>9coJtiW)KVR7D2D=Up zq{`0)@Srj&JQe;%9_3a{&7nqk#PRgjZCai^eG#z zx1w`F$0vk-V}3lG_jyAJIxT#2DFJ&x7B-cWE=&@IkG*kIHny=rRz*XB?rYIk(|Up7 zJ)#BKl@itrPAd*Yq6MtZMXSRDbUm55#X9Jl+nEGDS;cx`ysS$Ak5aM?^}4DourGP0 zZ78JeZ@2CwvVB!;)i=Ft@y|2Jg`F~K8Jkg^@~!ZHh01?{CCS^a)c`c%5i#LG>7X z2rAJ(np~W#?Y;4jO%Stvd!hGl4qZ}%DCy3!k$wMsdo|J;M&xo7H~Ue*3^N55$DLY}({ zM%QFYI#1oD9|F1e7@*tZyayC{$x5{dIek9cpeOstU=6-t`}cVhu|$0;C@c$Rv=ePQlxvew^#1 zxL66jwXT%mY}yQCj54xLENKRxte|@=ZQzz^<{2@{ebx(HPM0wUVsnG zMaiNvwie90U$+7s!)?|7ruZr$*=uhZTI_U*RkZ#+`TM7xIVn78%Jv;Lf8!6oy*xhD z-gZ2W4@}j0Z#X>3)X%(`65H}~%HL{?HYjvD*7V|+2$A>ou6~$jXKjCJjH%9@<7cwD zn*^s4;S19i(J)vvc|Nlt2pS{pQ~tbI7$8S5h>`m_ZPTe_^ThU6_8q*rW4IoeHO{jl zNGVh=73R{YVbGACL|dO}m=G;X$W{Fnp7V%DBk!57Yn6UycLyH>Rs6|21lI%2efxj3 z3T3==7SrG5ci9{1!xKC-R5H<5F5$@AONQJc4vx9AN+ohJ{erdq6w}k9qEc*R;}ia9 z`17kee5lc3Mo542c{g^1AZ27b1c!IpT0}*`T|-_&L-QxUyIcKTP7ag=!?AKEwUx%3 z^1aVA8Uoc!+TBE{K`2t)j4!n!c$q~uRE^V!3Hu%N>5SrPzoE!$M_2&3Q}|?M^|(0U z*9M4S4z>oOVB5OZIqZc-UZ~4a28XUp(%eFSOGJSl|8r&c>uY6TKr6ot&38EGE*6=D zv-itq4Rh>pTo(3xS%nxsHAI57ogED0xj(S&rqX;;h^G?=Ooz;iv|xAd{?&x-(An{t zU;7OsH(K=auKJAL)ETf`>^@ur8#x4C899Qn!Q8@j48SXOThuP1?Vb9D(04KLS_1oq z3`2v2F!yp7p#0xP=DZi_isWT)lqBYcOT+p--`9W7ryweBo{Do`tyvdsY78I?7yg)UO}F% zq?rBQESlwAoMeGaX;3}@$Ki$#RapT0DD0KjE?e;B_W^0ypisq%Bo?X?I=`XLVp8!Q zXo+M}T1~iU*(_P)j~%N^(3J6P+RkO`cqi$OV0N-SzL7QDB|^@@y{_WKZeD-e!LTkiX;11CKbi9csd)?hzz%w#lUQFX&%>6T^~>HFS&VJGPQosZ#Rq`wN9Q^qM> zHG{o9eo}9w>3$k*KQ)Cn1HvP0A||%KuD4FuQ!TE5fyM0_JAKt=!spcJr61~wjL4uY zHj_)Ovu^gAL^X^9t6!?-d19|fgogLmdkLe4;n9J!V+PgM z&LuW5$qRO-xi;M{e_1sges>i54THFK6zVfwo}(T+Nq#f2v2ffjas}INP{mprl1$m- z#)Yux%|d_8>m-QEe(tuRA;zZ8Y{c9%W5pvqSh>T`F&Ac~{Lam5!-okGs-uQ04lBLX zxU@xKip&N^b&33SExXTIDgAzf6xT&Y-&$sO(RmI&lLQ&Ht%R2=dj7wH+DmetnR$Dn zd`11B>6|9aP1T`7Aw`blH8L(uWkquZ_26CU{gZ)~hQ743%am}}EfJDWd}r9z`8-Wx=zA^{4QR9u`0~pA%#Vg z>vh2zidJkS%#IFP=fLNZ<9#(A1m}~bz`(D~^-Y#KM@lI~$>R8&-0>IXfh6sEAZc#N zYiB8o$)Ozl!$_}hP8AYAaY(|dSyaQ5QphZa>SL0_1<#4ZX4|DQ5dL`UcBie;)hdKX zAZ%NR4!+!^_CL~R5ztdHa~|&*Og>aBUnTo9n%ML$c7r6Cq#ayMMbv;z;s!@m`Mp;@ zVuV$Gi1F1{B{SHc14f5bo~p2NeYe12{5{+~*!qITJ8A3u{>qY%R4>MandRv3KV zd}Iwh0Q+Szea5&^3PE@6>m;{%_X|uMe*H-b%7BEK&rs~BSkals5>7Dz^%C4^X(X0r z-%LFa!=i4l-zzf&-}Dkxm?bH8w@l61mggzhZo7i`nni#Ly?n>bg~&4&0QbpOlQZx zo(~S6?J0-7jE}qw>8j_Z0``)Gg`H;M+uDAYY*9DRr9vO5yWtlg)zDSWFOhIwcD^q2 z`Ho)a;1)vvH@NkOcPkAwtA5JNoJ({)g|lmP7HQg|)}Tsy*2`r4nk0W=Uq=7tk_zkA z0^$7#G~cj#mE!b7JTgmYo~Uu$f;3*jeAeZfu%OCfV_Ac9b17 zCSY~EQ5~d86iz}R=ts3HHHH%6R!*v>I&)y1+oN+E{9gPgR!X_2U{mC4#Zuo!A7=co zc(-4$J!b^nz#uzoK71P%)bgIOElmke*)2O3bdm5`zjRHy$nzgH&@JgB(s&*O8R8Dw z@`MQv;U5E82J{2n_p|VoQgZ_tx`*@Ry~6FT5MWDtQ%Gb@i)Z_FqJw|ISy1>X_BJ%) z{BnTBZlV4t7!VOP5;G9$vbR7PRH{4uFA(|zD;QU>Jg2`#AyI^z)$Sc0Mt8VS9*>Aq zY^cZAEL0y@8%~E&^(Dhh;%a;mFYFUvOw{nSaxU`#8Do_CoX?zYA+K*=#*7+N!-@?3 zebGQH2iVKu^W?n1(IC2?C?(KI2a#A=tM0p2&>*Qh=wYB7uW?uP zGfTE{pNNV|v-F#Bybgs8ds`3V*&GR(w2uhJH@80+nFo#u3zcOC%P3F<4C8Q(K<;n<$T-s} z$x5|a23l%OzWdcs$#b5ss`wc&HouPYsh-RS`lNi!l7Vt?%2vO{b=ef!Rx=@~-1$}7 zcQfiHfrI$qf$LVR&F@;}`kf+)A29l7kQNjyQaW#)T_wKZ_j$uCik0$NHYW-%NwcS1 zu~9KwDg~-7L~Jr)_L+jE3o}@TI=c7Ori(~-=EyJV@wpF{{veQ#@HTAWv>Z7}57_TW zON}hIH0G^fs`A40MbUCR7V9i*X(6lI$hlZQ+w%jMYM!69#iVdX zx@q>RIPK%~_R3Db>j$okR!6_$tS)J*lsZ>+*0)f&)72yjL)jQpoe2KyAo9w9X6${X zdK$SM$M^;aN*Bv|kKWQ9aMnc?&H1IuWj%pT&E9dWWs_PIh{z(y%a}^R`Hh~SjB=Mr zZ^Ada`na$e4C~Iu3u~2dO!nTKYHHe*DFv;;VoLAqGHgqxk5`Yw*SEbfO^t~wG`=`H zbWe(W#OBq^-$-3%Fpfo2XggV0r_5E)$Q9xBbkwW7T58pAvV+A}uZX3uFc-mp*55MR z%KGCd;+|Gc8~BT4As_d`^n5}lLCe%eLL%+!gj*x>f}YCx+!vtpW#K0y-^fEm&iY#_lobQ%DV~Wct4=x zQThc&c(dg6po?m{j!ucbiOh)IP^eT+PW2EK9egFC36_QsJZelN{}gt6yq|Bm|4VW8 zmk7m~)tMBMzXOe%plVCPnJlKOC#56y-6nDd8qhoj%dR&Uz~4{P{;AK09rR$GHp6n> z^l3JIgMu1lMMYRULVlsWx6>a`t_3%V!IIvbX3e&vG4WH2?_Af~t}UL;p(O7jy+%V{+?h=TG&>O*1Zp!D?=7* zax2MEHA+L?H@2*N0f2t_w;efR!1YIG8`~nyHSMouGlJR{`X&WFL$0bSFsMD|go(yF ze75gEm{qGE8R-f!m}V=CF9oQ1c)iYYB5PaOfw$)$U68fbZ?<9er`Ie_w+Z{M3mak7 zgsqr6#oKGvX{;%Fs=}C{3XPDO)9D+%tR{5s;)hQaKW;JUt|OUA{}8(ypG?3P^w-U* zY!>~TFfQsfS4!^)dt+bYw!M5M(qHBir*PQz@$cNhh+|GKBR-DUv`@KUXw-tXkJzy$V0|bYYwdCvcInZV-)UJ#J8FTR%`I|kd`AHJ%D{$g ze*}l{#m!g&{nXCw!z=(vB@VJ?plb=sj-bupu&d{1ORz%vci+#f4DO+9&FZYJh}uQF z^fk!QOqLn+FMrE%9Zc7~lOG&%bq%AX9E>zXUGe(4%yTqW=d=0BKQC!NcS&GNV}gEW z^zc_J{Axz!7BXK|72|kbVdthxnWqdUsnf^{)+yFqg_Jhq+TTbdmkwRRn;Ft8xulr* zDDAizWp&=jMjI9(RrrPgbv?N>nZQC~DGJGUNc23*$BYkx0w6jJ5dFwtG z=P3Im6wu}-ZY*zIlFgEQ7;EY(yk~pR%S4vHF6=mPx`C4h<^?nqRqnlYt3me7-(hPs zQg*b3tqRojKGI4`<>lp1nKSMViJFPD^ix^%ne`S){xlS41n0;}{$>$W{y;M@(B&6M zlu?-Wg5mViWzmVpGuFjI&B>&xYeO>1V_I+RXDjzBucclq;0V4QB0+a|JOQpU4d$nC zJpjIp^K3kg-jWzYsMS$JCj&!J%d(^hhqtnZpW-L;sL2cmtOiVqi+@&#WF{Q%(Wqhy zI|aEbP03%EFXO}Rx~sc4%o7Ue4J_=12ETqUF|KE2T*;!|dqSR4n&fmcBC))#nu=Bz zt!B?V0~U+vI;doJHfK^nyqLWG4FzRl(ucWrd`69g^TUNAV4 zgV_4^1llJi7;rddlb;pV`ZZc>NwL9aX1THI^H0QY*{Yq|b1W5p`Eu*jvFuSTQ zvvi~jxeUMB+oVV}qSfCO`v)M3lV546#_8|)by5iZfvI8xzf_iI8XnG z$Qx+^UrjXl&Gz3)f~b(XlW^7|8gnoba)y+V)+-eyzH^I(_1nd2hGW+TzcZ!zQswv4 zu=RL(FT!|$tb;?m!x3H$UG0lt*k6@+$MIXYxc9^sK5J5uQbCRHYe1HE<*&h34Rr;T#WkP5ja=E zBC$h&`GnEk6!3`{z%fJ_xgK=tyOkR_pT@t2L6r+#?|srK*td;-h89f|Oe>=*wD8k9 z)AzSD6?%TQAWuD$_K~1+%5AuQgeSg@!yAX!XiTNCFr-yP&|{)b29-ME7-tq(uNcIo z{A!xRe=^a3c6?hkoa;k+N@**v;BZE}9CX)_QXj~ZyN|lZ5Hn>x0CN#gU+Bs0rQN>y zSs%7bFiG5>PQW1O+AfNbJ$jL% zErt~Wi&8Nyi~j(gw;twdCh|%eSO<3G&Ty8;V|Y|K(IV@9 z`r_Wqx9M&_;qNQs+uR?N>4alz_>TFD zUu0_h*K2bkP22EKsv8_B)IF1`<0q1(@i#L3H2|N<&TTK5I#tMW^T@}|rlQv4FZ#c% zbe7Mfch29fchlPhaj23~h?-y>wf0)iDgNHq%1FKDl+8m^ezA2x(M_S@J7D|tk+i_x?TXSI!Jo6X3{7-l0^20S`0 zRv|{uU-Wx@?nC=NURk?&qO<+h7q=dULJd-Wu$*#7Nvl;8(=STB#PbloC|?BjM90+D zopQK{E;yEk?WTgJtVx+AuUu2}Vv?|yN@3*s&)C$vX2pJFew-pvfjF#Np-FxXPDx|R zy0R66s2c?3ck-mP{G{_~dG@Jo45*7M?Jv#T8H*I@Oa`6Y7Zmg(t;15T!%NiK1F}V0 zPLgpvsOV`lS2r$)CWSSVyO9_U`la$Q3mVb?`o1Bwzq21K?yHbpQ^PVp$kn8+q2&o{ zI{=x7|0@!3`q|GKj^rkj+n8J+6JOBpTY0olX3H~T5t6HxbD~=RErh2C9sR^NR#KJ|6tie*l{SK5OHcOk-wVHH z`m?srqbyP)?k31Gdo}UNa!FD)9|tpkqZPY^Tn9IvSPM7_;8!&SgYl=l-?$Efa=(>l zr!n4UPDN%Ph1-X#a5^&E4$~)?{qxV+2@^3E_%GSD#Q76jdlPEwTQ^^=E12>d zXjk(l3tYx`BURV!-yQMrfUu_=gUhmwvKGx+-L2WITe0au^EuO92L>(T%Oe6-q<5Wp zH~hX5x5OHK{sxYq%XLT0v<833FYI*6Uvm|(n94cV=0s?Y4w5s6)cBPAu<)2XDf)N0 zKQKS~sy=QBHe|THeeN0)rn_C&;bjCc2!G;8D0VHNikT{Ei||=r~)g=cEEN!`?kN$tlaW7>!h2SeH)|k zVCxSo{dojDpILQ2MuoP&QLy|m{W$3t%ua+RvaEy~Yv%#;e3Z92mk)lzWc(`fT~AU(z23YWW$mV~1XH8uM{luw+7 z;s8y>oK6D>|DwKo#~xc#k~3Yo&R(JOr^3&;-3k6d4#&4?KFF9!O|K|c|ER3bfQo+3 zd};Em)w9Hl9+O5po*)~sVZ)4Gsgo6ZTlRrrb^C4FBEVOq$+V730p24QUyn$Sar`cO zxw(1JFHBtSHrx779rX1%2FsvgF~MMqMRU!Igj68_#|^^MdB%Wv#|#~qMCM;DVCPAOGyH;NS$fzNJF;fbgmxDGr!{ z;UBAnq_U1CgTiK$K!Q83)^>6Uhvsy59tb5HE0vM^yG4xIIE{_<{cas2mSgdx2w{y+aPv|n$4I$Y#&1)C* z7=J#@olx4+e~jS8X;HA!!U2L?w!aVsfDlhO<|^NDC|6Q{U^B1vTdCzyqJ}1ygvHrp zu_j6VNBU#EofFf9DFttLU1bH$Rzvu!hAzO{<;Sitidr>E(}De?Ov+{HK7KLL09AM3ofLy{I<;Y(JI!5BRYEj#s96C?=l?qXEc}F zC1>ut)#xqS%Y6mLEAO+mHyC@@J#s(pHuwhB%#@YXu;QU?583JBJI*z~945Q;Obvf4 z6qJuNLVX&%H2f*c*RA>N;Zd z68I2f&iMYTALL!Lk*BC*NJy`gBK}^;cI?J@tZf~@MdhWQ|9z7bA5ABhwWPs^qD+Yt zGVo(s`*ebiRZ;ECE5>Y#;-9R5ExxRHY*(0V@u0Vs!TT7`MU83}S}AX-wW4g8*iN#- z5{4wRew?b}1yxWRLPcd`cDH#!fXiF&S?*APE+DwK=ff%ZWm94K%BWNcTuZV*fPWXkcuoKv&E1UKgT$3QFAd} zA)HWI_2q|Y@elpi3M|*S2fMz5o$q=74URf-uPJ-41pS?g_mFJU8Lrr)3{H2X`Q7F3 zDXmwF( zaXdVyU*NCVk2|6Q3B2n^nLj@Ag4t&`uH@?`)(h8j%zUD>ox^ zlohxiC*!w>&^5vA=JMQ&-fK4^S+C8t(Sp7h;nWk79_b2hAbEj0T_(w*Ll~8K59R2~ zSG7Hv#aD^mzj2zCVWqz71zy3v?Gf_E2ne<_Rn__?zqYpOqHp`BP`UEMxiXE=1oibe z!HtvYJgFakbq5)umu-f{q$VOqH@>HR^P~2`Q_+I8Ujx*G}@sZ^>a~Z`W5&esPu#Z`O#hC!9M0YDMyp(>%n(U|i}# zUW-n@Ee$E&G5ZRZbE6i&X!u}IHUm*r_Rk?Z&jow+9hWoNYTUn8=t>7VRjnW1RFf?6 zTj|;E&JbxXQFjE*oBnEp&iNwk#(I5bDQtCCyxu{bQCGm3Q{?bny$3tC;Adwn-}^-Y zvjjIUdg3-DEbRdC%(vg2f1@;^_(k(r_%#fDlhG!bDC->43V5&Av2CwV#~xGld99sn zDxg@b-!mol3-b@^BUtnERGq4cAXwax!RxYD9o_u!Z~R`kR}e`iR~599O#5TBQoQtf zi$nn^EzhVqn?9RHS&3|`vN8*-Ce?}#nItjQ4lK;{5hmfDp1i=@pFUP3G=GVvp-8)@ z5PN{>TOe$xZhJ#~mU?;lN9^#AExf7JPfXHrK#Uktwv%EHy&`+Nv%{zrn}lN;3$*c;qL^*3KrP zO#;oxNG*}Rk%dH`Fd^pFi_<8#N{JQRHBe>5X;jzhp)scxHaLcESSe4w zctts)qB+;Cy`f`gOgi~ZM4N>5(2V6OE_CO1PI}1iG?0$uqM=*4GCA1=!9}V>HxCFO zG)mhxXn}mk?63?E9=S2j8tdijyh+j>38NHr3?zM^`Z0fwl4RsT($J zu;;ol?xwB}5cUd+NH2=-Dhv4=bC@sovQaNmURL1JcYp4&%Jn1a8K`-p1y}%cQ4nwrrxeKTU^07+m7W>-JYGdsi) zXeN{DgA*{6OSAFAy$}Z*UWs`t;Vj-F50pf6%uA0t^2-IgP84h@sI<>>$tageW1(E$ z!0ndG%8wn|9GvprB^v56f)6mh~y;W%X+juvuu~=!nix@m|#;gZ=NV%PN{A zQmI(dbuzYnGx177)IZ1uD25lLs}8zyOZ=OkxenfzvcpvQ{9toAlkNznPCwu~k1WEn zDv>Nz8ilP)Cc&x&epGhbE(ukkp-0-X2FX{-2X799#QG`ghD>PcXy|HnC(aEzgus>+ zePv)7{g4)vqK-=*Z!x$?*Y)8<$lnKgVDT_mL4 zgyBmjwm6YlbjyfctBVF&A;Jlp&NwiG$JcUZ#k{Gwum3d1{e52D_P92{vDxU@a4$(whOUhRURot6N#TFS>f`5q~d8bAb(Dn zSZlLpaP~e!_woOLOU1F4Mtm(J-7PQJ<_P)8x1(QLyce8ca?`h zy#IFWt!=exvpQK2UqU-vdIW|4y8e!vc+G_Gw-@SlN~S?EC>=;7O_WK+^~V+@WfU;K zYvltIK){M2C(nsuiI2G7!tDHQO@9wd#*^sSZ=PvFLU^I<(&v+^qNmFj>*}&%=BAJd zjX{uM`-+8)QXFec4dg#?P&!UX1x+L>0x@b#q;~$+uy>^0((=m~#H+_?X^ltMp{Eq8 z%}@H(3nqP3jAG?5T3{Qkdvj^JQ28S07nNPyRPIw61k-<9wMbo& zZibI{OgBm9lwdSlVYI1E(IF2;hQn<5$XV;k#ITR=IpAyg_qb&R@1?q4i&8^*r-OD| z>76{r%z_#58Rft_UL}!w(k zl;=YsSoqU2f|+-XZ)_s?etKK?q5-L`&--JPjm#D6XgUp{Vg zqn4BbpExPqOJ>NRZvU31<%KTHNULj%bNYDhX&FjOCk;@Q%<|1A0v7`JLa?Y@YGyxx zTQ~L9bQO8(n9$oDqjK=b6`Z;13#TQ@uiI}hdxU%xfImmB#uE;Xn%?1ug$d{U`fB3+ zy30KxKk3M^f%jOE14Y(BLLw`ef~IojgwlL2Nk>shyqD>OZB2>W{|$-zV#C%9E`RD9 zs0`1L8^+eZLTPVm_Tn`lzk_|BGj(^Y{8voTl)a3H4PhyYTqX>Ikgw$Zx@dT3V^(P* zjVb3>d=lO!?z66>&K7T3$t|ouaL2b(;om!WvMJa!UK+b=`ZMdqN1f_AsC`kBZ43Th zUwRcj^fhDNz1pnW17rO>Ha&Ll0N%6dJ2@=9y3idfEP6rtyE*4XK*?%gv7LPfdwuZd z3nzPT%B{>J9?rshGf`xcr}Gp zL?zX<&G&RK@$3 zYI$MNCT?`5|YJ*p0x6?FVF^3IR#lUIF>PMEK28jwNzSZHB+WcT7$K=P5D_9NsG9uaoSih zO)`Ocn@F0SUPnc=-DyS2Ca#k1(W=2aV3`wF?F!^5(6lkTQ4+}kTni=Qg?;%zgzyBe zsod|+@WKoq#1q?ahSEb|#0^TIpuNz_5jnK;-YO0fl1dwef(oEwq+2_TvghiJ2!z7i z$2X6@T)Y+gJI?egRum+kC@G)QPCC-&{I4xA&w_qqwIl1(CxZ@x9D+B7;eSZO8)mJ0 zm=RJ27D=b|NhEPmF9Lt@;(>OGh}&%m-1P(ennHip0N8pGBL2`ub(=K%1BQ(n>lN{ zy3_I%H>o&5FWxA%`k?VefZMn4*znmqL-b5Uh1>IiQ-fYTU5$DcK~NTh1GSQY7Wt0r z@6m!~zN!#Pm^n>0bz|hQQ@aN+O5l;kY_1krz)$7HOB7G;{oKsF#jAN^w}{D~y<@kL zc{?V5XWc@Qh>cL(N=T)QAj%Hb*0Km&G8Rb6d)4rBct!NhwnHsDSI~D$zvigMLm*KI z&<7Yj(3h`%9oA>HZ@ znVFHfx>2Q@`tYVQyyENO*6S!5ML09ef8Hwos7{2%AHn>kL}(M+L;8Ep@Os6?7q}%9 zRiRpoI=6ZInZK$k`!?)e23~TW#98(i)u?FFj<%dnVu9Tnbj+xa3^>NAVvr?*b4f8$ z7WOggI+ZP0_LYMe(S@mi@nt&N#fjj-`L!Q|xYDXUwBSIhGM_w%urH~<#i__(|I;fr{`86h| z(KSaJV^AYPS`!A8$UV^5_j#eSk&?+%cu=hyANq8>U9@Qp-f^5^`6PNs7BD!l*do~w z(s=0aJSO%^#v$*_C-+6z-hkyR4lyck?a|LVX9d4pEvUslrItm#Jvr+(K~&$2gp-Ps zdu6rm9k;MrB!kC+m$>yp@z!xZGY9vanR)U$aHg11eM_ODrtXty6iSa(3I#Hl)2(v#XJ*AQan)P)z76{=Poem(-mKVaae zYV*bH#&^EeHi{GSD2z!0IN?+eb*e{@8R`DN#@+&|j%HgI4IbPjcnI#c@Bkr5aCdii z_uv}b-QC@TOK^90cL{o%f1k7OK4-l5##8=mr9s@-x;JNm`5cz~N z!mkmfigs`C*nP0~%HJUb2WlRrnEZP#?e{QLp^#0)tJm}9sVOsSru?0=5Re6{Q0}S5 za@MS|b1tuO>@BYCl^5#0WBHjgv>bGcdbF~+V}kdj)~U9vrZUI&;8*44F}eQFBk5(I zEJ;mR=b*Q1FTn)hZc$NXS!KeN1YHr%?>}_6_n5DJ1V{-L7FU0&)wQv^MUi72b<$iRsj}_AAtrhci6HeOTlt5K4s1p(?$h?+ z`sQI3q!-jxVHNn=wOc?t2nq(%`*$GKNnks;z}y(J3#`~ho3pzDMD1tU?8=!>ybL3I zafeU$7Bj*ec07hIi712OI!jF$M*;0{X(joA9Po`1UD=dX96K_3Tzt%+yWzSoml?Nn z1%LLq9>@AZThS3nvr$X`2CCAvDo0aW?2<`tKr}PTQ>UR-!cNHz+@zN^6SIpYf5P=O z7NHCIS)83Ucrs+4LOW^{)E7JOR9}=>z84YDlCaW6!=QuQ65j%MZS5;P9N&!eXInYC8F!k>{-F6m) zQzZ%bKsQ@tJ&O(p`{(4~0Fmi4Y+(n!)X`8ST`d7ieaM4z*aJ<|-XP)cg2BMA4u&<+ zlKLK#=bUrO82n(79-@^UqaI-;hz+4`_2$9nmM0sn)YSCRZ3B*{-GwBa#Z^Q`G)kvo z3)_WiRaa0hoeV*lFAi^|NzzBGNG#3`gMH}=YIVz{Y(*DnJUw{c!Nxp2tdQwM#SJs2 zB`N0COA*t|!Q_GkNPXNZx=PFAF$ZnVgn!)McE7}^N^C}6;@tT%u|KD}91$8%*3#Ht zT1c}6FAw+GR44yMbyI^+b;U6IL(kxpz#8wAa!wfdD?=EL*X?Uhc}7g6@9&F>)M)Ci zRkBwNS(MTl0l3I#IydP6dy73tT1|!+CMnkCuTtB<02H{3x_ha0G-rq0IS& zYx|*Gs1J-TCnL$%o)Ll56~f|~0eiMdSfC?<$C$Qo3_~@!gM^D!RnAXPszR(1-|ox$ z!NO7os?}J3^d64ue7Q1imc%c%#gFtI3D|2zFr5b_gx2H^6@DjYTt)jnoRQc7f6fi- zYg;At!(Ei1&g3WXw=TW#G5jJw6EA)jvrJ@niaKm!&JxJDdye2mu->TJmz{t~eOAf5 zyjciJp3riDNN2HseN)?Fw2Y86GI4`F<+HPRmsAo|it05ZL|-pve=5mbo(rmZG=rab z6wzS=DR%N0i>RiPW7pEqk3oV&IAqbPCf+EWuejAo(B(%)_?1HQs;EWCW1bO&ZTXo+ zLX8yC)r5a*G@?H8Wr(EyIC?^uhzdI#QYcG0O0JN;*dlt{cs;Vcy4PnYZQZ%|AI`yO zFfXQgOaY(vT1qkqM%3v>&1iV4jZ75QfXNHINB!%^UPhX#6lR5$a+|k6Gf@+Gx(YM9 zwEZ<`tc3n<*2%#{D!l}^ZS*F0InYVpZ)ri7fx;^GE!f-lYp8$R42SJJR^my*j9WSM zoGWPur}^XgqWaGm<;d(3@kj3M){m5=v#&u+<|#Ax3ubeceJ1*vcn=#CNzF`ax|@6_(ON-X&9dlvA)rOz zIp#Iz7<(vb8p&N!@oUu>R(=zb&QV{E?aIOeMTnPbDo@l$H8ANnYZf|YK(*7awo2;g zx13F4g2f{V*F3YV3&tH9olj<p-d?eir`6*>&`ymJt zqz?H5_oi$m^7yIU>PJ@0#g9|SpGvM-ixosM8gotHPqQrO%}+O}m%Q?poHS?Hcvhvrf`ZHp4c;f%N|*WzySHG({f4VuKZ`(MKX^)vH1!$=eTf;~PTpvS3& zo6rfHH}88lwPV}Ux)9(fmz3l3<_3)L;jm$PoCpJwriR0oOgz6=n+N->=hQH>yK-rC z^R?E0hX5H^u(Or^l4?CoJ7AmIH*)G4Vy(d*@n=<`#^e&s4Pz`&kEz@e@?BvmKylZ{ zKTg%c8H?sb8_XsB;yS)a-5STXHfK_rtNUrT=I#fEI!dXs5k{-2EUJZ~PGAd^mld=a zbf%Fr+}lCi&9fx+Gu|9cTTerPOYwyO50p`tk;()3UMIE7zS>Tjkz{Fndv6BqgPLi? z+sT3$rc}3hHS~E8FL9T77vpo@*wMto^4oX!W?_(Rfo&Uo>PYZvk;FiN#3+8tfa83* zkhra*bGgDXqO4%HhM*N#Gw>wnM=$|;Qm`+LkiL)~MVm-TH_3^!Rv`P_XeOM>KekY3 z5LUaHm9Ab#Jhdc#lOFe4igX`K`+LK~vY+mn@pk@Z-E7Je)IH1KX$Iy??h5R)frX&1fl7Mr z00d4@z*Fzj+2ZnX>qC*Vu2JCAL=f$0=fI7Z?Fz~I1>>%O_V3MC%8(a49^a4$n3YU( zBH-TYKu1JWeigQh<%vO9;bL=Fw%J8FBscg-S!S)ejz2Nh?4w5w9wf2;YXZ-W!QLX4I`sMGmmL|NKEcb;mX$W8A5AaQq>uK4Uwq|fE9W@APt>?l}V9q?H z;ixp!a`<1ev_D<{3GlH>B{;R?Y^AT>=WT7FqUYtK3PGImH)oiGB5+gYgb=Xv!mZ|9?`45Hi%U3mKmy4ivwu^ zwnMw%`o-P?wt2HM8Xm-q>HgN()zGO>S zJ?&))feD__+K#~>d27X6+iWmoOC8&G1tHbh$l{zuCh>sOG%%>wjcMa!8`F%bvZIN) zOP`)t@2eX$32yL1GuI3O{I}cgnW?^S{0&+h6BzXVC#OA3n;V{uq=AuKt`~noL#hoT z5y}@KHm2cD$tBuJi62fX^cnEV?cca0Rr;{PgzO+&rHo5+jMz)T~XnvZ{ z8{bi@c_{`LerFs*&J)1a~#i|NY-~O2*iTCXg3uT?MYpzC#pX0u6 z4TeSGL3}PCsjy~=DU;qz*xxVw_Jc@evAxXwEQ}}(d8H`cdq6%0?Yg=5>=e7JRSm7I z=tC(Y;%-rKPR*Z@j`s7txhk2iOBX2*hq=#g^PjXUVQA7>3YyLFn+Qg>(Fq2+>+%%J z6KtfQgG?gPoR6T#GQM<%Qn+lnEOA(akLnru=LL}av+cV!a4#=ep3)UZU|=KPz7(>r z8Cf=P3MzFFtM{U_8aKw2$#PY7I5uk_X4f{G#Tqf ztZX%Oh>q=&X+w9@);2A;S-+(#a zZ-goZs(qdv4CWDCC5A=%tRLF3!xkahTe^oTvI7R|!IVNn7l&OHP_7qSEv&8GRcxoE zZf-s~9oRz6!Zd~YJ1mZvWJu~;6b|Chs6?az3=+}nAEp`0<6VWl!@PPq1zCOBIaKb< zjpmr0HVL|vG0RWKHEefDKf-he^@_h$pG(P~Z|hQL5C;ZtF7_*sM*dB$o*5b+Skksp zQKK9;9d~Vh7H(dE=;dAi`nY9&0(sEtPqUXNjh>P1>{6WWLGqPDzMH}^S=mgorh&5Z z@Sbb)&dwV{Tv5d6dk!gX-_eml!__x)PrrH2-RoFvj+VeZTX6<17%z7tuh3Jux)6AO zx#IBLNs};fP?1&%ddT8Jh^5a2_a!>gv3iw9FC#0D9>+P8z^-ny0$DvA_RbZvUPuy# zz9(}?z_s+ijEG53-2n4cF1~37l6|Uq(t*=ZK0R7)%|OfUOYcEdZDqhtPrQrp*_5rm zw^jMCV&wTilUx=TrU(aV_1qpN{+l?bKit={7D_H%WJFo+n(d>c!<6QQgHDgeP7F$% zomfGxsP0H5#WEh~9s@*Hepb$=E#)tSP2=EvRY!j3o78gAp$uu>MD#)CJ(0l109QCJ zANn6=OG)o4-Lp2ly&mLQn;xk&+C~uOd|a#6PxIGtxzVy{%B0+FKAfz;MBqcd9*Rj1 zdKyaJ#g{4KIp zsL>D!N;euD6|N|znF(5y`2}ej2XiO{!|T>7V>K~r)9G~)rF5kCCNB!k=79{WSjwwT z9c-Fkt5AKm6;qB^GNV0jTU96nF}Fc+bu4LUP+Xy)trU_%9Zv@?phAoxd`G_ic%`v# zBkm&Kl_ zK_|rQO?ml3 z;nL~_Bl0gye&nISMU*+<;Ar2XAkN?kwa=06?l@$u?yWeH{vzE6oaf}|e9j>u$z9-> zydaw+C08>qH{fa*=Nu0ARCM1P$suvfIyk8cTFbQG99tC^kr`Y%i(nu@`Z@V%~?Q85tE zhtT5YTybzjP(%^K!P0y`H!DVVz}+Z*#Tb>rY&MaZG$Y3Yw_MiI6yn*>IItZz+=Xg-f0SD+?l**8)( z88=E-SMglLRMg6UhVd7+yG8ZBXd@hxG?E?V6#Gl`Wul07bmXmFEUw)gVAR{k#2~{l z=`;31Xor8Xe?G(%+cfe{1NV-}TUYkADTdJRryj-<_yL|OTZe{CJOI&P7w#GJQ>b&< z7P`x>hRzE;V6AyBO{?s4m;_k@Nqfgq7HfQ}#FCL?Zfjxj?^rwMIp_HseGo*$CMviW z^eerbn&r$Fv2{gkGkDbe-3jHzZSPh|W_E}kqm7nN7;RBIvT2K6@jsPpX8Seuqnn;U zI{wv@)&3LUa&&tJ%n}K5V;R{xUz_yoHBc&hO*(}F^PN!yzH*r8$_+Z!V1$)t`bz4= zZ3p(zT;ekNRP=_bL>P^1Jwp7Y-yyel7S-vc)!2!D{Jxo&v!&6uQ60O$6A@YpiWa?6 z^ZiR$5nVZul8$H*WcMQ}s*lkyRnXRfuqs3!e~^G2n%^2C{XFjhTxo!yOG{qC?vcAm zPwmm$U%L5|DgCihtDhDmBp!qoOb_`KF>N}uq2s=$tIJRqU3-t8~&2_*{+XR(juD~bR!7l;NDdWi%8W`*!Y$lTAi7z zL)SF8M8PTNqMf98!q9l~C2=qutD;|c(^r%akZ+vES7d|ipOPt z;Z~w-{|8Zs74V=9_o@8{d%4dB#RlyoRDld*>!>jeH`mDMYnV!1d@#q-M3tt-+zT5{ zT}9yY;^xCkcW!r`LcX<}VD`HUVxb>BAD1}VBg%&<#M6X!$pUk>uE0A!aQ^`whmHH5 zn7Y}`RPq+YX>!o&zUSV0T>ue_Co`eG24l}nYSYEec$0neJp9TuX0yBL-|73YmP~GC z$b;ddh|d-IB}9`N&Ouo*&sk1~{Ti+tKhL6z@JC|yKpMA5&cF&Sj;qTj)PTbyo-rfh zUA7%ICV~s)`RSE!(#992-e9;dJ0;JLJ&83PjCEKId-bJ9SE?h>7b24N5wc+U$12cxZMU-l6D%SHd=k+7>oWa^EXVsIEy|EO*M z{1LXTGJ}_2u6N<#`|29>HF5)_hp)n!NT+mJzpxO|&Vga10;Hur%}+YApR_ zpc|MS{7n|zyM7bzy-)=3bu_oqq)`Oq)6anaT<(t`K8j4AJq;C|5|Xt|4jpEGzC4Xy z2_9S(X&@uq9ViAK7-MFK+Ahp{TjnQ07NLC`h}xN9m*b;u49)XL_#VS-wCnogD_$$l z;<9?o>bLky3(iu9hB{X6;lF4UyVN5#1PTSh*n}(JE!SeJ|LW@vrLT8pm9oS1L;q;5 zpNh?#&)C;q^z#6x=SKGC4dZ?(&iNX}>=BQ464rKWwL+Uw4f#0sK$Er z&zC(c*;YR;im=DtQ^ARJT*lYj5mHrFRK*QYhLu7w%x(;27`n-FF|n0EiGt2myc6Z7 z8W%PgIr9Ddv1^*~M1*RFHc;I9*Vkutm&_{u(rPvP;^U2!U#Td&;uWFx1rl%U@mm%sX6gw3P9ouJSugM+*t_h{d%U8hQSOm&@f z>R_t$LslcLiq`qqT351a$hoa0`E<{3wfi%u>Bl?O>-zOie#6{vQ%*xHTBFE{`d6~7U--~5 zg-%w#hADOERzI+O^78G3(GDTr8#cZ7K<$K?)tR!;cM86VG|-|7Y;dM9{^kmq8Hi-l z-=9JLMt8hTI~1n_6TN%WkSK8tTZc`K&||zE15;bIqfUkJeODi=_gEh;#uP!fYQ$(& zU}V52SngUJhQ;+;Qo2#$#|QY0oc4k{I0SktKkKhPG{J?a$dJX~#*?mwX3a4r*IpCo zcTdeH#r->z5Qzw1+bR@;cv35G{t`WsG9D1Nc}qWf@QJ-1H_P3*cT4*cxej26Jo-zL z%K$%YFul)a4oUePihxiq9P<)vSn6Zc7V0pq{&czN_cNE&V9FA_5{6Z_4f0Hj3QaWZq0dZ|1VEw zW%eJV#BPQFVQ=)Vpt!R**&z){V&(`w(xn~0!TV-FeMA08K+#D(33ELYR8N~U zs^%-1$1aLWuPsD+M433+`Ab-Vu(#UjyEk5+9vX%}mAm+oyX?=9Ja4tmKG6&8eknnR z^eFRYHXXiY7t`?(^d3_28Wn8FX#|54z(zr2c*qSn?8UT97Hbs!g(c=7yYyWRs*;lO zG0$J2^Oq%Yf0A~w`850SSHs31lS!}@ckE~vk~gv5Uq9RR$oO<-Iu^SVr?zd8)Sc_{%(fO}tI|Iqn%j|LdIM5*={UTZe1ugB7H< zCb)=rMGf1XVt78)hXd(yy6;*ieDdyj_1N=%-Mcle{B5fBnA+?ud^wW9Qu%xezm~Ho znazw+ylb;r059z`aC94CR_P4+aYW+Nn4cH6oc04`sfYg*HZS*Ov;>cLAdOvsr19L# z1J!e*;Jvi@;<`m1dN~xOwOUXOR63tp9~yGl=#pMt)(5g5f|1PuDJs0G1eFS>GO@I@ zHokOo2=pxkL+kN6dr-c(;V%+D0#a*&HNfEHj*784~YZL z7s;6y=qr?7G;Yo_dbo65u@1c9{^A`z-)ulPpMJrc>1!yBRux3z!LrtRTObw6Lc@JW z5EDEX(5^#DSZ!H1ab&)=8gRK4eO^i2%;7r@6w>bBTpdg8#!LIfj-zjMI;3ovdu6|< zSpy$J_f#VKrKlXoFT*e#OA;hBrx4Hqk_-nEa{eAmJS~@*l)1zD;>_9gp>-SqY1|1XaJhp z5vr9l(P8f>>VYM!+Ac(Xq0UX5iG<4;>Urm^E^psQyq|+F6Gq9MZFu%l%Rfzmp*(Tl z(2vZ#hyqAu2lUy7~;1xO1?XPb7Vr`|=dj6gZxPiPkt@im1A z7>bD9FjIv?4M+siA1e1&#VXG+%{K3bhN>hAb!Tq91W0;zcsGK$dMh zfN(B8R0OPtA|n3EA7#Dy6xJi?ZmHS*;H zKl^z*gK;8prprX4c4_@r=vdFQ9S$~HntjcBgjw@srZ77&iv}9AFu95=Y)JAfHHaP- zG*s3ca~r0dYbS&vm7+&G_}BxnNfEjEmT(NkdoK{uYuq^&+0E)66T?*avecbIwYPt0 zvOBxW)(+DdY|SilZV*XiEmK69z9h*fBvRtdCV{vwI)(Ff5)+nlqC;yiyEQJDKeR(m zR*>AoXU0-zc46~cQWG^Y;JY6G)=UKd@s=qytWUNeoB$ z(;dG9-Ff4&)k|P0Tyq3ZckcQ`jU0`BZ##Vp=% zga;^wu!@Wl8ZL}aHWe`n1~n^B4h}V48KXN2rYTagHUo_tK8m&3p@%ru%mFB40C0ERpjTKoGlQENbFA0o7&g@@X{8H9LgIiQ>L@cN23JcahY~tTXs8RpX z3!s%*TYTu<>W8%Gg5>%7fu_n~Bc3Pu%01%{Rq#5RjJk8znS=ITbzaJ_X0V>71rm$TxM+ykkLxKBpMNZr=an3YP($T2$o&&(P} z%IMJWP&GDJl3Gq771>Z1YhJy<3|2H(RH^I^&EiUUPFY=29)YUsC6}D-ryEDLG0x<@ z*T?NyDZ8viRn8x|i#myC#)&I|=DR#l#(rKRlb_QdF@I%lkm8&k$=y$~{AFE1{G!nz zf4@-!%eRTLW|JqX-!AYCNuxfAA>|?m*)K|RXfyf+*7+(K4Mj02BQ8D3T_s*tK_#ki zhM?~l2WIuu@lCfy?Pp5MlnoUbg}igM9fiWVqn+le@0f~$N4BqAy?}1CP*ErxWw06) zdiR&M9DX~7$Pc1}e$K>TXz_)ZLcR5xL_b5zWG=wUeQ9V6kM-4-?N4=V+XC`5aUT0i~45%`kHD#UfF%^nyKT)3a;=7Wcdz|$0nC|?-5jKz91 zQ?4P`0p$-V%v3nKHzkfcb$G%-tDT`_X;2y!9GA%%Y_44Cs2tXPXKZBzV^;2uEBThB z`erWF9%&C5sV}t$VLjEKm}Uxj=Qp0gfww3-Ir~fWbnAsnD?bxGBD$#lgMQ0 zvF4UBG+^xBf-3>_upv%Q+jPRS31vu(42Ucq=yME4vmRp-jC{ zG%h}Q_MQrI6BCEcSfiO*0*2uEG?Z6bk|y9SFKwyl^s9&-M?G;3g<^()aI`MU+|9-l zq&emhvyNo650`E`QpGQDtE)3k`I#Pv)74D^;Y#tL8&(r}OrIR|(kF9@3qM*NSyZhr z1ykP8x1Sdk$@8}bjzL6wYt{YjYyszDoP9<-wHUGpe8JA@ScK~MJKvz(OWKAQ9qeK_ zomp&Bgt}yYtX>&~-r;GYWMRPe1)GA>@DHhBhTv{xIA=P0ytMTb(lmJ&AV;h^7jLE1{997Xx9lBgH=c@y= zXIZ$S?0Sw$UWk=T1g~GAEnV2!2EuBUNH!`>AVQw`g*{x1 zSOf5LxX2HmHhi?$N3``aAXoa<9MKP9!H2g?V|tkiE6I`NoKh=#CHSmu1wMPAs8)8X zq}ZTP$(mg{(t&+(BQT0#x$#JS6U$;(^KIQE^>XWZ>AhtSV?1w&CshzuU@vm-;32rfxMxqU#uze|9a_;3@La!u*Tu`wKjWjLf-fHXyVUrhOTpe zeA=Z-M`{dg|O7Xie9ApiX4TTk;3C zdlOZpt3259=hJc%^700lc^R*z$K0Z5=5I z`e$k%<# z$r^k-uvy*E&!F&zME~os&Bx#0z0rn``-e@msvoSOB{PM?c?u&#>}Hao%3MN>WGQZl zvj@T|h{F1SUj=U@u4Jo=&OyKBlX*FH>C=`1Np!KcDF_z8ilcSJ7vBG~uhQ%=~wR4I-kU_8uTOpNNpy0$J zq>zBp*uCMu0+E}9k zQ9*nB2((5KxPgL?x;vkKqNEn^h*A7Gg+$9862|&zXKeEf^08FVT>#^gE9vFnU2w)L zYjvC>m%+!0{IHPh@T1|Y;W(v2`k5(Pree{Sk;gn&!Az=BRvJIrACj>|5-ei-YsKvo zb5d$?voX-G>3`Z{YK}@;n%gnoa)I|&bGXJi=wmk56j)F%m+wV92dr14?T1#bg@s|x{LY39gy7`&<`%e%A!>V59 zTPjg`+0a@F38K2mq8BD`JcX3$%}tp|<2wZ73cE;*7nt8Ln`n4g35yL7n6gJEH`-$P z(>`+2Bcnb3RUWnLM2R~ydJHHNPN2S!>ei^U*^d$^?E2gt%O4g9ZZ(5@lYdLQtD>x? zs-!A*_SsI(C2o}evM*;%1MOwbB1@7|L-0A$*4ucJ4fI%knY}x{yOg|8dyE(l?2Pp1 z;vy-jD)>*5+SzX?9?&Lu=kfj%?}g58q-HBAQco%2bKf0I6;kf?nvt^${YsgE2X=q-L(Vf@>k+AL>=e zf!BMn&tvf=$p=iN0-2e$Nk~{}LhhlC>g{CmIf|+!XIDp_jB!{x&bhQyKpd zY*3fPM!-<6+6{;|lde*sJNsF(g&7az|8bX6v{*EHwyE)Pyb)8{?l2;AnKlh7!@3Ik%76939M)AN|O~w4Mi;a86mhMPLf>W$~k<558gxW*M4r`!zgI-@&4= z*k2&2oV7K7Lrsmr>E{x;{{Yp?+9q%QYf@gsPiQqz^SI5o{X{Ufs*QOyN__xxZf;Kz z_ODo7J{Y-`FFRrXf~WWboVCeEDuxt(w-6jtSLr$(%rGpLgYP@GBr2mv-NMYTvaaRp zZbhw|%vv7jUkcz=4XZrzCn2pb#JMg6U-l0WFZPONx$1U2dl$2`W4=WNtrT=xrtqsv zu-et*rW1I&Sf-5Bbz8Efz~DiBm(N+Q+83YvnwHFLTS>HZy3$cNelCV1G8*`!H~I=v zjwIgyiHT^%-i!A|4<{G~h6_1EzxZ!N;Gf#RPzI(#T8?y58u!TI3spxlE$s{rPp`pQ zl(72~TMMjRH=rBOF}d2sN*Gh+#5EDmS>Jbs5bn8&UQ_HO)O3dY=uM1=nt-Udj zt>?KaOMffM^=wAi>V{k9F(Owe;wG5MArc@c#?efogq|UMwX1T`K`5CB*O4K{)b*&Y zKyj1eJYiX_IYz{2a*9gio|)UPexmcZqiDoaz)9K5zNLV{#^y;Xtt^wINLof6>b##; ze`hsvB)dM8$Z$dZ^p$pz4}(^BgDvY3=}uj0!aO6NV6<159ljWcNiFd_%L+`llnSqm6{S598iTFkZX%piU_ zXMcD>eSrmxKAp`*;1E}6H%;~W5{I4< zIthw%{F(h(v>J40wlGteyl!G0`_Ogx915NAo5>cVLCgPE()TX8eR_t41hk_CCSwEjt3)QXP0jfp+e`?Df*aK^;!^@X+4f+Fk;@rXrJ9KpKg7v-Fp8;-P=tc@w;?TES)<5I@o9)ilhhtU1(%O&~c78Q!-kN5mIe0@QlXU5Hc_7VMSq1R0Fk8`N4kHB?dnL%8d;^Yy z;g&Z=B$1%A@F^jC(WL9{KEJf)jGqbPM!Q9D-9P9;%3NO;)^e_y0AxuSEECT4ib zAE)9VKpNQ(QhDSBTKUtkg&i8?9IYegdV%-e%HNEV&Pp+>2&Wmug=!(So4JBrgQ(2vQ6U*TSvbF|;QhvQf z`cq#8pjz>*h)yqSB^4>E@=!%`+b|oPyIa^g!o|nGU%@xAK;w+TD{u9;FFor)(c7Cxzc6xf?NHqHECJ85@#UrQ-$hA6fXU1cm*~1F;%0&=%~eJ$0eX&#C^7G zsg?qGozJ!Z@rm-1QvT!8ZVnzMD4qd55-UV0b(BF-=4Z4$Zge51%f1c%6Zg=|jtK1Q zd507hE@4p58}2aa4jZD~I5SHig>l!`xNYf>j43gwr3Id~jm}Mzf*)DXyfvvmqTwK# zGG5{50+`j6-KXi^U8prPHSRdUzdE5{DNT-wbz;}$u=mg1 ztOjB*HVnro2a=?#r*RE6gt1O$DUqghqTV!T!7^Jj_^d>Y{H1Bk@D>8HJL(QByQeq zi@oCVY-ts;4#W#}L_NKV2syNuu&*ft+g(+6n5j31tKc%6oN|1!+yRTY_<+59lUGB@ zA?%mrxnK+Ih6pcmdI$ZevV4!@*JV~&*!+l2dstMAX{T(*H~f|6>;X-!fFHcSnHC>% zLSTPOp)QHvegLb>n2@IpDp8KuRy2BHLbO?f!s6?kl)Kp19!D|^`M29n8v3NOcY?H*e#`v~dU-HA7UXW!t$JC!ED7CDn z)Ftw2s;=>HZ#akoHzdZH5F~JTB#LvI1T%phMC#(r%H&)m>q{N^iU+3&Rz$29lT#bg z_!mZZ<=cNBr|d+MY4kVHEDi3tWKjs@vRp7cOf=V5PVYv9%5D8BoBhl^rdxtPZ(q{|V83*Ykd){KMQeE;-irj0n|K+wHS+O`stI@kMur_{T65ESBB_I~bdZ=Vfhi=?hxuGF4iGK@K>CfH7BFC2qMzxnl^68?y z$2hyI9&@YN{1L(`Ai{n}Yy%!rU35W`_W6SrZ$9)HBC4&XdbXDNOe$6BqOPram6|6g zmw3)ni!xS*xBxe{OEo}$p(%~Cgaor$C$V>xfs^IjY7H9;i9yWG4}3xLF3ud7fsPTCkqeaLJv0Y{PjRh zHnxK+*k8^3n*1*!%+D~Wd`*MTN<2KU9gntnez3hZ!fk!W*H5Crrb#CswZ{;mbySm_ z^>ylelpZ0Wpyfj%XeZ}qN=zALwRId4qXJ-Nk7pg^hSO5*f2;FlmUb3TEH{k4x#%@) zhcrLBoe_AKTUYJ1%qy>J(Fj_608c=#k?9S6rRw~E_M4dV9jg3aD4oRrMlEOkPvB1( zU1LLgV$i>EPXC1<`dt@*9kn+8Ppr`Q@qc550uNi7>iz>m$_S8|85xN|i~#(oxT%3X zu{ztkB;e}1wIhI-%Jko;r2nY-Pl@k*|CT88j$-cc-&Xv;$d@y;2O!_|0c+uSc>V>3 z`d?>E#O&`{-^By}0M%9wfH-?%j(@2Cg^T)b!G9X?KIPvANC1%O?~v^8K=A*fUyTjmV+O{U7>QW{8Y_VP`p(D7 z_|6ZU1LJH!V`gS2W@cw2W?|w0_y9uyes&NW&@%zo0G;(;jg^u0pLxuHOcr4LpB}K` zea`=%_Rjy_K%jT~0R2GE!p`}R4mQqryE*=`haCt4hz;Ol<^*g25wo+s>t`Zn0j}BD zfuOK(5OVR-^y?Ei55 z7w)ov0vuo!P#6k=fLfq#fHNaFN)1LvW@6yL@_t}_KY-p3Z0`ql-~i0gU||7K5i6L% z2`Rw+Kinc*>;t{Pzb4#QSapEMTW z1Kc^@KmVQ!kbuJY-?aBH-T$V6IDv@1fBx@WR(5tER{u?Nu+s&wyY1lqxl71dTRRZH k-|zqwZ+TNUL%^qhaI1Cg9R6{V1^5mz!jX{)NejdM9|P`d0ssI2 literal 0 HcmV?d00001 diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index a5fba7314..591f94624 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -2417,6 +2417,23 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`) await loadingTask.destroy(); }); + // TODO: Change this to a `text` reference test instead. + // Currently that doesn't work, since the `XMLSerializer` fails on + // the ASCII "control characters" found in the text-content. + it("gets text content with non-standard ligatures (issue issue15516)", async function () { + const loadingTask = getDocument( + buildGetDocumentParams("issue15516_reduced.pdf") + ); + const pdfDoc = await loadingTask.promise; + const pdfPage = await pdfDoc.getPage(1); + const { items } = await pdfPage.getTextContent(); + const text = mergeText(items); + + expect(text).toEqual("ffi fi ffl ff fl \x07 \x08 Ý"); + + await loadingTask.destroy(); + }); + it("gets empty structure tree", async function () { const tree = await page.getStructTree();