U
    »mœd3s  ã                   @   sä   d dl mZmZmZmZm	Z	 d dl
mZ d dlZd dlmZmZ d dlZd dlZd dlZd dlZdZdZdZdZd	Zd
ZdZdZdZdZdZe e ¡Z!G dd„ de"ƒZ#dd„ Z$ed fdd„Z%ddd„Z&dd„ Z'dd„ Z(dd„ Z)dS )é    )ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloatÚotRound)ÚsafeEvalN)ÚCounterÚdefaultdicti €  i @  i    é€   é@   é?   é   iÿ  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	i dfdd„Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zed:dd„ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd;d4d5„Zd6d7„ Zd8d9„ ZdS )<ÚTupleVariationc                 C   s   |  ¡ | _t|ƒ| _d S ©N)ÚcopyÚaxesÚlistÚcoordinates)Úselfr   r   © r   ú^/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/ttLib/tables/TupleVariation.pyÚ__init__&   s    
zTupleVariation.__init__c                 C   s,   d  tdd„ | j ¡ D ƒƒ¡}d|| jf S )Nú,c                 S   s   g | ]\}}d ||f ‘qS )z%s=%sr   )Ú.0ÚnameÚvaluer   r   r   Ú
<listcomp>,   s     z+TupleVariation.__repr__.<locals>.<listcomp>z<TupleVariation %s %s>)ÚjoinÚsortedr   Úitemsr   )r   r   r   r   r   Ú__repr__*   s    ÿzTupleVariation.__repr__c                 C   s   | j |j ko| j|jkS r   )r   r   )r   Úotherr   r   r   Ú__eq__0   s    zTupleVariation.__eq__c                 C   s4   d | j krtƒ S tdd„ t| j ƒD ƒƒ}|r0|S d S )Nc                 S   s   g | ]\}}|d k	r|‘qS r   r   )r   ÚiÚpr   r   r   r   7   s      z0TupleVariation.getUsedPoints.<locals>.<listcomp>)r   Ú	frozensetÚ	enumerate)r   Úusedr   r   r   ÚgetUsedPoints3   s    
zTupleVariation.getUsedPointsc                 C   s   t dd„ | jD ƒƒS )zÄReturns True if this TupleVariation has any visible impact.

        If the result is False, the TupleVariation can be omitted from the font
        without making any visible difference.
        c                 s   s   | ]}|d k	V  qd S r   r   ©r   Úcr   r   r   Ú	<genexpr>A   s     z+TupleVariation.hasImpact.<locals>.<genexpr>)Úanyr   ©r   r   r   r   Ú	hasImpact;   s    zTupleVariation.hasImpactc                 C   sš  |  d¡ | ¡  |D ] }| j |¡}|d k	r|\}}}t|dƒ}t|dƒ}||krt||krt|jd|t|dƒd� n:d|fdt|dƒfdt|dƒfd	t|dƒfg}	| d|	¡ | ¡  qd
}
t| j	ƒD ]¤\}}t
|ƒtk�rt|ƒdk�r|jd||d |d d� | ¡  d}
qÆt
|ƒtk�r>|jd||d� | ¡  d}
qÆ|d k	rÆt d¡ | d| ¡ | ¡  d}
qÆ|
�s„| d¡ | ¡  | d¡ | ¡  d S )NÚtupleç        Úcoordé   )Úaxisr   r3   Úminr   ÚmaxFé   Údeltar   é   )ÚptÚxÚyT)Úcvtr   zbad delta formatzbad delta #%dz	no deltas)ZbegintagÚnewliner   Úgetr4   r5   Z	simpletagÚfl2strr&   r   Útyper/   ÚlenÚintÚlogÚerrorÚcommentZendtag)r   ÚwriterÚaxisTagsr3   r   ÚminValueÚmaxValueÚdefaultMinValueÚdefaultMaxValueÚattrsZwrote_any_deltasr#   r7   r   r   r   ÚtoXMLC   sJ    



ü



zTupleVariation.toXMLc                 C   sø   |dkrh|d }t |d dƒ}t|dƒ}t|dƒ}t | d|¡dƒ}t | d|¡dƒ}	|||	f| j|< nŒ|dkrôd	|kr¬t|d	 ƒ}
t|d
 ƒ}t|d ƒ}||f| j|
< nHd|krØt|d ƒ}t|d ƒ}|| j|< nt dd 	t
| ¡ ƒ¡ ¡ d S )Nr1   r3   r   r2   r0   r4   r5   r7   r9   r:   r;   r<   zbad delta format: %sz, )Ústr2flr4   r5   r>   r   r   r   rC   Úwarningr   r   Úkeys)r   r   rL   Ú_contentr3   r   rJ   rK   rH   rI   Úpointr:   r;   r<   r   r   r   ÚfromXMLl   s&    

zTupleVariation.fromXMLNc           
      C   sü   t | j ¡ ƒt |ƒks*td| j ¡ |fƒ‚g }g }|d krX|  ¡ }|d krNdS |  |¡}|  |¡}| |¡}|d kr‚t}| 	|¡ |  
|¡}	|	d k	r¦|tO }| 	|	¡ |r¼|tO }| 	|¡ | 	|  ¡ ¡ d |¡}| dt dt|ƒ|¡¡ d |¡|fS )NzUnknown axis tag found.)ó    rT   rT   r   ú>HH)Úsetr   rP   ÚAssertionErrorr(   ÚcompilePointsÚcompileCoordr>   ÚEMBEDDED_PEAK_TUPLEÚappendÚcompileIntermediateCoordÚINTERMEDIATE_REGIONÚPRIVATE_POINT_NUMBERSÚcompileDeltasr   ÚinsertÚstructÚpackrA   )
r   rG   ZsharedCoordIndicesÚ	pointDataÚ	tupleDataÚauxDataZ
usedPointsr1   ÚflagsZintermediateCoordr   r   r   Úcompile‚   s8    ý







zTupleVariation.compilec              	   C   sX   t ƒ }| j}|D ]>}| |¡}|d kr2| d¡ q| t dt|d dƒ¡¡ qt|ƒS )Ns     ú>hr8   r2   )Ú	bytearrayr   r>   Úextendra   rb   Úfl2fiÚbytes)r   rG   Úresultr   r3   Ztripler   r   r   rY   ¨   s    
zTupleVariation.compileCoordc              	   C   s¸   d}|D ]D}| j  |d¡\}}}t|dƒ}t|dƒ}||ksD||krd} qNq|sVd S tƒ }	tƒ }
|D ]H}| j  |d¡\}}}|	 t dt|dƒ¡¡ |
 t dt|dƒ¡¡ qf|	|
 S )NF©r0   r0   r0   r0   Trh   r2   )	r   r>   r4   r5   ri   rj   ra   rb   rk   )r   rG   Úneededr3   rH   r   rI   rJ   rK   Z	minCoordsZ	maxCoordsr   r   r   r\   ³   s"    

z'TupleVariation.compileIntermediateCoordc              	   C   sH   i }|}| D ]2}t t d|||d … ¡d dƒ||< |d7 }q||fS )Nrh   r6   r   r2   )Úfi2flra   Úunpack)rG   ÚdataÚoffsetr1   Úposr3   r   r   r   ÚdecompileCoord_Æ   s    &
zTupleVariation.decompileCoord_c                 C   sR  | sdS t | ƒ} |  ¡  t| ƒ}tƒ }|dk r:| |¡ n | |d? dB ¡ | |d@ ¡ d}d}d}||k �rNd}t|ƒ}| d¡ d }||k �r(||k�r(| | }	|	| }
|d krÎd|
  koÈdkn  }|ræ|
dksâ|
dk ræ�q(|rö| |
¡ n| |
d? ¡ | |
d@ ¡ |	}|d7 }|d7 }qŠ|�r<|d ||< qf|d tB ||< qf|S )Nó    r
   é   éÿ   r   r   r8   )r   ÚsortrA   ri   r[   ÚPOINTS_ARE_WORDS)ÚpointsÚ	numPointsrm   ZMAX_RUN_LENGTHrt   Z	lastValueÚ	runLengthZ	headerPosZuseByteEncodingZcurValuer7   r   r   r   rX   Ï   sH    


zTupleVariation.compilePointsc                    sp  |dkst ‚|}|| }|d7 }|t@ dkrH|t@ d> || B }|d7 }|dkr\tˆ ƒ|fS g }t|ƒ|k �r|| }|d7 }|t@ d }d}	|t@ dkr®t d¡}
|d }nt d¡}
|}|
 |||| … ¡ tjdkrä|
 	¡  t|
ƒ|ksôt ‚||7 }| 
|
¡ q`g }d}|D ]}||7 }| |¡ �q|}~‡ fd	d
„|D ƒ}|�rht dd t|ƒ¡|f ¡ ||fS )zJ(numPoints, data, offset, tableTag) --> ([point1, point2, ...], newOffset)©ÚcvarÚgvarr8   r   rw   ÚHr6   ÚBÚbigc                    s$   h | ]}|d k s|ˆ krt |ƒ’qS )r   )Ústr)r   r$   ©r|   r   r   Ú	<setcomp>;  s       z2TupleVariation.decompilePoints_.<locals>.<setcomp>z#point %s out of range in '%s' tabler   )rW   rz   ÚPOINT_RUN_COUNT_MASKÚrangerA   ÚarrayÚ	frombytesÚsysÚ	byteorderÚbyteswaprj   r[   rC   rO   r   r   )r|   rr   rs   ÚtableTagrt   ZnumPointsInDatarm   Ú	runHeaderZnumPointsInRunrR   r{   Z
pointsSizeÚabsoluteÚcurrentr7   Z	badPointsr   r…   r   ÚdecompilePoints_  sR    



ÿÿzTupleVariation.decompilePoints_c                 C   sŠ   g }g }|   ¡ dkrH| jD ]*}|d kr(q| |d ¡ | |d ¡ qn | jD ]}|d kr\qN| |¡ qNtƒ }|  ||¡ |  ||¡ |S )Nr6   r   r8   )ÚgetCoordWidthr   r[   ri   ÚcompileDeltaValues_)r   ZdeltaXZdeltaYr*   Úbytearrr   r   r   r_   C  s     

zTupleVariation.compileDeltasc                 C   s~   |dkrt ƒ }d}t| ƒ}||k rz| | }|dkrBt | ||¡}qd|  krVdkrjn nt | ||¡}qt | ||¡}q|S )aê  [value1, value2, value3, ...] --> bytearray

        Emits a sequence of runs. Each run starts with a
        byte-sized header whose 6 least significant bits
        (header & 0x3F) indicate how many values are encoded
        in this run. The stored length is the actual length
        minus one; run lengths are thus in the range [1..64].
        If the header byte has its most significant bit (0x80)
        set, all values in this run are zero, and no data
        follows. Otherwise, the header byte is followed by
        ((header & 0x3F) + 1) signed values.  If (header &
        0x40) is clear, the delta values are stored as signed
        bytes; if (header & 0x40) is set, the delta values are
        signed 16-bit integers.
        Nr   é€ÿÿÿr   )ri   rA   r   ÚencodeDeltaRunAsZeroes_ÚencodeDeltaRunAsBytes_ÚencodeDeltaRunAsWords_)Údeltasr•   rt   Ú	numDeltasr   r   r   r   r”   V  s    z"TupleVariation.compileDeltaValues_c                 C   sl   |}t | ƒ}||k r*| | dkr*|d7 }q|| }|dkrR| tdB ¡ |d8 }q2|rh| t|d B ¡ |S )Nr   r8   r   r   )rA   r[   ÚDELTAS_ARE_ZERO)rš   rs   r•   rt   r›   r}   r   r   r   r—   u  s    

z&TupleVariation.encodeDeltaRunAsZeroes_c              	   C   sÞ   |}t | ƒ}||k rd| | }d|  kr0dks4qd qd|dkrZ|d |k rZ| |d  dkrZqd|d7 }q|| }|dkr®| d¡ | t d| ||d … ¡¡ |d7 }|d8 }ql|rÚ| |d ¡ | t d| ||… ¡¡ |S )Nr–   r   r   r8   r   r   Úb)rA   r[   rj   r‰   )rš   rs   r•   rt   r›   r   r}   r   r   r   r˜   ƒ  s&    	$


z%TupleVariation.encodeDeltaRunAsBytes_c                 C   s(  |}t | ƒ}||k rv| | }|dkr&qvd|  kr:dkrln n.|d |k rld| |d    krfdkrlqv nqv|d7 }q|| }|dkrÚ| tdB ¡ t d| ||d … ¡}tjdkr¾| ¡  | |¡ |d7 }|d8 }q~|�r$| t|d B ¡ t d| ||… ¡}tjdk�r| ¡  | |¡ |S )	Nr   r–   r   r8   r   r   Úhrƒ   )rA   r[   ÚDELTAS_ARE_WORDSr‰   r‹   rŒ   r�   rj   )rš   rs   r•   rt   r›   r   r}   Úar   r   r   r™   ¡  sH    	 ÿÿ

þ 
ýý





z%TupleVariation.encodeDeltaRunAsWords_c           	      C   sà   g }|}t |ƒ| k rÈ|| }|d7 }|t@ d }|t@ dkrN| dg| ¡ q|t@ dkrnt d¡}|d }nt d¡}|}| |||| … ¡ tjdkr¤| 	¡  t |ƒ|ks´t
‚||7 }| |¡ qt |ƒ| ksØt
‚||fS )z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)r8   r   rž   r6   r�   rƒ   )rA   ÚDELTA_RUN_COUNT_MASKrœ   rj   rŸ   r‰   rŠ   r‹   rŒ   r�   rW   )	r›   rr   rs   rm   rt   r�   ZnumDeltasInRunrš   Z
deltasSizer   r   r   ÚdecompileDeltas_Ï  s*    



zTupleVariation.decompileDeltas_c                 C   s8   d}| t @ dkr||d 7 }| t@ dkr4||d 7 }|S )Né   r   r6   )rZ   r]   )rf   Z	axisCountÚsizer   r   r   ÚgetTupleSize_ê  s    zTupleVariation.getTupleSize_c                 C   sb   t dd„ | jD ƒdƒ}|dkr"dS t|ƒttfkr6dS t|ƒtkrRt|ƒdkrRdS td| ƒ‚dS )zmReturn 2 if coordinates are (x, y) as in gvar, 1 if single values
        as in cvar, or 0 if empty.
        c                 s   s   | ]}|d k	r|V  qd S r   r   r)   r   r   r   r+   ÷  s      z/TupleVariation.getCoordWidth.<locals>.<genexpr>Nr   r8   r6   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)Únextr   r@   rB   Úfloatr/   rA   Ú	TypeError)r   Z
firstDeltar   r   r   r“   ó  s    ÿÿzTupleVariation.getCoordWidthc                    s0   ˆdkrd S |   ¡ ‰ ‡ ‡fdd„| jD ƒ| _d S )Ng      ð?c                    s@   g | ]8}|d krd n&ˆ dkr$|ˆ n|d ˆ |d ˆ f‘qS ©Nr8   r   r   ©r   Úd©Ú
coordWidthÚscalarr   r   r     s   üÿÿ
z.TupleVariation.scaleDeltas.<locals>.<listcomp>©r“   r   ©r   r®   r   r¬   r   ÚscaleDeltas  s    úzTupleVariation.scaleDeltasc                    s"   |   ¡ ‰ ‡ fdd„| jD ƒ| _d S )Nc                    s@   g | ]8}|d krd n&ˆ dkr$t |ƒnt |d ƒt |d ƒf‘qS r©   )r   rª   ©r­   r   r   r     s   üÿÿ
z.TupleVariation.roundDeltas.<locals>.<listcomp>r¯   r-   r   r²   r   ÚroundDeltas  s    
úzTupleVariation.roundDeltasc                 C   sj   ddl m} |  ¡ dkr tdƒ‚d | jkrft| jƒt|ƒkrVtdt| jƒt|ƒf ƒ‚|| j||ƒ| _d S )Nr   )Ú	iup_deltar8   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)ÚfontTools.varLib.iupr´   r“   r¨   r   rA   Ú
ValueError)r   Ú
origCoordsÚendPtsr´   r   r   r   ÚcalcInferredDeltas  s    
ÿÿz!TupleVariation.calcInferredDeltasç      à?Fc                 C   sÌ   ddl m} d | jkrd S || j|||d�}d |krÈ|rbtdd„ |D ƒƒrbdgd gt|ƒd   }t| j|ƒ}t| j ¡ ƒ}|  	|¡\}	}
t|	ƒt|
ƒ }| 	|¡\}	}
t|	ƒt|
ƒ }||k rÈ|j| _d S )Nr   )Úiup_delta_optimize)Ú	tolerancec                 s   s   | ]}|d kV  qd S r   r   rª   r   r   r   r+   2  s     z*TupleVariation.optimize.<locals>.<genexpr>)r   r   r8   )
rµ   r»   r   ÚallrA   r   r   r   rP   rg   )r   r·   r¸   r¼   ZisCompositer»   ZdeltaOptZvarOptrG   rd   re   ZunoptimizedLengthZoptimizedLengthr   r   r   Úoptimize(  s(    
   ÿzTupleVariation.optimizec                 C   s   |   |¡ | S r   )r±   r°   r   r   r   Ú__imul__C  s    
zTupleVariation.__imul__c              	   C   s  t |tƒstS | j}t|ƒ}|j}t|ƒ|kr6tdƒ‚|  ¡ dkrªtt|ƒ|ƒD ]V\}}|| }z(|d |d  |d |d  f||< W qP t	k
r¤   tdƒ‚Y qPX qPnVtt|ƒ|ƒD ]F\}}|| }|d k	ræ|d k	ræ|| ||< q¸|d kr¸|d k	r¸|||< q¸| S )Nz7cannot sum TupleVariation deltas with different lengthsr6   r   r8   z+cannot sum gvar deltas with inferred points)
Ú
isinstancer   ÚNotImplementedr   rA   r¶   r“   Úziprˆ   r¨   )r   r!   Zdeltas1ÚlengthZdeltas2r#   Zd2Zd1r   r   r   Ú__iadd__G  s*    
	(
zTupleVariation.__iadd__)N)rº   F)Ú__name__Ú
__module__Ú__qualname__r   r    r"   r(   r.   rM   rS   rg   rY   r\   Ústaticmethodru   rX   r’   r_   r”   r—   r˜   r™   r¢   r¥   r“   r±   r³   r¹   r¾   r¿   rÄ   r   r   r   r   r   %   sH   )&

@
2


-


r   c                 C   s2   g }t |ƒD ] }t | ||¡\}}| |¡ q|S r   )rˆ   r   ru   r[   )rG   ZsharedTupleCountrr   rs   rm   Ú_Útr   r   r   ÚdecompileSharedTuplesi  s
    rË   r8   c                 C   sN   t ƒ }|D ]}| | ¡}||  d7  < q
t| |¡dd„ d�}dd„ |D ƒS )Nr8   c                 S   s   | d  | d fS r©   r   )Úitemr   r   r   Ú<lambda>|  rT   z%compileSharedTuples.<locals>.<lambda>©Úkeyc                 S   s    g | ]}|d  d kr|d ‘qS )r8   r   r   r)   r   r   r   r   ~  s      z'compileSharedTuples.<locals>.<listcomp>)r   rY   r   Úmost_common)rG   Ú
variationsZMAX_NUM_SHARED_COORDSZ
coordCountÚvarr1   ZsharedCoordsr   r   r   ÚcompileSharedTuplesq  s    
þrÓ   Tc                    sX  ~g }g }d ‰t tƒ}| D ]:}| ¡ }	|	d kr0q||	  d7  < | |¡ | |	¡ q|} ~| sddS t| d jƒ‰t‡fdd„| D ƒƒs�tdƒ‚dd„ |D ƒ‰ t| ƒ}
g }g }|rè‡ fd	d
„}t| 	¡ |d�d ‰| ˆ ˆ ¡ |
t
O }
‡ ‡fdd„|D ƒ}t| |ƒD ]2\}}|j|||d�\}}| |¡ | |¡ �qd |¡}d |¡}|
||fS )Nr8   )r   rT   rT   r   c                 3   s   | ]}t |jƒˆ kV  qd S r   )rA   r   )r   Úv)Únr   r   r+   ›  s    z-compileTupleVariationStore.<locals>.<genexpr>z#Variation sets have different sizesc                 S   s   i | ]}|t  |¡“qS r   )r   rX   )r   ÚpointSetr   r   r   Ú
<dictcomp>Ÿ  s     z.compileTupleVariationStore.<locals>.<dictcomp>c                    s$   | d }| d }t ˆ | ƒ|d  S )Nr   r8   )rA   )ZpnrÖ   Úcount)ÚcompiledPointsr   r   rÏ   ©  s    z'compileTupleVariationStore.<locals>.keyrÎ   c                    s    g | ]}|ˆkrˆ | nd ‘qS )rT   r   )r   r{   )rÙ   ÚsharedPointsr   r   r   ´  s   ÿz.compileTupleVariationStore.<locals>.<listcomp>)rc   rT   )r	   rB   r(   r[   rA   r   r½   rW   r5   r   ÚTUPLES_SHARE_POINT_NUMBERSrÂ   rg   r   )rÑ   Ú
pointCountrG   ZsharedTupleIndicesZuseSharedPointsZnewVariationsZ
pointDatasZpointSetCountrÔ   r{   ÚtupleVariationCountZtuplesrr   rÏ   r$   Z	thisTupleZthisDatar   )rÙ   rÕ   rÚ   r   ÚcompileTupleVariationStore�  sV    
ÿ
þÿþ


rÞ   c                 C   sº   t |ƒ}g }	|t@ dkr.t |||| ¡\}
}ng }
t|t@ ƒD ]v}t d|||d … ¡\}}t ||¡}|||| … }|||| … }|	 	t
|||
| |||ƒ¡ ||7 }||7 }q>|	S )Nr   rU   r£   )rA   rÛ   r   r’   rˆ   ÚTUPLE_COUNT_MASKra   rq   r¥   r[   ÚdecompileTupleVariation_)rŽ   rG   rÝ   rÜ   ÚsharedTuplesrr   rt   ZdataPosZnumAxesrm   rÚ   rÉ   ZdataSizerf   Z	tupleSizerd   ZpointDeltaDatar   r   r   ÚdecompileTupleVariationStoreÄ  s:    
   ÿ
ùÿ
râ   c                 C   sÜ  |dkst |ƒ‚t d|dd… ¡d }d}|t@ dkrF||t@  }	nt |||¡\}	}|t@ dkrŠt |||¡\}
}t |||¡\}}nt|	ƒ\}
}i }|D ]*}|
| |	| || f}|dkrž|||< qžd}|t	@ dkrðt 
| |||¡\}}n|}d g|  }|dk�rZt t|ƒ||¡\}}t||ƒD ].\}}d|  k�rH| k �r(n n|||< �q(nx|dk�rÒt t|ƒ||¡\}}t t|ƒ||¡\}}t|||ƒD ]4\}}}d|  k�r¾| k �rœn n||f||< �qœt||ƒS )	Nr~   z>Hr6   r£   r   rn   r   r€   )rW   ra   rq   rZ   ÚTUPLE_INDEX_MASKr   ru   r]   ÚinferRegion_r^   r’   r¢   rA   rÂ   )rÜ   rá   rÚ   rŽ   rG   rr   rd   rf   rt   ÚpeakÚstartÚendr   r3   Úregionr{   rš   Z
deltas_cvtr$   r7   Zdeltas_xZdeltas_yr:   r;   r   r   r   rà   ë  sJ    
   ÿ



rà   c                 C   s@   i i  }}|   ¡ D ]$\}}t|dƒ||< t|dƒ||< q||fS )aî  Infer start and end for a (non-intermediate) region

    This helper function computes the applicability region for
    variation tuples whose INTERMEDIATE_REGION flag is not set in the
    TupleVariationHeader structure.  Variation tuples apply only to
    certain regions of the variation space; outside that region, the
    tuple has no effect.  To make the binary encoding more compact,
    TupleVariationHeaders can omit the intermediateStartTuple and
    intermediateEndTuple fields.
    r0   )r   r4   r5   )rå   ræ   rç   r3   r   r   r   r   rä     s
    
rä   )T)*ZfontTools.misc.fixedToolsr   rp   r   rk   r   r?   r   rN   r   ZfontTools.misc.textToolsr   r‰   Úcollectionsr   r	   ÚioÚloggingra   r‹   rZ   r]   r^   rœ   rŸ   r¡   rz   r‡   rÛ   rß   rã   Ú	getLoggerrÅ   rC   Úobjectr   rË   rÓ   rÞ   râ   rà   rä   r   r   r   r   Ú<module>   s@   
    H	ÿ
 ÿ
C'.