Ë
    �@ti¼C  ã                   óŒ  — d dl Z d dlZd dlZd dlmZmZmZm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mZ dZdZdZd	Zd
ZdZ eg d¢«      Zdefd„Zde	j:                  fd„Z e«       ZdCde de de de fd„Z!dee"ef   dee"ef   fd„Z#dee"ef   ddfd„Z$de"de"de"dee"ef   fd„Z%dee"ef   dee"ef   fd„Z&ddœdee"ef   d e dee"ef   fd!„Z'd"e"de"fd#„Z(d$e"dee"ef   fd%„Z)d&e"dee"e"f   fd'„Z*dee"ef   d(e"ddfd)„Z+d&e"dee"ef   fd*„Z,d&e"d+e"dee"ef   fd,„Z-d-e"d&e"dee"ef   fd.„Z.d/dd0œd&e"d1e"d2e"d3e"d4e/d5e/d6e/d7e/d8e/d9e/d:ee    dee"ef   fd;„Z0d/dd0œd-e"d&e"d2e"d3e"d4e/d5e/d6e/d7e/d8e/d9e/d:ee    dee"ef   fd<„Z1d-e"d&e"dee"ef   fd=„Z2ed>   Z3d/dd?ddd@œd&e"d2e"d3e"d4e/d5e/d6e/d7e/d8e/d9e/d:ee    dAe3d1ee"   d-ee"   dee"ef   fdB„Z4y)Dé    N)ÚAnyÚDictÚOptionalÚLiteral)ÚHTTPAdapter)ÚRetry)ÚTIKTOK_CLIENT_KEYÚTIKTOK_CLIENT_SECRETÚTIKTOK_REDIRECT_URIÚTIKTOK_SCOPESÚTIKTOK_PRODUCTIONz)https://www.tiktok.com/v2/auth/authorize/z+https://open.tiktokapis.com/v2/oauth/token/z=https://open.tiktokapis.com/v2/post/publish/inbox/video/init/z7https://open.tiktokapis.com/v2/post/publish/video/init/z?https://open.tiktokapis.com/v2/post/publish/creator_info/query/z9https://open.tiktokapis.com/v2/post/publish/status/fetch/)ÚGETÚPOSTÚPUTÚreturnc                  óØ   — t        ddddd¬«      } 	 t        d	i | ¤t        ddœ¤ŽS # t        $ r Y nw xY w	 t        d	i | ¤t        ddœ¤ŽS # t        $ r Y nw xY wt        d	i | ¤dt        i¤ŽS )
u­   
    Compatibilidad urllib3:
      - urllib3 nuevo: allowed_methods=
      - urllib3 viejo: method_whitelist=
    AdemÃ¡s, algunas versiones no aceptan raise_on_status.
    é   gš™™™™™Ù?)i­  iô  iö  i÷  iø  )ÚtotalÚconnectÚreadÚbackoff_factorÚstatus_forcelistF)Úallowed_methodsÚraise_on_status)Úmethod_whitelistr   r   © )Údictr   Ú_ALLOWED_RETRY_METHODSÚ	TypeError)Úbase_kwargss    ú+/var/www/html/luxverbi-app/tiktok_client.pyÚ_make_retryr"   )   s®   € ô ØØØØØ2ô€KðÜñ 
Øð
ä2Ø!ó
ð 	
øô
 ò ÙðúðÜñ 
Øð
ä3Ø!ó
ð 	
øô
 ò Ùðúô ñ Ø
ñä/òð s   ’& ¦	2±2¶A
 Á
	AÁAc                  ó¦   — t        j                  «       } t        «       }t        |dd¬«      }| j	                  d|«       | j	                  d|«       | S )Né   )Úmax_retriesÚpool_connectionsÚpool_maxsizezhttps://zhttp://)ÚrequestsÚSessionr"   r   Úmount)ÚsÚretryÚadapters      r!   Ú_build_sessionr.   S   sF   € Ü×ÑÓ€AÜ‹M€EÜ e¸bÈrÔR€GØ‡G�GˆJ˜Ô Ø‡G�GˆI�wÔØ€Hó    Únow_tsÚ
expires_inÚskew_secondsc                 óJ   — | t        dt        |«      t        |«      z
  «      z   S )u[   
    Guarda expiraciÃ³n absoluta con margen (skew) para evitar usar tokens al lÃ­mite.
    r   )ÚmaxÚint)r0   r1   r2   s      r!   Úcompute_expires_atr6   a   s$   € ð ”C˜œ3˜z›?¬S°Ó->Ñ>Ó?Ñ?Ð?r/   Úbundlec                 ó  — t        t        j                  «       «      }t        | j                  d«      xs d«      }t        | j                  d«      xs d«      }|rt        ||d¬«      nd| d<   |rt        ||d¬«      nd| d<   || d<   | S )	zq
    Normaliza el bundle OAuth a expiraciones absolutas:
      - expires_at_ts
      - refresh_expires_at_ts
    r1   r   Úrefresh_expires_inéx   )r2   Úexpires_at_tsÚrefresh_expires_at_tsÚupdated_at_ts)r5   ÚtimeÚgetr6   )r7   ÚnowÚaccess_expires_inr9   s       r!   Ú_normalize_token_bundlerB   h   s�   € ô Œd�i‰i‹kÓ
€CÜ˜FŸJ™J |Ó4Ò9¸Ó:ÐÜ˜VŸZ™ZÐ(<Ó=ÒBÀÓCÐá^oÔ0°Ð6GÐVYÕZÐuv€Fˆ?ÑÙewÔ&8¸Ð>PÐ_`Õ&aÐ}~€FÐ"Ñ#Ø!€Fˆ?ÑØ€Mr/   Úpayloadc           
      óÊ   — t        | t        «      rS| j                  d«      rAt        d| j                  d«      › d| j                  d«      › d| j                  d«      › �«      ‚yy)zr
    OAuth v2 devuelve errores en top-level:
      {"error":"...", "error_description":"...", "log_id":"..."}
    Úerrorzoauth_error=z desc=Úerror_descriptionú log_id=Úlog_idN)Ú
isinstancer   r?   ÚRuntimeError)rC   s    r!   Ú_raise_oauth_error_if_anyrK   x   sm   € ô
 �'œ4Ô  W§[¡[°Ô%9ÜØ˜7Ÿ;™; wÓ/Ð0ð 1Ø—K‘KÐ 3Ó4Ð5ð 6Ø—k‘k (Ó+Ð,ð.ó
ð 	
ð &:Ð r/   Ú
client_keyÚclient_secretÚrefresh_tokenc                 óø   — | |d|dœ}t         j                  t        |ddid¬«      }|j                  r|j	                  «       ni }|j
                  dk7  rt        d|j
                  › d	|› �«      ‚t        |«       |S )
zd
    Refresca access_token usando refresh_token.
    Devuelve el bundle OAuth (sin normalizar).
    rN   )rL   rM   Ú
grant_typerN   úContent-Typeú!application/x-www-form-urlencodedé   ©ÚdataÚheadersÚtimeoutéÈ   zrefresh_failed http=ú	 payload=)Ú_SESSIONÚpostÚTIKTOK_OAUTH_TOKEN_URLÚcontentÚjsonÚstatus_coderJ   rK   )rL   rM   rN   rU   ÚrrC   s         r!   Úrefresh_user_access_tokenra   …   s‰   € ð !Ø&Ø%Ø&ñ	€Dô 	�‰ÜØØÐ!DÐEØð	 	ó 	€Að Ÿ)š)ˆa�f‰fŒh¨€GØ‡}�}˜ÒÜÐ1°!·-±-°À	È'ÈÐSÓTÐTä˜gÔ&Ø€Nr/   Úcurrentc                 ó  — | xs i j                  d«      }|st        d«      ‚t        t        t        |«      }|j                  d«      r|d   | d<   |j                  d«      r|d   | d<   dD ]  }||v sŒ||   €Œ||   | |<   Œ t        | «      S )u^   
    Refresca el bundle actual y aplica rotaciÃ³n de refresh_token si TikTok lo devuelve.
    rN   Úmissing_refresh_tokenÚaccess_token)r1   r9   Úopen_idÚscopeÚ
token_type)r?   rJ   ra   r	   r
   rB   )rb   Úrtr7   Úks       r!   Úrefresh_token_bundlerk   ž   s¬   € ð Š-�R×	Ñ	˜_Ó	-€BÙÜÐ2Ó3Ð3ä&Ô'8Ô:NÐPRÓS€Fð ‡z�z�/Ô"Ø#)¨/Ñ#:ˆ�Ñ à‡z�z�.Ô!Ø"(¨Ñ"8ˆ�Ñð Tò #ˆØ�Š;˜6 !™9Ñ0Ø ™ˆG�AŠJð#ô # 7Ó+Ð+r/   é,  )Úrefresh_if_lt_secondsrm   c                ó2  — | st        d«      ‚t        t        j                  «       «      }t        | j                  d«      xs d«      }|r||k\  rt        d«      ‚t        | j                  d«      xs d«      }|r||t        |«      z
  k\  rt	        | «      S | S )u¦   
    Garantiza que access_token sea vÃ¡lido.
    - Si expira en <refresh_if_lt_seconds, refresca.
    - Si refresh_token expirÃ³, lanza error (requiere relogin).
    Úmissing_token_bundler<   r   Ú&refresh_token_expired_requires_reloginr;   )rJ   r5   r>   r?   rk   )rb   rm   r@   Úrefresh_expires_atÚ
expires_ats        r!   Úensure_fresh_token_bundlers   ·   s‘   € ñ ÜÐ1Ó2Ð2ä
Œd�i‰i‹kÓ
€CÜ˜WŸ[™[Ð)@ÓAÒFÀQÓGÐÙ˜cÐ%7Ò7ÜÐCÓDÐDä�W—[‘[ Ó1Ò6°QÓ7€JÙ˜ ¬cÐ2GÓ.HÑ!HÒIÜ# GÓ,Ð,à€Nr/   Ústatec                 ó|   — t         dt        t        | dœ}t        dz   t        j
                  j                  |«      z   S )NÚcode)rL   Úresponse_typerg   Úredirect_urirt   ú?)r	   r   r   ÚTIKTOK_OAUTH_AUTHORIZE_URLÚurllibÚparseÚ	urlencode)rt   Úparamss     r!   Úbuild_authorize_urlr   Ï   s9   € ä'ØÜÜ+Øñ€Fô &¨Ñ+¬f¯l©l×.DÑ.DÀVÓ.LÑLÐLr/   rv   c                 ó$  — t         t        d| t        dœ}t        j	                  t
        |ddid¬«      }|j                  r|j                  «       ni }|j                  dk7  rt        d|j                  › d	|› �«      ‚t        |«       t        |«      S )
zV
    Intercambia code por token bundle y lo normaliza con expiraciones absolutas.
    Úauthorization_code)rL   rM   rP   rv   rx   rQ   rR   rS   rT   rX   zoauth_exchange_failed http=rY   )r	   r
   r   rZ   r[   r\   r]   r^   r_   rJ   rK   rB   )rv   rC   ÚresprU   s       r!   Úexchange_code_for_tokenrƒ   Ú   s™   € ô
 (Ü-Ø*ØÜ+ñ€Gô �=‰=ÜØØÐ!DÐEØð	 ó €Dð Ÿ,š,ˆ4�9‰9Œ;¨B€DØ×Ñ˜3ÒÜÐ8¸×9IÑ9IÐ8JÈ)ÐTXÐSYÐZÓ[Ð[ä˜dÔ#Ü" 4Ó(Ð(r/   re   c                 ó   — d| › �ddœS )NzBearer zapplication/json; charset=UTF-8)ÚAuthorizationrQ   r   )re   s    r!   Ú_api_headersr†   ö   s   € à" < .Ð1Ø9ñð r/   Úcontextc                óÐ   — | xs i j                  d«      xs i }|j                  d«      }|r:|dk7  r4t        |› d|› d|j                  d«      › d|j                  d«      › �«      ‚y	y	)
zW
    TikTok API v2 suele devolver:
      {"error":{"code":"ok",...}, "data":{...}}
    rE   rv   Úokz error_code=z	 message=ÚmessagerG   rH   N)r?   rJ   )rC   r‡   Úerrrv   s       r!   Ú_raise_api_error_if_anyrŒ   ý   su   € ð
 Š=�b×
Ñ
˜gÓ
&Ò
,¨"€CØ�7‰7�6‹?€DÙ�˜’Ü˜g˜Y l°4°&¸	À#Ç'Á'È)ÓBTÐAUÐU]Ð^a×^eÑ^eÐfnÓ^oÐ]pÐqÓrÐrð €tr/   c                 ó(  — t        | «      }t        j                  t        |i d¬«      }|j                  r|j                  «       ni }|j                  dk7  rt        d|j                  › d|› �«      ‚t        |d¬«       |j                  di «      xs i S )	NrS   ©rV   r^   rW   rX   zcreator_info_http_failed http=rY   Úcreator_info©r‡   rU   )
r†   rZ   r[   ÚCREATOR_INFO_URLr]   r^   r_   rJ   rŒ   r?   )re   rV   r‚   rC   s       r!   Úquery_creator_infor’     s†   € Ü˜<Ó(€GÜ�=‰=Ô)°7ÀÈRˆ=ÓP€DØ!Ÿ\š\ˆd�i‰iŒk¨r€GØ×Ñ˜3ÒÜÐ;¸D×<LÑ<LÐ;MÈYÐW^ÐV_Ð`ÓaÐaÜ˜G¨^Õ<Ø�;‰;�v˜rÓ"Ò( bÐ(r/   Ú
publish_idc                 ó,  — t        | «      }t        j                  t        |d|id¬«      }|j                  r|j                  «       ni }|j                  dk7  rt        d|j                  › d|› �«      ‚t        |d¬«       |j                  d	i «      xs i S )
Nr“   rS   rŽ   rX   zstatus_fetch_http_failed http=rY   Ústatus_fetchr�   rU   )
r†   rZ   r[   ÚSTATUS_FETCH_URLr]   r^   r_   rJ   rŒ   r?   )re   r“   rV   r‚   rC   s        r!   Úfetch_post_statusr—     s�   € Ü˜<Ó(€GÜ�=‰=Ô)°7À,ÐPZÐA[Ðegˆ=Óh€DØ!Ÿ\š\ˆd�i‰iŒk¨r€GØ×Ñ˜3ÒÜÐ;¸D×<LÑ<LÐ;MÈYÐW^ÐV_Ð`ÓaÐaÜ˜G¨^Õ<Ø�;‰;�v˜rÓ"Ò( bÐ(r/   Ú	file_pathc                 óÀ  — t         j                  j                  | «      }t        |«      }dd||ddœi}t        j                  t        ||d¬«      }|j                  r|j                  «       ni }|j                  dk7  rt        d|j                  › d	|› �«      ‚t        |d
¬«       |j                  di «      xs i }|j                  d«      }|st        d|› �«      ‚|dz
  }	dd|	› d|› �dœ}
t        | d«      5 }t        j                  ||
|d¬«      }d d d «       j                  dk\  r(t        d|j                  › d|j                  d d › �«      ‚|S # 1 sw Y   ŒBxY w)NÚsource_infoÚFILE_UPLOADé   ©ÚsourceÚ
video_sizeÚ
chunk_sizeÚtotal_chunk_counté<   rŽ   rX   zinbox_init_http_failed http=rY   Ú
inbox_initr�   rU   Ú
upload_urlz&inbox_init_missing_upload_url payload=ú	video/mp4úbytes 0-ú/©rQ   zContent-RangeÚrbrl   ©rV   rU   rW   é�  zinbox_put_failed http=ú body=é°  )ÚosÚpathÚgetsizer†   rZ   r[   ÚINBOX_INIT_URLr]   r^   r_   rJ   rŒ   r?   ÚopenÚputÚtext)r˜   re   Ú	file_sizerV   ÚbodyÚ	init_respÚ	init_datarU   r¤   Úend_byteÚput_headersÚfÚput_resps                r!   Ú_upload_video_as_draftr½   "  s†  € Ü—‘—‘ 	Ó*€Iä˜<Ó(€GàØ#Ø#Ø#Ø!"ñ	
ð€Dô —‘œn°gÀDÐRT�ÓU€IØ$-×$5Ò$5�	—‘Ô ¸2€IØ×Ñ Ò#ÜÐ9¸)×:OÑ:OÐ9PÐPYÐZcÐYdÐeÓfÐfä˜I¨|Õ<à�=‰=˜ Ó$Ò*¨€DØ—‘˜,Ó'€JÙÜÐCÀIÀ;ÐOÓPÐPð ˜1‰}€Hà#Ø# H :¨Q¨y¨kÐ:ñ€Kô
 
ˆi˜Ó	ð V !Ü—<‘< 
°KÀaÐQT�<ÓUˆ÷Vð ×Ñ˜sÒ"ÜÐ3°H×4HÑ4HÐ3IÈÐPX×P]ÑP]Ð^cÐ_cÐPdÐOeÐfÓgÐgàÐ÷Vð Vús   Ã9EÅET)Úis_aigcÚvideo_cover_timestamp_msÚ	video_urlÚcaptionÚprivacy_levelÚdisable_commentÚdisable_duetÚdisable_stitchÚbrand_content_toggleÚbrand_organic_toggler¾   r¿   c           
      óô  — |rt        |t        «      st        d«      ‚t        | «      }||xs dt	        |«      t	        |«      t	        |«      t	        |«      t	        |«      t	        |	«      dœ}|
�t        |
«      |d<   d|dœ|dœ}t        j                  t        ||d¬	«      }|j                  r|j                  «       ni }|j                  d
k7  rt        d|j                  › d|› �«      ‚t        |d¬«       |S )Nz'video_url is required for PULL_FROM_URLÚ ©rÂ   ÚtitlerÃ   rÄ   rÅ   rÆ   rÇ   r¾   r¿   ÚPULL_FROM_URL)rž   rÀ   ©rš   Ú	post_infor¢   rŽ   rX   údirect_init_http_failed http=rY   Údirect_init_pull_from_urlr�   )rI   ÚstrÚ
ValueErrorr†   Úboolr5   rZ   r[   ÚDIRECT_POST_INIT_URLr]   r^   r_   rJ   rŒ   )re   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r¾   r¿   rV   rÎ   r¶   r·   r¸   s                   r!   Ú_publish_video_from_urlrÕ   N  s  € ñ œJ y´#Ô6ÜÐBÓCÐCä˜<Ó(€Gð 'Ø’˜BÜ Ó0Ü˜\Ó*Ü˜~Ó.Ü $Ð%9Ó :Ü $Ð%9Ó :Ü˜“=ñ	!€Ið  Ð+Ü03Ð4LÓ0Mˆ	Ð,Ñ-ð &Ø"ñ
ð ñ€Dô —‘Ô2¸GÈ$ÐXZ�Ó[€IØ$-×$5Ò$5�	—‘Ô ¸2€IØ×Ñ Ò#ÜÐ:¸9×;PÑ;PÐ:QÐQZÐ[dÐZeÐfÓgÐgä˜IÐ/JÕKØÐr/   c           
      ól  — t         j                  j                  | «      }t        |«      }||xs dt	        |«      t	        |«      t	        |«      t	        |«      t	        |«      t	        |	«      dœ}|
�t        |
«      |d<   d||ddœ|dœ}t        j                  t        ||d¬	«      }|j                  r|j                  «       ni }|j                  d
k7  rt        d|j                  › d|› �«      ‚t        |d¬«       |j                  di «      xs i }|j                  d«      }|st        d|› �«      ‚|dz
  }dd|› d|› �dœ}t        | d«      5 }t        j!                  |||d¬«      }d d d «       j                  dk\  r(t        d|j                  › d|j"                  d d › �«      ‚|S # 1 sw Y   ŒBxY w)NrÉ   rÊ   r¿   r›   rœ   r�   rÍ   r¢   rŽ   rX   rÏ   rY   Údirect_init_file_uploadr�   rU   r¤   z'direct_init_missing_upload_url payload=r¥   r¦   r§   r¨   r©   rl   rª   r«   zdirect_put_failed http=r¬   r­   )r®   r¯   r°   r†   rÓ   r5   rZ   r[   rÔ   r]   r^   r_   rJ   rŒ   r?   r²   r³   r´   )r˜   re   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r¾   r¿   rµ   rV   rÎ   r¶   r·   r¸   rU   r¤   r¹   rº   r»   r¼   s                          r!   Ú%_upload_and_publish_video_file_uploadrØ   ‚  së  € ô —‘—‘ 	Ó*€IÜ˜<Ó(€Gð 'Ø’˜BÜ Ó0Ü˜\Ó*Ü˜~Ó.Ü $Ð%9Ó :Ü $Ð%9Ó :Ü˜“=ñ	!€Ið  Ð+Ü03Ð4LÓ0Mˆ	Ð,Ñ-ð $Ø#Ø#Ø!"ñ	
ð ñ€Dô —‘Ô2¸GÈ$ÐXZ�Ó[€IØ$-×$5Ò$5�	—‘Ô ¸2€IØ×Ñ Ò#ÜÐ:¸9×;PÑ;PÐ:QÐQZÐ[dÐZeÐfÓgÐgä˜IÐ/HÕIà�=‰=˜ Ó$Ò*¨€DØ—‘˜,Ó'€JÙÜÐDÀYÀKÐPÓQÐQð ˜1‰}€Hà#Ø# H :¨Q¨y¨kÐ:ñ€Kô
 
ˆi˜Ó	ð V !Ü—<‘< 
°KÀaÐQT�<ÓUˆ÷Vð ×Ñ˜sÒ"ÜÐ4°X×5IÑ5IÐ4JÈ&ÐQY×Q^ÑQ^Ð_dÐ`dÐQeÐPfÐgÓhÐhàÐ÷Vð Vús   ÅF*Æ*F3c                 ó   — t        | |¬«      S )N©r˜   re   )r½   rÚ   s     r!   Úupload_video_draftrÛ   É  s   € Ü!¨IÀLÔQÐQr/   )rÌ   r›   rÌ   )r¾   r¿   ÚmoderÀ   r˜   rÜ   c                 ó¾   — |
dk(  r#|st        d«      ‚t        | ||||||||||	¬«      S |
dk(  r#|st        d«      ‚t        || |||||||||	¬«      S t        d|
› �«      ‚)z¿
    Unified entrypoint:
      - mode="PULL_FROM_URL": requiere video_url (recomendado si el MP4 ya existe en tu servidor)
      - mode="FILE_UPLOAD": requiere file_path (fallback/tests)
    rÌ   z/video_url is required when mode='PULL_FROM_URL')re   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r¾   r¿   r›   z-file_path is required when mode='FILE_UPLOAD')r˜   re   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r¾   r¿   zUnsupported mode: )rÒ   rÕ   rØ   )re   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r¾   r¿   rÜ   rÀ   r˜   s                r!   Úupload_video_direct_postrÞ   Ð  s¥   € ð. ˆÒÙÜÐNÓOÐOÜ&Ø%ØØØ'Ø+Ø%Ø)Ø!5Ø!5ØØ%=ô
ð 	
ð ˆ}ÒÙÜÐLÓMÐMÜ4ØØ%ØØ'Ø+Ø%Ø)Ø!5Ø!5ØØ%=ô
ð 	
ô Ð)¨$¨Ð0Ó
1Ð1r/   )r:   )5r®   r>   Úurllib.parser{   Útypingr   r   r   r   r(   Úrequests.adaptersr   Úurllib3.util.retryr   Úconfigr	   r
   r   r   r   rz   r\   r±   rÔ   r‘   r–   Ú	frozensetr   r"   r)   r.   rZ   r5   r6   rÑ   rB   rK   ra   rk   rs   r   rƒ   r†   rŒ   r’   r—   r½   rÓ   rÕ   rØ   rÛ   ÚPublishModerÞ   r   r/   r!   ú<module>ræ      sa  ðã 	Û Û ß /Ó /ã Ý )Ý $÷õ ð IÐ ØFÐ ð Q€ð QÐ ð UÐ ØNÐ ñ
 #Ò#9Ó:Ð ð'�Uó 'ðT˜×(Ñ(ó ñ Ó€ñ
@˜sð @°ð @À3ð @ÐQTó @ð D¨¨c¨¡Nð °t¸CÀ¸H±~ó ð 

 t¨C°¨H¡~ð 

¸$ó 

ð¨#ð ¸cð ÐRUð ÐZ^Ð_bÐdgÐ_gÑZhó ð2, $ s¨C x¡.ð ,°T¸#¸s¸(±^ó ,ð2 X[ò  t¨C°¨H¡~ð ÐQTð Ð_cÐdgÐilÐdlÑ_mó ð0M˜sð M só Mð) #ð )¨$¨s°C¨x©.ó )ð8˜sð  t¨C°¨H¡~ó ðs T¨#¨s¨(¡^ð sÀð sÈó sð) Sð )¨T°#°s°(©^ó )ð) Cð )°Sð )¸TÀ#ÀsÀ(¹^ó )ð& cð &¸ð &ÀÀcÈ3ÀhÁó &ðn Ø.2ò.àð.ð ð.ð ð	.ð
 ð.ð ð.ð ð.ð ð.ð ð.ð ð.ð ð.ð ' s™mð.ð 
ˆ#ˆsˆ(�^ó.ð~ Ø.2òAàðAð ðAð ð	Að
 ðAð ðAð ðAð ðAð ðAð ðAð ðAð ' s™mðAð 
ˆ#ˆsˆ(�^óAðNR #ð R°Sð R¸TÀ#ÀsÀ(¹^ó Rð Ð4Ñ5€ð Ø.2Ø'à#à#ò!92àð92ð ð92ð ð	92ð
 ð92ð ð92ð ð92ð ð92ð ð92ð ð92ð ' s™mð92ð ð92ð ˜‰}ð92ð  ˜‰}ð!92ð" 
ˆ#ˆsˆ(�^ô#92r/   