o
    ٰiy{                  
   @  sz  U d dl m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	m
Z
m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mZmZmZmZmZ d	d
lmZmZmZmZm Z m!Z!m"Z" erd dl#m$Z$ d dl%m&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/m0Z0 edZ1e2dZ3edZ4G dd dZ5e5j6e5j7e5j8e5j9e5j:e5j;e5j<e5j=dZ>de?d< dd dd dd dd e5j@e5jAe5jBe5jCdd d	ZDd e?d!< i d e5jEd	e5jFd"e5jGd#e5jHd$e5jId%e5jJd&e5jKd'e5jLd(e5jMd)e5jNd*e5jOd+e5jPd,e5jQd-e5jRd.e5jSd/e5jTd0e5jUe5jVe5jWe5jXe5jYd1ZZd e?d2< 			3dDdEd>d?Z[			3dDdFdBdCZ\dS )G    )annotationsN)getincrementaldecoder)Callable	GeneratorMappingSequence)contextmanager)datedatetime	timedeltatimezone)BytesIO)IOTYPE_CHECKINGAnyTypeVarcastoverload   )CBORDecodeEOFCBORDecodeValueErrorCBORSimpleValueCBORTag
FrozenDictbreak_marker	undefinedDecimal)MessageFraction)IPv4AddressIPv4NetworkIPv6AddressIPv6Network)LiteralUUIDTzX^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(?:\.(\d{1,6})\d*)?(?:Z|([+-])(\d\d):(\d\d))$utf-8c                   @  s|  e Zd ZU dZdZded< ded< 			ddddZedddZedddZ	e	j
dddZ	edddZej
dddZedddZej
dd dZedd!d"Zej
dd#d"Zdd%d&Zdd+d,Zdd/d0Zddd5d6Zedd8d9Zdd;d<Zdd>d?ZeddAdBZeddFdBZdddGdBZddHdIZddJdKZddLdMZddOdPZddRdSZddUdVZddWdXZddYdZZdd\d]Z dd^d_Z!ddadbZ"ddcddZ#ddedfZ$ddgdhZ%ddjdkZ&ddldmZ'ddndoZ(ddpdqZ)ddrdsZ*ddudvZ+ddxdyZ,dd{d|Z-dd~dZ.dddZ/dddZ0dddZ1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7dddZ8dS )CBORDecodera  
    The CBORDecoder class implements a fully featured `CBOR`_ decoder with
    several extensions for handling shared references, big integers, rational
    numbers and so on. Typically the class is not used directly, but the
    :func:`load` and :func:`loads` functions are called to indirectly construct
    and use the class.

    When the class is constructed manually, the main entry points are
    :meth:`decode` and :meth:`decode_from_bytes`.

    .. _CBOR: https://cbor.io/
    )
	_tag_hook_object_hook_share_index_shareables_fp_fp_read
_immutable_str_errors_stringref_namespace_decode_depth	IO[bytes]r/   zCallable[[int], bytes]r0   Nstrictfptag_hook,Callable[[CBORDecoder, CBORTag], Any] | Noneobject_hook3Callable[[CBORDecoder, dict[Any, Any]], Any] | None
str_errors%Literal['strict', 'error', 'replace']c                 C  s:   || _ || _|| _|| _d| _g | _d| _d| _d| _dS )a  
        :param fp:
            the file to read from (any file-like object opened for reading in binary
            mode)
        :param tag_hook:
            callable that takes 2 arguments: the decoder instance, and the
            :class:`.CBORTag` to be decoded. This callback is invoked for any tags
            for which there is no built-in decoder. The return value is substituted
            for the :class:`.CBORTag` object in the deserialized output
        :param object_hook:
            callable that takes 2 arguments: the decoder instance, and a
            dictionary. This callback is invoked for each deserialized
            :class:`dict` object. The return value is substituted for the dict in
            the deserialized output.
        :param str_errors:
            determines how to handle unicode decoding errors (see the `Error Handlers`_
            section in the standard library documentation for details)

        .. _Error Handlers: https://docs.python.org/3/library/codecs.html#error-handlers

        NFr   )	r7   r8   r:   r<   r-   r.   r3   r1   r4   )selfr7   r8   r:   r<    r?   B/home/ubuntu/.local/lib/python3.10/site-packages/cbor2/_decoder.py__init__E   s   
zCBORDecoder.__init__returnboolc                 C     | j S )z
        Used by decoders to check if the calling context requires an immutable
        type.  Object_hook or tag_hook should raise an exception if this flag
        is set unless the result can be safely used as a dict key.
        )r1   r>   r?   r?   r@   	immutablek   s   zCBORDecoder.immutablec                 C  rD   N)r/   rE   r?   r?   r@   r7   t      zCBORDecoder.fpvalueNonec                 C  s@   zt |js
tdW n ty   tdw || _|j| _d S )Nzfp.read is not callablezfp object has no read method)callableread
ValueErrorAttributeErrorr/   r0   r>   rI   r?   r?   r@   r7   x   s   
c                 C  rD   rG   )r+   rE   r?   r?   r@   r8      rH   zCBORDecoder.tag_hookc                 C  "   |d u st |r|| _d S td)Nz#tag_hook must be None or a callable)rK   r+   rM   rO   r?   r?   r@   r8         
c                 C  rD   rG   )r,   rE   r?   r?   r@   r:      rH   zCBORDecoder.object_hookc                 C  rP   )Nz&object_hook must be None or a callable)rK   r,   rM   rO   r?   r?   r@   r:      rQ   c                 C  rD   rG   )r2   rE   r?   r?   r@   r<      rH   zCBORDecoder.str_errorsc                 C  s"   |dv r	|| _ d S td|d)N)r6   errorreplacezinvalid str_errors value z1 (must be one of 'strict', 'error', or 'replace'))r2   rM   rO   r?   r?   r@   r<      s
   

r(   c                 C  s   | j dur|| j| j < |S )z
        Set the shareable value for the last encountered shared value marker,
        if any. If the current shared index is ``None``, nothing is done.

        :param value: the shared value
        :returns: the shared value to permit chaining
        N)r-   r.   rO   r?   r?   r@   set_shareable   s   
zCBORDecoder.set_shareablestringstr | byteslengthintc                 C  s   | j d ur<t| j }|dk r|dk}n|dk r|dk}n|dk r%|dk}n|dk r.|dk}n|d	k}|r>| j | d S d S d S )
N                  l              )r3   lenappend)r>   rU   rW   
next_indexis_referencedr?   r?   r@   _stringref_namespace_add   s   





z$CBORDecoder._stringref_namespace_addamountbytesc                 C  s4   |  |}t||k rtd| dt| d|S )zj
        Read bytes from the data stream.

        :param int amount: the number of bytes to read
        z*premature end of stream (expected to read z bytes, got z	 instead))r0   ra   r   )r>   rf   datar?   r?   r@   rL      s   
zCBORDecoder.readFrF   unsharedr   c           	      C  s   |r| j }d| _ |r| j}d | _z$| dd }|d? }|d@ }t| }|| |W |r.|| _ |r4|| _S S |r:|| _ |r?|| _w )NTr   r   r^      )r1   r-   rL   major_decoders)	r>   rF   ri   old_immutable	old_indexinitial_byte
major_typesubtypedecoderr?   r?   r@   _decode   s*   
zCBORDecoder._decodeGenerator[None]c              	   c  s    |  j d7  _ z#dV  W |  j d8  _ | j dksJ | j dkr*| j  d| _dS dS |  j d8  _ | j dks:J | j dkrG| j  d| _w )a/  
        Context manager for tracking decode depth and clearing shared state.

        Shared state is cleared at the end of each top-level decode to prevent
        shared references from leaking between independent decode operations.
        Nested calls (from hooks) must preserve the state.
        r   Nr   )r4   r.   clearr-   rE   r?   r?   r@   _decoding_context   s   	




zCBORDecoder._decoding_contextobjectc                 C  s4   |    |  W  d   S 1 sw   Y  dS )z
        Decode the next value from the stream.

        :raises CBORDecodeError: if there is any problem decoding the stream
        N)ru   rr   rE   r?   r?   r@   decode   s   
$zCBORDecoder.decodebufc              	   C  s   |   3 t|}| j}|| _|  }|| _|W  d   W  d   S 1 s*w   Y  W d   dS 1 s:w   Y  dS )aA  
        Wrap the given bytestring as a file and call :meth:`decode` with it as
        the argument.

        This method was intended to be used from the ``tag_hook`` hook when an
        object needs to be decoded separately from the rest but while still
        taking advantage of the shared value registry.
        N)ru   r   r7   rr   )r>   rx   r7   old_fpretvalr?   r?   r@   decode_from_bytes  s   
	
"zCBORDecoder.decode_from_bytesrp   c                 C     d S rG   r?   r>   rp   r?   r?   r@   _decode_length     zCBORDecoder._decode_lengthallow_indefiniteLiteral[True]
int | Nonec                 C  r|   rG   r?   r>   rp   r   r?   r?   r@   r~     r   c                 C  s   |dk r|S |dkr|  dd S |dkr#tttd|  dd S |dkr5tttd|  d	d S |d
krGtttd|  dd S |dkrO|rOd S td|d)NrY   r   r      z>H      z>Lr\      z>Q   rj   z#unknown unsigned integer subtype 0xx)rL   r   rX   structunpackr   r   r?   r?   r@   r~     s   c                 C  s   |  | |S rG   rT   r~   r}   r?   r?   r@   decode_uint*  s   zCBORDecoder.decode_uintc                 C  s   |  | | d S Nr   r   r}   r?   r?   r@   decode_negint.  s   zCBORDecoder.decode_negintc           
      C  s  | j |dd}|d u rNg }	 | dd }|dkrd|}n.|d? dkrH|  |d	@ }|d u s5|tjkr=td
|d| |}|| ntdqn;|tjkr[td|d|dkre| |}n|}t }|rt|d}	|	| |	 ||	8 }|slt
|}| || | |S )NTr   r   r          r^   r   rj   z1invalid length for indefinite bytestring chunk 0xr   z4non-bytestring found in indefinite length bytestringz invalid length for bytestring 0xr]   )r~   rL   joinsysmaxsizer   rb   	bytearrayminextendrg   re   rT   )
r>   rp   rW   rx   rn   resultrI   leftbuffer
chunk_sizer?   r?   r@   decode_bytestring2  sF   





zCBORDecoder.decode_bytestringstrc              
   C  s  | j |dd}|d u rgg }	 | dd }|dkrd|}nG|d? dkra|  |d	@ }|d u s5|tjkr=td
|dz| |d| j}W n tyZ } ztd|d }~ww |	| ntdqnn|tjkrttd|d|dkrz| |d| j}W nJ ty } ztd|d }~ww t
| j}|}	d}|	rt|	d}
|	|
k}z||| |
|7 }W n ty } ztd|d }~ww |	|
8 }	|	s| || | |S )NTr   r   r   r    r^   rZ   rj   z-invalid length for indefinite string chunk 0xr   r)   zerror decoding unicode stringz,non-string found in indefinite length stringzinvalid length for string 0xr]   )r~   rL   r   r   r   r   rw   r2   UnicodeDecodeErrorrb   incremental_utf8_decoderr   re   rT   )r>   rp   rW   rx   rn   r   rI   exccodecr   r   finalr?   r?   r@   decode_string]  sb   









zCBORDecoder.decode_stringSequence[Any]c                 C  s   | j |dd}|d u r(g }| js| | 	 | jdd}|tu r!n|| qn'|tjkr5td|dg }| js?| | t	|D ]}|| jdd qC| jr]t
|}| | |S |S )NTr   ri   zinvalid length for array 0xr   )r~   r1   rT   rr   r   rb   r   r   r   rangetuple)r>   rp   rW   itemsrI   indexitems_tupler?   r?   r@   decode_array  s0   




zCBORDecoder.decode_arrayMapping[Any, Any]c                 C  s   | j |dd}|d u r)i }| | 	 | jddd}|tu rn	| jdd||< qni }| | t|D ]}| jddd}| jdd||< q4| jrV| | |}| | |S | jrdt|}| | |S |S )NTr   rF   ri   r   )r~   rT   rr   r   r   r,   r1   r   )r>   rp   rW   
dictionarykey_frozen_dictr?   r?   r@   
decode_map  s2   



zCBORDecoder.decode_mapc                 C  s^   |  |}t| }r|| S t|d }| | | jdd|_| jr*| | |}| |S )NTr   )r~   semantic_decodersgetr   rT   rr   rI   r+   )r>   rp   tagnumsemantic_decodertagr?   r?   r@   decode_semantic  s   



zCBORDecoder.decode_semanticc              
   C  sJ   |dk rt |S zt| | W S  ty$ } z	td|d|d }~ww )N   z*Undefined Reserved major type 7 subtype 0xr   )r   special_decodersKeyErrorr   )r>   rp   er?   r?   r@   decode_special  s   
zCBORDecoder.decode_specialr	   c                 C  s   |   }| t|d S )Ni;
 )rr   rT   r	   fromordinalrO   r?   r?   r@   decode_epoch_date  s   zCBORDecoder.decode_epoch_datec                 C  s   |   }| t|S rG   )rr   rT   r	   fromisoformatrO   r?   r?   r@   decode_date_string  s   zCBORDecoder.decode_date_stringr
   c                 C  s   |   }t|}|rc| \
}}}}}}}	}
}}|	d u r d}nt|	d}|rF|
dkr/d}nd}t|| }t|| }tt||d}ntj}| t	t|t|t|t|t|t|||S t
d|)Nr   z<06-r   )hoursminuteszinvalid datetime string: )rr   timestamp_rematchgroupsrX   r   r   utcrT   r
   r   )r>   rI   r   yearmonthdayhourminutesecondsecfracoffset_signoffset_hoffset_mmicrosecondsignr   r   tzr?   r?   r@   decode_datetime_string  sN   
z"CBORDecoder.decode_datetime_stringc              
   C  sN   |   }z	t|tj}W n tttfy! } ztd|d }~ww | 	|S )Nz"error decoding datetime from epoch)
rr   r
   fromtimestampr   r   OverflowErrorOSErrorrM   r   rT   )r>   rI   tmpr   r?   r?   r@   decode_epoch_datetime7  s   

z!CBORDecoder.decode_epoch_datetimec                 C  sB   ddl m} |  }t|tstdt| | t||dS )Nr   )hexlifyzinvalid bignum value    )	binasciir   rr   
isinstancerg   r   r   rT   rX   )r>   r   rI   r?   r?   r@   decode_positive_bignumB  s
   
z"CBORDecoder.decode_positive_bignumc                 C  s   |  |   d S r   )rT   r   rE   r?   r?   r@   decode_negative_bignumL  s   z"CBORDecoder.decode_negative_bignumr   c              
   C  sh   ddl m} z|  \}}W n ttfy! } ztd|d }~ww || }| ||j|j	|fS )Nr   r   zIncorrect tag 4 payload)
decimalr   rr   	TypeErrorrM   r   as_tuplerT   r   digits)r>   r   expsigr   r   r?   r?   r@   decode_fractionP  s   
zCBORDecoder.decode_fractionc              
   C  s^   ddl m} z|  \}}W n ttfy! } ztd|d }~ww | ||d||  S )Nr   r   zIncorrect tag 5 payloadr   )r   r   rr   r   rM   r   rT   )r>   r   r   r   r   r?   r?   r@   decode_bigfloat[  s   
zCBORDecoder.decode_bigfloatc                 C  sJ   | j d u r	td|  }z| j | }W |S  ty$   td| dw )Nz%string reference outside of namespacezstring reference 
 not found)r3   r   rr   
IndexError)r>   r   rI   r?   r?   r@   decode_stringreff  s   
zCBORDecoder.decode_stringrefc                 C  s8   | j }t| j| _ | jd  z|  W || _ S || _ w rG   )r-   ra   r.   rb   rr   )r>   rm   r?   r?   r@   decode_shareables  s   zCBORDecoder.decode_shareablec                 C  sV   | j dd}z| j| }W n ty   td| dw |d u r)td| d|S )NTr   zshared reference r   zshared value z has not been initialized)rr   r.   r   r   )r>   rI   sharedr?   r?   r@   decode_sharedref}  s   zCBORDecoder.decode_sharedrefcomplexc              
   C  s\   | j ddd}zt| }W n ty( } zt|tstdd td|d }~ww | |S )NTr   z3error decoding complex: input value was not a tuplezerror decoding complex)rr   r   r   r   r   r   rT   )r>   inputvalrI   r   r?   r?   r@   decode_complex  s   


zCBORDecoder.decode_complexr    c              
   C  sl   ddl m} | jddd}z|| }W n ttfy0 } zt|ts'tdd td|d }~ww | |S )Nr   r   Tr   z4error decoding rational: input value was not a tuplezerror decoding rational)		fractionsr    rr   r   ZeroDivisionErrorr   r   r   rT   )r>   r    r   rI   r   r?   r?   r@   decode_rational  s   


zCBORDecoder.decode_rationalre.Pattern[str]c              
   C  sB   z	t |  }W n t jy } ztd|d }~ww | |S )Nz!error decoding regular expression)recompilerr   rR   r   rT   )r>   rI   r   r?   r?   r@   decode_regexp  s   

zCBORDecoder.decode_regexpr   c              
   C  sN   ddl m} z
| |  }W n ty! } ztd|d }~ww | |S )Nr   )Parserzerror decoding MIME message)email.parserr   parsestrrr   r   r   rT   )r>   r   rI   r   r?   r?   r@   decode_mime  s   

zCBORDecoder.decode_mimer'   c              
   C  sP   ddl m} z	||  d}W n ttfy" } ztd|d }~ww | |S )Nr   r&   )rg   zerror decoding UUID value)uuidr'   rr   r   rM   r   rT   )r>   r'   rI   r   r?   r?   r@   decode_uuid  s   

zCBORDecoder.decode_uuidc                 C  s   | j }g | _ |  }|| _ |S rG   )r3   rr   )r>   old_namespacerI   r?   r?   r@   decode_stringref_namespace  s
   z&CBORDecoder.decode_stringref_namespaceset[Any] | frozenset[Any]c                 C  s2   | j r| t| jddS | t| jddS )NT)rF   )r1   rT   	frozensetrr   setrE   r?   r?   r@   
decode_set  s   zCBORDecoder.decode_set#IPv4Address | IPv6Address | CBORTagc                 C  s|   ddl m} |  }t|trt|dvrtd|t|dv r)| ||S t|dkr7| td|S td|)Nr   )
ip_address)r\      r   zinvalid ipaddress value )r\   r   r    )		ipaddressr
  rw   r   rg   ra   r   rT   r   )r>   r
  rx   r?   r?   r@   decode_ipaddress  s   zCBORDecoder.decode_ipaddressIPv4Network | IPv6Networkc              
   C  sv   ddl m} |  }t|tr4t|dkr4| D ]}z| ||ddW   S  tt	fy3   Y  nw t
d|)Nr   )
ip_networkr   F)r6   zinvalid ipnetwork value )r  r  rw   r   r   ra   r   rT   r   rM   r   )r>   r  net_mapnetr?   r?   r@   decode_ipnetwork  s   zCBORDecoder.decode_ipnetworkc                 C  s   |   S rG   )rr   rE   r?   r?   r@   decode_self_describe_cbor  s   z%CBORDecoder.decode_self_describe_cborr   c                 C  s   t | dd S )Nr   r   )r   rL   rE   r?   r?   r@   decode_simple_value  s   zCBORDecoder.decode_simple_valuefloatc              
   C  "   |  tttd| dd S )Nz>er   r   rT   r   r  r   r   rL   rE   r?   r?   r@   decode_float16     "zCBORDecoder.decode_float16c              
   C  r  )Nz>fr\   r   r  rE   r?   r?   r@   decode_float32  r  zCBORDecoder.decode_float32c              
   C  r  )Nz>dr   r   r  rE   r?   r?   r@   decode_float64  r  zCBORDecoder.decode_float64NNr6   )r7   r5   r8   r9   r:   r;   r<   r=   )rB   rC   )rB   r5   )rI   r5   rB   rJ   )rB   r9   )rI   r9   rB   rJ   )rB   r;   )rI   r;   rB   rJ   )rB   r=   )rI   r=   rB   rJ   )rI   r(   rB   r(   )rU   rV   rW   rX   rB   rJ   )rf   rX   rB   rg   )FF)rF   rC   ri   rC   rB   r   )rB   rs   )rB   rv   )rx   rg   rB   rv   )rp   rX   rB   rX   )rp   rX   r   r   rB   r   )F)rp   rX   r   rC   rB   r   )rp   rX   rB   rg   )rp   rX   rB   r   )rp   rX   rB   r   )rp   rX   rB   r   )rp   rX   rB   r   )rB   r	   )rB   r
   )rB   rX   )rB   r   )rB   rV   )rB   r   )rB   r   )rB   r    )rB   r   )rB   r   )rB   r'   )rB   r  )rB   r	  )rB   r  )rB   r   )rB   r  )9__name__
__module____qualname____doc__	__slots____annotations__rA   propertyrF   r7   setterr8   r:   r<   rT   re   rL   rr   r   ru   rw   r{   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r?   r?   r?   r@   r*   '   s   
 &

	



	



+
C
 





0












	








r*   )r   r   r   rZ   r\   r^   r  r_   z,dict[int, Callable[[CBORDecoder, int], Any]]rk   c                 C     dS )NFr?   rE   r?   r?   r@   <lambda>      r'  c                 C  r&  )NTr?   rE   r?   r?   r@   r'    r(  c                 C  r|   rG   r?   rE   r?   r?   r@   r'    r(  c                 C     t S rG   )r   rE   r?   r?   r@   r'    r(  c                 C  r)  rG   )r   rE   r?   r?   r@   r'    r(  )	r            rY   r   r   r   rj   z'dict[int, Callable[[CBORDecoder], Any]]r   r   rZ   r\   r^   r            #   $   %   d   r[   i  r  )i  i  i  i  r   r6   sbytes | bytearray | memoryviewr8   r9   r:   r;   r<   r=   rB   r   c                 C  s@   t | }t||||d W  d   S 1 sw   Y  dS )a  
    Deserialize an object from a bytestring.

    :param bytes s:
        the bytestring to deserialize
    :param tag_hook:
        callable that takes 2 arguments: the decoder instance, and the :class:`.CBORTag`
        to be decoded. This callback is invoked for any tags for which there is no
        built-in decoder. The return value is substituted for the :class:`.CBORTag`
        object in the deserialized output
    :param object_hook:
        callable that takes 2 arguments: the decoder instance, and a dictionary. This
        callback is invoked for each deserialized :class:`dict` object. The return value
        is substituted for the dict in the deserialized output.
    :param str_errors:
        determines how to handle unicode decoding errors (see the `Error Handlers`_
        section in the standard library documentation for details)
    :return:
        the deserialized object

    .. _Error Handlers: https://docs.python.org/3/library/codecs.html#error-handlers

    r8   r:   r<   N)r   r*   rw   )r4  r8   r:   r<   r7   r?   r?   r@   loads;  s   
$r7  r7   r5   c                 C  s   t | |||d S )a  
    Deserialize an object from an open file.

    :param fp:
        the file to read from (any file-like object opened for reading in binary mode)
    :param tag_hook:
        callable that takes 2 arguments: the decoder instance, and the :class:`.CBORTag`
        to be decoded. This callback is invoked for any tags for which there is no
        built-in decoder. The return value is substituted for the :class:`.CBORTag`
        object in the deserialized output
    :param object_hook:
        callable that takes 2 arguments: the decoder instance, and a dictionary. This
        callback is invoked for each deserialized :class:`dict` object. The return value
        is substituted for the dict in the deserialized output.
    :param str_errors:
        determines how to handle unicode decoding errors (see the `Error Handlers`_
        section in the standard library documentation for details)
    :return:
        the deserialized object

    .. _Error Handlers: https://docs.python.org/3/library/codecs.html#error-handlers

    r6  )r*   rw   )r7   r8   r:   r<   r?   r?   r@   load^  s
   r8  r  )
r4  r5  r8   r9   r:   r;   r<   r=   rB   r   )
r7   r5   r8   r9   r:   r;   r<   r=   rB   r   )]
__future__r   r   r   r   codecsr   collections.abcr   r   r   r   
contextlibr   r
   r	   r   r   ior   typingr   r   r   r   r   r   _typesr   r   r   r   r   r   r   r   r   email.messager   r   r    r  r!   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   r   r   r   r   r  r   r  r  r  r  r   r   r  r   r7  r8  r?   r?   r?   r@   <module>   s     $
     j	
%