o
    Ci5[                     @   sj  d dl Z d dlmZ d dlmZmZmZmZ d dlmZ d dl	m
Z
 G dd de jZe dZe jd	d
dZG dd dZG dd deZG dd dZG dd de je ZG dd de jeef ZG dd dee je jf ZG dd deeef ZG dd dZG dd deee jeef f ZG dd de jeef ZG d d! d!eZG d"d# d#Z dS )$    N)shlex)SplitResult	parse_qsl	urlencodeurlsplit)run_in_threadpool)Scopec                   @   s   e Zd ZU eed< eed< dS )AddresshostportN)__name__
__module____qualname__str__annotations__int r   r   p/var/www/html/fyndo/python/python_agents/rag_suite/venv/lib/python3.10/site-packages/starlette/datastructures.pyr	   	   s   
 r	   _KeyType_CovariantValueTypeT)	covariantc                	   @   s  e Zd Z		d0dedeje dejddfddZe	de
fd	d
Ze	defddZe	defddZe	defddZe	defddZe	defddZe	dejdef fddZe	dejdef fddZe	dejdef fddZe	deje fddZe	defddZdejdd fd d!Zdejdd fd"d#Zdejdd fd$d%Zd&ejeeje f dd fd'd(Zd)ejdefd*d+Zdefd,d-Zdefd.d/Z dS )1URL Nurlscope
componentsreturnc                 K   s:  |d ur|r
J d|rJ d| dd}| dd }|d }| dd}d }|d	 D ]\}	}
|	d
kr;|
d} nq,|d urJ| d| | }n.|d u rQ|}n'|\}}ddddd| }||krl| d| | }n| d| d| | }|r|d|  7 }n|r|rJ dtdjdi |j }|| _d S )Nz"Cannot set both "url" and "scope".z+Cannot set both "scope" and "**components".schemehttpserverpathquery_string    headerss   hostlatin-1z://P   i  )r   httpswswss:?z)Cannot set both "url" and "**components".r   r   )getdecoder   replacer   geturl_url)selfr   r   r   r   r   r    r!   host_headerkeyvaluer
   r   default_portr   r   r   __init__   s:   

zURL.__init__c                 C   s   t | dst| j| _| jS )N_components)hasattrr   r/   r6   r0   r   r   r   r   >   s   
zURL.componentsc                 C      | j jS N)r   r   r8   r   r   r   r   D      z
URL.schemec                 C   r9   r:   )r   netlocr8   r   r   r   r<   H   r;   z
URL.netlocc                 C   r9   r:   )r   r    r8   r   r   r   r    L   r;   zURL.pathc                 C   r9   r:   )r   queryr8   r   r   r   r=   P   r;   z	URL.queryc                 C   r9   r:   )r   fragmentr8   r   r   r   r>   T   r;   zURL.fragmentc                 C   r9   r:   )r   usernamer8   r   r   r   r?   X   r;   zURL.usernamec                 C   r9   r:   )r   passwordr8   r   r   r   r@   \   r;   zURL.passwordc                 C   r9   r:   )r   hostnamer8   r   r   r   rA   `   r;   zURL.hostnamec                 C   r9   r:   )r   r   r8   r   r   r   r   d   r;   zURL.portc                 C   s
   | j dv S )N)r&   r(   )r   r8   r   r   r   	is_secureh      
zURL.is_securekwargsc           
      K   s  d|v sd|v sd|v sd|v rq| dd }| d| j}| d| j}| d| j}|d u rH| j}|d\}}}|d dkrH|dd	d
 }|}|d urU|d| 7 }|d urm|}|d urf|d| 7 }| d| }||d< | jjdi |}	| 	|	
 S )Nr?   r@   rA   r   @]r)      r   r<   r   )popr   r?   r@   r<   
rpartitionrsplitr   _replace	__class__r.   )
r0   rD   rA   r   r?   r@   r<   _userpassr   r   r   r   r-   l   s0   zURL.replacec                 K   sB   t t| jdd}|dd | D  t| }| j|dS )NTkeep_blank_valuesc                 S      i | ]\}}t |t |qS r   r   .0r2   r3   r   r   r   
<dictcomp>       z,URL.include_query_params.<locals>.<dictcomp>r=   )	MultiDictr   r=   updateitemsr   multi_itemsr-   )r0   rD   paramsr=   r   r   r   include_query_params   s   zURL.include_query_paramsc                 K   s"   t dd | D }| j|dS )Nc                 S       g | ]\}}t |t |fqS r   rS   rT   r   r   r   
<listcomp>        z,URL.replace_query_params.<locals>.<listcomp>rX   )r   r[   r-   )r0   rD   r=   r   r   r   replace_query_params      zURL.replace_query_paramskeysc                 C   sP   t |tr|g}tt| jdd}|D ]}||d  qt| }| j|dS )NTrP   rX   )	
isinstancer   rY   r   r=   rI   r   r\   r-   )r0   rd   r]   r2   r=   r   r   r   remove_query_params   s   
zURL.remove_query_paramsotherc                 C   s   t | t |kS r:   rS   r0   rg   r   r   r   __eq__      z
URL.__eq__c                 C      | j S r:   )r/   r8   r   r   r   __str__      zURL.__str__c                 C   s6   t | }| jrt | jdd}| jj dt| dS )Nz********)r@   ())r   r@   r-   rM   r   repr)r0   r   r   r   r   __repr__   s   zURL.__repr__)r   N)!r   r   r   r   typingOptionalr   Anyr5   propertyr   r   r   r<   r    r=   r>   Unionr?   r@   rA   r   r   boolrB   r-   r^   rb   Sequencerf   ri   rl   rq   r   r   r   r   r      sZ    
(!
r   c                	   @   sd   e Zd ZdZddedededd fddZddedededd	fd
dZdejee	f de	fddZ
d	S )URLPathz
    A URL path string that may also hold an associated protocol and/or host.
    Used by the routing to return `url_path_for` matches.
    r   r    protocolr
   r   c                 C   s   |dv sJ t | |S )N)r   	websocketr   )r   __new__)clsr    rz   r
   r   r   r   r|      s   zURLPath.__new__Nc                 C   s   || _ || _d S r:   )rz   r
   )r0   r    rz   r
   r   r   r   r5      s   
zURLPath.__init__base_urlc                 C   sp   t |tr	t|}| jrddddddd| j |j }n|j}| jp&|j}|j	dt|  }t|||dS )	Nr&   r   )TFr(   r'   )r   r{   /)r   r<   r    )
re   r   r   rz   rB   r   r
   r<   r    rstrip)r0   r~   r   r<   r    r   r   r   make_absolute_url   s   
zURLPath.make_absolute_url)r   r   )r   r   r   __doc__r   r|   r5   rr   rv   r   r   r   r   r   r   ry      s
     ry   c                   @   sH   e Zd ZdZdefddZdefddZdefdd	Zdefd
dZ	dS )Secretz
    Holds a string value that should not be revealed in tracebacks etc.
    You should cast the value to `str` at the point it is required.
    r3   c                 C   s
   || _ d S r:   _valuer0   r3   r   r   r   r5         
zSecret.__init__r   c                 C   s   | j j}| dS )Nz('**********')rM   r   )r0   
class_namer   r   r   rq      s   
zSecret.__repr__c                 C   rk   r:   r   r8   r   r   r   rl      rm   zSecret.__str__c                 C   
   t | jS r:   )rw   r   r8   r   r   r   __bool__   r   zSecret.__bool__N)
r   r   r   r   r   r5   rq   rl   rw   r   r   r   r   r   r      s    r   c                   @   s   e Zd Zdejeeje f fddZdefddZ	dejee
f dejfdd	Zdeje fd
dZdefddZdefddZdS )CommaSeparatedStringsr3   c                 C   sD   t |trt|dd}d|_d|_dd |D | _d S t|| _d S )NT)posix,c                 S   s   g | ]}|  qS r   )striprU   itemr   r   r   r`          z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)re   r   r   
whitespacewhitespace_split_itemslist)r0   r3   splitterr   r   r   r5      s   
zCommaSeparatedStrings.__init__r   c                 C   r   r:   )lenr   r8   r   r   r   __len__   r   zCommaSeparatedStrings.__len__indexc                 C   
   | j | S r:   )r   )r0   r   r   r   r   __getitem__   r   z!CommaSeparatedStrings.__getitem__c                 C   r   r:   )iterr   r8   r   r   r   __iter__   r   zCommaSeparatedStrings.__iter__c                 C   s&   | j j}dd | D }| d|dS )Nc                 S   s   g | ]}|qS r   r   r   r   r   r   r`      s    z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>rn   ro   r   r0   r   r[   r   r   r   rq      s   zCommaSeparatedStrings.__repr__c                 C   s   d dd | D S )N, c                 s   s    | ]}t |V  qd S r:   )rp   r   r   r   r   	<genexpr>   s    z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)joinr8   r   r   r   rl         zCommaSeparatedStrings.__str__N)r   r   r   rr   rv   r   rx   r5   r   r   slicert   r   Iteratorr   rq   rl   r   r   r   r   r      s    	r   c                   @   s@  e Zd ZU ejeef ed< dejdej	eef ej
ejeef  f dejddfddZd	ejdeje fd
dZdeje fddZdeje fddZdejeef fddZdejejeef  fddZd	edefddZd	ejdefddZdeje fddZdefddZdejdefddZdefdd Z dS )!ImmutableMultiDict_dictargsz1ImmutableMultiDict[_KeyType, _CovariantValueType]rD   r   Nc                 O   s   t |dk s
J d|r|d ng }|r t| t|  }|s%g }nAt|dr;ttttf |}t| }n+t|drRttj	ttf |}t|
 }nttjtjtjtjf  |}t|}dd |D | _|| _d S )N   Too many arguments.r   r\   r[   c                 S   s   i | ]\}}||qS r   r   rU   kvr   r   r   rV   "  s    z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r   r   r\   r7   rr   castr   r   r   Mappingr[   ListTuplert   r   _list)r0   r   rD   r3   r   r   r   r   r5      s.   	




zImmutableMultiDict.__init__r2   c                    s    fdd| j D S )Nc                       g | ]
\}}| kr|qS r   r   rU   item_key
item_valuer2   r   r   r`   &      z.ImmutableMultiDict.getlist.<locals>.<listcomp>r   r0   r2   r   r   r   getlist%  r   zImmutableMultiDict.getlistc                 C   
   | j  S r:   )r   rd   r8   r   r   r   rd   (  r   zImmutableMultiDict.keysc                 C   r   r:   )r   valuesr8   r   r   r   r   +  r   zImmutableMultiDict.valuesc                 C   r   r:   )r   r[   r8   r   r   r   r[   .  r   zImmutableMultiDict.itemsc                 C   r   r:   r   r   r8   r   r   r   r\   1  r   zImmutableMultiDict.multi_itemsc                 C   r   r:   r   r   r   r   r   r   4  r   zImmutableMultiDict.__getitem__c                 C   s
   || j v S r:   r   r   r   r   r   __contains__7  r   zImmutableMultiDict.__contains__c                 C      t |  S r:   r   rd   r8   r   r   r   r   :     zImmutableMultiDict.__iter__c                 C   r   r:   )r   r   r8   r   r   r   r   =  r   zImmutableMultiDict.__len__rg   c                 C   s$   t || jsdS t| jt|jkS NF)re   rM   sortedr   rh   r   r   r   ri   @  s   zImmutableMultiDict.__eq__c                 C   s    | j j}|  }| d|dS Nrn   ro   )rM   r   r\   r   r   r   r   rq   E     zImmutableMultiDict.__repr__)!r   r   r   rr   Dictr   r   r   rv   r   Iterabler   rt   r5   r   r   KeysViewrd   
ValuesViewr   	ItemsViewr[   r\   r   rw   r   r   r   r   r   ri   r   rq   r   r   r   r   r      s2   
 
%r   c                   @   s8  e Zd ZdejdejddfddZdejddfddZddejd	ejdejfd
dZdejejejf fddZ	dejdej
ej fddZdddZddejd	ejdejfddZdejdej
ej ddfddZdejdejddfddZdejd ejejejf ej
ejejejf  f dejddfddZdS )rY   r2   r3   r   Nc                 C   s   |  ||g d S r:   )setlistr0   r2   r3   r   r   r   __setitem__L  s   zMultiDict.__setitem__c                    s"    fdd| j D | _ | j = d S )Nc                        g | ]\}}| kr||fqS r   r   r   r   r   r   r`   P  ra   z)MultiDict.__delitem__.<locals>.<listcomp>)r   r   r   r   r   r   __delitem__O  rc   zMultiDict.__delitem__defaultc                    s$    fdd| j D | _ | j |S )Nc                    r   r   r   r   r   r   r   r`   T  ra   z!MultiDict.pop.<locals>.<listcomp>)r   r   rI   r0   r2   r   r   r   r   rI   S  s   zMultiDict.popc                    s,   | j  \ } fdd| jD | _ |fS )Nc                    r   r   r   r   r   r   r   r`   Y  ra   z%MultiDict.popitem.<locals>.<listcomp>)r   popitemr   r   r   r   r   r   W  s   zMultiDict.popitemc                    s"    fdd| j D }|   |S )Nc                    r   r   r   r   r   r   r   r`   ]  r   z%MultiDict.poplist.<locals>.<listcomp>)r   rI   )r0   r2   r   r   r   r   poplist\  s   
zMultiDict.poplistc                 C   s   | j   | j  d S r:   )r   clearr   r8   r   r   r   r   a  s   
zMultiDict.clearc                 C   s*   || vr|| j |< | j||f | | S r:   )r   r   appendr   r   r   r   
setdefaulte  s   
zMultiDict.setdefaultr   c                    sR   |s
|   d  d S  fdd| jD }| fdd|D  | _|d | j < d S )Nc                    r   r   r   r   r   r   r   r`   p  ra   z%MultiDict.setlist.<locals>.<listcomp>c                    s   g | ]} |fqS r   r   )rU   r3   r   r   r   r`   q  r   rF   )rI   r   r   )r0   r2   r   existing_itemsr   r   r   r   l  s
   zMultiDict.setlistc                 C   s   | j ||f || j|< d S r:   )r   r   r   r   r   r   r   r   t  s   zMultiDict.appendr   rD   c                    s@   t |i |  fdd| jD }|   | _| j  d S )Nc                    s$   g | ]\}}|   vr||fqS r   )rd   r   r3   r   r   r`     s   $ z$MultiDict.update.<locals>.<listcomp>)rY   r   r\   r   rZ   )r0   r   rD   r   r   r   r   rZ   x  s   	zMultiDict.updater:   r   N)r   r   r   rr   rt   r   r   rI   r   r   r   r   r   r   r   r   rv   r   rZ   r   r   r   r   rY   K  s,    
 rY   c                       s~   e Zd ZdZdejdejejejf ejej	ejejf  e
ef dejddf fddZde
fd	d
Zde
fddZ  ZS )QueryParamsz!
    An immutable multidict.
    r   z*ImmutableMultiDict[typing.Any, typing.Any]rD   r   Nc                    s   t |dk s
J d|r|d ng }t|tr&t jt|ddfi | n t|tr=t jt|dddfi | n	t j|i | dd | jD | _d	d
 | j	
 D | _	d S )Nr   r   r   TrP   r$   c                 S   r_   r   rS   r   r   r   r   r`     ra   z(QueryParams.__init__.<locals>.<listcomp>c                 S   rR   r   rS   r   r   r   r   rV     rW   z(QueryParams.__init__.<locals>.<dictcomp>)r   re   r   superr5   r   bytesr,   r   r   r[   )r0   r   rD   r3   rM   r   r   r5     s   

zQueryParams.__init__c                 C   r   r:   )r   r   r8   r   r   r   rl     r   zQueryParams.__str__c                 C   s    | j j}t| }| d|dS r   )rM   r   r   )r0   r   r!   r   r   r   rq     r   zQueryParams.__repr__)r   r   r   r   rr   rv   r   rt   r   r   r   r   r5   rl   rq   __classcell__r   r   r   r   r     s$    	
r   c                   @   s   e Zd ZdZdddddejdeje deje ddd	df
d
dZ	e
d	eje fddZe
d	efddZded	dfddZdded	efddZded	dfddZdddZd	efddZdS )
UploadFilez@
    An uploaded file included as part of the request data.
    N)sizefilenamer#   filer   r   r#   ztyping.Optional[Headers]r   c                C   s"   || _ || _|| _|pt | _d S r:   )r   r   r   Headersr#   )r0   r   r   r   r#   r   r   r   r5     s   zUploadFile.__init__c                 C   s   | j dd S )Nzcontent-type)r#   r+   r8   r   r   r   content_type  s   zUploadFile.content_typec                 C   s   t | jdd}| S )N_rolledT)getattrr   )r0   rolled_to_diskr   r   r   
_in_memory  s   zUploadFile._in_memorydatac                    sL   | j d ur|  j t|7  _ | jr| j| d S t| jj|I d H  d S r:   )r   r   r   r   writer   )r0   r   r   r   r   r     s   
zUploadFile.writerF   c                    s(   | j r
| j|S t| jj|I d H S r:   )r   r   readr   )r0   r   r   r   r   r     s   zUploadFile.readoffsetc                    s0   | j r| j| d S t| jj|I d H  d S r:   )r   r   seekr   )r0   r   r   r   r   r     s   zUploadFile.seekc                    s,   | j r| j  d S t| jjI d H  d S r:   )r   r   closer   r8   r   r   r   r     s   zUploadFile.closec                 C   s&   | j j d| jd| jd| jdS )Nz
(filename=z, size=z
, headers=ro   )rM   r   r   r   r#   r8   r   r   r   rq     s   
zUploadFile.__repr__)rF   r   )r   r   r   r   rr   BinaryIOrs   r   r   r5   ru   r   rw   r   r   r   r   r   r   rq   r   r   r   r   r     s2    
	
r   c                
       s|   e Zd ZdZdejd ejeejeef f ej	ej
eejeef f  f dejeef ddf fddZd
dd	Z  ZS )FormDatazN
    An immutable multidict, containing both file uploads and text input.
    r   rD   r   Nc                    s   t  j|i | d S r:   )r   r5   )r0   r   rD   r   r   r   r5     s   	zFormData.__init__c                    s0   |   D ]\}}t|tr| I d H  qd S r:   )r\   re   r   r   r   r   r   r   r     s   
zFormData.closer   )r   r   r   r   rr   rv   r   r   r   r   r   r5   r   r   r   r   r   r   r     s    r   c                
   @   s`  e Zd ZdZ			d$dejejeef  dejejej	e
e
f   dejejeejf  ddfddZedejej	e
e
f  fd	d
Zdeje fddZdeje fddZdejej	eef  fddZdedeje fddZd%ddZdedefddZdejdefddZdejej fddZdefddZdejdefd d!Zdefd"d#ZdS )&r   z3
    An immutable, case-insensitive multidict.
    Nr#   rawr   r   c                 C   s   g | _ |d ur#|d u sJ d|d u sJ ddd | D | _ d S |d ur4|d u s/J d|| _ d S |d urEt|d  | _ |d< d S d S )Nz$Cannot set both "headers" and "raw".z&Cannot set both "headers" and "scope".c                 S   s(   g | ]\}}|  d |d fqS r$   )lowerencoderT   r   r   r   r`     s    z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r#   )r   r[   r   )r0   r#   r   r   r   r   r   r5   	  s   
zHeaders.__init__c                 C   r   r:   r   r8   r   r   r   r     rC   zHeaders.rawc                 C      dd | j D S )Nc                 S   s   g | ]	\}}| d qS r   r,   rT   r   r   r   r`   $      z Headers.keys.<locals>.<listcomp>r   r8   r   r   r   rd   #  rj   zHeaders.keysc                 C   r   )Nc                 S   s   g | ]	\}}| d qS r   r   rT   r   r   r   r`   '  r   z"Headers.values.<locals>.<listcomp>r   r8   r   r   r   r   &  rj   zHeaders.valuesc                 C   r   )Nc                 S   s$   g | ]\}}| d | d fqS r   r   rT   r   r   r   r`   *  s    z!Headers.items.<locals>.<listcomp>r   r8   r   r   r   r[   )  s   zHeaders.itemsr2   c                    s"   |  d  fdd| jD S )Nr$   c                    s"   g | ]\}}| kr| d qS r   r   r   get_header_keyr   r   r`   1  s
    z#Headers.getlist.<locals>.<listcomp>r   r   r   r   r   r   r   r   /  s   
zHeaders.getlistMutableHeadersc                 C   s   t | jd d  dS )N)r   )r   r   r8   r   r   r   mutablecopy7  r   zHeaders.mutablecopyc                 C   s<   |  d}| jD ]\}}||kr|d  S q
t|)Nr$   )r   r   r   r,   KeyErrorr0   r2   r   
header_keyheader_valuer   r   r   r   :  s   zHeaders.__getitem__c                 C   s0   |  d}| jD ]\}}||kr dS q
dS )Nr$   TFr   r   r   r   r   r   A  s   zHeaders.__contains__c                 C   r   r:   r   r8   r   r   r   r   H  r   zHeaders.__iter__c                 C   r   r:   )r   r   r8   r   r   r   r   K  r   zHeaders.__len__rg   c                 C   s"   t |tsdS t| jt|jkS r   )re   r   r   r   rh   r   r   r   ri   N  s   
zHeaders.__eq__c                 C   sF   | j j}t|  }t|t| kr| d|dS | d| jdS )Nrn   ro   z(raw=)rM   r   dictr[   r   r   )r0   r   as_dictr   r   r   rq   S  s
   zHeaders.__repr__)NNN)r   r   )r   r   r   r   rr   rs   r   r   r   r   r   MutableMappingrt   r5   ru   r   rd   r   r[   r   r   r   rw   r   r   r   r   r   ri   rq   r   r   r   r   r     s6    
 
r   c                   @   s   e Zd ZdededdfddZdeddfddZd	ejeef dd fd
dZd	ejeef dd fddZ	e
dejejeef  fddZdededefddZd	ejeef ddfddZdededdfddZdeddfddZdS )r   r2   r3   r   Nc           	      C   s   |  d}|d}g }t| jD ]\}\}}||kr"|| qt|dd D ]}| j|= q+|rA|d }||f| j|< dS | j||f dS )zs
        Set the header `key` to `value`, removing any duplicate entries.
        Retains insertion order.
        r$   rH   Nr   r   r   	enumerater   r   reversed)	r0   r2   r3   set_key	set_valuefound_indexesidxr   r   r   r   r   r   \  s   


zMutableHeaders.__setitem__c                 C   sV   |  d}g }t| jD ]\}\}}||kr|| qt|D ]}| j|= q"dS )z*
        Remove the header `key`.
        r$   Nr  )r0   r2   del_keypop_indexesr  r   r   r   r   r   r   r  s   

zMutableHeaders.__delitem__rg   c                 C   s,   t |tjstd|jj | | | S NzExpected a mapping but got )re   rr   r   	TypeErrorrM   r   rZ   rh   r   r   r   __ior__  s   
zMutableHeaders.__ior__c                 C   s4   t |tjstd|jj |  }|| |S r  )re   rr   r   r  rM   r   r   rZ   )r0   rg   newr   r   r   __or__  s
   
zMutableHeaders.__or__c                 C   rk   r:   r   r8   r   r   r   r     s   zMutableHeaders.rawc                 C   sZ   |  d}|d}t| jD ]\}\}}||kr"|d  S q| j||f |S )zo
        If the header `key` does not exist, then set it to `value`.
        Returns the header value.
        r$   )r   r   r  r   r,   r   )r0   r2   r3   r	  r
  r  r   r   r   r   r   r     s   
zMutableHeaders.setdefaultc                 C   s   |  D ]\}}|| |< qd S r:   )r[   )r0   rg   r2   valr   r   r   rZ     s   
zMutableHeaders.updatec                 C   s,   |  d}|d}| j||f dS )zD
        Append a header, preserving any duplicate entries.
        r$   N)r   r   r   r   )r0   r2   r3   
append_keyappend_valuer   r   r   r     s   
zMutableHeaders.appendvaryc                 C   s,   |  d}|d urd||g}|| d< d S )Nr  r   )r+   r   )r0   r  existingr   r   r   add_vary_header  s   
zMutableHeaders.add_vary_header)r   r   r   r   r   r   rr   r   r  r  ru   r   r   r   r   r   rZ   r   r  r   r   r   r   r   [  s     r   c                       s   e Zd ZU dZejeejf ed< ddej	ejeejf  f fddZ
dejdejd	dfd
dZdejd	ejfddZdejd	dfddZ  ZS )Statezm
    An object that can be used to store arbitrary state.

    Used for `request.state` and `app.state`.
    _stateNstatec                    s   |d u ri }t  d| d S )Nr  )r   __setattr__)r0   r  r   r   r   r5     s   zState.__init__r2   r3   r   c                 C   s   || j |< d S r:   r  r   r   r   r   r    s   zState.__setattr__c                 C   s4   z| j | W S  ty   d}t|| jj|w )Nz!'{}' object has no attribute '{}')r  r   AttributeErrorformatrM   r   )r0   r2   messager   r   r   __getattr__  s   zState.__getattr__c                 C   s   | j |= d S r:   r  r   r   r   r   __delattr__  r   zState.__delattr__r:   )r   r   r   r   rr   r   r   rt   r   rs   r5   r  r"  r#  r   r   r   r   r   r    s   
 &r  )!rr   r   urllib.parser   r   r   r   starlette.concurrencyr   starlette.typesr   
NamedTupler	   TypeVarr   r   r   r   ry   r   rx   r   r   r   rt   rY   r   r   rv   r   r   r   r  r   r   r   r   <module>   s*    
 N<("?WW