§
    €zIf')  ã                   óÈ   — 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ej        Z	 G d„ de
¦  «        Z G d„ de
¦  «        Z G d„ de	¦  «        Z G d	„ d
e¦  «        Zdd„ZdS )zb
Fast cryptographic hash of Python objects, with a special case for fast
hashing of numpy arrays.
é    Nc                   ó   — e Zd ZdZd„ ZdS )Ú_ConsistentSetza Class used to ensure the hash of Sets is preserved
        whatever the order of its items.
    c                 ó¦   — 	 t          |¦  «        | _        d S # t          t          j        f$ r" t          d„ |D ¦   «         ¦  «        | _        Y d S w xY w)Nc              3   ó4   K  — | ]}t          |¦  «        V — Œd S ©N©Úhash)Ú.0Úes     úB/var/www/piapp/venv/lib/python3.11/site-packages/joblib/hashing.pyú	<genexpr>z*_ConsistentSet.__init__.<locals>.<genexpr>%   s(   è è € Ð$CÐ$C°¥T¨!¡W¤WÐ$CÐ$CÐ$CÐ$CÐ$CÐ$Có    )ÚsortedÚ	_sequenceÚ	TypeErrorÚdecimalÚInvalidOperation)ÚselfÚset_sequences     r   Ú__init__z_ConsistentSet.__init__   sj   € ð		Eõ
 $ LÑ1Ô1ˆDŒNˆNˆNøÝ�7Ô3Ð4ð 	Eð 	Eð 	Eõ $Ð$CÐ$C°lÐ$CÑ$CÔ$CÑDÔDˆDŒNˆNˆNˆNð	Eøøøs   ‚ ˜4AÁAN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   © r   r   r   r      s2   € € € € € ðð ðEð Eð Eð Eð Er   r   c                   ó   — e Zd ZdZd„ ZdS )Ú_MyHashz7 Class used to hash objects that won't normally pickle c                 ó   — || _         d S r   )Úargs)r   r    s     r   r   z_MyHash.__init__+   s   € ØˆŒ	ˆ	ˆ	r   Nr   r   r   r   r   r   (   s)   € € € € € ØAÐAðð ð ð ð r   r   c                   ó(  — e Zd ZdZdd„Zdd„Zd„ Zd„ Zdej	        fd	„Z
ej                             ¦   «         Ze
e ee¦  «        <   e
e ee¦  «        <   e
e ee¦  «        <   e
e eej        ¦  «        <   d
„ Zd„ Zee e e¦   «         ¦  «        <   dS )ÚHasherzW A subclass of pickler, to do cryptographic hashing, rather than
        pickling.
    Úmd5c                 ó°   — t          j        ¦   «         | _        d}t                               | | j        |¬¦  «         t          j        |¦  «        | _        d S )Né   )Úprotocol)ÚioÚBytesIOÚstreamÚPicklerr   ÚhashlibÚnewÚ_hash)r   Ú	hash_namer&   s      r   r   zHasher.__init__4   sH   € Ý”j‘l”lˆŒð ˆÝ×Ò˜˜tœ{°XÐÑ>Ô>Ð>å”[ Ñ+Ô+ˆŒ
ˆ
ˆ
r   Tc                 ó.  — 	 |                       |¦  «         n/# t          j        $ r}|xj        d|›d|›�fz  c_        ‚ d }~ww xY w| j                             ¦   «         }| j                             |¦  «         |r| j                             ¦   «         S d S )NzPicklingError while hashing z: )	ÚdumpÚpickleÚPicklingErrorr    r)   Úgetvaluer-   ÚupdateÚ	hexdigest)r   ÚobjÚreturn_digestr   Údumpss        r   r	   zHasher.hash=   s®   € ð	Ø�IŠI�c‰NŒNˆNˆNøÝÔ#ð 	ð 	ð 	ØˆFŒFˆF¸s¸s¸sÀAÀAÐFÐHÑHˆFŒFØøøøøð	øøøð ”×$Ò$Ñ&Ô&ˆØŒ
×Ò˜%Ñ Ô Ð Øð 	*Ø”:×'Ò'Ñ)Ô)Ð)ð	*ð 	*s   ‚ ˜A§?¿Ac                 óÀ  — t          |t          j        t          i j        ¦  «        f¦  «        r”t          |d¦  «        r|j        j        }n|j        }|j        }t          |¦  «        t          t          ¦  «        u rt          ||j        ¦  «        }n0|€t          ||¦  «        }n|j        j        }t          |||¦  «        }t                               | |¦  «         d S )NÚ__func__)Ú
isinstanceÚtypesÚ
MethodTypeÚtypeÚpopÚhasattrr:   r   Ú__self__r1   r   Ú	__class__r*   Úsave)r   r6   Ú	func_nameÚinstÚclss        r   rC   zHasher.saveH   sÇ   € Ý�c�EÔ,­d°2´6©l¬lÐ;Ñ<Ô<ð 	4õ �s˜JÑ'Ô'ð )ØœLÔ1�	�	àœL�	Ø”<ˆDÝ�D‰zŒz�T¥&™\œ\Ð)Ð)Ý˜i¨¬Ñ7Ô7��Ø�å˜i¨Ñ.Ô.��à”lÔ,�Ý˜i¨¨sÑ3Ô3�Ý�Š�T˜3ÑÔÐÐÐr   c                 óx   — t          |t          t          f¦  «        rd S t                               | |¦  «         d S r   )r;   ÚbytesÚstrr*   Úmemoize)r   r6   s     r   rJ   zHasher.memoize[   s9   € õ
 �c�E¥3˜<Ñ(Ô(ð 	ØˆFÝ�Š˜˜cÑ"Ô"Ð"Ð"Ð"r   Nc                 ó^  — t          ||¬¦  «        }|d= 	 t          j        | |fi |¤Ž d S # t          j        $ rr t          j        | |fi |¤Ž t          |dd ¦  «        }|dk    rA|}|€|j        }t          j        |         }t          ||¦  «        st          |||¦  «         Y d S Y d S Y d S w xY w)N)ÚnameÚpackrM   r   Ú__main__)Údictr*   Úsave_globalr1   r2   Úgetattrr   ÚsysÚmodulesr@   Úsetattr)r   r6   rL   rM   ÚkwargsÚmoduleÚmy_nameÚmods           r   rP   zHasher.save_globalf   sþ   € õ ˜4 dÐ+Ñ+Ô+ˆØ�6ˆNð	/ÝÔ  cÐ4Ð4¨VÐ4Ð4Ð4Ð4Ð4øÝÔ#ð 	/ð 	/ð 	/ÝÔ  cÐ4Ð4¨VÐ4Ð4Ð4Ý˜S ,°Ñ5Ô5ˆFØ˜Ò#Ð#Ø�Ø�?Ø!œl�GÝ”k &Ô)�Ý˜s GÑ,Ô,ð /õ ˜C ¨#Ñ.Ô.Ð.Ð.Ð.Ð.ð $Ð#Ð#ð
/ð /ð /ð	/øøøs   –+ «A7B,Â+B,c           
      ó  — 	 t                                | t          t          |¦  «        ¦  «        ¦  «         d S # t          $ rC t                                | t          t          d„ |D ¦   «         ¦  «        ¦  «        ¦  «         Y d S w xY w)Nc              3   ó>   K  — | ]\  }}t          |¦  «        |fV — Œd S r   r   )r
   ÚkÚvs      r   r   z)Hasher._batch_setitems.<locals>.<genexpr>�   sL   è è € ð 6Ið 6IÙ:>¸!¸Qõ 8<¸A±w´wÀ°lð 6Ið 6Ið 6Ið 6Ið 6Ið 6Ir   )r*   Ú_batch_setitemsÚiterr   r   )r   Úitemss     r   r]   zHasher._batch_setitems…   sÁ   € ð
	Kõ
 ×#Ò# D­$­v°e©}¬}Ñ*=Ô*=Ñ>Ô>Ð>Ð>Ð>øÝð 	Kð 	Kð 	Kõ ×#Ò# D­$­vð 6Ið 6IØBGð6Iñ 6Iô 6Iñ 0Iô 0Iñ +Jô +Jñ Kô Kð Kð Kð Kð Kð	Køøøs   ‚59 ¹A	BÂBc                 óV   — t                                | t          |¦  «        ¦  «         d S r   )r*   rC   r   )r   Ú	set_itemss     r   Úsave_setzHasher.save_set“   s$   € å�Š�T�>¨)Ñ4Ô4Ñ5Ô5Ð5Ð5Ð5r   )r#   )T)r   r   r   r   r   r	   rC   rJ   ÚstructrM   rP   r*   ÚdispatchÚcopyr>   ÚlenÚobjectr1   r0   r]   rb   Úsetr   r   r   r"   r"   /   s  € € € € € ðð ð,ð ,ð ,ð ,ð	*ð 	*ð 	*ð 	*ð ð  ð  ð&#ð #ð #ð %)¨v¬{ð /ð /ð /ð /ð* Ô×$Ò$Ñ&Ô&€Hà%€HˆTˆT�#‰YŒYÑà(€HˆTˆT�&‰\Œ\Ñà)€HˆTˆT�'‰]Œ]Ñà"-€HˆTˆT�&”+ÑÔÑðKð Kð Kð6ð 6ð 6ð %€HˆTˆT�#�#‘%”%‰[Œ[ÑÐÐr   r"   c                   ó    — e Zd ZdZdd„Zd„ ZdS )ÚNumpyHasherz7 Special case the hasher for when numpy is loaded.
    r#   Fc                 ó¶   — || _         t                               | |¬¦  «         ddl}|| _        t          |d¦  «        r|j        | _        dS t          | _        dS )a  
            Parameters
            ----------
            hash_name: string
                The hash algorithm to be used
            coerce_mmap: boolean
                Make no difference between np.memmap and np.ndarray
                objects.
        ©r.   r   NÚ	getbuffer)	Úcoerce_mmapr"   r   ÚnumpyÚnpr@   rm   Ú
_getbufferÚ
memoryview)r   r.   rn   rp   s       r   r   zNumpyHasher.__init__ž   s_   € ð 'ˆÔÝ�Š˜¨	ˆÑ2Ô2Ð2àÐÐÐØˆŒÝ�2�{Ñ#Ô#ð 	)Ø œlˆDŒOˆOˆOå(ˆDŒOˆOˆOr   c                 óN  — t          || j        j        ¦  «        rú|j        j        sî|j        dk    r|                     ¦   «         }n7|j        j        r|}n(|j        j	        r|j
        }n|                     ¦   «         }| j                             |                      |                     | j        j        ¦  «        ¦  «        ¦  «         | j        r't          || j        j        ¦  «        r| j        j        }n|j        }|d|j        |j        |j        ff}nut          || j        j        ¦  «        r[| j                             d                     d¦  «        ¦  «         | j                             t+          j        |¦  «        ¦  «         dS t.                               | |¦  «         dS )z¨ Subclass the save method, to hash ndarray subclass, rather
            than pickling them. Off course, this is a total abuse of
            the Pickler class.
        r   ÚHASHEDÚ_HASHED_DTYPEzutf-8N)r;   rp   ÚndarrayÚdtypeÚ	hasobjectÚshapeÚflattenÚflagsÚc_contiguousÚf_contiguousÚTr-   r4   rq   ÚviewÚuint8rn   ÚmemmaprB   ÚstridesÚencoder1   r8   r"   rC   )r   r6   Úobj_c_contiguousÚklasss       r   rC   zNumpyHasher.save²   s“  € õ
 �c˜4œ7œ?Ñ+Ô+ð 9	°C´IÔ4Gð 9	ð Œy˜BŠˆð $'§;¢;¡=¤=Ð Ð Ø”Ô'ð 1Ø#&Ð Ð Ø”Ô'ð 1Ø#&¤5Ð Ð ð
 $'§;¢;¡=¤=Ð ð ŒJ×ÒØ—’Ð 0× 5Ò 5°d´g´mÑ DÔ DÑEÔEñGô Gð Gð Ôð &¥J¨s°D´G´NÑ$CÔ$Cð &ð œœ��àœ�ð
 ˜8 S¤Y°´	¸3¼;ÐGÐHˆCˆCÝ˜˜TœWœ]Ñ+Ô+ð 	ð  ŒJ×Ò˜o×4Ò4°WÑ=Ô=Ñ>Ô>Ð>ØŒJ×Ò�fœl¨3Ñ/Ô/Ñ0Ô0Ð0ØˆFÝ�Š�D˜#ÑÔÐÐÐr   N©r#   F)r   r   r   r   r   rC   r   r   r   rj   rj   š   sA   € € € € € ðð ð)ð )ð )ð )ð(?ð ?ð ?ð ?ð ?r   rj   r#   Fc                 óÞ   — d}||vr#t          d                     ||¦  «        ¦  «        ‚dt          j        v rt	          ||¬¦  «        }nt          |¬¦  «        }|                     | ¦  «        S )aj   Quick calculation of a hash to identify uniquely Python objects
        containing numpy arrays.

        Parameters
        ----------
        hash_name: 'md5' or 'sha1'
            Hashing algorithm used. sha1 is supposedly safer, but md5 is
            faster.
        coerce_mmap: boolean
            Make no difference between np.memmap and np.ndarray
    )r#   Úsha1zAValid options for 'hash_name' are {}. Got hash_name={!r} instead.ro   )r.   rn   rl   )Ú
ValueErrorÚformatrR   rS   rj   r"   r	   )r6   r.   rn   Úvalid_hash_namesÚhashers        r   r	   r	   ô   s‚   € ð 'ÐØÐ(Ð(Ð(Ýð 7ç š&Ð!1°9Ñ=Ô=ñ?ô ?ð 	?ð •#”+ÐÐÝ y¸kÐJÑJÔJˆˆå )Ð,Ñ,Ô,ˆØ�;Š;�sÑÔÐr   r†   )r   r1   r+   rR   r<   rc   r'   r   Ú_Picklerr*   rg   r   r   r"   rj   r	   r   r   r   ú<module>rŽ      s9  ððð ð €€€Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø 	€	€	€	Ø €€€ð Œ/€ðEð Eð Eð Eð E�Vñ Eô Eð Eð$ð ð ð ð ˆfñ ô ð ðh%ð h%ð h%ð h%ð h%ˆWñ h%ô h%ð h%ðVWð Wð Wð Wð W�&ñ Wô Wð Wðtð ð ð ð ð r   