a „oeÜ ã @s dZddlZddlZddlZddlZddlmZmZmZddl m Z Gdd„deƒZ e ee dœd d „Z e ¡e ee d œd d „ƒZe ee dœdd„Zedk�rddlZe ¡Ze d¡sÄJdƒ‚edeƒedeejƒƒeddd�ee dde dd¡d¡ƒD]Zeedd��qdS)z�PEP 656 support. This module implements logic to detect if the currently running Python is linked against musl, and what musl version is used. éN)ÚIteratorÚ NamedTupleÚOptionalé)ÚELFFilec@seZdZUeed<eed<dS)Ú _MuslVersionÚmajorÚminorN)Ú__name__Ú __module__Ú __qualname__ÚintÚ__annotations__©rrúKC:\Program Files\Certbot\pkgs\pkg_resources\_vendor\packaging\_musllinux.pyrs r)ÚoutputÚreturncCsxdd„dd„| ¡DƒDƒ}t|ƒdks<|ddd…dkr@dSt d |d ¡}|sXdStt| d ¡ƒt| d¡ƒd �S) NcSsg|] }|r|‘qSrr©Ú.0ÚnrrrÚ óz'_parse_musl_version..css|]}| ¡VqdS)N)ÚstriprrrrÚ rz&_parse_musl_version..éréÚmuslzVersion (\d+)\.(\d+)r)rr )Ú splitlinesÚlenÚreÚmatchrr Úgroup)rÚlinesÚmrrrÚ_parse_musl_versions r$)Ú executablerc Cs†z8t|dƒ�}t|ƒj}Wdƒn1s,0YWntttfyRYdS0|dusdd|vrhdStj|gtjdd�}t |j ƒS)a`Detect currently-running musl runtime version. This is done by checking the specified executable's dynamic linking information, and invoking the loader to parse its output for a version string. If the loader is musl, the output would be something like:: musl libc (x86_64) Version 1.2.2 Dynamic Program Loader ÚrbNrT)ÚstderrZuniversal_newlines) ÚopenrZ interpreterÚOSErrorÚ TypeErrorÚ ValueErrorÚ subprocessÚrunÚPIPEr$r')r%ÚfZldÚprocrrrÚ_get_musl_versions  ,r1)ÚarchrccsHttjƒ}|durdSt|jddƒD]}d|j›d|›d|›�Vq$dS)aTGenerate musllinux tags compatible to the current platform. :param arch: Should be the part of platform tag after the ``linux_`` prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a prerequisite for the current platform to be musllinux-compatible. :returns: An iterator of compatible musllinux tags. NéÿÿÿÿZ musllinux_Ú_)r1Úsysr%Úranger r)r2Zsys_muslr rrrÚ platform_tags6s r7Ú__main__zlinux-z not linuxzplat:zmusl:ztags:ú )Úendz[.-]r4ú-r3z )Ú__doc__Ú functoolsrr,r5ÚtypingrrrZ_elffilerrÚstrr$Ú lru_cacher1r7r Z sysconfigZ get_platformZplatÚ startswithÚprintr%ÚsubÚsplitÚtrrrrÚs(     "