Ë
    :vžjÐ¯  ã                  óä  — 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ZddlZddl	Z	ddl
Z
ddlZddlmZmZmZ ddlmZ ddlmZmZmZ ddlm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  ddl!m"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- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 erHddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddl,mFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZN dd lOmPZP daQd!„ ZRdCd"„ZS G d#„ d$ej¨                  «      ZU G d%„ d&eU«      ZV G d'„ d(eV«      ZW G d)„ d*eV«      ZX G d+„ d,eVej²                  «      ZZdDd-„Z[ej¸                  Z\ G d.„ d/eVej²                  «      Z] G d0„ d1eW«      Z^ G d2„ d3ej¨                  «      Z_ G d4„ d5eV«      Z` G d6„ d7eV«      Za G d8„ d9ej¨                  «      Zb G d:„ d;eV«      Zc G d<„ d=ej²                  «      Zdd>Zed?e_fd@e^fdAedfdBecfgZfy)Ez-Base Tornado handlers for the Jupyter server.é    )ÚannotationsN)Ú	AwaitableÚ	CoroutineÚSequence)Ú	responses)ÚTYPE_CHECKINGÚAnyÚcast)Úurlparse)ÚTemplateNotFound)Ú	is_hidden)Úweb)Úapp_log)ÚApplication)ÚCallContext)Úget_sys_info)Úutcnow)Úallow_unauthenticatedÚ
authorized)ÚUser)Úcombine_translations)Úcsp_report_uri)Úensure_asyncÚfilefindÚorigin_matches_patÚ
url_escapeÚurl_is_absoluteÚurl_path_joinÚurldecode_unix_socket_path)ÚLogger)ÚKernelSpecManager)ÚEventLogger)ÚTerminalManager)ÚFuture)Ú
Authorizer©ÚIdentityProvider)Ú	ServerApp)ÚConfigManager)ÚContentsManager)ÚAsyncMappingKernelManager)ÚSessionManagerc                 óT   — t         €t        j                  t        «       «      a t         S )zGet sys info as json.)Ú_sys_info_cacheÚjsonÚdumpsr   © ó    úm/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_server/base/handlers.pyÚjson_sys_infor4   E   s    € ô ÐÜŸ*™*¤\£^Ó4ˆÜÐr2   c                 ó†   — t        j                  «       r(t        dt        j                  «       j                  «      S t
        S )zGet the application log.r    )r   Úinitializedr
   ÚinstanceÚlogr   r1   r2   r3   r8   r8   M   s/   € ä×ÑÔ Ü�Hœk×2Ñ2Ó4×8Ñ8Ó9Ð9äˆr2   c                  óî   — e Zd ZdZedd„«       Zedd„«       Zdd„Zedd„«       Zddd„Z	dd„Z
dd	„Zd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dd„«       Zy)ÚAuthenticatedHandlerz,A RequestHandler with an authenticated user.c                óN   — t        d| j                  j                  dd«      «      S )NÚstrÚbase_urlÚ/©r
   ÚsettingsÚget©Úselfs    r3   r=   zAuthenticatedHandler.base_urlX   s    € ä�E˜4Ÿ=™=×,Ñ,¨Z¸Ó=Ó>Ð>r2   c                ó  — d| j                   j                  di «      v rt        d| j                   d   d   «      S dj                  dd| j                   j                  dt	        | j
                  t        «      «      z   g«      S )z‰The default Content-Security-Policy header

        Can be overridden by defining Content-Security-Policy in settings['headers']
        úContent-Security-PolicyÚheadersr<   ú; zframe-ancestors 'self'zreport-uri r   )r@   rA   r
   Újoinr   r=   r   rB   s    r3   Úcontent_security_policyz,AuthenticatedHandler.content_security_policy\   s|   € ð %¨¯©×(9Ñ(9¸)ÀRÓ(HÑHä˜˜tŸ}™}¨YÑ7Ð8QÑRÓSÐSà�y‰yà(àØ—-‘-×#Ñ#Ð$4´mÀDÇMÁMÔSaÓ6bÓcñdðó
ð 	
r2   c                ó@  — i }d|d<   |j                  | j                  j                  di «      «       | j                  |d<   |j	                  «       D ]  \  }}	 | j                  ||«       Œ y# t        $ r&}| j                  j                  d|«       Y d}~ŒFd}~ww xY w)zSet the default headers.ÚnosniffzX-Content-Type-OptionsrF   rE   z!Could not set default headers: %sN)	Úupdater@   rA   rI   ÚitemsÚ
set_headerÚ	Exceptionr8   Ú	exception)rC   rF   Úheader_nameÚvalueÚes        r3   Úset_default_headersz(AuthenticatedHandler.set_default_headerso   sš   € àˆØ,5ˆÐ(Ñ)Ø�‰�t—}‘}×(Ñ(¨°BÓ7Ô8à-1×-IÑ-IˆÐ)Ñ*ð #*§-¡-¦/ÑˆK˜ðØ—‘ ¨UÕ3ñ #2øô ò ð —‘×"Ñ"Ø7¸÷ñ ûð	ús   ÁA.Á.	BÁ7BÂBc                óp   — t        j                  dt        d¬«       | j                  j	                  | «      S )NúqJupyterHandler.login_handler is deprecated in 2.0,
            use JupyterHandler.identity_provider.
            é   ©Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚidentity_providerÚget_cookie_namerB   s    r3   Úcookie_namez AuthenticatedHandler.cookie_nameƒ   s4   € ä�‰ðô Øõ	
ð ×%Ñ%×5Ñ5°dÓ;Ð;r2   Nc                óz   — t        j                  dt        d¬«       | j                  j	                  | |||¬«       y)zForce a cookie clear.rV   rW   rX   )ÚpathÚdomainN)rZ   r[   r\   r]   Ú_force_clear_cookie)rC   Únamera   rb   s       r3   Úforce_clear_cookiez'AuthenticatedHandler.force_clear_cookieŽ   s;   € ä�‰ðô Øõ	
ð 	×Ñ×2Ñ2°4¸ÀDÐQWÐ2ÕXr2   c                ór   — t        j                  dt        d¬«       | j                  j	                  | «       y)zClear a login cookie.rV   rW   rX   N)rZ   r[   r\   r]   Úclear_login_cookierB   s    r3   rg   z'AuthenticatedHandler.clear_login_cookie™   s1   € ä�‰ðô Øõ	
ð 	×Ñ×1Ñ1°$Õ7r2   c                óÌ   — | j                   j                  }d|› d�}t        | d«      r2t        j                  |t
        d¬«       t        d| j                  «      S t        |«      ‚)zGet the current user.z	Calling `z{.get_current_user()` directly is deprecated in jupyter-server 2.0. Use `self.current_user` instead (works in all versions).Ú_jupyter_current_userrW   rX   r<   )	Ú	__class__Ú__name__ÚhasattrrZ   r[   r\   r
   ri   ÚRuntimeError)rC   ÚclsnameÚmsgs      r3   Úget_current_userz%AuthenticatedHandler.get_current_user¤   sk   € à—.‘.×)Ñ)ˆà˜�yð !Hð Hð 	ô �4Ð0Ô1ä�M‰MØÜ"Øõô
 ˜˜t×9Ñ9Ó:Ð:ä˜3ÓÐr2   c                ón   — | j                   j                  dk(  ry| j                  j                  | «       S )zÂAsk my login_handler if I should skip the origin_check

        For example: in the default LoginHandler, if a request is token-authenticated,
        origin checking should be skipped.
        ÚOPTIONST)ÚrequestÚmethodr]   Úshould_check_originrB   s    r3   Úskip_check_originz&AuthenticatedHandler.skip_check_origin¶   s3   € ð �<‰<×Ñ )Ò+àØ×)Ñ)×=Ñ=¸dÓCÐCÐCr2   c                ó8   — | j                   j                  | «      S )z'Have I been authenticated with a token?)r]   Úis_token_authenticatedrB   s    r3   Útoken_authenticatedz(AuthenticatedHandler.token_authenticatedÁ   s   € ð ×%Ñ%×<Ñ<¸TÓBÐBr2   c                ó>   — | j                   }t        |xr |dk7  «      S )zIs a user currently logged in?Ú	anonymous)Úcurrent_userÚbool)rC   Úusers     r3   Ú	logged_inzAuthenticatedHandler.logged_inÆ   s$   € ð × Ñ ˆÜ�DÒ0˜T [Ñ0Ó1Ð1r2   c                óf   — t        j                  dt        d¬«       | j                  j                  S )z6Return the login handler for this application, if any.rV   rW   rX   )rZ   r[   r\   r]   Úlogin_handler_classrB   s    r3   Úlogin_handlerz"AuthenticatedHandler.login_handlerÌ   s1   € ô 	�‰ðô Øõ	
ð ×%Ñ%×9Ñ9Ð9r2   c                ó.   — | j                   j                  S )z4Return the login token for this application, if any.)r]   ÚtokenrB   s    r3   r„   zAuthenticatedHandler.tokenØ   s   € ð ×%Ñ%×+Ñ+Ð+r2   c                óB   — t        d| j                  j                  «      S )zªMay a user proceed to log in?

        This returns True if login capability is available, irrespective of
        whether the user is already logged in or not.

        r}   )r
   r]   Úlogin_availablerB   s    r3   r†   z$AuthenticatedHandler.login_availableÝ   s   € ô �F˜D×2Ñ2×BÑBÓCÐCr2   c                ó  — d| j                   vrXt        j                  dd¬«       ddlm}  || j                   j                  dd «      | j                  ¬«      | j                   d<   t        d	| j                   j                  d«      «      S )
NÚ
authorizeraª  The Tornado web application does not have an 'authorizer' defined in its settings. In future releases of jupyter_server, this will be a required key for all subclasses of `JupyterHandler`. For an example, see the jupyter_server source code for how to add an authorizer to the tornado settings: https://github.com/jupyter-server/jupyter_server/blob/653740cbad7ce0c8a8752ce83e4d3c2c754b13cb/jupyter_server/serverapp.py#L234-L256rW   rX   r   )ÚAllowAllAuthorizerÚconfig)rŠ   r]   r%   )r@   rZ   r[   Újupyter_server.authr‰   rA   r]   r
   )rC   r‰   s     r3   rˆ   zAuthenticatedHandler.authorizerç   sw   € à˜tŸ}™}Ñ,Ü�M‰Mðð õ
õ ?á*<Ø—}‘}×(Ñ(¨°4Ó8Ø"&×"8Ñ"8ô+ˆD�M‰M˜,Ñ'ô
 �L $§-¡-×"3Ñ"3°LÓ"AÓBÐBr2   c                óê   — d| j                   vrMt        j                  dd¬«       ddlm}  || j                   j                  dd «      ¬«      | j                   d<   t        d	| j                   d   «      S )
Nr]   a‘  The Tornado web application does not have an 'identity_provider' defined in its settings. In future releases of jupyter_server, this will be a required key for all subclasses of `JupyterHandler`. For an example, see the jupyter_server source code for how to add an identity provider to the tornado settings: https://github.com/jupyter-server/jupyter_server/blob/v2.0.0/jupyter_server/serverapp.py#L242rW   rX   r   r&   rŠ   )rŠ   r'   )r@   rZ   r[   r‹   r'   rA   r
   )rC   r'   s     r3   r]   z&AuthenticatedHandler.identity_providerþ   sn   € à d§m¡mÑ3Ü�M‰Mð3ð õ	õ =ñ 2BØ—}‘}×(Ñ(¨°4Ó8ô2ˆD�M‰MÐ-Ñ.ô Ð&¨¯©Ð6IÑ(JÓKÐKr2   ©Úreturnr<   ©rŽ   ÚNone)r>   N)rd   r<   ra   r<   rb   ú
str | NonerŽ   r�   ©rŽ   r}   )rŽ   r	   ©rŽ   r‘   )rŽ   r%   )rŽ   r'   )rk   Ú
__module__Ú__qualname__Ú__doc__Úpropertyr=   rI   rT   r_   re   rg   rp   rv   ry   r   r‚   r„   r†   rˆ   r]   r1   r2   r3   r:   r:   U   sî   „ Ù6àò?ó ð?ð ò
ó ð
ó$ð( ò<ó ð<ô	Yó	8ó ó$	Dð òCó ðCð ò2ó ð2ð
 ò	:ó ð	:ð ò,ó ð,ð òDó ðDð òCó ðCð, òLó ñLr2   r:   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d*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d.d„«       Zed/d„«       Zed0d„«       Zed1d„«       Zed*d„«       Zed2d„«       Zed3d„«       Zd4ˆ fd„Zd4d„Zd5d„Zd2d„Zd6d7d„Zd3d„Zd4ˆ fd„Zd3d„Z ddœd8ˆ fd „Z!d!„ Z"d"„ Z#ed(d#„«       Z$d&d$„Z%d9d%„Z&ˆ xZ'S ):ÚJupyterHandlerzwJupyter-specific extensions to authenticated handling

    Mostly property shortcuts to Jupyter-specific settings.
    c                óN   — t        d| j                  j                  dd «      «      S )Núdict[str, Any] | NonerŠ   r?   rB   s    r3   rŠ   zJupyterHandler.config  s!   € äÐ+¨T¯]©]×->Ñ->¸xÈÓ-NÓOÐOr2   c                ó   — t        «       S )z@use the Jupyter log by default, falling back on tornado's logger)r8   rB   s    r3   r8   zJupyterHandler.log  s   € ô ‹uˆr2   c                óN   — t        d| j                  j                  di «      «      S )z2User-supplied values to supply to jinja templates.údict[str, Any]Újinja_template_varsr?   rB   s    r3   rŸ   z"JupyterHandler.jinja_template_vars#  s$   € ô Ð$ d§m¡m×&7Ñ&7Ð8MÈrÓ&RÓSÐSr2   c                ó4   — t        d| j                  d   «      S )NúServerApp | NoneÚ	serverapp©r
   r@   rB   s    r3   r¢   zJupyterHandler.serverapp(  s   € äÐ&¨¯©°kÑ(BÓCÐCr2   c                óN   — t        d| j                  j                  dd«      «      S )z8The version hash to use for cache hints for static filesr<   Úversion_hashÚ r?   rB   s    r3   r¥   zJupyterHandler.version_hash0  ó"   € ô �E˜4Ÿ=™=×,Ñ,¨^¸RÓ@ÓAÐAr2   c                ó˜   — t        d| j                  j                  dd«      «      }|rt        |«      r|S t	        | j
                  |«      S )Nr<   Úmathjax_urlr¦   )r
   r@   rA   r   r   r=   )rC   Úurls     r3   r©   zJupyterHandler.mathjax_url5  s?   € ä�5˜$Ÿ-™-×+Ñ+¨M¸2Ó>Ó?ˆÙ”o cÔ*ØˆJÜ˜TŸ]™]¨CÓ0Ð0r2   c                óN   — t        d| j                  j                  dd«      «      S )Nr<   Úmathjax_configzTeX-AMS-MML_HTMLorMML-full,Safer?   rB   s    r3   r¬   zJupyterHandler.mathjax_config<  s"   € ä�E˜4Ÿ=™=×,Ñ,Ð-=Ð?`ÓaÓbÐbr2   c                óN   — t        d| j                  j                  dd«      «      S )Nr<   Údefault_urlr¦   r?   rB   s    r3   r®   zJupyterHandler.default_url@  s    € ä�E˜4Ÿ=™=×,Ñ,¨]¸BÓ?Ó@Ð@r2   c                óN   — t        d| j                  j                  dd«      «      S )Nr<   Úwebsocket_urlr¦   r?   rB   s    r3   Úws_urlzJupyterHandler.ws_urlD  s    € ä�E˜4Ÿ=™=×,Ñ,¨_¸bÓAÓBÐBr2   c                óº   — | j                   j                  d| j                  j                  dd«      «       t	        d| j                  j                  dd«      «      S )NzUsing contents: %sÚcontents_js_sourcezservices/contentsr<   )r8   Údebugr@   rA   r
   rB   s    r3   r³   z!JupyterHandler.contents_js_sourceH  sM   € à�‰�‰Ø Ø�M‰M×ÑÐ2Ð4GÓHô	
ô �E˜4Ÿ=™=×,Ñ,Ð-AÐCVÓWÓXÐXr2   c                ó4   — t        d| j                  d   «      S )Nr+   Úkernel_managerr£   rB   s    r3   r¶   zJupyterHandler.kernel_managerT  s   € äÐ/°·±Ð?OÑ1PÓQÐQr2   c                ó4   — t        d| j                  d   «      S )Nr*   Úcontents_managerr£   rB   s    r3   r¸   zJupyterHandler.contents_managerX  ó   € äÐ% t§}¡}Ð5GÑ'HÓIÐIr2   c                ó4   — t        d| j                  d   «      S )Nr,   Úsession_managerr£   rB   s    r3   r»   zJupyterHandler.session_manager\  s   € äÐ$ d§m¡mÐ4EÑ&FÓGÐGr2   c                ó4   — t        d| j                  d   «      S )Nr#   Úterminal_managerr£   rB   s    r3   r½   zJupyterHandler.terminal_manager`  r¹   r2   c                ó4   — t        d| j                  d   «      S )Nr!   Úkernel_spec_managerr£   rB   s    r3   r¿   z"JupyterHandler.kernel_spec_managerd  s   € äÐ'¨¯©Ð7LÑ)MÓNÐNr2   c                ó4   — t        d| j                  d   «      S )Nr)   Úconfig_managerr£   rB   s    r3   rÁ   zJupyterHandler.config_managerh  s   € ä�O T§]¡]Ð3CÑ%DÓEÐEr2   c                ó4   — t        d| j                  d   «      S )Nr"   Úevent_loggerr£   rB   s    r3   rÃ   zJupyterHandler.event_loggerl  s   € ä�M 4§=¡=°Ñ#@ÓAÐAr2   c                óN   — t        d| j                  j                  dd«      «      S )z"Normal Access-Control-Allow-Originr<   Úallow_originr¦   r?   rB   s    r3   rÅ   zJupyterHandler.allow_origint  r§   r2   c                óN   — t        d| j                  j                  dd«      «      S )z*Regular expression version of allow_originr‘   Úallow_origin_patNr?   rB   s    r3   rÇ   zJupyterHandler.allow_origin_paty  s#   € ô �L $§-¡-×"3Ñ"3Ð4FÈÓ"MÓNÐNr2   c                óN   — t        d| j                  j                  dd«      «      S )z/Whether to set Access-Control-Allow-Credentialsr}   Úallow_credentialsFr?   rB   s    r3   rÉ   z JupyterHandler.allow_credentials~  s#   € ô �F˜DŸM™M×-Ñ-Ð.AÀ5ÓIÓJÐJr2   c                ó"   •— t         ‰| �  «        y)zAdd CORS headers, if definedN)ÚsuperrT   ©rC   rj   s    €r3   rT   z"JupyterHandler.set_default_headersƒ  s   ø€ ä‰Ñ#Õ%r2   c                óâ  — | j                   r| j                  d| j                   «       n§| j                  r;| j                  «       }|r‰t	        | j                  |«      rs| j                  d|«       n`| j
                  rTd| j                  j                  di «      vr6| j                  d| j                  j                  j                  dd«      «       | j                  r| j                  dd«       yy)z¶Add CORS headers, if defined

        Now that current_user is async (jupyter-server 2.0),
        must be called at the end of prepare(), instead of in set_default_headers.
        úAccess-Control-Allow-OriginrF   ÚOriginr¦   z Access-Control-Allow-CredentialsÚtrueN)rÅ   rN   rÇ   Ú
get_originr   ry   r@   rA   rs   rF   rÉ   ©rC   Úorigins     r3   Úset_cors_headerszJupyterHandler.set_cors_headers‡  sÈ   € ð ×ÒØ�O‰OÐ9¸4×;LÑ;LÕMØ×"Ò"Ø—_‘_Ó&ˆFÙÔ,¨T×-BÑ-BÀFÔKØ—‘Ð =¸vÕFØ×%Ò%Ð*GÈtÏ}É}×O`ÑO`Ø�róP
ñ +
ð
 �O‰OÐ9¸4¿<¹<×;OÑ;O×;SÑ;SÐT\Ð^`Ó;aÔbà×!Ò!Ø�O‰OÐ>ÀÕGð "r2   c                óD   — t        |«      }| j                  dd|› �«       y)zpSet Content-Disposition: attachment header

        As a method to ensure handling of filename encoding
        zContent-Dispositionzattachment; filename*=utf-8''N)r   rN   )rC   ÚfilenameÚescaped_filenames      r3   Úset_attachment_headerz$JupyterHandler.set_attachment_header�  s*   € ô
 & hÓ/ÐØ�‰Ø!Ø+Ð,<Ð+=Ð>õ	
r2   c                óÐ   — d| j                   j                  v r'| j                   j                  j                  d«      }|S | j                   j                  j                  dd «      }|S )NrÏ   zSec-Websocket-Origin)rs   rF   rA   rÒ   s     r3   rÑ   zJupyterHandler.get_origin¨  s[   € ð
 �t—|‘|×+Ñ+Ñ+Ø—\‘\×)Ñ)×-Ñ-¨hÓ7ˆFð ˆð —\‘\×)Ñ)×-Ñ-Ð.DÀdÓKˆFØˆr2   c                ó6  — | j                   dk(  s| j                  «       ry| j                  j                  j	                  d«      }| j                  j                  j	                  d«      }|�|€y|j                  «       }t        |«      j                  }||k(  ry| j                   rt        | j                   |k(  «      }n%| j                  rt        | j                  |«      }nd}|s2| j                  j                  d| j                  j                  ||«       |S )zÙCheck Origin for cross-site API requests, including websockets

        Copied from WebSocket with changes:

        - allow unspecified host/origin (e.g. scripts)
        - allow token-authenticated requests
        Ú*TÚHostrÏ   Fz?Blocking Cross Origin API request for %s.  Origin: %s, Host: %s)rÅ   rv   rs   rF   rA   Úlowerr   Únetlocr}   rÇ   r   r8   Úwarningra   )rC   Úorigin_to_satisfy_tornadoÚhostrÓ   Úorigin_hostÚallows         r3   Úcheck_originzJupyterHandler.check_originµ  sþ   € ð ×Ñ Ò# t×'=Ñ'=Ô'?Øà�|‰|×#Ñ#×'Ñ'¨Ó/ˆØ—‘×%Ñ%×)Ñ)¨(Ó3ˆð ˆ>˜T˜\Øà—‘“ˆÜ˜vÓ&×-Ñ-ˆð ˜$ÒØð ×ÒÜ˜×*Ñ*¨fÑ4Ó5‰EØ×"Ò"Ü& t×'<Ñ'<¸fÓE‰Eð ˆEÙØ�H‰H×ÑØQØ—‘×!Ñ!ØØô	ð ˆr2   c                ó¬  — | j                   dk(  s| j                  «       ry| j                  j                  j	                  d«      }| j                  j                  j	                  d«      }|s| j
                  j                  d«       y|s| j
                  j                  d«       yt        |«      }|j                  }||k(  ry|j                  › d|j                  › �}| j                   r| j                   |k(  }n%| j                  rt        | j                  |«      }nd}|s2| j
                  j                  d	| j                  j                  ||«       |S )
a[  Check Referer for cross-site requests.
        Disables requests to certain endpoints with
        external or missing Referer.
        If set, allow_origin settings are applied to the Referer
        to whitelist specific cross-origin sites.
        Used on GET for api endpoints and /files/
        to block cross-site inclusion (XSSI).
        rÛ   TrÜ   ÚRefererzBlocking request with no hostFz Blocking request with no refererz://z<Blocking Cross Origin request for %s.  Referer: %s, Host: %s)rÅ   rv   rs   rF   rA   r8   rß   r   rÞ   ÚschemerÇ   r   ra   )rC   rá   ÚrefererÚreferer_urlÚreferer_hostrÓ   rã   s          r3   Úcheck_refererzJupyterHandler.check_refererä  s3  € ð ×Ñ Ò# t×'=Ñ'=Ô'?Øà�|‰|×#Ñ#×'Ñ'¨Ó/ˆØ—,‘,×&Ñ&×*Ñ*¨9Ó5ˆáØ�H‰H×ÑÐ<Ô=ØÙØ�H‰H×ÑÐ?Ô@Øä˜wÓ'ˆØ"×)Ñ)ˆØ˜4ÒØð  ×&Ñ&Ð' s¨;×+=Ñ+=Ð*>Ð?ˆØ×ÒØ×%Ñ%¨Ñ/‰EØ×"Ò"Ü& t×'<Ñ'<¸fÓE‰Eð ˆEáØ�H‰H×ÑØNØ—‘×!Ñ!ØØô	ð ˆr2   c                óø  •— t        | d«      sy| j                  s| j                  j                  dd«      ry	 | j	                  «       st        j                  d«      ‚t        ‰| �!  «       S # t
        j                  $ rz}| j                  j                  dv rW| j                  «       sH| j                  j                  j                  d«      }|rd|› d	�}nd
}t        j                  d|«      |‚‚ Y d}~yd}~ww xY w)z2Bypass xsrf cookie checks when token-authenticatedri   NÚdisable_check_xsrfFé”  >   ÚGETÚHEADræ   z#Blocking Cross Origin request from Ú.z$Blocking request from unknown originé“  )rl   ry   r@   rA   rä   r   Ú	HTTPErrorrË   Úcheck_xsrf_cookiers   rt   rë   rF   )rC   rS   rè   ro   rj   s       €r3   rô   z JupyterHandler.check_xsrf_cookie  sÞ   ø€ ä�tÐ4Ô5àØ×#Ò# t§}¡}×'8Ñ'8Ð9MÈuÔ'Uð ð	Ø×$Ñ$Ô&Ü—m‘m CÓ(Ð(Ü‘7Ñ,Ó.Ð.øÜ�}‰}ò 	Ø�|‰|×"Ñ" oÑ5à×)Ñ)Ô+Ø"Ÿl™l×2Ñ2×6Ñ6°yÓA�GÙØ CÀGÀ9ÈAÐN™àD˜ÜŸ-™-¨¨SÓ1°qÐ8àô ,ûð	ús   ¹2A, Á,C9Á?A0C4Ã4C9c                óŽ  — | j                   j                  dd«      ryt        j                  d| j                  j
                  «      }|€J ‚|j                  d«      }|j                  d«      r|j                  d«      r|dd }t        |«      }|j                  d	«      r"t        j                  j                  |«      rd}n"	 t        j                  |«      }|j                  }|s1| j"                  j%                  d|| j                  j
                  «       |S # t         $ r" || j                   j                  d
dg«      v }Y Œ_w xY w)z‚Check the host header if remote access disallowed.

        Returns True if the request should continue, False otherwise.
        Úallow_remote_accessFTz^(.*?)(:\d+)?$é   Ú[Ú]éÿÿÿÿr>   Úlocal_hostnamesÚ	localhostz˜Blocking request with non-local 'Host' %s (%s). If the server should be accessible at that name, set ServerApp.allow_remote_access to disable the check.)r@   rA   ÚreÚmatchrs   rá   ÚgroupÚ
startswithÚendswithr   Úosra   ÚexistsÚ	ipaddressÚ
ip_addressÚis_loopbackÚ
ValueErrorr8   rß   )rC   rþ   rá   Ú
check_hostrã   Úaddrs         r3   r  zJupyterHandler.check_host,  s+  € ð
 �=‰=×ÑÐ2°EÔ:Øô —‘Ð*¨D¯L©L×,=Ñ,=Ó>ˆØÐ Ð Ð Ø�{‰{˜1‹~ˆð �?‰?˜3Ô D§M¡M°#Ô$6Ø˜˜"�:ˆDô 0°Ó5ˆ
Ø× Ñ  Ô%¬"¯'©'¯.©.¸Ô*DØ‰Eð)Ü ×+Ñ+¨DÓ1�ð
 ×(Ñ(�áØ�H‰H×ÑðNð Ø—‘×!Ñ!ôð ˆøô! ò Tà §¡× 1Ñ 1Ð2CÀkÀ]Ó SÐS’ðTús   ÃD Ä(EÅET)Ú_redirect_to_loginc             ƒ  óÈ  •K  — t        j                  t         j                  | «       | j                  «       s#dx| _        | _        t        j                  d«      ‚ddlm	} t        j                  | j                  «      }|€J ‚d}t        | j                  «      |u rI|j                  t        k7  r6t!        j"                  dt$        d¬«       t'        | j                  «       «      }n7| j                  j)                  | «      }t+        |t,        «      r
|ƒ d{  –—† }|}|x| _        | _        | j/                  «        | j0                  j2                  dvr| j5                  «        | j6                  j9                  d	d
«      sÒ| j0                  j2                  st        d«      ‚t;        | | j0                  j2                  j=                  «       «      }t;        |dd
«      sv|r t        j>                  ˆfd„«      | «      S | j                  }|€H| j@                  jC                  d| jD                  j                  › d�«       t        j                  d«      ‚tF        ‰| �‘  «       S 7 �ŒI­w)zPrepare a response.Nrò   r   r&   znOverriding JupyterHandler.get_current_user is deprecated in jupyter-server 2.0. Use an IdentityProvider class.r÷   rX   >   rï   rð   rr   Úallow_unauthenticated_accessFÚ__allow_unauthenticatedc                ó    •— t         ‰| �  «       S ©N)rË   Úprepare)Ú_rj   s    €r3   Ú<lambda>z(JupyterHandler.prepare.<locals>.<lambda>ˆ  s   ø€ ´u±w±Ô7Hr2   zCouldn't authenticate z connection)%r   ÚsetÚJUPYTER_HANDLERr  r|   ri   r   ró   r‹   r'   ÚinspectÚ	getmodulerp   Útyper]   rk   rZ   r[   r\   r   Úget_userÚ
isinstancer   rÔ   rs   rt   rô   r@   rA   ÚgetattrrÝ   Úauthenticatedr8   rß   rj   rË   r  )rC   r
  r'   Úmod_objr~   Ú_userrt   rj   s          €r3   r  zJupyterHandler.prepareV  sþ  øè ø€ ô 	�‰œ×3Ñ3°TÔ:à�‰Ô Ø=AÐAˆDÔ Ô :Ü—-‘- Ó$Ð$å8ä×#Ñ# D×$9Ñ$9Ó:ˆØÐ"Ð"Ð"Ø ˆä�×&Ñ&Ó'Ð+;Ñ;À×@PÑ@PÔT\Ò@\ô �M‰Mð2ä"Øõ	ô ˜×-Ñ-Ó/Ó0‰Dà×*Ñ*×3Ñ3°DÓ9ˆEÜ˜%¤Ô+à#Ÿ�ØˆDð
 :>Ð=ˆÔ˜DÔ6à×ÑÔØ�<‰<×ÑÐ&@Ñ@Ø×"Ñ"Ô$à�}‰}× Ñ Ð!?ÀÔGØ—<‘<×&Ò&Ü “nÐ$Ü˜T 4§<¡<×#6Ñ#6×#<Ñ#<Ó#>Ó?ˆFÜ˜6Ð#<¸eÔDÙ%ð Jœ3×,Ñ,Ó-HÓIÈ$ÓOÐOð  ×,Ñ,�DØ�|ØŸ™×(Ñ(Ø4°T·^±^×5LÑ5LÐ4MÈ[ÐYôô "Ÿm™m¨CÓ0Ð0ä‰w‰Ó Ð ð= $ûs   ƒDI"ÄIÄE	I"c                ó>   — | j                   d   j                  |«      S )z1Return the jinja template object for a given nameÚ
jinja2_env)r@   Úget_template)rC   rd   s     r3   r   zJupyterHandler.get_template˜  s   € à�}‰}˜\Ñ*×7Ñ7¸Ó=Ð=r2   c                ó~   — |j                  | j                  «       | j                  |«      } |j                  di |¤ŽS )zRender a template by name.r1   )rL   Útemplate_namespacer   Úrender)rC   rd   ÚnsÚtemplates       r3   Úrender_templatezJupyterHandler.render_templateœ  s8   € à
�	‰	�$×)Ñ)Ô*Ø×$Ñ$ TÓ*ˆØˆx�‰Ñ$ Ñ$Ð$r2   c                ó¢  — t        di d| j                  “d| j                  “d| j                  “d| j                  “dt        | j                  dd«      “d| j                  j                  “d| j                  j                  “d	t        | j                  «      “d
| j                  “dt        «       “d| j                  “d| j                  “d| j                  “d| j                  “d| j                   j#                  d«      “dt%        j&                  t)        | j*                  j,                  j/                  dd«      «      «      “| j0                  ¤ŽS )Nr=   r®   r±   r   Úallow_password_changeFÚauth_enabledr†   Útoken_availableÚ
static_urlÚsys_infor³   r¥   Úxsrf_form_htmlr„   Ú
xsrf_tokenÚutf8Únbjs_translationszAccept-Languager¦   r1   )Údictr=   r®   r±   r   r  r]   r)  r†   r}   r„   r+  r4   r³   r¥   r-  r.  Údecoder/   r0   r   rs   rF   rA   rŸ   rB   s    r3   r"  z!JupyterHandler.template_namespace¢  sO  € äò 
Ø—]’]ð
à×(Ò(ð
ð —;’;ð
ð —n’nð	
ô
 #*¨$×*@Ñ*@ÐBYÐ[`Ô"að
ð ×/Ñ/×<Ò<ð
ð !×2Ñ2×BÒBð
ô ! §¡Ô,ð
ð —’ð
ô #”_ð
ð  $×6Ò6ð
ð ×*Ò*ð
ð  ×.Ò.ð
ð —*’*ð
ð —‘×-Ñ-¨fÔ5ð
ô  #Ÿj™jÜ$ T§\¡\×%9Ñ%9×%=Ñ%=Ð>OÐQSÓ%TÓUôð ×&Ñ&ñ'
ð 	
r2   c                óœ  — | j                   j                  sy| j                   j                  j                  «       j                  d«      }	 t	        j
                  |«      }t        d	|«      S # t        $ rU}| j                  j                  d|«       | j                  j                  dd¬«       t        j                  dd«      |‚d}~ww xY w)
z,Return the body of the request as JSON data.Nzutf-8zBad JSON: %rzCouldn't parse JSONT)Úexc_infoi�  zInvalid JSON in body of requestrž   )rs   ÚbodyÚstripr2  r/   ÚloadsrO   r8   r´   Úerrorr   ró   r
   )rC   r5  ÚmodelrS   s       r3   Úget_json_bodyzJupyterHandler.get_json_bodyº  s¨   € à�|‰|× Ò Øà�|‰|× Ñ ×&Ñ&Ó(×/Ñ/°Ó8ˆð	OÜ—J‘J˜tÓ$ˆEô
 Ð$ eÓ,Ð,øô	 ò 	OØ�H‰H�N‰N˜>¨4Ô0Ø�H‰H�N‰NÐ0¸4ˆNÔ@Ü—-‘- Ð%FÓGÈQÐNûð	Oús   ÁA- Á-	CÁ6ACÃCc                ó¢  — |j                  d«      }d}t        j                   |d«      }|r1|d   }	 |j                  |j                  z  }t        |dd«      }|r|}nd}||||dœ}| j                  dd	«       	  | j                  d
|z  fi |¤Ž}	| j                  |	«       y# t        $ r Y Œaw xY w# t        $ r  | j                  di |¤Ž}	Y Œ>w xY w)zrender custom error pagesr4  r¦   úUnknown HTTP Errorr÷   Úreasonz	(unknown))Ústatus_codeÚstatus_messageÚmessagerP   úContent-Typez	text/htmlz%s.htmlN)z
error.html)
rA   r   Úlog_messageÚargsrO   r  rN   r&  r   Úwrite)
rC   r>  Úkwargsr4  r@  r?  rP   r=  r$  Úhtmls
             r3   Úwrite_errorzJupyterHandler.write_errorÈ  sõ   € à—:‘:˜jÓ)ˆØˆÜ"Ÿ™ {Ð4HÓIˆáØ  ™ˆIðØ#×/Ñ/°)·.±.Ñ@�ô
 ˜Y¨°"Ó5ˆFÙØ!'‘à#ˆIð 'Ø,ØØ"ñ	
ˆð 	�‰˜¨Ô4ð	<Ø'�4×'Ñ'¨	°KÑ(?ÑFÀ2ÑFˆDð 	�
‰
�4Õøô3 ò Ùðûô,  ò 	<Ø'�4×'Ñ'Ñ;¸Ñ;ŠDð	<ús#   ²B! Á9B0 Â!	B-Â,B-Â0CÃC)rŽ   r›   ©rŽ   r    )rŽ   rž   )rŽ   r¡   r�   )rŽ   r+   )rŽ   r*   )rŽ   r,   )rŽ   r#   )rŽ   r!   )rŽ   r)   )rŽ   r"   r“   r’   r�   )rÖ   r<   rŽ   r�   ©r¦   )rà   r<   rŽ   r}   )rŽ   zAwaitable[None] | None©r>  ÚintrE  r	   rŽ   r�   )(rk   r”   r•   r–   r—   rŠ   r8   rŸ   r¢   r¥   r©   r¬   r®   r±   r³   r¶   r¸   r»   r½   r¿   rÁ   rÃ   rÅ   rÇ   rÉ   rT   rÔ   rØ   rÑ   rä   rë   rô   r  r  r   r&  r"  r:  rG  Ú__classcell__©rj   s   @r3   r™   r™     s  ø„ ñð
 òPó ðPð òó ðð òTó ðTð òDó ðDð òBó ðBð ò1ó ð1ð òcó ðcð òAó ðAð òCó ðCð òYó ðYð òRó ðRð òJó ðJð òHó ðHð òJó ðJð òOó ðOð òFó ðFð òBó ðBð òBó ðBð òOó ðOð òKó ðKõ&óHó,	
ó	ô-ó^,õ\ó4(ðT 37÷ <!òD>ò%ð ò
ó ð
ó.-÷$r2   r™   c                  óx   ‡ — e Zd ZdZd
ˆ fd„Zdd„Zdˆ fd„Zedˆ fd„«       ZdZ	d
d„Z
dˆ fd„Zedd	„«       Zˆ xZS )Ú
APIHandlerzBase class for API handlersc              ƒ  óˆ   •K  — t         ‰| �  «       ƒ d{  –—†  | j                  «       st        j                  d«      ‚y7 Œ*­w)zPrepare an API response.Nrî   )rË   r  rä   r   ró   rÌ   s    €r3   r  zAPIHandler.prepareò  s<   øè ø€ ä‰g‰oÓ×ÐØ× Ñ Ô"Ü—-‘- Ó$Ð$ð #ð 	 ús   ƒA•A –+Ac                ó–  — | j                  dd«       t        j                  |d«      }d|i}|j                  d«      }|rG|d   }t        |t        «      r#|j
                  xs ||d<   |j                  |d<   nd|d<   d	|d<   d
|d<   | j                  j                  d|d   «       | j                  t        j                  |«      «       y	)z+APIHandler errors are JSON, not human pagesrA  úapplication/jsonr<  r@  r4  r÷   r=  zUnhandled errorNr¦   Ú	tracebackzwrote error: %r)rN   r   rA   r  ró   rB  r=  r8   rß   Úfinishr/   r0   )rC   r>  rE  r@  Úreplyr4  rS   s          r3   rG  zAPIHandler.write_errorø  sÂ   € à�‰˜Ð(:Ô;Ü—-‘- Ð-AÓBˆà�wð!
ˆð —:‘:˜jÓ)ˆÙØ˜‘ˆAÜ˜!œYÔ'Ø#$§=¡=Ò#;°G��iÑ Ø"#§(¡(��h’à#4��iÑ Ø"&��h‘ð &(��kÑ"Ø�‰×ÑÐ*¨E°)Ñ,<Ô=Ø�‰”D—J‘J˜uÓ%Õ&r2   c                ób   •— | j                   st        j                  d«      ‚t        ‰| �  «       S )zGet the login url.rò   )r|   r   ró   rË   Úget_login_urlrÌ   s    €r3   rW  zAPIHandler.get_login_url  s+   ø€ ð
 × Ò Ü—-‘- Ó$Ð$Ü‰wÑ$Ó&Ð&r2   c                ó>   •— dj                  t        ‰| �  dg«      }|S )NrG   zdefault-src 'none')rH   rË   rI   )rC   Úcsprj   s     €r3   rI   z"APIHandler.content_security_policy  s(   ø€ à�i‰iä‘Ñ/Ø$ðó
ˆð ˆ
r2   Tc                óŽ   — | j                   r9t        | dd«      r+| j                  dd«      €t        «       | j                  d<   yyyy)z$Update last_activity of API requestsri   NÚno_track_activityÚapi_last_activity)Ú_track_activityr  Úget_argumentr   r@   rB   s    r3   Úupdate_api_activityzAPIHandler.update_api_activity$  sO   € ð × Ò Ü˜Ð5°tÔ<Ø×!Ñ!Ð"5°tÓ<ÐDä17³ˆD�M‰MÐ-Ò.ð Eð =ð !r2   c                óŠ   •— | j                  «        |j                  dd«      }| j                  d|«       t        ‰| �  |i |¤ŽS )zFinish an API response.Úset_content_typerR  rA  )r_  ÚpoprN   rË   rT  )rC   rC  rE  ra  rj   s       €r3   rT  zAPIHandler.finish.  sE   ø€ à× Ñ Ô"à!Ÿ:™:Ð&8Ð:LÓMÐØ�‰˜Ð(8Ô9Ü‰w‰~˜tÐ. vÑ.Ð.r2   c                óX  — d| j                   j                  di «      v r#| j                  d| j                   d   d   «       n| j                  dd«       | j                  dd«       | j                  j                  j                  dd«      j                  d«      }|rŽt        d	„ |D «       «      r{| j                  rn| j                  s*| j                  sd
| j                   j                  di «      v r7| j                  d
| j                  j                  j                  dd«      «       yyyyy)zGet the options.zAccess-Control-Allow-HeadersrF   z0accept, content-type, authorization, x-xsrftokenzAccess-Control-Allow-Methodsz&GET, PUT, POST, PATCH, DELETE, OPTIONSzAccess-Control-Request-Headersr¦   Ú,c              3  ó^   K  — | ]%  }|j                  «       j                  «       d k(  –— Œ' y­w)ÚauthorizationN)r6  rÝ   )Ú.0Úhs     r3   Ú	<genexpr>z%APIHandler.options.<locals>.<genexpr>P  s%   è ø€ ÐTÑBS¸Q�A—G‘G“I—O‘OÓ%¨Õ8ÑBSùs   ‚+-rÎ   rÏ   N)
r@   rA   rN   rs   rF   ÚsplitÚanyr†   rÅ   rÇ   )rC   rC  rE  Úrequested_headerss       r3   ÚoptionszAPIHandler.options6  s   € ð *¨T¯]©]×->Ñ->¸yÈ"Ó-MÑMØ�O‰OØ.Ø—‘˜iÑ(Ð)GÑHõð
 �O‰OØ.ØBôð 	�‰Ð6Ð8`Ôað !ŸL™L×0Ñ0×4Ñ4Ð5UÐWYÓZ×`Ñ`Øó
Ðñ ÜÑTÑBSÓTÔTð ×$Ò$ð ×!Ò!Ø×(Ò(Ø0°D·M±M×4EÑ4EÀiÐQSÓ4TÑTð �O‰OÐ9¸4¿<¹<×;OÑ;O×;SÑ;SÐT\Ð^`Ó;aÕbð Uð %ð	 Uð r2   r�   rJ  r�   )rC  r	   rE  r	   rŽ   zFuture[Any])rC  r	   rE  r	   rŽ   r�   )rk   r”   r•   r–   r  rG  rW  r—   rI   r]  r_  rT  r   rm  rL  rM  s   @r3   rO  rO  ï  sP   ø„ Ù%õ%ó'õ,'ð ôó ðð €Oó:õ/ð ò%có ô%cr2   rO  c                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )ÚTemplate404zRender our 404 templatec              ƒ  óf   •K  — t         ‰| �  «       ƒ d{  –—†  t        j                  d«      ‚7 Œ­w)zPrepare a 404 response.Nrî   )rË   r  r   ró   rÌ   s    €r3   r  zTemplate404.prepareb  s+   øè ø€ ä‰g‰oÓ×ÐÜ�m‰m˜CÓ Ð ð 	 ús   ƒ1•/–1r�   )rk   r”   r•   r–   r  rL  rM  s   @r3   ro  ro  _  s   ø„ Ù!÷!ñ !r2   ro  c                  óÎ   ‡ — e Zd ZdZdZed
ˆ fd„«       Zej                  e	dˆ fd„«       «       Z
ej                  e		 	 	 	 	 	 dd„«       «       Zd
ˆ fd„Zdˆ fd„Zdd„Zdˆ fd	„Zˆ xZS )ÚAuthenticatedFileHandlerz5static files should only be accessible when logged inÚcontentsc                ó   •— t         ‰| �  dz   S )Nz; sandbox allow-scripts)rË   rI   rÌ   s    €r3   rI   z0AuthenticatedFileHandler.content_security_policym  s   ø€ ô ‰wÑ.Ð1JÑJÐJr2   c                óB   •— | j                  «        t        ‰| �	  |«      S )z!Get the head response for a path.)rô   rË   Úhead©rC   ra   rj   s     €r3   rv  zAuthenticatedFileHandler.heads  s    ø€ ð 	×ÑÔ Ü‰w‰|˜DÓ!Ð!r2   c                ó  — | j                  «        t        j                  j                  |«      d   dk(  s| j	                  dd«      r&|j                  dd«      d   }| j                  |«       t        j                  j                  | |fi |¤ŽS )zGet a file by path.r÷   ú.ipynbÚdownloadNr>   rú   )
rô   r  ra   Úsplitextr^  ÚrsplitrØ   r   ÚStaticFileHandlerrA   )rC   ra   rE  rd   s       r3   rA   zAuthenticatedFileHandler.getz  s}   € ð 	×ÑÔ Ü�7‰7×Ñ˜DÓ! !Ñ$¨Ò0°D×4EÑ4EÀjÐRVÔ4WØ—;‘;˜s AÓ& rÑ*ˆDØ×&Ñ& tÔ,ä×$Ñ$×(Ñ(¨¨tÑ>°vÑ>Ð>r2   c                ó
  •— | j                   €J ‚| j                   j                  d«      }d|v r|j                  dd«      \  }}n|}|j                  d«      ryt	        j
                  |«      d   }|dk(  ryt        ‰| �  «       S )zGet the content type.r>   r÷   ry  zapplication/x-ipynb+jsonr   z
text/plainztext/plain; charset=UTF-8)Úabsolute_pathr6  r|  r  Ú	mimetypesÚ
guess_typerË   Úget_content_type)rC   ra   r  rd   Úcur_mimerj   s        €r3   r‚  z)AuthenticatedFileHandler.get_content_type‡  sˆ   ø€ à×!Ñ!Ð-Ð-Ð-Ø×!Ñ!×'Ñ'¨Ó,ˆØ�$‰;Ø—k‘k # qÓ)‰GˆA‰tàˆDØ�=‰=˜Ô"Ø-ä ×+Ñ+¨DÓ1°!Ñ4ˆHØ˜<Ò'Ø2ä‘wÑ/Ó1Ð1r2   c                óx   •— t         ‰| �  «        d| j                  j                  vr| j	                  dd«       yy)úSet the headers.ÚvúCache-Controlúno-cacheN)rË   Úset_headersrs   Ú	argumentsÚ
add_headerrÌ   s    €r3   r‰  z$AuthenticatedFileHandler.set_headers˜  s3   ø€ ä‰ÑÔà�d—l‘l×,Ñ,Ñ,Ø�O‰O˜O¨ZÕ8ð -r2   c                 ó   — y©zCompute the etag.Nr1   rB   s    r3   Úcompute_etagz%AuthenticatedFileHandler.compute_etagŸ  ó   € àr2   c                ó  •— t         ‰| �  ||«      }t        j                  j	                  |«      }|€J ‚| j
                  j                  s<t        ||«      r0| j                  j                  d«       t        j                  d«      ‚|S )z�Validate and return the absolute path.

        Requires tornado 3.1

        Adding to tornado's own handling, forbids the serving of hidden files.
        z_Refusing to serve hidden file, via 404 Error, use flag 'ContentsManager.allow_hidden' to enablerî   )rË   Úvalidate_absolute_pathr  ra   Úabspathr¸   Úallow_hiddenr   r8   Úinfor   ró   )rC   Úrootr  Úabs_pathÚabs_rootrj   s        €r3   r‘  z/AuthenticatedFileHandler.validate_absolute_path£  su   ø€ ô ‘7Ñ1°$¸ÓFˆÜ—7‘7—?‘? 4Ó(ˆØÐ#Ð#Ð#Ø×$Ñ$×1Ò1´iÀÈ(Ô6SØ�H‰H�M‰MØqôô —-‘- Ó$Ð$Øˆr2   r�   ©ra   r<   rŽ   úAwaitable[None])ra   r<   rE  r	   rŽ   r™  r�   r“   )r•  r<   r  r<   rŽ   r<   )rk   r”   r•   r–   Úauth_resourcer—   rI   r   r  r   rv  rA   r‚  r‰  rŽ  r‘  rL  rM  s   @r3   rr  rr  h  s”   ø„ Ù?à€MàôKó ðKð
 	×ÑØô"ó ó ð"ð
 	×ÑØð	?Øð	?Ø#&ð	?à	ò	?ó ó ð	?õ2õ"9ó÷ñ r2   rr  c                óz   ‡ — t        j                  dt        d¬«       t        j                  ‰ «      ˆ fd„«       }|S )a™  Decorate methods with this to return GitHub style JSON errors.

    This should be used on any JSON API on any handler method that can raise HTTPErrors.

    This will grab the latest HTTPError exception using sys.exc_info
    and then:

    1. Set the HTTP status code based on the HTTPError
    2. Create and return a JSON body with a message field describing
       the error in a human readable form.
    zJ@json_errors is deprecated in notebook 5.2.0. Subclass APIHandler instead.rW   rX   c                ón   •— t        j                  t        j                  | «      | _         ‰| g|¢­i |¤ŽS r  )ÚtypesÚ
MethodTyperO  rG  )rC   rC  rE  rt   s      €r3   Úwrapperzjson_errors.<locals>.wrapperÇ  s3   ø€ ä ×+Ñ+¬J×,BÑ,BÀDÓIˆÔÙ�dÐ,˜TÒ, VÑ,Ð,r2   )rZ   r[   r\   Ú	functoolsÚwraps)rt   rŸ  s   ` r3   Újson_errorsr¢  µ  s>   ø€ ô ‡M�MØTÜØõô ‡_�_�VÓó-ó ð-ð €Nr2   c                  ó®   ‡ — e Zd ZU dZi Zded<   ded<   dˆ fd„Z	 	 d	 	 	 	 	 	 	 dd„Zdd„Ze	ddˆ fd	„«       Z
e	dˆ fd
„«       Zedd„«       Zdˆ fd„Zˆ xZS )ÚFileFindHandlera=  subclass of StaticFileHandler for serving files from a search path

    The setting "static_immutable_cache" can be set up to serve some static
    file as immutable (e.g. file name containing a hash). The setting is a
    list of base URL, every static file URL starting with one of those will
    be immutable.
    zdict[str, str]Ú_static_pathsz
tuple[str]r•  c                ó<  •‡ — t         ‰‰ �  «        ‰ j                  j                  dg «      }t	        ˆ fd„|D «       «      r‰ j                  dd«       yd‰ j                  j                  vst	        ˆ fd„‰ j                  D «       «      r‰ j                  dd«       yy)	r…  Ústatic_immutable_cachec              3  óh   •K  — | ])  }‰j                   j                  j                  |«      –— Œ+ y ­wr  ©rs   ra   r   ©rg  ra   rC   s     €r3   ri  z.FileFindHandler.set_headers.<locals>.<genexpr>ë  s'   øè ø€ ÐN¹o°dˆt�|‰|× Ñ ×+Ñ+¨D×1¹oùó   ƒ/2r‡  z#public, max-age=31536000, immutabler†  c              3  óh   •K  — | ])  }‰j                   j                  j                  |«      –— Œ+ y ­wr  r©  rª  s     €r3   ri  z.FileFindHandler.set_headers.<locals>.<genexpr>ï  s+   øè ø€ ð 6
Ù;N°4ˆD�L‰L×Ñ×(Ñ(¨×.Ñ;Nùr«  rˆ  N)	rË   r‰  r@   rA   rk  rN   rs   rŠ  Úno_cache_paths)rC   Úimmutable_pathsrj   s   ` €r3   r‰  zFileFindHandler.set_headersä  s‡   ù€ ä‰ÑÔàŸ-™-×+Ñ+Ð,DÀbÓIˆô ÓN¹oÓNÔNØ�O‰O˜OÐ-RÕSð ˜Ÿ™×.Ñ.Ñ.´#ó 6
Ø;?×;NÒ;Nó6
ô 3
ð �O‰O˜O¨ZÕ8ð3
r2   c                ó|   — |xs g | _         t        |t        «      r|g}t        d„ |D «       «      | _        || _        y)z!Initialize the file find handler.c              3  ó¶   K  — | ]Q  }t         j                  j                  t         j                  j                  |«      «      t         j                  z   –— ŒS y ­wr  )r  ra   r’  Ú
expanduserÚsep)rg  Úps     r3   ri  z-FileFindHandler.initialize.<locals>.<genexpr>   s8   è ø€ ÐXÑSWÈaœ"Ÿ'™'Ÿ/™/¬"¯'©'×*<Ñ*<¸QÓ*?Ó@Ä2Ç6Á6ÕIÑSWùs   ‚AAN)r­  r  r<   Útupler•  Údefault_filename)rC   ra   rµ  r­  s       r3   Ú
initializezFileFindHandler.initializeô  s=   € ð -Ò2°ˆÔä�dœCÔ Ø�6ˆDäÑXÑSWÓXÓXˆŒ	Ø 0ˆÕr2   c                 ó   — yr�  r1   rB   s    r3   rŽ  zFileFindHandler.compute_etag  r�  r2   c                ó$   •— t         ‰| �  ||«      S r  ©rË   rA   ©rC   ra   Úinclude_bodyrj   s      €r3   rA   zFileFindHandler.get	  ó   ø€ ä‰w‰{˜4 Ó.Ð.r2   c                ó"   •— t         ‰| �  |«      S r  ©rË   rv  rw  s     €r3   rv  zFileFindHandler.head  ó   ø€ ä‰w‰|˜DÓ!Ð!r2   c                ót  — | j                   5  || j                  v r| j                  |   cddd«       S 	 t        j                  j	                  t        ||«      «      }|| j                  |<   t        «       j                  d|› d|› �«       |cddd«       S # t        $ r Y ddd«       yw xY w# 1 sw Y   yxY w)z5locate a file to serve on our static file search pathNr¦   zPath z served from )	Ú_lockr¥  r  ra   r’  r   ÚOSErrorr8   r´   )ÚclsÚrootsra   r’  s       r3   Úget_absolute_pathz!FileFindHandler.get_absolute_path  s¦   € ð �Y‹YØ�s×(Ñ(Ñ(Ø×(Ñ(¨Ñ.÷ ‰YðÜŸ'™'Ÿ/™/¬(°4¸Ó*?Ó@�ð
 '.ˆC×Ñ˜dÑ#ä‹E�K‰K˜% ˜v ]°7°)Ð<Ô=Ø÷ ‰Yøô
 ò à÷ ˆYð
ú÷ ˆYús.   �B.µ)BÁ/B.Â	B+Â B.Â*B+Â+B.Â.B7c                ó¼   •— |st        j                  d«      ‚| j                  D ]&  }|t        j                  z   j                  |«      sŒ& n t        ‰| �  ||«      S )z:check if the file should be served (raises 404, 403, etc.)rî   )r   ró   r•  r  r²  r   rË   r‘  )rC   r•  r  rj   s      €r3   r‘  z&FileFindHandler.validate_absolute_path$  sQ   ø€ áÜ—-‘- Ó$Ð$à—I”IˆDØ¤§¡Ñ&×2Ñ2°4Õ8Ùð ô ‰wÑ-¨d°MÓBÐBr2   r�   )NN)ra   zstr | list[str]rµ  r‘   r­  zlist[str] | NonerŽ   r�   r“   ©T©ra   r<   r»  r}   rŽ   zCoroutine[Any, Any, None]r˜  )rÄ  zSequence[str]ra   r<   rŽ   r<   )r•  r<   r  r<   rŽ   r‘   )rk   r”   r•   r–   r¥  Ú__annotations__r‰  r¶  rŽ  r   rA   rv  ÚclassmethodrÅ  r‘  rL  rM  s   @r3   r¤  r¤  ×  sŸ   ø… ñð %'€M�>Ó&Ø
Óõ9ð& (,Ø+/ð	1àð1ð %ð1ð )ð	1ð
 
ó1óð õ/ó ð/ð
 ô"ó ð"ð òó ð÷ 	Cñ 	Cr2   r¤  c                  ó&   — e Zd ZdZdZedd„«       Zy)ÚAPIVersionHandlerz&An API handler for the server version.Fc                ól   — | j                  t        j                  dt        j                  i«      «       y)zGet the server version info.ÚversionN)rT  r/   r0   Újupyter_serverÚ__version__rB   s    r3   rA   zAPIVersionHandler.get5  s$   € ð 	�‰”D—J‘J 	¬>×+EÑ+EÐFÓGÕHr2   Nr�   )rk   r”   r•   r–   r]  r   rA   r1   r2   r3   rÌ  rÌ  0  s   „ Ù0à€OàòIó ñIr2   rÌ  c                  ó*   — e Zd ZdZedd„«       ZexZZy)ÚTrailingSlashHandlerzrSimple redirect handler that strips trailing slashes

    This should be the first, highest priority handler.
    c                óô   — | j                   j                  €J ‚| j                   j                  j                  d«      ^}}d|j                  d«      z   }dj	                  |g|¢«      }| j                  |«       y)z!Handle trailing slashes in a get.NÚ?r>   r¦   )rs   ÚuriÚ	partitionr6  rH   Úredirect)rC   ra   ÚrestÚnew_uris       r3   rA   zTrailingSlashHandler.getB  sl   € ð �|‰|×ÑÐ+Ð+Ð+Ø—l‘l×&Ñ&×0Ñ0°Ó5ˆˆˆtð �T—Z‘Z “_Ñ$ˆØ—'‘'˜4˜- $˜-Ó(ˆØ�‰�gÕr2   Nr�   ©rk   r”   r•   r–   r   rA   ÚpostÚputr1   r2   r3   rÒ  rÒ  <  s'   „ ñð
 òó ðð Ð€D‰3r2   rÒ  c                  ó*   — e Zd ZdZedd„«       ZexZZy)ÚMainHandlerzSimple handler for base_url.c                óH   — | j                  d«      }| j                  |«       y)zGet the main template.z	main.htmlN)r&  rD  )rC   rF  s     r3   rA   zMainHandler.getS  s    € ð ×#Ñ# KÓ0ˆØ�
‰
�4Õr2   Nr�   rÚ  r1   r2   r3   rÞ  rÞ  P  s#   „ Ù&àòó ðð
 Ð€D‰3r2   rÞ  c                  ó6   — e Zd ZdZedd„«       Zeddd„«       Zy)ÚFilesRedirectHandlerz<Handler for redirecting relative URLs to the /files/ handlerc              ƒ  óÜ  K  — | j                   }t        |j                  |«      «      ƒ d{  –—† r!t        | j                  dt        |«      «      }nÐ|}|j                  d«      }t        |j                  |¬«      «      ƒ d{  –—† sBd|v r>| j                  j                  d|«       |j                  d«       dj                  |«      }t        |j                  |¬«      «      ƒ d{  –—† st        j                  d«      ‚t        | j                  dt        |«      «      }| j                  j                  d| j                  j                   |«       | j#                  |«       y7 �Œ97 Œä7 Œ�­w)	zgmake redirect logic a reusable static method

        so it can be called from other handlers.
        NÚtreer>   )ra   ÚfileszDeprecated files/ URL: %srî   zRedirecting %s to %s)r¸   r   Ú
dir_existsr   r=   r   rj  Úfile_existsr8   rß   ÚremoverH   r   ró   r´   rs   ra   r×  )rC   ra   Úcmrª   Ú	orig_pathÚpartss         r3   Úredirect_to_filesz&FilesRedirectHandler.redirect_to_files_  s!  è ø€ ð ×"Ñ"ˆÜ˜bŸm™m¨DÓ1Ó2×2Ð2ä §¡¨v´zÀ$Ó7GÓH‰CàˆIà—J‘J˜s“OˆEä% b§n¡n¸$ nÓ&?Ó@×@Ð@ÀWÐPUÑEUð —‘× Ñ Ð!<¸iÔHØ—‘˜WÔ%Ø—x‘x “�ä% b§n¡n¸$ nÓ&?Ó@×@Ð@Ü—m‘m CÓ(Ð(ä §¡¨w¼
À4Ó8HÓIˆCØ�‰�‰Ð-¨t¯|©|×/@Ñ/@À#ÔFØ�‰�cÕð) 3ùð Aøð Aús6   ‚*E,¬E%­AE,ÂE(ÂA$E,Ã(E*Ã)A=E,Å(E,Å*E,c              ƒ  óB   K  — | j                  | |«      ƒ d {  –—† S 7 Œ­wr  )rë  )rC   ra   s     r3   rA   zFilesRedirectHandler.get|  s   è ø€ à×+Ñ+¨D°$Ó7×7Ð7Ð7ús   ‚˜™N)rC   r	   ra   r<   rŽ   r�   rI  )ra   r<   rŽ   r�   )rk   r”   r•   r–   Ústaticmethodrë  r   rA   r1   r2   r3   rá  rá  \  s+   „ ÙFàòó ðð8 ó8ó ñ8r2   rá  c                  ó,   — e Zd ZdZddd„Zedd„«       Zy)ÚRedirectWithParamsz9Same as web.RedirectHandler, but preserves URL parametersc                ó    — || _         || _        y)zInitialize a redirect handler.N)Ú_urlÚ
_permanent)rC   rª   Ú	permanents      r3   r¶  zRedirectWithParams.initialize„  s   € àˆŒ	Ø#ˆ�r2   c                óÄ   — d| j                   v rdnd}|j                  | j                   | j                  j                  g«      }| j	                  || j
                  ¬«       y)zGet a redirect.rÔ  Ú&)ró  N)rñ  rH   rs   Úqueryr×  rò  )rC   r²  rª   s      r3   rA   zRedirectWithParams.get‰  sK   € ð ˜DŸI™IÑ%‰c¨3ˆØ�h‰h˜Ÿ	™	 4§<¡<×#5Ñ#5Ð6Ó7ˆØ�‰�c T§_¡_ˆÕ5r2   NrÇ  )rª   r<   ró  r}   rŽ   r�   r�   )rk   r”   r•   r–   r¶  r   rA   r1   r2   r3   rï  rï  �  s   „ ÙCô$ð
 ò6ó ñ6r2   rï  c                  ó"   — e Zd ZdZedd„«       Zy)ÚPrometheusMetricsHandlerz3
    Return prometheus metrics for this server
    c                ó  — | j                   d   r!| j                  st        j                  d«      ‚| j	                  dt
        j                  «       | j                  t        j                  t
        j                  «      «       y)zGet prometheus metrics.Úauthenticate_prometheusrò   rA  N)
r@   r   r   ró   rN   Úprometheus_clientÚCONTENT_TYPE_LATESTrD  Úgenerate_latestÚREGISTRYrB   s    r3   rA   zPrometheusMetricsHandler.get–  sZ   € ð �=‰=Ð2Ò3¸D¿NºNÜ—-‘- Ó$Ð$à�‰˜Ô(9×(MÑ(MÔNØ�
‰
Ô$×4Ñ4Ô5F×5OÑ5OÓPÕQr2   Nr�   )rk   r”   r•   r–   r   rA   r1   r2   r3   rø  rø  ‘  s   „ ñð òRó ñRr2   rø  c                  óF   ‡ — e Zd ZdZedˆ fd„«       Zeddˆ fd„«       Zˆ xZS )ÚPublicStaticFileHandlerzVSame as web.StaticFileHandler, but decorated to acknowledge that auth is not required.c                ó"   •— t         ‰| �  |«      S r  r¾  rw  s     €r3   rv  zPublicStaticFileHandler.head£  r¿  r2   c                ó$   •— t         ‰| �  ||«      S r  r¹  rº  s      €r3   rA   zPublicStaticFileHandler.get§  r¼  r2   r˜  rÇ  rÈ  )rk   r”   r•   r–   r   rv  rA   rL  rM  s   @r3   r   r      s,   ø„ Ù`àô"ó ð"ð õ/ó ô/r2   r   z(?P<path>(?:(?:/[^/]+)+|/?))z.*/Úapiz/(robots\.txt|favicon\.ico)z/metricsrH  )rt   r	   rŽ   r	   )gr–   Ú
__future__r   r   r  r  r/   r€  r  rý   r�  rZ   Úcollections.abcr   r   r   Úhttp.clientr   Útypingr   r	   r
   Úurllib.parser   rû  Újinja2r   Újupyter_core.pathsr   Útornador   Útornado.logr   Útraitlets.configr   rÏ  r   Újupyter_server._sysinfor   Újupyter_server._tzr   Újupyter_server.auth.decoratorr   r   Újupyter_server.auth.identityr   Újupyter_server.i18nr   Ú jupyter_server.services.securityr   Újupyter_server.utilsr   r   r   r   r   r   r   Úloggingr    Újupyter_client.kernelspecr!   Újupyter_eventsr"   Ú(jupyter_server_terminals.terminalmanagerr#   Útornado.concurrentr$   Újupyter_server.auth.authorizerr%   r'   Újupyter_server.serverappr(   Ú&jupyter_server.services.config.managerr)   Ú(jupyter_server.services.contents.managerr*   Ú-jupyter_server.services.kernels.kernelmanagerr+   Ú/jupyter_server.services.sessions.sessionmanagerr,   r.   r4   r8   ÚRequestHandlerr:   r™   rO  ro  r}  rr  r¢  ró   r¤  rÌ  rÒ  rÞ  rá  rï  rø  r   Ú
path_regexÚdefault_handlersr1   r2   r3   Ú<module>r#     sÑ  ðÙ 3õ #ã Û Û Û Û Û 	Û 	Û Û ß :Ñ :Ý !ß +Ñ +Ý !ã Ý #Ý (Ý Ý Ý (ã Ý &Ý 0Ý %ß KÝ -Ý 4Ý ;÷÷ ñ ñ Ýå;Ý*ÝHÝ)å9Ý=Ý2ÝDÝHÝWÝNð €òóô|L˜3×-Ñ-ô |Lô~XÐ)ô Xôvmc�ô mcô`!�.ô !ôJ˜~¨s×/DÑ/Dô JóZð> �M‰M€	ôVC�n c×&;Ñ&;ô VCôr	I˜
ô 	Iô˜3×-Ñ-ô ô(	�.ô 	ô"8˜>ô "8ôJ6˜×+Ñ+ô 6ô R˜~ô Rô	/˜c×3Ñ3ô 	/ð" -€
ð Ð!Ð"ØÐÐØ#Ð%<Ð=ØÐ*Ð+ð	Ñ r2   