???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................a
    XC?hXn                     @   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 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&Z/d.d/ Z0e1e2e"ee!d0e3e2e0e(e/d0iZ4de2d1d2d3Z5de2d1d4d5Z6e1d6d7d8d9d:Z7e1d7d6d;d<d=Z8d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:

    pl = dict(
        aString = "Doodah",
        aList = ["A", "B", 12, 32.1, [1, 2, 3]],
        aFloat = 0.1,
        anInt = 728,
        aDict = dict(
            anotherString = "<hello & hi there!>",
            aUnicodeValue = "M\xe4ssig, Ma\xdf",
            aTrueValue = True,
            aFalseValue = False,
        ),
        someData = b"<binary gunk>",
        someMoreData = b"<lots of binary gunk>" * 10,
        aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())),
    )
    with open(fileName, 'wb') as fp:
        dump(pl, fp)

Parse Plist example:

    with open(fileName, 'rb') as fp:
        pl = load(fp)
    print(pl["aKey"])
)InvalidFileExceptionFMT_XML
FMT_BINARYloaddumploadsdumpsUID    N)BytesIO)ParserCreatePlistFormatzFMT_XML FMT_BINARY)modulec                   @   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 )r   c                 C   s<   t |tstd|dkr"td|dk r2t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   -/opt/alt/python39/lib64/python3.9/plistlib.py__init__E   s    
zUID.__init__c                 C   s   | j S N)r   r   r   r   r   	__index__N   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__Q   s    zUID.__repr__c                 C   s   | j | jffS r   )r   r   r   r   r   r   
__reduce__T   s    zUID.__reduce__c                 C   s   t |tstS | j|jkS r   )r   r   NotImplementedr   )r   otherr   r   r   __eq__W   s    
z
UID.__eq__c                 C   s
   t | jS r   )hashr   r   r   r   r   __hash__\   s    zUID.__hash__N)	r   
__module____qualname__r   r   r    r!   r$   r&   r   r   r   r   r   D   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binasciiZ
b2a_base64join)smaxlinelengthZ
maxbinsizepiecesichunkr   r   r   _encode_base64p   s    r7   c                 C   s(   t | trt| dS t| S d S )Nutf-8)r   strr0   Z
a2b_base64encode)r2   r   r   r   _decode_base64y   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   sL   d}t |  }g }|D ]&}|| }|d u r2 qB|t| qtj| S )NZyearZmonthZdayZhourZminutesecond)_dateParsermatch	groupdictr/   r   datetime)r2   orderZgdZlstkeyvalr   r   r   _date_from_string   s    rE   c                 C   s    d| j | j| j| j| j| jf S )Nz%04d-%02d-%02dT%02d:%02d:%02dZr<   )dr   r   r   _date_to_string   s    rG   c                 C   sZ   t | }|d u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searchr   replace)textmr   r   r   _escape   s    
rR   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      s    z_PlistParser.__init__c                 C   sB   t  | _| j| j_| j| j_| j| j_| j| j_	| j
| | jS r   )r   parserhandle_begin_elementZStartElementHandlerhandle_end_elementZEndElementHandlerhandle_dataZCharacterDataHandlerhandle_entity_declZEntityDeclHandlerZ	ParseFilerV   )r   Zfileobjr   r   r   parse   s    



z_PlistParser.parsec                 C   s   t dd S )Nz8XML entity declarations are not supported in plist files)r   )r   Zentity_nameZis_parameter_entityvaluebaseZ	system_idZ	public_idZnotation_namer   r   r   r^      s    z_PlistParser.handle_entity_declc                 C   s*   g | _ t| d| d }|d ur&|| d S )NZbegin_)r   getattr)r   elementattrshandlerr   r   r   r[      s    z!_PlistParser.handle_begin_elementc                 C   s"   t | d| d }|d ur|  d S )NZend_)rb   )r   rc   re   r   r   r   r\      s    z_PlistParser.handle_end_elementc                 C   s   | j | d S r   )r   r/   r   r   r   r   r]      s    z_PlistParser.handle_datac                 C   s   | j d u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)	rU   r   rT   typer   rZ   CurrentLineNumberrV   r/   r   r`   r   r   r   
add_object   s    
z_PlistParser.add_objectc                 C   s   d | j}g | _|S )N )r1   r   r   r   r   r   get_data   s    z_PlistParser.get_datac                 C   s"   |   }| | | j| d S r   )rW   rj   rT   r/   )r   rd   rF   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)rU   r   rZ   rh   rT   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 )Nrf   zunexpected key at line %d)rU   r   rT   rg   r   rZ   rh   rl   r   r   r   r   end_key   s
    z_PlistParser.end_keyc                 C   s   g }|  | | j| d S r   )rj   rT   r/   )r   rd   ar   r   r   begin_array   s    
z_PlistParser.begin_arrayc                 C   s   | j   d S r   )rT   rn   r   r   r   r   	end_array   s    z_PlistParser.end_arrayc                 C   s   |  d d S )NTrj   r   r   r   r   end_true   s    z_PlistParser.end_truec                 C   s   |  d d S )NFrt   r   r   r   r   	end_false   s    z_PlistParser.end_falsec                 C   s@   |   }|ds|dr.| t|d n| t| d S )NZ0xZ0X   )rl   
startswithrj   r   )r   rawr   r   r   end_integer   s    z_PlistParser.end_integerc                 C   s   |  t|   d S r   )rj   floatrl   r   r   r   r   end_real  s    z_PlistParser.end_realc                 C   s   |  |   d S r   )rj   rl   r   r   r   r   
end_string  s    z_PlistParser.end_stringc                 C   s   |  t|   d S r   )rj   r;   rl   r   r   r   r   end_data  s    z_PlistParser.end_datac                 C   s   |  t|   d S r   )rj   rE   rl   r   r   r   r   end_date  s    z_PlistParser.end_dateN)r   r'   r(   r   r_   r^   r[   r\   r]   rj   rl   rm   ro   rp   rr   rs   ru   rv   rz   r|   r}   r~   r   r   r   r   r   rS      s(   	rS   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   )filerT   _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>   )rT   r/   writelnr   r   rc   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   rT   rn   r   r   r   r   r   end_element  s    z_DumbXMLWriter.end_elementNc                 C   s8   |d ur&t |}| d|||f  n| d|  d S )Nz<%s>%s</%s>z<%s/>)rR   r   )r   rc   r`   r   r   r   simple_element$  s    z_DumbXMLWriter.simple_elementc                 C   sH   |r8t |tr|d}| j| j| j  | j| | jd d S )Nr8      
)r   r9   r:   r   writer   r   )r   liner   r   r   r   ,  s    

z_DumbXMLWriter.writeln)r	   r   )N)r   r'   r(   r   r   r   r   r   r   r   r   r   r     s
   

r   c                   @   s>   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   ZwriteHeader	sort_keysskipkeysr   r   r   r   9  s
    
z_PlistWriter.__init__c                 C   s"   |  d | | |  d d S )Nz<plist version="1.0">z</plist>)r   write_valueri   r   r   r   r   C  s    

z_PlistWriter.writec                 C   s  t |tr| d| n|du r,| d n|du r@| d nt |tr~d|  kr^dk rtn n| dd	|  nt|nt |tr| d
t| nzt |tr| | ndt |t	t
fr| | nJt |tjr| dt| n,t |ttfr| | ntdt| d S )NstringTtrueFZfalsel         r   Zintegerz%drealdatezunsupported type: %s)r   r9   r   r   OverflowErrorr{   r   dict
write_dictbytes	bytearraywrite_bytesrA   rG   tuplelistwrite_arrayr   rg   ri   r   r   r   r   H  s*    




z_PlistWriter.write_valuec                 C   sz   |  d |  jd8  _tddt| jdd| j  }t||dD ]}|rJ| | qJ|  jd7  _| 	d d S )Nr   r   rw   r)   r   s           r   )
r   r   maxr.   r   rO   r7   splitr   r   )r   r   r3   r   r   r   r   r   j  s    
z_PlistWriter.write_bytesc                 C   s   |rt|  d | jr"t| }n| }|D ]8\}}t|tsP| jrHq.td| d| | 	| q.| 
d n
| d d S )Nr   keys must be stringsrC   )r   r   sorteditemsr   r9   r   r   r   r   r   )r   rF   r   rC   r`   r   r   r   r   w  s    

z_PlistWriter.write_dictc                 C   s<   |r.|  d |D ]}| | q| 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)	r   r'   r(   r   r   r   r   r   r   r   r   r   r   r   8  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 ]N\}}|  |sNq:|D ]4}||d| }| d t| |krR  dS qRq:dS )N)s   <?xmls   <plistTr8   z	utf-16-bez	utf-16-leasciiF)rx   codecsBOM_UTF8BOM_UTF16_BEBOM_UTF16_LEdecoder:   r.   )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 r   )r   r   )r   messager   r   r   r     s    zInvalidFileException.__init__N)r   )r   r'   r(   r   r   r   r   r   r     s   r   BHLQ)r      r*      c                   @   s@   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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   )rW   rX   r   r   r   r     s    z_BinaryPlistParser.__init__c                 C   s   z~|| _ | j dtj | j d}t|dkr6t td|\}| _	}}}| j | | 
||| _tg| | _| |W S  tttjttfy   t Y n0 d S )Ni    z>6xBBQQQ)_fpseekosSEEK_ENDreadr.   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   r_     s$    


z_BinaryPlistParser.parsec                 C   sL   |dkrH| j dd d@ }d|> }dt|  }t|| j |d S |S )z$ return the size of the next object.   r   r	   r+   rL   )r   r   _BINARY_FORMATr   r   )r   tokenLrQ   r2   fr   r   r   	_get_size  s    z_BinaryPlistParser._get_sizec                    st   | j |  tv r2td| t   S rFt | krLt t fddtd| D S d S )NrL   c                 3   s&   | ]}t  ||  d V  qdS )bigN)r   
from_bytes).0r5   r   sizer   r   	<genexpr>  s   z0_BinaryPlistParser._read_ints.<locals>.<genexpr>r	   )	r   r   r   r   r   r.   r   r   r-   )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  s    z_BinaryPlistParser._read_refsc                    s
   j | }|tur|S  j| } j|  jdd }|d@ |d@  }}|dkr^d}n|dkrnd}n|dkr~d	}n~|dkrd
}nn|dkrtj jd|> d|dkd}nB|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 }n|dkr| |} j|}t||krt n|dkr |} j|}	t|	|krt |	d}n>|dkr |d } j|}	t|	|krt |	d}n|dkr*tt jd| d}n|dkrp |} |}
g }| j |< | fdd |
D  n|d!kr |} |} |}
  }| j |< z.t||
D ]\}} || |< qW n ty   t Y n0 n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	   Tr,   rw   r   r+   Zsigned"   z>fr*   #   z>d3     )Zseconds@   P   r   `   r   utf-16be      c                 3   s   | ]}  |V  qd S r   )r   )r   xr   r   r   r   F  r,   z2_BinaryPlistParser._read_object.<locals>.<genexpr>   )r   r   r   r   r   r   r   r   r   r   rA   Z	timedeltar   r.   r   r   r   r   extendrW   zipr   r   )r   refresultoffsettokenZtokenHr   r   r2   r   Zobj_refsZkey_refskor   r   r   r     s    






















z_BinaryPlistParser._read_objectN)
r   r'   r(   __doc__r   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 d S )N   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 r   )r   r   r   )r   r   r   r   r   r   r   r   o  s    z_BinaryPlistWriter.__init__c           
      C   s   g | _ i | _i | _| | t| j }dg| | _t|| _t| j | _	| j
d | j D ]}| | qZ| |}| j
 }t|}dt| |  }| j
tj|g| jR   d}||| j|||f}	| j
tjdg|	R   d S )Nr	      bplist00rL   z	>5xBBBQQQ)_objlist	_objtable_objidtable_flattenr.   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   t  s*    






z_BinaryPlistWriter.writec           	      C   s"  t |tr"t||f| jv r4d S nt|| jv r4d S t| j}| j| t |trh|| jt||f< n|| jt|< t |t	rg }g }|
 }| jrt|}|D ]6\}}t |ts| jrqtd|| || qt||D ]}| | qn&t |ttfr|D ]}| | qd S )Nr   )r   _scalarsrg   r  idr  r.   r  r/   r   r   r   r   r9   r   r   	itertoolschainr  r   r   )	r   r`   Zrefnumkeysvaluesr   r   vr   r   r   r   r    s8    





z_BinaryPlistWriter._flattenc                 C   s.   t |tr| jt||f S | jt| S d S r   )r   r  r  rg   r  r  ri   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>BBBrw   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                    st    |} j  j|< |d u r2 jd n>|du rJ jd n&|du rb jd nt|trj|dk rz jtdd| W n tj	y   t
|d Y n0 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 r6 jtdd| n0|dk r^ jd|jdddd  nt
|nt|tr jtdd| nt|tjr|tddd  } jtdd| nt|ttfr dt|  j| nrt|trlz|d} dt| W n2 tyZ   |d } d!t|d"  Y n0  j| nt|tr*|jdk rtd#n|jd	k r jtd
d$| nt|jdk rֈ jtdd%| nP|jdk r jtdd&| n,|jdk r jtdd'| nt
|nFt|ttfr fd(d)|D }t|} d*|  jtjd+ j|  g|R   nt|trhg g  }} jrt| }	n| }	|	D ]J\}
}t|
ts j rސqt!d,|"  |
 |"  | qt|} d-|  jtjd+ j|  g|R    jtjd+ j|  g|R   nt!|d S ).N    F   Tr   r	   z>Bqr  r   z>BBrw   r   z>BHr  r   z>BLr  l            z>BQr      r   r   z>Bdr   r   r   r   r   r   r   r   r   r   r   r            c                    s   g | ]}  |qS r   )r  )r   r   r   r   r   
<listcomp>$  r,   z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r   rL   r   r   )#r  r   r	  r   r   r   r   r   r
  r   r   to_bytesr{   rA   Ztotal_secondsr   r   r  r.   r9   r:   UnicodeEncodeErrorr   r   r   r   r   r  r   r   r   r   r   r   r/   )r   r`   r   r   tZrefsr2   ZkeyRefsZvalRefsZ	rootItemsr   r  r   r   r   r    s    






&
$&z _BinaryPlistWriter._write_objectN)	r   r'   r(   r   r   r  r  r  r  r   r   r   r   r   n  s   -*r   c                 C   s   | d d dkS )Nr   r  r   )r   r   r   r   _is_fmt_binaryB  s    r!  )detectrZ   writerfmtrY   c                C   sj   |du rJ|  d}| d t D ]}|d |r$|d } qVq$t nt| d }||d}|| S )zRead 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"  rZ   )rY   )r   r   _FORMATSr  r   r_   )r   r%  rY   r   infoPpr   r   r   r   X  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   )r`   r%  rY   r   r   r   r   r   n  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   )r`   r   r%  r   r   r#  r   r   r   r   v  s    r   r%  r   r   c                C   s    t  }t| ||||d | S )z?Return a bytes object with the contents for a .plist file.
    r*  )r
   r   getvalue)r`   r%  r   r   r   r   r   r   r     s    r   )r)   )9r   __all__r0   r   rA   enumior
   r  r   rer   Zxml.parsers.expatr   Enumr   r   globalsupdate__members__r   r   compilerM   r7   r;   ASCIIr>   rE   rG   rR   rS   r   r   r   r   r   r   objectr   r   r   r9   r   r{   r   r  r   r!  r   r   r   r&  r   r   r   r   r   r   r   r   <module>   sj   /!
	
n&^! ! U	