
    IpjU                    3   S SK r S SKrS SKrS SKrS SKrS SKJrJrJrJrJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJr  S SKrS SKJrJrJrJrJrJrJr  S SKJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(  S S	K)J*r*J+r+J,r,J-r-  S S
K.J/r/J0r0J1r1  S SK2J3r3J4r4  S SK5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=  S SK>r> S SK?r@S SKArBS SKCJDrD  S SKEJFrFJGrGJHrHJIrIJJrJJKrK  S SKLrLS SKMJNrN  S SKOJPrP  S SKQJRrRJSrS  \>R                  " S5        \V" 5       rW\S:  a  \4R                  " S/5      r4\V" SS9rW\>R                  " SS\>R                  " S\<S9/S9S 5       r[\>R                  " SS9S 5       r\\ R                  S 5       r^S r_\>R                  R                  S S!\>R                  " S"S\<S9S#S$/5      S% 5       rb\>R                  R                  \R                  " 5       R                  5       S&:H  S'S(9S) 5       rfS* rgS+ rh\>R                  R                  S,S-/ SS.4/ SS 4/5      S/ 5       ri\>R                  R                  S0S1S2/S3/S49S5 5       rjS6 rkS7 rlS8 rmS9 rn\>R                  R                  \ (       + =(       a
    S:\" 5       ;  S;S(9S< 5       roS= rpS> rq\>R                  R                  S?S/ S@//5      SA 5       rrSB rs\>R                  R                  S?S/ SCSD//5      SE 5       rt\>R                  Rt                  \>R                  R                  \8(       + SFS(9SG 5       5       ru\>R                  Rt                  SH 5       rv\>R                  R                  SI5      \>R                  Rt                  SJ 5       5       rx\>R                  R                  SKSS/5      \>R                  R                  SLSS/5      SM 5       5       ry\>R                  R                  SN\6 V s/ s H  o SO:w  d  M
  U PM     sn 5      \>R                  R                  SKSS/5      \>R                  R                  SLSS/5      \>R                  Rt                  SP 5       5       5       5       rz\>R                  R                  SN\6 V s/ s H  o SO:w  d  M
  U PM     sn 5      \>R                  R                  SKSS/5      \>R                  R                  SLSS/5      \>R                  R                  SQ5      \>R                  Rt                  SR 5       5       5       5       5       r{\>R                  R                  SN\6 V s/ s H  o SO:w  d  M
  U PM     sn 5      \>R                  R                  SKSS/5      \>R                  R                  SLSS/5      \>R                  R                  SI5      \>R                  Rt                  SS 5       5       5       5       5       r|\>R                  R                  SN\6 V s/ s H  o SO:w  d  M
  U PM     sn 5      \>R                  R                  SKSS/5      \>R                  R                  SLSS/5      \>R                  R                  SI5      \>R                  Rt                  ST 5       5       5       5       5       r}\>R                  R                  SU\" SVSWSWSXS SWSY5      \" SVSZSWS[S SWSY5      \R                  /\" SVSWSWSXS SWSY\	" \" SWS\95      S]9\" SVSZSWS[S SWSY5      \R                  //5      \>R                  Rt                  \>R                  R                  \(       + S^S(9S_ 5       5       5       r\>R                  R                  SN\6 V s/ s H  o SO:w  d  M
  U PM     sn 5      \>R                  R                  S`\BGR                   " Sa5      \BGR                   " Sb5      \R                  4\GR                  " Sa5      \GR                  " Sb5      \R                  4/5      \>R                  R                  SKSS/5      \>R                  R                  SLSS/5      \>R                  R                  SI5      \>R                  Rt                  Sc 5       5       5       5       5       5       r\>R                  R                  SN\6 V s/ s H  o SO:w  d  M
  U PM     sn 5      \>R                  R                  SKSS/5      \>R                  R                  SLSS/5      \>R                  Rt                  Sd 5       5       5       5       r\>R                  Rt                  \>R                  R                  Se/ SfQ5      Sg 5       5       rSh rSi rSj rSk rSl rSm r\>R                  R                  Sn/ SoQ5      Sp 5       r\>R                  R                  SqSr/ 4SsStSu/4SvSw/4/5      Sx 5       rSy rSz r\>R                  R                  S{S|S S /S}.S~S/5      S 5       rS r\>R                  R                  S\LR                  " SS5      Sw/4\LGR"                  " SSSS[5      StSu/4\LGR$                  " SS/SS/SS/SS/SS/SS/45      / SQ4\LGR&                  " \LR                  " SS5      \LGR"                  " SSSS[5      /5      / SQ4/5      S 5       rS rS r\>R                  R                  S/ SQ\GR.                  " / SQ\GR0                  S9/5      S 5       r\<S 5       r\<\>R                  R                  \S:  SS(9S 5       5       rS r\>R                  R                  SS[S/5      S 5       rS r\>R                  R                  S/ SQ5      \>R                  R                  SS[S/5      S 5       5       rS rS rS rS rS rS rS r\;\>R                  R                  S3\6 V s/ s H  o S:w  d  M
  U PM     sn S3/S49S 5       5       r\;\>R                  R                  S3S/S3/S49S 5       5       r\>R                  R                  S S!\>R                  " S"S\:S9S#S$/5      S 5       r\>R                  R                  S/ SQ5      \>R                  Rt                  S 5       5       r\>R                  R                  SN\65      \>R                  Rt                  S 5       5       r\>R                  R                  S5      \>R                  R                  SSS/5      \>R                  R                  SN\6S/-    V s/ s H  o S:w  d  M
  U PM     sn 5      \>R                  Rt                  S 5       5       5       5       r\>R                  Rt                  S 5       r\>R                  R                  SN\6 V s/ s H  o S;  d  M
  U PM     sn 5      \>R                  R                  S/ S4S/\GR0                  4S/\GR\                  4S/\4/5      \>R                  Rt                  S 5       5       5       rS r\>R                  Rt                  S 5       r\>R                  R                  SSS/SWS//5      \>R                  R                  SN\65      \>R                  Rt                  S 5       5       5       r\>R                  R                  S/ SQ5      \>R                  Rt                  S 5       5       r\>R                  R                  SNSS/5      \>R                  Rt                  S 5       5       r\>R                  Rt                  S 5       r\>R                  R                  SN\65      \>R                  Rt                  S 5       5       r\>R                  R                  SSS/5      \>R                  Rt                  S 5       5       r\>R                  Rt                  S 5       rS r\>R                  Rt                  S 5       r\>R                  R                  SSSS/S4SSS/S4SSSS/S4SSSS/S4SSS/S4SSSS/S4/5      \>R                  Rt                  S 5       5       r\>R                  R                  SSSSS/S4SSSSS/S4SSSSS/S4SSSSS/S4SSSSS/S4SSS|SS/S4SSSS/S4SSSSS/S4SSSS/S4SSSS/S4SSSS/S4SSS|S/S|4SSSS/S4SOSSSS/S4SOSSSS/S4SOSSSS/S4SOSSSS/S4SOSSSS/S4/5      \>R                  Rt                  S 5       5       r\>R                  R                  S/ SQ5      \>R                  Rt                  S 5       5       r\>R                  Rt                  S 5       r\>R                  R                  SN\6 V s/ s H  o SO;  d  M
  U PM     sn 5      \>R                  Rt                  S 5       5       r\>R                  Rt                  S 5       r\>R                  R                  SN\6 V s/ s H  o S;  d  M
  U PM     sn 5      \>R                  R                  SS\LR                  " SWSW5      /\LR                  " SWSW5      S/S\LR                  " SWSWS5      /SS//5      \>R                  Rt                  S 5       5       5       r\>R                  R                  S5      \>R                  Rt                  \=S 5       5       5       r\>R                  R                  SN/ SQ5      \>R                  Rt                  S 5       5       rS r\>R                  Rt                  S 5       r\>R                  R                  SSS\R                  // SQ\" S5      \" S5      S/\" SSWSW5      \" SSS5      S/\" SSWSWS\	GR                  S]9\" SSSSZ\	GR                  S]9S// SQSS/SS/S// SQ\" SW5      \" S5      //	5      \>R                  R                  SNS/5      \>R                  Rt                  S 5       5       5       r\>R                  Rt                  S 5       r\>R                  R                  SSSS/4SGS GS/4GSGSGS/4GSGSGS/4GSGS	GS
/4GSGSGS/4GSGSGS/4/5      \>R                  Rt                  GS 5       5       r\>R                  R                  SN\65      \>R                  R                  GSGSSSS/4GSGSSS/4GSGSSGS/4GSGSSGS/4GSGS
SGS/4GSGSSGS/4GSGSSGS/4GSSSSGS/4GSSSSS/4GSSSSS/4GSSSGSS/4/5      \>R                  Rt                  GS  5       5       5       r\>R                  R                  GS!/ GS"Q5      \>R                  R                  GS#5      GS$ 5       5       rGS% rGS& rGS' rGS( r\>R                  Rt                  GS) 5       r\>R                  R                  GS*/ GS+Q5      \>R                  Rt                  GS, 5       5       r\>R                  R                  GS*GS-GS./5      \>R                  R                  GS/SWS0GS0S0GS0SW0/5      \>R                  Rt                  GS1 5       5       5       r\>R                  R                  GS*GS-GS./5      \>R                  Rt                  GS2 5       5       r\>R                  R                  \$(       + GS3S(9GS4 5       r\<\>R                  R                  \GS5:  GS6S(9\>R                  R                  SN\65      GS7 5       5       5       r\<\>R                  R                  \GS5:  GS6S(9\>R                  R                  SN\65      GS8 5       5       5       r\<GS9 5       r\>R                  Rt                  \>R                  R                  GS:S:GS;/5      \>R                  R                  \ (       + =(       a
    S:\" 5       ;  S;S(9GS< 5       5       5       r\>R                  R                  GS=5      \>R                  R                  GS>GS?GS@/5      GSA 5       5       rGSB r\>R                  R                  GS>SGSC/5      GSD 5       r\>R                  R                  GS>GS?GS@/5      GSE 5       rGSF rGSG r\>R                  R                  SNGSHGSI/5      GSJ 5       r\<\>R                  R                  SNGSHGSI/5      GSK 5       5       rGSL rGSM rGSN rGSO r\>R                  Rt                  GSP 5       r\>R                  Rt                  \>R                  R                  S:\" 5       ;  GSQS(9GSR 5       5       r\>R                  Rt                  GSS 5       r\>R                  Rt                  GST 5       r\>R                  Rt                  \>R                  R                  \8(       + SFS(9GSU 5       5       rg! \T a     GNqf = fs  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f (V      N)datedatetimetime	timedeltatimezone)Decimal)BytesIO)Path)ZipFile)__gdal_version__list_driverslist_layers	read_infoset_gdal_config_optionsvsi_listtree
vsi_unlink)
GDAL_GE_37GDAL_GE_311GDAL_GE_312GDAL_GE_314HAS_ARROW_WRITE_APIHAS_PYARROW
HAS_PYPROJPANDAS_GE_15PANDAS_GE_22PANDAS_GE_23PANDAS_GE_30SHAPELY_GE_21)DataLayerErrorDataSourceErrorFeatureErrorGeometryError)PANDAS_GE_20read_dataframewrite_dataframe)DRIVERS_NO_MIXED_DIMENSIONSDRIVERS_NO_MIXED_SINGLE_MULTI)ALL_EXTSDRIVERSGDAL_HAS_PARQUET_DRIVER	START_FIDrequires_arrow_write_apirequires_gdal_geosrequires_pyarrow_apirequires_pyproj)from_wkt)is_bool_dtypeis_datetime64_dtypeis_float_dtypeis_integer_dtypeis_object_dtypeis_string_dtype)Point)assert_geodataframe_equal)assert_index_equalassert_series_equal	geopandas      zESRI ShapefileF)PROMOTE_TO_MULTIsessionT)marks)scopeparamsc                     U R                   $ N)param)requests    [/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/pyogrio/tests/test_geopandas_io.py	use_arrowrI   ]   s     ==    )autousec                     SU R                   ;   a  U R                  S5      OSnU(       aO  [        (       a  [        (       d8  U R                  R                  S5      (       a  [        R                  " S5        g g g g )NrI   Fr,   z2GDAL>=3.8 and pyarrow required for Arrow write API)fixturenamesgetfixturevaluer   r   nodeget_closest_markerpytestskip)rG   rI   s     rH   skip_if_no_arrow_write_apirS   h   sl     '... 	,  	$$LL++,FGGHI H *5 	rJ   c               #      #    [         R                  R                  SS 5      n S[         R                  S'   S v   U (       a  U [         R                  S'   g [         R                  S	 g 7f)NPYOGRIO_USE_ARROW1)osenvironget)originals    rH   use_arrow_contextr[   y   sK     zz~~148H&)BJJ"#	*2

&'JJ*+s   A%A'c                     [        U SSS9ng)z?Check if SpatiaLite is available by running a simple SQL query.zselect spatialite_version();SQLITE)sqlsql_dialectN)r$   )test_gpkg_nulls_s     rH   test_spatialite_availablerb      s    ;	ArJ   zencoding, arrow)utf-8Frc   )cp1252F)NFc                    U S-  n[        USUS9 nUR                  S5        UR                  S5        SSS5        [        X1US9n[        U5      S:X  d   eUR                  R                  5       S	S
/:X  d   eUR                  R                  5       S/:X  d   eUR                  R                  5       S/:X  d   eg! , (       d  f       N= f)zW"Test reading CSV files with different encodings.

Arrow only supports utf-8 encoding.
test.csvwencoding   näme,city
   Wilhelm Röntgen,Zürich
Nri   rI         nämecity   Zürich   Wilhelm Röntgen)openwriter$   lencolumnstolistro      näme)tmp_pathri   arrowcsv_pathcsvdfs         rH   test_read_csv_encodingr}      s      *$H	hh	/3		.!		./ 
0 
u	EBr7a<<::7F"333377>>	{***88??!3 4444 
0	/s   #B<<
C
zUTF-8z(test requires non-UTF-8 default platformreasonc                 F   U S-  n[        US[        R                  " 5       S9 nUR                  S5        UR                  S5        SSS5        U(       a,  [        R
                  " [        SS9   [        X!S	9nSSS5        g[        X!S	9n[        U5      S
:X  d   eUR                  R                  5       SS/:X  d   eUR                  R                  5       S/:X  d   eUR                  R                  5       S/:X  d   eg! , (       d  f       N= f! , (       d  f       g= f)zVerify that read defaults to platform encoding; only works on Windows (CP1252).

When use_arrow=True, reading an non-UTF8 fails.
rf   rg   rh   rj   rk   Nz; please use_arrow=FalsematchrI   rm   rn   ro   rp   rq   )rr   localegetpreferredencodingrs   rQ   raisesr    r$   rt   ru   rv   ro   rw   )rx   rI   rz   r{   r|   s        rH   test_read_csv_platform_encodingr      s     *$H	hf&A&A&C	D		.!		./ 
E ]],
  >B	
 
 H:2w!||zz  "w&7777ww~~I;...xx %7$8888! 
E	D

 
s   #D/
D
D
D c                     [        U 5      n[        (       a  UR                  S:X  d   e[        U5      S:X  d   eUR                  R                  5       / SQ:X  d   eg )N	EPSG:4326   )pop_est	continentnameiso_a3
gdp_md_estgeometry)r$   r   crsrt   ru   rv   )naturalearth_lowres_all_extr|   s     rH   test_read_dataframer      sX    	3	4Bzvv$$$r7c>>:: #   rJ   c                 @    [        U S   US9n[        U5      S:X  d   eg )Nrm   r   r   r$   rt   )naturalearth_lowres_vsirI   r|   s      rH   test_read_dataframe_vsir      s$    	/2i	HBr7c>>rJ   zcolumns, fid_as_index, exp_len)NFr=   r=   c                 z    [        U UUUS9n[        U5      [        R                  L d   e[	        U5      U:X  d   eg )N)ru   fid_as_indexrI   )r$   typepd	DataFramert   )no_geometry_fileru   r   rI   exp_lenresults         rH    test_read_layer_without_geometryr      sD     !	F <2<<'''v;'!!!rJ   z!naturalearth_lowres, expected_ext).gpkgr   ).shpr   naturalearth_lowres)indirectc                 `    U R                   U:X  d   e[        U 5      n[        U5      S:X  d   eg )Nr   )suffixr$   rt   )r   expected_extr|   s      rH    test_fixture_naturalearth_lowresr      s3     %%555	+	,Br7c>>rJ   c                     [        XSS9n[        U[        R                  5      (       d   e[        U[        R
                  5      (       a   eg )NFrI   read_geometry)r$   
isinstancer   r   gpGeoDataFramer   rI   r|   s      rH   test_read_no_geometryr      sD    	#
B b",,''''"boo.....rJ   c           	          [         R                  " [        SS9   [        U / SSUS9nS S S 5        g ! , (       d  f       g = f)Nz^at least one of read_geometry or return_fids must be True or columns must be None or non-emptyr   Fru   r   r   rI   rQ   r   
ValueErrorr$   )r   rI   ra   s      rH   (test_read_no_geometry_no_columns_no_fidsr     sA    	#
 

 
 
s   1
?c                 T   U S-  n[         R                  " [        SSS5      [        SSS5      /SS9n[        X25        [	        U5      nUR
                  S   R                  R                  (       d   e[	        USSUS9nUR
                  S   R                  R                  (       a   eg )N	test.gpkgr   rm   r   r   r   T)force_2dmax_featuresrI   )r   r   r7   r%   r$   ilocr   has_zrx   rI   filenameexpectedr|   s        rH   test_read_force_2dr     s    +%H 1a.%1a.1{H H'		!B771:$$$$		
B wwqz""(((((rJ   c                      [        SS05        [        R                  " [        SS9   [	        XS9  S S S 5        [        SS 05        g ! , (       d  f       N= f! [        SS 05        f = f)NOGR_GEOJSON_MAX_OBJ_SIZEg{Gz?z:Failed to read GeoJSON data; .* GeoJSON object too complexr   r   )r   rQ   r   r    r$   )naturalearth_lowres_geojsonrI   s     rH   test_read_geojson_errorr   '  sd    D!;T BC]]O
 6L	
 	 !;T BC
 
 	 !;T BCs!   &A 
AA 
AA A(LIBKMLzINeeded GDAL driver (version) not available to read .kml attribute columnsc                 j    [        XS9nSUR                  ;   d   eUS   R                  S   S:X  d   eg)zTest reading a .kml file with an attribute column.

Attribute columns (="Simpledata" elements in the .kml) can be read with the "LibKML"
driver or with the "KML" driver starting from GDAL 3.14
r   	formationr   TonN)r$   ru   r   )kml_filerI   gdfs      rH   test_read_kml_simpledatar   3  s@     
7C #++%%%{  #u,,,rJ   c                    U S-  n[         R                  " [        SS5      /SS9nU(       a   UR                  R	                  S5      Ul        [        UUSS9  [         R                  " [        SS5      /SS9nU(       a   UR                  R	                  S5      Ul        [        XBS	S
S9  [        R                  " [        U5      SS/S	S//5      (       d   eUSS.n[        R                  " [        SS9   [        U40 UD6nS S S 5        [        WU5        [        U4SS	0UD6n[        Xd5        [        U4SS0UD6n[        Xd5        g ! , (       d  f       NM= f)Nr   r   r   r   strlayer1)layerrm   layer2T)r   appendr7   )rI   r   zMore than one layer foundr   r   )r   r   r7   ru   astyper%   nparray_equalr   rQ   warnsUserWarningr$   r8   )rx   rI   r   	expected1	expected2kwargsr|   s          rH   test_read_layerr   D  sO   +%H %1+KHI &--44U;	 %1+KHI%--44U;	IxE>>H7 3h5HI    %a8F 
k)D	EH// 
F b), 
	;	;F	;Bb, 
	4	4V	4Bb, 
F	Es   5E		
Ec                     [         R                  " [        SS9   [        U SUS9  S S S 5        g ! , (       d  f       g = f)Nz!Layer 'wrong' could not be openedr   wrongr   rI   )rQ   r   r   r$   r   rI   s     rH   test_read_layer_invalidr   p  s+    	~-P	Q2'YW 
R	Q	Q   /
=ru   colc                    [        XUS9nUb  SU;   a  SUR                  ;   d   e[        UR                  R                  5      (       d   e[
        (       a'  UR                  R                  R                  S:X  d   eg UR                  R                  R                  S:X  d   eg [        UR                  5      S:X  d   eg )N)ru   rI   r   datetime64[ms]datetime64[ns]rm   )r$   ru   r2   r   dtyper#   r   rt   )datetime_fileru   rI   r|   s       rH   test_read_datetime_columnsr   u  s    	)	LB %7*

""""266<<0000<66<<$$(888866<<$$(88882::!###rJ   c                 R	   U R                   S:X  a!  [        (       d  [        R                  " S5        [	        U 5      nU R                   n[        XS9nSUR                  ;   d   eUS   S   S:X  d   eUS   S   S;   d   eUS   S	   R                  5       S	S/:X  d   eUS   S   R                  5       S
S/:X  d   eUS   S
   R                  5       / :X  d   eUS   S   b   eUS   S   b   eSUR                  ;   d   eUS   S
   S:X  d   eUS   S
   S:X  d   eUS   S	   R                  5       SS/:X  d   eUS   S   R                  5       SS/:X  d   eUS   S
   R                  5       / :X  d   eUS   S   b   eUS   S   b   eSUR                  ;   d   eUS   S   S:X  d   eUS   S   S:X  d   eUS   S	   R                  5       SS/:X  d   eUS   S   R                  5       / SQ:X  d   eUS   S
   R                  5       / :X  d   eUS   S   b   eUS   S   S/:X  d   eUS:X  a	  SnSnS	S/nO"SnSnU(       a  S[        R                  /nOS	S	/nSUR                  ;   d   eUS   S   S:X  d   eUS   S   U:X  d   eUS    S   U:X  d   eUS   S	   S	   S	:X  d   eUS   S	:X  a  US   S	   S   US   :X  d   eO&[        R                  " US   S	   S   5      (       d   eUS:X  a  US   S   S
S/:X  d   eUS   S
   / :X  d   eO:US   S   R                  5       S
S/:X  d   eUS   S
   R                  5       / :X  d   e[        R                  " US   S   5      (       d   e[        R                  " US   S   5      (       d   eUS:X  a  SnSnOSnSnS!UR                  ;   d   eUS   S"   S!:X  d   eUS   S"   U:X  d   eUS    S"   U:X  d   eUS:X  a/  US!   S	   SS/:X  d   eUS!   S   / SQ:X  d   eUS!   S
   / :X  d   eOeU(       d  SS/OSS/nUS!   S	   R                  5       U:X  d   eUS!   S   R                  5       / SQ:X  d   eUS!   S
   R                  5       / :X  d   e[        R                  " US!   S   5      (       d   eUS!   S   S/:X  d   eg)#9Test reading a geojson file containing fields with lists..parquetESkipping test for parquet as the GDAL Parquet driver is not availabler   list_intfieldsrm   	ogr_types)OFTIntegerListOFTInteger64Listr      r=   N   list_doubleOFTRealListg              ?       @      @list_stringOFTStringListstring1string2)string3string4 r   .geojson	OFTStringOFSTJSONr   OFSTNonelist_int_with_nullogr_subtypeslist_string_with_null   )r   r*   rQ   rR   r   r$   ru   rv   r   nanr   isna)	list_field_values_filesrI   infor   r   exp_typeexp_subtypeexp_list_int_with_null_value	exp_values	            rH   test_read_list_typesr    sD   %%3<S<SS	
 ,-D$++F3IF '''>!
***Q#IIII*a '')aV333*a '')aV333*a '')R///*a (((*a ((( FNN***>!---Q=000- #**,c
:::- #**,c
:::- #**,222- #+++- #+++ FNN***>!---Q?222- #**,I0FFFF- #**,0JJJJ- #**,222- #+++- #t+++ 
  ()4y$ & ,/=(,-q6(
  6>>111>! 4444Q8+++"k111&'*1-222#A&!+*+A.q15QRS5TTTTwwv23A6q9::::*+A.1a&888*+A."444 *+A.557Aq6AAA*+A.5572===776./23333776./23333 
   # "fnn444>! 7777Q8+++"k111-.q1i5FFFF-.q15OOOO-.q1R777 ,5YO9d:K	-.q188:iGGG-.q188:>XXXX-.q188:b@@@77612156666)*1-"555rJ   r   r   c                    UR                   S:X  a!  [        (       d  [        R                  " S5        U(       a^  U(       aW  [	        U5      S:X  aH  UR                   S:X  a8  SnU R
                  R                  [        R                  R                  US95        [        XUS9nUc  SO[	        U5      S	-   n[	        UR                  5      U:X  d   eg)
r   r   r   r   zyThis fails with 'pyarrow.lib.ArrowInvalid: ArrowArray struct has 1 children, expected 0 for type extension<geoarrow.wkb>'r~   rI   ru   N   rm   )r   r*   rQ   rR   rt   rO   
add_markermarkxfailr$   ru   )rG   r	  rI   ru   	error_msgr   exp_columnss          rH   test_read_list_types_columnsr    s     %%3<S<SS	
 	LA#**j8
G 	 	 1 1 1 CDgF
 !CL1,<Kv~~+---rJ   zParquet driver is not availablec                    U(       d  [         R                  " S5        [        XS9nSUR                  ;   d   e[        R
                  " US   R                  5       [        R                  " / SQ5      5      (       d   eSUR                  ;   d   eUS   R                  [        :X  d   eUS   S   R                  5       / SQ:X  d   eUS   S   R                  5       / SQ:X  d   eUS   S	   R                  5       / SQ:X  d   eS
UR                  ;   d   eUS
   R                  [        :X  d   eUS
   S   R                  5       SS	S.SS	S./:X  d   eUS
   S   R                  5       SS	S.SS	S./:X  d   eUS
   S	   R                  5       SS	S.SS	S./:X  d   eSUR                  ;   d   eUS   R                  [        :X  d   eUS   S   SS	S.:X  d   eUS   S   SS	S.:X  d   eUS   S	   SS	S.:X  d   eg)zDTest reading a Parquet file containing nested struct and list types.zWhen use_arrow=False, gdal flattens nested columns to seperate columns. Not sure how we want to deal with this case, but for now just skip.r   col_flat)r   rm   r   col_listr   rm   r   r=   rm   r   
col_nested)ab
col_structN)rQ   rR   r$   ru   r   r   to_numpyarrayr   objectrv   )list_nested_struct_parquet_filerI   r   s      rH   )test_read_list_nested_struct_parquet_filer%    s4    R	

 ;QF'''>>&,557)9LMMMM'''*##v---*a '')Y666*a '')Y666*a '')Y6666>>))),%%///,"))+aa0@PQBR/SSSS,"))+aa0@PQBR/SSSS,"))+aa0@PQBR/SSSS6>>))),%%///,"AA&6666,"AA&6666,"AA&6666rJ   c                     S
S[         R                  S[        4S jjn[        XS9nU" XBSS9  U S-  n[	        XEUS9  [        XRS9nU" XbSS9  g	)z=Test roundtripping a GeoJSON file containing many data types.Fr|   rI   c                    SU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eSU R                   ;   d   e[	        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eS	U R                   ;   d   eU(       a\  [        U S	   R                  5      (       d   eU S	   R                  5       [        R                  " S
5      R                  5       /:X  d   eOM[        U S	   R                  5      (       d   eU S	   R                  5       [        R                  " S
5      /:X  d   eU(       a  U(       a  [        (       aV  SU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       [        SSS5      /:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       [        R                  " S5      /:X  d   eSU R                   ;   d   eU(       a  U(       a>  [        U S   R                  5      (       d   eU S   S   R                  5       / SQ:X  d   eO-[        U S   R                  5      (       d   eU S   S   S:X  d   eSU R                   ;   d   eU(       a  U(       a>  [        U S   R                  5      (       d   eU S   S   R                  5       / SQ:X  d   eO-[        U S   R                  5      (       d   eU S   S   S:X  d   eSU R                   ;   d   eU(       d0  [        U S   R                  5      (       d   eU S   S   / SQ:X  d   eg[        U S   R                  5      (       d   eU S   S   S:X  d   eg)zFunction to validate the data of many_data_types_geojson_file.

Depending on arrow being used or not there are small differences.
int_colrm   	float_colg      ?str_colstringbool_colTdate_colz
2020-01-01time_col   r   datetime_colz2020-01-01T12:00:00list_int_colr  z[1 2 3]list_str_col)r  r  cz['a' 'b' 'c']list_mixed_col)rm   r  NTz[1, 'a', None, True]N)ru   r4   r   to_listr3   r6   r1   r5   r   	Timestampr   r2   r   r   rv   )r|   rI   after_writes      rH   validate_resultDtest_roundtrip_many_data_types_geojson_file.<locals>.validate_resultH  s   
 BJJ&&&9 3 34444)}$$&1#---bjj(((bo334444+&&(SE111BJJ&&&r)}223333)}$$&8*444RZZ'''R
^112222*~%%'D6111RZZ'''"2j>#7#78888j>))+\0J0O0O0Q/RRRR 'r*~';';<<<<j>))+\0J/KKKK	++ +++"2j>#7#78888j>))+RA/????+++"2n#5#;#;<<<<.!))+=R0S/TTTT+++i"2n#5#;#;<<<<n%a(//1Y>>>"2n#5#;#;<<<<n%a(I555+++i"2n#5#;#;<<<<n%a(//1_DDD"2n#5#;#;<<<<n%a(O;;;2::---"2&6#7#=#=>>>>&'*.BBBB #2&6#7#=#=>>>>&'*.DDDDrJ   r   )r7  zwritten.geojsonTN)F)r   r   boolr$   r%   )rx   many_data_types_geojson_filerI   r8  read_gdftmp_fileread_back_gdfs          rH   +test_roundtrip_many_data_types_geojson_filer?  B  sd    AEBLL AET AEH :PHHU; ++HH)< #8AMM$?rJ   z;ignore: Non-conformant content for record 1 in column datesc                    SS/n[         R                  " [         R                  " U5      SS9nUR                  R	                  S5      nUR                  R                  S5      n[        (       a  UR                  R                  S5      ng g )N2023-01-01 11:00:01.1112023-06-01 10:00:01.111datesr   Australia/SydneyUTCms)r   Seriesto_datetimedttz_localize
tz_convertr#   as_unit)rx   rI   rC  	naive_collocalised_colutc_cols         rH    test_write_datetime_mixed_offsetrQ    sq     '(ABE		"../g>ILL,,-?@M))%0G|**$$T* rJ   datetime_as_stringmixed_offsets_as_utcc           
         [         R                  " 5       nSnU(       d9  [        (       d.  U(       a  [        (       a  [        R
                  " [        SS9nSnOLU(       aE  [        (       d:  [        (       d/  [        R                  " [        [        R                  " S5      S9nSnU   [        U UUUS9n[        R                  " S/SS	9nU(       a=  [        UR                   R"                  5      (       d   e[%        UR                   U5        OU(       a=  [        UR                   R"                  5      (       d   e[%        UR                   U5        O}['        UR                   5      (       d   eUR                   R(                  S
   [        R*                  " SSSSS
S
5      :X  d   eUR                   R(                  S
   R,                  S:X  d   eSSS5        g! , (       d  f       g= f)zTest writing/reading a column with a datetime far in the past.
Dates from before 1678-1-1 aren't parsed correctly by pandas < 3.0, so they
stay strings.
Reported in https://github.com/geopandas/pyogrio/issues/553.
Fz6Error parsing datetimes, original strings are returnedr   Tz8Casting from timestamp[ms] to timestamp[ns] would resultrI   rR  rS  z1670-01-01T09:00:00r0  rD  r   i  rm   	   rG  N)
contextlibnullcontextr   r   rQ   r   r   r#   r   	Exceptionreescaper$   r   rH  r6   r0  r   r:   r2   r   r6  unit)geojson_datetime_long_agorI   rS  rR  handleroverflow_occuredr|   exp_dates_strs           rH   test_read_datetime_long_agora    sv    $$&GllI ,,W
  	<< --))VW
   
%1!5	
 		#8"9O"2??#8#89999?  &r'<'<====#BOO]C +2??;;;;++A.",,tQ1aQR2SSSS++A.33t;;;/ 
s   &D(G
G%extr   c                 t   SS[         R                  /n[        (       a%  [        R                  " USS9R                  S5      nO[        R                  " U5      n[        R                  " U[        SS5      /S-  S.S	S
9nU SU 3-  n[        XxUS9  [        UUUUS9n	U(       a  US:X  a  [        S:  a  UR                  R                  R                  S5      n
U(       aU  U
R                  S5      R                   R#                  SS5      n
[         R                  U
S'   [%        U	R                  U
5        gU(       d  [%        U	R                  U
5        ggU(       a  ['        U	R                  R(                  5      (       d   eU(       aS  [        S:  aI  UR                  R                  S5      R                   R#                  SS5      n[         R                  US'   O[        R*                  " USS9n[%        U	R                  U5        g[-        U	R                  R(                  5      (       d   e[/        X5        g)zNTest writing/reading a column with naive datetimes (no time zone information).2020-01-01T09:00:00.123z2020-01-01T10:00:00ISO8601formatrG  rm   r=   rC  r   r   r   testr   rU  r   r=      r   rF  r    Tr   rC  rD  N)r   r  r#   r   rI  rM  r   r   r7   r%   r$   r   rC  rJ  rK  r   r   replacer:   r6   r   rH  r2   r8   )rx   rb  rR  rS  rI   	dates_rawrC  r|   fpathr   	exp_dates	dates_strs               rH   test_write_read_datetime_no_tzrt    s    +,A266JI|y;CCDIy)	eAqk]Q%67[
B cU|#EB3-1	F SG^(8:(E
 HHKK++E2	!((/33;;CEI66IaLi8%i8 & 
v||112222)J6.22::3DI66IaL		)':IFLL)4"6<<#5#56666!&-rJ   z6ignore: Non-conformant content for record 1 in column c                    U(       aF  [         S:  a<  US;   a6  U R                  R                  [        R                  R                  SS95        SS[        R                  /n[        (       a%  [        R                  " USS9R                  S	5      nO[        R                  " U5      n[        R                  " U[        S
S
5      /S-  S./ SQSS9n[        UR                   R"                  [        R$                  5      (       d   eUSU 3-  n	['        XUS9  [)        U	UUUS9n
U
R                   R"                  R*                  R-                  S5      (       a4  U
R                   R/                  UR                   R"                  5      U
l        U(       a~  US;   ax  [         S:  an  UR1                  5       nXR                   R3                  5          R                   R/                  [4        5      Ul        [7        U
R                   UR                   SS9  gU(       Ga  [9        U
R                   R"                  5      (       d   eU(       a]  [         S:  aS  UR                   R/                  S5      R4                  R;                  SS5      n[        R                  UR<                  S'   Oz[         S:  a[  U Vs/ s H%  n[        R2                  " U5      (       d  M   USS PM'     sn[        R                  /-   n[        R>                  " USS 9nO[        R>                  " USS 9n[7        U
R                   USS9  g[7        U
R                   UR                   SS9  gs  snf )!zzWrite and read file with all equal time zones.

This should result in the result being in pandas datetime64 dtype column.
r=   
   r   r   	.geojsonlz:Wrong datetimes read in GeoJSON with GDAL < 3.10 via arrowr~   2020-01-01T09:00:00.123-05:002020-01-01T10:00:00-05:00re  rf  rG  rm   r=   rh  )r   r   r=   r   )indexr   rj  r   rU  , pytz.FixedOffset(-300)].fgbr   rk  F)check_indexr   rm  rn  r   r=   r  r   NrC  rD  ) r   rO   r  rQ   r  r  r   r  r#   r   rI  rM  r   r   r7   r   rC  r   DatetimeTZDtyper%   r$   r   endswithr   copynotnar   r:   r6   ro  r   rH  )rG   rx   rb  rR  rS  rI   rp  rC  r|   rq  r   df_exprs  xs                 rH   test_write_read_datetime_tzr    s    %
2s>W7W 	KKS  	
 12MrvvVI|y;CCDIy) 
eAqk]Q%67
B
 bhhnnb&8&89999cU|#EB3-1	F ||''(CDD||**288>>:S--2BZ2Oll002399@@EFLL&,,EJ	v||112222)J6.22::3DI "INN1	))2BAbhhqk3BBbffXMI		)':I		)':IFLL)GFLL"((F Cs   0M	Mc                    SS[         R                  /n[        R                  " [        R                  " U5      SS9nUR
                  R                  S5      nUR                  [        5      nU(       a_  UR                  R                  SS5      n	U	R                  R                  SS	5      n	[        S
:  a  U	R                  R                  SS5      n	O[U(       aB  UR
                  R                  S5      n	[        (       a  U	R
                  R                  S5      n	OUR                  S 5      n	[         R"                  " U[%        SS5      /S-  S.SS9n
U SU 3-  n['        XUS9  [)        UUUUS9nU(       Gar  [        S:  Gag  US;   a  UR
                  R                  S5      n[        (       a  UR
                  R                  S5      nU(       aU  [+        UR,                  R.                  5      (       d   eUR                  [        5      R                  R                  SS5      n[        R0                  " UR,                  S   5      (       d   e[3        UR,                  R5                  S5      UR5                  S5      5        gUS;   a_  [        R0                  " UR,                  S   5      (       d   e[3        UR,                  R5                  S5      UR5                  S5      5        gU(       a'  [+        UR,                  R.                  5      (       d   eOcU(       a6  [7        UR,                  R.                  [        R8                  5      (       d   eO&[;        UR,                  R.                  5      (       d   e[        R0                  " UR,                  S   5      (       d   e[3        UR,                  R5                  S5      U	R5                  S5      5        g)zLTest with localized dates across a different summer/winter time zone offset.rA  rB  rC  rD  rE  rm  rn  z.111000z.111r  r   r  rF  rG  c                 h    [         R                  " U 5      (       a  [         R                  " U 5      $ S $ rE   )r   r  r6  r  s    rH   <lambda>Dtest_write_read_datetime_tz_localized_mixed_offset.<locals>.<lambda>z  s     !bll1o>$>rJ   rm   r=   rh  r   ri  rj  r   rU  rk  rx  r   Nr   r  )r   r  r   rH  rI  rJ  rK  r   r   ro  r   slicerL  r#   rM  applyr   r   r7   r%   r$   r6   rC  r   r  r:   headr   r  r5   )rx   rb  rR  rS  rI   rp  dates_naivedates_localdates_local_offsets_strrr  r|   rq  r   	dates_utcs                 rH   2test_write_read_datetime_tz_localized_mixed_offsetr  ^  s    +,ErvvNI))BNN95GDK..,,-?@K)005+//77SA	MM)))V<	i'!++Ar2I	NN--e4	<!,,T2I+11>
	 
E!QK=1+<=;
B cU|#EB3-1	F %
2++ $11%8I|%LL006	!&v||'9'9::::%,,S155==c3G	776<<?++++ 1 1! 4innQ6GH%%776<<?++++ 1 1! 46M6R6RST6UV v||112222	&,,,,b.@.@AAAAv||112222 776<<?####))!,innQ.?@rJ   c                    [         R                  " S5      [         R                  " S5      [        R                  /n[        R
                  " U[        SS5      /S-  S.SS9nU SU 3-  n[        XgUS	9  [        UUUUS
9nU(       Ga6  [        S:  Ga+  US;   a  UR                  5       n	[         R                  " USS9U	l        [        (       a*  U	R                  R                  R                  S5      U	l        U(       a:  U	R                  R!                  S5      R"                  R%                  SS5      U	l        [         R&                  U	R(                  S'   [+        X5        gUS;   aV  UR                  5       n	U	R                  R!                  S5      U	l        [,        (       d  SU	R(                  S'   [+        X5        gU(       a  [/        UR                  R0                  5      (       d   eUR                  R3                  S 5      n
[        S:  a  U
R"                  R5                  SS5      n
[7        UR                  U
5        gU(       a  [9        UR                  R0                  [         R:                  5      (       d   e[         R                  " UR                  SS9n[        (       a  UR                  R                  S5      n[7        UR                  U5        g[=        UR                  R0                  5      (       d   e[+        X5        g)z-Test with dates with mixed time zone offsets.z2023-01-01 11:00:01.111+01:00z2023-06-01 10:00:01.111+05:00rm   r=   rh  r   ri  rj  r   rU  rk  rx  TutcrG  r   rm  rn  r   rC  Nr  c                 v    [         R                  " U 5      (       a  U R                  SS9$ [        R                  $ )Nmilliseconds)timespec)r   r  	isoformatr   r  r  s    rH   r  ;test_write_read_datetime_tz_mixed_offsets.<locals>.<lambda>  s'    bhhqkkakk>k:UrvvUrJ   r  r   r  )r   r6  r   r  r   r   r7   r%   r$   r   r  rI  rC  r#   rJ  rM  r   r   ro  NAlocr8   r   r6   r   mapr  r:   r   r  r5   )rx   rb  rR  rS  rI   rC  r|   rq  r   r  rs  rr  s               rH   )test_write_read_datetime_tz_mixed_offsetsr    sQ    	45
45
E 
eAqk]Q%67[
B cU|#EB3-1	F %
2++ WWYF>>%T:FL|%||66t<!%||2259==EEc3O%'UUFJJz"%f5%% WWYF!<<..u5FL<)-

:&%f5v||112222HHLLU
	 i'!++Ar2IFLL)4	&,,,,b.@.@AAAANN2886	<!,,T2IFLL)4v||112222!&-rJ   rC  i  rm   rl  i    rw  hourstzinfoz3before GDAL 3.11, datetimes weren't handled as wellc                 &   [         R                  " U[        SS5      /[        U5      -  S.S[        S9nU S-  n[        X4US9  [        UUSSS9nUR                  5       nUS	   R                  cX  [        R                  " UR                  SS9Ul        [        (       a(  UR                  R                  R                  S5      US'   O[        (       a  [         (       d  UR"                  S   R%                  ['        [)        SS95      S9UR"                  S'   [        R                  " UR                  5      US'   [        (       a(  UR                  R                  R                  S5      US'   [         (       d  S
UR"                  S'   [+        XV5        g
)zHTest writing a column with datetimes with and without time zone offsets.rm   rh  r   r   r   r   r   FrU  r   Nr  rG  rC  )rm   rC  r  r  r  )r   r   r7   rt   r#  r%   r$   r  r  r   rI  rC  r#   rJ  rM  r   r   r  ro  r   r   r8   )rx   rC  rI   r|   rq  r   exp_dfs          rH   (test_write_read_datetime_tz_offsets_Noner    sD   , 
eAqk]SZ%?@
B
 {"EB3 "	F WWYFQx~~fll><$lloo55d;F7O
 <%+ZZ
%;%C%C	 23 &D &FJJz" !nnV\\:F7O|"(,,//"9"9$"?w<!%

:f-rJ   rp  rz  r{  c                 6   [         R                  " USS9n[        R                  " U[	        SS5      /S-  S.SS9nU SU 3-  n[        XxUS	9  [        UUUUS
9n	[        (       a%  [         R                  " USS9R                  S5      n
O[         R                  " U5      n
UR                  5       n[         R                  " U
SS9US'   U	R                  R                  R                  R                  S5      (       a2  U	R                  R                  UR                  R                  5      U	S'   U(       a  [         S:  a  US;   a  U(       a+  [         R                  " SS["        R$                  /5      US'   OWUR                  [         R&                  " SS9-
  US'   [        (       a(  UR                  R(                  R                  S5      US'   [+        X5        gU(       aF  [         S:  a<  US;   a6  [         R                  " SS["        R$                  /5      US'   [+        X5        gU(       a  [-        U	R                  R                  5      (       d   eU(       a5  [         S:  a+  [         R                  " SS["        R$                  /5      US'   O[         R                  " SS["        R$                  /5      US'   [         S:  a)  UR                  R.                  R1                  S S!5      US'   OU(       ae  [3        U	R                  R                  [         R4                  5      (       d   e[/        U	R                  R                  R6                  5      S";   d   eO5[3        U	R                  R                  [         R4                  5      (       d   e[+        X5        g)#z;Datetime objects with equal offsets are read as datetime64.Or   rm   r=   rh  r   ri  rj  r   rU  re  rf  rG  rC  rD  r}  rv  rx  z 2020-01-01T04:00:00.123000-05:00z2020-01-01T05:00:00-05:00r  r  Nrk  r~  z 2020-01-01 09:00:00.123000-05:00z2020-01-01 10:00:00-05:00z 2020-01-01T09:00:00.123000-05:00r{  rz  r  r   r  )z	UTC-05:00zpytz.FixedOffset(-300))r   rH  r   r   r7   r%   r$   r#   rI  rM  r  rC  r   r   r  r   r   r   r  	TimedeltarJ  r8   r6   r   r  r   r  tz)rx   rp  rb  rI   rR  rS  rC  r|   rq  r   rr  r  s               rH   #test_write_read_datetime_tz_objectsr  5  s   4 IIis+E	eAqk]Q%67[
B cU|#EB3-1	F |NN9Y?GGM	NN9-	WWYFii	8F7O ||''(CDD ,,--fll.@.@Aw%
2s>W7W  ii6/FFF7O %llR\\-BBF7O|"(,,//"9"9$"?w!&1%
2s>O7O ))/1LbffU
w 	"&1v||112222)J6 ii6/FFF7O !ii02MrvvVF7O  )+"(,,"2"2"8"8B"?w	&,,,,b.@.@AAAA6<<%%(()-TTTT&,,,,b.@.@AAAAf-rJ   c                    SS[         R                  /n[        (       a%  [        R                  " USS9R                  S5      nO[        R                  " U5      n[        R                  " U[        SS5      /S-  S.S	S
9nUR                  R                  R                  S;   d   eU SU 3-  n[        XxUS9  [        UUUUS9n	U(       a  US:X  a  [        S:  a  U(       ac  [        U	R                  R                  5      (       d   e[        R                   " SS[         R                  /SS9n
[#        U	R                  U
5        g[#        U	R                  UR                  R$                  R'                  S5      5        gU(       a  [        U	R                  R                  5      (       d   eU(       aS  [        S:  aI  UR                  R)                  S5      R*                  R-                  SS5      n
[         R                  U
S'   O;[        R                   " USS9n
[        S:  a  U
R*                  R-                  SS5      n
[#        U	R                  U
5        gU	R                  R                  R                  S;   d   e[/        X5        g)z1Test writing/reading a column with UTC datetimes.z2020-01-01T09:00:00.123Zz2020-01-01T10:00:00Zre  rf  rG  rm   r=   rh  r   ri  )datetime64[ms, UTC]datetime64[ns, UTC]rj  r   rU  r  rk  rd  z2020-01-01T10:00:00.000rC  rD  Nr   rm  rn  r   r  Zz+00)r   r  r#   r   rI  rM  r   r   r7   rC  r   r   r%   r$   r   r6   rH  r:   rJ  rK  r   r   ro  r8   )rx   rb  rI   rR  rS  rp  rC  r|   rq  r   rs  s              rH   test_write_read_datetime_utcr    s    ,-CRVVLI|y;CCDIy)	eAqk]Q%67[
B 88>>"PPPPcU|#EB3-1	F SF]'7*'D "6<<#5#56666		*,ErvvNI  i8bhhkk.E.Ed.KL	v||112222)J6.22::3DI66IaL		)':I)+%MM11#u=	FLL)4||!!&&*XXXX!&-rJ   zext, use_arrow, expected_result))r   Ferror)r   F	supported)ry  Fr  )r   Fsecond_column_dropped)r   Tr  )r   Tsecond_column_overwrites_first)ry  Tr  )r   Tr  c           	         [         R                  " SS/SS/[        SS5      [        SS5      /S.5      n[        R                  " USSS	9nU S
U 3-  nUS:X  a-  [
        R                  " [        SS9   [        XVUS9  SSS5        g[        XVUS9  [        XbS9nSUR                  ;   d   eSUR                  ;   d   eUS:X  a5  SUR                  ;   d   e[        US   US   SS9  [        US   US   SS9  gUS:X  a$  [        US   US   SS9  SUR                  ;  d   egUS:X  a3  [        US   US   R                  S5      SS9  SUR                  ;  d   eg[        SU< 35      e! , (       d  f       g= f)a  Test writing and reading a file with column names that only differ in casing.

Probably never a good idea to use multiple columns with the same name but different
casing, but at least this test documents the current behaviour.

With arrow, this never seems to be supported.
rm   r   r=   r   r   )r   COLr   r   r   r   test_duplicate_columnsr  r  r   r   Nr   r  Fcheck_dtyper  r  z$Unhandled value for expected_result=)r   r   r7   r   r   rQ   r   rY  r%   r$   ru   r:   renameAssertionError)rx   rb  rI   expected_resultr|   r   r   r   s           rH   #test_write_read_column_names_casingr    s   , 
A1vE!QKq!3MN
B //"z{
CC23%88H'!]]9E2CY? 3 	CY7H:F'''FNN"""+%&&&F5M2e9%HF5M2e9%H	3	3F5M2e9%HFNN***	<	<F5M2e9+;+;E+BPUVFNN***DO3EFGG- 32 	s   2E**
E8c                     U S-  n[         R                  " SS S /05      n[        X25        [        X!SS9nUS   R	                  5       R                  5       (       d   eg )Nz!test_null_values_no_geometry.gpkgr   Fr   )r   r   r%   r$   r  allr   s        rH   test_read_null_valuesr    s\    ==H ||UT4L12HH'	U	KB e9>>!!!!rJ   c                    USSS.n[        U 40 UD6n[        UR                  [        R                  " SS5      5        [        U 4SS0UD6n[        UR                  [        R                  " SS5      5        [        U 4SS0UD6n[        R
                  " SS/SS	9nU[        U R                     -  n[        UR                  U5        g )
Nr   )rI   skip_featuresr   r   r   FTr=   fidrD  )r$   r9   r|  r   
RangeIndexIndexr+   r   )r   rI   r   r|   fids_expecteds        rH   test_read_fid_as_indexr     s    $q!LF 
3	>v	>Brxxq!!45	3	R%	R6	RBrxxq!!45	#

 
B
 HHaV%0MY:AABBMrxx/rJ   c                     [        U / SSUS9nUc   e[        U5      S:X  d   e[        UR                  5      S:X  d   eg )NFTr   r   r   )r$   rt   ru   r   rI   r|   s      rH   test_read_fid_as_index_onlyr  4  sM    	
B >>r7c>>rzz?arJ   c                 Z   [        XSS9n[        U5      S:X  d   e[        XSS9n[        U5      S:X  d   eUR                  S   R                  S:X  d   e[        U USS9n[        U5      S	:X  d   e[        [	        UR                  R                  5       5      R                  / S
Q5      5      S:X  d   e[        U USS9n[        U5      S:X  d   eUR                  R                  5       S:  d   eUR                  R                  5       S:  d   e[        XSS9n[        U5      S:X  d   eg )Nr   rI   wherer   ziso_a3 = 'CAN'rm   r   CANziso_a3 IN ('CAN', 'USA', 'MEX')r=   r  USAMEXz+POP_EST >= 10000000 AND POP_EST < 100000000K   逖  zISO_A3 = 'INVALID')
r$   rt   r   r   setunique
differencer   minmaxr   s      rH   test_read_wherer  A  s3   	3PR	SBr7c>> 
#@P
B r7a<<771:%%%	#/
B
 r7a<<s299##%&112GHIQNNN 
#;
B
 r7b==::>>x'''::>>i''' 
#@T
B r7a<<rJ   c                    U(       aF  UR                   S:X  a6  U R                  R                  [        R                  R                  SS95        UR                   S:X  a7  [        S:  a-  [        R                  " [        SS9   [        XSS9  S S S 5        g [        R                  " [        S	S9   [        XSS9  S S S 5        g ! , (       d  f       g = f! , (       d  f       g = f)
Nr   zGDAL doesn't error for GPGKr~   rk  zno such columnr   invalidr  zInvalid SQL)r   rO   r  rQ   r  r  r   r   r   r$   r   )rG   r   rI   s      rH   test_read_where_invalidr  f  s    0777B 1 19V 1 WX"))W49IZ9W]]>1AB+	 CB
 ]]:];+	 <; CB
 <;s   C.C
C
C!c                 @    [        U SS/US9n[        U5      S:X  d   eg )Nz "iso_a3" = 'CAN' r   )r  ru   rI   r   r   r  s      rH   test_read_where_ignored_fieldr  w  s.    
 
&	
B r7a<<rJ   bbox))rm   )rm   r   r  c                 ~    [         R                  " [        SS9   [        XUS9  S S S 5        g ! , (       d  f       g = f)NzInvalid bboxr   rI   r  r   )r   r  rI   s      rH   test_read_bbox_invalidr    s'    	z	82dS 
9	8	8   .
<zbbox,expected)r   r   h㈵>r     rw  PANCRI)i6   7   r  c                     U(       a.  [         S:  a$  U R                  S:X  a  [        R                  " SS9  [	        XUS9n[
        R                  " UR                  U5      (       d   eg )Nr=   r  r   r   3GDAL bug: https://github.com/OSGeo/gdal/issues/8347r~   r  )r   r   rQ   r  r$   r   r   r   )r   rI   r  r   r|   s        rH   test_read_bboxr    sR     	y('..'9QR	3t	TB>>"))X....rJ   c                     [        U USSS9n[        U5      S:X  d   e[        R                  " UR                  S/5      (       d   eg )NL2   Z   DSELECT * from naturalearth_lowres where iso_a3 not in ('USA', 'RUS'))rI   r  r^   rm   r  r$   rt   r   r   r   r   s      rH   test_read_bbox_sqlr    sG    	#!R	
B r7a<<>>"))eW----rJ   c                     [        U USSS9n[        U5      S:X  d   e[        R                  " UR                  S/5      (       d   eg )Nr  iso_a3 not in ('USA', 'RUS'))rI   r  r  rm   r  r  r   s      rH   test_read_bbox_wherer    sG    	#!,	
B r7a<<>>"))eW----rJ   maskr7   )r   coordinatesz({"type": "Point", "coordinates": [0, 0]}r  c                 ~    [         R                  " [        SS9   [        XUS9  S S S 5        g ! , (       d  f       g = f)Nz+'mask' parameter must be a Shapely geometryr   rI   r  r   )r   rI   r  s      rH   test_read_mask_invalidr    s+     
z)V	W*dK 
X	W	Wr  c           
          [         R                  " [        SS9   [        U US[        R
                  " SS5      S9  S S S 5        g ! , (       d  f       g = f)Nz!cannot set both 'bbox' and 'mask'r   r  r  r  )rI   r  r  )rQ   r   r   r$   shapelyr7   r   rI   s     rH   test_read_bbox_mask_invalidr    s=    	z)L	M"tR(		
 
N	M	Ms   "A
Azmask,expectedr  r  r  r  r  g@*3`h@gؒD|I@g @gutI@g@NRd_@gmPBRI@g`}<@ghWI@g ΃
@g.WlI@)DEUBELNLDg5   )r  r  IRLc                    U(       a.  [         S:  a$  U R                  S:X  a  [        R                  " SS9  [	        XUS9n[        U5      [        U5      :X  d   e[        R                  " UR                  U5      (       d   eg )Nr  r   r  r~   r
  )	r   r   rQ   r  r$   rt   r   r   r   )r   rI   r  r   r|   s        rH   test_read_maskr    si    B 	y('..'9QR	3t	TBr7c(m###>>"))X....rJ   c           
          [        U U[        R                  " SSSS5      SS9n[        U5      S:X  d   e[        R
                  " UR                  S/5      (       d   eg )	Nr  r  r  r   r  )rI   r  r^   rm   r  r$   r  boxrt   r   r   r   r   s      rH   test_read_mask_sqlr    sV    	#[[r4,R	
B r7a<<>>"))eW----rJ   c           
          [        U U[        R                  " SSSS5      SS9n[        U5      S:X  d   e[        R
                  " UR                  S/5      (       d   eg )	Nr  r  r  r   r  )rI   r  r  rm   r  r  r   s      rH   test_read_mask_wherer    sV    	#[[r4,,	
B r7a<<>>"))eW----rJ   fids)rm   r  rw  r  c                     [        XSUS9n[        U5      S:X  d   e[        R                  " XR                  R
                  5      (       d   eg )NT)r  r   rI   r=   )r$   rt   r   r   r|  values)r   r  rI   r|   s       rH   test_read_fidsr     sD     
#TY
B r7a<<>>$0000rJ   c                     Sn[        U5      n[        R                  " [        SU S3S9   [	        XSS9nS S S 5        g ! , (       d  f       g = f)Ni  zerror applying filter for z fidsr   Tr  rI   )rangerQ   r   r   r$   )r   nb_fidsr  ra   s       rH   "test_read_fids_arrow_max_exceptionr%    sD     G>D	z+EgYe)T	U.TJ 
V	U	Us	   ?
Ar  z#GDAL >= 3.8.0 does not need to warnc                     U R                   S;  a  [        R                  " [        SS9nO[        R
                  " 5       nU   [        U S/SS9n[        U5      S:X  d   e S S S 5        g ! , (       d  f       g = f)N)r   r   z=Using 'fids' and 'use_arrow=True' with GDAL < 3.8 can be slowr      Tr"  rm   )r   rQ   r   r   rW  rX  r$   rt   )r   r^  r|   s      rH   %test_read_fids_arrow_warning_old_gdalr(  %  se     #))1FF,,Q

 ((*	7rddS2w!|| 
s   A**
A8c                    U S-  n[         R                  " [        SSS5      [        SSS5      /SS9n[        X!5        [	        US/S9n[        X2R                  S S 5        [	        USS/S9n[        R                  " UR                  R                  [        R                  " UR                  S S R                  R                  5      5      (       d   eg )	Nr   r   rm   r   r   )r  T)r   r  )r   r   r7   r%   r$   r8   r   r   r   r   r  r  r   )rx   r   r   r|   s       rH   test_read_fids_force_2dr*  8  s    +%H 1a.%1a.1{H H'	s	+Bb--"34	4qc	:B>>
G,,X]]2A->-G-G-N-NO   rJ   r     c           	      8   U R                   n[        U 5      R                  US  R                  SS9n[        XUS9n[	        U5      [	        U5      :X  d   eUS;   nUS:H  nUS:X  a"  U(       d  U/ SQ   R                  S5      U/ SQ'   [        UUUS	U(       + US
9  g )NTdropr  rI   rx  ry  r+  )r   r   r   r   Fcheck_less_precisecheck_index_typer  	normalizer   r$   r   reset_indexrt   r   r8   )r   rI   r  rb  r   r|   is_jsonis_jsonss           rH   test_read_skip_featuresr8  J  s    
%
,
,C23	mn		$	  
#I
B r7c(m### ..Gk!HI /1+/

&- 	*+ 
"KrJ   c                     [         R                  " [        SS9   [        U SUS9  S S S 5        g ! , (       d  f       g = f)Nz'skip_features' must be >= 0r   r/  r   r  s     rH    test_read_negative_skip_featuresr;  o  s+    	z)G	H*"	R 
I	H	Hr   )r   rw  r+  r   d   c           	         U R                   n[        U 5      R                  X3U-    R                  SS9n[        U UUUS9n[	        U5      [	        U5      :X  d   eUS;   nUS:H  n[	        U5      S:X  aL  U(       dE  US   R                  S5      US'   US	   R                  S5      US	'   US
   R                  S5      US
'   [        UUUSU(       + US9  g )NTr-  )r  r   rI   rx  ry  r   r   r#  r   r   Fr0  r4  )	r   rI   r   r  rb  r   r|   r6  r7  s	            rH   test_read_max_featuresr>  t  s    
 &
,
,C23	ml:	<	$	 
 
##!	
B r7c(m### ..Gk!H
8}) !) 5 < <X F#F+228<%h/66x@
"KrJ   c                     [         R                  " [        SS9   [        U SUS9  S S S 5        g ! , (       d  f       g = f)Nz'max_features' must be >= 0r   r:  )r   rI   r   r  s     rH   test_read_negative_max_featuresr@    s+    	z)F	G*yQ 
H	G	Gr   c                 r   [         R                  " [        SS9   [        SU S9  S S S 5        [         R                  " [        SS9   [        SU S9  S S S 5        [         R                  " [        SS9   [        SU S9  S S S 5        g ! , (       d  f       Ng= f! , (       d  f       NL= f! , (       d  f       g = f)NzNo such file or directoryr   znon-existent.shpr   z!does not exist in the file systemz/vsizip/non-existent.zipzzip:///non-existent.zip)rQ   r   r    r$   r   s    rH   test_read_non_existent_filerB    s    	.I	J)Y? 
K 
.Q	R1YG 
S 
.Q	R0IF 
S	R 
K	J 
S	R 
S	Rs#   BB2B(
B
B%(
B6c                    Sn[        XSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  S	   R                  S
:X  d   eSn[        XSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R                  5       / SQ:X  d   eSn[        XSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R                  5       / SQ:X  d   eSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  R                  5       S:  d   eUR                  R                  5       S:  d   eSn[        XSUS9n[        U5      S	:X  d   eg )NGSELECT iso_a3 AS iso_a3_renamed, name, pop_est FROM naturalearth_lowresOGRSQLr^   r_   rI   r   r   6SELECT * FROM naturalearth_lowres WHERE iso_a3 = 'CAN'rm   r  r   r  zdSELECT *
               FROM naturalearth_lowres
              WHERE iso_a3 IN ('CAN', 'USA', 'MEX')r=   r  zSELECT *
               FROM naturalearth_lowres
              WHERE iso_a3 IN ('CAN', 'USA', 'MEX')
              ORDER BY name)r  r  r  zpSELECT *
               FROM naturalearth_lowres
              WHERE POP_EST >= 10000000 AND POP_EST < 100000000r  r  r  z:SELECT * FROM naturalearth_lowres WHERE ISO_A3 = 'INVALID')	r$   rt   ru   r   r   rv   r   r  r  r   rI   r^   r|   s       rH   test_read_sqlrI    s    TC	#(i
B rzz?ar7c>> CC	#(i
B r7a<<rzz?a771:%%%7C 
#(i
B rzz?ar7a<<99!6666C 
#(i
B rzz?ar7a<<99!6666CC 
#(i
B r7b==rzz?a::>>x'''::>>i''' GC	#(i
B r7a<<rJ   c                    U R                   S:X  aB  [        R                  " [        [        R
                  " S5      S9   [        U SUS9  S S S 5        O-[        R                  " [        SS9   [        U SUS9  S S S 5        [        R                  " [        SS9   [        U SSUS	9  S S S 5        g ! , (       d  f       N== f! , (       d  f       NN= f! , (       d  f       g = f)
Nr   zIn ExecuteSQL()r   r  r^   rI   zSQL Expression Parsing Errorz/'sql' parameter cannot be combined with 'layer'whatever)r^   r   rI   )r   rQ   r   rY  rZ  r[  r$   r   r   s     rH   test_read_sql_invalidrM    s    "))W4]]9BII6G,HI+i JI
 ]]9,JK+i L
 
K
 	'		

 
 JI
 LK

 
s#   B/,C C/
B= 
C
Cc           	          Sn[        U USSS/SUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R	                  5       / SQ:X  d   eg )	NrD  rE  iso_a3_renamedr   z'iso_a3_renamed IN ('CAN', 'USA', 'MEX'))r^   r_   ru   r  rI   r=   r  r$   rt   ru   rO  rv   rH  s       rH   test_read_sql_columns_whererQ    sn    
SC	#!6*7
B rzz?ar7a<<##%)>>>>rJ   c           
          Sn[        U USSS/SSUS9n[        UR                  5      S:X  d   e[        U5      S	:X  d   eUR                  R	                  5       S
S/:X  d   eg )NrD  rE  rO  r   z iso_a3_renamed IN ('CRI', 'PAN')r  )r^   r_   ru   r  r  rI   r=   r   r  r  rP  rH  s       rH    test_read_sql_columns_where_bboxrS    st    
SC	#!6*0
B rzz?ar7a<<##%%777rJ   c           	      >   Sn[        U USSSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R	                  5       S/:X  d   eSn[        U USSUS	9n[        U5      S:X  d   eSn[        U USSUS
9n[        U5      S:X  d   eg )NzSELECT *
               FROM naturalearth_lowres
              WHERE iso_a3 IN ('CAN', 'MEX', 'USA')
              ORDER BY namerm   rE  )r^   r  r   r_   rI   r  r  z)SELECT * FROM naturalearth_lowres LIMIT 1r=   )r^   r   r_   rI   )r^   r_   r  rI   r   )r$   rt   ru   r   rv   rH  s       rH   test_read_sql_skip_maxrU  "  s    C 
#
B rzz?ar7a<<99%(((
5C	#
B r7a<<
5C	#
B r7a<<rJ   r   c                    Sn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  S   R                  S:X  d   eUR                  S   R
                  R                  nSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S	:X  d   eUR                  S   R
                  R                  U:  d   eg )
NrG  r]   rF  rm   r  r   r  zSELECT ST_Buffer(geometry, 5) AS geometry, name, pop_est, iso_a3
               FROM naturalearth_lowres
              WHERE ISO_A3 = 'CAN'r   r$   rt   ru   r   r   r   arear   rI   r^   r|   area_canadas        rH   #test_read_sql_dialect_sqlite_nogpkgr[  H  s     CC	(i
B r7a<<rzz?a771:%%%''!*%%**K&C 
(i
B r7a<<rzz?a771:##k111rJ   c                    Sn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  S   R                  S:X  d   eUR                  S   R
                  R                  nSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S	:X  d   eUR                  S   R
                  R                  U:  d   eg )
NrG  INDIRECT_SQLITErF  rm   r  r   r  zSELECT ST_Buffer(geom, 5) AS geometry, name, pop_est, iso_a3
               FROM naturalearth_lowres
              WHERE ISO_A3 = 'CAN'r   rW  rY  s        rH   !test_read_sql_dialect_sqlite_gpkgr^  e  s     CC	2Cy
B r7a<<rzz?a771:%%%''!*%%**K&C 
2Cy
B r7a<<rzz?a771:##k111rJ   c                    U S-  n[        USUS9 nUR                  S5        UR                  S5        SSS5        [        R                  " S/S/S	.5      nU S
-  n[	        XVXS9  [        X1S9 nUR                  5       nSSS5        [        XaS9 nUR                  5       n	SSS5        WW	:X  d   e[        US5       nUR                  5       n
SSS5        [        US5       nUR                  5       nSSS5        W
W:X  d   eg! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       No= f! , (       d  f       N[= f)zbTest if write_dataframe uses the default encoding correctly.

Arrow only supports utf-8 encoding.
rf   rg   rh   rj   rk   Nrq   rp   )rn   ro   ztest_pyogrio.csvrl   rb)rr   rs   r   r   r%   read)rx   ri   ry   rz   r{   r|   csv_pyogrio_pathcsv_strcsv_pyogriocsv_pyogrio_str	csv_bytescsv_pyogrio_bytess               rH   test_write_csv_encodingrh    s*     *$H	hh	/3		.!		./ 
0 
!3 4ykJ	KB"44B8M 
h	*c((* 
+		2k%**, 
3o%%% 
h	HHJ	 
		%',,. 
&))))/ 
0	/ 
+	*	2	2 
		%	%s;   #D/DD'>D8#E	
D
D$'
D58
E	
Ez ext, fid_column, fid_param_value))r   r  N)r   FIDN).sqliteogc_fidN)r   
fid_customrl  )r   
FID_customrl  )rj  ogc_fid_customrn  c                 <   [         R                  " US/0[        R                  " SS5      /SS9n0 nUb  X6S'   U SU 3-  n[	        XW4SU0UD6  UR                  5       (       d   e[        US	US
9nUR                  5       nUR                  US0S9n	[        X5        g)a  Test to specify FIDs to save when writing to a file.

Saving custom FIDs is only supported for formats that actually store the FID, like
e.g. GPKG and SQLite. The fid_column name check is case-insensitive.

Typically, GDAL supports using a custom FID column for these file formats via a
`FID` layer creation option, which is also tested here. If `fid_param_value` is
specified (not None), an `fid` parameter is passed to `write_dataframe`, causing
GDAL to use the column name specified for the FID.
r  r   z	epsg:4326r   Nr  rj  rI   T)r   rI   )ru   )
r   r   r  r7   r%   existsr$   r5  r  r8   )
rx   rb  
fid_columnfid_param_valuerI   	input_gdfr   path
output_gdfexpected_gdfs
             rH   test_write_custom_fidsrw    s    . 	aSW]]1a%8$9{I F"'uSEl"DICyCFC;;===49MJ'')J ##Z,?#@Lj7rJ   c           	         [        U40 [        D6nU SU 3-  nUS:X  a  [        XEUSS9  O
[        XEUS9  UR                  5       (       d   e[        U5      nUR                  R
                  R                  5       n[        U   [        ;   a  [        U5      S/:X  d   eO[        U5      SS1:X  d   eUS;   nUS	:H  n	[        UUUSU(       + U	S
9  g )Nrj  r  FrI   spatial_indexr   MultiPolygonPolygonrx  ry  r0  )r$   	NE_KWARGSr%   rp  r   r   r  r)   r'   listr  r8   )
rx   r   rb  rI   rs  output_path
result_gdfgeometry_typesr6  r7  s
             rH   test_write_dataframer    s     2@i@ItC5\)K
f}iu	
 		)D,J((--446Ns|44N#'7777>"~y&AAAA ..Gk!H"KrJ   zignore:.*No SRS set on layer.*write_geodf.xlsxr  c           	         [        USS9nU(       a  [        R                  " U5      nUSU 3-  nUS:X  a  UR                  S5      nUS:w  a	  [        U   OSn[        XgXXS9  UR                  5       (       d   e[        U5      n	[        U	[        R                  5      (       d   eUS	;  n
US
;   av  [        U	[        R                  5      (       a   e[        U[        R                  5      (       a  [        R                  " U5      n[        R                  R                  XSU
S9  g[        R                  " U[        R                  " S[        U5      5      SS9n[        U	USU
S9  g)zTest writing a (geo)dataframe without a geometry column.

FlatGeobuf (.fgb) doesn't seem to support this, and just writes an empty file.
F)r   rj  r   z.dbfr  XLSX)rI   driver)r   ry  r  )r   r   r  )r2  r  N  r   )r$   r   r   with_suffixr)   r%   rp  r   r   r   testingassert_frame_equalr   repeatrt   r8   )rG   rx   r   r  rb  rI   input_dfr  r  	result_dfr  input_none_geom_gdfs               rH   test_write_dataframe_no_geomr    sE    1GH??8,tC5\)K f}!--f5 !G^WS\FHYN{+Ii.... ??K
((i9999h00||H-H


%%%[ 	& 	

 !ooryys8}=4
 	""#		
rJ   c                     [        U5      nUR                  S5      nU S-  n[        X4US9  [        U5      n[        UR                  [
        R                  5      (       d   e[        XSR                  SS95        g )Nr   test.shpr   Tr-  )	r$   	set_indexr%   r   r|  r   r  r8   r5  )rx   r   rI   rs  r  r  s         rH   test_write_dataframe_indexr  8  sp     23I##H-IZ'KIi@,Jj&&6666j*?*?T*?*JKrJ   ry  zcolumns, dtypecol_int	col_float
col_objectc                    [         R                  " / X#SS9nU SU 3-  n[        XVUS9  UR                  5       (       d   e[	        XdS9n[
        (       a  SOSnU(       a   U[        L a  US   R                  S5      US'   [        XuUS	9  g
)zTest writing dataframe with no rows.

With use_arrow, object type columns with no rows are converted to null type columns
by pyarrow, but null columns are not supported by GDAL. Added to test fix for #513.
r  )r   ru   r   r   rj  r   TFr  r   r2  N)	r   r   r%   rp  r$   r#   r#  r   r8   )	rx   rb  ru   r   rI   r   r   r|   r2  s	            rH   test_write_empty_dataframer  F  s    " GdSHD,&HH)<??		6B
  ,|t Uf_!),!7!>!>u!Eb=MNrJ   c                    [         R                  " SS/0[        S/5      SS9nU S-  n[        R                  " 5          [        R
                  " S[        5        [        (       d  [        R                  " SS	S
9  [        X5        S S S 5        UR                  5       (       d   e[        U5      n[        X15        g ! , (       d  f       N<= f)Nr  r   zPOINT EMPTYr  r   r   r  ignorez'crs' was not provided.)message)r   r   r0   warningscatch_warningssimplefilterr   r   filterwarningsr%   rp  r$   r8   )rx   r   r   r|   s       rH   test_write_empty_geometryr  i  s    aSzHm_4MSWXH+%H 
	 	 	"g{3z##H6OP+	 
#
 ?? 
	!Bb+ 
#	"s   AB;;
C	c                    [         R                  " SS/0[        SS5      /SS9nU S-  n[        X#US9  UR	                  5       (       d   e[        X1S9n[        (       d4  [        (       ad  [        R                  R                  R                  (       a;  U(       a4  UR                  R                  S:X  d   eUS   R                  S5      US'   O UR                  R                  [        :X  d   e[!        XB5        g)	zTest pandas object columns with all None values.

With use_arrow, such columns are converted to null type columns by pyarrow, but null
columns are not supported by GDAL. Added to test fix for #513.

object_colNr   r  r   r   r   r   )r   r   r7   r%   rp  r$   r   r   r   optionsfutureinfer_stringr  r   r   r#  r8   )rx   rI   r   r   r  s        rH   test_write_None_string_columnr  z  s     //<$0E!QK=d
SC+%HCY7??>J"***;*;*H*H
$$**e333-44U;L$$**f444j.rJ   categorical_datafoobarr   c                    [         R                  " U[        SS5      /[        U5      -  S.SSS9nUR	                  SS05      nU SU U 3-  n[        XVS	US
9  [        XcS9nSUR                  ;   d   eUR                  5       nUS;   a8  [        US   5      (       a%  US   R	                  [        R                  5      US'   [        Xx5        g)zWrite and read a GeoDataFrame with a categorical column.

The categorical data type is not preserved when written to any of the tested file
formats, but the data itself should be preserved.
r   cat_colr   r   r   r   r  categorytest_my_layerr   r   rx  N)r   r   r7   rt   r   r%   r$   ru   r  r4   r   int32r8   )	rx   r  rb  rI   original_gdfcategory_gdfrt  r   rv  s	            rH   test_write_read_categoryr    s     ??'q!,<(==	
 L  &&	:'>?Li[..DLjIN D6F&&&  $$&L
'',<\)=T,U,U".y"9"@"@"JYf3rJ   
data_dtype)r   r#  floatc                 ^   [         R                  " / / S.SSS9R                  SU05      nUR                  SS05      nU SU S3-  n[        XES	US
9  [	        XRS9nSUR
                  ;   d   eUS;   a  [        (       a	  U(       a  SO[        nOUnUR                  SU05      n[        Xh5        g)zWrite and read a GeoDataFrame with an empty categorical column.

This specific test was added because such columns gave an error with arrow, as
reported in this issue: https://github.com/geopandas/pyogrio/issues/620.
r  r   r   r   r  r  r  r   r  r   r   )r   r#  r   N)	r   r   r   r%   r$   ru   r   r#  r8   )	rx   r  rI   r   r  rt  r   expected_dtyperv  s	            rH   !test_write_read_categorical_emptyr    s     //B'*+fi$%  ::y*56Li[..DLjIN D6F&&& &&".,9&#::y.9:Lf3rJ   z	.geojsonsc                     [         R                  " / SS9nU SU 3-  n[        X4US9  UR                  5       (       d   e[        R
                  " [        SS9   [        XBS9nS S S 5        g ! , (       d  f       g = f)Nr  r   rj  r   z7 not recognized as( being in)? a supported file format.r   )r   r   r%   rp  rQ   r   rY  r$   )rx   rb  rI   r   r   ra   s         rH   +test_write_read_empty_dataframe_unsupportedr    so     5HD,&HH)<??	S
 89
 
 
s   
A++
A9c                 4   [        U5      nU S-  n[        UUSSUS9  UR                  5       (       d   e[        R                  " [        U5      SS//5      (       d   e[        UUSSUS9  [        R                  " [        U5      SS/SS//5      (       d   eg )Nr   firstT)r   promote_to_multirI   r{  second)r$   r%   rp  r   r   r   )rx   r   rI   rs  r   s        rH   )test_write_dataframe_gpkg_multiple_layersr    s    23I+%H ??>>+h/7N2K1LMMMM >>H
>	"X~$>?   rJ   c                    U(       aL  UR                  S5      (       a6  U R                  R                  [        R                  R                  SS95        [        U5      nUSU 3-  n[        XVUS9  UR                  5         [        [        U5      5      S:X  d   e[        XVUSS9  [        [        U5      5      S	:X  d   eg )
Nr   z.Bugs with append when writing Arrow to GeoJSONr~   rj  r   r   T)rI   r   ib  )

startswithrO   r  rQ   r  r  r$   r%   rp  rt   )rG   rx   r   rb  rI   rs  r   s          rH   test_write_dataframe_appendr  	  s     S^^J// 	KK%UV	
 23ID,&HI9=OO~h'(C///I9TJ~h'(C///rJ   rz  c                 0   [        U5      nU S-  n[        UUUU(       a  SOSS9  UR                  5       SL d   eU S-  nUR                  5       UL d   eU S-  n[        UUUSU0S	9  UR                  5       SL d   eU S
-  nUR                  5       UL d   eg )Nz	test1.shpYESNO)rI   SPATIAL_INDEXTz	test1.qixz	test2.shprz  )rI   layer_optionsz	test2.qix)r$   r%   rp  )	rx   r   rz  rI   r|   outfilename1index_filename1outfilename2index_filename2s	            rH   !test_write_dataframe_gdal_optionsr  	  s    
 
+	,Bk)L
,e$	  D(((,O!!#}444 k)L
&6	  D(((,O!!#}444rJ   c                     [        U5      nU S-  n[        R                  " [        SS9   [	        X4USS9  S S S 5        g ! , (       d  f       g = f)Ntest.geojsonz#unrecognized option 'SPATIAL_INDEX'r   Try  r$   rQ   r   r   r%   )rx   r   rI   r|   outfilenames        rH   )test_write_dataframe_gdal_options_unknownr  7	  sA    	+	,B ^+K	z)N	O9DQ 
P	O	Os	   ?
Ac                     SS K nUR                  U 5      nUR                  5       nUR                  S5        UR	                  5       nU Vs/ s H  oUS   PM	     sn$ s  snf )Nr   z2SELECT name FROM sqlite_master WHERE type='table';)sqlite3connectcursorexecutefetchall)rt  r  conr  r   ress         rH   _get_gpkg_table_namesr  A	  sQ    
//$
CZZ\F
NNGH__F$%fsFf%%%s   Ac                     [        U5      nU S-  n[        X4US9  S[        U5      ;   d   eU S-  n[        X4USS9  S[        U5      ;  d   eU S-  n[        UUUSS	0S
9  S[        U5      ;  d   eg )Nztest_default.gpkgr   gpkg_ogr_contentsztest_no_contents.gpkgr  )rI   ADD_GPKG_OGR_CONTENTSztest_no_contents2.gpkgadd_gpkg_ogr_contentsF)rI   dataset_options)r$   r%   r  )rx   r   rI   r|   test_default_filenametest_no_contents_filenametest_no_contents_filename2s          rH   )test_write_dataframe_gdal_options_datasetr  K	  s    	+	,B$'::BC"78M"NNNN (+B B
Yd &;<U&VVVV!),D!D
"0%8	 &;<V&WWWWrJ   zFext, promote_to_multi, expected_geometry_types, expected_geometry_typer{  r|  Unknownr   c                    [        U40 [        D6nU SU 3-  n[        XxXcS9  UR                  5       (       d   e[        U5      n	[	        U	R
                  R                  R                  5       5      n
X:X  d   e[        U5      S   U:X  d   eg )Ntest_promote)rI   r  geometry_type)	r$   r}  r%   rp  sortedr   r   r  r   )rx   r   rb  r  expected_geometry_typesexpected_geometry_typerI   rs  r  ru  r  s              rH   %test_write_dataframe_promote_to_multir  c	  s    * 2@i@I|C511K) ,JJ//44;;=>N444[!/26LLLLrJ   zUext, promote_to_multi, geometry_type, expected_geometry_types, expected_geometry_typec           	         [        U40 [        D6nU SU 3-  n	US:X  a   US;   a  [        R                  " [        SS9n
O[
        R                  " 5       n
U
   [        UU	UUUS9  S S S 5        U	R                  5       (       d   e[        U	5      nUS:X  a  [        S:  a  S	nS	/n[        UR                  R                  R                  5       5      nX:X  d   e[        U	5      S
   U:X  d   eg ! , (       d  f       N= f)Ntest_promote_layer_geom_typer   )r|  r7   z+A geometry of type MULTIPOLYGON is insertedr   rI   r  r  r   r<   r{  r  )r$   r}  rQ   r   RuntimeWarningrW  rX  r%   rp  r   r  r   r   r  r   )rx   r   rb  r  r  r  r  rI   rs  r  ctxru  r  s                rH   5test_write_dataframe_promote_to_multi_layer_geom_typer  	  s   F 2@i@I;C5AAK
g~-+??ll"O
 $$&	-'	
 
 ,J
f})W4 "0#1"2J//44;;=>N444[!/26LLLL% 
s   C,,
C:z;ext, promote_to_multi, geometry_type, expected_raises_match))r  Fr{  Mismatched geometry type)r  Fr|  r  )r  Nr7   r  )r  Nr|  r  )r   Nr7   zNCould not add feature to layer at index|Error while writing batch to OGR layerc           	          [        U40 [        D6nU SU 3-  n[        R                  " [        [
        4US9   [        UUUUUS9  S S S 5        g ! , (       d  f       g = f)Nrj  r   r  )r$   r}  rQ   r   r!   r   r%   )	rx   r   rb  r  r  expected_raises_matchrI   rs  r  s	            rH   =test_write_dataframe_promote_to_multi_layer_geom_type_invalidr  	  s\    4 2@i@ItC5\)K	n5=R	S-'	
 
T	S	Ss   A
Ac                     [        U40 [        D6nU S-  n[        R                  " [        SS9   [        X4USS9  S S S 5        g ! , (       d  f       g = f)Nr  z,Geometry type is not supported: NotSupportedr   NotSupportedrI   r  )r$   r}  rQ   r   r"   r%   )rx   r   rI   r|   r   s        rH   ,test_write_dataframe_layer_geom_type_invalidr  	  sN     
+	9y	9B.(H	K
 		X
 
 
s   A
Ac                    [         R                  " SS5      [         R                  " SS/5      [         R                  " SSSS5      [         R                  " [         R                  " SS5      [         R                  " SS5      /5      [         R
                  " [         R                  " SS/5      [         R                  " SS/5      /5      [         R                  " [         R                  " SSSS5      [         R                  " SSSS5      /5      /n[        R                  " S	/ S
Q0USS9nU SU 3-  nUS:X  a  [        XEUSS9  O
[        XEUS9  [        U5      S   S:X  d   e[        U5      n[        XdSS9  g )Nr   r   r   rm   rm   rm   r   )r   r   )r=   r=   r=   r   )r   r   r         @      @      @r   r   rj  r  Fry  r   r  r  T)check_geom_type)r  r7   
LineStringr  
MultiPointMultiLineStringr{  r   r   r%   r   r$   r8   )rx   rb  rI   r   r|   r   r   s          rH    test_write_dataframe_truly_mixedr  	  sJ    	aFF+,Aq!QGMM!Q/q!1DEF 0173E3EvvFV3WX	
 	gkk!Q15w{{1aA7NOP	H 
	./(
B D,&H
f}	O	: X/9<<<H%Ff$?rJ   c                 R   [         R                  " S/ SQ0[        R                  " SS5      [        R                  " SS/5      [        R
                  " SSSS5      /SS9nS	n[        R                  " [        [        4US
9   [        X S-  US9  S S S 5        g ! , (       d  f       g = f)Nr   r   r   r   r   r  r  rm   r   r   zCould not add feature to layer at index 1: Attempt to write non-point \(LINESTRING\) geometry to point shapefile.|Error while writing batch to OGR layer: Attempt to write non-point \(LINESTRING\) geometry to point shapefile.r   r  r   )r   r   r  r7   r  r  rQ   r   r!   r   r%   )rx   rI   r|   msgs       rH   (test_write_dataframe_truly_mixed_invalidr
  
  s    
 
	 MM!Q/0KK1a#

 
B	G  
n5S	Az1YG 
B	A	As   B
B&geomsc                     U SU 3-  n[         R                  " SSS/0USS9n[        XTUS9  [        U5      n[	        Xe5        g )Nrj  r   r   r   r   r   r   )r   r   r%   r$   r8   )rx   r  rb  rI   r   r|   r   s          rH   .test_write_dataframe_infer_geometry_with_nullsr  8
  sK     D,&H	%#s,u+	NBBI6H%Ff)rJ   z=ignore: You will likely lose important projection informationc                    [        U5      nUR                  UR                  S:H     R                  SS9R	                  S5      nU S-  n[        XEUS9  UR                  5       (       d   e[        U5      nUR                  R                  5       nUS   S:X  d   eUS	   S
:X  d   eUS   S:X  d   eUR                  R                  UR                  5      (       d   eg )NBelgiumTr-  z,+proj=aea +lat_1=49.5 +lat_2=51.5 +lon_0=4.3r  r   lat_1g     H@lat_2g     I@lon_0g333333@)
r$   r  r   r5  to_crsr%   rp  r   to_dictequals)rx   r   rI   r|   r   r   r   s          rH   test_custom_crs_ior  L
  s     
3	4B 	rww)#$	$		>	? 
 *$HH)<??		!B
&&..
Cw<4w<4w<366==&&&&rJ   )	.gpkg.zipz.shp.zipz.shzc                    US:X  a!  [         (       d  [        R                  " S5        [        U5      nU SU 3-  n[	        XEUS9  UR                  5       (       d   e[        U5      nUR                  R                  R                  5       n[        U   [        ;   a  [        U5      S/:X  d   eO[        U5      SS1:X  d   e[        XdSS9  g	)
zBRun a basic read and write test on some extra (zipped) extensions.r  z&.gpkg.zip support requires GDAL >= 3.7rj  r   r{  r|  Fr  N)r   rQ   rR   r$   r%   rp  r   r   r  r)   r'   r~  r  r8   )rx   r   rb  rI   rs  r  r  r  s           rH   test_write_read_zipped_extr  g
  s     k**<=23ItC5\)KIi@,J((--446Ns|44N#'7777>"~y&AAAAjeLrJ   c                    SSS[         R                  " 5       S [        R                  /nU Vs/ s H  n[        R
                  " SS5      PM     nn[        R                  " X1S.SS9nU S-  n[        XE5        [        U5      n[        U5      [        U5      :X  d   e[        R                  " U Vs/ s H%  owS [        R                  4;  a  [        U5      OS PM'     snS	S
9n[        US	   U5        g s  snf s  snf )Nrj  r   rm   r   )r   mixed
epsg:31370ri  ztest_write_mixed_column.gpkgr  rD  )r   nowr   r  r  r7   r   r   r%   r$   rt   r   rH  r   r:   )	rx   mixed_valuesra   r  test_gdfr  ru  valuer   s	            rH   #test_write_read_mixed_column_valuesr!  
  s    CHLLND"&&AL*67,QW]]1a ,E72H ;;KH*,Jx=C
O+++ yyJVW,T266N2U	<,WH 
7+X6 8 	Xs   !C31,C8c                 h   U S-  n[         R                  " SS5      nX3U/SS [        R                  /SS [        R                  /S.n[        R
                  " USS9n[        XRUS9  [        U5      n[        U5      [        U5      :X  d   eUS	   S   S:X  d   e[        R                  " US	   S
   5      (       d   e[        R                  " US	   S   5      (       d   eUS   S   S:X  d   e[        R                  " US   S
   5      (       d   e[        R                  " US   S   5      (       d   eg )Nztest_write_nan.gpkgr   r   rj  )r   float64
object_strr  ri  r   r#  rm   r   r$  )r  r7   r   r  r   r   r%   r$   rt   r   r  )rx   rI   r  geom	test_datar  r  s          rH   test_write_read_nullr'  
  s0   22K==AD&rvv&tRVV,I
 yl;HHY?,Jx=C
O+++i #s***77:i(+,,,,77:i(+,,,,l#A&&00077:l+A.////77:l+A.////rJ   object_col_data)r  r  Ntest1test2i  i  r  )s   foos   barN{   iA  )r+  r  Nc                 ^   U SU 3-  n[         R                  " SS5      nU/[        U5      -  US.n[        R                  " US[
        S9n[        XtUS9  [        U5      n[        U5      [        U5      :X  d   e[        (       d4  [        (       a+  [        R                  R                  R                  (       a  SOSn	S	n
[        US   [        5      (       aH  U(       a  [         (       a6  ["        (       a  S
OSn
U Vs/ s H  n[        R$                  " U5      PM     nnOU(       a  ['        US   5      [(        L a6  ["        (       a  SOSn
U Vs/ s H  n[        R$                  " U5      PM     nnO[        US   [*        5      (       a  Sn
UnO[        US   [,        5      (       a6  Sn
[        (       a  [.        R0                  OS	nU Vs/ s H	  oc  UOUPM     nnO5[        US   [2        5      (       a  Sn
U Vs/ s H  n[5        U5      PM     nnU
cM  U	n
U	S:X  a  [.        R0                  OS	nU Vs/ s H&  nUb  U[.        R0                  L a  UO
[7        U5      PM(     nnUS   R8                  R:                  U
:X  d   e[-        US   5      W:X  d   eg	s  snf s  snf s  snf s  snf s  snf )zTest writing and reading a pandas object dtype column with different value types.

Remark: how some types are handled depends a bit on the file format being used.
test_write_objectr   )r   r  iz  r  r   r   r#  Nr  r  r   r   r#  r  )r  r7   rt   r   r   r#  r%   r$   r   r   r   r  r  r  r   r   r   r#   r6  r   r   bytesr~  r   r  r   r  r   r   r   )rx   r(  rb  rI   r  r%  r&  r  r  	str_dtyper  r   expected_data	nan_values                 rH   test_write_read_object_columnr2  
  s   2 066K==ADFS11%I ye6BHHY?,Jx=C
O+++
 <LLRZZ->->-K-K 	  N/!$h//kk &2\!7L 	 ;JJ/e,/J	"#t+ 2>-CSN>MNoUR\\%0oMNM*E22%N+M*D11%N".,DICRCR%]	5?  M *G44&N7FGeU5\MG "'50BFFd	 )
( %266/Is5zI( 	 

 l#))...@@@
<()]:::C K O H
s   = J J
J ;J%3-J*c                     U u  p#SUR                    3n[        X!S9n[        U5      S:X  d   e [        XTUS9  [        XAS9n[        U5      S:X  d   e [	        U5        g ! [	        U5        f = f)N/vsimem/r   r   )r   r$   rt   r%   r   )r   rI   rt  ra   mem_pathinputr   s          rH   test_write_read_vsimemr7  
  sq    %GD$))%H45Eu:9=>6{c!!!8
8s   $A   A-zwkt,geom_typeszPoint Z (0 0 0)z
2.5D PointzPoint ZzLineString Z (0 0 0, 1 1 0)z2.5D LineStringLineString Zz(Polygon Z ((0 0 0, 0 1 0, 1 1 0, 0 0 0))z2.5D Polygon	Polygon ZzMultiPoint Z (0 0 0, 1 1 0)z2.5D MultiPointzMultiPoint Zz2MultiLineString Z ((0 0 0, 1 1 0), (2 2 2, 3 3 2))z2.5D MultiLineStringMultiLineString ZzOMultiPolygon Z (((0 0 0, 0 1 0, 1 1 0, 0 0 0)), ((1 1 1, 1 2 1, 2 2 1, 1 1 1)))z2.5D MultiPolygonMultiPolygon Zz&GeometryCollection Z (Point Z (0 0 0))z2.5D GeometryCollectionGeometryCollection Zc                     U S-  n[         R                  " [        U/5      SS9nU H#  n[        XTX6S9  [	        U5      n[        Xu5        M%     g )Nztest.fgbr   r   r  )r   r   r0   r%   r$   r8   )rx   wkt
geom_typesrI   r   r   	geom_typer|   s           rH   test_write_geometry_z_typesrA    sJ    . *$H
//8SE?
DC	TH%!"*  rJ   z4test_descr, exp_geometry_type, mixed_dimensions, wktz	1 Point Zz1 LineString Zz1 Polygon Zz1 MultiPoint Zz1 MultiLineString Zz1 MultiLinePolygon Zz1 GeometryCollection ZzPoint Z + PointzPoint (0 0)zPoint Z + NonezPoint Z + LineString ZzPoint Z + LineStringzLineString (0 0, 1 1)c                 L   US:X  aO  US;   a  [         R                  " SU SU 35        [        S:  a  US:X  a  SnOUS:X  a  S	nOUS:X  a  SnOUS	:X  a  Sn0 nU/[        U5      -  US
'   [	        [        U5      5       Vs/ s H  n[        U5      PM     snUS'   [        R                  " U[        U5      SS9n	U SU 3-  n
US:X  a?  U	R                  U	R                  R                  5       U	R                  R                  -  )    n	U(       a>  [        U   [        ;   a-  [         R                  " [         SS9   [#        XUS9  S S S 5        g [#        XUS9  [%        U
5      nUS   U:X  d   e['        U
5      nUS:X  a  SUl        [+        X5        g s  snf ! , (       d  f       g = f)Nr   )r<  r  zext z doesn't support r<   r:  r8  r;  r9  
test_descridxr   r   rj  r  z0Mixed 2D and 3D coordinates are not supported byr   r   r  ry  )rQ   rR   r   rt   r#  r   r   r   r0   r  r   r  is_emptyr)   r&   r   r    r%   r   r$   r   r8   )rx   rb  rC  exp_geometry_typemixed_dimensionsr>  rI   column_datarD  r   r   r
  r  s                rH    test_write_geometry_z_types_autorI  .  s   l f} CCKK$se#45F4GHIg% !$77$2!"&66$/! !N2$7!"k1$4!K!+s3x 7K.3CHo>os#c(o>K
//+;
OCD,&H
f} gg))+cll.C.CCDEGCL,GG]]E
 CY?	

 	;XD $5555)J
k$
c.5 ?
 

 	s    F8F
F#z!on_invalid, message, expected_wkt))warnzyInvalid WKB: geometry is returned as None. IllegalArgumentException: Points of LinearRing do not form a closed linestringN)raisez4Points of LinearRing do not form a closed linestringN)r  NN)fixNzPOLYGON ((0 0, 0 1, 0 0))z.ignore:Non closed ring detected:RuntimeWarningc                    US:X  a!  [         (       d  [        R                  " S5        US:X  a.  [        R                  " [        R
                  R                  US9nOEUS:X  a  [        R                  " US9nO*US;   a  [        R                  " 5       nO[        SU 35      eSnU S	-  n[        US
5       nUR                  U5      n	S S S 5        U   [        UUUS9n
Uc  U
R                  R                  S   b   eO)U
R                  R                  S   R                   U:X  d   eS S S 5        g ! , (       d  f       Nn= f! , (       d  f       g = f)NrL  z.on_invalid=fix not available for Shapely < 2.1rK  r   rJ  )rL  r  zunknown value for on_invalid: a>  {
        "type": "FeatureCollection",
        "features": [
            {
                "type": "Feature",
                "properties": {},
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [ [ [0, 0], [0, 1] ] ]
                }
            }
        ]
    }r  rg   )rI   
on_invalidr   )r   rQ   rR   r   r  errorsGEOSExceptionr   rW  rX  r   rr   rs   r$   r   r   r>  )rx   rI   rN  r  expected_wktr^  invalid_geojsonr   fra   r|   s              rH   test_read_invalid_poly_ringrT    s'     U==DEW-- < <GL	v	,,W-	(	(((*9*FGG	O .(H	h	GGO$ 
 
!

 ;;##A&...;;##A&**l::: 
 
	 
s   4D.AD?.
D<?
Ec                     Sn[         R                  " SS/U-  0[        SS5      /U-  SS9nU S-  n[        X#5        [	        USS	9n[        XB5        g
)zTest reading a file where multiple chunks are used.

`ogr_read` reads features in chunks of features. Read a suffucient number of
featuers in this test so multiple chunks will be used.
i  r   r   rm   r   r   r   Fr   Nr   r   r7   r%   r$   r8   )rx   nb_featuresr|   	test_pathr   s        rH   test_read_multi_chunksrY    sc     K		#$1+,
B
 ;&IB" I7Ff)rJ   c                 P   U(       aX  [         R                  " S5        [         R                  " [        R                  R
                  5         [        U SS9  S S S 5        g [        U 5      nUR                  R                  R                  5       S/:X  d   eg ! , (       d  f       g = f)Nz5Shapely + GEOS 3.13 crashes in from_wkb for this caseTr   r{  )
rQ   rR   r   r  rO  rP  r$   r   r   rv   )multisurface_filerI   r|   s      rH   test_read_multisurfacer\    s{     	KL]]7>>778 ,= 98
 -. {{&&(^,<<<< 98s   B
B%c                 x   [        XS9n[        R                  " S/SS0/S.[        R                  " SS5      /SS9n[
        (       a"  U(       a  US	   R                  [        5      US	'   [        X#5        [        XS
S9n[        R                  " S/S/S.[        R                  " SS5      /SS9n[        X#5        g )Nr   Abottom_levelB)	top_levelintermediate_levelr   r   r   rb  r  )rI   FLATTEN_NESTED_ATTRIBUTES)ra  intermediate_level_bottom_level)	r$   r   r   r  r7   r   r   r#  r8   )nested_geojson_filerI   r|   r   s       rH   test_read_dataset_kwargsrf    s    	+	AB$2C#8"9	
 --1%&H {y *22F)G)N)Nv)V%&b+	E
B 03u	
 --1%&H b+rJ   c                 ~    [         R                  " [        SS9   [        XSS9  S S S 5        g ! , (       d  f       g = f)Nz$does not support open option INVALIDr   r  )rI   INVALID)rQ   r   r  r$   r  s     rH    test_read_invalid_dataset_kwargsri    s)    	n,R	S*O 
T	S	Sr  c           	         U S-  n[         R                  " / SQSS9[         R                  " / SQSS9[         R                  " / SQSS9[         R                  " / S	QS
S9[         R                  " / SQSS9S.n[        R                  " U[        R
                  " SS5      /S-  SS9n[        XBUS9  [        U5      nUR                  5       nUS   R                  S5      US'   US   R                  S5      US'   US   R                  S5      US'   US   R                  S5      US'   S UR                  S'   [        XV5        g )Nztest_nullable_dtypes.gpkgr  int64r  )rm   r   NInt64)g?Ng333333?Float32)TFNboolean)r  Nr  r+  )col1col2col3col4col5r   r=   r  r   r   rp  r#  rq  float32rr  rs  r   )rm   rs  )r   rH  r   r   r  r7   r%   r$   r  r   r  r8   )rx   rI   rt  r&  rs  ru  r   s          rH   test_write_nullable_dtypesru    s)   11D		)73		,g6		*)<		-Y?		*(;I W]]1a01A5<I Iy9%J ~~H'..y9HV'..y9HV'..y9HV'..u5HV"HLLj3rJ   metadata_type)dataset_metadatalayer_metadatametadatac                     SU0n[        U5      nU S-  n[        XV4SU0X$0D6  US:X  a  SOUn[        U5      U   U:X  d   eg )Nlevelr   rI   ry  rx  )r$   r%   r   )rx   r   rv  rI   ry  r|   r   metadata_keys           rH   test_metadata_ior}  9  s_    
 'H	+	,B+%HBSIS-9RS'4
'B#LX|,888rJ   rw  rx  ry  keyc                     [        U5      n[        R                  " [        SS9   [	        XPS-  4SU0X#0D6  S S S 5        g ! , (       d  f       g = f)Nzmust be a stringr   r   rI   r  )rx   r   rv  ry  rI   r|   s         rH   test_invalid_metadatar  J  sM     
+	,B	z);	<;&	
2;	
@M?X	
 
=	<	<s   A
Ac                 |    U S-  n[        [        U5      U4SU0USS00D6  US:X  a  SOUn[        U5      U   b   eg)zmetadata is silently ignoredr  rI   r~  r   ry  rx  N)r%   r$   r   )rx   r   rv  rI   r   r|  s         rH   test_metadata_unsupportedr  ^  sg    
 .(H*+  5'*
+	 (5
'B#LX|,444rJ   zArrowDtype requires pandas 1.5+c                 X   [         R                  " S5        U S-  n[        R                  " SSS/0[	        SS5      S /SS9n[        X!5        [        US	S
S 0S9n[        US   R                  [        R                  5      (       d   eUS   R                  S5      US'   [        X25        g )Npyarrowr   r   r   r   rm   r   r   Ttypes_mapperc                 .    [         R                  " U 5      $ rE   )r   
ArrowDtype)pa_dtypes    rH   r  2test_read_dataframe_arrow_dtypes.<locals>.<lambda>  s    R]]8-DrJ   )rI   arrow_to_pandas_kwargsr#  )rQ   importorskipr   r   r7   r%   r$   r   r   r   r  r   r8   )rx   r   r|   r   s       rH    test_read_dataframe_arrow_dtypesr  p  s     	"+%H		c
uQ{D&9{
B B!D 
F fUm))2==99995M((3F5Mf)rJ   )r=   r  r=   z+Arrow bool value bug fixed in GDAL >= 3.8.3c                     U SU 3-  n0 nUS:X  a  SUS'   [         R                  " / SQ[        SS5      /S-  S.S	S
9n[        XB40 UD6  [	        USS9n[        XTUS:g  S9  g )Nrj  r  Frz  TFTFTr   r  r,  r   r   ri  Tr   r   r  rV  )rx   rb  r   r   r|   r   s         rH   test_arrow_bool_roundtripr    sz     D,&HF
f}"'	5E!QK=STCTU
B
 B+F+H5FfcVmDrJ   c                 T   U SU 3-  n[         R                  " / SQ[        SS5      /S-  S.SS9n[        X25        US;   aL  [        R
                  " [        [        R                  " S	5      S
9   [        USS9  S S S 5        [        US/ S9  g [        USS9ng ! , (       d  f       N%= f)Nrj  r  r   r  r  r   ri  >   r  r   zLGDAL < 3.8.3 does not correctly read boolean data values using the Arrow APIr   Tr   r  )
r   r   r7   r%   rQ   r   RuntimeErrorrZ  r[  r$   )rx   rb  r   r|   ra   s        rH   test_arrow_bool_exceptionr    s     D,&H	5E!QK=STCTU
B
 B!
]])) 
 8t4
 	x4< 8t4
 
s   /B
B'c           	      R   SnSnU S-  n[         R                  " X"/S[        SS5      /0SS9n[        XCUS9  [	        US	S9nUc   e[        5          [        R                  " [        SS9   [	        US	S9nS
S
S
5        S
S
S
5        g
! , (       d  f       N= f! , (       d  f       g
= f)z9Test if arrow can be enabled via an environment variable.CP1252   ÿr   r   r   r   ri  rh   rd   N-non-UTF-8 encoding is not supported for Arrowr   )	r   r   r7   r%   r$   r[   rQ   r   r   )rx   ri   textrX  r|   r   ra   s          rH   +test_arrow_enable_with_environment_variabler    s     HD;&I	$
U1a[MB	TBBH5 I9F 
	]]M
 y8<A
 
	
 
 
	s$   B+B6B
B	B
B&
kml_driverKMLc                 P   U[        5       ;  a  [        R                  " U S35        [        R                  " SS/SS/SS/S.[        S	S	5      [        S
S
5      /SS9nU S-  n[        X4XS9  UR                  5       (       d   e[        U5      nXSR                     n[        XSSS9  g)a  Test writing a KML file.

A KML file is a bit of a special case, because when it is written, some extra
columns are added automatically in the layer definition: "Name" and "Description".
Because these extra columns are the first columns in the layer definition, it is
important to explicitly check the column index when writing values to fields as
you cannot rely on the index to be the same as the order fields were added to a
layer.

Test added when fixing https://github.com/geopandas/geopandas/issues/3609
z' driver not available in test_write_kmlr   r   r   r  r   r  )col_1col_2col_3r   rm   r   r   test.kml)r  rI   Fr  N)r   rQ   rR   r   r   r7   r%   rp  r$   ru   r8   )rx   r  rI   r|   r  r  s         rH   test_write_kmlr    s    $ 'zl"IJK	*SzS#JG1+uQ{+
B Z'KBJL{+I **%IieDrJ   z"ignore:File /vsimem:RuntimeWarningr  GeoJSONGPKGc                    [        U 5      n[        5       n[        X#USS9  [        UR	                  5       5      S:  d   e[        U5      n[        U5      [        U5      :X  d   eUS:H  n[        UUUSU(       + S9  [        SSS	9/ :X  d   eg )
Nrj  r  r   r   r  F)r1  r2  r  r4  	pyogrio_*pattern)r$   r	   r%   rt   	getbufferr8   r   )r   r  r|   bufferactualr6  s         rH   test_write_memoryr     s     
+	,BYFBvV<v!"Q&&&F#Fv;#b'!!!	!G
"K 
K8B>>>rJ   c                     [        U 5      n[        5       n[        R                  " [        SS9   [        UR                  S5      US SS9  S S S 5        [        SSS9/ :X  d   eg ! , (       d  f       N= f)	Nz2driver must be provided to write to in-memory filer   rm   rj  r  r4  r  r  )r$   r	   rQ   r   r   r%   r  r   r   r|   r  s      rH   !test_write_memory_driver_requiredr    se    	+	,BYF	B
 	
F4vF	
 
K8B>>>
 
   A$$
A2OpenFileGDBc                     [        U 5      n[        5       n[        R                  " [        SU 3S9   [        X#USS9  S S S 5        [        SSS9/ :X  d   eg ! , (       d  f       N= f)Nz/writing to in-memory file is not supported for r   rj  r  r4  r  r  )r$   r	   rQ   r   r   r%   r   r   r  r|   r  s       rH   $test_write_memory_unsupported_driverr  *  sb    	+	,BYF	KF8T
 	6@
 
K8B>>>
 
s   A
A%c           	          [        U 5      n[        5       n[        R                  " [        SS9   [        UR                  S5      X1SSS9  S S S 5        [        SSS	9/ :X  d   eg ! , (       d  f       N= f)
Nz+append is not supported for in-memory filesr   rm   rj  T)r  r   r   r4  r  r  r$   r	   rQ   r   NotImplementedErrorr%   r  r   r  s       rH   $test_write_memory_append_unsupportedr  9  sf    	+	,BYF	#P
 	
FPTU
 
K8B>>>
 
r  c                     [        U 5      n[        S5      n[        R                  " [        SS9   [        UR                  S5      USSS9  S S S 5        [        SS	S
9/ :X  d   eg ! , (       d  f       N= f)Ns   0000z5writing to existing in-memory object is not supportedr   rm   r  rj  r  r4  r  r  r  r  s      rH   &test_write_memory_existing_unsupportedr  H  sh    	+	,BWF	E
 	
F9FK	
 
K8B>>>
 
s   A%%
A3c                 n   [        U5      n[        R                  " [        SS9   [	        U S-  S5       n[        UR                  S5      U5        SSS5        SSS5        [        R                  " [        SS9   [        U S-  S5       nUR	                  SS5       n[        UR                  S5      U5        SSS5        SSS5        SSS5        [        S	S
S9/ :X  d   eg! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       NQ= f! , (       d  f       NZ= f! , (       d  f       Nc= f)zEVerify that writing to an open file handle is not currently supportedz3writing to an open file handle is not yet supportedr   r  wbrm   Nztest.geojson.ziprg   r4  r  r  )	r$   rQ   r   r  rr   r%   r  r   r   )rx   r   r|   rS  zs        rH   test_write_open_file_handler  V  s     
+	,B 
#X
 (^+T2aBGGAJ* 3
 
#X
 X 22C8A,
A. - 9
 
K8B>>> 32
 
 -, 98
 
s^   C3C"C3:D&
DD9DD&"
C0	,C33
D
DD
D#	D&&
D4gpkggeojsonc           	      `   Uu  p4U SU 3-  n[         R                  " XD/S[        SS5      /0SS9n[        XeUS9  [        R
                  " [        5         [        U5        SSS5        [        XSS9nUR                  S   U:X  d   eXt   R                  S   U:X  d   eg! , (       d  f       ND= f)au  Verify that we write non-UTF data to the data source

IMPORTANT: this may not be valid for the data source and will likely render
them unusable in other tools, but should successfully roundtrip unless we
disable writing using other encodings.

NOTE: FlatGeobuff driver cannot handle non-UTF data in GDAL >= 3.9

NOTE: pyarrow cannot handle non-UTF-8 characters in this way
test.r   r   r   ri  rh   N)
r   r   r7   r%   rQ   r   UnicodeDecodeErrorr$   ru   r  )rx   rb  encoded_textri   r  r  r|   r  s           rH   test_non_utf8_encoding_ior  n  s     "NHuSE]*K	$
U1a[MB	TBBh7 
)	*{# 
+ K;F>>!$$$<q!T))) 
+	*s   B
B-c           	      p   Uu  p4U SU 3-  n[         R                  " XD/S[        SS5      /0SS9n[        XeUS9  [        R
                  " [        5         [        U5        S S S 5        [        R
                  " [        SS9   [        XSS	S
9  S S S 5        g ! , (       d  f       N;= f! , (       d  f       g = f)Nr  r   r   r   ri  rh   r  r   Trl   )	r   r   r7   r%   rQ   r   r  r$   r   )rx   rb  r  ri   r  r  r|   s          rH   )test_non_utf8_encoding_io_arrow_exceptionr    s     "NHuSE]*K	$
U1a[MB	TBBh7 
)	*{# 
+ 
I
 	{F
 
 
+	*
 
s   BB'
B$'
B5c           	      (   Uu  p4U S-  n[         R                  " XD/S[        SS5      /0SS9n[        XeUS9  [	        XRS9nUR
                  S   U:X  d   eXt   R                  S   U:X  d   eUR                  S5      R                  5         UR                  U5      R                  S	5      nU(       a-  [        R                  " [        S
S9   [	        USS9  S S S 5        O6[	        USS9n	U	R
                  S   U:X  d   eX   R                  S   U:X  d   e[	        XSUS9nUR
                  S   U:X  d   eXt   R                  S   U:X  d   e[	        XRUS9nUR
                  S   U:X  d   eXt   R                  S   U:X  d   eg ! , (       d  f       N{= f)Nr  r   r   r   ri  rh   r   z.cpgz
ISO-8859-1zCThe file being read is not encoded in UTF-8; please use_arrow=Falser   TFrl   )rI   ENCODING)r   r   r7   r%   r$   ru   r  r  unlinkencodedecoderQ   r   r    )
rx   r  rI   ri   r  r  r|   r  miscodedbads
             rH   #test_non_utf8_encoding_io_shapefiler    s   !NHZ'K	$
U1a[MB	TBBh7
 K=F>>!$$$<q!T))) F#**, {{8$++L9H]]W
 ;$7	
 
 [E:{{1~)))}##A&(222 KiPF>>!$$$<q!T))) KxPF>>!$$$<q!T)))%
 
s   F
Fc                     [         R                  " [        SS9   [        U SSUS9  SSS5        g! , (       d  f       g= f)zZProviding both encoding parameter and ENCODING open option
(even if blank) is not allowed.z<cannot provide both encoding parameter and "ENCODING" optionr   CP936r   )ri   r  rI   Nr   r  s     rH   -test_encoding_read_option_collision_shapefiler    s9     
X
 	'B)	

 
 
s   0
>c           	          Uu  p#U S-  n[         R                  " X3/S[        SS5      /0SS9n[        R                  " [
        SS9   [        XTUSS	0S
9  SSS5        g! , (       d  f       g= f)zdProviding both encoding parameter and ENCODING layer creation option
(even if blank) is not allowed.r  r   r   r   ri  zKcannot provide both encoding parameter and "ENCODING" layer creation optionr   r  r   )ri   r  N)r   r   r7   rQ   r   r   r%   )rx   r  ri   r  r  r|   s         rH   4test_encoding_write_layer_option_collision_shapefiler    sp     "NHZ'K	$
U1a[MB	TB	
 	hz2>N	

 
 
s   A
A,c           	      j   SnU S-  nSn[         R                  " XDS[        SS5      /0SS9n[        XSUS9  [	        US	U S
U S3US9nUR
                  S   U:X  d   eXd   R                  S   U:X  d   e[	        US	U S
U S3UUS9nUR
                  S   U:X  d   eXd   R                  S   U:X  d   eg )Nr  r  u   中文r   r   r   ri  rh   zselect * from test where "z" = ''rK  )r^   ri   rI   )r   r   r7   r%   r$   ru   r  )rx   rI   ri   r  mandarinr|   r  s          rH   $test_non_utf8_encoding_shapefile_sqlr    s    HZ'KH		Z%1+7[
B Bh7)(6(1EF
 >>!(((""1%111)(6(1E	F >>!(((""1%111rJ   c                    [        SS5      [        SS5      [        SS5      /n[        R                  " USS9nU S	-  n[        X4S
SUS9  [	        XAS9n[
        R                  " UR                  R                  U5      (       d   eg )Nrw        (   r  <   r   r   r  	tmp_layerr  r   r  rI   r   	r7   r   r   r%   r$   r   r   r   r  )rx   rI   pointsr   r  gdf_ins         rH   $test_write_kml_file_coordinate_orderr    sz     BmU2r]E"bM:F
//6{
;CZ'KEY K=F>>&//00&9999rJ   z>LIBKML driver is not available and is needed to append to .kmlc           	         [        SS5      [        SS5      [        SS5      /n[        R                  " USS9nU S	-  n[        X4S
SUS9  [        SS5      [        SS5      [        SS5      /n[        R                  " USS9n[        UUS
SUSS9  [	        XASS9n[
        R                  " UR                  R                  X%-   5      (       d   eg)zAppend features to an existing KML file.

Appending is only supported by the LIBKML driver, and the driver isn't
included in the GDAL ubuntu-small images, so skip if not available.
rw  r  r  r  r  r  r   r   r  r  r  r  r  r  rV  rl  r/  T)r   r  rI   r   )rI   r   Nr  )rx   rI   r  r   r  points_append
gdf_appendgdf_in_appendeds           rH   test_write_kml_appendr    s     BmU2r]E"bM:F
//6{
;CZ'KEY 1a[%2,b">M-[IJ %[PTUO>>/22996;QRRRRrJ   c           
         [        SS5      [        SS5      [        SS5      /n[        R                  " USS9nU S	-  n[        UUS
SSUS9  [	        XAS9n[
        R                  " UR                  R                  U5      (       d   e[        SS5      [        SS5      [        SS5      /n[        R                  " USS9n[        UUS
SSUSS9  [	        XAS9n[
        R                  " UR                  R                  X&-   5      (       d   eg )Nrw  r  r  r  r  r  r   r   r  r  r  T)r   r  RFC7946rI   r   F   P   r   r<  n   x   )r   r  r  rI   r   r  )	rx   rI   r  r   r  r  r  r  r  s	            rH   &test_write_geojson_rfc7946_coordinatesr  =  s    BmU2r]E"bM:F
//6{
;C^+K K=F>>&//00&9999 2r]E"cNE#sODM-[IJ %[FO>>/22996;QRRRRrJ   c           
      d   U S-  nUR                  5         [        R                  " S/ SQ0[        S5       Vs/ s H  n[        R
                  " X35      PM     snSS9n[        XBSSUS	9  UR                  5       (       d   eUR                  5       (       d   e[        X!S
9n[        XE5        gs  snf )zTest to overwriting an existing corrupt OpenFileGDB.

Test added in context of https://github.com/geopandas/pyogrio/issues/598
ztest.gdbidr  r=   r   r   
test_layerr  r  r   N)mkdirr   r   r#  r  r7   r%   rp  is_dirr$   r8   )rx   rI   rX  r  r   r<  s         rH   (test_write_openfilegdb_overwrite_corruptr  b  s     :%IOO //	/4Qx8x!'--%x8C
 l=I
 i=Hc, 9s    B-
c           	          [         R                  " / SQ[        SS5      [        SS5      [        SS5      /S.SS9nU S-  n[        X#US	9  [	        X1S	9n[        XB5        g
)z=
Simple test verifying the Parquet driver works if available
r  r   rm   r   )r   r   r   ri  ztest.parquetr   NrV  )rx   rI   r   r  r   s        rH   test_parquet_driverr  }  s^     //aU1a[%1+'NOC ^+KC	:K=Ff*rJ   )rW  r   rW   rZ  r  r   r   r   r   r   decimalr   ior	   pathlibr
   zipfiler   numpyr   pyogrior   r   r   r   r   r   r   pyogrio._compatr   r   r   r   r   r   r   r   r   r   r   r   pyogrio.errorsr   r    r!   r"   pyogrio.geopandasr#   r$   r%   pyogrio.rawr&   r'   pyogrio.tests.conftestr(   r)   r*   r+   r,   r-   r.   r/   rQ   r;   r   pandasr   geopandas.arrayr0   pandas.api.typesr1   r2   r3   r4   r5   r6   r  shapely.geometryr7   geopandas.testingr8   pandas.testingr9   r:   ImportErrorr  dictr}  unionfixturerF   rI   rS   contextmanagerr[   rb   r  parametrizer}   skipifr   upperr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r%  r?  r  rQ  ra  rt  r  r  r  r  r  r6  fromisoformatr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r|  GeometryCollectionr  r  r  r"  rk  r   r%  r(  r*  r8  r;  r>  r@  rB  rI  rM  rQ  rS  rU  r[  r^  rh  rw  r  r  r  r#  r#  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r!  r'  r  r2  r7  rA  rI  rT  rY  r\  rf  ri  ru  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )rb  s   0rH   <module>r     s     	 	  > >           X W K K	 	 	 	(  &;   K   F	w$A$G$G	%! e,I 
T!56 J J  , , Wd*>?	55. 
!'')W45  9	92 
 $'7"dAUTU&W
"
" ')*#$  

/
")*	D O66V  
-	
-)-XX
 T2w$78$ 9$ u6p T2
M/J$KL. M.: %%(I  7 &7D %%R@ &R@j A %%+ &+ -t}=/%?6< @ >6<r  J6M JK-t}=/%?%%.. & @ > L..b  J6M JK-t}=/%?TU%%@G & V @ > L
@GF  J6M JK-t}=/%?A %%EA & @ > LEAP  J6M JK-t}=/%?A %%C. & @ > LC.L  T1aQ62T1aQ62FF	
 T1aQ6(9STCU:VWT1aQ62FF	
 %%O@  $.	 &($.N  J6M JK LL89LL45FF	
 ""#BC""#>?FF	
 -t}=/%?A %%W. & @ > L,W.t  J6M JK-t}=/%?%%1. & @ > L1.h %%%	%H &%HP
"0(
 "J" !:;T <T
 	!2&	UEN+	w'
/
/.. 
!Q02LL

 	tR	 5'*	S!S"	%u~6OO&(9:&(9:&(:;&(:;&(:;&(9:	 "	
 &&tR('++c1c2*FG "		
!4/54/&.. *bhhz.R!ST1 U1 K K 	!*O   $ 2s)4! 5!HS
 ,7"c3& 4 8&RR
	G9x
.?8 #L /HSwSH/#$  
2 2. G90E/F  2 22 Wd*BC	 * *F &
 %%8 &
8< )%%" & *"J <=u6G90D V0Dv0D VW%%2
 & X 7 >2
j %%
L &
L  S{<R ST	T

bhh


#
 	 %%O & UO0," %%/ &/. +uenq!f-EF)%%4 & * G4B 'AB%%4 & C46 k :;%%: & <:  %% &8 )%%0 & *0( 5$-8%%5 & 95: %%R &R& %%X &X. L	'8	'8	3Y?	TNI6	B	TN+^<	U^Y7C
 %%M &
M. 6 
y>"2I>	UI	'BIN	T9~y&A9M	T9~y&A9M	T>NI+F	R	T7^Y$?K	T9~&6G	%^Y$?K	$	N#3Y?	$	N#3Y?	$(8.I	$.!17;	$	N#3Y?		NI#>	J	y>9"=yI	y>9"=yI	~	'BIN	y>9"=yI%0 %%'M &12'MT A  %%
 &!"
, %%	Y &	Y  Nv<M NO%%@ & P@< %%H &H4  Nv<M NO	w}}Q"#	q!	d#	w}}Q1%&	t	 %%* & P* C %%'  &
',  AB%%M & CM,7( %%0 &0( 	rvv	gWt,	dAq	4a+T2T1a8<<8T1a8<<8	

 	
sc3Z&	WQZ $ 	*%%@; & +%(@;F %% & 	\956	&):N(KL	3nk5RS	&):N(KL@#%89	

 ^ "23	

 5&(>?	
* %%+ &+,+ ):	i):(;<	>53P2QR78		
 
>53P2QR!AB		
 #a		
 %"56		
 
It.?-OP	9e.?-FG$*,=>		
 #$&78		
M,/` %%2/ &a/ *d2/j '
 LM); N);X*,=" ,FP
 %%4 &42 G %%
9 &
9 +=?O*PQ	
A		
 %%
 & R
 +=?O*PQ%%5 & R5  $-NO* P*, y )V   )E * 
E( 	!*W   )5 * 
58 = =, %%%'89O66V  E	 : &ED @AIv#67? 8 B?2? $4m#DE? F? Iv#67? 8???0  34* 5*8  34G 5 G")*X	

(2: %%: &: %%LN"K  S	 &
SB %%!S &!SH %%- &-4 %%(I  + &+gq  		f !Kj !KP !K^ !KP !K` !KL 0l !WJ !Tn !Ov !Os   $6Ae ;	Ae
Ae
	Ae
Ae
	Ae
Ae
6	Ae
Ae
	Ae#
(Ae#
	Ae(
Ae(
)	Ae-6Ae-8	Ae2Ae2/	Ae7
<Ae7
D	Ae<
DAe<
E<	Af
F	Af
eAeeAe