§
    ¤”j!L  ã                   óÖ  — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZm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mZ ddlmZ ddlmZ  ej         d¦  «        Z! ed¦  «        Z"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,de,z  Z-ej.        ej/        z   Z0dZ1d„ Z2d„ Z3d „ Z4d!„ Z5d"„ Z6d#„ Z7d$„ Z8 G d%„ d&e9¦  «        Z:d'„ Z;d(„ Z< G d)„ d*e9¦  «        Z= G d+„ d,e¦  «        Z>dS )-z’
Cross Site Request Forgery Middleware.

This module provides a middleware that implements protection
against request forgeries from other sites.
é    N)Údefaultdict©Úurlparse)Úsettings)ÚDisallowedHostÚImproperlyConfigured)ÚHttpHeadersÚUnreadablePostError)Úget_callable)Úpatch_vary_headers)Úconstant_time_compareÚget_random_string)ÚMiddlewareMixin)Úcached_property©Úis_same_domain)Úlog_response)Ú_lazy_re_compilezdjango.security.csrfz[^a-zA-Z0-9]z?Origin checking failed - %s does not match any trusted origins.z%Referer checking failed - no Referer.z@Referer checking failed - %s does not match any trusted origins.zCSRF cookie not set.zCSRF token missing.z/Referer checking failed - Referer is malformed.zCReferer checking failed - Referer is insecure while host is secure.zhas incorrect lengthzhas invalid charactersé    é   Ú
_csrftokenc                  ó4   — t          t          j        ¦  «        S )z/Return the view to be used for CSRF rejections.)r   r   ÚCSRF_FAILURE_VIEW© ó    úe/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/django/middleware/csrf.pyÚ_get_failure_viewr   2   s   € å�Ô2Ñ3Ô3Ð3r   c                  ó8   — t          t          t          ¬¦  «        S )N)Úallowed_chars)r   ÚCSRF_SECRET_LENGTHÚCSRF_ALLOWED_CHARSr   r   r   Ú_get_new_csrf_stringr"   7   s   € ÝÕ/Õ?QÐRÑRÔRÐRr   c                 óÊ   ‡— t          ¦   «         }t          Št          ˆfd„| D ¦   «         ˆfd„|D ¦   «         ¦  «        }d                     ˆfd„|D ¦   «         ¦  «        }||z   S )z�
    Given a secret (assumed to be a string of CSRF_ALLOWED_CHARS), generate a
    token by adding a mask and applying it to the secret.
    c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S ©N©Úindex©Ú.0ÚxÚcharss     €r   ú	<genexpr>z&_mask_cipher_secret.<locals>.<genexpr>B   s-   øè è € Ð0Ð0 A�—’˜Q‘”Ð0Ð0Ð0Ð0Ð0Ð0r   c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r%   r&   r(   s     €r   r,   z&_mask_cipher_secret.<locals>.<genexpr>B   s-   øè è € Ð2PÐ2PÀa°5·;²;¸q±>´>Ð2PÐ2PÐ2PÐ2PÐ2PÐ2Pr   Ú c              3   óT   •K  — | ]"\  }}‰||z   t          ‰¦  «        z           V — Œ#d S r%   )Úlen©r)   r*   Úyr+   s      €r   r,   z&_mask_cipher_secret.<locals>.<genexpr>C   s;   øè è € ÐCÐC±T°Q¸�U˜A ™E¥S¨¡Z¤ZÑ/Ô0ÐCÐCÐCÐCÐCÐCr   )r"   r!   ÚzipÚjoin)ÚsecretÚmaskÚpairsÚcipherr+   s       @r   Ú_mask_cipher_secretr9   ;   s~   ø€ õ
  Ñ!Ô!€DÝ€EÝÐ0Ð0Ð0Ð0¨Ð0Ñ0Ô0Ð2PÐ2PÐ2PÐ2PÈ4Ð2PÑ2PÔ2PÑQÔQ€EØ�WŠWÐCÐCÐCÐC¸UÐCÑCÔCÑCÔC€FØ�&‰=Ðr   c                 óà   ‡— | dt           …         }| t           d…         } t          Št          ˆfd„| D ¦   «         ˆfd„|D ¦   «         ¦  «        }d                     ˆfd„|D ¦   «         ¦  «        S )zÑ
    Given a token (assumed to be a string of CSRF_ALLOWED_CHARS, of length
    CSRF_TOKEN_LENGTH, and that its first half is a mask), use it to decrypt
    the second half to produce the original secret.
    Nc              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r%   r&   r(   s     €r   r,   z'_unmask_cipher_token.<locals>.<genexpr>P   s-   øè è € Ð/Ð/ A�—’˜Q‘”Ð/Ð/Ð/Ð/Ð/Ð/r   c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r%   r&   r(   s     €r   r,   z'_unmask_cipher_token.<locals>.<genexpr>P   s-   øè è € Ð1OÐ1OÀQ°%·+²+¸a±.´.Ð1OÐ1OÐ1OÐ1OÐ1OÐ1Or   r.   c              3   ó4   •K  — | ]\  }}‰||z
           V — Œd S r%   r   r1   s      €r   r,   z'_unmask_cipher_token.<locals>.<genexpr>Q   s/   øè è € Ð2Ð2¡D A q�5˜˜Q™”<Ð2Ð2Ð2Ð2Ð2Ð2r   )r    r!   r3   r4   )Útokenr6   r7   r+   s      @r   Ú_unmask_cipher_tokenr?   G   sŒ   ø€ ð Ð$Õ$Ð$Ô%€DØÕ$Ð%Ð%Ô&€EÝ€EÝÐ/Ð/Ð/Ð/¨Ð/Ñ/Ô/Ð1OÐ1OÐ1OÐ1OÈ$Ð1OÑ1OÔ1OÑPÔP€EØ�7Š7Ð2Ð2Ð2Ð2¨EÐ2Ñ2Ô2Ñ2Ô2Ð2r   c                 ó\   — t          ¦   «         }| j                             |ddœ¦  «         |S )zDGenerate a new random CSRF_COOKIE value, and add it to request.META.T)ÚCSRF_COOKIEÚCSRF_COOKIE_NEEDS_UPDATE)r"   ÚMETAÚupdate©ÚrequestÚcsrf_secrets     r   Ú_add_new_csrf_cookierH   T   s?   € å&Ñ(Ô(€KØ„L×Òà&Ø(,ð	
ð 	
ñô ð ð Ðr   c                 ó€   — d| j         v r| j         d         }d| j         d<   nt          | ¦  «        }t          |¦  «        S )aº  
    Return the CSRF token required for a POST form. The token is an
    alphanumeric value. A new token is created if one is not already set.

    A side effect of calling this function is to make the csrf_protect
    decorator and the CsrfViewMiddleware add a CSRF cookie and a 'Vary: Cookie'
    header to the outgoing response.  For this reason, you may need to use this
    function lazily, as is done by the csrf context processor.
    rA   TrB   )rC   rH   r9   rE   s     r   Ú	get_tokenrJ   `   sJ   € ð ˜œÐ$Ð$Ø”l =Ô1ˆð 48ˆŒÐ/Ñ0Ð0å*¨7Ñ3Ô3ˆÝ˜{Ñ+Ô+Ð+r   c                 ó$   — t          | ¦  «         dS )zi
    Change the CSRF token in use for a request - should be done on login
    for security purposes.
    N)rH   )rF   s    r   Úrotate_tokenrL   u   s   € õ
 ˜Ñ!Ô!Ð!Ð!Ð!r   c                   ó   — e Zd Zd„ ZdS )ÚInvalidTokenFormatc                 ó   — || _         d S r%   ©Úreason©ÚselfrQ   s     r   Ú__init__zInvalidTokenFormat.__init__~   ó   € ØˆŒˆˆr   N©Ú__name__Ú
__module__Ú__qualname__rT   r   r   r   rN   rN   }   ó#   € € € € € ðð ð ð ð r   rN   c                 óÄ   — t          | ¦  «        t          t          fvrt          t          ¦  «        ‚t
                               | ¦  «        rt          t          ¦  «        ‚dS )zá
    Raise an InvalidTokenFormat error if the token has an invalid length or
    characters that aren't allowed. The token argument can be a CSRF cookie
    secret or non-cookie CSRF token, and either masked or unmasked.
    N)r0   ÚCSRF_TOKEN_LENGTHr    rN   ÚREASON_INCORRECT_LENGTHÚinvalid_token_chars_reÚsearchÚREASON_INVALID_CHARACTERS)r>   s    r   Ú_check_token_formatra   ‚   sZ   € õ ˆ5�z„zÕ+Õ-?Ð@Ð@Ð@Ý Õ!8Ñ9Ô9Ð9å×$Ò$ UÑ+Ô+ð <Ý Õ!:Ñ;Ô;Ð;ð<ð <r   c                 ó¤   — t          | ¦  «        t          k    rt          | ¦  «        } t          | ¦  «        t          k    sJ ‚t	          | |¦  «        S )aƒ  
    Return whether the given CSRF token matches the given CSRF secret, after
    unmasking the token if necessary.

    This function assumes that the request_csrf_token argument has been
    validated to have the correct length (CSRF_SECRET_LENGTH or
    CSRF_TOKEN_LENGTH characters) and allowed characters, and that if it has
    length CSRF_TOKEN_LENGTH, it is a masked secret.
    )r0   r\   r?   r    r   )Úrequest_csrf_tokenrG   s     r   Ú_does_token_matchrd   �   sT   € õ ÐÑÔÕ"3Ò3Ð3Ý1Ð2DÑEÔEÐÝÐ!Ñ"Ô"Õ&8Ò8Ð8Ð8Ð8Ý Ð!3°[ÑAÔAÐAr   c                   ó   — e Zd Zd„ ZdS )ÚRejectRequestc                 ó   — || _         d S r%   rP   rR   s     r   rT   zRejectRequest.__init__¡   rU   r   NrV   r   r   r   rf   rf       rZ   r   rf   c                   ó–   — e Zd ZdZed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚCsrfViewMiddlewarezê
    Require a present and correct csrfmiddlewaretoken for POST requests that
    have a CSRF cookie, and set an outgoing CSRF cookie.

    This middleware should be used in conjunction with the {% csrf_token %}
    template tag.
    c                 ó.   — d„ t           j        D ¦   «         S )Nc                 ó\   — g | ])}t          |¦  «        j                             d ¦  «        ‘Œ*S ©Ú*)r   ÚnetlocÚlstrip©r)   Úorigins     r   ú
<listcomp>zACsrfViewMiddleware.csrf_trusted_origins_hosts.<locals>.<listcomp>°   sA   € ð 
ð 
ð 
àõ �VÑÔÔ#×*Ò*¨3Ñ/Ô/ð
ð 
ð 
r   ©r   ÚCSRF_TRUSTED_ORIGINS©rS   s    r   Úcsrf_trusted_origins_hostsz-CsrfViewMiddleware.csrf_trusted_origins_hosts®   s&   € ð
ð 
å"Ô7ð
ñ 
ô 
ð 	
r   c                 ó.   — d„ t           j        D ¦   «         S )Nc                 ó   — h | ]}d |v¯|’Œ	S rl   r   rp   s     r   ú	<setcomp>z;CsrfViewMiddleware.allowed_origins_exact.<locals>.<setcomp>·   s#   € ÐXÐXÐX˜6ÀcÐQWÐFWÐFW�ÐFWÐFWÐFWr   rs   ru   s    r   Úallowed_origins_exactz(CsrfViewMiddleware.allowed_origins_exactµ   s   € àXÐX¥XÔ%BÐXÑXÔXÐXr   c                 óÐ   — t          t          ¦  «        }d„ t          j        D ¦   «         D ]:}||j                                      |j                             d¦  «        ¦  «         Œ;|S )z‚
        A mapping of allowed schemes to list of allowed netlocs, where all
        subdomains of the netloc are allowed.
        c              3   ó<   K  — | ]}d |v ¯t          |¦  «        V — ŒdS )rm   Nr   rp   s     r   r,   z?CsrfViewMiddleware.allowed_origin_subdomains.<locals>.<genexpr>À   s<   è è € ð 
ð 
àØ�fˆ}ˆ}õ �VÑÔàˆ}ˆ}ˆ}ð
ð 
r   rm   )r   Úlistr   rt   ÚschemeÚappendrn   ro   )rS   Úallowed_origin_subdomainsÚparseds      r   r€   z,CsrfViewMiddleware.allowed_origin_subdomains¹   sv   € õ %0µÑ$5Ô$5Ð!ð
ð 
å"Ô7ð
ñ 
ô 
ð 	Wð 	WˆFð
 & f¤mÔ4×;Ò;¸F¼M×<PÒ<PÐQTÑ<UÔ<UÑVÔVÐVÐVØ(Ð(r   c                 ó   — d|_         d S )NT)Úcsrf_processing_done)rS   rF   s     r   Ú_acceptzCsrfViewMiddleware._acceptÊ   s   € ð (,ˆÔ$Øˆtr   c                 óv   —  t          ¦   «         ||¬¦  «        }t          d||j        ||t          ¬¦  «         |S )NrP   zForbidden (%s): %s)ÚresponserF   Úlogger)r   r   Úpathr‡   )rS   rF   rQ   r†   s       r   Ú_rejectzCsrfViewMiddleware._rejectÑ   sO   € Ø&Õ$Ñ&Ô& w°vÐ>Ñ>Ô>ˆÝØ ØØŒLØØÝð	
ñ 	
ô 	
ð 	
ð ˆr   c                 ód  — t           j        r>	 |j                             t          ¦  «        }nW# t
          $ r t          d¦  «        ‚w xY w	 |j        t           j                 }t          |¦  «         n# t          $ r d}Y nw xY w|€dS t          |¦  «        t          k    rt          |¦  «        }|S )a  
        Return the CSRF secret originally associated with the request, or None
        if it didn't have one.

        If the CSRF_USE_SESSIONS setting is false, raises InvalidTokenFormat if
        the request's secret has invalid characters or an invalid length.
        z„CSRF_USE_SESSIONS is enabled, but request.session is not set. SessionMiddleware must appear before CsrfViewMiddleware in MIDDLEWARE.N)r   ÚCSRF_USE_SESSIONSÚsessionÚgetÚCSRF_SESSION_KEYÚAttributeErrorr   ÚCOOKIESÚCSRF_COOKIE_NAMEra   ÚKeyErrorr0   r\   r?   ©rS   rF   rG   s      r   Ú_get_secretzCsrfViewMiddleware._get_secretÝ   sß   € õ Ô%ð 	1ðØ%œo×1Ò1Õ2BÑCÔC��øÝ!ð ð ð Ý*ð%ñô ð ðøøøð1Ø%œo­hÔ.GÔH�õ
 $ KÑ0Ô0Ð0Ð0øõ	 ð #ð #ð #Ø"���ð#øøøð
 ÐØ�4åˆ{ÑÔÕ0Ò0Ð0Ý.¨{Ñ;Ô;ˆKØÐs   Ž. ®AÁA3 Á3BÂBc           
      ó²  — t           j        rL|j                             t          ¦  «        |j        d         k    r|j        d         |j        t          <   d S d S |                     t           j        |j        d         t           j        t           j	        t           j
        t           j        t           j        t           j        ¬¦  «         t          |d¦  «         d S )NrA   )Úmax_ageÚdomainrˆ   ÚsecureÚhttponlyÚsamesite)ÚCookie)r   r‹   rŒ   r�   rŽ   rC   Ú
set_cookier‘   ÚCSRF_COOKIE_AGEÚCSRF_COOKIE_DOMAINÚCSRF_COOKIE_PATHÚCSRF_COOKIE_SECUREÚCSRF_COOKIE_HTTPONLYÚCSRF_COOKIE_SAMESITEr   ©rS   rF   r†   s      r   Ú_set_csrf_cookiez#CsrfViewMiddleware._set_csrf_cookieý   s¾   € ÝÔ%ð 	6ØŒ×"Ò"Õ#3Ñ4Ô4¸¼À]Ô8SÒSÐSØ4;´LÀÔ4O�”Õ 0Ñ1Ð1Ð1ð TÐSð ×ÒÝÔ)Ø”˜]Ô+Ý Ô0ÝÔ2ÝÔ.ÝÔ2Ý!Ô6Ý!Ô6ð  ñ 	ô 	ð 	õ ˜x¨Ñ5Ô5Ð5Ð5Ð5r   c                 ó’  ‡— |j         d         }	 |                     ¦   «         }|                     ¦   «         rdnd›d|›�}||k    rdS n# t          $ r Y nw xY w|| j        v rdS 	 t          |¦  «        }n# t          $ r Y dS w xY w|j        }|j        Št          ˆfd„| j
                             |d¦  «        D ¦   «         ¦  «        S )	NÚHTTP_ORIGINÚhttpsÚhttpz://TFc              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S r%   r   )r)   ÚhostÚrequest_netlocs     €r   r,   z6CsrfViewMiddleware._origin_verified.<locals>.<genexpr>$  sA   øè è € ð 
ð 
àõ ˜>¨4Ñ0Ô0ð
ð 
ð 
ð 
ð 
ð 
r   r   )rC   Úget_hostÚ	is_securer   rz   r   Ú
ValueErrorr~   rn   Úanyr€   r�   )rS   rF   Úrequest_originÚ	good_hostÚgood_originÚparsed_originÚrequest_schemer«   s          @r   Ú_origin_verifiedz#CsrfViewMiddleware._origin_verified  s0  ø€ Ø œ mÔ4ˆð
	Ø×(Ò(Ñ*Ô*ˆIð
 #×,Ò,Ñ.Ô.Ð:��°FÐ:Ð:Ø�	ðˆKð  Ò,Ð,Ø�tð -øõ ð 	ð 	ð 	ØˆDð	øøøð ˜TÔ7Ð7Ð7Ø�4ð	Ý$ ^Ñ4Ô4ˆMˆMøÝð 	ð 	ð 	Ø�5�5ð	øøøà&Ô-ˆØ&Ô-ˆÝð 
ð 
ð 
ð 
àÔ6×:Ò:¸>È2ÑNÔNð
ñ 
ô 
ñ 
ô 
ð 	
s#   �A
 Á

AÁAÁ&A6 Á6
BÂBc                 ó8  ‡— |j                              d¦  «        Š‰€t          t          ¦  «        ‚	 t	          ‰¦  «        Šn"# t
          $ r t          t          ¦  «        ‚w xY wd‰j        ‰j        fv rt          t          ¦  «        ‚‰j        dk    rt          t          ¦  «        ‚t          ˆfd„| j        D ¦   «         ¦  «        rd S t          j        rt          j        nt          j        }|€M	 |                     ¦   «         }nV# t"          $ r* t          t$          ‰                     ¦   «         z  ¦  «        ‚w xY w|                     ¦   «         }|dvr|›d|›�}t+          ‰j        |¦  «        s)t          t$          ‰                     ¦   «         z  ¦  «        ‚d S )NÚHTTP_REFERERr.   r§   c              3   óB   •K  — | ]}t          ‰j        |¦  «        V — Œd S r%   )r   rn   )r)   rª   Úreferers     €r   r,   z4CsrfViewMiddleware._check_referer.<locals>.<genexpr>;  sC   øè è € ð 
ð 
àõ ˜7œ>¨4Ñ0Ô0ð
ð 
ð 
ð 
ð 
ð 
r   )Ú443Ú80ú:)rC   r�   rf   ÚREASON_NO_REFERERr   r®   ÚREASON_MALFORMED_REFERERr~   rn   ÚREASON_INSECURE_REFERERr¯   rv   r   r‹   ÚSESSION_COOKIE_DOMAINrž   r¬   r   ÚREASON_BAD_REFERERÚgeturlÚget_portr   )rS   rF   Úgood_refererÚserver_portr¹   s       @r   Ú_check_refererz!CsrfViewMiddleware._check_referer)  sÚ  ø€ Ø”,×"Ò" >Ñ2Ô2ˆØˆ?ÝÕ 1Ñ2Ô2Ð2ð	:Ý˜wÑ'Ô'ˆGˆGøÝð 	:ð 	:ð 	:ÝÕ 8Ñ9Ô9Ð9ð	:øøøð �'”. '¤.Ð1Ð1Ð1ÝÕ 8Ñ9Ô9Ð9ð Œ>˜WÒ$Ð$ÝÕ 7Ñ8Ô8Ð8åð 
ð 
ð 
ð 
àÔ7ð
ñ 
ô 
ñ 
ô 
ð 	ð ˆFõ Ô)ð-�HÔ*Ð*åÔ,ð 	ð
 ÐðKà&×/Ò/Ñ1Ô1��øÝ!ð Kð Kð KÝ#Õ$6¸¿ºÑ9IÔ9IÑ$IÑJÔJÐJðKøøøð "×*Ò*Ñ,Ô,ˆKØ -Ð/Ð/Ø*6¨,¨,¸¸ÐD�å˜gœn¨lÑ;Ô;ð 	GÝÕ 2°W·^²^Ñ5EÔ5EÑ EÑFÔFÐFð	Gð 	Gs   ³A ÁA"Ã1D Ä4D:c                 óT   — |dk    rt          j        |¦  «        }d|›d�}d|› d|› d�S )NÚPOSTzthe z HTTP headerzCSRF token from ú ú.)r	   Úparse_header_name)rS   rQ   Útoken_sourceÚheader_names       r   Ú_bad_token_messagez%CsrfViewMiddleware._bad_token_messageV  sF   € Ø˜6Ò!Ð!å%Ô7¸ÑEÔEˆKØ= +Ð=Ð=Ð=ˆLØ: ,Ð:Ð:°Ð:Ð:Ð:Ð:r   c                 óÌ  — 	 |                       |¦  «        }n*# t          $ r}t          d|j        › d�¦  «        ‚d }~ww xY w|€t          t          ¦  «        ‚d}|j        dk    r-	 |j                             dd¦  «        }n# t          $ r Y nw xY w|dk    rH	 |j	        t          j                 }n"# t          $ r t          t          ¦  «        ‚w xY wt          j        }nd}	 t          |¦  «         n<# t          $ r/}|                      |j        |¦  «        }t          |¦  «        ‚d }~ww xY wt!          ||¦  «        s%|                      d|¦  «        }t          |¦  «        ‚d S )NzCSRF cookie rÊ   r.   rÈ   ÚcsrfmiddlewaretokenÚ	incorrect)r”   rN   rf   rQ   ÚREASON_NO_CSRF_COOKIEÚmethodrÈ   r�   r
   rC   r   ÚCSRF_HEADER_NAMEr’   ÚREASON_CSRF_TOKEN_MISSINGra   rÎ   rd   )rS   rF   rG   Úexcrc   rÌ   rQ   s          r   Ú_check_tokenzCsrfViewMiddleware._check_token]  sÅ  € ð	>Ø×*Ò*¨7Ñ3Ô3ˆKˆKøÝ!ð 	>ð 	>ð 	>ÝÐ <¨s¬zÐ <Ð <Ð <Ñ=Ô=Ð=øøøøð	>øøøð Ðõ  Õ 5Ñ6Ô6Ð6ð  ÐØŒ>˜VÒ#Ð#ðØ%,¤\×%5Ò%5Ð6KÈRÑ%PÔ%PÐ"Ð"øÝ&ð ð ð ð
 �ðøøøð  Ò#Ð#ð?ð
 &-¤\µ(Ô2KÔ%LÐ"Ð"øÝð ?ð ?ð ?Ý#Õ$=Ñ>Ô>Ð>ð?øøøå#Ô4ˆLˆLà!ˆLð	(ÝÐ 2Ñ3Ô3Ð3Ð3øÝ!ð 	(ð 	(ð 	(Ø×,Ò,¨S¬Z¸ÑFÔFˆFÝ Ñ'Ô'Ð'øøøøð	(øøøõ !Ð!3°[ÑAÔAð 	(Ø×,Ò,¨[¸,ÑGÔGˆFÝ Ñ'Ô'Ð'ð	(ð 	(sF   ‚ ˜
?¢:º?Á&B Â
BÂBÂB1 Â1CÃ#C3 Ã3
D,Ã=*D'Ä'D,c                 óŽ   — 	 |                       |¦  «        }|�||j        d<   d S d S # t          $ r t          |¦  «         Y d S w xY w)NrA   )r”   rC   rN   rH   r“   s      r   Úprocess_requestz"CsrfViewMiddleware.process_request‘  sr   € ð
	:Ø×*Ò*¨7Ñ3Ô3ˆKð Ð&ð
 /:�”˜]Ñ+Ð+Ð+ð 'Ð&øõ "ð 	*ð 	*ð 	*Ý  Ñ)Ô)Ð)Ð)Ð)Ð)ð	*øøøs   ‚' §AÁAc                 óÜ  — t          |dd¦  «        rd S t          |dd¦  «        rd S |j        dv r|                      |¦  «        S t          |dd¦  «        r|                      |¦  «        S d|j        v r?|                      |¦  «        s)|                      |t          |j        d         z  ¦  «        S n]|                     ¦   «         rI	 |                      |¦  «         n2# t          $ r%}|                      ||j
        ¦  «        cY d }~S d }~ww xY w	 |                      |¦  «         n2# t          $ r%}|                      ||j
        ¦  «        cY d }~S d }~ww xY w|                      |¦  «        S )Nrƒ   FÚcsrf_exempt)ÚGETÚHEADÚOPTIONSÚTRACEÚ_dont_enforce_csrf_checksr¦   )ÚgetattrrÓ   r„   rC   rµ   r‰   ÚREASON_BAD_ORIGINr­   rÆ   rf   rQ   r×   )rS   rF   ÚcallbackÚcallback_argsÚcallback_kwargsrÖ   s         r   Úprocess_viewzCsrfViewMiddleware.process_viewž  s¾  € Ý�7Ð2°EÑ:Ô:ð 	Ø�4õ �8˜]¨EÑ2Ô2ð 	Ø�4ð Œ>Ð@Ð@Ð@Ø—<’< Ñ(Ô(Ð(å�7Ð7¸Ñ?Ô?ð 	)ð
 —<’< Ñ(Ô(Ð(ð ˜GœLÐ(Ð(Ø×(Ò(¨Ñ1Ô1ð Ø—|’|ØÕ.°´¸mÔ1LÑLñô ð ðð ×ÒÑ Ô ð 	9ð$9Ø×#Ò# GÑ,Ô,Ð,Ð,øÝ ð 9ð 9ð 9Ø—|’| G¨S¬ZÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð9øøøð	5Ø×Ò˜gÑ&Ô&Ð&Ð&øÝð 	5ð 	5ð 	5Ø—<’< ¨¬Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð	5øøøð �|Š|˜GÑ$Ô$Ð$s<   ÃC Ã
DÃ(DÄDÄDÄD' Ä'
EÄ1EÅEÅEc                 óz   — |j                              d¦  «        r |                      ||¦  «         d|j         d<   |S )NrB   F)rC   r�   r¤   r£   s      r   Úprocess_responsez#CsrfViewMiddleware.process_response×  sE   € ØŒ<×ÒÐ6Ñ7Ô7ð 		=Ø×!Ò! '¨8Ñ4Ô4Ð4ð 8=ˆGŒLÐ3Ñ4àˆr   N)rW   rX   rY   Ú__doc__r   rv   rz   r€   r„   r‰   r”   r¤   rµ   rÆ   rÎ   r×   rÙ   ræ   rè   r   r   r   ri   ri   ¥   s  € € € € € ðð ð ð
ð 
ñ „_ð
ð ðYð Yñ „_ðYð ð)ð )ñ „_ð)ð ð ð ð
ð 
ð 
ðð ð ð@6ð 6ð 6ð$
ð 
ð 
ð4+Gð +Gð +GðZ;ð ;ð ;ð2(ð 2(ð 2(ðh:ð :ð :ð7%ð 7%ð 7%ðrð ð ð ð r   ri   )?ré   ÚloggingÚstringÚcollectionsr   Úurllib.parser   Údjango.confr   Údjango.core.exceptionsr   r   Údjango.httpr	   r
   Údjango.urlsr   Údjango.utils.cacher   Údjango.utils.cryptor   r   Údjango.utils.deprecationr   Údjango.utils.functionalr   Údjango.utils.httpr   Údjango.utils.logr   Údjango.utils.regex_helperr   Ú	getLoggerr‡   r^   râ   r½   rÁ   rÒ   rÕ   r¾   r¿   r]   r`   r    r\   Úascii_lettersÚdigitsr!   rŽ   r   r"   r9   r?   rH   rJ   rL   Ú	ExceptionrN   ra   rd   rf   ri   r   r   r   ú<module>rý      sÄ  ððð ð €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø !Ð !Ð !Ð !Ð !Ð !à  Ð  Ð  Ð  Ð  Ð  Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø $Ð $Ð $Ð $Ð $Ð $Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø )Ð )Ð )Ð )Ð )Ð )Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6à	ˆÔ	Ð1Ñ	2Ô	2€à)Ð)¨.Ñ9Ô9Ð àUÐ Ø;Ð ØWÐ Ø.Ð Ø1Ð ØLÐ àIð ð 1Ð Ø4Ð àÐ ØÐ*Ñ*Ð ØÔ)¨F¬MÑ9Ð ØÐ ð4ð 4ð 4ð
Sð Sð Sð	ð 	ð 	ð
3ð 
3ð 
3ð	ð 	ð 	ð,ð ,ð ,ð*"ð "ð "ðð ð ð ð ˜ñ ô ð ð

<ð 
<ð 
<ðBð Bð Bð"ð ð ð ð �Iñ ô ð ð
~ð ~ð ~ð ~ð ~˜ñ ~ô ~ð ~ð ~ð ~r   