Ë
    Š‰ŒjcB  ã                   óÖ  — d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
  ee«      j                  «       j                  Zej                  j                  dz  dz  dz  dz  Zej                  j                  dz  dz  d	z  Z eej$                  j'                  d
d«      «      ZdddœZg d¢ZdddddœiZd„ Zi ddidœdhdddddœdœdœZd„ Zd „ Zd!„ Zd"„ Zed#k(  r e«        yy)$uÙ  
Neural TTS for the broadcast commentary â€” high-quality, multi-language (Google Cloud TTS).

Pre-renders every commentary line, in every language carried on the events' `i18n` dict, to an MP3
using a neural Google voice, so the broadcast plays consistent high-quality audio independent of
whatever (often poor or absent) voices a viewer's browser has. The browser Web Speech API stays as
the zero-setup fallback when a clip is missing.

Output (kept OUT of the feed so the scoring golden file stays byte-stable):
    <demo>/data/audio/<lang>/<sha1>.mp3        one clip per unique line per language
    <demo>/data/audio/index.json               { lang: { "<line text>": "<lang>/<sha1>.mp3" } }
The renderer loads index.json and, for the on-screen line + selected language, plays the clip.

Three commentator roles per language: Lead Commentator reads race facts and transitions, Tactical
Analyst explains verified manoeuvres and outcomes, and Rules Analyst supplies restrained rules
context without making umpire decisions. Legacy `voice="m"|"f"` feeds map to lead/tactical.

Idempotent: clips are named by a hash of (voice, rate, text) so re-runs only synthesize new/changed
lines. The best neural voice per language/gender is auto-selected (Chirp/Studio > Neural2 > Wavenet
> Standard) unless overridden via TTS_VOICE_<LANG>_M / TTS_VOICE_<LANG>_F (or legacy TTS_VOICE_<LANG>,
taken as the female/default voice) env vars.

  Pipeline:  export_team_race.py  ->  (score_race enrich)  ->  live/tts/synth.py
  Auth:      gcloud auth application-default login          (org policy blocks SA keys; ~1 h)
  Run:       ..\..\..\.venv-demo\Scripts\python.exe live/tts/synth.py
             (optional path arg to a feed json; defaults to the demo's real.json)
             --lang sv   re-render only some language(s); others keep their existing index.json clips

Pronunciation: a neural voice still reads word-by-word with no sentence context, so per-language SSML
fixes (see PRONUNCIATION + to_ssml) spell out acronyms (OCS) and pin homographs (Swedish "banan" = the
course, not the fruit); team names whose feed `nameLang` differs from the spoken language are wrapped
in <lang> so e.g. an English name is said in English. Names are read from the feed, never hardcoded.
é    N)ÚPath)ÚtexttospeechÚdemoÚdataÚracesz	real.jsonÚaudioÚTTS_RATEz1.03zen-GBzsv-SE)ÚenÚsv))ÚChirp3é   )ÚChirpr   )ÚStudioé   )ÚNeural2é   )ÚWaveneté   )ÚStandardé   r
   zen-GB-Studio-Bzen-GB-Studio-Czen-GB-Neural2-O)ÚleadÚtacticalÚrulesc                 óh   — t         D ])  \  }}|j                  «       | j                  «       v sŒ'|c S  y)Nr   )Ú_TIERÚlower)ÚnameÚkeyÚranks      ú</srv/vr/releases/25f455cc4e75/v3/broadcast/live/tts/synth.pyÚ_tierr!   A   s3   € Üò ‰	ˆˆTØ�9‰9‹;˜$Ÿ*™*›,Ò&ØŠKðð ó    Úliveu   laÉªv)ÚabbrevÚipaÚOCSu
   ËˆbÉ‘Ë�nanu   ËˆÉ¡Éªpau	   ËˆÉ¡Éªparu   Ëˆtajt)ÚbananÚgippaÚgipparÚtightc                 óX   — t        t        j                  | «      «      xs t        |«      S )z\True if any pronunciation fix could fire for this language (so the voice must support SSML).)ÚboolÚPRONUNCIATIONÚget)ÚlangÚforeign_namess     r    Úlang_uses_ssmlr1   f   s"   € ä”×!Ñ! $Ó'Ó(Ò?¬D°Ó,?Ð?r"   c           	      ó¸  — t         j                  | «      xs i }|j                  d«      xs dD �ch c]  }|j                  «       ’Œ }}|j                  d«      xs i j                  «       D ��ci c]  \  }}|j	                  «       |“Œ }}}i i }
}	|D ]1  }|d   |d   }}|sŒ||	|<   t        |«      dkD  sŒ$|d   sŒ*|d   |
|<   Œ3 t        |	t
        d¬«      }|rd	d
j                  d„ |D «       «      z   dz   nd}|rd|› d�nddz   }g d}}t        j                  ||«      D �]‹  }|j                  |j                  «       }}|dk(  rJ||
v rF|j                  dt        j                  |
|   d¬«      › dt        j                  |«      › d�«       d}Œo|dk(  rF|j                  dt        j                  |	|   d¬«      › dt        j                  |«      › d�«       d}Œº|dk(  r=|j                  «       |v r+|j                  dt        j                  |«      › d�«       d}Œü|dk(  rg|j	                  «       |v rU|j                  dt        j                  ||j	                  «          d¬«      › dt        j                  |«      › d�«       d}�Œh|j                  t        j                  |«      «       �ŒŽ |s|dfS ddj                  |«      z   dz   dfS c c}w c c}}w )uG  Wrap `text` as SSML applying this language's pronunciation fixes plus foreign-language
    names. `foreign_names` entries are (name, bcp47) or (name, bcp47, ipa), read from the feed's
    teams (`nameLang`/`ipa`) or the venue's spoken names (`event_config.venue_speech_names`) â€”
    never baked into this file. A name WITH an IPA transcription is emitted as <phoneme> â€” the tag
    the Studio voices accept â€” while a name without one falls back to <lang xml:lang="â€¦">, which
    Studio voices REJECT whole-line (the caller's per-line fallback then loses every fix in that
    line to plain text). So a venue that must speak on Studio voices supplies IPA per name.
    Returns (payload, is_ssml); when nothing fires it returns the plain text unchanged, so an
    unaffected line renders (and hashes) identically to a no-rules build.r$   © r%   r   r   r   T©r   Úreversez\b(?:ú|c              3   óF   K  — | ]  }t        j                  |«      –— Œ y ­w©N)ÚreÚescape)Ú.0Úns     r    ú	<genexpr>zto_ssml.<locals>.<genexpr>�   s   è ø€ Ò#@°Q¤B§I¡I¨a§LÑ#@ùs   ‚!z)\bNz	(?P<name>z)|Ú z(?P<word>\w+)|(?P<other>\W+)Fr   z<phoneme alphabet="ipa" ph=")Úquotez">z
</phoneme>z<lang xml:lang="z</lang>Úwordz"<say-as interpret-as="characters">z	</say-as>z<speak>z</speak>)r-   r.   ÚupperÚitemsr   ÚlenÚsortedÚjoinr9   ÚfinditerÚ	lastgroupÚgroupÚappendÚhtmlr:   )r/   Útextr0   r   Úar$   ÚkÚvr%   ÚnamelangÚnameipaÚentryÚnmÚlgÚnamesÚname_altÚpatÚpartsÚfiredÚmÚgÚss                         r    Úto_ssmlr\   k   sÂ  € ô ×Ñ˜dÓ#Ò) r€EØ"'§)¡)¨HÓ"5Ò";¸Ö=˜Aˆa�g‰g�iÐ=€FÐ=Ø%*§Y¡Y¨uÓ%5Ò%;¸×$BÑ$BÓ$D×
E™D˜A˜qˆ1�7‰7‹9�a‰<Ð
E€CÑ
EØ˜Bˆg€HØò #ˆØ�q‘˜5 ™8ˆBˆÙØØˆ�‰Üˆu‹:˜‹>˜e A›hØ ™(ˆG�BŠKð#ô �8¤¨dÔ3€EÙNS�˜3Ÿ8™8Ñ#@¸%Ô#@Ó@Ñ@À6ÒIÐY]€HÙ'/ˆY�x�j Ñ#°RÐ;ZÑ
Z€CØ�uˆ5€EÜ�[‰[˜˜dÓ#ó )ˆØ�{‰{˜AŸG™G›Iˆ1ˆØ�Š;˜1 ™<Ø�L‰LÐ7¼¿¹ÀGÈAÁJÐVZÔ8[Ð7\Ð\^Ü ŸK™K¨›NÐ+¨:ð7ô 8à‰EØ�&Š[Ø�L‰LÐ+¬D¯K©K¸À¹È4Ô,PÐ+QÐQSÔTX×T_ÑT_Ð`aÓTbÐScÐcjÐkÔlØ‰EØ�&Š[˜QŸW™W›Y¨&Ñ0Ø�L‰LÐ=¼d¿k¹kÈ!»nÐ=MÈYÐWÔXØ‰EØ�&Š[˜QŸW™W›Y¨#Ñ-Ø�L‰LÐ7¼¿¹ÀCÈÏÉË	ÁNÐZ^Ô8_Ð7`Ð`bÔcg×cnÑcnÐopÓcqÐbrÐr|Ð}Ô~ØŠEà�L‰LœŸ™ Q›Ö(ð!)ñ" Ø�Uˆ{ÐØ�r—w‘w˜u“~Ñ%¨
Ñ2°DÐ8Ð8ùòC >ùÛ
Es   ±KÁ0Kc                 ó’  ‡‡‡— t         |   }| j                  |¬«      j                  Š‰st        d|› �«      ‚‰D �ch c]  }|j                  ’Œ }}t
        j                  j                  }t
        j                  j                  }ˆfd„}|j                  «       }t        j                  j                  d|› �«      }	 ||«       ||«      }}
t        j                  |i «      }t        j                  j                  d|› d�«      xsR t        j                  j                  d|› d�«      xs- |j                  d«      |v r|j                  d«      ndxs |
d	   Št        j                  j                  d|› d
�«      xsV t        j                  j                  d|› d�«      xs1 |	xs- |j                  d«      |v r|j                  d«      ndxs |d	   Št        j                  j                  d|› d�«      xsA |j                  d«      |v r|j                  d«      ndxs t        ˆˆfd„|
|z   D «       ‰«      }‰‰|‰‰|dœS c c}w )aÚ  Return a deterministic voice for lead, tactical, and rules commentary roles.

    Deterministic and stable across runs (the broadcast must never drift across several voices):
    highest tier, ties broken by name, Chirp/Chirp3 always excluded (so the pick is independent of
    whether SSML pronunciation fixes fire). Pin exact voices via TTS_VOICE_<LANG>_M / TTS_VOICE_<LANG>_F
    (legacy TTS_VOICE_<LANG> = the female/default) to lock them harder than the auto-pick.
    )Úlanguage_codezno Google voices for c                 ó(  •— ‰D �cg c]  }|j                   | k(  sŒ|‘Œ c}xs ‰}|D �cg c]!  }d|j                  j                  «       vsŒ |‘Œ# c}xs |}|j                  d„ d¬«       |D �cg c]  }|j                  ‘Œ c}S c c}w c c}w c c}w )NÚchirpc                 óD   — t        | j                  «      | j                  fS r8   )r!   r   )rN   s    r    ú<lambda>z-pick_voices.<locals>.ranked.<locals>.<lambda>´   s   € ¤%¨¯©£-°·±Ð!8€ r"   Tr4   )Ússml_genderr   r   Úsort)ÚgenderrN   ÚcandsÚvoicess      €r    Úrankedzpick_voices.<locals>.rankedª   sƒ   ø€ Ø"Ö>�q a§m¡m°vÓ&=’Ò>ÒHÀ&ˆð
 "ÖC�q W°A·F±F·L±L³NÒ%B’ÒCÒLÀuˆð 	�
‰
Ñ8À$ˆ
ÔGØ %Ö&˜1�—“Ò&Ð&ùò ?ùò
 Dùò
 's   †B›Bª!B
ÁB
Á/BÚ
TTS_VOICE_Ú_LEADÚ_Mr   Nr   Ú	_TACTICALÚ_Fr   Ú_RULESr   c              3   ó0   •K  — | ]  }|‰‰hvsŒ
|–— Œ y ­wr8   r3   )r;   r   r   r   s     €€r    r=   zpick_voices.<locals>.<genexpr>Â   s   øè ø€ ÒQ˜4°DÀÀxÐ@PÒ4P”$ÑQùs   ƒ�)r   r   r   rY   ÚfÚr)Ú	LANG_CODEÚlist_voicesrg   Ú
SystemExitr   r   ÚSsmlVoiceGenderÚFEMALEÚMALErA   ÚosÚenvironr.   ÚPROVISIONAL_ROLE_VOICESÚnext)Úclientr/   ÚcodeÚvoiceÚ	availableÚFÚMrh   ÚupÚlegacyÚmaleÚfemaleÚcuratedr   r   r   rg   s                 @@@r    Úpick_voicesr‡   š   s-  ú€ ô �T‰?€DØ×Ñ¨dÐÓ3×:Ñ:€FÙÜÐ0°°Ð7Ó8Ð8Ø)/Ö0 �—“Ð0€IÐ0Ü×$Ñ$×+Ñ+€AÜ×$Ñ$×)Ñ)€Aô'ð 
�‰‹€BÜ�Z‰Z�^‰^˜j¨¨Ð-Ó.€FÙ˜!“9™f Q›iˆ&€DÜ%×)Ñ)¨$°Ó3€GÜ�J‰J�N‰N˜Z¨ t¨5Ð1Ó2ò ^´b·j±j·n±nÀzÐRTÐQUÐUWÐEXÓ6Yò ^Ø'.§{¡{°6Ó':¸iÑ'G�—‘˜FÔ#ÈTò^ØVZÐ[\ÑV]ð 	ä—
‘
—‘ ¨B¨4¨yÐ9Ó:ò ¼b¿j¹j¿n¹nÈzÐZ\ÐY]Ð]_ÐM`Ó>aò ØòØ9@¿¹ÀZÓ9PÐT]Ñ9]˜gŸk™k¨*Ô5Ðcgòà˜!‘9ð ô �Z‰Z�^‰^˜j¨¨¨FÐ3Ó4ò YØ)0¯©°WÓ)=ÀÑ)J�—‘˜WÔ%ÐPTòYÜY]ÜQ 4¨&¡=ÔQÐSWóZYð 
ð  h¸ÀTÐPXÐ_dÑeÐeùò; 1s   ½Ic                  óÊ  — t        j                  d¬«      } | j                  ddt        t        «      d¬«       | j                  dd¬	«       | j                  «       }t        |j                  «      j                  «       }t        |d
¬«      5 }t        j                  |«      }d d d «       j                  dg «      }t        |D ��ch c]  }|j                  d«      xs i D ]  }|’Œ Œ  c}}«      xs dg}|j                  rv|j                  j                  d«      D �	ch c]#  }	|	j!                  «       sŒ|	j!                  «       ’Œ% }
}	|D �cg c]	  }||
v sŒ|‘Œ }}|st#        d|j                  ›d�«      ‚|st%        d«       y t'        j(                  «       }t*        dz  }	 t        |d
¬«      5 }t        j                  |«      }d d d «       d}|j                  dg «      }|D �]i  }|t.        vrt%        d|› d�«       Œ|D �cg c]W  }|j                  d«      rD|j                  d«      r3|d   |k7  s|j                  d«      r|d   |d   |j                  d«      f‘ŒY }}t1        ||«      }t3        ||«      }|j5                  «       D ��ci c]$  \  }}|t'        j6                  t.        |   |¬«      “Œ& }}}t'        j8                  t&        j:                  j<                  t>        ¬«      }t*        |z  }|jA                  dd¬«       jC                  |i «       i }|D ]‹  }|j                  d«      xs i j                  |d«      j!                  «       }|sŒ9|j                  d «      d!k(  rd"n|j                  d «      d#k(  rd$nd%}|jC                  ||j                  d&«      xs |«       Œ� tE        |j5                  «       d'¬(«      D �]W  \  }\  }}||   }tG        jH                  d)d*|«      }|rtK        |||«      n|d+f\  } }!tM        jN                  |› d,t>        › d,| › �jQ                  «       «      jS                  «       d d- }"|› d.|"› d/�}#t*        |#z  }$|$jU                  «       s{|!rt'        jV                  | ¬0«      nt'        jV                  | ¬1«      }%	 |jY                  |%||   |¬2«      }&t        |$d6«      5 }'|'j]                  |&j^                  «       d d d «       |d'z  }|#||   |<   |d7z  dk(  s|ta        |«      k(  s�Œ8t%        d8|› d9|› d.ta        |«      › d:�d¬;«       �ŒZ t%        d<|› d=|d"   › d>|d%   › d?|d$   › d@ta        |«      › �
«       �Œl t*        jA                  dd¬«       t        |dAd
¬«      5 }t        jb                  |d+d¬B«       d d d «       t%        dC|› dD|› dE|› �«       y # 1 sw Y   �ŒxY wc c}}w c c}	w c c}w # 1 sw Y   �ŒxY w# t,        $ r i }Y �Œw xY wc c}w c c}}w # tZ        $ rK}|!s‚ t%        d3|› d4|› d5�«       |jY                  t'        jV                  |¬1«      ||   |¬2«      }&Y d }~�Œ™d }~ww xY w# 1 sw Y   �Œ{xY w# 1 sw Y   ŒÉxY w)FNz;Pre-render broadcast commentary clips via Google Cloud TTS.)ÚdescriptionÚfeedú?z#feed json (default: demo real.json))ÚnargsÚdefaultÚhelpz--langz˜comma-separated language(s) to (re)render, e.g. 'sv'. Default = every language in the feed; languages NOT rendered keep their existing index.json clips.)rŽ   zutf-8)ÚencodingÚeventsÚi18nr
   ú,z--lang z% matched none of the feed's languageszno events to synthesizez
index.jsonr   Úteamsz	  (skip 'z': no language code mapping)r   ÚnameLangr%   )r^   r   )Úaudio_encodingÚspeaking_rateT)ÚparentsÚexist_okr>   r~   rY   r   rq   r   r   ÚcommentaryRoler   )Ústartu	   \s*â€”\s*z, Fr6   é   ú/z.mp3)Ússml)rK   )Úinputr~   Úaudio_configz    (SSML rejected for a 'z' line: z; falling back to plain text)Úwbé   z    z: prepared z lines)Úflushz  z: lead=z  tactical=z  rules=z  lines=Úw)Úensure_asciiÚindentzsynthesized z new clips across z -> )2ÚargparseÚArgumentParserÚadd_argumentÚstrÚDEFAULT_FEEDÚ
parse_argsr   rŠ   ÚresolveÚopenÚjsonÚloadr.   rD   r/   ÚsplitÚstriprt   Úprintr   ÚTextToSpeechClientÚ	AUDIO_DIRÚFileNotFoundErrorrr   r1   r‡   rB   ÚVoiceSelectionParamsÚAudioConfigÚAudioEncodingÚMP3ÚRATEÚmkdirÚ
setdefaultÚ	enumerater9   Úsubr\   ÚhashlibÚsha1ÚencodeÚ	hexdigestÚexistsÚSynthesisInputÚsynthesize_speechÚ	ExceptionÚwriteÚaudio_contentrC   Údump)(ÚapÚargsÚ	feed_pathrp   rŠ   r�   ÚeÚlngÚlangsÚxÚwantr|   Ú
index_pathÚindexÚn_newr“   r/   ÚtÚforeignÚuse_ssmlrT   ÚrolerR   rg   ÚcfgÚout_dirÚrole_ofrƒ   Úline_numberrK   Ú
voice_nameÚspokenÚpayloadÚis_ssmlÚhÚrelÚpathÚinpÚrespÚouts(                                           r    Úmainrç   Æ   s:  € Ü	×	 Ñ	 Ð-jÔ	k€BØ‡O�O�F #¬s´<Ó/@ÐGl€OÔmØ‡O�O�Hð $x€Oô yà�=‰=‹?€DÜ�T—Y‘Y“×'Ñ'Ó)€IÜ	ˆi 'Ô	*ð ¨aÜ�y‰y˜‹|ˆ÷à�X‰X�h Ó#€FÜ ×I˜A°A·E±E¸&³MÒ4GÀRÒI¨C’CÐI�CÓIÓJÒTÈtÈf€EØ‡y‚yØ#'§9¡9§?¡?°3Ó#7ÖE˜a¸1¿7¹7½9�—‘•	ÐEˆÐEØ %Ö5˜¨°ª’Ð5ˆÐ5ÙÜ˜w t§y¡y mÐ3XÐYÓZÐZÙÜÐ'Ô(Øä×,Ñ,Ó.€Fô ˜\Ñ)€JðÜ�* wÔ/ð 	!°1Ü—I‘I˜a“LˆE÷	!ð €Eð �H‰H�W˜bÓ!€EØó 9?ˆØ”yÑ Ü�I˜d˜VÐ#?Ð@ÔAØØEJö @ÀØ—e‘e˜F”m¨¯©¨jÔ(9Ø˜*™¨Ò-°·±°u´ð �f‘I˜q ™}¨a¯e©e°E«lÒ;ð @ˆð @ô " $¨Ó0ˆÜ˜F DÓ)ˆà"'§+¡+£-÷1Ù�d˜Bð œ×9Ñ9Ì	ÐRVÉÐ^`ÔaÑað 1ˆñ 1ä×&Ñ&´l×6PÑ6P×6TÑ6TÔdhÔiˆÜ˜dÑ"ˆØ�‰˜d¨TˆÔ2ð 	×Ñ˜˜rÔ"ð ˆØò 	IˆAØ—‘�v“Ò$ "×)Ñ)¨$°Ó3×9Ñ9Ó;ˆAÚØ#$§5¡5¨£>°SÒ#8™ÈÏÉÈwËÐ[^ÒI^¹gÐdn�Ø×"Ñ" 1 a§e¡eÐ,<Ó&=Ò&GÀÕHð		Iô
 *3°7·=±=³?È!Ô)Ló 	^Ñ%ˆK™˜$ Ø˜t™ˆJä—V‘V˜L¨$°Ó5ˆFÙAIœw t¨V°WÔ=ÐPVÐX]ÈÑˆG�Wô —‘ 
˜|¨1¬T¨F°!°G°9Ð=×DÑDÓFÓG×QÑQÓSÐTWÐUWÐXˆAØ�F˜!˜A˜3˜dÐ#ˆCÜ˜s‘?ˆDØ—;‘;”=ÙDK”|×2Ñ2¸Õ@Ü(×7Ñ7¸WÔEð ð	nØ!×3Ñ3¸#ÀVÈDÁ\Ð`cÐ3Ód�Dô ˜$ Ó%ð 2¨Ø—I‘I˜d×0Ñ0Ô1÷2à˜‘
�Ø #ˆE�$‰K˜Ñð ˜RÑ 1Ò$¨´s¸7³|Ô(CÜ˜˜T˜F +¨k¨]¸!¼CÀ»L¸>ÈÐPÐX\×]ð=	^ô> 	��4�&˜  f¡˜¨k¸%À
Ñ:KÐ9Lð MØ˜W‘~Ð& h¬s°7«|¨nð>ö 	?ðq9?ôv ‡O�O˜D¨4€OÔ0Ü	ˆj˜#¨Ô	0ð :°AÜ�	‰	�%˜¨°qÕ9÷:ä	ˆL˜˜Ð1°%°¸¸Z¸LÐ
IÕJ÷sñ üó JùâEùÚ5÷	!ñ 	!ûäò Ø‹ðüò@ùó
1øô> !ò nÙ"Øô Ð6°t°f¸HÀQÀCÐGdÐeÔfØ!×3Ñ3Ü*×9Ñ9¸vÔFÈfÐUYÉlÐilð 4ó n–Dûðnú÷2ñ 2ú÷:ð :ús’   ÂV.Ã#V;
ÄWÄ5WÅ	WÅWÆ$W Æ1WÇW ÈAW*Ê)W/ÒW5Ò7YÕ7YÖ.V8×W×W ×W'×&W'×5	Y	×>A YÙY	ÙYÙY"Ú__main__)Ú__doc__r¦   r¿   rJ   r®   rx   r9   Úpathlibr   Úgoogle.cloudr   Ú__file__r¬   ÚparentÚHERErª   r´   Úfloatry   r.   rº   rr   r   rz   r!   r-   r1   r\   r‡   rç   Ú__name__r3   r"   r    ú<module>rñ      s0  ðñ óB Û Û Û Û 	Û 	Ý å %áˆHƒ~×ÑÓ×&Ñ&€Ø�{‰{×!Ñ! FÑ*¨VÑ3°gÑ=ÀÑK€Ø�K‰K×Ñ Ñ'¨&Ñ0°7Ñ:€	ÙˆR�Z‰Z�^‰^˜J¨Ó/Ó0€Ø 'Ñ,€	ò 	f€ð 	Ø Ø$Ø"ñðÐ òð( ð ˜Ð ñ	ð �'à!ØØ!Øñ	
ññ€ò&@ò
,9ò^)fòX`KðF ˆzÒÙ…Fð r"   