
    ǆic                    F   S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	  SSK
JrJrJrJrJrJrJrJrJr  SS	KJr  SS
KJrJr  SSKJr  SSKJrJr  SSKJ r   SSK!J"r"J#r#  SSK$J%r%  SSK&J'r'  \(       a  SSK(J)r)  SSK*J+r+  \S\S\4   4   r, \S\,4   r-\" S\S   S9r. S+   S,S jjr/S-S jr0  S.         S/S jjr1S0S jr2S1S jr3 S2     S3S jjr4S4S jr5 " S  S!\\.   5      r6 " S" S#\6S$   5      r7 " S% S&\6S   5      r8 " S' S(\%5      r9 " S) S*\%5      r:g)5a<  
Load setuptools configuration from ``setup.cfg`` files.

**API will be made private in the future**

To read project metadata, consider using
``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
For simple scenarios, you can also try parsing the file directly
with the help of ``configparser``.
    )annotationsN)defaultdict)partialwraps)	TYPE_CHECKINGCallableAnyDictGenericIterableTupleTypeVarUnion   )StrPath)	FileErrorOptionError)default_environment)InvalidRequirementRequirement)SpecifierSet)InvalidVersionVersion)SetuptoolsDeprecationWarning   )expand)DistributionMetadataDistributionstrTarget)r    r   )boundc                |    SSK Jn  U" 5       nU(       a  UR                  5       O/ n[        X@XR5      n[	        U5      $ )a  Read given configuration file and returns options from it as a dict.

:param str|unicode filepath: Path to configuration file
    to get options from.

:param bool find_others: Whether to search for other configuration files
    which could be on in various places.

:param bool ignore_option_errors: Whether to silently ignore
    options, values of which could not be resolved (e.g. due to exceptions
    in directives such as file:, attr:, etc.).
    If False exceptions are propagated as expected.

:rtype: dict
r   r   )setuptools.distr    find_config_files_applyconfiguration_to_dict)filepathfind_othersignore_option_errorsr    dist	filenameshandlerss          j/home/dmtnaga/Documents/work/airagagent/rag_env/lib/python3.13/site-packages/setuptools/config/setupcfg.pyread_configurationr0   8   s7    $ ->D,7&&(RIdiFH **    r    c                <    [        X5        U R                  5         U $ )zXApply the configuration from a ``setup.cfg`` file into an existing
distribution object.
)r'   _finalize_requires)r,   r)   s     r/   apply_configurationr4   R   s     4Kr1   c                   SSK Jn  [        R                  R	                  U5      n[        R                  R                  U5      (       d  [        SU S35      e[        R                  " 5       n[        R                  " [        R                  R                  U5      5        / UQUPn UR                  XS9  [        X R                  US9nU R                  5         [        R                  " U5        U$ ! [        R                  " U5        f = f)zHRead configuration from ``filepath`` and applies to the ``dist`` object.r   )_DistributionzConfiguration file z does not exist.)r-   )r+   )r%   r6   ospathabspathisfiler   getcwdchdirdirnameparse_config_filesparse_configurationcommand_options_finalize_license_files)r,   r)   other_filesr+   r6   current_directoryr-   r.   s           r/   r'   r'   [   s     .wwx(H77>>(##-hZ7GHII		HHRWW__X&'(+(x(I$(((C&&&=Q
 	$$&
"#O 	"#s   (3C3 3Dc                h    SU 3n[         R                  " [        X5      n[        XU5      nU" 5       $ )z
Given a target object and option key, get that option from
the target object, either through a get_{key} method or
from an attribute directly.
get_)	functoolsr   getattr)
target_objkeygetter_nameby_attributegetters        r/   _get_optionrM   y   s4     ,K$$Wj>LZl;F8Or1   c                    [        [        5      nU  H=  nUR                   H*  n[        UR                  U5      nXAUR
                     U'   M,     M?     U$ )zReturns configuration data gathered by given handlers as a dict.

:param list[ConfigHandler] handlers: Handlers list,
    usually from parse_configuration()

:rtype: dict
)r   dictset_optionsrM   rH   section_prefix)r.   config_dicthandleroptionvalues        r/   r(   r(      sU     $D)K))F 2 2F;E:?../7 * 
 r1   c           	        [         R                  " U 5       n[        U UUU5      nUR                  5         U R                  (       d  UR                  U l        [        U R                  UUUU R                  U R                  5      nUR                  5         U R                  R                  UR                  UR                  5        SSS5        XT4$ ! , (       d  f       WW4$ = f)a  Performs additional parsing of configuration options
for a distribution.

Returns a list of used option handlers.

:param Distribution distribution:
:param dict command_options:
:param bool ignore_option_errors: Whether to silently ignore
    options, values of which could not be resolved (e.g. due to exceptions
    in directives such as file:, attr:, etc.).
    If False exceptions are propagated as expected.
:rtype: list
N)
r   EnsurePackagesDiscoveredConfigOptionsHandlerparsepackage_dirConfigMetadataHandlermetadatasrc_root_referenced_filesupdate)distributionr@   r+   ensure_discoveredoptionsmetas         r/   r?   r?      s    $ 
	(	(	6:K& 	
 	'''.':':L$$!! $$!!
 	

&&--%%t'='=	
+ 
72 =3 
7	62 =s   B/C
C"c                x  ^ SU;   d  [        T5      S:w  a  g[        5       R                  5       n [        TS   5      nUR                  U;   a  [
        R                  U TS   S9  gg! [         aG  n[        U4S jU 5       5      (       a#  [
        R                  U TS   S9n[        U5      Ue SnAgSnAff = f)a=  Because users sometimes misinterpret this configuration:

[options.extras_require]
foo = bar;python_version<"4"

It looks like one requirement with an environment marker
but because there is no newline, it's parsed as two requirements
with a semicolon as separator.

Therefore, if:
    * input string does not contain a newline AND
    * parsed result contains two requirements AND
    * parsing of the two parts from the result ("<first>;<second>")
    leads in a valid Requirement with a valid marker
a UserWarning is shown to inform the user about the possible problem.

r   Nr   )fieldreqc              3  L   >#    U  H  nTS    R                  U5      v   M     g7f)r   N)
startswith).0markerparseds     r/   	<genexpr>8_warn_accidental_env_marker_misconfig.<locals>.<genexpr>   s#     B'vay##F++'s   !$)
len
marker_envkeysr   name_AmbiguousMarkeremitr   anymessage)label
orig_valuerl   markersrg   exmsgs     `    r/   %_warn_accidental_env_marker_misconfigr|      s    " zS[A-l!G2&)$88w!!6!9!=  2B'BBB"**F1I*FC$S)r1 C2s   5A( (
B92=B44B9c                     \ rS rSr% SrS\S'    0 rS\S'          SS jr\SS j5       r	\
S	 5       rS
 r\SS j5       r\S 5       r\S 5       r\S 5       rSS jrSS jr\S 5       r\S 5       r\SS j5       rS rSS jrS rSrg)ConfigHandler   z1Handles metadata supplied in configuration files.r!   rQ   zdict[str, str]aliasesc                    X0l         Xl        [        U R                  U5      5      U l        / U l        X@l        [        5       U l        g N)	r+   rH   rO   _section_optionssectionsrP   ra   setr^   )selfrH   rb   r+   ra   s        r/   __init__ConfigHandler.__init__   sC     %9!$T227;<&(!2+.5	r1   c              #     #    UR                  5        HA  u  p#UR                  U R                  5      u  pEnU(       a  M,  UR                  S5      U4v   MC     g 7f)N.)items	partitionrQ   lstrip)clsrb   	full_namerU   preseprr   s          r/   r   ConfigHandler._section_options  sL      'I&001C1CDNCd++c"E))	 !0s   AAc                F    [        SU R                  R                  -  5      e).Metadata item name to parser function mapping.z!%s must provide .parsers property)NotImplementedError	__class____name__)r   s    r/   parsersConfigHandler.parsers  s#     "/$..2I2II
 	
r1   c                   U R                   nU R                  R                  X5      n [        X15      nU(       a  g  U R                  R                  US 5      " U5      n[        R                  " UR                  U5      n[        USU-  U5      nU" U5        U R                  R                  U5        g ! [         a  n[        U5      UeS nAff = f! [        4U R                  -   a     g f = f)Nc                    U $ r    )xs    r/   <lambda>+ConfigHandler.__setitem__.<locals>.<lambda>%  s    Qr1   zset_%s)rH   r   getrG   AttributeErrorKeyErrorr   	Exceptionr+   rF   r   __setattr__rP   append)	r   option_namerU   rH   current_valueerl   simple_settersetters	            r/   __setitem__ConfigHandler.__setitem__  s    __
 ll&&{@	/#J<M 	\\%%k;?FF "))**@*@+NX%;]Kv,!  	/;'Q.	/ |d777 		s(   B5 #C 5
C?CCC.-C.c                    [        U[        5      (       a  U$ SU;   a  UR                  5       nOUR                  U5      nU Vs/ s H)  o3R	                  5       (       d  M  UR	                  5       PM+     sn$ s  snf )zRepresents value as a list.

Value is split either by separator (defaults to comma) or by lines.

:param value:
:param separator: List items separator character.
:rtype: list
re   )
isinstancelist
splitlinessplitstrip)r   rU   	separatorchunks       r/   _parse_listConfigHandler._parse_list/  s_     eT""L5=$$&EKK	*E+0B5%KKM5BBBs   A7 A7c                    Sn0 nU R                  U5       HJ  nUR                  U5      u  pVnXb:w  a  [        SU 35      eUR                  5       X5R                  5       '   ML     U$ )z8Represents value as a dict.

:param value:
:rtype: dict
=z&Unable to parse option value to dict: )r   r   r   r   )r   rU   r   resultlinerI   r   vals           r/   _parse_dictConfigHandler._parse_dictC  sg     	OOE*D NN95MCc!$J5'"RSS"%))+F99;	 + r1   c                ,    UR                  5       nUS;   $ )z9Represents value as boolean.

:param value:
:rtype: bool
)1trueyes)lowerr   rU   s     r/   _parse_boolConfigHandler._parse_boolT  s     ,,,r1   c                   ^ U4S jnU$ )zReturns a parser function to make sure field inputs
are not files.

Parses a value after getting the key so error messages are
more informative.

:param key:
:rtype: callable
c                l   > SnU R                  U5      (       a  [        SR                  T5      5      eU $ )Nfile:zCOnly strings are accepted for the {0} field, files are not accepted)ri   
ValueErrorformat)rU   exclude_directiverI   s     r/   parser3ConfigHandler._exclude_files_parser.<locals>.parserj  s=     ' 122 --3VC[  Lr1   r   )r   rI   r   s    ` r/   _exclude_files_parser#ConfigHandler._exclude_files_parser^  s    	 r1   c                H   Sn[        U[        5      (       d  U$ UR                  U5      (       d  U$ U[        U5      S nUR	                  S5       Vs/ s H  oUR                  5       PM     nnU R                  R                  U5        [        R                  " Xb5      $ s  snf )a  Represents value as a string, allowing including text
from nearest files using `file:` directive.

Directive is sandboxed and won't reach anything outside
directory with setup.py.

Examples:
    file: README.rst, CHANGELOG.md, src/file.txt

:param str value:
:rtype: str
r   N,)
r   r!   ri   ro   r   r   r^   r_   r   
read_files)r   rU   root_dirinclude_directivespecr8   	filepathss          r/   _parse_fileConfigHandler._parse_fileu  s     $%%%L 122LS*+-..2jjo>odZZ\o	>%%i0  55 ?s   Bc                    SnUR                  U5      (       d  U$ UR                  US5      nUR                  U R                  R                  5        [
        R                  " XRU5      $ )zRepresents value as a module attribute.

Examples:
    attr: package.attr
    attr: package.module.attr

:param str value:
:rtype: str
zattr: )ri   replacer_   ra   rZ   r   	read_attr)r   rU   rZ   r   attr_directive	attr_descs         r/   _parse_attrConfigHandler._parse_attr  s^     !//LMM."5	 	411==>	AAr1   c                   ^ U4S jnU$ )zReturns parser function to represents value as a list.

Parses a value applying given methods one after another.

:param parse_methods:
:rtype: callable
c                .   > U nT H  nU" U5      nM     U$ r   r   )rU   rl   methodparse_methodss      r/   rY   1ConfigHandler._get_parser_compound.<locals>.parse  s"    F' ( Mr1   r   )r   r   rY   s    ` r/   _get_parser_compound"ConfigHandler._get_parser_compound  s    	 r1   c                V    0 nUR                  5        H  u  nu  pVU" XF5      X4'   M     U$ )zParses section options into a dictionary.

Applies a given parser to each option in a section.

:param dict section_options:
:param callable values_parser: function with 2 args corresponding to key, value
:rtype: dict
)r   )r   section_optionsvalues_parserrU   rI   _r   s          r/   _parse_section_to_dict_with_key-ConfigHandler._parse_section_to_dict_with_key  s3     ,224MC!&s0EJ 5r1   Nc                F   ^ T(       a  U4S jOS nU R                  X5      $ )zParses section options into a dictionary.

Optionally applies a given parser to each value.

:param dict section_options:
:param callable values_parser: function with 1 arg corresponding to option value
:rtype: dict
c                   > T" U5      $ r   r   )r   vr   s     r/   r   6ConfigHandler._parse_section_to_dict.<locals>.<lambda>  s
    }Q/r1   c                    U$ r   r   )r   r   s     r/   r   r     s    UVr1   r   )r   r   r   r   s     ` r/   _parse_section_to_dict$ConfigHandler._parse_section_to_dict  s!     5B/22?KKr1   c                    UR                  5        H/  u  nu  p4[        R                  " [        5         X@U'   SSS5        M1     g! , (       d  f       MC  = f)zAParses configuration file section.

:param dict section_options:
N)r   
contextlibsuppressr   )r   r   rr   r   rU   s        r/   parse_sectionConfigHandler.parse_section  sB    
 !0 5 5 7D*1$$X."T
 /. !8..s   A
A	c                    U R                   R                  5        HZ  u  pSnU(       a  SU-  n[        U SU-  R                  SS5      S5      nUc  [	        SU R
                   SU S35      eU" U5        M\     g)	zDParses configuration file items from one
or more related sections.

r   z_%szparse_section%sr   __Nz*Unsupported distribution option section: [])r   r   rG   r   r   rQ   )r   section_namer   method_postfixsection_parser_methods        r/   rY   ConfigHandler.parse  s    
 .2]]-@-@-B)LN!&!55<"^3<<S$G	6! %,!++,Al^1> 
 "/2% .Cr1   c                8   ^^^ [        T5      UUU4S j5       nU$ )zthis function will wrap around parameters that are deprecated

:param msg: deprecation message
:param func: function to be wrapped around
c                 h   > TR                  SS5        [        R                  " ST40 TD6  T" U 0 UD6$ )N
stacklevelr   z Deprecated config in `setup.cfg`)
setdefault_DeprecatedConfigrt   )argskwargsfunckwr{   s     r/   config_handler@ConfigHandler._deprecated_config_handler.<locals>.config_handler  s7    MM,*""#EsQbQ(((r1   r   )r   r	  r{   r
  r  s    ``` r/   _deprecated_config_handler(ConfigHandler._deprecated_config_handler  s#     
t	) 
	)
 r1   )r^   ra   r+   r   rP   rH   )rH   r"   rb   AllCommandOptionsra   expand.EnsurePackagesDiscovered)rb   r  )r   )r   r   r   )returnNone)r   
__module____qualname____firstlineno____doc____annotations__r   r   classmethodr   propertyr   r   r   r   r   r   r   r   r   r   r   r   rY   r  __static_attributes__r   r1   r/   r~   r~      s   ;
 !G^  #
 ;" * * 
 
-4 C C&    - -  ,64B(  &   
L 
L#32r1   r~   c                     ^  \ rS rSrSrSSSSS.rSr S	\R                  4           SU 4S
 jjjr	\
S 5       rS rSrU =r$ )r[   i  r\   urldescriptionclassifiers	platforms)	home_pagesummary
classifierplatformFNc                >   > [         TU ]  XX45        XPl        X`l        g r   )superr   rZ   r   )r   rH   rb   r+   ra   rZ   r   r   s          r/   r   ConfigMetadataHandler.__init__  s      	.BV& r1   c                    U R                   n[        U R                  U R                  S9nU R                  nU R
                  nUUUUU R                  X!5      U" S5      UUUU R                  US.$ )r   r   license)r  keywordsprovides	obsoletesr  r)  license_filesr  long_descriptionversionproject_urls)r   r   r   r   r   r   r   _parse_version)r   
parse_list
parse_file
parse_dictexclude_files_parsers        r/   r   ConfigMetadataHandler.parsers#  s     %%
T--F
%%
#99 $""#44ZL+I6'% ***&
 	
r1   c                :   U R                  XR                  5      nX!:w  a  UR                  5       n [        U5        U$ [        R                  " U R                  XR                  U R                  5      5      $ ! [         a  n[        SU SU 35      UeSnAff = f)z;Parses `version` option value.

:param value:
:rtype: str

zVersion loaded from z does not comply with PEP 440: N)
r   r   r   r   r   r   r   r/  r   rZ   )r   rU   r/  r   s       r/   r1  $ConfigMetadataHandler._parse_version9  s     ""5--8mmoG  N~~d..u6F6FVWW " !*5' 2,,396 s   A9 9
BBBrZ   r   )rH   r   rb   r  r+   boolra   r  rZ   zdict | Noner   r   )r   r  r  r  rQ   r   strict_moder7   curdirr   r  r   r1  r  __classcell__r   s   @r/   r[   r[     s    N  #	G K $(II!(! #! #	!
 ;! !! ! ! 
 
*X Xr1   r[   r   c                     ^  \ rS rSrSr        SU 4S jjr\S 5       rS rSS jr	\
S 5       rS rS	 rS
 rS rS rS rS rS rS rSrU =r$ )rX   iS  rb   c                V   > [         TU ]  XX45        UR                  U l        0 U l        g r   )r%  r   r]   r   rZ   )r   rH   rb   r+   ra   r   s        r/   r   ConfigOptionsHandler.__init__V  s*     	.BV"+++-r1   c                "    U R                  USS9$ )N;)r   )r   r   s     r/   _parse_list_semicolon*ConfigOptionsHandler._parse_list_semicolona  s    u44r1   c                4    U R                  XR                  S9$ )Nr(  )r   r   )r   rU   s     r/   _parse_file_in_root(ConfigOptionsHandler._parse_file_in_roote  s    >>r1   c                    U R                  U R                  U5      5      n[        XU5        U Vs/ s H  oDR                  S5      (       a  M  UPM     sn$ s  snf )N#)rD  rG  r|   ri   )r   rw   rU   rl   r   s        r/   _parse_requirements_list-ConfigOptionsHandler._parse_requirements_listh  sJ    ++D,D,DU,KL-eFC "(Ds/CDDDs   AAc                &   U R                   nU R                  nU R                  nU R                  nUUUUUUU R	                  US5      [        U R                  S5      U R                  U R                  U R                  U R                  U[        US.$ )r   zeThe namespace_packages parameter is deprecated, consider using implicit namespaces instead (PEP 420).install_requires)zip_safeinclude_package_datarZ   scriptseager_resourcesdependency_linksnamespace_packagesrN  setup_requirestests_requirepackagesentry_points
py_modulespython_requirescmdclass)r   r   r   _parse_cmdclassr  r   rK  rD  _parse_packagesrG  r   )r   r2  
parse_boolr4  parse_cmdclasss        r/   r   ConfigOptionsHandler.parsersp  s     %%
%%
%%
-- #$.%!) *"&"A"AH# !(--/A! #88!77,, 44$+&-
 	
r1   c                    U R                   R                  n[        R                  " U R	                  U5      X R
                  5      $ r   )ra   rZ   r   r[  r   r   )r   rU   rZ   s      r/   r\  $ConfigOptionsHandler._parse_cmdclass  s3    ,,88t//6]]SSr1   c                ,   SS/nUR                  5       nX2;  a  U R                  U5      $ U R                  U R                  R	                  S0 5      5      nUR                  X2S   :H  U R                  U R                  S9  [        R                  " S0 UD6$ )z<Parses `packages` option value.

:param value:
:rtype: list
zfind:zfind_namespace:zpackages.findr   )
namespacesr   fill_package_dirr   )
r   r   parse_section_packages__findr   r   r_   r   rZ   r   find_packages)r   rU   find_directivestrimmed_valuefind_kwargss        r/   r]  $ConfigOptionsHandler._parse_packages  s     #$56/##E** 77MMor2
 	%);;]]!-- 	 	
 ##2k22r1   c                   U R                  XR                  5      n/ SQn[        UR                  5        VVs/ s H  u  pEXC;   d  M  U(       d  M  XE4PM     snn5      nUR	                  S5      nUb  US   US'   U$ s  snnf )zParses `packages.find` configuration file section.

To be used in conjunction with _parse_packages().

:param dict section_options:
)whereincludeexcluderm  r   )r   r   rO   r   r   )r   r   section_data
valid_keyskr   rj  rm  s           r/   rf  1ConfigOptionsHandler.parse_section_packages__find  s     22?DTDTU4
+113
3tqqF1FQF3
  (#(8K 
s   A=
A=
A=
c                B    U R                  XR                  5      nX S'   g)zPParses `entry_points` configuration file section.

:param dict section_options:
rX  N)r   r   r   r   rl   s      r/   parse_section_entry_points/ConfigOptionsHandler.parse_section_entry_points  s"    
 ,,_>N>NO%^r1   c                d    U R                  XR                  5      n[        R                  " U5      $ r   )r   r   r   canonic_package_data)r   r   package_datas      r/   _parse_package_data(ConfigOptionsHandler._parse_package_data  s)    22?DTDTU**<88r1   c                ,    U R                  U5      U S'   g)zPParses `package_data` configuration file section.

:param dict section_options:
rz  Nr{  r   r   s     r/   parse_section_package_data/ConfigOptionsHandler.parse_section_package_data  s    
  $77H^r1   c                ,    U R                  U5      U S'   g)zXParses `exclude_package_data` configuration file section.

:param dict section_options:
exclude_package_dataNr~  r  s     r/   "parse_section_exclude_package_data7ConfigOptionsHandler.parse_section_exclude_package_data  s    
 (,'?'?'P#$r1   c                <   ^  T R                  UU 4S j5      nUT S'   g)zRParses `extras_require` configuration file section.

:param dict section_options:
c                0   > TR                  SU  S3U5      $ )Nzextras_require[r   )rK  )rr  r   r   s     r/   r   CConfigOptionsHandler.parse_section_extras_require.<locals>.<lambda>  s    6617MqQr1   extras_requireNr   ru  s   `  r/   parse_section_extras_require1ConfigOptionsHandler.parse_section_extras_require  s(    
 55Q

 "(r1   c                    U R                  XR                  5      n[        R                  " X R                  5      U S'   g)zNParses `data_files` configuration file section.

:param dict section_options:

data_filesN)r   r   r   canonic_data_filesr   ru  s      r/   parse_section_data_files-ConfigOptionsHandler.parse_section_data_files  s3    
 ,,_>N>NO#66v}}M\r1   r9  )rH   r    rb   r  r+   r:  ra   r  )rw   r!   rU   r!   )r   r  r  r  rQ   r   r  rD  rG  rK  r  r   r\  r]  rf  rv  r{  r  r  r  r  r  r=  r>  s   @r/   rX   rX   S  s    N	. 	. #	. #		.
 ;	. 5 5?E 
 
@T32*&9IQ
(N Nr1   rX   c                  0    \ rS rSrSrSrSr\S 5       rSr	g)rs   i  zAmbiguous requirement marker.z
    One of the parsed requirements in `{field}` looks like a valid environment marker:

        {req!r}

    Please make sure that the configuration file is correct.
    You can use dangling lines to avoid this problem.
    z'userguide/declarative_config.html#opt-2c                j    SU R                    3nU R                  U R                  U R                  X!S9$ )Nz%https://setuptools.pypa.io/en/latest/)see_urlformat_args)	_SEE_DOCS_format_SUMMARY_DETAILS)r   r
  docss      r/   rv   _AmbiguousMarker.message   s/    6s}}oF{{3<<t{TTr1   r   N)
r   r  r  r  r  r  r  r  rv   r  r   r1   r/   rs   rs     s+    .HH :I U Ur1   rs   c                      \ rS rSrSrSrg)r  i  z!userguide/declarative_config.htmlr   N)r   r  r  r  r  r  r   r1   r/   r  r    s    3Ir1   r  )FF)r)   r   r  rO   )r,   r    r)   r   r  r    )r   F)
r,   r    r)   r   rB   zIterable[StrPath]r+   r:  r  tuple[ConfigHandler, ...])rH   r"   rI   r!   )r.   r  r  rO   )F)r`   r    r@   r  r  z2tuple[ConfigMetadataHandler, ConfigOptionsHandler])rw   r!   rx   r!   rl   r   );r  
__future__r   r   rF   r7   collectionsr   r   r   typingr   r	   r
   r   r   r   r   r   r   _pathr   errorsr   r   extern.packaging.markersr   rp   extern.packaging.requirementsr   r   extern.packaging.specifiersr   extern.packaging.versionr   r   warningsr   r   r   distutils.distr   r%   r    SingleCommandOptionsr  r"   r0   r4   r'   rM   r(   r?   r|   r~   r[   rX   rs   r  r   r1   r/   <module>r     s  	 #   	 #  
 
 
  + H K 6 > 3 3,E5#445 
  445 	'M!N	O @E++	+4 &(!&	
 # 	
 <	* ++&+ 8	+\2@^GFO ^B	JXM*@A JXZ\N=8 \N~U3 U(44 4r1   