Ë
    ±bjë1  ã                   óX  — d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	  ee
«      j                  «       j                  d   dz  ZdZ e ej                   dd«      «      Z e ej                   d	d
«      «      Z e ej                   dd«      «      Zdeddfd„Z G d„ d«      Z e«       Zy)é    N)ÚPath)ÚBrowserContextÚPageÚ
PlaywrightÚasync_playwrighté   Úbrowser_data)ÚdefaultÚexchangeÚmanage_libraryÚPLAYWRIGHT_TIMEOUT_MSÚ15000ÚPLAYWRIGHT_NAV_TIMEOUT_MSÚ45000ÚPLAYWRIGHT_SLOW_MO_MSÚ50ÚpageÚreturnc                 óx   — 	 | j                  t        «       | j                  t        «       y # t        $ r Y y w xY w©N)Úset_default_timeoutÚDEFAULT_ACTION_TIMEOUT_MSÚset_default_navigation_timeoutÚDEFAULT_NAV_TIMEOUT_MSÚ	Exception)r   s    úE/var/www/html/sergio/sergio-backend/app/automation/browser_manager.pyÚ_configure_page_timeoutsr      s7   € ðØ× Ñ Ô!:Ô;Ø×+Ñ+Ô,BÕCøÜò Ùðús   ‚*- ­	9¸9c                   ó`  — e Zd ZdZd„ Zededz  fd„«       Zedefd„«       Z	e	j                  deddfd„«       Z	d	ed
eddfd„Zd	edefd„Zd	edej                  fd„Zd	edz  defd„Zddedz  d	edefd„Zdedz  ddfd„Zd	edefd„Zdd„Zdd„Zdd„Zdd	edefd„Zdd„Zdd„Zdd„Zdd„Zy)ÚBrowserManagerz×
    ONE Chromium profile for the FastAPI app (shared Hudl login cookies),
    with multiple pages ("lanes") so Exchange and Manage Library can run
    at the same time without stealing each other's navigation.
    c                 óŒ  — d | _         d | _        t        D �ci c]  }|d “Œ c}| _        t        D �ci c]  }|t	        j
                  «       “Œ c}| _        t        D �ci c]  }|d“Œ c}| _        t	        j
                  «       | _        d| _	        d| _
        t        j                  «       | _        d | _        y c c}w c c}w c c}w )NFi,  )Ú_playwrightÚcontextÚLANESÚ_pagesÚasyncioÚLockÚ_lane_locksÚ
_lane_busyÚ
_boot_lockÚ
is_runningÚidle_timeoutÚtimeÚlast_activity_timeÚ
_loop_task©ÚselfÚlanes     r   Ú__init__zBrowserManager.__init__#   s²   € Ø.2ˆÔØ.2ˆŒÝFKÓ.LÁe¸d¨t°T©zÀeÑ.LˆŒå-2ó5
Ù-2 TˆD”'—,‘,“.Ñ ¨Uñ5
ˆÔõ EJÓ+JÁE¸D¨D°%©KÀEÑ+JˆŒÜ!Ÿ,™,›.ˆŒØˆŒàˆÔÜ"&§)¡)£+ˆÔØ/3ˆ�ùò /Mùò5
ùò ,Ks   —
B7±B<Á
Cr   Nc                 ó8   — | j                   j                  d«      S )z4Backward-compatible alias for the default lane page.r
   )r$   Úget©r0   s    r   r   zBrowserManager.page2   s   € ð �{‰{�‰˜yÓ)Ð)ó    c                 óH   — t        | j                  j                  «       «      S r   )Úanyr(   Úvaluesr5   s    r   Úis_busyzBrowserManager.is_busy7   s   € ä�4—?‘?×)Ñ)Ó+Ó,Ð,r6   Úvaluec                 ó4   — t        |«      | j                  d<   y ©Nr
   )Úboolr(   )r0   r;   s     r   r:   zBrowserManager.is_busy;   s   € ô &*¨%£[ˆ�‰˜	Ò"r6   r1   Úbusyc                 óD   — | j                  |«      }|| j                  |<   y r   )Ú_normalize_laner(   )r0   r1   r?   s      r   Úset_lane_busyzBrowserManager.set_lane_busy@   s    € Ø×#Ñ# DÓ)ˆØ $ˆ�‰˜Òr6   c                 óX   — | j                   j                  | j                  |«      d«      S ©NF)r(   r4   rA   r/   s     r   Úis_lane_busyzBrowserManager.is_lane_busyD   s$   € Ø�‰×"Ñ" 4×#7Ñ#7¸Ó#=¸uÓEÐEr6   c                 ó>   — | j                   | j                  |«         S r   )r'   rA   r/   s     r   Ú	lane_lockzBrowserManager.lane_lockG   s   € Ø×Ñ × 4Ñ 4°TÓ :Ñ;Ð;r6   c                 ó   — |t         v r|S yr=   )r#   r/   s     r   rA   zBrowserManager._normalize_laneJ   s   € Ø”5‰=ØˆKØr6   Úheadlessc              ƒ   óü  K  — | j                  |«      }| j                  4 ƒd {  –—†  | j                  r| j                  j                  «       r(t	        j
                  | j                  «       «      | _        | j                  €| j                  |«      ƒ d {  –—†  | j                  |«      ƒ d {  –—† }d| _
        | j                  «        |cd d d «      ƒd {  –—†  S 7 Œº7 ŒI7 Œ27 Œ# 1 ƒd {  –—†7  sw Y   y xY w­w)NT)rA   r)   r.   Údoner%   Úcreate_taskÚ_idle_check_loopr"   Ú_boot_contextÚ_ensure_lane_pager*   Úrecord_activity)r0   rI   r1   r   s       r   ÚstartzBrowserManager.startO   s·   è ø€ Ø×#Ñ# DÓ)ˆØ—?—?“?Ø—?’? d§o¡o×&:Ñ&:Ô&<Ü")×"5Ñ"5°d×6KÑ6KÓ6MÓ"N�”à�|‰|Ð#Ø×(Ñ(¨Ó2×2Ð2à×/Ñ/°Ó5×5ˆDØ"ˆDŒOØ× Ñ Ô"Ø÷ #—?’?øð
 3øà5øð #ø—?—?‘?üsi   ‚"C<¤C¥C<¨A/C'ÂC!ÂC'Â0C#Â1C'ÃC<ÃC%ÃC<Ã!C'Ã#C'Ã%C<Ã'C9Ã-C0Ã.C9Ã5C<c           	   ƒ   óø  K  — t         j                  dd¬«       | j                  «        |€]dd l}dd l} |j
                  dd«      j                  «       dv }|j                  j                  d«      }d|j                  v }|r|sd}n|}t        «       j                  «       ƒ d {  –—† | _        | j                  «        | j                  j                  j                  t!        t         «      ||st"        ndd	d
dœdg d¢¬«      ƒ d {  –—† | _        	 | j$                  j'                  t(        «       | j$                  j+                  t,        «       | j$                  j0                  r| j$                  j0                  d   n!| j$                  j3                  «       ƒ d {  –—† }t5        |«       || j6                  d<   d„ }| j$                  j9                  d|«      ƒ d {  –—†  y 7 �Œ>7 ŒÞ# t.        $ r Y Œ£w xY w7 ŒZ7 Œ­w)NT©ÚparentsÚexist_okr   ÚHEADLESSÚfalse)ÚtrueÚ1ÚyesÚlinuxÚDISPLAYiV  i   )ÚwidthÚheightzen-US)
z--disk-cache-size=10485760z--media-cache-size=10485760z--disable-gpu-program-cachez--disable-gpu-shader-disk-cachez--disable-application-cachez--disable-dev-shm-usagez--disable-crash-reporterz--disable-breakpadz--no-sandboxz--start-maximized)Úuser_data_dirrI   Úslow_moÚviewportÚlocaleÚargsr
   c              “   ó„  ‡K  — | j                   }|j                  j                  «       Šd‰v r| j                  «       ƒ d {  –—†  y |j                  dv r| j                  «       ƒ d {  –—†  y g d¢}t        ˆfd„|D «       «      r| j                  «       ƒ d {  –—†  y | j                  «       ƒ d {  –—†  y 7 Œv7 ŒQ7 Œ"7 Œ­w)Nzhudl.com)ÚimageÚmediaÚfont)zgoogle-analyticsÚmixpanelÚhotjarz	sentry.iozfacebook.netc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr   © )Ú.0ÚpatÚurls     €r   Ú	<genexpr>zHBrowserManager._boot_context.<locals>.block_resources.<locals>.<genexpr>¢   s   øè ø€ Ð:Ñ)9 #�3˜#”:Ñ)9ùs   ƒ)Úrequestrn   ÚlowerÚ	continue_Úresource_typeÚabortr8   )ÚrouteÚreqÚblocked_patternsrn   s      @r   Úblock_resourcesz5BrowserManager._boot_context.<locals>.block_resources’   s«   øè ø€ Ø—-‘-ˆCØ—'‘'—-‘-“/ˆCØ˜SÑ Ø—o‘oÓ'×'Ð'ØØ× Ñ Ð$>Ñ>Ø—k‘k“m×#Ð#Øò Ðô Ó:Ñ)9Ó:Ô:Ø—k‘k“m×#Ð#ØØ—/‘/Ó#×#Ñ#ð (øð $øð $øà#úsG   ƒ>C ÁB8Á&C Á(B:Á)0C ÂB<ÂC Â2B>Â3C Â:C Â<C Â>C z**/*)ÚBROWSER_DATA_DIRÚmkdirÚ_check_and_auto_clear_sessionÚosÚsysÚgetenvrq   ÚplatformÚ
startswithÚenvironr   rQ   r!   Ú_prune_cacheÚchromiumÚlaunch_persistent_contextÚstrÚDEFAULT_SLOW_MO_MSr"   r   r   r   r   r   ÚpagesÚnew_pager   r$   ru   )	r0   rI   r|   r}   Úheadless_envÚis_linuxÚhas_displayÚfirstrx   s	            r   rN   zBrowserManager._boot_context]   s½  è ø€ Ü×Ñ t°dÐÔ;Ø×*Ñ*Ô,àÐÛÛà$˜2Ÿ9™9 Z°Ó9×?Ñ?ÓAÐEYÐYˆLØ—|‘|×.Ñ.¨wÓ7ˆHØ# r§z¡zÐ1ˆKÙ¡Ø‘à'�ä!1Ó!3×!9Ñ!9Ó!;×;ˆÔØ×ÑÔà!×-Ñ-×6Ñ6×PÑPÜÔ.Ó/ØÙ.6Õ&¸AØ#¨sÑ3Øòð Qó 
÷ 
ˆŒð&	Ø�L‰L×,Ñ,Ô-FÔGØ�L‰L×7Ñ7Ô8NÔOð �|‰|×!Ò!ð �L‰L×Ñ˜qÒ!à—|‘|×,Ñ,Ó.×.ð 	ô
 	! Ô'Ø!&ˆ�‰�IÑò	$ð* �l‰l× Ñ  ¨Ó9×9Ñ9ðu <ùð
ùô, ò 	Ùð	úð /øð4 	:úsi   ‚B"G:Â$G"Â%A!G:ÄG%Ä	G:Ä>G' ÅAG:ÆG6ÆA G:ÇG8ÇG:Ç%G:Ç'	G3Ç0G:Ç2G3Ç3G:Ç8G:c              ƒ   óš  K  — | j                   €t        d«      ‚| j                  j                  |«      }|�|j	                  «       st        |«       |S | j                  j                  «       D �ch c]  }|�|j	                  «       st        |«      ’Œ! }}|dk(  r_| j                   j                  rI| j                   j                  D ]0  }|j	                  «       rŒt        |«       || j                  d<   |c S  |dk(  rx| j                   j                  D ]_  }|j	                  «       st        |«      |v rŒ!d|j                  xs dv sŒ4t        |«       || j                  |<   t        d|› d�«       |c S  | j                   j                  «       ƒ d {  –—† }t        |«       || j                  |<   t        d|› d�«       |S c c}w 7 Œ4­w)	NzBrowser context is not startedr
   r   z/manage/library/Ú zBrowser lane 'z$' reused existing Manage Library tabz' opened on a dedicated tab)r"   ÚRuntimeErrorr$   r4   Ú	is_closedr   r9   Úidr‡   rn   Úprintrˆ   )r0   r1   r   ÚpÚassignedÚexistings         r   rO   z BrowserManager._ensure_lane_page©   s¦  è ø€ Ø�<‰<ÐÜÐ?Ó@Ð@à�{‰{�‰˜tÓ$ˆØÐ D§N¡NÔ$4Ü$ TÔ*ØˆKð —[‘[×'Ñ'Ô)ó
á)�Øˆ} Q§[¡[¤]ô ˆq�EØ)ð 	ð 
ð �9Ò §¡×!3Ò!3à ŸL™L×.Ô.�Ø×)Ñ)Õ+Ü,¨XÔ6Ø-5�D—K‘K 	Ñ*Ø#’Oð	 /ð Ð#Ò#Ø ŸL™L×.Ô.�Ø×%Ñ%Ô'¬2¨h«<¸8Ñ+CØØ%¨(¯,©,Ò*<¸"Ò=Ü,¨XÔ6Ø(0�D—K‘K Ñ%ÜØ(¨¨Ð.RÐSôð $’Oð /ð —\‘\×*Ñ*Ó,×,ˆÜ  Ô&Ø ˆ�‰�DÑÜ�˜t˜fÐ$?Ð@ÔAØˆùòA
ð8 -ús-   ‚A.GÁ0$GÂAGÃA-GÅ	AGÆG	Æ5Gc                 ó†  — ddl }	 t        j                  «       syt        dz  dz  t        dz  dz  t        dz  dz  t        dz  dz  dz  t        dz  dz  d	z  t        d
z  g}|D ]7  }|j                  «       sŒ|j                  «       sŒ%|j	                  |d¬«       Œ9 y# t
        $ r}t        d|› �«       Y d}~yd}~ww xY w)zDClear heavy non-essential Chromium cache directories before booting.r   NÚDefaultÚCachez
Code CacheÚGPUCachezService WorkerÚCacheStorageÚScriptCachezCrash ReportsT©Úignore_errorsz$Non-critical: Cache pruning failed: )Úshutilry   ÚexistsÚis_dirÚrmtreer   r’   )r0   rž   Údirs_to_pruneÚpathÚes        r   r‚   zBrowserManager._prune_cacheÔ   sÉ   € ãð	>Ü#×*Ñ*Ô,Øô ! 9Ñ,¨wÑ6Ü  9Ñ,¨|Ñ;Ü  9Ñ,¨zÑ9Ü  9Ñ,Ð/?Ñ?À.ÑPÜ  9Ñ,Ð/?Ñ?À-ÑOÜ  ?Ñ2ðˆMó &�Ø—;‘;•= T§[¡[¥]Ø—M‘M $°d�MÕ;ñ &øô ò 	>ÜÐ8¸¸Ð<×=Ñ=ûð	>ús)   †B ›AB Á8B Â	B Â	C Â(B;Â;C c                 óÒ  — ddl }t        dz  }d}|j                  «       sd}nD	 t        |j	                  «       j                  «       «      }t        j                  «       |z
  dkD  rd}|r¦t        d«       	 t        j                  «       rOt        j                  «       D ]8  }|j                  «       r|j                  |d¬«       Œ'|j                  d¬	«       Œ: 	 |j                  t        t        t        j                  «       «      «      «       yy# t        $ r d}Y Œ¶w xY w# t        $ r}t        d
|› �«       Y d}~Œed}~ww xY w# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)z:Clear browser data once per day for a fresh login session.r   Núlast_clear.txtFTi€Q zODaily session clear triggered: clearing browser data for a fresh login session.rœ   ©Ú
missing_okz%Failed during daily session cleanup: ú&Failed to write last_clear timestamp: )rž   ry   rŸ   ÚintÚ	read_textÚstripr,   r   r’   Úiterdirr    r¡   ÚunlinkÚ
write_textr…   )r0   rž   Úlast_clear_fileÚshould_clearÚ	timestampÚitemr¤   s          r   r{   z,BrowserManager._check_and_auto_clear_sessionë   sF  € ãä*Ð-=Ñ=ˆØˆà×%Ñ%Ô'Ø‰Lð$Ü × 9Ñ 9Ó ;× AÑ AÓ CÓD�	Ü—9‘9“; Ñ*¨UÒ2Ø#'�Lñ ÜØaôðCÜ#×*Ñ*Ô,Ü 0× 8Ñ 8Ö :˜ØŸ;™;œ=Ø"ŸM™M¨$¸d˜MÕCà ŸK™K°4˜KÕ8ð	 !;ðDØ×*Ñ*¬3¬s´4·9±9³;Ó/?Ó+@ÕAð øô ò $Ø#’ð$ûô ò CÜÐ=¸a¸SÐA×BÑBûðCûô
 ò DÜÐ>¸q¸cÐB×CÑCûðDúsC   ¤AD Á5A#D! Ã5E ÄDÄDÄ!	EÄ*D=Ä=EÅ	E&ÅE!Å!E&c           	   ƒ   óÈ  K  — | j                   4 ƒd{  –—†  | j                  «       ƒ d{  –—†  ddl}	 t        j	                  «       rOt        j                  «       D ]8  }|j                  «       r|j                  |d¬«       Œ'|j                  d¬«       Œ: t        j                  dd¬«       t        dz  }	 |j                  t        t        t        j                  «       «      «      «       ddd«      ƒd{  –—†  y7 Œë7 ŒÕ# t        $ r}t        d|› �«       Y d}~Œ‡d}~ww xY w# t        $ r}t        d	|› �«       Y d}~ŒUd}~ww xY w7 ŒQ# 1 ƒd{  –—†7  sw Y   yxY w­w)
z2Close the browser and wipe the persistent profile.Nr   Trœ   r§   z)Failed to delete browser data directory: rS   r¦   r©   )r)   Ú_shutdown_unlockedrž   ry   rŸ   r­   r    r¡   r®   r   r’   rz   r¯   r…   rª   r,   )r0   rž   r³   r¤   r°   s        r   Úclear_sessionzBrowserManager.clear_session  s  è ø€ à—?—?“?Ø×)Ñ)Ó+×+Ð+ãðGÜ#×*Ñ*Ô,Ü 0× 8Ñ 8Ö :˜ØŸ;™;œ=Ø"ŸM™M¨$¸d˜MÕCà ŸK™K°4˜KÕ8ð	 !;ô ×"Ñ"¨4¸$Ð"Ô?Ü.Ð1AÑAˆOðDØ×*Ñ*¬3¬s´4·9±9³;Ó/?Ó+@ÔA÷% #—?‘?øØ+ùô ò GÜÐAÀ!ÀÐE×FÑFûðGûô ò DÜÐ>¸q¸cÐB×CÑCûðDúð' #ø—?—?‘?üs¢   ‚E"“C?”E"—E«D¬EµA#DÂ EÂ95D'Ã.E"Ã9EÃ:E"ÄEÄ	D$ÄDÄEÄD$Ä$EÄ'	EÄ0EÄ>EÅEÅEÅE"ÅEÅEÅEÅE"c              ƒ   óú   K  — | j                  «        | j                  |«      }| j                  j                  |«      }|�|j	                  «       s| j
                  €| j                  |¬«      ƒ d {  –—† S |S 7 Œ­w)N)r1   )rP   rA   r$   r4   r�   r"   rQ   )r0   r1   r   s      r   Úget_pagezBrowserManager.get_page'  si   è ø€ Ø×ÑÔØ×#Ñ# DÓ)ˆØ�{‰{�‰˜tÓ$ˆØˆ<˜4Ÿ>™>Ô+¨t¯|©|Ð/CØŸ™¨˜Ó.×.Ð.Øˆð /ús   ‚A0A;Á2A9Á3A;c              ƒ   ó¼   K  — | j                   4 ƒd {  –—†  | j                  «       ƒ d {  –—†  d d d «      ƒd {  –—†  y 7 Œ-7 Œ7 Œ	# 1 ƒd {  –—†7  sw Y   y xY w­wr   )r)   rµ   r5   s    r   ÚclosezBrowserManager.close/  s;   è ø€ Ø—?—?“?Ø×)Ñ)Ó+×+Ð+÷ #—?‘?øØ+øð #ø—?—?‘?üsQ   ‚A“A”A—A«A¬A°A»A¼AÁAÁAÁAÁAÁAÁAc              ƒ   ó²  K  — | j                   r#	 | j                   j                  «       ƒ d {  –—†  | j                  r#	 | j                  j	                  «       ƒ d {  –—†  d | _         d | _        t
        D �ci c]  }|d “Œ c}| _        t
        D �ci c]  }|d“Œ c}| _        d| _        y 7 Œ}# t        $ r Y Œ†w xY w7 Œ_# t        $ r Y Œhw xY wc c}w c c}w ­wrD   )	r"   rº   r   r!   Ústopr#   r$   r(   r*   r/   s     r   rµ   z!BrowserManager._shutdown_unlocked3  sÑ   è ø€ Ø�<Š<ðØ—l‘l×(Ñ(Ó*×*Ð*ð ×ÒðØ×&Ñ&×+Ñ+Ó-×-Ð-ð ˆŒØˆÔÝ.3Ó4©e d�t˜T‘z¨eÑ4ˆŒÝ38Ó9±5¨4˜4 ™;°5Ñ9ˆŒØˆ�ð +ùÜò Ùðúð .ùÜò Ùðüò 5ùÚ9ùs„   ‚C�B- ­B+®B- ²C¿B> ÁB<ÁB> Á!CÁ7
CÂCÂ
CÂCÂ+B- Â-	B9Â6CÂ8B9Â9CÂ<B> Â>	C
ÃCÃ	C
Ã
Cc                 ó6   — t        j                   «       | _        y r   )r,   r-   r5   s    r   rP   zBrowserManager.record_activityD  s   € Ü"&§)¡)£+ˆÕr6   c              ƒ   óø  K  — 	 	 t        j                  d«      ƒ d {  –—†  | j                  rq| j                  set	        j                  «       | j
                  z
  }|| j                  kD  r5t        d|d›d| j                  › d�«       | j                  «       ƒ d {  –—†  Œœ7 Œ‚7 Œ# t         j                  $ r Y y t        $ r6}t        d|› �«       t        j                  d«      ƒ d {  –—†7   Y d }~ŒSd }~ww xY w­w)Né   zBrowser idle timeout reached: z.1fzs > z8s. Automatically closing browser to release resources...zError in idle check loop: é   )r%   Úsleepr*   r:   r,   r-   r+   r’   rº   ÚCancelledErrorr   )r0   Úelapsedr¤   s      r   rM   zBrowserManager._idle_check_loopG  sÛ   è ø€ Øð'Ü—m‘m BÓ'×'Ð'Ø—?’?¨4¯<ª<Ü"Ÿi™i›k¨D×,CÑ,CÑC�GØ ×!2Ñ!2Ò2ÜØ<¸WÀS¸MÈØ#×0Ñ0Ð1ð 26ð6ôð
 #Ÿj™j›l×*Ð*ð à'øð +ùÜ×)Ñ)ò ÙÜò 'ÜÐ2°1°#Ð6Ô7Ü—m‘m AÓ&×&Ö&ûð'üsi   ‚C:…B$ �B žA<B$ ÂB"ÂB$ ÂC:Â B$ Â"B$ Â$C7Â7C:Â9C7Ã&C2Ã'C*Ã(C2Ã-C:Ã2C7Ã7C:r=   )r   N)r
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   Úpropertyr   r   r>   r:   Úsetterr…   rB   rE   r%   r&   rG   rA   rQ   rN   rO   r‚   r{   r¶   r¸   rº   rµ   rP   rM   rk   r6   r   r   r      sQ  „ ñò4ð ð*�d˜T‘kò *ó ð*ð ð-˜ò -ó ð-ð ‡^�^ð1˜Tð 1 dò 1ó ð1ð% #ð %¨Tð %°dó %ðF ð F¨ó Fð<˜cð < g§l¡ló <ð C¨$¡Jð °3ó ñ
 D¨4¡Kð ¸cð ÐRVó ðJ:¨D°4©Kð J:¸Dó J:ðX)¨Cð )°Dó )óV>ó."DóHDñ0 3ð °tó ó,ó ó".ô'r6   r   )r%   r|   r,   Úpathlibr   Úplaywright.async_apir   r   r   r   Ú__file__ÚresolverT   ry   r#   rª   r~   r   r   r†   r   r   Úbrowser_managerrk   r6   r   Ú<module>rÏ      s¸   ðÛ Û 	Û Ý ç SÓ Sá˜“>×)Ñ)Ó+×3Ñ3°AÑ6¸ÑGÐ ð 	2€ñ   	 §	¡	Ð*AÀ7Ó KÓLÐ Ù˜Y˜RŸY™YÐ'BÀGÓLÓMÐ á˜˜Ÿ™Ð#:¸DÓAÓBÐ ð 4ð ¨Dó ÷|'ñ |'ñ~	 !Ó"�r6   