
    HR-e(                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlZddlmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# dd
l$m%Z%m&Z& g Z'da(ddZ)d Z*d dZ+d Z,d Z-d Z.d Z/d!dZ0ej1        e0_         d Z2d Z3d Z4d Z5dZ6d"dZ7	 	 	 	 d#dddZ8ej9        e8_         d Z:dS )$zAn extensible ASCII table reader and writer.

ui.py:
  Provides the main user functions for reading and writing tables.

:Copyright: Smithsonian Astrophysical Observatory (2010)
:Author: Tom Aldcroft (aldcroft@head.cfa.harvard.edu)
    N)StringIO)Table)get_readable_fileobj)AstropyWarning)NOT_OVERWRITING_MSG   )basiccdscorecparserdaophotecsv	fastbasic
fixedwidthhtmlipaclatexmrtrst
sextractor)READ_KWARG_TYPESWRITE_KWARG_TYPEST順 c                 4    t           t                    s	  d           dd          d}t                     D ],\  }}|t          |          z  }||k    r d|dz              n-t          j                                        n# t          $ r Y nw xY wt           t                    r d|          t          j	        d t          j
        t          j        z            rdS t          j        d dd         t          j
                  r>t          j                            t          j                                                 rdS t          j	        d t          j
        t          j        z            rdS t!           fd	d
D                       rdS dS )zo
    Determine if ``table`` probably contains HTML content.  See PR #3693 and issue
    #3691 for context.
    r   Nr   z+( http[s]? | ftp | file ) :// .+ \.htm[l]?$Tz
\.htm[l]?$z\s* <! \s* DOCTYPE \s* HTMLc              3   z   K   | ]5}t          j        d | dt           j        t           j        z            V  6dS )z< \s* z [^>]* >N)research
IGNORECASEVERBOSE).0elementtables     3lib/python3.11/site-packages/astropy/io/ascii/ui.py	<genexpr>z!_probably_html.<locals>.<genexpr>b   sZ       
 
 I11115"-"*:TUU
 
 
 
 
 
    )r#   trtdF)
isinstancestr	enumeratelenoslinesepjoin	Exceptionr   matchr   r    r   pathexists
expanduserall)r#   maxcharssizeilines   `    r$   _probably_htmlr:   5   s   
 eS!! 	 !HH"1"IID$U++  4D		!(??!'AE'NEE # JOOE**EE 	 	 	D	 % ixi  8:MBJ&
 
 	
 4 9]E"##J>> 	27>>Gu%%D
 D
 	 4 82E2=2:;UVV 	4  
 
 
 
0
 
 
 
 
 	 45s   A/B 
BBc                 
    | a dS )z
    Set the default value of the ``guess`` parameter for read().

    Parameters
    ----------
    guess : bool
        New default ``guess`` value (e.g., True or False)

    N)_GUESS)guesss    r$   	set_guessr>   k   s     FFFr&   c                     | 4t          |          }|d         dk    rt          j        } nt          j        } t          j        | f||d|}|S )a  
    Initialize a table reader allowing for common customizations.  Most of the
    default behavior for various parameters is determined by the Reader class.

    Parameters
    ----------
    Reader : `~astropy.io.ascii.BaseReader`
        Reader class (DEPRECATED). Default is :class:`Basic`.
    Inputter : `~astropy.io.ascii.BaseInputter`
        Inputter class
    Outputter : `~astropy.io.ascii.BaseOutputter`
        Outputter class
    delimiter : str
        Column delimiter string
    comment : str
        Regular expression defining a comment line in table
    quotechar : str
        One-character string to quote fields containing special characters
    header_start : int
        Line index for the header line not counting comment or blank lines.
        A line with only whitespace is considered blank.
    data_start : int
        Line index for the start of data not counting comment or blank lines.
        A line with only whitespace is considered blank.
    data_end : int
        Line index for the end of data not counting comment or blank lines.
        This value can be negative to count from the end.
    converters : dict
        Dict of converters.
    data_Splitter : `~astropy.io.ascii.BaseSplitter`
        Splitter class to split data columns.
    header_Splitter : `~astropy.io.ascii.BaseSplitter`
        Splitter class to split header columns.
    names : list
        List of names corresponding to each data column.
    include_names : list, optional
        List of names to include in output.
    exclude_names : list
        List of names to exclude from output (applied after ``include_names``).
    fill_values : tuple, list of tuple
        Specification of fill values for bad or missing table values.
    fill_include_names : list
        List of names to include in fill_values.
    fill_exclude_names : list
        List of names to exclude from fill_values (applied after ``fill_include_names``).

    Returns
    -------
    reader : `~astropy.io.ascii.BaseReader` subclass
        ASCII format reader instance
    Nenableforce)Inputter	Outputter)_get_fast_reader_dictr   	FastBasicr	   Basicr   _get_reader)ReaderrB   rC   kwargsfast_readerreaders         r$   
get_readerrL   y   s]    l ~+F33x G++(FF[FfWx9WWPVWWFMr&   c                     | |t          d| d          | [| t          j        v rt          j        |          }n:t          d                    | t	          t          j                                      |S )NzCannot supply both format and z	 keywordsz(ASCII format {!r} not in allowed list {})
ValueErrorr   FORMAT_CLASSESformatsorted)rP   ReaderWriterlabels      r$   _get_format_classrT      s    l6J%JJJKKKT(((.v6LL:AAF4#677   
 r&   c                     t          j        |                     dd                    }t          |t                    r|                    dd           nd|i}|S )zpConvert 'fast_reader' key in kwargs into a dict if not already and make sure
    'enable' key is available.
    rJ   Tr@   rA   )copydeepcopygetr)   dict
setdefault)rI   rJ   s     r$   rD   rD      s\     -

=$ ? ?@@K+t$$ .x1111-r&   c           
      F   d | dk    rt           nt          }|                                D ]r\  }||vs||         }|  d| d| dt                     d}t	          |t
                    s|f}t          fd|D                       st          |          sdS )	z:Validate types of keyword arg inputs to read() or write().c                     |dk    r6t          | t                     ot          | t          j        j                  }n<t          | |          }|s*	  ||           }|| k    sJ 	 d}n# t
          $ r d}Y nw xY w|S )aU  Check if ``val`` is an instance of ``cls`` or "seems" like one:
        ``cls(val) == val`` does not raise and exception and is `True`. In
        this way you can pass in ``np.int16(2)`` and have that count as `int`.

        This has a special-case of ``cls`` being 'list-like', meaning it is
        an iterable but not a string.
        z	list-likeTF)r)   r*   collectionsabcIterabler0   )valclsoknew_vals       r$   is_ducktypez0_validate_read_write_kwargs.<locals>.is_ducktype   s     +S)))Wjko>V.W.WBBC%%B !c#hhG"c>>>>> BB !   BBB 	s   A' 'A65A6readNz() argument 'z' must be a z object, got z insteadc              3   0   K   | ]} |          V  d S N )r!   ra   rd   r`   s     r$   r%   z._validate_read_write_kwargs.<locals>.<genexpr>  s/      ::S;;sC((::::::r&   )r   r   itemstyper)   tupleany	TypeError)
read_writerI   kwarg_typesargtypeserr_msgrd   r`   s         @@r$   _validate_read_write_kwargsrs      s	     . '1F&:&:""@QKLLNN % %S k!!S[ C  7 7 7 77 7#'997 7 7 	 %'' 	HE:::::E::::: 	%G$$$	%%% %r&   c                    t          | t          t          t          j        f          r_t          | t                    od| v pd| v }|s@t          j                            |           }t          j                            |          r|} | S )N
)r)   r*   bytesr-   PathLiker2   r4   r3   )argumentis_str_dataex_users      r$   _expand_user_if_pathr|   	  s    (S%566 #
 !3// 
H0 0 	  	#g((22Gw~~g&& #"Or&   c                    d }t           d d = t          j        |          }t          di | t	          |          }||d<   |d         r"|                    d          rt          | fi |S d|vrdg|d<   d|v rd|d<   |                    d	          }t          j        |          }t          j        |          |d<   t          ||                    d
          d
          }|||d
<   |j        }d	|v r|d	= |t          }|rt          |           |d<   d|vr|                    d          }	 t          |           } t          | |          5 }	|	                                } d d d            n# 1 swxY w Y   t          j        d|           s| t           j        z   } |d         st          |           |d<   n# t$          $ r  t&          $ r Y nw xY wt)          | |||          }|d}|s|t+          di |}
|
j        }t          |           } |d         rFd| t,          j        v r4t          j        |          }t,          j        d|          |d
<   t+          di |}	 |                    |           }t                               t          j        |          |j        dd           n# t,          j        t6          j        t:          f$ r}|d         dk    rt-          j        d|j         d|           t+          di |}
|
                    |           }t                               t          j        |          |
j        dd           Y d }~n^d }~ww xY wt+          di |}
|
                    |           }t                               t          j        |          |
j        dd           |t?          d          |S )Nre   rJ   r@   
chunk_sizefill_values) 0rC   FrP   rH   
guess_htmlreadmeencodingr   z[\r\n]fast_z&Success with fast reader (no guessing)rI   rH   statusrA   zfast reader z exception: z>Success with slow reader after failing with fast (no guessing)z1Success with specified Reader class (no guessing)zPread() function failed due to code logic error, please report this bug on github)re   rh   ) _read_tracerV   rW   rs   rD   rX   _read_in_chunksrT   _format_namer<   r:   r|   r   re   r   r   r-   r.   rN   r0   _guessrL   r   FAST_CLASSESappend	__class__ParameterErrorr   CParserErrorUnicodeEncodeErrorInconsistentTableErrorRuntimeError)r#   r=   rI   datrJ   rP   
new_kwargsrH   r   fileobjrK   fast_kwargsfast_reader_rdrerrs                 r$   re   re     s    C 	AAA ]6""F11&111 (//K'F=8 0!>!> 0u/////F""!*} 	v %HZZ!!F v&&J M+66F= vvzz(';';XFFF%
8$ :x } - $2%#8#8
<  :%%zz*--HE,U33)%(CCC +w#LLNNE+ + + + + + + + + + + + + + + yE22 /!BJ.E
 ",/ E/=e/D/DJ|,#       * UJ<<;E 7>--*--F(F$U++
 x  -	%5V%5%59J%J%J-
33K$($56Ff6F6F$GK!(77;77O%**511"""&-"<"<"1";"J     #$"    x(G335S'@SScSS   $11j11kk%(("""&-
";";"("27	 	 	 	 	 	 	 	 	0  --*--F++e$$C"mJ77$.Q    {/
 
 	

 JsP   . F9 E/#F9 /E33F9 6E37F9 9GG$A
J0 0!MBMMc           
      n
   g }t          |          }|d         rF|Dd| t          j        v r3t          j        |          }t          j        d|          |d<   |g|z   }nd}g }|                    d          }|D ]R}|d         du rg|d         t          j                                        v rAt                              t          j        |          |d         j	        ddd	d
d           t|d         dk    rg|d         t          j                                        vrAt                              t          j        |          |d         j	        ddd	d
d           d}	|
                                D ]7\  }
}|
|vrt          j        |          ||
<   !|||
         k    r
||k    rd}	 n8|	s9||vr|                    |           Tt          |          dk    rdS t          j        t          t          t          t          j        t          j        t$          j        f}|D ]*}t)          j                    }	 d|vrd|d<   t+          d!i |}d|_        |                    |           }t                              t          j        |          |j	        dt)          j                    |z
  dz  d	d
d           |c S # |$ r}t                              t          j        |          |j	        j         dt3          |           t)          j                    |z
  dz  d	d
d           |                    |           Y d}~$d}~ww xY w	 t+          d!i |}|                    |           }t                              t          j        |          |j	        dd           |S # |$ r}t                              t          j        |          |j	        j         dt3          |           d           |                    |           dg}|D ]֊t5          d t5                    D                       }t7                              dt8          j                            }dt=          j        d|                               d          z   g}fd|D             }|!                    d |D                        |                    d"                    |                     g d}|!                    |           t          j        d "                    |                    dd}~ww xY w)"a1  
    Try to read the table using various sets of keyword args.  Start with the
    standard guess list and filter to make it unique and consistent with
    user-supplied read keyword args.  Finally, if none of those work then
    try the original user-supplied keyword args.

    Parameters
    ----------
    table : str, file-like, list
        Input table as a file name, file-like object, list of strings, or
        single newline-separated string.
    read_kwargs : dict
        Keyword arguments from user to be supplied to reader
    format : str
        Table format
    fast_reader : dict
        Options for the C engine fast reader.  See read() function for details.

    Returns
    -------
    dat : `~astropy.table.Table` or None
        Output table or None if only one guess format was available
    r@   Nr   rH   rJ   Fz/Disabled: reader only available in fast versiong        z.3fz ms)rI   rH   r   dtrA   z-Disabled: no fast version of reader availableTr   strict_nameszSuccess (guessing)i  : )rI   r   r   z<Success with original kwargs without strict_names (guessing)r   )rI   r   zC
ERROR: Unable to guess table format with the guesses listed below:c              3   "   K   | ]
}|d v|V  dS ))rH   rC   Nrh   )r!   xs     r$   r%   z_guess.<locals>.<genexpr>u  s6       % %:Q1Q1QA1Q1Q1Q1Q% %r&   zReader:z	\.(\w+)'>c              3   ,   K   | ]}||         fV  d S rg   rh   )r!   keyrI   s     r$   r%   z_guess.<locals>.<genexpr>z  s,       K K#vc{!3 K K K K K Kr&   c                 "    g | ]\  }}| d |S )r   rh   )r!   r   r`   s      r$   
<listcomp>z_guess.<locals>.<listcomp>{  s*    !R!R!RSS"3"3C"3"3!R!R!Rr&    )	r   H************************************************************************zH** ERROR: Unable to guess table format with the guesses listed above. **zH**                                                                    **zH** To figure out why the table did not read, use guess=False and      **zH** fast_reader=False, along with any appropriate arguments to read(). **zH** In particular specify the format and any known attributes like the **zH** delimiter.                                                         **r   ru   rh   )#_get_guess_kwargs_listr   r   rV   rW   rX   valuesr   r   r   ri   r,   r   rN   rm   AttributeErrorOptionalTableImportErrorr   r   r   timerL   guessingre   __name__r*   rQ   reprr	   rF   r   r   groupextendr/   )r#   read_kwargsrP   rJ   failed_kwargsfull_list_guessr   filtered_guess_kwargsguess_kwargsguess_kwargs_okr   r`   guess_exception_classest0rK   r   r   linessorted_keysreader_repr	keys_valskwargs_sortedmsgrI   s                          @r$   r   r     s   2 M -[99O 	H	F 111mK00 $ 12B&2B2B CH&-/9 //-00K' 17 17 !U**X&$*;*B*B*D*DDD"mL99*84>O ////	     !W,,X&d.?.F.F.H.HHH"mL99*84>M ////	    #))++ 	 	HC ,&&$(M#$6$6S!!S)))lk.I.I"' 	  444!((666  !!Q&&t 	#% . OJ OJY[[	/{**/3^,//,//F"FO++e$$C"mL99$.2"ikkB.$6????	    JJJ& 	/ 	/ 	/"mL99!$!7EE3s88EE"ikkB.$6????      ........	//	J..+..F++e$$C"mK88$.V	    J& !	J !	J !	J"mK88!$!7EE3s88EE      ---VE ( 2 2$ % %%f~~% % %   #6::h#D#DEE&<)M)M)S)STU)V)VVW	 K K K K{ K K K  !R!RM!R!R!RSSSSXXi001111
 
 
C LL-dii.>.>??TIC!	Js4   >BKM	A<MMAN, ,T42E=T//T4c                 p   g }|                      dd          r-|                    t          t          j                             |                    t          t
          j                             t          j        t          j
        t          j        t          j        t          j        t          j        t          j        t          j        t&          j        t*          j        t.          j        t2          j        t6          j        t:          j        t:          j        fD ]%}|                    t          |                     &t          j         t          j!        t          j        t          j        t          j"        t          j#        fD ]1}dD ],}dD ]'}|                    t          |||                     (-2|S )aS  Get the full list of reader keyword argument dicts.

    These are the basis for the format guessing process.
    The returned full list will then be:

    - Filtered to be consistent with user-supplied kwargs
    - Cleaned to have only unique entries
    - Used one by one to try reading the input table

    Note that the order of the guess list has been tuned over years of usage.
    Maintainers need to be very careful about any adjustments as the
    reasoning may not be immediately evident in all cases.

    This list can (and usually does) include duplicates.  This is a result
    of the order tuning, but these duplicates get removed later.

    Parameters
    ----------
    read_kwargs : dict
        User-supplied read keyword args

    Returns
    -------
    guess_kwargs_list : list
        List of read format keyword arg dicts
    r   N)rH   )|,r   z\s)"')rH   	delimiter	quotechar)$popr   rY   r   HTMLr   Ecsvr   FixedWidthTwoLiner   RSTr   rE   r	   rF   FastRdbRdbFastTabTabr
   Cdsr   Mrtr   Daophotr   
SExtractorr   Ipacr   LatexAASTexFastCommentedHeaderCommentedHeaderFastNoHeaderNoHeader)r   guess_kwargs_listrK   rH   r   r   s         r$   r   r     s   6  |T** 9  TY!7!7!7888 T333444 	$			 6 6" 	  V!4!4!45555
 	%   0 	 	I'  	!(()yQQQ   	 r&   c                    |d         }|                     d          }|                     dd          }d|d<   t          | |fi |}|r|S t          |          }|j        }d |                                D             d}|D ]}	||	j        z  }|	j                                        D ]\  }
}|
         |j        }}|j        j	        |v rA|j        j	        |vr3t          j        |                                |j        j	                  }nN|j        j	        |v r@|j        j	        |vr2t          j        |                                |j        j	                  }|rt          j        j        nt          j        } |||g          |
<   	fd	|j        D             |                    |j        |j        d
          }|S )z
    For fast_reader read the ``table`` in chunks and vstack to create
    a single table, OR return a generator of chunk tables.
    rJ   r~   chunk_generatorFparallelc                 L    i | ]!}|j         |j                                        "S rh   )namedatarV   )r!   cols     r$   
<dictcomp>z#_read_in_chunks.<locals>.<dictcomp>  s&    EEEc#(--//EEEr&   )SU)dtypec                      g | ]
}|         S rh   rh   )r!   r   out_colss     r$   r   z#_read_in_chunks.<locals>.<listcomp>  s    9994999r&   )namesmetarV   )r   _read_in_chunks_generatornextmaskeditercolscolumnsri   r   r   kindnparraytolistmaconcatenatecolnamesr   r   )r#   rI   rJ   r~   r   
tbl_chunkstbl0r   	str_kindstblr   r   col1col2r   outr   s                   @r$   r   r     s   
 'K..J!oo&7??O#K
*5*GGGGJ 
D[F FET]]__EEEHI 7 7#***,, 	7 	7ID# "$$Dz)++
y0P0PxTZ_EEEI--$*/2R2RxTZ_EEE 06I"%++2>K([$66HTNN#	7( :9994=999H
..TYU.
S
SCJr&   c              +   .  K   t           j        dd            }t          | t                    rd| v sd| v rt	          |           } |}n*t          | d          rt          | d          r|}nt          }d|d         d	<   d
}d
}d} || |                    d                    5 }	 |                    |          }	t          |	          |k     }
|
rt          j        d|	          snt          t          |	          dz
  dd          D ]}|
s|	|         dk    r nt          d          ||z   |	d|dz            z   }|	|dz   d         }t          |fddi|}|r|j                            d          }d}|V  |
rnddd           dS # 1 swxY w Y   dS )zk
    For fast_reader read the ``table`` in chunks and return a generator
    of tables for each chunk.
    Nc              3      K   | V  dS )zyStub for get_readable_fileobj, which does not seem to work in Py3
        for input file-like object, see #6460.
        Nrh   )r   r   s     r$   passthrough_fileobjz6_read_in_chunks_generator.<locals>.passthrough_fileobj  s      
 r&   ru   rv   re   seekTrJ   return_header_charsr   r   r   z\Sr   z1no newline found in chunk (chunk_size too small?)r=   F"__ascii_fast_reader_header_chars__rg   )
contextlibcontextmanagerr)   r*   r   hasattrr   rX   re   r,   r   r   rangerN   r   r   )r#   r~   rI   r   fileobj_contextheaderprev_chunk_charsfirst_chunkfhchunkfinal_chunkidxcomplete_chunkr   s                 r$   r   r     s`          % /45==DEMM-			 /GE6$:$: /- / 48F=/0FK	J)?)?	@	@	@ #B"	GGJ''Ee**z1K  29UE#:#:  SZZ!^R44 V V %*"4"4E #5 !!TUUU %'77537;KKN$S1WYY/ ~==U=f==C
  $&JKK#III E"	# # # # # # # # # # # # # # # # # #s   #CF

FF)r   commentr   formatsr   include_namesexclude_namesstrip_whitespacec                    | t           j        } d|vrd|d<   t          j        | |fi |}t	          |t           j        t          j        f          r8t	          |                    dd          t                    st          d          |S )aE  
    Initialize a table writer allowing for common customizations.  Most of the
    default behavior for various parameters is determined by the Writer class.

    Parameters
    ----------
    Writer : ``Writer``
        Writer class (DEPRECATED). Defaults to :class:`Basic`.
    delimiter : str
        Column delimiter string
    comment : str
        String defining a comment line in table
    quotechar : str
        One-character string to quote fields containing special characters
    formats : dict
        Dictionary of format specifiers or formatting functions
    strip_whitespace : bool
        Strip surrounding whitespace from column values.
    names : list
        List of names corresponding to each data column
    include_names : list
        List of names to include in output.
    exclude_names : list
        List of names to exclude from output (applied after ``include_names``)
    fast_writer : bool
        Whether to use the fast Cython writer.

    Returns
    -------
    writer : `~astropy.io.ascii.BaseReader` subclass
        ASCII format writer instance
    Nr  Tr  r   zfor the commented_header writer you must supply a string
value for the `comment` keyword.  In order to disable writing
table comments use `del t.meta['comments']` prior to writing.)r	   rF   r   _get_writerr)   r   r   r   rX   r*   rN   )Writerfast_writerrI   writers       r$   
get_writerr  a  s    B ~''%)!"fk<<V<<F &	(EF  
Ir22C88
 L
 
 	
 Mr&   F)	overwritec                   t          	 d|||d| t          |t          t          t          j        f          rat          j                            |          }|s@t          j                            |          r!t          t          j        |                    |t          j        }|                    d          }t          | t                    r|                     | |d          } nt          | |d          } | d d                                         }t%          j        ||                    d          |                    d          |                    d                     t)          |                    d	g                     t)          |j                  z
  }	|	r-t-          j        d
                    |	          t0                     | j        rd}t5          ||d          }t7          d||d|}
|
j        t$          j        v r|
                    | |           d S |
                    |           }t          j                             |          }tC          |d          s\tE          |dd          }|                    |           |                    t          j                   |#                                 d S |                    |           |                    t          j                   d S )Nwrite)rP   r  r  r   F)r   rV   r   r  r  r  zKThe key(s) {} specified in the formats argument do not match a column name.r  )r  r  wr   )newline)r  rh   )$rs   r)   r*   rw   r-   rx   r2   r4   lexistsOSErrorr   rP   sysstdoutrX   r   r   rV   r   _apply_include_exclude_namessetr   warningswarnr   has_mixin_columnsrT   r  r   r   r  r.   r/   r  openclose)r#   outputrP   r  r  r  rI   r   table0diff_format_with_namesr  r   outstrs                r$   r  r    s     K9 PV   &3r{344 >##F++ 	>RW__V44 	>-4V<<===~ JJwE% 6 U?? e5u5552A2Y^^F%

7

?##

?##	   !Ir!:!:;;c&/>R>RR 
V233	
 	
 	
  vvx88FIv;II&IIFd///UF###LLE Z__U##F67## !
 fc2...VRZ   VRZ     r&   c                  4    t          j        t                    S )a  
    Return a traceback of the attempted read formats for the last call to
    `~astropy.io.ascii.read` where guessing was enabled.  This is primarily for
    debugging.

    The return value is a list of dicts, where each dict includes the keyword
    args ``kwargs`` used in the read call and the returned ``status``.

    Returns
    -------
    trace : list of dict
        Ordered list of format guesses and status
    )rV   rW   r   rh   r&   r$   get_read_tracer1    s     =%%%r&   )r   )NNNrg   )NT)NNNT);__doc__r]   r  rV   r-   r   r#  r   r'  ior   numpyr   astropy.tabler   astropy.utils.datar   astropy.utils.exceptionsr   astropy.utils.miscr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   docsr   r   r   r<   r:   r>   rL   rT   rD   rs   r|   re   READ_DOCSTRINGr   r   r   r   extra_writer_parsr  r  WRITE_DOCSTRINGr1  rh   r&   r$   <module>r=     s             				 				 



                   3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2                                 6 5 5 5 5 5 5 5 
3 3 3 3l  ? ? ? ?D   	 	 	/% /% /%d  "a a a aH "IJ IJ IJXM M M`. . .bD D DN	 6 6 6 6v J! J! J! J! J! J!Z $& & & & &r&   