
    +h                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddl
mZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ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,m-Z- dd	l.m/Z/ dd
l0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZB ddlCmDZD ddlEmFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZNmOZO ddlPmQZQ ddlRmSZS erddlTmUZU ddlVmWZWmXZX 	 ddlYmZZZ dZ[n# e\$ r dZ[Y nw xY wg dZ]dZ^dZ_dZ`d Zad!Zbd"Zcd#Zdd$Zed%Zfd&Zgd'Zhd(Zid)Zjd*Zkd+Zld,Zmd-Znd.Zod/Zpd0Zqd1Zr ejs        d2          jt        Zu ejs        d3          jv        Zw ejs        d3          jt        Zx ejs        d4          jt        Zy ejs        d5          jt        Zz ejs        d6          jt        Z{dd;Z|ddAZ}ddHZ~ddMZddOZddRZddSZddUZddVZddXZddZZdd\Zdd^Zdd`ZddbZdddZddfZddhZddjZddlZi  ee^          e ee_          e ee`          e eea          e eeb          e eec          dm  eed          e eee          e eef          e eeg          dn  eeh          e eei          e eej          e eek          e eel          e eem          e~ een          e eeo          e eep          e eeq          do  eer          dp iZdqedr<   e[r	 dddvZn	 dddwZ e!dxeeef         y          Z	 ddd|Z	 	 ddd}ZddZe[reZj        Z ejs        d2          j        Z ejs        d3          j        Z ejs        d4          j        Z ejs        d5          j        Z ejs        d6          j        Z ed  ed          D                       Zd dZddZddZddZddZddZddZddZddZddZd	dZd
dZddZddZddZddZddZddZddZddZddZddZddZddZddZi eeeeej        ee8eeeeeeeeeeeee ed          ee	j        ee,eeDee/ee<eeFeeHeeJeeLeeNeeOeeQee>eej        eiZi ZeD ]Z eed          ree         eej        <    ed eD                       Z	 	 dddZɐddZ	 dddZe[reZj        Z ed          Zde1fddZe$ddd            Ze$dd            Z	 dddĄZϐddƄZe[reZj        Ze$dd dȄ            Ze$d!dɄ            Z	 dd"d˄Zѐd#d΄ZҐd$dЄZe[reZj        ZӐd%dфZԐd&d҄Ze$dd'dԄ            Ze$d(dք            Z	 dd)d؄Ze$	 dd*dۄ            Ze$d+d܄            Z	 dd,d݄Zאd-d߄Z G d de          Zِd.dZڐd/dZ eed          r ej        e۬           dS dS (0  a  BSON (Binary JSON) encoding and decoding.

The mapping from Python types to BSON types is as follows:

=======================================  =============  ===================
Python Type                              BSON Type      Supported Direction
=======================================  =============  ===================
None                                     null           both
bool                                     boolean        both
int [#int]_                              int32 / int64  py -> bson
`bson.int64.Int64`                       int64          both
float                                    number (real)  both
str                                      string         both
list                                     array          both
dict / `SON`                             object         both
datetime.datetime [#dt]_ [#dt2]_         date           both
`bson.regex.Regex`                       regex          both
compiled re [#re]_                       regex          py -> bson
`bson.binary.Binary`                     binary         both
`bson.objectid.ObjectId`                 oid            both
`bson.dbref.DBRef`                       dbref          both
None                                     undefined      bson -> py
`bson.code.Code`                         code           both
str                                      symbol         bson -> py
bytes [#bytes]_                          binary         both
=======================================  =============  ===================

.. [#int] A Python int will be saved as a BSON int32 or BSON int64 depending
   on its size. A BSON int32 will always decode to a Python int. A BSON
   int64 will always decode to a :class:`~bson.int64.Int64`.
.. [#dt] datetime.datetime instances will be rounded to the nearest
   millisecond when saved
.. [#dt2] all datetime.datetime instances are treated as *naive*. clients
   should always use UTC.
.. [#re] :class:`~bson.regex.Regex` instances and regular expression
   objects from ``re.compile()`` are both saved as BSON regular expressions.
   BSON regular expressions are decoded as :class:`~bson.regex.Regex`
   instances.
.. [#bytes] The bytes type is encoded as BSON binary with
   subtype 0. It will be decoded back to bytes.
    )annotationsN)utf_8_decode)utf_8_encode)abc)IOTYPE_CHECKINGAnyBinaryIOCallable	GeneratorIteratorMappingMutableMappingNoReturnOptionalSequenceTupleTypeTypeVarUnioncastoverload)ALL_UUID_SUBTYPESCSHARP_LEGACYJAVA_LEGACYOLD_UUID_SUBTYPESTANDARDUUID_SUBTYPEBinaryUuidRepresentation)Code)DEFAULT_CODEC_OPTIONSCodecOptionsDatetimeConversion_raw_document_class)EPOCH_AWAREEPOCH_NAIVE
DatetimeMS_datetime_to_millis_millis_to_datetime)DBRef)
Decimal128)InvalidBSONInvalidDocumentInvalidStringData)Int64MaxKeyMinKeyObjectId)Regex)RE_TYPESON)	Timestamp)utcRawBSONDocument)_DocumentType_ReadableBuffer)_cbsonTF)<r   r   r   r   r   r   r   r    r!   r"   r#   r+   r,   r-   r.   r/   r0   r2   r4   r6   r7   r8   r9   r:   r;   r&   r'   BSONNUMBSONSTRBSONOBJBSONARRBSONBINBSONUNDBSONOIDBSONBOOBSONDATBSONNULBSONRGXBSONREFBSONCODBSONSYMBSONCWSBSONINTBSONTIMBSONLONBSONDECBSONMINBSONMAXget_data_and_viewgen_list_nameencodedecode
decode_alldecode_iterdecode_file_iteris_validBSONhas_cr$   r(                              	   
                                 z<dz<iz<iBz<qz<IIdatar	   returnTuple[Any, memoryview]c                    t          | t          t          f          r| t          |           fS t          |           }|                                |fS N)
isinstancebytes	bytearray
memoryviewtobytes)ru   views     Q/var/www/html/e360mart/e360mart_env/lib/python3.11/site-packages/bson/__init__.pyrV   rV      sL    $	*++ &Z%%%%dD<<>>4    element_typeintelement_namestrr   c                    t          d                    t          |                                           |                    )zUnknown type helper.z\Detected unknown BSON type {!r} for fieldname '{}'. Are you using the latest driver version?)r-   formatchrrX   )r   r   s     r   _raise_unknown_typer      s=    
	//5vc,6G6G6N6N6P6PR^/_/_  r   _viewpositiondummy0dummy1dummy2Tuple[int, int]c                8    t          | |          d         |dz   fS )z"Decode a BSON int32 to python int.r      )_UNPACK_INT_FROMru   r   r   r   r   r   s         r   _get_intr      s"     D(++A.1<<r   r   optsCodecOptions[Any]Tuple[str, int]c                    |                      d|          }t          |||         |j        d          d         |dz   fS )z'Decode a BSON 'C' string to python str.    Tr      )index_utf_8_decodeunicode_decode_error_handler)ru   r   r   r   ends        r   _get_c_stringr      sF    
**Wh
'
'Chsl+T-NPTUUVWXZ]`aZaaar   Tuple[float, int]c                8    t          | |          d         |dz   fS )z%Decode a BSON double to python float.r      )_UNPACK_FLOAT_FROMr   s         r   
_get_floatr     s"     dH--a0(Q,>>r   obj_enddummyc                   t          | |          d         }|dz  }|dk     s	||z
  |k     rt          d          ||z   dz
  }| |         dk    rt          d          t          |||         |j        d          d         |dz   fS )z#Decode a BSON string to python str.r   r   r   zinvalid string lengthzinvalid end of stringT)r   r-   r   r   )ru   r   r   r   r   r   lengthr   s           r   _get_stringr   
  s     dH--a0FMHzzWx'&001222
V
a
CCyA~~1222hsl+T-NPTUUVWXZ]`aZaaar   c                H   	 t          | |          d         }n4# t          j        $ r"}t          t	          |                    dd}~ww xY w||z   dz
  }| |         dk    rt          d          ||k    rt          d          |dk    r||k    rt          d          ||fS )z+Validate and return a BSON document's size.r   Nr   bad eoozinvalid object length)r   structerrorr-   r   )ru   r   r   obj_sizeexcr   s         r   _get_object_sizer     s    .#D(33A6< . . .#c((##-.
X

!CCyA~~)$$$
g~~12221}}W,,1222S=s    A
AA
Tuple[Any, int]c                @   t          | ||          \  }}t          |j                  r&|                    | ||dz            |          ||z   fS t          | ||dz   ||          }||z  }t	          |                    d          t                    rd|v rt	          |                    d          t          t          d          f          rOt          |	                    d          |	                    dd          |	                    dd          |          |fS ||fS )zEDecode a BSON subdocument to opts.document_class or bson.dbref.DBRef.r   r   z$refz$idz$dbN)
r   r%   document_class_elements_to_dictrz   getr   typer+   pop)	ru   r   r   r   r   r   r   r   objs	            r   _get_objectr   )  s    %T8W==MHc4.// Z##DC!G);$<dCCXPXEXYY
D$1c4
@
@CH 	3776??C((cSLLswwu~~T$ZZ'899  cggfooswwud';';SWWUD=Q=QSVWWYabb=r   c                @   t          | |          d         }||z   dz
  }| |         dk    rt          d          |dz  }|dz  }g }|j        }	| j        }
t          }|j        j        }||k     r| |         } |
d|          dz   }	  ||         | |||||          \  }}n # t          $ r t          ||           Y nw xY w|r/|	                    t          |                    }| ||          } |	|           ||k     ||dz   k    rt          d          ||dz   fS )z#Decode a BSON array to python list.r   r   r   r   r   Nzbad array length)r   r-   appendr   _ELEMENT_GETTERtype_registry_decoder_mapKeyErrorr   r   r   )ru   r   r   r   r   r   sizer   resultr   r   getterdecoder_mapr   valuecustom_decoders                   r   
_get_arrayr   >  s~    D(++A.D
T/A
CCyA~~)$$$MH1HCF ]FJEF$1K
S..H~5(++a/	<2f\2dHgt\ OE88  	< 	< 	<l;;;;;	<  	.(__T%[[99N)&u--u! S..$ 37,---8a<s   B B<;B<$Tuple[Union[Binary, uuid.UUID], int]c                @   t          | |          \  }}|dz  }|dk    r5t          | |          d         }|dz  }||dz
  k    rt          d          |}||z   }	|dk     s|	|k    rt          d          |t          v rv|j        }
t          | ||	         |          }|
t          j        k    s,|t          k    r|
t          k    s|t          k    r|
t          k    r||	fS |                    |
          |	fS |dk    r| ||	         }nt          | ||	         |          }||	fS )z:Decode a BSON binary to bson.binary.Binary or python UUID.      r   r   z,invalid binary (st 2) - lengths don't match!zbad binary object length)_UNPACK_LENGTH_SUBTYPE_FROMr   r-   r   uuid_representationr   r    UNSPECIFIEDr   r   r   as_uuid)ru   r   r   r   r   r   r   subtypelength2r   uuid_repbinary_valuer   s                r   _get_binaryr   h  s\    2$AAOFGMH!||"42215Afqj  LMMM
V
CzzS7]]4555 ###+d8C<0'::+777<''H,@,@+++H0D0D$$##H--s22 !||Xc\"tHSL)733#:r   Tuple[ObjectId, int]c                >    |dz   }t          | ||                   |fS )z1Decode a BSON ObjectId to bson.objectid.ObjectId.   r5   ru   r   r   r   r   r   r   s          r   _get_oidr     s)     R-CD#&'',,r   Tuple[bool, int]c                l    |dz   }| ||         }|dk    rd|fS |dk    rd|fS t          d|z            )z.Decode a BSON true/false to python True/False.r   r   Fr`   Tzinvalid boolean value: %r)r-   )ru   r   r   r   r   r   r   boolean_bytes           r   _get_booleanr     sY     Q,C%Lwcz		 	 Sy
1L@
A
AAr   0Tuple[Union[datetime.datetime, DatetimeMS], int]c                T    t          t          | |          d         |          |dz   fS )z3Decode a BSON datetime to python datetime.datetime.r   r   )r*   _UNPACK_LONG_FROM)ru   r   r   r   r   r   s         r   	_get_dater     s.     0x@@CTJJHWXLXXr   Tuple[Code, int]c                R    t          | |||||          \  }}t          |          |fS )z%Decode a BSON code to bson.code.Code.)r   r!   )ru   r   r   r   r   r   codes          r   	_get_coder     s0     !tXwlSSND(::xr   _obj_endc                    |t          | |          d         z   }t          | ||dz   |||          \  }}t          | |||||          \  }}||k    rt          d          t	          ||          |fS )z-Decode a BSON code_w_scope to bson.code.Code.r   r   z+scope outside of javascript code boundaries)r   r   r   r-   r!   )	ru   r   r   r   r   r   code_endr   scopes	            r   _get_code_w_scoper     s     *4::1==H tX\8T<XXND(!$h$UUOE88GHHHeh&&r   Tuple[Regex[Any], int]c                ~    t          | |||          \  }}t          | |||          \  }}t          ||          }||fS )zCDecode a BSON regex to bson.regex.Regex or a python pattern object.)r   r7   )	ru   r   r   r   r   r   pattern
bson_flagsbson_res	            r   
_get_regexr     sN     &dD(DAAGX(tXtDDJGZ((GHr   Tuple[DBRef, int]c                    t          | |||||          \  }}t          | |||||          \  }}t          ||          |fS )z7Decode (deprecated) BSON DBPointer to bson.dbref.DBRef.)r   r   r+   )ru   r   r   r   r   r   
collectionoids           r   _get_refr     sP     'tT8WdLYYJT47D,OOMCS!!8++r   Tuple[Timestamp, int]c                R    t          | |          \  }}t          ||          |dz   fS )z4Decode a BSON timestamp to bson.timestamp.Timestamp.r   )_UNPACK_TIMESTAMP_FROMr:   )ru   r   r   r   r   r   inc	timestamps           r   _get_timestampr     s0     ,D(;;NCY$$hl22r   Tuple[Int64, int]c                R    t          t          | |          d                   |dz   fS )z(Decode a BSON int64 to bson.int64.Int64.r   r   )r0   r   r   s         r   
_get_int64r     s+     "42215661DDr   Tuple[Decimal128, int]c                H    |dz   }t          j        | ||                   |fS )z7Decode a BSON decimal128 to bson.decimal128.Decimal128.   )r,   from_bidr   s          r   _get_decimal128r    s,     R-CtHSL122C77r   c                
    d |fS ry    uvwxyzs         r   <lambda>r    
    D!9 r   c                
    d |fS ry   r  r  s         r   r  r    r  r   c                "    t                      |fS ry   r3   r  s         r   r  r        FHHa= r   c                "    t                      |fS ry   r1   r  s         r   r  r    r  r   z)dict[int, Callable[..., Tuple[Any, int]]]r   	raw_arrayboolTuple[str, Any, int]c           
     N    t          dt          j        | ||||                    S )Nr  )r   r@   _element_to_dict)ru   r   r   r   r   r  s         r   r  r    s/     "#D(GT9MM
 
 	
r   c                   | |         }|dz  }t          | |||          \  }}|rL|t          t                    k    r4t          | |t	          |                     \  }}	||||	dz            |	dz   fS 	 t          |         | |||||          \  }
}n # t          $ r t          ||           Y nw xY w|j        j	        r9|j        j	        
                    t          |
                    }| ||
          }
||
|fS )z Decode a single key, value pair.r   )r   ordrD   r   lenr   r   r   r   r   r   r   )ru   r   r   r   r   r  r   r   _r   r   r   s               r   r  r    s1    H~A!.tT8T!J!Jh 	CW55%dHc$ii@@FAshq&8!937BB	<-l;dHgt\ OE88  	< 	< 	<l;;;;;	< * 	.!/<@@eMMN)&u--UH,,s   2B B-,B-_T)boundCodecOptions[RawBSONDocument]r   c                x    t          |           \  } }t          t          t          | ||||||                    S )Nr  )rV   r   r  r   )ru   r   r   r   r   r  r   s          r   _raw_to_dictr   8  sE     #4((JD$
dD(GT6U^___  r   c                    ||                                 }|dz
  }||k     r$t          | |||||          \  }}	}|	||<   ||k     $||k    rt          d          |S )z#Decode a BSON document into result.Nr   r  bad object or element length)r   r  r-   )
ru   r   r   r   r   r   r  r   keyr   s
             r   r   r   F  s     ~$$&&
A+C
S../$'49 
  
  
UH s	 S..
 78999Mr   CodecOptions[_DocumentType]r>   c           
        t          |           \  } }	 t          |j                  r|                    | |          S t          | dt	          |                     \  }}t          dt          | |d||                    S # t          $ r  t          $ rH t          j
                    \  }}}t          t          |                                        |          dw xY w)z'Decode a BSON string to document_class.r   r>   r   N)rV   r%   r   r   r  r   r   r-   	Exceptionsysexc_infor   with_traceback)ru   r   r   r  r   	exc_valueexc_tbs          r   _bson_to_dictr,  ]  s    "4((JD$
Kt233 	3&&tT222!$3t99553O%6tT1c4%P%PQQQ    K K K"|~~9f#i..))88@@dJKs   )B  AB   ACc              #  `   K   | ])}t          |          d z                       d          V  *dS ) utf8N)r   rX   ).0is     r   	<genexpr>r2  v  s:      JJSVVf_,,V44JJJJJJr     Generator[bytes, None, None]c               #     K   t           E d{V  t          j        d          } 	 t          t	          |                     dz                       d          V  5)zGenerate "keys" for encoded lists in the sequence
    b"0 ", b"1 ", b"2 ", ...

    The first 1000 keys are returned from a pre-built cache. All
    subsequent keys are generated on the fly.
    Nr3  Tr.  r/  )_LIST_NAMES	itertoolscountr   nextrX   )counters    r   rW   rW   y  sf       od##G;4==!!F*226:::::;r   stringUnion[str, bytes]r{   c                   t          | t                    rKd| v rt          d          	 t          | dd           | dz   S # t          $ r t          d| z            dw xY wd| v rt          d          t          |           d         dz   S )z8Make a 'C' string, checking for embedded NUL characters.r   z;BSON keys / regex patterns must not contain a NUL characterNT,strings in documents must be valid UTF-8: %rr.  r   )rz   r{   r.   r   UnicodeErrorr/   _utf_8_encoder;  s    r   _make_c_string_checkrB    s    &%   2f!"_```	&$---G## 	 	 	#>G 	
 V!"_```V$$Q''11s   A   Ac                    t          | t                    r8	 t          | dd           | dz   S # t          $ r t	          d| z            dw xY wt          |           d         dz   S )zMake a 'C' string.NTr   r>  r   )rz   r{   r   r?  r/   r@  rA  s    r   _make_c_stringrD    s    &%   	2	&$---G## 	 	 	#>G 	
 V$$Q''11s	   - Ac                X    d| v rt          d          t          |           d         dz   S )z*Make a 'C' string suitable for a BSON key.r.  z*BSON keys must not contain a NUL characterr   r   )r.   r@  rA  s    r   
_make_namerF    s4    JKKK  #g--r   namer   floatc                ,    d| z   t          |          z   S )zEncode a float.r`   )_PACK_FLOATrG  r   r   r   s       r   _encode_floatrL    s    T>K....r   c                R    d| z   t          t          |                    z   dz   |z   S )zEncode a python bytes.rd   r   )	_PACK_INTr  rK  s       r   _encode_bytesrO    s+     T>Ic%jj111G;eCCr   
check_keysc                "   t          |          r d| z   t          t          |j                  z   S d                    fd|                                D                       }d| z   t          t          |          dz             z   |z   dz   S )zEncode a mapping type.rb   r   c                :    g | ]\  }}t          ||          S r  )_element_to_bson)r0  r#  valrP  r   s      r   
<listcomp>z#_encode_mapping.<locals>.<listcomp>  s,    ```hc3%c3
DAA```r   r   r   )r%   r   r{   rawjoinitemsrN  r  )rG  r   rP  r   ru   s     `` r   _encode_mappingrY    s    5!! 7~UEI 6 66688`````RWR]R]R_R_```aaDT>Ic$ii!m444t;gEEr   r+   c                   t          d| z   dz             }t          |          dz
  }|t          d|j        ||          z  }|t          d|j        ||          z  }|j        |t          d|j        ||          z  }|j                                        D ]\  }}|t          ||||          z  }|dz  }t          t          |          |z
            |||dz   <   t          |          S )	zEncode bson.dbref.DBRef.rb   s       r   s   $ref s   $id Ns   $db r   )r|   r  _name_value_to_bsonr   iddatabase_DBRef__kwargsrX  rS  rN  r{   )rG  r   rP  r   bufbeginr#  rT  s           r   _encode_dbrefra    s    
GdN%88
9
9CHHqLE{E,<j$OOOCz58ZFFFC~!":u~z4PPP(..00 < <SS*d;;;7NC&s3xx%'788C	::r   Sequence[Any]c                    t                      d                    fd|D                       }d| z   t          t          |          dz             z   |z   dz   S )zEncode a list/tuple.r   c                N    g | ]!}t          t                    |          "S r  )r[  r9  )r0  itemrP  lnamer   s     r   rU  z _encode_list.<locals>.<listcomp>  s/    ```RV(edJMM```r   rc   r   r   )rW   rW  rN  r  )rG  r   rP  r   ru   rf  s     `` @r   _encode_listrg    sh     OOE88``````Z_```aaDT>Ic$ii!m444t;gEEr   c                    t          |          d         }d| z   t          t          |          dz             z   |z   dz   S )zEncode a python str.r   ra   r   r   )r@  rN  r  )rG  r   r   r   bvalues        r   _encode_textrj    s?    5!!!$FT>Ic&kkAo666?'IIr   r   c                    |j         }|dk    rt          t          |                    |z   }d| z   t          t          |          |          z   |z   S )zEncode bson.binary.Binary.r   rd   )r   rN  r  _PACK_LENGTH_SUBTYPE)rG  r   r   r   r   s        r   _encode_binaryrm    sO    mG!||#e**%%-T>0UWEEEMMr   	uuid.UUIDc                `    |j         }t          j        ||          }t          | |||          S )zEncode uuid.UUID.)r   )r   r   	from_uuidrm  )rG  r   r   r   r   binvals         r   _encode_uuidrr    s5    2e9LMMMF$t444r   r6   c                    d| z   |j         z   S )zEncode bson.objectid.ObjectId.rf   )binary)rG  r   r   r   s       r   _encode_objectidru    s    T>EL((r   c                    d| z   |rdpdz   S )z%Encode a python boolean (True/False).rg   r`   r   r  rK  s       r   _encode_boolrw    s    T>U.w9'::r   datetime.datetimec                J    t          |          }d| z   t          |          z   S zEncode datetime.datetime.rh   )r)   
_PACK_LONGrG  r   r   r   milliss        r   _encode_datetimer~    s&     ''FT>Jv....r   r(   c                J    t          |          }d| z   t          |          z   S rz  )r   r{  r|  s        r   _encode_datetime_msr     s$    ZZFT>Jv....r   c                    d| z   S )zEncode python None.ri   r  rG  r   r   r   s       r   _encode_noner        T>r   
Regex[Any]c                   |j         }|t          j        k    rd| z   t          |j                  z   dz   S |dk    rd| z   t          |j                  z   dz   S d}|t          j        z  r|dz  }|t          j        z  r|dz  }|t          j        z  r|dz  }|t          j        z  r|d	z  }|t          j        z  r|d
z  }|t          j	        z  r|dz  }|dz  }d| z   t          |j                  z   |z   S )z*Encode a python regex or bson.regex.Regex.rj   s   u r   r   r      i   l   m   s   u   x)
flagsreUNICODErB  r   
IGNORECASELOCALE	MULTILINEDOTALLVERBOSE)rG  r   r   r   r  sflagss         r   _encode_regexr    s   KE
~ 4U] C CChNN	!~ 4U] C CCgMM2=  	dNF29 	dNF2< 	dNF29 	dNF2: 	dNF2: 	dNF'~ 4U] C CCfLLr   r!   c                *   t          |          }t          |          }|j        d| z   t          |          z   |z   S t	          |j        d|d          }t          d|z   t          |          z             }d| z   |z   t          |          z   |z   |z   S )zEncode bson.code.Code.Nrl   Fr   rn   )rD  r  r   rN  _dict_to_bson)rG  r   r   r   cstringcstrlenr   full_lengths           r   _encode_coder  %  s    U##G'llG{~	' 2 22W<<%+udE::EAK#e**455KT>K')G*<*<<wFNNr   c                    d|cxk    rdk    rn nd| z   t          |          z   S 	 d| z   t          |          z   S # t          j        $ r t	          d          dw xY w)zEncode a python int.i   iro   rq   &BSON can only handle up to 8-byte intsN)rN  r{  r   r   OverflowErrorrK  s       r   _encode_intr  0  s    e))))z)))))~	% 0 000	TT>Ju$5$555| 	T 	T 	T HIItS	Ts	   <  Ac                B    d| z   t          |j        |j                  z   S )z Encode bson.timestamp.Timestamp.rp   )_PACK_TIMESTAMPr   timerK  s       r   _encode_timestampr  ;  s    T>OEIuzBBBBr   c                t    	 d| z   t          |          z   S # t          j        $ r t          d          dw xY w)zEncode a bson.int64.Int64.rq   r  N)r{  r   r   r  rK  s       r   _encode_longr  @  sQ    P~
5 1 111< P P PDEE4OPs     7r,   c                    d| z   |j         z   S )z"Encode bson.decimal128.Decimal128.rr   )bidrK  s       r   _encode_decimal128r  H  s    T>EI%%r   c                    d| z   S )zEncode bson.min_key.MinKey.rs   r  r  s       r   _encode_minkeyr  M  r  r   c                    d| z   S )zEncode bson.max_key.MaxKey.rt   r  r  s       r   _encode_maxkeyr  R  r  r   _type_markerc              #     K   | ]}|V  d S ry   r  )r0  ts     r   r2  r2    s"      --a------r   in_custom_callin_fallback_callc                   d}	 t          t          |                   | |||          S # t          $ r Y n't          $ r t	          |t
                    s d}Y nw xY wt          |dd          }t	          |t
                    r;|t          v r2t          |         }|t           t          |          <    || |||          S |sW|j        j	        rK|j        j	        
                    t          |                    }	|	t          |  |	|          ||d          S t          D ]H}
|sDt	          ||
          r4t           |
         }|t           t          |          <    || |||          c S I|j        j        }|s|t          |  ||          ||d          S |rt          d          t          d|d	t          |                    )
z!Encode a single name, value pair.FTr  N)r  )r  r  zcannot encode object: z, of type: )	_ENCODERSr   r   r  rz   r   getattr_MARKERSr   _encoder_mapr   r[  _BUILT_IN_TYPES_fallback_encoderr.   )rG  r   rP  r   r  r  was_integer_overflowmarkerfunccustom_encoderbasefallback_encoders               r   r[  r[    s3    !	$e%dE:tDDD    $ $ $%%% 	  $$ UND11F&# 36X#5#5!%	$u++tD%T222  d0= +8<<T%[[II%&nnU++Zd      7 7# 	7
5$(?(? 	7T?D%)Id5kk"4eZ66666 ); 
 0 <"""5)):td
 
 
 	
  FDEEE
V5VVtE{{VV
W
WWs   $) 
A!AAr#  c                   t          | t                    st          d|           |r?|                     d          rt          d| d          d| v rt          d| d          t	          |           }t          ||||          S )z Encode a single key, value pair.z.documents must have only string keys, key was $zkey z must not start with '$'.z must not contain '.')rz   r   r.   
startswithrF  r[  )r#  r   rP  r   rG  s        r   rS  rS    s    c3 XVsVVWWW G>># 	J!"H"H"H"HIII#::!"E"E"E"EFFFc??DtUJ===r   doc	top_levelc           	        t          |           rt          t          | j                  S 	 g }|r/d| v r+|                    t          d| d         ||                     |                                 D ]2\  }}|r|dk    r%|                    t          ||||                     3n!# t          $ r t          d|           dw xY wd
                    |          }t          t          |          dz             |z   dz   S )zEncode a document to BSON._ids   _id z)encoder expected a mapping type but got: Nr   r   r   )r%   r   r{   rV  r   r[  rX  rS  AttributeError	TypeErrorrW  rN  r  )r  rP  r   r  elementsr#  r   encodeds           r   r  r    s/    3 $E37###W 	[#OO/
CJ
TXYYZZZ))++ 	P 	PJC Pu 0eZ N NOOO	P  W W WKCKKLLRVVW hhx  GS\\A%&&07::s   A:B& &Cz1codec_options must be an instance of CodecOptionsdocumentMapping[str, Any]codec_optionsc                \    t          |t                    st          t          | ||          S )a  Encode a document to BSON.

    A document can be any mapping type (like :class:`dict`).

    Raises :class:`TypeError` if `document` is not a mapping type,
    or contains keys that are not instances of :class:`str`. Raises
    :class:`~bson.errors.InvalidDocument` if `document` cannot be
    converted to :class:`BSON`.

    :param document: mapping type representing a document
    :param check_keys: check if keys start with '$' or
        contain '.', raising :class:`~bson.errors.InvalidDocument` in
        either case
    :param codec_options: An instance of
        :class:`~bson.codec_options.CodecOptions`.

    .. versionadded:: 3.9
    )rz   r#   _CODEC_OPTIONS_TYPE_ERRORr  )r  rP  r  s      r   rX   rX     s.    . m\22 ('':}===r   r?   Nonedict[str, Any]c                    d S ry   r  ru   r  s     r   rY   rY         Cr   c                    d S ry   r  r  s     r   rY   rY     r  r   %Optional[CodecOptions[_DocumentType]]$Union[dict[str, Any], _DocumentType]c                    |pt           }t          |t                    st          t	          dt          | |                    S )a  Decode BSON to a document.

    By default, returns a BSON document represented as a Python
    :class:`dict`. To use a different :class:`MutableMapping` class,
    configure a :class:`~bson.codec_options.CodecOptions`::

        >>> import collections  # From Python standard library.
        >>> import bson
        >>> from bson.codec_options import CodecOptions
        >>> data = bson.encode({'a': 1})
        >>> decoded_doc = bson.decode(data)
        <type 'dict'>
        >>> options = CodecOptions(document_class=collections.OrderedDict)
        >>> decoded_doc = bson.decode(data, codec_options=options)
        >>> type(decoded_doc)
        <class 'collections.OrderedDict'>

    :param data: the BSON to decode. Any bytes-like object that implements
        the buffer protocol.
    :param codec_options: An instance of
        :class:`~bson.codec_options.CodecOptions`.

    .. versionadded:: 3.9
    r  )r"   rz   r#   r  r   r,  )ru   r  r   s      r   rY   rY     sB    6 ,D/DDdL)) (''6dD8Q8QRRRr   list[_DocumentType]c           	        t          |           \  } }t          |           }g }d}|dz
  }t          |j                  }	 ||k     rt	          | |          d         }||z
  |k     rt          d          ||z   dz
  }	| |	         dk    rt          d          |r5|                    |                    | ||	dz            |                     n)|                    t          | ||dz   |	|                     ||z  }||k     |S # t
          $ r  t          $ rH t          j
                    \  }
}}t          t          |                                        |          dw xY w)z)Decode a BSON data to multiple documents.r   r   zinvalid object sizer   r   N)rV   r  r%   r   r   r-   r   r   r&  r'  r(  r   r)  )ru   r   r   data_lendocsr   r   use_rawr   r   r  r*  r+  s                r   _decode_allr  9  s   "4((JD$4yyH "DH
Q,C!$"566GKnn'h77:H("X--!"7888)A-GG}!!!),,, XD//X!5K0LdSSTTTT-dD(Q,QUVVWWW H nn     K K K"|~~9f#i..))88@@dJKs    CD AE list[dict[str, Any]]c                    d S ry   r  r  s     r   rZ   rZ   [  r  r   c                    d S ry   r  r  s     r   rZ   rZ   `  	     Cr   0Union[list[dict[str, Any]], list[_DocumentType]]c                    |t          | t                    S t          |t                    st          t          | |          S )a+  Decode BSON data to multiple documents.

    `data` must be a bytes-like object implementing the buffer protocol that
    provides concatenated, valid, BSON-encoded documents.

    :param data: BSON data
    :param codec_options: An instance of
        :class:`~bson.codec_options.CodecOptions`.

    .. versionchanged:: 3.9
       Supports bytes-like objects that implement the buffer protocol.

    .. versionchanged:: 3.0
       Removed `compile_re` option: PyMongo now always represents BSON regular
       expressions as :class:`~bson.regex.Regex` objects. Use
       :meth:`~bson.regex.Regex.try_compile` to attempt to convert from a
       BSON regular expression to a Python regular expression object.

       Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with
       `codec_options`.
    )r  r"   rz   r#   r  r  s     r   rZ   rZ   g  sC    0 4!6777m\22 (''t]+++r   rawdocfieldsc                .   t          |j                  ri }n|                                }|                                 D ]T\  }}||v rF||         dk    rt          | j        |          |         ||<   4t          |||         |          ||<   O|||<   U|S )Nr   )r%   r   rX  r,  rV  _decode_selective)r  r  r  r  r#  r   s         r   r  r    s     =788 -   **,,llnn 	 	
U&==c{a(]CCCHC,6#; C CHHJr   r}   c                ~   d}t          | |t          |                     \  }}|dz  }g }|j        }||dz
  k     rZ| |         dk    r|dz  }| |         dk    |dz  }t          | ||          \  }} || |||z                       ||z  }||dz
  k     Z||k    rt          d          d                    |          S )Nr   r   r   r"  r   )r   r  r   r-   rW  )r   r   r  r   buffersr   r   s          r   _array_of_documents_to_bufferr    s    HdHc$ii88FAsMH "G^F
S1W

8n!!MH 8n!!A&tXs;;!tHx(223444H S1W

 3899988Gr   c                    |                      d          }|sdS dD ]7}|                     |          }|st          |          }|r|g||<   2g ||<   8dS )z=Convert raw array of documents to a stream of BSON documents.cursorN)
firstBatch	nextBatch)r   r  )r  r  r#  batchru   s        r   &_convert_raw_document_lists_to_streamsr    s    \\(##F *  

3 	,U33 	&F3KKF3KK r   c                   |j         j        st          | |          S |s$t          | |                    d                    S ddlm} |                    |d          }t          | |          }t          |||          gS )aW  Decode BSON data to a single document while using user-provided
    custom decoding logic.

    `data` must be a string representing a valid, BSON-encoded document.

    :param data: BSON data
    :param codec_options: An instance of
        :class:`~bson.codec_options.CodecOptions` with user-specified type
        decoders. If no decoders are found, this method is the same as
        ``decode_all``.
    :param fields: Map of document namespaces where data that needs
        to be custom decoded lives or None. For example, to custom decode a
        list of objects in 'field1.subfield1', the specified value should be
        ``{'field1': {'subfield1': 1}}``. If ``fields``  is an empty map or
        None, this method is the same as ``decode_all``.

    :return: Single-member list containing the decoded document.

    .. versionadded:: 3.8
    N)r   r   r<   )r   r   )r   r   rZ   with_optionsbson.raw_bsonr=   r,  r  )ru   r  r  r=   internal_codec_options_docs         r   _decode_all_selectiver    s    . &3 /$... P$ : : : N NOOO .-----<I<V<V&d =W = = 566D	
 	
 r   Iterator[dict[str, Any]]c                    d S ry   r  r  s     r   r[   r[     r  r   Iterator[_DocumentType]c                    d S ry   r  r  s     r   r[   r[     r  r   8Union[Iterator[dict[str, Any]], Iterator[_DocumentType]]c              #    K   |pt           }t          |t                    st          d}t	          |           dz
  }||k     rBt          | |          d         }| |||z            }||z  }t          ||          V  ||k     @dS dS )a  Decode BSON data to multiple documents as a generator.

    Works similarly to the decode_all function, but yields one document at a
    time.

    `data` must be a string of concatenated, valid, BSON-encoded
    documents.

    :param data: BSON data
    :param codec_options: An instance of
        :class:`~bson.codec_options.CodecOptions`.

    .. versionchanged:: 3.0
       Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with
       `codec_options`.

    .. versionadded:: 2.8
    r   r   N)r"   rz   r#   r  r  r   r,  )ru   r  r   r   r   r   r  s          r   r[   r[     s      * 11DdL)) (''H
d))a-C
S..#D(33A68h#667HHd+++++ S......r   file_objUnion[BinaryIO, IO[bytes]]c                    d S ry   r  r  r  s     r   r\   r\   !  r  r   c                    d S ry   r  r  s     r   r\   r\   (  r  r   c              #  4  K   |pt           }	 |                     d          }|sdS t          |          dk    rt          d          t	          |d          d         dz
  }||                     t          d|                    z   }t          ||          V  )a  Decode bson data from a file to multiple documents as a generator.

    Works similarly to the decode_all function, but reads from the file object
    in chunks and parses bson in chunks, yielding one document at a time.

    :param file_obj: A file object containing BSON data.
    :param codec_options: An instance of
        :class:`~bson.codec_options.CodecOptions`.

    .. versionchanged:: 3.0
       Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with
       `codec_options`.

    .. versionadded:: 2.8
    Tr   zcut off in middle of objsizer   N)r"   readr  r-   r   maxr,  )r  r  r   	size_datar   r  s         r   r\   r\   /  s      & 11D	,!q))	 	>E^^q  <===#Iq11!4q8x}}SH-=-=>>>Hd+++++	,r   bsonc                    t          | t                    st          d          	 t          | t                     dS # t
          $ r Y dS w xY w)a  Check that the given string represents valid :class:`BSON` data.

    Raises :class:`TypeError` if `bson` is not an instance of
    :class:`bytes`. Returns ``True``
    if `bson` is valid :class:`BSON`, ``False`` otherwise.

    :param bson: the data to be validated
    z4BSON data must be an instance of a subclass of bytesTF)rz   r{   r  r,  r"   r&  )r  s    r   r]   r]   O  sc     dE"" PNOOOd1222t   uus   = 
A
Ac                  <    e Zd ZdZedefdd            ZefddZdS )r^   zBSON (Binary JSON) data.

    .. warning:: Using this class to encode and decode BSON adds a performance
       cost. For better performance use the module level functions
       :func:`encode` and :func:`decode` instead.
    Fcls
Type[BSON]r  r  rP  r  r  r   rv   c                6     | t          |||                    S )a  Encode a document to a new :class:`BSON` instance.

        A document can be any mapping type (like :class:`dict`).

        Raises :class:`TypeError` if `document` is not a mapping type,
        or contains keys that are not instances of
        :class:`str'. Raises :class:`~bson.errors.InvalidDocument`
        if `document` cannot be converted to :class:`BSON`.

        :param document: mapping type representing a document
        :param check_keys: check if keys start with '$' or
            contain '.', raising :class:`~bson.errors.InvalidDocument` in
            either case
        :param codec_options: An instance of
            :class:`~bson.codec_options.CodecOptions`.

        .. versionchanged:: 3.0
           Replaced `uuid_subtype` option with `codec_options`.
        )rX   )r  r  rP  r  s       r   rX   zBSON.encodej  s     4 s6(J>>???r   r  c                "    t          | |          S )a  Decode this BSON data.

        By default, returns a BSON document represented as a Python
        :class:`dict`. To use a different :class:`MutableMapping` class,
        configure a :class:`~bson.codec_options.CodecOptions`::

            >>> import collections  # From Python standard library.
            >>> import bson
            >>> from bson.codec_options import CodecOptions
            >>> data = bson.BSON.encode({'a': 1})
            >>> decoded_doc = bson.BSON(data).decode()
            <type 'dict'>
            >>> options = CodecOptions(document_class=collections.OrderedDict)
            >>> decoded_doc = bson.BSON(data).decode(codec_options=options)
            >>> type(decoded_doc)
            <class 'collections.OrderedDict'>

        :param codec_options: An instance of
            :class:`~bson.codec_options.CodecOptions`.

        .. versionchanged:: 3.0
           Removed `compile_re` option: PyMongo now always represents BSON
           regular expressions as :class:`~bson.regex.Regex` objects. Use
           :meth:`~bson.regex.Regex.try_compile` to attempt to convert from a
           BSON regular expression to a Python regular expression object.

           Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with
           `codec_options`.
        )rY   )selfr  s     r   rY   zBSON.decode  s    @ dM***r   N)
r  r  r  r  rP  r  r  r   rv   r^   )r  r   rv   r  )__name__
__module____qualname____doc__classmethodr"   rX   rY   r  r   r   r^   r^   b  so           !+@	@ @ @ @ [@8 2G +  +  +  +  +  +  +r   r^   c                     t           S )zIs the C extension installed?)_USE_Cr  r   r   r_   r_     s    Mr   c                     t           j                                        r t           j                                         dS dS )z!Releases the ObjectID lock child.N)r6   	_inc_locklockedreleaser  r   r   _after_forkr    s>      "" %""$$$$$% %r   register_at_fork)after_in_child)ru   r	   rv   rw   )r   r   r   r   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r	   r   r	   rv   r   )
ru   r	   r   r	   r   r   r   r   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r	   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r	   rv   r   )ru   r	   r   r   r   r   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r	   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r	   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r   r   r   r   r   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r	   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r	   r   r	   rv   r   )ru   r	   r   r	   r   r   r   r	   r   r	   r   r	   rv   r   )F)ru   r	   r   r	   r   r   r   r   r   r   r  r  rv   r  )ru   r	   r   r   r   r   r   r  r   r  r  r  rv   r  )NF)ru   r	   r   r	   r   r   r   r   r   r   r   r	   r  r  rv   r	   )ru   r	   r   r$  rv   r>   )rv   r4  )r;  r<  rv   r{   )r;  r   rv   r{   )
rG  r{   r   rH  r   r	   r   r	   rv   r{   )
rG  r{   r   r{   r   r	   r   r	   rv   r{   )
rG  r{   r   r	   rP  r  r   r   rv   r{   )
rG  r{   r   r+   rP  r  r   r   rv   r{   )
rG  r{   r   rb  rP  r  r   r   rv   r{   )
rG  r{   r   r   r   r	   r   r	   rv   r{   )
rG  r{   r   r   r   r	   r   r	   rv   r{   )
rG  r{   r   rn  r   r	   r   r   rv   r{   )
rG  r{   r   r6   r   r	   r   r	   rv   r{   )
rG  r{   r   r  r   r	   r   r	   rv   r{   )
rG  r{   r   rx  r   r	   r   r	   rv   r{   )
rG  r{   r   r(   r   r	   r   r	   rv   r{   )
rG  r{   r   r	   r   r	   r   r	   rv   r{   )
rG  r{   r   r  r   r	   r   r	   rv   r{   )
rG  r{   r   r!   r   r	   r   r   rv   r{   )
rG  r{   r   r   r   r	   r   r	   rv   r{   )
rG  r{   r   r	   r   r	   r   r	   rv   r{   )
rG  r{   r   r,   r   r	   r   r	   rv   r{   )FF)rG  r{   r   r	   rP  r  r   r   r  r  r  r  rv   r{   )
r#  r	   r   r	   rP  r  r   r   rv   r{   )T)
r  r	   rP  r  r   r   r  r  rv   r{   )r  r  rP  r  r  r   rv   r{   ry   )ru   r?   r  r  rv   r  )ru   r?   r  r$  rv   r>   )ru   r?   r  r  rv   r  )ru   r?   r   r$  rv   r  )ru   r?   r  r  rv   r  )ru   r?   r  r$  rv   r  )ru   r?   r  r  rv   r  )r  r	   r  r	   r  r$  rv   r>   )r   r}   rv   r{   )r  r	   rv   r  )ru   r	   r  r$  r  r	   rv   r  )ru   r{   r  r  rv   r  )ru   r{   r  r$  rv   r  )ru   r{   r  r  rv   r  )r  r   r  r  rv   r  )r  r   r  r$  rv   r  )r  r   r  r  rv   r  )r  r{   rv   r  )rv   r  )rv   r  )r  
__future__r   datetimer7  osr  r   r'  uuidcodecsr   r   r   r@  collectionsr   _abctypingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   bson.binaryr   r   r   r   r   r   r   r    	bson.coder!   bson.codec_optionsr"   r#   r$   r%   bson.datetime_msr&   r'   r(   r)   r*   
bson.dbrefr+   bson.decimal128r,   bson.errorsr-   r.   r/   
bson.int64r0   bson.max_keyr2   bson.min_keyr4   bson.objectidr6   
bson.regexr7   bson.sonr8   r9   bson.timestampr:   bson.tz_utilr;   r  r=   bson.typingsr>   r?   r  r@   r  ImportError__all__rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   Structunpack_fromr   unpack_UNPACK_INTr   r   r   r   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   __annotations__r  r   r  r   r   r,  packrJ  rN  rl  r{  r  tupleranger6  rW   rB  rD  rF  rL  rO  rY  ra  rg  rj  rm  rr  ru  rw  r~  r  r  r  r  r  r  r  r  r  r  r  r{   dictrH  r   listr   UUIDr  r  _typhasattrr  r  r[  rS  r  r  r  rX   rY   r  rZ   r  r  r  r  r[   r\   r]   r^   r_   r  r  r  r   r   <module>rE     s  ( ( (R # " " " " "      				 				  



  0 0 0 0 0 0 0 0 0 0 0 0 # # # # # #                                       *	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                                     & & & & & & G G G G G G G G G G                   " " " " " "       ! ! ! ! ! ! ! ! $ $ $ $ $ $        <------;;;;;;;;FF   FFF= = =~ 



















 #V]4((4 fmD!!( 6=&&2 +fmE22> !FM$''3 &u--9           = = = =b b b b? ? ? ?b b b b   "   *'  '  '  ' T" " " "J- - - -
B 
B 
B 
BY Y Y Y       	' 	' 	' 	'   , , , ,3 3 3 3E E E E8 8 8 8>CLL*>CLL+> CLL+> CLL*	>
 CLL+> CLL44> CLL(> CLL,> CLL)> CLL44> CLL*> CLL(> CLL)> CLL+> CLL#>  CLL(!>" CLL.#>$ CLL*CLL/CLL88CLL88+> >    2 
 ,-  
 
 
 
 
 
*  - - - - -< WTS1222     (     .K K K K  
 )(M fmD!!&FM$$	$v}U++0 V]4  %
&-&&+eJJeeDkkJJJJJ; ; ; ;2 2 2 2$2 2 2 2. . . ./ / / /
D D D DF F F F   "F F F FJ J J JN N N N5 5 5 5) ) ) )
; ; ; ;
/ / / // / / /   
M M M M4O O O OT T T TC C C C
P P P P& & & &
   
   ,	= ' #	
 	/ 
=  	,  
< 	DJJ 	I| N 
< 	,  
=!" N#$ N	=] "L/5 	<  6 6Dwt^$$ 6&/o"# %--9----- !"AX AX AX AX AXH> > > > LP; ; ; ; ;( 
 )(M &I&YZZ 
 '<> > > > >: 
    
 
   

 SWS S S S SDK K K K< 
 %$K 
    
 
   
 SW, , , , ,B   .   ( 
 I$*$H!    * * * *Z 
    
 
   

 IM ,  ,  ,  ,  ,F 
@D    
 
   
 <@, , , , ,@   &D+ D+ D+ D+ D+5 D+ D+ D+N   
% % % % 72!"" 4 B{333333	4 4s   -C6 6D ?D 