
    i                        d dl mZ d dlmZ d dl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 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mZmZ ddlmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z*  e%jV                  e,      Z- G d dej\                        Z/ej`                  e/dZ1 G d dej\                        Z2	 	 d^dej\                  dejf                  dejf                  dejf                  dejf                  dz  de4dz  de4de e#   fdZ5 G d  d!ej\                        Z6 G d" d#ej\                        Z7 G d$ d%ej\                        Z8 G d& d'ej\                        Z9 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 d0 d1ej\                        Z> G d2 d3ej\                        Z? G d4 d5e      Z@ G d6 d7ej\                        ZA G d8 d9ej\                        ZB G d: d;ej\                        ZC G d< d=ej\                        ZD G d> d?ej\                        ZE G d@ dAej\                        ZFe$ G dB dCe             ZGe e$dDE       G dF dGe"                    ZHe$ G dH dIeG             ZI e$dJE       G dK dLeG             ZJe$ G dM dNeG             ZK G dO dPej\                        ZL e$dQE       G dR dSeG             ZM e$dTE       G dU dVeG             ZNe$ G dW dXeG             ZOe$ G dY dZeG             ZPe$ G d[ d\eG             ZQg d]ZRy)_    )Callable)	dataclassN)nn)BCEWithLogitsLossCrossEntropyLossMSELoss   )initialization)ACT2FN)create_bidirectional_mask)GradientCheckpointingLayer)BaseModelOutputBaseModelOutputWithPoolingMaskedLMOutputMultipleChoiceModelOutputNextSentencePredictorOutputQuestionAnsweringModelOutputSequenceClassifierOutputTokenClassifierOutput)ALL_ATTENTION_FUNCTIONSPreTrainedModel)Unpack)ModelOutputTransformersKwargsauto_docstringlogging)can_return_tuplecheck_model_inputs   )MobileBertConfigc                   X     e Zd Zd fd	Zdej
                  dej
                  fdZ xZS )NoNormc                     t         |           t        j                  t	        j
                  |            | _        t        j                  t	        j                  |            | _        y N)	super__init__r   	Parametertorchzerosbiasonesweight)self	feat_sizeeps	__class__s      |/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/transformers/models/mobilebert/modeling_mobilebert.pyr&   zNoNorm.__init__7   s@    LLY!78	ll5::i#89    input_tensorreturnc                 :    || j                   z  | j                  z   S r$   )r,   r*   )r-   r3   s     r1   forwardzNoNorm.forward<   s    dkk)DII55r2   r$   __name__
__module____qualname__r&   r(   Tensorr6   __classcell__r0   s   @r1   r"   r"   6   s#    :
6ELL 6U\\ 6r2   r"   )
layer_normno_normc                        e Zd ZdZ fdZ	 	 	 	 d
dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  f
d	Z	 xZ
S )MobileBertEmbeddingszGConstruct the embeddings from word, position and token_type embeddings.c                 X   t         |           |j                  | _        |j                  | _        |j                  | _        t        j                  |j                  |j                  |j                        | _	        t        j                  |j                  |j                        | _        t        j                  |j                  |j                        | _        | j                  rdnd}| j                  |z  }t        j                  ||j                        | _        t!        |j"                     |j                        | _        t        j&                  |j(                        | _        | j-                  dt/        j0                  |j                        j3                  d      d       y )N)padding_idxr	   r   position_idsr   F)
persistent)r%   r&   trigram_inputembedding_sizehidden_sizer   	Embedding
vocab_sizepad_token_idword_embeddingsmax_position_embeddingsposition_embeddingstype_vocab_sizetoken_type_embeddingsLinearembedding_transformationNORM2FNnormalization_type	LayerNormDropouthidden_dropout_probdropoutregister_bufferr(   arangeexpand)r-   configembed_dim_multiplierembedded_input_sizer0   s       r1   r&   zMobileBertEmbeddings.__init__F   sF   #11$33!--!||F,=,=v?T?Tbhbubuv#%<<0N0NPVPbPb#c %'\\&2H2H&J\J\%]"$($6$6qA"114HH(*		2EvGYGY(Z% !:!:;F<N<NOzz&"<"<= 	ELL)G)GHOOPWXej 	 	
r2   N	input_idstoken_type_idsrD   inputs_embedsr4   c           
      $   ||j                         }n|j                         d d }|d   }|| j                  d d d |f   }|:t        j                  |t        j                  | j                  j
                        }|| j                  |      }| j                  rpt        j                  t        j                  j                  |d d dd f   g dd      |t        j                  j                  |d d d df   g dd      gd	      }| j                  s| j                  | j                  k7  r| j                  |      }| j                  |      }| j!                  |      }||z   |z   }	| j#                  |	      }	| j%                  |	      }	|	S )
NrF   r   )dtypedevice)r   r   r   r   r   r           )value)r   r   r   r   r   r      dim)sizerD   r(   r)   longrf   rN   rH   catr   
functionalpadrI   rJ   rT   rP   rR   rW   rZ   )
r-   ra   rb   rD   rc   input_shape
seq_lengthrP   rR   
embeddingss
             r1   r6   zMobileBertEmbeddings.forward\   s     #..*K',,.s3K ^
,,Q^<L!"[[EJJtO`O`OgOghN  00;M "IIMM%%mAqrE&:<NVY%Z!MM%%mAssF&;=OWZ%[
 M !4!48H8H!H 99-HM #66|D $ : :> J"%88;PP
^^J/
\\*-
r2   )NNNN)r8   r9   r:   __doc__r&   r(   
LongTensorFloatTensorr;   r6   r<   r=   s   @r1   rA   rA   C   s~    Q
0 .22604260##d*0 ((4/0 &&-	0
 ((4/0 
0r2   rA   modulequerykeyrh   attention_maskscalingrZ   kwargsc                    ||j                  d      dz  }t        j                  ||j                  dd            |z  }|#|d d d d d d d |j                  d   f   }||z   }t
        j                  j                  |d      }t
        j                  j                  ||| j                        }t        j                  ||      }	|	j                  dd      j                         }	|	|fS )	NrF         ri   r	   rj   )ptrainingr   )rl   r(   matmul	transposeshaper   ro   softmaxrZ   r   
contiguous)
rw   rx   ry   rh   rz   r{   rZ   r|   attn_weightsattn_outputs
             r1   eager_attention_forwardr      s     **R.D( <<s}}Q':;gEL!'1a399R=(@A#n4==((2(>L==((6??([L,,|U3K''1-88:K$$r2   c                        e Zd Z fdZ	 d
dej
                  dej
                  dej
                  dej                  dz  dee   de	ej
                     fd	Z
 xZS )MobileBertSelfAttentionc                    t         |           || _        |j                  | _        t	        |j
                  |j                  z        | _        | j                  | j                  z  | _        | j                  dz  | _        t        j                  |j
                  | j                        | _        t        j                  |j
                  | j                        | _        t        j                  |j                  r|j
                  n|j                  | j                        | _        t        j                   |j"                        | _        d| _        y )Nr~   F)r%   r&   r^   num_attention_headsinttrue_hidden_sizeattention_head_sizeall_head_sizer{   r   rS   rx   ry   use_bottleneck_attentionrJ   rh   rX   attention_probs_dropout_probrZ   	is_causalr-   r^   r0   s     r1   r&   z MobileBertSelfAttention.__init__   s    #)#=#= #&v'>'>A[A['[#\ !558P8PP//5YYv668J8JK
99V44d6H6HIYY'-'F'FF##FL^L^`d`r`r

 zz&"E"EFr2   Nquery_tensor
key_tensorvalue_tensorrz   r|   r4   c                    |j                   d d }g |d| j                  } | j                  |      j                  | j	                  dd      } | j                  |      j                  | j	                  dd      }	 | j                  |      j                  | j	                  dd      }
t        j                  | j                  j                  t              } || ||	|
|f| j                  sdn| j                  j                  | j                  d|\  }} |j                   g |d j#                         }||fS )NrF   r   ri   rg   )rZ   r{   )r   r   rx   viewr   ry   rh   r   get_interfacer^   _attn_implementationr   r   rZ   r   r{   reshaper   )r-   r   r   r   rz   r|   rq   hidden_shapequery_layer	key_layervalue_layerattention_interfacer   r   s                 r1   r6   zMobileBertSelfAttention.forward   sH    #(("-CCbC$*B*BC 4djj.33\BLLQPQR-DHHZ(--|<FFq!L	3djj.33\BLLQPQR(?(M(MKK,,.E)
 %8	%
  $}}C$,,..LL	%
 	%
!\ *k));;;;FFHL((r2   r$   r8   r9   r:   r&   r(   r;   rv   r   r   tupler6   r<   r=   s   @r1   r   r      sr    , 48)ll) LL) ll	)
 ))D0) +,) 
u||	)r2   r   c                   n     e Zd Z fdZdej
                  dej
                  dej
                  fdZ xZS )MobileBertSelfOutputc                 j   t         |           |j                  | _        t        j                  |j
                  |j
                        | _        t        |j                     |j
                  |j                        | _
        | j                  s%t        j                  |j                        | _        y y Nr/   )r%   r&   use_bottleneckr   rS   r   denserU   rV   layer_norm_epsrW   rX   rY   rZ   r   s     r1   r&   zMobileBertSelfOutput.__init__   s    $33YYv668O8OP
 !:!:;F<S<SY_YnYno""::f&@&@ADL #r2   hidden_statesresidual_tensorr4   c                     | j                  |      }| j                  s| j                  |      }| j                  ||z         }|S r$   )r   r   rZ   rW   r-   r   r   layer_outputss       r1   r6   zMobileBertSelfOutput.forward   s@    

=1"" LL7M}'FGr2   r7   r=   s   @r1   r   r      s2    BU\\ ELL UZUaUa r2   r   c                        e Zd Z fdZ	 ddej
                  dej
                  dej
                  dej
                  dej                  dz  dee   d	e	ej
                     fd
Z
 xZS )MobileBertAttentionc                 b    t         |           t        |      | _        t	        |      | _        y r$   )r%   r&   r   r-   r   outputr   s     r1   r&   zMobileBertAttention.__init__   s&    +F3	*62r2   Nr   r   r   layer_inputrz   r|   r4   c                 `     | j                   ||||fi |\  }}| j                  ||      }||fS r$   )r-   r   )	r-   r   r   r   r   rz   r|   attention_outputr   s	            r1   r6   zMobileBertAttention.forward   sO     *3	*

 *
&,  ;;'7E--r2   r$   r   r=   s   @r1   r   r      s    3 48.ll. LL. ll	.
 \\. ))D0. +,. 
u||	.r2   r   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )MobileBertIntermediatec                    t         |           t        j                  |j                  |j
                        | _        t        |j                  t              rt        |j                     | _        y |j                  | _        y r$   )r%   r&   r   rS   r   intermediate_sizer   
isinstance
hidden_actstrr   intermediate_act_fnr   s     r1   r&   zMobileBertIntermediate.__init__  s]    YYv668P8PQ
f''-'-f.?.?'@D$'-'8'8D$r2   r   r4   c                 J    | j                  |      }| j                  |      }|S r$   )r   r   r-   r   s     r1   r6   zMobileBertIntermediate.forward  s&    

=100?r2   r7   r=   s   @r1   r   r     s#    9U\\ ell r2   r   c                   n     e Zd Z fdZdej
                  dej
                  dej
                  fdZ xZS )OutputBottleneckc                 .   t         |           t        j                  |j                  |j
                        | _        t        |j                     |j
                  |j                        | _
        t        j                  |j                        | _        y r   )r%   r&   r   rS   r   rJ   r   rU   rV   r   rW   rX   rY   rZ   r   s     r1   r&   zOutputBottleneck.__init__  sh    YYv668J8JK
 !:!:;F<N<NTZTiTijzz&"<"<=r2   r   r   r4   c                 r    | j                  |      }| j                  |      }| j                  ||z         }|S r$   )r   rZ   rW   r   s       r1   r6   zOutputBottleneck.forward$  s7    

=1]3}'FGr2   r7   r=   s   @r1   r   r     s1    >U\\ ELL UZUaUa r2   r   c                        e Zd Z fdZdej
                  dej
                  dej
                  dej
                  fdZ xZS )MobileBertOutputc                 r   t         |           |j                  | _        t        j                  |j
                  |j                        | _        t        |j                     |j                        | _
        | j                  s%t        j                  |j                        | _        y t        |      | _        y r$   )r%   r&   r   r   rS   r   r   r   rU   rV   rW   rX   rY   rZ   r   
bottleneckr   s     r1   r&   zMobileBertOutput.__init__,  s    $33YYv779P9PQ
 !:!:;F<S<ST""::f&@&@ADL.v6DOr2   intermediate_statesresidual_tensor_1residual_tensor_2r4   c                     | j                  |      }| j                  s'| j                  |      }| j                  ||z         }|S | j                  ||z         }| j	                  ||      }|S r$   )r   r   rZ   rW   r   )r-   r   r   r   layer_outputs        r1   r6   zMobileBertOutput.forward6  ss     zz"56""<<5L>>,9J*JKL   >>,9J*JKL??<9JKLr2   r7   r=   s   @r1   r   r   +  s?    7
#(<<
DILL
ejeqeq
	
r2   r   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )BottleneckLayerc                     t         |           t        j                  |j                  |j
                        | _        t        |j                     |j
                  |j                        | _
        y r   )r%   r&   r   rS   rJ   intra_bottleneck_sizer   rU   rV   r   rW   r   s     r1   r&   zBottleneckLayer.__init__D  sR    YYv1163O3OP
 !:!:;F<X<X^d^s^str2   r   r4   c                 J    | j                  |      }| j                  |      }|S r$   r   rW   )r-   r   r   s      r1   r6   zBottleneckLayer.forwardI  s$    jj/nn[1r2   r7   r=   s   @r1   r   r   C  s$    u
U\\ ell r2   r   c                   \     e Zd Z fdZdej
                  deej
                     fdZ xZS )
Bottleneckc                     t         |           |j                  | _        |j                  | _        t	        |      | _        | j                  rt	        |      | _        y y r$   )r%   r&   key_query_shared_bottleneckr   r   input	attentionr   s     r1   r&   zBottleneck.__init__P  sP    +1+M+M((.(G(G%$V,
++,V4DN ,r2   r   r4   c                     | j                  |      }| j                  r|fdz  S | j                  r| j                  |      }||||fS ||||fS )N   )r   r   r   r   )r-   r   bottlenecked_hidden_statesshared_attention_inputs       r1   r6   zBottleneck.forwardX  sc    " &*ZZ%>"((.0144--%)^^M%B"*,BMSmnn!=-A[\\r2   	r8   r9   r:   r&   r(   r;   r   r6   r<   r=   s   @r1   r   r   O  s+    5]U\\ ]eELL6I ]r2   r   c                   n     e Zd Z fdZdej
                  dej
                  dej
                  fdZ xZS )	FFNOutputc                     t         |           t        j                  |j                  |j
                        | _        t        |j                     |j
                  |j                        | _
        y r   )r%   r&   r   rS   r   r   r   rU   rV   r   rW   r   s     r1   r&   zFFNOutput.__init__t  sR    YYv779P9PQ
 !:!:;F<S<SY_YnYnor2   r   r   r4   c                 P    | j                  |      }| j                  ||z         }|S r$   r   r   s       r1   r6   zFFNOutput.forwardy  s)    

=1}'FGr2   r7   r=   s   @r1   r   r   s  s2    p
U\\ ELL UZUaUa r2   r   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )FFNLayerc                 b    t         |           t        |      | _        t	        |      | _        y r$   )r%   r&   r   intermediater   r   r   s     r1   r&   zFFNLayer.__init__  s'    26:'r2   r   r4   c                 L    | j                  |      }| j                  ||      }|S r$   )r   r   )r-   r   intermediate_outputr   s       r1   r6   zFFNLayer.forward  s*    "//>$7Gr2   r7   r=   s   @r1   r   r     s#    (
U\\ ell r2   r   c            
            e Zd Z fdZ	 ddej
                  dej                  dz  dee   de	ej
                     fdZ
 xZS )	MobileBertLayerc                    t         |           |j                  | _        |j                  | _        t	        |      | _        t        |      | _        t        |      | _	        | j                  rt        |      | _        |j                  dkD  rHt        j                  t        |j                  dz
        D cg c]  }t        |       c}      | _        y y c c}w Nr   )r%   r&   r   num_feedforward_networksr   r   r   r   r   r   r   r   r   
ModuleListranger   ffnr-   r^   _r0   s      r1   r&   zMobileBertLayer.__init__  s    $33(.(G(G%,V426:&v.(0DO**Q.}}fFeFehiFi@j%k1hv&6%klDH /%ks   6CNr   rz   r|   r4   c                 2   | j                   r| j                  |      \  }}}}n|gdz  \  }}}} | j                  |||||fi |\  }}	|}
| j                  dk7  r| j                  D ]
  } ||
      }
 | j                  |
      }| j                  ||
|      }|S )Nr   r   )r   r   r   r   r   r   r   )r-   r   rz   r|   r   r   r   r   self_attention_outputr   r   
ffn_moduler   r   s                 r1   r6   zMobileBertLayer.forward  s     BF//R_B`?L*lKCP/TUBU?L*lK#14>>$
 $
 q 1((A-"hh @
#-.>#? @ #//0@A{{#68H-Xr2   r$   r   r=   s   @r1   r   r     sW    m  48|| ))D0 +,	
 
u||	r2   r   c            
       t     e Zd Z fdZ	 ddej
                  dej                  dz  dee   de	e
z  fdZ xZS )	MobileBertEncoderc                     t         |           t        j                  t	        |j
                        D cg c]  }t        |       c}      | _        y c c}w r$   )r%   r&   r   r   r   num_hidden_layersr   layerr   s      r1   r&   zMobileBertEncoder.__init__  s<    ]]U6KcKcEd#eOF$;#ef
#es   ANr   rz   r|   r4   c                 h    t        | j                        D ]  \  }} |||fi |} t        |      S )N)last_hidden_state)	enumerater   r   )r-   r   rz   r|   ilayer_modules         r1   r6   zMobileBertEncoder.forward  sG      )4 	OA|( M	 ??r2   r$   )r8   r9   r:   r&   r(   r;   rv   r   r   r   r   r6   r<   r=   s   @r1   r   r     sX    g 48@||@ ))D0@ +,	@
 
	 @r2   r   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )MobileBertPoolerc                     t         |           |j                  | _        | j                  r0t	        j
                  |j                  |j                        | _        y y r$   )r%   r&   classifier_activationdo_activater   rS   rJ   r   r   s     r1   r&   zMobileBertPooler.__init__  sH    !776#5#5v7I7IJDJ r2   r   r4   c                     |d d df   }| j                   s|S | j                  |      }t        j                  |      }|S )Nr   )r  r   r(   tanh)r-   r   first_token_tensorpooled_outputs       r1   r6   zMobileBertPooler.forward  sE     +1a40%% JJ'9:M!JJ}5M  r2   r7   r=   s   @r1   r  r    s$    K	!U\\ 	!ell 	!r2   r  c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )!MobileBertPredictionHeadTransformc                 Z   t         |           t        j                  |j                  |j                        | _        t        |j                  t              rt        |j                     | _
        n|j                  | _
        t        d   |j                  |j                        | _        y )Nr>   r   )r%   r&   r   rS   rJ   r   r   r   r   r   transform_act_fnrU   r   rW   r   s     r1   r&   z*MobileBertPredictionHeadTransform.__init__  s|    YYv1163E3EF
f''-$*6+<+<$=D!$*$5$5D! .v/A/AvG\G\]r2   r   r4   c                 l    | j                  |      }| j                  |      }| j                  |      }|S r$   )r   r  rW   r   s     r1   r6   z)MobileBertPredictionHeadTransform.forward  s4    

=1--m<}5r2   r7   r=   s   @r1   r  r    s$    ^U\\ ell r2   r  c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )MobileBertLMPredictionHeadc                    t         |           t        |      | _        t	        j
                  |j                  |j                  |j                  z
  d      | _	        t	        j
                  |j                  |j                  d      | _
        t	        j                  t        j                  |j                              | _        y )NF)r*   T)r%   r&   r  	transformr   rS   rL   rJ   rI   r   decoderr'   r(   r)   r*   r   s     r1   r&   z#MobileBertLMPredictionHead.__init__  s    :6B YYv00&2D2DvG\G\2\chi
yy!6!68I8IPTULLV->->!?@	r2   r   r4   c                    | j                  |      }|j                  t        j                  | j                  j
                  j                         | j                  j
                  gd            }|| j                  j                  z  }|S )Nr   rj   )	r  r   r(   rn   r  r,   tr   r*   r   s     r1   r6   z"MobileBertLMPredictionHead.forward  sk    }5%,,UYY8K8K8M8M8OQUQ[Q[QbQb7cij-kl***r2   r7   r=   s   @r1   r  r    s$    AU\\ ell r2   r  c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )MobileBertOnlyMLMHeadc                 B    t         |           t        |      | _        y r$   )r%   r&   r  predictionsr   s     r1   r&   zMobileBertOnlyMLMHead.__init__  s    5f=r2   sequence_outputr4   c                 (    | j                  |      }|S r$   )r  )r-   r  prediction_scoress      r1   r6   zMobileBertOnlyMLMHead.forward  s     ,,_=  r2   r7   r=   s   @r1   r  r     s#    >!u|| ! !r2   r  c                   t     e Zd Z fdZdej
                  dej
                  deej
                     fdZ xZS )MobileBertPreTrainingHeadsc                     t         |           t        |      | _        t	        j
                  |j                  d      | _        y Nri   )r%   r&   r  r  r   rS   rJ   seq_relationshipr   s     r1   r&   z#MobileBertPreTrainingHeads.__init__  s4    5f= "		&*<*<a @r2   r  r
  r4   c                 N    | j                  |      }| j                  |      }||fS r$   )r  r"  )r-   r  r
  r  seq_relationship_scores        r1   r6   z"MobileBertPreTrainingHeads.forward  s0     ,,_=!%!6!6}!E "888r2   r   r=   s   @r1   r  r  
  s8    A
9u|| 9ELL 9UZ[`[g[gUh 9r2   r  c                   t     e Zd ZU eed<   dZdZdZdZdZ	dZ
eedZ ej                          fd       Z xZS )MobileBertPreTrainedModelr^   
mobilebertT)r   
attentionsc                    t         |   |       t        |t              r?t	        j
                  |j                         t	        j                  |j                         yt        |t              r t	        j
                  |j                         yt        |t              rZt	        j                  |j                  t        j                  |j                  j                  d         j!                  d             yy)zInitialize the weightsrF   rE   N)r%   _init_weightsr   r"   initzeros_r*   ones_r,   r  rA   copy_rD   r(   r\   r   r]   )r-   rw   r0   s     r1   r*  z'MobileBertPreTrainedModel._init_weights$  s     	f%ff%KK$JJv}}% :;KK$ 45JJv**ELL9L9L9R9RSU9V,W,^,^_f,gh 6r2   )r8   r9   r:   r    __annotations__base_model_prefixsupports_gradient_checkpointing_supports_flash_attn_supports_sdpa_supports_flex_attn_supports_attention_backendr   r   _can_record_outputsr(   no_gradr*  r<   r=   s   @r1   r&  r&    sX    $&*#N"&(-
 U]]_	i 	ir2   r&  z6
    Output type of [`MobileBertForPreTraining`].
    )custom_introc                       e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	ej                  dz  ed<   dZ
eej                     dz  ed<   dZeej                     dz  ed<   y)MobileBertForPreTrainingOutputa  
    loss (*optional*, returned when `labels` is provided, `torch.FloatTensor` of shape `(1,)`):
        Total loss as the sum of the masked language modeling loss and the next sequence prediction
        (classification) loss.
    prediction_logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`):
        Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
    seq_relationship_logits (`torch.FloatTensor` of shape `(batch_size, 2)`):
        Prediction scores of the next sequence prediction (classification) head (scores of True/False continuation
        before SoftMax).
    Nlossprediction_logitsseq_relationship_logitsr   r(  )r8   r9   r:   rt   r;  r(   rv   r/  r<  r=  r   r   r(   r2   r1   r:  r:  1  s~    	 &*D%

d
")26u((4/68<U..5<59M5**+d2926Je''(4/6r2   r:  c                       e Zd ZdZd fd	Zd Zd Zee	 	 	 	 	 dde	j                  dz  de	j                  dz  de	j                  dz  d	e	j                  dz  d
e	j                  dz  dee   deez  fd              Z xZS )MobileBertModelz2
    https://huggingface.co/papers/2004.02984
    c                     t         |   |       || _        d| _        t	        |      | _        t        |      | _        |rt        |      nd| _	        | j                          y)zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        FN)r%   r&   r^   gradient_checkpointingrA   rs   r   encoderr  pooler	post_init)r-   r^   add_pooling_layerr0   s      r1   r&   zMobileBertModel.__init__P  sV    
 	 &+#.v6(02C&v. 	r2   c                 .    | j                   j                  S r$   rs   rN   r-   s    r1   get_input_embeddingsz$MobileBertModel.get_input_embeddingsa  s    ...r2   c                 &    || j                   _        y r$   rH  )r-   rh   s     r1   set_input_embeddingsz$MobileBertModel.set_input_embeddingsd  s    */'r2   Nra   rz   rb   rD   rc   r|   r4   c                    |d u |d uz  rt        d      | j                  ||||      }t        | j                  ||      } | j                  |fd|i|}|d   }	| j
                  | j                  |	      nd }
t        |	|
      S )Nz:You must specify exactly one of input_ids or inputs_embeds)ra   rD   rb   rc   )r^   input_embedsrz   rz   r   )r   pooler_output)
ValueErrorrs   r   r^   rC  rD  r   )r-   ra   rz   rb   rD   rc   r|   embedding_outputencoder_outputsr  r
  s              r1   r6   zMobileBertModel.forwardg  s     -t";<YZZ??%)'	 + 
 3;;))
 '$,,
)
 

 *!,8<8OO4UY)-'
 	
r2   )T)NNNNN)r8   r9   r:   rt   r&   rJ  rL  r   r   r(   ru   rv   r   r   r   r   r6   r<   r=   s   @r1   r@  r@  J  s    "/0  .237260426$
##d*$
 ))D0$
 ((4/	$

 &&-$
 ((4/$
 +,$
 
+	+$
  $
r2   r@  z
    MobileBert Model with two heads on top as done during the pretraining: a `masked language modeling` head and a
    `next sentence prediction (classification)` head.
    c                   v    e Zd ZdddZ fdZd Zd Zddedz  d	ej                  f fd
Z
ee	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dee   d	eez  fd              Z xZS )MobileBertForPreTrainingcls.predictions.bias,mobilebert.embeddings.word_embeddings.weightzcls.predictions.decoder.biaszcls.predictions.decoder.weightc                     t         |   |       t        |      | _        t	        |      | _        | j                          y r$   )r%   r&   r@  r'  r  clsrE  r   s     r1   r&   z!MobileBertForPreTraining.__init__  s4     )&1-f5 	r2   c                 B    | j                   j                  j                  S r$   rY  r  r  rI  s    r1   get_output_embeddingsz.MobileBertForPreTraining.get_output_embeddings      xx##+++r2   c                     || j                   j                  _        |j                  | j                   j                  _        y r$   rY  r  r  r*   r-   new_embeddingss     r1   set_output_embeddingsz.MobileBertForPreTraining.set_output_embeddings  ,    '5$$2$7$7!r2   Nnew_num_tokensr4   c                     | j                  | j                  j                  j                  |d      | j                  j                  _        t        |   |      S NT)rd  
transposed)rd  _get_resized_lm_headrY  r  r   r%   resize_token_embeddingsr-   rd  r0   s     r1   rj  z0MobileBertForPreTraining.resize_token_embeddings  sR    %)%>%>HH  &&~RV &? &
" w.n.MMr2   ra   rz   rb   rD   rc   labelsnext_sentence_labelr|   c           	          | j                   |f||||dd|}	|	dd \  }
}| j                  |
|      \  }}d}|u|st               } ||j                  d| j                  j
                        |j                  d            } ||j                  dd      |j                  d            }||z   }t        ||||	j                  |	j                        S )a  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should be in `[-100, 0, ...,
            config.vocab_size]` (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]`
        next_sentence_label (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the next sequence prediction (classification) loss. Input should be a sequence pair
            (see `input_ids` docstring) Indices should be in `[0, 1]`:

            - 0 indicates sequence B is a continuation of sequence A,
            - 1 indicates sequence B is a random sequence.

        Examples:

        ```python
        >>> from transformers import AutoTokenizer, MobileBertForPreTraining
        >>> import torch

        >>> tokenizer = AutoTokenizer.from_pretrained("google/mobilebert-uncased")
        >>> model = MobileBertForPreTraining.from_pretrained("google/mobilebert-uncased")

        >>> input_ids = torch.tensor(tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)).unsqueeze(0)
        >>> # Batch size 1
        >>> outputs = model(input_ids)

        >>> prediction_logits = outputs.prediction_logits
        >>> seq_relationship_logits = outputs.seq_relationship_logits
        ```Trz   rb   rD   rc   return_dictNri   rF   )r;  r<  r=  r   r(  )	r'  rY  r   r   r^   rL   r:  r   r(  )r-   ra   rz   rb   rD   rc   rl  rm  r|   outputsr  r
  r  r$  
total_lossloss_fctmasked_lm_lossnext_sentence_losss                     r1   r6   z MobileBertForPreTraining.forward  s   R "$//
))%'
 
 *1!&48HH_m4\11
"5"A')H%&7&<&<RAWAW&XZ`ZeZefhZijN!)*@*E*Eb!*LNaNfNfgiNj!k'*<<J-/$:!//))
 	
r2   r$   NNNNNNN)r8   r9   r:   _tied_weights_keysr&   r\  rb  r   r   rK   rj  r   r   r(   ru   rv   r   r   r   r:  r6   r<   r=   s   @r1   rT  rT    s/    )?*X
,8NcDj NBLL N  .237260426*.7;@
##d*@
 ))D0@
 ((4/	@

 &&-@
 ((4/@
   4'@
 #--4@
 +,@
 
/	/@
  @
r2   rT  c                   V    e Zd ZdddZ fdZd Zd Zddedz  d	ej                  f fd
Z
ee	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dee   d	eez  fd              Z xZS )MobileBertForMaskedLMrU  rV  rW  c                     t         |   |       t        |d      | _        t	        |      | _        || _        | j                          y NF)rF  )r%   r&   r@  r'  r  rY  r^   rE  r   s     r1   r&   zMobileBertForMaskedLM.__init__  s=     )&EJ(0 	r2   c                 B    | j                   j                  j                  S r$   r[  rI  s    r1   r\  z+MobileBertForMaskedLM.get_output_embeddings  r]  r2   c                     || j                   j                  _        |j                  | j                   j                  _        y r$   r_  r`  s     r1   rb  z+MobileBertForMaskedLM.set_output_embeddings  rc  r2   Nrd  r4   c                     | j                  | j                  j                  j                  |d      | j                  j                  _        t        |   |      S rf  rh  rk  s     r1   rj  z-MobileBertForMaskedLM.resize_token_embeddings  sR    %)%>%>HH  &&~RV &? &
" w.n.MMr2   ra   rz   rb   rD   rc   rl  r|   c           	      :    | j                   |f||||dd|}|d   }	| j                  |	      }
d}|Ft               } ||
j                  d| j                  j
                        |j                  d            }t        ||
|j                  |j                        S )a  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should be in `[-100, 0, ...,
            config.vocab_size]` (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]`
        Tro  r   NrF   r;  logitsr   r(  )	r'  rY  r   r   r^   rL   r   r   r(  )r-   ra   rz   rb   rD   rc   rl  r|   rq  r  r  rt  rs  s                r1   r6   zMobileBertForMaskedLM.forward  s    $ "$//
))%'
 
 "!* HH_5')H%&7&<&<RAWAW&XZ`ZeZefhZijN$!//))	
 	
r2   r$   NNNNNN)r8   r9   r:   rw  r&   r\  rb  r   r   rK   rj  r   r   r(   ru   rv   r   r   r   r   r6   r<   r=   s   @r1   ry  ry    s    )?*X
,8NcDj NBLL N  .237260426*.'
##d*'
 ))D0'
 ((4/	'

 &&-'
 ((4/'
   4''
 +,'
 
	'
  '
r2   ry  c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )MobileBertOnlyNSPHeadc                 l    t         |           t        j                  |j                  d      | _        y r!  )r%   r&   r   rS   rJ   r"  r   s     r1   r&   zMobileBertOnlyNSPHead.__init__C  s'     "		&*<*<a @r2   r
  r4   c                 (    | j                  |      }|S r$   )r"  )r-   r
  r$  s      r1   r6   zMobileBertOnlyNSPHead.forwardG  s    !%!6!6}!E%%r2   r7   r=   s   @r1   r  r  B  s$    A&U\\ &ell &r2   r  zZ
    MobileBert Model with a `next sentence prediction (classification)` head on top.
    c                       e Zd Z fdZee	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	e	e
   d
eez  fd              Z xZS )#MobileBertForNextSentencePredictionc                     t         |   |       t        |      | _        t	        |      | _        | j                          y r$   )r%   r&   r@  r'  r  rY  rE  r   s     r1   r&   z,MobileBertForNextSentencePrediction.__init__R  s4     )&1(0 	r2   Nra   rz   rb   rD   rc   rl  r|   r4   c           	          | j                   |f||||dd|}|d   }	| j                  |	      }
d}|2t               } ||
j                  dd      |j                  d            }t	        ||
|j
                  |j                        S )a  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the next sequence prediction (classification) loss. Input should be a sequence pair
            (see `input_ids` docstring) Indices should be in `[0, 1]`.

            - 0 indicates sequence B is a continuation of sequence A,
            - 1 indicates sequence B is a random sequence.

        Examples:

        ```python
        >>> from transformers import AutoTokenizer, MobileBertForNextSentencePrediction
        >>> import torch

        >>> tokenizer = AutoTokenizer.from_pretrained("google/mobilebert-uncased")
        >>> model = MobileBertForNextSentencePrediction.from_pretrained("google/mobilebert-uncased")

        >>> prompt = "In Italy, pizza served in formal settings, such as at a restaurant, is presented unsliced."
        >>> next_sentence = "The sky is blue due to the shorter wavelength of blue light."
        >>> encoding = tokenizer(prompt, next_sentence, return_tensors="pt")

        >>> outputs = model(**encoding, labels=torch.LongTensor([1]))
        >>> loss = outputs.loss
        >>> logits = outputs.logits
        ```Tro  r   NrF   ri   r  )r'  rY  r   r   r   r   r(  )r-   ra   rz   rb   rD   rc   rl  r|   rq  r
  r$  ru  rs  s                r1   r6   z+MobileBertForNextSentencePrediction.forward[  s    L "$//
))%'
 
  
!%-!8!')H!)*@*E*Eb!*LfkkZ\o!^*#)!//))	
 	
r2   r  )r8   r9   r:   r&   r   r   r(   ru   rv   r   r   r   r   r6   r<   r=   s   @r1   r  r  L  s      .237260426*.;
##d*;
 ))D0;
 ((4/	;

 &&-;
 ((4/;
   4';
 +,;
 
,	,;
  ;
r2   r  z
    MobileBert Model transformer with a sequence classification/regression head on top (a linear layer on top of the
    pooled output) e.g. for GLUE tasks.
    c                   *    e Zd Z fdZee	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ee	   d
e
ej                     ez  fd              Z xZS )#MobileBertForSequenceClassificationc                 n   t         |   |       |j                  | _        || _        t	        |      | _        |j                  |j                  n|j                  }t        j                  |      | _
        t        j                  |j                  |j                        | _        | j                          y r$   )r%   r&   
num_labelsr^   r@  r'  classifier_dropoutrY   r   rX   rZ   rS   rJ   
classifierrE  r-   r^   r  r0   s      r1   r&   z,MobileBertForSequenceClassification.__init__  s      ++)&1)/)B)B)NF%%TZTnTn 	 zz"45))F$6$68I8IJ 	r2   Nra   rz   rb   rD   rc   rl  r|   r4   c           	          | j                   |f||||dd|}|d   }	| j                  |	      }	| j                  |	      }
d}|| j                  j                  | j
                  dk(  rd| j                  _        nl| j
                  dkD  rL|j                  t        j                  k(  s|j                  t        j                  k(  rd| j                  _        nd| j                  _        | j                  j                  dk(  rIt               }| j
                  dk(  r& ||
j                         |j                               }n ||
|      }n| j                  j                  dk(  r=t               } ||
j                  d| j
                        |j                  d            }n,| j                  j                  dk(  rt               } ||
|      }t        ||
|j                   |j"                  	      S )
a  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
        Tro  r   N
regressionsingle_label_classificationmulti_label_classificationrF   r  )r'  rZ   r  r^   problem_typer  re   r(   rm   r   r   squeezer   r   r   r   r   r(  )r-   ra   rz   rb   rD   rc   rl  r|   rq  r
  r  r;  rs  s                r1   r6   z+MobileBertForSequenceClassification.forward  s   $ "$//
))%'
 
  
]3/{{''/??a'/;DKK,__q(fllejj.HFLL\a\e\eLe/LDKK,/KDKK,{{''<7"9??a'#FNN$4fnn6FGD#FF3D))-JJ+-B @&++b/R))-II,./'!//))	
 	
r2   r  )r8   r9   r:   r&   r   r   r(   r;   r   r   r   r   r6   r<   r=   s   @r1   r  r    s      *..2.2,0-1&*;
<<$&;
 t+;
 t+	;

 llT);
 ||d*;
 t#;
 +,;
 
u||	7	7;
  ;
r2   r  c                   J    e Zd Z fdZee	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ej                  dz  d
ee	   de
ej                     ez  fd              Z xZS )MobileBertForQuestionAnsweringc                     t         |   |       |j                  | _        t        |d      | _        t        j                  |j                  |j                        | _        | j                          y r{  )
r%   r&   r  r@  r'  r   rS   rJ   
qa_outputsrE  r   s     r1   r&   z'MobileBertForQuestionAnswering.__init__  sU      ++)&EJ))F$6$68I8IJ 	r2   Nra   rz   rb   rD   rc   start_positionsend_positionsr|   r4   c           	          | j                   |f||||dd|}	|	d   }
| j                  |
      }|j                  dd      \  }}|j                  d      j	                         }|j                  d      j	                         }d }||t        |j                               dkD  r|j                  d      }t        |j                               dkD  r|j                  d      }|j                  d      }|j                  d|      }|j                  d|      }t        |      } |||      } |||      }||z   dz  }t        ||||	j                  |	j                  	      S )
NTro  r   r   rF   rj   )ignore_indexri   )r;  start_logits
end_logitsr   r(  )r'  r  splitr  r   lenrl   clampr   r   r   r(  )r-   ra   rz   rb   rD   rc   r  r  r|   rq  r  r  r  r  rr  ignored_indexrs  
start_lossend_losss                      r1   r6   z&MobileBertForQuestionAnswering.forward  s    "$//
))%'
 
 "!*1#)<<r<#: j#++B/::<''+668

&=+D?'')*Q."1"9"9""==%%'(1, - 5 5b 9(--a0M-33A}EO)//=AM']CH!,@J
M:H$x/14J+%!!//))
 	
r2   rv  )r8   r9   r:   r&   r   r   r(   r;   r   r   r   r   r6   r<   r=   s   @r1   r  r    s      *..2.2,0-1/3-13
<<$&3
 t+3
 t+	3

 llT)3
 ||d*3
 ,3
 ||d*3
 +,3
 
u||	;	;3
  3
r2   r  c                   *    e Zd Z fdZee	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ee	   d
e
ej                     ez  fd              Z xZS )MobileBertForMultipleChoicec                 *   t         |   |       t        |      | _        |j                  |j                  n|j
                  }t        j                  |      | _        t        j                  |j                  d      | _        | j                          y r   )r%   r&   r@  r'  r  rY   r   rX   rZ   rS   rJ   r  rE  r  s      r1   r&   z$MobileBertForMultipleChoice.__init__:  su     )&1)/)B)B)NF%%TZTnTn 	 zz"45))F$6$6: 	r2   Nra   rz   rb   rD   rc   rl  r|   r4   c           	         ||j                   d   n|j                   d   }|!|j                  d|j                  d            nd}|!|j                  d|j                  d            nd}|!|j                  d|j                  d            nd}|!|j                  d|j                  d            nd}|1|j                  d|j                  d      |j                  d            nd} | j                  |f||||dd|}	|	d   }
| j	                  |
      }
| j                  |
      }|j                  d|      }d}|t               } |||      }t        |||	j                  |	j                        S )a[  
        input_ids (`torch.LongTensor` of shape `(batch_size, num_choices, sequence_length)`):
            Indices of input sequence tokens in the vocabulary.

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

            [What are input IDs?](../glossary#input-ids)
        token_type_ids (`torch.LongTensor` of shape `(batch_size, num_choices, sequence_length)`, *optional*):
            Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
            1]`:

            - 0 corresponds to a *sentence A* token,
            - 1 corresponds to a *sentence B* token.

            [What are token type IDs?](../glossary#token-type-ids)
        position_ids (`torch.LongTensor` of shape `(batch_size, num_choices, sequence_length)`, *optional*):
            Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
            config.max_position_embeddings - 1]`.

            [What are position IDs?](../glossary#position-ids)
        inputs_embeds (`torch.FloatTensor` of shape `(batch_size, num_choices, 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.
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the multiple choice classification loss. Indices should be in `[0, ...,
            num_choices-1]` where `num_choices` is the size of the second dimension of the input tensors. (See
            `input_ids` above)
        Nr   rF   r   Tro  r  )
r   r   rl   r'  rZ   r  r   r   r   r(  )r-   ra   rz   rb   rD   rc   rl  r|   num_choicesrq  r
  r  reshaped_logitsr;  rs  s                  r1   r6   z#MobileBertForMultipleChoice.forwardG  s   T -6,Aiooa(}GZGZ[\G]>G>SINN2y~~b'9:Y]	M[Mg,,R1D1DR1HImqM[Mg,,R1D1DR1HImqGSG_|((\->->r-BCei ( r=#5#5b#9=;M;Mb;QR 	 "$//
))%'
 
  
]3/ ++b+6')HOV4D("!//))	
 	
r2   r  )r8   r9   r:   r&   r   r   r(   r;   r   r   r   r   r6   r<   r=   s   @r1   r  r  7  s      *..2.2,0-1&*N
<<$&N
 t+N
 t+	N

 llT)N
 ||d*N
 t#N
 +,N
 
u||	8	8N
  N
r2   r  c                   *    e Zd Z fdZee	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ee	   d
e
ej                     ez  fd              Z xZS ) MobileBertForTokenClassificationc                 d   t         |   |       |j                  | _        t        |d      | _        |j
                  |j
                  n|j                  }t        j                  |      | _	        t        j                  |j                  |j                        | _        | j                          y r{  )r%   r&   r  r@  r'  r  rY   r   rX   rZ   rS   rJ   r  rE  r  s      r1   r&   z)MobileBertForTokenClassification.__init__  s      ++)&EJ)/)B)B)NF%%TZTnTn 	 zz"45))F$6$68I8IJ 	r2   Nra   rz   rb   rD   rc   rl  r|   r4   c           	      H    | j                   |f||||dd|}|d   }	| j                  |	      }	| j                  |	      }
d}|<t               } ||
j	                  d| j
                        |j	                  d            }t        ||
|j                  |j                        S )z
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the token classification loss. Indices should be in `[0, ..., config.num_labels - 1]`.
        Tro  r   NrF   r  )	r'  rZ   r  r   r   r  r   r   r(  )r-   ra   rz   rb   rD   rc   rl  r|   rq  r  r  r;  rs  s                r1   r6   z(MobileBertForTokenClassification.forward  s      "$//
))%'
 
 "!*,,71')HFKKDOO<fkk"oND$!//))	
 	
r2   r  )r8   r9   r:   r&   r   r   r(   r;   r   r   r   r   r6   r<   r=   s   @r1   r  r    s      *..2.2,0-1&*'
<<$&'
 t+'
 t+	'

 llT)'
 ||d*'
 t#'
 +,'
 
u||	4	4'
  '
r2   r  )
ry  r  r  rT  r  r  r  r   r@  r&  )Nrg   )Scollections.abcr   dataclassesr   r(   r   torch.nnr   r   r    r
   r+  activationsr   masking_utilsr   modeling_layersr   modeling_outputsr   r   r   r   r   r   r   r   modeling_utilsr   r   processing_utilsr   utilsr   r   r   r   utils.genericr   r   configuration_mobilebertr    
get_loggerr8   loggerModuler"   rW   rU   rA   r;   floatr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r&  r:  r@  rT  ry  r  r  r  r  r  r  __all__r>  r2   r1   <module>r     s  . % !   A A & ! 6 9	 	 	 G & M M A 6 
		H	%6RYY 6 &
9I299 If !%II%<<% 
% <<	%
 LL4'% T\% % '(%:1)bii 1)h299 ".")) .8RYY ryy ryy 0	bii 	!] !]H			 		ryy 	)0 )X@		 @(!ryy !&		 " "!BII !	9 	9 i i i4 
7[ 7 7& B
/ B
 B
J _
8 _
_
D F
5 F
 F
R&BII & 
G
*C G

G
T M
*C M
M
` @
%> @
 @
F ^
"; ^
 ^
B 8
'@ 8
 8
vr2   