§
    ÚŽ’jÀF  ã                   ó  — d Z ddlmZ ddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZmZ ddlmZmZ ddlmZmZ dd	lmZ d
dlm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# erddl$m%Z% ddl&m'Z' neZ%eZ' G d„ de¦  «        Z(dS )z'The DeepSeek chat model implementation.é    )ÚOrderedDict)Údatetime)ÚLiteralÚAnyÚAsyncGeneratorÚTYPE_CHECKINGÚListÚType)Ú	BaseModelÚFieldé   )ÚChatModelBaseÚ_TOOL_CHOICE_LITERAL_MODES)ÚChatResponseÚStructuredResponse)Ú	ChatUsageé   )Ú_generate_id)ÚDeepSeekCredential)ÚFormatterBaseÚDeepSeekChatFormatter)ÚMsgÚThinkingBlockÚToolCallBlockÚ	TextBlock)Ú
ToolChoice)ÚChatCompletion)ÚAsyncStreamc                   ó(  ‡ — e Zd ZU dZ G d„ de¦  «        ZdZed         ed<   	 	 	 	 	 	 	 	 d'de	de
dddedededededz  dee
ef         dz  ddfˆ fd„Zedeee         df         fd„¦   «         Z	 	 d(de
dee         dee         dz  dedz  dedeeedf         z  fd„Zded edeedf         fd!„Zded e defd"„Z!dee         dz  dedz  deee         dz  e
ez  dz  f         fd#„Z"	 d)de
dee         d$ee         ez  dedz  d%ede#fˆ fd&„Z$ˆ xZ%S )*ÚDeepSeekChatModelzThe DeepSeek chat model.c                   ó   — e Zd ZU dZ edddd¬¦  «        Zedz  ed<    edd	d
¬¦  «        Ze	ed<    eddd¬¦  «        Z
ed         dz  ed<    eddddd¬¦  «        Zedz  ed<    eddddd¬¦  «        Zedz  ed<   dS )úDeepSeekChatModel.Parametersz+The parameters for the DeepSeek chat model.Nz
Max Tokensz0The maximum number of tokens for the LLM output.r   )ÚdefaultÚtitleÚdescriptionÚgtÚ
max_tokensFÚThinkingz–Whether to enable thinking mode. When enabled, the model outputs a chain-of-thought reasoning before the final answer via the reasoning_content field.)r#   r$   r%   Úthinking_enablezReasoning Effortz–Controls the depth of reasoning in thinking mode. Supported values: high (default), max. For compatibility, low/medium map to high, xhigh maps to max.)ÚhighÚmaxÚreasoning_effortÚTemperaturez#The temperature for the LLM output.r   )r#   r$   r%   ÚgeÚleÚtemperaturezTop Pz#The top P value for the LLM output.é   )r#   r$   r%   r&   r/   Útop_p)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   ÚintÚ__annotations__r)   Úboolr,   r   r0   Úfloatr2   © ó    úOC:\Projects\DSCons\.venv\Lib\site-packages\agentscope\model\_deepseek\_model.pyÚ
Parametersr"      s?  € € € € € € Ø9Ð9à!& ØØØJØð	"
ñ "
ô "
ˆ
�C˜$‘Jð 	
ð 	
ñ 	
ð !& ØØð:ð	!
ñ !
ô !
ˆ˜ð 	
ð 	
ñ 	
ð ;@¸%ØØ$ð%ð		;
ñ 	;
ô 	;
Ð˜' -Ô0°4Ñ7ð 		
ð 		
ñ 		
ð %* EØØØ=ØØð%
ñ %
ô %
ˆ�U˜T‘\ð 	
ð 	
ñ 	
ð $˜eØØØ=ØØð
ñ 
ô 
ˆˆu�t‰|ð 	
ð 	
ñ 	
ð 	
ð 	
r<   r>   Údeepseek_chatÚtypeNTr   ç      ð?é   Ú
credentialÚmodelÚ
parametersz#DeepSeekChatModel.Parameters | NoneÚstreamÚmax_retriesÚretry_delayÚcontext_sizeÚ	formatterÚclient_kwargsÚreturnc
           	      óD  •— t          ¦   «                              |||p|                      ¦   «         ||||¬¦  «         |pt          ¦   «         | _        |	pi | _        ddl}
 |
j        d| j        j	         
                    ¦   «         | j        j        dœ| j        ¤Ž| _        dS )a’  Initialize the DeepSeek chat model.

        Args:
            credential (`DeepSeekCredential`):
                The DeepSeek credential used to authenticate API calls.
            model (`str`):
                The DeepSeek model name, e.g. ``deepseek-chat``.
            parameters (`DeepSeekChatModel.Parameters | None`, defaults to             `None`):
                The DeepSeek API parameters. When ``None``, the default
                parameters will be used.
            stream (`bool`, defaults to `True`):
                Whether to enable streaming output.
            max_retries (`int`, defaults to `3`):
                The maximum number of retries for the DeepSeek API.
            retry_delay (`float`, defaults to `1.0`):
                Seconds to sleep between retry attempts.
            context_size (`int`, defaults to `65536`):
                The model context size used for context compression.
            formatter (`FormatterBase | None`, defaults to `None`):
                The formatter that converts ``Msg`` objects to the format
                required by the DeepSeek API. When ``None``, a
                ``DeepSeekChatFormatter`` instance will be used.
            client_kwargs (`dict[str, Any] | None`, defaults to `None`):
                Extra keyword arguments forwarded to ``openai.AsyncClient``
                (e.g. ``timeout``, ``default_headers``, ``http_client``).
        )rC   rD   rE   rF   rG   rH   rI   r   N)Úapi_keyÚbase_urlr;   )ÚsuperÚ__init__r>   r   rJ   rK   ÚopenaiÚAsyncClientrC   rN   Úget_secret_valuerO   Úclient)ÚselfrC   rD   rE   rF   rG   rH   rI   rJ   rK   rR   Ú	__class__s              €r=   rQ   zDeepSeekChatModel.__init__O   sÃ   ø€ õN 	‰Œ×ÒØ!ØØ!Ð6 T§_¢_Ñ%6Ô%6ØØ#Ø#Ø%ð 	ñ 	
ô 	
ð 	
ð #Ð=Õ&;Ñ&=Ô&=ˆŒØ*Ð0¨bˆÔàˆˆˆà*<¨&Ô*<ð +
Ø”OÔ+×<Ò<Ñ>Ô>Ø”_Ô-ð+
ð +
ð Ô ð+
ð +
ˆŒˆˆr<   .c                 ó>   — dd l }|j        |j        |j        |j        fS )Nr   )rR   ÚAPIConnectionErrorÚAPITimeoutErrorÚRateLimitErrorÚInternalServerError)ÚclsrR   s     r=   Ú_get_retryable_exceptionsz+DeepSeekChatModel._get_retryable_exceptionsŠ   s/   € àˆˆˆð Ô%ØÔ"ØÔ!ØÔ&ð	
ð 	
r<   Ú
model_nameÚmessagesÚtoolsÚtool_choiceÚgenerate_kwargsc              ‹   ó`  K  — | j                              |¦  «        ƒ d{V —†}||| j        dœ}| j        j        �| j        j        |d<   | j        j        �| j        j        |d<   | j        j        �| j        j        |d<   | j        j        �| j        j        |d<   |                     |¦  «         | j        j	        rdnd}| 
                    d	i ¦  «         |d	          
                    d
i ¦  «         |d	         d
          
                    d|¦  «         |                      ||¦  «        \  }	}
|	r|	|d<   |
�|
|d<   | j        rddi|d<   t          j        ¦   «         } | j        j        j        j        di |¤Žƒ d{V —†}| j        r|                      ||¦  «        S |                      ||¦  «        S )a;  Call the DeepSeek chat completions API.

        Args:
            model_name (`str`):
                The model name to use for this call.
            messages (`list`):
                A list of message dicts with ``role`` and ``content`` keys.
            tools (`list[dict]`, default `None`):
                The tools JSON schemas.
            tool_choice (`ToolChoice | None`, optional):
                Controls which (if any) tool is called by the model.
            **generate_kwargs (`Any`):
                Extra keyword arguments forwarded to the API.

        Returns:
            `ChatResponse | AsyncGenerator[ChatResponse, None]`:
                A ``ChatResponse`` when streaming is disabled, or an async
                generator of ``ChatResponse`` objects when streaming is
                enabled.
        N)rD   r`   rF   r'   r0   r2   r,   ÚenabledÚdisabledÚ
extra_bodyÚthinkingr@   ra   rb   Úinclude_usageTÚstream_optionsr;   )rJ   ÚformatrF   rE   r'   r0   r2   r,   Úupdater)   Ú
setdefaultÚ_format_toolsr   ÚnowrU   ÚchatÚcompletionsÚcreateÚ_parse_stream_responseÚ_parse_completion_response)rV   r_   r`   ra   rb   rc   Úformatted_messagesÚkwargsÚthinking_typeÚ	fmt_toolsÚfmt_tool_choiceÚstart_datetimeÚresponses                r=   Ú	_call_apizDeepSeekChatModel._call_api•   sù  è è € ð8 $(¤>×#8Ò#8¸Ñ#BÔ#BÐBÐBÐBÐBÐBÐBÐð  Ø*Ø”kð"
ð "
ˆð Œ?Ô%Ð1Ø#'¤?Ô#=ˆF�<Ñ àŒ?Ô&Ð2Ø$(¤OÔ$?ˆF�=Ñ!àŒ?Ô Ð,Ø"œoÔ3ˆF�7‰OàŒ?Ô+Ð7Ø)-¬Ô)IˆFÐ%Ñ&à�Š�oÑ&Ô&Ð&ð œÔ8ÐHˆIˆI¸jð 	ð 	×Ò˜,¨Ñ+Ô+Ð+Øˆ|Ô×'Ò'¨
°BÑ7Ô7Ð7Øˆ|Ô˜ZÔ(×3Ò3°F¸MÑJÔJÐJà%)×%7Ò%7¸¸{Ñ%KÔ%KÑ"ˆ	�?àð 	(Ø'ˆF�7‰OàÐ&Ø$3ˆF�=Ñ!àŒ;ð 	?Ø(7¸Ð'>ˆFÐ#Ñ$å!œ™œˆØ<˜œÔ)Ô5Ô<ÐFÐF¸vÐFÐFÐFÐFÐFÐFÐFÐFˆàŒ;ð 	IØ×.Ò.¨~¸xÑHÔHÐHà×.Ò.¨~¸xÑHÔHÐHr<   rz   r{   c                ól  K  — d}t          ¦   «         }t          ¦   «         }t          ¦   «         }t          ¦   «         }|4 ƒd{V —†}|2 3 d{V —†}	t          g d|¬¦  «        }
t          |	dd¦  «        p|}||
_        |	j        rY|	j        }t          |j        |j        t          j
        ¦   «         |z
                       ¦   «         t          |dd¦  «        ¬¦  «        }|	j        s|�||
_        |
W V — Œ©|	j        d         }|j        }t          |dd¦  «        r|
                     ||j        ¬	¦  «         t          |d
d¦  «        r|
                     ||j        ¬¦  «         t          |dd¦  «        pg D ]„}|j        }t          |dd¦  «        }|rt          |dd¦  «        nd}|rt          |dd¦  «        nd}||vr|j        |pdf||<   ||         \  }}|
                     |j        p||p||pd¬¦  «         Œ…|
j        s|r||
_        |
W V — �ŒÆ6 	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )a¿  Parse the DeepSeek streaming response.

        Args:
            start_datetime (`datetime`):
                The start datetime of the response generation.
            response (`AsyncStream`):
                The OpenAI-compatible async stream object.

        Yields:
            `ChatResponse`:
                Incremental ``ChatResponse`` objects with ``is_last=False``
                followed by a final one with ``is_last=True``.
        NF)ÚcontentÚis_lastÚidr€   Úprompt_cache_hit_tokensr   ©Úinput_tokensÚoutput_tokensÚtimeÚcache_input_tokensÚreasoning_content)Úblock_idrh   r~   )rˆ   ÚtextÚ
tool_callsÚfunctionÚnameÚ	argumentsÚunknownÚ )rˆ   rŒ   Úinput)r   r   r   Úgetattrr€   Úusager   Úprompt_tokensÚcompletion_tokensr   ro   Útotal_secondsÚchoicesÚdeltaÚappend_thinkingr‡   Úappend_textr~   ÚindexÚappend_tool_call)rV   rz   r{   r’   Úresponse_idÚtext_idÚthinking_idÚtool_call_mappingrF   ÚchunkÚ	delta_resÚuÚchoicer—   Ú	tool_callrš   ÚfnÚ
delta_nameÚ
delta_argsÚ	stored_idÚstored_names                        r=   rs   z(DeepSeekChatModel._parse_stream_responseá   s«  è è € ð$ ˆÝ'™>œ>ˆÝ#‘~”~ˆÝ'™>œ>ˆå"-¡-¤-Ðàð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$˜vØ%ð M$ð M$ð M$ð M$ð M$ð M$ð M$�eÝ(ØØ!Ø"ðñ ô �	õ & e¨T°4Ñ8Ô8ÐG¸K�Ø*�	”à”;ð Øœ�AÝ%Ø%&¤_Ø&'Ô&9Ý&œl™nœn¨~Ñ=×LÒLÑNÔNÝ+2ØØ5Øñ,ô ,ð		ñ 	ô 	�Eð ”}ð 	ð Ð(Ø*/˜	œØ'˜˜˜˜Øàœ qÔ)�Øœ�õ ˜5Ð"5°tÑ<Ô<ð Ø×-Ò-Ø!,Ø!&Ô!8ð .ñ ô ð õ ˜5 )¨TÑ2Ô2ð Ø×)Ò)Ø!(Ø"œ]ð *ñ ô ð õ ")¨°¸dÑ!CÔ!CÐ!IÀrð ð �IØ%œO�EÝ  ¨J¸Ñ=Ô=�BØ>@Ð!J¥¨¨V°TÑ!:Ô!:Ð!:Àd�JØCEÐ!O¥¨¨[¸$Ñ!?Ô!?Ð!?È4�Jð Ð$5Ð5Ð5à%œLØ&Ð3¨)ð4Ð)¨%Ñ0ð
 .?¸uÔ-EÑ*�I˜{à×.Ò.Ø!*¤Ð!:°Ø'Ð6¨;Ø(Ð.¨Bð /ñ ô ð ð ð Ô$ð $¨ð $Ø&+�I”OØ#�O�O�O�Oùð[  &˜vðN	$ð N	$ð N	$ñ N	$ô N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$ð N	$øøøð N	$ð N	$ð N	$ð N	$ð N	$ð N	$s   ÁH#ÁHÁGH#È#
H-È0H-c           
      óö  — g }|j         rå|j         d         }t          |j        dd¦  «        }t          |t          ¦  «        r%|r#|                     t          |¬¦  «        ¦  «         |j        j        r-|                     t          |j        j        ¬¦  «        ¦  «         |j        j	        pg D ]@}|                     t          |j        |j        j        |j        j        ¬¦  «        ¦  «         ŒAd}|j        rY|j        }t!          |j        |j        t'          j        ¦   «         |z
                       ¦   «         t          |dd¦  «        ¬¦  «        }|d	|d
œ}	t          |dd¦  «        }
|
r|
|	d<   t-          di |	¤ŽS )a€  Parse the DeepSeek non-streaming response.

        Args:
            start_datetime (`datetime`):
                The start datetime of the response generation.
            response (`ChatCompletion`):
                The OpenAI-compatible chat completion object.

        Returns:
            `ChatResponse`:
                A single ``ChatResponse`` with ``is_last=True``.
        r   r‡   N)rh   )r‰   )r€   rŒ   r�   r�   r‚   T)r~   r   r’   r€   r;   )r–   r‘   ÚmessageÚ
isinstanceÚstrÚappendr   r~   r   rŠ   r   r€   r‹   rŒ   r�   r’   r   r“   r”   r   ro   r•   r   )rV   rz   r{   Úcontent_blocksr£   Ú	reasoningr¤   r’   r¢   Úresp_kwargsrœ   s              r=   rt   z,DeepSeekChatModel._parse_completion_responseJ  s¹  € ð" KMˆàÔð 	ØÔ% aÔ(ˆFÝ ¤Ð0CÀTÑJÔJˆIÝ˜)¥SÑ)Ô)ð I¨ið IØ×%Ò%¥m¸YÐ&GÑ&GÔ&GÑHÔHÐHàŒ~Ô%ð NØ×%Ò%¥i°V´^Ô5KÐ&LÑ&LÔ&LÑMÔMÐMà#œ^Ô6Ð<¸"ð ð �	Ø×%Ò%Ý!Ø$œ<Ø&Ô/Ô4Ø'Ô0Ô:ðñ ô ñô ð ð ð ˆØŒ>ð 	Ø”ˆAÝØœ_ØÔ1Ý”l‘n”n ~Ñ5×DÒDÑFÔFÝ#*ØØ-Øñ$ô $ð		ñ 	ô 	ˆEð &ØØð'
ð '
ˆõ
 ˜h¨¨dÑ3Ô3ˆØð 	,Ø +ˆK˜ÑåÐ*Ð*˜kÐ*Ð*Ð*r<   c                 óÐ   ‡— |rA|r?|                       ||¦  «         |j        r"t          |j        ¦  «        Šˆfd„|D ¦   «         }|s|dfS |j        }|t          vr	|dd|idœfS ||fS )aä  Validate, filter, and format tools and tool_choice for the DeepSeek
        API.

        When ``tool_choice.tools`` is specified the schemas list is filtered
        to only those tools. When ``tool_choice.mode`` is a specific tool name
        (str) the model is forced to call exactly that tool without needing to
        filter the list, preserving prompt-cache efficiency.

        Args:
            tools (`list[dict] | None`, optional):
                The raw tool schemas.
            tool_choice (`ToolChoice | None`, optional):
                The tool choice configuration.

        Returns:
            `tuple[list[dict] | None, str | dict | None]`:
                A tuple of (formatted_tools, formatted_tool_choice).
        c                 ó4   •— g | ]}|d          d         ‰v ¯|‘ŒS )r‹   rŒ   r;   )Ú.0ÚtÚalloweds     €r=   ú
<listcomp>z3DeepSeekChatModel._format_tools.<locals>.<listcomp>£  s,   ø€ ÐNÐNÐN˜q¨Q¨z¬]¸6Ô-BÀgÐ-MÐ-M˜Ð-MÐ-MÐ-Mr<   Nr‹   rŒ   )r@   r‹   )Ú_validate_tool_choicera   ÚsetÚmoder   )rV   ra   rb   rº   r¶   s       @r=   rn   zDeepSeekChatModel._format_toolsˆ  s¨   ø€ ð. ð 	O˜5ð 	OØ×&Ò& {°EÑ:Ô:Ð:ØÔ ð OÝ˜kÔ/Ñ0Ô0�ØNÐNÐNÐN EÐNÑNÔN�àð 	Ø˜$�;ÐàÔˆàÕ1Ð1Ð1Ø :¸FÀD¸>ÐJÐJÐJÐJà�dˆ{Ðr<   Ústructured_modelrv   c              ‹   óŒ   •K  — |€| j         j        rt          d¬¦  «        } t          ¦   «         j        d||||dœ|¤Žƒ d{V —†S )a˜  DeepSeek-specific override for structured output.

        DeepSeek rejects ``tool_choice="required"`` or an object-form
        ``tool_choice`` when thinking mode is enabled. In that case we
        default ``tool_choice`` to ``"auto"`` and rely on the base class's
        injected system-reminder prompt to guide the model. When thinking
        is disabled, this falls through to the base implementation.

        Args:
            model_name (`str`):
                The model name to use for this call.
            messages (`list[Msg]`):
                The context for the LLM to generate the structured output.
            structured_model (`Type[BaseModel] | dict`):
                A Pydantic model class or a JSON schema dict describing the
                required output structure.
            tool_choice (`ToolChoice | None`, defaults to `None`):
                The tool_choice forwarded to ``_call_api``. When ``None``
                and thinking mode is enabled, it is downgraded to
                ``ToolChoice(mode="auto")``; otherwise the base default
                (force the structured-output tool) is used.
            **kwargs (`Any`):
                Additional keyword arguments forwarded to ``_call_api``.

        Returns:
            `StructuredResponse`:
                The structured response whose ``content`` is the validated
                output dict matching ``structured_model``.
        NÚauto)rº   )r_   r`   r»   rb   r;   )rE   r)   r   rP   Ú _call_api_with_structured_output)rV   r_   r`   r»   rb   rv   rW   s         €r=   r¾   z2DeepSeekChatModel._call_api_with_structured_output¯  sƒ   øè è € ðJ Ð 4¤?Ô#BÐÝ$¨&Ð1Ñ1Ô1ˆKØ=•U‘W”WÔ=ð 
Ø!ØØ-Ø#ð	
ð 
ð
 ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r<   )NTr   rA   rB   NN)NN)N)&r3   r4   r5   r6   r   r>   r@   r   r8   r   r­   r9   r7   r:   r   Údictr   rQ   ÚclassmethodÚtupler
   Ú	Exceptionr^   Úlistr   r   r   r   r|   r   r   rs   r   rt   rn   r   r¾   Ú__classcell__)rW   s   @r=   r    r       s&  ø€ € € € € € Ø"Ð"ð-
ð -
ð -
ð -
ð -
�Yñ -
ô -
ð -
ð^ &5€Dˆ'�/Ô
"Ð4Ð4Ñ4Ø%ð =AØØØ Ø!Ø*.Ø/3ð9
ð 9
à&ð9
ð ð9
ð :ð	9
ð
 ð9
ð ð9
ð ð9
ð ð9
ð ! 4Ñ'ð9
ð ˜C ˜H”~¨Ñ,ð9
ð 
ð9
ð 9
ð 9
ð 9
ð 9
ð 9
ðv ð
¨%°°Y´ÀÐ0DÔ*Eð 
ð 
ð 
ñ „[ð
ð $(Ø)-ðJIð JIàðJIð �s”)ðJIð �DŒz˜DÑ ð	JIð
   $Ñ&ðJIð ðJIð 
˜ |°TÐ'9Ô:Ñ	:ðJIð JIð JIð JIðXg$à ðg$ð ðg$ð 
˜ dÐ*Ô	+ð	g$ð g$ð g$ð g$ðR<+à ð<+ð !ð<+ð 
ð	<+ð <+ð <+ð <+ð|%à�DŒz˜DÑ ð%ð   $Ñ&ð%ð 
ˆt�DŒz˜DÑ  #¨¡*¨tÑ"3Ð3Ô	4ð	%ð %ð %ð %ðX *.ð-
ð -
àð-
ð �s”)ð-
ð ˜yœ/¨DÑ0ð	-
ð
   $Ñ&ð-
ð ð-
ð 
ð-
ð -
ð -
ð -
ð -
ð -
ð -
ð -
ð -
ð -
r<   r    N))r6   Úcollectionsr   r   Útypingr   r   r   r   r	   r
   Úpydanticr   r   Ú_baser   r   Ú_model_responser   r   Ú_model_usager   Ú_utils._commonr   rC   r   rJ   r   r   r«   r   r   r   r   Útoolr   Úopenai.types.chatr   rR   r   r    r;   r<   r=   ú<module>rÎ      s¢  ðà -Ð -Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jà %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø $Ð $Ð $Ð $Ð $Ð $Ø *Ð *Ð *Ð *Ð *Ð *Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ Ð Ð Ð Ð Ð àð Ø0Ð0Ð0Ð0Ð0Ð0Ø"Ð"Ð"Ð"Ð"Ð"Ð"à€NØ€KðB
ð B
ð B
ð B
ð B
˜ñ B
ô B
ð B
ð B
ð B
r<   