
    rhs                        d Z ddlmZmZ ddlZddl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 dd
lmZ ddlmZmZ ddlmZ ddlmZmZmZ ddlmZ  e       rddlmZ ddlm Z   ejB                  e"      Z#de$de$dejJ                  fdZ&dejJ                  dejJ                  fdZ'dejJ                  dejJ                  dejJ                  dejJ                  fdZ( G d dejR                        Z* G d dejR                        Z+ G d  d!e      Z,e G d" d#e             Z-e G d$ d%e-             Z. ed&'       G d( d)e-e             Z/g d*Z0y)+zPyTorch CodeGen model.    )OptionalUnionN)nn   )ACT2FN)CacheDynamicCache)GenerationMixin)AttentionMaskConverter)GradientCheckpointingLayer)BaseModelOutputWithPastCausalLMOutputWithPast)PreTrainedModel)auto_docstringis_torch_flex_attn_availablelogging   )CodeGenConfig)	BlockMask)make_flex_block_causal_masknum_posdimreturnc                    ddt        j                  d|dt         j                        |z  z  z  }t        j                  dt        j                  | t         j                        j	                         |      j	                         }t        j
                  t        j                  |      t        j                  |      fd      S )	N      ?i'  r      dtypezi , j -> i jr   r   )torcharangeint64einsumfloatcatsincos)r   r   inv_freqsinusoid_inps       /var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/transformers/models/codegen/modeling_codegen.pycreate_sinusoidal_positionsr+   0   s    eQQekk JS PQRH<<WEKK0X0^0^0`bjkqqsL99eii-uyy/FGQOO    xc                     | d d d d d d d d df   }| d d d d d d dd df   }t        j                  | |fd      } | j                  d      S )Nr   r   r   )r    stackflatten)r-   x1x2s      r*   rotate_every_twor5   7   sS    	
1aCaC<B	
1aADqD=	BbS"I2&A99R=r,   tensorr&   r'   c                     t        j                  |d d d d d d d f   dd      }t        j                  |d d d d d d d f   dd      }| |z  t        |       |z  z   S )Nr   r   )r    repeat_interleaver5   )r6   r&   r'   s      r*   apply_rotary_pos_embr9   ?   s^    

!
!#aD!m"4a
;C

!
!#aD!m"4a
;CSL-f5;<<r,   c                       e Zd Zd fd	Zd Zd Z	 	 ddZ	 	 	 	 	 	 	 ddeej                     dee
   deej                     deej                     d	eej                     d
ee   dee   deej                     deeej                  eej                     f   eeej                  eej                     eej                  df   f      f   fdZ xZS )CodeGenAttentionc                 `   t         |           |j                  }t        j                  |j
                        | _        t        j                  |j                        | _        || _	        |-t        j                  d| j                  j                   d       |j                  | _        |j                   | _        | j                  | j                   z  | _        | j"                  | j                   z  | j                  k7  r&t%        d| j                   d| j                    d      t'        j(                  t'        j*                  | j"                  t&        j,                              j/                  t'        j0                               | _        t        j4                  | j                  | j                  dz  d	      | _        t        j4                  | j                  | j                  d	      | _        |j:                  | _        | j:                  xs | j                  }t=        ||      | _        y )
NzInstantiating z without passing a `layer_idx` is not recommended and will lead to errors during the forward call if caching is used. Please make sure to provide a `layer_idx` when creating this class.zEembed_dim must be divisible by num_attention_heads (got `embed_dim`: z and `num_attention_heads`: z).r   r   F)bias) super__init__max_position_embeddingsr   Dropout
attn_pdropattn_dropoutresid_pdropresid_dropout	layer_idxloggerwarning_once	__class____name__hidden_size	embed_dimnum_attention_headshead_dim
ValueErrorr    sqrtr6   float32toget_default_dtype
scale_attnLinearqkv_projout_proj
rotary_dimr+   embed_positions)selfconfigrF   max_positionspos_embd_dimrI   s        r*   r?   zCodeGenAttention.__init__F   s   66JJv'8'89ZZ(:(:;" !8!8 9 :, ,  ++#)#=#= $*B*BB==4333t~~EWX\XfXfWg h++/+C+C*DBH   **U\\$--u}}%UVYYZ_ZqZqZst		$..$..12D5Q		$..$..uM ++8$..:=,Wr,   c                     |j                  |j                  d d ||z  |fz         }|j                  |j                  d d dz   |j                  dd  z         }|S )Nr/   r0   )r/   )reshapeshape)rZ   r-   n_headdim_headmp_numreshapeds         r*   _split_headszCodeGenAttention._split_headsd   s]    99QWWSb\Vv-=x,HHI##AGGCRL5$88>>"#;N$NOr,   c                    t        |j                        dk(  r$|j                  ddddd      j                         }n\t        |j                        dk(  r#|j                  dddd      j                         }n!t	        dt        |j                               |j                         dd	 ||z  fz   }|j                  |      S )
zM
        Merges attn_head_size dim and num_attn_heads dim into n_ctx
           r   r   r   r      z3Input tensor rank should be one of [4, 5], but is: Nr0   )lenr`   permute
contiguousrO   sizeview)rZ   r6   rM   attn_head_size	new_shapes        r*   _merge_headszCodeGenAttention._merge_headsi   s     v||!^^Aq!Q2==?F!#^^Aq!Q/::<FRSVW]WcWcSdRefggKKM#2&*=*N)PP	{{9%%r,   c                    |j                  t        j                        }|j                  t        j                        }t        j                  ||j	                  dd            }|#|d d d d d d d |j
                  d   f   }||z  }|| j                  z  } t        j                  d      |      }|j                  |j                        }| j                  |      }|||z  }t        j                  ||      }||fS )Nr/   r0   r   )rR   r    rQ   matmul	transposer`   rT   r   Softmaxr   rC   )	rZ   querykeyvalueattention_mask	head_maskattn_weightscausal_maskattn_outputs	            r*   _attnzCodeGenAttention._attnv   s     'ffU]]#||E3==R+@A%(Aq/CIIbM/)ABKK'L#doo5)rzzb),7#u{{3((6  ')3Lll<7L((r,   hidden_states
layer_pastrx   position_idsry   	use_cacheoutput_attentionscache_positionr   .c	                 \   | j                  |      }	d}
|	j                  |	j                  d d |
dfz         }| j                  | j                  z  |
z  }t        j                  ||d      \  }}}| j                  || j                  | j                  |
      }| j                  || j                  | j                  |
      }| j                  || j                  | j                  |
      }|j                  dddd      }| j                  }|j                  |j                  k7  r"|j                  |j                        }|| _	        ||   }t        j                  ||j                  d   dz  d      \  }}| j                  |d d d d d d d | j                  f   }|d d d d d d | j                  d f   }|d d d d d d d | j                  f   }|d d d d d d | j                  d f   }t        |||      }t        |||      }t        j                  ||gd      }t        j                  ||gd      }nt        |||      }t        |||      }|j                  dddd      }|j                  dddd      }|K||| j                  |d	}|j                  |j                  |j                         || j"                  |      \  }}| j%                  |||||      \  }}| j'                  || j                  | j                        }| j)                  |      }| j+                  |      }||fS )
Nrh   r/   r   )rc   r   r   r   r   )r&   r'   partial_rotation_sizer   )rV   r_   r`   rN   rM   r    splitre   rj   rY   devicerR   rX   r9   r%   updater   rF   r}   rp   rW   rE   )rZ   r~   r   rx   r   ry   r   r   r   qkvrc   	qkv_split	local_dimru   rw   rv   rY   sincosr&   r'   k_rotk_passq_rotq_passcache_kwargsr|   rz   s                              r*   forwardzCodeGenAttention.forward   s	    mmM*KK		#2&" =>	MMD$<$<<F	!KK	9"Euc!!%)A)A4==Y_!`T%=%=t}}U[\!!%)A)A4==Y_!`aAq)..!!\%8%88-001D1DEO#2D  .;;vv||B'71'<"ES??&1a!24??!223EAq$//"334F!Q#4T__#445E1aDOO$556F(S9E(S9E))UFO4CIIufo26E&sC5C(S9Ekk!Q1%aAq) !)-"0	L $**366-2E2E+Ft~~_klJC %)JJuc5.R[$\!\''T5M5Mt}}]mmK0((5L((r,   N)NNNNNNFFN)rJ   
__module____qualname__r?   re   rp   r}   r   r    FloatTensorr   
LongTensorboolr   tupleTensorr   __classcell__rI   s   @r*   r;   r;   E   s6   X<
&$ )D '+6:3715$),159G) 1 12G) UOG) !!2!23	G)
 u//0G) E--.G) D>G) $D>G) !!1!12G) 
ellE%,,//0u||U5<<%8%c@Q:RRST	V
G)r,   r;   c                   \     e Zd Z fdZdeej                     dej                  fdZ xZS )
CodeGenMLPc                    t         |           |j                  }t        j                  ||      | _        t        j                  ||      | _        t        |j                     | _	        t        j                  |j                        | _        y r   )r>   r?   n_embdr   rU   fc_infc_outr   activation_functionactrA   rD   dropout)rZ   intermediate_sizer[   rL   rI   s       r*   r?   zCodeGenMLP.__init__   se    MM	YYy*;<
ii 19=&445zz&"4"45r,   r~   r   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S r   )r   r   r   r   )rZ   r~   s     r*   r   zCodeGenMLP.forward   s@    

=1/M2]3r,   )	rJ   r   r   r?   r   r    r   r   r   r   s   @r*   r   r      s,    6Xe.?.?%@ UEVEV r,   r   c                   V    e Zd Zd fd	Z	 	 	 	 	 	 	 ddeej                     dee   deej                     deej                     deej                     dee	   dee	   d	eej                     d
e
eej                     eeej                  eej                  df   f      f   fdZ xZS )CodeGenBlockc                    t         |           |j                  |j                  nd|j                  z  }t	        j
                  |j                  |j                        | _        t        ||      | _	        t        ||      | _        y )Nrh   eps)r>   r?   n_innerr   r   	LayerNormlayer_norm_epsilonln_1r;   attnr   mlp)rZ   r[   rF   	inner_dimrI   s       r*   r?   zCodeGenBlock.__init__   sc    &,nn&@FNNa&--FW	LLF4M4MN	$VY7	i0r,   r~   r   rx   r   ry   r   r   r   r   .c	           
          |}	| j                  |      }| j                  ||||||||      \  }
}| j                  |      }|
|z   |	z   }||fS )N)r~   r   rx   r   ry   r   r   r   )r   r   r   )rZ   r~   r   rx   r   ry   r   r   r   residualattn_outputsrz   feed_forward_hidden_statess                r*   r   zCodeGenBlock.forward   ss     !		-0%)YY'!)%/) &/ 	&
"l &*XXm%<"$'AAHLl**r,   r   r   )rJ   r   r   r?   r   r    r   r   r   r   r   r   r   r   r   r   s   @r*   r   r      s    1 '+6:3715$),159+ 1 12+ UO+ !!2!23	+
 u//0+ E--.+ D>+ $D>+ !!1!12+ 
uU\\"HU5<<uGXGXZ]G]A^3^-_$``	a+r,   r   c                   F     e Zd ZU eed<   dZdZdgZdZdZ	 fdZ
d Z xZS )CodeGenPreTrainedModelr[   transformerTr   past_key_valuesc                 $    t        |   |i | y r   )r>   r?   )rZ   inputskwargsrI   s      r*   r?   zCodeGenPreTrainedModel.__init__$  s    &+F+r,   c                    t        |t        j                  f      rm|j                  j                  j                  d| j                  j                         |j                  %|j                  j                  j                          yyt        |t        j                        rz|j                  j                  j                  d| j                  j                         |j                  2|j                  j                  |j                     j                          yyt        |t        j                        rJ|j                  j                  j                          |j                  j                  j                  d       yy)zInitialize the weights.        )meanstdNr   )
isinstancer   rU   weightdatanormal_r[   initializer_ranger=   zero_	Embeddingpadding_idxr   fill_)rZ   modules     r*   _init_weightsz$CodeGenPreTrainedModel._init_weights'  s   fryyl+ MM&&CT[[5R5R&S{{&  &&( '-MM&&CT[[5R5R&S!!-""6#5#56<<> .-KK""$MM$$S) .r,   )rJ   r   r   r   __annotations__base_model_prefixsupports_gradient_checkpointing_no_split_modules_skip_keys_device_placement_can_compile_fullgraphr?   r   r   r   s   @r*   r   r     s4    %&*#'("3!,*r,   r   c                   ^    e Zd Z fdZd Zd Ze	 	 	 	 	 	 	 	 	 	 	 	 ddeej                     dee
eeeej                        f      deej                     deej                     deej                     d	eej                     d
eej                     dee   dee   dee   dee   deej                     de
eef   fd       Z	 dde
ej                  df   dej                  dej                  dedef
dZedej                  dededej*                  dej                  defd       Z xZS )CodeGenModelc           	         t         |   |       |j                  | _        |j                  | _        t        j                  |j                  | j                        | _        t        j                  |j                        | _
        t        j                  t        |j                        D cg c]  }t        ||       c}      | _        t        j                   | j                  |j"                        | _        t'        |j(                  |j*                  |j,                  z        | _        d| _        | j1                          y c c}w )N)rF   r   F)r>   r?   r   rL   
vocab_sizer   r   wterA   
embd_pdropdrop
ModuleListrangen_layerr   hr   r   ln_fminrX   n_ctxrM   gradient_checkpointing	post_init)rZ   r[   irI   s      r*   r?   zCodeGenModel.__init__:  s      ++<< 1 14>>BJJv001	5QWQ_Q_K`aaVq AabLLV5N5NO	f//A[A[1[\&+# 	  bs   ,Ec                     | j                   S r   r   )rZ   s    r*   get_input_embeddingsz!CodeGenModel.get_input_embeddingsJ  s    xxr,   c                     || _         y r   r   )rZ   new_embeddingss     r*   set_input_embeddingsz!CodeGenModel.set_input_embeddingsM  s	    !r,   	input_idsr   rx   token_type_idsr   ry   inputs_embedsr   r   output_hidden_statesreturn_dictr   r   c                    |	|	n| j                   j                  }	|
|
n| j                   j                  }
||n| j                   j                  }||n| j                   j                  }|du |duz  rt        d      | j                  r%| j                  r|rt        j                  d       d}|| j                  |      }t        |t        d      t        f      st        d      |r|
t               }|j                  d   }|9||j!                         nd}t#        j$                  |||z   |j&                        }||j)                  d      }| j+                  |||||	      }| j-                  || j                   j.                        }|}|(|j1                  d	|      }| j                  |      }||z   }| j3                  |      }d	||j5                  d	      f}|	rd
nd}|
rd
nd}t7        | j8                        D ]1  \  }}|
r||fz   } |||||||   ||	|      }|d   }|	s)||d   fz   }3 | j;                  |      }|j1                  |      }|
r||fz   }|st=        d ||||fD              S t?        ||||      S )a  
        inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_dim)`, *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.
        Nz:You must specify exactly one of input_ids or inputs_embedszZ`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...FzBThe `past_key_values` should be either a `Cache` object or `None`.r   r   r   r/    )r   rx   r   ry   r   r   r   c              3   &   K   | ]	  }||  y wr   r   ).0vs     r*   	<genexpr>z'CodeGenModel.forward.<locals>.<genexpr>  s      ghgts   )last_hidden_stater   r~   
attentions) r[   r   r   r   use_return_dictrO   r   trainingrG   rH   r   r   typer   r	   r`   get_seq_lengthr    r!   r   	unsqueeze_update_causal_maskget_head_maskr   rm   r   rl   	enumerater   r   r   r   )rZ   r   r   rx   r   r   ry   r   r   r   r   r   r   r   
seq_lengthpast_seen_tokensr{   r~   token_type_embedsoutput_shapeall_self_attentionsall_hidden_statesr   blockoutputss                            r*   r   zCodeGenModel.forwardP  s   . 2C1N-TXT_T_TqTq$8$D $++JjJj 	 "+!6IDKK<Q<Q	%0%<k$++B]B]-t";<YZZ&&4==##p "	  HHY/M /DJ+>?abb0*nO"((+
!CRC^==?de"\\*:<Lz<YbobvbvwN)33A6L..M>?L]
 &&y$++2E2EF	%%+00Z@N $ 8),==M		-0J(:(:2(>?$5b4"6BD!$&&) 	JHAu#$58H$H!**)#A,#"3-	G $AJM &9WQZM&I##	J& 		-0%**<8 1]4D D )?<MObc   '+++*	
 	
r,   r   input_tensorc           	         | j                   j                  dk(  r||dk(  j                         r|S y | j                   j                  dk(  r't        |t        j
                        rt        |      }|S ||j                         nd}||j                  nd}| j                   j                  dk(  r(|s&|s$t        j                  |||| j                        ry |j                  }|j                  d   }	|r|j                         }
n1t        |t        j
                        r|j                  d	   n||	z   dz   }
| j                  ||	|
|||j                  d   
      }| j                   j                  dk(  rQ|O|j                   j"                  dv r7|s5t	        j$                  |      j&                  }t        j(                  ||      }|S )Nflash_attention_2r   flex_attentionr   Fsdpa)r   past_key_values_lengthis_trainingr   r/   )sequence_lengthtarget_lengthr   r   
batch_size)cudaxpunpu)r[   _attn_implementationanyr   r    r   r   r   is_compileabler   _ignore_causal_mask_sdpar   r   r`   get_max_cache_shape5_prepare_4d_causal_attention_mask_with_cache_positionr   r   finfor   _unmask_unattended)rZ   rx   r
  r   r   r   r  using_compilable_cacher   r  r  r{   	min_dtypes                r*   r   z CodeGenModel._update_causal_mask  s    ;;++/BB)~/D.I.I.K%%;;++/??.%,,7!<^!L!!
 @O?Z?99;`aCRC^!?!?di ;;++v5>T]n%>>*'7 MM	 ""&,,Q/!+??AM nell; $$R(%7!;  PP+')#))!, Q 
 KK,,6*%%**.DD%
 E*..I0CCKQZ[Kr,   r  r  r   r  c                    | | j                         dk(  r| }|S t        j                  |      j                  }t        j                  ||f|||j
                        }|dk7  rt        j                  |d      }|t        j                  ||j
                        |j                  dd      kD  z  }|ddddddf   j                  |ddd      }| |j                         }| j                  d   }	|ddddddd|	f   | ddddddf   j                  |j
                        z   }
|
dk(  }
|ddddddd|	f   j                  |
|      |ddddddd|	f<   |S )	aM  
        Creates a causal 4D mask of shape `(batch_size, 1, query_length, key_value_length)` from a 2D mask of shape
        `(batch_size, key_value_length)`, or if the input `attention_mask` is already 4D, do nothing.

        Args:
            attention_mask (`torch.Tensor`):
                A 2D attention mask of shape `(batch_size, key_value_length)` or a 4D attention mask of shape
                `(batch_size, 1, query_length, key_value_length)`.
            sequence_length (`int`):
                The sequence length being processed.
            target_length (`int`):
                The target length: when generating with static cache, the mask should be as long as the static cache,
                to account for the 0 padding, the part of the cache that is not filled yet.
            dtype (`torch.dtype`):
                The dtype to use for the 4D attention mask.
            cache_position (`torch.Tensor`):
                Indices depicting the position of the input sequence tokens in the sequence.
            batch_size (`torch.Tensor`):
                Batch size.
        Nrh   )
fill_valuer   r   r   )diagonalr   r/   r   )r   r    r  r   fullr   triur!   r_   expandcloner`   rR   masked_fill)rx   r  r  r   r   r  r   r{   r   mask_lengthpadding_masks              r*   r  zBCodeGenModel._prepare_4d_causal_attention_mask_with_cache_position
  s   > %.*<*<*>!*C(K* ' E*..I** -0Ye\j\q\qK !##jjqA5<<n>S>STWeWmWmnprsWtttK%dD!Q&67>>z1bRTUK))//1,2226*1aL[L+@ANSTVZ\`bcScDdDgDg&&E    ,q05@Aq,;,AV5W5c5c )6Aq!\k\12 r,   )NNNNNNNNNNNN)F)rJ   r   r   r?   r   r   r   r   r    r   r   r   r   r   r   r   r   r   r   staticmethodintr   r  r   r   s   @r*   r   r   8  s    "  15NR6:59371559$(,0/3&*59r
E,,-r
 "%uU5<<5H/I(I"JKr
 !!2!23	r

 !!1!12r
 u//0r
 E--.r
   1 12r
 D>r
 $D>r
 'tnr
 d^r
 !!1!12r
 
u--	.r
 r
v #(BellK78B llB 	B
 B  BH 444 4 {{	4
 4 4 4r,   r   zM
    The CodeGen Model transformer with a language modeling head on top.
    )custom_introc                        e Zd ZdgZ fdZe	 	 	 	 	 	 	 	 	 	 	 	 	 ddeej                     dee	e
eeej                        f      deej                     deej                     deej                     deej                     d	eej                     d
eej                     dee   dee   dee   dee   deej                     de	eef   fd       Z xZS )CodeGenForCausalLMzlm_head.weightc                     t         |   |       t        |      | _        t	        j
                  |j                  |j                        | _        | j                          y r   )
r>   r?   r   r   r   rU   r   r   lm_headr   )rZ   r[   rI   s     r*   r?   zCodeGenForCausalLM.__init__K  sE     '/yy0A0AB 	r,   r   r   rx   r   r   ry   r   labelsr   r   r   r   r   r   c                 $   ||n| j                   j                  }| j                  ||||||||	|
|||      }|d   }| j                  |      j	                  t
        j                        }d}|`|j	                  |j                        } | j                  ||fd| j                   j                  i|}|j	                  |j                        }|s|f|dd z   }||f|z   S |S t        |||j                  |j                  |j                        S )aG  
        inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_dim)`, *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, sequence_length)`, *optional*):
            Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set
            `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100`
            are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]`
        N)r   rx   r   r   ry   r   r   r   r   r   r   r   r   r   )losslogitsr   r~   r   )r[   r   r   r1  rR   r    rQ   r   loss_functionr   r   r   r   r~   r   )rZ   r   r   rx   r   r   ry   r   r2  r   r   r   r   r   r   transformer_outputsr~   	lm_logitsr4  outputs                       r*   r   zCodeGenForCausalLM.forwardS  sF   8 &1%<k$++B]B]"..+))%'/!5#) / 
 ,A.
 LL/225==A	YYy//0F%4%%  ;;11 	D 77=../D\$7$;;F)-)9TGf$EvE%/??-;;*55
 	
r,   )NNNNNNNNNNNNN)rJ   r   r   _tied_weights_keysr?   r   r   r    r   r   r   r   r   r   r   r   r   r   r   s   @r*   r/  r/  C  sz    ++  15NR6:59371559-1$(,0/3&*59J
E,,-J
 "%uU5<<5H/I(I"JKJ
 !!2!23	J

 !!1!12J
 u//0J
 E--.J
   1 12J
 ))*J
 D>J
 $D>J
 'tnJ
 d^J
 !!1!12J
  
u,,	-!J
 J
r,   r/  )r/  r   r   )1__doc__typingr   r   r    torch.utils.checkpointr   activationsr   cache_utilsr   r	   
generationr
   modeling_attn_mask_utilsr   modeling_layersr   modeling_outputsr   r   modeling_utilsr   utilsr   r   r   configuration_codegenr   !torch.nn.attention.flex_attentionr   integrations.flex_attentionr   
get_loggerrJ   rG   r,  r   r+   r5   r9   Moduler;   r   r   r   r   r/  __all__r   r,   r*   <module>rL     sm    "    ! . ) > 9 O - 
 1  !;J 
		H	%P P3 P5<< P  = =ELL =u|| =X]XdXd =W)ryy W)v (#+- #+L *_ * *: G) G GT 
V
/ V

V
r Kr,   