
     i(                     `    S r SSKrSSKJr  SrSrSrSrSrSr	S	r
S
rSrSrSrSr " S S5      rg)a  
TLV (Type-Length-Value) Binary Encoder/Decoder

Provides efficient binary serialization for dirty worker protocol messages.
Inspired by OpenBSD msgctl/msgsnd message format.

Type Codes:
    0x00: None (no value bytes)
    0x01: bool (1 byte: 0x00 or 0x01)
    0x05: int64 (8 bytes big-endian signed)
    0x06: float64 (8 bytes IEEE 754)
    0x10: bytes (4-byte length + raw bytes)
    0x11: string (4-byte length + UTF-8 encoded)
    0x20: list (4-byte count + encoded elements)
    0x21: dict (4-byte count + encoded key-value pairs)
    N   )DirtyProtocolError                !   i   i   c                   l    \ rS rSrSr\S\4S j5       r\SS\S\S\	4S jj5       r
\S\4S j5       rS	rg
)
TLVEncoder,   z
TLV binary encoder/decoder.

Encodes Python values to binary TLV format and decodes back.
Supports: None, bool, int, float, bytes, str, list, dict.
returnc                 \   U c  [        [        /5      $ [        U [        5      (       a  [        [        U (       a  S/5      $ S/5      $ [        U [
        5      (       a(  [        [        /5      [        R                  " SU 5      -   $ [        U [        5      (       a(  [        [        /5      [        R                  " SU 5      -   $ [        U [         5      (       af  [        U 5      [        :  a  [        S[        U 5       S[         S35      e[        [        /5      [        R                  " S[        U 5      5      -   U -   $ [        U [        5      (       aw  U R!                  S	5      n[        U5      ["        :  a  [        S
[        U5       S["         S35      e[        [$        /5      [        R                  " S[        U5      5      -   U-   $ [        U [&        [(        45      (       a  [        U 5      [*        :  a  [        S[        U 5       S[*         S35      e[        [,        /5      [        R                  " S[        U 5      5      /nU  H'  nUR/                  [0        R!                  U5      5        M)     SR3                  U5      $ [        U [4        5      (       a  [        U 5      [6        :  a  [        S[        U 5       S[6         S35      e[        [8        /5      [        R                  " S[        U 5      5      /nU R;                  5        Hm  u  pE[        U[        5      (       d  [        U5      nUR/                  [0        R!                  U5      5        UR/                  [0        R!                  U5      5        Mo     SR3                  U5      $ [        S[=        U 5      R>                   35      e)a  
Encode a Python value to TLV binary format.

Args:
    value: Python value to encode (None, bool, int, float,
           bytes, str, list, or dict)

Returns:
    bytes: TLV-encoded binary data

Raises:
    DirtyProtocolError: If value type is not supported
r   r   >q>dBytes too large:  bytes (max: )>Iutf-8String too large: List too large:  items (max:     Dict too large: z#Unsupported type for TLV encoding: ) bytes	TYPE_NONE
isinstancebool	TYPE_BOOLint
TYPE_INT64structpackfloatTYPE_FLOAT64lenMAX_BYTES_SIZEr   
TYPE_BYTESstrencodeMAX_STRING_SIZETYPE_STRINGlisttupleMAX_LIST_SIZE	TYPE_LISTappendr   joindictMAX_DICT_SIZE	TYPE_DICTitemstype__name__)valueencodedpartsitemkvs         D/var/www/ias/venv/lib/python3.13/site-packages/gunicorn/dirty/tlv.pyr+   TLVEncoder.encode4   s    =)%%eT"")UT=>>=>>eS!!*&T5)AAAeU##,(6;;tU+CCCeU##5zN*('E
| 4+,A/  *&T3u:)FFNNeS!!ll7+G7|o-((W 7,-Q0  +'&++dCL*IIGSSedE]++5zM)(&s5zl 3*O1.  I;'T3u:)FGEZ..t45 88E?"eT""5zM)(&s5zl 3*O1.  I;'T3u:)FGE!!S))AAZ..q12Z..q12 & 88E?" 1$u+2F2F1GH
 	
r   dataoffsetc                    U[        U 5      :  a  [        SXUS-    S9eX   nUS-  nU[        :X  a  SU4$ U[        :X  a.  U[        U 5      :  a  [        SXS-
  US-    S9eX   S:g  nX1S-   4$ U[        :X  aI  US-   [        U 5      :  a  [        S	XS-
  US-    S9e[
        R                  " S
XUS-    5      S   nX1S-   4$ U[        :X  aI  US-   [        U 5      :  a  [        SXS-
  US-    S9e[
        R                  " SXUS-    5      S   nX1S-   4$ U[        :X  a  US-   [        U 5      :  a  [        SXS-
  US-    S9e[
        R                  " SXUS-    5      S   nUS-  nU[        :  a  [        SU S[         S35      eX-   [        U 5      :  a$  [        SU S[        U 5      U-
   3XS-
  US-    S9eXX-    nX1U-   4$ U[        :X  a  US-   [        U 5      :  a  [        SXS-
  US-    S9e[
        R                  " SXUS-    5      S   nUS-  nU[        :  a  [        SU S[         S35      eX-   [        U 5      :  a$  [        SU S[        U 5      U-
   3XS-
  US-    S9e XX-    R                  S5      nX1U-   4$ U[        :X  a  US-   [        U 5      :  a  [        SXS-
  US-    S9e[
        R                  " SXUS-    5      S   nUS-  nU[         :  a  [        SU S[          S35      e/ n[#        U5       H+  n[$        R                  X5      u  pUR'                  U	5        M-     Xq4$ U[(        :X  a  US-   [        U 5      :  a  [        SXS-
  US-    S9e[
        R                  " SXUS-    5      S   nUS-  nU[*        :  a  [        SU S[*         S35      e0 n
[#        U5       Hk  n[$        R                  X5      u  p[-        U[.        5      (       d!  [        S [1        U5      R2                   35      e[$        R                  X5      u  p1X:U'   Mm     X4$ [        S!US" 3XS-
  US-    S9e! [         a!  n[        SU 3XU[        US5      -    S9eSnAff = f)#z
Decode a TLV-encoded value from binary data.

Args:
    data: Binary data to decode
    offset: Starting offset in the data

Returns:
    tuple: (decoded_value, new_offset)

Raises:
    DirtyProtocolError: If data is malformed or truncated
z Truncated TLV data: no type byte   raw_datar   Nz&Truncated TLV data: missing bool valuer      z$Truncated TLV data: incomplete int64r   z&Truncated TLV data: incomplete float64r      z+Truncated TLV data: incomplete bytes lengthr   r   r   r   zTruncated TLV data: expected z bytes, got r   z,Truncated TLV data: incomplete string lengthr   z bytes for string, got r   zInvalid UTF-8 in string: z)Truncated TLV data: incomplete list countr   r   z)Truncated TLV data: incomplete dict countr   zDict key must be string, got zUnknown TLV type code: 0x02x)r'   r   r   r    r"   r#   unpackr&   r)   r(   r-   r,   decodeUnicodeDecodeErrorminr1   r0   ranger   r2   r6   r5   r   r*   r8   r9   )rB   rC   	type_coder:   lengthecountr7   _r=   resultkeys               r@   rL   TLVEncoder.decode   s    SY$2Vb[1 
 L	!	!<	!T"(<!1*Vb[9  LD(E1*$$
"zCI%(:!1*Vb[9  MM$FQJ(?@CE1*$$$zCI%(<!1*Vb[9  MM$FQJ(?@CE1*$$
"zCI%(A!1*Vb[9  ]]4VaZ)@A!DFaKF&('x}^<LAN  T*(3F8 <t9v-.0!1*Vb[9 
 0E6/))#zCI%(B!1*Vb[9  ]]4VaZ)@A!DFaKF'((o=NaP  T*(3F8 <t9v-.0!1*Vb[9 
FO4;;GD 6/))	!zCI%(?!1*Vb[9  MM$FQJ(?@CEaKF}$(&ug]=/K  E5\)00>T" " = 	!zCI%(?!1*Vb[9  MM$FQJ(?@CEaKF}$(&ug]=/K  F5\(//=!#s++,7S	8J8J7KL  !+ 1 1$ ?#s " >! '	#71*Vb[1
 	
i & (/s3!#fb/)AB s   /Q 
Q-Q((Q-c                     [         R                  U S5      u  pU[        U 5      :w  a  [        S[        U 5      U-
   S3XUS-    S9eU$ )z
Decode a complete TLV-encoded value, ensuring all data is consumed.

Args:
    data: Binary data to decode

Returns:
    Decoded Python value

Raises:
    DirtyProtocolError: If data is malformed or has trailing bytes
r   zTrailing data after TLV: z bytesrE   rF   )r   rL   r'   r   )rB   r:   rC   s      r@   decode_fullTLVEncoder.decode_full  sZ     #))$2SY$+CI,>+?vFVb[1  r    N)r   )r9   
__module____qualname____firstlineno____doc__staticmethodr   r+   r!   r/   rL   rY   __static_attributes__r[   r   r@   r   r   ,   sp     H
 H
 H
T Y
U Y
C Y
 Y
 Y
v %  r   r   )r_   r#   errorsr   r   r    r"   r&   r)   r-   r1   r6   r,   r(   r0   r5   r   r[   r   r@   <module>rc      s^   
"  & 		

		 #!C Cr   