U
    #vhh{                    @   s(  d Z ddlZddlmZ ddlmZ ddlmZ ddlZddl	m
Z
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z,m-Z.m/Z0m1Z2 ddl3m4Z4m5Z5 ddl6Z6ddl7Z7ddl8Z8ddl9Z9ddlm:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@ e<rnddlAmBZB e6CeDZEG dd de:ZFedddddgZGeGeFjHdddeGeFjIdddeGeFjJdd deGeFjKd!ddeGeFjLd!ddeGeFjMdd"deGeFjNdd deGeFjOdddeGeFjPdddd#	ZQd$d% d&d% d'd% d(d% d)ZRd*d% d+d% d,d% d-d% d)ZSd.d/ ZTd0d1 ZUG d2d3 d3ZVG d4d5 d5ZWG d6d7 d7eXZYG d8d9 d9eXZZG d:d; d;eXZ[G d<d= d=e[Z\G d>d? d?e[Z]G d@dA dAeXZ^G dBdC dCe[Z_G dDdE dEe[Z`G dFdG dGe%ZaG dHdI dIeaZbG dJdK dKeaZcG dLdM dMeaZdG dNdO dOe&ZedPZfG dQdR dRe)dSZgG dTdU dUe%ZhG dVdW dWe%ZiG dXdY dYe&ZjG dZd[ d[e&ZkG d\d] d]e&ZlG d^d_ d_e&ZmG d`da dae&ZnG dbdc dce%ZoG ddde dee%ZpG dfdg dge%ZqG dhdi die%ZrG djdk dkeZsG dldm dme)dSZtG dndo doe)dSZuG dpdq dqeZvG drds dseZwG dtdu dueZxG dvdw dwe)dSZydxdydzd{d|d}d~dddddddddZzdd Z{dd Z|dd Z}dd Z~dd Zdd Ze|e}e~deeddZdd Zdd Ze  dd ZdS )zfontTools.ttLib.tables.otTables -- A collection of classes representing the various
OpenType subtables.

Most are constructed upon import from data in otData.py, all are populated with
converter objects from otConverters.py.
    N)IntEnum)reduce)radians)defaultdict
namedtuple)OPTIMIZE_FONT_SPEED)TupleVariation)dfs_base_table)quantizeRect)otRound)	TransformIdentityDecomposedTransform)	bytesjoinpadsafeEval)Vector)ControlBoundsPen)TransformPen   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloat)LookupDebugInfoLOOKUP_DEBUG_INFO_KEY)IntFlag)TYPE_CHECKINGIteratorListOptionalSet)_TTGlyphSetc                   @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )VarComponentFlagsr                   @         i                 @  l      N)__name__
__module____qualname__RESET_UNSPECIFIED_AXES	HAVE_AXESAXIS_VALUES_HAVE_VARIATIONTRANSFORM_HAS_VARIATIONHAVE_TRANSLATE_XHAVE_TRANSLATE_YHAVE_ROTATIONHAVE_CONDITIONHAVE_SCALE_XHAVE_SCALE_YHAVE_TCENTER_XHAVE_TCENTER_YGID_IS_24BITHAVE_SKEW_XHAVE_SKEW_YRESERVED_MASK rI   rI   C/tmp/pip-unpacked-wheel-1ufboor8/fontTools/ttLib/tables/otTables.pyr(   4   s    r(   VarTransformMappingValuesflagfractionalBitsscaledefaultValue      
   iL)	Z
translateXZ
translateYZrotationscaleXscaleYZskewXZskewYZtCenterXZtCenterYc                 C   s   t d| S )N>BstructpackvrI   rI   rJ   <lambda>f       r[   c                 C   s   t d| S )N>HrV   rY   rI   rI   rJ   r[   g   r\   c                 C   s   t d| dd  S )N>Lr   rV   rY   rI   rI   rJ   r[   h   r\   c                 C   s   t d| S )Nr^   rV   rY   rI   rI   rJ   r[   i   r\   )r   r)      r*   c                 C   s   t d| d S )NrU   r   rW   unpackrY   rI   rI   rJ   r[   l   r\   c                 C   s   t d| d S )Nr]   r   r`   rY   rI   rI   rJ   r[   m   r\   c                 C   s   t dd|  d S )Nr^       r   r`   rY   rI   rI   rJ   r[   n   r\   c                 C   s   t d| d S )Nr^   r   r`   rY   rI   rI   rJ   r[   o   r\   c                 C   s  | | }|dk r||d fS |dk rD|d d> | |d  B |d fS |dk r||d d> | |d  d> B | |d  B |d fS |d	k r|d d
> | |d  d> B | |d  d> B | |d  B |d fS |d	 d> | |d  d
> B | |d  d> B | |d  d> B | |d  B |d fS dS )zlRead a variable-length number from data starting at index i.

    Return the number and the next index.
    r/   r      r+   r)      r,   r_         r*   r-      NrI   )dataiZb0rI   rI   rJ   _read_uint32vars   s,     0,,
rj   c                 C   s   | dk rt d| S | dk r,t d| dB S | dk rLt d| dB d	d
 S | dk rdt d| dB S t ddt d|  S d
S )z:Write a variable-length number.

    Return the data.
    r/   rU   r5   r]      i    r^   i   r   Ni   l      @ re   rV   rY   rI   rI   rJ   _write_uint32var   s    rl   c                   @   sV   e Zd Zd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d ZdS )VarComponentc                 C   s   |    d S N)populateDefaultsselfrI   rI   rJ   __init__   s    zVarComponent.__init__Nc                 C   s6   d| _ d | _d | _d | _d| _t| _t| _t | _	d S )Nr   rI   )
flags	glyphNameconditionIndexaxisIndicesIndex
axisValuesNO_VARIATION_INDEXaxisValuesVarIndextransformVarIndexr   	transformrq   Z
propagatorrI   rI   rJ   ro      s    zVarComponent.populateDefaultsc                    s  dt  \| _| jtj@ r(dnd}t|  |  }|7 |j| | _tj@ rrt  \| _tj	@ rt  \| _
nd | _
| j
d krd}n|d j| j
 }t|}tj	@ rt| \}tdd |D | _nd| _t| j|ksttj@ r&t  \| _nt| _tj@ rJt  \| _nt| _t | _ fdd	}	t D ] \}
}|	|}t| j|
| qptj@ s| jj| j_tj@ }|rt  \}||d
 M }q d  S )Nr   r_   r)   ZAxisIndicesListc                 s   s   | ]}t |d V  qdS    N)fi2fl.0rZ   rI   rI   rJ   	<genexpr>   s     z)VarComponent.decompile.<locals>.<genexpr>rI   c                    sJ   | j @ r@ttd d  d | j| j }d7 |S | jS d S )N>hr)   r   )rL   r   rW   ra   rM   rN   rO   valuesrZ   rh   rs   ri   rI   rJ   read_transform_component   s    
 z8VarComponent.decompile.<locals>.read_transform_componentr   ) rj   rs   r(   rE   	_unpacker
glyphOrderrt   r@   ru   r:   rv   ZItemlenr   ZdecompileDeltas_tuplerw   AssertionErrorr;   ry   rx   r<   rz   r   r{   VAR_TRANSFORM_MAPPINGitemssetattrrB   rS   rT   rH   )rq   rh   font
localStateZgidSizeglyphIDnumAxesZaxisIndicesrw   r   	attr_namemapping_valuesvaluen_rI   r   rJ   	decompile   sN    




zVarComponent.decompilec           
         s  |j t }g }| j || j}|dkrF tjO  |td | n tj M  |td | | j	d k	r tj
O  |t| j	 t| j}|rԈ tjO  |t| j |tjdd | jD | d n tj M  | jtkr tjO  |t| j n tj M  | jtkr< tjO  |t| j n tj M   fdd}t D ]&\}}t| j|}	|||	| q\t t| S )	N  r_   r)   c                 S   s   g | ]}t |d qS r~   )fl2fir   rI   rI   rJ   
<listcomp>	  s     z(VarComponent.compile.<locals>.<listcomp>)ZoptimizeSizec                    s,    |j @ r$tdt| |j |jS dS d S )Nr   r\   )rL   rW   rX   r   rN   rM   )r   r   rs   rI   rJ   write_transform_component  s    
 z7VarComponent.compile.<locals>.write_transform_component)cfgr   rs   
getGlyphIDrt   r(   rE   append_packerru   r@   rl   r   rw   r:   rv   r   ZcompileDeltaValues_ry   rx   r;   rz   r<   r   r   getattrr{   r   )
rq   r   ZoptimizeSpeedrh   r   r   r   r   r   r   rI   r   rJ   compile   sH    







zVarComponent.compilec                    s    d|    d fdd	}|d| j | jd k	rD|d| j | jd k	rZ|d| j | jd k	sp| jtj@ r| jtj@ rd}nd}|d	d
d | jD | | j	t
kr|d| j	 | jt
kr|d| j t D ]4\}}| j|j@ sqt| j|}||t||j q҈ d    d S )Nrm   rI   c                    s*   |d k	r&  | d|ff|     d S )Nr   )	simpletagnewline)namer   attrswriterrI   rJ   write-  s    z!VarComponent.toXML.<locals>.writert   ru   rv   ))resetUnspecifiedAxesr   rw   c                 S   s   g | ]}t t|d qS r   )floatfl2strr   rI   rI   rJ   r   @  s     z&VarComponent.toXML.<locals>.<listcomp>ry   rz   )rI   )begintagr   rt   ru   rv   rs   r(   r9   rw   ry   rx   rz   r   r   rL   r   r{   r   rM   endtag)rq   r   ttFontr   r   r   mappingrZ   rI   r   rJ   toXML)  s6    





zVarComponent.toXMLc                 C   s  dd |D }|    |D ]\}}}|r,t|d }|dkrD|| _q|dkrXt|| _q|dkrlt|| _q|dkrtdd	 t|D | _t|d
dr|  j	t
jO  _	q|dkrt|| _q|dkrt|| _q|tkrt| j|t| |  j	t| jO  _	qdst|qd S )Nc                 S   s   g | ]}t |tr|qS rI   
isinstancer   r   crI   rI   rJ   r   S  s     
 z(VarComponent.fromXML.<locals>.<listcomp>r   rt   ru   rv   rw   c                 s   s   | ]}t |d V  qdS r}   )str2flr   rI   rI   rJ   r   b  s     z'VarComponent.fromXML.<locals>.<genexpr>r   0ry   rz   F)ro   r   rt   r   ru   rv   r   rw   getrs   r(   r9   ry   rz   r   r   r{   rL   )rq   r   r   contentr   rZ   rI   rI   rJ   fromXMLR  s6    
zVarComponent.fromXMLc                    s   d fdd}t  D ]*\}}||}tj|tj||  qjtj@ s`jjj_	t
 ks|tt
 fd S )Nr   c                    s6   j | j@ r.t  | j| j }d7 |S dS d S )Nr   r   )rs   rL   r   rM   rN   r   deltasri   rq   rI   rJ   read_transform_component_deltav  s
    zIVarComponent.applyTransformDeltas.<locals>.read_transform_component_delta)r   r   r   r{   r   rs   r(   rB   rS   rT   r   r   )rq   r   r   r   r   r   rI   r   rJ   applyTransformDeltass  s    	  z!VarComponent.applyTransformDeltasc                 C   s    t | t |krtS | j|jkS rn   )typeNotImplemented__dict__)rq   otherrI   rI   rJ   __eq__  s    zVarComponent.__eq__c                 C   s   |  |}|tkr|S | S rn   )r   r   )rq   r   resultrI   rI   rJ   __ne__  s    
zVarComponent.__ne__)N)r6   r7   r8   rr   ro   r   r   r   r   r   r   r   rI   rI   rI   rJ   rm      s   

F:)!rm   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )VarCompositeGlyphNc                 C   s   |d k	r|ng | _ d S rn   
components)rq   r   rI   rI   rJ   rr     s    zVarCompositeGlyph.__init__c                 C   s0   g | _ |r,t }||||}| j | qd S rn   )r   rm   r   r   )rq   rh   r   r   	componentrI   rI   rJ   r     s
    zVarCompositeGlyph.decompilec                 C   s(   g }| j D ]}||| q
t|S rn   )r   r   r   r   )rq   r   rh   r   rI   rI   rJ   r     s    
zVarCompositeGlyph.compilec                 C   sR   | d| |  t| jD ]\}}|||d|fg q|d |  d S )Nr   index)r   r   	enumerater   r   r   )rq   	xmlWriterr   r   r   ri   r   rI   rI   rJ   r     s    
zVarCompositeGlyph.toXMLc                 C   sP   dd |D }|D ]8\}}}|dks(t t }||||| | j| qd S )Nc                 S   s   g | ]}t |tr|qS rI   r   r   rI   rI   rJ   r     s     
 z-VarCompositeGlyph.fromXML.<locals>.<listcomp>rm   )r   rm   r   r   r   )rq   r   r   r   r   r   rI   rI   rJ   r     s    zVarCompositeGlyph.fromXML)N)r6   r7   r8   rr   r   r   r   r   rI   rI   rI   rJ   r     s
   
r   c                   @   s   e Zd Zdd ZdS )AATStateTablec                 C   s   i | _ g | _g | _d S rn   )ZGlyphClassesZStatesZPerGlyphLookupsrp   rI   rI   rJ   rr     s    zAATStateTable.__init__Nr6   r7   r8   rr   rI   rI   rI   rJ   r     s   r   c                   @   s   e Zd Zdd ZdS )AATStatec                 C   s
   i | _ d S rn   )Transitionsrp   rI   rI   rJ   rr     s    zAATState.__init__Nr   rI   rI   rI   rJ   r     s   r   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	AATActionNc                 C   s   dS )N)NNrI   )r   statesrI   rI   rJ   compileActions  s    zAATAction.compileActionsc                    s^    fdd j D }|r4|jdd|d |   jdkrZ|jdd j d |  d S )	Nc                    s   g | ]} j | r|qS rI   )r   r   frp   rI   rJ   r     s     
 z.AATAction._writeFlagsToXML.<locals>.<listcomp>Flags,r   r   ReservedFlagsz0x%04X)_FLAGSr   joinr   r   )rq   r   rs   rI   rp   rJ   _writeFlagsToXML  s    
zAATAction._writeFlagsToXMLc                 C   s$   || j kstd| d| j|< d S )Nzunsupported flag %sT)r   r   r   rq   rL   rI   rI   rJ   _setFlag  s    zAATAction._setFlag)r6   r7   r8   r   staticmethodr   r   r   rI   rI   rI   rJ   r     s
   
	r   c                   @   sl   e Zd ZdZdZdddgZdddd	d
ddddddddddddZdd Zdd Zdd Z	dd Z
dd  Zd!S )"RearrangementMorphActionr*   r   	MarkFirstDontAdvanceMarkLastz	no changeu	   Ax ⇒ xAu	   xD ⇒ Dxu   AxD ⇒ DxAu   ABx ⇒ xABu   ABx ⇒ xBAu   xCD ⇒ CDxu   xCD ⇒ DCxu   AxCD ⇒ CDxAu   AxCD ⇒ DCxAu   ABxD ⇒ DxABu   ABxD ⇒ DxBAu   ABxCD ⇒ CDxABu   ABxCD ⇒ CDxBAu   ABxCD ⇒ DCxABu   ABxCD ⇒ DCxBA)r   r   r)   r_   r*   rg         r+   	   rR      rP      r~      c                 C   s(   d| _ d| _d| _d| _d| _d| _d S Nr   F)NewStateVerbr   r   r   r   rp   rI   rI   rJ   rr     s    z!RearrangementMorphAction.__init__c                 C   sz   |d kst || j | jdkr,| jdks6t | j| j| jB }| jrP|dO }| jr^|dO }| jrl|dO }|| d S )Nr   r   rk   r5   r4   )r   writeUShortr   r   r   r   r   r   rq   r   r   actionIndexrs   rI   rI   rJ   r     s    z RearrangementMorphAction.compilec                 C   s`   |d kst | | _| }|d@ | _t|d@ | _t|d@ | _t|d@ | _|d@ | _d S )Nr   rk   r5   r4   i  )	r   
readUShortr   r   boolr   r   r   r   rq   readerr   actionReaderrs   rI   rI   rJ   r     s    

z"RearrangementMorphAction.decompilec                 C   s   |j |f| |  |jd| jd |  | | |jd| jd | j| j}|d k	rh|| |  |	| |  d S )Nr   r   r   )
r   r   r   r   r   r   _VERBSr   commentr   )rq   r   r   r   r   ZverbCommentrI   rI   rJ   r     s    


zRearrangementMorphAction.toXMLc           	      C   s   d | _  | _| _d | _ | _| _dd |D }|D ]|\}}}|dkrXt|d | _ q6|dkrpt|d | _q6|dkrt|d | _q6|d	kr6|d d
D ]}| |	  qq6d S )Nr   Fc                 S   s   g | ]}t |tr|qS rI   r   r   trI   rI   rJ   r     s     
 z4RearrangementMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   r   r   )
r   r   r   r   r   r   r   splitr   strip	rq   r   r   r   r   eltNameeltAttrs
eltContentrL   rI   rI   rJ   r     s    z RearrangementMorphAction.fromXMLN)r6   r7   r8   
staticSizeactionHeaderSizer   r   rr   r   r   r   r   rI   rI   rI   rJ   r     s2   

r   c                   @   sD   e Zd ZdZdZddgZdd Zdd Zd	d
 Zdd Z	dd Z
dS )ContextualMorphActionr+   r   SetMarkr   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   FFr   r   )r   r  r   r   	MarkIndexCurrentIndexrp   rI   rI   rJ   rr   1  s    zContextualMorphAction.__init__c                 C   s`   |d kst || j | j}| jr,|dO }| jr:|dO }|| || j || j d S )Nrk   r5   )r   r   r   r   r  r   r  r	  r   rI   rI   rJ   r   7  s    
zContextualMorphAction.compilec                 C   s\   |d kst | | _| }t|d@ | _t|d@ | _|d@ | _| | _| | _d S )Nrk   r5   i?  )	r   r   r   r   r  r   r   r  r	  r   rI   rI   rJ   r   C  s    


zContextualMorphAction.decompilec                 C   s~   |j |f| |  |jd| jd |  | | |jd| jd |  |jd| jd |  || |  d S )Nr   r   r  r	  )r   r   r   r   r   r  r	  r   rq   r   r   r   r   rI   rI   rJ   r   M  s    

zContextualMorphAction.toXMLc           	      C   s   d | _ | _d | _| _d\| _| _dd |D }|D ]\}}}|dkrXt|d | _ q6|dkr|d d	D ]}| |	  qnq6|d
krt|d | _q6|dkrt|d | _q6|dkr6t|d | _q6d S )Nr   Fr  c                 S   s   g | ]}t |tr|qS rI   r   r   rI   rI   rJ   r   ^  s     
 z1ContextualMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   r   r  r	  )
r   r   r  r   r  r	  r   r   r   r   r   rI   rI   rJ   r   Z  s     zContextualMorphAction.fromXMLN)r6   r7   r8   r  r  r   rr   r   r   r   r   rI   rI   rI   rJ   r  ,  s   
r  c                   @   s   e Zd Zdd ZdS )	LigActionc                 C   s   d| _ d| _d S )NFr   )StoreGlyphIndexDeltarp   rI   rI   rJ   rr   n  s    
zLigAction.__init__Nr   rI   rI   rI   rJ   r  m  s   r  c                   @   s`   e Zd ZdZdZddgZdd Zdd Zd	d
 Ze	dd Z
dd Zdd Zdd Zdd ZdS )LigatureMorphActionr   rP   SetComponentr   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   r  )r   r  r   r   Actionsrp   rI   rI   rJ   rr     s    zLigatureMorphAction.__init__c                 C   s   |d k	st || j | j}| jr,|dO }| jr:|dO }t| jdkrP|dO }|| t| jdkr|  }|||  n
|d d S )Nrk   r5   r   r4   )	r   r   r   r   r  r   r   r  compileLigActions)rq   r   r   r   rs   actionsrI   rI   rJ   r     s    
zLigatureMorphAction.compilec                 C   sv   |d k	st | | _| }t|d@ | _t|d@ | _t|d@ }|d@ | _| }|rl| ||| _ng | _d S )Nrk   r5   r4   i  )	r   r   r   r   r  r   r   _decompileLigActionsr  )rq   r   r   r   rs   ZperformActionr   rI   rI   rJ   r     s    

zLigatureMorphAction.decompilec                 C   s   dt  i   }}}|D ]&}|j D ]\}}||  q$qt|dd dD ]R}||krNtdt|dD ],}	||	d  }
t||	 d }||
| qj||7 }qNt	|d}||fS )Nr\   c                 S   s   t |  | fS rn   r   xrI   rI   rJ   r[     r\   z4LigatureMorphAction.compileActions.<locals>.<lambda>keyr   r*   )
setr   r   addr  sortedranger   
setdefaultr   )r   r   r   r  r   state_glyphClasstransari   suffixZsuffixIndexrI   rI   rJ   r     s    

z"LigatureMorphAction.compileActionsc                 C   sp   g }t | jD ]X\}}|t| jd k}|jd@ }||r<dndO }||jrNdndO }|td| qt|S )Nr   ?        r      @r^   )	r   r  r   r  r  r   rW   rX   r   )rq   r   ri   actionlastr   rI   rI   rJ   r    s    
z%LigatureMorphAction.compileLigActionsc           	      C   sv   g }d}| |j|d  }|sr| }t|d@ }t }|| t|d@ |_|d@ }|dkrjd| }||_q|S )NFr*   r$  r%  r#  i    i   )getSubReaderposZ	readULongr   r  r   r  r  )	rq   r   r   r  r'  r   r   r&  deltarI   rI   rJ   r    s    
z(LigatureMorphAction._decompileLigActionsc                 C   s   d | _ | _d | _| _d| _g | _dd |D }|D ]\}}}|dkrXt|d | _ q6|dkr|d dD ]}| |  qnq6|d	krt|d | _q6|d
kr6t	 }	|
ddd}
dd |
D }
d|
k|	_t|d |	_| j|	 q6d S )Nr   Fc                 S   s   g | ]}t |tr|qS rI   r   r   rI   rI   rJ   r     s     
 z/LigatureMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   r   Action c                 S   s   g | ]}|  qS rI   r   r   rI   rI   rJ   r     s     r  r  )r   r   r  r   r  r   r   r   r   r  r   r  r  r   )rq   r   r   r   r   r   r   r  rL   r&  rs   rI   rI   rJ   r     s(    
zLigatureMorphAction.fromXMLc                 C   s   |j |f| |  |jd| jd |  | | | jD ]4}d|jfg}|jr^|d |d| |  q>|	| |  d S )Nr   r   r  )r   r  r+  )
r   r   r   r   r   r  r  r  r   r   )rq   r   r   r   r   r&  ZattribsrI   rI   rJ   r     s    




zLigatureMorphAction.toXMLN)r6   r7   r8   r  r  r   rr   r   r   r   r   r  r  r   r   rI   rI   rI   rJ   r  |  s   

r  c                   @   s`   e Zd ZdZdZddddddgZd	d
 Zdd Zdd Zdd Z	dd Z
dd Zedd ZdS )InsertionMorphActionr+   r*   r  r   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |d qd| _g g  | _| _d S r   )r   r   r   r   CurrentInsertionActionMarkedInsertionActionr   rI   rI   rJ   rr     s
    
zInsertionMorphAction.__init__c                 C   s   |d k	st || j | j}| jr,|dO }| jr:|dO }| jrH|dO }| jrV|dO }| jrd|dO }| j	rr|dO }|t
| jd> O }|t
| jO }|| t
| jdkr|t| j }nd	}|| t
| jdkr|t| j }nd	}|| d S )
Nrk   r5   r4   r3   r2   r1   rg   r   r   )r   r   r   r   r  r   r/  r0  r1  r2  r   r3  r4  r   )rq   r   r   r   rs   ZcurrentIndexZmarkedIndexrI   rI   rJ   r     s4    

zInsertionMorphAction.compilec                 C   s   |d k	st | | _| }t|d@ | _t|d@ | _t|d@ | _t|d@ | _t|d@ | _t|d@ | _	| j
||| |d@ d? d	| _| j
||| |d
@ d	| _d S )Nrk   r5   r4   r3   r2   r1   i  rg   )r   count   )r   r   r   r   r  r   r/  r0  r1  r2  _decompileInsertionActionr3  r4  r   rI   rI   rJ   r   :  s*    
   
   zInsertionMorphAction.decompilec                 C   s8   |dks|dkrg S | |j|d  }|||S )Nr   r   r)   )r(  r)  getGlyphNameManyZreadUShortArray)rq   r   r   r   r5  r   rI   rI   rJ   r7  K  s    z.InsertionMorphAction._decompileInsertionActionc                 C   s   |j |f| |  |jd| jd |  | | | jD ]}|jd|d |  q>| jD ]}|jd|d |  q`|| |  d S )Nr   r   r3  glyphr4  )r   r   r   r   r   r3  r4  r   )rq   r   r   r   r   grI   rI   rJ   r   Q  s    





zInsertionMorphAction.toXMLc           	      C   s   |    dd |D }|D ]\}}}|dkr<t|d | _q|dkrh|d dD ]}| |  qRq|dkr| j|d  q|d	kr| j|d  qd
st	|qd S )Nc                 S   s   g | ]}t |tr|qS rI   r   r   rI   rI   rJ   r   b  s     
 z0InsertionMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   r3  r:  r4  F)
rr   r   r   r   r   r   r3  r   r4  r   r   rI   rI   rJ   r   `  s    zInsertionMorphAction.fromXMLc                 C   s  t  i d  }}}|D ]L}|j D ]<\}}|jd k	rF|t|j |jd k	r$|t|j q$qt|dd dD ]}||krqttdt	|D ]D}	t	|d |	 }
t|	t	|D ] }||	|d  }|
||
 qq|D ]}| |}|td|7 }qqt||fS )	Nr\   c                 S   s   t |  | fS rn   r  r  rI   rI   rJ   r[   |  r\   z5InsertionMorphAction.compileActions.<locals>.<lambda>r  r   r)   r   r]   )r  r   r   r3  r  r   r4  r  r  r   r  r   rW   rX   )r   r   r  r   r   r  r  r   r&  startZ
startIndexlimitglyphsr:  r   rI   rI   rJ   r   p  s&    


z#InsertionMorphAction.compileActionsN)r6   r7   r8   r  r  r   rr   r   r   r7  r   r   r   r   rI   rI   rI   rJ   r.  	  s"   	r.  c                   @   s   e Zd Zdd ZdddZdS )FeatureParamsc                 C   s>   t |d | jks,td|d | jjf t| || d S )NZ
FeatureTagz-Wrong FeatureParams type for feature '%s': %s)featureParamTypesr   	__class__r   r6   r   r   )rq   r   r   rI   rI   rJ   r     s    zFeatureParams.compileNc                 C   s   t j| |||| jjd d S )N)r   )r   r   rA  r6   r
  rI   rI   rJ   r     s    zFeatureParams.toXML)NN)r6   r7   r8   r   r   rI   rI   rI   rJ   r?    s   	r?  c                   @   s   e Zd ZdS )FeatureParamsSizeNr6   r7   r8   rI   rI   rI   rJ   rB    s   rB  c                   @   s   e Zd ZdS )FeatureParamsStylisticSetNrC  rI   rI   rI   rJ   rD    s   rD  c                   @   s   e Zd ZdS )FeatureParamsCharacterVariantsNrC  rI   rI   rI   rJ   rE    s   rE  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )CoverageNc                 C   s   t | dsg | _d S )Nr>  )hasattrr>  r|   rI   rI   rJ   ro     s    
zCoverage.populateDefaultsc                 C   s   | j dkr|d | _n| j dkrg  }| _|d }t|dd d}||krXtd |}~|D ]>}|j}|j}||}	||d }
||	t
|	|
 q^ng | _td	| j  | ` d S )
Nr   
GlyphArrayr)   RangeRecordc                 S   s   | j S rn   )StartCoverageIndexr!  rI   rI   rJ   r[     r\   z#Coverage.postRead.<locals>.<lambda>r  .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr>  r  logwarningStartEndr   extendr8  r  )rq   rawTabler   r>  rangesZsorted_rangesrr<  endstartIDendIDrI   rI   rJ   postRead  s&    




zCoverage.postReadc                 C   sd  t | dd }|d krg  }| _d}d|i}|rZ||}t||k}|d }|gg}|dd  D ].}	|	|d kr|d | ||	g |	}qb|d | |st|d t|k rZd}
tt|D ]R}|| \}}t }||_|	||_
|	||_|
|_|||< |
| | d }
q|r>td |jdd	 d
 |D ]
}|`qBd}d|i}|| _|S )Nr>  r   rH  r   r_   rL  c                 S   s   | j S rn   )StartIDrK  rI   rI   rJ   r[     r\   z#Coverage.preWrite.<locals>.<lambda>r  r)   rI  )r   r>  getGlyphIDManyr  r   r   r  rI  r[  ZgetGlyphNamerP  rQ  rJ  rN  rO  sortrM  )rq   r   r>  formatrS  glyphIDsZbrokenOrderr'  rT  r   r   ri   r<  rV  rU  rI   rI   rJ   preWrite  sH    


zCoverage.preWritec                 C   s,   t | dg D ]}|jd|d |  qd S )Nr>  Glyphr   )r   r   r   )rq   r   r   rt   rI   rI   rJ   toXML2  s    zCoverage.toXML2c                 C   s0   t | dd }|d krg }|| _||d  d S )Nr>  r   )r   r>  r   )rq   r   r   r   r   r>  rI   rI   rJ   r     s
    zCoverage.fromXML)Nr6   r7   r8   ro   rY  r`  rb  r   rI   rI   rI   rJ   rF    s
   
,rF  l    c                   @   sJ   e Zd ZdddZdd Zedd Zdd	 Zd
d Zdd Z	dd Z
dS )DeltaSetIndexMapNc                 C   s   t | dsg | _d S Nr   rG  r   r|   rI   rI   rJ   ro   	  s    
z!DeltaSetIndexMap.populateDefaultsc                 C   s"   |d d@ dkst |d | _d S )NEntryFormat  r   r   )r   r   )rq   rS  r   rI   rI   rJ   rY    s    zDeltaSetIndexMap.postReadc                 C   s   d}| D ]}||O }q|d@ }d}|r8|d7 }|dL }q"t |d}|dksNt|d| ? |d|> d @ B }|dkrxd}n |dkrd}n|dkrd}nd	}|d d	> |d B S )
Nr   r   r   r,      r)   i r_   r*   )maxr   )r   ZoredidxinnerZ	innerBitsZ	entrySizerI   rI   rJ   getEntryFormat  s&    


zDeltaSetIndexMap.getEntryFormatc                 C   s\   t | dd }|d krg  }| _t|dkr.dnd| _| j }t||d< | ||d< |S )Nr   r   r   r   MappingCountrg  )r   r   r   rM  r   copyrm  )rq   r   r   rS  rI   rI   rJ   r`  +  s    

zDeltaSetIndexMap.preWritec                 C   st   | d |  tt| dg D ]L\}}d|fg}|tkrZ|d|d? fd|d@ fg |d| |  q"d S )	Nz7Omitted values default to 0xFFFF/0xFFFF (no variations)r   r   outerr,   rl  r   Map)r   r   r   r   rx   rR  r   )rq   r   r   ri   r   r   rI   rI   rJ   rb  5  s    



zDeltaSetIndexMap.toXML2c           	      C   sn   t | dd }|d krg  | _}t|d }t|dd}t|dd}|dksVt|||d> |B  d S )Nr   r   rp  Z0xFFFFrl  r   r,   )r   r   r   r   r   insert)	rq   r   r   r   r   r   r   rp  rl  rI   rI   rJ   r   F  s    
zDeltaSetIndexMap.fromXMLc                 C   s   |t | jk r| j| S tS rn   )r   r   rx   )rq   ri   rI   rI   rJ   __getitem__P  s    zDeltaSetIndexMap.__getitem__)N)r6   r7   r8   ro   rY  r   rm  r`  rb  r   rs  rI   rI   rI   rJ   rd    s   



rd  Zuint8c                   @   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 )	VarIdxMapNc                 C   s   t | dsi | _d S re  rf  r|   rI   rI   rJ   ro   U  s    
zVarIdxMap.populateDefaultsc                 C   sX   |d d@ dkst | }|d }||d gt|t|   tt||| _d S )Nrg  rh  r   r   rZ  )r   getGlyphOrderrR  r   dictzipr   )rq   rS  r   r   ZmapListrI   rI   rJ   rY  Y  s
     zVarIdxMap.postReadc                    s   t | dd   d kri   | _| } fdd|D  t dkr\ d  d kr\ d= q8d i}t |d< t |d< |S )	Nr   c                    s   g | ]} | qS rI   rI   r   r;  r   rI   rJ   r   f  s     z&VarIdxMap.preWrite.<locals>.<listcomp>r   rZ  rn  rg  )r   r   ru  r   rd  rm  )rq   r   r   rS  rI   ry  rJ   r`  `  s    
zVarIdxMap.preWritec                 C   sT   t t| di  D ]:\}}d|fd|d? fd|d@ ff}|d| |  qd S )Nr   r:  rp  r,   rl  r   rq  )r  r   r   r   r   )rq   r   r   r:  r   r   rI   rI   rJ   rb  o  s    

zVarIdxMap.toXML2c           	      C   s   t | dd }|d kri }|| _z|d }W n   | |d  }Y nX t|d }t|d }|dkslt|d> |B ||< d S )Nr   r:  r   rp  rl  r   r,   )r   r   ru  r   r   )	rq   r   r   r   r   r   r:  rp  rl  rI   rI   rJ   r   y  s    zVarIdxMap.fromXMLc                 C   s   | j |tS rn   )r   r   rx   )rq   rt   rI   rI   rJ   rs    s    zVarIdxMap.__getitem__)N)	r6   r7   r8   ro   rY  r`  rb  r   rs  rI   rI   rI   rJ   rt  T  s   

rt  c                   @   s   e Zd Zdd ZdS )VarRegionListc                 C   s0   | d}|rt|j| _| jdt| jdiS )NZfvarRegionAxisCount)r   r   Zaxesr|  r   r   )rq   r   Z	fvarTablerI   rI   rJ   r`    s    
 
zVarRegionList.preWriteNr6   r7   r8   r`  rI   rI   rI   rJ   r{    s   r{  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )SingleSubstNc                 C   s   t | dsi | _d S re  rf  r|   rI   rI   rJ   ro     s    
zSingleSubst.populateDefaultsc                    s   i }t |d }| jdkrf|d  ||} fdd|D }||}t||D ]\}}	|	||< qRnZ| jdkrt||d kstd|d	 }
t||
D ]\}}|||< qnd
std| j || _| `d S )NrF  r   DeltaGlyphIDc                    s   g | ]}|  d  qS )   rI   )r   r   r*  rI   rJ   r     s     z(SingleSubst.postRead.<locals>.<listcomp>r)   Z
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTablerM  r\  r8  rw  r   r   r   )rq   rS  r   r   inputZ	inputGIDSZoutGIDSZoutNamesinpoutsubstsubrI   r  rJ   rY    s(    



zSingleSubst.postReadc                    s  t | dd }|d kri  }| _t| }|j  fdd|D }tt||}d}d }|D ]0\}}	|d krx|	| d }|| d |	kr\ qq\|d krd}nd}i }
|| _t }dd |D }dd |D }||_	||
d	< |dkr|d k	st
||
d
< n||
d< |
S )Nr   c                    s    g | ]\}} | |fqS rI   rI   )r   r!  br   rI   rJ   r     s     z(SingleSubst.preWrite.<locals>.<listcomp>r)   r  r   c                 S   s   g | ]}|d  d qS )r   r   rI   r   itemrI   rI   rJ   r     s     c                 S   s   g | ]}|d  d  qS r   rI   r  rI   rI   rJ   r     s     rF  r  r  )r   r   listr   r   r  rw  rM  rF  r>  r   )rq   r   r   r   ZgidItemsZsortableItemsr^  r*  ZinIDZoutIDrS  covr  r  rI   r  rJ   r`    s:    

zSingleSubst.preWritec                 C   s@   t | j }|D ](\}}|dd|fd|fg |  qd S )NSubstitutioninr  )r  r   r   r   r   )rq   r   r   r   inGlyphZoutGlyphrI   rI   rJ   rb    s    zSingleSubst.toXML2c                 C   s2   t | dd }|d kri }|| _|d ||d < d S )Nr   r  r  )r   r   )rq   r   r   r   r   r   rI   rI   rJ   r     s
    zSingleSubst.fromXML)Nrc  rI   rI   rI   rJ   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edd Z	dS )MultipleSubstNc                 C   s   t | dsi | _d S re  rf  r|   rI   rI   rJ   ro     s    
zMultipleSubst.populateDefaultsc                 C   s\   i }| j dkr<t|d }dd |d D }tt||}ndsNtd| j  || _| ` d S )Nr   rF  c                 S   s   g | ]
}|j qS rI   )r  )r   srI   rI   rJ   r     s     z*MultipleSubst.postRead.<locals>.<listcomp>Sequencer   r  )rM  r  rv  rw  r   r   )rq   rS  r   r   r>  r  rI   rI   rJ   rY    s    
zMultipleSubst.postReadc                    sb   t dd   d kri   _t }tt  |jd|_d_| fdd|jD d}|S )Nr   r  r   c                    s   g | ]}  | qS rI   )makeSequence_)r   r:  r   rq   rI   rJ   r     s     z*MultipleSubst.preWrite.<locals>.<listcomp>)rF  r  )	r   r   rF  r  r  keysr   r>  rM  )rq   r   r  rS  rI   r  rJ   r`    s    
zMultipleSubst.preWritec                 C   sJ   t | j }|D ]2\}}d|}|dd|fd|fg |  qd S )Nr   r  r  r  )r  r   r   r   r   r   )rq   r   r   r   r  	outGlyphsr  rI   rI   rJ   rb  
  s
    
zMultipleSubst.toXML2c                 C   s  t | dd }|d kri }|| _|dkrhg | _|D ]2}t|ts@q0|\}}}	|dkr0| j|d  q0d S |dkrt|dt|}
| j|
 }g  }||< |D ]0}t|tsq|\}}}	|dkr||d  qd S |d r|d 	d	ng }d
d |D ||d < d S )Nr   rF  ra  r   r  r   r  r  r   c                 S   s   g | ]}|  qS rI   r-  rx  rI   rI   rJ   r   /  s     z)MultipleSubst.fromXML.<locals>.<listcomp>r  )
r   r   Zold_coverage_r   r   r   intr   r   r   )rq   r   r   r   r   r   elementZelement_nameZelement_attrsr   r   r:  Zglyph_mappingr  rI   rI   rJ   r     s4    




zMultipleSubst.fromXMLc                 C   s   t  }| |_|S rn   )r  r  )r;  seqrI   rI   rJ   r  1  s    zMultipleSubst.makeSequence_)N)
r6   r7   r8   ro   rY  r`  rb  r   r   r  rI   rI   rI   rJ   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 )ClassDefNc                 C   s   t | dsi | _d S )N	classDefs)rG  r  r|   rI   rI   rJ   ro   9  s    
zClassDef.populateDefaultsc                 C   s   i }| j dkrf|d }|d }||}|t| }|t||}t||D ]\}	}
|
rN|
||	< qNn~| j dkr|d }|D ]V}|j}
|
sq||j}|j}||}||d }|t||}|D ]}	|
||	< qq|nt	
d| j  || _| ` d S )Nr   
StartGlyphClassValueArrayr)   ClassRangeRecordzUnknown ClassDef format: %s)rM  r   r   r8  r  rw  ClassrP  rQ  rN  rO  r  )rq   rS  r   r  r<  Z	classListrW  rX  Z
glyphNamesrt   clsrecordsrecrV  rI   rI   rJ   rY  =  s4    



zClassDef.postReadc                 C   s   t | dd }|d kri | _d S |j}g }| D ]"\}}|s>q0|||||f q0|r|  |d \}}}	|	||gg}
|dd  D ]L\}}}||d ks||	kr|
d ||g |
|||g |}|}|}	q|
d ||g |
S d S )Nr  r   r   rZ  )r   r  r   r   r   r]  rR  )rq   r   r  r   r   rt   r  r'  ZlastNameZlastClsrT  r   rI   rI   rJ   _getClassRanges\  s.    zClassDef._getClassRangesc                 C   s  d}dg i}|  |}|r|d d }|d d }|| d }t|d |d k rtt|D ]6}|| \}	}
}}}t }||_||_|	|_|||< q`d}d|i}n\|d d }dg| }|D ]2\}	}
}}}t|
| || d D ]}|	||< qqd}||d}|| _|S )Nr)   r  r   r   rZ  r_   )r  r  )r  r   r  r  rP  rQ  r  rM  )rq   r   r^  rS  rT  Z
startGlyphZendGlyphZ
glyphCountri   r  r<  	startNamerV  endNamer  ZstartGlyphNameclassesr;  rI   rI   rJ   r`  u  s4    




zClassDef.preWritec                 C   s@   t | j }|D ](\}}|dd|fd|fg |  qd S )Nr  r:  class)r  r  r   r   r   )rq   r   r   r   rt   r  rI   rI   rJ   rb    s    zClassDef.toXML2c                 C   s6   t | dd }|d kri }|| _t|d ||d < d S )Nr  r  r:  )r   r  r  )rq   r   r   r   r   r  rI   rI   rJ   r     s
    zClassDef.fromXML)N)	r6   r7   r8   ro   rY  r  r`  rb  r   rI   rI   rI   rJ   r  8  s   
r  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )AlternateSubstNc                 C   s   t | dsi | _d S )N
alternates)rG  r  r|   rI   rI   rJ   ro     s    
zAlternateSubst.populateDefaultsc                 C   sv   i }| j dkrVt|d }|d }t|t|ks6tt||D ]\}}|j||< q@ndshtd| j  || _| ` d S )Nr   rF  AlternateSetr   r  )rM  r  r   r   rw  	Alternater  )rq   rS  r   r  r  altsr  altrI   rI   rJ   rY    s    
zAlternateSubst.postReadc           
      C   s   d| _ t| dd }|d kr$i  }| _t| }tt|D ]$}|| \}}||||f||< q<|  t	 }dd |D |_
g }dd |D }|D ]}t }	||	_||	 qd| _||dS )Nr   r  c                 S   s   g | ]}|d  qS r  rI   r  rI   rI   rJ   r     s     z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  qS rZ  rI   r  rI   rI   rJ   r     s     )rF  r  )rM  r   r  r  r   r  r   r   r]  rF  r>  r  r  r   sortCoverageLast)
rq   r   r  r   ri   rt   r  r  setListr  rI   rI   rJ   r`    s&    
zAlternateSubst.preWritec                 C   sh   t | j }|D ]P\}}|jd|d |  |D ]}|jd|d |  q4|d |  qd S )Nr  r9  r  )r  r  r   r   r   r   r   )rq   r   r   r   rt   r  r  rI   rI   rJ   rb    s    

zAlternateSubst.toXML2c           	      C   sd   t | dd }|d kri }|| _|d }g }|||< |D ](}t|tsFq6|\}}}||d  q6d S )Nr  r:  )r   r  r   r   r   )	rq   r   r   r   r   r  rt   r  r  rI   rI   rJ   r     s    

zAlternateSubst.fromXML)Nrc  rI   rI   rI   rJ   r    s
   
r  c                   @   sB   e Zd ZdddZdd Zedd Zdd	 Zd
d Zdd Z	dS )LigatureSubstNc                 C   s   t | dsi | _d S )N	ligatures)rG  r  r|   rI   rI   rJ   ro     s    
zLigatureSubst.populateDefaultsc                 C   s|   i }| j dkr\t|d }|d }t|t|ks6ttt|D ]}|| j||| < qBndsntd| j  || _| ` d S )Nr   rF  LigatureSetr   r  )rM  r  r   r   r  Ligaturer  )rq   rS  r   r  r  ligSetsri   rI   rI   rJ   rY    s    
zLigatureSubst.postReadc                 C   s
   t |  S rn   r  r   rI   rI   rJ   _getLigatureSortKey  s    z!LigatureSubst._getLigatureSortKeyc                 C   sT  d| _ t| dd }|d kr$i  }| _|rttt|trt }t|	 | j
dD ]B}t }|dd  |_t||_|| |_||d g | qR|}t| }tt|D ]$}|| \}}	||||	f||< q|  t }
dd |D |
_g }dd |D }|D ]6}	t }g  }|_|	D ]}|| q$|| qd| _|
|dS )	Nr   r  r  r   c                 S   s   g | ]}|d  qS r  rI   r  rI   rI   rJ   r   1  s     z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  qS r  rI   r  rI   rI   rJ   r   4  s     )rF  r  )rM  r   r  r   nextiterr   rv  r  r  r  r  	Componentr   	CompCountLigGlyphr  r   r  r   r  r   r]  rF  r>  r  r  )rq   r   r  ZnewLigaturescompsZligaturer   ri   rt   r  r  r  r  ZligSetligsligrI   rI   rJ   r`    s<    



zLigatureSubst.preWritec                 C   st   t | j }|D ]\\}}|jd|d |  |D ]&}|jd|jd|jd |  q4|	d |  qd S )Nr  r9  r  r   )r:  r   )
r  r  r   r   r   r   r  r   r  r   )rq   r   r   r   rt   r  r  rI   rI   rJ   rb  A  s      


zLigatureSubst.toXML2c                 C   s   t | dd }|d kri }|| _|d }g }|||< |D ]\}t|tsFq6|\}}}t }	|d |	_|d }
|
rv|
dng |	_t|	j|	_	|
|	 q6d S )Nr  r:  r   r   )r   r  r   r   r  r  r   r  r   r  r   )rq   r   r   r   r   r  rt   r  r  r  r   rI   rI   rJ   r   N  s"    


zLigatureSubst.fromXML)N)
r6   r7   r8   ro   rY  r   r  r`  rb  r   rI   rI   rI   rJ   r    s   

*r  c                   @   s.   e Zd Zdd Zdd Zddeddd	Zd
S )COLRc                 C   sb   |j dd}|  D ]6}|jdkr0||j q|j||i d||j<  qTqtdt| ||S )Nr   )offsetLayerRecordCount)Z	tableDictz$LayerRecordCount converter not found)	r(  getConvertersr   Zadvancer  readr   r   r   )rq   r   r   Z	subReaderconvrI   rI   rJ   r   c  s    
zCOLR.decompilec                 C   s   d | _ | jdt| jdiS )Nr  )r  r   r   rq   r   rI   rI   rJ   r`  t  s
     
zCOLR.preWriter   r'   )glyphSetquantizationc           	      C   s   | j dkrd S i }| jjD ]l}z|j| ||}W n@ tk
rr } z"ddlm} |d|j|W 5 d }~X Y nX |d k	r|||j< qt	| do| j
d k	}|s|rd | _
n|st
 | _
d| j
_|| j
_d S )Nr   )
TTLibErrorz#Failed to compute COLR ClipBox for ClipListr   )VersionBaseGlyphListBaseGlyphPaintRecordPaintcomputeClipBox	ExceptionfontTools.ttLibr  	BaseGlyphrG  r  rM  clips)	rq   r  r  r  r  clipBoxer  ZhasClipListrI   rI   rJ   computeClipBoxes~  s.    

zCOLR.computeClipBoxesN)r   )r6   r7   r8   r   r`  r  r  rI   rI   rI   rJ   r  b  s   
r  c                       s(   e Zd Zedd Z fddZ  ZS )
LookupListc                 C   sP   | j D ]@}|jD ]4}t|jdr,  dS t|jdr  dS qqtd S )NZSubstGSUBZPosGPOS)LookupSubTabler   r6   endswith
ValueError)rq   lstrI   rI   rJ   table  s    

zLookupList.tablec              
      sL  |rd|kst |d jkr(t ||S |d jt  | j }|  D ] }|jrt| |jg }t	|D ]\}}t
||krt|t
|  }|j}	|jr|j d|	 }	|jr|j\}
}}|	 d| d|
 d| d}	||	 |  |||||jd|fg qhqD|jr$t|jd t| s$qDt| |jd }|||||jg  qDd S )NZDebgz: z in z (/)r   )r    rh   superrb  r  r  repeatr   r   r   strr   locationfeaturer   r   ZxmlWriteZauxevalvars)rq   r   r   Z	debugDatar  r   lookupIndexr  infotagscriptlanguager  rA  rI   rJ   rb    sJ    
      zLookupList.toXML2)r6   r7   r8   propertyr  rb  __classcell__rI   rI   r  rJ   r    s   
	r  c                   @   s   e Zd Zdd ZdS )BaseGlyphRecordArrayc                    s"   t | j fddd| _| j S )Nc                    s     | jS rn   r   r  r  r   rI   rJ   r[     r\   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r  )r  ZBaseGlyphRecordr   ro  r  rI   r  rJ   r`    s
     
zBaseGlyphRecordArray.preWriteNr}  rI   rI   rI   rJ   r    s   r  c                   @   s   e Zd Zdd ZdS )r  c                    s"   t | j fddd| _| j S )Nc                    s     | jS rn   r  r  r  rI   rJ   r[     r\   z(BaseGlyphList.preWrite.<locals>.<lambda>r  )r  r  r   ro  r  rI   r  rJ   r`    s
     
zBaseGlyphList.preWriteNr}  rI   rI   rI   rJ   r    s   r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )ClipBoxFormatr   r)   c                 C   s
   | | j kS rn   Variablerp   rI   rI   rJ   is_variable  s    zClipBoxFormat.is_variablec                 C   s   | j S rn   r  rp   rI   rI   rJ   as_variable  s    zClipBoxFormat.as_variableN)r6   r7   r8   Staticr  r  r  rI   rI   rI   rJ   r    s   r  c                   @   s    e Zd ZeZdd Zdd ZdS )ClipBoxc                    s   t  fdd  D S )Nc                 3   s   | ]}t  |jV  qd S rn   )r   r   )r   r  rp   rI   rJ   r     s     z#ClipBox.as_tuple.<locals>.<genexpr>)r   r  rp   rI   rp   rJ   as_tuple  s    zClipBox.as_tuplec                 C   s   | j j |   S rn   )rA  r6   r   rp   rI   rI   rJ   __repr__  s    zClipBox.__repr__N)r6   r7   r8   r  
formatEnumr   r  rI   rI   rI   rJ   r    s   r  c                   @   s@   e Zd ZdddZdd Zdd Zdd	 Zdd
dZdd ZdS )r  Nc                 C   s   t | dsi | _d S )Nr  )rG  r  r|   rI   rI   rJ   ro     s    
zClipList.populateDefaultsc              
   C   s   i }|  }t|d D ]\}}|j|jkrBtd||j|j qg }g }t|j|jd D ]X}	z||	 }
W n" tk
r   ||	 Y q\Y nX |
|krt		|j
||
< q\||	 q\|rtd|t|t| |rtd|t|t| q|| _d S )N
ClipRecordzCinvalid ClipRecord[%i].StartGlyphID (%i) > EndGlyphID (%i); skippedr   zqClipRecord[%i] overlaps previous records; ignoring redefined clip boxes for the following glyph ID range: [%i-%i]z:ClipRecord[%i] range references missing glyph IDs: [%i-%i])ru  r   StartGlyphID
EndGlyphIDrN  rO  r  
IndexErrorr   ro  r  minrj  r  )rq   rS  r   r  r   ri   r  ZredefinedGlyphsZmissingGlyphsr   r:  rI   rI   rJ   rY    sJ    

zClipList.postReadc                    s\   t t}i  | j D ].\}}| }|| | | kr| |< q fdd| D S )Nc                    s   i | ]\}}t | | qS rI   )	frozenset)r   r  r>  ZuniqueClipsrI   rJ   
<dictcomp>&  s     z#ClipList.groups.<locals>.<dictcomp>)r   r  r  r   r   r   )rq   ZglyphsByCliprt   r  r  rI   r	  rJ   groups  s    

zClipList.groupsc                    s$  t | dsi | _i }|  |   D ]\}}t fdd|D }|sLq(|d }|gg}|dd  D ].}||d kr|d | ||g |}qh|d | |D ]$\}	}
|	|
f|kst|||	|
f< qq(g }t| D ].\\}	}
}t }|	|_	|
|_
||_|| qt||d}|S )Nr  c                 3   s   | ]}| kr | V  qd S rn   rI   )r   rt   ZglyphMaprI   rJ   r   0  s     z$ClipList.preWrite.<locals>.<genexpr>r   r   rZ  )Z	ClipCountr  )rG  r  ZgetReverseGlyphMapr  r   r  r   r   r  r  r  r  r   )rq   r   ZclipBoxRangesr>  r  r_  r'  rT  r   r<  rV  ZclipRecordsrecordrS  rI   r  rJ   r`  *  s@    
zClipList.preWritec           	      C   s  |r|n| j j}|d krg }t| dr6|d| jf ||| |  t|  	 dd dD ]\}}|d |  t|D ]}|j
d|d |  q|dd|jfg |  ||| |d |  |d |  qb|| |  d S )	NrM  c                 S   s   t | d S )Nr   )r  )r  rI   rI   rJ   r[   X  r\   z ClipList.toXML.<locals>.<lambda>r  Clipra  r   r  )rA  r6   rG  r   rM  r   r   r  r  r   r   rb  r   )	rq   r   r   r   r   	tableNamer>  r  rt   rI   rI   rJ   r   N  s2    

 





zClipList.toXMLc           
      C   s   t | dd }|d kri  | _}|dks*tg }d }|D ]~}t|tsFq6|\}}}|dkrh||d  q6|dkr6t }t|d |_|D ]*}t|tsq|\}}}|	|||| qq6|r|D ]}	|||	< qd S )Nr  r  ra  r   r  rM  )
r   r  r   r   r   r   r  r   rM  r   )
rq   r   r   r   r   r  r>  r  elemrt   rI   rI   rJ   r   i  s.    




zClipList.fromXML)N)NN)	r6   r7   r8   ro   rY  r  r`  r   r   rI   rI   rI   rJ   r    s   
+$
r  c                   @   s   e Zd ZdZdZdZdS )
ExtendModer   r   r)   N)r6   r7   r8   ZPADREPEATZREFLECTrI   rI   rI   rJ   r    s   r  c                   @   s|   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )CompositeModer   r   r)   r_   r*   rg   r   r   r+   r   rR   r   rP   r   r~   r   r,                        rf            N)r6   r7   r8   ZCLEARZSRCZDESTZSRC_OVERZ	DEST_OVERZSRC_INZDEST_INZSRC_OUTZDEST_OUTZSRC_ATOPZ	DEST_ATOPZXORPLUSZSCREENZOVERLAYZDARKENZLIGHTENZCOLOR_DODGEZ
COLOR_BURNZ
HARD_LIGHTZ
SOFT_LIGHTZ
DIFFERENCEZ	EXCLUSIONZMULTIPLYZHSL_HUEZHSL_SATURATIONZ	HSL_COLORZHSL_LUMINOSITYrI   rI   rI   rJ   r    s8   r  c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!d" Z#d#d$ Z$d%S )&PaintFormatr   r)   r_   r*   rg   r   r   r+   r   rR   r   rP   r   r~   r   r,   r  r  r  r  r  r  r  rf   r  r  r           r6  r-   c                 C   s   | j dS )NPaintVar)r   
startswithrp   rI   rI   rJ   r    s    zPaintFormat.is_variablec                 C   sD   |   r| S ztjd| jdd    W S  tk
r>   Y d S X d S )Nr#  rg   )r  r  __members__r   KeyErrorrp   rI   rI   rJ   r    s    zPaintFormat.as_variableN)%r6   r7   r8   PaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformZPaintVarTransformPaintTranslateZPaintVarTranslate
PaintScaleZPaintVarScalePaintScaleAroundCenterZPaintVarScaleAroundCenterPaintScaleUniformZPaintVarScaleUniformPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterPaintRotateZPaintVarRotatePaintRotateAroundCenterZPaintVarRotateAroundCenter	PaintSkewZPaintVarSkewPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositer  r  rI   rI   rI   rJ   r    sD   r  c                   @   s   e Zd ZeZdd ZdddZeee	j
 dddZed  d	d
dZedddZed	ddZdedeee dddZdS )r  c                 C   s:   z|  | jjW S  tk
r4   td| j Y nX d S )NzUnknown Paint format: )r  rM  r   r  NotImplementedErrorrp   rI   rI   rJ   getFormatName  s    zPaint.getFormatNameNc                 C   sp   |r|n| j j}|d krg }|d| jf ||| ||   |  | || |	| |  d S )NrM  )
rA  r6   r   rM  r   r   r5  r   rb  r   )rq   r   r   r   r   r  rI   rI   rJ   r     s    
zPaint.toXML)colrreturnc                 c   s   | j tjkrPg }|jd k	r"|jj}dd t|| j| j| j  D E d H  d S | j tjkr|j	j
D ](}|j| jkrdtjd|jdV   d S qdt| jd|  D ]<}|jd k	rt|jt| rt| |j}tj|j|dV  qd S )Nc                 s   s"   | ]\}}t jd ||dV  qdS )ZLayers)r   r   r   N)r   SubTableEntry)r   ri   rZ   rI   rI   rJ   r     s   z+Paint.iterPaintSubTables.<locals>.<genexpr>r  )r   r   z not in colr.BaseGlyphList)rM  r  r'  Z	LayerListr  r   ZFirstLayerIndexZ	NumLayersr)  r  r  r  ra  r   r8  r&  r  Z
tableClass
issubclassr   r   r   )rq   r6  Zlayersr  r  r   rI   rI   rJ   iterPaintSubTables  s(    
zPaint.iterPaintSubTables)r7  c                 C   s   dd |  |D S )Nc                 S   s   g | ]
}|j qS rI   r   )r   prI   rI   rJ   r   
  s     z%Paint.getChildren.<locals>.<listcomp>r:  )rq   r6  rI   rI   rJ   getChildren  s    zPaint.getChildrenr6  c                    s@   t |stdt|  fdddD ]}|d j}|| q$dS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callablec                    s
   |   S rn   r<  paintr>  rI   rJ   r[     r\   z Paint.traverse.<locals>.<lambda>Ziter_subtables_fnrZ  N)callable	TypeErrorr	   r   )rq   r6  callbackpathr@  rI   r>  rJ   traverse  s     


zPaint.traversec                 C   s  | j tjkr0| j}t|j|j|j|j|j|j	S | j tj
krLt| j| j	S | j tjkrht| j| jS | j tjkrt| j| j| j| j| j | j S | j tjkrt| jS | j tjk rt| j| j| j| j | j S | j tjkrtt| jS | j tjkrFt| j| jt| j| j | j S | j tjkrntt| j t| jS | j tjkrt| j| jt| j t| j| j | j S t| j   rt!d| j  tS )NzVariable Paints not supported: )"rM  r  r*  r   ZxxZyxZxyyyZdxZdyr+  r   	translater,  rN   rS   rT   r-  ZcenterXZcenterYr.  r/  r0  rotater   Zangler1  r2  ZskewZ
xSkewAngleZ
ySkewAngler3  r  r4  )rq   r   rI   rI   rJ   getTransform  sd        
  zPaint.getTransformr   r'   )r6  r  r  r7  c           	         s   t |}t|  fdddD ]H}|d j}|jtjkrttjdd |D t	}||j
 t|| q|jd krtd S t }ttj|_t|j|\|_|_|_|_|S )Nc                    s
   |   S rn   r<  r?  r>  rI   rJ   r[   G  r\   z&Paint.computeClipBox.<locals>.<lambda>rA  rZ  c                 s   s   | ]}|j  V  qd S rn   )r   rJ  )r   r  rI   rI   rJ   r   M  s     z'Paint.computeClipBox.<locals>.<genexpr>)r   r	   r   rM  r  r(  r   r   r{   r   ra  Zdrawr   Zboundsr  r  r  r  r
   ZxMinZyMinZxMaxZyMax)	rq   r6  r  r  ZpenrE  r@  ZtransformationcbrI   r>  rJ   r  B  s&     



zPaint.computeClipBox)NN)r   )r6   r7   r8   r  r  r5  r   r  r#   r   r8  r:  r$   r=  rF  r   rJ  r  r%   r  r  rI   rI   rI   rJ   r    s   
,   r  )Z
Mark1Array)ZDefaultLangSys)MarkCoverageBaseCoverageZLigatureCoverageZMark1CoverageZMark2CoverageZBacktrackCoverageZInputCoverageZLookAheadCoverageZVertGlyphCoverageZHorizGlyphCoverageZTopAccentCoverageZExtendedShapeCoverageZMathKernCoverage)	ClassDef1	ClassDef2ZBacktrackClassDefZInputClassDefZLookAheadClassDefZGlyphClassDefZMarkAttachClassDef)ZEntryAnchorZ
ExitAnchor
BaseAnchorZLigatureAnchorZMark2AnchorZ
MarkAnchor)Z
XPlaDeviceZ
YPlaDeviceZ
XAdvDeviceZ
YAdvDeviceZXDeviceTableZYDeviceTableZDeviceTable)Z	HorizAxisZVertAxis)ZDefaultMinMax)ZMinCoordZMaxCoord)ZDefJstfLangSys)ZShrinkageEnableGSUBZShrinkageDisableGSUBZExtensionEnableGSUBZExtensionDisableGSUB)ZShrinkageEnableGPOSZShrinkageDisableGPOSZExtensionEnableGPOSZExtensionDisableGPOS)ZShrinkageJstfMaxZExtensionJstfMax)ZTopRightMathKernZTopLeftMathKernZBottomRightMathKernZBottomLeftMathKern)ZVertGlyphConstructionZHorizGlyphConstruction)	MarkArrayZLangSysrF  r  ZAnchorZDeviceZAxisZMinMaxZ	BaseCoordZJstfLangSysZJstfGSUBModListZJstfGPOSModListZJstfMaxZMathKernZMathGlyphConstructionc                 C   s
  d}|j }|jdkr|d }|dk r(|S |jdkr8d}n|jdkrFd}| |j jjj}|| }|jd jj|kr|d }|dk r|S || }q^t	|t
|D ]d}|| }|j|kr||_t	t
|jD ]8}|j| }t|j | }	|	 }
d|
_||
_|
|j|< qqd}|S )a#  Either the offset from the LookupList to a lookup overflowed, or
    an offset from a lookup to a subtable overflowed.

    The table layout is::

      GPSO/GUSB
              Script List
              Feature List
              LookUpList
                      Lookup[0] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents
                      ...
                      Lookup[n] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents

    If the offset to a lookup overflowed (SubTableIndex is None)
            we must promote the *previous* lookup to an Extension type.

    If the offset from a lookup to subtable overflowed, then we must promote it
            to an Extension Lookup type.
    r   Nr   r  r   r  r   )LookupListIndexSubTableIndex	tableTyper  r  r  r  rA  
LookupTyper  r   lookupTypesrM  ExtSubTable)ttfoverflowRecordokr  ZextTypeZlookupslookupsiZsubTableZextSubTableClassextSubTablerI   rI   rJ   fixLookupOverFlows  s<    





r^  c           
      C   s   d}t | j }t|}|jdkr.|d }n|jdkrB|jd }i |_t||D ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr   rF  rI  r)   r  r   )r  r   r   r   itemName	itemIndexr  )
oldSubTablenewSubTablerY  rZ  Z
oldMappingoldLennewLenri   r  r  rI   rI   rJ   splitMultipleSubst  s    




rf  c           
      C   s   d}t | dr| j|_t| j }t|}|jdkr@|d }n|jdkrT|jd }i |_t||D ]*}|| }|d }	|d |j|	< | j|	= qd|S )Nr   r  r_  r)   r  r   )	rG  r  r  r  r   r   r`  ra  r  )
rb  rc  rY  rZ  ZoldAltsrd  re  ri   r  r  rI   rI   rJ   splitAlternateSubst	  s     





rg  c           
      C   s   d}t | j }t|}|jdkr.|d }n|jdkrB|jd }i |_t||D ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr   r_  r)   r  r   )r  r  r   r   r`  ra  r  )
rb  rc  rY  rZ  ZoldLigsrd  re  ri   r  r  rI   rI   rJ   splitLigatureSubst,	  s    




rh  c           	         s  | }d}| j |_ | j dkrt| jdkrdD ]}t||t| | q,| j |_| jj}| j}t| jd |d  | j_|d  | _|d  |j_|d  |_t| j| _t|j|_d}nL| j dkrt| j	dkrt
| dst| j	d j| _dD ]}t||t| | qd| _| j |_| j |_| jj}| jj}| j	}t| j	d tfd	d
| D   fdd|D | j_fdd| D | j_|d  | _	 fdd|D |j_fdd| D |j_|d  |_	t| j	| _t|j	|_d}|S )NFr   )ValueFormat1ValueFormat2r)   TClass2Countr   )rk  rO  ri  rj  c                 3   s   | ]\}}| kr|V  qd S rn   rI   r   krZ   oldCountrI   rJ   r   w	  s      zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}| kr|qS rI   rI   rx  	newGlyphsrI   rJ   r   y	  s      z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}| k r||qS rI   rI   rl  rn  rI   rJ   r
  z	  s      z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}| kr|qS rI   rI   rx  rp  rI   rJ   r   	  s      c                    s"   i | ]\}}| kr||  qS rI   rI   rl  rn  rI   rJ   r
  	  s      )rM  r   ZPairSetr   r   rF  rA  r>  ZPairSetCountZClass1RecordrG  ZClass2Recordrk  	DontSharerN  r  r  r   ZClass1Count)	rb  rc  rY  r  rZ  r   coverager  r  rI   )rq  ro  rJ   splitPairPosF	  sX    



rt  c                 C   s  | j }|dk rdS |d }|| }g g  }}g g  }}	t| jj| jjD ]J\}
}|j|k rp||
 || qH| j|8  _||
 |	| qHg g  }}| jj	D ]J}|
 |
  }}|jd | |_|j|d  |_|| || q| j|_|| j_| j
 |_||j_| j|_|| _ ||_ || j_| j
 |_|	|j_t|| j_t|	|j_|| j_	| j
 |_||j_	t|| j_t||j_dS )Nr)   FT)Z
ClassCountrw  rL  r>  rQ  Z
MarkRecordr  r   Z	BaseArrayZ
BaseRecordrA  rP  rM  rM  r   Z	MarkCountZ	BaseCount)rb  rc  rY  Z
classCountZoldClassCountZnewClassCountZoldMarkCoverageZoldMarkRecordsZnewMarkCoverageZnewMarkRecordsrt   Z
markRecordZoldBaseRecordsZnewBaseRecordsr  ZoldBaseRecordZnewBaseRecordrI   rI   rJ   splitMarkBasePos	  sT    

 




ru  )r)   r_   r*   )r)   r*   r  r  c                 C   s6  | |j  j}|jj|j }|j}|j| }t|ds>d|_dS t|dr|j	j
j}|}|j	}t|j  |j
j }| }	|j|	_|	}
t|j  | }| }||	_	n |j
j}t|j  | }| }|}
t|dr|jd |_zt|j  | }W n( tk
r   td|j | Y dS X ||||}|r2|j|d |
 |S )zj
    An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
    rr  TrW  SubTableCountr   z)Don't know how to split %s lookup type %sF)rT  r  r  r  rR  rS  r  rG  rr  rW  rA  rU  rV  rM  rw  
splitTabler&  rN  errorrr  )rX  rY  r  r[  ZsubIndexZsubtableZsubTableTyper]  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassrc  Z	splitFuncrZ  rI   rI   rJ   fixSubTableOverFlows	  sN    




rz  c                  C   s|  dd l } ddlm} | d}t }|D ]d\}}t}||}|r`|d}|d d }t|}||kr(t||fi }	|dkrd|	_	|	||< q(|D ]R\}}
|
drt|dkr|dd  |kr|| }||dd   }||_||_qt D ]$\}}|| }|D ]}|||< qqttttttttd	ttttttttt d
	dt!it"t#t$t!t%dda&t&d t&d< t&' D ] }| D ]\}}	||	_(qxqldt)ia*t+ddD ]}t,t*d| < qt+ddD ]}t-t*d| < qddl.m/} |D ]\}}||}|rZ|0 \}}t1|}|| }	t2|	ds.i |	_3i |	_4||dd  |\}}||	j3|< ||	j4|< n|| }	|||\|	_3|	_4qd S )Nr   r   )otDataz([A-Za-z0-9]+)Format(\d+)$rv  TZVarr_   )r   r)   r_   r*   rg   r   r   r+   )	r   r)   r_   r*   rg   r   r   r+   r   r*   )r   r   r)   r*   rg   )r  r  ZmortZmorxr  ZJSTFsizer  zss%02dd   zcv%02d)buildConverters
converters)5rer{  r   globalsr   matchgroupr   r   rr  r$  r   Z	NoVarTypeZVarType_equivalentsr   r~  r  r  r  ZContextSubstZChainContextSubstZExtensionSubstZReverseChainSingleSubstZ	SinglePosZPairPosZ
CursivePosZMarkBasePosZ
MarkLigPosZMarkMarkPosZ
ContextPosZChainContextPosZExtensionPosZNoncontextualMorphZRearrangementMorphZContextualMorphZLigatureMorphZInsertionMorphrV  r   rU  rB  r@  r  rD  rE  ZotConvertersr~  r  r  rG  r  convertersByName)r  r{  Z	formatPat	namespacer   r  Z	baseClassmZ
formatTyper  r   ZvarTypeZ	noVarTypebaser  r  Z
lookupEnumenumri   r~  r^  r  r  rI   rI   rJ   _buildClasses
  s    



& " 

r  c                 C   s   | d krg S | j S d S rn   )r>  )rs  rI   rI   rJ   r  
  s    r  )__doc__ro  r  r   	functoolsr   mathr   	itertoolscollectionsr   r   r  r   Z%fontTools.ttLib.tables.TupleVariationr   Z!fontTools.ttLib.tables.otTraverser	   ZfontTools.misc.arrayToolsr
   ZfontTools.misc.roundToolsr   ZfontTools.misc.transformr   r   r   ZfontTools.misc.textToolsr   r   r   ZfontTools.misc.vectorr   ZfontTools.pens.boundsPenr   ZfontTools.pens.transformPenr   ZotBaser   r   r   r   r   ZfontTools.misc.fixedToolsr   r   r   r   r   r   r   r   Z fontTools.feaLib.lookupDebugInfor   r    loggingrW   arraysysr!   typingr"   r#   r$   r%   r&   ZfontTools.ttLib.ttGlyphSetr'   	getLoggerr6   rN  r(   rK   r=   r>   r?   rA   rB   rF   rG   rC   rD   r   r   r   rj   rl   rm   r   objectr   r   r   r   r  r  r  r.  r?  rB  rD  rE  rF  rx   rd  rt  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r^  rf  rg  rh  rt  ru  rx  rz  r  r  rI   rI   rI   rJ   <module>   s  

       z"UA  [L7PKjFz9.
 . 		U?G?;o