
    IR-eޱ                        d dl Z d dlmZ d dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dl m!Z! 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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6  e0d          Z7dge7j8        _9        d Z:dZ; e j<                    5   e j=        de            e0 ej>        e;d                    Z?ddd           n# 1 swxY w Y   d Z@dZA e j<                    5   e j=        de            e0 ej>        eAd                    ZBddd           n# 1 swxY w Y   d ZCeAD                                dz   dz   ZE e j<                    5   e j=        de            e0 ej>        eEd                    ZFddd           n# 1 swxY w Y   d ZGd ZH e j<                    5   e j=        dee1f            e0 ej>        eHd                    ZIddd           n# 1 swxY w Y   d! ZJd"ZK ee.           ed#          k    reKd$z  ZKejL        d%             ZMd& ZNejO        P                    d'd(          d)             ZQd* ZRd+ ZSd, ZTejO        jU        ejO        P                    d'd-          d.                         ZVd/ ZWd0 ZXejL        d1             ZYd2 ZZd3 Z[d4 Z\d5 Z]d6 Z^d7 Z_d8 Z`d9 Zad: Zbd; Zcd< Zdd=ZeejL        d>             Zfd? ZgejO        P                    d@ eg dAdBdCg                    dD             ZhdE ZidFZjejL        dG             ZkejO        P                    dH eg dAdBdCg                    dI             ZldJZmejL        dK             ZndL ZodM ZpdNZqejL        dO             Zr ejL                    dP             ZsdQ ZtdR ZudS )S    N)product)assert_allcloseassert_array_equalassert_equal)Version)units)FK5ICRSITRSEarthLocationGalacticSkyCoordSpectralCoordStokesCoord)fits)Header)VerifyWarning)assert_quantity_allclose)Time)Quantity)UnitsWarning)iers)get_pkg_data_filename)AstropyUserWarning)__version__)WCSFITSFixedWarningNoConvergenceSip)VELOCITY_FRAMEScustom_ctype_to_ucd_mapping   naxisc                     t           } | j        dk    sJ | j        dk    sJ | j        J | j        J | j        d gk    sJ | j        dgk    sJ | j        dgk    sJ | j        dgk    sJ t          | j
        d           | j        dgk    sJ | j        d         d         t          u sJ | j        d         d         dk    sJ | j        d         d         d	         t          j        u sJ t!          |                     d
          d
           t!          |                     d
          d
           t'          j        |                     d
                    dk    sJ t'          j        |                     d
                    dk    sJ t!          |                     d
          d
           t          |                     d
          d           t'          j        |                     d
                    dk    sJ t'          j        |                     d
                    dk    sJ |                     d
          }t1          |d
t          j        z             t'          j        |          dk    sJ |                     d
          }t1          |d
t          j        z             t'          j        |          dk    sJ dt          j        z  }|                     |          }t!          |d           t'          j        |          dk    sJ |                     |          }t          |d           t'          j        |          dk    sJ d S )Nr"    T)worldr   valuer'   r       unit   )r,      g      .@)	WCS_EMPTYpixel_n_dimworld_n_dimarray_shapepixel_shapeworld_axis_physical_typesworld_axis_unitspixel_axis_namesworld_axis_namesr   axis_correlation_matrixworld_axis_object_componentsworld_axis_object_classesr   uoner   pixel_to_world_valuesarray_index_to_world_valuesnpndimworld_to_pixel_valuesworld_to_array_index_valuespixel_to_worldr   array_index_to_worldworld_to_pixelworld_to_array_index)wcscoordxis       Elib/python3.11/site-packages/astropy/wcs/wcsapi/tests/test_fitswcs.py
test_emptyrK   /   sP   
C ?a?a?"""?"""(TF2222B4''''B4''''B4'''',d333+0E/FFFFF(1!4@@@@(1!4::::(1!4V<EEEEC--b112666C33B77<<<73,,R0011Q66667322266771<<<<C--b1126660044e<<<73,,R0011Q66667322266771<<<< r""EUBJ///75>>Q$$R((EUBJ///75>>QJE5!!AAt71::????  ''AB71::??????    z
WCSAXES = 2
CTYPE1  = RA---TAN
CTYPE2  = DEC--TAN
CRVAL1  = 10
CRVAL2  = 20
CRPIX1  = 30
CRPIX2  = 40
CDELT1  = -0.1
CDELT2  =  0.1
CROTA2  = 0.
CUNIT1  = deg
CUNIT2  = deg
ignore
sepc                     t           } | j        dk    sJ | j        dk    sJ | j        J | j        J | j        ddgk    sJ | j        ddgk    sJ | j        ddgk    sJ | j        ddgk    sJ t          | j
        d           | j        ddgk    sJ | j        d	         d
         t          u sJ | j        d	         d         dk    sJ t          | j        d	         d         d         t                    sJ | j        d	         d         d         t           j        t           j        fk    sJ t%          |                     dd          d           t%          |                     dd          d           t%          |                     dd          d           t          |                     dd          d           |                     dd          }t          |t                    sJ t          |j        t                    sJ t%          |j        j        d           t%          |j        j        d           |                     dd          }t          |t                    sJ t          |j        t                    sJ t%          |j        j        d           t%          |j        j        d           t          dddd          }|                     |          \  }}t%          |d           t%          |d           |                     |          \  }}t          |d           t          |d           |j        }|                     |          \  }}t%          |d           t%          |d           |                     |          \  }}t          |d           t          |d           t?          j         d          !                    d          }t          dddd          }|                     |          }t          ||         d           t          ddgddgdd          }|                     |          }t          ||         ddg           d S ) Nr*   	pos.eq.ra
pos.eq.decdegr&   T	celestialr   zspherical.lon.degreerV   r"   zspherical.lat.degreerV   r   r"   r)   framer+   r,   '   )
      rZ   r[   )      =@     C@)rY   r,   icrsr+   rX   r\   r]   i  )<   r`   iA	        i  )"WCS_SIMPLE_CELESTIALr/   r0   r1   r2   r3   r4   r5   r6   r   r7   r8   r9   r   
isinstancer
   r:   rT   r   r<   r=   r@   rA   rB   rX   radecrC   rD   rE   galacticr>   arangereshape)	rF   rG   rH   yrI   jcoord_galacticdataindexs	            rJ   test_simple_celestialro   ~   sq   
C ?a?a?"""?"""([,,GGGGGE5>1111B8++++B8++++,d333+000    
 (5a8HDDDD(5a8B>>>>c3K@CGLdSSSSS(5a8@QUAENRRRRC--b"55x@@@C33B;;XFFFC--b"55|DDD00R88(CCC r2&&EeX&&&&&ek4(((((EHL"%%%EIM2&&&$$R,,EeX&&&&&ek4(((((EHL"%%%EIM2&&&R%v666Ee$$DAqAtAt##E**DAqBB
 ^Nn--DAqAtAt##N33DAqBB 9T??""8,,DR%v666E$$U++Eed###b"XBxe6BBBE$$U++EetTl+++++rL   a!  
WCSAXES = 3
CTYPE1  = GLAT-CAR
CTYPE2  = FREQ
CTYPE3  = GLON-CAR
CNAME1  = Latitude
CNAME2  = Frequency
CNAME3  = Longitude
CRVAL1  = 10
CRVAL2  = 20
CRVAL3  = 25
CRPIX1  = 30
CRPIX2  = 40
CRPIX3  = 45
CDELT1  = -0.1
CDELT2  =  0.5
CDELT3  =  0.1
CUNIT1  = deg
CUNIT2  = Hz
CUNIT3  = deg
c                  
   t           } | j        dk    sJ | j        dk    sJ | j        J | j        J | j        g dk    sJ | j        g dk    sJ | j        g dk    sJ | j        g dk    sJ t          | j
        g dg dg dg           t          | j                  dk    sJ | j        d         d	k    sJ | j        d
         d d         dk    sJ | j        d         dk    sJ | j        d         d         t          u sJ | j        d         d
         dk    sJ t          | j        d         d         d         t                     sJ | j        d         d         d         t"          j        t"          j        fk    sJ | j        d         d         t&          u sJ | j        d         d
         dk    sJ | j        d         d         i k    sJ t)          |                     ddd          d           t)          |                     ddd          d           t)          |                     ddd          d           t          |                     ddd          d           |                     ddd          \  }}t          |t                    sJ t          |j        t                     sJ t)          |j        j        d           t)          |j        j        d           t          |t:                    sJ t)          |                    t"          j                  d           |                      ddd          \  }}t          |t                    sJ t          |j        t                     sJ t)          |j        j        d           t)          |j        j        d           t          |t:                    sJ t)          |                    t"          j                  d           t          dddd          }dt"          j        z  }tC          j"        tF          d           5  | $                    ||          \  }}}d d d            n# 1 swxY w Y   t)          |d!           t)          |d"           t)          |d#           tC          j"        tF          d           5  | $                    ||          \  }}}d d d            n# 1 swxY w Y   t)          |d!           t)          |d"           t)          |d#           tC          j"        tF          d           5  | %                    ||          \  }}}d d d            n# 1 swxY w Y   t          |d           t          |d           t          |d           tC          j"        tF          d           5  | %                    ||          \  }}}d d d            n# 1 swxY w Y   t          |d           t          |d           t          |d           d S )$N   pos.galactic.latem.freqpos.galactic.lonrT   HzrT   r&   r&   r&   Latitude	Frequency	Longitude)TFT)FTFr   rW   r"   r*   spectralr   rU   rV   r)   rX   r+   r~   r,   rY   ,   )rZ   r[      rZ   r[   r   )r\   r]         F@)r   rY   r,   rT   rg   r_   No observer defined on WCSmatchr\   r]   r   )&WCS_SPECTRAL_CUBEr/   r0   r1   r2   r3   r4   r5   r6   r   r7   lenr8   r9   r   rd   r   r:   rT   r   r   r<   r=   r@   rA   rB   rX   lbr   to_valuerw   rC   pytestwarnsr   rD   rE   )	rF   rG   specrH   rj   zrI   rk   ks	            rJ   test_spectral_cuber      sM    C ?a?a?"""?"""( - - -    
 #7#7#77777<<<////#I#I#IIIII#			2224G4G4GH  
 s/00A5555+A. 3    
 +A.rr2oEEEE+A. 3     (5a8HDDDD(5a8B>>>>c3K@CGLhWWWWW(5a8@QUAENRRRR(4Q78CCCC(4Q72====(4Q72====C--b"b99<HHHC33BB??NNNC--b"b99;MNNN00R<<lKKK $$RR00KE4eX&&&&&ek8,,,,,EGK$$$EGK$$$dM*****DMM!$'',,,**2r266KE4eX&&&&&ek8,,,,,EGK$$$EGK$$$dM*****DMM!$'',,,R%z:::E9D	(0L	M	M	M 2 2$$UD111a2 2 2 2 2 2 2 2 2 2 2 2 2 2 2AtAtAt 
(0L	M	M	M 2 2$$T5111a2 2 2 2 2 2 2 2 2 2 2 2 2 2 2AtAtAt	(0L	M	M	M 8 8**5$771a8 8 8 8 8 8 8 8 8 8 8 8 8 8 8BBB 
(0L	M	M	M 8 8**4771a8 8 8 8 8 8 8 8 8 8 8 8 8 8 8BBBsH   *QQQ'SSS$UUU!WWWz
PC2_3 = -0.5
PC3_2 = +0.5
c                  J   t           } | j        g dk    sJ | j        g dk    sJ | j        g dk    sJ | j        g dk    sJ t          | j        g dg dg dg           t          | j                  dk    sJ | j        d         d	k    sJ | j        d
         d d         dk    sJ | j        d         dk    sJ | j	        d         d         t          u sJ | j	        d         d
         dk    sJ t          | j	        d         d         d         t                    sJ | j	        d         d         d         t          j        t          j        fk    sJ | j	        d         d         t          u sJ | j	        d         d
         dk    sJ | j	        d         d         i k    sJ d S )Nrr   rv   rx   ry   )TTT)FTTrq   r   rW   r"   r*   r}   rU   rV   r)   rX   r+   r~   )WCS_SPECTRAL_CUBE_NONALIGNEDr3   r4   r5   r6   r   r7   r   r8   r9   r   rd   r   r:   rT   r   rF   s    rJ   test_spectral_cube_nonalignedr   d  s5    'C( - - -    
 #7#7#77777<<<////#I#I#IIIII#	
   s/00A5555+A. 3    
 +A.rr2oEEEE+A. 3     (5a8HDDDD(5a8B>>>>c3K@CGLhWWWWW(5a8@QUAENRRRR(4Q78CCCC(4Q72====(4Q72======rL   aA  
SIMPLE  = T / Fits standard
BITPIX  = -32 / Bits per pixel
NAXIS   = 3 / Number of axes
NAXIS1  = 2048 / Axis length
NAXIS2  = 2048 / Axis length
NAXIS3  = 11 / Axis length
DATE    = '2008-10-28T14:39:06' / Date FITS file was generated
OBJECT  = '2008 TC3' / Name of the object observed
EXPTIME = 1.0011 / Integration time
MJD-OBS = 54746.02749237 / Obs start
DATE-OBS= '2008-10-07T00:39:35.3342' / Observing date
TELESCOP= 'VISTA' / ESO Telescope Name
INSTRUME= 'VIRCAM' / Instrument used.
TIMESYS = 'UTC' / From Observatory Time System
TREFPOS = 'TOPOCENT' / Topocentric
MJDREF  = 54746.0 / Time reference point in MJD
RADESYS = 'ICRS' / Not equinoctal
CTYPE2  = 'RA---ZPN' / Zenithal Polynomial Projection
CRVAL2  = 2.01824372640628 / RA at ref pixel
CUNIT2  = 'deg' / Angles are degrees always
CRPIX2  = 2956.6 / Pixel coordinate at ref point
CTYPE1  = 'DEC--ZPN' / Zenithal Polynomial Projection
CRVAL1  = 14.8289418840003 / Dec at ref pixel
CUNIT1  = 'deg' / Angles are degrees always
CRPIX1  = -448.2 / Pixel coordinate at ref point
CTYPE3  = 'UTC' / linear time (UTC)
CRVAL3  = 2375.341 / Relative time of first frame
CUNIT3  = 's' / Time unit
CRPIX3  = 1.0 / Pixel coordinate at ref point
CTYPE3A = 'TT' / alternative linear time (TT)
CRVAL3A = 2440.525 / Relative time of first frame
CUNIT3A = 's' / Time unit
CRPIX3A = 1.0 / Pixel coordinate at ref point
OBSGEO-B= -24.6157 / [deg] Tel geodetic latitude (=North)+
OBSGEO-L= -70.3976 / [deg] Tel geodetic longitude (=East)+
OBSGEO-H= 2530.0000 / [m] Tel height above reference ellipsoid
CRDER3  = 0.0819 / random error in timings from fit
CSYER3  = 0.0100 / absolute time error
PC1_1   = 0.999999971570892 / WCS transform matrix element
PC1_2   = 0.000238449608932 / WCS transform matrix element
PC2_1   = -0.000621542859395 / WCS transform matrix element
PC2_2   = 0.999999806842218 / WCS transform matrix element
CDELT1  = -9.48575432499806E-5 / Axis scale at reference point
CDELT2  = 9.48683176211164E-5 / Axis scale at reference point
CDELT3  = 13.3629 / Axis scale at reference point
PV1_1   = 1. / ZPN linear term
PV1_3   = 42. / ZPN cubic term
c                  
   t           } | j        dk    sJ | j        dk    sJ | j        dk    sJ | j        dk    sJ | j        g dk    sJ | j        g dk    sJ | j        g dk    sJ | j        g dk    sJ t          | j
        g dg dg dg           | j        }|d	         d
k    sJ |d         dk    sJ |d         d d         dk    sJ t          |d         d                   sJ | j        d         d	         t          u sJ | j        d         d         dk    sJ t          | j        d         d         d         t                     sJ | j        d         d         d         t"          j        t"          j        fk    sJ | j        d         d	         t&          u sJ | j        d         d         dk    sJ | j        d         d         i k    sJ t          | j        d         d                   sJ t)          |                     ddd	          d           t)          |                     d	dd          d           t)          |                     ddd          d           t          |                     ddd          d           |                     ddd          \  }}t          |t                    sJ t          |j        t                     sJ t)          |j        j        d           t)          |j        j        d            t          |t&                    sJ t)          |j        d!           |                     ddd          \  }}t          |t                    sJ t          |j        t                     sJ t)          |j        j        d           t)          |j        j        d            t          |t&                    sJ t)          |j        d!           |                     ||          \  }}}t)          |d"           t)          |d#           t)          |d$           |                     ||          \  }}}t)          |d"           t)          |d#           t)          |d$           |                      ||          \  }}}	t          |d           t          |d           t          |	d           |                      ||          \  }}}	t          |d           t          |d           t          |	d           d S )%Nrq   )      r   )r   r   r   )rS   rR   time)rT   rT   srx   )TTF)FFTr   rW   r"   rU   r*   )r   r   rV   r)   rX   r+   r   33333|33333@)!k-@Z-\% @O@r   r   r   )r   r   r   )r   i  i?r,   rY   r   g:O?g.)-@g.A@r\   r]   r   )!WCS_TIME_CUBEr/   r0   r1   r2   r3   r4   r5   r6   r   r7   r8   callabler9   r   rd   r
   r:   rT   r   r   r<   r=   r@   rA   rB   rX   re   rf   mjdrC   rD   rE   )
rF   
componentsrG   r   rH   rj   r   rI   rk   r   s
             rJ   test_time_cuber     s    C?a?a?.....?.....(,O,O,OOOOO#6#6#66666<<<////<<<////#			1113G3G3GH  
 1Ja=DDDDDa=DDDDDa=!++++JqM!$%%%%%(5a8HDDDD(5a8B>>>>c3K@CGLdSSSSS(5a8@QUAENRRRR(03t;;;;(03r9999(03r9999C1&9!<=====!!&&!446  
 ''66::6  
 !!"24DhOO   ''(8:JHUU   $$RR00KE4eX&&&&&ek4(((((EHL"4555EIM#5666dD!!!!!DH/000**2r266KE4eX&&&&&ek4(((((EHL"4555EIM#5666dD!!!!!DH/000  --GAq!AtAtAt   u--GAq!AtAtAt&&ud33GAq!BBB &&tU33GAq!BBBrL   z
SIMPLE  = T
BITPIX  = -32
NAXIS   = 1
NAXIS1  = 2048
TIMESYS = 'UTC'
TREFPOS = 'TOPOCENT'
MJDREF  = 50002.6
CTYPE1  = 'UTC'
CRVAL1  = 5
CUNIT1  = 's'
CRPIX1  = 1.0
CDELT1  = 2
OBSGEO-L= -20
OBSGEO-B= -70
OBSGEO-H= 2530
z7.1z DATEREF = '1995-10-12T14:24:00'
c                  8    t          j        t          d          S NrN   rO   r   
fromstringHEADER_TIME_1Dr)   rL   rJ   header_time_1dr   O  s    ^6666rL   c                 h   t          j                    5  t          j        dt                     t	          |           }d d d            n# 1 swxY w Y   |                    |          }t          |j        |d           t          |j        |d           |j	        |k    sJ |j
        |k    sJ d S )NrM   g|=rtol)warningscatch_warningssimplefilterr   r   rB   r   jd1jd2formatscale)headerpositionr   r   r   r   rF   r   s           rJ   assert_time_atr   T  s    		 	"	"  h(8999&kk               h''DDHc....DHc....;&    :   *A

AAr   )taitcbtcgtdbttut1utclocalc                 \    |                                 | d<   t          | ddd|d           d S )NCTYPE1r"   Sb% |螹?r   )upperr   )r   r   s     rJ   test_time_1d_valuesr   _  s5      %{{}}N8>1g/BE5QQQQQrL   c                 8    d| d<   t          | ddddd           d S )NGPSr   r"   r   g<ALR?r   r   r   r   s    rJ   test_time_1d_values_gpsr   j  s,    $N8>1g/I5RWXXXXXrL   c                     d| d<   t          | ddddd           d| d<   t          | dddd	d           d
| d<   t          | ddddd           d| d<   t          | ddddd           d S )NTDTr   r"   r   r   r   r   IATr   GMTr   ETr   r   s    rJ   test_time_1d_values_deprecatedr   p  s    $N8>1g/BD%PPP$N8>1g/BE5QQQ$N8>1g/BE5QQQ#N8>1g/BD%PPPPPrL   c                 j    d| d<   t          | ddddd           d| d	<   t          | dddd
d           d S )NTIMEr   r"   r   r   r   r   TAITIMESYSr   r   r   s    rJ   test_time_1d_values_timer   |  sN    %N8>1g/BE5QQQ %N9>1g/BE5QQQQQrL   )r   r   r   r   r   r   r   c                    t          j        dd          }|                                | d<   t          j                    5  t          j        dt                     t          |           }d d d            n# 1 swxY w Y   |                    |          }|	                    |          }t          ||           |                    |          j        }d|_        |	                    |          }t          ||           d S )Nrq   rZ   r   rM   isot)r>   rh   r   r   r   r   r   r   rB   rD   r   r   r   )r   r   pixel_inrF   r   	pixel_outs         rJ   test_time_1d_roundtripr     s,   
 yBH${{}}N8		 	"	" " "h(8999.!!" " " " " " " " " " " " " " "
 h''D""4((IHi((( h''+DDK""4((IHi(((((s    *A66A:=A:c                 N   | d= d| d<   d| d<   t          j                    5  t          j        dt                     t	          |           }d d d            n# 1 swxY w Y   |                    d          }t          |j        dd	
           t          |j        dd
           d S )NMJDREFg     d@MJDREFIgdy=MJDREFFrM   rZ   g   BAg-q=r   g^B߿gvIh%<=)	r   r   r   r   r   rB   r   r   r   )r   rF   r   s      rJ   test_time_1d_high_precisionr     s    x  'N9 %N9		 	"	" " "h(8999.!!" " " " " " " " " " " " " " " b!!D DHie4444DH;%HHHHHHs   *AAAc                 f   t          j                    5  t          j        dt                     t	          |           }d d d            n# 1 swxY w Y   |                    d          }|j                                        \  }}}t          |j	        d           t          |j	        d           d S )NrM   rZ   i)
r   r   r   r   r   rB   locationto_geodeticr   degree)r   rF   r   lonlatalts         rJ   test_time_1d_location_geodeticr     s     
	 	"	" " "h(8999.!!" " " " " " " " " " " " " " " b!!DM--//MCc CJ$$$CJ$$$$$r   c                  N    t          j        t          d          } | d= | d= | d= | S )NrN   rO   OBSGEO-LOBSGEO-BOBSGEO-Hr   )r   s    rJ   header_time_1d_no_obsr     s4    ~4888FzzzMrL   c                 B   | }d|d<   d|d<   d|d<   t          j                    5  t          j        dt                     t	          |          }d d d            n# 1 swxY w Y   |                    d          }|j                                        \  }}}t          |	                    t          j                  d           t          |	                    t          j                  d           t          |	                    t          j                  d           d S )NrZ   zOBSGEO-Xr   zOBSGEO-Y   zOBSGEO-ZrM   )r   r   r   r   r   rB   r   to_geocentricr   r   r:   m)r   r   rF   r   rH   rj   r   s          rJ    test_time_1d_location_geocentricr     s2    #FF:F:F:		 	"	"  h(8999&kk               b!!Dm))++GAq!AJJqsOOR(((AJJqsOOS)))AJJqsOOR(((((s   *AA"Ac                    d| d<   t          |           }|                    d          }|j                                        \  }}}t	          |                    t          j                  d           t	          |                    t          j                  d           t	          |                    t          j                  d           d S )N	GEOCENTERTREFPOSrZ   r   )r   rB   r   r   r   r   r:   r   )r   rF   r   rH   rj   r   s         rJ   test_time_1d_location_geocenterr     s    '2)$
#
$
$Cb!!Dm))++GAq!AJJqsOOQ'''AJJqsOOQ'''AJJqsOOQ'''''rL   c                     t          |           }t          j        t          d          5  |                    d          }d d d            n# 1 swxY w Y   |j        J d S )NUMissing or incomplete observer location information, setting location in Time to Noner   rZ   r   r   r   UserWarningrB   r   r   rF   r   s      rJ   test_time_1d_location_missingr     s     #
$
$C	<
 
 
 & & !!"%%& & & & & & & & & & & & & & & =     s   AAAc                 Z   d| d<   t          j                    5  t          j        dt                     t	          |           }d d d            n# 1 swxY w Y   t          j        t          d          5  |                    d          }d d d            n# 1 swxY w Y   |j	        J d S )Ng      $@r   rM   r   r   rZ   )
r   r   r   r   r   r   r   r   rB   r   r   s      rJ    test_time_1d_location_incompleter     s6    )-*%		 	"	" ) )h(8999'(() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
<
 
 
 & & !!"%%& & & & & & & & & & & & & & & =     s#   *AAA5BBBc                     d| d<   t          |           }t          j        t          d          5  |                    d          }d d d            n# 1 swxY w Y   |j        J d S )N
BARYCENTERr   zTObservation location 'barycenter' is not supported, setting location in Time to Noner   rZ   r   r   s      rJ   !test_time_1d_location_unsupportedr     s     (4)$
#
$
$C	:
 
 
 & & !!"%%& & & & & & & & & & & & & & & =        AAAc                     d| d<   t          |           }t          j        t          d          5  |                    d          }d d d            n# 1 swxY w Y   t          |t                    sJ d S )NzUT(WWV)r   z0Dropping unsupported sub-scale WWV from scale UTr   rZ   )r   r   r   r   rB   rd   r   r   s      rJ   test_time_1d_unsupported_ctyper  #  s     '0(#
#
$
$C	M
 
 
 & & !!"%%& & & & & & & & & & & & & & &
 dD!!!!!!!r  c                      t          d          } t          j        t                    5  dg| j        _        | j        dgk    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr"   r#   zbananas // sekonds)r   r   r   r   rF   cunitr4   r   s    rJ   test_unrecognized_unitr  7  s    
A,,,C	l	#	# > >-.#(<'======> > > > > > > > > > > > > > > > > >s   AAAc                  V   t          d          } t          j        t                    5  t	          |           }d d d            n# 1 swxY w Y   t          |j        d           ddgddgg|j        _        t          |j        d           ddg|j        _	        t          |j        d           d |_
        t          |j        ddgddgg           dd	g|j        _	        t          |j        d           d
dgdd
gg|j        _        ddg|j        _	        t          |j        d           d S )Nz../../tests/data/sip.fitsTr"   r   XYFzRA---TANzDEC--TANg?g皙?)r   r   r   r   r   r   r7   rF   pcctypesip)filenamews     rJ   test_distortion_correlationsr  ?  sk   $%@AAH	&	'	'  MM              *D111 AAAEH*D111 *AEK*D111 AE*dE]UDM,JKKK z*AEK*D111 dc3Z(AEH*AEK*D11111s   AA	A	c                  H   t          d          } dg| j        _        | j        d gk    sJ t	          ddi          5  | j        d gk    sJ 	 d d d            n# 1 swxY w Y   t	          ddd          5  | j        dgk    sJ 	 d d d            n# 1 swxY w Y   t	          ddi          5  t	          ddi          5  | j        dgk    sJ 	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t	          ddi          5  t	          ddi          5  | j        dgk    sJ 	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t	          ddi          5  t	          ddi          5  | j        dgk    sJ 	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t	          ddi          5  t	          ddi          5  | j        dgk    sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )	Nr"   r#   SPAMAPPLEz
food.fruitz	food.spam)r  r  notfood)r   rF   r  r3   r!   r   s    rJ   !test_custom_ctype_to_ucd_mappingsr  \  s   
A,,,CHCGM(TF2222 
%g|%<	=	= 7 7,666667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 
%|[%Q%Q	R	R > >,=====> > > > > > > > > > > > > > >
 
%fk%:	;	; B B('<)@AA 	B 	B0[MAAAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	BB B B B B B B B B B B B B B B 
%g|%<	=	= B B(&+)>?? 	B 	B0[MAAAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	BB B B B B B B B B B B B B B B 
%fi%8	9	9 B B(&+)>?? 	B 	B0[MAAAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	BB B B B B B B B B B B B B B B 
%fk%:	;	; @ @(&))<== 	@ 	@0YK?????	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @s   AA A6BBB.C3 CC3C 	 C3#C 	$C33C7:C7E!D=1E=E	EE	EEE0F5FF5F"	"F5%F"	&F55F9<F9H#G?3H?H	HH	HHHc                     t                                           } | j        ddgk    sJ | j        d         d         t          u sJ | j        d         d         dk    sJ t          | j        d         d         d         t                    sJ | j        d         d         d	         t          j        t          j        fk    sJ d
| j	        _
        | j        d         d         d         }t          |t                    sJ |j        j        dk    sJ d| j	        _        | j        d         d         d         }t          |t                    sJ |j        j        dk    sJ d S )NrU   rW   rV   r   r"   r)   r*   rX   r+   r	   g     @@i  g     h@)rc   deepcopyr8   r9   r   rd   r
   r:   rT   rF   radesysr	   equinoxjyear)rF   rX   s     rJ   #test_caching_components_and_classesr    si   
 
'
'
)
)C+000    
 (5a8HDDDD(5a8B>>>>c3K@CGLdSSSSS(5a8@QUAENRRRRCGO)+6q9'BEeS!!!!!=&((((CGO)+6q9'BEeS!!!!!=&((((((rL   c                     t                                           } d| _        g d| _        | j        }|j        dk    sJ |j        dk    sJ |j        dk    sJ |j        dk    sJ |j        ddgk    sJ |j        dd	gk    sJ |j	        d
d
gk    sJ |j
        ddgk    sJ |                     g d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ |j        dk    sJ |j        g dk    sJ |j        g dk    sJ |j	        g dk    sJ |j
        g dk    sJ |                     ddg          }|j        dk    sJ |j        dk    sJ |j        dk    sJ |j        dk    sJ |j        ddgk    sJ |j        d	dgk    sJ |j	        d
d
gk    sJ |j
        ddgk    sJ dg| j        j        z  | j        _        |                     ddg          }|j        dk    sJ |j        dk    sJ |j        dk    sJ |j        dk    sJ |j        ddgk    sJ |j        d	dgk    sJ |j	        d
d
gk    sJ |j
        ddgk    sJ d S )N)r   (   2   )r         r-   r*   )r  r   )r   r  r  r$  rs   ru   rT   rz   r|   )r   r*   r   rq   )Nr  N)Nr!  N)Nrt   N)r&   rw   r&   )r&   r{   r&   	longitudelatituder&   )r   r  r2   pixel_boundsrV   r/   r0   r1   r3   r4   r6   subrF   r$   cname)rF   wcs_sub1wcs_sub2wcs_sub3wcs_sub4s        rJ   test_sub_wcsapi_attributesr/    s   
 
$
$
&
&C"CO444C }H1$$$$1$$$$8++++8++++ Xw$77777-2     $6666$[(AAAAA wwyyy!!H1$$$$1$$$$#33333#33333 $:$:$:::::-1H1H1HHHHH$6666$(=(=(===== wwZ011H1$$$$1$$$$8++++8++++ Wh$77777-2     $6666$j(AAAAA D37=(CGMwwZ011H1$$$$1$$$$8++++8++++ Wh$77777-2     $6666$R000000rL   a   
BUNIT   = 'Jy/beam'
EQUINOX =      2.000000000E+03
CTYPE1  = 'RA---SIN'
CRVAL1  =    2.60108333333E+02
CDELT1  =     -2.777777845E-04
CRPIX1  =                  1.0
CUNIT1  = 'deg'
CTYPE2  = 'DEC--SIN'
CRVAL2  =   -9.75000000000E-01
CDELT2  =      2.777777845E-04
CRPIX2  =                  1.0
CUNIT2  = 'deg'
CTYPE3  = 'FREQ'
CRVAL3  =    1.37835117405E+09
CDELT3  =      9.765625000E+04
CRPIX3  =                 32.0
CUNIT3  = 'Hz'
SPECSYS = 'TOPOCENT'
RESTFRQ =      1.420405752E+09 / [Hz]
RADESYS = 'FK5'
c                  8    t          j        t          d          S r   )r   r   HEADER_SPECTRAL_FRAMESr)   rL   rJ   header_spectral_framesr2    s    3>>>>rL   c                 <   t           j                            dd          5  t          dd          }|                                 }|j        |d<   d|d<   d	|d
<   d|d<   d|d<   d|d<   t          j        t                    5  t          |          }d d d            n# 1 swxY w Y   |
                    ddd          d         }t          |t                    sJ t          |j        t                    sJ |j        j        j        |j        k    sJ t#          |j        j        j        d         j        j        d           t-          j        dd                              |                              t5                                }|                    |j                            t5                                          dt8          j        z  k     sJ t=          j                    D ]\  }}||d<   t          j        t                    5  t          |          }d d d            n# 1 swxY w Y   |
                    ddd          d         }	|	                     |          }
tC          |	j"        |
j"                   	 d d d            d S # 1 swxY w Y   d S )Nauto_downloadFz2009-05-04T04:44:23r   )r   MJD-OBSg4)U0@CRVAL1g8mACRVAL2fffffb@r   3333334r           r   r      r"   r   )obstimeSPECSYS)#r   confset_tempr   copyr   r   r   r   r   rB   rd   r   observerr   r<  r   r   rm   differentialsd_xyzr(   r   from_geodeticget_itrstransform_tor
   separation_3dr:   kmr    items$with_observer_stationary_relative_tor   quantity)r2  r<  r   wcs_toposc_topoobservatoryspecsysexpected_framerF   scsc_checks              rJ   test_spectralcoord_framerS    sY    
		OU	3	3 +E +E,E:::',,..#Ky#x#x"z"z z \*++ 	# 	#6{{H	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#
 ))!Q33A6 '=11111'*D11111',<<<<W%*8=CI1MMM 'u55XgX&&\$&&!! 	 %%g&6&C&CDFF&K&KLLqSTSWxWWWW (7'<'>'> 		E 		E#G^ 'F9.// " "&kk" " " " " " " " " " " " " " "##Aq"--a0B >>~NNH$R[(2CDDDD		EE+E +E +E +E +E +E +E +E +E +E +E +E +E +E +E +E +E +Es\   A"JBJB#	#J&B#	'E(JH+J+H//J2H/3AJJJ)ctype3rA  )ZOPTBETAVELOVRADVOPTFTc                    |                                  }||d<   d|d<   d|d<   |d         dk    rd|d	<   nd
|d	<   d|d<   d|d<   |rd|d<   d|d<   d|d<   d|d<   t          j                    5  t          j        dt                     t          |          }d d d            n# 1 swxY w Y   |                    ddd          \  }}t          |t                    sJ |r|	                    ||          }nIt          j        t          d          5  |	                    ||          }d d d            n# 1 swxY w Y   t          |g ddd           d S )NCTYPE3r
  CRVAL3MbP?CDELT3r   Vm s-1CUNIT3r&      j*ARESTWAV  r5  r8  r   r9  r   r:  r   BARYCENTr=  rM   r;  r   r   )r   r   r;  ư>g&.>)r   atol)r@  r   r   r   r   r   rB   rd   r   rD   r   r   r   r   )r2  rT  rA  r   rF   skycoordspectralcoordpixs           rJ   test_different_ctypesrk  ;  s   
 $((**FF8F8F8ayC"xx&F9F9 '"z"z z&y		 	"	"  h(8999&kk               "00Ar::Hmm]33333 >  =99\,4PQQQ 	> 	>$$X}==C	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> C$T::::::s$   .*B$$B(+B(D77D;>D;c                     t          d          } ddg}t          j        d          x}x}x}}d|d<   ddg}ddg}t          |||||          | _        |                     ||dd	
          }t          j        t                    5  |                     ||d           ddd           n# 1 swxY w Y   t          j	        t                    5  t          |                     ||          |           ddd           dS # 1 swxY w Y   dS )zTest case for issue #11446
    Since we can't define a target accuracy when plotting a WCS `all_world2pix`
    should not error but only warn when the default accuracy can't be reached.
    r*   r#   r   )   rm  gߟ".)rq   r   i  r"   r]  )	toleranceN)r   r>   zerosr   r  all_world2pixr   raisesr   r   r   r   r@   )	rF   crpixar   apbp
test_pos_x
test_pos_yexpecteds	            rJ   test_non_convergence_warningry  d  s    A,,,CFEhv&&&A&&BAdGJQJ!QB&&CG  Zd KKH 
}	%	% 5 5*j!4445 5 5 5 5 5 5 5 5 5 5 5 5 5 5
 
k	"	" U U11*jII8TTTU U U U U U U U U U U U U U U U U Us$   B**B.1B.%D  DDz
CTYPE1  = 'FREQ'
CRVAL1  =    1.37835117405E+09
CDELT1  =      9.765625000E+04
CRPIX1  =                 32.0
CUNIT1  = 'Hz'
SPECSYS = 'TOPOCENT'
RESTFRQ =      1.420405752E+09 / [Hz]
RADESYS = 'FK5'
c                  8    t          j        t          d          S r   )r   r   HEADER_SPECTRAL_1Dr)   rL   rJ   header_spectral_1dr|    s    /T::::rL   )ctype1rA  c                    |                                  }||d<   d|d<   d|d<   |d         dk    rd|d	<   nd
|d	<   d|d<   d|d<   |rd|d<   d|d<   d|d<   d|d<   t          j                    5  t          j        dt                     t          |          }d d d            n# 1 swxY w Y   |                    d          }t          |t                    sJ |j	        J |j
        d u|u sJ |rd}nd}t          j        t          |          5  |                    |          }d d d            n# 1 swxY w Y   t          |dgd           t          j        t          d          5  t          |j        |j        |j        t'          dt(          j        z  d t(          j        z  d!t(          j        z  "          #          }d d d            n# 1 swxY w Y   |rd$}nd}t          j        t          |          5  |                    |          }	d d d            n# 1 swxY w Y   t          |	dgd           t          j        t          d          5  t          |j        |j        |j        t'          dt(          j        z  d t(          j        z  dt(          j        z  "          t'          dt(          j        z  d t(          j        z  d!t(          j        z  "          %          }d d d            n# 1 swxY w Y   |r|                    |          }
nHt          j        t          d          5  |                    |          }
d d d            n# 1 swxY w Y   t          |
dgd           d S )&Nr   r
  r6  r]  CDELT1r   r_  r`  CUNIT1r&   rb  rc  rd  r5  r8  r   r9  r   r:  r   re  r=  rM   r;  z"No target defined on SpectralCoordr   r   rf  r   zNo velocity defined on framerZ   r[   r"   )distance)doppler_restdoppler_conventiontargetz$No observer defined on SpectralCoord)r  r  rA  r  )r@  r   r   r   r   r   rB   rd   r   r  rA  r   r   r   rD   r   rK  r  r  r
   r:   rT   kpc)r|  r}  rA  r   rF   ri  expected_messagerj  spectralcoord_no_obspix2pix3s              rJ   test_spectral_1dr    s'     $$&&FF8F8F8ayC"xx&F9F9 '"z"z z&y		 	"	"  h(8999&kk               &&r**Mm]33333'''"$.8;;;; 8?7	(0@	A	A	A 0 0  //0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C"D))))
 
(0N	O	O	O 
 
,"&3,?QU
BJQUCCC	 
  
  

 
 
 
 
 
 
 
 
 
 
 
 
 
 
  8A7	(0@	A	A	A 8 8!!"6778 8 8 8 8 8 8 8 8 8 8 8 8 8 8D2$T****
 
(0N	O	O	O 
 
,"&3,?"qu*b15j1qu9EEEQU
BJQUCCC 
  
  

 
 
 
 
 
 
 
 
 
 
 
 
 
 
  <!!"677\,4PQQQ 	< 	<%%&:;;D	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< D2$T******sn   .*B$$B(+B(D55D9<D9.AGGGH##H'*H'BK::K>K>8MM!Ma\  
WCSAXES = 3
CTYPE1  = 'RA---TAN'
CTYPE2  = 'DEC--TAN'
CTYPE3  = 'WAVE'
CRVAL1  = 98.83153
CRVAL2  = -66.818
CRVAL3  = 6.4205
CRPIX1  = 21.
CRPIX2  = 22.
CRPIX3  = 1.
CDELT1  = 3.6111E-05
CDELT2  = 3.6111E-05
CDELT3  = 0.001
CUNIT1  = 'deg'
CUNIT2  = 'deg'
CUNIT3  = 'um'
MJD-AVG = 59045.41466
RADESYS = 'ICRS'
SPECSYS = 'BARYCENT'
TIMESYS = 'UTC'
c                  8    t          j        t          d          S r   )r   r   HEADER_SPECTRAL_WITH_TIMEr)   rL   rJ   header_spectral_with_timer    s    6DAAAArL   c                    fd}|                                  }t          j                    5  t          j        dt          t
          f           t          |          t          j        j	        j
                   sJ t          j        j	        j                  sJ 	 d d d            n# 1 swxY w Y    |           |d         |d<   |d= t          j                    5  t          j        dt          t
          f           t          |          t          j        j	        j                   sJ t          j        j	        j
                  sJ 	 d d d            n# 1 swxY w Y    |           d|d<   |d= t          j                    5  t          j        dt          t
          f           t          |          t          j        j	        _        t          j        j	        j                  sJ t          j        j	        j
                  sJ j	        j        dk    sJ 	 d d d            n# 1 swxY w Y    ||           |d=  ||           d S )	Nc                    t           j        g j        j        dR  j        j                    j        j        j         \  }}t          |j        j        j        |j        j	        j        |j
        fj        j        d           d S )Nr"   r]  r   )r   all_pix2worldrF   rr  crvalrB   	sphericalr   r   r   r(   )r   skyr   r  s      rJ   	check_wcsz-test_spectral_with_time_kw.<locals>.check_wcs	  s    88a888!%+FFF$A$aek2	T]%s}'8'?LEK	
 	
 	
 	
 	
 	
rL   rM   zMJD-AVGr5  z
2020-07-15zDATE-OBSr&   r   )r@  r   r   r   r   r   r   r>   isnanrF   mjdavgmjdobsnandateobs)r  r  hdrr  s      @rJ   test_spectral_with_time_kwr    s   
 
 
 
 
 $
(
(
*
*C		 	"	" & &h8H(IJJJHH&&&&&&x%%%%%%& & & & & & & & & & & & & & & IaLLL ^C	NI		 	"	" & &h8H(IJJJHH&&&&&&x%%%%%%& & & & & & & & & & & & & & & IaLLL #C
OI		 	"	" # #h8H(IJJJHHvx%%%%%x%%%%%u}"""""# # # # # # # # # # # # # # # IcNNN 	IIcNNNNNs8   A2B--B14B1$A2E##E'*E'BH::H>H>c                     t          j        t          d                    5 } t          j        t
                    5  t          | d         j        |           }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          j	                    5  t          j
        dd           |                    dddd          }ddd           n# 1 swxY w Y   t          |d         t                    sJ |d         j        j        j        t"          j        u sJ |d         j        j        j        t"          j        u sJ t#          j        |d         j        dt"          j        z            sJ t#          j        |d         j        d	t"          j        z            sJ t          |d
         t0                    sJ t#          j        |d
         dt"          j        z            sJ t          |d         t4                    sJ |d         j        dk    sJ t#          j        |d         j        d          sJ dS )a  
    This test is a regression test for https://github.com/astropy/astropy/issues/12095

    It checks the following:
      - If a spatial WCS isn't converted to units of deg by wcslib it still works.
      - If TIMESYS is upper case we parse it correctly
      - If a TIME CTYPE key has an algorithm code (in this case -TAB) it still works.

    The file used here was generated by gWCS and then edited to add the TIMESYS key.
    zdata/example_4d_tab.fitsr   )r   fobjNrM   z.*dubious year \(Note \d\))messageg"Uɓ?g&<㘿r"   g(\8@r*   r   g 7&5?)r   openr   r   r   r   r   r   r   r   filterwarningsrB   rd   r   rm   r   r+   r:   arcsecr   allcloser   rT   r   r   rw   r   r   r   )hdulr  r'   s      rJ   test_fits_tab_time_and_unitsr  :  s    
899
 
 2	v|,--2 2 tAw~D1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 
	 	"	" - -2OPPPP  Aq!,,- - - - - - - - - - - - - - - eAh)))))8=!QX----8=!QX----:eAhj*qu"455555:eAhj+"566666eAh.....:eAh-----eAh%%%%%8>U"""":eAhl$:;;;;;;;sF   A<A%A<%A)	)A<,A)	-A<<B B /CCCz>
CTYPE1  = 'HPLT-TAN'
CTYPE2  = 'HPLN-TAN'
CTYPE3  = 'STOKES'
c                  8    t          j        t          d          S r   )r   r   HEADER_POLARIZEDr)   rL   rJ   header_polarizedr  f  s    -48888rL   c                      t          |           S )N)r   )r  s    rJ   wcs_polarizedr  k  s       rL   c                 0    | }|j         d         dk    sJ d S )Nr*   zphys.polarization.stokes)r3   )r  r  s     rJ   test_phys_type_polarizationr  p  s'    A&q)-GGGGGGGrL   c                    | }|                     ddd          }|d         dk    sJ t          |d         t                    sJ t          |d         j        d           |                     ddg d          }t          |d         t                    sJ t          |d         g d           t          |d         j        g d           d S )Nr   r*   r"   I)r   r"   r*   rq   )r"   r*   rq   rm  )r  QUr_  )rB   rd   r   r   symbolr   )r  r  r'   s      rJ   test_pixel_to_world_stokesr  u  s    AQ1%%E8q====eAh,,,,,q#&&&Q<<<00EeAh,,,,,uQx...uQx(<(<(<=====rL   )vr   	itertoolsr   numpyr>   r   numpy.testingr   r   r   packaging.versionr   astropyr   r:   astropy.coordinatesr	   r
   r   r   r   r   r   r   
astropy.ior   astropy.io.fitsr   astropy.io.fits.verifyr   astropy.tests.helperr   astropy.timer   astropy.unitsr   astropy.units.corer   astropy.utilsr   astropy.utils.datar   astropy.utils.exceptionsr   astropy.wcs._wcsr   wcsverastropy.wcs.wcsr   r   r   r   astropy.wcs.wcsapi.fitswcsr    r!   r.   rF   rr  rK   HEADER_SIMPLE_CELESTIALr   r   r   rc   ro   HEADER_SPECTRAL_CUBEr   r   stripHEADER_SPECTRAL_CUBE_NONALIGNEDr   r   HEADER_TIME_CUBEr   r   r   fixturer   r   markparametrizer   r   r   r   remote_datar   r   r   r   r   r   r   r   r   r  r  r  r  r  r/  r1  r2  rS  rk  ry  r{  r|  r  r  r  r  r  r  r  r  r  r  r)   rL   rJ   <module>r     s	  
             K K K K K K K K K K % % % % % %      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	       " " " " " " 0 0 0 0 0 0 9 9 9 9 9 9       " " " " " " + + + + + +       4 4 4 4 4 4 7 7 7 7 7 7 2 2 2 2 2 2 E E E E E E E E E E E E S S S S S S S S CaLLL	c	 4 4 4v  X U UH(M22230v01HdSSSTTU U U U U U U U U U U U U U U
O, O, O,l , X O OH(M222-F-.BMMMNNO O O O O O O O O O O O O O O
b b bL   
   X  H(M222#&39tDDD$ $               0> 0> 0>r0 d X G GH(]4D$EFFFC))*:EEEFFMG G G G G G G G G G G G G G G
\ \ \J$ 76??ggenn$$99N 7 7 7   F R R RY Y Y	Q 	Q 	QR R R "RSS) ) TS ).I I I$% % %$   ) ) ),
( 
( 
(! ! ! ! ! !*! ! !$" " "(> > >2 2 2: @  @  @F) ) )<E1 E1 E1X 0 ? ? ?2E 2E 2Ej G444udmDD "; ";	 ";JU U U8	  ; ; ; G444udmDD S+ S+	 S+l 0 B B B/ / /d< < <J  9 9 9 ! ! !H H H

> 
> 
> 
> 
>sH    -C99C= C=-EEE-GGG /HH"H