Ë
    tPêj3U  ã                   ó`  — 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
mZ ddlmZ ddlmZ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mZmZmZm Z  erddl!m"Z# ddl$m%Z%  e«       Z&ee'd<   ddded   fd„Z(de)de*fd„Z+dede,fd„Z-dedee*e)f   dz  fd„Z.dddefd„Z/dAd„Z0de*de1de*de
fd „Z2dddddeddfd!„Z3ddded"e*de,fd#„Z4de1de,fd$„Z5ded%e*dz  d&e*dz  de6e*dz  e*dz  f   fd'„Z7e&jq                  d(d)g e	e«      ge¬*«       e	e«      fd+edefd,„«       Z9e&ju                  d(d)g e	e«      ge¬*«       edd-¬.«       edd/¬.«       ed0d0¬1«       ed2d0d3¬4«       e	e«      fd5e*dz  d6e*dz  d7e;d8e;def
d9„«       Z<ddd5e*deddfd:„Z=ddd5e*dedd;fd<„Z>e&ju                  d=d)g e	e«      ge¬*«       e	e«      fd5e*defd>„«       Z?e&j�                  d=d)g e	e«      ge¬*«       e	e«      fd5e*d+e defd?„«       ZAe&j…                  d=d)g e	e«      ge¬*«       e	e«      fd5e*defd@„«       ZCy)Ba  
MEMORY MANAGEMENT

CRUD endpoints for user/team-scoped memory entries.

POST   /v1/memory               - Create a memory entry
GET    /v1/memory               - List memory entries visible to the caller
GET    /v1/memory/{key}         - Get a single memory entry by key
PUT    /v1/memory/{key}         - Upsert (create or update) a memory entry by key
DELETE /v1/memory/{key}         - Delete a memory entry by key

Scoping:
- Rows carry both `user_id` and `team_id` (each optional).
- Visibility: PROXY_ADMIN sees all rows. Non-admin callers see rows whose
  `user_id` matches their own OR whose `team_id` matches their own.
- On create, `user_id`/`team_id` default to the caller's identity unless
  the caller is a PROXY_ADMIN who explicitly supplies a different scope.
é    N)ÚMapping)ÚTYPE_CHECKINGÚFinal)Ú	APIRouterÚDependsÚHTTPExceptionÚQuery)Úverbose_proxy_logger)ÚCommonProxyErrorsÚLitellmUserRolesÚUserAPIKeyAuthÚuser_api_key_has_admin_view)Úuser_api_key_auth)ÚTableActions)ÚMemoryRepository)ÚTeamRepository)ÚLiteLLM_MemoryRowÚMemoryCreateRequestÚMemoryDeleteResponseÚMemoryListResponseÚMemoryUpdateRequest)Úmodels)ÚPrismaClientÚrouterÚprisma_clientr   Úreturnz!prisma_models.LiteLLM_MemoryTablec                 ó,   — t        | «      j                  S ©N)r   Útable©r   s    új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/memory/memory_endpoints.pyÚ_memory_tabler"   5   s   € Ü˜MÓ*×0Ñ0Ð0ó    Úmetadatac                 ó,   — t        j                  | «      S )u  
    Encode a `metadata` payload for the `Json?` column.

    `metadata` is typed `Optional[Any]`, so callers may send dicts, lists,
    or JSON scalars (including plain Python strings like `"hello"`).
    prisma-client-python rejects raw Python values on `Json?` columns
    (`MissingRequiredValueError` / `DataError`), and Postgres `jsonb`
    rejects bare-word strings as invalid JSON â€” so always `json.dumps`,
    regardless of input type. Roundtrip on read deserializes back to the
    original Python value.
    )ÚjsonÚdumps)r$   s    r!   Ú_serialize_metadata_for_prismar(   9   s   € ô �:‰:�hÓÐr#   Úuser_api_key_dictc                 ó<   — | j                   t        j                  k(  S r   )Ú	user_roler   ÚPROXY_ADMIN)r)   s    r!   Ú	_is_adminr-   H   s   € Ø×&Ñ&Ô*:×*FÑ*FÑFÐFr#   c                 óž   — t        | «      ryd| j                  fd| j                  ffD ��cg c]  \  }}|r||i‘Œ }}}|sddiS d|iS c c}}w )z}
    Prisma `where` fragment restricting rows to those the caller can see.
    Returns None for admins (no restriction).
    NÚuser_idÚteam_idÚ	memory_idÚ__no_match__ÚOR)r   r/   r0   )r)   ÚfieldÚvalueÚorss       r!   Ú_visibility_filterr7   L   sv   € ô
 #Ð#4Ô5Øð (Ð):×)BÑ)BÐCÀiÐQb×QjÑQjÐEkÐl÷áˆE�5Ùð 
�Šð€Cñ ñ
 à˜^Ð,Ð,Ø�#ˆ;Ðùós   ¬A	Úrowc                 óö   — t        | j                  | j                  | j                  t	        | dd «      | j
                  | j                  | j                  | j                  | j                  | j                  ¬«
      S )Nr$   )
r1   Úkeyr5   r$   r/   r0   Ú
created_atÚ
created_byÚ
updated_atÚ
updated_by)r   r1   r:   r5   Úgetattrr/   r0   r;   r<   r=   r>   )r8   s    r!   Ú_row_to_modelr@   ^   sZ   € ÜØ—-‘-Ø�G‰GØ�i‰iÜ˜˜j¨$Ó/Ø—‘Ø—‘Ø—>‘>Ø—>‘>Ø—>‘>Ø—>‘>ôð r#   c                  ó`   — ddl m}  | €%t        dt        j                  j
                  ¬«      ‚| S )Nr   r    éô  ©Ústatus_codeÚdetail)Úlitellm.proxy.proxy_serverr   r   r   Údb_not_connected_errorr5   r    s    r!   Ú_require_prismarH   m   s+   € Ý8àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcØÐr#   Úlog_messageÚexcÚdefault_detailc                 óH   — t        j                  | |«       t        d|¬«      S )zè
    Build a 500 HTTPException with a generic, caller-safe `detail` while
    logging the actual exception server-side. Avoids leaking internal Prisma /
    DB details (table names, columns, connection metadata) to API callers.
    rB   rC   )r
   Ú	exceptionr   )rI   rJ   rK   s      r!   Ú_internal_errorrN   u   s!   € ô ×"Ñ" ;°Ô4Ü S°Ô@Ð@r#   c              ƒ   óÌ   K  — t        |«      ryt        |dd«      }t        |dd«      }|r||j                  k(  ry|€|�t        | ||«      ƒ d{  –—† ryt	        dd¬«      ‚7 Œ­w)uñ  
    Enforce ownership for mutations (PUT/DELETE).

    The visibility filter uses an OR (`user_id == caller OR team_id == caller`)
    so team members can READ each other's team-scoped rows. That's intentional
    for list/get. For writes, broader visibility != broader authority â€” without
    this check, any team member could overwrite or delete a teammate's
    personal row whenever both `user_id` and `team_id` are stamped on it.

    Rules (mirroring how key/team management endpoints gate team-scoped writes):
    - PROXY_ADMIN: always allowed.
    - Personal ownership (`row.user_id == caller.user_id`): allowed.
    - Pure team row (`row.user_id is None`, `row.team_id` set):
      caller must be a team admin of `row.team_id` (members_with_roles entry
      with `role == "admin"`), or an org admin for that team's organization.
      Plain team members can only READ team rows, not modify them â€” same
      pattern as `_validate_team_member_add_permissions` etc.
    - Anything else: 403.
    Nr/   r0   é“  z7You do not have permission to modify this memory entry.rC   )r-   r?   r/   Ú_is_team_admin_forr   )r   r8   r)   Úrow_user_idÚrow_team_ids        r!   Ú_assert_write_accessrT      s‚   è ø€ ô, Ð"Ô#ØÜ   i°Ó6€KÜ   i°Ó6€Kñ �{Ð&7×&?Ñ&?Ò?Øð Ð˜{Ð6Ü# MÐ3DÀkÓR×RÐRØä
ØØHôð ð Sús   ‚AA$ÁA"ÁA$r0   c              ƒ   óh  K  — ddl m}m} 	 t        | «      j	                  |d¬«      ƒ d{  –—† }|€y |||¬«      ry		  |||¬«      ƒ d{  –—† ry		 y7 Œ(# t
        $ r!}t        j                  d||«       Y d}~yd}~ww xY w7 Œ6# t
        $ r!}t        j                  d
||«       Y d}~yd}~ww xY w­w)aQ  
    True if the caller is a team admin of `team_id`, or an org admin for the
    team's organization. Mirrors the auth pattern used by team-management
    endpoints (`_is_user_team_admin` + `_is_user_org_admin_for_team`).

    Imported lazily to avoid a circular import with proxy_server during the
    memory router's module load.
    r   )Ú_is_user_org_admin_for_teamÚ_is_user_team_adminr0   )Úid_fieldNz8Error loading team for write-auth check (team_id=%s): %sF)r)   Úteam_objTz:Org-admin check skipped during write-auth (team_id=%s): %s)	Ú/litellm.proxy.management_endpoints.common_utilsrV   rW   r   Ú
find_by_idÚ	Exceptionr
   rM   Údebug)r   r)   r0   rV   rW   rY   Úes          r!   rQ   rQ   ©   sÍ   è ø€ ÷ð
Ü .¨}Ó =× HÑ HÈÐ[dÐ HÓ e×eˆð ÐØáÐ->ÈÕRØðmÙ,Ð?PÐ[cÔd×dÐdØð eð ð' fùÜò Ü×&Ñ&Ð'aÐcjÐlmÔnÜûðúð eùäò mÜ×"Ñ"Ð#_ÐahÐjk×lÐlØûðmüs~   ‚	B2ŒA «A¬A °B2¿B ÁBÁB ÁB2ÁB2ÁA Á	B ÁA;Á6B2Á;B Â B2ÂB Â	B/ÂB*Â%B2Â*B/Â/B2c                 ój   — t        | dd«      }|dk(  ryt        | «      }d|v xs d|v xs
 d|v xs d|v S )a  
    Detect a Prisma unique-constraint violation.

    Prefer the typed error code `P2002` from `PrismaClientKnownRequestError`;
    fall back to string matching so we stay robust across Prisma versions
    where the typed class may be unavailable or differently named.
    ÚcodeNÚP2002TÚUniqueÚuniqueÚUniqueViolation)r?   Ústr)rJ   r`   Úmsgs      r!   Ú_is_unique_violationrg   Î   sM   € ô ˜#˜v tÓ,€DØˆw‚ØÜ�S“€CØ�cˆ>Ò[˜X¨˜_Ò[°¸C°Ò[ÐCTÐX[ÐC[Ð[r#   Úrequested_user_idÚrequested_team_idc                 ó2  — t        | «      r$|�|n| j                  }|�|n| j                  }||fS |�|| j                  k7  rt        dd¬«      ‚|�|| j                  k7  rt        dd¬«      ‚| j                  }| j                  }|s|st        dd¬«      ‚||fS )a  
    Resolve the (user_id, team_id) to stamp on a new row.

    - PROXY_ADMIN: may override either dimension via the request body.
    - Everyone else: the requested values must match their own (or be omitted).

    Also rejects identity-less creation: a row with both user_id and team_id
    NULL is invisible to every non-admin caller (the visibility filter would
    never match it), so we refuse to create orphan rows unless the caller is
    a PROXY_ADMIN who is explicitly stamping a global/shared row.
    rP   z6Only proxy admins may set user_id to a different user.rC   z6Only proxy admins may set team_id to a different team.é�  z‹Cannot create a memory entry without a user_id or team_id. Authenticate with a key that has a user_id or team_id, or call as a proxy admin.)r-   r/   r0   r   )r)   rh   ri   r/   r0   s        r!   Ú_resolve_scoperl   Ý   sÓ   € ô  Ð"Ô#Ø'8Ð'DÑ#ÐJ[×JcÑJcˆØ'8Ð'DÑ#ÐJ[×JcÑJcˆØ˜ÐÐàÐ$Ð):Ð>O×>WÑ>WÒ)WÜØØKô
ð 	
ð Ð$Ð):Ð>O×>WÑ>WÒ)WÜØØKô
ð 	
ð  ×'Ñ'€GØ×'Ñ'€GÙ™7ô Øð$ô
ð 	
ð �GÐÐr#   z
/v1/memoryzmemory management)ÚtagsÚdependenciesÚresponse_modelÚbodyc              ƒ   óú  K  — t        «       }t        || j                  | j                  «      \  }}| j                  | j
                  |||j                  |j                  dœ}| j                  �t        | j                  «      |d<   	 t        |«      j                  |¬«      ƒ d{  –—† }t        |«      S 7 Œ# t        $ r8}t        |«      rt        dd| j                  › d�¬«      ‚t        d	|d
«      ‚d}~ww xY w­w)zECreate a new memory entry for the caller (or, for admins, any scope).©r:   r5   r/   r0   r<   r>   Nr$   ©Údataé™  úMemory with key 'ú' already exists.rC   zError creating memory: %sz%Internal error creating memory entry.)rH   rl   r/   r0   r:   r5   r$   r(   r"   Úcreater\   rg   r   rN   r@   )rp   r)   r   r/   r0   Úcreate_datar8   r^   s           r!   Úcreate_memoryrz     sý   è ø€ ô +Ó,€MÜ%Ð&7¸¿¹ÀtÇ|Á|ÓTÑ€GˆWð �x‰xØ—‘ØØØ'×/Ñ/Ø'×/Ñ/ñ-€Kð ‡}�}Ð Ü"@ÀÇÁÓ"Oˆ�JÑð
Ü(¨Ó7×>Ñ>ÀKÐ>ÓP×Pˆô ˜ÓÐð QùÜò 
ä Ô"ÜØØ*¨4¯8©8¨*Ð4EÐFôð ô Ø'ØØ3ó
ð 	
ûð
üs<   ‚BC;ÂB7 Â%B5Â&B7 Â*C;Â5B7 Â7	C8Ã 3C3Ã3C8Ã8C;zFilter by exact key match.)ÚdescriptionzzFilter by key prefix (Redis-style namespace scan). Mutually exclusive with `key`; if both are provided, `key_prefix` wins.é   )Úgeé2   rB   )r}   Úler:   Ú
key_prefixÚpageÚ	page_sizec              ƒ   ó´  K  — t        «       }i }|�d|i|d<   n| �| |d<   t        |«      }|€|}n|s|}nd||gi}	 t        |«      j                  |¬«      ƒ d{  –—† }	t        |«      j	                  |ddi|dz
  |z  |¬	«      ƒ d{  –—† }
t        |
D �cg c]  }t        |«      ‘Œ c}|	¬«      S 7 ŒV7 Œ*# t
        $ r}t        d
|d«      ‚d}~ww xY wc c}w ­w)z*List memory entries visible to the caller.NÚ
startsWithr:   ÚAND©Úwherer=   Údescr|   )r‡   ÚorderÚskipÚtakezError listing memory: %sz&Internal error listing memory entries.)ÚmemoriesÚtotal)	rH   r7   r"   ÚcountÚ	find_manyr\   rN   r   r@   )r:   r€   r�   r‚   r)   r   Ú
key_filterÚvisr‡   r�   Úrowsr^   Úrs                r!   Úlist_memoryr”   :  s  è ø€ ô( +Ó,€Mð ,.€JØÐØ)¨:Ð6ˆ
�5ÒØ	ˆØˆ
�5Ñä#Ð$5Ó6€Cà
€{Ø‰ÙØ‰à˜ SÐ)Ð*ˆð	gÜ*¨=Ó9×?Ñ?ÀeÐ?ÓL×LˆÜ)¨-Ó8×BÑBØØ Ð(Ø˜‘(˜iÑ'Øð	 Có 
÷ 
ˆô À$Ö'G¸Q¬°aÕ(8Ò'GÈuÔUÐUð Møð
ùô ò gÜÐ8¸!Ð=eÓfÐfûðgüò (HùsX   ‚9C¼B5 ÁB1Á-B5 ÂB3Â	B5 Â	CÂCÂ(	CÂ1B5 Â3B5 Â5	CÂ>CÃCÃCc              ƒ   ó¾   K  — d|i}t        |«      }|€|nd||gi}t        | «      j                  |dddi¬«      ƒ d{  –—† }|st        dd	|› d
�¬«      ‚|d   S 7 Œ­w)z?Look up a memory row by key, scoped to the caller's visibility.r:   Nr…   r|   r=   rˆ   )r‡   r‹   r‰   é”  rv   ú' not foundrC   r   )r7   r"   r�   r   )r   r:   r)   r�   r‘   r‡   r’   s          r!   Ú_find_memory_for_callerr˜   r  s‚   è ø€ ð 05°c¨l€JÜ#Ð$5Ó6€CØ7:°{©ÈÐQ[Ð]`ÐPaÐHb€EÜ˜}Ó-×7Ñ7¸eÈ!ÐT`ÐbhÐSiÐ7Ój×j€DÙÜ¨Ð6GÈÀuÈKÐ4XÔYÐYØ�‰7€Nð kús   ‚<A¾A¿Az(prisma_models.LiteLLM_MemoryTable | Nonec              ƒ   ó†   K  — 	 t        | ||«      ƒ d{  –—† S 7 Œ# t        $ r}|j                  dk(  rY d}~y‚ d}~ww xY w­w)zJThe caller-visible row for `key`, or None when nothing is visible to them.Nr–   )r˜   r   rD   )r   r:   r)   r^   s       r!   Ú_find_visible_memory_or_nonerš     sB   è ø€ ðÜ,¨]¸CÐARÓS×SÐSÐSùÜò Ø�=‰=˜CÒÜØûðüs4   ‚A„ ”• ˜A™ ›	>¤9³A¸9¹>¾Az/v1/memory/{key:path}c              ƒ   ób   K  — t        «       }t        || |«      ƒ d{  –—† }t        |«      S 7 Œ­w)z7Get a single memory entry by key, scoped to the caller.N)rH   r˜   r@   )r:   r)   r   r8   s       r!   Ú
get_memoryrœ   ‹  s3   è ø€ ô +Ó,€MÜ.¨}¸cÐCTÓU×U€CÜ˜ÓÐð Vús   ‚/�-ž/c              ƒ   ó¾  K  — t        «       }|j                  }d|v }i }|j                  �|j                  |d<   |rt        |j                  «      |d<   |st        dd¬«      ‚|j                  |d<   	 t        || |«      ƒ d{  –—† }|�Ft        |||«      ƒ d{  –—†  t        |«      j                  d|j                  i|¬	«      ƒ d{  –—† }n¬|j                  €t        dd
¬«      ‚t        ||j                  |j                  «      \  }	}
| |j                  |	|
|j                  |j                  dœ}|j                  �t        |j                  «      |d<   	 t        |«      j                  |¬«      ƒ d{  –—† }|€t        dd| › d�¬«      ‚t%        |«      S 7 �Œ7 �Œ7 ŒÕ7 Œ*# t        $ r†}t!        |«      s‚ t        || |«      ƒ d{  –—†7  }|€t        dd| › d�¬«      ‚t        |||«      ƒ d{  –—†7   t        |«      j                  d|j                  i|¬	«      ƒ d{  –—†7  }Y d}~Œ²d}~ww xY w# t
        $ r ‚ t        $ r}t#        d|d«      ‚d}~ww xY w­w)zÖ
    Upsert a memory entry by key within the caller's scope.

    If no row exists for (key, caller.user_id, caller.team_id), create one.
    If one exists, update the value/metadata fields that were provided.
    r$   Nr5   rk   z;Request body must include at least one of: value, metadata.rC   r>   r1   )r‡   rt   z5Cannot create a new memory via PUT without a 'value'.rr   rs   ru   rv   rw   zError upserting memory: %sz%Internal error updating memory entry.r–   r—   )rH   Úmodel_fields_setr5   r(   r$   r   r/   rš   rT   r"   Úupdater1   rl   r0   rx   r\   rg   rN   r@   )r:   rp   r)   r   Úfields_sentÚmetadata_in_payloadrt   Úexistingr8   r/   r0   ry   r^   Úexisting_after_races                 r!   Úupsert_memoryr¤   ›  s¥  è ø€ ô" +Ó,€Mð ×.Ñ.€KØ!+¨{Ð!:Ðà%'€DØ‡z�zÐØŸ
™
ˆˆW‰ÙÜ9¸$¿-¹-ÓHˆˆZÑÙÜØØPô
ð 	
ð +×2Ñ2€DˆÑð:hÜ <¸]ÈCÐQbÓ c×cˆØÐô
 ' }°hÐ@QÓR×RÐRÜ% mÓ4×;Ñ;Ø" H×$6Ñ$6Ð7Øð <ó ÷ ‰Cð
 �z‰zÐ!Ü#Ø #ØRôð ô
  .Ð.?ÀÇÁÈtÏ|É|Ó\ÑˆG�Wð
 ØŸ™Ø"Ø"Ø/×7Ñ7Ø/×7Ñ7ñ5ˆKð �}‰}Ð(Ü*HÈÏÉÓ*W�˜JÑ'ðÜ)¨-Ó8×?Ñ?À[Ð?ÓQ×Q�ð4 €{Ü¨Ð6GÈÀuÈKÐ4XÔYÐYÜ˜ÓÐð{ dùð Sùðøð4 RùÜò ô ,¨AÔ.ØÜ3OÐP]Ð_bÐduÓ3v×-vÐ-vÐ#Ø&Ð.ô (Ø$'Ø!2°3°%Ð7HÐIôð ô
 +¨=Ð:MÐO`Óa×aÑaÜ)¨-Ó8×?Ñ?Ø&Ð(;×(EÑ(EÐFØð @ó ÷ ð •ûð!ûô( ò ØÜò hÜÐ:¸AÐ?fÓgÐgûðhüs»   ‚A0IÁ3H6 ÂFÂH6 ÂFÂ/H6 Ã
F ÃBH6 ÅF$ Å7F"Å8F$ Å<IÆH6 ÆH6 Æ H6 Æ"F$ Æ$	H3Æ-H.Ç	GÇ
(H.Ç2G5Ç30H.È#H&È$H.È)H6 È.H3È3H6 È6IÉIÉIÉIc              ƒ   óZ  K  — t        «       }t        || |«      ƒ d{  –—† }t        |||«      ƒ d{  –—†  	 t        |«      j	                  d|j
                  i¬«      ƒ d{  –—† }|€t        dd| › d�¬	«      ‚t        | d
¬«      S 7 Œi7 ŒV7 Œ(# t        $ r}t        d|d«      ‚d}~ww xY w­w)z3Delete a memory entry by key, scoped to the caller.Nr1   r†   zError deleting memory: %sz%Internal error deleting memory entry.r–   rv   r—   rC   T)r:   Údeleted)
rH   r˜   rT   r"   Údeleter1   r\   rN   r   r   )r:   r)   r   r8   r¦   r^   s         r!   Údelete_memoryr¨   
  s½   è ø€ ô +Ó,€MÜ.¨}¸cÐCTÓU×U€Cä
˜}¨cÐ3DÓ
E×EÐEðgÜ,¨]Ó;×BÑBÈ+ÐWZ×WdÑWdÐIeÐBÓf×fˆð €Ü¨Ð6GÈÀuÈKÐ4XÔYÐYÜ C°Ô6Ð6ð VøàEøàfùÜò gÜÐ9¸1Ð>eÓfÐfûðgüsT   ‚B+�BžB+²B	³B+¸*B Á"BÁ#B Á'!B+Â	B+ÂB Â	B(ÂB#Â#B(Â(B+)r   r   )DÚ__doc__r&   Úcollections.abcr   Útypingr   r   Úfastapir   r   r   r	   Úlitellm._loggingr
   Úlitellm.proxy._typesr   r   r   r   Ú$litellm.proxy.auth.user_api_key_authr   Ú%litellm.repositories.prisma_protocolsr   Ú'litellm.repositories.table_repositoriesr   Ú$litellm.repositories.team_repositoryr   Úlitellm.types.memory_managementr   r   r   r   r   Úprismar   Úprisma_modelsÚlitellm.proxy.utilsr   r   Ú__annotations__r"   Úobjectre   r(   Úboolr-   r7   r@   rH   r\   rN   rT   rQ   rg   Útuplerl   Úpostrz   ÚgetÚintr”   r˜   rš   rœ   Úputr¤   r§   r¨   © r#   r!   ú<module>rÀ      s  ðòó& Ý #ß 'ç <Ó <å 1÷ó õ CÝ >Ý DÝ ?÷õ ñ Ý.å0á“€ˆÓ ð1 ð 1°LÐAdÑ4eó 1ð ¨Vð  ¸ó  ðG ð G°Dó Gð¨.ð ¸WÀSÈ&À[Ñ=QÐTXÑ=Xó ð$Ð:ð Ð?Pó óðA ð A¨9ð AÀcð AÈmó Að'Ø!ð'Ø(Kð'Ø`nð'à	ó'ðT"¨Nð "È~ð "Ðhkð "Ðptó "ðJ\˜ið \¨Dó \ð,Ø%ð,à˜T‘zð,ð ˜T‘zð,ð ˆ3�‰:�s˜T‘zÐ!Ñ"ó	,ð^ ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø$ð	 ó ñ )0Ð0AÓ(Bñ%Ø
ð%à%ò%óð%ðP ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø%ð	 ó ñ ˜DÐ.JÔKÙ"ØðVôñ �a˜A”Ù˜2 !¨Ô,Ù(/Ð0AÓ(Bñ/VØ	ˆt‰ð/Và�d‘
ð/Vð ð/Vð ð/Vð &ò/Vóð/Vðd
Ø!ð
Ø(+ð
Ø@Nð
à(ó
ð	Ø!ð	Ø(+ð	Ø@Nð	à/ó	ð ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø$ð	 ó ñ )0Ð0AÓ(BñØ	ðà%òóðð ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø$ð	 ó ñ )0Ð0AÓ(BñfØ	ðfà
ðfð &òfóðfðR ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø'ð	 ó ñ )0Ð0AÓ(Bñ7Ø	ð7à%ò7óñ7r#   