o
    n~b|D                     @   s,  d Z dZd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 zddlmZ W n
   ddlmZ Y dd	lmZ ejd d
krOeZeZdZdd Znddl
m
Z eZeZdZddZdd ZddddddddddddZdd e D Zd d! Z d"d# Z!d$d% Z"d&d' Z#e$d(d(fd)d*Z%d+d, Z&d-d. Z'dYd0d1Z(dYd2d3Z)dZd4d5Z*G d6d7 d7eZ+G d8d9 d9e+Z,G d:d; d;e+Z-G d<d= d=e+Z.G d>d? d?e+Z/d@Z0dAZ1dBZ2dCZ3dDZ4dEZ5dFZ6dGZ7dHZ8dIZ9dJZ:e$d(d/d(fdKdLZ;e$d(d/d/fdMdNZ<d[dOdPZ=d[dQdRZ>d\dSdTZ?e$d(fdUdVZ@dWdX ZAdS )]z6
Module for deserializing/serializing to and from VDF
z3.4zRossen Georgiev    N)crc32)BytesIO)StringIO)Mapping)VDFDict   u   ￾﻿c                 C   s
   |  tS N)lstripBOMSline r   7/usr/local/lib/python3.10/dist-packages/vdf/__init__.py	strip_bom   s   
r   u   ï»¿ÿþþÿz\ufffe\ufeffzunicode-escapec                 C   s   |  t| tr
tS tS r   )r	   
isinstancestrr
   BOMS_UNICODEr   r   r   r   r   $   s   
	\?"')z\nz\tz\vz\bz\rz\fz\az\\z\?z\"z\'c                 C   s   i | ]\}}||qS r   r   ).0kvr   r   r   
<dictcomp>5   s    r!   c                 C      t |   S r   )_escape_char_mapgroupmr   r   r   _re_escape_match7      r'   c                 C   r"   r   )_unescape_char_mapr$   r%   r   r   r   _re_unescape_match:   r(   r*   c                 C      t dt| S )Nz[\n\t\v\b\r\f\a\\\?\"'])resubr'   textr   r   r   _escape=      r0   c                 C   r+   )Nz0(\\n|\\t|\\v|\\b|\\r|\\f|\\a|\\\\|\\\?|\\\"|\\'))r,   r-   r*   r.   r   r   r   	_unescape@   r1   r2   Tc                 C   s  t |tstdt| t| dstd| g}d}tjdtjd}t| dD ];\}}|dkr6t	|}|
 }|dksD|d	 d
krEq)|d	 dkrNd}q)|ratdt| dd| jj |d|f|d	 dkrt|dkrr|  q)tdt| dd| jj |d	|f	 ||}	|	sz|t| 7 }W q ty   tdt| dd| jj |d	|fw |	ddu r|	dn|	d}
|	d}|du r|	d}|dur| }|dkrd}|rt|
}
|du r%|r|
|d v r|d |
 }t||s|  }|d |
< n	| }||d |
< |	ddu r$|| |	ddu r$d}n?|	ddu rW|	ddurWz|t| 7 }W q tyV   tdt| dd| jj |d	|fw |r^t|n||d |
< 	 q)t|dkr~tdt| dd| jj |d	|f| S )a@  
    Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a VDF)
    to a Python object.

    ``mapper`` specifies the Python object used after deserializetion. ``dict` is
    used by default. Alternatively, ``collections.OrderedDict`` can be used if you
    wish to preserve key order. Or any object that acts like a ``dict``.

    ``merge_duplicate_keys`` when ``True`` will merge multiple KeyValue lists with the
    same key into one instead of overwriting. You can se this to ``False`` if you are
    using ``VDFDict`` and need to preserve the duplicates.
    .Expected mapper to be subclass of dict, got %sreadlinez>Expected fp to be a file-like object supporting line iterationFz^("(?P<qkey>(?:\\.|[^\\"])*)"|(?P<key>#?[a-z0-9\-\_\\\?$%<>]+))([ \t]*("(?P<qval>(?:\\.|[^\\"])*)(?P<vq_end>")?|(?P<val>(?:(?<!/)/(?!/)|[a-z0-9\-\_\\\?\*\.$<> ])+)|(?P<sblock>{[ \t]*)(?P<eblock>})?))?)flags    r   /{z$vdf.parse: expected openning bracketnamez<%s>}z+vdf.parse: one too many closing parenthasisTz+vdf.parse: unexpected EOF (open key quote?)ZqkeyNkeyZqvalvalZeblockZsblockZvq_endz1vdf.parse: unexpected EOF (open quote for value?)z/vdf.parse: unclosed parenthasis or quotes (EOF))
issubclassr   	TypeErrortypehasattrr,   compileI	enumerater   r	   SyntaxErrorgetattr	__class____name__lenpopmatchnextStopIterationr$   rstripr2   r   append)fpmappermerge_duplicate_keysescapedstackZexpect_bracketZre_keyvaluelinenor   rL   r<   r=   _mr   r   r   parseD   s   


"



 rX   c                 K   sR   t | tstdt|  zt| }W n ty    t| }Y nw t|fi |S )zr
    Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
    document) to a Python object.
    zExpected s to be a str, got %s)r   string_typer@   rA   	unicodeIOstrIOrX   )skwargsrQ   r   r   r   loads   s   
r^   c                 K   s   t | fi |S )z
    Deserialize ``fp`` (a ``.readline()``-supporting file-like object containing
    a JSON document) to a Python object.
    )rX   )rQ   r]   r   r   r   load   s   r_   Fc                 C   sH   t | ts	tdt |tstdt |tstddt| ||S )z7
    Serialize ``obj`` to a VDF formatted ``str``.
    *Expected data to be an instance of``dict``"Expected pretty to be of type bool#Expected escaped to be of type boolr7   )r   r   r@   booljoin	_dump_gen)objprettyrT   r   r   r   dumps   s   


rh   c                 C   sh   t | ts	tdt|dstdt |tstdt |ts$tdt| ||D ]}|| q*dS )zq
    Serialize ``obj`` as a VDF formatted stream to ``fp`` (a
    ``.write()``-supporting file-like object).
    r`   write"Expected fp to have write() methodra   rb   N)r   r   r@   rB   rc   re   ri   )rf   rQ   rg   rT   chunkr   r   r   dump   s   



rl   c           	      c   s    d}d}|r|| }|   D ]D\}}|rt|trt|}t|tr@d|||f V  t||||d D ]}|V  q4d| V  q|rKt|trKt|}d|||f V  qd S )Nr   r7   z%s"%s"
%s{
r6   z%s}
z%s"%s" "%s"
)itemsr   rY   r0   r   re   )	datarg   rT   levelindentZline_indentr<   valuerk   r   r   r   re      s"   
re   c                   @   s   e Zd Zdd ZdS )BASE_INTc                 C   s   d| j j| f S )Nz%s(%d))rH   rI   )selfr   r   r   __repr__  s   zBASE_INT.__repr__N)rI   
__module____qualname__rt   r   r   r   r   rr     s    rr   c                   @      e Zd ZdS )UINT_64NrI   ru   rv   r   r   r   r   rx         rx   c                   @   rw   )INT_64Nry   r   r   r   r   r{     rz   r{   c                   @   rw   )POINTERNry   r   r   r   r   r|     rz   r|   c                   @   rw   )COLORNry   r   r   r   r   r}     rz   r}                                  
   c                 C   s.   t | tstdt|  tt| ||||S )a9  
    Deserialize ``b`` (``bytes`` containing a VDF in "binary form")
    to a Python object.

    ``mapper`` specifies the Python object used after deserializetion. ``dict` is
    used by default. Alternatively, ``collections.OrderedDict`` can be used if you
    wish to preserve key order. Or any object that acts like a ``dict``.

    ``merge_duplicate_keys`` when ``True`` will merge multiple KeyValue lists with the
    same key into one instead of overwriting. You can se this to ``False`` if you are
    using ``VDFDict`` and need to preserve the duplicates.
    zExpected s to be bytes, got %s)r   bytesr@   rA   binary_loadr   )brR   rS   
alt_formatraise_on_remainingr   r   r   binary_loads*  s   
r   c                    s  t  drt  drt  dstdt|ts tdt| td}td}td}td	}ddd}	| g}
|sAtnt}t	 fdddD ]}||kr_t
|
dkr]|
  qL n|	 }|tkr|rv||
d v rv|
d | }n	| }||
d |< |
| qL|tkr|	 |
d |< qL|tkr|	 dd|
d |< qL|tttfv r| |jd }|tkrt|}n|tkrt|}||
d |< qL|tkrt| |jd |
d |< qL|tkrt| |jd |
d |< qL|tkr| |jd |
d |< qLtd  d t|f t
|
dkr%td|r@ ddkr@  dd td  d  |
 S )aN  
    Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
    binary VDF) to a Python object.

    ``mapper`` specifies the Python object used after deserializetion. ``dict` is
    used by default. Alternatively, ``collections.OrderedDict`` can be used if you
    wish to preserve key order. Or any object that acts like a ``dict``.

    ``merge_duplicate_keys`` when ``True`` will merge multiple KeyValue lists with the
    same key into one instead of overwriting. You can se this to ``False`` if you are
    using ``VDFDict`` and need to preserve the duplicates.
    readtellseekzRExpected fp to be a file-like object with tell()/seek() and read() returning bytesr3   <i<Q<q<fFc                 S   s   d\}}|   }|dkr,| d}|dkrtd| ||7 }||r%dnd}|dks|r4||d 7 }| |t| |r?dnd	 d	 |d | }|rS|d
}|S ttur_|dd}|S z|d W |S    |dd}Y |S )N)    r>   r>   @   r   z!Unterminated cstring (offset: %d)s     r~      r6   utf-16utf-8replaceascii)	r   r   rF   findr   rJ   decoder   r   )rQ   widebufendoffsetrk   resultr   r   r   read_stringT  s2   
	 
	z binary_load.<locals>.read_stringc                      s
     dS )Nr6   )r   r   rQ   r   r   <lambda>z  s   
 zbinary_load.<locals>.<lambda>r   r6   r>   T)r   r   z"Unknown data type at offset %d: %sz)Reached EOF, but Binary VDF is incompletez?Binary VDF ended at offset %d, but there is more data remainingNF)!rB   r@   r?   r   rA   structStructBIN_ENDBIN_END_ALTiterrJ   rK   BIN_NONErP   
BIN_STRINGBIN_WIDESTRING	BIN_INT32BIN_POINTER	BIN_COLORunpackr   sizer|   r}   
BIN_UINT64rx   	BIN_INT64r{   BIN_FLOAT32rF   r   reprr   )rQ   rR   rS   r   r   int32uint64int64float32r   rU   ZCURRENT_BIN_ENDtr<   rW   r=   r   r   r   r   <  s`   





#
$$
 r   c                 C   s   t  }t| || | S )z@
    Serialize ``obj`` to a binary VDF formatted ``bytes``.
    )r   binary_dumpgetvalue)rf   r   r   r   r   r   binary_dumps  s   r   c                 C   sD   t | ts	tdt|dstdt| |dD ]}|| qdS )zf
    Serialize ``obj`` to a binary VDF formatted ``bytes`` and write it to ``fp`` filelike object
    z"Expected obj to be type of Mappingri   rj   r   N)r   r   r@   rB   _binary_dump_genri   )rf   rQ   r   rk   r   r   r   r     s   

r   c           
      c   s   |dkrt | dkrd S td}td}td}td}|  D ]\}}t|tr4|d}ntdt| t|t	rXt
| t
 V  t||d |d	D ]}	|	V  qQq%t|trjt| t
 || V  q%t|tr|t| t
 || V  q%t|trz|dt
 }tV  W n   |d
t
d  }tV  Y |t
 | V  q%t|trt| t
 || V  q%t|ttttfrt|trtV  nt|trtV  ntV  |t
 V  ||V  q%tdt| |stV  d S tV  d S )Nr   r   r   r   r   r   z%dict keys must be of type str, got %sr6   r   r   r   zUnsupported type: %s)rJ   r   r   rm   r   rY   encoder@   rA   r   r   r   rx   r   packr{   r   r   r   floatr   r}   r|   intint_typer   r   r   r   r   )
rf   ro   r   r   r   r   r   r<   rq   rk   r   r   r   r     sP   













r   c                 C   sb   | dd dkrt dtd| dd \}|t| dd kr%t dt| dd ||dd	S )
a$  
    Deserialize ``s`` (``bytes`` containing a VBKV to a Python object.

    ``mapper`` specifies the Python object used after deserializetion. ``dict` is
    used by default. Alternatively, ``collections.OrderedDict`` can be used if you
    wish to preserve key order. Or any object that acts like a ``dict``.

    ``merge_duplicate_keys`` when ``True`` will merge multiple KeyValue lists with the
    same key into one instead of overwriting. You can se this to ``False`` if you are
    using ``VDFDict`` and need to preserve the duplicates.
    N      VBKVzInvalid headerr      zInvalid checksumTr   )
ValueErrorr   r   r   r   )r\   rR   rS   checksumr   r   r   
vbkv_loads  s   r   c                 C   s.   d t| dd}t|}dtd| | S )z:
    Serialize ``obj`` to a VBKV formatted ``bytes``.
    r   Tr   r   r   )rd   r   r   r   r   )rf   rn   r   r   r   r   
vbkv_dumps  s   r   )FT)FTr   r   )r   F)B__doc____version__
__author__r,   sysr   binasciir   ior   r   rZ   collections.abcr   collectionsZ	vdf.vdictr   version_infor   rY   r   r   r
   r   r[   
basestringlongr   r   r)   rm   r#   r'   r*   r0   r2   dictrX   r^   r_   rh   rl   re   rr   rx   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   <module>   s    

z



l

0