ó
    kÿËjæ9  ã                   ó   • % S r SSKrSSKrSSKrSSKJr  SSKJrJr  SSK	J
r
  SSKJrJr  SSKJr  SSKJr  \R$                  " S	5      r " S
 S\5      r0 SSSSS._SSSS._SSSS._SSSS._SSSSSS._SSSSS._SSSSS._SSS S._S!SS"S._S#SS"S._S$SS S._S%S&\" \
R.                  5      S'S(S._S)SSSS._S*SSS+S._S,SSSS._S-S.SS._S/S0SS._S1S2S.SS S.S&S3SS4S.S5.Er\\\\\4   4   \S6'   \
R6                  R9                  5        HH  u  rrSS7\" \5      ;   a&  \" \5      R?                  S5      R?                  S75      O\" \5      SS8S.\\'   MJ     \ " \
R6                  RC                  5       5      r"\RF                  " S95      r$S:\S;\%4S< jr&S=\S>\S;\4S? jr'SeS@ jr(SA\S;\4SB jr)SC\S;\4SD jr*  SfSA\SE\\   SF\\   SG\\   S;\4
SH jjr+S;\4SI jr,SJ\S;\\   4SK jr-SJ\S;\\   4SL jr.SgSM\/S;\ \   4SN jjr0SSSSO.SJ\SA\\   SP\\/   SF\\   S;\4
SQ jjr1ShSJ\S;\\\4   4SR jjr2SJ\SS\S;\\\4   4ST jr3SU\S;\\\%4   4SV jr4SWSXSYSZS[S\S]S^.r51 S_kr61 S`kr7Sa\S;\\   4Sb jr8Sa\S;\94Sc jr:SJ\S;\4Sd jr;g)iuô  
school_service.py â€” multi-colegio (multitenant).

Un Â« colegio Â» (school) agrupa familias, alumnos, pedidos, precios y
configuraciÃ³n. Todo lo que antes estaba fijo en el cÃ³digo (nombre, fechas,
precios, retenciÃ³n RGPD, reparto, fotÃ³grafoâ€¦) vive ahora en `school_settings`
y se edita desde el panel de admin.

- `schools.id` es el slug (inmutable, ej. "sainte-marie"): se envÃ­a en la
  cabecera X-School y se guarda en families.school_id / orders.school_id.
- El cÃ³digo de familia sigue siendo Ãºnico globalmente (PK de families), asÃ­ que
  el QR de la tarjeta identifica de forma inequÃ­voca familia â†’ colegio.
- ContraseÃ±a de director: una por colegio (hash scrypt). El operador Meeconic
  (ADMIN_PASSWORD) administra todos los colegios.
é    N)Údate)ÚAnyÚOptional)Úconfig)Úget_dbÚTABLE_OPTIONS)Úhash_password)Ú
utcnow_isozmeeconic.schoolsc                   ó   • \ rS rSrSrg)ÚSettingsErroré   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    ÚZD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\services\school_service.pyr   r      s   † Úr   r   Úschool_nameÚstrÚ éx   )ÚtypeÚdefaultÚmaxÚ
shoot_dater   )r   r   Úclosure_dateÚdelivery_weekÚrevenue_share_pctÚfloatÚ0éd   )r   r   Úminr   Úpartner_nameÚ
portal_urléÈ   Úonline_paymentÚboolÚtrueÚonsite_paymentÚfalseÚpostal_deliveryÚschool_deliveryÚ	rgpd_daysÚinté   im  Úphotographer_nameÚphotographer_idé(   Úftp_urlÚnotification_emailÚemailÚqr_code_prefixÚprefixÚcolorz#0A1F44Ú5é2   )Úbrand_colorÚ
ai_enabledÚai_max_per_familyÚSETTINGS_SPECÚ.iè  z^[^@\s]+@[^@\s]+\.[^@\s]+$Ú	hex_colorÚreturnc                 óæ   ^• U R                  S5      mU4S jS 5        Vs/ s H"  nUS-  S::  a  US-  S-  OUS-  S-   S-  S	-  PM$     nnS
US   -  SUS   -  -   SUS   -  -   nSUS-   -  $ s  snf )z0WCAG contrast ratio between `#RRGGBB` and white.Ú#c              3   óF   >#   • U  H  n[        TXS -    S5      v •  M     g7f)é   é   N)r0   )Ú.0ÚiÚhs     €r   Ú	<genexpr>Ú&contrast_with_white.<locals>.<genexpr>H   s#   øé € Ð<²)¨Q”S˜˜1 ™U˜ R×(Ð(²)ùs   ƒ!)r   rG   é   éÿ   g#Æ‚¤?g×£p=
×)@g)\�Âõ(¬?gáz®Gáð?g333333@g¼–�z6Ë?r   g¥,Cëâæ?r1   g]mÅþ²{²?rG   gÍÌÌÌÌÌð?gš™™™™™©?)Úlstrip)rB   ÚcÚlinÚlumrK   s       @r   Úcontrast_with_whiterT   D   sŸ   ø€ à×Ñ˜Ó€Aä<±)Ô<ó>Ú<ˆqð !" C¡¨7Ó 2ˆA�‰G�eŠO¸1¸s¹7ÀeÑ:KÈuÑ9TÐY\Ñ8\Ò\Ù<ð ð >à
�3�q‘6‰/˜F S¨¡V™OÑ
+¨f°s¸1±v©oÑ
=€CØ�3˜‘:ÑÐùò>s   ¡)A.ÚkeyÚrawc                 ó`  • [         U    nUS   nUc  SO[        U5      R                  5       nUS:X  aX  [        U[        5      (       a  U(       a  S$ S$ UR                  5       S;   a  gUR                  5       S;   a  g[        U  S35      eUS	:X  a,  US:X  a  g [        R                  " U5      R                  5       $ US;   a–   US:X  a  [        U5      O[        UR                  SS5      5      nXRS   :  d  XRS   :”  a  [        U  SUS    SUS    S35      eUS:X  a  [        U5      $ U[        U5      :X  a  [        [        U5      5      $ [        U5      $ US:X  aC  UR                  5       nU(       a*  [        R                   " SU5      (       d  [        U  S35      eU$ US:X  aW  [        R                   " SU5      (       d  [        U  S35      e[#        U5      S:  a  [        U  S35      eUR                  5       $ US:X  a1  U(       a(  [$        R!                  U5      (       d  [        U  S35      eU$ ['        U5      UR)                  SS5      :”  a!  [        U  SUR)                  SS5       S 35      eU$ ! [         a    [        U  S
35      ef = f! [         a    [        U  S35      ef = f)!Nr   r   r)   r*   r,   )r*   Ú1ÚyesÚon)r,   r"   ÚnoÚoffr   z: invalid boolean value.r   z#: invalid date (format YYYY-MM-DD).)r0   r!   r0   Ú,rA   z: invalid number.r$   r   z: must be between z and r9   z^[A-Z]{2,6}$z: 2 to 6 letters (A-Z).r:   z^#[0-9a-fA-F]{6}$z: use a #RRGGBB colour.g      @u<   : colour too light â€” white text on it would be unreadable.r7   z: invalid e-mail address.r'   z: too long (max z).)r@   r   ÚstripÚ
isinstancer)   Úlowerr   r   ÚfromisoformatÚ	isoformatÚ
ValueErrorr0   r!   ÚreplaceÚupperÚreÚmatchrT   Ú	_EMAIL_REÚlenÚget)rU   rV   ÚspecÚtÚsÚnums         r   Ú
_normalizero   M   s¥  € Ü˜Ñ€DØˆV‰€AØ‰k‰œs 3›xŸ~™~Ó/€AØˆFƒ{Ü�cœ4× Ñ Þ �6Ð- gÐ-Ø�7‰7‹9Ð2Ó2ØØ�7‰7‹9Ð7Ó7ØÜ˜s˜eÐ#;Ð<Ó=Ð=ØˆFƒ{Ø�‹7Øð	MÜ×%Ò% aÓ(×2Ñ2Ó4Ð4ð 	ÐÓð	;Ø ›J”#�a”&¬E°!·)±)¸CÀÓ2EÓ,FˆCð �e‘Ó ¨5¡kÓ 1Ü 3 %Ð'9¸$¸u¹+¸ÀeÈDÐQVÉKÈ=ÐXYÐ ZÓ[Ð[Ø ›:Œs�3‹xÐ[¸SÄCÈÃH»_¬C´°C³«MÐ[ÔRUÐVYÓRZÐ[ØˆHƒ}Ø�G‰G‹IˆÞ”R—X’X˜o¨q×1Ñ1Ü 3 %Ð'>Ð ?Ó@Ð@ØˆØˆGƒ|Ü�xŠxÐ,¨a×0Ñ0Ü 3 %Ð'>Ð ?Ó@Ð@Ü˜qÓ! CÓ'Ü 3 %Ð'cÐ dÓeÐeØ�w‰w‹yÐØˆGƒ|Þ”Y—_‘_ Q×'Ñ'Ü 3 %Ð'@Ð AÓBÐBØˆä
ˆ1ƒv�—‘˜ Ó$Ó$Ü˜s˜eÐ#3°D·H±H¸UÀCÓ4HÐ3IÈÐLÓMÐMØ€Høô9 ó 	MÜ 3 %Ð'JÐ KÓLÐLð	Mûô
 ó 	;Ü 3 %Ð'8Ð 9Ó:Ð:ð	;ús   Â#I8 Ã,J É8JÊJ-c                  óÌ   • [        5        n U R                  S[         35        U R                  S[         35        U R                  5         S S S 5        g ! , (       d  f       g = f)Naa  
        CREATE TABLE IF NOT EXISTS schools (
            id                     VARCHAR(64)  NOT NULL PRIMARY KEY,
            name                   VARCHAR(200) NOT NULL,
            director_password_hash VARCHAR(255),
            active                 TINYINT NOT NULL DEFAULT 1,
            created_at             VARCHAR(40)  NOT NULL
        ) zç
        CREATE TABLE IF NOT EXISTS school_settings (
            school_id VARCHAR(64)  NOT NULL,
            `key`     VARCHAR(64)  NOT NULL,
            value     MEDIUMTEXT,
            PRIMARY KEY (school_id, `key`)
        ) )r   Úexecuter   Úcommit)Úconns    r   Úinit_school_tablesrt      sZ   € Ü	Œ�TØ�‰ð ô ˆ/ðô 	ð 	�‰ð ô ˆ/ðô 	ð 	�‰Œ÷! 
�Žús   ‹AAÁ
A#Únamec                 óâ   • SR                  S [        R                  " SU 5       5       5      n[        R                  " SSU5      R                  S5      R                  5       nU=(       d    SS S $ )Nr   c              3   ó^   #   • U  H#  n[         R                  " U5      S :w  d  M  Uv •  M%     g7f)ÚMnN)ÚunicodedataÚcategory)rI   rQ   s     r   rL   Úslugify.<locals>.<genexpr>–   s(   é € ÐdÒ@˜ÄK×DXÒDXÐYZÓD[Ð_cÑDc—1‘1Ò@ùs   ‚-¤	-ÚNFDz[^a-zA-Z0-9]+Ú-Úecoler4   )Újoinry   Ú	normalizerf   Úsubr^   r`   )ru   Úbases     r   Úslugifyrƒ   •   s[   € Ø�7‰7Ñdœk×3Ò3°E¸4Ô@ÓdÓd€DÜ�6Š6Ð" C¨Ó.×4Ñ4°SÓ9×?Ñ?ÓA€DØ�O�G˜S˜bÐ!Ð!r   Úwantedc                 óÀ   • USp2U R                  SU45      R                  5       (       a4  U SU 3nUS-  nU R                  SU45      R                  5       (       a  M4  U$ )NrG   ú SELECT 1 FROM schools WHERE id=?r}   r1   )rq   Úfetchone)rs   r„   ÚslugrJ   s       r   Ú_unique_slugr‰   ›   sd   € Ø�aˆ!Ø
�,‰,Ð9¸D¸7Ó
C×
LÑ
L×
NÑ
NØ�˜˜1˜#ˆˆØ	ˆQ‰ˆð �,‰,Ð9¸D¸7Ó
C×
LÑ
L×
NÓ
Nð €Kr   rˆ   Údirector_passwordÚinitial_settingsc           	      ó¶  • U =(       d    SR                  5       n U (       d  [        S5      eUb   US:w  a  [        U5      S:  a  [        S5      e[        5        nU(       a=  [	        U5      nUR                  SU45      R                  5       (       a  [        S5      eO[        U[	        U 5      5      nUR                  SXU(       a  [        U5      OS [        5       45        [        R                  5        VVs0 s H
  u  pVXVS   _M     nnnXS	'   U=(       d    0 R                  5        H  u  pXU[        ;   d  M   [        XX5      Xu'   M!     UR                  5        H  u  pXUR                  S
XU45        M     UR                  5         S S S 5        [        R                  SX5        [!        U5      $ s  snnf ! [         a     Mœ  f = f! , (       d  f       NF= f)Nr   úThe school name is required.é   ú8The head teacher password must be at least 8 characters.r†   z This school code already exists.z]INSERT INTO schools (id, name, director_password_hash, active, created_at) VALUES (?,?,?,1,?)r   r   zBINSERT INTO school_settings (school_id, key, value) VALUES (?,?,?)zSchool created: %s (%s))r^   r   ri   r   rƒ   rq   r‡   r‰   r	   r
   r@   Úitemsro   rr   ÚlogÚinfoÚ
get_school)	ru   rˆ   rŠ   r‹   rs   Úkrk   ÚvaluesÚvs	            r   Úcreate_schoolr—   £   s¤  € à�J�B×ÑÓ€DÞÜÐ:Ó;Ð;ØÑ$Ð):¸bÓ)@ÄSÐIZÓE[Ð^_ÓE_ÜÐVÓWÐWÜ	Œ�TÞÜ˜4“=ˆDØ�|‰|Ð>ÀÀÓH×QÑQ×SÑSÜ#Ð$FÓGÐGð Tô   ¤g¨d£mÓ4ˆDØ�‰ØkØÖ=NœÐ'8Ô9ÐTXÔZdÓZfÐgô	
ô 5B×4GÑ4GÔ4IÔJÒ4I©¨�!˜)‘_Ò$Ñ4IˆÑJØ $ˆ}ÑØ%×+¨×2Ñ2Ö4‰DˆAØ”MÕ!ðÜ *¨1Ó 0�F“Iñ 5ð —L‘L–N‰DˆAØ�L‰LÐ]Ð`dÐijÐ_kÖlñ #à�‰Œ÷+ 
ô, ‡H�HÐ&¨Ô3Ü�dÓÐùó Køô %ó Úðú÷# 
�úsD   ÁB G
Ã9F3Ä
-G
Ä<F9Å	AG
Æ3G
Æ9
GÇG
ÇGÇG
Ç

Gc                 óT   • U S   U S   [        U S   5      [        U S   5      U S   S.$ )NÚidru   ÚactiveÚdirector_password_hashÚ
created_at)r™   ru   rš   Úhas_director_passwordrœ   )r)   )Úrs    r   Ú_rowrŸ   Ä   s;   € à�‰g˜q ™y´D¸¸8¹Ó4EÜ!% aÐ(@Ñ&AÓ!BÐRSÐT`ÑRañð r   Ú	school_idc                 ó´   • [        5        nUR                  SU 45      R                  5       nS S S 5        W(       a  [        U5      $ S $ ! , (       d  f       N"= f©Nz SELECT * FROM schools WHERE id=?)r   rq   r‡   rŸ   ©r    rs   rž   s      r   r“   r“   Ë   óC   € Ü	Œ�TØ�L‰LÐ;¸i¸\ÓJ×SÑSÓUˆ÷ 
æŒ4�‹7Ð!˜TÐ!÷ 
�úó   ‹"A	Á	
Ac                 ó´   • [        5        nUR                  SU 45      R                  5       nS S S 5        W(       a  [        U5      $ S $ ! , (       d  f       N"= fr¢   )r   rq   r‡   Údictr£   s      r   Úget_school_with_hashr¨   Ñ   r¤   r¥   Úinclude_inactivec                 óê   • [        5        nSU (       a  SOS-   S-   nUR                  U5      R                  5        Vs/ s H  n[        U5      PM     snsS S S 5        $ s  snf ! , (       d  f       g = f)NzSELECT * FROM schoolsr   z WHERE active=1z ORDER BY name COLLATE NOCASE)r   rq   ÚfetchallrŸ   )r©   rs   Úqrž   s       r   Úlist_schoolsr­   ×   sZ   € Ü	Œ�TØ#Ö-=¡rÐCTÑUÐXwÑwˆØ!%§¡¨a£×!9Ñ!9Ô!;Ó<Ò!;˜A”�Q–Ñ!;Ñ<÷ 
‰ùâ<÷ 
�ús   ‹3A$¾AÁA$ÁA$Á$
A2)ru   rš   rŠ   rš   c                ó8  • [        U 5      (       d  [        S5      e[        5        nUbJ  UR                  5       nU(       d  [        S5      eUR	                  SX45        UR	                  SU SU45        Ub  UR	                  SU(       a  SOSU 45        UbQ  US	:X  a  UR	                  S
U 45        O7[        U5      S:  a  [        S5      eUR	                  S[        U5      U 45        UR                  5         S S S 5        [        U 5      $ ! , (       d  f       N= f)NúSchool not found.r�   ú$UPDATE schools SET name=? WHERE id=?úMINSERT OR REPLACE INTO school_settings (school_id, key, value) VALUES (?,?,?)r   z&UPDATE schools SET active=? WHERE id=?r1   r   r   z9UPDATE schools SET director_password_hash=NULL WHERE id=?rŽ   r�   z6UPDATE schools SET director_password_hash=? WHERE id=?)r“   r   r   r^   rq   ri   r	   rr   )r    ru   rš   rŠ   rs   s        r   Úupdate_schoolr²   Ý   s  € ä�i× Ñ ÜÐ/Ó0Ð0Ü	Œ�TØÑØ—:‘:“<ˆDÞÜ#Ð$BÓCÐCØ�L‰LÐ?À$ÐARÔSØ�L‰LÐhØ# ]°DÐ9ô;àÑØ�L‰LÐAÎÁAÐUVÐXaÐCbÔcØÑ(Ø  BÓ&Ø—‘ÐXÐ[dÐZfÕgäÐ(Ó)¨AÓ-Ü'Ð(bÓcÐcØ—‘ÐUÜ+Ð,=Ó>À	ÐJôLà�‰Œ÷% 
ô& �iÓ Ð ÷' 
�ús   ¦CDÄ
Dc                 óð   ^ ^• [         R                  5        VVs0 s H
  u  p#X#S   _M     snnmUU 4S jnUb
  U" U5        T$ [        5        nU" U5        SSS5        T$ s  snnf ! , (       d  f       T$ = f)z;Ajustes del colegio fusionados con los valores por defecto.r   c                 ó~   >• U R                  ST45       H%  nUS   [        ;   d  M  US   c  M  US   TUS   '   M'     g )Nz8SELECT key, value FROM school_settings WHERE school_id=?rU   Úvalue)rq   r@   )rQ   rž   Úoutr    s     €€r   Ú_loadÚget_settings.<locals>._loadý   sD   ø€ Ø—‘ÐUÐXaÐWcÖdˆAØ�‰xœ=Õ(¨Q¨w©ZÓ-CØ ! '¡
��A�e‘H“ò er   N)r@   r�   r   )r    rs   r”   rk   r·   rQ   r¶   s   `     @r   Úget_settingsr¹   ù   ss   ù€ ä-:×-@Ñ-@Ô-BÔ
CÒ-B¡' !ˆ1�9‰oÒÑ-BÒ
C€Cö+ð ÑÙˆdŒð €Jô ŒX˜Ù�!ŒH÷ à€Jùó D÷ ŒXà€Jús   šA Á	A&Á&
A5r•   c                 ó   • [        U 5      (       d  [        S5      e0 nUR                  5        H*  u  p4U[        ;  a  [        SU 35      e[	        X45      X#'   M,     SU;   a  US   (       d  [        S5      e[        5        nUR                  5        H  u  p4UR                  SXU45        M     SU;   a  UR                  SUS   U 45        UR                  5         SSS5        [        U 5      $ ! , (       d  f       N= f)uI   Valida y guarda. Claves desconocidas â†’ error (nada se guarda a medias).r¯   zUnknown setting: r   r�   r±   r°   N)	r“   r   r�   r@   ro   r   rq   rr   r¹   )r    r•   Úcleanr”   r–   rs   s         r   Úupdate_settingsr¼   	  së   € ä�i× Ñ ÜÐ/Ó0Ð0Ø€EØ—‘–‰ˆØ”MÓ!ÜÐ"3°A°3Ð 7Ó8Ð8Ü˜aÓ#ˆ‹ñ ð ˜Ó e¨M×&:ÜÐ:Ó;Ð;Ü	Œ�TØ—K‘K–M‰DˆAØ�L‰LÐhØ#¨Ð*ö,ñ "ð ˜EÓ!Ø�L‰LÐ?À%ÈÑBVÐXaÐAbÔcØ�‰Œ÷ 
ô ˜	Ó"Ð"÷ 
�ús   ÂAC/Ã/
C=Úsettingsc                 óh   • [          Vs0 s H  o[        S5      S [        X   5      _M     sn$ s  snf )uK   Mismas claves que el antiguo PRICING (print_10x15, digital, magic_packâ€¦).Úprice_N)Ú
PRICE_KEYSri   r!   )r½   r”   s     r   Úpricing_from_settingsrÁ     s/   € å;EÓFº:°aŒc�(‹mˆnÐœu X¡[Ó1Ò1¹:ÑFÐFùÒFs   ‰#/Úprice_print_10x15Úprice_print_20x30Úprice_digitalÚ
price_packÚprice_magic_printÚprice_magic_digitalÚprice_magic_pack)zprint-10x15zprint-20x30ÚdigitalÚpackúmagic-printúmagic-digitalú
magic-pack>   rÊ   rÉ   rÍ   rÌ   >   rÍ   rË   rÌ   Úcodec                 ó¨   • [        5        nUR                  SU 45      R                  5       nS S S 5        W(       a  US   $ S $ ! , (       d  f       N= f)Nz+SELECT school_id FROM families WHERE code=?r    )r   rq   r‡   )rÎ   rs   rž   s      r   Úschool_id_for_familyrÐ   2  sC   € Ü	Œ�TØ�L‰LÐFÈÈÓP×YÑYÓ[ˆ÷ 
æˆ1ˆ[‰>Ð( DÐ(÷ 
�ús   ‹"AÁ
Ac                 ó´   • [        U 5      nU(       a   [        [        U5      S   5      $ [        R
                  $ ! [         a     [        R
                  $ f = f)Nr/   )rÐ   r0   r¹   Ú	Exceptionr   ÚPHOTO_RETENTION_DAYS)rÎ   Úsids     r   Úretention_days_for_familyrÕ   8  sW   € Ü
˜tÓ
$€CÞ
ð	Ü”| CÓ(¨Ñ5Ó6Ð6ô ×&Ñ&Ð&øô ó 	ØÜ×&Ñ&Ð&ð	ús   ”; »
AÁAc                 ó”   • SSK Jn  [        U 5      n[        U 5      R	                  SS5      nU=(       d    U" U(       a  US   OS5      $ )uW   Prefijo de los cÃ³digos de familia: el configurado, o las 3 primeras letras del nombre.r   )Úprefix_from_namer8   r   ru   )Úutils.code_generatorr×   r“   r¹   rj   )r    r×   ÚschoolÚ
configureds       r   Úcode_prefix_forrÛ   B  s@   € å5Ü˜	Ó"€FÜ˜iÓ(×,Ñ,Ð-=¸rÓB€JØ×KÑ)¾F¨&°ª.ÈÓKÐKr   )rC   N)NNN)T)N)<Ú__doc__Úloggingrf   ry   Údatetimer   Útypingr   r   Úcorer   Úcore.dbr   r   Úcore.securityr	   Úcore.timeutilr
   Ú	getLoggerr‘   rc   r   r   rÓ   r@   r§   Ú__annotations__ÚDEFAULT_PRICESr�   Ú_kÚ_vÚrstripÚlistÚkeysrÀ   Úcompilerh   r!   rT   ro   rt   rƒ   r‰   r—   rŸ   r“   r¨   r)   r­   r²   r¹   r¼   rÁ   ÚFORMAT_PRICE_KEYÚDIGITAL_FORMATSÚMAGIC_FORMATSrÐ   r0   rÕ   rÛ   r   r   r   Ú<module>rð      sL  ðòó Û 	Û Ý ß  å ß )Ý 'Ý $à×ÒÐ*Ó+€ô	�Jô 	ð,Ø %°bÀ#ÑFð,à &°bÑ9ð,ð  &°bÑ9ð,ð  &°bÑ9ð	,ð
  '°cÀ!ÈCÑPð,ð  %°bÀ#ÑFð,ð  %°bÀ#ÑFð,ð  &°fÑ=ð,ð  &°gÑ>ð,ð  &°gÑ>ð,ð  &°fÑ=ð,ð  %±c¸&×:UÑ:UÓ6VÐ_`ÐilÑmð,ð  %°bÀ#ÑFð,ð  %°bÀ"ÑEð,ð  %°bÀ#ÑFð,ð   7°rÑ:ð!,ð$  (°rÑ:ð%,ð( #*°iÑ@Ø"(°fÑ=Ø"'°cÀ!ÈBÑOò-,€ˆt�C˜˜c 3˜h™Ð'Ñ(ó ð0 ×#Ñ#×)Ñ)Ö+�F€BˆØ!(ÐX[Ñ_bÐceÓ_fÓXf±S¸³W·^±^ÀCÓ5H×5OÑ5OÐPSÔ5TÑloÐprÓlsØ !¨$ñ0€M�"Óñ ,ñ �&×'Ñ'×,Ñ,Ó.Ó/€
Ø�JŠJÐ4Ó5€	ð 3ð ¨5ô ð-�Cð -˜cð - cô -ôdð,"�#ð "˜#ô "ð˜sð  sô ð ]aØ59ñ˜ð  8¨C¡=ð ÈHÐUXÉMð Ø$,¨T¡NðØ>BõðBˆtô ð"˜#ð " (¨4¡.ô "ð" Cð "¨H°T©Nô "ñ= 4ð =°4¸±:õ =ð <@ÐZ^Ø59ò!˜Sð !¨8°C©=ð !ÈÐRVÉð !Ø%-¨c¡]ð!Ø>Bõ!ñ8˜Cð ¨t°C¸°H©~õ ð #˜sð #¨Dð #°T¸#¸s¸(±^ô #ð*G Dð G¨T°#°u°*Ñ-=ô Gð )Ø(Ø$Ø!Ø(Ø*Ø'ñÐ ò E€Ú>€ð)˜sð ) x°¡}ô )ð' Cð '¨Cô 'ðL˜sð L sõ Lr   