§
    ‚Štj†  ã                   óX  — d Z ddlZddl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 ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlmZ ddlmZmZ ddlmZ  ej        e¦  «        Z G d„ dej         ¦  «        Z! G d„ dej         ¦  «        Z" G d„ dej#        ¦  «        Z$ G d„ dej#        ¦  «        Z% G d„ de¦  «        Z&e G d„ de¦  «        ¦   «         Z' G d„ de'¦  «        Z( ed¬¦  «         G d „ d!e'¦  «        ¦   «         Z) ed"¬¦  «         G d#„ d$e'e¦  «        ¦   «         Z*d$dgZ+dS )%z/PyTorch TrOCR decoder model (based on RoBERTa).é    N)Únn)ÚCrossEntropyLossé   )ÚACT2FN)ÚCacheÚDynamicCacheÚEncoderDecoderCache)ÚGenerationMixin)Úcreate_bidirectional_maskÚcreate_causal_mask)ÚGradientCheckpointingLayer)Ú)BaseModelOutputWithPastAndCrossAttentionsÚ!CausalLMOutputWithCrossAttentions)ÚPreTrainedModel)Úauto_docstringÚloggingé   )ÚTrOCRConfigc                   ób   ‡ — e Zd ZdZdedefˆ fd„Z	 ddej        ded	ej        dz  fˆ fd
„Zˆ xZ	S )ÚTrOCRLearnedPositionalEmbeddingzN
    This module learns positional embeddings up to a fixed maximum size.
    Únum_embeddingsÚembedding_dimc                 ój   •— d| _         t          ¦   «                              || j         z   |¦  «         d S ©Né   )ÚoffsetÚsuperÚ__init__)Úselfr   r   Ú	__class__s      €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/trocr/modeling_trocr.pyr   z(TrOCRLearnedPositionalEmbedding.__init__*   s3   ø€ ð ˆŒÝ‰Œ×Ò˜¨$¬+Ñ5°}ÑEÔEÐEÐEÐEó    r   NÚ	input_idsÚpast_key_values_lengthÚposition_idsc                 ó0  •— |€V|j         dd…         \  }}t          j        |||z   t          j        | j        j        ¬¦  «                             |d¦  «        }n|                     d¦  «        }t          ¦   «          	                    || j
        z   ¦  «        S )z3`input_ids' shape is expected to be [bsz x seqlen].Nr   )ÚdtypeÚdeviceéÿÿÿÿr   )ÚshapeÚtorchÚarangeÚlongÚweightr(   ÚexpandÚ	unsqueezer   Úforwardr   )r   r#   r$   r%   ÚbszÚseq_lenr    s         €r!   r1   z'TrOCRLearnedPositionalEmbedding.forward0   s“   ø€ ð
 ÐØ$œ?¨2¨A¨2Ô.‰LˆC�Ý œ<Ø&Ð(>ÀÑ(HÕPUÔPZÐcgÔcnÔcuðñ ô çŠf�S˜"‰oŒoð ˆLð (×1Ò1°!Ñ4Ô4ˆLå‰wŒw�Š˜|¨d¬kÑ9Ñ:Ô:Ð:r"   )r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r+   ÚTensorr1   Ú__classcell__©r    s   @r!   r   r   %   sª   ø€ € € € € ðð ðF sð F¸3ð Fð Fð Fð Fð Fð Fð mqð;ð ;Øœð;Ø?Bð;ØV[ÔVbÐeiÑVið;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r"   r   c            
       óV   ‡ — e Zd ZdZddededededz  fˆ fd„Zd	ej        fˆ fd
„Z	ˆ xZ
S )ÚTrOCRScaledWordEmbeddingz\
    This module overrides nn.Embeddings' forward by multiplying with embeddings scale.
    ç      ð?r   r   Úpadding_idxÚembed_scaleNc                 ó\   •— t          ¦   «                              |||¦  «         || _        d S ©N)r   r   r@   )r   r   r   r?   r@   r    s        €r!   r   z!TrOCRScaledWordEmbedding.__init__F   s-   ø€ Ý‰Œ×Ò˜¨¸ÑDÔDÐDØ&ˆÔÐÐr"   r#   c                 óV   •— t          ¦   «                              |¦  «        | j        z  S rB   )r   r1   r@   )r   r#   r    s     €r!   r1   z TrOCRScaledWordEmbedding.forwardJ   s!   ø€ Ý‰wŒw�Š˜yÑ)Ô)¨DÔ,<Ñ<Ð<r"   )r>   )r4   r5   r6   r7   r8   Úfloatr   r+   r9   r1   r:   r;   s   @r!   r=   r=   A   s–   ø€ € € € € ðð ð'ð ' sð '¸3ð 'ÈSð 'Ð_dÐgkÑ_kð 'ð 'ð 'ð 'ð 'ð 'ð= ¤ð =ð =ð =ð =ð =ð =ð =ð =ð =ð =r"   r=   c            	       óÒ   ‡ — e Zd ZdZddedededz  fˆ fd„Zeddedededz  fd„¦   «         Z ej	        ¦   «         dd
ej
        defd„¦   «         Z	 dd
ej
        dededz  fd„Zˆ xZS )Ú"TrOCRSinusoidalPositionalEmbeddingzDThis module produces sinusoidal positional embeddings of any length.NÚnum_positionsr   r?   c                 óª   •— t          ¦   «                              ¦   «          d| _        || _        || _        |                      |||¦  «        | _        d S r   )r   r   r   r   r?   Úget_embeddingÚweights)r   rG   r   r?   r    s       €r!   r   z+TrOCRSinusoidalPositionalEmbedding.__init__Q   sM   ø€ Ý‰Œ×ÒÑÔÐØˆŒØ*ˆÔØ&ˆÔØ×)Ò)¨-¸ÈÑTÔTˆŒˆˆr"   r   c                 óð  — |dz  }t          j        d¦  «        |dz
  z  }t          j        t          j        |t          j        ¬¦  «                             ¦   «         | z  ¦  «        }t          j        | t          j        ¬¦  «                             ¦   «                              d¦  «        |                     d¦  «        z  }t          j        t          j	        |¦  «        t          j
        |¦  «        gd¬¦  «                             | d¦  «        }|dz  dk    r+t          j        |t          j        | d¦  «        gd¬¦  «        }|�	d||dd…f<   |                     t          j        ¦   «         ¦  «        S )	zÁ
        Build sinusoidal embeddings. This matches the implementation in tensor2tensor, but differs slightly from the
        description in Section 3.5 of "Attention Is All You Need".
        r   i'  r   )r'   r   ©Údimr)   N)ÚmathÚlogr+   Úexpr,   Úint64rD   r0   ÚcatÚsinÚcosÚviewÚzerosÚtoÚget_default_dtype)r   r   r?   Úhalf_dimÚembs        r!   rI   z0TrOCRSinusoidalPositionalEmbedding.get_embeddingX   s?  € ð ! AÑ%ˆÝŒh�u‰oŒo ¨A¡Ñ.ˆÝŒi�œ XµU´[ÐAÑAÔA×GÒGÑIÔIÈSÈDÑPÑQÔQˆÝŒl˜>µ´Ð=Ñ=Ô=×CÒCÑEÔE×OÒOÐPQÑRÔRÐUX×UbÒUbÐcdÑUeÔUeÑeˆÝŒi�œ 3™œ­¬°3©¬Ð8¸aÐ@Ñ@Ô@×EÒEÀnÐVXÑYÔYˆØ˜1Ñ Ò!Ð!å”)˜S¥%¤+¨n¸aÑ"@Ô"@ÐAÀqÐIÑIÔIˆCØÐ"Ø"#ˆC�˜Q˜Q˜Q�Ñà�vŠv•eÔ-Ñ/Ô/Ñ0Ô0Ð0r"   r   r#   r$   c                 óö  — |                      ¦   «         \  }}|                      || j        |¦  «                             |j        ¦  «        }| j        dz   |z   }| j        �|| j                              d¦  «        k    r&|                      || j        | j        ¦  «        | _        | j                             d| 	                    d¦  «        ¦  «         	                    ||d¦  «         
                    ¦   «         }|S )Nr   r   r)   )ÚsizeÚ"create_position_ids_from_input_idsr?   rW   r(   rJ   rI   r   Úindex_selectrU   Údetach)r   r#   r$   r2   r3   r%   Úmax_posÚxs           r!   r1   z*TrOCRSinusoidalPositionalEmbedding.forwardk   sä   € à —~’~Ñ'Ô'‰ˆˆWà×>Ò>¸yÈ$ÔJZÐ\rÑsÔs×vÒvØÔñ
ô 
ˆð
 Ô" QÑ&¨Ñ0ˆØŒ<Ð 7¨T¬\×->Ò->¸qÑ-AÔ-AÒ#AÐ#Aà×-Ò-¨g°tÔ7IÈ4ÔK[Ñ\Ô\ˆDŒLàŒL×%Ò% a¨×):Ò):¸2Ñ)>Ô)>Ñ?Ô?×DÒDÀSÈ'ÐSUÑVÔV×]Ò]Ñ_Ô_ˆàˆr"   c                 óÜ   — |                      |¦  «                             ¦   «         }t          j        |d¬¦  «                             |¦  «        |z   |z  }|                     ¦   «         |z   S )zÐ
        Replace non-padding symbols with their position numbers. Position numbers begin at padding_idx+1. Padding
        symbols are ignored. This is modified from fairseq's `utils.make_positions`.
        r   rL   )Úner8   r+   ÚcumsumÚtype_asr-   )r   r#   r?   r$   ÚmaskÚincremental_indicess         r!   r]   zETrOCRSinusoidalPositionalEmbedding.create_position_ids_from_input_ids}   sg   € ð �|Š|˜KÑ(Ô(×,Ò,Ñ.Ô.ˆÝ$œ|¨D°aÐ8Ñ8Ô8×@Ò@ÀÑFÔFÐI_Ñ_ÐcgÑgÐØ"×'Ò'Ñ)Ô)¨KÑ7Ð7r"   rB   )r   )r4   r5   r6   r7   r8   r   ÚstaticmethodrI   r+   Úno_gradr9   r1   r]   r:   r;   s   @r!   rF   rF   N   s(  ø€ € € € € ØNÐNðUð U cð U¸#ð UÈCÐRVÉJð Uð Uð Uð Uð Uð Uð ð1ð 1 cð 1¸#ð 1ÈCÐRVÉJð 1ð 1ð 1ñ „\ð1ð$ €U„]�_„_ðð  ¤ð Àsð ð ð ñ „_ðð$ _`ð
8ð 
8Øœð
8Ø47ð
8ØQTÐW[ÑQ[ð
8ð 
8ð 
8ð 
8ð 
8ð 
8ð 
8ð 
8r"   rF   c                   ó*  ‡ — e Zd ZdZ	 	 	 	 	 	 	 ddedededz  d	edz  d
edz  dedz  dedz  dedz  dedz  fˆ fd„Z	 	 	 	 ddej	        dej	        dz  de
dz  dej	        dz  dedz  deej	        ej	        dz  eej	                 dz  f         fd„Zˆ xZS )ÚTrOCRAttentionz>Multi-headed attention from 'Attention Is All You Need' paper.Nç        FTÚ	embed_dimÚ	num_headsÚkdimÚvdimÚdropoutÚ
is_decoderÚbiasÚis_cross_attentionÚ	layer_idxc                 ó<  •— t          ¦   «                              ¦   «          || _        |�|n|| _        |�|n|| _        || _        || _        ||z  | _        | j        |z  | j        k    st          d| j        › d|› d�¦  «        ‚| j        dz  | _	        || _
        |
| _        t          j        | j        ||¬¦  «        | _        t          j        | j        ||¬¦  «        | _        t          j        |||¬¦  «        | _        t          j        |||¬¦  «        | _        d S )Nz;embed_dim must be divisible by num_heads (got `embed_dim`: z and `num_heads`: z).g      à¿©rs   )r   r   rm   ro   rp   rn   rq   Úhead_dimÚ
ValueErrorÚscalingrr   ru   r   ÚLinearÚk_projÚv_projÚq_projÚout_proj)r   Úconfigrm   rn   ro   rp   rq   rr   rs   rt   ru   r    s              €r!   r   zTrOCRAttention.__init__�   s-  ø€ õ 	‰Œ×ÒÑÔÐØ"ˆŒØ Ð,�D�D°)ˆŒ	Ø Ð,�D�D°)ˆŒ	Ø"ˆŒØˆŒØ! YÑ.ˆŒØ” 	Ñ)¨T¬^Ò;Ð;Ýð"ÈdÌnð "ð "Øð"ð "ð "ñô ð ð ”} dÑ*ˆŒØ$ˆŒØ"ˆŒå”i ¤	¨9¸4Ð@Ñ@Ô@ˆŒÝ”i ¤	¨9¸4Ð@Ñ@Ô@ˆŒÝ”i 	¨9¸4Ð@Ñ@Ô@ˆŒåœ	 )¨Y¸TÐBÑBÔBˆŒˆˆr"   Úhidden_statesÚkey_value_statesÚpast_key_valuesÚattention_maskÚoutput_attentionsÚreturnc                 ó	  — |du}|                      ¦   «         \  }}	}
|                      |¦  «        | j        z  }d}|�Ht          |t          ¦  «        r1|j                             | j        ¦  «        }|r|j        }n
|j	        }n|}|r|n|}|r3|�1|r/|j
        | j                 j        }|j
        | j                 j        }nÝ|                      |¦  «        }|                      |¦  «        }|                     |d| j        | j        ¦  «                             dd¦  «        }|                     |d| j        | j        ¦  «                             dd¦  «        }|�E|                     ||| j        ¦  «        \  }}|r$t          |t          ¦  «        rd|j        | j        <   || j        z  d| j        f}|                     ||	| j        | j        ¦  «                             dd¦  «        } |j        |Ž } |j        |Ž } |j        |Ž }|                      d¦  «        }t+          j        ||                     dd¦  «        ¦  «        }|                      ¦   «         || j        z  |	|fk    r2t/          d|| j        z  |	|f› d|                      ¦   «         › �¦  «        ‚|�†|                      ¦   «         |d|	|fk    r+t/          d	|d|	|f› d|                      ¦   «         › �¦  «        ‚|                     || j        |	|¦  «        |z   }|                     || j        z  |	|¦  «        }t0          j                             |d¬
¦  «        }|r=|                     || j        |	|¦  «        }|                     || j        z  |	|¦  «        }nd}t0          j                             || j        | j        ¬¦  «        }t+          j        ||¦  «        }|                      ¦   «         || j        z  |	| j        fk    r5t/          d|| j        |	| j        f› d|                      ¦   «         › �¦  «        ‚|                     || j        |	| j        ¦  «        }|                     dd¦  «        }|                     ||	|
¦  «        }|                      |¦  «        }||fS )z#Input shape: Batch x Time x ChannelNFr)   r   r   Tz$Attention weights should be of size z	, but is z!Attention mask should be of size rL   ©ÚpÚtrainingz `attn_output` should be of size )r\   r~   rz   Ú
isinstancer	   Ú
is_updatedÚgetru   Úcross_attention_cacheÚself_attention_cacheÚlayersÚkeysÚvaluesr|   r}   rU   rn   rx   Ú	transposeÚupdateÚreshaper+   Úbmmry   r   Ú
functionalÚsoftmaxrq   rŠ   r   )r   r�   r‚   rƒ   r„   r…   Úkwargsrt   r2   Útgt_lenrm   Úquery_statesrŒ   Úcurr_past_key_valuesÚcurrent_statesÚ
key_statesÚvalue_statesÚ
proj_shapeÚsrc_lenÚattn_weightsÚattn_weights_reshapedÚ
attn_probsÚattn_outputs                          r!   r1   zTrOCRAttention.forward°   sã  € ð .°TÐ9ÐØ"/×"4Ò"4Ñ"6Ô"6ÑˆˆW�ið —{’{ =Ñ1Ô1°D´LÑ@ˆàˆ
ØÐ&Ý˜/Õ+>Ñ?Ô?ð 7Ø,Ô7×;Ò;¸D¼NÑKÔK�
Ø%ð Pà+:Ô+PÐ(Ð(à+:Ô+OÐ(Ð(à'6Ð$à-?ÐRÐ)Ð)À]ˆØð 	F /Ð"=À*Ð"=à-Ô4°T´^ÔDÔIˆJØ/Ô6°t´~ÔFÔMˆLˆLàŸš ^Ñ4Ô4ˆJØŸ;š; ~Ñ6Ô6ˆLØ#Ÿš¨¨b°$´.À$Ä-ÑPÔP×ZÒZÐ[\Ð^_Ñ`Ô`ˆJØ'×,Ò,¨S°"°d´nÀdÄmÑTÔT×^Ò^Ð_`ÐbcÑdÔdˆLàÐ*à+?×+FÒ+FÀzÐS_ÐaeÔaoÑ+pÔ+pÑ(�
˜Là%ð F­*°_ÕFYÑ*ZÔ*Zð FØAE�OÔ.¨t¬~Ñ>à˜DœNÑ*¨B°´Ð>ˆ
Ø#×(Ò(¨¨g°t´~ÀtÄ}ÑUÔU×_Ò_Ð`aÐcdÑeÔeˆØ+�|Ô+¨ZÐ8ˆØ'�ZÔ'¨Ð4ˆ
Ø+�|Ô+¨ZÐ8ˆà—/’/ !Ñ$Ô$ˆÝ”y ¨z×/CÒ/CÀAÀqÑ/IÔ/IÑJÔJˆà×ÒÑÔ 3¨¬Ñ#7¸À'Ð"JÒJÐJÝð*¸¸d¼nÑ8LÈgÐW^Ð7_ð *ð *Ø ×%Ò%Ñ'Ô'ð*ð *ñô ð ð
 Ð%Ø×"Ò"Ñ$Ô$¨¨a°¸'Ð(BÒBÐBÝ Øt¸¸aÀÈ'Ð8RÐtÐtÐ]k×]pÒ]pÑ]rÔ]rÐtÐtñô ð ð (×,Ò,¨S°$´.À'È7ÑSÔSÐVdÑdˆLØ'×,Ò,¨S°4´>Ñ-AÀ7ÈGÑTÔTˆLå”}×,Ò,¨\¸rÐ,ÑBÔBˆàð 	)ð
 %1×$5Ò$5°c¸4¼>È7ÐT[Ñ$\Ô$\Ð!Ø0×5Ò5°c¸D¼NÑ6JÈGÐU\Ñ]Ô]ˆLˆLà$(Ð!å”]×*Ò*¨<¸4¼<ÐRVÔR_Ð*Ñ`Ô`ˆ
å”i 
¨LÑ9Ô9ˆà×ÒÑÔ #¨¬Ñ"6¸ÀÄÐ!OÒOÐOÝð)°C¸¼ÈÐRVÔR_Ð3`ð )ð )Ø×$Ò$Ñ&Ô&ð)ð )ñô ð ð
 "×&Ò& s¨D¬N¸GÀTÄ]ÑSÔSˆØ!×+Ò+¨A¨qÑ1Ô1ˆØ!×)Ò)¨#¨w¸	ÑBÔBˆà—m’m KÑ0Ô0ˆàÐ1Ð1Ð1r"   )NNrl   FTFN)NNNF)r4   r5   r6   r7   r8   rD   Úboolr   r+   r9   r   Útupler1   r:   r;   s   @r!   rk   rk   Š   s�  ø€ € € € € ØHÐHð  ØØ #Ø"'Ø Ø*/Ø!%ð!Cð !Cð ð!Cð ð	!Cð
 �D‰jð!Cð �D‰jð!Cð ˜‘ð!Cð ˜4‘Kð!Cð �T‰kð!Cð ! 4™Kð!Cð ˜$‘;ð!Cð !Cð !Cð !Cð !Cð !CðL 15Ø(,Ø.2Ø).ðd2ð d2à”|ðd2ð  œ,¨Ñ-ðd2ð  ™ð	d2ð
 œ tÑ+ðd2ð   $™;ðd2ð 
ˆuŒ|˜Uœ\¨DÑ0°%¸¼Ô2EÈÑ2LÐLÔ	Mðd2ð d2ð d2ð d2ð d2ð d2ð d2ð d2r"   rk   c                   ó¤   ‡ — e Zd Zddefˆ fd„Z	 	 	 	 	 	 ddej        dej        dz  dej        dz  d	ej        dz  d
edz  dedz  dedz  fd„Z	ˆ xZ
S )ÚTrOCRDecoderLayerNr€   c                 óÎ  •— t          ¦   «                              ¦   «          |j        | _        t	          || j        |j        |j        d|¬¦  «        | _        |j        | _        t          |j
                 | _        |j        | _        t          j        | j        ¦  «        | _        |j        rTt	          || j        |j        |j        |j        |j        dd|¬¦	  «	        | _        t          j        | j        ¦  «        | _        t          j        | j        |j        ¦  «        | _        t          j        |j        | j        ¦  «        | _        t          j        | j        ¦  «        | _        d S )NT)rm   rn   rq   rr   ru   )rm   rn   ro   rp   rq   rr   rt   ru   )r   r   Úhidden_sizerm   rk   Údecoder_attention_headsÚattention_dropoutÚ	self_attnrq   r   Úactivation_functionÚactivation_fnÚactivation_dropoutr   Ú	LayerNormÚself_attn_layer_normrr   Úcross_attention_hidden_sizeÚencoder_attnÚencoder_attn_layer_normr{   Údecoder_ffn_dimÚfc1Úfc2Úfinal_layer_norm)r   r€   ru   r    s      €r!   r   zTrOCRDecoderLayer.__init__  s9  ø€ Ý‰Œ×ÒÑÔÐØÔ+ˆŒå'ØØ”nØÔ4ØÔ,ØØð
ñ 
ô 
ˆŒð ”~ˆŒÝ# FÔ$>Ô?ˆÔØ"(Ô";ˆÔå$&¤L°´Ñ$@Ô$@ˆÔ!àÔð 	HÝ .ØØœ.Ø Ô8ØÔ7ØÔ7ØÔ0ØØ#'Ø#ð
!ñ 
!ô 
!ˆDÔõ ,.¬<¸¼Ñ+GÔ+GˆDÔ(å”9˜Tœ^¨VÔ-CÑDÔDˆŒÝ”9˜VÔ3°T´^ÑDÔDˆŒÝ "¤¨T¬^Ñ <Ô <ˆÔÐÐr"   FTr�   r„   Úencoder_hidden_statesÚencoder_attention_maskrƒ   r…   Ú	use_cachec                 ó  — |}	|                       ||||¬¦  «        \  }}
t          j                             || j        | j        ¬¦  «        }|	|z   }|                      |¦  «        }d}|�e|}	|                      |||||¬¦  «        \  }}t          j                             || j        | j        ¬¦  «        }|	|z   }|                      |¦  «        }|}	|                      |  	                    |¦  «        ¦  «        }t          j                             || j
        | j        ¬¦  «        }|                      |¦  «        }t          j                             || j        | j        ¬¦  «        }|	|z   }|                      |¦  «        }|f}|r||
|fz  }|S )aÆ  
        Args:
            hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)`
            attention_mask (`torch.FloatTensor`): attention mask of size
                `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
            encoder_hidden_states (`torch.FloatTensor`):
                cross attention input to the layer of shape `(batch, seq_len, embed_dim)`
            encoder_attention_mask (`torch.FloatTensor`): encoder attention mask of size
                `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
            past_key_values (`Cache`): cached past key and value projection states
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
        )r�   rƒ   r„   r…   rˆ   N)r�   r‚   r„   rƒ   r…   )r®   r   r—   rq   rŠ   r³   rµ   r¶   r°   r¸   r±   r¹   rº   )r   r�   r„   r»   r¼   rƒ   r…   r½   r™   ÚresidualÚself_attn_weightsÚcross_attn_weightsÚoutputss                r!   r1   zTrOCRDecoderLayer.forward<  s¹  € ð2 !ˆð ,0¯>ª>Ø'Ø+Ø)Ø/ð	 ,:ñ ,
ô ,
Ñ(ˆÐ(õ œ×-Ò-¨m¸t¼|ÐVZÔVcÐ-ÑdÔdˆØ  =Ñ0ˆØ×1Ò1°-Ñ@Ô@ˆð "ÐØ Ð,Ø$ˆHà04×0AÒ0AØ+Ø!6Ø5Ø /Ø"3ð 1Bñ 1ô 1Ñ-ˆMÐ-õ œM×1Ò1°-À4Ä<ÐZ^ÔZgÐ1ÑhÔhˆMØ$ }Ñ4ˆMØ ×8Ò8¸ÑGÔGˆMð !ˆØ×*Ò*¨4¯8ª8°MÑ+BÔ+BÑCÔCˆÝœ×-Ò-¨m¸tÔ?VÐaeÔanÐ-ÑoÔoˆØŸš Ñ/Ô/ˆåœ×-Ò-¨m¸t¼|ÐVZÔVcÐ-ÑdÔdˆØ  =Ñ0ˆØ×-Ò-¨mÑ<Ô<ˆà Ð"ˆàð 	?ØÐ)Ð+=Ð>Ñ>ˆGàˆr"   rB   )NNNNFT)r4   r5   r6   r   r   r+   r9   r   r¦   r1   r:   r;   s   @r!   r©   r©     sî   ø€ € € € € ð"=ð "=˜{ð "=ð "=ð "=ð "=ð "=ð "=ðN /3Ø59Ø6:Ø(,Ø).Ø!%ðGð Gà”|ðGð œ tÑ+ðGð  %œ|¨dÑ2ð	Gð
 !&¤¨tÑ 3ðGð  ™ðGð   $™;ðGð ˜$‘;ðGð Gð Gð Gð Gð Gð Gð Gr"   r©   c                   ó(   — e Zd ZU eed<   dZdZdgZdS )ÚTrOCRPreTrainedModelr€   ÚmodelTr©   N)r4   r5   r6   r   Ú__annotations__Úbase_model_prefixÚsupports_gradient_checkpointingÚ_no_split_modules© r"   r!   rÄ   rÄ   †  s3   € € € € € € àÐÐÑØÐØ&*Ð#Ø,Ð-ÐÐÐr"   rÄ   c                   óD   ‡ — e Zd ZdZdefˆ fd„Z	 	 	 	 	 	 	 	 	 	 dd„Zˆ xZS )ÚTrOCRDecoderz˜
    Transformer decoder consisting of *config.decoder_layers* layers. Each layer is a [`TrOCRDecoderLayer`]

    Args:
        config: TrOCRConfig
    r€   c                 óÒ  •‡— t          ¦   «                              ‰¦  «         ‰j        | _        ‰j        | _        ‰j        | _        ‰j        rt          j	        ‰j
        ¦  «        nd}t          ‰j        ‰j
        | j        |¬¦  «        | _        ‰j        r t          ‰j        ‰j
        ¦  «        | _        n0t%          ‰j        | j        z   dz   ‰j
        | j        ¦  «        | _        ‰j        rt)          j        ‰j
        ¦  «        | _        nd | _        t)          j        ˆfd„t/          ‰j        ¦  «        D ¦   «         ¦  «        | _        d| _        |                      ¦   «          d S )Nr>   )r@   r   c                 ó2   •— g | ]}t          ‰|¬ ¦  «        ‘ŒS ))ru   )r©   )Ú.0Úir€   s     €r!   ú
<listcomp>z)TrOCRDecoder.__init__.<locals>.<listcomp>¯  s(   ø€ Ð$rÐ$rÐ$rÐPQÕ%6°vÈÐ%KÑ%KÔ%KÐ$rÐ$rÐ$rr"   F)r   r   rq   Údecoder_layerdropÚ	layerdropÚpad_token_idr?   Úscale_embeddingrN   Úsqrtr«   r=   Ú
vocab_sizeÚembed_tokensÚuse_learned_position_embeddingsr   Úmax_position_embeddingsÚembed_positionsrF   Úlayernorm_embeddingr   r²   Ú
ModuleListÚrangeÚdecoder_layersr�   Úgradient_checkpointingÚ	post_init)r   r€   r@   r    s    ` €r!   r   zTrOCRDecoder.__init__–  s\  øø€ Ý‰Œ×Ò˜Ñ Ô Ð Ø”~ˆŒØÔ1ˆŒØ!Ô.ˆÔØ7=Ô7MÐV•d”i Ô 2Ñ3Ô3Ð3ÐSVˆå4ØÔ˜vÔ1°4Ô3CÐQ\ð
ñ 
ô 
ˆÔð Ô1ð 	Ý#BÀ6ÔCaÐciÔcuÑ#vÔ#vˆDÔ Ð å#EØÔ.°Ô1AÑAÀAÑEØÔ"ØÔ ñ$ô $ˆDÔ ð Ô%ð 	,Ý')¤|°FÔ4FÑ'GÔ'GˆDÔ$Ð$à'+ˆDÔ$å”mÐ$rÐ$rÐ$rÐ$rÕUZÐ[aÔ[pÑUqÔUqÐ$rÑ$rÔ$rÑsÔsˆŒà&+ˆÔ#à�ŠÑÔÐÐÐr"   Nc           
      óð  — |�|n| j         j        }|	�|	n| j         j        }	|�|n| j         j        }|
�|
n| j         j        }
|�|�t          d¦  «        ‚|�$|}|                     d|j        d         ¦  «        }n!|�|dd…dd…df         }nt          d¦  «        ‚| j        r%| j	        r|rt                               d¦  «         d}|r[|€Y|€| j         j        r6t          t          | j         ¬¦  «        t          | j         ¬¦  «        ¦  «        nt          | j         ¬¦  «        }|�|                     ¦   «         nd}|€|                      |¦  «        }| j         j        r|                      ||¬	¦  «        }n|                      ||¬	¦  «        }|                     |j        ¦  «        }||z   }| j        �|                      |¦  «        }t,          j                             || j        | j	        ¬
¦  «        }t3          | j         |||¬¦  «        }|�|�t5          | j         |||¬¦  «        }|	rdnd}|rdnd}|r|�dnd}t7          | j        ¦  «        D ]j\  }}|	r||fz  }| j	        r t;          j        g ¦  «        }|| j        k     rŒ4 ||||||||¬¦  «        }|d         }|r||d         fz  }|�||d         fz  }Œk|	r||fz  }|
stA          d„ |||||fD ¦   «         ¦  «        S tC          |||||¬¦  «        S )aU  
        Args:
            input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
                Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you
                provide it.

                Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
                [`PreTrainedTokenizer.__call__`] for details.

                [What are input IDs?](../glossary#input-ids)
            attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
                Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:

                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.

                [What are attention masks?](../glossary#attention-mask)
            encoder_hidden_states (`torch.FloatTensor` of shape `(batch_size, encoder_sequence_length, hidden_size)`, *optional*):
                Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention
                of the decoder.
            encoder_attention_mask (`torch.LongTensor` of shape `(batch_size, encoder_sequence_length)`, *optional*):
                Mask to avoid performing cross-attention on padding tokens indices of encoder input_ids. Mask values
                selected in `[0, 1]`:

                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.

                [What are attention masks?](../glossary#attention-mask)
            past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`):
                It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache).

                Contains pre-computed hidden-states (key and values in the self-attention blocks and in the
                cross-attention blocks) that can be used (see `past_key_values` input) to speed up sequential decoding.

                If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those
                that don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of
                all `decoder_input_ids` of shape `(batch_size, sequence_length)`.
            inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*):
                Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation.
                This is useful if you want more control over how to convert `input_ids` indices into associated vectors
                than the model's internal embedding lookup matrix.
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
            output_hidden_states (`bool`, *optional*):
                Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors
                for more detail.
            return_dict (`bool`, *optional*):
                Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
        NzTYou cannot specify both decoder_input_ids and decoder_inputs_embeds at the same timer)   zEYou have to specify either decoder_input_ids or decoder_inputs_embedsz^`use_cache = True` is incompatible with gradient checkpointing. Setting `use_cache = False`...F)r€   r   )r$   rˆ   )r€   Úinputs_embedsr„   rƒ   )r€   rã   r„   r»   rÊ   )r¼   rƒ   r…   r½   r   r   c              3   ó   K  — | ]}|®|V — Œ	d S rB   rÊ   )rÏ   Úvs     r!   ú	<genexpr>z'TrOCRDecoder.forward.<locals>.<genexpr>[  s0   è è € ð ð àØ�=ð à �=�=�=ðð r"   )Úlast_hidden_staterƒ   r�   Ú
attentionsÚcross_attentions)"r€   r…   Úoutput_hidden_statesr½   Úreturn_dictry   rU   r*   rà   rŠ   ÚloggerÚwarning_onceÚis_encoder_decoderr	   r   Úget_seq_lengthrØ   rÙ   rÛ   rW   r(   rÜ   r   r—   rq   r   r   Ú	enumerater�   r+   ÚrandrÓ   r§   r   )r   r#   r„   r»   r¼   rƒ   rã   r½   r…   rê   rë   r™   Úinputr$   Ú	embed_posr�   Úall_hidden_statesÚall_self_attnsÚall_cross_attentionsÚidxÚdecoder_layerÚdropout_probabilityÚlayer_outputss                          r!   r1   zTrOCRDecoder.forwardµ  s  € ð@ 2CÐ1NÐ-Ð-ÐTXÔT_ÔTqÐà$8Ð$DÐ Ð È$Ì+ÔJjð 	ð "+Ð!6�I�I¸D¼KÔ<Qˆ	Ø%0Ð%<�k�kÀ$Ä+ÔBYˆð Ð  ]Ð%>ÝÐsÑtÔtÐtØÐ"ØˆEØ!Ÿš r¨5¬;°r¬?Ñ;Ô;ˆIˆIØÐ&Ø! ! ! ! Q Q Q¨ (Ô+ˆEˆEåÐdÑeÔeÐeàÔ&ð 	"¨4¬=ð 	"Øð "Ý×#Ò#Øtñô ð ð "�	àð 	˜Ð0ð )Ð4¸¼Ô8VÐ4õ $¥L¸¼Ð$DÑ$DÔ$DÅlÐZ^ÔZeÐFfÑFfÔFfÑgÔgÐgå!¨¬Ð5Ñ5Ô5ð ð FUÐE` ×!?Ò!?Ñ!AÔ!AÐ!AÐfgÐàÐ Ø ×-Ò-¨iÑ8Ô8ˆMàŒ;Ô6ð 	gØ×,Ò,¨UÐKaÐ,ÑbÔbˆIˆIà×,Ò,¨YÐOeÐ,ÑfÔfˆIØ—L’L Ô!5Ñ6Ô6ˆ	à%¨	Ñ1ˆàÔ#Ð/Ø ×4Ò4°]ÑCÔCˆMåœ×-Ò-¨m¸t¼|ÐVZÔVcÐ-ÑdÔdˆå+Ø”;Ø'Ø)Ø+ð	
ñ 
ô 
ˆð !Ð,Ð1GÐ1SÝ%>Ø”{Ø+Ø5Ø&;ð	&ñ &ô &Ð"ð #7Ð@˜B˜B¸DÐØ0Ð:˜˜°dˆØ&7ÐhÐ<QÐ<]˜r˜rÐdhÐå"+¨D¬KÑ"8Ô"8ð 	@ð 	@ÑˆC�à#ð 6Ø! mÐ%5Ñ5Ð!ØŒ}ð Ý&+¤j°¡n¤nÐ#Ø&¨¬Ò7Ð7Øà)˜MØØØ%Ø'=Ø /Ø"3Ø#ðñ ô ˆMð *¨!Ô,ˆMà ð @Ø =°Ô#3Ð"5Ñ5�à(Ð4Ø(¨]¸1Ô-=Ð,?Ñ?Ð(øð  ð 	2Ø -Ð!1Ñ1Ðàð 	Ýð ð à'¨Ð:KÈ^Ð]qÐrðñ ô ñ ô ð õ
 9Ø+Ø+Ø+Ø%Ø1ð
ñ 
ô 
ð 	
r"   )
NNNNNNNNNN)r4   r5   r6   r7   r   r   r1   r:   r;   s   @r!   rÌ   rÌ   Ž  s‹   ø€ € € € € ðð ð˜{ð ð ð ð ð ð ðB ØØ"Ø#ØØØØØ!Øðq
ð q
ð q
ð q
ð q
ð q
ð q
ð q
r"   rÌ   a  
    The TrOCR Model with a language modeling head. Can be used for summarization.
    This wrapper class is a helper class to correctly load pretrained checkpoints when the causal language model is
    used in combination with the [`EncoderDecoderModel`] framework.
    )Úcustom_introc                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚTrOCRDecoderWrapperc                 óš   •— t          ¦   «                              |¦  «         t          |¦  «        | _        |                      ¦   «          d S rB   )r   r   rÌ   Údecoderrá   ©r   r€   r    s     €r!   r   zTrOCRDecoderWrapper.__init__q  s@   ø€ Ý‰Œ×Ò˜Ñ Ô Ð Ý# FÑ+Ô+ˆŒØ�ŠÑÔÐÐÐr"   c                 ó   —  | j         |i |¤ŽS rB   )rÿ   )r   Úargsr™   s      r!   r1   zTrOCRDecoderWrapper.forwardv  s   € ØˆtŒ|˜TÐ, VÐ,Ð,Ð,r"   )r4   r5   r6   r   r1   r:   r;   s   @r!   rý   rý   i  sG   ø€ € € € € ðð ð ð ð ð
-ð -ð -ð -ð -ð -ð -r"   rý   zy
    The TrOCR Decoder with a language modeling head. Can be used as the decoder part of [`EncoderDecoderModel`] and
    c                   ó"  ‡ — e Zd ZddiZˆ fd„Zd„ Zd„ Zd„ Zd„ Ze		 	 	 	 	 	 	 	 	 	 	 dd	e
j        dz  d
e
j        dz  de
j        dz  de
j        dz  dedz  de
j        dz  de
j        dz  dedz  dedz  dedz  dedz  deez  fd„¦   «         Zˆ xZS )ÚTrOCRForCausalLMzoutput_projection.weightz!model.decoder.embed_tokens.weightc                 ó  •— d|_         d|_        t          ¦   «                              |¦  «         t	          |¦  «        | _        t          j        |j        |j	        d¬¦  «        | _
        |                      ¦   «          d S )NTFrw   )rr   rî   r   r   rý   rÅ   r   r{   r«   r×   Úoutput_projectionrá   r   s     €r!   r   zTrOCRForCausalLM.__init__‚  sr   ø€ Ø ˆÔØ$)ˆÔ!Ý‰Œ×Ò˜Ñ Ô Ð Ý(¨Ñ0Ô0ˆŒ
å!#¤¨6Ô+=¸vÔ?PÐW\Ð!]Ñ!]Ô!]ˆÔð 	�ŠÑÔÐÐÐr"   c                 ó$   — | j         j        j        S rB   ©rÅ   rÿ   rØ   ©r   s    r!   Úget_input_embeddingsz%TrOCRForCausalLM.get_input_embeddings�  s   € ØŒzÔ!Ô.Ð.r"   c                 ó(   — || j         j        _        d S rB   r  )r   Úvalues     r!   Úset_input_embeddingsz%TrOCRForCausalLM.set_input_embeddings�  s   € Ø*/ˆŒ
ÔÔ'Ð'Ð'r"   c                 ó   — | j         S rB   ©r  r	  s    r!   Úget_output_embeddingsz&TrOCRForCausalLM.get_output_embeddings“  s   € ØÔ%Ð%r"   c                 ó   — || _         d S rB   r  )r   Únew_embeddingss     r!   Úset_output_embeddingsz&TrOCRForCausalLM.set_output_embeddings–  s   € Ø!/ˆÔÐÐr"   Nr#   r„   r»   r¼   rƒ   rã   Úlabelsr½   r…   rê   rë   r†   c                 ó  — |	�|	n| j         j        }	|
�|
n| j         j        }
|�|n| j         j        }| j                             ||||||||	|
|¬¦
  «
        }|                      |d         ¦  «        }d}|�Kt          ¦   «         } ||                     d| j         j	        ¦  «        |                     d¦  «        ¦  «        }|s|f|dd…         z   }|�|f|z   n|S t          |||j        |j        |j        |j        ¬¦  «        S )a
  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
            config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
            (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.

        Example:

        ```python
        >>> from transformers import (
        ...     TrOCRConfig,
        ...     TrOCRProcessor,
        ...     TrOCRForCausalLM,
        ...     ViTConfig,
        ...     ViTModel,
        ...     VisionEncoderDecoderModel,
        ... )
        >>> import httpx
        >>> from io import BytesIO
        >>> from PIL import Image

        >>> # TrOCR is a decoder model and should be used within a VisionEncoderDecoderModel
        >>> # init vision2text model with random weights
        >>> encoder = ViTModel(ViTConfig())
        >>> decoder = TrOCRForCausalLM(TrOCRConfig())
        >>> model = VisionEncoderDecoderModel(encoder=encoder, decoder=decoder)

        >>> # If you want to start from the pretrained model, load the checkpoint with `VisionEncoderDecoderModel`
        >>> processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-handwritten")
        >>> model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-handwritten")

        >>> # load image from the IAM dataset
        >>> url = "https://fki.tic.heia-fr.ch/static/img/a01-122-02.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read())).convert("RGB")
        >>> pixel_values = processor(image, return_tensors="pt").pixel_values
        >>> text = "industry, ' Mr. Brown commented icily. ' Let us have a"

        >>> # training
        >>> model.config.decoder_start_token_id = processor.tokenizer.eos_token_id
        >>> model.config.pad_token_id = processor.tokenizer.pad_token_id
        >>> model.config.vocab_size = model.config.decoder.vocab_size

        >>> labels = processor.tokenizer(text, return_tensors="pt").input_ids
        >>> outputs = model(pixel_values, labels=labels)
        >>> loss = outputs.loss
        >>> round(loss.item(), 2)
        5.30

        >>> # inference
        >>> generated_ids = model.generate(pixel_values)
        >>> generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
        >>> generated_text
        'industry, " Mr. Brown commented icily. " Let us have a'
        ```N)
r#   r„   r»   r¼   rƒ   rã   r½   r…   rê   rë   r   r)   r   )ÚlossÚlogitsrƒ   r�   rè   ré   )r€   r…   rê   rë   rÅ   rÿ   r  r   rU   r×   r   rƒ   r�   rè   ré   )r   r#   r„   r»   r¼   rƒ   rã   r  r½   r…   rê   rë   r™   rÂ   r  r  Úloss_fctÚoutputs                     r!   r1   zTrOCRForCausalLM.forward™  sN  € ðP 2CÐ1NÐ-Ð-ÐTXÔT_ÔTqÐà$8Ð$DÐ Ð È$Ì+ÔJjð 	ð &1Ð%<�k�kÀ$Ä+ÔBYˆð ”*×$Ò$ØØ)Ø"7Ø#9Ø+Ø'ØØ/Ø!5Ø#ð %ñ 
ô 
ˆð ×'Ò'¨°¬
Ñ3Ô3ˆàˆØÐÝ'Ñ)Ô)ˆHØ�8˜FŸKšK¨¨D¬KÔ,BÑCÔCÀVÇ[Â[ÐQSÁ_Ä_ÑUÔUˆDàð 	DØ�Y ¨¨¨¤Ñ,ˆFØ'+Ð'7�D�7˜VÑ#Ð#¸VÐCå0ØØØ#Ô3Ø!Ô/ØÔ)Ø$Ô5ð
ñ 
ô 
ð 	
r"   )NNNNNNNNNNN)r4   r5   r6   Ú_tied_weights_keysr   r
  r  r  r  r   r+   Ú
LongTensorr9   ÚFloatTensorr   r¦   r§   r   r1   r:   r;   s   @r!   r  r  z  sž  ø€ € € € € ð 5Ð6YÐZÐð	ð 	ð 	ð 	ð 	ð/ð /ð /ð0ð 0ð 0ð&ð &ð &ð0ð 0ð 0ð ð .2Ø.2Ø:>Ø:>Ø(,Ø26Ø*.Ø!%Ø)-Ø,0Ø#'ðm
ð m
àÔ# dÑ*ðm
ð œ tÑ+ðm
ð  %Ô0°4Ñ7ð	m
ð
 !&Ô 0°4Ñ 7ðm
ð  ™ðm
ð Ô(¨4Ñ/ðm
ð Ô  4Ñ'ðm
ð ˜$‘;ðm
ð   $™;ðm
ð # T™kðm
ð ˜D‘[ðm
ð 
Ð2Ñ	2ðm
ð m
ð m
ñ „^ðm
ð m
ð m
ð m
ð m
r"   r  ),r7   rN   r+   r   Útorch.nnr   Úactivationsr   Úcache_utilsr   r   r	   Ú
generationr
   Úmasking_utilsr   r   Úmodeling_layersr   Úmodeling_outputsr   r   Úmodeling_utilsr   Úutilsr   r   Úconfiguration_trocrr   Ú
get_loggerr4   rì   Ú	Embeddingr   r=   ÚModulerF   rk   r©   rÄ   rÌ   rý   r  Ú__all__rÊ   r"   r!   ú<module>r+     s+  ðð 6Ð 5à €€€à €€€Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %à !Ð !Ð !Ð !Ð !Ð !Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ )Ð )Ð )Ð )Ð )Ð )Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø lÐ lÐ lÐ lÐ lÐ lÐ lÐ lØ -Ð -Ð -Ð -Ð -Ð -Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ð 
ˆÔ	˜HÑ	%Ô	%€ð;ð ;ð ;ð ;ð ; b¤lñ ;ô ;ð ;ð8
=ð 
=ð 
=ð 
=ð 
=˜rœ|ñ 
=ô 
=ð 
=ð98ð 98ð 98ð 98ð 98¨¬ñ 98ô 98ð 98ðxJ2ð J2ð J2ð J2ð J2�R”Yñ J2ô J2ð J2ðZlð lð lð lð lÐ2ñ lô lð lð^ ð.ð .ð .ð .ð .˜?ñ .ô .ñ „ð.ðX
ð X
ð X
ð X
ð X
Ð'ñ X
ô X
ð X
ðv €ððñ ô ð-ð -ð -ð -ð -Ð.ñ -ô -ñô ð-ð €ððñ ô ð
H
ð H
ð H
ð H
ð H
Ð+¨_ñ H
ô H
ñô ð
H
ðV Ð5Ð
6€€€r"   