+
    �vj/_  ã                   ó:  € ^ RI t ^ RIHt ^ RIHt ^ RIHtHtHtH	t	H
t
HtHtHtHt ^RIHt ^RIHtHtHtHtHtHt ^t^t^t^t]]]]]3,          3,          t]R]]]3,          3,          t]'       d   ^RIH t  ]]3R	 R
 llt!]3R R llt"R R lt#]3R R llt$]3R R llt%R&R R llt&R R lt'R R lt( ! R R])4      t* ! R R]*4      t+ ! R R]*4      t, ! R R ])4      t-. R'Ot.. R(Ot/ ! R! R"]04      t1]1! ^ 4      t2] ! R# R4      4       t3 ! R$ R%])4      t4R# ))é    N)Ú	dataclass)Ú
itemgetter)	ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚSetÚTupleÚTypeÚUnion)Úutils)ÚT_bboxÚT_numÚT_objÚ
T_obj_iterÚ
T_obj_listÚT_pointÚTableSettings)ÚPagec                óH   € V ^8„  d   QhR\         R\        R\        R\         /# ©é   ÚedgesÚx_toleranceÚy_toleranceÚreturn©r   r   )Úformats   "ÚT/var/www/html/daimler-pipeline/venv/lib/python3.14/site-packages/pdfplumber/table.pyÚ__annotate__r!      s0   € ÷ !ñ !Üð!äð!ô ð!ô ñ	!ó    c                óè   € R. R. /pV  F!  pW4R,          ,          P                  V4       K#  	  \        P                  ! VR,          RV4      p\        P                  ! VR,          RV4      pWV,           # )zg
Given a list of edges, snap any within `tolerance` pixels of one another
to their positional average.
ÚvÚhÚorientationÚx0Útop)Úappendr   Úsnap_objects)r   r   r   Úby_orientationÚeÚ	snapped_vÚ	snapped_hs   &&&    r    Ú
snap_edgesr/      so   € ð .1°"°c¸2Ð,>€NÛˆØ˜Õ'Õ(×/Ñ/°Ö2ñ ô ×"Ò" >°#Õ#6¸¸kÓJ€IÜ×"Ò" >°#Õ#6¸¸{ÓK€IØÕ Ð r"   c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   r   r&   Ú	tolerancer   )r   Ústrr   r   )r   s   "r    r!   r!   '   s,   € ÷ ñ ÜðÜ$'ðÜ49ðäñr"   c                ó�  € VR8X  d   RRrCMVR8X  d   RRrCM\        R4      h\        \        V \        V4      R7      4      pV^ ,          .pVR	,           Fn  pVR
,          pWs,          W„,          V,           8:  d8   Wt,          W„,          8”  d#   \        P
                  ! W„Wt,          4      VR
&   K[  K]  VP                  V4       Kp  	  V# )zs
Given a list of edges along the same infinite line, join those that
are within `tolerance` pixels of one another.
r%   r'   Úx1r$   r(   ÚbottomzOrientation must be 'v' or 'h'©Úkey:é   NNéÿÿÿÿ)Ú
ValueErrorÚlistÚsortedr   r   Úresize_objectr)   )	r   r&   r1   Úmin_propÚmax_propÚsorted_edgesÚjoinedr,   Úlasts	   &&&      r    Újoin_edge_grouprC   '   sº   € ð �cÔØ! 4‘(Ø	˜Ô	Ø" H‘(äÐ9Ó:Ð:äœ˜u¬*°XÓ*>Ô?Ó@€LØ˜1�oÐ€FØ˜"×ÐˆØ�b�zˆØ�;˜4�>¨IÕ5Ô6Ø�{˜T�^Ô+ä"×0Ò0°ÀÅÓM��r“
ñ ,ð
 �M‰M˜!Öñ ð €Mr"   c                ó`   € V ^8„  d   QhR\         R\        R\        R\        R\        R\         /# )r   r   Úsnap_x_toleranceÚsnap_y_toleranceÚjoin_x_toleranceÚjoin_y_tolerancer   r   )r   s   "r    r!   r!   D   sD   € ÷ ñ Üðäðô ðô ð	ô
 ðô ñr"   c                óä   aa€ R R lpV^ 8”  g   V^ 8”  d   \        WV4      p \        WR7      p\        P                  ! WeR7      pVV3R lV 4       p\	        \        P
                  ! V!  4      p V # )zp
Using the `snap_edges` and `join_edge_group` methods above,
merge a list of edges into a more "seamless" list.
c                óR   € V ^8„  d   QhR\         R\        \        \        3,          /# )r   Úedger   )r   r   r2   r   )r   s   "r    r!   Ú!merge_edges.<locals>.__annotate__P   s#   € ÷ %ñ %œð %¤%¬¬U¨
Õ"3ñ %r"   c                 óJ   € V R ,          R8X  d   RV R,          3# RV R,          3# )r&   r%   r(   r$   r'   © )rK   s   &r    Ú	get_groupÚmerge_edges.<locals>.get_groupP   s-   € Ø�Õ #Ô%Ø˜˜e�Ð%Ð%à˜˜d�Ð$Ð$r"   r6   c              3   ón   <"  € T F*  w  r\        Y!^ ,          V^ ,          R8X  d   SMS4      x € K,  	  R# 5i)r   r%   N)rC   )Ú.0ÚkÚitemsrG   rH   s   &  €€r    Ú	<genexpr>Úmerge_edges.<locals>.<genexpr>[   s?   øé € ð ñ $‰HˆAô 	Ø�Q•4¨a°­d°c¬kÑ*Ð?O÷	
ð 	
ó $ùs   ƒ25)r/   r<   Ú	itertoolsÚgroupbyr;   Úchain)	r   rE   rF   rG   rH   rO   Ú_sortedÚedge_groupsÚedge_gens	   &&&ff    r    Úmerge_edgesr]   D   sl   ù€ õ%ð ˜!ÔÐ/°!Ô3Ü˜5Ð4DÓEˆä�UÔ*€GÜ×#Ò# GÔ;€Kõñ $ó	€Hô ”—’ (Ñ+Ó,€EØ€Lr"   c                ó<   € V ^8„  d   QhR\         R\        R\         /# ©r   ÚwordsÚword_thresholdr   ©r   Úint)r   s   "r    r!   r!   e   s$   € ÷ (ñ (Üð(Ü'*ð(äñ(r"   c                óø  a€ \         P                  ! V \        R4      ^4      p\        V3R lV4      p\	        \        \         P                  V4      4      p\        V4      ^ 8X  d   . # \        \        \        R4      V4      4      p\        \        \        R4      V4      4      p. pV FN  pVRVRVRVR,          RVR,          RWe,
          RR/RVRVRVR,          RVR,          RWe,
          RR/.,          pKP  	  V# )	z]
Find (imaginary) horizontal lines that connect the tops
of at least `word_threshold` words.
r(   c                 ó    <€ \        V 4      S8¬  # ©N©Úlen©Úxra   s   &€r    Ú<lambda>Ú"words_to_edges_h.<locals>.<lambda>m   ó   ø€ ¤c¨!£f°Ò&>r"   r'   r4   r5   Úwidthr&   r%   )
r   Úcluster_objectsr   Úfilterr;   ÚmapÚobjects_to_rectrh   ÚminÚmax)	r`   ra   Úby_topÚlarge_clustersÚrectsÚmin_x0Úmax_x1r   Úrs	   &f       r    Úwords_to_edges_hr{   e   s  ø€ ô ×"Ò" 5¬*°UÓ*;¸QÓ?€FÜÔ>ÀÓG€NÜ””U×*Ñ*¨NÓ;Ó<€EÜ
ˆ5ƒz�Q„Øˆ	Ü””Z Ó% uÓ-Ó.€FÜ””Z Ó% uÓ-Ó.€Fà€EÛˆØð �fØ�fØ�q˜•xØ˜!˜E�(Ø˜�Ø˜sðð �fØ�fØ�q˜•{Ø˜!˜H�+Ø˜�Ø˜sðð
õ 	
Šñ ð0 €Lr"   c                ó<   € V ^8„  d   QhR\         R\        R\         /# r_   rb   )r   s   "r    r!   r!   �   s$   € ÷ <ñ <Üð<Ü'*ð<äñ<r"   c                ó  aa€ \         P                  ! V \        R4      ^4      p\         P                  ! V \        R4      ^4      pR R lp\         P                  ! W^4      pW#,           V,           p\        VR R7      p\	        V3R lV4      p\        \        \         P                  V4      4      p	. p
V	 FX  o\        ;QJ d    V3R lV
 4       F  '       g   K   R	M	  R
M! V3R lV
 4       4      pV'       d   KG  V
P                  S4       KZ  	  \        V
4      ^ 8X  d   . # \        \         P                  V
4      p\        \        V\        R4      R7      4      p\        \        \        R4      V4      4      p\        \        \        R4      V4      4      p\        \        \        R4      V4      4      pV Uu. uF&  pRVR,          RVR,          RVRVRVV,
          RR/NK(  	  upRVRVRVRVRVV,
          RR/.,           # u upi )zm
Find (imaginary) vertical lines that connect the left, right, or
center of at least `word_threshold` words.
r'   r4   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úwordr   )r   r   )r   s   "r    r!   Ú&words_to_edges_v.<locals>.__annotate__›   s   € ÷ 2ñ 2œð 2¤5ñ 2r"   c                 óP   € \        V R ,          V R,          ,           4      ^,          # )r'   r4   )Úfloat)r   s   &r    Ú
get_centerÚ$words_to_edges_v.<locals>.get_center›   s   € Ü�T˜$•Z $ t¥*Õ,Ó-°Õ1Ð1r"   c                 ó   € \        V 4      ) # rf   rg   )rj   s   &r    rk   Ú"words_to_edges_v.<locals>.<lambda>¢   s
   € ´c¸!³f±Wr"   r6   c                 ó    <€ \        V 4      S8¬  # rf   rg   ri   s   &€r    rk   r†   £   rm   r"   c              3   óR   <"  € T F  p\         P                  ! SV4      x € K  	  R # 5irf   )r   Úget_bbox_overlap)rR   ÚcÚbboxs   & €r    rU   Ú#words_to_edges_v.<locals>.<genexpr>«   s#   øé € ÐPÑ?O¸!”e×,Ò,¨T°1×5Ð5Ó?Oùs   ƒ$'TFr(   r5   Úheightr&   r$   )r   ro   r   r<   rp   r;   rq   Úobjects_to_bboxÚanyr)   rh   Úbbox_to_rectrt   rs   )r`   ra   Úby_x0Úby_x1rƒ   Ú	by_centerÚclustersÚsorted_clustersrv   ÚbboxesÚcondensed_bboxesÚoverlapÚcondensed_rectsÚsorted_rectsry   Úmin_topÚ
max_bottomÚbr‹   s   &f                @r    Úwords_to_edges_vrž   �   sä  ù€ ô ×!Ò! %¬°DÓ)9¸1Ó=€EÜ×!Ò! %¬°DÓ)9¸1Ó=€Eõ2ô ×%Ò% e¸Ó;€IØ�}˜yÕ(€Hô ˜XÑ+<Ô=€OÜÔ>ÀÓP€Nô ”#”e×+Ñ+¨^Ó<Ó=€Fð &(ÐÛˆß“#ÔPÑ?OÓP—#—#’#ÔPÑ?OÓPÓPˆß‰wØ×#Ñ# DÖ)ñ ô
 ÐÓ Ô!Øˆ	äœ%×,Ñ,Ð.>Ó?€OÜœ˜´J¸tÓ4DÔEÓF€Lä””Z Ó% |Ó4Ó5€FÜ”#”j Ó'¨Ó6Ó7€GÜ”Sœ HÓ-¨|Ó<Ó=€Jñ ó
ñ ˆAð �!�D•'Ø�!�D•'Ø�7Ø�jØ�j 7Õ*Ø˜3ó	
ñ ñ
ð �&Ø�&Ø�7Ø�jØ�j 7Õ*Ø˜3ð	
ð		õð ùò 
s   Æ;,Hc                óH   € V ^8„  d   QhR\         R\        R\        R\        /# r   )r   r   ÚT_intersections)r   s   "r    r!   r!   Ï   s,   € ÷ ñ ÜðÜ$)ðÜ<Aðäñr"   c           	     óŽ  a€ / pR	 Uau. uF  o\        \        V3R lV 4      4      NK  	  upw  rV\        V\        RR4      R7       Fõ  p\        V\        RR4      R7       F×  pVR,          VR,          V,           8:  g   K!  VR,          VR,          V,
          8¼  g   K?  VR,          VR,          V,
          8¼  g   K]  VR,          VR,          V,           8:  g   K{  VR,          VR,          3p	W“9  d	   R. R. /W9&   W9,          R,          P	                  V4       W9,          R,          P	                  V4       KÙ  	  K÷  	  V# u upi )
z]
Given a list of edges, return the points at which they intersect
within `tolerance` pixels.
r$   r%   c                 ó   <€ V R ,          S8H  # )r&   rN   )rj   Úos   &€r    rk   Ú(edges_to_intersections.<locals>.<lambda>Ø   s   ø€ ˜a Õ.°!Ò3r"   r'   r(   r6   r5   r4   )r$   r%   )r;   rp   r<   r   r)   )
r   r   r   Úintersectionsr£   Úv_edgesÚh_edgesr$   r%   Úvertexs
   &&& `     r    Úedges_to_intersectionsr©   Ï   s  ø€ ð &(€MáFPôÙFPÀŒŒVÔ3°UÓ;Ö<ÁjñÑ€Gô �G¤¨D°%Ó!8×9ˆÜ˜¤Z°°tÓ%<×=ˆAà�5•˜a �h¨Õ4Ö5Ø�x•[ Q u¥X°Õ%;Ö<Ø�t•W  4¥¨;Õ!6Ö7Ø�t•W  4¥¨;Õ!6Ö7à˜D�' 1 U¥8Ð,�ØÔ.Ø-0°"°c¸2Ð,>�MÑ)ØÕ% cÕ*×1Ñ1°!Ô4ØÕ% cÕ*×1Ñ1°!Ö4ó >ñ :ð Ðùò!s   ‰"Ec                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   r¥   r   )r    r   r   )r   s   "r    r!   r!   ê   s   € ÷ <(ñ <(¬/ð <(¼dÄ6½lñ <(r"   c                óö   a aaaa€ R V 3R llo\        \        S P                  4       4      4      o\        S4      oR VV V3R lloVV3R l\	        \        S4      4       4       p\        \        RV4      4      # )a   
Given a list of points (`intersections`), return all rectangular "cells"
that those points describe.

`intersections` should be a dictionary with (x0, top) tuples as keys,
and a list of edge objects as values. The edge objects should correspond
to the edges that touch the intersection.
c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   Úp1Úp2r   )r   Úbool)r   s   "r    r!   Ú,intersections_to_cells.<locals>.__annotate__ô   s!   € ÷ ñ œ'ð ¤wð ´4ñ r"   c                 ó˜  <€ R  R lpV ^ ,          V^ ,          8X  dM   V! SV ,          R,          4      P                  V! SV,          R,          4      4      p\        V4      '       d   R# V ^,          V^,          8X  dM   V! SV ,          R,          4      P                  V! SV,          R,          4      4      p\        V4      '       d   R# R# )c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   r   r   )r   r
   r   )r   s   "r    r!   ÚCintersections_to_cells.<locals>.edge_connects.<locals>.__annotate__õ   s   € ÷ 	6ñ 	6¤
ð 	6¬s´6­{ñ 	6r"   c                 óH   € \        \        \        P                  V 4      4      # rf   )Úsetrq   r   Úobj_to_bbox)r   s   &r    Úedges_to_setÚCintersections_to_cells.<locals>.edge_connects.<locals>.edges_to_setõ   s   € Ü”sœ5×,Ñ,¨eÓ4Ó5Ð5r"   r$   Tr%   F)Úintersectionrh   )r­   r®   r·   Úcommonr¥   s   &&  €r    Úedge_connectsÚ-intersections_to_cells.<locals>.edge_connectsô   s©   ø€ õ	6ð ˆa�5�B�q•EŒ>Ù! -°Õ"3°CÕ"8Ó9×FÑFÙ˜]¨2Õ.¨sÕ3Ó4óˆFô �6�{Š{Ùàˆa�5�B�q•EŒ>Ù! -°Õ"3°CÕ"8Ó9×FÑFÙ˜]¨2Õ.¨sÕ3Ó4óˆFô �6�{Š{ÙÙr"   c                óh   € V ^8„  d   QhR\         \        ,          R\        R\        \        ,          /# )r   ÚpointsÚir   )r   r   rc   r	   r   )r   s   "r    r!   r°   
  s*   € ÷ ñ ¤4¬¥=ð ´Sð ¼XÄfÕ=Mñ r"   c                 ó   <€ VS^,
          8X  d   R# W,          pW^,           R pV Uu. uF  qD^ ,          V^ ,          8X  g   K  VNK  	  ppV Uu. uF  qD^,          V^,          8X  g   K  VNK  	  ppV F‹  pS
! W'4      '       g   K  V Fr  pS
! W(4      '       g   K  V^ ,          V^,          3p	V	S9   g   K.  S
! W˜4      '       g   K>  S
! W—4      '       g   KN  V^ ,          V^,          V	^ ,          V	^,          3u u # 	  K�  	  R# u upi u upi ©r8   NrN   )r¾   r¿   ÚptÚrestrj   ÚbelowÚrightÚbelow_ptÚright_ptÚbottom_rightr»   r¥   Ún_pointss   &&        €€€r    Úfind_smallest_cellÚ2intersections_to_cells.<locals>.find_smallest_cell
  sú   ø€ Ø�˜1•ÔÙØ�YˆØ˜!•e�gˆˆá Ó2™D�q a¥D¨B¨q­E¡M—�™DˆÐ2Ù Ó2™D�q a¥D¨B¨q­E¡M—�™DˆÐ2ÛˆHÙ  ×.Ò.Ùã!�Ù$ R×2Ò2Ùà (¨¥¨X°a­[Ð9�ð " ]Ö2Ù% l×=Ô=Ù% l×=Ô=ð ˜q�E 2 a¥5¨,°q­/¸<È½?ÐKÔKó "ñ	 ñ" ùò' 3ùÚ2s   ©DÁDÁDÁ+Dc              3   ó6   <"  € T F  pS! SV4      x € K  	  R # 5irf   rN   )rR   r¿   rÊ   r¾   s   & €€r    rU   Ú)intersections_to_cells.<locals>.<genexpr>%  s   øé € ÐJÑ7I°!Ñ" 6¨1×-Ð-Ó7Iùs   ƒN)r;   r<   Úkeysrh   Úrangerp   )r¥   Úcell_genr»   rÊ   rÉ   r¾   s   f @@@@r    Úintersections_to_cellsrÑ   ê   sb   ü€ ÷ð ô& ”&˜×+Ñ+Ó-Ó.Ó/€FÜ�6‹{€H÷ò õ6 K´u¼SÀ»[Ô7IÓJ€HÜ”�t˜XÓ&Ó'Ð'r"   c                ór   € V ^8„  d   QhR\         \        ,          R\         \         \        ,          ,          /# )r   Úcellsr   ©r   r   )r   s   "r    r!   r!   )  s'   € ÷ :ñ :œ4¤�<ð :¬D´´fµÕ,>ñ :r"   c                óD  a€ R R lp\        V 4      p\        4       o. p. p\        V4      '       Ed   \        V4      p\        V4       F£  pV! V4      p\        V4      ^ 8X  d7   S\        V4      ,          oVP                  V4       VP	                  V4       KQ  \        V3R lV 4       4      pV^ 8”  g   Ko  S\        V4      ,          oVP                  V4       VP	                  V4       K¥  	  \        V4      V8X  g   Ká  VP                  \        V4      4       SP                  4        VP                  4        EK  \        V4      '       d   VP                  \        V4      4       \        VR R7      p	V	 U
u. uF  p
\        V
4      ^8”  g   K  V
NK  	  pp
V# u up
i )zy
Given a list of bounding boxes (`cells`), return a list of tables that
hold those cells most simply (and contiguously).
c                óf   € V ^8„  d   QhR\         R\        \        \        \        \        3,          /# )r   r‹   r   )r   r   r   )r   s   "r    r!   Ú%cells_to_tables.<locals>.__annotate__/  s,   € ÷ Bñ Bœfð B¬¬w¼ÄÌ'Ð/QÕ)Rñ Br"   c                 ó    € V w  rr4W3W3W23W433# rf   rN   )r‹   r'   r(   r4   r5   s   &    r    Úbbox_to_cornersÚ(cells_to_tables.<locals>.bbox_to_corners/  s#   € Ø"Ñˆ�Ø�	˜B˜<¨"¨°R°LÐAÐAr"   c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irf   rN   )rR   rŠ   Úcurrent_cornerss   & €r    rU   Ú"cells_to_tables.<locals>.<genexpr>H  s   øé € Ð"NÁ¸A¨Ö#7Ãùs   ƒc                 ó&   € \        R  V  4       4      # )c              3   óD   "  € T F  q^,          V^ ,          3x € K  	  R# 5irÁ   rN   )rR   rŠ   s   & r    rU   Ú4cells_to_tables.<locals>.<lambda>.<locals>.<genexpr>a  s   é € Ð.GÁQÀ°!µ°a¸µd­|ÃQùs   ‚ )rs   )Úts   &r    rk   Ú!cells_to_tables.<locals>.<lambda>a  s   € ¬3Ñ.GÁQÓ.GÔ+Gr"   r6   )r;   rµ   rh   r)   ÚremoveÚsumÚclearr<   )rÓ   rÙ   Úremaining_cellsÚcurrent_cellsÚtablesÚinitial_cell_countÚcellÚcell_cornersÚcorner_countrZ   rá   ÚfilteredrÜ   s   &           @r    Úcells_to_tablesrî   )  se  ø€ õBô ˜5“k€Oô
 %(£E€OØ"$€Mà€FÜ
ˆo×
Ó
Ü  Ó/ÐÜ˜Ö)ˆDÙ*¨4Ó0ˆLä�=Ó! QÔ&à¤3 |Ó#4Õ4�Ø×$Ñ$ TÔ*Ø×&Ñ& tÖ,ô  #Ô"NÁÓ"NÓN�ð   !Ö#à#¤s¨<Ó'8Õ8�OØ!×(Ñ(¨Ô.Ø#×*Ñ*¨4Ö0ñ# *ô( ˆ}ÓÐ!3Ö3à�M‰Mœ$˜}Ó-Ô.Ø×!Ñ!Ô#Ø×Ñ×!ô
 ˆ=×Òà�‰”d˜=Ó)Ô*ô �VÑ!GÔH€GÙ"Ó1™7�a¤c¨!£f¨q¡j—�™7€HÐ1Ø€Oùò 2s   Å<FÆFc                   ó2   a € ] tR tRt o V 3R lR ltRtV tR# )Ú	CellGroupif  c                ó@   <€ V ^8„  d   QhRS[ S[S[,          ,          /# )r   rÓ   )r   r	   r   )r   Ú__classdict__s   "€r    r!   ÚCellGroup.__annotate__g  s   ø€ ÷ 
ñ 
™d¡8©FÕ#3Õ4ñ 
r"   c                óX  € Wn         \        \        \        ^ 4      \	        RV4      4      4      \        \        \        ^4      \	        RV4      4      4      \        \        \        ^4      \	        RV4      4      4      \        \        \        ^4      \	        RV4      4      4      3V n        R# )r   N)rÓ   rs   rq   r   rp   rt   r‹   )ÚselfrÓ   s   &&r    Ú__init__ÚCellGroup.__init__g  sx   € ØŒ
ä””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8ð	
ˆŽ	r"   )r‹   rÓ   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rö   Ú__static_attributes__Ú__classdictcell__©rò   s   @r    rð   rð   f  s   ø‡ € ÷
ö 
r"   rð   c                   ó   € ] tR tRtRtR# )ÚRowiq  rN   N©rø   rù   rú   rû   rü   rN   r"   r    r   r   q  ó   † Ûr"   r   c                   ó   € ] tR tRtRtR# )ÚColumniu  rN   Nr  rN   r"   r    r  r  u  r  r"   r  c                   óª   a € ] tR tRt o V 3R lR lt]V 3R lR l4       tV 3R lR lt]V 3R lR	 l4       t]V 3R
 lR l4       t	V 3R lR lt
RtV tR# )ÚTableiy  c                ó4   <€ V ^8„  d   QhRRRS[ S[,          /# )r   Úpager   rÓ   rÔ   )r   rò   s   "€r    r!   ÚTable.__annotate__z  s   ø€ ÷ ñ ˜Vð ©D±­Lñ r"   c                ó   € Wn         W n        R # rf   )r  rÓ   )rõ   r  rÓ   s   &&&r    rö   ÚTable.__init__z  s   € ØŒ	ØŽ
r"   c                ó    <€ V ^8„  d   QhRS[ /# ©r   r   )r   )r   rò   s   "€r    r!   r	    s   ø€ ÷ 
ñ 
‘fñ 
r"   c           
     ó  € V P                   p\        \        \        ^ 4      V4      4      \        \        \        ^4      V4      4      \	        \        \        ^4      V4      4      \	        \        \        ^4      V4      4      3# )r   )rÓ   rs   rq   r   rt   )rõ   rŠ   s   & r    r‹   Ú
Table.bbox~  sa   € à�J‰Jˆä””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&ð	
ð 	
r"   c                óF   <€ V ^8„  d   QhRS[ S[,          RS[S[,          /# )r   Úkindr   )r   rð   r   )r   rò   s   "€r    r!   r	  ˆ  s#   ø€ ÷ ñ ¡d©9¥oð ¹$¹y½/ñ r"   c                ó  € V\         J d   ^ M^p\        V'       * 4      p\        V P                  \	        W24      R7      p\        \        \        \        \	        V4      V P                  4      4      4      4      p\        P                  ! V\	        V4      4      p. pV FT  w  r‰V	 U
u/ uF  qªV,          V
bK  	  pp
T! V Uu. uF  qËP                  V4      NK  	  up4      pVP                  V4       KV  	  V# u up
i u upi )r   r6   )r   rc   r<   rÓ   r   r;   rµ   rq   rW   rX   Úgetr)   )rõ   r  ÚaxisÚantiaxisrZ   ÚxsÚgroupedÚrowsÚyÚ	row_cellsrê   Úxdictrj   Úrows   &&            r    Ú_get_rows_or_colsÚTable._get_rows_or_colsˆ  sÖ   € ØœC“K‰q QˆÜ˜4”x“=ˆô ˜Ÿ™¬°HÓ)CÔDˆô ”&œœS¤¨DÓ!1°4·:±:Ó>Ó?Ó@ÓAˆô ×#Ò# G¬Z¸Ó-AÓBˆàˆã#‰LˆAÙ2;Ó<±)¨$˜$•Z Ò%±)ˆEÐ<Ù©bÓ1©b¨Ÿ	™	 !ž©bÑ1Ó2ˆCØ�K‰K˜Öñ $ð ˆùò =ùÚ1s   Â&C7Ã C<
c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r  ©r   rð   )r   rò   s   "€r    r!   r	  ž  s   ø€ ÷ +ñ +‘d™9•oñ +r"   c                ó,   € V P                  \        4      # rf   )r  r   ©rõ   s   &r    r  Ú
Table.rows�  s   € à×%Ñ%¤cÓ*Ð*r"   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r  r   )r   rò   s   "€r    r!   r	  ¢  s   ø€ ÷ .ñ .™™i�ñ .r"   c                ó,   € V P                  \        4      # rf   )r  r  r"  s   &r    ÚcolumnsÚTable.columns¡  s   € à×%Ñ%¤fÓ-Ð-r"   c                óV   <€ V ^8„  d   QhRS[ RS[S[S[S[,          ,          ,          /# )r   Úkwargsr   )r   r   r	   r2   )r   rò   s   "€r    r!   r	  ¥  s)   ø€ ÷ $ñ $¡ð $©©T±(¹3µ-Õ-@Õ(Añ $r"   c           	     ó`  € V P                   P                  p. pR  R lpV P                   Fõ  p. pV Uu. uF  qt! WuP                  4      '       g   K  VNK   	  ppVP                   F¥  p	V	f   Rp
MŠV Uu. uF  qt! Wy4      '       g   K  VNK  	  pp\        V4      '       dX   RV9   d9   V	^,          V	^ ,          ,
          VR&   V	^,          V	^,          ,
          VR&   W‘R&   \        P                  ! V3/ VB p
MRp
VP                  V
4       K§  	  VP                  V4       K÷  	  V# u upi u upi )c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   Úcharr‹   r   )r   r   r¯   )r   s   "r    r!   Ú#Table.extract.<locals>.__annotate__ª  s!   € ÷ 	ñ 	œuð 	¬Fð 	´tñ 	r"   c                 óæ   € V R ,          V R,          ,           ^,          pV R,          V R,          ,           ^,          pVw  rErg\        W48¬  ;'       d    W68  ;'       d    W%8¬  ;'       d    W'8  4      # )r(   r5   r'   r4   )r¯   )r,  r‹   Úv_midÚh_midr'   r(   r4   r5   s   &&      r    Úchar_in_bboxÚ#Table.extract.<locals>.char_in_bboxª  sj   € Ø˜%•[ 4¨¥>Õ1°QÕ6ˆEØ˜$•Z $ t¥*Õ,°Õ1ˆEØ"&ÑˆB�RÜØ‘×VÐV 5¡:×VÐV°E±L×VÐVÀuÁ~óð r"   NÚlayoutÚlayout_widthÚlayout_heightÚlayout_bboxÚ )	r  Úcharsr  r‹   rÓ   rh   r   Úextract_textr)   )rõ   r)  r8  Ú	table_arrr1  r  Úarrr,  Ú	row_charsrê   Ú	cell_textÚ
cell_charss   &,          r    ÚextractÚTable.extract¥  s   € à—	‘	—‘ˆØˆ	õ	ð —9”9ˆCØˆCÙ*/ÓP©% $°<ÀÇhÁh×3OŸ˜©%ˆIÐPàŸ	œ	�Ø’<Ø $‘Iñ *3ó"Ù)2 °lÀ4×6NŸ˜©ð ð "ô ˜:—’Ø# vÔ-Ø59¸!µW¸tÀA½wÕ5F˜F >Ñ2Ø6:¸1µgÀÀQÅÕ6G˜F ?Ñ3Ø48 =Ñ1Ü$)×$6Ò$6°zÑ$LÀVÑ$L™	à$&˜	Ø—
‘
˜9Ö%ñ! "ð" ×Ñ˜SÖ!ñ+ ð. Ðùò+ Qùò"s   ´D&ÁD&Á4D+ÂD+)rÓ   r  N)rø   rù   rú   rû   rö   Úpropertyr‹   r  r  r&  r?  rü   rý   rþ   s   @r    r  r  y  s_   ø‡ € ÷ð ð ÷
ó ð
÷ð ð* ÷+ó ð+ð ÷.ó ð.÷$ö $r"   r  c                   ó   € ] tR tRtRtR# )Ú
UnsetFloatiÞ  rN   Nr  rN   r"   r    rC  rC  Þ  r  r"   rC  c                   ó¢   a € ] tR tRt o RtRtRtRt]t	]
t]
t]t]
t]
t^t^t]t]t^t]
t]
tRtV 3R lR lt]V 3R lR l4       tV 3R ltR	tV t R# )
r   iå  ÚlinesNc                ó   <€ V ^8„  d   QhRR/# )r   r   NrN   )r   rò   s   "€r    r!   ÚTableSettings.__annotate__ú  s   ø€ ÷ 1=ñ 1=˜tñ 1=r"   c           	     ó^  € \          F,  p\        W4      ;'       g    ^ ^ 8  g   K  \        RV R24      h	  R	 FD  p\        WR,           4      pV\        9  g   K"  \        V RRP	                  \        4       R24      h	  V P
                  f   / V n        R
 F>  pW@P
                  9  g   K  V P
                  P                  R^4      V P
                  V&   K@  	  RV P
                  9   d   V P
                  R R F/  w  rE\        W4      \        J g   K  \        W\        W4      4       K1  	  R# )ao  Clean up user-provided table settings.

Validates that the table settings provided consists of acceptable values and
returns a cleaned up version. The cleaned up version fills out the missing
values with the default values in the provided settings.

TODO: Can be further used to validate that the values are of the correct
    type. For example, raising a value error when a non-boolean input is
    provided for the key ``keep_blank_chars``.

:param table_settings: User-provided table settings.
:returns: A cleaned up version of the user-provided table settings.
:raises ValueError: When an unrecognised key is provided.
zTable setting 'z' cannot be negativeÚ	_strategyz_strategy must be one of{Ú,Ú}Nr1   )Ú
horizontalÚvertical)r   r   ))rE   Úsnap_tolerance)rF   rN  )rG   Újoin_tolerance)rH   rO  )Úintersection_x_toleranceÚintersection_tolerance)Úintersection_y_tolerancerQ  )	ÚNON_NEGATIVE_SETTINGSÚgetattrr:   ÚTABLE_STRATEGIESÚjoinÚtext_settingsr  ÚUNSETÚsetattr)rõ   Úsettingr&   ÚstrategyÚattrÚfallbacks   &     r    Ú__post_init__ÚTableSettings.__post_init__ú  s%  € ÷  -ˆGÜ˜Ó&×+Ð+¨!¨qÖ0Ü  ?°7°)Ð;OÐ!PÓQÐQñ -ó 6ˆKÜ˜t°;Õ%>Ó?ˆHØÔ/Ö/Ü Ø"�mð $ØŸ™Ô"2Ó3Ð4°Bð8óð ñ 6ð ×ÑÒ%Ø!#ˆDÔó 3ˆDØ×-Ñ-Ö-Ø+/×+=Ñ+=×+AÑ+AÀ+ÈqÓ+Q�×"Ñ" 4Ó(ñ 3ð ˜$×,Ñ,Ô,Ø×"Ñ" ;Ð/ó
‰NˆDô �tÓ"¤eÕ+Ü˜¤G¨DÓ$;Ö<ó
r"   c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   Úsettingsr   r   ©r	   ÚT_table_settings)r   rò   s   "€r    r!   rG  .  s%   ø€ ÷ Eñ E™xÑ(8Õ9ð E¸oñ Er"   c                ó  € Vf   V ! 4       # \        W4      '       d   V# \        V\        4      '       dI   / p/ pVP                  4        F$  w  rEVR,          R8X  d   WSVR,          &   K   WRV&   K&  	  W2R&   V ! R/ VB # \        RV 24      h)N:Né   NÚtext_:re  NNrW  zCannot resolve settings: rN   )Ú
isinstanceÚdictrT   r:   )Úclsra  Úcore_settingsrW  rS   r$   s   &&    r    ÚresolveÚTableSettings.resolve-  s”   € àÒÙ“5ˆLÜ˜×&Ò&ØˆOÜ˜¤$×'Ò'ØˆMØˆMØ Ÿ™Ö(‘�Ø�R•5˜GÔ#Ø+, ! B¥%Ó(à'( !Ó$ñ	 )ð
 .;˜/Ñ*ÙÑ'˜Ñ'Ð'äÐ8¸¸
ÐCÓDÐDr"   c                ó„  <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[S[S[S[S[3,          ,          ,          ;R&   S[S[S[S[S[3,          ,          ,          ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R	&   S[;R
&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[S[S[ S[3,          ,          ;R&   # )r   Úvertical_strategyÚhorizontal_strategyÚexplicit_vertical_linesÚexplicit_horizontal_linesrN  rE   rF   rO  rG   rH   Úedge_min_lengthÚedge_min_length_prefilterÚmin_words_verticalÚmin_words_horizontalrQ  rP  rR  rW  )	r2   r	   r   r   r   r   rc   r   r   )r   rò   s   "€r    r!   rG  å  s   ø‡ ‚ áÑ$ñ ñ Ñ&ñ ñ &¡d©5±¹°Õ+>Õ&?Õ@ÑGñ	 ñ
  (©©U±5¹%°<Õ-@Õ(AÕBÑIñ ñ Ñ2ñ ñ Ñ#ñ ñ Ñ#ñ ñ Ñ2ñ ñ Ñ#ñ ñ Ñ#ñ ñ Ññ ñ  %Ñ(ñ ñ Ñ8ñ ñ Ñ<ñ ñ  "Ñ%ñ! ñ" $Ñ+ñ# ñ$ $Ñ+ñ% ñ& ™D¡¡c �NÕ+Ñ2ò' r"   )rW  )!rø   rù   rú   rû   rn  ro  rp  rq  ÚDEFAULT_SNAP_TOLERANCErN  rX  rE   rF   ÚDEFAULT_JOIN_TOLERANCErO  rG   rH   rr  rs  ÚDEFAULT_MIN_WORDS_VERTICALrt  ÚDEFAULT_MIN_WORDS_HORIZONTALru  rQ  rP  rR  rW  r^  Úclassmethodrk  Ú__annotate_func__rü   rý   rþ   s   @r    r   r   å  s–   ø‡ € à$ÐØ&ÐØCGÐØEIÐØ2€NØ#ÐØ#ÐØ2€NØ#ÐØ#ÐØ€OØ'(ÐØ8ÐØ <ÐØ$%ÐØ&+ÐØ&+ÐØ.2€M÷1=ð 1=ðf ÷Eó ðE÷S ƒ r"   c                   óL   a € ] tR tRt o RtR	V 3R lR lltV 3R lR ltRtV tR# )
ÚTableFinderiA  a  
Given a PDF page, find plausible table structures.

Largely borrowed from Anssi Nurminen's master's thesis:
http://dspace.cc.tut.fi/dpub/bitstream/handle/123456789/21520/Nurminen.pdf?sequence=3

... and inspired by Tabula:
https://github.com/tabulapdf/tabula-extractor/issues/16
Nc                ó4   <€ V ^8„  d   QhRRRS[ S[,          /# )r   r  r   ra  rb  )r   rò   s   "€r    r!   ÚTableFinder.__annotate__L  s!   ø€ ÷ 
ñ 
˜Vð 
©xÑ8HÕ/Iñ 
r"   c                ó²  € Wn         \        P                  V4      V n        V P	                  4       V n        \        V P
                  V P                  P                  V P                  P                  4      V n	        \        V P                  4      V n        \        V P                  4       Uu. uF  p\        V P                   V4      NK  	  upV n        R # u upi rf   )r  r   rk  ra  Ú	get_edgesr   r©   rP  rR  r¥   rÑ   rÓ   rî   r  rè   )rõ   r  ra  Ú
cell_groups   &&& r    rö   ÚTableFinder.__init__L  sž   € ØŒ	Ü%×-Ñ-¨hÓ7ˆŒØ—^‘^Ó%ˆŒ
Ü3Ø�J‰JØ�M‰M×2Ñ2Ø�M‰M×2Ñ2ó
ˆÔô
 ,¨D×,>Ñ,>Ó?ˆŒ
ä;JÈ4Ï:É:Ô;Vó
Ù;V¨ZŒE�$—)‘)˜ZÖ(Ñ;Vñ
ˆŽùò 
s   Â+Cc                ó    <€ V ^8„  d   QhRS[ /# r  )r   )r   rò   s   "€r    r!   r  Z  s   ø€ ÷ iNñ iN™:ñ iNr"   c                óD	  € V P                   pR FZ  p\        WR,           4      pVR8X  g   K  \        VRV,           R,           4      p\        V4      ^8  g   KJ  \        RV RV R24      h	  VP                  pVP
                  pVR8X  g   VR8X  d1   V P                  P                  ! R/ VP                  ;'       g    / B p. pVP                  ;'       g    .  Fé  p	\        V	\        4      '       dA   \        P                  ! V	4       F$  p
V
R	,          R
8X  g   K  VP                  V
4       K&  	  KY  VP                  RV	RV	RV P                  P                  ^,          RV P                  P                  ^,          RV P                  P                  ^,          V P                  P                  ^,          ,
          R	R
/4       Kë  	  VR8X  d9   \        P                   ! V P                  P"                  R
VP$                  R7      pMhVR8X  d:   \        P                   ! V P                  P"                  R
RVP$                  R7      pM(VR8X  d   \'        XVP(                  R7      pM	VR8X  d   . pXV,           p. pVP*                  ;'       g    .  Fé  p	\        V	\        4      '       dA   \        P                  ! V	4       F$  p
V
R	,          R8X  g   K  VP                  V
4       K&  	  KY  VP                  RV P                  P                  ^ ,          RV P                  P                  ^,          RV P                  P                  ^,          V P                  P                  ^ ,          ,
          RV	RV	R	R/4       Kë  	  VR8X  d9   \        P                   ! V P                  P"                  RVP$                  R7      pMhVR8X  d:   \        P                   ! V P                  P"                  RRVP$                  R7      pM(VR8X  d   \-        XVP.                  R7      pM	VR8X  d   . pXV,           p\1        V4      \1        V4      ,           p\3        VVP4                  VP6                  VP8                  VP:                  R7      p\        P                   ! VVP<                  R7      # )rM  rI  ÚexplicitÚ	explicit_Ú_lineszIf z"_strategy == 'explicit', explicit_zD_lines must be specified as a list/tuple of two or more floats/ints.Útextr&   r$   r'   r4   r(   r5   r�   rE  )Ú
min_lengthÚlines_strictÚline)Ú	edge_typerŠ  )ra   r%   rn   )rE   rF   rG   rH   )rM  rL  rN   )ra  rT  rh   r:   rn  ro  r  Úextract_wordsrW  rp  rg  rh  r   Úobj_to_edgesr)   r‹   Úfilter_edgesr   rs  rž   rt  rq  r{   ru  r;   r]   rE   rF   rG   rH   rr  )rõ   ra  r&   r[  rE  Úv_stratÚh_stratr`   Ú
v_explicitÚdescr,   Úv_baser$   Ú
h_explicitÚh_baser%   r   s   &                r    r�  ÚTableFinder.get_edgesZ  sâ  € Ø—=‘=ˆã5ˆKÜ˜x°{Õ)BÓCˆHØ˜:Ö%Ü ¨+¸Õ*CÀhÕ*NÓO�Ü�u“: –>Ü$Ø˜k˜]ð +$Ø$/ =ð 1'ð(óð ñ 6ð ×,Ñ,ˆØ×.Ñ.ˆà�fÔ ¨6Ô 1Ø—I‘I×+Ò+ÑM¨x×/EÑ/E×/KÐ/KÈÑMˆEàˆ
Ø×4Ñ4×:Ð:¸Ò:ˆDÜ˜$¤×%Ò%Ü×+Ò+¨DÖ1�AØ˜Õ'¨3Ö.Ø"×)Ñ)¨!Ö,ó 2ð ×!Ñ!à˜dØ˜dØ˜tŸy™yŸ~™~¨aÕ0Ø  $§)¡)§.¡.°Õ"3Ø  $§)¡)§.¡.°Õ"3°d·i±i·n±nÀQÕ6GÕ"GØ% sðö	ñ ;ð" �gÔÜ×'Ò'Ø—	‘	—‘ °×1SÑ1Sô‰Fð ˜Ô&Ü×'Ò'Ø—	‘	—‘ØØ Ø#×=Ñ=ô	‰Fð ˜ÔÜ% e¸H×<WÑ<WÔX‰FØ˜
Ô"ØˆFà�ZÕˆàˆ
Ø×6Ñ6×<Ð<¸"Ò<ˆDÜ˜$¤×%Ò%Ü×+Ò+¨DÖ1�AØ˜Õ'¨3Ö.Ø"×)Ñ)¨!Ö,ó 2ð ×!Ñ!à˜dŸi™iŸn™n¨QÕ/Ø˜dŸi™iŸn™n¨QÕ/Ø §¡§¡°Õ!2°T·Y±Y·^±^ÀAÕ5FÕ!FØ˜tØ  $Ø% sðö	ñ =ð" �gÔÜ×'Ò'Ø—	‘	—‘ °×1SÑ1Sô‰Fð ˜Ô&Ü×'Ò'Ø—	‘	—‘ØØ Ø#×=Ñ=ô	‰Fð ˜ÔÜ%Ø h×&CÑ&Cô‰Fð ˜
Ô"ØˆFà�ZÕˆä�Q“œ$˜q›'Õ!ˆäØØ%×6Ñ6Ø%×6Ñ6Ø%×6Ñ6Ø%×6Ñ6ô
ˆô ×!Ò! %°H×4LÑ4LÔMÐMr"   )rÓ   r   r¥   r  ra  rè   rf   )	rø   rù   rú   rû   Ú__doc__rö   r�  rü   rý   rþ   s   @r    r}  r}  A  s"   ø‡ € ñ÷
ò 
÷iNö iNr"   r}  )r8   r8   )rE  r‹  r‰  r†  )rN  rE   rF   rO  rG   rH   rr  rs  rt  ru  rQ  rP  rR  )5rW   Údataclassesr   Úoperatorr   Útypingr   r   r   r   r	   r
   r   r   r   r7  r   Ú_typingr   r   r   r   r   r   rv  rw  rx  ry  r2   r    rc  r  r   r/   rC   r]   r{   rž   r©   rÑ   rî   Úobjectrð   r   r  r  rU  rS  r‚   rC  rX  r   r}  rN   r"   r    Ú<module>rŸ     s@  ðÛ Ý !Ý ß T× TÕ Tå ß J× JàÐ ØÐ ØÐ Ø Ð à�w  S¨* _Õ 5Ð5Õ6€Ø˜¨$¨s°C¨x­.Ð8Õ9Ð çÝð
 0Ø/÷!ð& =S÷õ:ðD .J÷(ðX .H÷<÷~õ6<(õ~:ôz
�ô 
ô	ˆ)ô 	ô	ˆYô 	ôPˆFô Pòf AÐ òÐ ô"	�ô 	ñ 	�1‹€ð ÷XEð XEó ðXEôvBN�&ö BNr"   