Ë
    tPêjB  ã                   ó&  — U d Z ddlZddlmZ ddlmZmZ ddlmZmZm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ erddlmZ ddlmZ d)d„Z	 	 	 	 d*d„Zde ez  defd„Z!ddde"e   ddfd„Z#	 d+ddde$dz  de"e   fd„Z%ddde$dedz  fd„Z&	 	 d,ddde$de$dz  de$dz  de$dz  dedz  fd„Z'ddde"e$   de e$e(e$e$f   f   fd „Z)ddde$de"e   fd!„Z* G d"„ d#«      Z+da,e+dz  e-d$<   de+fd%„Z.ddd&e$de$de/fd'„Z0ddd&e$de$de/fd(„Z1y)-uÖ   
DB helpers for LiteLLM_ToolTable â€” the global tool registry.

Tools are auto-discovered from LLM responses and upserted here.
Admins use the management endpoints to read and update input_policy / output_policy.
é    N)ÚMapping)ÚdatetimeÚtimezone)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_proxy_logger)ÚToolDiscoveryQueueItem)Úcall_with_db_reconnect_retry)ÚObjectPermissionRepository)ÚTableActions)ÚToolRepository)ÚLiteLLM_ToolTableRowÚToolPolicyOverrideRow)Úmodels)ÚPrismaClientÚprisma_clientr   Úreturnc                 ó0   — t        | «      j                  }|S ©N)r   Útable©r   r   s     új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/db/tool_registry_writer.pyÚ_tool_table_actionsr      s   € ÜESÐTaÓEb×EhÑEh€EØ€Ló    c                 ó0   — t        | «      j                  }|S r   )r   r   r   s     r   Ú _object_permission_table_actionsr   #   s#   € ô RlØóRç�eð 
ð €Lr   Úrowc           
      ó"  — t        | dd«      }t        |«      r |«       } n+t        | t        «      sdD �ci c]  }|t        | |d«      “Œ } }t	        di d| j                  dd«      “d| j                  dd«      “d| j                  d«      “d| j                  d«      xs d	“d
| j                  d
«      xs d	“dt        | j                  d«      xs d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “d| j                  d«      “ŽS c c}w )z@Convert a Prisma model instance or dict to LiteLLM_ToolTableRow.Ú
model_dumpN)Útool_idÚ	tool_nameÚoriginÚinput_policyÚoutput_policyÚ
call_countÚassignmentsÚkey_hashÚteam_idÚ	key_aliasÚ
user_agentÚlast_used_atÚ
created_atÚ
updated_atÚ
created_byÚ
updated_byr!   Ú r"   r#   r$   Ú	untrustedr%   r&   r   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   © )ÚgetattrÚcallableÚ
isinstanceÚdictr   ÚgetÚint)r   r    Úks      r   Ú_row_to_modelr;   ,   s°  € ä  \°4Ó8€JÜ�
ÔÙ‹l‰Ü˜œTÔ"ðö
àð Œw�s˜A˜tÓ$Ñ$ð
ˆð 
ô*  ò Ø—‘˜	 2Ô&ðà—'‘'˜+ rÔ*ðð �w‰w�xÔ ðð —W‘W˜^Ó,Ò;°øð	ð
 —g‘g˜oÓ.Ò=°+øðô �s—w‘w˜|Ó,Ò1°Ô2ðð —G‘G˜MÔ*ðð —‘˜Ô$ðð —‘˜	Ô"ðð —'‘'˜+Ô&ðð —7‘7˜<Ô(ðð —W‘W˜^Ô,ðð —7‘7˜<Ô(ðð —7‘7˜<Ô(ðð —7‘7˜<Ô(ðð  —7‘7˜<Ô(ð!ð ùò+
s   µFÚitemsc              ƒ   ó  K  — |sy	 |D �cg c]  }|j                  d«      sŒ|‘Œ }}|syt        j                  t        j                  «      }t        | «      }|D ]Ñ  }|j                  dd«      }|j                  d«      xs d}|j                  d«      xs d}|j                  d«      }	|j                  d	«      }
|j                  d
«      }|j                  d«      }|j                  d|it        t        j                  «       «      ||ddd|||	|
|||dœddi||dœdœ¬«      ƒ d{  –—†  ŒÓ t        j                  dt        |«      «       yc c}w 7 Œ+# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)zÙ
    Batch-upsert tool registry rows via Prisma.

    On first insert: sets input_policy/output_policy = "untrusted" (default), call_count = 1.
    On conflict: increments call_count; preserves existing policies.
    Nr"   r1   r#   Úuser_definedr/   Úsystemr(   r)   r*   r+   r2   é   )r!   r"   r#   r$   r%   r&   r/   r0   r(   r)   r*   r+   r,   Ú	increment)r&   r.   r,   ©ÚcreateÚupdate©ÚwhereÚdataz)tool_registry_writer: upserted %d tool(s)z1tool_registry_writer batch_upsert_tools error: %s)r8   r   Únowr   Úutcr   ÚupsertÚstrÚuuidÚuuid4r	   ÚdebugÚlenÚ	ExceptionÚerror)r   r<   ÚitemrG   rH   r   r"   r#   r/   r(   r)   r*   r+   Úes                 r   Úbatch_upsert_toolsrT   [   s–  è ø€ ñ Øð)[Ø(-ÖG °·±¸+Õ1F’tÐGˆÐGÙØÜ—\‘\¤(§,¡,Ó/ˆÜ*¨=Ó9ˆØò  	ˆDØŸ™ ¨bÓ1ˆIØ—X‘X˜hÓ'Ò9¨>ˆFØŸ™ ,Ó/Ò;°8ˆJØ—x‘x 
Ó+ˆHØ—h‘h˜yÓ)ˆGØŸ™ Ó-ˆIØŸ™ ,Ó/ˆJØ—,‘,Ø" IÐ.ô $'¤t§z¡z£|Ó#4Ø%.Ø"(Ø(3Ø)4Ø&'Ø&0Ø&0Ø$,Ø#*Ø%.Ø&0Ø(+ñð  (3°AÐ&6Ø&)Ø(+ññ!ð ó ÷ ñ ð 	ôB 	×"Ñ"Ð#NÔPSÐTXÓPYÕZùòM Hðùô4 ò [Ü×"Ñ"Ð#VÐXY×ZÑZûð[üsZ   ‚F‡E ‹E¢E¦E ªF«C=E Ä(EÄ)%E ÅFÅE Å	E?ÅE:Å5FÅ:E?Å?Fr$   c              ƒ   ó  K  — 	 |�d|ini }t        | «      j                  |ddi¬«      ƒ d{  –—† }|D �cg c]  }t        |«      ‘Œ c}S 7 Œc c}w # t        $ r"}t	        j
                  d|«       g cY d}~S d}~ww xY w­w)z6Return all tools, optionally filtered by input_policy.Nr$   r-   Údesc)rF   Úorderz)tool_registry_writer list_tools error: %s)r   Ú	find_manyr;   rP   r	   rQ   )r   r$   rF   Úrowsr   rS   s         r   Ú
list_toolsrZ   “   s�   è ø€ ð
	ØLXÐLd¨>¸<Ñ*HÐjlˆÜ/°Ó>×HÑHØØ Ð(ð Ió 
÷ 
ˆð /3Ö3 s”˜cÕ"Ò3Ð3ð	
úò 4øÜò Ü×"Ñ"Ð#NÐPQÔRØ�	ûðüsU   ‚B „)A ­A®A ¶AÁA Á
B ÁA ÁA Á	A=ÁA8Á2A=Á3B Á8A=Á=B r"   c              ƒ   óÎ   K  — 	 t        | «      j                  d|i¬«      ƒ d{  –—† }|€yt        |«      S 7 Œ# t        $ r }t	        j
                  d|«       Y d}~yd}~ww xY w­w)z&Return a single tool row by tool_name.r"   ©rF   Nz'tool_registry_writer get_tool error: %s)r   Úfind_uniquer;   rP   r	   rQ   )r   r"   r   rS   s       r   Úget_toolr^   ¤   sr   è ø€ ð
	Ü.¨}Ó=×IÑIØ 	Ð*ð Jó 
÷ 
ˆð ˆ;ØÜ˜SÓ!Ð!ð
ùô ò Ü×"Ñ"Ð#LÈaÔPÜûðüs@   ‚A%„ 9 ¤7¥9 «A%¬
9 ¶A%·9 ¹	A"ÁAÁA%ÁA"Á"A%r0   r%   c           	   ƒ   óº  K  — 	 |xs d}t        j                  t        j                  «      }t	        t        j                  «       «      ||xs d|xs d||||dœ}||dœ}|�||d<   |�||d<   t        | «      j                  d|i||d	œ¬
«      ƒ d{  –—†  t        | |«      ƒ d{  –—† S 7 Œ7 Œ# t        $ r }	t        j                  d|	«       Y d}	~	yd}	~	ww xY w­w)z^Update input_policy and/or output_policy for a tool. Upserts the row if it does not exist yet.r?   r2   )r!   r"   r$   r%   r/   r0   r-   r.   )r0   r.   Nr$   r%   r"   rB   rE   z1tool_registry_writer update_tool_policy error: %s)r   rH   r   rI   rK   rL   rM   r   rJ   r^   rP   r	   rQ   )
r   r"   r0   r$   r%   Ú_updated_byrH   Úcreate_dataÚupdate_datarS   s
             r   Úupdate_tool_policyrc   µ   s  è ø€ ð!Ø'Ò3¨8ˆÜ—\‘\¤(§,¡,Ó/ˆô œ4Ÿ:™:›<Ó(Ø"Ø(Ò7¨KØ*Ò9¨kØ%Ø%ØØñ	1
ˆð &Øñ1
ˆð Ð#Ø*6ˆK˜Ñ'ØÐ$Ø+8ˆK˜Ñ(ä! -Ó0×7Ñ7Ø 	Ð*à%Ø%ñð 8ó 
÷ 	
ð 	
ô ˜m¨YÓ7×7Ð7ð	
øð 8ùÜò Ü×"Ñ"Ð#VÐXYÔZÜûðüsS   ‚C„BB/ ÂB+ÂB/ Â&B-Â'B/ Â*CÂ+B/ Â-B/ Â/	CÂ8CÃCÃCÃCÚ
tool_namesc           
   ƒ   óB  K  — |si S 	 t        | «      j                  dd|ii¬«      ƒ d{  –—† }|D �ci c]/  }|j                  t        |dd«      xs dt        |dd«      xs df“Œ1 c}S 7 Œ?c c}w # t        $ r"}t        j                  d|«       i cY d}~S d}~ww xY w­w)	z[
    Return a {tool_name: (input_policy, output_policy)} map for the given tool names.
    r"   Úinr\   Nr$   r2   r%   z1tool_registry_writer get_tools_by_names error: %s)r   rX   r"   r4   rP   r	   rQ   )r   rd   rY   r   rS   s        r   Úget_tools_by_namesrg   á   sÃ   è ø€ ñ Øˆ	ðÜ/°Ó>×HÑHØ  zÐ 2Ð3ð Ió 
÷ 
ˆð ö
ð
 ð	 �M‰MÜ˜˜^¨[Ó9ÒH¸[Ü˜˜_¨kÓ:ÒI¸kðñ ò
ð 	
ð
úò
øô ò Ü×"Ñ"Ð#VÐXYÔZØ�	ûðüsU   ‚Bˆ"A1 ªA*«A1 ³4A,Á'A1 Á)BÁ*A1 Á,A1 Á1	BÁ:BÂBÂBÂBÂBc              ƒ   ó:  K  — g }	 t        | «      j                  dd|iidddœ¬«      ƒ d{  –—† }|D ]³  }t        |dd«      xs d}t        |d	g «      xs g }t        |d
g «      xs g }|D ]:  }|j                  t	        ||dt        |dd«      dt        |dd«      dd¬«      «       Œ< |D ]:  }	|j                  t	        ||t        |	dd«      ddt        |	dd«      dd¬«      «       Œ< Œµ |S 7 Œ¾# t
        $ r"}
t        j                  d|
«       g cY d}
~
S d}
~
ww xY w­w)z´
    Return override-like rows for a tool by finding object permissions that have
    this tool in blocked_tools, then resolving each permission to key/team scope for display.
    Úblocked_toolsÚhasT)Úverification_tokensÚteams)rF   ÚincludeNÚobject_permission_idr1   rk   rl   ÚtokenÚblockedr*   )Úoverride_idr"   r)   r(   r$   r*   r-   r.   r)   Ú
team_aliasz6tool_registry_writer list_overrides_for_tool error: %s)r   rX   r4   Úappendr   rP   r	   rQ   )r   r"   ÚoutÚpermsÚpermÚop_idÚtokensrl   ÚtÚteamrS   s              r   Úlist_overrides_for_toolr{   ú   sh  è ø€ ð /1€Cð)Ü=¸mÓL×VÑVØ" U¨IÐ$6Ð7à'+Øñð Wó 
÷ 
ˆð ò 	ˆDÜ˜DÐ"8¸$Ó?ÒEÀ2ˆEÜ˜TÐ#8¸"Ó=ÒCÀˆFÜ˜D '¨2Ó.Ò4°"ˆEØò �Ø—
‘
Ü)Ø$)Ø"+Ø $Ü!(¨¨G°TÓ!:Ø%.Ü")¨!¨[¸$Ó"?Ø#'Ø#'ô	õðð ò �Ø—
‘
Ü)Ø$)Ø"+Ü '¨¨i¸Ó >Ø!%Ø%.Ü")¨$°¸dÓ"CØ#'Ø#'ô	õñð#	ð< ˆ
ðK
ùôL ò Ü×"Ñ"Ð#[Ð]^Ô_Ø�	ûðüsE   ‚D†&C- ¬C+­B=C- Ã*DÃ+C- Ã-	DÃ6DÄDÄDÄDÄDc                   ó†   — e Zd ZdZdd„Zdefd„Zdd„Zdedefd„Z	dedefd	„Z
	 	 dd
ee   dedz  dedz  deeef   fd„Zy)ÚToolPolicyRegistryu€   
    In-memory registry of tool policies synced from DB.
    Hot path uses get_effective_policies only â€” no DB, no cache.
    r   Nc                 ó<   — i | _         i | _        i | _        d| _        y )NF)Ú_tool_input_policiesÚ_tool_output_policiesÚ_blocked_tools_by_op_idÚ_initialized©Úselfs    r   Ú__init__zToolPolicyRegistry.__init__5  s"   € Ø46ˆÔ!Ø57ˆÔ"Ø=?ˆÔ$Ø"'ˆÕr   c                 ó   — | j                   S r   )r‚   rƒ   s    r   Úis_initializedz!ToolPolicyRegistry.is_initialized;  s   € Ø× Ñ Ð r   c           	   ƒ   ó´  ‡K  — 	 t        ‰ˆfd„d¬«      ƒ d{  –—† }|D �ci c]  }|j                  t        |dd«      xs d“Œ  c}| _        |D �ci c]  }|j                  t        |dd«      xs d“Œ  c}| _        t        ‰ˆfd„d	¬«      ƒ d{  –—† }i | _        |D ];  }t        |d
d«      }t        |dd«      xs g }|sŒ$t        |«      | j
                  |<   Œ= d| _        t        j                  dt        | j                  «      t        | j
                  «      «       y7 �Œc c}w c c}w 7 Œ�# t        $ r}t        j                  d|«       ‚ d}~ww xY w­w)zCLoad all tool policies and object-permission blocked_tools from DB.c                  ó6   •— t        ‰ «      j                  «       S r   )r   rX   ©r   s   €r   ú<lambda>z=ToolPolicyRegistry.sync_tool_policy_from_db.<locals>.<lambda>C  s   ø€ Ô+¨MÓ:×DÑDÓF€ r   Ú-sync_tool_policy_from_db_tools_lookup_failure)ÚreasonNr$   r2   r%   c                  ó6   •— t        ‰ «      j                  «       S r   )r   rX   rŠ   s   €r   r‹   z=ToolPolicyRegistry.sync_tool_policy_from_db.<locals>.<lambda>O  s   ø€ Ô8¸ÓG×QÑQÓS€ r   Ú-sync_tool_policy_from_db_perms_lookup_failurern   ri   TzMToolPolicyRegistry: synced %d tool policies and %d object permissions from DBz5ToolPolicyRegistry sync_tool_policy_from_db error: %s)r   r"   r4   r   r€   r�   Úlistr‚   r	   ÚinforO   rP   Ú	exception)r„   r   Útoolsr   ru   rw   rp   rS   s    `      r   Úsync_tool_policy_from_dbz+ToolPolicyRegistry.sync_tool_policy_from_db>  si  øè ø€ ð!	Ü!=ØÛFØFô"÷ ˆEð diö)Ø\_�—‘œw s¨N¸KÓHÒWÈKÑWò)ˆDÔ%ð ejö*Ø]`�—‘œw s¨O¸[ÓIÒXÈ[ÑXò*ˆDÔ&ô ">ØÛSØFô"÷ ˆEð
 ,.ˆDÔ(Øò H�Ü Ð%;¸TÓB�Ü! # ¸Ó=ÒCÀ�ÚÜ:>¸w»-�D×0Ñ0°Ò7ð	Hð !%ˆDÔÜ ×%Ñ%Ø_Ü�D×-Ñ-Ó.Ü�D×0Ñ0Ó1õð3ûò
)ùò*ðùô$ ò 	Ü ×*Ñ*Ð+bÐdeÔfØûð	üsh   ƒE…D0 ™D!šD0 ¢#D$ÁD0 Á#D)Á4D0 ÂD.Â0D0 ÃAD0 Ä EÄ!D0 Ä$D0 Ä0	EÄ9EÅEÅEr"   c                 ó:   — | j                   j                  |d«      S ©Nr2   )r   r8   ©r„   r"   s     r   Úget_input_policyz#ToolPolicyRegistry.get_input_policyc  s   € Ø×(Ñ(×,Ñ,¨Y¸ÓDÐDr   c                 ó:   — | j                   j                  |d«      S r–   )r€   r8   r—   s     r   Úget_output_policyz$ToolPolicyRegistry.get_output_policyf  s   € Ø×)Ñ)×-Ñ-¨i¸ÓEÐEr   rd   rn   Úteam_object_permission_idc                 ó2  — |si S t        «       }||fD ]O  }|sŒ|j                  «       sŒ|j                  | j                  j	                  |j                  «       g «      «       ŒQ i }|D ]+  }||v rd||<   Œ| j
                  j	                  |d«      ||<   Œ- |S )zµ
        Return effective input_policy per tool from in-memory state.
        If tool is in key or team blocked_tools -> "blocked", else global input_policy or "untrusted".
        rp   r2   )ÚsetÚstriprD   r�   r8   r   )r„   rd   rn   r›   rp   rw   ÚresultÚnames           r   Úget_effective_policiesz)ToolPolicyRegistry.get_effective_policiesi  s¥   € ñ ØˆIÜ#&£5ˆØ*Ð,EÐFò 	TˆEÚ˜Ÿ™�Ø—‘˜t×;Ñ;×?Ñ?ÀÇÁÃÈrÓRÕSð	Tð )+ˆØò 	PˆDØ�w‰Ø(��t’à#×8Ñ8×<Ñ<¸TÀ;ÓO��t’ð		Pð
 ˆr   )r   N)r   r   r   N©NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r…   Úboolr‡   r”   rK   r˜   rš   r�   r7   r¡   r3   r   r   r}   r}   /  s‘   „ ñó
(ð! ó !ó#ðJE¨#ð E°#ó EðF¨3ð F°3ó Fð ,0Ø04ñ	à˜‘Iðð " D™jðð $'¨¡:ð	ð
 
ˆc�3ˆh‰ôr   r}   Ú_tool_policy_registryc                  ó.   — t         €
t        «       a t         S )z/Return the global ToolPolicyRegistry singleton.)r¨   r}   r3   r   r   Úget_tool_policy_registryrª   …  s   € ô Ð$Ü 2Ó 4ÐÜ Ð r   rn   c              ƒ   óx  K  — |r|sy	 t        | «      j                  d|i¬«      ƒ d{  –—† }|€yt        t        |dg «      xs g «      }||v ry|j	                  |«       t        | «      j                  d|id|i¬«      ƒ d{  –—†  y7 Œ`7 Œ# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)	zGAdd tool_name to the permission's blocked_tools if not already present.Frn   r\   Nri   TrE   zDtool_registry_writer add_tool_to_object_permission_blocked error: %s)	r   r]   r�   r4   rs   rD   rP   r	   rQ   )r   rn   r"   r   ÚcurrentrS   s         r   Ú%add_tool_to_object_permission_blockedr­   �  sá   è ø€ ñ  ¡yØðÜ;¸MÓJ×VÑVØ)Ð+?Ð@ð Wó 
÷ 
ˆð ˆ;ØÜœg c¨?¸BÓ?ÒEÀ2ÓFˆØ˜ÑØØ�‰�yÔ!Ü.¨}Ó=×DÑDØ)Ð+?Ð@Ø! 7Ð+ð Eó 
÷ 	
ð 	
ð ð
øð	
ùô
 ò Ü×"Ñ"Ð#iÐklÔmÜûðüsf   ‚B:‰ B ©B
ªB °B:±B ÁB:Á4B ÂBÂB Â	B:Â
B ÂB Â	B7ÂB2Â-B:Â2B7Â7B:c              ƒ   óŠ  K  — |r|sy	 t        | «      j                  d|i¬«      ƒ d{  –—† }|€yt        t        |dg «      xs g «      }||vry|D �cg c]
  }||k7  sŒ	|‘Œ }}t        | «      j	                  d|id|i¬«      ƒ d{  –—†  y7 Œdc c}w 7 Œ# t
        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)	z\Remove tool_name from the permission's blocked_tools. Returns False if tool was not in list.Frn   r\   Nri   rE   TzItool_registry_writer remove_tool_from_object_permission_blocked error: %s)r   r]   r�   r4   rD   rP   r	   rQ   )r   rn   r"   r   r¬   ry   rS   s          r   Ú*remove_tool_from_object_permission_blockedr¯   ©  sö   è ø€ ñ  ¡yØðÜ;¸MÓJ×VÑVØ)Ð+?Ð@ð Wó 
÷ 
ˆð ˆ;ØÜ”w˜s O°RÓ8Ò>¸BÓ?ˆØ˜GÑ#ØØ%Ö8˜¨¨i«’1Ð8ˆÐ8Ü.¨}Ó=×DÑDØ)Ð+?Ð@Ø! 7Ð+ð Eó 
÷ 	
ð 	
ð ð
úò 9ð	
ùô
 ò Ü×"Ñ"ØWØô	
ô ûðüsx   ‚C‰ B ©BªB °C±B ÁCÁB Á
BÁBÁ#%B ÂBÂ	B ÂCÂB ÂB Â	C Â B;Â6CÂ;C Ã C)r   r   r   z0TableActions[prisma_db_models.LiteLLM_ToolTable])r   r   r   z<TableActions[prisma_db_models.LiteLLM_ObjectPermissionTable]r   r¢   )2r¦   rL   Úcollections.abcr   r   r   Útypingr   r   r   Úlitellm._loggingr	   Úlitellm.proxy._typesr
   Ú"litellm.proxy.db.exception_handlerr   Ú1litellm.repositories.object_permission_repositoryr   Ú%litellm.repositories.prisma_protocolsr   Ú'litellm.repositories.table_repositoriesr   Úlitellm.types.tool_managementr   r   Úprismar   Úprisma_db_modelsÚlitellm.proxy.utilsr   r   r   r7   r;   r�   rT   rK   rZ   r^   rc   Útuplerg   r{   r}   r¨   Ú__annotations__rª   r§   r­   r¯   r3   r   r   ú<module>r¾      s  ðòó Ý #ß 'ß ,Ñ ,å 1Ý 7Ý KÝ XÝ >Ý B÷ñ
 Ý1å0óð
Ø!ðàCóð,�t˜c‘zð ,Ð&:ó ,ð^5[Ø!ð5[àÐ&Ñ'ð5[ð 
ó5[ðt  $ñØ!ðà˜‘*ðð 
Ð
Ñóð"Ø!ðàðð ˜DÑ óð*  $Ø $ñ)Ø!ð)àð)ð �d‘
ð)ð ˜‘*ð	)ð
 ˜‘:ð)ð ˜DÑ ó)ðXØ!ðà�S‘	ðð 
ˆ#ˆu�S˜#�X‰Ð
Ñóð22Ø!ð2àð2ð 
Ð
Ñ ó2÷jPñ Pðf 48Ð Ð)¨DÑ0Ó 7ð!Ð"4ó !ðØ!ðàðð ðð 
ó	ð8Ø!ðàðð ðð 
ô	r   