o
    m=8jZ                     @  s  d dl mZ d dl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 d dlmZmZmZmZmZ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ZedZedddZe dej!Z"G dd dZ#G dd de$Z%G dd dZ&G dd de
e$ Z'G dd deeef Z(G dd de(eef Z)G dd de(e$e$f Z*G dd dZ+G d d! d!e(e$e+e$B f Z,G d"d# d#ee$e$f Z-G d$d% d%e-Z.G d&d' d'Z/dS )(    )annotationsN)	ItemsViewIterableIteratorKeysViewMappingMutableMappingSequence
ValuesView)shlex)AnyBinaryIOLiteral
NamedTupleTypeVarcast)SplitResult	parse_qsl	urlencodeurlsplit)run_in_threadpool)Scopec                   @  s   e Zd ZU ded< ded< dS )AddressstrhostintportN)__name__
__module____qualname____annotations__ r!   r!   _/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/starlette/datastructures.pyr      s   
 r   _KeyType_CovariantValueTypeT)	covariantz5^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9.:]+\])(?::[0-9]+)?$c                   @  s   e Zd Z		d9d:ddZed;ddZed<ddZed<ddZed<ddZed<ddZ	ed<ddZ
ed=ddZed=ddZed=dd Zed>d"d#Zed?d%d&Zd@d(d)Zd@d*d+Zd@d,d-ZdAd0d1ZdBd3d4Zd<d5d6Zd<d7d8ZdS )CURL Nurlr   scopeScope | None
componentsr   returnNonec                 K  sF  |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rHt|rH|}n!|d urg|\}}ddddd| }||kr_|n| d| }nd }| }|d ur}t||||dd }n!|r| d| n|}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-1P   i  )r/   httpswswss:r'   )r.   netlocr1   queryfragment?z)Cannot set both "url" and "**components".r!   )
getdecode_HOST_RE	fullmatchr   geturlr&   replacer+   _url)selfr(   r)   r+   r.   r0   r1   r2   host_headerkeyvaluer;   r   r   default_portr<   r!   r!   r"   __init__   s8   

zURL.__init__r   c                 C  s   t | dst| j| _| jS )N_components)hasattrr   rE   rL   rF   r!   r!   r"   r+   E   s   
zURL.componentsc                 C     | j jS N)r+   r.   rN   r!   r!   r"   r.   K      z
URL.schemec                 C  rO   rP   )r+   r;   rN   r!   r!   r"   r;   O   rQ   z
URL.netlocc                 C  rO   rP   )r+   r1   rN   r!   r!   r"   r1   S   rQ   zURL.pathc                 C  rO   rP   )r+   r<   rN   r!   r!   r"   r<   W   rQ   z	URL.queryc                 C  rO   rP   )r+   r=   rN   r!   r!   r"   r=   [   rQ   zURL.fragment
None | strc                 C  rO   rP   )r+   usernamerN   r!   r!   r"   rS   _   rQ   zURL.usernamec                 C  rO   rP   )r+   passwordrN   r!   r!   r"   rT   c   rQ   zURL.passwordc                 C  rO   rP   )r+   hostnamerN   r!   r!   r"   rU   g   rQ   zURL.hostname
int | Nonec                 C  rO   rP   )r+   r   rN   r!   r!   r"   r   k   rQ   zURL.portboolc                 C  s
   | j dv S )N)r7   r9   )r.   rN   r!   r!   r"   	is_secureo      
zURL.is_securekwargsc           
      K  s  d|v sd|v sd|v sd|v rs| dd }| d| j}| d| j}| d| j}|d u rJ| j}|d\}}}|rJ|d dkrJ|dd	d
 }|}|d urW|d| 7 }|d uro|}|d urh|d| 7 }| d| }||d< | jjdi |}	| 	|	
 S )NrS   rT   rU   r   @]r:      r   r;   r!   )popr   rS   rT   r;   
rpartitionrsplitr+   _replace	__class__rC   )
rF   rZ   rU   r   rS   rT   r;   _userpassr+   r!   r!   r"   rD   s   s*    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   .0rH   rI   r!   r!   r"   
<dictcomp>       z,URL.include_query_params.<locals>.<dictcomp>r<   )	MultiDictr   r<   updateitemsr   multi_itemsrD   )rF   rZ   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!   ri   rj   r!   r!   r"   
<listcomp>        z,URL.replace_query_params.<locals>.<listcomp>rn   )r   rq   rD   )rF   rZ   r<   r!   r!   r"   replace_query_params      zURL.replace_query_paramskeysstr | Sequence[str]c                 C  sP   t |tr|g}tt| jdd}|D ]}||d  qt| }| j|dS )NTrf   rn   )	
isinstancer   ro   r   r<   r_   r   rr   rD   )rF   rz   rs   rH   r<   r!   r!   r"   remove_query_params   s   
zURL.remove_query_paramsotherc                 C  s   t | t |kS rP   ri   rF   r~   r!   r!   r"   __eq__      z
URL.__eq__c                 C     | j S rP   )rE   rN   r!   r!   r"   __str__      zURL.__str__c                 C  s6   t | }| jrt | jdd}| jj dt| dS )Nz********)rT   ())r   rT   rD   rc   r   repr)rF   r(   r!   r!   r"   __repr__   s   zURL.__repr__)r'   N)r(   r   r)   r*   r+   r   r,   r-   )r,   r   r,   r   )r,   rR   )r,   rV   r,   rW   )rZ   r   r,   r&   )rz   r{   r,   r&   r~   r   r,   rW   )r   r   r   rK   propertyr+   r.   r;   r1   r<   r=   rS   rT   rU   r   rX   rD   rt   rx   r}   r   r   r   r!   r!   r!   r"   r&      sB    (




	
r&   c                   @  s2   e Zd ZdZddd	d
ZddddZd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'   r1   r   protocol Literal['http', 'websocket', '']r   r,   c                 C  s   |dv sJ t | |S )N)r/   	websocketr'   )r   __new__)clsr1   r   r   r!   r!   r"   r      s   zURLPath.__new__r-   c                 C  s   || _ || _d S rP   )r   r   )rF   r1   r   r   r!   r!   r"   rK      s   
zURLPath.__init__base_url	str | URLr&   c                 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 )	Nr7   r/   )TFr9   r8   )r/   r   /)r.   r;   r1   )
r|   r   r&   r   rX   r.   r   r;   r1   rstrip)rF   r   r.   r;   r1   r!   r!   r"   make_absolute_url   s   
zURLPath.make_absolute_urlN)r'   r'   )r1   r   r   r   r   r   r,   r   )r1   r   r   r   r   r   r,   r-   )r   r   r,   r&   )r   r   r   __doc__r   rK   r   r!   r!   r!   r"   r      s
    r   c                   @  s8   e Zd ZdZdddZdddZdd	d
Zd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.
    rI   r   c                 C  s
   || _ d S rP   _valuerF   rI   r!   r!   r"   rK         
zSecret.__init__r,   c                 C  s   | j j}| dS )Nz('**********')rc   r   )rF   
class_namer!   r!   r"   r      s   
zSecret.__repr__c                 C  r   rP   r   rN   r!   r!   r"   r      r   zSecret.__str__rW   c                 C  
   t | jS rP   )rW   r   rN   r!   r!   r"   __bool__   r   zSecret.__bool__N)rI   r   r   r   )r   r   r   r   rK   r   r   r   r!   r!   r!   r"   r      s    


r   c                   @  sH   e Zd ZdddZdddZdddZdddZdddZdddZdS )CommaSeparatedStringsrI   r{   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rk   itemr!   r!   r"   rv          z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)r|   r   r   
whitespacewhitespace_split_itemslist)rF   rI   splitterr!   r!   r"   rK      s   
zCommaSeparatedStrings.__init__r,   r   c                 C  r   rP   )lenr   rN   r!   r!   r"   __len__   r   zCommaSeparatedStrings.__len__indexint | slicer   c                 C  
   | j | S rP   )r   )rF   r   r!   r!   r"   __getitem__   r   z!CommaSeparatedStrings.__getitem__Iterator[str]c                 C  r   rP   )iterr   rN   r!   r!   r"   __iter__   r   zCommaSeparatedStrings.__iter__r   c                 C  s&   | j j}dd | D }| d|dS )Nc                 S  s   g | ]}|qS r!   r!   r   r!   r!   r"   rv      s    z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>r   r   r   rF   r   rq   r!   r!   r"   r      s   zCommaSeparatedStrings.__repr__c                 C  s   d dd | D S )N, c                 s  s    | ]}t |V  qd S rP   )r   r   r!   r!   r"   	<genexpr>   s    z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)joinrN   r!   r!   r"   r         zCommaSeparatedStrings.__str__N)rI   r{   r,   r   )r   r   r,   r   r,   r   r   )	r   r   r   rK   r   r   r   r   r   r!   r!   r!   r"   r      s    

	


r   c                   @  s   e Zd ZU ded< d/d	d
Zd0ddZd1ddZd2ddZd3ddZd4ddZ	d5ddZ
d6d d!Zd7d#d$Zd8d&d'Zd9d)d*Zd:d,d-Zd.S );ImmutableMultiDictz#dict[_KeyType, _CovariantValueType]_dictargsImmutableMultiDict[_KeyType, _CovariantValueType] | Mapping[_KeyType, _CovariantValueType] | Iterable[tuple[_KeyType, _CovariantValueType]]rZ   r   r,   r-   c                 O  s   t |dk s
J d|r|d ng }|r t| t|  }|s%g }n3t|dr:ttttf |}t| }nt|drOttttf |}t|	 }n	td|}t|}dd |D | _
|| _d S )	N   Too many arguments.r   rr   rq   zlist[tuple[Any, Any]]c                 S  s   i | ]\}}||qS r!   r!   rk   kvr!   r!   r"   rl     s    z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r   r   rr   rM   r   r#   r$   r   r   rq   r   _list)rF   r   rZ   rI   r   r!   r!   r"   rK      s    



zImmutableMultiDict.__init__rH   list[_CovariantValueType]c                   s    fdd| j D S )Nc                      g | ]
\}}| kr|qS r!   r!   rk   item_key
item_valuerH   r!   r"   rv         z.ImmutableMultiDict.getlist.<locals>.<listcomp>r   rF   rH   r!   r   r"   getlist  r   zImmutableMultiDict.getlistKeysView[_KeyType]c                 C  
   | j  S rP   )r   rz   rN   r!   r!   r"   rz     r   zImmutableMultiDict.keysValuesView[_CovariantValueType]c                 C  r   rP   )r   valuesrN   r!   r!   r"   r   "  r   zImmutableMultiDict.values(ItemsView[_KeyType, _CovariantValueType]c                 C  r   rP   )r   rq   rN   r!   r!   r"   rq   %  r   zImmutableMultiDict.items*list[tuple[_KeyType, _CovariantValueType]]c                 C  r   rP   r   r   rN   r!   r!   r"   rr   (  r   zImmutableMultiDict.multi_itemsr#   r$   c                 C  r   rP   r   r   r!   r!   r"   r   +  r   zImmutableMultiDict.__getitem__rW   c                 C  s
   || j v S rP   r   r   r!   r!   r"   __contains__.  r   zImmutableMultiDict.__contains__Iterator[_KeyType]c                 C     t |  S rP   r   rz   rN   r!   r!   r"   r   1     zImmutableMultiDict.__iter__r   c                 C  r   rP   )r   r   rN   r!   r!   r"   r   4  r   zImmutableMultiDict.__len__r~   c                 C  s$   t || jsdS t| jt|jkS NF)r|   rc   sortedr   r   r!   r!   r"   r   7  s   zImmutableMultiDict.__eq__r   c                 C  s    | j j}|  }| d|dS Nr   r   )rc   r   rr   r   r!   r!   r"   r   <     zImmutableMultiDict.__repr__N)r   r   rZ   r   r,   r-   )rH   r   r,   r   )r,   r   )r,   r   )r,   r   )r,   r   )rH   r#   r,   r$   rH   r   r,   rW   )r,   r   r   r   r   )r   r   r   r    rK   r   rz   r   rq   rr   r   r   r   r   r   r   r!   r!   r!   r"   r      s   
 










r   c                   @  st   e Zd Zd"ddZd#dd	Zd$d%ddZd&ddZd'ddZd(ddZd$d%ddZ	d)ddZ
d"ddZd*d d!Zd
S )+ro   rH   r   rI   r,   r-   c                 C  s   |  ||g d S rP   )setlistrF   rH   rI   r!   r!   r"   __setitem__C  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"   rv   G  rw   z)MultiDict.__delitem__.<locals>.<listcomp>)r   r   r   r!   r   r"   __delitem__F  ry   zMultiDict.__delitem__Ndefaultc                   s$    fdd| j D | _ | j |S )Nc                   r   r!   r!   r   r   r!   r"   rv   K  rw   z!MultiDict.pop.<locals>.<listcomp>)r   r   r_   rF   rH   r   r!   r   r"   r_   J  s   zMultiDict.poptuple[Any, Any]c                   s,   | j  \ } fdd| jD | _ |fS )Nc                   r   r!   r!   r   r   r!   r"   rv   P  rw   z%MultiDict.popitem.<locals>.<listcomp>)r   popitemr   r   r!   r   r"   r   N  s   zMultiDict.popitem	list[Any]c                   s"    fdd| j D }|   |S )Nc                   r   r!   r!   r   r   r!   r"   rv   T  r   z%MultiDict.poplist.<locals>.<listcomp>)r   r_   )rF   rH   r   r!   r   r"   poplistS  s   
zMultiDict.poplistc                 C  s   | j   | j  d S rP   )r   clearr   rN   r!   r!   r"   r   X  s   
zMultiDict.clearc                 C  s*   || vr|| j |< | j||f | | S rP   )r   r   appendr   r!   r!   r"   
setdefault\  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"   rv   g  rw   z%MultiDict.setlist.<locals>.<listcomp>c                   s   g | ]} |fqS r!   r!   )rk   rI   r   r!   r"   rv   h  r   r\   )r_   r   r   )rF   rH   r   existing_itemsr!   r   r"   r   c  s
   zMultiDict.setlistc                 C  s   | j ||f || j|< d S rP   )r   r   r   r   r!   r!   r"   r   k  s   zMultiDict.appendr   5MultiDict | Mapping[Any, Any] | list[tuple[Any, Any]]rZ   c                   s@   t |i |  fdd| jD }|   | _| j  d S )Nc                   s$   g | ]\}}|   vr||fqS r!   )rz   r   rI   r!   r"   rv   u     $ z$MultiDict.update.<locals>.<listcomp>)ro   r   rr   r   rp   )rF   r   rZ   r   r!   r   r"   rp   o  s   zMultiDict.updaterH   r   rI   r   r,   r-   rH   r   r,   r-   rP   )rH   r   r   r   r,   r   )r,   r   )rH   r   r,   r   r,   r-   )rH   r   r   r   r,   r-   )r   r   rZ   r   r,   r-   )r   r   r   r   r   r_   r   r   r   r   r   r   rp   r!   r!   r!   r"   ro   B  s    






ro   c                      s6   e Zd ZdZd fdd	ZdddZdddZ  ZS )QueryParamsz!
    An immutable multidict.
    r   VImmutableMultiDict[Any, Any] | Mapping[Any, Any] | list[tuple[Any, Any]] | str | bytesrZ   r   r,   r-   c                   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   Trf   r5   c                 S  ru   r!   ri   r   r!   r!   r"   rv     rw   z(QueryParams.__init__.<locals>.<listcomp>c                 S  rh   r!   ri   r   r!   r!   r"   rl     rm   z(QueryParams.__init__.<locals>.<dictcomp>)r   r|   r   superrK   r   bytesr@   r   r   rq   )rF   r   rZ   rI   rc   r!   r"   rK     s   

$zQueryParams.__init__r   c                 C  r   rP   )r   r   rN   r!   r!   r"   r     r   zQueryParams.__str__c                 C  s    | j j}t| }| d|dS r   )rc   r   r   )rF   r   r2   r!   r!   r"   r     r   zQueryParams.__repr__)r   r   rZ   r   r,   r-   r   )r   r   r   r   rK   r   r   __classcell__r!   r!   r   r"   r   z  s
    
r   c                   @  s~   e Zd ZdZddddd(ddZed)ddZed*ddZd+ddZd,ddZ	d-d.ddZ
d/d!d"Zd0d#d$Zd1d&d'ZdS )2
UploadFilez@
    An uploaded file included as part of the request data.
    N)sizefilenamer4   filer   r   rV   r  
str | Noner4   Headers | Noner,   r-   c                C  s2   || _ || _|| _|pt | _t| jdd| _d S )N	_max_sizer   )r  r  r   Headersr4   getattr_max_mem_size)rF   r  r   r  r4   r!   r!   r"   rK     s
   zUploadFile.__init__c                 C  s   | j dd S )Nzcontent-type)r4   r?   rN   r!   r!   r"   content_type  s   zUploadFile.content_typerW   c                 C  s   t | jdd}| S )N_rolledT)r  r  )rF   rolled_to_diskr!   r!   r"   
_in_memory  s   zUploadFile._in_memorysize_to_addr   c                 C  s0   | j sdS | j | }| jrt|| jkS dS )NTF)r  r  tellr  rW   )rF   r  future_sizer!   r!   r"   
_will_roll  s   zUploadFile._will_rolldatar   c                   sT   t |}| jd ur|  j|7  _| |r"t| jj|I d H  d S | j| d S rP   )r   r   r  r   r  write)rF   r  new_data_lenr!   r!   r"   r    s   

zUploadFile.writer\   c                   s(   | j r
| j|S t| jj|I d H S rP   )r  r  readr   )rF   r   r!   r!   r"   r    s   zUploadFile.readoffsetc                   s0   | j r| j| d S t| jj|I d H  d S rP   )r  r  seekr   )rF   r  r!   r!   r"   r    s   zUploadFile.seekc                   s,   | j r| j  d S t| jjI d H  d S rP   )r  r  closer   rN   r!   r!   r"   r    s   zUploadFile.closer   c                 C  s&   | j j d| jd| jd| jdS )Nz
(filename=z, size=z
, headers=r   )rc   r   r  r   r4   rN   r!   r!   r"   r     s   &zUploadFile.__repr__)
r  r   r   rV   r  r  r4   r  r,   r-   )r,   r  r   )r  r   r,   rW   )r  r   r,   r-   )r\   )r   r   r,   r   )r  r   r,   r-   r   r   )r   r   r   r   rK   r   r	  r  r  r  r  r  r  r   r!   r!   r!   r"   r     s     

	


r   c                      s,   e Zd ZdZd fdd	Zdd
dZ  ZS )FormDatazN
    An immutable multidict, containing both file uploads and text input.
    r   NFormData | Mapping[str, str | UploadFile] | list[tuple[str, str | UploadFile]]rZ   str | UploadFiler,   r-   c                   s   t  j|i | d S rP   )r   rK   )rF   r   rZ   r   r!   r"   rK     s   zFormData.__init__c                   s0   |   D ]\}}t|tr| I d H  qd S rP   )rr   r|   r   r  r   r!   r!   r"   r    s   
zFormData.close)r   r  rZ   r  r,   r-   r   )r   r   r   r   rK   r  r   r!   r!   r   r"   r    s    r  c                   @  s   e Zd ZdZ			d0d1ddZed2ddZd3ddZd3ddZd4ddZ	d5ddZ
d6ddZd7dd Zd8d#d$Zd9d&d'Zd:d)d*Zd;d,d-Zd<d.d/ZdS )=r  z3
    An immutable, case-insensitive multidict.
    Nr4   Mapping[str, str] | Noneraw list[tuple[bytes, bytes]] | Noner)   MutableMapping[str, Any] | Noner,   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 r5   )lowerencoderj   r!   r!   r"   rv     s   ( z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r4   )r   rq   r   )rF   r4   r  r)   r!   r!   r"   rK     s   
zHeaders.__init__list[tuple[bytes, bytes]]c                 C  r   rP   r   rN   r!   r!   r"   r    rY   zHeaders.raw	list[str]c                 C     dd | j D S )Nc                 S  s   g | ]	\}}| d qS r  r@   rj   r!   r!   r"   rv         z Headers.keys.<locals>.<listcomp>r   rN   r!   r!   r"   rz     r   zHeaders.keysc                 C  r$  )Nc                 S  s   g | ]	\}}| d qS r  r%  rj   r!   r!   r"   rv     r&  z"Headers.values.<locals>.<listcomp>r   rN   r!   r!   r"   r     r   zHeaders.valueslist[tuple[str, str]]c                 C  r$  )Nc                 S  s$   g | ]\}}| d | d fqS r  r%  rj   r!   r!   r"   rv     r   z!Headers.items.<locals>.<listcomp>r   rN   r!   r!   r"   rq     r   zHeaders.itemsrH   r   c                   s"   |  d  fdd| jD S )Nr5   c                   s"   g | ]\}}| kr| d qS r  r%  r   get_header_keyr!   r"   rv     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   rN   r!   r!   r"   mutablecopy  r   zHeaders.mutablecopyc                 C  s<   |  d}| jD ]\}}||kr|d  S q
t|)Nr5   )r   r!  r   r@   KeyErrorrF   rH   r)  
header_keyheader_valuer!   r!   r"   r      s   zHeaders.__getitem__r   rW   c                 C  s0   |  d}| jD ]\}}||kr dS q
dS )Nr5   TFr*  r.  r!   r!   r"   r   '  s   zHeaders.__contains__Iterator[Any]c                 C  r   rP   r   rN   r!   r!   r"   r   .  r   zHeaders.__iter__r   c                 C  r   rP   )r   r   rN   r!   r!   r"   r   1  r   zHeaders.__len__r~   c                 C  s"   t |tsdS t| jt|jkS r   )r|   r  r   r   r   r!   r!   r"   r   4  s   
zHeaders.__eq__c                 C  sF   | j j}t|  }t|t| kr| d|dS | d| jdS )Nr   r   z(raw=)rc   r   dictrq   r   r  )rF   r   as_dictr!   r!   r"   r   9  s
   zHeaders.__repr__)NNN)r4   r  r  r  r)   r  r,   r-   r,   r"  )r,   r#  )r,   r'  )rH   r   r,   r#  )r,   r+  )rH   r   r,   r   r   )r,   r1  r   r   r   )r   r   r   r   rK   r   r  rz   r   rq   r   r,  r   r   r   r   r   r   r!   r!   r!   r"   r    s&    









r  c                   @  sj   e Zd ZdddZddd	ZdddZdddZed ddZd!ddZ	d"ddZ
dddZd#ddZdS )$r+  rH   r   rI   r,   r-   c           	      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.
        r5   r^   Nr   r   r!  	enumerater   r   reversed)	rF   rH   rI   set_key	set_valuefound_indexesidxr   r   r!   r!   r"   r   B  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`.
        r5   Nr5  )rF   rH   del_keypop_indexesr;  r   r   r!   r!   r"   r   X  s   

zMutableHeaders.__delitem__r~   Mapping[str, str]c                 C  s*   t |tstd|jj | | | S NzExpected a mapping but got )r|   r   	TypeErrorrc   r   rp   r   r!   r!   r"   __ior__f  s   

zMutableHeaders.__ior__c                 C  s2   t |tstd|jj |  }|| |S r?  )r|   r   r@  rc   r   r,  rp   )rF   r~   newr!   r!   r"   __or__l  s
   

zMutableHeaders.__or__r"  c                 C  r   rP   r   rN   r!   r!   r"   r  s  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.
        r5   )r   r!  r6  r   r@   r   )rF   rH   rI   r8  r9  r;  r   r   r!   r!   r"   r   w  s   
zMutableHeaders.setdefaultc                 C  s   |  D ]\}}|| |< qd S rP   )rq   )rF   r~   rH   valr!   r!   r"   rp     s   
zMutableHeaders.updatec                 C  s,   |  d}|d}| j||f dS )zD
        Append a header, preserving any duplicate entries.
        r5   N)r   r!  r   r   )rF   rH   rI   
append_keyappend_valuer!   r!   r"   r     s   
zMutableHeaders.appendvaryc                 C  s,   |  d}|d urd||g}|| d< d S )NrG  r   )r?   r   )rF   rG  existingr!   r!   r"   add_vary_header  s   
zMutableHeaders.add_vary_headerN)rH   r   rI   r   r,   r-   rH   r   r,   r-   )r~   r>  r,   r+  r4  )rH   r   rI   r   r,   r   )r~   r>  r,   r-   )rG  r   r,   r-   )r   r   r   r   r   rA  rC  r   r  r   rp   r   rI  r!   r!   r!   r"   r+  A  s    






r+  c                      s~   e Zd ZU dZded< d!d" fddZd#ddZd$ddZd%ddZd&ddZ	d'ddZ
d(ddZd)ddZd*dd Z  ZS )+Statezm
    An object that can be used to store arbitrary state.

    Used for `request.state` and `app.state`.
    zdict[str, Any]_stateNstatedict[str, Any] | Nonec                   s   |d u ri }t  d| d S )NrL  )r   __setattr__)rF   rM  r   r!   r"   rK     s   zState.__init__rH   r   rI   r,   r-   c                 C     || j |< d S rP   rL  r   r!   r!   r"   rO       zState.__setattr__c                 C  s4   z| j | W S  ty   d}t|| jj|w )Nz!'{}' object has no attribute '{}')rL  r-  AttributeErrorformatrc   r   )rF   rH   messager!   r!   r"   __getattr__  s   zState.__getattr__c                 C     | j |= d S rP   rQ  r   r!   r!   r"   __delattr__  r   zState.__delattr__r   c                 C  r   rP   rQ  r   r!   r!   r"   r     r   zState.__getitem__c                 C  rP  rP   rQ  r   r!   r!   r"   r     rR  zState.__setitem__c                 C  rW  rP   rQ  r   r!   r!   r"   r     r   zState.__delitem__r   c                 C  r   rP   )r   rL  rN   r!   r!   r"   r     r   zState.__iter__r   c                 C  r   rP   )r   rL  rN   r!   r!   r"   r     r   zState.__len__rP   )rM  rN  r   )rH   r   r,   r   r   )rH   r   r,   r   )rH   r   rI   r   r,   r-   rJ  r   r   )r   r   r   r   r    rK   rO  rV  rX  r   r   r   r   r   r   r!   r!   r   r"   rK    s   
 






rK  )0
__future__r   recollections.abcr   r   r   r   r   r   r	   r
   r   typingr   r   r   r   r   r   urllib.parser   r   r   r   starlette.concurrencyr   starlette.typesr   r   r#   r$   compile
IGNORECASErA   r&   r   r   r   r   r   ro   r   r   r  r  r+  rK  r!   r!   r!   r"   <module>   s2    (  E8 HMW