From 78a001b0a044c2ecb0a882fe92ef91027cb433a5 Mon Sep 17 00:00:00 2001 From: Lucas Cimon <925560+Lucas-C@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:32:36 +0200 Subject: [PATCH] FPDF.table() now raises an error when a single row is too high to be rendered on a single page --- CHANGELOG.md | 1 + fpdf/fpdf.py | 4 +-- fpdf/table.py | 29 ++++++++++++------ test/image/full_pdf_width_image.pdf | Bin 25124 -> 28690 bytes test/image/svg_image_no_dimensions.pdf | Bin 2001 -> 2004 bytes test/image/test_full_page_image.py | 2 +- test/image/test_vector_image.py | 2 +- test/layout/test_units.py | 6 ++-- test/layout/unit_int.pdf | Bin 976 -> 977 bytes test/table/table_with_rowspan_and_pgbreak.pdf | Bin 5655 -> 5653 bytes test/table/test_table.py | 27 ++++++++++++++++ test/table/test_table_rowspan.py | 5 ++- 12 files changed, 56 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b5e9044c..12ffcc0f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This can also be enabled programmatically with `warnings.simplefilter('default', * [`fpdf.drawing.DeviceCMYK`](https://py-pdf.github.io/fpdf2/fpdf/drawing.html#fpdf.drawing.DeviceCMYK) objects can now be passed to [`FPDF.set_draw_color()`](https://py-pdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.set_draw_color), [`FPDF.set_fill_color()`](https://py-pdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.set_fill_color) and [`FPDF.set_text_color()`](https://py-pdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.set_text_color) without raising a `ValueError`: [documentation](https://py-pdf.github.io/fpdf2/Text.html#text-formatting). ### Changed +* [`FPDF.table()`](https://py-pdf.github.io/fpdf2/Tables.html) now raises an error when a single row is too high to be rendered on a single page ### Deprecated diff --git a/fpdf/fpdf.py b/fpdf/fpdf.py index be7a3fa54..58a7c567d 100644 --- a/fpdf/fpdf.py +++ b/fpdf/fpdf.py @@ -3401,9 +3401,7 @@ def will_page_break(self, height): Returns: a boolean indicating if a page break would occur """ return ( - # ensure that there is already some content on the page: - self.y > self.t_margin - and self.y + height > self.page_break_trigger + self.y + height > self.page_break_trigger and not self.in_footer and self.accept_page_break ) diff --git a/fpdf/table.py b/fpdf/table.py index 642c2d40f..3d2528810 100644 --- a/fpdf/table.py +++ b/fpdf/table.py @@ -189,7 +189,7 @@ def render(self): ) # Defining table global horizontal position: - prev_l_margin = self._fpdf.l_margin + prev_x, prev_y, prev_l_margin = self._fpdf.x, self._fpdf.y, self._fpdf.l_margin if table_align == Align.C: self._fpdf.l_margin = (self._fpdf.w - self._width) / 2 self._fpdf.x = self._fpdf.l_margin @@ -220,10 +220,20 @@ def render(self): ) self._fpdf.y += self._outer_border_margin[1] for i, row in enumerate(self.rows): + pagebreak_height = row_info[i].pagebreak_height # pylint: disable=protected-access - page_break = self._fpdf._perform_page_break_if_need_be( - row_info[i].pagebreak_height - ) + page_break = self._fpdf._perform_page_break_if_need_be(pagebreak_height) + if ( + page_break + and self._fpdf.y + pagebreak_height > self._fpdf.page_break_trigger + ): + # Restoring original position on page: + self._fpdf.x = prev_x + self._fpdf.y = prev_y + self._fpdf.l_margin = prev_l_margin + raise ValueError( + f"The row with index {i} is too high and cannot be rendered on a single page" + ) if page_break and repeat_headings and i >= self._num_heading_rows: # repeat headings on top: self._fpdf.y += self._outer_border_margin[1] @@ -372,9 +382,8 @@ def _render_table_cell( # place cursor (required for images after images) - if ( - height_query_only - ): # not rendering, cell_x_positions is not relevant (and probably not provided) + # not rendering, cell_x_positions is not relevant (and probably not provided): + if height_query_only: cell_x = 0 else: cell_x = cell_x_positions[j] @@ -483,7 +492,7 @@ def _render_table_cell( dy = 0 if cell_height is not None: - actual_text_height = cell_height_info.rendered_height[j] + actual_text_height = cell_height_info.rendered_heights[j] if v_align == VAlign.M: dy = (cell_height - actual_text_height) / 2 @@ -848,8 +857,10 @@ def write(self, text, align=None): @dataclass(frozen=True) class RowLayoutInfo: height: float + # accumulated rowspans to take in account when considering page breaks: pagebreak_height: float - rendered_height: dict + # heights of every cell in the row: + rendered_heights: dict merged_heights: list diff --git a/test/image/full_pdf_width_image.pdf b/test/image/full_pdf_width_image.pdf index e05c5442f94863ae081fd64f7f422a64a8789ef6..e626c7cb0b92f0ef7d050f949fe0771b0a7ccdc0 100644 GIT binary patch delta 27702 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 mC>$<Y% z%`28|1`Ryz9+5g(c0`3LN>rM?q=WLtTecjbo;pC9#~Z~MUK&czzHfE(t;2_zQs9o9 z1?jyh=KIsrg=JN5^+5p{nDD z30l#4s*L`A1IQ|M{GRDQ$T8Qx_uVlv=4_)*MAKOG+-x3~+#P$02N29&-3BQUD4>oW zk(fASXWmqVwh+-#K&qvy);j!dxcPZ#zt-*begiBIEs6*f`KcLvUgT)B<|kmMEe0{k zcp;i-M_g6?iamY^yvygRV>-schqpZp%@X8qWF&a=XKP)IM*VS0>4%C1lK%U3^p6?7 zIN$gxOL;grM4&GL$CSVDfrZ{Z{_dI~nc0*eE*ORKFp!~XhyZjd8Z^`v)vzortPZc5 z$5ssC4-hMz^pqpw247Y`F0LSZmwHax0jJH>7w^r|HV0NLA{m~q^Y-=|^jVTiBow^& zASE|sFSiIlaGAG;)OH^cLEmKEbg;jVgM+i)=AEdZ_l&~Eyov4(raHd6IHS2rZlo&?BH9dXXTH|pIEmat@#M=GhI>5qO6&tF;}({*LUvGvy~SrHQc zm@W>?>h{VjdFJoW_C{bnK0YeQ%jeCB0UdP!nS+W@%E7cy5{wwlKm~l(H+TscT&CKS z0Z)#7HxqV{lA;v;=ZSgPWdUDN_*o^ivhvrjUq?swG(Q!Y1RtifZEW^_{>1X^>EgKi zlg!~dn^{(d52By0ur!Y}V1>t?XIobd0>gMwZzE_gfBcJB+nVlnhF zsYn48$bu%I5%Vmd5&!NdphPHC$y|0(0?#_Ih8%C{_91cmsy$Hp<%72V$}O}*SI?C2 zk|qCBa8bscVIEszLIO8F%i;FNk{OKq3&8&zJ;wxfQYHp>YUt6z9S4#QbT*?Gx^<#r z#;Z=E-QO@I{y{=kVX?Iw5p-T|h1@`{aYIc}vjs5u1t`Td}SJhP*+D3b*82Xd4+>a3Pvwf9db)o#wuf!9a_K;y{no zP2txHU&;Z+y~b(hzn8~|~pH^0V{L-v6Sfn>Qw5+9wHNDCykh|N2ok|lbRSG65Q)YJU2xw0e4ER43BdfIF|7QjiQiuVV;?X#k7S$Vsy9J>j40$0;E2+s9(Y)!} z3m5ca^ddYeVd$l%I*JBziB9C;*=(3diMnE ziZ1%}*T703lZVP@IedS^AHm6uzVGJL{>%gDXo|;Iblkh@fBblOd_?RaV%K}fl2zsc z@9*y`A5J~^knI&rw~G#2xhY7UEN!{iIW@Ym(YLD@m>E29-u=b=LJb5roONK_s|Wv|Hse`Z-qfZN#n0r|KE`t zzVUdiD&j>&pmG{o)S{sq)J`f~;0GYnT7+2IC46BdJ4M7I<>WQM!?VEq?_Jw%E!Ew= z^m&lK5N4$HTz;ZIS0zL{Ja%0Vx>180J)5iT^g%xTdmQr`x~`g0&@x;*cZ!r%C_Zo& zFYw%@hl^k5bFsL{&vCG=*fJLy-TX zAGj>R6q;Rinw0$KB1nV$GvV2FBz!(Ww_z41bRofxE7JfG^4kuwRQ=>HGnvSm`Ih5Crqh!smfWq62tBuBP+~>U7SLMo_0+4g7pXQpg z<7+0zt64tWj}qBb6h-=G`><3DWK7MZQn;V;>DE{;2%ErH50AC4ebHTM5i@#@P*W3m z$N6N&BFab{8krkgL&u}-+Y$u}%f#j5rjCd0s!|7H-_91qCy@E?{p$XBz4ym_=2-F< z8#E?E-{P+$GUM9{*TK|Tdsn>2pu35a0I;NcpvdF^(g^X+dyq}tY_gNb91-o|B+UP0 zgoo+l2BGAb5%IBeFwC-1D=^OoX2C&-hdE*d`R<4hIbsjTRnefd&*OUM6kafQwLB(Q zu?MSDXZG!|ezozV38{9q@@P)Jn)NVE4SN0YYBW=r<_zgnHN-7*ziBoRgndHL-zscR zQEv#=<}X2Eke-Fu*nij1`A4t)Hq(VbKg;Yw3$J;3(=3iB>j<4_u1nkco|IQJPJI>j zo~?P=)MS;c+35ak=oJP03)0=IbrU1?d9x`Rf@+f4SK34*25Lg+zIpsBvOEhu%h1LZ zm(x7Q$5rMdi03pgmwb^)P@mW3wS$g z)|=Rdz0~1TdKLQDpqj})r!$Ss0SMPWq;)F>2!k~Zx9e9-kn zmPD~>sosSr1QL-*pN&{vHbdfyB>SYDC8S1B?G<^14l0#jk9T@l%in>*ZUZad$2_eH zK*`L=b?dD!Kuf>8LLj>^y_qa*amnthdUaQt^wP}xaod)^PuUDV1`$`OD1*q*qul?r4jgQ)dzI`I5_16<&w)5q6ru4>Bb=Y3!ZHlfD%VJ zV7nHMJ+q3`l)u<8?s}n|%2=G-5Ky_L1N1n39$Y)zV88DeDl_QAuBEo5bOw6W-Jn}f zjsDLp_L8LYQ`g!rI<6cSzIqqO<8fua>2u~v=}>`lHTRp*Ox|P>eeHO z#D>>#YpquI62_DYdpUA?d2^P?;uM5M!pQN9ihqEr{w>(n9zaPn`OUHfK0O+I_T>iV zBb+GGeih!Chb_H5K#dD29q;&5#hbT>KGhRyGHW|4m@DDbXr8N@i(BqrXN*E0=9NiK zIrqS~HaodlW5?`XPaJs7qWzU;1cNIxlX53ZL0O02=o+Ck1%3*BNsu*DJj1JHXD(MV zbK@)x2Ig%;&8qj|=lt8U4i$-1TMPToEB`*5wVEbm-m@Z{WZpuhP9RHAUw3#}*7)V2 z>Af_462U!bS33tn=08Gx`^>H*7+;iPLvHYg+54o5md>haE171s7*0aPs>njl_j!i( z?Mu-@&i?jwM)ZZS?&epSjY@+$*B+yS1n_-$_lhugSsi2%rt@wxMA2Vat@<_!|J1YYgGtExcKnl zM7%ka`s1bWnK+&i!-&c3@&UYR&)|vUJZk)zW ztqG`(+?$-b@I0l0_-mtVAAQGnJl;35YCqkfb9nq+pb8R`cMwn!w%BP41AL$piFN7y^Uy|qwq;UYdMg|=EYQ37?GLskjlxe* z{)2s{{q_Tgu^O?~yG-F&?70Ld-A^04D~t1(u2|hB@yH?wo7Ig+Pj7ZZ7B|zkDBML$ z7N-1YRA0gk&yM66-;dls|7nD7=Tp_l`__N^t1P15w)QW4CS5_Z>>I*+WH;8j?@C5& zD)W#j8_Ym7PjsZjmnSDrfZO!+^@LYS80kC)h0Wy<$0VE|u17j0CV<1bVma%Ev{3V57jU|^i! z=;GwcB*4Isn^#ig9^@Dq5gDbxz{7rtftNv;fser;F}b+FH`pzN0SNN)^HLcwz_)7* zj3D~5F32oQdAxu%xuB>7NFM-Vm6X)tWFY+nh>OZg3V`B_5kR&`QZ|^K17c@~1ZOz| z*$qH8UrA~ONH2p%vZjKOfq{{NV@iHfszPvOaY<@!v4Uq_vK|A}Ob`%vFG?&eE-6h* z%~Q}-a8Jz5O;j+_Ga}K&L;!FYg2CrNaM&=4ok55pKyqnO8I;M$WX!+-0HjVma%Ev{3V58f zy>)z4XBPjTB{CY9$wY7o?mfL&~+jd)Obn6O*7ATY!FBEsTK=8P`ySuyVB$)}& z{r&Mf=RD87b0^UK?(6q`{SL{*TJq*|o+FRkd(F&5>#O%mN(>9|_YVjR3=9YiU=|pJ zU$A$yAh3Vn;2`+1AKD#ee#S3u-!ZY0y_zI;>3UP+0xeZ*6I5Zf*i=M8l8xX+vXUeO+B` zb#--BRV7$OWkp4KSy@>rSV?hFVPRoGK3E=FZccVqR%T{KdRkg)N=kB4LVSE|Y+Q86 z%`<=dcK&fArC-X|mUro-Z$@?Jkinn_Bf+D26;AyA_s}rrht`@AO zsvS9s6^1M!w>xv*)uqTT5zthk$NyXmEdE0QBoe{d#+QIa^mJV?%3iYiU8f2oI^~ z1>nG{t13t_U_%2ufi9N-K{S*tJq=YuzL==UNWz056%-L29v&7J8hn1&p3pLZuQ~F} zl^T6dQ&mY-XR>KZZvu9F!2W9r#!eM3Vdyz!v{|4tK{f%9!lsE4wh|-ab#!zBU$>DD z2+{ZlPFf#*`})PhJN9NGUsKSDG@VZ07#{_E$w_f>Bw|uh3TT*?o(7o22@-#zhPind zh0NzgV8~032VyQM5m#4Nn>e~&pl(LiHWc%r*4{saLbipTI&os}wsR!_n0NMSOKWFK zTx3*iobQ^a=glFTi#BiGJbEFUKX1Nh3-BF{y>eTK?-KJ~=q=hJcq3a3Z-Om>KO^js z*Y*{lhOJkRpE$Yek2_{&H8+1wrZv~sCq_m^$E_Z1?Wl1TOv^rK!06?n=Hg=f6u-bX z_9>Z$KG8V42!@|&TwF}PHZf=W$%i0==qk@$zI}14Pp?_wrAw8imD%Bu(J?Qno!#8s z-Q3*ZU8}{nzcMWu|CE0vel#&x{%-nBSLsh&O@HpDb@~#r+(33@eEfgz{k3M%r$Z|8 za-#t7YqiE*>ppeHjF~fL&YU^pzuWW~)2C0De1+e@Z?W&<7x>{XY}#M_VEXh)E*hM0Gap#QA6*T za+iVZwjTCo5pdl?59mSu_Z`taCF#&^hH$$4auYgSUp8g*Xwk(xp|2@gUteb;b+OAVc|<1-Q6x%VBvo#Wa*<=f<|eCfiX0e zqFEYzXkHQM2#=Kwsv9C*3(t)#yR{Lzy4jtZo$c-MA)$fO zUEHRnk>)(T33N<1DVsz%UPOqF)nlm398QA9;F@`9F%}j^MsS^&!@+vu-CZ@$_Vnx8 z^7FF}Tn507w)TJ6piuv*8n@Y*OurFyf_UW;JR_YHuMXj`+A=s3x+W99wi=aVY)FT# zQddugr^e-}E=Yx`DM|Y-n%%zH-rgD=7!okm)oo^Geu2;vl(0cpHc~q(6^yQuJGR>B z*Lp!Z2^g`pNUE{~4Sh;%1V;^BF92!)aG)tRCSuQd0BnD2YmEvF@dv+G65YqU-2}{y^7P#NAK&`(=6$}&<&2Klu#Kut zjE_rgXlj2n35V9!%EY9^ymk)P(ZQwb?CNevxx8ol{+mVZ)V23w2a)ON3V=FYeSrU+ z?WfId-GF}}00uHZOfF?1W3fcIX+0(`Ug^s^KX|QRJ$zMN&84@eJ6T)X*x5RbUH)r& zGqnP2)HTOWa@9Om-$?Ob42aH)4jSk8dzorQWfFY)zd zk46{k25N8JzVX{hvzs?so0_A8LIbC2w6n4bar~79Yp~jpIoZFEK-q+;2Qg81Zn4Z( z_`^o|rKM5|bf%(?v;{@0g9TXNg%~d-qvk<#I1cZX@?yhx#;^N{R4zmm)7uOVg z=xFQe=IZP^dfYfSXJ;s-&I@m_wivwH67QjLUEX98t&nHC&nsP>Kh%k66c0V6i&f4V zN9}}(o=%P$jry{VdO}?`1PK9N^}V|3nAv~L>#dEA(ZOLs=;Ev*4Bzq)7dOrPE529H zY!x|7R7@$g`On)pL3#K7>P$#%oVh1U3VKO*4oh$^*Ru`jt^{QL#{2slK>^< z0b2ado{LHi0P;lA&ElcX)j^}ZGc?rSKVay);q6j0fE~YXFoytj1Jy8<-f)Bf8)Czv zLNHNh7vr3$BGg6e@G6cxU2E8b<-?sLG@~D8gFSGwVF>G8|uYLS#xviHFsB6r>~mGt?hqF0JyxR z4anMAbpX81uD(l3jnfB1J!~q%g0=swO5?C|kW>R3=*N`;=mSAP7jkjc`3vXQbHMn> z*a!xQ8Lu)76|AqoT2UQht<}tHVx_G4C2LpB(-qBp&c+g5bH@f~kR~Lwt|^AHXs0ki_e`uM}WOk+c*7UgTIUZsu?MJcT(5R@eYs62VPY!jKI-J^vZw|pm0ig=2HQGFxh`J3 zdU|v|sGwe$V{)%P;^?9oyRTb6z-*A2J`Vt&V1Q?TI%0O+x4EG{DK;@00B7cwVwXpN zPd37+tE)fd3Zh+VVYPqa83$LVQ>{%+BifSoJTHxAYyz%|bf)aQ@pfENJpu-Wyi0GJ$~7(;-xP*5GAann3rn3I!w z`y&@St;POkq0C0J`7_EHB4PB7~;9X9q zWAOk;w-Lxy~Sh{O%E%Vg6dX{wX zHoa3)S>J!K*Ek&qz~26J4^*(1)`Nr;tQ#;~MHk;At^w{${$aS~HxCfe*)!xW;u#FX z1*4sL6rVW;fWB87>uNL8GLmL!J!a?QB2{gDw8qW#8A!AB+uYsUo&H_RW439LM(gC) zDN5JLs(x2@{X9pFHXQpoT?Vq~EA6tuK5CF5&vr=Yg-Delj0$)S4tB32;Em&xOht}17dwUC8+xy%}tNGFh$4Y-s z??9k~v&+m%bSnTl1E4^sW5bOBesE7hH>5Y3q5UTZ7ZTt#F-GI=`ZVRcmLIh4Zj(bh*}|i*y;kd0)Ge?HsYJIz<>L4+>gEO* zATJGktPKtg`(lvX<784ey#c&x82pEWi}TC91UM`Lf`UIBM8MkGyzHE`nQk6)3UT!j z+G35T_USe%WYw=|J+x3FIxxHYJdSL!BL6ov#m}TL&`%@Uad`A~4vv zO9$`z%3T~kystO0yTf{eU}yNBzJE}G)>AJRbTIo97}Ov8PB1C){1Q{9H;y48CKs=D` zu-3zUT6zz;wc$kd2${ zcMS%nV(lac7w;zgOh1g3WI4H51gw84%rDHG>FznV7`v2~ws_akZqIb^DNe`VwH}&} z+Ndw-O_+xHdv%4drmX8ZH$w?YVzZuQ;Gt}Eai_^BgE4mx03ANK4^+eO28MuZl?(hC z-th2NYe%OQ1GGzH5CPAhJAr^#5U`*qYqtC7xy2Y4t?da2*u|%=J&9f(9v*+EnP2-u zN5g#1$?My&`o4jIw(NsTlr~TZz7;grn;!8ID3}+=y}E12efr0Xg%GZ z>E^2?-95WpJw4{-_4f9FQ+0n)-Y!rET^z^GTef(jqqUv0i?eo1w-678Y!6)2b#iiY zbc8oY$H~p3{4W2VqvMo9gQ4d!TW4oS`$+M$#|G2Y2km@IY2+BandaD z8xT|5a1JQw;tb}5FU}5&b;IDbdsk(+{EXjp!uJJT5GTnmY8?R4&d$yO{y|Sw3>)+# z0MDPID6X%rg2{R=0+u3Rdsn<8%t?B>SSo=;90PUPes3?-ejIjvQE!fSbjCGyjkBHe zvI8v!W9}W!bhou*h97@ztzZ3<6!fu#FKqE0&E`3bhP%BN9=Er3bOLZ&m(OeO@?s1@ z;=}+i0U#*o1As8q%%ANsW`1ca25wiyo`d^+`g+6(#L%?^2M-==6*}R;drbkq{Og%V zpM2x{(0OL_Fw-C{Gs?y6Li^w z8{|F04u9&O99Zk5(89E5qJ0Q-Fx@o z?cTlnXn%i_@ed>Hzy9!lGU0!v-^9|4PFH)~_rj__%zQ4?;vyCSdcCt^#d~1ykFXEW z@WY7jzsKL-f6vrLe*M20{OT28@4alx#$fFY-;3YxHoJVGrlO*%wzh2U*a;InjXRm9 zyOVrdR^!6z7?v_9w^(r<9USZ(?Cpi}AvGJ*FKmDCYa6NISHjQeQ})3g0bvZ@yn5-o zU1pcg*OXUO)ztyu#EBCpOq?`nBE55)fHr>o_;F-o$BqFTJ$kgKrzf;H?(VdEOI452 z3;4`jcu97m5AaXIO3c4QU-IvfIZHk`K8|DXhVP|scbQ#03kufM)mO|LJ82^P{;>!_ z9Aket4B&W3a7a?z;$}Sb_c@^1a|tCfN)=_237-mI+ekI#-(-O3;>+LeG`o1F8UX7X zD&~!wH1Bfwf3Yxbp`q+8G$b?xEm*Li|IZePfA~w#F*hUNH#-opysWyR2>>TAt{kH9 zH`Y^%FTob+J@$;dE+N9sbqy#C}SqH zcOO#h|8Gstb3d)uP+@?HVYY`OCdj3SON2-LPA^mHHA8P+Q$$x** zPp{{V(IBVOF+c|fc*|D=Y;LKUKXK}^D$_oI*+>`PeSlC}nMaa82yGOc70)5Iq(o~G zz&OYNbpv&`Z~K0=RRpY^KWQ2R9Qk*Wd+|4$2sk_})K#(R(vRf$OWz83Mi&qAb#wxB z;DEP8!1|Wfn)#EbKUy_p@^|*vHwu4y4G&rqd!wCxw3ha6o&N5h_wU{N-$IDHYKXTa zBH(}sc!vR=tSkY*w%P@gXFOId`j&i|F>AWyq|Ef`)3{BY3UAE3!05$m>db}9U;b#_ zKHt>Zen=nxhw&)suZ(~g!~$Ty5wN19w4trNZh_Z~$4vo;b^9m5Z=M1+dGdecNm%!& z=8YXYdJHRe?(C2fRcaTQE_-mNm9@ z)Ge4gQwm6k|M`0AOcD=OLsa0Lgq#3Lbs5Vb)<8Ep=j6)U2}f)7?4NS(-g_t*`!Mw1 z0J(y<0dNZ_SYBM(*xpgUVCsLYD?o-v`U&D*r{h-lv=ggkPRGj984I)Mf#)yZ9BtDpEPL9rW zBoG@uM_ed!vY8P)VkCd+^-}!=4UL6_xtIf9{elBFcXl^2K*^jR8Skf!n>%OD925}{ z|LFsE8H}BF$AjhP&!0bc{@mF!$B!I7u>03}A*( zw12FV^@F5fX<>0oHvrBCK;~bA@Oy{vAs`WghO<`PGeZ5h-fOsflba&~atR&IJ{Tbn z0uD$4S;LC`;OS!}1w}30eNEnT7Cu)axIzE{zy)|Fc|Ly;uD*Bo;e-$LE`1waoSYmO z9lTGBAAYEQQWxt+xR|0C0MCGeMXfymID6sqHKsv~faB@7G@YnMKms*4x*#XpZ;uHNs$LG8teDj$cTG z^U=#c+{1q<681U4Kd#@fVZ+a48`vMC!M6_gHZCCfn2L^e>+TzL@IUex7F^4dH0!fQ zDp-SnTcOmI78JJi^#kCd=WC6_h%qAI!i9`*o(O2T8}7yC#EiinR~B%6z}m(dOs!Ts zoVw@hO6oC42hRe-iT4jg)eqh^82MN$ZK5Al5+i>gg6xk7|ib&9B5uNZ^;X_(iBH| zFmD20V}T+rSTIin1j7HU^n~u3nri?g-}10=q^Pldyf@QT3TU_c&s~lzqU`O}OA~*F zjSj|Zak!8B`v*k8D?S$qusAQTb8xVE(R=_LQNu8b7cVA6@bY{q;QdY7DT0qjkNe<@ zFFya`v(G>M?6Xfl{q&Q6gMIu}Q`<5T(B9s`?vdX73HS+pW$(O8=n+UZ#)ubs>CnZG zb@l10E(?IUd0m2nBTEDTE-5%*pN2>qh`egM@47z3@j$ z)Wag+6gCJE(D1N{daIKZ$4*^r7>t}~XZ)U>#($t+qFuCn|qfdG;&=ECfJ< z0fJ=diw^-DyJQLX@uG!4-7~KEBB0k4UhD{vH};aH&;Cg!fb!FLPH+PY6gzrTf8IC3 z!+jjEPgi;7%xQ4(X>c(IG)XfC9wcKI8wcS}BNX(S!owI{%-5Qwp`x2Ajaqx<7VNO< zmfLUv?ZDeExAYs;wQzgBR=P+WQ1Pz5|>o0G>U4@>AyG>>h(26ZOMfJWk|W^uQSOf;u3v$3?*5;bw19L6bzyUCaT8r3y|bKrxC(ELuXbt5cIV?U-10HlMN%x^kke zgwQS;F9h!u71V!`f>22+PM_j{Sy?>@IDbSfHkblJA~Xq-T`tq7dQFz(LDO}0EXH{< z#>c&B^DS@k-?o8^$PMaKsyF_>f|vRg9X_fkf#}AKW#ujx_}j&>^))(?t(Gs z#mC?@lRQXX#>r8joW`2qQPr<(3Osy31jM<_q`Lkdx>kSP6tJ)2#EGMyKrKF2kYx&J z5+tPHBHl0jG!hUqHA^!O5m0Z~Be$n9$Z6!q8Q@T~R_bEqbsalP$IsIVK~jF=_@RHJ zg87+QJ$K2)MnK+H58neo3=;U`ZA>#bwL`$E7{wFDjc6A1!VFmVp;8(ScCvsWb_$|= zri~aQwzhw&FX&2tek#1TKZ5{!`pS%n1Ujp)W>Z0 z+p^fk1W=yC00%msQj2`>zNnEM!QyAb0nla{0G1s+a^MqGFfTLXF8~e0f98zgS#a@R z0gg8T)C>NF$$y^4P6}wFX%jl=ca*f7%n8S2bHINdQ@|qxc=o6W_^@U{1bm>>A>iZ( z01d_!j^T51381Z=^`izp0U7#EDLpOVa7!mSblPtMxXtX$(OeE_T1oiQ2Lt5OlD_~P zW0D8OmVaQSg5rZqWoNzm9$TgCAKI*x?!{a0*7t}u!o}MGFefwJ2xyQ3N)%iyZMTMn zN@9Ns$oSZHB)pbQR|B9eJE#Y*4tMlyV%a~mQ(-5b8L+cef30VioiIWM*xg%t^e_P) z$xct}9yT;Rkf~;5GovPD?`?!C zvj{Lv06cc&;L6_+Fg1k*$>IlHECAw^X~eX1r_)r{%#0b$Tx{ZCeTtnmd03!OY}4bc zsE_K|3I!j5bZkcTRDYLXMg_Y;!9#x^ZH6GpOik&MC^%vadJ23C7d`+u83A!=W(u3Q zb2bc-&Ua-}{cLTLp!gmvCuHS8tjd0(N$n96O4Dr;lW$ zB$JEhJ^+Y$a5Q*V0yr!I#HA0mb~L5JC?IXl7_Qpe*h>MeSL^x&z@FOqO38oeEgR*# zgW|O_U0pq?46v)@_|YSzV0u!rpkR$@h>(J`sDOM6=bJRF2snw73@Hd9Y}`W9S1ph` zn2bQTTGrL${fT-r#;B!-$yBQb=}LE|U^fCj($UdXeC)_!Qcwc;kcQQh-Rk5afR0|1 zxQ9I^S4e6I2-yF=!d5uSMT39MW`{wLucxQ~n!U9|KpXYJ0e&eyIJ%Pnm$kP8;86rT zb2u$Ai2&z5G)O$y?O4#m^G(N~BhP}K9MH%&c*4fop2si^GxhT3evz+R_p99Gl%7Li zk9egjUYh4-ZN03my|d`}1Au?88R20gpts2iD+gr#J_1%6gkv1ILl}RlRk4MCp8N9-t0}v?%RH4P3NCJ7m-{m7N+!V8c0s`-sR@Z) zcM)*W--TJ7&`=K>0dap3{Q*D{(1QUA{?(^0klQ)%J_fUht@^F5UctRR-CaHB)z(rz z<(Hk}9X0S8764Q~(%RZqh=9MCodv*zPE>FX0h(^ak&DHxoHfz~%$<&t1OeS9aX=h@ zS@RTZVh%}~;=p=w9l!S(ySG@+J2Ddi71z4iWtfNwS|$--OKX3@2};ywkEX`QcR)9@ zaE|x$BZCB7?9SY~V8Oikb8(-9$MNu=I~^uXU?b4oZK41;Xh@hPW19`O4A4g9m8CP@ zT@3PExjT3mHH3F-Yik?N^7hs?@$Mh3?TMIXnwwh+jvqPr;V%rZ(_m;?fC}D~xEBHc z%=X~pkL@%K3+;a(DCjT|lHeFm+`ySw!H?Pvo^g}2tub3Wp5~^c4M6hi7Vpf~v(wU= z_z2L(TJ?5UODn(c68#0=H#>h@xY33DEeYu2rpBh+V}}oX zfKi+r6N?Hm7aL5@3!;nZ=2f&GD*&<@v%`J@8-ea_S_B*#8c2FYZsR2EEfS!5a)gP0 zJ3D(0E7eB#T3f59bl?Si%`J3QHNM27f{pc!*$nXX;iTx84p4C6Z13l4Mg$4C*p2qH zY0rJOpdfz(w8KV=JnTBIOg}W-x!u#s-ifwxc#gJFO^+WyKD+?5i`{sya=y%(8`~P) z)Xfgq3CHM~;}Ec+t|9yA;r#%3>QG`-Gy*O_K!fo-g#bu=bLY)tJMJRjpF8XU5F^CZ zW#NuqL-+N03TsEc&%`!oZB&mJ>u~&av77Hs*Ne|_4#FNA4`)w?=joqWb!VXjHJSx+a|i?u`wLXqPA``WQcgi@AKWXU&@N zy>UBs_})(Y1@9k9>Hp7g$+kr*l_NV2WfXr09sJTrr*W@gTu{=JcJ_-;{3 zoBp0I|LE)PDjO%^#G80Lz;$I=Kg%v%M!xQI&ZZ7lz1_y{Q_~>ct+KW@(p9ZmT2p^f zm3HvpUI0A2Cn`9s9bG(w9gPx?q=a=k27YBiD(p4!^!VuyHhNp=^_n(C^W2vo4TtRm&$zTa1DGCR0CB8UM_=YUcd z|C#MNn+}%EoH2d+)Q>Y_ZXMtJ>C5xnRBCHmCs(bTc<55t$+ok%W#>OUa(aJx>7YAT zL5G|;(?V^nW@yBz-r3c_@sO{kmTvJ`9p1B*Si3?D=aX$4aea0xlcU| za26Pzz??R1>J(2mjgynJ#@)lyla&zR1OPvwVrSzzjT06|q*4B=`J(!(^dsz8QvQ#spgEeZk>aFIc22(!3tEi|90l*~{ z#idDmcQe4yfFJ^#I_Jr1gJ~&&Jm@-;%je}ag&#y2H+Hmfo*Pe>Fra6k+-osg5Got@VEi)%FlgE+O!bYg(k)*E|? zuf4q|`DH6P4mu;F{JnpMCLwxJzG}RSD_$R6Rt|tl04$FGGQm^Ze$w7V#e)w&;H#{vqN~gC zu3swElCr|0H~@Tm1GpFfTM=*)0*<(T1OUARJho8ep@pdMn6%)9kA6BHTF`a(KlgQo zH+RWF{O)>0{9LsZ9|-E@mRb|+!R$K)$3Eh!B|1jwC3iON4RygpjE;P{q0-w*X{w%DIoZFH)n0#zewFOL(0H%N093FvuOJ2h z-vq!NK{xLZ;Do6hP@>_zEDgWT053CG+1k@Tz%(`((l@`qY?`MX6n{JWF=dj4gYM>k zC|R{o+xvEJG2v6GRMyXDw>8!a)kDaBl}tYXECE2}l9IfF=v_OuzPZlq;PyZcINob% z)rd3*fG&UBxp*}GGsBRu1~YVbyWHBwfsP_OICz#D*A2S6dT+6awN|U1tEn8XG6B?X zX>Ji(19p38rXP*J61;CO1I*2j-nnDzKYjwhfE(aqedD}wlb2K(Bog9h_p@B^;>7WE zQR3*&aGjjbfA4Nnx;P0Z96ig0nR##Dz(8N~GOmB1+Wu7kHY1=)t&;8S!t7Ef3_su_ z_g0jP_ptT{z{LOK>hi)*tvcR)+(tlpw7zJXQi7;jklDz47e4&>_+tVV7Z(-zYm}g1PHxoB z?OT5U@W8f!YqwfJ!MS55E~*@HQ8)r3-B`LV!{d`-aRG|}#RH;l5lNw!_pe|1_k|Ok zRk8&Y6_W%eyK_C86e`q?oB9VKJ5&Cvs;U%kn~wJ zZw@&V4!0Z`BnOk*RL$>ef5h-Iy|JEi+h z08~BQnlTnWDAYE{2%mX|H1fu;8he*2F@90KqN2j0I~t{8aS;G+-?sVnwPptputl$L zoZ~TWp%jo5gdky8wb0c;2*?ia4h{@&RX7qr#cfytN5T(+-(0rZashX zv&8jWLFJRRytfkdD=%lGuLy7OUU&x-1i+k#ZNL5U+8R*M-n}K{^MfHkk-j&M~d8DAmlb%C{O5Ke$xV+?qZ^$q;Q0!vL(QsTTNn z{v!qP2K0AaP{FL6h%H+PaEss78wh_m$8F5KiV+?L7dv};x(gRA0ibYkg$@9@eBv^P zSZ-Bccb~TAWkcm2-P+axg{|oq4yc-yT~{Nt2P}RCJiG&a!EFRA%*qM>?YCcE{Q&^) zT)EziE_NF&1r&nBnO#;)r&CuB6CYhbh=8<6#Nl{eVYO^hUC|6Rmr(vq8_j=uo3gz? zPXv^&t>e9^7{0|NOg_BP@+}6K9scXDn_gXwfIinqL08YYBLFc`I}3C$^;kJ996Igq zHxM9Akfi#-7?aBscDLHTlykk5)3TdrV$}F6`<7BUCb-r({^*$pqJH^#`3x{KJ8bhW z8(%>MZwr7Pb1Fs%h=BaEAnbqaKQau6hdK$6_^82GDijKpt)qw6;upXC-6y8DBTyxH z)MjrBJ!7DuV5}18;QNZVDyn$-Apdf{LcCvfZr*JU7`l1WhL=&n+n0Tt4MUByHSV)3 z#Nj6ZW;zRfDfIOK$TobTcQI_03yY{wjh}eylOMJn^^MA|ZtLyq>1uy(ZL1SvLZw{R z#9HT;FI9|Csqy96h4~lrOCdQpH#aAjE0`6!Y2$hVymj$v69PJGXI2AJ)ifN5WXZ13snl5jOlFeg*x= zz4$IwNXNSwP8t{Cz6FjSvJ;(n7_3*nRc0rK zhg%t&zTqM`2W-3PKv@Po`gJn^;w^(eQxG25h01c?z8LxPkuN*v1^_O}&&Uk7gYB_{fsnYfg#6$VAvNE}X8Ck(UtzG^1)nyg$s@b2Xy*0C*i6U$ja{z_40W~ zPxsIkD{Frn&Ie;qjE+`%HVv*yRy{4FoC2oW-^6?SO$r4GsFc54D(Hug#K=Ye;VG@(X)* z4*GbV4Dm2fx>RXklQ7{D+&UYl)C6~*G4=H~jK*)nZKdkvoe3~ISOD}nd8(cPPAN0tgQN$5{LC{}H3VcEf?ZvMTdY_QkJ%0YnRoF{ z-ok&ghnmtoRf3Ogj?}W^R(;f#_!J7cdr}dXFIU2sp3VVtf>*Ep=DF_y@bYm0gebOk z5CDxA8V#m88IOnA03chHgq$+)n-#;uKW=3LAKUR@>$;W86kI^1d_@DT43(FsOi^%? zZ7r7Y@hAI$F~BSY{QBAN0PxcBllA&R1e||dHsVUbeh$b^m)NWru0P<>a(IiP%LCMIX`$wNe!nv!~j0JC#~SA9o-n=c>Z z3fdE(kq=KlK5X4$5vn zb1?@jW&3QjTO=&n*VRYL7#)~=T@|anrO7ianKq}$%!|C=SvBRL>Cx0&x}iR)I?Ucz`&Dm>FF*xaM+Busx#5mByC zZ7-nM&ER~=$w^6xNenQP0e*vkM~~MJ4KhG6I{0dpF3C}l57P3Afev1C+uHkoHBnG- zEe$@tELl^(TqX#pP+q8FD+k3XZgM7}LiSibJ}(A?SL7o=8IHlAufF`^sjtDsmyVvO zsQ<=FDFQy8U&4QCZ{bgj4t3m| z#iIjjkz=(0I8$viu~e9I@Tb6WK(?fdfUUeCXl?D@ zEVx*SfNa4}+%RIDLEScyPobC)OH&Uh9@p*Vf-OrIq8I28FP;H{g1JFoeE!K3q#yte z=s-c638gH(h>LyQy@`L0)?7l+>)n3VPGL&v`o&Vk=eYn_TqkY@(wbilE&A0QR4aH& zfvk7Fn74kZlVt*+eE>a7k2#n4;u9_qU}jF>=b!x>75wGGkz+N39FV0K<62}702-Gx z-tB7<`hg|_q<)kGGS`|cnpU5(6{-fj{ZP(YzubaXL_pd0bi#j2LcE0dIDAssNWje( zn1VAA(1_O!O-om2Pl6-0D-3W&Zwu7hCQ5irK^1EUw8gc2!B4=WJ)`Oic4AVN%bqGN zVDqB<9}!T7%VDw?Qe&G@ciMUsNhT$0t!z^WY72`Kx+G} z86Zo?_^b~ER0@A{G;L80-wfn{htm32%(~mS% z?Jdl~t}in^d7+i?U8@h%A+s3qz|K0!WZ3fif4oux*vA05d;(ubSDd3{iT>Sgk*}d` zqo5$VxUheU8NyYt2NXeHP_ave@^MDlM~hUcu>T(p&zlrP0N5nP&#^rKV;6E{;LD^5=wD!MV{-|3khI;IfE;s^(wyOQItQLfzYc= zrig!_wkjnh?WEku{bE{7jFB%gBJwl>=A~uc`RM)k9z(#>d-qrL_0(e&mr!zHXCP>e zr6bl+OoM9WyPYH+CA{VhmcoQXscQ?;YF7I)SyP(i?;!%pZEwa#MMV)`cm&!hM-lMdM?MDyPyVsD zytk*00kYu5;YUkUo#$i{K<^e@1FE5C4mEKFkx${8SITy>=y9yn6BHB_2fA7r)kA;4 z&(c#;u&gD9O_p$PjR!y+eQ4p~;U^s-QRk(m-+FHa0v_0O;*USdd%NpqARy@1-XW|~ zLCNj>(Spz25Yep+#bdjF4T6gi(lxJy(-kr8a6(@2j=4}xdiymQdIEx?|aI65DcJHd?O3qWmg-72me-ZKoU^l znp;fcuDFnQR0VmtMcb^c6mk>O_$O0Ui;I|N1eDE<62t?(Pz03805I+5dn^96^fR*q z8;|b#9iq3E6zt^D+sc+OS^}LEYzK>cEPuO7*!-)gUoR*KfZAMuE8o z?}pMHRDqBIrlg91hj;#7(%pZ_0a;?3a;jjK;1e^C7+f9U=G3= zA5@$l|Fyj_f+d`9M^jA;n{8$MzSVaz;T#Tc?#cm^Q*UsB6O@M6lAs;p^ ztDGH1+T`R)mhNf+kj>Z7#X0nhXK^JmeyP^U@qz!>!NJk>pNW{1t$cS()IqfF?y~eE zy)N!bm9{J$1gV13qzX%K(xg{W$`6ng>Ai_k6a=J5lcLn63rGd~`lgv!c`OY`r6CuF5A&L>I6rlpoGAp6zmGe6PfCVMF&u03e_Rn^hV7?(sYqCg^%Z8qS} zvG@_c<#zf|vFmI>`}b~hK>`bzST!FGx+)CjfV%p?t-IH^e$up1)0U+WT{@Reg18~EdNR)6%KPNks@!W@|rDSeSCygVUGT&`Q+}3COo6OY2G@J zxsYCCd$8ZMo0*O40)x4wUNGK3U<9%y74!dyMI^HtX!a=NG2*`YV0dB1Xt)n+>ihid z->WXdaarW|yd<>2Yv0FSz`7XXu&!k*-kB32^Y`gBpM*fs(%24(`+@wgR$Dh6qh?(q z5^s_j+->h#b%6Pge#0KOeBu&4isNfh{qFH%b)U-`Q*w1kOtgkHt@$%cc@St6^nX+I zjM7yiVO-GV(GW96S7|-{NzTkrqtU9d%73?wYk;8fRa3k z%IIfxukc{fX9ZJayDn(Yw zbl)?W2QXW2`m?Bi67R~(y}2Rs@^@b2dwYjM?GYk*?--$F>vP|WB}@Zu^duRjE9SMD z4ReH?1^jUoE2v!g=%mxr!%v4=``*2DE-cc<0kSFNDhb44q*KjPXoQ%=I1e$2}C4*i7 z8S6^{0>*uOMPI&YE;2^#8!+a`!6G!h>n#K?rqMyYYKP9QM}g?)(ZUA(C+2rzIadC5 zhGt{RG3Dju7z}wQJ_$3hzz@Df`BixH*^``sS2g{t4#xgd6@c5>?CwcO(A^*xYEd+5 zzyC$Rm-hTKc{n_g_hP@9OU8Y=&|eH+@S_R3k(i-xMt?nbC5{6;zPaAMJzSSy_)*De6;-%tzUUawnf#kelil7-7RjlLi{;+AKg83h@G-*QhT`;PolIVSk>gjM745$4D+ zRchQ~TsOQEr27w6jTQ#PruzF5HL3LV1YeiaBVEhQU%M%lZ8t*^TcJb^7OFEOxUOhq?{VMJ!jI)f13fW3cW16fq~|K z9%sipiy!}9slOS1yv@G-u-Wco=+3Pl4K5q0JIeVx3)kMitoCL^Nu6xj_+=(Bp=#gU zxWZ~~Q=sPYS|jEjm(# zb_zs}O{K^OS|bZe^lz|78qw6a$R+1$0iv+yUh(*7Z5z_Ix&I@a8#IEu7`=tFidm`HCQ@eS}phR7bEu9 z@bL3#`=_mWD~8RM2CB~-RI8es37=!09vQyDoi6fxt1!=Xf088pGila+&lkvn$H;}s ztU@3;PA`TUX0DGc)pQW3;#F={nci7rPD;XK3L=y7?3X+NHUpua_I%2R?;P@MO^VjY zJ%y_C|Bh|faO}i?dFT3LrLC~=df89TT$5KGD?jp&!>mh_HI)R7?~LVd{UJQ+fPel; z{(8dEVxntb`DZkZP=&pVi~j}i!S44r!JItTm?S3SN^h)FZgTLiP{omS#)*&V9@bof zJGitgDE4xcA|uTCKjgY*8>X$04bwh~{_9je2OMbLA{T|J|OxM#qst@Lev2FYRqai&V`5QgqqZKy9bdSz_(6MHFAI+OB6M?8%IQx(8Zfyz^jM+Lv?ye>X88+w^bf{hpvU zH2>~vNrfnxj|IdxH)k^&&2H`T*#~<+z?Q@9?Qi(~S>5PXW#VUALfSJ4ZH=JQ~jNd$inQ{61)vEmp|=Uq;Ho#>zP=zzsaFNJ6i2Z z=nQch%oX)+#R6DtM5JgU^Y-5zIt->=$pDYjzIk-{$Iexgz0Y!eo7YEglNaE3e7v5b z0P-(qVtgWy@?rYLZ}g%6ILKikYHd~H9S6K=sc)K@1K!XvvSwj{gfGwyVb&~h;eRMK zF_d1IBAzQ>4mS3Ce89anZ>$Rr3WV+{=vTD%srRM}0_-)1De!T~7&trBKg_&@l16`*`?!Lm(!? z86o6~OS1MxX4zP&JrqZZDf5d2@6v|m2DY!E9jH>%Wr{4MM}_oUxJ5CX+Wz+5WxhH#HexwA!j_nlfVhNoHpX0OM%T_UQxW?7r=-Az?dL%< z0@oFTTjiQ%ip|^@Z1|h%P5Tr*6!UB^~vk;%MclsB-|! zO#4a-ot_bS@YT}(l36*cv$i30mx80ht-+=4LHU^S759~Zk!359`;uiYtNLg!Prgw_p%q0B@tLpn7OfW{qz`3ip&cu23ZVgKY67WsBQmvKwQ#Vdu zB8u&#sEAb8H(4AL3DoJpY?4^WfWf7M_Z{D5M*(bhFZyo0 zI(W^xKVoGpwYsd3H`*zk5{~q~8XTT#;CrGc@ZtEow^+eI$B%1i|Hh{;#iI}e4B+hR zsie9DFY)EtLyN4?P#m0OwVkp@jAgKnb?vP#JLI2$!F37h>iz+G+$~5?OOsxh9x|c3 zQ0%AvJ_r@|qFl2@OwN3P8F0QQ;myDqZ(Q5+ayIEZ&zOx~rtyox`dAB^uI*iIqd7aeg8*1+c~jpdQBaduTwWm+X;A zuUK!a7kL*W^zgIcc*im6V8Rf9vyq%a!b07|uPaJnxVu^5{(G;mWo6mTm4MYqHbbim zAC^V6#Tea{!_7AqI8cNj+0hoPonW?=IFg|LiaVkM0hyPa82_9MnRhwM?5`ElS9!zk! z4JtXQ_WO5Gd_f#iTMGMkG|Nz*{p>QRp4Y9iEP8b62^bRyr^^<#4C9}kX^>}m{1zO! zZD^+4PFMYW|K->n59-Wy^vHPHU>x^D+qo_s$Ke3lf}DqtUF**twKcGJ@iGcek^L2zj4NpF+GF5N2endZ#pTXyCIHlj}HZ?m{k&T)6>JO zd=_@#e}V8QS)s1}U!XA2=Lti~>~FbyD?tAC%)7dN$*s-Yyn#vJr(qF8jxN}g0geLAP=54A5lz$eAT z#F&(nVBUvm1^x(`VvTeHc`!s*sTv_2RPTWdj8bl?egzvQOm z4;U;*5i7K#e9G$|-%uG=w8STsIZYIfidzm48#KavIxvDDQ(8cHlf~mr5pAbolbnvQ zuBZua)x@&T-;?2?lg7;%N%2)y%0nyQeD1Z`lAJOTKe7CdLC-KDpNgjO-gMaI9f&(I zK6FyRV7IIi7x2e{m}8nhRpk4>bPz3D8eP7*(nka8st0ZIpRs|#lMv^%W}#D{L@{4N>5jZTo{N2N}Cct zMn`ig@+N+Ft2VxFsqN%F7H9E$k!n&BJ$Xft?t>1Rvnz9_5n!}az7W?bV?~VXpz#$&$1I%cVg!{WHX?XJyTx-xl}nW zI^3ZmqucOa@qT}kk8g{vof8BP|H)+TKYsevi!3V(Dvc`dn<2uQD*zZz(tsX)KmMq~n>kz-1Ze0SF-l4!_|Tw! zGB(m)mttRP^8M&`kzcB5NGr%?ArswwJk;~E-`JFqBS2R}Y&W>&oHuHYVqK^^UdyJQ z)-=rcHix~I@w+W3Hon`Nc{ zr}g^7Wt+4YDji2(T&)Y*F<$o_JFGilBrai3 zHBMl$xtpG13tN?>PQcY4OpNHP#7a7xVH^NOF~3Hj-f@ye>sS7VB(9%gf9ix`TTo=LOunnhk>w z#?i16A!NHyBDpX{eK5253>DQh&+RC?Ccv$)NZ;g_NJI8rzSj_|sh<~_xO7?D=ZRW9 zCP`HOQxFg-^6RmWa_lNTRwywVtIBS3h!=i42a7we>%l$CZ)?lH&iR1!&b?cQt- zbYr)l2JLan+c}Wt?qVM!5(1dW)>5Ee``mF#;btw9qB0@X&DY)Q-d$p0<>0w*4otQs z=-Io)zn$~t`LXLN4v~zCS8$pU#R7ut7FhxYLS-K-J(8*Jcrk0Xyt<3j>AB4=3F&!R zef(#UgO#Tb#Q%D;zP?@ysq}4VE301QI?PpCwf|-0lWHFmR28Zgos7O%J1ZyOj(fe;q>Q-nM_jin0^xb=VD^fe4XDF-i2^w`5Vqfwyu#Vc3wJ~ zMCFr(@r8NF6QXWq-2A3R!sBR8u4`jII1zk<=>fO+1@ySPDVV492RyBA1MZ(+NS(_x zJt^Kjak*rlUuYHRNgag32JVy*CWLzY6SC7=sr4A;%}L-s=F?0njgH}GR5A3+!@VX_ zvLugP3-iltL{iw6>oT67`4f9s6A1urzuH3Fy2OCR_jpB8{KkuWqUE!>w1bp$(jSMn zV;wmRlP?su`_?ijfUh}#Saav7T6^G{sEmU{m`kYP0}g;!`O`v#3bKc^-+Nm!b-{#$^6WfiL^hs4bU&Rs%`!b#X<^MzV|A+ex|j#v}QQTB%N;;avlEZi@( znwu^5T_o%*wN>U1uLb6e=u}|a`bOlH)}#x5ZdbJpJx~gC$l3v{RNGQKKUvmyZ2s6{`nZWBgC<{`4T*m5?|s$X+a!T zu&qr-=dQ{=gmQIF!DGBx@z^V}K6%>(;oDVudb)p)iY_)YrQj_E1&hSZe;h?&hYr1S zBgAv!AtVAuumz6y)#hLwA$}6r+paZ>epPWJEZYuBMcix|Pyk~i3BTjBEhR)`#Gg+;A zyz|F5EfaPh0@o7PM)NfE#Zb_9<}qxJ`YYs|m2=i$axu#~+xN^+i{9P`2y1#Cw05#h z-M}E(6{jaUo$|ic-6euIXMT+Su-ARR%1*{=0Qf!IZ<3dySoC}Fi=CUD7597R*UI|V z>h|_e5cK%?IFu@S@EY%&6C}Om3aWMMadv@Z#VMU2w)z zGxg|Vg~^c5sSN6`y=!Z0#5F*gvG3Lz;~--Bh+jPr`skFVmWGFiDSG2~60S6uWKB7o zJ_o?mwswVXes0dr58PIm8F9bYR@PUcfhD!I^pi{$7L1nGXlutN+6pmL2b6_^2g)Ar zR8LmB1M9%znPYck?|;p5>u^*j|9!^)GTOByqd;&|^BM~a|L`K70_Tz#QYxnLzV~(_ zADA9xOi3muuFeK6Vdbo>tn5KMGQ`oc-7`0vo%w2!aSwH98&(8niFjc*SCEs>26gwlA)olj&NpTU>fy9AX>^jj&$Ry zL7sSH?<^nJNB>*)nc@GCeU_6}$nu8@{}<8cotaJ_ygH-$O3VzHMVNxW*OjqN2PU;3 zR7d?WS`0@wd{0pxEZxS9ytkfZ^fXF5i@_en(_z^gUofAd*n)Hot1c%QZlU5gi?+4WlqO%`n&ols!$_9AkO`p4q+)ObS$Ae~waF>| z>gZ|NDP?qpI(rkPF9K|$h(P_1hVVtu{LcvrrJ$hnpVp*h6lMRjowTgH)PJ#)RX{0a zh54!2qZGAoU0P^q%c10TwB@7}UEOG; QWfc@qG=hTKMmjYA0pRqm`~Uy| diff --git a/test/image/svg_image_no_dimensions.pdf b/test/image/svg_image_no_dimensions.pdf index 0959e1f5a6249a00de5c38f3d6c4a298c3c187e4..46e56fe4207e4f5dd85c3c59972c37d622009b50 100644 GIT binary patch delta 1052 zcmcb}e}#X76|beGk)ENk0)*P=Zp0{H$z^B9Ra{b(nwZN~G3RZ>e0J|Ib;xcIB{k#I`Bl?&$+nK!dPuo(UDIA~ zJk7K0>8Z1pcb;!|KL2LJOLya9`?I}=-Wbf=eYNyF+jTedy!)NCXWyr>zF+&Dvg7yXJzvejF@d)l)?%UX?te&2#m-9Ng1S7GokzeCPbx;LGwTlg<2D&0e3b-RPa z3Qp@KG6%v-{Jsh8WV1_nvXOB`l7Kvy_ItDQ^A8pal-QkWk!WrTwOM*cq^)OZm1&TH z?5C!fITf>KOrEP;(Qg?N#_sJW=5kSMa!pS0m5n-SE9ws{;&~x^?8vtxp)QZCRs1|0 z!c(>$oqR@Q22cJYeXp|0yPuXa2fxmk^svl3jz|B4n%tx%hRHf>mv6gxqF~w{ce%-5 zzL&&4;&poRB2;c>Y}P3!=l7Erp2%JwnZxdPX7V0YyW)F)o~+0SJu1Sdc{Q)$Wyuro zhiMb`hI&^ittoxAu0F%`pvdYOhc7f7H8@l4Z#4Or@+Ze@t5nt({c=9~Z0QA-V6#1* zGfpgz)0lC@`1Pr!r%z1v?EE|_`ey6Ph?d0G;Dj?ytT#_7pLhBdA^ckP&a>$<>vqh@ zxxL@9tajG3lI9y5jxdK+9xIVcJ66};8UD69FvTv?%uss^f3(lK?}zS`*5?;0ZdUko ze%a2OYm&o#tbTmi_3}lPH?N@Cs^;`<3|$qA1=931kJg^N>LcnatN$@=$Mra4nY;}$ z><5`nHcj3rkr3MFxKX$8hGfus?JaEwwc-{@Onbb*@v%$jrpZo^&lE4&q_I|FTJgTn z%_b>@BImFE<3Bx3{qvpE2M_UWkW!ab6yBA#^v==r#kIM{ZIAXXetIV4`1Oi+eUD8` ztA4S+xGI{w`6LS`Q>vMQ0SGAMDR6-q28KqK1{h+-CRoHQG4-057-8r&HM5v(&TboP z delta 1049 zcmcb@f02KJ6|bqKsh*LAf`y5po`vN`cOymtGcG$juHurS)Wlq_iaBq?CwDSx)NebY z`Y|GjbKaAOrzal{dGP+Sq|G$}V~aZ7;uz(`+ztBR!p4{>MV!zVEbh(>|j(`*~*Ia`({RqICzk=geRT zR$OS*QB!MoDb@LB`k`8(;_gomnOzs|xzZt0pWWChbj_vlr2g6D;>H~Yf}6cJz2Mq4 z?RDWPnPtyU9o~88?d`-gzZpL-o;~DWzSuy$=lQ!*+sy~JUiQ6FUKIa%_sxUVzxU`K z_dS{SN~@^$U6G~Ex(T&9(*shfJ4*GFN_R$dwQkudcj?Y#lheP~Zn3F)smCh4$X3qp z`^t-_A3yw3zwtC9QSX@1Z@y}GNt>Pz3N*tk>%gjwoeiT8QU!jIv3&~jkFIkkBbBZnVDH&u#t_OQeJfO)A@YXF7|9Yu3K5S=fG?ikDy~c8@I&Wa$9^T@|9er z@2UHzOFPXuCTa&lm3zFtNS^Ht;>u2ijuB)|{6?m+yV?MKB zaU7RP;TAHhke~A z`~FI&TtB;Ine>r1Rk;nPjL%fgl>9BLc5mx@--$odZXQ{CVPB5r&imZO*Eb)n?>*Br z;r#E!&7HA^GauZ3own$;uC2?B6@2q<3TZrQcABwssmOQT@ZwOD(mh9JKLq-$V8_8C zSr%^T-v%;P$1{C?u8MO%_0-u(H6I{%{rJl{&A&MU;oO> zm+i%Fh?;CZ!@|jwYOG)Y0t$HwTwsQQp^=3-hM2K27BNdqy(Y$%7oVfB^5=fXTSTmaA$&G7&L diff --git a/test/image/test_full_page_image.py b/test/image/test_full_page_image.py index 5ca32a2fd..da210d3ac 100644 --- a/test/image/test_full_page_image.py +++ b/test/image/test_full_page_image.py @@ -31,7 +31,7 @@ def test_full_pdf_width_image(tmp_path): # issue-528 pdf = FPDF() pdf.set_margin(0) pdf.add_page() - pdf.image(HERE / "png_images/51a4d21670dc8dfa8ffc9e54afd62f5f.png", w=pdf.epw) + pdf.image(HERE / "png_images/ba2b2b6e72ca0e4683bb640e2d5572f8.png", w=pdf.epw) assert_pdf_equal(pdf, HERE / "full_pdf_width_image.pdf", tmp_path) diff --git a/test/image/test_vector_image.py b/test/image/test_vector_image.py index 430d7fe53..74e658e77 100644 --- a/test/image/test_vector_image.py +++ b/test/image/test_vector_image.py @@ -31,7 +31,7 @@ def test_svg_image_fixed_dimensions(tmp_path): def test_svg_image_no_dimensions(tmp_path): - pdf = fpdf.FPDF() + pdf = fpdf.FPDF(format=(350, 350)) pdf.add_page() # This image has a 300x300 viewbox but no width/height: pdf.image(SVG_SRCDIR / "SVG_logo_no_dimensions.svg") diff --git a/test/layout/test_units.py b/test/layout/test_units.py index a17183d96..5ee43eac1 100644 --- a/test/layout/test_units.py +++ b/test/layout/test_units.py @@ -8,11 +8,11 @@ HERE = Path(__file__).resolve().parent -def add_cell_page(pdf, cell_text): +def add_cell_page(pdf, cell_text, h=None): """Add a page with with some text to the PDF""" pdf.set_font("Helvetica") pdf.add_page() - pdf.cell(w=10, h=10, text=str(cell_text)) + pdf.cell(w=10, h=h or 10, text=str(cell_text)) def test_unit_default(tmp_path): @@ -33,7 +33,7 @@ def test_unit_str(tmp_path, unit): def test_unit_int(tmp_path): """Test creating a PDF with an int unit""" pdf = FPDF(unit=144) - add_cell_page(pdf, "int = 2 in") + add_cell_page(pdf, "int = 2 in", h=5) assert_pdf_equal(pdf, HERE / "unit_int.pdf", tmp_path) diff --git a/test/layout/unit_int.pdf b/test/layout/unit_int.pdf index 3f66aaae76faac2c96449587b3f7ca848749a3ff..238d157d02cac0a7ef5e15196d5df91a798926c8 100644 GIT binary patch delta 177 zcmcb>evy5H10$o+WJg9L#ThdqUPaE*Xj!6>k@9S+#tkhA&6H=ES}iG!A&d;KxAC)V zp3GPaQY^?UENZD>00Ihm3S3}@fq|KU*ljBvXJcmz10yGMCs$)P3s*}QBWDXk rBNrD}CkqQV7e_lAf+}LU?CiLTOA?DpDvDCmxXjGVxl~nM{oS|#OH43@ delta 190 zcmcb}et~_110$p1WJg9Lg@}k(k+U>fmS|+8Je#Uyr6#lqRtz}3vi%+Sfm#L&^q)!fho qNSnG@x>;D7+Sw3P5zA#~$5mXCSX5F`l$yq6W@g5vs_N?R#svTtFEP6S diff --git a/test/table/table_with_rowspan_and_pgbreak.pdf b/test/table/table_with_rowspan_and_pgbreak.pdf index 837ed878969a7afd4aa82d675efc29c04f476743..1e0bba2e6d8d9f9e5cd7c7598b992dd5e51ca6a0 100644 GIT binary patch delta 1399 zcmbQPGgW6p3}d}9mz^C~aY<2XVlG$3oVDS;lkb=a>^;B!LSa$IgsAw%$zo-qklITWkDqx8&N zp6|2f-rvZObbP+u-@@|BA76en&Hc|M@GZ@DwWDj)gM018HBXqX6@TFQVyBmIn3?n0 zp2aEqs(<``=&f)#&USuZm;h&w=i+9w4HwfE7H^K9+jB0jwB^CSBXfeMoI79cKfV3O zx*0Wg@*G^zwkO;*59@CEd4SKZe)GhwJtb=%bCqp2eE9TKLCf-#x@tSt{AG3$3l$C) zEcN2s|9<;P0Zx9wun9LVS}izIbAW-Ydw;LUI1h zFS1lGsYoj>Tsz0=YnJL3{`bLrW*Hep>%VIoo@dMc8+D6u+CNjKFC|Y~juiLX+r-ts zn=kj??!m>CTbHh$FyC*&!?2tfkLG_B)!&~^dT?Xvwbi2gYrN9_ob;U>xy-X-ivDGj zxL+${<$PvHPntGeKe6%r+zTt$G3*GfES>t`8h?NCC$Og4Yn#m>ExT3M z8y8ne#)$XdZ+!eX{llk^n!CQ_{&3fLcWGZqP4)h-x$O48r#%q;s4KOe*Zpy7L8#So zUiarIAC6iUUzdJAD^~x})K=FWx9hWG^SAz-zizwR*IoOX-M@zIxmQxlKCj39;p}z! zhbR9Ki7Tt+@7q_u^n>s9*RQH9PQQ0$NvjC<;NQBQ^=GOEvdw$zz|lWci1nUwk&6{tvsq%;!JguT{UK>|n}`{JNk2 z418BU5Pf~~c)^;^rO!|EKiu1gTW7cxc}>L5vT= z7S|ROU%S8dh>i4~SncbJ_VHx*zjCczS=wqH`)jFZ@xEjc!gzB3w_ba_KXVa^v&#tWOn;jgsHzI2DqpPkb9PZWH zz6$;vGWp+=hOkTdizk*r*A}g--@fw6=Ep delta 1429 zcmbQLGhJsx3}d}1mz^C~aY<2XVlG$3oVDS;`Bw}C_P$^Lq0sWmjmPVMcq~*9VCT|i zJkB+3)ru`yyP4|j{EYl^j+>p`bv*Z%jsE$3wa*QEZX2xP`MKHh?!@QoEgw2aD({wm zlCyp1ZHBik)yFv0dunPP|GRD*GAqlwPB2xpm9IW-vj6Pj?{`Xq>L;A$EeX*`+Oo(? zNKfTz*NJuR_urpfY5k!{ha>PHXPx_<;KM7-j+Asod6wOmZT8+&TmSp*qk_`v&pmJI ztT-&^pMUgo^A5JGwbsYK#W+NBO>2lb&bp;q(XGc+ab|e<{`GP)lAj)ZELqYp&tbO7 zrA%h-Ts5oZudjB#SQFN6m}Om`)Wh+zX2%Zun6KroKOX;V2#z@IX6K}_YT+67un&^G zI+gzJ(pm|o(oglK?^e$7cy{`+<_@#hzZbMJvAec8+_EIheA0#@2^V+mhw72soGX7`Sm~~L` z@3%LP9zJ+@W9qFgN&8wax0>{}lV|>_-1#JI-@Cj{YdZVWXKehZKMT)zkgOiEiko4T zYfNm#j_(CKcNNTk^Uwa!t4oJ3)=qsDG_%gWvwqcT&c1z`;oa%%?6gR0 zZ?wGs_w?Vh59{_-iP#tUpOHU$eeU+BVrd@(_j1Wx?S5cX`Ik#3-o9!1dih1c_jmm- zINE!E`nLJsz3+#8Se(zihoh$ZnD*g|6@oEK&S@ULXen4zbneF2Q?rt;^G9!L^W3p{ z|IT&SgZ?gmUB6Xm>$>$10{2Sli^s+{RzGh2;Cg-f!?-^J^U7*@`}XlZ>|Qth=GTHL z_czH&JPcK`eX>t1@jl!3>0j1{?=NCmWiP*Q+AE;?zXJOL>RZz9$M0}pGdrfgCtmOU zUim|pS4KAe-Y9rz@e)d)?F!?wbF-z zUxz)2`z0{X3+RrQ&OcOY6;C(I%u40@{KIkE@p(=YzJ>s<2boub9=iN(*tm)>!UYh0X~{=?|_^o#e36s>xV zQnzgP>6oYUnV)Ordi%{YSy}n(jTH<)Kp{_o3(PPuG&MFs7c(-lFvJiuHZwvOGd8fa zzz{REFhCbGF|ag)h{Yi+HZe4}#87CCX`qP(Of!;ROG^yBrUsUlldDB-V@;h*j9ttv zoXsrV42%uTEuCFl-Ao(}ogGbF9GxtT4ee|Qs)&UYxrs$36-B9OT&9L*hFq$uuKsRZ E0EDr0#{d8T diff --git a/test/table/test_table.py b/test/table/test_table.py index 446af19f9..3e13f1880 100644 --- a/test/table/test_table.py +++ b/test/table/test_table.py @@ -802,3 +802,30 @@ def test_table_cell_fill_mode(tmp_path): pass pdf.ln() assert_pdf_equal(pdf, HERE / "table_cell_fill_mode.pdf", tmp_path) + + +def test_table_with_very_long_text(): + pdf = FPDF() + pdf.add_page() + pdf.set_font("Helvetica") + with pytest.raises(ValueError) as error: + with pdf.table() as table: + row = table.row() + row.cell(LOREM_IPSUM) + # Adding columns to have the content of the 1st cell to overflow: + row.cell("") + row.cell("") + assert ( + str(error.value) + == "The row with index 0 is too high and cannot be rendered on a single page" + ) + with pytest.raises(ValueError) as error: + with pdf.table() as table: + row = table.row() + row.cell("") + row.cell("") + row.cell(LOREM_IPSUM) + assert ( + str(error.value) + == "The row with index 0 is too high and cannot be rendered on a single page" + ) diff --git a/test/table/test_table_rowspan.py b/test/table/test_table_rowspan.py index 47a81f560..25afc65ed 100644 --- a/test/table/test_table_rowspan.py +++ b/test/table/test_table_rowspan.py @@ -168,9 +168,6 @@ def test_table_with_rowspan_and_pgbreak(tmp_path): ] pdf.add_page() - y0 = pdf.h - pdf.b_margin - with pdf.local_context(**line_opts): - pdf.line(0, y0, pdf.w, y0) # simple table # with pdf.table(TABLE_DATA, **table_opts): @@ -181,7 +178,9 @@ def test_table_with_rowspan_and_pgbreak(tmp_path): # -- verify break occurs before the offending rowspan # -- verify header reproduction pdf.set_y(pdf.h - 85) + y0 = pdf.h - pdf.b_margin with pdf.local_context(**line_opts): + pdf.line(0, y0, pdf.w, y0) pdf.line(0, pdf.y, pdf.w, pdf.y) with pdf.table(TABLE_DATA, **table_opts): pass