ó
    À‘´j™A  ã                  ón  • S r SSKJr  SSKrSSKrSSKJr  SSKJrJ	r	J
r
Jr  SSKJrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJrJr  SSKJrJr  SSK J!r!  SSK"J#r#  SSK$J%r%J&r&J'r'J(r(  SSK)J*r*J+r+  SSK,J-r-J.r.  SSK/J0r0  SSK1J2r2  Sr3Sr4S\3S4                 SS jjr5                SS jr6              S S jr7S!S jr8\9" \Rt                  \Rv                  \Rx                  \Rz                  45      r>              S"S jr?S#S jr@            S$S jrAg)%u.  Turn a table read off a page image into an extracted table.

A page is nominated partly for its tables: `table_verdicts` in nominate.py
counts the source PDF's text-layer words under each table's box against the
cells the table holds, and a table with too few was read off the page image
rather than out of a text layer. A table read off the image never reached the
Set-of-Mark and Camelot engine either, because that engine extracts from a text
layer and there was none.
What stands in the document for such a table is the parse's own reading, with
nothing having checked it since.

The scan replaces that reading. It returns the table as a table â€” a grid with a
box on every cell â€” so the grid goes straight into the same correction and
grounding steps every other table in the document goes through, and what comes
back is an `ExtractedTable` filled the way every other one is filled.

Replacing rather than keeping both is deliberate. The parse's reading of these
tables is not merely rougher, it is wrong in ways that change values: a currency
symbol read as a letter, a thousands separator read as a decimal point. A wrong
number carried beside a right one is how a wrong number survives.

The parse's reading is not discarded on the way out, though. Before the grid
reaches the correction step, every cell in it is checked against what the parse
read in the same place, and any cell the two disagree on, or the parse has no
cell for, is read off the printed page by an agent. The check is skipped when
the scan gave the table no box, and `crosscheck_cells` passes the grid through
unchecked when no reader is configured. The scan has its own failure mode â€” it returns a thousands
separator as a decimal point â€” and the parse is a second opinion on it that
costs nothing.

Only the tables that nominated the page are replaced. A page can print a table
with a text layer beside one without, and the first was read properly by the
table engine; overriding it with a scan would discard a vetted extraction for no
reason. A nominated table the scan returned nothing over is reported.
é    )ÚannotationsN)ÚPath)ÚDictÚListÚOptionalÚTuple)ÚDocItemÚDoclingDocumentÚPictureItemÚ	TableItem)ÚDocItemLabel)Úlogger)Ú
CellReader)ÚExtractedTable)Úcoverage_fractionÚcrop_region_pngÚtable_crop_box)ÚTableAssemblyÚassemble_table)Úapply_content_regions)Úcrosscheck_cells)ÚNormBoxÚnorm_boxÚ	point_boxÚprov_box)ÚPageScanÚScannedTable)ÚFURNITURE_CLASSESÚpicture_classes)ÚREAD_BY_FIELD)Úrender_pagegš™™™™™É?éÈ   Fc              ƒ  óz  ^^^^^#^$^%#   • U R                    Vs0 s H  oˆR                  U_M     snm#/ n	/ n
U GH’  nTR                  UR                  S5      u  pÍ[	        XR                  5      n[        UR                   5      nUR                   H…  nT#R                  U5      n[        UXüXÖ5      nUc$  U
R                  SUR                   SU S35        MH  UUl	        UR                  U5        U	R                  UUUUR                  US5      45        M‡     [        U5      n[        XXüXÖ5       HL  u  nnUR                  Ul        UR                  U5        US-  nU	R                  UUUR                  U45        MN     U(       d  GMS  [        XXüXÖ5       H.  nUR                  U5        US-  nU	R                  UUSU45        M0     GM•     U	(       d  / U
4$ [        R                   " SS	9 m%[#        U	 VVVVs1 s H  u  nnnnUR                  iM     snnnn5      n[$        R&                  " UUU%4S
 jU 5       6 I Sh  v•N n[)        UUSS9 VVVVs0 s H  u  nu  nnnUU_M     snnnnm$[$        R&                  " UU#U$UU4S jU	 5       6 I Sh  v•N nSSS5        [)        U	WSS9 H  u  u  nnn n!n"U"R*                  Ul        M     [$        R,                  " [.        [        U5      [1        T5      5      I Sh  v•N   [        U5      U
4$ s  snf s  snnnnf  NÚs  snnnnf  N‘! , (       d  f       N•= f N;7f)u;  Extract every nominated table the scans read, in page order.

Each record in `scans` is given the reference of the parse table its grid
replaced and the address of the table it produced, so a value traces back to
the element that holds it. Returns the tables and one error per nominated
table no returned table covered.

With `orphans`, a returned grid over a region the document holds nothing
for â€” no table, no picture, no figure, and no text the parse read there â€”
is captured too, through the same checks, with the cell check asking an
agent about every cell because there is no parse reading to check against.
A map's legend is the standing example: the page prints the values, the
parse's text layer has nothing, and the scan's grid is the only reading
anywhere. The caller gives such a table a home by inserting it.
©g      ƒ@g     Àˆ@Nzpage z: table zw was read off the page image and the scan returned no table over it; what stands in the document is the parse's readingé   Ú zquber-scan-table-)Úprefixc              3  ó–   >#   • U  H>  n[         R                  " [        TUTR                  [	        T5      S US S3-  5      v •  M@     g7f)zpage-Ú04dz.pngN)ÚasyncioÚ	to_threadr!   Údpir   )Ú.0ÚpageÚassemblyÚsourceÚtmps     €€€Ú8/home/mande/repo/quber/src/quber/core/figures/capture.pyÚ	<genexpr>Ú!capture_tables.<locals>.<genexpr>’   sL   øé € ð â!�Dô ×!Ò!¤+¨v°t¸X¿\¹\Ì4ÐPSË9ÐY^Ð_cÐdgÐ^hÐhlÐWmÑKm×nÐnÚ!ùs   ƒAA	T)Ústrictc           
   3  ó¸   >#   • U  HO  u  pp4[        UTR                  U5      TUR                     TR                  UR                  S 5      UTT	5      v •  MQ     g7f)r$   N)Ú_captureÚgetr.   )
r-   ÚscanÚscannedÚrefÚordinalr/   Úby_refÚimagesÚ	page_dimsÚreaders
        €€€€€r2   r3   r4   ™   s`   øé € ð ò 48Ñ/�D 3ô ØØ—J‘J˜s“OØ˜4Ÿ9™9Ñ%Ø—M‘M $§)¡)¨^Ó<ØØØ÷ð ò 48ùs   ƒAA)ÚtablesÚself_refr8   r.   Ú_page_ordinalsÚlistÚ
table_refsÚ_best_matchÚappendÚ	table_refÚremoveÚlenÚ_over_picturesÚpicture_refÚ_orphan_gridsÚtempfileÚTemporaryDirectoryÚsortedr*   ÚgatherÚzipÚtable_idr+   r   Ústr)&ÚdocumentÚscansr0   r?   r/   r@   Úmatch_fractionÚorphansÚtÚworkÚerrorsr9   ÚwidthÚheightÚordinalsÚ	availabler;   Ú
table_itemr:   r<   ÚpictureÚ_sÚ_rÚ_oÚpagesÚrenderedr.   ÚimageÚ_wÚ_hrA   Ú_scanÚ_refÚ_ordinalÚtabler=   r>   r1   s&     ````                             @@@r2   Úcapture_tablesrn   J   s  þé € ð2 &.§_¢_Ó5¢_ �j‰j˜!Šm¡_Ñ5€FØ:<€DØ€FÜˆØ!Ÿ™ d§i¡i°Ó@‰ˆÜ! (¯I©IÓ6ˆô ˜Ÿ™Ó%ˆ	Ø—?”?ˆCØŸ™ C›ˆJÜ! *¨iÀÓWˆGØ‰Ø—‘Ø˜DŸI™I˜; h¨s¨eð 4dð dôñ Ø #ˆGÔØ×Ñ˜WÔ%Ø�K‰K˜˜w¨¨X¯\©\¸#¸qÓ-AÐBÖCñ #ô& �h“-ˆÜ .¨x¸yÐQWÖ hÑˆG�WØ")×"2Ñ"2ˆGÔØ×Ñ˜WÔ%Ø�q‰LˆGØ�K‰K˜˜w¨×(8Ñ(8¸'ÐBÖCñ	 !i÷ ‰7Ü(¨¸È6Öb�Ø× Ñ  Ô)Ø˜1‘�Ø—‘˜T 7¨B°Ð8Ö9ô cñC öL Ø�6ˆzÐä	×	$Ò	$Ð,?Ò	@ÀCÜ¹$Ö?º$Ñ&6 d¨B°°B˜Ÿ	œ	¹$Ô?Ó@ˆÜ Ÿšöá!óð
÷ 
ˆô <?¸uÀhÐW[Ò;\Ö]Ò;\Ñ"7 $©¨°°B�$˜’+Ñ;\Ô]ˆÜ—~’~÷ð ñ 48óð
÷ 
ˆ÷ 
Aô0 47°t¸VÈDÔ3QÑ/Ñ(ˆ�˜˜x¨%Ø Ÿ>™>ˆÖñ 4Rô ×
Ò
Ô1´4¸³<ÄÀVÃÓ
M×MÐMÜ�‹<˜ÐÐùòS 6ùõZ @ñ
ùõ ^ñ
÷ 
AÕ	@úñ8 Nùsx   ‰L;˜L®EL;Æ
A#L;Ç-L(Ç:LÈ,L(ÉLÉL(ÉLÉ**L(ÊL&ÊL(ÊA$L;Ë=L9Ë>L;Ì	L(Ì	L(Ì(
L6Ì2L;c              ƒ  óº  #   • Uu  pxU R                    V	V
s/ s H  o™ V
s/ s H  n
[        X§U5      PM     sn
PM!     nn	n
[        U R                  Xx5      n[        R                  " SU R
                  [        U R                  5      U R                  (       a  [        U R                  S   5      OS5        U R                  nUbO  [        R                  " [        U[        XÈ5      UR                  5      I Sh  v•N n[        XX>U5      I Sh  v•N u  pß[        UU R
                  UUUUUU[        U R                  5      SSS9I Sh  v•N $ s  sn
f s  sn
n	f  N^ NK N7f)zJOne returned grid, checked against the parse, then corrected and grounded.z?Table capture: page {} reading a {}x{} table off the page imager   NÚimage_tableF)
r.   r<   Ú
page_imager?   ÚcellsÚ
cell_boxesÚbboxÚ
som_regionÚkindÚground_values)rs   r   Úboxr   Úinfor.   rJ   rr   r*   r+   r   r   r,   r   r   r   )r:   r`   rq   r?   r<   r/   r@   r\   r]   Úrowrx   Úboxesrt   rr   ÚcropÚ_reads                   r2   r7   r7   ¯   s3  é € ð �M€EØGN×GYÒGYÔZÒGYÀ°sÓ;²s°Œi˜ FÖ+±sÔ;ÑGY€EÑZÜ�W—[‘[ %Ó0€DÜ
‡K‚KØIØ�‰ÜˆG�M‰MÓØ!(§§ŒˆG�M‰M˜!ÑÔ°Aô	ð �M‰M€EØÑÜ×&Ò&Ü˜Z¬¸Ó)EÀxÇ|Á|ó
÷ 
ˆô .¨gÀ9ÐTZÓ[×[‰ˆÜØØ�\‰\ØØØØØØÜ˜GŸK™KÓ(Øð
 ñ÷ ð ùò! <ùÓZñ
ñ \ñùsV   ‚E–	EŸE
µE¼B:EÃ6EÃ7EÄEÄ9EÅEÅEÅ
EÅEÅEÅEc                ó.  ^^^^^^• S TR                    5        Vs/ s H	  ofc  M  UPM     nnUUU4S jU R                   5        Vs/ s H
  nUc  M  UPM     nn/ n	U R                   GH  n
U
R                  (       a'  U
R                  S   R                  TR
                  :w  a  M>  [        U
5      (       a"  [        S [        U
5       5       5      (       a  Mp  [        U
R                  [        S5      (       a  M’  [        U
TT5      mTc  M¤  [        UU4S jXx-    5       5      (       a  MÃ  U V^s/ s H!  m[        U4S jU	 5       5      (       d  M  TPM#     nn[        X¬TTT5      nUc  GM  U	R                  X­45        GM     U	$ s  snf s  snf s  snf )a  Each unclaimed grid paired with the picture it was printed over.

A picture stands in for a table only where the parse filed the region as a
picture and as nothing else. Four things disqualify it.

Every class the parse gave it is page furniture (`FURNITURE_CLASSES`, a
logo or an icon), so there is nothing inside it to read.

A reader already read the region, and the picture's metadata records which
under `READ_BY_FIELD`. Reading it again would state the same table twice.

A parse table over the same region means the document already holds that
table, read from a text layer by the table engine. The scan read it too, and
that reading is ignored for the reason the module's own rule gives: a vetted
extraction is not replaced by a scan of the same region. Adding it beside the
table would state the same figures twice.

A figure over the same region means the scan called it a picture, and the
graft attaches that reading to the picture as a description. Taking it as a
table as well would put one thing in the document twice again.
c              3  óL   #   • U  H  n[        UR                  5      v •  M     g 7f©N©r   rx   ©r-   Úcharts     r2   r3   Ú!_over_pictures.<locals>.<genexpr>ú   ó   é € ÐMÂ°uœx¨¯	©	×2Ð2Âùó   ‚"$Nc              3  ó¶   >#   • U  HN  nUR                   (       d  M  UR                   S    R                  TR                  :X  d  M?  [        UTT5      v •  MP     g7f©r   N©ÚprovÚpage_nor.   r   ©r-   rm   r]   r9   r\   s     €€€r2   r3   r„   ý   óL   øé € ð 
â(�Ø�z�zó +à#Ÿj™j¨™m×3Ñ3°t·y±yÑ@ó +ŒH�U˜E 6×*Ð*Ú(ùó   ƒAœ%AÁAr   c              3  ó2   #   • U  H  o[         ;   v •  M     g 7fr€   )r   )r-   Úcs     r2   r3   r„     s   é € Ð+eÒLdÀqÔ1BÖ,BÒLdùs   ‚c              3  ó>   >#   • U  H  n[        UTT5      v •  M     g 7fr€   ©Ú_covers)r-   ÚotherrW   Útargets     €€r2   r3   r„     s   øé € ÐZÒCY¸%Œw�u˜f n×5Ð5ÒCYùó   ƒc              3  ó0   >#   • U  H  u  pTULv •  M     g 7fr€   © )r-   Ú_picÚprY   s      €r2   r3   r„     s   øé € Ð0QÊ5ÁÀ°¸!µÊ5ùs   ƒ)ÚfiguresrA   ÚpicturesrŠ   r‹   r.   r   ÚallÚgetattrÚmetar    r   ÚanyrF   rG   )rU   r9   r_   r\   r]   rW   rx   r›   Úparse_tablesÚpairsra   rY   Ú	remainingr:   r•   s    ` ```     `  @r2   rK   rK   Ý   s]  ý€ ñ: NÀÇÂÔMÓaÒM�s�sÑM€GÐaö
à!Ÿšô
óò
ˆCð
 ÷ 	ñ
ð ð ð 57€EØ×$Õ$ˆØ�|�|˜wŸ|™|¨A™×6Ñ6¸$¿)¹)ÓCÙÜ˜7×#Ñ#¬Ñ+eÌOÐ\cÔLdÓ+e×(eÑ(eÙô �7—<‘<¤°×5Ñ5ÙÜ˜' 5¨&Ó1ˆØ‰>ÙÜÕZÀ7ÒCYÓZ×ZÑZÙÙ )ÔR¢	˜1¬SÔ0QÉ5Ó0Q×-Q—Q¡	ˆ	ÐRÜ˜g°%¸ÀÓPˆØÔØ�L‰L˜'Ð+×,ñ# %ð$ €Lùò; bùòùò0 Ss"   œF¦FÁFÁFÄ1FÅFc                óD   • [        [        X5      [        X5      5      U:¬  $ )zIDo the two boxes overlap enough, either way round, to be the same region?)Úmaxr   )rx   r•   rW   s      r2   r“   r“     s!   € äÔ  Ó-Ô/@ÀÓ/MÓNÐR`Ñ`Ð`ó    c                óÒ  ^^^^^• S TR                    5        Vs/ s H	  ofc  M  UPM     nnUUU4S jU R                   5        Vs/ s H
  nUc  M  UPM     nnUUU4S jU R                   5        Vs/ s H
  nUc  M  UPM     n	n/ n
U R                   H¸  nUR                  [
        ;   d(  UR                  =(       d    SR                  5       (       d  MA  UR                  (       a'  UR                  S   R                  TR                  :w  a  M{  [        UTT5      mTc  M�  U
R                  TS   TS   -   S-  TS   TS   -   S-  45        Mº     / nU H  nUR                  (       d  M  [        UR                  5      mTc  M0  [!        UU4S	 jXx-   U	-    5       5      (       a  MR  [!        U4S
 jU
 5       5      (       a  Mn  UR                  U5        M�     U$ s  snf s  snf s  snf )uŽ  Each unclaimed grid over a region the document holds nothing for.

Nothing means nothing: no parse table (the table engine read a text layer
there), no figure (the graft attaches that reading to a picture), no
picture (the picture tier above homes those), and no content text the
parse read inside the region. That last condition is the line between a
map's legend â€” printed values the parse's text layer never captured, where
the scan's grid is the only reading anywhere â€” and a stat panel, whose
strings the parse does hold and whose binding is the block grouping's job.
Inserting a grid over a region the parse read would state its content
twice.
c              3  óL   #   • U  H  n[        UR                  5      v •  M     g 7fr€   r�   r‚   s     r2   r3   Ú _orphan_grids.<locals>.<genexpr>;  r…   r†   c              3  ó¶   >#   • U  HN  nUR                   (       d  M  UR                   S    R                  TR                  :X  d  M?  [        UTT5      v •  MP     g7frˆ   r‰   rŒ   s     €€€r2   r3   r©   >  r�   rŽ   c              3  ó¶   >#   • U  HN  nUR                   (       d  M  UR                   S    R                  TR                  :X  d  M?  [        UTT5      v •  MP     g7frˆ   r‰   )r-   ra   r]   r9   r\   s     €€€r2   r3   r©   G  sL   øé € ð 
â,�Ø�|�|ó -à '§¡¨Q¡× 7Ñ 7¸4¿9¹9Ñ Dó -ŒH�W˜e V×,Ð,Ú,ùrŽ   r&   r   é   r%   é   c              3  ó>   >#   • U  H  n[        UTT5      v •  M     g 7fr€   r’   )r-   r”   rx   rW   s     €€r2   r3   r©   _  s   øé € ÐbÒ@a°uŒw�u˜c >×2Ð2Ò@aùr–   c              3  ó¢   >#   • U  HD  u  pTS    Us=:*  =(       a    TS   :*  Os  =(       a    TS   Us=:*  =(       a    TS   :*  Os  v •  MF     g7f)r   r¬   r%   r­   Nr˜   )r-   ÚcxÚcyrx   s      €r2   r3   r©   a  sE   øé € Ð\Ê|ÁVÀRˆs�1‰v˜×%Ó%˜s 1™vÔ%×@¨#¨a©&°B×*@Ó*@¸#¸a¹&Ô*@Ô@Ê|ùs   ƒAA)r›   rA   rœ   ÚtextsÚlabelÚ_SPINE_LABELSÚtextÚstriprŠ   r‹   r.   r   rG   rr   r   rx   r    )rU   r9   r_   r\   r]   rW   rx   r›   r¡   rœ   Útext_centersÚitemÚfoundr:   s    ` ````       r2   rM   rM   '  sÀ  ü€ ñ( NÀÇÂÔMÓaÒM�s�sÑM€GÐaö
à!Ÿšô
óò
ˆCð
 ÷ 	ñ
ð ð ö
à#×,Ò,ô
óò
ˆCð
 ÷ 	ñ
ð ð ð €LØ—”ˆØ�:‰:œÓ&¨t¯y©y¯¸B×.EÑ.E×.GÑ.GÙØ�y�y˜DŸI™I a™L×0Ñ0°D·I±IÓ=ÙÜ�t˜U FÓ+ˆØ‹?Ø×Ñ # a¡&¨3¨q©6¡/°QÑ!6¸¸Q¹À#ÀaÁ&¹ÈAÑ8MÐ NÖOñ ð !#€EÛˆØ�}�}ÙÜ�w—{‘{Ó#ˆØ‰;ÙÜÕbÀÑ@VÐYaÒ@aÓb×bÑbÙÜÔ\É|Ó\×\Ñ\ÙØ�‰�WÖñ ð €LùòS bùòùòs"   ›G¥GÁGÁGÁ4G$Á?G$c                ó  • U R                    Vs/ s H@  o"R                  (       d  M  UR                  S   R                  U:X  d  M4  UR                  PMB     nn[	        U5       VVs0 s H
  u  pEXTS-   _M     snn$ s  snf s  snnf )zJEach table's position among the tables its page prints, counting from one.r   r%   )rA   rŠ   r‹   rB   Ú	enumerate)rU   r.   rY   ÚrefsÚir;   s         r2   rC   rC   g  sf   € à (§¢ÓX¢˜1·6µ6‹J¸a¿f¹fÀQ¹i×>OÑ>OÐSWÑ>W‹JˆA�JŒJ¡€DÐXÜ%.¨t¤_Ô5¢_™6˜1ˆC�Q‘ŠJ¡_Ò5Ð5ùò YùÛ5s   �A;§A;ÁA;Á&B c                óÊ   • U c  g[        XU5      nUc  gSnUnU HD  n[        UR                  5      n	U	c  M  [        [	        X•5      [	        XY5      5      n
X§:¼  d  MB  XŠpvMF     U$ )u¼   The returned table covering `item` best, or none past the threshold.

`item` is whatever the parse holds over that region â€” a table it detected as
one, or a picture it filed a table as.
N)r   r   rx   r¥   r   )r¸   r:   r\   r]   rW   r•   ÚbestÚbest_covÚ	candidaterx   Úcovs              r2   rF   rF   m  ss   € ð �|ØÜ�d 6Ó*€FØ�~Øà#'€DØ€HÛˆ	Ü�y—}‘}Ó%ˆØ‰;ÙÜÔ# CÓ0Ô2CÀFÓ2PÓQˆØ�?Ø&’(ñ ð €Kr¦   )rU   r
   rV   zList[PageScan]r0   r   r?   zDict[int, Tuple[float, float]]r/   r   r@   úOptional[CellReader]rW   ÚfloatrX   ÚboolÚreturnz&Tuple[List[ExtractedTable], List[str]])r:   r   r`   zOptional[TableItem]rq   r   r?   zTuple[float, float]r<   Úintr/   r   r@   rÃ   rÆ   r   )rU   r
   r9   r   r_   úList[ScannedTable]r\   rÄ   r]   rÄ   rW   rÄ   rÆ   z&List[Tuple[PictureItem, ScannedTable]])rx   r   r•   r   rW   rÄ   rÆ   rÅ   )rU   r
   r9   r   r_   rÈ   r\   rÄ   r]   rÄ   rW   rÄ   rÆ   rÈ   )rU   r
   r.   rÇ   rÆ   zDict[str, int])r¸   zOptional[DocItem]r:   rÈ   r\   rÄ   r]   rÄ   rW   rÄ   rÆ   zOptional[ScannedTable])BÚ__doc__Ú
__future__r   r*   rN   Úpathlibr   Útypingr   r   r   r   Údocling_core.types.doc.documentr	   r
   r   r   Údocling_core.types.doc.labelsr   Úlogurur   Úquber.agents.cell_readerr   Úquber.core.extractors.baser   Ú5quber.core.extractors.camelot.correspondence.geometryr   r   r   Ú*quber.core.extractors.set_of_mark.assembler   r   Ú(quber.core.extractors.set_of_mark.extentr   Úquber.core.figures.crosscheckr   Úquber.core.figures.geometryr   r   r   r   Úquber.core.figures.modelsr   r   Úquber.core.figures.nominater   r   Úquber.core.fusion.graftr    Úquber.files.pdfr!   ÚMATCH_FRACTIONÚCAPTURE_DPIrn   r7   rK   r“   Ú	frozensetÚSECTION_HEADERÚPAGE_HEADERÚPAGE_FOOTERÚTITLEr´   rM   rC   rF   r˜   r¦   r2   Ú<module>râ      s3  ðñ"õH #ã Û Ý ß .Ó .ç \Ó \Ý 6Ý å /Ý 5÷ñ ÷
 UÝ JÝ :ß NÓ Nß <ß JÝ 1Ý 'ð
 €ð €ð $(Ø*Øðb Øðb àðb ð ðb ð .ð	b ð
 ðb ð !ðb ð ðb ð ðb ð ,õb ðJ+Øð+à#ð+ð ð+ð #ð	+ð
 ð+ð ð+ð !ð+ð ô+ð\:Øð:à
ð:ð "ð:ð ð	:ð
 ð:ð ð:ð ,ô:ôzañ Ø× Ñ  ,×":Ñ":¸L×<TÑ<TÐVb×VhÑVhÐió€ð
=Øð=à
ð=ð "ð=ð ð	=ð
 ð=ð ð=ð ô=ô@6ðØ
ðàðð ðð ð	ð
 ðð õr¦   