§
    eÒ³gO]  ã                   óÔ  — d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZmZmZmZmZmZ dZdZdZdZeeeeef         f         Zed	eeef         f         Zerdd
lm Z  eefdedededefd„Z!efdedededefd„Z"dedededededefd„Z#efdede$defd„Z%efdede$defd„Z&	 d0dedededefd„Z'dede	e         fd„Z(de	e         de	e	e                  fd „Z) G d!„ d"e*¦  «        Z+ G d#„ d$e+¦  «        Z, G d%„ d&e+¦  «        Z- G d'„ d(e*¦  «        Z.g d)¢Z/g d*¢Z0 G d+„ d,e1¦  «        Z2 e2d ¦  «        Z3e G d-„ d	¦  «        ¦   «         Z4 G d.„ d/e*¦  «        Z5dS )1é    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)ÚPageÚedgesÚx_toleranceÚy_toleranceÚreturnc                 óÒ   — g g dœ}| D ]#}||d                                        |¦  «         Œ$t          j        |d         d|¦  «        }t          j        |d         d|¦  «        }||z   S )zs
    Given a list of edges, snap any within `tolerance` pixels of one another
    to their positional average.
    ©ÚvÚhÚorientationr   Úx0r    Útop)Úappendr   Úsnap_objects)r   r   r   Úby_orientationÚeÚ	snapped_vÚ	snapped_hs          úN/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/pdfplumber/table.pyÚ
snap_edgesr+      s~   € ð 35¸2Ð,>Ð,>€NØð 3ð 3ˆØ�q˜Ô'Ô(×/Ò/°Ñ2Ô2Ð2Ð2åÔ" >°#Ô#6¸¸kÑJÔJ€IÝÔ" >°#Ô#6¸¸{ÑKÔK€IØ�yÑ Ð ó    r!   Ú	tolerancec                 óž  — |dk    rd\  }}n|dk    rd\  }}nt          d¦  «        ‚t          t          | t          |¦  «        ¬¦  «        ¦  «        }|d         g}|dd	…         D ]f}|d
         }||         ||         |z   k    r2||         ||         k    rt	          j        ||||         ¦  «        |d
<   ŒQ|                     |¦  «         Œg|S )z
    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'©Úkeyr   r   Néÿÿÿÿ)Ú
ValueErrorÚlistÚsortedr   r   Úresize_objectr$   )	r   r!   r-   Úmin_propÚmax_propÚsorted_edgesÚjoinedr'   Úlasts	            r*   Újoin_edge_groupr=   '   sô   € ð �cÒÐØ'Ñˆ�(�(Ø	˜Ò	Ð	Ø,Ñˆ�(�(åÐ9Ñ:Ô:Ð:å�˜u­*°XÑ*>Ô*>Ð?Ñ?Ô?Ñ@Ô@€LØ˜1ŒoÐ€FØ˜!˜"˜"Ôð ð ˆØ�bŒzˆØˆXŒ;˜4 œ>¨IÑ5Ò6Ð6Ø�Œ{˜T (œ^Ò+Ð+å"Ô0°°xÀÀ8ÄÑMÔM��r‘
øð �MŠM˜!ÑÔÐÐà€Mr,   Úsnap_x_toleranceÚsnap_y_toleranceÚjoin_x_toleranceÚjoin_y_tolerancec                 ó.  ‡‡— dt           dt          t          t          f         fd„}|dk    s|dk    rt	          | ||¦  «        } t          | |¬¦  «        }t          j        ||¬¦  «        }ˆˆfd„|D ¦   «         }t          t          j	        |Ž ¦  «        } | S )z|
    Using the `snap_edges` and `join_edge_group` methods above,
    merge a list of edges into a more "seamless" list.
    Úedger   c                 óB   — | d         dk    r
d| d         fS d| d         fS )Nr!   r    r#   r   r"   © )rC   s    r*   Ú	get_groupzmerge_edges.<locals>.get_groupP   s0   € Ø�Ô #Ò%Ð%Ø˜˜eœÐ%Ð%à˜˜dœÐ$Ð$r,   r   r1   c              3   óh   •K  — | ],\  }}t          ||d          |d          dk    r‰n‰¦  «        V — Œ-dS )r   r    N)r=   )Ú.0ÚkÚitemsr@   rA   s      €€r*   ú	<genexpr>zmerge_edges.<locals>.<genexpr>[   se   øè è € ð ð ñ ˆAˆuõ 	Ø�1�Q”4¨a°¬d°cªk¨kÐ*Ð*Ð?Oñ	
ô 	
ðð ð ð ð ð r,   )
r   r   Ústrr   r+   r6   Ú	itertoolsÚgroupbyr5   Úchain)	r   r>   r?   r@   rA   rF   Ú_sortedÚedge_groupsÚedge_gens	      ``    r*   Úmerge_edgesrS   D   sË   øø€ ð%�ð %¥%­­U¨
Ô"3ð %ð %ð %ð %ð ˜!ÒÐÐ/°!Ò3Ð3Ý˜5Ð"2Ð4DÑEÔEˆå�U 	Ð*Ñ*Ô*€GÝÔ# G°Ð;Ñ;Ô;€Kðð ð ð ð ð $ð	ñ ô €Hõ •” (Ð+Ñ,Ô,€EØ€Lr,   ÚwordsÚword_thresholdc           
      ó  ‡— t          j        | t          d¦  «        d¦  «        }t          ˆfd„|¦  «        }t	          t          t           j        |¦  «        ¦  «        }t          |¦  «        dk    rg S t          t          t          d¦  «        |¦  «        ¦  «        }t          t          t          d¦  «        |¦  «        ¦  «        }g }|D ]5}||||d         |d         ||z
  ddœ|||d	         |d	         ||z
  ddœgz  }Œ6|S )
zi
    Find (imaginary) horizontal lines that connect the tops
    of at least `word_threshold` words.
    r#   r   c                 ó*   •— t          | ¦  «        ‰k    S ©N©Úlen©ÚxrU   s    €r*   ú<lambda>z"words_to_edges_h.<locals>.<lambda>m   ó   ø€ ¥c¨!¡f¤f°Ò&>€ r,   r   r"   r/   r    )r"   r/   r#   r0   Úwidthr!   r0   )
r   Úcluster_objectsr   Úfilterr5   ÚmapÚobjects_to_rectrZ   ÚminÚmax)	rT   rU   Úby_topÚlarge_clustersÚrectsÚmin_x0Úmax_x1r   Úrs	    `       r*   Úwords_to_edges_hrl   e   s&  ø€ õ Ô" 5­*°UÑ*;Ô*;¸QÑ?Ô?€FÝÐ>Ð>Ð>Ð>ÀÑGÔG€NÝ••UÔ*¨NÑ;Ô;Ñ<Ô<€EÝ
ˆ5�z„z�Q‚€Øˆ	Ý••Z Ñ%Ô% uÑ-Ô-Ñ.Ô.€FÝ••Z Ñ%Ô% uÑ-Ô-Ñ.Ô.€Fà€EØð 
ð 
ˆØð ØØ˜”xØ˜Eœ(Ø &™Ø"ðð ð ØØ˜”{Ø˜Hœ+Ø &™Ø"ðð ð
ñ 	
ˆˆð. €Lr,   c                 óê  ‡‡‡‡— t          j        | t          d¦  «        d¦  «        }t          j        | t          d¦  «        d¦  «        }dt          dt          fd„}t          j        | |d¦  «        }||z   |z   }t          |d„ ¬¦  «        }t          ˆfd	„|¦  «        }t          t          t           j	        |¦  «        ¦  «        }	g }
|	D ]4Št          ˆfd
„|
D ¦   «         ¦  «        }|s|
                     ‰¦  «         Œ5t          |
¦  «        dk    rg S t          t           j        |
¦  «        }t          t          |t          d¦  «        ¬¦  «        ¦  «        }t          t          t          d¦  «        |¦  «        ¦  «        }t          t          t          d¦  «        |¦  «        ¦  «        Št          t          t          d¦  «        |¦  «        ¦  «        Šˆˆfd„|D ¦   «         ||‰‰‰‰z
  ddœgz   S )zy
    Find (imaginary) vertical lines that connect the left, right, or
    center of at least `word_threshold` words.
    r"   r   r/   Úwordr   c                 óD   — t          | d         | d         z   ¦  «        dz  S )Nr"   r/   é   )Úfloat)rn   s    r*   Ú
get_centerz$words_to_edges_v.<locals>.get_center›   s"   € Ý�T˜$”Z $ t¤*Ñ,Ñ-Ô-°Ñ1Ð1r,   c                 ó"   — t          | ¦  «         S rX   rY   )r\   s    r*   r]   z"words_to_edges_v.<locals>.<lambda>¢   s   € µc¸!±f´f°W€ r,   r1   c                 ó*   •— t          | ¦  «        ‰k    S rX   rY   r[   s    €r*   r]   z"words_to_edges_v.<locals>.<lambda>£   r^   r,   c              3   óB   •K  — | ]}t          j        ‰|¦  «        V — Œd S rX   )r   Úget_bbox_overlap)rH   ÚcÚbboxs     €r*   rK   z#words_to_edges_v.<locals>.<genexpr>«   s0   øè è € ÐPÐP¸!•eÔ,¨T°1Ñ5Ô5ÐPÐPÐPÐPÐPÐPr,   r   r#   r0   c           	      ó@   •— g | ]}|d          |d          ‰‰‰‰z
  ddœ‘ŒS )r"   r   ©r"   r/   r#   r0   Úheightr!   rE   )rH   ÚbÚ
max_bottomÚmin_tops     €€r*   ú
<listcomp>z$words_to_edges_v.<locals>.<listcomp>¹   sQ   ø€ ð 
ð 
ð 
ð ð �D”'Ø�D”'ØØ Ø  7Ñ*Øð	
ð 	
ð
ð 
ð 
r,   r   rz   )r   r`   r   r   r   r6   ra   r5   rb   Úobjects_to_bboxÚanyr$   rZ   Úbbox_to_rectre   rd   )rT   rU   Úby_x0Úby_x1rr   Ú	by_centerÚclustersÚsorted_clustersrg   ÚbboxesÚcondensed_bboxesÚoverlapÚcondensed_rectsÚsorted_rectsrj   rx   r}   r~   s    `             @@@r*   Úwords_to_edges_vr�   �   s4  øøøø€ õ Ô! %­°DÑ)9Ô)9¸1Ñ=Ô=€EÝÔ! %­°DÑ)9Ô)9¸1Ñ=Ô=€Eð2�ð 2¥5ð 2ð 2ð 2ð 2õ Ô% e¨Z¸Ñ;Ô;€IØ�u‰}˜yÑ(€Hõ ˜XÐ+<Ð+<Ð=Ñ=Ô=€OÝÐ>Ð>Ð>Ð>ÀÑPÔP€Nõ •#•eÔ+¨^Ñ<Ô<Ñ=Ô=€Fð &(ÐØð *ð *ˆÝÐPÐPÐPÐPÐ?OÐPÑPÔPÑPÔPˆØð 	*Ø×#Ò# DÑ)Ô)Ð)øå
ÐÑÔ Ò!Ð!Øˆ	å�%Ô,Ð.>Ñ?Ô?€OÝ�˜µJ¸tÑ4DÔ4DÐEÑEÔEÑFÔF€Lå••Z Ñ%Ô% |Ñ4Ô4Ñ5Ô5€FÝ•#•j Ñ'Ô'¨Ñ6Ô6Ñ7Ô7€GÝ•S� HÑ-Ô-¨|Ñ<Ô<Ñ=Ô=€Jð
ð 
ð 
ð 
ð 
ð ð
ñ 
ô 
ð ØØØ Ø  7Ñ*Øð	
ð 	
ð		ñð r,   c                 ó  ‡ — i }ˆ fd„dD ¦   «         \  }}t          |t          dd¦  «        ¬¦  «        D ]Ö}t          |t          dd¦  «        ¬¦  «        D ]´}|d         |d         |z   k    r�|d         |d         |z
  k    rˆ|d         |d         |z
  k    rs|d         |d         |z   k    r^|d         |d         f}||vrg g dœ||<   ||         d                              |¦  «         ||         d	                              |¦  «         ŒµŒ×|S )
zi
    Given a list of edges, return the points at which they intersect
    within `tolerance` pixels.
    c                 óR   •‡— g | ]"Št          t          ˆfd „‰¦  «        ¦  «        ‘Œ#S )c                 ó   •— | d         ‰k    S )Nr!   rE   )r\   Úos    €r*   r]   z3edges_to_intersections.<locals>.<listcomp>.<lambda>Ø   s   ø€ ˜a Ô.°!Ò3€ r,   )r5   ra   )rH   r‘   r   s    @€r*   r   z*edges_to_intersections.<locals>.<listcomp>×   sC   øø€ ð ð ð ØAB��VÐ3Ð3Ð3Ð3°UÑ;Ô;Ñ<Ô<ðð ð r,   r   r"   r#   r1   r0   r/   r   r    )r6   r   r$   )	r   r   r   ÚintersectionsÚv_edgesÚh_edgesr   r    Úvertexs	   `        r*   Úedges_to_intersectionsr–   Ï   s^  ø€ ð &(€Mðð ð ð ØFPðñ ô Ñ€GˆWõ �G¥¨D°%Ñ!8Ô!8Ð9Ñ9Ô9ð 5ð 5ˆÝ˜¥Z°°tÑ%<Ô%<Ð=Ñ=Ô=ð 	5ð 	5ˆAà�5”˜a œh¨Ñ4Ò5Ð5Ø�x”[ Q u¤X°Ñ%;Ò<Ð<Ø�t”W  4¤¨;Ñ!6Ò7Ð7Ø�t”W  4¤¨;Ñ!6Ò7Ð7à˜Dœ' 1 U¤8Ð,�Ø Ð.Ð.Ø24¸2Ð,>Ð,>�M &Ñ)Ø˜fÔ% cÔ*×1Ò1°!Ñ4Ô4Ð4Ø˜fÔ% cÔ*×1Ò1°!Ñ4Ô4Ð4øð	5ð Ðr,   r’   c                 ó®  ‡ ‡‡‡‡— dt           dt           dt          fˆ fd„Št          t          ‰                      ¦   «         ¦  «        ¦  «        Št          ‰¦  «        Šdt          t                    dt          dt          t                   fˆˆ ˆfd„Šˆˆfd„t          t          ‰¦  «        ¦  «        D ¦   «         }t          t          d	|¦  «        ¦  «        S )
a8  
    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.
    Úp1Úp2r   c                 óÊ  •— dt           dt          t                   fd„}| d         |d         k    rP |‰|          d         ¦  «                              |‰|         d         ¦  «        ¦  «        }t	          |¦  «        rdS | d         |d         k    rP |‰|          d         ¦  «                              |‰|         d         ¦  «        ¦  «        }t	          |¦  «        rdS d	S )
Nr   r   c                 óP   — t          t          t          j        | ¦  «        ¦  «        S rX   )Úsetrb   r   Úobj_to_bbox)r   s    r*   Úedges_to_setzCintersections_to_cells.<locals>.edge_connects.<locals>.edges_to_setõ   s   € Ý•s�5Ô,¨eÑ4Ô4Ñ5Ô5Ð5r,   r   r   Tr   r    F)r   r
   r   ÚintersectionrZ   )r˜   r™   rž   Úcommonr’   s       €r*   Úedge_connectsz-intersections_to_cells.<locals>.edge_connectsô   sü   ø€ ð	6¥
ð 	6­sµ6¬{ð 	6ð 	6ð 	6ð 	6ð ˆaŒ5�B�q”EŠ>ˆ>Ø!�\ -°Ô"3°CÔ"8Ñ9Ô9×FÒFØ�˜]¨2Ô.¨sÔ3Ñ4Ô4ñô ˆFõ �6‰{Œ{ð Ø�tàˆaŒ5�B�q”EŠ>ˆ>Ø!�\ -°Ô"3°CÔ"8Ñ9Ô9×FÒFØ�˜]¨2Ô.¨sÔ3Ñ4Ô4ñô ˆFõ �6‰{Œ{ð Ø�tØˆur,   ÚpointsÚic                 óf  •‡— |‰dz
  k    rd S | |         Š| |dz   d …         }ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }|D ]o} ‰	‰|¦  «        sŒ|D ]]} ‰	‰|¦  «        sŒ|d         |d         f}|‰
v r: ‰	||¦  «        r. ‰	||¦  «        r"‰d         ‰d         |d         |d         fc c S Œ^Œpd S )Nr   c                 ó8   •— g | ]}|d          ‰d          k    ¯|‘ŒS )r   rE   ©rH   r\   Úpts     €r*   r   zFintersections_to_cells.<locals>.find_smallest_cell.<locals>.<listcomp>  ó&   ø€ Ð2Ð2Ð2�q A a¤D¨B¨q¬E¢M M� M M Mr,   c                 ó8   •— g | ]}|d          ‰d          k    ¯|‘ŒS ©r   rE   r¦   s     €r*   r   zFintersections_to_cells.<locals>.find_smallest_cell.<locals>.<listcomp>  r¨   r,   r   rE   )r¢   r£   ÚrestÚbelowÚrightÚbelow_ptÚright_ptÚbottom_rightr§   r¡   r’   Ún_pointss           @€€€r*   Úfind_smallest_cellz2intersections_to_cells.<locals>.find_smallest_cell
  s6  øø€ Ø�˜1‘ÒÐØ�4Ø�AŒYˆØ�a˜!‘e�g�gŒˆà2Ð2Ð2Ð2˜DÐ2Ñ2Ô2ˆØ2Ð2Ð2Ð2˜DÐ2Ñ2Ô2ˆØð 	Lð 	LˆHØ �=  XÑ.Ô.ð Øà!ð Lð L�Ø$�} R¨Ñ2Ô2ð Øà (¨¤¨X°a¬[Ð9�ð " ]Ð2Ð2Ø%˜ l°HÑ=Ô=ð 3à%˜ l°HÑ=Ô=ð 3ð
 ˜qœE 2 a¤5¨,°q¬/¸<È¼?ÐKÐKÐKÐKÐKÐKøðLð ˆtr,   c              3   ó0   •K  — | ]} ‰‰|¦  «        V — Œd S rX   rE   )rH   r£   r²   r¢   s     €€r*   rK   z)intersections_to_cells.<locals>.<genexpr>%  s1   øè è € ÐJÐJ°!Ð"Ð" 6¨1Ñ-Ô-ÐJÐJÐJÐJÐJÐJr,   N)r   Úboolr5   r6   ÚkeysrZ   r   Úintr	   r   Úrangera   )r’   Úcell_genr¡   r²   r±   r¢   s   ` @@@@r*   Úintersections_to_cellsr¹   ê   só   øøøøø€ ð�'ð ¥wð µ4ð ð ð ð ð ð õ& •&˜×+Ò+Ñ-Ô-Ñ.Ô.Ñ/Ô/€FÝ�6‰{Œ{€Hð¥4­¤=ð µSð ½XÅfÔ=Mð ð ð ð ð ð ð ð ð6 KÐJÐJÐJÐJµu½SÀ¹[¼[Ñ7IÔ7IÐJÑJÔJ€HÝ•�t˜XÑ&Ô&Ñ'Ô'Ð'r,   Úcellsc                 óô  ‡— dt           dt          t          t          t          t          f         fd„}t          | ¦  «        }t	          ¦   «         Šg }g }t          |¦  «        �rFt          |¦  «        }t          |¦  «        D ]º} ||¦  «        }t          |¦  «        dk    r=‰t	          |¦  «        z  Š|                     |¦  «         |                     |¦  «         Œ]t          ˆfd„|D ¦   «         ¦  «        }|dk    r<‰t	          |¦  «        z  Š|                     |¦  «         |                     |¦  «         Œ»t          |¦  «        |k    rJ|                     t          |¦  «        ¦  «         ‰ 	                    ¦   «          | 	                    ¦   «          t          |¦  «        �°Ft          |¦  «        r"|                     t          |¦  «        ¦  «         t          |d„ ¬¦  «        }	d„ |	D ¦   «         }
|
S )	z…
    Given a list of bounding boxes (`cells`), return a list of tables that
    hold those cells most simply (and contiguously).
    rx   r   c                 ó,   — | \  }}}}||f||f||f||ffS rX   rE   )rx   r"   r#   r/   r0   s        r*   Úbbox_to_cornersz(cells_to_tables.<locals>.bbox_to_corners/  s/   € Ø"ÑˆˆC��VØ�S�	˜B ˜<¨"¨c¨°R¸°LÐAÐAr,   r   c              3   ó    •K  — | ]}|‰v V — Œ	d S rX   rE   )rH   rw   Úcurrent_cornerss     €r*   rK   z"cells_to_tables.<locals>.<genexpr>H  s(   øè è € Ð"NÐ"N¸A 1¨Ð#7Ð"NÐ"NÐ"NÐ"NÐ"NÐ"Nr,   c                 ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3   ó6   K  — | ]}|d          |d         fV — ŒdS )r   r   NrE   )rH   rw   s     r*   rK   z4cells_to_tables.<locals>.<lambda>.<locals>.<genexpr>a  s.   è è € Ð.GÐ.GÀ°°!´°a¸´d¨|Ð.GÐ.GÐ.GÐ.GÐ.GÐ.Gr,   )rd   )Úts    r*   r]   z!cells_to_tables.<locals>.<lambda>a  s   € ­3Ð.GÐ.GÀQÐ.GÑ.GÔ.GÑ+GÔ+G€ r,   r1   c                 ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS rª   rY   )rH   rÂ   s     r*   r   z#cells_to_tables.<locals>.<listcomp>b  s#   € Ð1Ð1Ð1�a¥c¨!¡f¤f¨q¢j j� j j jr,   )r   r   r   r5   rœ   rZ   r$   ÚremoveÚsumÚclearr6   )rº   r½   Úremaining_cellsÚcurrent_cellsÚtablesÚinitial_cell_countÚcellÚcell_cornersÚcorner_countrP   Úfilteredr¿   s              @r*   Úcells_to_tablesrÏ   )  s  ø€ ðB�fð B­­w½ÅÍ'Ð/QÔ)Rð Bð Bð Bð Bõ ˜5‘k”k€Oõ
 %(¡E¤E€OØ"$€Mà€FÝ
ˆoÑ
Ô
ñ "Ý  Ñ/Ô/ÐÝ˜Ñ)Ô)ð 	1ð 	1ˆDØ*˜?¨4Ñ0Ô0ˆLå�=Ñ!Ô! QÒ&Ð&à¥3 |Ñ#4Ô#4Ñ4�Ø×$Ò$ TÑ*Ô*Ð*Ø×&Ò& tÑ,Ô,Ð,Ð,õ  #Ð"NÐ"NÐ"NÐ"NÀÐ"NÑ"NÔ"NÑNÔN�ð   !Ò#Ð#à#¥s¨<Ñ'8Ô'8Ñ8�OØ!×(Ò(¨Ñ.Ô.Ð.Ø#×*Ò*¨4Ñ0Ô0Ð0øõ ˆ}ÑÔÐ!3Ò3Ð3à�MŠM�$˜}Ñ-Ô-Ñ.Ô.Ð.Ø×!Ò!Ñ#Ô#Ð#Ø×ÒÑ!Ô!Ð!õ5 ˆoÑ
Ô
ñ "õ> ˆ=ÑÔð +à�Š•d˜=Ñ)Ô)Ñ*Ô*Ð*õ �VÐ!GÐ!GÐHÑHÔH€GØ1Ð1˜7Ð1Ñ1Ô1€HØ€Or,   c                   ó2   — e Zd Zdeee                  fd„ZdS )Ú	CellGrouprº   c                 óÚ  — || _         t          t          t          d¦  «        t	          d |¦  «        ¦  «        ¦  «        t          t          t          d¦  «        t	          d |¦  «        ¦  «        ¦  «        t          t          t          d¦  «        t	          d |¦  «        ¦  «        ¦  «        t          t          t          d¦  «        t	          d |¦  «        ¦  «        ¦  «        f| _        d S ©Nr   r   rp   r   )rº   rd   rb   r   ra   re   rx   )Úselfrº   s     r*   Ú__init__zCellGroup.__init__g  sª   € ØˆŒ
å••J˜q‘M”M¥6¨$°Ñ#6Ô#6Ñ7Ô7Ñ8Ô8Ý••J˜q‘M”M¥6¨$°Ñ#6Ô#6Ñ7Ô7Ñ8Ô8Ý••J˜q‘M”M¥6¨$°Ñ#6Ô#6Ñ7Ô7Ñ8Ô8Ý••J˜q‘M”M¥6¨$°Ñ#6Ô#6Ñ7Ô7Ñ8Ô8ð	
ˆŒ	ˆ	ˆ	r,   N)Ú__name__Ú
__module__Ú__qualname__r   r	   r   rÕ   rE   r,   r*   rÑ   rÑ   f  s9   € € € € € ð
˜d 8¨FÔ#3Ô4ð 
ð 
ð 
ð 
ð 
ð 
r,   rÑ   c                   ó   — e Zd ZdS )ÚRowN©rÖ   r×   rØ   rE   r,   r*   rÚ   rÚ   q  ó   € € € € € Ø€Dr,   rÚ   c                   ó   — e Zd ZdS )ÚColumnNrÛ   rE   r,   r*   rÞ   rÞ   u  rÜ   r,   rÞ   c                   óò   — e Zd Zdddee         fd„Zedefd„¦   «         Zdee	         dee	         fd„Z
edee	         fd	„¦   «         Zedee	         fd
„¦   «         Zdedeeee                           fd„ZdS )ÚTableÚpager   rº   c                 ó"   — || _         || _        d S rX   )rá   rº   )rÔ   rá   rº   s      r*   rÕ   zTable.__init__z  s   € ØˆŒ	ØˆŒ
ˆ
ˆ
r,   r   c           
      ó\  — | j         }t          t          t          d¦  «        |¦  «        ¦  «        t          t          t          d¦  «        |¦  «        ¦  «        t	          t          t          d¦  «        |¦  «        ¦  «        t	          t          t          d¦  «        |¦  «        ¦  «        fS rÓ   )rº   rd   rb   r   re   )rÔ   rw   s     r*   rx   z
Table.bbox~  s   € àŒJˆå••J˜q‘M”M 1Ñ%Ô%Ñ&Ô&Ý••J˜q‘M”M 1Ñ%Ô%Ñ&Ô&Ý••J˜q‘M”M 1Ñ%Ô%Ñ&Ô&Ý••J˜q‘M”M 1Ñ%Ô%Ñ&Ô&ð	
ð 	
r,   Úkindc                 óê  ‡
‡— |t           u rdndŠ
t          ‰
 ¦  «        }t          | j        t	          |‰
¦  «        ¬¦  «        }t          t          t          t          t	          ‰
¦  «        | j        ¦  «        ¦  «        ¦  «        ¦  «        }t          j	        |t	          |¦  «        ¦  «        }g }|D ]?\  }}ˆ
fd„|D ¦   «         Š |ˆfd„|D ¦   «         ¦  «        }	| 
                    |	¦  «         Œ@|S )Nr   r   r1   c                 ó"   •— i | ]}|‰         |“ŒS rE   rE   )rH   rË   Úaxiss     €r*   ú
<dictcomp>z+Table._get_rows_or_cols.<locals>.<dictcomp>˜  s   ø€ Ð<Ð<Ð<¨$�T˜$”Z Ð<Ð<Ð<r,   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS rE   )Úget)rH   r\   Úxdicts     €r*   r   z+Table._get_rows_or_cols.<locals>.<listcomp>™  s#   ø€ Ð1Ð1Ð1¨˜Ÿ	š	 !™œÐ1Ð1Ð1r,   )rÚ   r¶   r6   rº   r   r5   rœ   rb   rM   rN   r$   )rÔ   rä   ÚantiaxisrP   ÚxsÚgroupedÚrowsÚyÚ	row_cellsÚrowrç   rë   s             @@r*   Ú_get_rows_or_colszTable._get_rows_or_colsˆ  s   øø€ Ø�C�K�Kˆqˆq QˆÝ˜4�x‘=”=ˆõ ˜œ­°H¸dÑ)CÔ)CÐDÑDÔDˆõ •&��S¥¨DÑ!1Ô!1°4´:Ñ>Ô>Ñ?Ô?Ñ@Ô@ÑAÔAˆõ Ô# G­Z¸Ñ-AÔ-AÑBÔBˆàˆà#ð 	ð 	‰LˆAˆyØ<Ð<Ð<Ð<°)Ð<Ñ<Ô<ˆEØ�$Ð1Ð1Ð1Ð1¨bÐ1Ñ1Ô1Ñ2Ô2ˆCØ�KŠK˜ÑÔÐÐØˆr,   c                 ó6   — |                       t          ¦  «        S rX   )ró   rÚ   ©rÔ   s    r*   rï   z
Table.rows�  s   € à×%Ò%¥cÑ*Ô*Ð*r,   c                 ó6   — |                       t          ¦  «        S rX   )ró   rÞ   rõ   s    r*   ÚcolumnszTable.columns¡  s   € à×%Ò%¥fÑ-Ô-Ð-r,   Úkwargsc                 óÊ  ‡‡	‡
— | j         j        }g }dt          dt          dt          fd„Š	| j        D ]°Š
g }ˆ	ˆ
fd„|D ¦   «         }‰
j        D ]€Š‰€d }ndˆˆ	fd„|D ¦   «         }t          |¦  «        rDd|v r-‰d         ‰d	         z
  |d
<   ‰d         ‰d         z
  |d<   ‰|d<   t          j	        |fi |¤Ž}nd}| 
                    |¦  «         Œ�| 
                    |¦  «         Œ±|S )NÚcharrx   r   c                 óª   — | d         | d         z   dz  }| d         | d         z   dz  }|\  }}}}t          ||k    o||k     o||k    o||k     ¦  «        S )Nr#   r0   rp   r"   r/   )r´   )rú   rx   Úv_midÚh_midr"   r#   r/   r0   s           r*   Úchar_in_bboxz#Table.extract.<locals>.char_in_bboxª  sr   € Ø˜%”[ 4¨¤>Ñ1°QÑ6ˆEØ˜$”Z $ t¤*Ñ,°Ñ1ˆEØ"&ÑˆB��R˜ÝØ˜"’ÐV 5¨2¢:ÐV°E¸S²LÐVÀuÈvÂ~ñô ð r,   c                 ó6   •— g | ]} ‰|‰j         ¦  «        ¯|‘ŒS rE   )rx   )rH   rú   rþ   rò   s     €€r*   r   z!Table.extract.<locals>.<listcomp>´  s,   ø€ ÐPÐPÐP $°<°<ÀÀcÄhÑ3OÔ3OÐP˜ÐPÐPÐPr,   c                 ó,   •— g | ]} ‰|‰¦  «        ¯|‘ŒS rE   rE   )rH   rú   rË   rþ   s     €€r*   r   z!Table.extract.<locals>.<listcomp>º  s:   ø€ ð "ð "ð "Ø!%°l°lÀ4ÈÑ6NÔ6Nð"Øð"ð "ð "r,   Úlayoutrp   r   Úlayout_widthr   r   Úlayout_heightÚlayout_bboxÚ )rá   Úcharsr   r   r´   rï   rº   rZ   r   Úextract_textr$   )rÔ   rø   r  Ú	table_arrÚarrÚ	row_charsÚ	cell_textÚ
cell_charsrË   rþ   rò   s           @@@r*   ÚextractzTable.extract¥  s^  øøø€ à”	”ˆØˆ	ð	�uð 	­Fð 	µtð 	ð 	ð 	ð 	ð ”9ð 	"ð 	"ˆCØˆCØPÐPÐPÐPÐP¨%ÐPÑPÔPˆIàœ	ð &ð &�Ø�<Ø $�I�Ið"ð "ð "ð "ð "Ø)2ð"ñ "ô "�Jõ ˜:‘”ð 'Ø# vÐ-Ð-Ø59¸!´W¸tÀA¼wÑ5F˜F >Ñ2Ø6:¸1´gÀÀQÄÑ6G˜F ?Ñ3Ø48˜F =Ñ1Ý$)Ô$6°zÐ$LÐ$LÀVÐ$LÐ$L˜	˜	à$&˜	Ø—
’
˜9Ñ%Ô%Ð%Ð%Ø×Ò˜SÑ!Ô!Ð!Ð!àÐr,   N)rÖ   r×   rØ   r   r   rÕ   Úpropertyrx   r   rÑ   ró   rï   r÷   r   r	   rL   r  rE   r,   r*   rà   rà   y  s  € € € € € ð˜Vð ¨D°¬Lð ð ð ð ð ð
�fð 
ð 
ð 
ñ „Xð
ð d¨9¤oð ¸$¸y¼/ð ð ð ð ð* ð+�d˜9”oð +ð +ð +ñ „Xð+ð ð.˜˜iœð .ð .ð .ñ „Xð.ð$ ð $¨¨T°(¸3´-Ô-@Ô(Að $ð $ð $ð $ð $ð $r,   rà   )ÚlinesÚlines_strictÚtextÚexplicit)Úsnap_tolerancer>   r?   Újoin_tolerancer@   rA   Úedge_min_lengthÚmin_words_verticalÚmin_words_horizontalÚintersection_toleranceÚintersection_x_toleranceÚintersection_y_tolerancec                   ó   — e Zd ZdS )Ú
UnsetFloatNrÛ   rE   r,   r*   r  r  Ý  rÜ   r,   r  c                   óž  — e Zd ZU dZeed<   dZeed<   dZee	e
eef                           ed<   dZee	e
eef                           ed<   eZeed<   eZeed<   eZeed	<   eZeed
<   eZeed<   eZeed<   dZeed<   eZeed<   eZeed<   dZeed<   eZeed<   eZeed<   dZ ee!ee"f                  ed<   dd„Z#e$dee%         dd fd„¦   «         Z&dS )r   r  Úvertical_strategyÚhorizontal_strategyNÚexplicit_vertical_linesÚexplicit_horizontal_linesr  r>   r?   r  r@   rA   r   r  r  r  r  r  r  Útext_settingsr   c           	      ó$  — t           D ]+}t          | |¦  «        pddk     rt          d|› d�¦  «        ‚Œ,dD ]K}t          | |dz   ¦  «        }|t          vr-t          |› dd                     t          ¦  «        › d�¦  «        ‚ŒL| j        €i | _        d
D ].}|| j        vr#| j                             dd¦  «        | j        |<   Œ/d| j        v r| j        d= dD ];\  }}t          | |¦  «        t          u rt          | |t          | |¦  «        ¦  «         Œ<d	S )a¿  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.
        r   zTable setting 'z' cannot be negative)Ú
horizontalÚverticalÚ	_strategyz_strategy must be one of{ú,Ú}N)r   r   r-   r   ))r>   r  )r?   r  )r@   r  )rA   r  )r  r  )r  r  )	ÚNON_NEGATIVE_SETTINGSÚgetattrr4   ÚTABLE_STRATEGIESÚjoinr"  rê   ÚUNSETÚsetattr)rÔ   Úsettingr!   ÚstrategyÚattrÚfallbacks         r*   Ú__post_init__zTableSettings.__post_init__ø  sƒ  € õ  -ð 	Rð 	RˆGÝ˜˜gÑ&Ô&Ð+¨!¨qÒ0Ð0Ý Ð!P°7Ð!PÐ!PÐ!PÑQÔQÐQð 1ð 6ð 	ð 	ˆKÝ˜t [°;Ñ%>Ñ?Ô?ˆHØÕ/Ð/Ð/Ý Ø"ð 8ð 8ØŸšÕ"2Ñ3Ô3ð8ð 8ð 8ñô ð ð 0ð ÔÐ%Ø!#ˆDÔð 3ð 	Rð 	RˆDØ˜4Ô-Ð-Ð-Ø+/Ô+=×+AÒ+AÀ+ÈqÑ+QÔ+Q�Ô" 4Ñ(øà˜$Ô,Ð,Ð,ØÔ" ;Ð/ð
ð 		=ð 		=‰NˆD�(õ �t˜TÑ"Ô"¥eÐ+Ð+Ý˜˜d¥G¨D°(Ñ$;Ô$;Ñ<Ô<Ð<øð		=ð 		=r,   Úsettingsc                 ó$  — |€
 | ¦   «         S t          || ¦  «        r|S t          |t          ¦  «        rLi }i }|                     ¦   «         D ]&\  }}|d d…         dk    r|||dd …         <   Œ!|||<   Œ'||d<    | di |¤ŽS t          d|› �¦  «        ‚)Né   Útext_r"  zCannot resolve settings: rE   )Ú
isinstanceÚdictrJ   r4   )Úclsr4  Úcore_settingsr"  rI   r   s         r*   ÚresolvezTableSettings.resolve+  sÑ   € àÐØ�3‘5”5ˆLÝ˜ #Ñ&Ô&ð 	EØˆOÝ˜¥$Ñ'Ô'ð 	EØˆMØˆMØ ŸšÑ(Ô(ð )ð )‘��1Ø�R�a�R”5˜GÒ#Ð#Ø+,�M ! A B B¤%Ñ(Ð(à'(�M !Ñ$Ð$Ø-:ˆM˜/Ñ*Ø�3Ð'Ð'˜Ð'Ð'Ð'åÐC¸ÐCÐCÑDÔDÐDr,   )r   N)'rÖ   r×   rØ   r  rL   Ú__annotations__r  r   r	   r   r   r   r   r!  ÚDEFAULT_SNAP_TOLERANCEr  r-  r>   r?   ÚDEFAULT_JOIN_TOLERANCEr  r@   rA   r  ÚDEFAULT_MIN_WORDS_VERTICALr  r¶   ÚDEFAULT_MIN_WORDS_HORIZONTALr  r  r  r  r"  r   r   r3  ÚclassmethodÚT_table_settingsr<  rE   r,   r*   r   r   ä  s·  € € € € € € à$Ð�sÐ$Ð$Ñ$Ø&Ð˜Ð&Ð&Ñ&ØCGÐ˜X d¨5°¸°Ô+>Ô&?Ô@ÐGÐGÑGØEIÐ˜x¨¨U°5¸%°<Ô-@Ô(AÔBÐIÐIÑIØ2€N�EÐ2Ð2Ñ2Ø#Ð�eÐ#Ð#Ñ#Ø#Ð�eÐ#Ð#Ñ#Ø2€N�EÐ2Ð2Ñ2Ø#Ð�eÐ#Ð#Ñ#Ø#Ð�eÐ#Ð#Ñ#Ø€O�UÐÐÑØ8Ð˜Ð8Ð8Ñ8Ø <Ð˜#Ð<Ð<Ñ<Ø$%Ð˜EÐ%Ð%Ñ%Ø&+Ð˜eÐ+Ð+Ñ+Ø&+Ð˜eÐ+Ð+Ñ+Ø.2€M�8˜D  c œNÔ+Ð2Ð2Ñ2ð1=ð 1=ð 1=ð 1=ðf ðE˜xÐ(8Ô9ð E¸oð Eð Eð Eñ „[ðEð Eð Er,   c                   ó<   — e Zd ZdZd	dddee         fd„Zdefd„ZdS )
ÚTableFindera0  
    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
    Nrá   r   r4  c                 ó`  ‡ — |‰ _         t                               |¦  «        ‰ _        ‰                      ¦   «         ‰ _        t          ‰ j        ‰ j        j        ‰ j        j        ¦  «        ‰ _	        t          ‰ j	        ¦  «        ‰ _        ˆ fd„t          ‰ j        ¦  «        D ¦   «         ‰ _        d S )Nc                 ó:   •— g | ]}t          ‰j        |¦  «        ‘ŒS rE   )rà   rá   )rH   Ú
cell_grouprÔ   s     €r*   r   z(TableFinder.__init__.<locals>.<listcomp>T  s2   ø€ ð 
ð 
ð 
Ø-7�E�$”)˜ZÑ(Ô(ð
ð 
ð 
r,   )rá   r   r<  r4  Ú	get_edgesr   r–   r  r  r’   r¹   rº   rÏ   rÉ   )rÔ   rá   r4  s   `  r*   rÕ   zTableFinder.__init__J  s£   ø€ ØˆŒ	Ý%×-Ò-¨hÑ7Ô7ˆŒØ—^’^Ñ%Ô%ˆŒ
Ý3ØŒJØŒMÔ2ØŒMÔ2ñ
ô 
ˆÔõ
 ,¨DÔ,>Ñ?Ô?ˆŒ
ð
ð 
ð 
ð 
Ý;JÈ4Ì:Ñ;VÔ;Vð
ñ 
ô 
ˆŒˆˆr,   r   c           
      óÀ  — | j         }dD ]Z}t          ||dz   ¦  «        }|dk    r?t          |d|z   dz   ¦  «        }t          |¦  «        dk     rt          d|› d|› d	�¦  «        ‚Œ[|j        }|j        }|d
k    s|d
k    r | j        j        di |j        pi ¤Ž}g }|j	        pg D ]¯}	t          |	t          ¦  «        r9t          j        |	¦  «        D ]#}
|
d         dk    r|                     |
¦  «         Œ$ŒP|                     |	|	| j        j        d         | j        j        d         | j        j        d         | j        j        d         z
  ddœ¦  «         Œ°|dk    r t          j        | j        j        d¦  «        }nM|dk    r"t          j        | j        j        dd¬¦  «        }n%|d
k    rt%          ||j        ¬¦  «        }n|dk    rg }||z   }g }|j        pg D ]¯}	t          |	t          ¦  «        r9t          j        |	¦  «        D ]#}
|
d         dk    r|                     |
¦  «         Œ$ŒP|                     | j        j        d         | j        j        d         | j        j        d         | j        j        d         z
  |	|	ddœ¦  «         Œ°|dk    r t          j        | j        j        d¦  «        }nM|dk    r"t          j        | j        j        dd¬¦  «        }n%|d
k    rt+          ||j        ¬¦  «        }n|dk    rg }||z   }t/          |¦  «        t/          |¦  «        z   }t1          ||j        |j        |j        |j        ¬¦  «        }t          j        ||j        ¬¦  «        S )N)r%  r$  r&  r  Ú	explicit_Ú_linesrp   zIf z"_strategy == 'explicit', explicit_zD_lines must be specified as a list/tuple of two or more floats/ints.r  r!   r   r   r   rz   r  r  Úline)Ú	edge_type)rU   r    r   )r"   r/   r_   r#   r0   r!   )r>   r?   r@   rA   )Ú
min_lengthrE   )r4  r*  rZ   r4   r  r  rá   Úextract_wordsr"  r   r8  r9  r   Úobj_to_edgesr$   rx   Úfilter_edgesr   r�   r  r!  rl   r  r5   rS   r>   r?   r@   rA   r  )rÔ   r4  r!   r0  r  Úv_stratÚh_stratrT   Ú
v_explicitÚdescr'   Úv_baser   Ú
h_explicitÚh_baser    r   s                    r*   rI  zTableFinder.get_edgesX  s  € Ø”=ˆà5ð 
	ð 
	ˆKÝ˜x¨°{Ñ)BÑCÔCˆHØ˜:Ò%Ð%Ý ¨+¸Ñ*CÀhÑ*NÑOÔO�Ý�u‘:”: ’>�>Ý$ð(˜kð (ð (Ø$/ð(ð (ð (ñô ð øð Ô,ˆØÔ.ˆà�fÒÐ ¨6Ò 1Ð 1Ø+�D”IÔ+ÐMÐM¨xÔ/EÐ/KÈÐMÐMˆEàˆ
ØÔ4Ð:¸ð 	ð 	ˆDÝ˜$¥Ñ%Ô%ð ÝÔ+¨DÑ1Ô1ð -ð -�AØ˜Ô'¨3Ò.Ð.Ø"×)Ò)¨!Ñ,Ô,Ð,øð-ð ×!Ò!à"Ø"Ø#œyœ~¨aÔ0Ø"&¤)¤.°Ô"3Ø"&¤)¤.°Ô"3°d´i´nÀQÔ6GÑ"GØ'*ðð ñ	ô 	ð 	ð 	ð �gÒÐÝÔ'¨¬	¬¸Ñ=Ô=ˆFˆFØ˜Ò&Ð&ÝÔ'¨¬	¬¸ÈÐOÑOÔOˆFˆFØ˜ÒÐÝ% e¸HÔ<WÐXÑXÔXˆFˆFØ˜
Ò"Ð"ØˆFà�ZÑˆàˆ
ØÔ6Ð<¸"ð 	ð 	ˆDÝ˜$¥Ñ%Ô%ð ÝÔ+¨DÑ1Ô1ð -ð -�AØ˜Ô'¨3Ò.Ð.Ø"×)Ò)¨!Ñ,Ô,Ð,øð-ð ×!Ò!à"œiœn¨QÔ/Ø"œiœn¨QÔ/Ø!%¤¤°Ô!2°T´Y´^ÀAÔ5FÑ!FØ#Ø"&Ø'*ðð ñ	ô 	ð 	ð 	ð �gÒÐÝÔ'¨¬	¬¸Ñ=Ô=ˆFˆFØ˜Ò&Ð&ÝÔ'¨¬	¬¸ÈÐOÑOÔOˆFˆFØ˜ÒÐÝ%Ø hÔ&Cðñ ô ˆFˆFð ˜
Ò"Ð"ØˆFà�ZÑˆå�Q‘”�$˜q™'œ'Ñ!ˆåØØ%Ô6Ø%Ô6Ø%Ô6Ø%Ô6ð
ñ 
ô 
ˆõ Ô! %°HÔ4LÐMÑMÔMÐMr,   rX   )	rÖ   r×   rØ   Ú__doc__r	   rC  rÕ   r   rI  rE   r,   r*   rE  rE  ?  st   € € € € € ðð ð
ð 
˜Vð 
¨xÐ8HÔ/Ið 
ð 
ð 
ð 
ð[N˜:ð [Nð [Nð [Nð [Nð [Nð [Nr,   rE  )r   r   )6rM   Údataclassesr   Úoperatorr   Útypingr   r   r   r   r	   r
   r   r   r   r  r   Ú_typingr   r   r   r   r   r   r>  r?  r@  rA  rL   ÚT_intersectionsrC  rá   r   r+   r=   rS   r¶   rl   r�   r–   r¹   rÏ   ÚobjectrÑ   rÚ   rÞ   rà   r+  r)  rq   r  r-  r   rE  rE   r,   r*   ú<module>ra     s‹  ðØ Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ Tà Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JàÐ ØÐ ØÐ Ø Ð à�w  S¨* _Ô 5Ð5Ô6€Ø˜¨$¨s°C¨x¬.Ð8Ô9Ð àð ØÐÐÐÐÐð
 0Ø/ð!ð !Øð!àð!ð ð!ð ð	!ð !ð !ð !ð& =Sðð ØðØ$'ðØ49ðàðð ð ð ð:Øðàðð ðð ð	ð
 ðð ðð ð ð ðD .Jð(ð (Øð(Ø'*ð(àð(ð (ð (ð (ðX .Hð<ð <Øð<Ø'*ð<àð<ð <ð <ð <ð@ EFðð ØðØ$)ðØ<Aðàðð ð ð ð6<(¨/ð <(¸dÀ6¼lð <(ð <(ð <(ð <(ð~:˜4 œ<ð :¨D°°f´Ô,>ð :ð :ð :ð :ðz
ð 
ð 
ð 
ð 
�ñ 
ô 
ð 
ð	ð 	ð 	ð 	ð 	ˆ)ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	ˆYñ 	ô 	ð 	ðPð Pð Pð Pð PˆFñ Pô Pð Pðf AÐ@Ð@Ð ðð ð Ð ð 	ð 	ð 	ð 	ð 	�ñ 	ô 	ð 	ð 	ˆ
�1‰Œ€ð ðWEð WEð WEð WEð WEñ WEô WEñ „ðWEðttNð tNð tNð tNð tN�&ñ tNô tNð tNð tNð tNr,   