§
    �Ÿj>T  ã                  óÖ  — U d Z ddlm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
mZ ddlmZmZ ddlmZ ddlmZ 	 ddlZd	„ Zd
„ Z ej        ee¦  «          ej        de¦  «         n # e$ r 	 ddlmZ n# e$ r dZY nw xY wY nw xY wddlmZ ddlmZ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) ddl*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ej2        Z3d„ e3D ¦   «         Z4 G d„ d¦  «        Z5 G d„ de5¦  «        Z6 G d„ de5e+¦  «        Z7d„ Z8d„ Z9ed„ ¦   «         Z: G d„ de+¦  «        Z;dd dd!iid"fiZ<d#e=d$<   e< >                    e¦  «          G d%„ d e¦  «        Z?e?j@        ZAeBd&k    r eA¦   «          dS dS )'zUtilities for signing notebooksé    )ÚannotationsN)ÚOrderedDict)Úcontextmanager)ÚdatetimeÚtimezone)ÚHMAC)ÚPathc                ó*   — |                       ¦   «         S )z8Adapt datetime.datetime to timezone-naive ISO 8601 date.)Ú	isoformat©Úvals    úZ/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/nbformat/sign.pyÚadapt_datetime_isor      s   € à�}Š}‰ŒÐó    c                óN   — t          j        |                      ¦   «         ¦  «        S )z6Convert ISO 8601 datetime to datetime.datetime object.)r   ÚfromisoformatÚdecoder   s    r   Úconvert_datetimer      s   € åÔ% c§j¢j¡l¤lÑ3Ô3Ð3r   r   )Údbapi2)Úencodebytes)Ú
JupyterAppÚ
base_flags)
ÚAnyÚBoolÚBytesÚCallableÚEnumÚInstanceÚIntegerÚUnicodeÚdefaultÚobserve)ÚLoggingConfigurableÚMultipleInstanceErroré   )Ú
NO_CONVERTÚ__version__ÚreadÚreadsc                ó<   — g | ]}|                      d ¦  «        °|‘ŒS )Úshake_)Ú
startswith)Ú.0Úas     r   ú
<listcomp>r/   1   s)   € ÐFÐFÐF�A¨q¯|ª|¸HÑ/EÔ/EÐFˆaÐFÐFÐFr   c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚSignatureStorez!Base class for a signature store.c                ó   — t           ‚)zrImplement in subclass to store a signature.

        Should not raise if the signature is already stored.
        ©ÚNotImplementedError©ÚselfÚdigestÚ	algorithms      r   Ústore_signaturezSignatureStore.store_signature7   ó
   € õ
 "Ð!r   c                ó   — t           ‚)zImplement in subclass to check if a signature is known.

        Return True for a known signature, False for unknown.
        r3   r5   s      r   Úcheck_signaturezSignatureStore.check_signature>   r:   r   c                ó   — t           ‚)zoImplement in subclass to delete a signature.

        Should not raise if the signature is not stored.
        r3   r5   s      r   Úremove_signaturezSignatureStore.remove_signatureE   r:   r   c                ó   — dS )z¡Close any open connections this store may use.

        If the store maintains any open connections (e.g. to a database),
        they should be closed.
        N© ©r6   s    r   ÚclosezSignatureStore.closeL   s   € € € r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r9   r<   r>   rB   r@   r   r   r1   r1   4   sV   € € € € € Ø+Ð+ð"ð "ð "ð"ð "ð "ð"ð "ð "ðð ð ð ð r   r1   c                  ó4   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚMemorySignatureStorez/Non-persistent storage of signatures in memory.éÿÿ  c                ó,   — t          ¦   «         | _        dS )z$Initialize a memory signature store.N)r   ÚdatarA   s    r   Ú__init__zMemorySignatureStore.__init__Y   s   € õ  ‘M”MˆŒ	ˆ	ˆ	r   c                ó€   — ||f}| j                              |d¦  «         d| j         |<   |                      ¦   «          dS )zStore a signature.N)rK   ÚpopÚ_maybe_cull©r6   r7   r8   Úkeys       r   r9   z$MemorySignatureStore.store_signature_   sE   € à�yÐ!ˆàŒ	�Š�c˜4Ñ Ô Ð ØˆŒ	�#‰à×ÒÑÔÐÐÐr   c                óÈ   — t          | j        ¦  «        | j        k     rdS t          t          | j        ¦  «        dz  ¦  «        D ]}| j                             d¬¦  «         ŒdS )zDIf more than cache_size signatures are stored, delete the oldest 25%Né   F)Úlast)ÚlenrK   Ú
cache_sizeÚrangeÚpopitem)r6   Ú_s     r   rO   z MemorySignatureStore._maybe_cullh   sf   € åˆtŒy‰>Œ>˜DœOÒ+Ð+ØˆFå•s˜4œ9‘~”~¨Ñ*Ñ+Ô+ð 	*ð 	*ˆAØŒI×Ò 5ÐÑ)Ô)Ð)Ð)ð	*ð 	*r   c                óH   — ||f}|| j         v r| j         |= d| j         |<   dS dS )zCheck a signature.NTF)rK   rP   s       r   r<   z$MemorySignatureStore.check_signaturep   s7   € à�yÐ!ˆØ�$”)ÐÐà”	˜#�Ø!ˆDŒI�c‰NØ�4Øˆur   c                ó@   — | j                              ||fd¦  «         dS )zRemove a signature.N)rK   rN   r5   s      r   r>   z%MemorySignatureStore.remove_signaturez   s#   € àŒ	�Š�v˜yÐ)¨4Ñ0Ô0Ð0Ð0Ð0r   N)
rC   rD   rE   rF   rV   rL   r9   rO   r<   r>   r@   r   r   rH   rH   T   sj   € € € € € Ø9Ð9à€Jð"ð "ð "ðð ð ð*ð *ð *ðð ð ð1ð 1ð 1ð 1ð 1r   rH   c                  óŽ   ‡ — e Zd ZdZ edd¬¦  «                             d¬¦  «        Zˆ fd„Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Zd„ Zˆ xZS )ÚSQLiteSignatureStorez'Store signatures in an SQLite database.rI   z£The number of notebook signatures to cache.
        When the number of signatures exceeds this value,
        the oldest 25% of signatures will be culled.
        ©ÚhelpT©Úconfigc                ó|   •—  t          ¦   «         j        di |¤Ž || _        |                      |¦  «        | _        dS )z!Initialize a sql signature store.Nr@   )ÚsuperrL   Údb_fileÚ_connect_dbÚdb)r6   rd   ÚkwargsÚ	__class__s      €r   rL   zSQLiteSignatureStore.__init__‹   s@   ø€ à�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"ØˆŒØ×"Ò" 7Ñ+Ô+ˆŒˆˆr   c                óJ   — | j         �| j                              ¦   «          dS dS )zClose the db.N)rf   rB   rA   s    r   rB   zSQLiteSignatureStore.close‘   s%   € àŒ7ÐØŒG�MŠM‰OŒOˆOˆOˆOð Ðr   c                óò  — dt           j        t           j        z  i}d }	 t          j        |fi |¤Ž}|                      |¦  «         �n/# t           j        t           j        f$ �r |dk    �r|dz   }|�|                     ¦   «          | j         	                    d|¦  «         	 t          |¦  «                             |¦  «         t          j        |fi |¤Ž}|                      |¦  «         n…# t           j        t           j        t          f$ r` |�|                     ¦   «          | j         	                    d¦  «         d| _        t          j        di |¤Ž}|                      |¦  «         Y nw xY w‚ Y nw xY w|S )NÚdetect_typesú:memory:z.bakzøThe signatures database cannot be opened; maybe it is corrupted or encrypted. You may need to rerun your notebooks to ensure that they are trusted to run Javascript. The old signatures database has been renamed to %s and a new one has been created.zêFailed committing signatures database to disk. You may need to move the database file to a non-networked file system, using config option `NotebookNotary.db_file`. Using in-memory signatures database for the remainder of this session.)rl   )Úsqlite3ÚPARSE_DECLTYPESÚPARSE_COLNAMESÚconnectÚinit_dbÚDatabaseErrorÚOperationalErrorrB   ÚlogÚwarningr	   ÚrenameÚOSErrorrd   )r6   rd   rg   rf   Úold_db_locations        r   re   z SQLiteSignatureStore._connect_db–   s¬  € à�GÔ3µgÔ6LÑLð$
ˆð ˆð!	Ý” Ð3Ð3¨FÐ3Ð3ˆBØ�LŠL˜ÑÔÐÑøÝÔ%¥wÔ'?Ð@ð 	ñ 	ð 	Ø˜*Ò$Ñ$Ø")¨FÑ"2�Ø�>Ø—H’H‘J”J�JØ”× Ò ðmð $ñô ð ð%Ý˜‘M”M×(Ò(¨Ñ9Ô9Ð9Ý œ¨Ð;Ð;°FÐ;Ð;�BØ—L’L Ñ$Ô$Ð$Ð$øÝÔ-­wÔ/GÍÐQð %ð %ð %Ø�~ØŸš™
œ
˜
Ø”H×$Ò$ðañô ð ð $.�D”LÝ œÐ>Ð>°vÐ>Ð>�BØ—L’L Ñ$Ô$Ð$Ð$Ð$ð%øøøð øøð=	øøøð> ˆ	s8   Ÿ'A ÁAE4Â"A	C,Ã+E4Ã,A>E-Å*E4Å,E-Å-E4Å3E4c                ó‚   — |                      d¦  «         |                      d¦  «         |                     ¦   «          dS )zInitialize the db.a  
            CREATE TABLE IF NOT EXISTS nbsignatures
            (
                id integer PRIMARY KEY AUTOINCREMENT,
                algorithm text,
                signature text,
                path text,
                last_seen timestamp
            )zb
            CREATE INDEX IF NOT EXISTS algosig ON nbsignatures(algorithm, signature)
            N)ÚexecuteÚcommit)r6   rf   s     r   rq   zSQLiteSignatureStore.init_db¿   sM   € à
�
Š
ðñ
	
ô 
	
ð 
	
ð 	�
Š
ðñ	
ô 	
ð 	
ð
 	�	Š	‰Œˆˆˆr   c                ó  — | j         €dS |                      ||¦  «        s<| j                              d||t          j        t
          j        ¬¦  «        f¦  «         n;| j                              dt          j        t
          j        ¬¦  «        ||f¦  «         | j                              ¦   «          | j                              d¦  «                             ¦   «         \  }|| j	        k    r|  
                    ¦   «          dS dS )zStore a signature in the db.Nz}
                INSERT INTO nbsignatures (algorithm, signature, last_seen)
                VALUES (?, ?, ?)
                ©Útzz}UPDATE nbsignatures SET last_seen = ? WHERE
                algorithm = ? AND
                signature = ?;
                z!SELECT Count(*) FROM nbsignatures)rf   r<   rz   r   Únowr   Úutcr{   ÚfetchonerV   Úcull_db)r6   r7   r8   Úns       r   r9   z$SQLiteSignatureStore.store_signatureÓ   sû   € àŒ7ˆ?ØˆFØ×#Ò# F¨IÑ6Ô6ð 	ØŒG�OŠOðð ˜F¥H¤LµH´LÐ$AÑ$AÔ$AÐBñô ð ð ð ŒG�OŠOðõ ”¥¤Ð.Ñ.Ô.°	¸6ÐBñô ð ð 	Œ�ŠÑÔÐð Œw�ŠÐBÑCÔC×LÒLÑNÔN‰ˆØˆtŒÒÐØ�LŠL‰NŒNˆNˆNˆNð Ðr   c                ó&  — | j         €dS | j                              d||f¦  «                             ¦   «         }|€dS | j                              dt          j        t
          j        ¬¦  «        ||f¦  «         | j                              ¦   «          dS )z!Check a signature against the db.NFzgSELECT id FROM nbsignatures WHERE
            algorithm = ? AND
            signature = ?;
            zqUPDATE nbsignatures SET last_seen = ? WHERE
            algorithm = ? AND
            signature = ?;
            r}   T)rf   rz   r�   r   r   r   r€   r{   )r6   r7   r8   Úrs       r   r<   z$SQLiteSignatureStore.check_signatureî   s�   € àŒ7ˆ?Ø�5ØŒG�OŠOðð ˜Ðñ
ô 
÷ Š(‰*Œ*ð 	
ð ˆ9Ø�5ØŒ�Šðõ Œ\�Xœ\Ð*Ñ*Ô*¨I°vÐ>ñ	
ô 	
ð 	
ð 	Œ�ŠÑÔÐØˆtr   c                ór   — | j                              d||f¦  «         | j                              ¦   «          dS )zRemove a signature from the db.zlDELETE FROM nbsignatures WHERE
                algorithm = ? AND
                signature = ?;
            N)rf   rz   r{   r5   s      r   r>   z%SQLiteSignatureStore.remove_signature  sC   € àŒ�Šðð ˜Ðñ	
ô 	
ð 	
ð 	Œ�ŠÑÔÐÐÐr   c           	     ó„   — | j                              dt          t          d| j        z  ¦  «        d¦  «        f¦  «         dS )zHCull oldest 25% of the trusted signatures when the size limit is reachedzŒDELETE FROM nbsignatures WHERE id IN (
            SELECT id FROM nbsignatures ORDER BY last_seen DESC LIMIT -1 OFFSET ?
        );
        g      è?r%   N)rf   rz   ÚmaxÚintrV   rA   s    r   r‚   zSQLiteSignatureStore.cull_db  sJ   € àŒ�Šðõ •�T˜DœOÑ+Ñ,Ô,¨aÑ0Ô0Ð2ñ	
ô 	
ð 	
ð 	
ð 	
r   )rC   rD   rE   rF   r   ÚtagrV   rL   rB   re   rq   r9   r<   r>   r‚   Ú__classcell__©rh   s   @r   r]   r]      sÜ   ø€ € € € € Ø1Ð1ð �Øððñ ô ÷ 
‚c�€cÑÔð ð,ð ,ð ,ð ,ð ,ðð ð ð
'ð 'ð 'ðRð ð ð(ð ð ð6ð ð ð.
ð 
ð 
ð
ð 
ð 
ð 
ð 
ð 
ð 
r   r]   c              #  ó  K  — t          | t          ¦  «        r^t          | ¦  «        D ]L}| |         }t          |t          ¦  «        sJ ‚|                     ¦   «         V — t          |¦  «        E d{V —† ŒMdS t          | t          t          f¦  «        r| D ]}t          |¦  «        E d{V —† ŒdS t          | t          ¦  «        r|                      d¦  «        V — dS t          | ¦  «                             d¦  «        V — dS )zŸYield every item in a container as bytes

    Allows any JSONable object to be passed to an HMAC digester
    without having to serialize the whole thing.
    NÚutf8)Ú
isinstanceÚdictÚsortedÚstrÚencodeÚyield_everythingÚlistÚtuple)ÚobjrQ   ÚvalueÚelements       r   r”   r”     s7  è è € õ �#•tÑÔð &Ý˜#‘;”;ð 	/ð 	/ˆCØ˜”HˆEÝ˜c¥3Ñ'Ô'Ð'Ð'Ð'Ø—*’*‘,”,ÐÐÐÝ'¨Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð		/ð 	/õ
 
�C�$¥˜Ñ	'Ô	'ð &Øð 	1ð 	1ˆGÝ'¨Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð	1ð 	1å	�C�Ñ	Ô	ð &Ø�jŠj˜Ñ Ô Ð Ð Ð Ð Ð å�#‰hŒh�oŠo˜fÑ%Ô%Ð%Ð%Ð%Ð%Ð%r   c              #  óÀ   K  — | j         dk    r| d         D ]}|d         dk    r|V — ŒdS | j         dk    r&| d         D ]}|d         D ]}|d         dk    r|V — ŒŒdS dS )zSIterator that yields all cells in a notebook

    nbformat version independent
    rS   ÚcellsÚ	cell_typeÚcodeé   Ú
worksheetsN)Únbformat)ÚnbÚcellÚwss      r   Úyield_code_cellsr¤   1  s³   è è € ð
 
„{�aÒÐØ�w”Kð 	ð 	ˆDØ�KÔ  FÒ*Ð*Ø�
�
�
øð	ð 	ð 
Œ˜Ò	Ð	Ø�\Ô"ð 	ð 	ˆBØ˜7œð ð �Ø˜Ô$¨Ò.Ð.Ø�J�J�Jøðð 
Ð	ð	ð 	r   c              #  óŽ   K  — | d                               dd¦  «        }	 dV — |�|| d         d<   dS dS # |�|| d         d<   w xY w)z¡Context manager for operating on a notebook with its signature removed

    Used for excluding the previous signature when computing a notebook's signature.
    ÚmetadataÚ	signatureN)rN   )r¡   Úsave_signatures     r   Úsignature_removedr©   A  sq   è è € ð ˜
”^×'Ò'¨°TÑ:Ô:€Nð9ØˆˆˆàÐ%Ø*8ˆBˆzŒN˜;Ñ'Ð'Ð'ð &Ð%øˆ>Ð%Ø*8ˆBˆzŒN˜;Ñ'Ð8Ð8Ð8Ð8s	    5 µAc                  ó  ‡ — e Zd ZdZ ed¬¦  «                             d¬¦  «        Z ed¦  «        d„ ¦   «         Z e	d¬¦  «                             d¬¦  «        Z
 ed	¦  «        d
„ ¦   «         Z ed¬¦  «                             d¬¦  «        Z ed¦  «        d„ ¦   «         Z eedd¬¦  «                             d¬¦  «        Z ed¦  «        d„ ¦   «         Z e¦   «         Z ed¦  «        d„ ¦   «         Z ed¬¦  «                             d¬¦  «        Z ed¦  «        d„ ¦   «         Z ed¬¦  «                             d¬¦  «        Z ed¦  «        d„ ¦   «         Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd „ Z d!„ Z!d"„ Z"d#„ Z#ˆ xZ$S )$ÚNotebookNotaryz8A class for computing and verifying notebook signatures.z5The storage directory for notary secret and database.r^   Tr`   Údata_dirc                óÐ   — d }	 t          j        ¦   «         rt          j        ¦   «         }n# t          $ r Y nw xY w|€$t          ¦   «         }|                     g ¬¦  «         |j        S )N)Úargv)r   ÚinitializedÚinstancer$   Ú
initializer¬   )r6   Úapps     r   Ú_data_dir_defaultz NotebookNotary._data_dir_defaultV  sv   € àˆð	ÝÔ%Ñ'Ô'ð ,Ý Ô)Ñ+Ô+�øøÝ$ð 	ð 	ð 	ØˆDð	øøøàˆ;å‘,”,ˆCØ�NŠN ˆNÑ#Ô#Ð#ØŒ|Ðs   „&+ «
8·8zoA callable returning the storage backend for notebook signatures.
         The default uses an SQLite database.Ústore_factoryc                ó   ‡ — ˆ fd„}|S )Nc                 óŠ   •— t           €(‰ j                             d¦  «         t          ¦   «         S t	          ‰ j        ¦  «        S )Nz1Missing SQLite3, all notebooks will be untrusted!)rm   rt   ru   rH   r]   rd   rA   s   €r   Úfactoryz6NotebookNotary._store_factory_default.<locals>.factoryk  sC   ø€ ÝˆØ”× Ò ØGñô ð õ ,Ñ-Ô-Ð-Ý'¨¬Ñ5Ô5Ð5r   r@   )r6   r·   s   ` r   Ú_store_factory_defaultz%NotebookNotary._store_factory_defaulti  s#   ø€ ð	6ð 	6ð 	6ð 	6ð 	6ð ˆr   zÒThe sqlite file in which to store notebook signatures.
        By default, this will be in your Jupyter data directory.
        You can set it to ':memory:' to disable sqlite writing to the filesystem.
        rd   c                ó\   — | j         sdS t          t          | j         ¦  «        dz  ¦  «        S )Nrl   znbsignatures.db©r¬   r’   r	   rA   s    r   Ú_db_file_defaultzNotebookNotary._db_file_default|  s/   € àŒ}ð 	Ø�:Ý•4˜œÑ&Ô&Ð):Ñ:Ñ;Ô;Ð;r   Úsha256z-The hashing algorithm used to sign notebooks.)Údefault_valuer_   r8   c                óF   — t          t          |d         ¦  «        | _        d S )NÚnew)ÚgetattrÚhashlibÚ	digestmod)r6   Úchanges     r   Ú_algorithm_changedz!NotebookNotary._algorithm_changedˆ  s   € å ¥¨&°¬-Ñ8Ô8ˆŒˆˆr   rÂ   c                ó6   — t          t          | j        ¦  «        S )N)rÀ   rÁ   r8   rA   s    r   Ú_digestmod_defaultz!NotebookNotary._digestmod_defaultŽ  s   € å•w ¤Ñ/Ô/Ð/r   z(The file where the secret key is stored.Úsecret_filec                ó\   — | j         sdS t          t          | j         ¦  «        dz  ¦  «        S )NÚ Únotebook_secretrº   rA   s    r   Ú_secret_file_defaultz#NotebookNotary._secret_file_default”  s/   € àŒ}ð 	Ø�2Ý•4˜œÑ&Ô&Ð):Ñ:Ñ;Ô;Ð;r   z/The secret key with which notebooks are signed.Úsecretc                óh  — t          | j        ¦  «                             ¦   «         rUt          | j        ¦  «                             d¦  «        5 }|                     ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S t          t          j        d¦  «        ¦  «        }|                      |¦  «         |S )NÚrbé   )	r	   rÇ   ÚexistsÚopenr(   r   ÚosÚurandomÚ_write_secret_file)r6   ÚfrÌ   s      r   Ú_secret_defaultzNotebookNotary._secret_defaultœ  sà   € õ �Ô Ñ!Ô!×(Ò(Ñ*Ô*ð 	Ý�dÔ&Ñ'Ô'×,Ò,¨TÑ2Ô2ð  °aØ—v’v‘x”xð ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð  ð  õ !¥¤¨DÑ!1Ô!1Ñ2Ô2ˆFØ×#Ò# FÑ+Ô+Ð+ØˆMs   ÁA/Á/A3Á6A3c                ól   •—  t          ¦   «         j        di |¤Ž |                      ¦   «         | _        dS )zInitialize the notary.Nr@   )rc   rL   r´   Ústore)r6   rg   rh   s     €r   rL   zNotebookNotary.__init__§  s7   ø€ à�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"Ø×'Ò'Ñ)Ô)ˆŒ
ˆ
ˆ
r   c                ó   — | j                              d| j        ¦  «         t          | j        ¦  «                             d¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   	 t          | j        ¦  «                             d¦  «         n0# t          $ r# | j                              d| j        ¦  «         Y nw xY w|S )z!write my secret to my secret_filez"Writing notebook-signing key to %sÚwbNi€  zCould not set permissions on %s)	rt   ÚinforÇ   r	   rÑ   ÚwriteÚchmodrw   ru   )r6   rÌ   rÕ   s      r   rÔ   z!NotebookNotary._write_secret_file¬  s
  € àŒ�ŠÐ:¸DÔ<LÑMÔMÐMÝ�$Ô"Ñ#Ô#×(Ò(¨Ñ.Ô.ð 	°!Ø�GŠG�F‰OŒOˆOð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð	RÝ�Ô!Ñ"Ô"×(Ò(¨Ñ/Ô/Ð/Ð/øÝð 	Rð 	Rð 	RØŒH×ÒÐ>ÀÔ@PÑQÔQÐQÐQÐQð	Røøøàˆs$   ÁA*Á*A.Á1A.Á6'B Â*CÃ
Cc                óþ   — t          | j        | j        ¬¦  «        }t          |¦  «        5  t	          |¦  «        D ]}|                     |¦  «         Œ	 ddd¦  «         n# 1 swxY w Y   |                     ¦   «         S )zpCompute a notebook's signature

        by hashing the entire contents of the notebook via HMAC digest.
        )rÂ   N)r   rÌ   rÂ   r©   r”   ÚupdateÚ	hexdigest)r6   r¡   ÚhmacÚbs       r   Úcompute_signaturez NotebookNotary.compute_signature·  s¼   € õ
 �D”K¨4¬>Ð:Ñ:Ô:ˆå˜rÑ"Ô"ð 	ð 	å% bÑ)Ô)ð ð �Ø—’˜A‘”��ðð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 �~Š~ÑÔÐs   «(A Á A$Á'A$c                ó†   — |j         dk     rdS |                      |¦  «        }| j                             || j        ¦  «        S )aM  Check a notebook's stored signature

        If a signature is stored in the notebook's metadata,
        a new signature is computed and compared with the stored value.

        Returns True if the signature is found and matches, False otherwise.

        The following conditions must all be met for a notebook to be trusted:
        - a signature is stored in the form 'scheme:hexdigest'
        - the stored scheme matches the requested scheme
        - the requested scheme is available from hashlib
        - the computed hash from notebook_signature matches the stored hash
        rž   F)r    rã   rØ   r<   r8   ©r6   r¡   r§   s      r   r<   zNotebookNotary.check_signatureÅ  sA   € ð Œ;˜Š?ˆ?Ø�5Ø×*Ò*¨2Ñ.Ô.ˆ	ØŒz×)Ò)¨)°T´^ÑDÔDÐDr   c                óŠ   — |j         dk     rdS |                      |¦  «        }| j                             || j        ¦  «         dS )z¨Sign a notebook, indicating that its output is trusted on this machine

        Stores hash algorithm and hmac digest in a local database of trusted notebooks.
        rž   N)r    rã   rØ   r9   r8   rå   s      r   ÚsignzNotebookNotary.signØ  sG   € ð
 Œ;˜Š?ˆ?ØˆFØ×*Ò*¨2Ñ.Ô.ˆ	ØŒ
×"Ò" 9¨d¬nÑ=Ô=Ð=Ð=Ð=r   c                óp   — |                       |¦  «        }| j                             || j        ¦  «         dS )zvEnsure that a notebook is untrusted

        by removing its signature from the trusted database, if present.
        N)rã   rØ   r>   r8   rå   s      r   ÚunsignzNotebookNotary.unsignâ  s7   € ð
 ×*Ò*¨2Ñ.Ô.ˆ	ØŒ
×#Ò# I¨t¬~Ñ>Ô>Ð>Ð>Ð>r   c                óZ   — |j         dk     rdS t          |¦  «        D ]}||d         d<   ŒdS )aJ  Mark cells as trusted if the notebook's signature can be verified

        Sets ``cell.metadata.trusted = True | False`` on all code cells,
        depending on the *trusted* parameter. This will typically be the return
        value from ``self.check_signature(nb)``.

        This function is the inverse of check_cells
        rž   Nr¦   Útrusted)r    r¤   ©r6   r¡   rë   r¢   s       r   Ú
mark_cellszNotebookNotary.mark_cellsê  sG   € ð Œ;˜Š?ˆ?ØˆFå$ RÑ(Ô(ð 	2ð 	2ˆDØ*1ˆD�Ô˜YÑ'Ð'ð	2ð 	2r   c                óì   — |d                               dd¦  «        rdS |dk    r	ddg}h d£}nd	dg}h d
£}|d         D ]5}|d         }||v r't          |¦  «        }|                     |¦  «        r dS Œ6dS )a  Do we trust an individual cell?

        Return True if:

        - cell is explicitly trusted
        - cell has no potentially unsafe rich output

        If a cell has no output, or only simple print statements,
        it will always be trusted.
        r¦   rë   FTrS   Úexecute_resultÚdisplay_data>   r¦   Úoutput_typeÚexecution_countÚpyout>   r¦   rñ   Úprompt_numberÚoutputsrñ   )rN   ÚsetÚ
difference)r6   r¢   Únbformat_versionÚunsafe_output_typesÚ	safe_keysÚoutputrñ   Úoutput_keyss           r   Ú_check_cellzNotebookNotary._check_cellù  s¸   € ð �
Ô×Ò 	¨5Ñ1Ô1ð 	Ø�4ð ˜qÒ Ð Ø#3°^Ð"DÐØFÐFÐFˆIˆIà#*¨NÐ";ÐØDÐDÐDˆIà˜9”oð 	!ð 	!ˆFØ  Ô/ˆKØÐ1Ð1Ð1å! &™kœk�Ø×)Ò)¨)Ñ4Ô4ð !Ø ˜5˜5øàˆtr   c                ó‚   — |j         dk     rdS d}t          |¦  «        D ]}|                      ||j         ¦  «        sd}Œ |S )a  Return whether all code cells are trusted.

        A cell is trusted if the 'trusted' field in its metadata is truthy, or
        if it has no potentially unsafe outputs.
        If there are no code cells, return True.

        This function is the inverse of mark_cells.
        rž   FT)r    r¤   rý   rì   s       r   Úcheck_cellszNotebookNotary.check_cells  sU   € ð Œ;˜Š?ˆ?Ø�5ØˆÝ$ RÑ(Ô(ð 	 ð 	 ˆDà×#Ò# D¨"¬+Ñ6Ô6ð  Ø�øàˆr   )%rC   rD   rE   rF   r    rŠ   r¬   r!   r³   r   r´   r¸   rd   r»   r   Ú
algorithmsr8   r"   rÄ   r   rÂ   rÆ   rÇ   rË   r   rÌ   rÖ   rL   rÔ   rã   r<   rç   ré   rí   rý   rÿ   r‹   rŒ   s   @r   r«   r«   O  sÜ  ø€ € € € € ØBÐBàˆwÐWÐXÑXÔX×\Ò\Øð ]ñ ô €Hð €WˆZÑÔðð ñ Ôðð �Hð1ðñ ô ÷ 
‚c�€cÑÔð ð
 €Wˆ_ÑÔð	ð 	ñ Ôð	ð ˆgððñ ô ÷
 
‚c�€cÑÔð ð €WˆYÑÔð<ð <ñ Ôð<ð
 �ØØØ@ðñ ô ÷ 
‚c�€cÑÔð	 ð €Wˆ[ÑÔð9ð 9ñ Ôð9ð �‘”€Ià€Wˆ[ÑÔð0ð 0ñ Ôð0ð �'ÐMÐNÑNÔN×RÒRÐZ^ÐRÑ_Ô_€Kà€Wˆ]ÑÔð<ð <ñ Ôð<ð
 ˆUÐMÐNÑNÔN×RÒRÐZ^ÐRÑ_Ô_€Fà€WˆXÑÔðð ñ Ôðð*ð *ð *ð *ð *ð
	ð 	ð 	ð ð  ð  ðEð Eð Eð&>ð >ð >ð?ð ?ð ?ð2ð 2ð 2ðð ð ðBð ð ð ð ð ð r   r«   ÚresetÚTrustNotebookAppTzjDelete the trusted notebook cache.
        All previously signed notebooks will become untrusted.
        zdict[str, t.Any]Útrust_flagsc                  óä   — e Zd ZdZeZdZ ed¦  «        d„ ¦   «         ZdZ	e
Z edd¬¦  «                             d	¬
¦  «        Z ee¦  «        Z ed¦  «        d„ ¦   «         Zd„ Zdd„Zd„ Zd„ ZdS )r  z+An application for handling notebook trust.z´Sign one or more Jupyter notebooks with your key,
    to trust their dynamic (HTML, Javascript) output.

    Otherwise, you will have to re-execute the notebook to see output.
    Úconfig_file_namec                ó   — dS )NÚjupyter_notebook_configr@   rA   s    r   Ú_config_file_name_defaultz*TrustNotebookApp._config_file_name_defaultD  s   € à(Ð(r   z;
    jupyter trust mynotebook.ipynb and_this_one.ipynb
    Fz�If True, delete the trusted signature cache.
        After reset, all previously signed notebooks will become untrusted.
        r^   Tr`   Únotaryc                ó.   — t          | | j        ¬¦  «        S )N)Úparentr¬   )r«   r¬   rA   s    r   Ú_notary_defaultz TrustNotebookApp._notary_defaultW  s   € å T°D´MÐBÑBÔBÐBr   c                ót  — t          |¦  «                             ¦   «         s0| j                             d|¦  «         |                      d¦  «         t          |¦  «                             d¬¦  «        5 }t          |t          ¦  «        }ddd¦  «         n# 1 swxY w Y   |                      ||¦  «         dS )z#Sign a notebook from the filesystemzNotebook missing: %sr%   rŽ   )ÚencodingN)	r	   rÐ   rt   ÚerrorÚexitrÑ   r(   r&   Úsign_notebook)r6   Únotebook_pathrÕ   r¡   s       r   Úsign_notebook_filez#TrustNotebookApp.sign_notebook_file[  sà   € å�MÑ"Ô"×)Ò)Ñ+Ô+ð 	ØŒH�NŠNÐ1°=ÑAÔAÐAØ�IŠI�a‰LŒLˆLÝ�-Ñ Ô ×%Ò%¨vÐ%Ñ6Ô6ð 	%¸!Ý�a�Ñ$Ô$ˆBð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%à×Ò˜2˜}Ñ-Ô-Ð-Ð-Ð-s   Á5BÂBÂBú<stdin>c                óº   — | j                              |¦  «        rt          d|z  ¦  «         dS t          d|z  ¦  «         | j                              |¦  «         dS )z"Sign a notebook that's been loadedzNotebook already signed: %szSigning notebook: %sN)r	  r<   Úprintrç   )r6   r¡   r  s      r   r  zTrustNotebookApp.sign_notebookd  sd   € àŒ;×&Ò& rÑ*Ô*ð 	!ÝÐ/°-Ñ?Ñ@Ô@Ð@Ð@Ð@åÐ(¨=Ñ8Ñ9Ô9Ð9ØŒK×Ò˜RÑ Ô Ð Ð Ð r   c                ó–   — t          d| j        j        z  ¦  «         | j                             t	          j        d¦  «        ¦  «         dS )z%Generate a new notebook signature keyzGenerating new notebook key: %srÏ   N)r  r	  rÇ   rÔ   rÒ   rÓ   rA   s    r   Úgenerate_new_keyz!TrustNotebookApp.generate_new_keyl  sA   € åÐ/°$´+Ô2IÑIÑJÔJÐJØŒ×&Ò&¥r¤z°$Ñ'7Ô'7Ñ8Ô8Ð8Ð8Ð8r   c                óh  — | j         rˆt          | j        j        ¦  «                             ¦   «         rGt          d| j        j        z  ¦  «         t          | j        j        ¦  «                             ¦   «          |                      ¦   «          dS | j        s|| j	         
                    d¦  «         t          j                             ¦   «         }t          |t          ¦  «        sJ ‚t!          |t"          ¦  «        }|                      |d¦  «         dS | j        D ]}|                      |¦  «         ŒdS )zStart the trust notebook app.z$Removing trusted signature cache: %sNzReading notebook from stdinr  )r  r	   r	  rd   rÐ   r  Úunlinkr  Ú
extra_argsrt   ÚdebugÚsysÚstdinr(   r�   r’   r)   r&   r  r  )r6   Únb_sr¡   r  s       r   ÚstartzTrustNotebookApp.startq  s  € àŒ:ð 	Ý�D”KÔ'Ñ(Ô(×/Ò/Ñ1Ô1ð 3ÝÐ<¸t¼{Ô?RÑRÑSÔSÐSÝ�T”[Ô(Ñ)Ô)×0Ò0Ñ2Ô2Ð2Ø×!Ò!Ñ#Ô#Ð#ØˆFØŒð 	7ØŒH�NŠNÐ8Ñ9Ô9Ð9Ý”9—>’>Ñ#Ô#ˆDÝ˜d¥CÑ(Ô(Ð(Ð(Ð(Ý�t�ZÑ(Ô(ˆBØ×Ò˜r 9Ñ-Ô-Ð-Ð-Ð-à!%¤ð 7ð 7�Ø×'Ò'¨Ñ6Ô6Ð6Ð6ð7ð 7r   N)r  )rC   rD   rE   rF   r'   ÚversionÚdescriptionr!   r  Úexamplesr  Úflagsr   rŠ   r  r   r«   r	  r  r  r  r  r   r@   r   r   r  r  9  s  € € € € € Ø5Ð5à€Gð€Kð €WÐÑ Ô ð)ð )ñ !Ô ð)ð€Hð €EàˆDØððñ ô ÷
 
‚c�€cÑÔð 
ð ˆX�nÑ%Ô%€Fà€WˆXÑÔðCð Cñ ÔðCð.ð .ð .ð!ð !ð !ð !ð9ð 9ð 9ð
7ð 7ð 7ð 7ð 7r   Ú__main__)CrF   Ú
__future__r   rÁ   rÒ   r  ÚtypingÚtÚcollectionsr   Ú
contextlibr   r   r   rá   r   Úpathlibr	   rm   r   r   Úregister_adapterÚregister_converterÚImportErrorÚ	pysqlite2r   Úbase64r   Újupyter_core.applicationr   r   Ú	traitletsr   r   r   r   r   r   r   r    r!   r"   Útraitlets.configr#   r$   rÉ   r&   r'   r(   r)   Úalgorithms_guaranteedÚalgorithms_setr   r1   rH   r]   r”   r¤   r©   r«   r  Ú__annotations__rß   r  Úlaunch_instanceÚmainrC   r@   r   r   ú<module>r9     sÑ  ðØ %Ð %Ð %ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø %Ð %Ð %Ð %Ð %Ð %Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðØ€N€N€Nðð ð ð4ð 4ð 4ð €GÔ˜XÐ'9Ñ:Ô:Ð:Ø€GÔ˜zÐ+;Ñ<Ô<Ð<Ð<øØð ð ð ðØ/Ð/Ð/Ð/Ð/Ð/Ð/øØð ð ð Øˆˆˆðøøøøøðøøøð Ð Ð Ð Ð Ð à ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dØ GÐ GÐ GÐ GÐ GÐ GÐ GÐ Gà 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2àÔ.€ð GÐF˜ÐFÑFÔF€
ðð ð ð ð ñ ô ð ð@(1ð (1ð (1ð (1ð (1˜>ñ (1ô (1ð (1ðVZ
ð Z
ð Z
ð Z
ð Z
˜>Ð+>ñ Z
ô Z
ð Z
ðz&ð &ð &ð*ð ð ð  ð
9ð 
9ñ „ð
9ð\ð \ð \ð \ð \Ð(ñ \ô \ð \ð@ Ø	˜g t˜_Ð-ð	ðð!€ð ð ð ñ ð × Ò �:Ñ Ô Ð ðH7ð H7ð H7ð H7ð H7�zñ H7ô H7ð H7ðV Ô'€àˆzÒÐØ€D�F„F€F€F€Fð Ðs5   »,A( Á(BÁ.A5Á4BÁ5A?Á<BÁ>A?Á?BÂB