
     `in`              	          d Z ddlZddlZddlmZ ddlmZmZ ddlZddl	m
c mZ ddl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mZ ddlmZ  ej        e          Zd.dej        de de!dej        fd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
j#                  Z( G d d e
j#                  Z) G d! d"e
j#                  Z* G d# d$e
j#                  Z+e G d% d&e                      Z,e G d' d(e,                      Z- ed)*           G d+ d,e,                      Z.g d-Z/dS )/zPyTorch PVT model.    N)Iterable)OptionalUnion)nn   )ACT2FN)BaseModelOutputImageClassifierOutput)PreTrainedModel) find_pruneable_heads_and_indicesprune_linear_layer)auto_docstringlogging   )	PvtConfig        Finput	drop_probtrainingreturnc                     |dk    s|s| S d|z
  }| j         d         fd| j        dz
  z  z   }|t          j        || j        | j                  z   }|                                 |                     |          |z  }|S )aF  
    Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).

    Comment by Ross Wightman: This is the same as the DropConnect impl I created for EfficientNet, etc networks,
    however, the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper...
    See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for changing the
    layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use 'survival rate' as the
    argument.
    r   r   r   )r   )dtypedevice)shapendimtorchrandr   r   floor_div)r   r   r   	keep_probr   random_tensoroutputs          x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/transformers/models/pvt/modeling_pvt.py	drop_pathr$   (   s     CxII[^
Q 77E
5EL Y Y YYMYYy!!M1FM    c                   j     e Zd ZdZd	dee         ddf fdZdej        dej        fdZ	de
fdZ xZS )
PvtDropPathzXDrop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).Nr   r   c                 V    t                                                       || _        d S N)super__init__r   )selfr   	__class__s     r#   r+   zPvtDropPath.__init__@   s$    "r%   hidden_statesc                 8    t          || j        | j                  S r)   )r$   r   r   r,   r.   s     r#   forwardzPvtDropPath.forwardD   s    FFFr%   c                     d| j          S )Nzp=)r   )r,   s    r#   
extra_reprzPvtDropPath.extra_reprG   s    $DN$$$r%   r)   )__name__
__module____qualname____doc__r   floatr+   r   Tensorr1   strr3   __classcell__r-   s   @r#   r'   r'   =   s        bb# #(5/ #T # # # # # #GU\ Gel G G G G%C % % % % % % % %r%   r'   c                        e Zd ZdZ	 ddedeeee         f         deeee         f         dededed	ef fd
Z	de
j        dedede
j        fdZde
j        dee
j        eef         fdZ xZS )PvtPatchEmbeddingsz
    This class turns `pixel_values` of shape `(batch_size, num_channels, height, width)` into the initial
    `hidden_states` (patch embeddings) of shape `(batch_size, seq_length, hidden_size)` to be consumed by a
    Transformer.
    Fconfig
image_size
patch_sizestridenum_channelshidden_size	cls_tokenc                    t                                                       || _        t          |t          j        j                  r|n||f}t          |t          j        j                  r|n||f}|d         |d         z  |d         |d         z  z  }|| _        || _        || _	        || _
        t          j        t          j        d|r|dz   n||                    | _        |r(t          j        t          j        dd|                    nd | _        t          j        ||||          | _        t          j        ||j                  | _        t          j        |j                  | _        d S )Nr   r   kernel_sizerB   eps)p)r*   r+   r?   
isinstancecollectionsabcr   r@   rA   rC   num_patchesr   	Parameterr   randnposition_embeddingszerosrE   Conv2d
projection	LayerNormlayer_norm_eps
layer_normDropouthidden_dropout_probdropout)
r,   r?   r@   rA   rB   rC   rD   rE   rO   r-   s
            r#   r+   zPvtPatchEmbeddings.__init__R   s\    	#-j+/:R#S#SqZZZdfpYq
#-j+/:R#S#SqZZZdfpYq
!!}
15*Q-:VW=:XY$$(&#%<KiH;??[+VV$
 $
  JS\ek!Q&D&DEEEX\)L+6Zdeee,{8MNNNzF$>???r%   
embeddingsheightwidthr   c                    ||z  }t           j                                        s$|| j        j        | j        j        z  k    r| j        S |                    d||d                              dddd          }t          j	        |||fd          }|                    dd||z                                ddd          }|S )Nr   r   r      bilinear)sizemode)
r   jit
is_tracingr?   r@   rR   reshapepermuteFinterpolate)r,   r\   r]   r^   rO   interpolated_embeddingss         r#   interpolate_pos_encodingz+PvtPatchEmbeddings.interpolate_pos_encodingn   s    un y##%% 	,+9ORVR]Rh9h*h*h++''65"==EEaAqQQ
"#-
&%Wa"b"b"b"9"A"A!RRW"X"X"`"`abdegh"i"i&&r%   pixel_valuesc                    |j         \  }}}}|| j        k    rt          d          |                     |          }|j         ^ }}}|                    d                              dd          }|                     |          }| j        | j                            |dd          }	t          j
        |	|fd          }|                     | j        d d dd f         ||          }
t          j
        | j        d d d df         |
fd          }
n|                     | j        ||          }
|                     ||
z             }|||fS )NzeMake sure that the channel dimension of the pixel values match with the one set in the configuration.ra   r   r`   dim)r   rC   
ValueErrorrU   flatten	transposerX   rE   expandr   catrl   rR   r[   )r,   rm   
batch_sizerC   r]   r^   patch_embed_r\   rE   rR   s              r#   r1   zPvtPatchEmbeddings.forwardy   so   2>2D/
L&%4,,,w   ool33'-FE!))!,,66q!<<__[11
>%--j"bAAIIz#:BBBJ"&"?"?@XYZYZYZ\]\^\^Y^@_agin"o"o"')T-Eaaa!e-LNa,bhi"j"j"j"&"?"?@XZ`bg"h"h\\*/B"BCC
65((r%   F)r4   r5   r6   r7   r   r   intr   boolr+   r   r9   rl   tupler1   r;   r<   s   @r#   r>   r>   K   s(          @ @@ #x},-@ #x},-	@
 @ @ @ @ @ @ @ @ @8	'5< 	' 	'UX 	']b]i 	' 	' 	' 	')EL )U5<c;Q5R ) ) ) ) ) ) ) )r%   r>   c                   L     e Zd Zdedef fdZdej        dej        fdZ xZ	S )PvtSelfOutputr?   rD   c                     t                                                       t          j        ||          | _        t          j        |j                  | _        d S r)   )r*   r+   r   LineardenserY   rZ   r[   )r,   r?   rD   r-   s      r#   r+   zPvtSelfOutput.__init__   sD    Y{K88
z&"<==r%   r.   r   c                 Z    |                      |          }|                     |          }|S r)   )r   r[   r0   s     r#   r1   zPvtSelfOutput.forward   s*    

=11]33r%   )
r4   r5   r6   r   rz   r+   r   r9   r1   r;   r<   s   @r#   r~   r~      sq        >y >s > > > > > >
U\ el        r%   r~   c                        e Zd ZdZdedededef fdZdedej	        fd	Z
	 ddej	        dedededeej	                 f
dZ xZS )PvtEfficientSelfAttentionzxEfficient self-attention mechanism with reduction of the sequence [PvT paper](https://huggingface.co/papers/2102.12122).r?   rD   num_attention_headssequences_reduction_ratioc                 
   t                                                       || _        || _        | j        | j        z  dk    r t	          d| j         d| j         d          t          | j        | j        z            | _        | j        | j        z  | _        t          j	        | j        | j        |j
                  | _        t          j	        | j        | j        |j
                  | _        t          j	        | j        | j        |j
                  | _        t          j        |j                  | _        || _        |dk    r?t          j        ||||          | _        t          j        ||j                  | _        d S d S )	Nr   zThe hidden size (z6) is not a multiple of the number of attention heads ())biasr   rG   rI   )r*   r+   rD   r   rq   rz   attention_head_sizeall_head_sizer   r   qkv_biasquerykeyvaluerY   attention_probs_dropout_probr[   r   rT   sequence_reductionrV   rW   rX   r,   r?   rD   r   r   r-   s        r#   r+   z"PvtEfficientSelfAttention.__init__   s~    	&#6 d66!;;6D$4 6 626 6 6  
 $'t'7$:R'R#S#S !58PPYt/1C&/ZZZ
9T-t/AXXXYt/1C&/ZZZ
z&"EFF)B&$q((&(i[6OXq' ' 'D# !l;F<QRRRDOOO	 )(r%   r.   r   c                     |                                 d d         | j        | j        fz   }|                    |          }|                    dddd          S )Nr`   r   ra   r   r   )rc   r   r   viewrh   )r,   r.   	new_shapes      r#   transpose_for_scoresz.PvtEfficientSelfAttention.transpose_for_scores   sY    !&&(("-1I4Kc0dd	%**955$$Q1a000r%   Fr]   r^   output_attentionsc                 "   |                      |                     |                    }| j        dk    r|j        \  }}}|                    ddd                              ||||          }|                     |          }|                    ||d                              ddd          }|                     |          }|                      |                     |                    }	|                      | 	                    |                    }
t          j        ||	                    dd                    }|t          j        | j                  z  }t           j                            |d          }|                     |          }t          j        ||
          }|                    dddd                                          }|                                d d         | j        fz   }|                    |          }|r||fn|f}|S )Nr   r   ra   r`   ro   r   )r   r   r   r   rh   rg   r   rX   r   r   r   matmulrs   mathsqrtr   r   
functionalsoftmaxr[   
contiguousrc   r   r   )r,   r.   r]   r^   r   query_layerrv   seq_lenrC   	key_layervalue_layerattention_scoresattention_probscontext_layernew_context_layer_shapeoutputss                   r#   r1   z!PvtEfficientSelfAttention.forward   s    //

=0I0IJJ)A--0=0C-J)11!Q::BB:|]cejkkM 33MBBM)11*lBOOWWXY[\^_``M OOM::M--dhh}.E.EFF	//

=0I0IJJ !<Y5H5HR5P5PQQ+di8P.Q.QQ -//0@b/II ,,77_kBB%--aAq99DDFF"/"4"4"6"6ss";t?Q>S"S%**+BCC6G]=/22mM]r%   ry   )r4   r5   r6   r7   r   rz   r8   r+   r   r9   r   r{   r|   r1   r;   r<   s   @r#   r   r      s         C  CSS.1SHKShmS S S S S S:1# 1%, 1 1 1 1 #(* *|* * 	*
  * 
u|	* * * * * * * *r%   r   c                   v     e Zd Zdedededef fdZd Z	 ddej	        d	ed
ede
deej	                 f
dZ xZS )PvtAttentionr?   rD   r   r   c                     t                                                       t          ||||          | _        t	          ||          | _        t                      | _        d S )N)rD   r   r   )rD   )r*   r+   r   r,   r~   r"   setpruned_headsr   s        r#   r+   zPvtAttention.__init__   se     	-# 3&?	
 
 
	 $FDDDEEr%   c                    t          |          dk    rd S t          || j        j        | j        j        | j                  \  }}t          | j        j        |          | j        _        t          | j        j        |          | j        _        t          | j        j	        |          | j        _	        t          | j
        j        |d          | j
        _        | j        j        t          |          z
  | j        _        | j        j        | j        j        z  | j        _        | j                            |          | _        d S )Nr   r   ro   )lenr   r,   r   r   r   r   r   r   r   r"   r   r   union)r,   headsindexs      r#   prune_headszPvtAttention.prune_heads   s    u::??F7490$)2OQUQb
 
u
 -TY_eDD	*49=%@@	,TY_eDD	.t{/@%QOOO )-	(EE

(R	%"&)"?$)B_"_	 -33E::r%   Fr.   r]   r^   r   r   c                     |                      ||||          }|                     |d                   }|f|dd          z   }|S )Nr   r   )r,   r"   )r,   r.   r]   r^   r   self_outputsattention_outputr   s           r#   r1   zPvtAttention.forward  sM     yy?PQQ;;|A77#%QRR(88r%   ry   )r4   r5   r6   r   rz   r8   r+   r   r   r9   r{   r|   r1   r;   r<   s   @r#   r   r      s        "".1"HK"hm" " " " " "; ; ;& _d "\36?BW[	u|	       r%   r   c            
       r     e Zd Z	 	 d
dededee         dee         f fdZdej        dej        fd	Z	 xZ
S )PvtFFNNr?   in_featureshidden_featuresout_featuresc                 t   t                                                       ||n|}t          j        ||          | _        t          |j        t                    rt          |j                 | _	        n|j        | _	        t          j        ||          | _
        t          j        |j                  | _        d S r)   )r*   r+   r   r   dense1rL   
hidden_actr:   r   intermediate_act_fndense2rY   rZ   r[   )r,   r?   r   r   r   r-   s        r#   r+   zPvtFFN.__init__  s     	'3'?||[i_==f'-- 	9'-f.?'@D$$'-'8D$i>>z&"<==r%   r.   r   c                     |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|S r)   )r   r   r[   r   r0   s     r#   r1   zPvtFFN.forward)  s_    M2200??]33M22]33r%   )NN)r4   r5   r6   r   rz   r   r+   r   r9   r1   r;   r<   s   @r#   r   r     s        
 *.&*> >> > "#	>
 sm> > > > > >"U\ el        r%   r   c                   \     e Zd Zdedededededef fdZdd	ej        d
edede	fdZ
 xZS )PvtLayerr?   rD   r   r$   r   	mlp_ratioc                    t                                                       t          j        ||j                  | _        t          ||||          | _        |dk    rt          |          nt          j	                    | _
        t          j        ||j                  | _        t          ||z            }t          |||          | _        d S )NrI   )r?   rD   r   r   r   )r?   r   r   )r*   r+   r   rV   rW   layer_norm_1r   	attentionr'   Identityr$   layer_norm_2rz   r   mlp)	r,   r?   rD   r   r$   r   r   mlp_hidden_sizer-   s	           r#   r+   zPvtLayer.__init__3  s     	L&:OPPP%# 3&?	
 
 
 4=s??Y///L&:OPPPkI566[Rabbbr%   Fr.   r]   r^   r   c                 F   |                      |                     |          |||          }|d         }|dd          }|                     |          }||z   }|                     |                     |                    }|                     |          }||z   }	|	f|z   }|S )N)r.   r]   r^   r   r   r   )r   r   r$   r   r   )
r,   r.   r]   r^   r   self_attention_outputsr   r   
mlp_outputlayer_outputs
             r#   r1   zPvtLayer.forwardI  s    !%++M::/	 "0 "
 "
 2!4(,>>*:;;(=8XXd//>>??
^^J//
$z1/G+r%   ry   )r4   r5   r6   r   rz   r8   r+   r   r9   r{   r1   r;   r<   s   @r#   r   r   2  s        cc c !	c
 c $)c c c c c c c, U\ 3 s _c        r%   r   c                        e Zd Zdef fdZ	 	 	 ddej        dee         dee         dee         d	e	e
ef         f
d
Z xZS )
PvtEncoderr?   c                    t                                                       || _        t          j        d|j        t          |j                  d                                          }g }t          |j
                  D ]}|                    t          ||dk    r|j        n| j        j        d|dz   z  z  |j        |         |j        |         |dk    r|j        n|j        |dz
           |j        |         ||j
        dz
  k                         t%          j        |          | _        g }d}t          |j
                  D ]}g }|dk    r||j        |dz
           z  }t          |j        |                   D ]_}|                    t+          ||j        |         |j        |         |||z            |j        |         |j        |                              `|                    t%          j        |                     t%          j        |          | _        t%          j        |j        d         |j        	          | _        d S )
Nr   cpu)r   ra   r   )r?   r@   rA   rB   rC   rD   rE   )r?   rD   r   r$   r   r   r`   rI   )r*   r+   r?   r   linspacedrop_path_ratesumdepthstolistrangenum_encoder_blocksappendr>   r@   patch_sizesstridesrC   hidden_sizesr   
ModuleListpatch_embeddingsr   r   sequence_reduction_ratios
mlp_ratiosblockrV   rW   rX   )
r,   r?   drop_path_decaysr\   iblockscurlayersjr-   s
            r#   r+   zPvtEncoder.__init__a  sa    !>!V-BCDVDV_deeellnn 
v011 	 	A"!45FFv00@V[\abefaf[g@h%1!4!>!,89Q!4!4FDWXY\]X]D^ & 3A 66#<q#@@  
 
 
 
 !#j 9 9 v011 	1 	1AFAvvv}QU++6=+,, 
 
%$*$7$:,2,Fq,I"237";282RST2U"("3A"6  	 	 	 	 MM"-//0000]6**
 ,v':2'>FDYZZZr%   FTrm   r   output_hidden_statesreturn_dictr   c                 l   |rdnd }|rdnd }|j         d         }t          | j                  }|}	t          t	          | j        | j                            D ]\  }
\  }} ||	          \  }	}}|D ].} ||	|||          }|d         }	|r||d         fz   }|r||	fz   }/|
|dz
  k    r@|	                    |||d                              dddd                                          }	| 	                    |	          }	|r||	fz   }|st          d |	||fD                       S t          |	||          S )	N r   r   r`   r   ra   c              3      K   | ]}||V  	d S r)   r   ).0vs     r#   	<genexpr>z%PvtEncoder.forward.<locals>.<genexpr>  s(      mmq_`_l_l_l_l_lmmr%   last_hidden_stater.   
attentions)r   r   r   	enumeratezipr   rg   rh   r   rX   r|   r	   )r,   rm   r   r   r   all_hidden_statesall_self_attentionsrv   
num_blocksr.   idxembedding_layerblock_layerr]   r^   r   layer_outputss                    r#   r1   zPvtEncoder.forward  s    #7@BBD$5?bb4!'*
__
$3<SAVX\Xb=c=c3d3d 	v 	v/C//;+:?=+I+I(M65$ M M %mVUDU V V -a 0$ T*=qAQ@S*S'' M(9]<L(L%j1n$$ - 5 5j&%QS T T \ \]^`acdfg h h s s u u66 	E 1]4D D 	nmm]4EGZ$[mmmmmm++*
 
 
 	
r%   )FFT)r4   r5   r6   r   r+   r   FloatTensorr   r{   r   r|   r	   r1   r;   r<   s   @r#   r   r   `  s        0[y 0[ 0[ 0[ 0[ 0[ 0[j -2/4&*#
 #
'#
 $D>#
 'tn	#

 d^#
 
uo%	&#
 #
 #
 #
 #
 #
 #
 #
r%   r   c                   @    e Zd ZU eed<   dZdZg Zdej	        ddfdZ
dS )PvtPreTrainedModelr?   pvtrm   moduler   Nc                    | j         j        }t          |t          j        t          j        f          rUt          j                            |j        j	        d|           |j
         |j
        j	                                         dS dS t          |t          j                  r?|j
        j	                                         |j        j	                            d           dS t          |t                    rut          j                            |j        j	        d|          |j        _	        |j        :t          j                            |j        j	        d|          |j        _	        dS dS dS )zInitialize the weightsr   )meanstdNg      ?)r?   initializer_rangerL   r   r   rT   inittrunc_normal_weightdatar   zero_rV   fill_r>   rR   rE   )r,   r  r  s      r#   _init_weightsz PvtPreTrainedModel._init_weights  s[   k+fry")455 	 G!!&-"43C!HHH{& &&((((( '&-- 	K""$$$M$$S))))) 233 	.0g.C.C*/ /D / /F&+
 +(*(=(=$) )> ) ) %%%	 	 ,+r%   )r4   r5   r6   r   __annotations__base_model_prefixmain_input_name_no_split_modulesr   Moduler  r   r%   r#   r   r     sW         $OBI $      r%   r   c                        e Zd Zdef fdZd Ze	 	 	 ddej        de	e
         de	e
         de	e
         d	eeef         f
d
            Z xZS )PvtModelr?   c                     t                                          |           || _        t          |          | _        |                                  d S r)   )r*   r+   r?   r   encoder	post_initr,   r?   r-   s     r#   r+   zPvtModel.__init__  sK        "&)) 	r%   c                     |                                 D ]/\  }}| j        j        |         j                            |           0dS )z
        Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base
        class PreTrainedModel
        N)itemsr  layerr   r   )r,   heads_to_pruner  r   s       r#   _prune_headszPvtModel._prune_heads  sU    
 +0022 	C 	CLE5Lu%/;;EBBBB	C 	Cr%   Nrm   r   r   r   r   c                     ||n| j         j        }||n| j         j        }||n| j         j        }|                     ||||          }|d         }|s|f|dd          z   S t          ||j        |j                  S )Nrm   r   r   r   r   r   r   )r?   r   r   use_return_dictr  r	   r.   r   )r,   rm   r   r   r   encoder_outputssequence_outputs          r#   r1   zPvtModel.forward  s     2C1N--TXT_Tq$8$D  $+Jj 	 &1%<kk$+B],,%/!5#	 ' 
 
 *!, 	<#%(;;;-)7&1
 
 
 	
r%   )NNN)r4   r5   r6   r   r+   r  r   r   r   r   r{   r   r|   r	   r1   r;   r<   s   @r#   r  r    s        y      C C C  -1/3&*
 
'
 $D>
 'tn	

 d^
 
uo%	&
 
 
 ^
 
 
 
 
r%   r  z
    Pvt Model transformer with an image classification head on top (a linear layer on top of the final hidden state of
    the [CLS] token) e.g. for ImageNet.
    )custom_introc                        e Zd Zdeddf fdZe	 	 	 	 ddeej                 deej                 dee	         dee	         d	ee	         de
eef         fd
            Z xZS )PvtForImageClassificationr?   r   Nc                 B   t                                          |           |j        | _        t          |          | _        |j        dk    r%t          j        |j        d         |j                  nt          j                    | _	        | 
                                 d S )Nr   r`   )r*   r+   
num_labelsr  r  r   r   r   r   
classifierr  r  s     r#   r+   z"PvtForImageClassification.__init__  s        +F## FLEVYZEZEZBIf)"-v/@AAA`b`k`m`m 	
 	r%   rm   labelsr   r   r   c                 V   ||n| j         j        }|                     ||||          }|d         }|                     |dddddf                   }d}	||                     ||| j                   }	|s|f|dd         z   }
|	|	f|
z   n|
S t          |	||j        |j                  S )a  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the image 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).
        Nr  r   r   )losslogitsr.   r   )r?   r   r  r(  loss_functionr
   r.   r   )r,   rm   r)  r   r   r   r   r"  r,  r+  r"   s              r#   r1   z!PvtForImageClassification.forward#  s     &1%<kk$+B]((%/!5#	  
 
 "!*Aqqq!9::%%ffdkBBD 	FY,F)-)9TGf$$vE$!/)	
 
 
 	
r%   )NNNN)r4   r5   r6   r   r+   r   r   r   r9   r{   r   r|   r
   r1   r;   r<   s   @r#   r%  r%    s        y T        *.,0/3&*(
 (
u|,(
 &(
 $D>	(

 'tn(
 d^(
 
u++	,(
 (
 (
 ^(
 (
 (
 (
 (
r%   r%  )r%  r  r   )r   F)0r7   rM   r   collections.abcr   typingr   r   r   torch.nn.functionalr   r   ri   activationsr   modeling_outputsr	   r
   modeling_utilsr   pytorch_utilsr   r   utilsr   r   configuration_pvtr   
get_loggerr4   loggerr9   r8   r{   r$   r  r'   r>   r~   r   r   r   r   r   r   r  r%  __all__r   r%   r#   <module>r:     s  "        $ $ $ $ $ $ " " " " " " " "                 ! ! ! ! ! ! F F F F F F F F - - - - - - Q Q Q Q Q Q Q Q , , , , , , , , ( ( ( ( ( ( 
	H	%	% U\ e T V[Vb    *% % % % %") % % %A) A) A) A) A) A) A) A)H	 	 	 	 	BI 	 	 	O O O O O	 O O Od' ' ' ' '29 ' ' 'T    RY   6+ + + + +ry + + +\V
 V
 V
 V
 V
 V
 V
 V
r        @ 0
 0
 0
 0
 0
! 0
 0
 0
f   8
 8
 8
 8
 8
 2 8
 8
 8
v J
I
Ir%   