B
    ¶ôJd”  ã               @   sÊ   d dl mZ d dlmZ d dlmZ d dlZd dlZe 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G dd„ deƒZG dd„ deƒZG d d!„ d!eƒZdS )"é    )ÚtimestampNow)ÚDefaultTable)ÚreduceNzfontTools.mergec                s>   t | ƒ} t| ƒ}t|ƒ‰ t‡ fdd„|D ƒƒs:td|  ƒ‚ˆ S )Nc             3   s   | ]}|ˆ kV  qd S )N© )Ú.0Úitem)Úfirstr   úF/var/www/html/venv/lib/python3.7/site-packages/fontTools/merge/util.pyú	<genexpr>   s    zequal.<locals>.<genexpr>z"Expected all items to be equal: %s)ÚlistÚiterÚnextÚallÚAssertionError)ÚlstÚtr   )r   r	   Úequal   s
    "r   c             C   s   t t| ƒƒS )N)r   r   )r   r   r   r	   r      s    r   c             C   s   t S )N)ÚNotImplemented)r   r   r   r	   Úrecalculate   s    r   c             C   s   t ƒ S )N)r   )r   r   r   r	   Úcurrent_time   s    r   c             C   s   t tj| ƒS )N)r   ÚoperatorÚand_)r   r   r   r	   Úbitwise_and!   s    r   c             C   s   t tj| ƒS )N)r   r   Úor_)r   r   r   r	   Ú
bitwise_or$   s    r   c             C   s   t | ƒ} t| ƒt| ƒ S )N)r   ÚsumÚlen)r   r   r   r	   Úavg_int'   s    r   c                s   ‡ fdd„}|S )zÉReturns a filter func that when called with a list,
	only calls func on the non-NotImplemented items of the list,
	and only so if there's at least one item remaining.
	Otherwise returns NotImplemented.c                s   dd„ | D ƒ}|rˆ |ƒS t S )Nc             S   s   g | ]}|t k	r|‘qS r   )r   )r   r   r   r   r	   ú
<listcomp>2   s    z1onlyExisting.<locals>.wrapper.<locals>.<listcomp>)r   )r   Úitems)Úfuncr   r	   Úwrapper1   s    zonlyExisting.<locals>.wrapperr   )r    r!   r   )r    r	   ÚonlyExisting+   s    r"   c             C   s    g }x| D ]}|  |¡ q
W |S )N)Úextend)r   Úlr   r   r   r	   ÚsumLists7   s    
r%   c             C   s    i }x| D ]}|  |¡ q
W |S )N)Úupdate)r   Údr   r   r   r	   ÚsumDicts=   s    
r(   c                s   ‡ fdd„}|S )Nc                s    t | ƒ} d}xŽtˆd ƒD ]~}yˆ| }W nB tk
rl   yˆd }W n  tk
rf   td| ƒ‚Y nX Y nX d|> ‰ |‡ fdd„| D ƒƒ}|||> O }qW |S )Nr   ÚsizeÚ*zDon't know how to merge bit %sé   c             3   s   | ]}t |ˆ @ ƒV  qd S )N)Úbool)r   r   )Ú
shiftedBitr   r	   r
   Q   s    z-mergeBits.<locals>.wrapper.<locals>.<genexpr>)r   ÚrangeÚKeyErrorÚ	Exception)r   ZreturnValueZ	bitNumberZ
mergeLogicZmergedValue)Úbitmap)r-   r	   r!   E   s    zmergeBits.<locals>.wrapperr   )r1   r!   r   )r1   r	   Ú	mergeBitsC   s    r2   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚAttendanceRecordingIdentityDictzVA dictionary-like object that records indices of items actually accessed
	from a list.c             C   s&   || _ dd„ t|ƒD ƒ| _tƒ | _d S )Nc             S   s   i | ]\}}|t |ƒ“qS r   )Úid)r   ÚiÚvr   r   r	   ú
<dictcomp>^   s    z<AttendanceRecordingIdentityDict.__init__.<locals>.<dictcomp>)r$   Ú	enumerater'   ÚsetÚs)Úselfr   r   r   r	   Ú__init__\   s    z(AttendanceRecordingIdentityDict.__init__c             C   s   | j  | jt|ƒ ¡ |S )N)r:   Úaddr'   r4   )r;   r6   r   r   r	   Ú__getitem__a   s    z+AttendanceRecordingIdentityDict.__getitem__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   r>   r   r   r   r	   r3   X   s   r3   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚGregariousIdentityDictzoA dictionary-like object that welcomes guests without reservations and
	adds them to the end of the guest list.c             C   s   || _ tdd„ |D ƒƒ| _d S )Nc             s   s   | ]}t |ƒV  qd S )N)r4   )r   r6   r   r   r	   r
   k   s    z2GregariousIdentityDict.__init__.<locals>.<genexpr>)r$   r9   r:   )r;   r   r   r   r	   r<   i   s    zGregariousIdentityDict.__init__c             C   s.   t |ƒ| jkr*| j t |ƒ¡ | j |¡ |S )N)r4   r:   r=   r$   Úappend)r;   r6   r   r   r	   r>   m   s    z"GregariousIdentityDict.__getitem__N)r?   r@   rA   rB   r<   r>   r   r   r   r	   rC   e   s   rC   c               @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚNonhashableDictz3A dictionary-like object mapping objects to values.Nc             C   s8   |d krdd„ t |ƒD ƒ| _ndd„ t||ƒD ƒ| _d S )Nc             S   s   i | ]\}}|t |ƒ“qS r   )r4   )r   r5   r6   r   r   r	   r7   x   s    z,NonhashableDict.__init__.<locals>.<dictcomp>c             S   s   i | ]\}}|t |ƒ“qS r   )r4   )r   Úkr6   r   r   r	   r7   z   s    )r8   r'   Úzip)r;   ÚkeysÚvaluesr   r   r	   r<   v   s    zNonhashableDict.__init__c             C   s   | j t|ƒ S )N)r'   r4   )r;   rF   r   r   r	   r>   |   s    zNonhashableDict.__getitem__c             C   s   || j t|ƒ< d S )N)r'   r4   )r;   rF   r6   r   r   r	   Ú__setitem__   s    zNonhashableDict.__setitem__c             C   s   | j t|ƒ= d S )N)r'   r4   )r;   rF   r   r   r	   Ú__delitem__‚   s    zNonhashableDict.__delitem__)N)r?   r@   rA   rB   r<   r>   rJ   rK   r   r   r   r	   rE   s   s
   
rE   )ZfontTools.misc.timeToolsr   Z#fontTools.ttLib.tables.DefaultTabler   Ú	functoolsr   r   ÚloggingÚ	getLoggerÚlogr   r   r   r   r   r   r   r"   r%   r(   r2   Úobjectr3   rC   rE   r   r   r   r	   Ú<module>   s&   
