o
    éT•j°o  ã                   @   sØ  d Z g d¢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Zddl	Z	ddl
Z
ddlZddlmZ ejdded�Zeƒ  ej¡ d	ZG d
d„ dƒZdZe
 d¡Zd?dd„Zdd„ Ze
 de
j¡Zdd„ Zdd„ Zdd„ ZG dd„ dƒZ G dd„ dƒZ!G dd„ de!ƒZ"d d!„ Z#G d"d#„ d#e$ƒZ%d$d%d&d'd(œZ&e'ƒ Z(G d)d*„ d*ƒZ)d+d,„ Z*e+e,e-eje.fZ/G d-d.„ d.e'ƒZ0d/d0„ Z1e2e3e#e e"d1�e4e3e1e)e0d1�iZ5de3d2œd3d4„Z6de3d2œd5d6„Z7e2d7d8d9œd:d;„Z8e2d8d7d<œd=d>„Z9dS )@a>  plistlib.py -- a tool to generate and parse MacOSX .plist files.

The property list (.plist) file format is a simple XML pickle supporting
basic object types, like dictionaries, lists, numbers and strings.
Usually the top level object is a dictionary.

To write out a plist file, use the dump(value, file)
function. 'value' is the top level object, 'file' is
a (writable) file object.

To parse a plist from a file, use the load(file) function,
with a (readable) file object as the only argument. It
returns the top level object (again, usually a dictionary).

To work with plist data in bytes objects, you can use loads()
and dumps().

Values can be strings, integers, floats, booleans, tuples, lists,
dictionaries (but only with string keys), Data, bytes, bytearray, or
datetime.datetime objects.

Generate Plist example:

    import datetime
    import plistlib

    pl = dict(
        aString = "Doodah",
        aList = ["A", "B", 12, 32.1, [1, 2, 3]],
        aFloat = 0.1,
        anInt = 728,
        aDict = dict(
            anotherString = "<hello & hi there!>",
            aThirdString = "M\xe4ssig, Ma\xdf",
            aTrueValue = True,
            aFalseValue = False,
        ),
        someData = b"<binary gunk>",
        someMoreData = b"<lots of binary gunk>" * 10,
        aDate = datetime.datetime.now()
    )
    print(plistlib.dumps(pl).decode())

Parse Plist example:

    import plistlib

    plist = b'''<plist version="1.0">
    <dict>
        <key>foo</key>
        <string>bar</string>
    </dict>
    </plist>'''
    pl = plistlib.loads(plist)
    print(pl["foo"])
)ÚInvalidFileExceptionÚFMT_XMLÚ
FMT_BINARYÚloadÚdumpÚloadsÚdumpsÚUIDé    N)ÚBytesIO)ÚParserCreateÚPlistFormatzFMT_XML FMT_BINARY)Úmodulei   c                   @   ó<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )r   c                 C   s<   t |tƒs	tdƒ‚|dkrtdƒ‚|dk rtdƒ‚|| _d S )Nzdata must be an intì            zUIDs cannot be >= 2**64r	   úUIDs must be positive)Ú
isinstanceÚintÚ	TypeErrorÚ
ValueErrorÚdata©Úselfr   © r   ú/usr/lib/python3.10/plistlib.pyÚ__init__Q   s   

zUID.__init__c                 C   s   | j S ©N)r   ©r   r   r   r   Ú	__index__Z   s   zUID.__index__c                 C   s   d| j jt| jƒf S )Nz%s(%s))Ú	__class__Ú__name__Úreprr   r   r   r   r   Ú__repr__]   ó   zUID.__repr__c                 C   s   | j | jffS r   )r   r   r   r   r   r   Ú
__reduce__`   ó   zUID.__reduce__c                 C   s   t |tƒstS | j|jkS r   )r   r   ÚNotImplementedr   )r   Úotherr   r   r   Ú__eq__c   s   
z
UID.__eq__c                 C   s
   t | jƒS r   )Úhashr   r   r   r   r   Ú__hash__h   ó   
zUID.__hash__N)	r   Ú
__module__Ú__qualname__r   r   r!   r#   r'   r)   r   r   r   r   r   P   s    	r   sŽ   <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
zv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]éL   c                 C   sP   |d d }g }t dt| ƒ|ƒD ]}| ||| … }| t |¡¡ qd |¡S )Né   é   r	   ó    )ÚrangeÚlenÚappendÚbinasciiÚ
b2a_base64Újoin)ÚsÚmaxlinelengthÚ
maxbinsizeÚpiecesÚiÚchunkr   r   r   Ú_encode_base64|   s   
r=   c                 C   s$   t | tƒrt |  d¡¡S t | ¡S )Núutf-8)r   Ústrr4   Ú
a2b_base64Úencode)r7   r   r   r   Ú_decode_base64…   s   

rB   z{(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Zc                 C   sL   d}t  | ¡ ¡ }g }|D ]}|| }|d u r n| t|ƒ¡ qtj|Ž S )N©ÚyearÚmonthÚdayÚhourÚminuteÚsecond)Ú_dateParserÚmatchÚ	groupdictr3   r   Údatetime)r7   ÚorderÚgdÚlstÚkeyÚvalr   r   r   Ú_date_from_string’   s   
rS   c                 C   s    d| j | j| j| j| j| jf S )Nz%04d-%02d-%02dT%02d:%02d:%02dZrC   )Údr   r   r   Ú_date_to_stringž   s   þrU   c                 C   sZ   t  | ¡}|d urtdƒ‚|  dd¡} |  dd¡} |  dd¡} |  dd¡} |  d	d
¡} | S )Nz;strings can't contain control characters; use bytes insteadz
Ú
úú&z&amp;ú<z&lt;ú>z&gt;)Ú_controlCharPatÚsearchr   Úreplace)ÚtextÚmr   r   r   Ú_escape¤   s   
r`   c                   @   s¬   e Z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)S )*Ú_PlistParserc                 C   s   g | _ d | _d | _|| _d S r   )ÚstackÚcurrent_keyÚrootÚ
_dict_type©r   Ú	dict_typer   r   r   r   ±   ó   
z_PlistParser.__init__c                 C   sB   t ƒ | _| j| j_| j| j_| j| j_| j| j_	| j 
|¡ | jS r   )r   ÚparserÚhandle_begin_elementÚStartElementHandlerÚhandle_end_elementÚEndElementHandlerÚhandle_dataÚCharacterDataHandlerÚhandle_entity_declÚEntityDeclHandlerÚ	ParseFilerd   )r   Úfileobjr   r   r   Úparse·   s   



z_PlistParser.parsec                 C   s   t dƒ‚)Nz8XML entity declarations are not supported in plist files)r   )r   Úentity_nameÚis_parameter_entityÚvalueÚbaseÚ	system_idÚ	public_idÚnotation_namer   r   r   rp   À   s   z_PlistParser.handle_entity_declc                 C   s.   g | _ t| d| d ƒ}|d ur||ƒ d S d S )NÚbegin_)r   Úgetattr)r   ÚelementÚattrsÚhandlerr   r   r   rj   Æ   s
   ÿz!_PlistParser.handle_begin_elementc                 C   s&   t | d| d ƒ}|d ur|ƒ  d S d S )NÚend_)r}   )r   r~   r€   r   r   r   rl   Ì   s   
ÿz_PlistParser.handle_end_elementc                 C   s   | j  |¡ d S r   )r   r3   r   r   r   r   rn   Ñ   ó   z_PlistParser.handle_datac                 C   s�   | j d ur$t| jd ti ƒƒstd| jj ƒ‚|| jd | j < d | _ d S | js,|| _d S t| jd tg ƒƒs>td| jj ƒ‚| jd  |¡ d S )Néÿÿÿÿzunexpected element at line %d)	rc   r   rb   Útyper   ri   ÚCurrentLineNumberrd   r3   ©r   rw   r   r   r   Ú
add_objectÔ   s   
ÿ

ÿz_PlistParser.add_objectc                 C   s   d  | j¡}g | _|S )NÚ )r6   r   r   r   r   r   Úget_dataä   s   z_PlistParser.get_datac                 C   s"   |   ¡ }|  |¡ | j |¡ d S r   )re   r‡   rb   r3   )r   r   rT   r   r   r   Ú
begin_dictë   s   
z_PlistParser.begin_dictc                 C   s*   | j rtd| j | jjf ƒ‚| j ¡  d S )Nz%missing value for key '%s' at line %d)rc   r   ri   r…   rb   Úpopr   r   r   r   Úend_dictð   s
   ÿz_PlistParser.end_dictc                 C   s8   | j st| jd ti ƒƒstd| jj ƒ‚|  ¡ | _ d S )Nrƒ   zunexpected key at line %d)rc   r   rb   r„   r   ri   r…   r‰   r   r   r   r   Úend_keyö   s
   ÿz_PlistParser.end_keyc                 C   s   g }|   |¡ | j |¡ d S r   )r‡   rb   r3   )r   r   Úar   r   r   Úbegin_arrayü   s   
z_PlistParser.begin_arrayc                 C   s   | j  ¡  d S r   )rb   r‹   r   r   r   r   Ú	end_array  r$   z_PlistParser.end_arrayc                 C   ó   |   d¡ d S )NT©r‡   r   r   r   r   Úend_true  r$   z_PlistParser.end_truec                 C   r‘   )NFr’   r   r   r   r   Ú	end_false  r$   z_PlistParser.end_falsec                 C   sB   |   ¡ }| d¡s| d¡r|  t|dƒ¡ d S |  t|ƒ¡ d S )NÚ0xÚ0Xé   )r‰   Ú
startswithr‡   r   )r   Úrawr   r   r   Úend_integer
  s   z_PlistParser.end_integerc                 C   ó   |   t|  ¡ ƒ¡ d S r   )r‡   Úfloatr‰   r   r   r   r   Úend_real  r"   z_PlistParser.end_realc                 C   s   |   |  ¡ ¡ d S r   )r‡   r‰   r   r   r   r   Ú
end_string  s   z_PlistParser.end_stringc                 C   r›   r   )r‡   rB   r‰   r   r   r   r   Úend_data  r"   z_PlistParser.end_datac                 C   r›   r   )r‡   rS   r‰   r   r   r   r   Úend_date  r"   z_PlistParser.end_dateN)r   r+   r,   r   rt   rp   rj   rl   rn   r‡   r‰   rŠ   rŒ   r�   r�   r�   r“   r”   rš   r�   rž   rŸ   r    r   r   r   r   ra   °   s*    	ra   c                   @   s8   e Zd Zddd„Zdd„ Zdd„ Zdd
d„Zdd„ Zd	S )Ú_DumbXMLWriterr	   ú	c                 C   s   || _ g | _|| _|| _d S r   )Úfilerb   Ú_indent_levelÚindent)r   r£   Úindent_levelr¥   r   r   r   r     rh   z_DumbXMLWriter.__init__c                 C   s,   | j  |¡ |  d| ¡ |  jd7  _d S )Nz<%s>é   )rb   r3   Úwritelnr¤   ©r   r~   r   r   r   Úbegin_element%  s   z_DumbXMLWriter.begin_elementc                 C   s@   | j dksJ ‚| j ¡ |ksJ ‚|  j d8  _ |  d| ¡ d S )Nr	   r§   z</%s>)r¤   rb   r‹   r¨   r©   r   r   r   Úend_element*  s   z_DumbXMLWriter.end_elementNc                 C   s:   |d urt |ƒ}|  d|||f ¡ d S |  d| ¡ d S )Nz<%s>%s</%s>z<%s/>)r`   r¨   )r   r~   rw   r   r   r   Úsimple_element0  s   z_DumbXMLWriter.simple_elementc                 C   sH   |rt |tƒr| d¡}| j | j| j ¡ | j |¡ | j d¡ d S )Nr>   ó   
)r   r?   rA   r£   Úwriter¤   r¥   )r   Úliner   r   r   r¨   8  s   

z_DumbXMLWriter.writeln)r	   r¢   r   )r   r+   r,   r   rª   r«   r¬   r¨   r   r   r   r   r¡     s    

r¡   c                   @   sB   e Zd Z		ddd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ ZdS )Ú_PlistWriterr	   ó   	r§   TFc                 C   s.   |r|  t¡ t | |||¡ || _|| _d S r   )r®   ÚPLISTHEADERr¡   r   Ú
_sort_keysÚ	_skipkeys)r   r£   r¦   r¥   ÚwriteHeaderÚ	sort_keysÚskipkeysr   r   r   r   E  s
   

z_PlistWriter.__init__c                 C   s"   |   d¡ |  |¡ |   d¡ d S )Nz<plist version="1.0">z</plist>)r¨   Úwrite_valuer†   r   r   r   r®   O  s   

z_PlistWriter.writec                 C   s(  t |tƒr|  d|¡ d S |du r|  d¡ d S |du r#|  d¡ d S t |tƒrEd|  kr2dk rAn t|ƒ‚|  dd	| ¡ d S t|ƒ‚t |tƒrT|  d
t|ƒ¡ d S t |tƒr`|  |¡ d S t |t	t
fƒrn|  |¡ d S t |tjƒr~|  dt|ƒ¡ d S t |ttfƒrŒ|  |¡ d S tdt|ƒ ƒ‚)NÚstringTÚtrueFÚfalselûÿÿÿ         r   Úintegerz%dÚrealÚdatezunsupported type: %s)r   r?   r¬   r   ÚOverflowErrorrœ   r    ÚdictÚ
write_dictÚbytesÚ	bytearrayÚwrite_bytesrM   rU   ÚtupleÚlistÚwrite_arrayr   r„   r†   r   r   r   r¸   T  s,   

þ

z_PlistWriter.write_valuec                 C   sz   |   d¡ |  jd8  _tddt| j dd¡| j ƒ ƒ}t||ƒ d¡D ]	}|r.|  |¡ q%|  jd7  _|  	d¡ d S )Nr   r§   r—   r-   r±   s           r­   )
rª   r¤   Úmaxr2   r¥   r]   r=   Úsplitr¨   r«   )r   r   r8   r¯   r   r   r   rÄ   v  s   
þ
€z_PlistWriter.write_bytesc                 C   s„   |r;|   d¡ | jrt| ¡ ƒ}n| ¡ }|D ]\}}t|tƒs(| jr$qtdƒ‚|  d|¡ |  	|¡ q|  
d¡ d S |  d¡ d S )NrÀ   úkeys must be stringsrQ   )rª   r³   ÚsortedÚitemsr   r?   r´   r   r¬   r¸   r«   )r   rT   rÌ   rQ   rw   r   r   r   rÁ   ƒ  s   

z_PlistWriter.write_dictc                 C   s>   |r|   d¡ |D ]}|  |¡ q	|  d¡ d S |  d¡ d S )NÚarray)rª   r¸   r«   r¬   )r   rÍ   rw   r   r   r   rÇ   —  s   
z_PlistWriter.write_arrayN)r	   r±   r§   TF)	r   r+   r,   r   r®   r¸   rÄ   rÁ   rÇ   r   r   r   r   r°   D  s    
þ
"r°   c                 C   sŽ   d}|D ]
}|   |¡r dS qtjdftjdftjdffD ]'\}}|   |¡s'q|D ]}|| d¡ |¡ }| d t|ƒ… |krC  dS q)qdS )N)s   <?xmls   <plistTr>   z	utf-16-bez	utf-16-leÚasciiF)r˜   ÚcodecsÚBOM_UTF8ÚBOM_UTF16_BEÚBOM_UTF16_LEÚdecoderA   r2   )ÚheaderÚprefixesÚpfxÚbomÚencodingÚstartÚprefixr   r   r   Ú_is_fmt_xml¢  s$   
ÿý
ÿþrÛ   c                   @   s   e Zd Zddd„ZdS )r   úInvalid filec                 C   s   t  | |¡ d S r   )r   r   )r   Úmessager   r   r   r   Ä  r‚   zInvalidFileException.__init__N)rÜ   )r   r+   r,   r   r   r   r   r   r   Ã  s    r   ÚBÚHÚLÚQ)r§   é   r.   é   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )Ú_BinaryPlistParsera  
    Read or write a binary plist file, following the description of the binary
    format.  Raise InvalidFileException in case of error, otherwise return the
    root object.

    see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c
    c                 C   s
   || _ d S r   )re   rf   r   r   r   r   Ó  r*   z_BinaryPlistParser.__init__c                 C   s    z?|| _ | j  dtj¡ | j  d¡}t|ƒdkrtƒ ‚t d|¡\}| _	}}}| j  |¡ |  
||¡| _tg| | _|  |¡W S  tttjttfyO   tƒ ‚w )Niàÿÿÿé    z>6xBBQQQ)Ú_fpÚseekÚosÚSEEK_ENDÚreadr2   r   ÚstructÚunpackÚ	_ref_sizeÚ
_read_intsÚ_object_offsetsÚ
_undefinedÚ_objectsÚ_read_objectÚOSErrorÚ
IndexErrorÚerrorr¿   r   )r   ÚfpÚtrailerÚoffset_sizeÚnum_objectsÚ
top_objectÚoffset_table_offsetr   r   r   rt   Ö  s&   
ý

ÿþz_BinaryPlistParser.parsec                 C   sL   |dkr$| j  d¡d d@ }d|> }dt|  }t || j  |¡¡d S |S )z$ return the size of the next object.é   r§   r	   r/   rZ   )ræ   rê   Ú_BINARY_FORMATrë   rì   )r   ÚtokenLr_   r7   Úfr   r   r   Ú	_get_sizeï  s   z_BinaryPlistParser._get_sizec                 C   s\   t |tƒ}| j |¡}	 t|ƒ|krt‚||kr|S t ||| ƒ}|| j |¡7 }||7 }qr   )ÚminÚ_MIN_READ_BUF_SIZEræ   rê   r2   r   )r   ÚsizeÚcursizer   Údeltar   r   r   Ú_readù  s   
ùz_BinaryPlistParser._readc                    s^   |   ˆ| ¡‰ ˆtv rt d|› tˆ › �ˆ ¡S ˆstƒ ‚t‡ ‡fdd„tdˆ| ˆƒD ƒƒS )NrZ   c                 3   s(   � | ]}t  ˆ ||ˆ … d ¡V  qdS )ÚbigN)r   Ú
from_bytes)Ú.0r;   ©r   r  r   r   Ú	<genexpr>  s   €  ÿz0_BinaryPlistParser._read_ints.<locals>.<genexpr>r	   )r  rý   rë   rì   r   rÅ   r1   )r   Únr  r   r
  r   rî     s   ÿz_BinaryPlistParser._read_intsc                 C   s   |   || j¡S r   )rî   rí   )r   r  r   r   r   Ú
_read_refs  r$   z_BinaryPlistParser._read_refsc                    sª  ˆ j | }|tur|S ˆ j| }ˆ j |¡ ˆ j d¡d }|d@ |d@ }}|dkr/d}�n|dkr7d}�n|dkr?d	}�n|dkrGd
}�n|dkr\tjˆ j d|> ¡d|dkd�}nò|dkrmt 	dˆ j d¡¡d }ná|dkr~t 	dˆ j d¡¡d }nÐ|dkrœt 	dˆ j d¡¡d }t
 
ddd¡t
j|d� }n²|dkr«ˆ  |¡}ˆ  |¡}n£|dkr¿ˆ  |¡}ˆ  |¡}	|	 d¡}n�|dkrÕˆ  |¡d }ˆ  |¡}	|	 d¡}ny|dkrètt ˆ j d| ¡d¡ƒ}nf|dk�rˆ  |¡}ˆ  |¡}
g }|ˆ j |< | ‡ fdd „|
D ƒ¡ nC|d!k�rKˆ  |¡}ˆ  |¡}ˆ  |¡}
ˆ  ¡ }|ˆ j |< zt||
ƒD ]\}}ˆ  |¡|ˆ  |¡< �q.W n t�yJ   tƒ ‚w tƒ ‚|ˆ j |< |S )"zx
        read the object by reference.

        May recursively read sub-objects (content of an array/dict/set)
        r§   r	   éð   rü   Nrã   Fé	   Tr0   r—   r  r/   ©Úsignedé"   z>fr.   é#   z>dé3   éÑ  )Úsecondsé@   éP   rÎ   é`   râ   úutf-16beé€   é    c                 3   s   � | ]}ˆ   |¡V  qd S r   )rò   )r	  Úxr   r   r   r  X  s   € z2_BinaryPlistParser._read_object.<locals>.<genexpr>éÐ   )rñ   rð   rï   ræ   rç   rê   r   r  rë   rì   rM   Ú	timedeltar   r  rÓ   r   r  Úextendre   Úziprò   r   r   )r   ÚrefÚresultÚoffsetÚtokenÚtokenHrþ   rÿ   r7   r   Úobj_refsÚkey_refsÚkÚor   r   r   rò     s~   

ÿ
ÿ












ÿÿ
z_BinaryPlistParser._read_objectN)r   r+   r,   Ú__doc__r   rt   r   r  rî   r  rò   r   r   r   r   rä   Ë  s    

rä   c                 C   s(   | dk rdS | dk rdS | dk rdS dS )Né   r§   é   râ   ì        r.   rã   r   )Úcountr   r   r   Ú_count_to_sizeq  s   r0  c                   @   r   )Ú_BinaryPlistWriterc                 C   s   || _ || _|| _d S r   )ræ   r³   r´   )r   rö   r¶   r·   r   r   r   r   �  s   
z_BinaryPlistWriter.__init__c           
      C   sæ   g | _ i | _i | _|  |¡ t| j ƒ}dg| | _t|ƒ| _t| j | _	| j
 d¡ | j D ]}|  |¡ q-|  |¡}| j
 ¡ }t|ƒ}dt| |  }| j
 tj|g| j¢R Ž ¡ d}||| j|||f}	| j
 tjdg|	¢R Ž ¡ d S )Nr	   ó   bplist00rZ   z	>5xBBBQQQ)Ú_objlistÚ	_objtableÚ_objidtableÚ_flattenr2   rï   r0  rí   rý   Ú_ref_formatræ   r®   Ú_write_objectÚ
_getrefnumÚtellrë   Úpack)
r   rw   rù   Úobjrú   rû   rø   Úoffset_formatÚsort_versionr÷   r   r   r   r®   †  s*   






þz_BinaryPlistWriter.writec           	      C   s$  t |tƒrt|ƒ|f| jv rd S n	t|ƒ| jv rd S t| jƒ}| j |¡ t |tƒr4|| jt|ƒ|f< n|| jt|ƒ< t |t	ƒr}g }g }| 
¡ }| jrOt|ƒ}|D ]\}}t |tƒsb| jr^qQtdƒ‚| |¡ | |¡ qQt ||¡D ]}|  |¡ qsd S t |ttfƒrŽ|D ]	}|  |¡ q†d S d S )NrÊ   )r   Ú_scalarsr„   r4  Úidr5  r2   r3  r3   rÀ   rÌ   r³   rË   r?   r´   r   Ú	itertoolsÚchainr6  rÆ   rÅ   )	r   rw   ÚrefnumÚkeysÚvaluesrÌ   r)  Úvr*  r   r   r   r6  ³  s@   
ÿ




ÿþz_BinaryPlistWriter._flattenc                 C   s*   t |tƒr| jt|ƒ|f S | jt|ƒ S r   )r   r?  r4  r„   r5  r@  r†   r   r   r   r9  Ý  s   
z_BinaryPlistWriter._getrefnumc                 C   s¼   |dk r| j  t d||B ¡¡ d S |dk r&| j  t d|dB d|¡¡ d S |dk r:| j  t d|dB d|¡¡ d S |d	k rN| j  t d
|dB d|¡¡ d S | j  t d|dB d|¡¡ d S )Nrü   z>Br,  z>BBBr—   r-  z>BBHé   r.  z>BBLé   z>BBQé   )ræ   r®   rë   r;  )r   r%  r  r   r   r   Ú_write_sizeã  s       z_BinaryPlistWriter._write_sizec                    sj  ˆ   |¡}ˆ j ¡ ˆ j|< |d u rˆ j d¡ d S |du r%ˆ j d¡ d S |du r1ˆ j d¡ d S t|tƒr²|dk rVzˆ j t dd|¡¡ W d S  tj	yU   t
|ƒd ‚w |d	k rgˆ j t d
d|¡¡ d S |dk rxˆ j t dd|¡¡ d S |dk r‰ˆ j t dd|¡¡ d S |dk ršˆ j t dd|¡¡ d S |dk r®ˆ j d|jdddd� ¡ d S t
|ƒ‚t|tƒrÄˆ j t dd|¡¡ d S t|tjƒrâ|t ddd¡  ¡ }ˆ j t dd|¡¡ d S t|ttfƒrùˆ  dt|ƒ¡ ˆ j |¡ d S t|tƒ�r0z| d¡}ˆ  dt|ƒ¡ W n t�y'   | d ¡}ˆ  d!t|ƒd" ¡ Y nw ˆ j |¡ d S t|tƒ�r�|jdk �r@td#ƒ‚|jd	k �rSˆ j t d
d$|¡¡ d S |jdk �rfˆ j t dd%|¡¡ d S |jdk �ryˆ j t dd&|¡¡ d S |jdk �rŒˆ j t dd'|¡¡ d S t
|ƒ‚t|ttfƒ�r¿‡ fd(d)„|D ƒ}t|ƒ}ˆ  d*|¡ ˆ j tjd+ˆ j|  g|¢R Ž ¡ d S t|tƒ�r1g g }}ˆ j�rÕt| ¡ ƒ}	n| ¡ }	|	D ]%\}
}t|
tƒ�sïˆ j �rë�qÛt!d,ƒ‚| "ˆ   |
¡¡ | "ˆ   |¡¡ �qÛt|ƒ}ˆ  d-|¡ ˆ j tjd+ˆ j|  g|¢R Ž ¡ ˆ j tjd+ˆ j|  g|¢R Ž ¡ d S t!|ƒ‚).Nó    Fó   Tr±   r	   z>BqrI  r,  z>BBr—   r-  z>BHrG  r.  z>BLrH  l            z>BQr   ó   r  r  z>Bdr  r  r§   r  r  rÎ   r  r  r  râ   r   r  é�   éƒ   é‡   c                    s   g | ]}ˆ   |¡‘qS r   )r9  )r	  r*  r   r   r   Ú
<listcomp>6  s    z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r  rZ   rÊ   r  )#r9  ræ   r:  rï   r®   r   r   rë   r;  rõ   r¿   Úto_bytesrœ   rM   Útotal_secondsrÂ   rÃ   rJ  r2   r?   rA   ÚUnicodeEncodeErrorr   r   r   rÆ   rÅ   r7  rÀ   r³   rË   rÌ   r´   r   r3   )r   rw   r"  rÿ   ÚtÚrefsr7   ÚkeyRefsÚvalRefsÚ	rootItemsr)  rF  r   r   r   r8  ó  sš   


ÿ 


þ(
$(z _BinaryPlistWriter._write_objectN)	r   r+   r,   r   r®   r6  r9  rJ  r8  r   r   r   r   r1  €  s    -*r1  c                 C   s   | d d… dkS )Nrã   r2  r   )rÔ   r   r   r   Ú_is_fmt_binaryT  r‚   rZ  )Údetectri   Úwriter©Úfmtrg   c                C   sj   |du r%|   d¡}|  d¡ t ¡ D ]}|d |ƒr |d } nqtƒ ‚nt| d }||d�}| | ¡S )z�Read a .plist file. 'fp' should be a readable and binary file object.
    Return the unpacked root object (which usually is a dictionary).
    Nrå   r	   r[  ri   )rg   )rê   rç   Ú_FORMATSrE  r   rt   )rö   r^  rg   rÔ   ÚinfoÚPÚpr   r   r   r   j  s   

þý

r   c                C   s   t | ƒ}t|||d�S )zqRead a .plist file from a bytes object.
    Return the unpacked root object (which usually is a dictionary).
    r]  )r
   r   )rw   r^  rg   rö   r   r   r   r   €  s   r   TF)r^  r¶   r·   c                C   s:   |t vrtd|f ƒ‚t | d |||d�}| | ¡ dS )zWWrite 'value' to a .plist file. 'fp' should be a writable,
    binary file object.
    zUnsupported format: %rr\  )r¶   r·   N)r_  r   r®   )rw   rö   r^  r¶   r·   r\  r   r   r   r   ˆ  s   r   ©r^  r·   r¶   c                C   s    t ƒ }t| ||||d� | ¡ S )z?Return a bytes object with the contents for a .plist file.
    rc  )r
   r   Úgetvalue)rw   r^  r·   r¶   rö   r   r   r   r   “  s   r   )r-   ):r+  Ú__all__r4   rÏ   rM   ÚenumÚior
   rA  rè   Úrerë   Úxml.parsers.expatr   ÚEnumr   r   ÚglobalsÚupdateÚ__members__r  r   r²   Úcompiler[   r=   rB   ÚASCIIrJ   rS   rU   r`   ra   r¡   r°   rÛ   r   r   rý   Úobjectrð   rä   r0  r?   r   rœ   rÂ   r?  r1  rZ  r   rÀ   r   r_  r   r   r   r   r   r   r   r   Ú<module>   sn    8!ÿ
	
n&^! ' U	ýýú