B
    9d8p                 @   s   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m	Z	 d dl
mZ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mZmZmZmZmZmZmZ d dlm Z  G dd de Z!dd Z"G dd deZ#G dd deZ$G dd deZ%dS )    N)gaierror)web)json_encodejson_decode
url_escape)
HTTPClientAsyncHTTPClient	HTTPError   )AsyncMappingKernelManager)SessionManager)KernelSpecManager)url_path_join)InstanceUnicodeIntFloatBooldefaultvalidate
TraitError)SingletonConfigurablec                   s2  e Zd ZdZedddddZdZeddd	 Ze	dd
d Z
edddddZdZeddd Ze	ddd ZdZdZeedddZeddd ZdZdZeedddZeddd Zd Zd!Zeedd"dZed#d$d% Zd&Zd'Zeedd(dZed)d*d+ Zd&Z d,Z!ee dd-dZ"ed.d/d0 Z#edddd1dZ$d2Z%ed3d4d5 Z&edddd6dZ'd7Z(ed8d9d: Z)edddd;dZ*d<Z+ed=d>d? Z,edddd@dZ-dAZ.edBdCdD Z/eddddEdZ0dFZ1edGdHdI Z2dJZ3dKZ4ee3dddLdZ5edMdNdO Z6eddddPdZ7dQZ8edRdSdT Z9dZ:dUZ;e<e:ddVdZ=edWdXdY Z> fdZd[Z?d\Z@d]ZAee@dd^dZBed_d`da ZCdbZDdcZEeeDddddZFededfdg ZGdhZHdiZIeeHddjdZJedkdldm ZKdnZLdoZMeNeLddpdZOedqdrds ZPeQdtdu ZReSeTjUVdvdwZWdxdy ZXdzd{ ZY  ZZS )|GatewayClientzThis class manages the configuration.  It's its own singleton class so that we
       can share these values across all objects.  It also contains some helper methods
       to build request arguments out of the various config options.

    NTa,  The url of the Kernel or Enterprise Gateway server where
        kernel specifications are defined and kernel management takes place.
        If defined, this Notebook server acts as a proxy for all kernel
        management and kernel specification retrieval.  (JUPYTER_GATEWAY_URL env var)
        )default_value
allow_noneconfighelpZJUPYTER_GATEWAY_URLurlc             C   s   t j| jS )N)osenvirongeturl_env)self r#   f/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/notebook/gateway/managers.py_url_default'   s    zGatewayClient._url_defaultc             C   sB   |d }|d k	r>t |dkr>t| ds>td|d|S )Nvaluer   httpz+GatewayClient url must start with 'http': '')lenstrlower
startswithr   )r"   proposalr&   r#   r#   r$   _url_validate+   s
    zGatewayClient._url_validatezThe websocket url of the Kernel or Enterprise Gateway server.  If not provided, this value
        will correspond to the value of the Gateway url with 'ws' in place of 'http'.  (JUPYTER_GATEWAY_WS_URL env var)
        ZJUPYTER_GATEWAY_WS_URLws_urlc             C   s2   t j| j}|d kr.| jr.| j dd}|S )Nr'   ws)r   r   r    
ws_url_envgateway_enabledr   r+   replace)r"   r   r#   r#   r$   _ws_url_default<   s
    zGatewayClient._ws_url_defaultc             C   sB   |d }|d k	r>t |dkr>t| ds>td|d|S )Nr&   r   r0   z,GatewayClient ws_url must start with 'ws': 'r(   )r)   r*   r+   r,   r   )r"   r-   r&   r#   r#   r$   _ws_url_validateD   s
    zGatewayClient._ws_url_validatez/api/kernelsZ JUPYTER_GATEWAY_KERNELS_ENDPOINTzbThe gateway API endpoint for accessing kernel resources (JUPYTER_GATEWAY_KERNELS_ENDPOINT env var))r   r   r   kernels_endpointc             C   s   t j| j| jS )N)r   r   r    kernels_endpoint_envkernels_endpoint_default_value)r"   r#   r#   r$   _kernels_endpoint_defaultR   s    z'GatewayClient._kernels_endpoint_defaultz/api/kernelspecsZ$JUPYTER_GATEWAY_KERNELSPECS_ENDPOINTzaThe gateway API endpoint for accessing kernelspecs (JUPYTER_GATEWAY_KERNELSPECS_ENDPOINT env var)kernelspecs_endpointc             C   s   t j| j| jS )N)r   r   r    kernelspecs_endpoint_env"kernelspecs_endpoint_default_value)r"   r#   r#   r$   _kernelspecs_endpoint_default[   s    z+GatewayClient._kernelspecs_endpoint_defaultz/kernelspecsZ-JUPYTER_GATEWAY_KERNELSPECS_RESOURCE_ENDPOINTz|The gateway endpoint for accessing kernelspecs resources
            (JUPYTER_GATEWAY_KERNELSPECS_RESOURCE_ENDPOINT env var)kernelspecs_resource_endpointc             C   s   t j| j| jS )N)r   r   r    !kernelspecs_resource_endpoint_env+kernelspecs_resource_endpoint_default_value)r"   r#   r#   r$   &_kernelspecs_resource_endpoint_defaulte   s    z4GatewayClient._kernelspecs_resource_endpoint_defaultg      D@JUPYTER_GATEWAY_CONNECT_TIMEOUTz}The time allowed for HTTP connection establishment with the Gateway server.
        (JUPYTER_GATEWAY_CONNECT_TIMEOUT env var)connect_timeoutc             C   s   t tjd| jS )NrB   )floatr   r   r    connect_timeout_default_value)r"   r#   r#   r$   connect_timeout_defaulto   s    z%GatewayClient.connect_timeout_defaultJUPYTER_GATEWAY_REQUEST_TIMEOUTzWThe time allowed for HTTP request completion. (JUPYTER_GATEWAY_REQUEST_TIMEOUT env var)request_timeoutc             C   s   t tjd| jS )NrG   )rD   r   r   r    request_timeout_default_value)r"   r#   r#   r$   request_timeout_defaultx   s    z%GatewayClient.request_timeout_defaultzWThe filename for client SSL key, if any.  (JUPYTER_GATEWAY_CLIENT_KEY env var)
        ZJUPYTER_GATEWAY_CLIENT_KEY
client_keyc             C   s   t j| jS )N)r   r   r    client_key_env)r"   r#   r#   r$   _client_key_default   s    z!GatewayClient._client_key_defaultz`The filename for client SSL certificate, if any.  (JUPYTER_GATEWAY_CLIENT_CERT env var)
        ZJUPYTER_GATEWAY_CLIENT_CERTclient_certc             C   s   t j| jS )N)r   r   r    client_cert_env)r"   r#   r#   r$   _client_cert_default   s    z"GatewayClient._client_cert_defaultzeThe filename of CA certificates or None to use defaults.  (JUPYTER_GATEWAY_CA_CERTS env var)
        ZJUPYTER_GATEWAY_CA_CERTSca_certsc             C   s   t j| jS )N)r   r   r    ca_certs_env)r"   r#   r#   r$   _ca_certs_default   s    zGatewayClient._ca_certs_defaultzRThe username for HTTP authentication. (JUPYTER_GATEWAY_HTTP_USER env var)
        ZJUPYTER_GATEWAY_HTTP_USER	http_userc             C   s   t j| jS )N)r   r   r    http_user_env)r"   r#   r#   r$   _http_user_default   s    z GatewayClient._http_user_defaultzRThe password for HTTP authentication.  (JUPYTER_GATEWAY_HTTP_PWD env var)
        ZJUPYTER_GATEWAY_HTTP_PWDhttp_pwdc             C   s   t j| jS )N)r   r   r    http_pwd_env)r"   r#   r#   r$   _http_pwd_default   s    zGatewayClient._http_pwd_defaultz{}ZJUPYTER_GATEWAY_HEADERSzAdditional HTTP headers to pass on the request.  This value will be converted to a dict.
          (JUPYTER_GATEWAY_HEADERS env var)
        headersc             C   s   t j| j| jS )N)r   r   r    headers_envheaders_default_value)r"   r#   r#   r$   _headers_default   s    zGatewayClient._headers_defaultz`The authorization token used in the HTTP headers.  (JUPYTER_GATEWAY_AUTH_TOKEN env var)
        ZJUPYTER_GATEWAY_AUTH_TOKEN
auth_tokenc             C   s   t j| jdS )N )r   r   r    auth_token_env)r"   r#   r#   r$   _auth_token_default   s    z!GatewayClient._auth_token_defaultZJUPYTER_GATEWAY_VALIDATE_CERTzFor HTTPS requests, determines if server's certificate should be validated or not.
        (JUPYTER_GATEWAY_VALIDATE_CERT env var)validate_certc             C   s   t tj| jt| jdkS )N)nofalse)boolr   r   r    validate_cert_envr*   validate_cert_default_value)r"   r#   r#   r$   validate_cert_default   s    z#GatewayClient.validate_cert_defaultc                s   t  jf | i | _d S )N)super__init___static_args)r"   kwargs)	__class__r#   r$   rj      s    zGatewayClient.__init__r_   ZJUPYTER_GATEWAY_ENV_WHITELISTa  A comma-separated list of environment variable names that will be included, along with
         their values, in the kernel startup request.  The corresponding `env_whitelist` configuration
         value must also be set on the Gateway server - since that configuration value indicates which
         environmental values to make available to the kernel. (JUPYTER_GATEWAY_ENV_WHITELIST env var)env_whitelistc             C   s   t j| j| jS )N)r   r   r    env_whitelist_envenv_whitelist_default_value)r"   r#   r#   r$   _env_whitelist_default   s    z$GatewayClient._env_whitelist_defaultg      ?JUPYTER_GATEWAY_RETRY_INTERVALa;  The time allowed for HTTP reconnection with the Gateway server for the first time.
                Next will be JUPYTER_GATEWAY_RETRY_INTERVAL multiplied by two in factor of numbers of retries
                but less than JUPYTER_GATEWAY_RETRY_INTERVAL_MAX.
                (JUPYTER_GATEWAY_RETRY_INTERVAL env var)gateway_retry_intervalc             C   s   t tjd| jS )Nrr   )rD   r   r   r    $gateway_retry_interval_default_value)r"   r#   r#   r$   gateway_retry_interval_default   s    z,GatewayClient.gateway_retry_interval_defaultg      >@"JUPYTER_GATEWAY_RETRY_INTERVAL_MAXzThe maximum time allowed for HTTP reconnection retry with the Gateway server.
                (JUPYTER_GATEWAY_RETRY_INTERVAL_MAX env var)gateway_retry_interval_maxc             C   s   t tjd| jS )Nrv   )rD   r   r   r    (gateway_retry_interval_max_default_value)r"   r#   r#   r$   "gateway_retry_interval_max_default   s    z0GatewayClient.gateway_retry_interval_max_default   JUPYTER_GATEWAY_RETRY_MAXz~The maximum retries allowed for HTTP reconnection with the Gateway server.
                (JUPYTER_GATEWAY_RETRY_MAX env var)gateway_retry_maxc             C   s   t tjd| jS )Nr{   )intr   r   r    gateway_retry_max_default_value)r"   r#   r#   r$   gateway_retry_max_default   s    z'GatewayClient.gateway_retry_max_defaultc             C   s   t | jd k	ot| jdkS )Nr   )re   r   r)   )r"   r#   r#   r$   r2      s    zGatewayClient.gateway_enabledKERNEL_LAUNCH_TIMEOUT(   c             C   s  | j ttjk rttj| _ n| j ttjkr:t| j t_ttjtjd< t	| j
| jd< d| jd  kr| jd dd| j i | j| jd< | j | jd< | j| jd< | jr| j| jd< | j| jd	< | jr| j| jd
< | jr| j| jd< | jr| j| jd< dS )zInitialize arguments used on every request.  Since these are static values, we'll
        perform this operation once.

        r   rZ   Authorizationztoken rC   rH   rb   rN   rK   rQ   Zauth_usernameZauth_passwordN)rH   rD   r   r   r}   r*   r   r   jsonloadsrZ   rk   keysupdater^   rC   rb   rN   rK   rQ   rT   rW   )r"   r#   r#   r$   init_static_args  s*    
zGatewayClient.init_static_argsc             K   sd   t | jdkr|   xH| j D ]:\}}|dkrT||i }t|tr\|| q"|||< q"W |S )zMerges the static args relative to the connection, with the given keyword arguments.  If statics
         have yet to be initialized, we'll do that here.

        r   rZ   )r)   rk   r   items
setdefault
isinstancedictr   )r"   rl   argZstatic_valueZgiven_valuer#   r#   r$   load_connection_args&  s    
z"GatewayClient.load_connection_args)[__name__
__module____qualname____doc__r   r   r!   r   r%   r   r.   r/   r1   r4   r5   r8   r7   r6   r9   r<   r;   r:   r=   r@   r?   r>   rA   rE   Zconnect_timeout_envr   rC   rF   rI   Zrequest_timeout_envrH   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r\   r[   rZ   r]   r^   r`   ra   rg   rf   r   rb   rh   rj   rp   ro   rn   rq   rt   Zgateway_retry_interval_envrs   ru   rx   Zgateway_retry_interval_max_envrw   ry   r~   Zgateway_retry_max_envr   r|   r   propertyr2   r}   r   r   r    r   r   r   __classcell__r#   r#   )rm   r$   r      s   		 r   c          
      s   t  }t jf |}y|j| f|I dH }W n tk
rl } z tddt j d|W dd}~X Y n| tk
r } z"t|j	dt j d|W dd}~X Y n> t
k
r } z tddt j d	|W dd}~X Y nX |S )
zEMake an async request to kernel gateway endpoint, returns a response Ni  z,Connection refused from Gateway server url 'z5'.  Check to be sure the Gateway instance is running.z3Error attempting to connect to Gateway server url 'zD'.  Ensure gateway url is valid and the Gateway instance is running.i  z1The Gateway server specified in the gateway_url 'z_' doesn't appear to be valid.  Ensure gateway url is valid and the Gateway instance is running.)r   r   instancer   fetchConnectionRefusedErrorr   r	   r   coder   )Zendpointrl   clientresponseer#   r#   r$   gateway_request8  s(    r   c                   s   e Zd ZdZi Z fddZdd Zdd Zdd	d
ZdddZ	dddZ
dd Zdd ZdddZd ddZdd Zd!ddZ  ZS )"GatewayKernelManagerz[Kernel manager that supports remote kernels hosted by Jupyter Kernel or Enterprise Gateway.c                s*   t  jf | tt jt j| _d S )N)ri   rj   r   r   r   r   r6   base_endpoint)r"   rl   )rm   r#   r$   rj   `  s    zGatewayKernelManager.__init__c             C   s
   || j kS )N)_kernels)r"   	kernel_idr#   r#   r$   __contains__d  s    z!GatewayKernelManager.__contains__c             C   s&   y| j |S  tk
r    Y nX dS )zDComplete override since we want to be more tolerant of missing keys N)r   popKeyError)r"   r   r#   r#   r$   remove_kernelg  s    z"GatewayKernelManager.remove_kernelNc             C   s   |rt | jtt|S | jS )zBuilds a url for the kernels endpoint

        Parameters
        ----------
        kernel_id: kernel UUID (optional)
        )r   r   r   r*   )r"   r   r#   r#   r$   _get_kernel_endpoint_urln  s    z-GatewayKernelManager._get_kernel_endpoint_urlc       
         sR  | j d|| |dkr|dk	r0| ||d< |dd}|  }| j d|  tjddkrt	 j
rt	 j
tjd< dd	 ttj D }|dk	r|d
dkr|d |d
< t||d}t|dddi|dI dH }t|j}	|	d }| j d|  | j d| n*| |I dH }	|	d }| j d|  |	| j|< |S )a  Start a kernel for a session and return its kernel_id.

        Parameters
        ----------
        kernel_id : uuid
            The uuid to associate the new kernel with. If this
            is not None, this kernel will be persistent whenever it is
            requested.
        path : API path
            The API path (unicode, '/' delimited) for the cwd.
            Will be transformed to an OS path relative to root_dir.
        z-Request start kernel: kernel_id=%s, path="%s"Ncwdkernel_namepython3zRequest new kernel at: KERNEL_USERNAMEc             S   s4   i | ],\}}| d s*|t jdkr||qS )ZKERNEL_,)r,   r   r   rn   split).0kvr#   r#   r$   
<dictcomp>  s    z5GatewayKernelManager.start_kernel.<locals>.<dictcomp>ZKERNEL_WORKING_DIR)nameenvPOSTzContent-Typezapplication/json)methodrZ   bodyidzKernel started: zKernel args: zUsing existing kernel: )loginfoZcwd_for_pathr    r   debugr   r   r   r   rT   r   r   r   r   r   r   
get_kernelr   )
r"   r   pathrl   r   
kernel_urlZ
kernel_envZ	json_bodyr   kernelr#   r#   r$   start_kernelz  s0    


z!GatewayKernelManager.start_kernelc          
      s   |  |}| jd|  yt|ddI dH }W nR tjk
r } z2|jdkrr| jd|  | | d}n W dd}~X Y nBX t	|j
}|| jkr|| j|< | jd| n| jd| d}|S )	zGet kernel for kernel_id.

        Parameters
        ----------
        kernel_id : uuid
            The uuid of the kernel.
        zRequest kernel at: GET)r   Ni  zKernel not found at: zKernel retrieved: %sz,Kernel '%s' is not managed by this instance.)r   r   r   r   r   r	   status_codewarnr   r   r   r   warning)r"   r   rl   r   r   errorr   r#   r#   r$   r     s"    





zGatewayKernelManager.get_kernelc                s"   | j d| | |I dH }|S )zReturn a dictionary of kernel information described in the
        JSON standard model.

        Parameters
        ----------
        kernel_id : uuid
            The uuid of the kernel.
        z$RemoteKernelManager.kernel_model: %sN)r   r   r   )r"   r   modelr#   r#   r$   kernel_model  s    	z!GatewayKernelManager.kernel_modelc                sT      } jd| t|ddI dH }t|j} fdd|D  _t j S )zGet a list of kernels.zRequest list kernels: %sr   )r   Nc                s$   i | ]}|d   j kr||d  qS )r   )r   )r   x)r"   r#   r$   r     s    z5GatewayKernelManager.list_kernels.<locals>.<dictcomp>)	r   r   r   r   r   r   r   listvalues)r"   rl   r   r   Zkernelsr#   )r"   r$   list_kernels  s    
z!GatewayKernelManager.list_kernelsFc                sL   |  |}| jd| t|ddI dH }| jd|j|j | | dS )aX  Shutdown a kernel by its kernel uuid.

        Parameters
        ==========
        kernel_id : uuid
            The id of the kernel to shutdown.
        now : bool
            Shutdown the kernel immediately (True) or gracefully (False)
        restart : bool
            The purpose of this shutdown is to restart the kernel (True)
        zRequest shutdown kernel at: %sDELETE)r   NzShutdown kernel response: %d %s)r   r   r   r   r   reasonr   )r"   r   nowZrestartr   r   r#   r#   r$   shutdown_kernel  s
    
z$GatewayKernelManager.shutdown_kernelc                sR   |  |d }| jd| t|ddditi dI dH }| jd|j|j dS )	zRestart a kernel by its kernel uuid.

        Parameters
        ==========
        kernel_id : uuid
            The id of the kernel to restart.
        z/restartzRequest restart kernel at: %sr   zContent-Typezapplication/json)r   rZ   r   NzRestart kernel response: %d %s)r   r   r   r   r   r   r   )r"   r   r   rl   r   r   r#   r#   r$   restart_kernel  s
    z#GatewayKernelManager.restart_kernelc                sR   |  |d }| jd| t|ddditi dI dH }| jd|j|j dS )	zInterrupt a kernel by its kernel uuid.

        Parameters
        ==========
        kernel_id : uuid
            The id of the kernel to interrupt.
        z
/interruptzRequest interrupt kernel at: %sr   zContent-Typezapplication/json)r   rZ   r   Nz Interrupt kernel response: %d %s)r   r   r   r   r   r   r   )r"   r   rl   r   r   r#   r#   r$   interrupt_kernel  s
    z%GatewayKernelManager.interrupt_kernelc          	   C   s   g }ddi}t  jf |}t }xl| jD ]b}| |}| jd| y|j|f|}W n t	k
rl   Y nX | jd|j
|j || q*W |  x|D ]}| | qW dS )zShutdown all kernels.r   r   zRequest delete kernel at: %szDelete kernel response: %d %sN)r   r   r   r   r   r   r   r   r   r	   r   r   appendcloser   )r"   r   Zshutdown_kernelsrl   r   r   r   r   r#   r#   r$   shutdown_all  s     

z!GatewayKernelManager.shutdown_all)N)NN)N)FF)F)F)r   r   r   r   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   r#   r#   )rm   r$   r   Z  s   

2



r   c                   sR   e Zd Z fddZedd ZdddZdd	 Zd
d Zdd Z	dd Z
  ZS )GatewayKernelSpecManagerc                sL   t  jf | tt jt j}t|| _	tt jt j
| _d S )N)ri   rj   r   r   r   r   r:   r   _get_endpoint_for_user_filterr   r>   base_resource_endpoint)r"   rl   r   )rm   r#   r$   rj   )  s    

z!GatewayKernelSpecManager.__init__c             C   s"   t jd}|rd| |gS | S )Nr   z?user=)r   r   r    join)Zdefault_endpointZkernel_userr#   r#   r$   r   2  s    z6GatewayKernelSpecManager._get_endpoint_for_user_filterNc             C   s   |rt | jt|S | jS )zBuilds a url for the kernels endpoint

        Parameters
        ----------
        kernel_name: kernel name (optional)
        )r   r   r   )r"   r   r#   r#   r$   _get_kernelspecs_endpoint_url9  s    z6GatewayKernelSpecManager._get_kernelspecs_endpoint_urlc                sV   |   I d H }| jj}|d}||jkrH| jdj||jd ||_|d}|S )Nr   zDefault kernel name on Gateway server ({gateway_default}) differs from Notebook server ({notebook_default}).  Updating to Gateway server's value.)Zgateway_defaultZnotebook_defaultZkernelspecs)list_kernel_specsparentkernel_managerr    Zdefault_kernel_namer   r   format)r"   Zfetched_kspecskmZremote_default_kernel_nameZremote_kspecsr#   r#   r$   get_all_specsE  s    



z&GatewayKernelSpecManager.get_all_specsc                s6   |   }| jd| t|ddI dH }t|j}|S )zGet a list of kernel specs.z Request list kernel specs at: %sr   )r   N)r   r   r   r   r   r   )r"   kernel_spec_urlr   Zkernel_specsr#   r#   r$   r   X  s
    
z*GatewayKernelSpecManager.list_kernel_specsc          
      s   | j t|d}| jd|  yt|ddI dH }W nL tjk
r } z,|jdkrrtdj	|t
 jd|n W dd}~X Y nX t|j}|S )	zGet kernel spec for kernel_name.

        Parameters
        ----------
        kernel_name : str
            The name of the kernel.
        )r   zRequest kernel spec at: r   )r   Ni  zFkernelspec {kernel_name} not found on Gateway server at: {gateway_url})r   Zgateway_url)r   r*   r   r   r   r   r	   r   r   r   r   r   r   r   r   )r"   r   rl   r   r   r   Zkernel_specr#   r#   r$   get_kernel_spec`  s    

z(GatewayKernelSpecManager.get_kernel_specc          
      s   t | jt|t|}| jd| d|  yt|ddI dH }W n6 tjk
rz } z|jdkrhd}n W dd}~X Y nX |j	}|S )zGet kernel spec for kernel_name.

        Parameters
        ----------
        kernel_name : str
            The name of the kernel.
        path : str
            The name of the desired resource
        zRequest kernel spec resource 'z' at: r   )r   Ni  )
r   r   r*   r   r   r   r   r	   r   r   )r"   r   r   Zkernel_spec_resource_urlr   r   Zkernel_spec_resourcer#   r#   r$   get_kernel_spec_resource{  s    

z1GatewayKernelSpecManager.get_kernel_spec_resource)N)r   r   r   rj   staticmethodr   r   r   r   r   r   r   r#   r#   )rm   r$   r   '  s   	
r   c               @   s   e Zd ZedZdd ZdS )GatewaySessionManagerz.notebook.gateway.managers.GatewayKernelManagerc                s   | j |I dH }|dkS )zRChecks if the kernel is still considered alive and returns true if its not found. N)r   r   )r"   r   r   r#   r#   r$   kernel_culled  s    z#GatewaySessionManager.kernel_culledN)r   r   r   r   r   r   r#   r#   r#   r$   r     s   r   )&r   r   socketr   tornador   Ztornado.escaper   r   r   Ztornado.httpclientr   r   r	   Zservices.kernels.kernelmanagerr   Z services.sessions.sessionmanagerr   Zjupyter_client.kernelspecr   utilsr   Z	traitletsr   r   r   r   r   r   r   r   Ztraitlets.configr   r   r   r   r   r   r#   r#   r#   r$   <module>   s&   (  $" Nl