o
    d                  $   @   sd  d 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
 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mZ ddlmZ ddlmZ ddlmZ ddlmZ zddlZW n eyy   G dd dZe ZY nw dZejdkrzed W n ey   dZY nw eedZ e rej!Z!nG dd dZ!zej"Z#W n e$y   dZ#Y nw dZ%ej&ej'dej(e)ej&e) f df  Z*ej+rddl,Z-ddl.m/Z/ ddl.m0Z0 ddl1m2Z2 ddl3m4Z4 G dd  d ej5Z6G d!d" d"eZ7d#e)d$e)d%e)fd&d'Z8	dad(ej&e) d%ej(d) fd*d+Z9	dbd,e)d-ej&e) d(ej&e) d%ej(e)e)f fd.d/Z:dcd0d1Z;	dbd2e)d3ej&e) d4ej&e< d%dfd5d6Z=dad7ej&e> d%e?fd8d9Z@d-e)d:e<d%ejAfd;d<ZBd-e)d:e<d=ejAd%ej'ej(e)e<f e)f fd>d?ZCd=ejAd%e)fd@dAZDG dBdC dCeZEG dDdE dEejFeEZGG dFdG dGe!eEZH						ddd-e)d:e<dHdIdJe?dKe<dLej&ejIe7  dMe?dNej&e* dOej&e< d%eEfdPdQZJd%e?fdRdSZK							T						dedUe)d:e<dVdIdWe?dXe?dYe?dZej&ejLe)  d[ej&ejLe)  d\e<d]e)dJe?dKe<dLej&ejIe7  d^ej&ejMe)ej'e)ej(e)e)f f f  dMe?dNej&e* d%df"d_d`ZNdS )fa  A WSGI and HTTP server for use **during development only**. This
server is convenient to use, but is not designed to be particularly
stable, secure, or efficient. Use a dedicate WSGI server and HTTP
server when deploying to production.

It provides features like interactive debugging and code reloading. Use
``run_simple`` to start the server. Put this in a ``run.py`` script:

.. code-block:: python

    from myapp import create_app
    from werkzeug import run_simple
    N)datetime)	timedelta)timezone)BaseHTTPRequestHandler)
HTTPServer   _log)_wsgi_encoding_dance)InternalServerError)
uri_to_iri)	url_parse)url_unquotec                   @   s    e Zd ZdedejfddZdS )	_SslDummynamereturnc                 C   s   t d)NzUSSL is unavailable because this Python runtime was not compiled with SSL/TLS support.)RuntimeErrorselfr    r   U/var/www/html/visualizacion-main/env/lib/python3.10/site-packages/werkzeug/serving.py__getattr__'   s   z_SslDummy.__getattr__N)__name__
__module____qualname__strtAnyr   r   r   r   r   r   &   s    r   TntcoloramaFforkc                   @   s   e Zd ZdS )ForkingMixInN)r   r   r   r   r   r   r   r!   =   s    r!      ssl.SSLContextzte.Literal['adhoc'])WSGIApplication)WSGIEnvironment)RSAPrivateKeyWithSerialization)Certificatec                   @   sV   e Zd ZdZdeje ddfddZdefddZ	de
fd	d
Zdede
fddZdS )DechunkedInputz8An input stream that handles Transfer-Encoding 'chunked'rfiler   Nc                 C   s   || _ d| _d| _d S )NFr   )_rfile_done_len)r   r)   r   r   r   __init__Y   s   
zDechunkedInput.__init__c                 C      dS )NTr   r   r   r   r   readable^   s   zDechunkedInput.readablec              
   C   sZ   z| j  d}t| d}W n ty" } ztd|d }~ww |dk r+td|S )Nlatin1   zInvalid chunk headerr   z!Negative chunk length not allowed)r*   readlinedecodeintstrip
ValueErrorOSError)r   liner,   er   r   r   read_chunk_lena   s   
zDechunkedInput.read_chunk_lenbufc                 C   s  d}| j s|t|k r| jdkr|  | _| jdkrd| _ | jdkrgtt|| j}|| t|krP| jt|| ||d < |  jt|| 8  _t|}n| j||||| < |  j|8  _||7 }| jdkry| j }|dvrytd| j s|t|k s|S )Nr   T)   
   
   z!Missing chunk terminating newline)	r+   lenr,   r;   minr*   readr3   r8   )r   r<   rB   n
terminatorr   r   r   readintok   s*   






$zDechunkedInput.readinto)r   r   r   __doc__r   IObytesr-   boolr0   r5   r;   	bytearrayrE   r   r   r   r   r(   V   s    
r(   c                       s   e Zd ZU dZded< edefddZd)dd	Zd*ddZ	d* fddZ
	
d+dedejd dd
fddZdedejf fddZdefddZdefddZ	d,dejeef dejeef dd
fddZded ejdd
fd!d"Zded ejdd
fd#d$Zd%ed&ed ejdd
fd'd(Z  ZS )-WSGIRequestHandlerz3A request handler that implements WSGI dispatching.BaseWSGIServerserverr   c                 C   s   ddl m} d| S )Nr   )__version__z	Werkzeug/) rN   )r   rN   r   r   r   server_version   s   
z!WSGIRequestHandler.server_versionr%   c                 C   sD  t | j}| jjd u rdnd}| jsd| _nt| jtr"| jdf| _|js2|jr2d|j |j }n|j}t	|}i ddd|d	| j
d
tjd| jjd| jjddd| jd| jd| jdddt|dt|jdt| jdt| jd|  d|  | jjd t| jjd | jd}| j D ],\}}| dd}|dd}|dvrd | }||v r||  d!| }|||< q|d"d  d#krd$|d%< t|d	 |d	< |jr|jr|j|d&< z| jj d$d'}|d urt!"||d(< W |S W |S  t#y   | j$d)d* Y |S  t%y!   Y |S w )+Nhttphttps)<local>r   r   /zwsgi.version)r   r   zwsgi.url_schemez
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceFzwerkzeug.socketSERVER_SOFTWAREREQUEST_METHODSCRIPT_NAMErO   	PATH_INFOQUERY_STRINGREQUEST_URIRAW_URIREMOTE_ADDRREMOTE_PORTr   )SERVER_NAMESERVER_PORTSERVER_PROTOCOL-_z
)CONTENT_TYPECONTENT_LENGTHHTTP_,HTTP_TRANSFER_ENCODINGchunkedTzwsgi.input_terminated	HTTP_HOST)binary_formSSL_CLIENT_CERTerrorz&Cannot fetch SSL peer certificate info)&r   pathrM   ssl_contextclient_address
isinstancer   schemenetlocr   r)   sysstderrmultithreadmultiprocess
connectionrP   commandr
   queryaddress_stringport_integerserver_addressrequest_versionheadersitemsupperreplacegetr6   lowerr(   getpeercertsslDER_cert_to_PEM_certr7   logAttributeError)r   request_url
url_scheme	path_infoenvironkeyvalue	peer_certr   r   r   make_environ   s   
	









zWSGIRequestHandler.make_environNc                    s  j dd  dkrjd   _d d d d d dtdd f fdd	dfd
d	d fdd}z	|j	j
 W d S  ttjfyp } z| W Y d }~d S d }~w ty } zDj	jr| d ur rd_zd u rd d |t  W n	 ty   Y nw ddlm} || }j	dd|  W Y d }~d S d }~ww )NExpectrO   z100-continues   HTTP/1.1 100 Continue

Fdatar   c                    st  d usJ dd usJ dd u rz
 d d\}}W n ty0   d}}Y nw t|}|| t }D ]\}}|| ||  q@d|v sxd dksxd|  krfdk sxn |d	v sxjd
krxd dd dd 	  t
| tsJ d| r rjtt| dd    jd j|   rjd j  d S )Nzwrite() before start_responser   rO   zcontent-lengthrV   HEADd      >   0     HTTP/1.1TzTransfer-Encodingrh   
Connectionclosezapplications must write bytes   r>   )splitr7   r5   send_responsesetsend_headeraddr   protocol_versionend_headersrp   rH   wfilewritehexr@   encodeflush)r   code_strmsgcodeheader_keysr   r   )chunk_responser   headers_sentheaders_setr   status_sent
status_setr   r   r      sR   

	 z*WSGIRequestHandler.run_wsgi.<locals>.writec                    sB   |rz r|d  |d W d }n	d }w rtd| |S )Nr   r   zHeaders already set)with_tracebackAssertionError)statusr~   exc_info)r   r   r   r   r   r   start_response1  s   z3WSGIRequestHandler.run_wsgi.<locals>.start_responseappr$   c              	      sl   | }z%|D ]}| qsd  rj d W t|dr)|  d S d S t|dr5|  w w )N    s   0

r   )r   r   hasattrr   )r   application_iterr   )r   r   r   r   r   r   r   r   execute?  s   



z,WSGIRequestHandler.run_wsgi.<locals>.executeTr   )DebugTracebackrl   zError on request:
N)r   r$   r   N)r~   r   r   r6   r   r   r   r   rH   rM   r   ConnectionErrorsockettimeoutconnection_dropped	Exceptionpassthrough_errorsclose_connectionr   debug.tbtoolsr   render_traceback_textr   )r   r   r:   r   r   r   )	r   r   r   r   r   r   r   r   r   r   run_wsgi   sD   "9"zWSGIRequestHandler.run_wsgic              
      s   zt    W dS  ttjfy# } z| | W Y d}~dS d}~w tyG } z| jjdur;t	|r;| 
d| n W Y d}~dS d}~ww )z/Handles a request ignoring dropped connections.NzSSL error occurred: %s)superhandler   r   r   r   r   rM   rn   is_ssl_error	log_error)r   r:   	__class__r   r   r   f  s   zWSGIRequestHandler.handlerl   r   c                 C   r.   )z`Called if the connection was closed by the client.  By default
        nothing happens.
        Nr   )r   rl   r   r   r   r   r   r  s    z%WSGIRequestHandler.connection_droppedr   c                    s   | dr| jS tt |S )Ndo_)
startswithr   getattrr   r   r   r   r   r   y  s   
zWSGIRequestHandler.__getattr__c                 C   s*   t | dd r| jd S | jsdS | jd S )Nr   r\   rS   r   )r   r   ro   r/   r   r   r   rz     s
   

z!WSGIRequestHandler.address_stringc                 C   s
   | j d S )Nr   )ro   r/   r   r   r   r{     s   
zWSGIRequestHandler.port_integerra   r   sizec                 C   s   zt | j}| j d| d| j }W n ty   | j}Y nw t|}|d dkr0t|d}n8|dkr5n3|dkr?t|d}n)|d dkrKt|d	}n|d
krUt|d}n|d dkrbt|dd}nt|dd}| dd||| d S )N r   1bold200304cyan3green404yellow4redmagentainfoz
"%s" %s %s)	r   rm   rx   r}   r   requestliner   _ansi_styler   )r   r   r   rm   r   r   r   r   log_request  s*   

zWSGIRequestHandler.log_requestformatargsc                 G      | j d|g|R   d S )Nrl   r   r   r   r   r   r   r   r        zWSGIRequestHandler.log_errorc                 G   r   )Nr   r   r   r   r   r   log_message  r   zWSGIRequestHandler.log_messagetypemessagec                 G   s0   t ||   d|   d| dg|R   d S )Nz - - [z] 
)r	   rz   log_date_time_stringr   r   r   r   r   r   r   r     s   zWSGIRequestHandler.log)r   r%   r   Nr   )ra   ra   )r   r   r   rF   __annotations__propertyr   rP   r   r   r   BaseExceptionr   Optionalr   r   r   rz   r5   r{   Unionr   r   r   r   __classcell__r   r   r   r   rK      s<   
 

Ny
	
$rK   r   stylesr   c                 G   sB   t s| S ddddddd}|D ]}d||  d	|  } q|  d
S )Nr          !   #   $   )r   r   r   r   r   r   z[mz[0m)_log_add_style)r   r   codesstyler   r   r   r     s   	
r   cn)r'   r&   c           
      C   s4  z ddl m} ddlm} ddlm} ddlm} ddlm	} W n t
y,   tdd w | }|jdd	|d
}| d u r>d} |||jd||j| g}| }| ||| | ttjttjtdd j||j gddj|!|"| gdd#||$ |}	|	|fS )Nr   )x509)NameOID)default_backend)hashes)rsaz<Using ad-hoc certificates requires the cryptography library.i  i   )public_exponentkey_sizebackend*zDummy Certificateim  )daysF)critical)%cryptographyr   cryptography.x509.oidr  cryptography.hazmat.backendsr  cryptography.hazmat.primitivesr  )cryptography.hazmat.primitives.asymmetricr  ImportError	TypeErrorgenerate_private_keyNameNameAttributeORGANIZATION_NAMECOMMON_NAMECertificateBuildersubject_nameissuer_name
public_keyserial_numberrandom_serial_numbernot_valid_beforedtnowr   utcnot_valid_afterr   add_extensionExtendedKeyUsageOID_SERVER_AUTHSubjectAlternativeNameDNSNamesignSHA256)
r   r   r  r  r  r  r  pkeysubjectcertr   r   r   generate_adhoc_ssl_pair  sN   

	r,  	base_pathhostc           	      C   s   |durd| d| }t |d\}}ddlm} |  d}|  d}t|d	}|||jj W d   n1 s=w   Y  t|d	}||j|jj|j	j
| d
 W d   ||fS 1 sfw   Y  ||fS )a  Creates an SSL key for development.  This should be used instead of
    the ``'adhoc'`` key which generates a new cert on each server start.
    It accepts a path for where it should store the key and cert and
    either a host or CN.  If a host is given it will use the CN
    ``*.host/CN=host``.

    For more information see :func:`run_simple`.

    .. versionadded:: 0.9

    :param base_path: the path to the certificate and key.  The extension
                      ``.crt`` is added for the certificate, ``.key`` is
                      added for the key.
    :param host: the name of the host.  This can be used as an alternative
                 for the `cn`.
    :param cn: the `CN` to use.
    Nz*.z/CN=)r   r   serializationz.crtz.keywbencodingr   encryption_algorithm)r,  r  r0  openr   public_bytesEncodingPEMprivate_bytesPrivateFormatTraditionalOpenSSLNoEncryption)	r-  r.  r   r+  r)  r0  	cert_file	pkey_filefr   r   r   make_ssl_devcert  s*   


		r@  c            
      C   s   ddl } ddl}t \}}ddlm} |  \}}|  \}}|tj| |tj| t	||
|jj t	||j|jj|jj| d t| t| t||}	|	S )z:Generates an adhoc SSL context for the development server.r   Nr/  r2  )tempfileatexitr,  r  r0  mkstempregisterosremover   r6  r7  r8  r9  r:  r;  r<  r   load_ssl_context)
rA  rB  r+  r)  r0  cert_handler=  pkey_handler>  ctxr   r   r   generate_adhoc_ssl_context%  s*   

	

rK  r=  r>  protocolc                 C   s(   |du rt j}t |}|| | |S )a  Loads SSL context from cert/private key files and optional protocol.
    Many parameters are directly taken from the API of
    :py:class:`ssl.SSLContext`.

    :param cert_file: Path of the certificate to use.
    :param pkey_file: Path of the private key to use. If not given, the key
                      will be obtained from the certificate file.
    :param protocol: A ``PROTOCOL`` constant from the :mod:`ssl` module.
        Defaults to :data:`ssl.PROTOCOL_TLS_SERVER`.
    N)r   PROTOCOL_TLS_SERVER
SSLContextload_cert_chain)r=  r>  rL  rJ  r   r   r   rG  C  s
   
rG  rl   c                 C   s(   | du rt tt d } t| tjS )z?Checks if the given error (or the current one) is an SSL error.Nr   )r   castr   rs   r   rp   r   SSLError)rl   r   r   r   r   X  s   r   portc                 C   s.   |  drtjS d| v rttdrtjS tjS )zUReturn ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on
    the host and port.zunix://:AF_INET6)r   r   AF_UNIXr   rT  AF_INET)r.  rR  r   r   r   select_address_family_  s
   
rW  familyc                 C   s\   |t kr| ddd S zt| ||tjtj}W n tjy'   | |f Y S w |d d S )zVReturn a fully qualified socket address that can be passed to
    :func:`socket.bind`.://r   r      )af_unixr   r   getaddrinfoSOCK_STREAMIPPROTO_TCPgaierror)r.  rR  rX  resr   r   r   get_sockaddri  s   ra  c              	   C   s   | t jkrdnd}t  | t j1}z	||df W n ty3   | t jkr(dnd Y W  d   S w | d W  d   S 1 sDw   Y  dS )zGet the IP address of an external interface. Used when binding to
    0.0.0.0 or ::1 to show a more useful URL.

    :meta private:
    zfd31:f903:5ab5:1::1z10.253.155.219i2  z::1	127.0.0.1Nr   )r   rT  
SOCK_DGRAMconnectr8   getsockname)rX  r.  sr   r   r   get_interface_ipy  s   
$rg  c                       s   e Zd ZdZdZdZeZdZ				dde	de
ddd	ejeje  d
edeje deje
 ddf fddZde	de	dejddfddZd deddf fddZdejdejeje	e
f e	f ddf fddZd!ddZ  ZS )"rL   zuA WSGI server that that handles one request at a time.

    Use :func:`make_server` to create a server instance.
    FTNr.  rR  r   r$   handlerr   rn   fdr   c              
      s  |d u rt }dt|vr| js| jrd|_|| _|| _|| _|| _t	|| | _
}t|t||}	|tkrJ|d u rJtt|	}	tj|	rJt|	 t j|	|dd |d u rz
|   |   W nb ty }
 z8|   t|
jtjd |
jtj krtd| dtjd tj!dkr|d	krtd
tjd t"d W Y d }
~
n#d }
~
w t#y   |    w |   t$%||t$j&| _$| j$' | _(|tkr| j(d | _|d urt)|t*rt+| }n|dkrt, }|j-| j$dd| _$|| _.d S d | _.d S )Nr   r   F)bind_and_activate)filezPort zp is in use by another program. Either identify and stop that program, or start the server with a different port.darwini  zZOn macOS, try disabling the 'AirPlay Receiver' service from System Preferences -> Sharing.r   adhocT)server_side)/rK   varsru   rv   r   r.  rR  r   r   rW  address_familyra  r5   r[  r   rP  r   rE  rm   existsunlinkr   r-   server_bindserver_activater8   server_closeprintstrerrorrs   rt   errno
EADDRINUSEplatformexitr   r   fromfdr]  re  r|   rp   tuplerG  rK  wrap_socketrn   )r   r.  rR  r   rh  r   rn   ri  rp  r|   r:   r   r   r   r-     sv   






zBaseWSGIServer.__init__r   r   r   c                 G   s   t ||g|R   d S r   r   r   r   r   r   r     s   zBaseWSGIServer.log      ?poll_intervalc                    sN   z!z	t  j|d W n	 ty   Y nw W |   d S W |   d S |   w )N)r  )r   serve_foreverKeyboardInterruptru  )r   r  r   r   r   r    s   zBaseWSGIServer.serve_foreverrequestro   c                    s   | j r t ||S r   )r   r   handle_error)r   r  ro   r   r   r   r    s   zBaseWSGIServer.handle_errorc                 C   s   d}t |dd}|g}| jtkr|d| j  nW| jdu r!dnd}| j}| jdv rX|d	| j d
 | jdkrBd}ttj}nd}ttj	}|d| d| d| j
  d|v rbd| d}|d| d| d| j
  tdd| dS )z<Show information about the address when starting the server.zvWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.r   r   z * Running on NrQ   rR   >   ::0.0.0.0z * Running on all addresses ()r  rb  z[::1]rY  rS  []r   r   )r   rp  r[  appendr.  rn   rg  r   rV  rT  rR  r	   join)r   dev_warningmessagesrq   display_hostname	localhostr   r   r   log_startup  s(   



zBaseWSGIServer.log_startup)NFNN)r  r   )r   r   r   rF   ru   rv   LISTEN_QUEUErequest_queue_sizeallow_reuse_addressr   r5   r   r   TyperK   rI   _TSSLContextArgr-   r   r   floatr  r   Tupler  r  r   r   r   r   r   rL     sJ    	crL   c                   @   s   e Zd ZdZdZdZdS )ThreadedWSGIServerzA WSGI server that handles concurrent requests in separate
    threads.

    Use :func:`make_server` to create a server instance.
    TN)r   r   r   rF   ru   daemon_threadsr   r   r   r   r  /  s    r  c                       sn   e Zd ZdZdZ					ddededd	d
edejej	e
  dedeje deje ddf fddZ  ZS )ForkingWSGIServerzA WSGI server that handles concurrent requests in separate forked
    processes.

    Use :func:`make_server` to create a server instance.
    T(   NFr.  rR  r   r$   	processesrh  r   rn   ri  r   c	           	   	      s.   t stdt ||||||| || _d S )Nz'Your platform does not support forking.)can_forkr7   r   r-   max_children)	r   r.  rR  r   r  rh  r   rn   ri  r   r   r   r-   C  s   
zForkingWSGIServer.__init__)r  NFNN)r   r   r   rF   rv   r   r5   r   r   r  rK   rI   r  r-   r   r   r   r   r   r  :  s6    	
r  r   r$   threadedr  request_handlerr   rn   ri  c	           	   
   C   sd   |r
|dkr
t d|rt| ||||||dS |dkr't| |||||||dS t| ||||||dS )a6  Create an appropriate WSGI server instance based on the value of
    ``threaded`` and ``processes``.

    This is called from :func:`run_simple`, but can be used separately
    to have access to the server object, such as to run it in a separate
    thread.

    See :func:`run_simple` for parameter docs.
    r   z4Cannot have a multi-thread and multi-process server.ri  )r7   r  r  rL   )	r.  rR  r   r  r  r  r   rn   ri  r   r   r   make_serverU  s(   r  c                   C   s   t jddkS )zqCheck if the server is running as a subprocess within the
    Werkzeug reloader.

    .. versionadded:: 0.10
    WERKZEUG_RUN_MAINtrue)rE  r   r   r   r   r   r   is_running_from_reloader  s   r  autohostnameapplicationuse_reloaderuse_debugger
use_evalexextra_filesexclude_patternsreloader_intervalreloader_typestatic_filesc                 C   s  t |ts	td|rddlm} |||}|r$ddlm} |||d}t s*d}nttj	d }t
| |||
|||||d	}|jd	 t| tj	d< t s\|  td
tdd |r{ddlm} z||j||||	d W |  dS |  w |  dS )a  Start a development server for a WSGI application. Various
    optional features can be enabled.

    .. warning::

        Do not use the development server when deploying to production.
        It is intended for use only during local development. It is not
        designed to be particularly efficient, stable, or secure.

    :param hostname: The host to bind to, for example ``'localhost'``.
        Can be a domain, IPv4 or IPv6 address, or file path starting
        with ``unix://`` for a Unix socket.
    :param port: The port to bind to, for example ``8080``. Using ``0``
        tells the OS to pick a random free port.
    :param application: The WSGI application to run.
    :param use_reloader: Use a reloader process to restart the server
        process when files are changed.
    :param use_debugger: Use Werkzeug's debugger, which will show
        formatted tracebacks on unhandled exceptions.
    :param use_evalex: Make the debugger interactive. A Python terminal
        can be opened for any frame in the traceback. Some protection is
        provided by requiring a PIN, but this should never be enabled
        on a publicly visible server.
    :param extra_files: The reloader will watch these files for changes
        in addition to Python modules. For example, watch a
        configuration file.
    :param exclude_patterns: The reloader will ignore changes to any
        files matching these :mod:`fnmatch` patterns. For example,
        ignore cache files.
    :param reloader_interval: How often the reloader tries to check for
        changes.
    :param reloader_type: The reloader to use. The ``'stat'`` reloader
        is built in, but may require significant CPU to watch files. The
        ``'watchdog'`` reloader is much more efficient but requires
        installing the ``watchdog`` package first.
    :param threaded: Handle concurrent requests using threads. Cannot be
        used with ``processes``.
    :param processes: Handle concurrent requests using up to this number
        of processes. Cannot be used with ``threaded``.
    :param request_handler: Use a different
        :class:`~BaseHTTPServer.BaseHTTPRequestHandler` subclass to
        handle requests.
    :param static_files: A dict mapping URL prefixes to directories to
        serve static files from using
        :class:`~werkzeug.middleware.SharedDataMiddleware`.
    :param passthrough_errors: Don't catch unhandled exceptions at the
        server level, let the serve crash instead. If ``use_debugger``
        is enabled, the debugger will still catch such errors.
    :param ssl_context: Configure TLS to serve over HTTPS. Can be an
        :class:`ssl.SSLContext` object, a ``(cert_file, key_file)``
        tuple to create a typical context, or the string ``'adhoc'`` to
        generate a temporary self-signed certificate.

    .. versionchanged:: 2.1
        Instructions are shown for dealing with an "address already in
        use" error.

    .. versionchanged:: 2.1
        Running on ``0.0.0.0`` or ``::`` shows the loopback IP in
        addition to a real IP.

    .. versionchanged:: 2.1
        The command-line interface was removed.

    .. versionchanged:: 2.0
        Running on ``0.0.0.0`` or ``::`` shows a real IP address that
        was bound as well as a warning not to run the development server
        in production.

    .. versionchanged:: 2.0
        The ``exclude_patterns`` parameter was added.

    .. versionchanged:: 0.15
        Bind to a Unix socket by passing a ``hostname`` that starts with
        ``unix://``.

    .. versionchanged:: 0.10
        Improved the reloader and added support for changing the backend
        through the ``reloader_type`` parameter.

    .. versionchanged:: 0.9
        A command-line interface was added.

    .. versionchanged:: 0.8
        ``ssl_context`` can be a tuple of paths to the certificate and
        private key files.

    .. versionchanged:: 0.6
        The ``ssl_context`` parameter was added.

    .. versionchanged:: 0.5
       The ``static_files`` and ``passthrough_errors`` parameters were
       added.
    zport must be an integerr   )SharedDataMiddleware)DebuggedApplication)evalexNWERKZEUG_SERVER_FDr  Tr   zPress CTRL+C to quitr   )run_with_reloader)r  r  intervalr  )rp   r5   r  middleware.shared_datar  debugr  r  rE  r   r  r   set_inheritabler   filenor  r	   r   	_reloaderr  r  ru  )r  rR  r  r  r  r  r  r  r  r  r  r  r  r  r   rn   r  r  ri  srvr  r   r   r   
run_simple  sN   
p
r  r   )NN)r   r#   )Fr   NFNN)FFTNNr   r  Fr   NNFN)OrF   rx  iorE  r   socketserverrs   typingr   r   r  r   r   http.serverr   r   	_internalr	   r
   
exceptionsr   urlsr   r   r   r   r  r   r   r   
__import__r   r  r!   rU  r[  r   r  r   r   r  r   r  TYPE_CHECKINGtyping_extensionste_typeshed.wsgir$   r%   -cryptography.hazmat.primitives.asymmetric.rsar&   cryptography.x509r'   	RawIOBaser(   rK   r   r,  r@  rK  r5   rG  r   rI   r   AddressFamilyrW  ra  rg  rL   ThreadingMixInr  r  r  r  r  IterableDictr  r   r   r   r   <module>   s^   



>  &
/

,


 %	

-	
&