o
    j+                  
   @   sF  d Z ddlmZ ddlZddlmZ ddlZddlZddlm	Z	 ddl
Z
ddlZddlZddlZzddlZddlZddlZW n eyO Z zededZ[ww 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 ej dd dZ!G dd dej"Z"G dd dej#Z$G dd dej%j&Z'dd Z(ej)G dd deZ*dS )z7Displays Agg images in the browser, with interactivity.    )contextmanagerN)BytesIO)Pathz$The WebAgg backend requires Tornado.)_Backend)Gcf   )backend_webagg_core)TimerAsyncioTimerTornadoc                   C   s   t jj  S N)tornadoioloopIOLoopinstancestart r   r   c/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/matplotlib/backends/backend_webagg.py<lambda>'   s    r   )targetc                   @   s$   e Zd ZejZeddddZdS )FigureManagerWebAggN)blockc                C   sd   t   djt jt jt jd}tjd r%dd l}|	|s$t
d|  nt
d|  t   d S )Nzhttp://{address}:{port}{prefix})addressportprefixzwebagg.open_in_browserr   zTo view figure, visit )WebAggApplication
initializeformatr   r   
url_prefixmplrcParams
webbrowseropenprintr   )clsr   urlr    r   r   r   pyplot_show-   s   

zFigureManagerWebAgg.pyplot_show)__name__
__module____qualname__coreNavigationToolbar2WebAggZ_toolbar2_classclassmethodr%   r   r   r   r   r   *   s    r   c                   @   s   e Zd ZeZdS )FigureCanvasWebAggN)r&   r'   r(   r   Zmanager_classr   r   r   r   r,   @   s    r,   c                       s   e Zd ZdZdZG dd dejjZG dd dejjZ	G dd dejjZ
G dd	 d	ejjZG d
d dejjZG dd dejjZd fdd	ZedddZedd Z  ZS )r   Fc                   @      e Zd Zdd ZdS )zWebAggApplication.FavIconc                 C   s(   |  dd | tt d  d S )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   r   get_data_path
read_bytesselfr   r   r   getI   s   zWebAggApplication.FavIcon.getNr&   r'   r(   r5   r   r   r   r   FavIconH       r7   c                       *   e Zd Zdd fdd
Zdd Z  ZS )z"WebAggApplication.SingleFigurePage r   c                       || _ t j||fi | d S r   r   super__init__r4   Zapplicationrequestr   kwargs	__class__r   r   r?   O      z+WebAggApplication.SingleFigurePage.__init__c                 C   sJ   t |}t|}d| jj | j d}| jd| j||tjj	|j
d d S )Nws:///zsingle_figure.html)r   ws_urifig_id	toolitemscanvas)intr   get_fig_managerrA   hostr   renderr)   r*   rJ   rK   )r4   fignummanagerrH   r   r   r   r5   S   s   

z&WebAggApplication.SingleFigurePage.getr&   r'   r(   r?   r5   __classcell__r   r   rC   r   SingleFigurePageN       rT   c                       r9   )z WebAggApplication.AllFiguresPager:   r;   c                   r<   r   r=   r@   rC   r   r   r?   a   rE   z)WebAggApplication.AllFiguresPage.__init__c                 C   s>   d| j j | j d}| jd| j|ttj tj	j
d d S )NrF   rG   zall_figures.html)r   rH   ZfiguresrJ   )rA   rN   r   rO   sortedr   Zfigsitemsr)   r*   rJ   )r4   rH   r   r   r   r5   e   s   
z$WebAggApplication.AllFiguresPage.getrR   r   r   rC   r   AllFiguresPage`   rU   rX   c                   @   r-   )zWebAggApplication.MplJsc                 C   s$   |  dd tj }| | d S )Nr.   zapplication/javascript)r/   r)   r   Zget_javascriptr0   )r4   Z
js_contentr   r   r   r5   o   s   
zWebAggApplication.MplJs.getNr6   r   r   r   r   MplJsn   r8   rY   c                   @   r-   )zWebAggApplication.Downloadc                 C   sR   t |}t|}| dtj|d t }|jj	j
||d | |  d S )Nr.   binary)r   )rL   r   rM   r/   	mimetypes	types_mapr5   r   rK   figureZsavefigr0   getvalue)r4   rP   fmtrQ   Zbuffr   r   r   r5   w   s   
zWebAggApplication.Download.getNr6   r   r   r   r   Downloadv   r8   r`   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )zWebAggApplication.WebSocketTc                 C   s@   t || _t| j| _| j|  t| dr| d d S d S )Nset_nodelayT)rL   rP   r   rM   rQ   Zadd_web_sockethasattrra   )r4   rP   r   r   r   r!      s   

z WebAggApplication.WebSocket.openc                 C   s   | j |  d S r   )rQ   Zremove_web_socketr3   r   r   r   on_close   s   z$WebAggApplication.WebSocket.on_closec                 C   sJ   t |}|d dkr|d | _d S t| j}|d ur#|| d S d S )Ntypesupports_binaryvalue)jsonloadsre   r   rM   rP   Zhandle_json)r4   messagerQ   r   r   r   
on_message   s   
z&WebAggApplication.WebSocket.on_messagec                 C   s   |  t| d S r   )write_messagerg   dumps)r4   contentr   r   r   	send_json   s   z%WebAggApplication.WebSocket.send_jsonc                 C   s>   | j r| j|dd d S d|ddd}| | d S )NT)rZ   zdata:image/png;base64,{}base64
r:   )re   rk   r   encodereplace)r4   ZblobZdata_urir   r   r   send_binary   s   z'WebAggApplication.WebSocket.send_binaryN)	r&   r'   r(   re   r!   rc   rj   rn   rs   r   r   r   r   	WebSocket   s    rt   r:   c              
      s   |r|d dkr|d dksJ dt  j|d tjjdtj if|d tjjdtt	
 dif|d	 | jf|d
 | jd|if|d | jd|if|d | jf|d | jf|d | jfgtj d d S )Nr   rG   z6url_prefix must start with a "/" and not end with one.z/_static/(.*)pathz/_images/(.*)Zimagesz/favicon.icoz	/([0-9]+)r   z/?z
/js/mpl.jsz/([0-9]+)/wsz/([0-9]+)/download.([a-z0-9.]+))Ztemplate_path)r>   r?   r   webZStaticFileHandlerr)   r   get_static_file_pathr   r   r1   r7   rT   rX   rY   rt   r`   )r4   r   rC   r   r   r?      s8   

 
zWebAggApplication.__init__Nc                 C   s   | j rd S | |d}|| _dd }|d u rtjd | _n|| _tjd | _|| jtjd D ])}z	||| j W n tyR } z|jtj	krH W Y d }~q.d }~ww || _ nt
dd| _ d S )	Nr;   c                 s   sP    t td|D ]}| | V  qt |d D ]}| td| d|  V  qdS )z
            Generate a list of n random ports near the given port.

            The first 5 ports will be sequential, and the remaining n-5 will be
            randomly selected in the range [port-2*n, port+2*n].
                  N)rangeminrandomrandint)r   nir   r   r   random_ports   s   z2WebAggApplication.initialize.<locals>.random_portszwebagg.addresszwebagg.portzwebagg.port_retrieszSThe webagg server could not be started because an available port could not be foundT)initializedr   r   r   r   r   listenOSErrorerrnoZ
EADDRINUSE
SystemExit)r#   r   r   r   Zappr   er   r   r   r      s4   

zWebAggApplication.initializec                    s   dd l }z|  W n	 ty   Y nw d _ jrd S 	 tjj  fddtfdd}d _t	d t
j  |    W d    d S 1 sRw   Y  d S )Nr   Tc                      s$      td tj  d _d S )NzServer is stoppedF)stopr"   sysstdoutflushstartedr   )r#   r   r   r   shutdown  s   

z)WebAggApplication.start.<locals>.shutdownc               
   3   sF    t  t j fdd} zd V  W t  t j|  d S t  t j|  w )Nc                    s
     S r   )Zadd_callback_from_signal)sigframer   r   r   r   r     s   
 z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>)signalSIGINT)Zold_handlerr   r   r   catch_sigint  s   "z-WebAggApplication.start.<locals>.catch_sigintz"Press Ctrl+C to stop WebAgg server)asyncioget_running_loopRuntimeErrorr   r   r   r   r   r   r"   r   r   r   r   )r#   r   r   r   )r#   r   r   r   r      s(   


"zWebAggApplication.start)r:   )r:   NN)r&   r'   r(   r   r   r   rw   ZRequestHandlerr7   rT   rX   rY   r`   Z	websocketZWebSocketHandlerrt   r?   r+   r   r   rS   r   r   rC   r   r   D   s    
'(-r   c                 C   s   dd l }t  dd l}z|  W n ty#   t s!t  Y nw | j	}t
tj d }|j|}|jtj|tjj| jtjddS )Nr   zipython_inline_figure.html)r   rI   rJ   rK   r   zutf-8)Ztornado.templater   r   r   r   r   webagg_server_threadis_aliver   numberr   r)   r   rx   	read_texttemplateTemplategenerater   r*   rJ   rK   r   decode)r]   r   r   rP   Ztpltr   r   r   ipython_inline_display,  s4   
r   c                   @   s   e Zd ZeZeZdS )_BackendWebAggN)r&   r'   r(   r,   ZFigureCanvasr   ZFigureManagerr   r   r   r   r   C  s    r   )+__doc__
contextlibr   r   ior   rg   r[   pathlibr   r~   r   r   	threadingZtornado.webr   Ztornado.ioloopZtornado.websocketImportErrorerrr   Z
matplotlibr   Zmatplotlib.backend_basesr   Zmatplotlib._pylab_helpersr   r:   r   r)   r	   r
   Threadr   r   ZFigureCanvasWebAggCorer,   rw   Applicationr   r   Zexportr   r   r   r   r   <module>   sD    
 i