
    Vh0                        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
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mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0  ed      Z1ee2ede2f   f   Z3 G d d      Z4 G d d      Z5dZ6de&de-de)fdZ7 G d d      Z8y) z0
The starlette extension to rate-limit requests
    N)datetime)
formatdateparsedate_to_datetime)wraps)	AnyCallableDictListOptionalSetTupleTypeVarUnion)RateLimitItem)ConfigurationError)MemoryStoragestorage_from_string)
STRATEGIESRateLimiter)Config)MutableHeaders)Request)JSONResponseResponse)Literal   )RateLimitExceeded)Limit
LimitGroupT.c                   P    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZy)CRATELIMIT_ENABLEDRATELIMIT_HEADERS_ENABLEDRATELIMIT_STORAGE_URLRATELIMIT_STORAGE_OPTIONSRATELIMIT_STRATEGYRATELIMIT_GLOBALRATELIMIT_DEFAULTRATELIMIT_APPLICATIONRATELIMIT_HEADER_LIMITRATELIMIT_HEADER_REMAININGRATELIMIT_HEADER_RESETRATELIMIT_SWALLOW_ERRORSRATELIMIT_IN_MEMORY_FALLBACK$RATELIMIT_IN_MEMORY_FALLBACK_ENABLEDRATELIMIT_HEADER_RETRY_AFTER"RATELIMIT_HEADER_RETRY_AFTER_VALUERATELIMIT_KEY_PREFIXN)__name__
__module____qualname__ENABLEDHEADERS_ENABLEDSTORAGE_URLSTORAGE_OPTIONSSTRATEGYGLOBAL_LIMITSDEFAULT_LIMITSAPPLICATION_LIMITSHEADER_LIMITHEADER_REMAININGHEADER_RESETSWALLOW_ERRORSIN_MEMORY_FALLBACKIN_MEMORY_FALLBACK_ENABLEDHEADER_RETRY_AFTERHEADER_RETRY_AFTER_VALUE
KEY_PREFIX     _/var/www/catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/slowapi/extension.pyr"   r"   -   s]    !G1O)K1O#H&M(N0+L3+L/N7!G7C'JrI   r"   c                       e Zd ZdZdZdZdZy)HEADERSr            N)r4   r5   r6   RESET	REMAININGLIMITRETRY_AFTERrH   rI   rJ   rL   rL   A   s    EIEKrI   rL      requestexcreturnc                     t        dd|j                   id      }| j                  j                  j                  j                  || j                  j                        }|S )z
    Build a simple JSON response that includes the details of the rate limit
    that was hit. If no limit is hit, the countdown is added to headers.
    errorzRate limit exceeded: i  )status_code)r   detailappstatelimiter_inject_headersview_rate_limit)rU   rV   responses      rJ   _rate_limit_exceeded_handlerrb   K   s\    
 	)#**67SH {{  ((88'--//H OrI   c            #       :   e Zd ZdZg g dddi ddg ddddddfdedef   d	ee   d
ee   dede	e   de	e   de
eef   dededee   dede	e   dedede	e   ded   ddf"dZd<dZd=dededefdZdefdZd<d Zedefd!       Zd"ed#eeee   f   defd$Zd%ed#eeee   f   defd&Zd'ed(ed)ee   ddfd*Zdefd+Z	 d>d'ed,e	ede f      d-eddfd.Z!	 	 	 	 	 	 	 	 	 d?d/ede	edef      d0ed1e	e   d2ed3e	ee      d4e	e   d5e	edef      d6e"eedef   f   d7edede f   fd8Z#	 	 	 	 	 	 	 d@d/ede	edef      d2ed3e	ee      d4e	e   d5e	edef      d6e"eedef   f   d7edefd9Z$	 	 	 	 	 dAd/ed1ede	edef      d4e	e   d5e	edef      d6e"eedef   f   d7edefd:Z%d; Z&y)BLimitera1  
    Initializes the slowapi rate limiter.

    ** parameter **

    * **app**: `Starlette/FastAPI` instance to initialize the extension
     with.

    * **default_limits**: a variable list of strings or callables returning strings denoting global
     limits to apply to all routes. `ratelimit-string` for  more details.

    * **application_limits**: a variable list of strings or callables returning strings for limits that
     are applied to the entire application (i.e a shared limit for all routes)

    * **key_func**: a callable that returns the domain to rate limit by.

    * **headers_enabled**: whether ``X-RateLimit`` response headers are written.

    * **strategy:** the strategy to use. refer to `ratelimit-strategy`

    * **storage_uri**: the storage location. refer to `ratelimit-conf`

    * **storage_options**: kwargs to pass to the storage implementation upon
      instantiation.
    * **auto_check**: whether to automatically check the rate limit in the before_request
     chain of the application. default ``True``
    * **swallow_errors**: whether to swallow errors when hitting a rate limit.
     An exception will still be logged. default ``False``
    * **in_memory_fallback**: a variable list of strings or callables returning strings denoting fallback
     limits to apply when the storage is down.
    * **in_memory_fallback_enabled**: simply falls back to in memory storage
     when the main storage is down and inherits the original limits.
    * **key_prefix**: prefix prepended to rate limiter keys.
    * **enabled**: set to False to deactivate the limiter (default: True)
    * **config_filename**: name of the config file for Starlette from which to load settings
     for the rate limiter. Defaults to ".env".
    * **key_style**: set to "url" to use the url, "endpoint" to use the view_func
    FNT urlkey_func.default_limitsapplication_limitsheaders_enabledstrategystorage_uristorage_options
auto_checkswallow_errorsin_memory_fallbackin_memory_fallback_enabledretry_after
key_prefixenabledconfig_filename	key_style)endpointrf   rW   c                    t        j                  d      | _        t        j                  j                  d      }t        |r|dn|      | _        || _        g | _	        g | _
        g | _        |xs t        |
      dkD  | _        t               | _        g | _        || _        i | _        || _        || _        || _        || _        || _        |	| _        || _        || _        || _        t        |      D ]9  }| j                  j9                  t;        || j2                  ddddddd	      g       ; |D ]9  }| j                  j9                  t;        || j2                  ddddddd	      g       ; |
D ]9  }| j                  j9                  t;        || j2                  ddddddd	      g       ; i | _        i | _        d| _         d| _!        d| _"        tG        jF                         | _$        i | _%         G d d	t         jL                        }| j                  jO                   |              | jQ                  tR        jT                  | j                        | _        | jQ                  tR        jV                  | j0                        | _        | j"                  xs  | jQ                  tR        jX                  d      | _        | j,                  j[                  | jQ                  tR        j\                  i              t_        | j*                  xs  | jQ                  tR        j`                  d
      fi | j,                  | _1        | j(                  xs  | jQ                  tR        jd                  d      }|tf        vrti        d|z        tg        |   | jb                        | _5        | j$                  j[                  tl        jn                  | j$                  jq                  tl        jn                  | jQ                  tR        jr                  d            tl        jt                  | j$                  jq                  tl        jt                  | jQ                  tR        jv                  d            tl        jx                  | j$                  jq                  tl        jx                  | jQ                  tR        jz                  d            tl        j|                  | j$                  jq                  tl        j|                  | jQ                  tR        j~                  d            i       | j&                  xs | jQ                  tR        j                        | _        | j4                  xs | jQ                  tR        j                        | _        | jQ                  tR        j                  d      }| j                  s%|r#t;        || j2                  ddddddd	      g| _
        | jQ                  tR        j                  d      }| j                  s%|r#t;        || j2                  ddddddd	      g| _	        | jQ                  tR        j                  d      }| jQ                  tR        j                  d      }| j                  s%|r#t;        || j2                  ddddddd	      g| _        | j                  s!|xs t        | j                        dkD  | _        | j                  r-t               | _G        tg        |   | j                        | _!        yy)z9
        Configure the rate limiter at app level
        slowapiz.envNr   Fr   globalc                       e Zd Zd Zy)*Limiter.__init__.<locals>.BlackHoleHandlerc                       y NrH   )_s    rJ   emitz/Limiter.__init__.<locals>.BlackHoleHandler.emit   s    rI   N)r4   r5   r6   r   rH   rI   rJ   BlackHoleHandlerr|      s    rI   r   z	memory://zfixed-windowz!Invalid rate limiting strategy %szX-RateLimit-ResetzX-RateLimit-RemainingzX-RateLimit-LimitRetry-After)Hlogging	getLoggerloggerospathisfiler   
app_configrt   _default_limits_application_limits_in_memory_fallbacklen_in_memory_fallback_enabledset_exempt_routes_request_filters_headers_enabled_header_mapping_retry_after	_strategy_storage_uri_storage_options_auto_check_swallow_errors	_key_func_key_prefix
_key_styleextendr   _route_limits_dynamic_route_limits_storage_dead_fallback_limiter_Limiter__check_backend_counttime_Limiter__last_check_backend_Limiter__marked_for_limitingStreamHandler
addHandlerget_app_configr"   r7   rB   r8   updater:   r   r9   _storager;   r   r   _limiterrL   rP   getrA   rQ   r@   rR   r?   rS   rE   rF   rG   r>   r=   rD   rC   r   _fallback_storage)selfrg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   dotenv_file_existslimitr   
app_limitsconf_limitsfallback_enabledfallback_limitss                           rJ   __init__zLimiter.__init__   s*   6 ''	2WW^^F3 !o&=  
 !#% 57 &E#.@*AA*E 	( ),;= //1+6!' /%-!%#( 	E  ''t~~tUD$aQV	 ( 	E$$++ 
	  ( 	E$$++t~~tUD$aQV	 68BD"#(!%%&"$(IIK!@B"	w44 	 	/12**199dllC#22d22 
 !% 5 5 !
9L9Lu:
 	$$T%8%89J9JB%OP+P!4!4Q]]K!P
##
 >>TT%8%8^%T:%$%H8%STT%/%9$--%H##t3377MM''8KL  !!4#7#7#;#;%%''(:(:<ST$ t3377MM''8KL  ##T%9%9%=%=''''(<(<mL&	
( !-- 
1D1D&&2
  ++Pt/B/B1<</P151D1D  $2

 ''JNN
(D$ 372E2Ed3
 ##udD$PQSX$D 
  ..q/K/KUS6:6I6I  $7
 ''O#NN
(D$ // EC(@(@$AA$E , ++%2_D"%/%9$:P:P%QD" ,rI   c                 j    | t         j                  _        t         j                  t        t
               y)z_
        Starlette startup event handler that links the app with the Limiter instance.
        N)r\   r]   r^   add_exception_handlerr   rb   r   s    rJ   slowapi_startupzLimiter.slowapi_startupH  s"     !		!!"35QRrI   keydefault_valuec                 f    |r| j                  ||t        |            S | j                  ||      S )zQ
        Place holder until we find a better way to load config from app
        )defaultcast)r   )r   type)r   r   r   s      rJ   r   zLimiter.get_app_configO  s<      OOCT-=POQ	
 m<	
rI   c                    | j                   t        kD  rd| _         t        j                         | j                  z
  t	        d| j                         kD  r/t        j                         | _        | xj                   dz  c_         yy)Nr   rM   r   TF)r   MAX_BACKEND_CHECKSr   r   powr   s    rJ   __should_check_backendzLimiter.__should_check_backendY  sd    %%(::)*D&99;222SD<V<V5WW(,		D%&&!+&rI   c                     	 | j                   j                          | j                  j                  d       y# t        $ r | j                  j                  d       Y yw xY w)z?
        resets the storage if it supports being reset
        z-Storage has been reset and all limits clearedz.This storage type does not support being resetN)r   resetr   infoNotImplementedErrorwarningr   s    rJ   r   zLimiter.resetb  sO    	RMM!KKLM" 	RKK PQ	Rs   58 $AAc                     | j                   r+| j                  r| j                  sJ d       | j                  S | j                  S )zT
        The backend that keeps track of consumption of endpoints vs limits
        z=Fallback limiter is needed when in memory fallback is enabled)r   r   r   r   r   s    rJ   r^   zLimiter.limiterl  sF    
 $"B"B&&ONO&)))== rI   ra   current_limitc                    | j                   r| j                  r|t        |t              st	        d      	  | j
                  j                  |d   g|d    }d|d   z   }|j                  j                  | j                  t        j                     t        |d   j                               |j                  j                  | j                  t        j                     t        |d                |j                  j                  | j                  t        j                     t        |             |j                  j!                  d      }|t#        | j%                  |      |      }| j&                  dk(  rt)        |      n(t        t+        |t-        j,                         z
              |j                  | j                  t        j.                     <   |S |S #  | j0                  r@| j2                  s4| j4                  j7                  d       d| _        | j9                  ||      }| j:                  r| j4                  j=                  d       Y |S  xY w)	NzHparameter `response` must be an instance of starlette.responses.Responser   r   r   	http-dateBRate limit storage unreachable - falling back to in-memory storageT5Failed to update rate limit headers. Swallowing error)rt   r   
isinstancer   	Exceptionr^   get_window_statsheadersappendr   rL   rR   stramountrQ   rP   r   max_determine_retry_timer   r   intr   rS   r   r   r   r   r_   r   	exception)r   ra   r   window_statsreset_inexisting_retry_after_headers         rJ   r_   zLimiter._inject_headersy  s    <<D11m6Oh1^ *0M0M0M!!$1'4Q'71 |A.  ''((7]1=M=T=T9U   ''(():):;Sa=Q   ''((7X
 /7.>.>.B.B=.Q+.:"223NO  H ((K7 x(SDIIK!789   !5!5g6I6I!JK& x++D4F4FKK''- *.D&#33HmLH''KK))O
  s   FG A5IIr   c                    | j                   rX| j                  rK|H	  | j                  j                  |d   g|d    }d|d   z   }t	        |d   j
                        || j                  t        j                     <   t	        |d         || j                  t        j                     <   t	        |      || j                  t        j                     <   |j                  d      }|t        | j                  |      |      }| j                  dk(  rt        |      n(t	        t!        |t#        j"                         z
              || j                  t        j$                     <   |S |S # t&        $ rx | j(                  r@| j*                  s4| j,                  j/                  d       d| _        | j1                  ||      }| j2                  r| j,                  j5                  d       Y |S  w xY w)a!  
        Injects 'X-RateLimit-Reset', 'X-RateLimit-Remaining', 'X-RateLimit-Limit'
        and 'Retry-After' headers into :headers parameter if needed.

        Basically the same as _inject_headers, but without access to the Response object.
        -> supports ASGI Middlewares.
        r   r   r   r   r   Tr   )rt   r   r^   r   r   r   r   rL   rR   rQ   rP   r   r   r   r   r   r   r   rS   r   r   r   r   r   _inject_asgi_headersr   r   )r   r   r   r   r   r   s         rJ   r   zLimiter._inject_asgi_headers  s    <<D11m6O&0M0M0M!!$1'4Q'71 |A.?B!!$++@,,W]];< DG|TUCW,,W->->?@?B8},,W]];< /6kk-.H+.:"223NO  H ((K7 x(SDIIK!789 ,,W-@-@AB& w  ++D4F4FKK''- *.D&"77OG''KK))O
  s   EE( (A<G)'G)rU   rw   limitsc                    d }d }|D ]  }|j                   xs |}|j                  r!|j                  '|j                  j	                         |j                  vrT|j
                  r|d|j                  z  z  }dt        j                  |j                        j                  j                         v r|j                  |      }n|j                         }||g}	t        |	      r| j                  r| j                  g|	z   }	|r|j                  |d   k  r|j                  |	f}t        |j                        r|j                  |      n|j                  }
 | j                   j"                  |j                  g|	d|
irx| j$                  j'                  d|j                  ||       |}|j                  |	f} n)| j$                  j)                  d|j                          ||j*                  _        |rt/        |      y )Nz:%srU   r   costz*ratelimit %s (%s) exceeded at endpoint: %sz4Skipping limit: %s. Empty value found in parameters.)scope	is_exemptmethodsmethodlower
per_methodinspect	signaturerg   
parameterskeysallr   r   callabler   r^   hitr   r   rY   r]   r`   r   )r   rU   rw   r   failed_limitlimit_for_headerlimlimit_scope	limit_keyargsr   s              rJ   __evaluate_limitszLimiter.__evaluate_limits  s     $	C))/xK}}{{&7>>+?+?+A+T~~uw~~55G--cll;FFKKMMLL1	LLN	{+D4y## ,,-4D'3997G7J+J(+		4'8$,4SXX,>sxx(CHH't||''		DDDtDKK''D		!#	 $'L(+		4'8$!!JCII I$	L )9%#L11 rI   c                 ,   	 t        |      }|,t        t	        j
                  |j                                     S 	 t        |      }t        t	        j                         |z         S # t        t        f$ r d }Y mw xY w# t        $ r t        d      w xY w)NzQRetry-After Header does not meet RFC2616 - value is not of http-date or int type.)r   	TypeError
ValueErrorr   r   mktime	timetuple)r   retry_header_valueretry_after_dateretry_after_ints       rJ   r   zLimiter._determine_retry_time  s    	$3H"4 't{{#3#=#=#?@AA	#&'9#:O 499;011 :& 	$#	$  	c 	s   A' A> 'A;:A;>Bendpoint_funcin_middlewarec                    |d   xs d}|}|r|j                    d|j                   nd}| j                  dk(  r|n|}|r6| j                  r*|| j                  v st        d | j                  D              ryg }g }	|sm|| j                  v r| j                  |   ng }g }	|| j                  v r>| j                  |   D ],  }
	 |	j                  t        |
j                  |                   . 	 g }| j                  r| j                   r|r|| j"                  v rny| j%                         rD| j&                  j)                         r*| j                  j+                  d       d	| _        d
| _        n%t        t/        j0                  | j2                         }|s||	z   }|r%t        t/        j0                  | j4                         ng }||z  }t7        d |D              }|s|r|| j"                  v r|r(|t        t/        j0                  | j8                         z  }| j;                  |||       y# t        $ r(}| j                  j                  d||       Y d}~d}~ww xY w# t<        $ r}t?        |t@              r | jB                  rB| j                  s6| j                  jE                  d       d| _        | jG                  |||       n.| jH                  r| j                  jK                  d       n Y d}~yY d}~yd}~ww xY w)z;
        Determine if the request is within limits
        r   re   .rf   c              3   *   K   | ]  } |         y wr~   rH   ).0fns     rJ   	<genexpr>z/Limiter._check_request_limit.<locals>.<genexpr>=  s     8B248s   Nz2failed to load ratelimit for view function %s (%s)zRate limit storage recoveredFr   c              3   6   K   | ]  }|j                      y wr~   )override_defaults)r  r   s     rJ   r  z/Limiter._check_request_limit.<locals>.<genexpr>i  s      (49///(s   r   Tz&Failed to rate limit. Swallowing error)&r5   r4   r   rt   r   anyr   r   r   r   listwith_requestr   r   rY   r   r   r   _Limiter__should_check_backendr   checkr   r   	itertoolschainr   r   r   r   _Limiter__evaluate_limitsr   r   r   r   warn_check_request_limitr   r   )r   rU   r   r   endpoint_url	view_funcendpoint_func_name_endpoint_keyr   dynamic_limitsr   e
all_limitsroute_limitscombined_defaultss                  rJ   r  zLimiter._check_request_limit&  s    v,"!	 ?Hy##$Ai&8&8%9:R 	 )-5(@FX << "T%8%888$"7"788 &( &););; ""#56 
  N!T%?%??556HI C&--d33C3CG3L.MN0	&(J!!d&<&< %74;U;U%U2249L9L9N(()GH-2*562%))//4;S;S*T%U
,2^,C % $*B*BCD 
 l*
$' (=I( %! %%.$2L2LL($y8L8L'M"NNJ""7M:FQ & ))P. R  	!.///8J8J  ) &*"))'=-P''KK))*RS T Q	s2   ?)H&+D:I &	I/II	K:#BK55K:limit_valuesharedr   r   r   error_messageexempt_whenr   r  c                 b    	
 |r|nd dt         dt        f   f	
 f
d}|S )Nfunc.c                 B  
  xs j                   } j                   d j                   }d }g }t              rt	        |	      }n	 t        t	        |	            }j                  j                  |g       j                          |r,j                  j                  |g       j                  |       n+j                  j                  |g       j                  |       d }t        j                          }t#        |j$                  j'                               D ]1  \  }|j(                  dk(  s|j(                  dk(  s%|j(                  } n t+        d  d      t-        j.                         r4t1        j2                         dt4        dt4        d	t6        f fd
       }	|	S t1        j2                         dt4        dt4        d	t6        f fd       }
|
S # t        $ r(}j                  j                  d||       Y d }~d }~ww xY w)Nr  z*Failed to configure throttling for %s (%s)rU   	websocketz2No "request" or "websocket" argument on function ""r   kwargsrW   c                  4  K   j                   r{|j                  d| r|    nd       }t        |t              st	        d      j
                  r;t        |j                  dd      s$j                  |d       d|j                  _	         | i | d {   }j                   rmt        |t              s7j                  |j                  d      j                  j                         |S j                  |j                  j                         |S 7 wNrU   zEparameter `request` must be an instance of starlette.requests.Request_rate_limiting_completeFTra   rt   r   r   r   r   r   getattrr]   r  r'  r   r_   r`   r   r$  rU   ra   r   idxr   s       rJ   async_wrapperzCLimiter.__limit_decorator.<locals>.decorator.<locals>.async_wrapper  s      ||"(**YTS	t"T)'7;"+ g#   ++G#MM+De5 !55gtUKDHGMMA%)4%:6%::H||)(H= 00 &

: 68U8U $O !00 ('--*G*G $O  ;s   BDDB Dc                     j                   r{|j                  d| r|    nd       }t        |t              st	        d      j
                  r;t        |j                  dd      s$j                  |d       d|j                  _	         | i |}j                   rmt        |t              s7j                  |j                  d      j                  j                         |S j                  |j                  j                         |S r&  r(  r*  s       rJ   sync_wrapperzBLimiter.__limit_decorator.<locals>.decorator.<locals>.sync_wrapper  s     ||"(**YTS	t"T)'7;"+ g#   ++G#MM+De5 !55gtUKDHGMMA#T4V4H||)(H= 00 &

: 68U8U $O !00 ('--*G*G $OrI   )r   r5   r4   r   r   r	  r   r   rY   r   
setdefaultr   r   r   r   r   r   	enumerater   valuesnamer   asyncioiscoroutinefunction	functoolsr   r   r   )r   keyfuncr2  dynamic_limitstatic_limitsr  connection_typesig	parameterr,  r.  r+  _scoper   r  r  rg   r  r   r  r   r   s   `          @rJ   	decoratorz,Limiter.__limit_decorator.<locals>.decorator  s(   0$..Goo&a7D M)+M$ *!%
!$("'#"&#)' -
%M& &&11$;BB4H**55dB?FF}U""--dB7>>}M-1O##D)C"+CNN,A,A,C"D Y>>Y.)..K2O&/nnO
  HaP  **40&$s $c $h $ '$6 %$ &$ $s $x $ '$6 $#k " KK%%D s   G- -	H6HH)r   r   )r   r  rg   r  r   r   r   r  r  r   r  r=  r<  s   ```  `````` @rJ   __limit_decoratorzLimiter.__limit_decorator  s5     !du	$HS(]3 u	$ u	$n rI   c	           
      4    | j                  ||||||||      S )a  
        Decorator to be used for rate limiting individual routes.

        * **limit_value**: rate limit string or a callable that returns a string.
         :ref:`ratelimit-string` for more details.
        * **key_func**: function/lambda to extract the unique identifier for
         the rate limit. defaults to remote address of the request.
        * **per_method**: whether the limit is sub categorized into the http
         method of the request.
        * **methods**: if specified, only the methods in this list will be rate
         limited (default: None).
        * **error_message**: string (or callable that returns one) to override the
         error message used in the response.
        * **exempt_when**: function returning a boolean indicating whether to exempt
        the route from the limit
        * **cost**: integer (or callable that returns one) which is the cost of a hit
        * **override_defaults**: whether to override the default limits (default: True)
        )r   r   r  r  r   r  _Limiter__limit_decorator)	r   r  rg   r   r   r  r  r   r  s	            rJ   r   zLimiter.limit  s4    : %%!'#/ & 	
 		
rI   c           
      4    | j                  ||d|||||      S )ab  
        Decorator to be applied to multiple routes sharing the same rate limit.

        * **limit_value**: rate limit string or a callable that returns a string.
         :ref:`ratelimit-string` for more details.
        * **scope**: a string or callable that returns a string
         for defining the rate limiting scope.
        * **key_func**: function/lambda to extract the unique identifier for
         the rate limit. defaults to remote address of the request.
        * **per_method**: whether the limit is sub categorized into the http
         method of the request.
        * **methods**: if specified, only the methods in this list will be rate
         limited (default: None).
        * **error_message**: string (or callable that returns one) to override the
         error message used in the response.
        * **exempt_when**: function returning a boolean indicating whether to exempt
        the route from the limit
        * **cost**: integer (or callable that returns one) which is the cost of a hit
        * **override_defaults**: whether to override the default limits (default: True)
        T)r  r  r   r  r@  )r   r  r   rg   r  r  r   r  s           rJ   shared_limitzLimiter.shared_limit7  s4    < %%'#/ & 	
 		
rI   c                     j                   dj                  }| j                  j                  |       t	        j
                        rt              fd       }|S t              fd       }|S )zF
        Decorator to mark a view as exempt from rate limits.
        r  c                  0   K    | i | d {   S 7 wr~   rH   akobjs     rJ   __async_innerz%Limiter.exempt.<locals>.__async_innerj  s      !\q\)))s   c                       | i |S r~   rH   rF  s     rJ   __innerzLimiter.exempt.<locals>.__innerq  s    A||#rI   )r5   r4   r   addr3  r4  r   )r   rI  r2  _Limiter__async_inner_Limiter__inners    `   rJ   exemptzLimiter.exempt`  sv     ..#,,7%&&s+3Z* * !  3Z$ $ NrI   )rW   Nr~   )T)	NFNFNNNr   T)NFNNNr   T)NNNr   T)'r4   r5   r6   __doc__r   r   r
   StrOrCallableStrboolr   r	   r   r   r   r    r   r  r   propertyr   r^   r   r   r   r_   r   r   r   r   r  r   r   r   r  r   rA  r   rC  rP  rH   rI   rJ   rd   rd   Y   s   %V 2457 %"&%)*,$57+0%))-05%ER 38$ER -.	ER
 !!12ER ER 3-ER c]ER c3hER ER ER !!12ER %)ER c]ER ER  !ER" "##ER$ ,-%ER& 
'ERNS
# 
a 
1 
 R 
! 
! 
!3 316}d3i7O1P3	3j2%26;M4PS9<T6U2	2h.2.2*-.27;E{.2	.2`23 20 #	__  c 23_ 	_
 
_H 26,0 '+'+59/0"&F%F 8CH-.F 	F
 ()F F $s)$F  }F hsDy12F C#s(++,F  F 
#s(	FV 26 '+'+59/0"&&
%&
 8CH-.&
 	&

 $s)$&
  }&
 hsDy12&
 C#s(++,&
  &
 
&
X 26'+59/0"&'
%'
  '
 8CH-.	'

  }'
 hsDy12'
 C#s(++,'
  '
 
'
RrI   rd   )9rQ  r3  r5  r   r  r   r   r   r   email.utilsr   r   r   typingr   r   r	   r
   r   r   r   r   r   r   r   limits.errorsr   limits.storager   r   limits.strategiesr   r   starlette.configr   starlette.datastructuresr   starlette.requestsr   starlette.responsesr   r   typing_extensionsr   errorsr   wrappersr   r   r    r   rR  r"   rL   r   rb   rd   rH   rI   rJ   <module>ra     s         	   9 
 
 
 ! , = 5 # 3 & 6 % % ' CLhsCx001 ( ((   ' 8I h \ \rI   