
    AVhog                     "   d Z ddlZddlZddlmZ ddlmZ ddlm	Z
 ddlmZ 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 ddlmZ d Zd Zd Zd Zd Zd ZdOdZd Zd Z d Z!d Z"d Z#d Z$ejJ                  Z%ejL                  Z&ejN                  Z'ejP                  Z(ejR                  Z)ejT                  Z* e!ejV                  d      Z+  ed       ejX                  e+              e"ejZ                  d      Z-  ed       ejX                  e-              eej\                  dd      Z.  ed d d!g"       ejX                  e.              e ej^                  dd#      Z/  ed$d$d%g"       ejX                  e/              eej`                  d&d'      Z0  ed(d(d)g"       ejX                  e0              e ejb                  d&d*      Z1  ed+d+d,g"       ejX                  e1              eejd                  d-d.      Z2  ed/d/d0g"       ejX                  e2              e ejf                  d-d1      Z3  ed2d2d3g"       ejX                  e3              e#ejh                  d4      Z4  ed5       ejX                  e4              e$ejj                  d6      Z5  ed7       ejX                  e5             d8 Z6 ejn                  d9      d:        Z8 ejn                  d;      d<        Z9 ejn                  d=      d>        Z: ejn                  d?      d@        Z; ejn                  dA      dB        Z< ejn                  dC      dD        Z=dE Z>dF Z? edG      ejX                  dPdH              Z@ edI      ejX                  dPdJ              ZA  ejn                  dK       e>de/               ejn                  dL       e?de.               ejn                  dM       e>d&e1               ejn                  dN       e?d&e0             y)QzFast-Fourier Transform ops.    N)dtypes)ops)tensor_util)	array_ops)array_ops_stack)gen_spectral_ops)	manip_ops)math_ops)dispatch)	tf_exportc                 Z    t        j                  |       t        | j                         d  S N)
_array_opsshapeleninput_tensors    T/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/ops/signal/fft_ops.py_infer_fft_length_for_fftnr       s)    			,	'\-?-?)@(@(B	CC    c                     | j                         t        | j                         d  }|j                         }t	        dd|d   dz
  z        |d<   t        j                  |t        j                        S )Nr         )		get_shaper   r   as_listmax_opsconvert_to_tensor_dtypesint32)r   	fft_shape
fft_lengths      r   _infer_fft_length_for_irfftnr$   $   si    $$&L,>,>(?'?'AB)  "*q!z"~123*R.			
GMM	::r   c                     t        j                  t        j                  t	        | j
                              t        j                        S r   )r   r   nparanger   r   r    r!   r   s    r   _infer_axes_for_fftnr(   +   s2    			iiL&&'('--
 r   c                 l    |t        |       }|S t        j                  |t        j                        }|S r   )r(   r   r   r    r!   )r   axess     r   _process_empty_axesr+   1   s5    	\-D 
+ !!$6D	+r   c                     | j                         | d }|j                         st        j                  |       | d S t	        j
                  |j                         t        j                        S )zGInfers the `fft_length` argument for a `rank` RFFT from `input_tensor`.N)	r   is_fully_definedr   r   r   r   r   r    r!   )r   fft_rankr"   s      r   _infer_fft_length_for_rfftr/   9   se     $$&yz2) 
	#	#	%L)8)*55 
			 1 1 3W]]	CCr   c                    | j                         | d }|j                         sct        j                  t	        j
                  |       | d       }t        j                  dd|d   dz
  z        |d<   t        j                  |      S |j                         }|rt        dd|d   dz
  z        |d<   t        j                  |t        j                        S )zHInfers the `fft_length` argument for a `rank` IRFFT from `input_tensor`.Nr   r   r   r   )r   r-   _array_ops_stackunstackr   r   	_math_opsmaximumstackr   r   r   r   r    r!   )r   r.   r"   r#   s       r   _infer_fft_length_for_irfftr6   F   s     $$&yz2) 
	#	#	%!))&yz24J&&q!z"~/A*BCJrN!!*--   "*AB!!345JrN			
GMM	::r   c           	      *   t        j                  |      }| j                  j                  (t	        d | j                  j
                  D              r| S |j                         r)| j                  j                  | j                  |j                   d }|j                         r|r1|dd j                  |j
                  d   j                  dz  dz         }t        |j
                  |j
                        D cg c]*  \  }}dt        |j                  |j                  z
  d      g, }}}t	        d |D              rLddggt        | j                  j                  |j                  z
  d      z  }	t        j                  | |	|z         S | S t        j                  |       }
t        j                  |       | d }t        j                  d|
|z
        }t        j                   |g|j"                        }	|r$t        j$                  |dd |dd dz  dz   gd      }t        j                  d||z
        }t        j$                  |	|gd      }t'        j(                  t        j*                  |      |gd      }t        j                  | |      S c c}}w )	zFPads `input_tensor` to `fft_length` on its inner-most `fft_rank` dims.Nc              3   :   K   | ]  }|j                   d k(    ywr   N)value).0dims     r   	<genexpr>z&_maybe_pad_for_rfft.<locals>.<genexpr>_   s     	<S#))q.	<s   r   r   r   r   c              3   ,   K   | ]  \  }}|d kD    ywr9    )r;   _pads      r   r=   z&_maybe_pad_for_rfft.<locals>.<genexpr>r   s     ,CS1W,s   )axis)_tensor_utilconstant_value_as_shaper   ndimsanydimsr-   concatenater:   zipr   r   rA   rankr3   r4   zerosdtypeconcatr1   r5   
zeros_like)r   r.   r#   
is_reverser"   input_fft_shapefft_dim	input_dimpaddingsouter_paddings
input_rank
outer_dimsfft_paddingss                r   _maybe_pad_for_rfftrX   Y   sj   22:>) *		<L$6$6$;$;	<<
 !l&8&8&>&>&J"(()//)9):;O'')	crN..NN2$$)A-/	 -0nno&:&:-<=(gy c'--)//91=> =h = 
,8,	,a&C););)A)A)2*9;<%> >~~lNX,EFF |,*$$\2H9:>/  J$9:*##ZL*2B2BC.""JsO$.rsOq$81$<$>?@BJ""1j?&BC,=qA(##X&1;(	h	///=s   </Jc                 h     d fd	}t        j                  dd j                        |_        |S )FWrapper around gen_spectral_ops.rfft* that infers fft_length argument.c                    t        j                  || |g      5 }t        j                  | t        j                        } | j
                  t        j                  t        j                  fvrt        d| z        | j
                  }|t        j                  k(  rt        j                  }n%|t        j                  k(  sJ t        j                  }| j                  j                         |t        |       }n$t        j                  |t        j                        }t        | |      } t        j                   |      }||} | |||      cddd       S # 1 sw Y   yxY w)rZ   preferred_dtype6RFFT requires tf.float32 or tf.float64 inputs, got: %sNTcomplexname)r   
name_scoper   r    float32rL   float64
ValueError	complex64
complex128r   with_rank_at_leastr/   r!   rX   rC   constant_value)	r   r#   ra   
real_dtypecomplex_dtypefft_length_staticdefault_namefft_fnr.   s	         r   _rfftz_rfft_wrapper.<locals>._rfft   s9   	|&
3
5 Q8<++L<COOMl			GOOW__#E	ED 	  %%j	w	&))W__,,,**++H5		/hG
++JF
(xLl&55jA		&&
L*}4P1Q Q Qs   D4EE"z    Tcomplex.*?
 NNresub__doc__)rn   r.   rm   ro   s   ``` r   _rfft_wrapperrv      s)    Q6 &&,b&..A%-	,r   c           	           d fd	}t        j                  ddt        j                  dd j                              |_        |S )zGWrapper around gen_spectral_ops.irfft* that infers fft_length argument.c                 T   t        j                  || |g      5 }t        j                  | t        j                        } | j
                  j                         | j                  t        j                  t        j                  fvrt        d| z        | j                  }|j                  }|t        |       }n$t        j                  |t        j                        }t        | |d      } t        j                  |      }||} | |||      cddd       S # 1 sw Y   yxY w)/Wrapper irfft* that infers fft_length argument.r\   <IRFFT requires tf.complex64 or tf.complex128 inputs, got: %sNTrO   Trealra   )r   rb   r   r    rf   r   rh   rL   rg   re   rj   r6   r!   rX   rC   ri   )	r   r#   ra   rk   rj   rl   rm   r.   ifft_fns	         r   _irfftz_irfft_wrapper.<locals>._irfft   s   	|&
3
5 L8<++L<C<M<MOl++H5			G$5$5w7I7I#J	JJ 	 #((m ++j		0xH
++JF
(x48:l&55jA		&&
\:ZdK)L L Ls   C9DD'`input``input_tensor`z    Treal.*?
rp   rq   rr   )r~   r.   rm   r   s   ``` r   _irfft_wrapperr      s;    L0 66)%5&&!12wGI&.	-r   c                 d     d fd	}t        j                  dd j                        |_        |S )z%Wrapper around gen_spectral_ops.fftn.c                 `   t        j                  |	| ||g      5 }t        | |      }|j                  d   }t        j                  | t
        j                        } | j                  j                  |       |t        |       }n$t        j                  |t
        j                        }t        | ||      } t        j                  |      }||}|d}d}|dk7  r4|D ]  }||z  }	 |dk(  r| |z  } n|dk(  r| t        j                  |      z  }  
| |||      cddd       S # 1 sw Y   yxY w	OWrapper around gen_spectral_ops.*fft that infers fft_length and axes arguments.r   r\   Nbackwardr   forwardortho)ra   r   rb   r+   r   r   r    rf   rh   r   r!   rX   rC   ri   r&   sqrt)r   r#   r*   normra   r.   rl   nfft_length_irm   fft_ns            r   _fftnz_fftn_wrapper.<locals>._fftn   s8   	l\:t<
 >	 t4dAh++
(9(9l ++H5		/=
++JF
(xLl&55jA		&&
	
a		& 	L
|
!	9
!
,W_
"''!*
$,<T=9> > >   C>D$$D-    Tcomplex.*?\nrp   NNNNrr   )r   rm   r   s   `` r   _fftn_wrapperr      s)    >@ &&-r5==A%-	,r   c                 d     d fd	}t        j                  dd j                        |_        |S )z&Wrapper around gen_spectral_ops.ifftn.c                 `   t        j                  |	| ||g      5 }t        | |      }|j                  d   }t        j                  | t
        j                        } | j                  j                  |       |t        |       }n$t        j                  |t
        j                        }t        | ||      } t        j                  |      }||}|d}d}|dk7  r4|D ]  }||z  }	 |dk(  r| |z  } n|dk(  r| t        j                  |      z  }  
| |||      cddd       S # 1 sw Y   yxY wr   r   )r   r#   r*   r   ra   r.   rl   r   r   rm   ifft_ns            r   _ifftnz_ifftn_wrapper.<locals>._ifftn   s8   	l\:t<
 ?	 t4dAh++
(9(9l ++H5		/=
++JF
(xLl&55jA		&&
	
a		& 	L
|
!	9
!
,W_
"''!*
$,L*d>9? ? ?r   r   rp   r   rr   )r   rm   r   s   `` r   _ifftn_wrapperr      s)    ?@ 66.FNNC&.	-r   c                 d     d fd	}t        j                  dd j                        |_        |S )z&Wrapper around gen_spectral_ops.rfftn.c                    t        j                  || ||g      5 }t        | |      }|j                  d   }t        j                  | t
        j                        } | j                  t
        j                  t
        j                  fvrt        d| z        | j                  }|t
        j                  k(  rt
        j                  }n%|t
        j                  k(  sJ t
        j                  }| j                  j                  |       |t        |       }n$t        j                  |t
        j                        }t        | ||      } t!        j"                  |      }||}|d}d}	|dk7  r4|D ]  }
|	|
z  }		 |dk(  r| |	z  } n|dk(  r| t%        j&                  |	      z  }  | ||||	      cddd       S # 1 sw Y   yxY w)
r   r   r\   r^   Nr   r   r   r   r_   )r   rb   r+   r   r   r    rc   rL   rd   re   rf   rg   rh   r   r!   rX   rC   ri   r&   r   )r   r#   r*   r   ra   r.   rj   rk   rl   r   r   rm   rfft_ns              r   _rfftnz_rfftn_wrapper.<locals>._rfftn  s   	l\:t<
 -	 t4dAh++
l 
		GOOW__#E	ED
 	
  %%j	w	&))W__,,,**++H5		/=
++JF
(xLl&55jA		&&
	
a		& 	L
|
!	9
!
,W_
"''!*
$,


 O- - -s   FF44F=r   rp   r   rr   )r   rm   r   s   `` r   _rfftn_wrapperr     s)    /b 66.FNNC&.	-r   c           	           d fd	}t        j                  ddt        j                  dd j                              |_        |S )z'Wrapper around gen_spectral_ops.irfftn.c                    t        j                  || |g      5 }t        | |      }|j                  d   }t        j                  | t
        j                        } | j                  j                  |       | j                  t
        j                  t
        j                  fvrt        d| z        | j                  }|j                  }|t        |       }n$t        j                  |t
        j                        }t        | ||d      } t        j                   |      }||}|d}d}	|dk7  r4|D ]  }
|	|
z  }		 |d	k(  r| |	z  } n|d
k(  r| t#        j$                  |	      z  }  | ||||      cddd       S # 1 sw Y   yxY w)ry   r   r\   rz   NTr{   r   r   r   r   r|   )r   rb   r+   r   r   r    rf   rh   rL   rg   re   rj   r$   r!   rX   rC   ri   r&   r   )r   r#   r*   r   ra   r.   rk   rj   rl   r   r   rm   irfft_ns              r   _irfftnz _irfftn_wrapper.<locals>._irfftnT  s   	l\:6
 '	 t4dAh++
(9(9l ++H5			G$5$5w7I7I#J	JJ
 	
 #((m ++j		1,?
++JF
(
*l '55jA		&&
	
a		& 	L
|
!	9
!
,W_
"''!*
$,

D
K' ' 's   EE88Fr   r   z    Treal.*?\nrp   r   rr   )r   rm   r   s   `` r   _irfftn_wrapperr   Q  s=    )V FFffGOO4'/
 
.r   fftndzsignal.fftndifftndzsignal.ifftndr   rfftzsignal.rfftzspectral.rfft)v1irfftzsignal.irfftzspectral.irfftr   rfft2dzsignal.rfft2dzspectral.rfft2dirfft2dzsignal.irfft2dzspectral.irfft2d   rfft3dzsignal.rfft3dzspectral.rfft3dirfft3dzsignal.irfft3dzspectral.irfft3drfftndzsignal.rfftndirfftndzsignal.irfftndc                 Z    t        j                  t        j                  |       | d        S r   )r3   reduce_prodr   r   )gradrJ   s     r   _fft_size_for_gradr     s'    			z//5tef=	>>r   FFTc                 r    t        j                  t        |d      |j                        }t	        |      |z  S )Nr   )r3   castr   rL   ifftr@   r   sizes      r   	_fft_gradr     s-    	*43TZZ	@$	dd	r   IFFTc           	          t        j                  dt        j                  t        |d      |j                  j                        z  |j                        }t        |      |z  S )N      ?r   )r3   r   r   rL   rj   fftr@   r   rsizes      r   
_ifft_gradr     sM    
..9>>,T15tzz7L7LMM
jj% 
TU	r   FFT2Dc                 r    t        j                  t        |d      |j                        }t	        |      |z  S )Nr   )r3   r   r   rL   ifft2dr   s      r   _fft2d_gradr     -    	*43TZZ	@$		r   IFFT2Dc           	          t        j                  dt        j                  t        |d      |j                  j                        z  |j                        }t        |      |z  S )Nr   r   )r3   r   r   rL   rj   fft2dr   s      r   _ifft2d_gradr     M    
..9>>,T15tzz7L7LMM
jj% 
tu	r   FFT3Dc                 r    t        j                  t        |d      |j                        }t	        |      |z  S )Nr   )r3   r   r   rL   ifft3dr   s      r   _fft3d_gradr     r   r   IFFT3Dc           	          t        j                  dt        j                  t        |d      |j                  j                        z  |j                        }t        |      |z  S )Nr   r   )r3   r   r   rL   rj   fft3dr   s      r   _ifft3d_gradr     r   r   c                 ,      dv sJ d        fd}|S )z=Returns a gradient function for an RFFT of the provided rank.r   r   z'Gradient for RFFT3D is not implemented.c           
         | j                   d   }|j                  j                  }t        j                  | j                   d         }t        j                  d|d   dz  z
        }d }fd}fd}|dddf   }	dk(  r|ddd	f   }
|	||
z   ||d         z  z   }ndk(  r ||d
         } |||	      }t        j                  |t        j                  |	            }|}|ddd	f   }
t        j                  |t        j                  |
            }|d   }t        j                  |t        j                  t        j                  t        j                  |      dz
  gt        j                        |ggd             ||      z  }|||z  z  }t        j                  t        | j                   d         |      } ||      }d||z  t        j                         z   z  d	fS )zEA gradient function for RFFT with the provided `rank` and `irfft_fn`.r   r   r   r   c           
      z   t        j                  | t        j                  t        j                  t        j                  |      dz
  gt
        j                        t        j                  |       gd            }t        j                  |t        j                  t        j                  |      d d ddggd            S )Nr   r   r   )	r   reshaperM   onesrJ   r    r!   r   tile)matrixtexpandeds      r   _tile_for_broadcastingz@_rfft_grad_helper.<locals>._grad.<locals>._tile_for_broadcasting  s    ##



oozq1A56Fv& h __
J%%z'7'7':3B'?!Q&H!LN Nr   c                 `   t        j                  t        j                  t        j                  |       d      | df      }t        j
                  |ddg      }t        j                  dt        j                  z  t        j                  ||z        z  t        j                  |       z        S )z3Computes t_n = exp(sqrt(-1) * pi * n^2 / line_len).r   r   y              )
r   r   expand_dimsr3   range	transposeexpr&   pir   )lengthabrk   s      r   _mask_matrixz6_rfft_grad_helper.<locals>._grad.<locals>._mask_matrix  s     //

 
 !8!
<vqkKa


q1a&
)a]]
+	q1um<
<
..
/01 1r   c                 h    t        j                  ddt        j                  |       dz  z  z
        S )zCA sequence of [1+0j, -1+0j, 1+0j, -1+0j, ...] with length `length`.r   r   )r3   r   r   )r   rk   s    r   _ymaskz0_rfft_grad_helper.<locals>._grad.<locals>._ymask  s1    ^^AY__V%<q%@ AA)+ +r   .Nr   g      ?)inputsrL   rj   r   r   r3   r   matmulconjr   rM   r   rJ   r    r!   r   real)opr   r#   rj   input_shapeis_evenr   r   r   y0ymextra_terms	base_mask
tiled_masky0_termym_term	inner_dim
input_size	the_irfftrk   irfft_fnrJ   s                      @r   _gradz _rfft_grad_helper.<locals>._grad  s   1JJJM))J""299Q<0KnnQ*R.1"45}EGN1+
 
c1Q3hBqyRS>b2{2(???k	{2/i *)R8j  Y^^B-?@gkRS>b  Y^^B-?@gb/i



oozt4q897==Ik 
 )$%g Ww&&k
 299Q<.
<Jz*I)j(9>>++FFGMMr   r?   )rJ   r   r   s   `` r   _rfft_grad_helperr     s&     
BBBHNT 
,r   c                 ,      dv sJ d        fd}|S )z>Returns a gradient function for an IRFFT of the provided rank.r   z(Gradient for IRFFT3D is not implemented.c                    | j                   d   }t        j                  |      }||}|j                  }|t        j
                  k(  rt        j                  }n#|t        j                  k(  rt        j                  }t        j                  |d   d      }t        j                  | j                   d         d   }t        j                  dgdt        j                  |dz
  |z   g|      z  t        j                  d|z
  g|      gd      }t        j                  t        j                   t#        |      |            }	 ||      }
|
t        j                   |	|z        z  dfS )zEA gradient function for IRFFT with the provided `rank` and `rfft_fn`.r   Nr   r   r   r   g       @)r   rC   ri   rL   r    rc   rf   rd   rg   r3   modr   r   rM   r   
reciprocalr   r   )r   r   r#   rl   rj   rk   is_oddinput_last_dimensionmaskr   the_rfftrJ   rfft_fns              r   r   z!_irfft_grad_helper.<locals>._grad8  sB    1J$33J?$$jJW__$''m	w	&((m]]:b>1-F%++BIIaL9"=
joo!A%./= =	!f*z	2	4568D
   4&
"4 5E tZ(HinnUT\=AA4GGr   r?   )rJ   r  r   s   `` r   _irfft_grad_helperr	  3  s%     
CCCH@ 
,r   zsignal.fftshiftc                 p   t        j                  |d      5 }t        j                  |       } |At        t	        | j
                  j                              }t        j
                  |       dz  }nt        |t              rt        j
                  |       |   dz  }not        j                  |       }t        j                  t        j                  |d      ||z   |      }t        j                  t        j
                  |       |      dz  }t        j                   | |||      cddd       S # 1 sw Y   yxY w)a+  Shift the zero-frequency component to the center of the spectrum.

  This function swaps half-spaces for all axes listed (defaults to all).
  Note that ``y[0]`` is the Nyquist component only if ``len(x)`` is even.

  @compatibility(numpy)
  Equivalent to numpy.fft.fftshift.
  https://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.fftshift.html
  @end_compatibility

  For example:

  ```python
  x = tf.signal.fftshift([ 0.,  1.,  2.,  3.,  4., -5., -4., -3., -2., -1.])
  x.numpy() # array([-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.])
  ```

  Args:
    x: `Tensor`, input tensor.
    axes: `int` or shape `tuple`, optional Axes over which to shift.  Default is
      None, which shifts all axes.
    name: An optional name for the operation.

  Returns:
    A `Tensor`, The shifted tensor.
  fftshiftNr   r   r   rb   r   tupler   r   rE   r   
isinstanceintrJ   wherer3   lessgatherr	   rollxr*   ra   shiftrJ   s        r   r  r  [  s    : tZ( 0Dq!A|5'(dq!Q&e	D#	q!$'1,e__QdinnT15td{DId
 0 0 3T:a?e>>!UD$/0 0 0s   DD,,D5zsignal.ifftshiftc                 v   t        j                  |d      5 }t        j                  |       } |Bt        t	        | j
                  j                              }t        j
                  |       dz   }nt        |t              rt        j
                  |       |   dz   }npt        j                  |       }t        j                  t        j                  |d      ||z   |      }t        j                  t        j
                  |       |      dz   }t        j                   | |||      cddd       S # 1 sw Y   yxY w)a  The inverse of fftshift.

  Although identical for even-length x,
  the functions differ by one sample for odd-length x.

  @compatibility(numpy)
  Equivalent to numpy.fft.ifftshift.
  https://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.ifftshift.html
  @end_compatibility

  For example:

  ```python
  x = tf.signal.ifftshift([[ 0.,  1.,  2.],[ 3.,  4., -4.],[-3., -2., -1.]])
  x.numpy() # array([[ 4., -4.,  3.],[-2., -1., -3.],[ 1.,  2.,  0.]])
  ```

  Args:
    x: `Tensor`, input tensor.
    axes: `int` or shape `tuple` Axes over which to calculate. Defaults to None,
      which shifts all axes.
    name: An optional name for the operation.

  Returns:
    A `Tensor`, The shifted tensor.
  	ifftshiftNr   r   r  r  s        r   r  r    s    : t[) 0Tq!A|5'(d  #q()e	D#	  #D)Q./e__QdinnT15td{DId!!*"2"21"5t<ABe>>!UD$/0 0 0s   DD//D8RFFTIRFFTRFFT2DIRFFT2D)Frq   )Bru   rs   numpyr&   tensorflow.python.frameworkr   r    r   r   r   rC   tensorflow.python.opsr   r   r   r1   r   r	   r
   r3   tensorflow.python.utilr    tensorflow.python.util.tf_exportr   r   r$   r(   r+   r/   r6   rX   rv   r   r   r   r   r   r   r   r   r   r   r   r   add_dispatch_supportr   r   r   r   r   r   r   r   r   r   RegisterGradientr   r   r   r   r   r   r   r	  r  r  r?   r   r   <module>r$     s   " 	  9 3 C 9 E 2 + 7 + 6D;
D;&-0`D@$N$N5p3p 		 	 		 	 &,,g6 	. !H!!%( 
(//	: 	/ !H!!&) %**Av6 =	-]O< =!H!!$')'--q': @	.n.>? @!H!!%(*	'..8	< C	/0AB C!H!!&)+
)111i
@ F	
 02DE F!H!!'*,	'..8	< C	/0AB C!H!!&)+
)111i
@ F	
 02DE F!H!!'*,	(//	: 	/ !H!!&) *22I
> 	
 !H!!'*
? u 
 v  w  
 x  ! w  
 x  !Od%P 	(0  (0V 	(0  (0V    f /59 :    g 1!T: ;    h  1!W = >     i  !3Av!> ?r   