
    3j`                        S SK r S SKJr  S SKJr  S SKrS SKJr  SSKJr  SSK	J
r
  SSKJr  SS	KJr  SS
KJrJrJr  SSKJrJr  SSKJr  SSKJrJrJrJrJr  SSKJr  SSK J!r!  SSK"J#r#  SSK$J%r%J&r&  \RN                  " \(5      r)  S2S\RT                  S\RV                  S\RV                  S\RV                  S\RV                  S-  S\,S-  S\,4S jjr- " S S\RT                  5      r. " S S\5      r/\ " S  S!\5      5       r0\" S"S#9 " S$ S%\05      5       r1 " S& S'\RT                  5      r2\" S(S#9\ " S) S*\5      5       5       r3\" S+S#9 " S, S-\05      5       r4\" S.S#9 " S/ S0\0\5      5       r5/ S1Qr6g)3    N)Callable)	dataclass)nn   )ACT2FN)Cache)GenerationMixin)GradientCheckpointingLayer)BaseModelOutputWithPastBaseModelOutputWithPoolingCausalLMOutputWithPast)ALL_ATTENTION_FUNCTIONSPreTrainedModel)Unpack)TransformersKwargsauto_docstringcan_return_tupleloggingtorch_compilable_check)merge_with_config_defaults)capture_outputs   )	AutoModel   )VoxtralConfigVoxtralEncoderConfigmodulequerykeyvalueattention_maskscalingdropoutc                    Uc  UR                  S5      S-  n[        R                  " XR                  SS5      5      U-  nUb  X-   n[        R
                  R                  USS9n[        R
                  R                  XU R                  S9n[        R                  " X5      n	U	R                  SS5      R                  5       n	X4$ )N      r   r   )dimptrainingr   )
sizetorchmatmul	transposer   
functionalsoftmaxr#   r*   
contiguous)
r   r   r   r    r!   r"   r#   kwargsattn_weightsattn_outputs
             f/home/wildlama/miniconda3/lib/python3.13/site-packages/transformers/models/voxtral/modeling_voxtral.pyeager_attention_forwardr6   .   s     **R.D(<<}}Q':;gEL!#4==((2(>L==((6??([L,,|3K''1-88:K$$    c                   @  ^  \ rS rSrSr      SS\S\S\S\S\S	\S
\S-  S\S-  4U 4S jjjr	S\
R                  S\S\4S jr  SS\
R                  S\
R                  S-  S\S\\
R                  \
R                  S-  \\
R                     S-  4   4S jjrSrU =r$ )VoxtralAttentionH   z=Multi-headed attention from 'Attention Is All You Need' paperN	embed_dim	num_headsr#   
is_decoderbias	is_causal	layer_idxconfigc	                 `  > [         T	U ]  5         Xl        X l        X0l        X-  U l        Xl        U R
                  U-  U R                  :w  a  [        SU R                   SU S35      eU R
                  S-  U l        X@l	        X`l
        Uc4  U(       a-  [        R                  SU R                  R                   S35        Xpl        [         R"                  " XSS9U l        [         R"                  " XUS9U l        [         R"                  " XUS9U l        [         R"                  " XUS9U l        g )	Nz;embed_dim must be divisible by num_heads (got `embed_dim`: z and `num_heads`: z).r&   zInstantiating a decoder z without passing `layer_idx` is not recommended and will to errors during the forward call, if caching is used. Please make sure to provide a `layer_idx` when creating this class.Fr>   )super__init__r;   r<   r#   head_dimrA   
ValueErrorr"   r=   r?   loggerwarning_once	__class____name__r@   r   Lineark_projv_projq_projout_proj)
selfr;   r<   r#   r=   r>   r?   r@   rA   rJ   s
            r5   rE   VoxtralAttention.__init__K   s    	""!.MMI%$..8MdnnM]$YKr3  }}d*$"*4>>+B+B*C D, ,
 #ii	5Aii	4@ii	4@		)TBr7   tensorseq_lenbszc                     UR                  X2U R                  U R                  5      R                  SS5      R	                  5       $ )Nr   r   )viewr<   rF   r.   r1   )rQ   rS   rT   rU   s       r5   _shapeVoxtralAttention._shapes   s5    {{3GQQRSUVWbbddr7   hidden_statesr!   output_attentionsreturnc                 2   UR                  5       u  pVnU R                  U R                  U5      U R                  -  Xe5      nU R                  U R	                  U5      SU5      n	U R                  U R                  U5      SU5      n
[        R                  " U R                  R                  [        5      nU" U UU	U
U4U R                  (       d  SOU R                  SUS.UD6u  pUR                  XVS5      R                  5       nU R                  U5      nX4$ )z#Input shape: Batch x Time x Channelr%                 ?)r#   r"   r[   )r+   rX   rO   r"   rM   rN   r   get_interfacerA   _attn_implementationr6   r*   r#   reshaper1   rP   )rQ   rZ   r!   r[   r2   rU   tgt_len_query_states
key_statesvalue_statesattention_interfacer4   r3   s                 r5   forwardVoxtralAttention.forwardv   s	    (,,.a {{4;;}#=#Lg[[[]!;RE
{{4;;}#=r3G(?(M(MKK,,.E)
 %8
%
  $}}C$,,/
%
 
%
! "))#;FFHmmK0((r7   )rA   r#   r;   rF   r?   r=   rM   r@   r<   rP   rO   r"   rN   )r^   FTFNNNF)rK   
__module____qualname____firstlineno____doc__intfloatboolr   rE   r,   TensorrX   tupleri   __static_attributes____classcell__rJ   s   @r5   r9   r9   H   s   G   $'+&C&C &C 	&C
 &C &C &C :&C $&C &CPeU\\ eC ec e /3"'	')||') t+')  	') 
u||U\\D0%2E2LL	M') ')r7   r9   c                      ^  \ rS rSrS\4U 4S jjrS\R                  S\R                  S\\	   S\R                  4S jr
S	rU =r$ )
VoxtralEncoderLayer   rA   c                 j  > [         TU ]  5         UR                  U l        [	        U R                  UR
                  UR                  US9U l        [        R                  " U R                  5      U l
        UR                  U l        [        UR                     U l        UR                  U l        [        R                   " U R                  UR"                  5      U l        [        R                   " UR"                  U R                  5      U l        [        R                  " U R                  5      U l        g )N)r;   r<   r#   rA   )rD   rE   d_modelr;   r9   encoder_attention_headsattention_dropout	self_attnr   	LayerNormself_attn_layer_normr#   r   activation_functionactivation_fnactivation_dropoutrL   encoder_ffn_dimfc1fc2final_layer_normrQ   rA   rJ   s     r5   rE   VoxtralEncoderLayer.__init__   s    )nn44,,	
 %'LL$@!~~#F$>$>?"(";";99T^^V-C-CD99V33T^^D "T^^ <r7   rZ   r!   r2   r\   c                    UnU R                  U5      nU R                  " SUUS.UD6u  p[        R                  R	                  XR                  U R
                  S9nXA-   nUnU R                  U5      nU R                  U R                  U5      5      n[        R                  R	                  XR                  U R
                  S9nU R                  U5      n[        R                  R	                  XR                  U R
                  S9nXA-   nUR                  [        R                  :X  aC  [        R                  " UR                  5      R                  S-
  n[        R                   " X* US9nU$ )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.
)rZ   r!   r(   i  )minmax )r   r   r   r/   r#   r*   r   r   r   r   r   dtyper,   float16finfor   clamp)rQ   rZ   r!   r2   residualrd   clamp_values          r5   ri   VoxtralEncoderLayer.forward   sD    !11-@>> 
')
 

 --m||VZVcVc-d 0 --m<**488M+BC--m?V?Vaeanan-o/--m||VZVcVc-d 0%--/++m&9&9:>>EK!KK<[YMr7   )	r   r   r#   r;   r   r   r   r   r   )rK   rl   rm   rn   r   rE   r,   rs   r   r   ri   ru   rv   rw   s   @r5   ry   ry      sQ    =} =$"||" " +,	"
 
" "r7   ry   c                   N    \ rS rSr% \\S'   SrSrSrSr	S/r
SrSrSrSrSrSrSrg)	VoxtralPreTrainedModel   rA   model)audiotextTNpast_key_valuesr   )rK   rl   rm   rn   r   __annotations__base_model_prefixinput_modalitiessupports_gradient_checkpointing_no_split_modules_skip_keys_device_placement_supports_flash_attn_supports_sdpa_supports_flex_attn_supports_cache_class_supports_attention_backend_can_compile_fullgraphru   r   r7   r5   r   r      sL    (&*##4"5N "&!r7   r   z:
    The Voxtral encoder, which is a Whisper encoder.
    custom_introc                      ^  \ rS rSr% Sr\\S'   SrSrS/r	\
\S.rS\4U 4S jjrS	 rS
\R                   4S jrS\R                   4S jr\\ SS\\   S
\\-  4S jj5       5       rS\R6                  4S jrSrU =r$ )VoxtralEncoder   z
Transformer encoder consisting of *config.encoder_layers* self attention layers. Each layer is a
[`VoxtralEncoderLayer`].

Args:
    config: VoxtralEncoderConfig
rA   input_featuresr   ry   )
attentionsrZ   c                 l  > [         TU ]  U5        UR                  U l        UR                  U l        UR
                  nUR                  U l        UR                  U l        UR                  (       a  [        R                  " U5      OSU l        [        R                  " U R                  USSS9U l        [        R                  " X"SSSS9U l        [        R                   " U R                  U5      U l        U R"                  R%                  S5        [        R&                  " [)        UR*                  5       Vs/ s H  n[-        U5      PM     sn5      U l        [        R0                  " UR
                  5      U l        [        R4                  " SSS9U l        SU l        U R;                  5         g s  snf )	Nr_   r   r   )kernel_sizepaddingr   )r   strider   F)r   )rD   rE   r#   encoder_layerdrop	layerdropr|   num_mel_binsmax_source_positionsscale_embeddingmathsqrtembed_scaler   Conv1dconv1conv2	Embeddingembed_positionsrequires_grad_
ModuleListrangeencoder_layersry   layersr   
layer_norm	AvgPool1d
avg_poolergradient_checkpointing	post_init)rQ   rA   r;   rd   rJ   s       r5   rE   VoxtralEncoder.__init__   s:    ~~11NN	"//$*$?$?!393I3I499Y/sYYt00)TUV
YYy1VWX
!||D,E,EyQ++E2mm%PVPePeJf$gJfQ%8%@Jf$gh,,v~~6,,q3&+# %hs   9F1c                 N    U R                  5        H
  nSUl        M     SU l        g rk   )
parametersrequires_grad_requires_grad)rQ   params     r5   _freeze_parameters!VoxtralEncoder._freeze_parameters  s#    __&E"'E '#r7   r\   c                     U R                   $ Nr   )rQ   s    r5   get_input_embeddings#VoxtralEncoder.get_input_embeddings  s    zzr7   r    c                     Xl         g r   r   )rQ   r    s     r5   set_input_embeddings#VoxtralEncoder.set_input_embeddings!  s    
r7   r2   c           	         U R                   R                  U R                  R                  S   -  U R                  R                  S   -  nUR
                  S   U:w  a"  [        SU SUR
                  S    SU S35      eUR                  U R                  R                  R                  U R                  R                  R                  S9n[        R                  R                  U R                  U5      5      n[        R                  R                  U R	                  U5      5      nUR                  SSS	5      nU R                  R                  nXV-   R                  UR                  5      n[        R                  R!                  XpR                   U R"                  S
9n[%        U R&                  5       H  u  pU	" UUS9nM     U R)                  U5      n[+        US9$ )a  
Args:
    input_features (`torch.LongTensor` of shape `(batch_size, feature_size, sequence_length)`):
        Float values of mel features extracted from the raw speech waveform. Raw speech waveform can be
        obtained by loading a `.flac` or `.wav` audio file into an array of type `list[float]` or a
        `numpy.ndarray`, *e.g.* via the soundfile library (`pip install soundfile`). To prepare the array into
        `input_features`, the [`AutoFeatureExtractor`] should be used for extracting the mel features, padding
        and conversion into a tensor of type `torch.FloatTensor`. See [`~WhisperFeatureExtractor.__call__`]
    attention_mask (`torch.Tensor`)`, *optional*):
        Voxtral does not support masking of the `input_features`, this argument is preserved for compatibility,
        but it is not used. By default the silence in the input log mel spectrogram are ignored.
r   r%   z7Voxtral expects the mel input features to be of length z, but found z-. Make sure to pad the input mel features to .r   devicer   r   r(   )r!   )last_hidden_state)rA   r   r   r   r   shaperG   toweightr   r   r   r/   gelupermuter   r#   r*   	enumerater   r   r   )
rQ   r   r!   r2   expected_seq_lengthinputs_embeds	embed_posrZ   idxencoder_layers
             r5   ri   VoxtralEncoder.forward$  s   ( #kk>>ARARSTAUUX\XbXbXiXijkXll#'::IJ]I^^jkykk  AC  lD  kE  Er  sF  rG  GH  I  (**1B1B1H1HQUQ[Q[QbQbQiQi*j**4::n+EF**4::m+DE%--aA6((//	&266}7J7JK--m||VZVcVc-d"+DKK"8C)-M #9 6)+
 	
r7   input_lengthsc                 4    US-
  S-  S-   nUS-
  S-  S-   nX4$ )zc
Computes the output length of the convolutional layers and the output length of the audio encoder
r   r   r   )rQ   r   output_lengthss      r5    _get_feat_extract_output_lengths/VoxtralEncoder._get_feat_extract_output_lengthsT  s5     '*q014'!+1A5,,r7   )r   r   r   r   r#   r   r   r   r   r   r   r   r   r   )rK   rl   rm   rn   ro   r   r   main_input_namer   r   r9   ry   _can_record_outputsrE   r   r   Moduler   r   r   r   r   r   rt   r   ri   r,   
LongTensorr   ru   rv   rw   s   @r5   r   r      s     ! &O./&,
3 2$
bii "))    +
 +,	+

 
+	++
   +
\-e>N>N - -r7   r   c                   6   ^  \ rS rSrS\4U 4S jjrS rSrU =r$ )VoxtralMultiModalProjectori]  rA   c                 ^  > [         TU ]  5         [        R                  " UR                  R
                  UR                  R                  SS9U l        [        UR                     U l        [        R                  " UR                  R                  UR                  R                  SS9U l        g NFrC   )rD   rE   r   rL   audio_configintermediate_sizetext_confighidden_sizelinear_1r   projector_hidden_actactlinear_2r   s     r5   rE   #VoxtralMultiModalProjector.__init__^  sz    		&"5"5"G"GI[I[IgIgnst&556		&"4"4"@"@&BTBTB`B`glmr7   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ r   )r   r   r   )rQ   audio_featuresrZ   s      r5   ri   "VoxtralMultiModalProjector.forwardd  s2    n5/m4r7   )r   r   r   )	rK   rl   rm   rn   r   rE   ri   ru   rv   rw   s   @r5   r   r   ]  s    n} n r7   r   zL
    Base class for Voxtral outputs, with hidden states and attentions.
    c                   B    \ rS rSr% SrSr\R                  S-  \S'   Sr	g)VoxtralModelOutputWithPastik  z[
audio_hidden_states (`torch.FloatTensor`, *optional*):
    Projected audio hidden states.
Naudio_hidden_statesr   )
rK   rl   rm   rn   ro   r  r,   FloatTensorr   ru   r   r7   r5   r  r  k  s    
 59**T18r7   r  z
    The Voxtral model, which consists of Whisper encoder, a multi-modal projector and a Llama language model,
    without a language modeling head.
    c                     ^  \ rS rSrU 4S jr\\" SS9S\R                  S\	\
   S\\-  4S j5       5       rS	\R                  S
\R                  S\R                  4S jr\\       SS	\R                  S-  S\R                  S-  S\R                   S-  S\R                  S-  S\S-  S
\R                  S-  S\S-  S\	\
   S\\-  4S jj5       5       rSrU =r$ )VoxtralModeliz  c                    > [         TU ]  U5        [        R                  " UR                  5      U l        [        R                  " UR                  5      U l        [        U5      U l	        U R                  5         g r   )rD   rE   r   from_configr   audio_towerr   language_modelr   multi_modal_projectorr   r   s     r5   rE   VoxtralModel.__init__  sY     $001D1DE'33F4F4FG%?%G"r7   zThis method is used to get the audio embeddings from input features (a log mel spectrogram), meaning inferring the audio encoder and the multi-modal projector.r   r   r2   r\   c                     U R                   " U4SS0UD6nUR                  nUR                  SU R                  R                  R
                  5      nU R                  U5      nXSl        U$ )a)  
input_features (`torch.FloatTensor`):
    Float values of mel features extracted from the raw speech waveform. Raw speech waveform can be
    obtained by loading a `.flac` or `.wav` audio file into an array of type `list[float]` or a
    `numpy.ndarray`, *e.g.* via the soundfile library (`pip install soundfile`). To prepare the array into
    `input_features`, the [`AutoFeatureExtractor`] should be used for extracting the mel features, padding
    and conversion into a tensor of type `torch.FloatTensor`. See [`~WhisperFeatureExtractor.__call__`]
return_dictTr%   )r  r   rb   rA   r   r   r  pooler_output)rQ   r   r2   audio_outputsr  audio_embedss         r5   get_audio_featuresVoxtralModel.get_audio_features  sj     ((TTTVT+==199"dkk>V>V>h>hi112EF&2#r7   	input_idsr   r  c           	      &   Ucj  X R                  5       " [        R                  " U R                  R                  [        R
                  UR                  S95      :H  nUR                  S5      nOXR                  R                  :H  nUR                  5       nUR                  S   nUR                  S5      R                  U5      R                  UR                  5      n[        X$   R                  5       UR                  5       :H  SU SU 35        U$ )z
Obtains multimodal placeholder mask from `input_ids` or `inputs_embeds`, and checks that the placeholder token count is
equal to the length of multimodal features. If the lengths are different, an error is raised.
r   r%   r   z6Audio features and audio tokens do not match, tokens: z, features: )r   r,   rS   rA   audio_token_idlongr   allsumr   	unsqueeze	expand_asr   r   numel)rQ   r  r   r  special_audio_maskn_audio_tokensn_audio_featuress          r5   get_placeholder_mask!VoxtralModel.get_placeholder_mask  s     !.2K2K2MT[[77uzzR_RfRfg3 " "4!7!7!;!*kk.H.H!H+//1)//2/99"=GGVYYZgZnZno-3359M9M9OOD^DTT`aq`rs	
 "!r7   Nr!   position_idsr   	use_cachec           	         Uc  U R                  5       " U5      nS n	UbW  UbT  U R                  USS9R                  n	U R                  XU	S9n
UR	                  XR                  UR                  5      5      nU R                  " SUUUUUS.UD6n[        UR                  UR                  UR                  UR                  U	S9$ )NT)r  )r   r  )r!   r&  r   r   r'  )r   r   rZ   r   r  r   )r   r  r  r$  masked_scatterr   r   r  r  r   r   rZ   r   )rQ   r  r   r!   r&  r   r   r'  r2   r  r!  outputss               r5   ri   VoxtralModel.forward  s       557	BM%)*?22>t2TbbL "&!:!:| "; " *889K__]j]q]qMrsM+/+>+> ,
)%+',
 ,
 *%77#33!//)) ,
 	
r7   )r  r  r  )NNNNNNN)rK   rl   rm   rn   rE   r   r   r,   r  r   r   rt   r   r  r   r$  rs   r   rr   r  ri   ru   rv   rw   s   @r5   r
  r
  z  s\     w#//;ABT;U	+	+ &"))":?:K:K"]b]n]n"0  .237.204(,26!%'
##d*'
 ))D0'
 t+	'

 &&-'
 '
 ((4/'
 $;'
 +,'
 
+	+'
  '
r7   r
  zs
    The Voxtral model, which consists of Whisper encoder, a multi-modal projector and a Llama language model.
    c                   n  ^  \ rS rSrS/rU 4S jrS r\\         SS\	R                  S-  S\	R                  S-  S\	R                  S-  S	\	R                  S-  S
\S-  S\	R                  S-  S\	R                  S-  S\S-  S\\	R                  -  S\\   S\\-  4S jj5       5       rU 4S jrSrU =r$ )VoxtralForConditionalGenerationi  r   c                    > [         TU ]  U5        [        U5      U l        [        R
                  " UR                  R                  UR                  R                  SS9U l	        U R                  5         g r   )rD   rE   r
  r   r   rL   r   r   
vocab_sizelm_headr   r   s     r5   rE   (VoxtralForConditionalGeneration.__init__  sS     !&)
yy!3!3!?!?ASASA^A^ejkr7   c                 :    U R                   R                  " U0 UD6$ r   )r   r  )rQ   argsr2   s      r5   r  2VoxtralForConditionalGeneration.get_audio_features  s    zz,,d=f==r7   Nr  r   r!   r&  r   r   labelsr'  logits_to_keepr2   r\   c
                    U R                   " SUUUUUUUS.U
D6nUR                  n[        U	[        5      (       a  [	        U	* S5      OU	nU R                  USS2USS24   5      nSnUb3  U R                  " SXU R                  R                  R                  S.U
D6n[        UUUR                  UR                  UR                  S9$ )a  
Example:

```python
>>> from transformers import VoxtralForConditionalGeneration, AutoProcessor
>>> import torch

>>> device = "cuda" if torch.cuda.is_available() else "cpu"
>>> repo_id = "mistralai/Voxtral-Mini-3B-2507"

>>> processor = AutoProcessor.from_pretrained(repo_id)
>>> model = VoxtralForConditionalGeneration.from_pretrained(repo_id, dtype=torch.bfloat16, device_map=device)

>>> conversation = [
    {
        "role": "user",
        "content": [
            {
                "type": "audio",
                "url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/dude_where_is_my_car.wav",
            },
            {"type": "text", "text": "What can you tell me about this audio?"},
        ],
    }
]

>>> inputs = processor.apply_chat_template(conversation)
>>> inputs = inputs.to(device, dtype=torch.bfloat16)

>>> outputs = model.generate(**inputs, max_new_tokens=30)
>>> processor.batch_decode(outputs[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)
["This audio is a humorous conversation between two friends, likely in English, where one of them is trying to figure out what the other's tattoo says."]
```)r  r   r!   r&  r   r   r'  N)logitsr5  r/  )lossr8  r   rZ   r   r   )r   r   
isinstancerp   slicer0  loss_functionrA   r   r/  r   r   rZ   r   )rQ   r  r   r!   r&  r   r   r5  r'  r6  r2   r*  rZ   slice_indicesr8  r9  s                   r5   ri   'VoxtralForConditionalGeneration.forward  s    ` ** 	
))%+'	
 	
  118B>SV8W8W~ot4]kmA}a,?@A%% 9P9P9[9[_eD &#33!//))
 	
r7   c                    > UR                  SS 5      nUR                  SS5      n[        TU ]  " U0 UD6nU(       d  UR                  SS5      (       d  X5S'   U$ )Nr   is_first_iterationFr'  T)popgetrD   prepare_inputs_for_generation)rQ   r3  r2   r   r@  model_inputsrJ   s         r5   rC  =VoxtralForConditionalGeneration.prepare_inputs_for_generationA  s^      $4d;#ZZ(<eDw<dMfMVZZT%B%B-;)*r7   )r0  r   )	NNNNNNNNr   )rK   rl   rm   rn   _keep_in_fp32_modules_strictrE   r  r   r   r,   r   r  rs   r   rr   rp   r   r   rt   r   ri   rC  ru   rv   rw   s   @r5   r-  r-    s2    %6#6 >  .237.204(,26*.!%-.I
##d*I
 ))D0I
 t+	I

 &&-I
 I
 ((4/I
   4'I
 $;I
 ell*I
 +,I
 
'	'I
  I
V r7   r-  )r   r   r
  r-  )Nr^   )7r   collections.abcr   dataclassesr   r,   r   activationsr   cache_utilsr   
generationr	   modeling_layersr
   modeling_outputsr   r   r   modeling_utilsr   r   processing_utilsr   utilsr   r   r   r   r   utils.genericr   utils.output_capturingr   autor   configuration_voxtralr   r   
get_loggerrK   rH   r   rs   rq   r6   r9   ry   r   r   r   r  r
  r-  __all__r   r7   r5   <module>rW     s  ,  $ !   !   ) 9 k k F & j j 7 5  F 
		H	% !%II%<<% 
% <<	%
 LL4'% T\% %4U)ryy U)p54 5p "_ " " 
m-+ m-
m-`  
 9!8 9 9 `
) `
`
F 
e&<o e
eP jr7   