B
    u9at                 @   s*  d ddddddddd	d
dg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Zddl	Z	ddl
Z
ddlZddlmZ ddlmZ ejddedZe ej ejdd Zdd  Zdd Zdd Zdd ZG dd dZdZe
dZdId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/d0 Z*G d1d de+Z,d2d3d4d5d6Z-e. Z/G d7d8 d8Z0d9d: Z1e2e3e4eje5fZ6G d;d< d<e.Z7d=d> Z8e9e:e*e'e)d?e;e:e8e0e7d?iZ<dd@e:dAdBdZ=dd@e:dAdCd
Z>e9d@dDdEdFd	Z?e9dDd@dGdHdZ@dS )J	readPlist
writePlistreadPlistFromByteswritePlistToBytesDataInvalidFileExceptionFMT_XML
FMT_BINARYloaddumploadsdumps    N)BytesIO)warn)ParserCreatePlistFormatzFMT_XML FMT_BINARY)modulec          	   c   s2   t | tr(t| |}|V  W d Q R X n| V  d S )N)
isinstancestropen)
pathOrFilemodefp r   /usr/lib/python3.7/plistlib.py_maybe_openO   s    
r   c          	   C   s0   t dtd t| d}t|d ddS Q R X d S )Nz8The readPlist function is deprecated, use load() instead   rbF)fmtuse_builtin_types)r   DeprecationWarningr   r	   )r   r   r   r   r   r   Y   s    c          	   C   s8   t dtd t|d}t| |tddd W d Q R X d S )Nz9The writePlist function is deprecated, use dump() insteadr   wbTF)r   	sort_keysskipkeys)r   r    r   r
   r   )valuer   r   r   r   r   r   f   s    c             C   s   t dtd tt| d ddS )NzBThe readPlistFromBytes function is deprecated, use loads() insteadr   F)r   r   )r   r    r	   r   )datar   r   r   r   s   s    c             C   s,   t dtd t }t| |tddd | S )NzAThe writePlistToBytes function is deprecated, use dumps() insteadr   TF)r   r"   r#   )r   r    r   r
   r   getvalue)r$   fr   r   r   r   ~   s
    c               @   s:   e Zd Zdd Zedd ZdddZdd	 Zd
d ZdS )r   c             C   s   t |tstd|| _d S )Nzdata must be as bytes)r   bytes	TypeErrorr%   )selfr%   r   r   r   __init__   s    
zData.__init__c             C   s   | t |S )N)_decode_base64)clsr%   r   r   r   
fromBase64   s    zData.fromBase64L   c             C   s   t | j|S )N)_encode_base64r%   )r*   maxlinelengthr   r   r   asBase64   s    zData.asBase64c             C   s4   t || jr| j|jkS t |tr,| j|kS tS d S )N)r   	__class__r%   r(   NotImplemented)r*   otherr   r   r   __eq__   s
    

zData.__eq__c             C   s   d| j jt| jf S )Nz%s(%s))r3   __name__reprr%   )r*   r   r   r   __repr__   s    zData.__repr__N)r/   )	r7   
__module____qualname__r+   classmethodr.   r2   r6   r9   r   r   r   r   r      s
   
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]r/   c             C   sT   |d d }g }x8t dt| |D ]$}| |||  }|t| q"W d|S )N      r       )rangelenappendbinasciiZ
b2a_base64join)sr1   Z
maxbinsizepiecesichunkr   r   r   r0      s    r0   c             C   s(   t | trt| dS t| S d S )Nzutf-8)r   r   rC   Z
a2b_base64encode)rE   r   r   r   r,      s    
r,   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   sN   d}t |  }g }x,|D ]$}|| }|d kr2P |t| qW tj| S )N)yearmonthdayhourminutesecond)_dateParsermatch	groupdictrB   intdatetime)rE   ordergdZlstkeyvalr   r   r   _date_from_string   s    
rY   c             C   s    d| j | j| j| j| j| jf S )Nz%04d-%02d-%02dT%02d:%02d:%02dZ)rJ   rK   rL   rM   rN   rO   )dr   r   r   _date_to_string   s    r[   c             C   sZ   t | }|d k	rtd| dd} | dd} | dd} | dd} | d	d
} | S )Nz<strings can't contains control characters; use bytes insteadz

&z&amp;<z&lt;>z&gt;)_controlCharPatsearch
ValueErrorreplace)textmr   r   r   _escape   s    
rg   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'S )(_PlistParserc             C   s"   g | _ d | _d | _|| _|| _d S )N)stackcurrent_keyroot_use_builtin_types
_dict_type)r*   r   	dict_typer   r   r   r+      s
    z_PlistParser.__init__c             C   s8   t  | _| j| j_| j| j_| j| j_| j| | j	S )N)
r   parserhandle_begin_elementZStartElementHandlerhandle_end_elementZEndElementHandlerhandle_dataZCharacterDataHandlerZ	ParseFilerk   )r*   Zfileobjr   r   r   parse   s    


z_PlistParser.parsec             C   s*   g | _ t| d| d }|d k	r&|| d S )NZbegin_)r%   getattr)r*   elementattrshandlerr   r   r   rp     s    z!_PlistParser.handle_begin_elementc             C   s"   t | d| d }|d k	r|  d S )NZend_)rt   )r*   ru   rw   r   r   r   rq     s    z_PlistParser.handle_end_elementc             C   s   | j | d S )N)r%   rB   )r*   r%   r   r   r   rr     s    z_PlistParser.handle_datac             C   s   | j d k	rFt| jd ti s.td| jj || jd | j < d | _ nB| jsT|| _n4t| jd tg sxtd| jj | jd | d S )Nzunexpected element at line %d)	rj   r   ri   typerc   ro   CurrentLineNumberrk   rB   )r*   r$   r   r   r   
add_object  s    
z_PlistParser.add_objectc             C   s   d | j}g | _|S )N )rD   r%   )r*   r%   r   r   r   get_data%  s    z_PlistParser.get_datac             C   s"   |   }| | | j| d S )N)rm   r{   ri   rB   )r*   rv   rZ   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)rj   rc   ro   rz   ri   pop)r*   r   r   r   end_dict1  s    z_PlistParser.end_dictc             C   s8   | j st| jd ti s*td| jj |  | _ d S )Nrx   zunexpected key at line %d)rj   r   ri   ry   rc   ro   rz   r}   )r*   r   r   r   end_key7  s    z_PlistParser.end_keyc             C   s   g }|  | | j| d S )N)r{   ri   rB   )r*   rv   ar   r   r   begin_array=  s    
z_PlistParser.begin_arrayc             C   s   | j   d S )N)ri   r   )r*   r   r   r   	end_arrayB  s    z_PlistParser.end_arrayc             C   s   |  d d S )NT)r{   )r*   r   r   r   end_trueE  s    z_PlistParser.end_truec             C   s   |  d d S )NF)r{   )r*   r   r   r   	end_falseH  s    z_PlistParser.end_falsec             C   s   |  t|   d S )N)r{   rS   r}   )r*   r   r   r   end_integerK  s    z_PlistParser.end_integerc             C   s   |  t|   d S )N)r{   floatr}   )r*   r   r   r   end_realN  s    z_PlistParser.end_realc             C   s   |  |   d S )N)r{   r}   )r*   r   r   r   
end_stringQ  s    z_PlistParser.end_stringc             C   s2   | j r| t|   n| t|   d S )N)rl   r{   r,   r}   r   r.   )r*   r   r   r   end_dataT  s    z_PlistParser.end_datac             C   s   |  t|   d S )N)r{   rY   r}   )r*   r   r   r   end_date[  s    z_PlistParser.end_dateN)r7   r:   r;   r+   rs   rp   rq   rr   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rh      s&   rh   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 )N)fileri   _indent_levelindent)r*   r   indent_levelr   r   r   r   r+   `  s    z_DumbXMLWriter.__init__c             C   s,   | j | | d|  |  jd7  _d S )Nz<%s>   )ri   rB   writelnr   )r*   ru   r   r   r   begin_elementf  s    z_DumbXMLWriter.begin_elementc             C   s    |  j d8  _ | d|  d S )Nr   z</%s>)r   r   )r*   ru   r   r   r   end_elementk  s    z_DumbXMLWriter.end_elementNc             C   s8   |d k	r&t |}| d|||f  n| d|  d S )Nz<%s>%s</%s>z<%s/>)rg   r   )r*   ru   r$   r   r   r   simple_elementq  s    z_DumbXMLWriter.simple_elementc             C   sH   |r8t |tr|d}| j| j| j  | j| | jd d S )Nzutf-8   
)r   r   rI   r   writer   r   )r*   liner   r   r   r   y  s    

z_DumbXMLWriter.writeln)r   r   )N)r7   r:   r;   r+   r   r   r   r   r   r   r   r   r   _  s
   

r   c               @   sF   e Zd ZdddZ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 )N)r   PLISTHEADERr   r+   
_sort_keys	_skipkeys)r*   r   r   r   ZwriteHeaderr"   r#   r   r   r   r+     s
    
z_PlistWriter.__init__c             C   s"   |  d | | |  d d S )Nz<plist version="1.0">z</plist>)r   write_value)r*   r$   r   r   r   r     s    

z_PlistWriter.writec             C   s4  t |tr| d| n|dkr0| d n |dkrD| d nt |trd|  krbdk rxn n| dd	|  nt|nt |tr| d
t| nt |tr| | n|t |t	r| 
| nft |ttfr| | nLt |tjr| dt| n,t |ttfr | | ntdt| d S )NstringTtrueFZfalsel         l            Zintegerz%drealZdatezunsupported type: %s)r   r   r   rS   OverflowErrorr   r8   dict
write_dictr   
write_datar(   	bytearraywrite_bytesrT   r[   tuplelistwrite_arrayr)   ry   )r*   r$   r   r   r   r     s.    





z_PlistWriter.write_valuec             C   s   |  |j d S )N)r   r%   )r*   r%   r   r   r   r     s    z_PlistWriter.write_datac             C   s~   |  d |  jd8  _tddt| jdd| j  }x&t||dD ]}|rL| | qLW |  jd7  _| 	d d S )Nr%   r      r/   r   s           r   )
r   r   maxrA   r   rd   r0   splitr   r   )r*   r%   r1   r   r   r   r   r     s    
z_PlistWriter.write_bytesc             C   s   |rx|  d | jr"t| }n| }x@|D ]8\}}t|tsR| jrJq0td| d| | 	| q0W | 
d n
| d d S )Nr   zkeys must be stringsrW   )r   r   sorteditemsr   r   r   r)   r   r   r   )r*   rZ   r   rW   r$   r   r   r   r     s    

z_PlistWriter.write_dictc             C   s@   |r2|  d x|D ]}| | qW | d n
| d d S )Narray)r   r   r   r   )r*   r   r$   r   r   r   r     s    

z_PlistWriter.write_arrayN)r   r   r   TF)
r7   r:   r;   r+   r   r   r   r   r   r   r   r   r   r   r     s    
%r   c             C   s   d}x|D ]}|  |r
dS q
W xntjdftjdftjdffD ]N\}}|  |sRq>x8|D ]0}||d| }| d t| |krXdS qXW q>W dS )N)s   <?xmls   <plistTzutf-8z	utf-16-bez	utf-16-leasciiF)
startswithcodecsBOM_UTF8BOM_UTF16_BEBOM_UTF16_LEdecoderI   rA   )headerprefixesZpfxZ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 )N)rc   r+   )r*   messager   r   r   r+     s    zInvalidFileException.__init__N)r   )r7   r:   r;   r+   r   r   r   r   r   
  s   BHLQ)r   r   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S )_BinaryPlistParserc             C   s   || _ || _d S )N)rl   rm   )r*   r   rn   r   r   r   r+     s    z_BinaryPlistParser.__init__c             C   s   y||| _ | j dtj | j d}t|dkr6t td|\}| _	}}}| j | | 
||| _tg| | _| |S  tttjttfk
r   t Y nX d S )Ni    z>6xBBQQQ)_fpseekosSEEK_ENDreadrA   r   structunpack	_ref_size
_read_ints_object_offsets
_undefined_objects_read_objectOSError
IndexErrorerrorr   UnicodeDecodeError)r*   r   traileroffset_sizenum_objects
top_objectoffset_table_offsetr   r   r   rs     s    
z_BinaryPlistParser.parsec             C   sL   |dkrH| j dd d@ }d|> }dt|  }t|| j |d S |S )N   r   r   r>   r`   )r   r   _BINARY_FORMATr   r   )r*   tokenLrf   rE   r'   r   r   r   	_get_size7  s    z_BinaryPlistParser._get_sizec                sr   | j |  tkr0tdt |   S rDt | krJt t fddtd| D S d S )Nr`   c             3   s&   | ]}t  ||  d V  qdS )bigN)rS   
from_bytes).0rG   )r%   sizer   r   	<genexpr>H  s   z0_BinaryPlistParser._read_ints.<locals>.<genexpr>r   )	r   r   r   r   r   rA   r   r   r@   )r*   nr   r   )r%   r   r   r   A  s    z_BinaryPlistParser._read_intsc             C   s   |  || jS )N)r   r   )r*   r   r   r   r   
_read_refsK  s    z_BinaryPlistParser._read_refsc                s   j | }|tk	r|S  j| } j|  jdd }|d@ |d@  }}|dkr^d }n2|dkrnd}n"|dkr~d}n|dkrd	}n|d
krtj jd|> d|dkd}n|dkrt	d jdd }n|dkrt	d jdd }n|dkrDt	d jdd }t

dddt
j|d }nL|dkr |} jrn j|}nt j|}n|dkr |} j|d}|}n|dkrڈ |} j|d d}n|dkr  |} |}	g }| j |< | fdd|	D  np|dkr |} |}
 |}	  }| j |< x4t|
|	D ]\}} || |< qfW nt | j |< |S ) Nr   r      r   r   F	   Tr?   r   r   r>   )signed"   z>fr=   #   z>d3   i  )Zseconds@   P   r   `   r   zutf-16be   c             3   s   | ]}  |V  qd S )N)r   )r   x)r*   r   r   r     s    z2_BinaryPlistParser._read_object.<locals>.<genexpr>   )r   r   r   r   r   r   rS   r   r   r   rT   Z	timedeltar   rl   r   r   r   extendrm   zipr   r   )r*   refresultoffsettokenZtokenHr   r'   rE   Zobj_refsZkey_refskor   )r*   r   r   N  sn    



















z_BinaryPlistParser._read_objectN)	r7   r:   r;   r+   rs   r   r   r   r   r   r   r   r   r     s   

r   c             C   s0   | dk rdS | dk rdS | d> d> r(dS dS d S )N   r   i   r   r   r=   r   r   )countr   r   r   _count_to_size  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S )_BinaryPlistWriterc             C   s   || _ || _|| _d S )N)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 x| j D ]}| | q\W | |}| j
 }t|}dt| |  }| j
tj|f| j  d}||| j|||f}	| j
tjd|	  d S )Nr   s   bplist00r`   	>5xBBBQQQ)r  )_objlist	_objtable_objidtable_flattenrA   r   r   r   r   _ref_formatr   r   _write_object
_getrefnumtellr   pack)
r*   r$   r   objr   r   r   Zoffset_formatZsort_versionr   r   r   r   r     s(    





z_BinaryPlistWriter.writec       	      C   s~  t |tr"t||f| jkrZd S n8t |trHt|j|jf| jkrZd S nt|| jkrZd S t| j	}| j	
| t |tr|| jt||f< n0t |tr|| jt|j|jf< n|| jt|< t |trPg }g }| }| jrt|}xB|D ]:\}}t |ts| jrqtd|
| |
| qW xLt||D ]}| | q:W n*t |ttfrzx|D ]}| | qfW d S )Nzkeys must be strings)r   _scalarsry   r  r   r%   idr  rA   r  rB   r   r   r   r   r   r   r)   	itertoolschainr  r   r   )	r*   r$   Zrefnumkeysvaluesr   r   vr   r   r   r   r    sB    






z_BinaryPlistWriter._flattenc             C   sN   t |tr| jt||f S t |tr<| jt|j|jf S | jt| S d S )N)r   r  r  ry   r   r%   r  r  )r*   r$   r   r   r   r	    s
    

z_BinaryPlistWriter._getrefnumc             C   s   |dk r"| j td||B  n|dk rH| j td|dB d| nh|dk rn| j td|dB d| nB|d	k r| j td
|dB d| n| j td|dB d| d S )Nr   z>Br   z>BBBr   i   z>BBH   l        z>BBL   z>BBQ   )r   r   r   r  )r*   r   r   r   r   r   _write_size&  s    z_BinaryPlistWriter._write_sizec                s    |} j  j|< |d kr2 jd n|dkrJ jd n|dkrb jd nt|trl|dk ry jtdd| W n  tj	k
r   t
|d Y nX n|d	k rԈ jtd
d| n|dk r jtdd| nt|dk r jtdd| nR|dk r8 jtdd| n0|dk r` jd|jdddd  nt
|nxt|tr jtdd| nRt|tjr|tddd  } jtdd| nt|tr  dt|j  j|j nt|ttfr0 dt|  j| nt|try|d} dt| W n4 tk
r   |d } d!t|d"  Y nX  j| nDt|ttfr fd#d$|D }t|} d%|  jtjd& j|  f|  nt|trg g  }} jr&t| }	n| }	xR|	D ]J\}
}t|
ts\ jrTq4t d'|!  |
 |!  | q4W t|} d(|  jtjd& j|  f|   jtjd& j|  f|  nt |d S ))N    F   Tr   r   z>Bqr  r   z>BBr   i   z>BHr  l        z>BLr  l            z>BQl               r   )r   z>Bdr   i  r   r   r   r   r   zutf-16ber   r   c                s   g | ]}  |qS r   )r	  )r   r   )r*   r   r   
<listcomp>o  s    z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r   r`   zkeys must be stringsr   )"r	  r   r
  r   r   r   rS   r   r  r   r   to_bytesr   rT   Ztotal_secondsr   r  rA   r%   r(   r   r   rI   UnicodeEncodeErrorr   r   r  r   r   r   r   r   r)   rB   )r*   r$   r   r'   tZrefsrE   ZkeyRefsZvalRefsZ	rootItemsr   r  r   )r*   r   r  6  s    





$
"$z _BinaryPlistWriter._write_objectN)	r7   r:   r;   r+   r   r  r	  r  r  r   r   r   r   r    s   -0r  c             C   s   | d d dkS )Nr   s   bplist00r   )r   r   r   r   _is_fmt_binary  s    r  )detectro   writerT)r   r   rn   c            C   sn   |d krL|  d}| d x:t D ]}|d |r&|d }P q&W t nt| d }|||d}|| S )Nr   r   r   ro   )r   rn   )r   r   _FORMATSr  r   rs   )r   r   r   rn   r   infoPpr   r   r   r	     s    

c            C   s   t | }t||||dS )N)r   r   rn   )r   r	   )r$   r   r   rn   r   r   r   r   r     s    F)r   r"   r#   c            C   s:   |t krtd|f t | d |||d}||  d S )NzUnsupported format: %rr!  )r"   r#   )r"  rc   r   )r$   r   r   r"   r#   r!  r   r   r   r
     s    )r   r#   r"   c            C   s    t  }t| ||||d | S )N)r   r#   r"   )r   r
   r&   )r$   r   r#   r"   r   r   r   r   r     s    )r/   )A__all__rC   r   
contextlibrT   enumior   r  r   rer   warningsr   Zxml.parsers.expatr   Enumr7   r   globalsupdate__members__contextmanagerr   r   r   r   r   r   r   compilera   r0   r,   ASCIIrP   rY   r[   rg   rh   r   r   r   rc   r   r   objectr   r   r   r   rS   r   r(   r  r  r  r   r   r   r"  r	   r   r
   r   r   r   r   r   <module>1   sr   

0
	
h&d!  S	
	