Ë
    Ã?Æi\  ã                  óÊ   — d Z ddlmZ ddlZddlZddl­ ddlmZ  edj                  «       «      Z
 edj                  «       «      Zdd„Zdd	„Zdd
„ZdZdd„Zddd„Zddd„Zy)u±  CURP (Clave Ãšnica de Registro de PoblaciÃ³n, Mexican personal ID).

The Clave Ãšnica de Registro de PoblaciÃ³n (Population Registry Code) is unique
identifier for both citizens and residents of Mexico. The is an 18-character
alphanumeric that contains certain letters from the person's name, their
gender and birth date and a check digit.

More information:

* https://en.wikipedia.org/wiki/CURP
* https://www.gob.mx/curp/

>>> validate('BOXW310820HNERXN09')
'BOXW310820HNERXN09'
>>> validate('BOXW310820HNERXN08')
Traceback (most recent call last):
    ...
InvalidChecksum: ...
>>> get_birth_date('BOXW310820HNERXN09')
datetime.date(1931, 8, 20)
>>> get_gender('BOXW310820HNERXN09')
'M'
é    )ÚannotationsN)Ú*)Úcleana®  
    BACA BAKA BUEI BUEY CACA CACO CAGA CAGO CAKA CAKO COGE COGI COJA COJE
    COJI COJO COLA CULO FALO FETO GETA GUEI GUEY JETA JOTO KACA KACO KAGA
    KAGO KAKA KAKO KOGE KOGI KOJA KOJE KOJI KOJO KOLA KULO LILO LOCA LOCO
    LOKA LOKO MAME MAMO MEAR MEAS MEON MIAR MION MOCO MOKO MULA MULO NACA
    NACO PEDA PEDO PENE PIPI PITO POPO PUTA PUTO QULO RATA ROBA ROBE ROBO
    RUIN SENO TETA VACA VAGA VAGO VAKA VUEI VUEY WUEI WUEY
zl
    AS BC BS CC CH CL CM CS DF DG GR GT HG JC MC MN MS NE NL NT OC PL QR QT
    SL SP SR TC TL TS VZ YN ZS
c                óR   — t        | d«      j                  «       j                  «       S )zmConvert the number to the minimal representation. This strips
    surrounding whitespace and separation dash.z-_ )r   ÚupperÚstrip©Únumbers    úU/var/www/html/myprovider/mon_projet_qr/lib/python3.12/site-packages/stdnum/mx/curp.pyÚcompactr   G   s#   € ô �˜Ó×%Ñ%Ó'×-Ñ-Ó/Ð/ó    c                ó  — t        | «      } t        | dd «      }t        | dd «      }t        | dd «      }| d   j                  «       r|dz  }n|dz  }	 t        j                  |||«      S # t
        $ r t        «       ‚w xY w)z?Split the date parts from the number and return the birth date.é   é   é   é
   é   il  iÐ  )r   ÚintÚisdigitÚdatetimeÚdateÚ
ValueErrorÚInvalidComponent)r
   ÚyearÚmonthÚdays       r   Úget_birth_dater   M   s�   € ä�V‹_€FÜˆv�a˜ˆ{Ó€DÜ��q˜�Ó€EÜ
ˆf�Q�rˆlÓ
€CØˆb�z×ÑÔØ�‰‰à�‰ˆð!Ü�}‰}˜T 5¨#Ó.Ð.øÜò !ÜÓ Ð ð!ús   ÁA, Á,B c                óP   — t        | «      } | d   dk(  ry| d   dk(  ryt        «       ‚)z,Get the gender (M/F) from the person's CURP.r   ÚHÚMÚF)r   r   r	   s    r   Ú
get_genderr"   ]   s2   € ä�V‹_€FØˆb�z�SÒØØ	�‰�sÒ	ØäÓ Ð r   z%0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZc                óf   — t        d„ t        | dd «      D «       «      }t        d|dz  z
  dz  «      S )zCalculate the check digit.c              3  óX   K  — | ]"  \  }}t         j                  |«      d |z
  z  –— Œ$ y­w)é   N)Ú	_alphabetÚindex)Ú.0ÚiÚcs      r   ú	<genexpr>z#calc_check_digit.<locals>.<genexpr>n   s&   è ø€ ÒQ±$°!°Q”	—‘ Ó" b¨1¡fÕ-ÑQùs   ‚(*Né   r   )ÚsumÚ	enumerateÚstr)r
   Úchecks     r   Úcalc_check_digitr1   l   s5   € äÑQ¼)ÀFÈ3ÈBÀKÓ:PÔQÓQ€EÜ��U˜R‘Z‘ 2Ñ%Ó&Ð&r   c                óF  — t        | «      } t        | «      dk7  r
t        «       ‚t        j                  d| «      s
t        «       ‚| dd t        v r
t        «       ‚t        | «       t        | «       | dd t        vr
t        «       ‚|r| d   t        | «      k7  r
t        «       ‚| S )z$Check if the number is a valid CURP.r%   z'^[A-Z]{4}[0-9]{6}[A-Z]{6}[0-9A-Z][0-9]$Nr   é   é   éÿÿÿÿ)r   ÚlenÚInvalidLengthÚreÚmatchÚInvalidFormatÚ_name_blacklistr   r   r"   Ú_valid_statesr1   ÚInvalidChecksum©r
   Úvalidate_check_digitss     r   Úvalidater@   r   s–   € ä�V‹_€FÜ
ˆ6ƒ{�bÒÜ‹oÐÜ�8‰8Ð=¸vÔFÜ‹oÐØˆbˆq€z”_Ñ$ÜÓ Ð Ü�6ÔÜˆvÔØˆb�€}œMÑ)ÜÓ Ð Ù ¨¡Ô/?ÀÓ/GÒ!GÜÓÐØ€Mr   c                óL   — 	 t        t        | |«      «      S # t        $ r Y yw xY w)z-Check if the number provided is a valid CURP.F)Úboolr@   ÚValidationErrorr>   s     r   Úis_validrD   „   s,   € ðÜ”H˜VÐ%:Ó;Ó<Ð<øÜò Ùðús   ‚ —	#¢#)r
   r/   Úreturnr/   )r
   r/   rE   zdatetime.date)T)r
   r/   r?   rB   rE   r/   )r
   r/   r?   rB   rE   rB   )Ú__doc__Ú
__future__r   r   r8   Ústdnum.exceptionsÚstdnum.utilr   ÚsetÚsplitr;   r<   r   r   r"   r&   r1   r@   rD   © r   r   ú<module>rM      st   ðñ*õ0 #ã Û 	ä Ý ñ ð ÷ 
�EƒGó€ñ ð ÷ 
�EƒGó€ó0ó!ó !ð 4€	ó'ôõ$r   