§
    �Wêjã7  ã                  ó¢   — d Z ddlmZ ddlZ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 ddhZd	d
hZdhZddhZdad!d„Zd"d„Z G d„ d ¦  «        ZdS )#a0  
HTMLGenerator.py

Converts BoxRFDGNN layout detection results into a complete HTML document.

Single-page usage
-----------------
    from source.layout.onnx.HTMLGenerator import HTMLGenerator
    gen  = HTMLGenerator(model)
    html = gen.generate(page)

Whole-PDF usage (multi-process, mirrors MultiProcessWrapper.to_markdown)
------------------------------------------------------------------------
    from source.layout.onnx.HTMLGenerator import HTMLGenerator
    gen  = HTMLGenerator(model, n_workers=4)
    html = gen.generate("/path/to/document.pdf")
é    )ÚannotationsN)ÚPool)ÚPath)ÚAnyÚCallableÚOptionalÚUnionzpage-headerzpage-footerÚtitlezsection-headerz	list-itemÚcaptionÚfootnoteÚconfig_pathÚstrÚ
model_pathÚimf_model_pathÚfeature_set_nameÚ
input_typeúOptional[tuple]Úuse_gpuÚboolÚuse_sortÚreturnÚNonec           
     ó8   — ddl m }  || ||||d||¬¦  «        adS )z-Initialize BoxRFDGNN once per worker process.é   )Ú	BoxRFDGNNF)r   r   r   r   r   Úenable_inference_cacher   r   N)r   Ú_worker_model)r   r   r   r   r   r   r   r   s           ú“/Users/tedpeters/Documents/Projects/Claude Projects/TPC Houses/house-viewer/.venv/lib/python3.11/site-packages/pymupdf/layout/onnx/HTMLGenerator.pyÚ_worker_initr   -   sH   € ð %Ð$Ð$Ð$Ð$Ð$Ø�IØ!,Ø!+Ø!/Ø!1Ø!+Ø!&Ø!(Ø!)ð	ñ 	ô 	€M€M€Mó    ÚargsÚtupleútuple[int, str]c                óÂ   — | \  }}}ddl }|                     |¦  «        }||         }t          j                             ||¬¦  «        }|                     ¦   «          ||fS )zª
    Worker task: open PDF, process one page, return (page_no, html_body_fragment).

    Parameters
    ----------
    args : (pdf_path, page_no, skip_header_footer)
    r   N©Úskip_header_footer)ÚfitzÚopenr   Úhtml_generatorÚgenerate_page_fragmentÚclose)r!   Úpdf_pathÚpage_nor&   r'   ÚdocÚpageÚfragments           r   Ú_worker_generate_pager1   E   sr   € ð -1Ñ)€HˆgÐ)Ø€K€K€KØ�9Š9�XÑÔ€CØˆwŒ<€DÝÔ+×BÒBØÐ!3ð Cñ ô €Hð ‡I‚I�K„K€KØ�HÐÐr    c                  ó¨   — e Zd ZdZ	 	 	 	 d1d2d„Z	 	 d3d4d„Z	 d5d6d„Zd7d„Zd8d„Zd9d!„Z	d:d(„Z
ed;d+„¦   «         Zed<d,„¦   «         Zd=d-„Zd.„ Zd/„ Zd0„ ZdS )>ÚHTMLGeneratoraÈ  
    Converts BoxRFDGNN layout detection results into a complete HTML document.

    Parameters
    ----------
    model      : BoxRFDGNN instance.
    n_workers  : Number of worker processes for whole-PDF processing.
                 Values < 2 run in the main process (no Pool created).
    use_gpu    : Passed to worker BoxRFDGNN instances.
    use_sort   : Passed to worker BoxRFDGNN instances.
    title      : Value used in the HTML <title> tag.
    r   FÚDocumentÚmodelr   Ú	n_workersÚintr   r   r   r
   r   r   r   c                óŒ   — || _         || _        || _        |j        |j        |j        |j        |j        ||f| _        d | _	        d S ©N)
r5   r
   Ú
_n_workersr   r   r   r   r   Ú_worker_argsÚ_pool)Úselfr5   r6   r   r   r
   s         r   Ú__init__zHTMLGenerator.__init__j   sT   € ð ˆŒ
ØˆŒ
Ø#ˆŒàÔØÔØÔ ØÔ"ØÔØØð
ˆÔð &*ˆŒ
ˆ
ˆ
r    TNÚpage_or_pathúUnion[str, Path, Any]r&   Úprogress_callbackú$Optional[Callable[[int, int], None]]c                ó  — t          |t          t          f¦  «        s-|                      ||¬¦  «        }|                      |g¦  «        S |                      t          |¦  «        ||¬¦  «        }|                      |¦  «        S )a¢  
        Generate a complete HTML document from a single page or an entire PDF.

        Parameters
        ----------
        page_or_path       : PyMuPDF page object  -- processes that single page.
                             str or Path           -- treated as a PDF file path;
                                                      all pages are processed.
        skip_header_footer : If True, page-header and page-footer blocks are excluded.
        progress_callback  : Called as callback(completed_count, total_count).
                             Only used when processing a PDF file.

        Returns
        -------
        Complete HTML document string.
        r%   )r&   rA   )Ú
isinstancer   r   r*   Ú_wrap_documentÚ_generate_pdf)r=   r?   r&   rA   r0   Ú	fragmentss         r   ÚgeneratezHTMLGenerator.generate„   s“   € õ, ˜,­­d¨Ñ4Ô4ð 	3Ø×2Ò2ØÐ1Cð 3ñ ô ˆHð ×&Ò&¨ zÑ2Ô2Ð2à×&Ò&Ý�ÑÔØ1Ø/ð 'ñ 
ô 
ˆ	ð
 ×"Ò" 9Ñ-Ô-Ð-r    r/   c                óê  — ddl m} | j                             |d¬¦  «        }|sdS  ||| j        j        | j        j        | j        j        dœ¬¦  «        }|                     dg ¦  «        }|                     d	g ¦  «        }g }t          |¦  «        D ]F\  }	}
|r|
d
         t          v rŒ|  
                    |
|	||¦  «        }|r|                     |¦  «         ŒGd                     |¦  «        }d|› d�S )zÍ
        Generate an HTML fragment (no <html>/<body> wrapper) for a single page.

        Returns
        -------
        str -- HTML fragment representing one page, wrapped in <div class="page">.
        é   )Úcreate_input_data_from_pageT)Ú
return_rawz<div class="page"></div>)r   r   Úfeature_extractor)ÚoptionsÚtextÚbboxesÚ
class_nameú
z<div class="page">
z
</div>)Úpymupdf_utilrK   r5   Úpredictr   r   rM   ÚgetÚ	enumerateÚ_SKIP_CLASSESÚ_render_groupÚappendÚjoin)r=   r/   r&   rK   ÚgroupsÚ	data_dictÚ	all_textsÚ
all_bboxesÚblocksÚ	group_idxÚgroupÚblockÚinners                r   r*   z$HTMLGenerator.generate_page_fragment§   s2  € ð 	?Ð>Ð>Ð>Ð>Ð>à”×#Ò# D°TÐ#Ñ:Ô:ˆØð 	.Ø-Ð-à/Ð/°Ø $¤
Ô 5Ø $¤
Ô ;Ø!%¤Ô!=ð?
ð ?
ð ñ ô ˆ	ð
 !*§¢¨f°bÑ 9Ô 9ˆ	Ø )§¢¨h¸Ñ ;Ô ;ˆ
àˆÝ )¨&Ñ 1Ô 1ð 	%ð 	%ÑˆI�uØ!ð  e¨LÔ&9½]Ð&JÐ&JØØ×&Ò& u¨i¸ÀJÑOÔOˆEØð %Ø—’˜eÑ$Ô$Ð$øà—	’	˜&Ñ!Ô!ˆØ5 eÐ5Ð5Ð5Ð5r    r,   ú	list[str]c                ó€  ‡‡— dd l }|                     ‰¦  «        }|j        }|                     ¦   «          ˆˆfd„t	          |¦  «        D ¦   «         }g }| j        dk    rg|                      ¦   «         }	t          |	                     t          |¦  «        d¦  «        D ](\  }
}| 
                    |¦  «         |r ||
|¦  «         Œ)nVt          | j        Ž  t          |d¦  «        D ]7\  }
}t          |¦  «        }| 
                    |¦  «         |r ||
|¦  «         Œ8|                     d„ ¬¦  «         d„ |D ¦   «         S )Nr   c                ó   •— g | ]}‰|‰f‘ŒS © rg   )Ú.0Úir,   r&   s     €€r   ú
<listcomp>z/HTMLGenerator._generate_pdf.<locals>.<listcomp>Û   s!   ø€ ÐJÐJÐJ°a�˜1Ð0Ð1ÐJÐJÐJr    rJ   r   c                ó   — | d         S )Nr   rg   )Úxs    r   ú<lambda>z-HTMLGenerator._generate_pdf.<locals>.<lambda>ì   s
   €  1 Q¤4€ r    ©Úkeyc                ó   — g | ]\  }}|‘ŒS rg   rg   )rh   Ú_r0   s      r   rj   z/HTMLGenerator._generate_pdf.<locals>.<listcomp>í   s   € Ð4Ð4Ð4™[˜Q �Ð4Ð4Ð4r    )r'   r(   Ú
page_countr+   Úranger:   Ú_ensure_poolrV   Úimap_unorderedr1   rY   r   r;   Úsort)r=   r,   r&   rA   r'   r.   Ún_pagesr!   ÚresultsÚpoolri   ÚresÚargs    ``          r   rF   zHTMLGenerator._generate_pdfÐ   sm  øø€ ð 	ˆˆˆØ—)’)˜HÑ%Ô%ˆØ”.ˆØ�	Š	‰ŒˆàJÐJÐJÐJÐJ½5À¹>¼>ÐJÑJÔJˆØ)+ˆàŒ?˜aÒÐØ×$Ò$Ñ&Ô&ˆDÝ# D×$7Ò$7Õ8MÈtÑ$TÔ$TÐVWÑXÔXð 2ð 2‘��3Ø—’˜sÑ#Ô#Ð#Ø$ð 2Ø%Ð% a¨Ñ1Ô1Ð1øð2õ
 ˜$Ô+Ð,Ð,Ý# D¨!Ñ,Ô,ð 2ð 2‘��3Ý+¨CÑ0Ô0�Ø—’˜sÑ#Ô#Ð#Ø$ð 2Ø%Ð% a¨Ñ1Ô1Ð1øà�Š˜˜ˆÑ(Ô(Ð(Ø4Ð4¨GÐ4Ñ4Ô4Ð4r    r   c                ój   — | j         €&t          | j        t          | j        ¬¦  «        | _         | j         S )N)Ú	processesÚinitializerÚinitargs)r<   r   r:   r   r;   ©r=   s    r   rt   zHTMLGenerator._ensure_poolï   s8   € ØŒ:ÐÝØ"œoÝ*Ø"Ô/ðñ ô ˆDŒJð
 ŒzÐr    Úpage_fragmentsc                óp   — t          j        | j        ¦  «        }d                     |¦  «        }d|› d|› d�S )Nz

zJ<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>a4  </title>
  <style>
    body { font-family: sans-serif; max-width: 960px; margin: 0 auto; padding: 2rem; }
    .page { margin-bottom: 3rem; border-bottom: 1px solid #ccc; padding-bottom: 2rem; }
    h2 { margin-top: 1.5rem; }
    table { border-collapse: collapse; width: 100%; margin: 1rem 0; }
    th, td { border: 1px solid #ccc; padding: 6px 10px; text-align: left; }
    th { background: #f0f0f0; }
    ul { margin: 0.5rem 0; padding-left: 1.5rem; }
    .formula { font-style: italic; }
    .figure { color: #666; font-size: 0.9em; }
  </style>
</head>
<body>
z
</body>
</html>)Úhtml_moduleÚescaper
   rZ   )r=   r�   Ú	esc_titleÚbodys       r   rE   zHTMLGenerator._wrap_documentü   sR   € ÝÔ& t¤zÑ2Ô2ˆ	Ø—K’K Ñ/Ô/ˆðð "ð	ð ð$ ð%ð ð ð	
r    ra   Údictr`   r]   r^   Úlistc           	     ó<  — |                      dd¦  «        }|                      |||¦  «                             ¦   «         }|dk    rI|                      dg ¦  «        }|r|                      |¦  «        n|rdt	          j        |¦  «        › d�ndS |t          v r|rdt	          j        |¦  «        › d	�ndS |t          v r|rd
t	          j        |¦  «        › d�ndS |t          v r|rdt	          j        |¦  «        › d�ndS |dk    r|rdt	          j        |¦  «        › d�ndS |dk    r\|d         \  }}	}
}d|› �}t          |¦  «        › dt          |	¦  «        › dt          |
¦  «        › dt          |¦  «        › �}d|› d|› d�S |rdt	          j        |¦  «        › d�ndS )NrQ   rO   ÚtableÚtable_cellsz<p>z</p>Ú z<h2>z</h2>z<ul><li>z
</li></ul>z<p><em>z	</em></p>Úformulaz<p class="formula">ÚpictureÚ
group_bboxzFigure-ú,z <p class="figure">[<span title="z">z</span>]</p>)
rU   Ú_group_textÚstripÚ_render_tablerƒ   r„   Ú_HEADING_CLASSESÚ_LIST_CLASSESÚ_ITALIC_CLASSESr7   )r=   ra   r`   r]   r^   ÚclsrO   ÚcellsÚx1Úy1Úx2Úy2ÚlabelÚcoordss                 r   rX   zHTMLGenerator._render_group  s  € ð �yŠy˜ vÑ.Ô.ˆØ×Ò  y°*Ñ=Ô=×CÒCÑEÔEˆà�'Š>ˆ>Ø—I’I˜m¨RÑ0Ô0ˆEØ05ð �4×%Ò% eÑ,Ô,Ð,Ø8<ÐDÐ4•kÔ(¨Ñ.Ô.Ð4Ð4Ð4Ð4À"ðð Õ"Ð"Ð"Ø=AÐIÐ9�+Ô,¨TÑ2Ô2Ð9Ð9Ð9Ð9ÀrÐIà•-ÐÐØFJÐRÐB�kÔ0°Ñ6Ô6ÐBÐBÐBÐBÐPRÐRà•/Ð!Ð!ØDHÐPÐ@�[Ô/°Ñ5Ô5Ð@Ð@Ð@Ð@ÈbÐPà�)ÒÐØKOÐWÐG­Ô);¸DÑ)AÔ)AÐGÐGÐGÐGÐUWÐWà�)ÒÐØ" <Ô0‰NˆB��B˜Ø)˜iÐ)Ð)ˆEÝ˜B™œÐ?Ð?¥# b¡'¤'Ð?Ð?­C°©G¬GÐ?Ð?µc¸"±g´gÐ?Ð?ˆFØS°fÐSÐSÀÐSÐSÐSÐSð 8<ÐCÐ3•[Ô'¨Ñ-Ô-Ð3Ð3Ð3Ð3ÀÐCr    r˜   ú	list[Any]c           	     ó–  ‡— | sdS t          d„ | D ¦   «         ¦  «        }t          d„ | D ¦   «         ¦  «        Šˆfd„t          |¦  «        D ¦   «         }| D ]Ï}|j        }|j        }t	          |dd¦  «        }t	          |dd¦  «        }|j                             ¦   «         }|sŒNt          |||z   ¦  «        D ]m}	t          |||z   ¦  «        D ]W}
d|	cxk    r|k     rHn Œd|
cxk    r‰k     r8n Œ"||	         |
         }|r|d	z   |z                        ¦   «         n|||	         |
<   ŒXŒnŒÐd
g}|                     d¦  «         t          ‰¦  «        D ]9}
|                     dt          j	        |d         |
         ¦  «        › d�¦  «         Œ:|                     d¦  «         t          d|¦  «        D ]u}	|                     d¦  «         t          ‰¦  «        D ]9}
|                     dt          j	        ||	         |
         ¦  «        › d�¦  «         Œ:|                     d¦  «         Œv|                     d¦  «         d 
                    |¦  «        S )zÎ
        Renders table cells into an HTML table.
        Row 0 is treated as the header row (th), remaining rows as data rows (td).
        Merged cells are replicated across all spanned positions.
        rŒ   c              3  óX   K  — | ]%}|j         t          |d ¦  «        r|j        ndz   V — Œ&dS )Úrow_spanr   N)ÚrowÚhasattrr¢   ©rh   Úcs     r   ú	<genexpr>z.HTMLGenerator._render_table.<locals>.<genexpr>N  ó>   è è € ÐZÐZÈq�Q”U­G°A°zÑ,BÔ,BÐI˜aœj˜jÈÑJÐZÐZÐZÐZÐZÐZr    c              3  óX   K  — | ]%}|j         t          |d ¦  «        r|j        ndz   V — Œ&dS )Úcol_spanr   N)Úcolr¤   rª   r¥   s     r   r§   z.HTMLGenerator._render_table.<locals>.<genexpr>O  r¨   r    c                ó   •— g | ]}d g‰z  ‘Œ	S )rŒ   rg   )rh   rq   Ún_colss     €r   rj   z/HTMLGenerator._render_table.<locals>.<listcomp>Q  s   ø€ Ð FÐ FÐ F°1 " ¨¡Ð FÐ FÐ Fr    r¢   r   rª   r   ú z<table>z  <tr>z    <th>z</th>z  </tr>z    <td>z</td>z</table>rR   )Úmaxrs   r£   r«   ÚgetattrrO   r’   rY   rƒ   r„   rZ   )r˜   Ún_rowsÚgridÚcellÚr_startÚc_startÚr_spanÚc_spanrO   Úrr¦   ÚprevÚlinesr­   s                @r   r“   zHTMLGenerator._render_tableD  sª  ø€ ð ð 	Ø�2åÐZÐZÐTYÐZÑZÔZÑZÔZˆÝÐZÐZÐTYÐZÑZÔZÑZÔZˆà FÐ FÐ FÐ F½¸f¹¼Ð FÑ FÔ Fˆàð 	Sð 	SˆDØ”hˆGØ”hˆGÝ˜d J°Ñ2Ô2ˆFÝ˜d J°Ñ2Ô2ˆFØ”i—o’oÑ'Ô'ˆDØð ØÝ˜7 G¨fÑ$4Ñ5Ô5ð Sð S�Ý˜w¨°&Ñ(8Ñ9Ô9ð Sð S�AØ˜A��’� ’����¨1°¨?¨?ª?¨?°Fª?¨?¨?¨?¨?Ø# Aœw qœz˜ØDHÐ%R d¨S¡j°4Ñ&7×%>Ò%>Ñ%@Ô%@Ð%@Èd˜˜Qœ ™
øðSðSð �ˆð 	�Š�XÑÔÐÝ�v‘”ð 	Kð 	KˆAØ�LŠLÐI¥KÔ$6°t¸A´w¸q´zÑ$BÔ$BÐIÐIÐIÑJÔJÐJÐJØ�Š�YÑÔÐõ �q˜&Ñ!Ô!ð 	$ð 	$ˆAØ�LŠL˜Ñ"Ô"Ð"Ý˜6‘]”]ð Oð O�Ø—’ÐM­Ô(:¸4À¼7À1¼:Ñ(FÔ(FÐMÐMÐMÑNÔNÐNÐNØ�LŠL˜Ñ#Ô#Ð#Ð#à�Š�ZÑ Ô Ð Ø�yŠy˜ÑÔÐr    c                óÊ   ‡‡‡— dŠ|                       dg ¦  «        }ˆˆfd„|D ¦   «         }|                     ˆfd„¬¦  «         d                     ˆfd„|D ¦   «         ¦  «        S )z;Join texts sorted by visual reading order within the group.é   Úindiciesc                óÌ   •— g | ]`}d |cxk    rt          ‰¦  «        k     ¯n nAd |cxk    rt          ‰¦  «        k     ¯9n n$‰|                              ¦   «         ¯V|‰|         f‘ŒaS )r   )Úlenr’   )rh   Úidxr^   r]   s     €€r   rj   z-HTMLGenerator._group_text.<locals>.<listcomp>|  s”   ø€ ð 
ð 
ð 
àØ�CÐ(Ð(Ò(Ð(�#˜i™.œ.Ò(Ð(Ð(Ð(Ð(¨Q°#Ð-GÐ-GÒ-GÐ-G½¸J¹¼Ò-GÐ-GÐ-GÐ-GÐ-GØ˜S”>×'Ò'Ñ)Ô)ð .Hð �*˜S”/Ð"à-GÐ-GÐ-Gr    c                óB   •— | d         d         ‰z  | d         d         fS )Nr   r   rg   )rl   Úmargins    €r   rm   z+HTMLGenerator._group_text.<locals>.<lambda>‚  s!   ø€  ! A¤$ q¤'¨VÑ"3°Q°q´T¸!´WÐ!=€ r    rn   r®   c              3  óR   •K  — | ]!\  }}‰|                               ¦   «         V — Œ"d S r9   )r’   )rh   rÀ   rq   r]   s      €r   r§   z,HTMLGenerator._group_text.<locals>.<genexpr>ƒ  s7   øè è € ÐCÐC±6°3¸˜	 #œ×,Ò,Ñ.Ô.ÐCÐCÐCÐCÐCÐCr    )rU   rv   rZ   )ra   r]   r^   r½   ÚvalidrÂ   s    ``  @r   r‘   zHTMLGenerator._group_textw  s“   øøø€ ð ˆØ—9’9˜Z¨Ñ,Ô,ˆð
ð 
ð 
ð 
ð 
àð
ñ 
ô 
ˆð 	�
Š
Ð=Ð=Ð=Ð=ˆ
Ñ>Ô>Ð>Ø�xŠxÐCÐCÐCÐC¸UÐCÑCÔCÑCÔCÐCr    c                óŠ   — | j         �;| j                              ¦   «          | j                              ¦   «          d | _         d S d S r9   )r<   r+   rZ   r€   s    r   r+   zHTMLGenerator.close‰  sC   € ØŒ:Ð!ØŒJ×ÒÑÔÐØŒJ�OŠOÑÔÐØˆDŒJˆJˆJð "Ð!r    c                ó   — | S r9   rg   r€   s    r   Ú	__enter__zHTMLGenerator.__enter__�  s   € Øˆr    c                ó.   — |                       ¦   «          d S r9   )r+   )r=   rq   s     r   Ú__exit__zHTMLGenerator.__exit__’  s   € Ø�
Š
‰Œˆˆˆr    c                óR   — 	 |                       ¦   «          d S # t          $ r Y d S w xY wr9   )r+   Ú	Exceptionr€   s    r   Ú__del__zHTMLGenerator.__del__•  s:   € ð	Ø�JŠJ‰LŒLˆLˆLˆLøÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ ˜
&¥&)r   FFr4   )r5   r   r6   r7   r   r   r   r   r
   r   r   r   )TN)r?   r@   r&   r   rA   rB   r   r   )T)r/   r   r&   r   r   r   )r,   r   r&   r   rA   rB   r   rd   )r   r   )r�   rd   r   r   )
ra   r‡   r`   r7   r]   rd   r^   rˆ   r   r   )r˜   rŸ   r   r   )ra   r‡   r]   rd   r^   rˆ   r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r>   rH   r*   rF   rt   rE   rX   Ústaticmethodr“   r‘   r+   rÇ   rÉ   rÌ   rg   r    r   r3   r3   \   sa  € € € € € ðð ð  ØØØ#ð*ð *ð *ð *ð *ð: $(ØCGð	!.ð !.ð !.ð !.ð !.ðL $(ð#6ð #6ð #6ð #6ð #6ðR5ð 5ð 5ð 5ð>ð ð ð ð
ð 
ð 
ð 
ð>#Dð #Dð #Dð #DðR ð, ð , ð , ñ „\ð, ðd ðDð Dð Dñ „\ðDð"ð ð ð ðð ð ðð ð ðð ð ð ð r    r3   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r!   r"   r   r#   )rÐ   Ú
__future__r   Úhtmlrƒ   ÚmultiprocessingÚmpÚmultiprocessing.poolr   Úpathlibr   Útypingr   r   r   r	   rW   r”   r•   r–   r   r   r1   r3   rg   r    r   ú<module>rÙ      s  ððð ð$ #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1ð " =Ð1€ØÐ-Ð.Ð Ø�=€Ø˜zÐ*€ð €ðð ð ð ð0ð ð ð ð.}ð }ð }ð }ð }ñ }ô }ð }ð }ð }r    