
    <`                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ dd	lmZmZmZmZmZ dd
lmZmZ ddlZddlZ ej        e          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z  G d de          Z! G d de          Z" G d de          Z# G d de          Z$ G d de$          Z% G d d e$          Z& G d! d"e$          Z' G d# d$e          Z( G d% d&e          Z) G d' d(e          Z* G d) d*e          Z+ G d+ d,e          Z, G d- d.e          Z- G d/ d0e          Z. G d1 d2e          Z/ G d3 d4e          Z0 G d5 d6e          Z1 G d7 d8e          Z2 G d9 d:e          Z3 G d; d< ed<d=d>g                    Z4 G d? d@e4          Z5 G dA dBe4          Z6 G dC dDe          Z7 G dE dFe          Z8 G dG dHe          Z9 G dI dJ edK                    Z:dLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[Z;d\ Z<d] Z=d^ Z>d_ Z?d` Z@da ZAe=e>e?dbe@eAdcddZBde ZCdf ZD eD             dg ZEdS )hzfontTools.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.
    )IntEnumN)
namedtuple)	bytesjoin)otRound)padsafeEval   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYc                       e Zd Zd ZdS )AATStateTablec                 0    i | _         g | _        g | _        d S N)GlyphClassesStatesPerGlyphLookupsselfs    ?lib/python3.11/site-packages/fontTools/ttLib/tables/otTables.py__init__zAATStateTable.__init__   s    $$+$    N__name__
__module____qualname__r    r   r   r   r      s#            r   r   c                       e Zd Zd ZdS )AATStatec                     i | _         d S r   )Transitionsr   s    r   r   zAATState.__init__"   s    $r   Nr   r!   r   r   r#   r#   !   s#            r   r#   c                   4    e Zd ZdZed             Zd Zd ZdS )	AATActionNc                     dS )NNNr!   )fontstatess     r   compileActionszAATAction.compileActions)   s    	r   c                 .     fd j         D             }|r>|                    dd                    |                     |                                  j        dk    r5|                    dd j        z             |                                 d S d S )Nc                 .    g | ]}j         |         |S r!   )__dict__).0fr   s     r   
<listcomp>z.AATAction._writeFlagsToXML.<locals>.<listcomp>.   s%    
6
6
6T]1%5
61
6
6
6r   Flags,valuer   ReservedFlagsz0x%04X)_FLAGS	simpletagjoinnewliner7   )r   	xmlWriterflagss   `  r   _writeFlagsToXMLzAATAction._writeFlagsToXML-   s    
6
6
6
6dk
6
6
6%
 wchhuoo666	1
T'
'  ) ) ) 	 r   c                 F    || j         v sJ d|z              d| j        |<   d S )Nzunsupported flag %sT)r8   r/   r   flags     r   _setFlagzAATAction._setFlag8   s5    				3d:			$-r   )r   r   r    r8   staticmethodr,   r>   rB   r!   r   r   r'   r'   &   sP        
  ,	 	 	    r   r'   c                       e Zd ZdZdZg dZi ddddddd	d
ddddddddddddddddddddddd d!Zd" Zd# Zd$ Z	d% Z
d& Zd'S )(RearrangementMorphAction   r   )	MarkFirstDontAdvanceMarkLastz	no changer	   u	   Ax ⇒ xA   u	   xD ⇒ Dx   u   AxD ⇒ DxAu   ABx ⇒ xAB   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCx   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxA
   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBA   u   ABxCD ⇒ CDxAB   u   ABxCD ⇒ CDxBA   u   ABxCD ⇒ DCxAB   u   ABxCD ⇒ DCxBAc                 Z    d| _         d| _        d| _        d| _        d| _        d| _        d S Nr   F)NewStateVerbrG   rH   rI   r7   r   s    r   r   z!RearrangementMorphAction.__init__U   s4    $-$)$.$$-$r   c                    |J |                     | j                   | j        dk    r| j        dk    sJ | j                    | j        | j        z  }| j        r|dz  }| j        r|dz  }| j        r|dz  }|                     |           d S )Nr   rV       @      )writeUShortrY   rZ   r7   rG   rH   rI   r   writerr*   actionIndexr=   s        r   compilez RearrangementMorphAction.compile]   s    				T]###	aDIOOOTYOOO
)d(
(%	^$Uf_U	&uu	]#EVOEUr   c                    |J |                                 | _        |                                 }|dz  | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        |dz  | _        d S )NrV   r\   r]   r^   i  )
readUShortrY   rZ   boolrG   rH   rI   r7   r   readerr*   actionReaderr=   s        r   	decompilez"RearrangementMorphAction.decompileg   s    				##%%$-




%ck$)''$.%&.))$uv~&&$-v~$r   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           |                    d| j                   | j                            | j                  }||                    |           |                                 |	                    |           |                                 d S )NrY   r5   rZ   )
begintagr;   r9   rY   r>   rZ   _VERBSgetcommentendtag)r   r<   r*   attrsnameverbComments         r   toXMLzRearrangementMorphAction.toXMLq   s    )T##U###j666	"""fDI...	**+[!!!4r   c                    dx| _         x| _        | _        dx| _        x| _        | _        d |D             }|D ]\  }}}|dk    rt          |d                   | _         '|dk    rt          |d                   | _        H|dk    rt          |d                   | _        i|dk    rE|d                             d	          D ])}|                     |	                                           *d S )
Nr   Fc                 <    g | ]}t          |t                    |S r!   
isinstancetupler0   ts     r   r2   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>   '    8881:a#7#78Q888r   rY   r6   rZ   r7   r3   r4   )
rY   rZ   r7   rG   rH   rI   r   splitrB   strip	r   rr   rq   contentr*   eltNameeltAttrs
eltContentrA   s	            r   fromXMLz RearrangementMorphAction.fromXML   s   344$-4$)d06;;$.;4#dm88888''. 	! 	!#gxXg.//DMM6'*++DII?""!(7"344D7!'',, ! !	]]4::<<    	! 	!r   N)r   r   r    
staticSizeactionHeaderSizer8   rm   r   rc   rj   rt   r   r!   r   r   rE   rE   =   s<       
2
2
2
[
[
 [
 ]	

 ]
 ]
 ]
 ]
 _
 _
 o
 o
 
 
 
  !
&    & & &  ! ! ! ! !r   rE   c                   <    e Zd ZdZdZddgZd Zd Zd Zd Z	d	 Z
d
S )ContextualMorphActionrO   r   SetMarkrH   c                 ^    d| _         d\  | _        | _        d| _        d\  | _        | _        d S )Nr   FF  r   )rY   r   rH   r7   	MarkIndexCurrentIndexr   s    r   r   zContextualMorphAction.__init__   s5    $-#/ $, $&4#$.$###r   c                    |J |                     | j                   | j        }| j        r|dz  }| j        r|dz  }|                     |           |                     | j                   |                     | j                   d S )Nr\   r]   )r_   rY   r7   r   rH   r   r   r`   s        r   rc   zContextualMorphAction.compile   s    				T]###

%	\"5F?5	&uuUT^$$$T&'''''r   c                 <   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        |dz  | _        |                                 | _        |                                 | _        d S )Nr\   r]   i?  )re   rY   rf   r   rH   r7   r   r   rg   s        r   rj   zContextualMorphAction.decompile   s    				##%%$-




%efn%%$,%&.))$v~$$$&&$.''))$r   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           |                    d| j                   |                                 |                    d| j                   |                                 |                    |           |                                 d S )NrY   r5   r   r   )rl   r;   r9   rY   r>   r   r   rp   r   r<   r*   rq   rr   s        r   rt   zContextualMorphAction.toXML   s    )T##U###j666	"""k888n -  / / /4r   c                 $   dx| _         | _        dx| _        | _        d\  | _        | _        d |D             }|D ]\  }}}|dk    rt          |d                   | _         '|dk    rF|d                             d          D ])}|                     |	                                           *s|d	k    rt          |d                   | _        |d
k    rt          |d                   | _        |dk    rt          |d                   | _        d S )Nr   Fr   c                 <    g | ]}t          |t                    |S r!   rw   rz   s     r   r2   z1ContextualMorphAction.fromXML.<locals>.<listcomp>   r|   r   rY   r6   r3   r4   r7   r   r   )
rY   r7   r   rH   r   r   r   r}   rB   r~   r   s	            r   r   zContextualMorphAction.fromXML   s7   '(($-$$$))$,!&4#$.$#88888''. 4 4#gxXg.//DMM7!'',, ! !	]]4::<<    !?""!(7"344D;hw/00DNN>!! '!233D4 4r   N)r   r   r    r   r   r8   r   rc   rj   rt   r   r!   r   r   r   r      st        m
$5 5 5( ( (* * *  4 4 4 4 4r   r   c                       e Zd Zd ZdS )	LigActionc                 "    d| _         d| _        d S )NFr   )StoreGlyphIndexDeltar   s    r   r   zLigAction.__init__   s    $* $r   Nr   r!   r   r   r   r      s#            r   r   c                   ^    e Zd ZdZdZddgZd Zd Zd Ze	d             Z
d	 Zd
 Zd Zd ZdS )LigatureMorphActionrM   rS   SetComponentrH   c                 N    d| _         d\  | _        | _        d| _        g | _        d S )Nr   r   )rY   r   rH   r7   Actionsr   s    r   r   zLigatureMorphAction.__init__   s,    $-(4%$T%$$,,,r   c                    |J |                     | j                   | j        }| j        r|dz  }| j        r|dz  }t          | j                  dk    r|dz  }|                     |           t          | j                  dk    r1|                                 }|                     ||                    d S |                     d           d S )Nr\   r]   r   r^   )r_   rY   r7   r   rH   lenr   compileLigActions)r   ra   r*   rb   r=   actionss         r   rc   zLigatureMorphAction.compile   s    		 	 	 T]###

%	'	&uuEVOEU##%%7	k'*+++++	ar   c                 p   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        t          |dz            }|dz  | _        |                                 }|r|                     ||          | _        d S g | _        d S )Nr\   r]   r^   i  )re   rY   rf   r   rH   r7   _decompileLigActionsr   )r   rh   r*   ri   r=   performActionrb   s          r   rj   zLigatureMorphAction.decompile   s    		!	!	!##%%$-




%56>**$%&.))$uv~&&- v~$!!##+ +++ 4<<< 4<<<r   c                    dt                      i }}}|D ]H}|j                                        D ],\  }}|                    |                                           -It          |d           D ]a}||vr[t          dt          |          d          D ]7}	||	d          }
t          |          |	z   dz  }|                    |
|           8||z  }bt          |d          }||fS )Nr   c                 &    t          |            | fS r   r   xs    r   <lambda>z4LigatureMorphAction.compileActions.<locals>.<lambda>  s    #a&&! r   keyr   rF   )
setr%   itemsaddr   sortedranger   
setdefaultr   )r*   r+   resultr   rb   state_glyphClasstransaisuffixsuffixIndexs               r   r,   z"LigatureMorphAction.compileActions  s   !$ceeR;'& + +e".4466 + +{EKK''))****+ '44555  a{1c!ffa    eVKK!O)[k   
aKFvq>>&
+	r   c                     g }t          | j                  D ]i\  }}|t          | j                  dz
  k    }|j        dz  }||rdndz  }||j        rdndz  }|                    t          j        d|                     jt          |          S )Nr	   ?        r      @z>L)		enumerater   r   r   r   appendstructpackr   )r   r   r   actionlastr6   s         r   r   z%LigatureMorphAction.compileLigActions*  s    &T\** + +iaDL!!A%%4!J.5$%JJA%5&,-JJA-5	==T5))****	6		r   c                 D   g }d}|                     |j        |dz  z             }|sy|                                }t          |dz            }t	                      }|                    |           t          |dz            |_        |dz  }|dk    rd|z   }||_        |y|S )NFrF   r   r   r   i    i   )getSubReaderpos	readULongrf   r   r   r   r   )	r   ri   rb   r   r   rh   r6   r   deltas	            r   r   z(LigatureMorphAction._decompileLigActions4  s    '	$$$kAo%' '& 	"5
uz!
"
"4KK6
>>&uz)**6<:5z%E!6  	" 
.r   c                    dx| _         | _        dx| _        | _        d| _        g | _        d |D             }|D ]\  }}}|dk    rt          |d                   | _         (|dk    rF|d                             d          D ])}|                     |                                           *t|dk    rt          |d                   | _        |d	k    rt                      }	|
                    dd
                              d          }
d |
D             }
d|
v |	_        t          |d                   |	_        | j                            |	           d S )Nr   Fc                 <    g | ]}t          |t                    |S r!   rw   rz   s     r   r2   z/LigatureMorphAction.fromXML.<locals>.<listcomp>J  r|   r   rY   r6   r3   r4   r7   Action c                 6    g | ]}|                                 S r!   r~   )r0   r1   s     r   r2   z/LigatureMorphAction.fromXML.<locals>.<listcomp>V  s     &&&1QWWYY&&&r   r   r   )rY   r7   r   rH   r   r   r}   rB   r~   r   rn   r   r   r   )r   rr   rq   r   r*   r   r   r   rA   r   r=   s              r   r   zLigatureMorphAction.fromXMLE  s|   '(($-$$)..$d&$$,88888''.    #gxXg.//DMM7!'',, ! !	]]4::<<    !?""!(7"344D8[[FLL"%%++C00E&&&&&Ee#FL% " "FL   r   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           | j        D ]R}d|j        fg}|j        r|                    d           |                    d|           |                                 S|	                    |           |                                 d S )NrY   r5   r   )r3   r   r   )
rl   r;   r9   rY   r>   r   r   r   r   rp   )r   r<   r*   rq   rr   r   attribss          r   rt   zLigatureMorphAction.toXML\  s   )T##U###j666	"""  f &"89:7l 'NN%&&&x)))4r   N)r   r   r    r   r   r8   r   rc   rj   rC   r,   r   r   r   rt   r!   r   r   r   r      s         =
)      (   ,6    "     .    r   r   c                   X    e Zd ZdZdZg dZd Zd Zd Zd Z	d Z
d	 Zed
             ZdS )InsertionMorphActionrO   rF   )r   rH   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 v    d| _         | j        D ]}t          | |d           d| _        g g c| _        | _        d S rX   )rY   r8   setattrr7   CurrentInsertionActionMarkedInsertionActionr@   s     r   r   zInsertionMorphAction.__init__s  sO    $-k  d
4u$<>9$t999r   c                    |J |                     | j                   | j        }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }|t          | j
                  dz  z  }|t          | j                  z  }|                     |           t          | j
                  dk    r|t          | j
                           }nd	}|                     |           t          | j                  dk    r|t          | j                           }nd	}|                     |           d S )
Nr\   r]   r^            rL   r   r   )r_   rY   r7   r   rH   r   r   r   r   r   r   r   ry   )r   ra   r*   rb   r=   currentIndexmarkedIndexs          r   rc   zInsertionMorphAction.compilez  sp   		 	 	 T]###

%	\"5F?5	&uu	/	.uu	.uu	-evoe3t*++q00%3t)***%U	$%%))	$
%&&(<< <\"""	#$$q((	$
$%%';; ;[!!!!!r   c                 N   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        | 	                    |||                                 |dz  dz	  	          | _
        | 	                    |||                                 |d
z  	          | _        d S )Nr\   r]   r^   r   r   r   i  rL   )indexcount   )re   rY   rf   r   rH   r   r   r   r   _decompileInsertionActionr   r   rg   s        r   rj   zInsertionMorphAction.decompile  s&   		!	!	!##%%$-




%efn%%$,%&.))$"56>22$!%&.11$!%&.11$ 00$ $ > >					6>a
 !? !" !"$  $==					
&.  >    $r   c                     |dk    s|dk    rg S |                     |j        |dz  z             }fd|                    |          D             S )Nr   r   rJ   c                 :    g | ]}                     |          S r!   getGlyphNamer0   glyphIDr*   s     r   r2   zBInsertionMorphAction._decompileInsertionAction.<locals>.<listcomp>  s7     
8 
8 
8 

G
$
$ 
8 
8 
8r   )r   r   readUShortArray)r   ri   r*   r   r   rh   s     `   r   r   z.InsertionMorphAction._decompileInsertionAction  sv    
f__


9$$eai! !&
8 
8 
8 
8//66
8 
8 
8 8r   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           | j        D ]-}|                    d|           |                                 .| j        D ]-}|                    d|           |                                 .|                    |           |                                 d S )NrY   r5   r   glyphr   )rl   r;   r9   rY   r>   r   r   rp   )r   r<   r*   rq   rr   gs         r   rt   zInsertionMorphAction.toXML  s   )T##U###j666	"""&  a/q999%  a.a8884r   c                    |                                   d |D             }|D ]\  }}}|dk    rt          |d                   | _        '|dk    rF|d                             d          D ])}|                     |                                           *s|dk    r!| j                            |d                    |dk    r!| j                            |d                    J |            d S )	Nc                 <    g | ]}t          |t                    |S r!   rw   rz   s     r   r2   z0InsertionMorphAction.fromXML.<locals>.<listcomp>  r|   r   rY   r6   r3   r4   r   r   r   )	r   r   rY   r}   rB   r~   r   r   r   r   s	            r   r   zInsertionMorphAction.fromXML  s*   --///88888''.  #gxXg.//DMM7!'',, ! !	]]4::<<    !+++&&g   ***%%g    ' r   c                    t                      i d}}}|D ]}}|j                                        D ]a\  }}|j        '|                    t          |j                             |j        '|                    t          |j                             b~t          |d           D ]}||v rt          dt          |                    D ]Z}	t          |          dz  |	z   }
t          |	t          |                    D ]%}||	|dz            }|
                    ||
           &[|D ]/}|                     |          }|t          j        d|          z  }0||fS )Nr   c                 &    t          |            | fS r   r   r   s    r   r   z5InsertionMorphAction.compileActions.<locals>.<lambda>  s    s1vvgq\ r   r   r   rJ   r	   z>H)r   r%   r   r   r   ry   r   r   r   r   r   
getGlyphIDr   r   )r*   r+   r   rb   r   r   r   r   r   start
startIndexlimitglyphsr   r   s                  r   r,   z#InsertionMorphAction.compileActions  s   !$C;' 5 5e".4466 5 5{E#/[[u344555".[[u233444	5 w$9$9::: ) )f aV%% 0 0uf++"e+Juc&kk** 0 0UUQY&'VFJ////0  ) )uooe$$G
fk$(((FF) 
	r   N)r   r   r    r   r   r8   r   rc   rj   r   rt   r   rC   r,   r!   r   r   r   r   l  s        8 8 8C C C" " "4  &8 8 8    $   ,  r   r   c                       e Zd Zd ZddZdS )FeatureParamsc                     t                               |d                   | j        k    s J d|d         d| j        j                    t	          j        | ||           d S )N
FeatureTagz&Wrong FeatureParams type for feature 'z': )featureParamTypesrn   	__class__r   r
   rc   )r   ra   r*   s      r   rc   zFeatureParams.compile  s    			vl3	4	4	F	F	F	F  |B  CO  |P  |P  |P  RV  R`  Ri  Ri  Ij	F	F	FD&$'''''r   Nc                 L    t          j        | |||| j        j                   d S )N)rr   )r
   rt   r  r   r   s        r   rt   zFeatureParams.toXML  s(    /$	4T^5LMMMMMMr   r)   )r   r   r    rc   rt   r!   r   r   r   r     s=        ( ( (N N N N N Nr   r   c                       e Zd ZdS )FeatureParamsSizeNr   r   r    r!   r   r   r  r            r   r  c                       e Zd ZdS )FeatureParamsStylisticSetNr  r!   r   r   r	  r	    r  r   r	  c                       e Zd ZdS )FeatureParamsCharacterVariantsNr  r!   r   r   r  r    r  r   r  c                   .    e Zd ZddZd Zd Zd Zd ZdS )CoverageNc                 8    t          | d          s	g | _        d S d S )Nr   )hasattrr   r   
propagators     r   populateDefaultszCoverage.populateDefaults  s)    	x	 	  4;;; r   c                    | j         dk    r|d         | _        n| j         dk    rug x}| _        |d         }|                                t          |d           }||k    rt                              d           |}~|D ]}|j        t          |          k    sJ |j        t          |          f            |j        }|j	        }	 |
                    |d	          }	n+# t          $ r t                              d
|           Y w xY w	 |
                    |d	          dz   }
n@# t          $ r3 |dk    rt                              d|           t                    }
Y nw xY w|                    fdt          |	|
          D                        n'g | _        t                              d| j                    | ` d S )Nr	   
GlyphArrayrJ   RangeRecordc                     | j         S r   )StartCoverageIndexr   s    r   r   z#Coverage.postRead.<locals>.<lambda>  s	    0D r   r   .GSUB/GPOS Coverage is not sorted by glyph ids.TrequireRealz3Coverage table has start glyph ID out of range: %s.
glyph65535z1Coverage table has end glyph ID out of range: %s.c              3   (   K   | ]}|         V  d S r   r!   )r0   r   
glyphOrders     r   	<genexpr>z$Coverage.postRead.<locals>.<genexpr>-  s(      KK'*W%KKKKKKr   zUnknown Coverage format: %s)Formatr   getGlyphOrderr   logwarningr  r   StartEndr   KeyErrorextendr   )r   rawTabler*   r   rangessorted_rangesrr   endstartIDendIDr  s              @r   postReadzCoverage.postRead
  s   	[A,'4;;{a6DK]#6""$$: &&D&DEEE=KK@AAAF L Lq3v;;...CKK( /..GE
%Cu$77WW   [[FNNNX__Sd_33a7UU   |	kkEsKKK __UUU MMKKKKU7E5J5JKKKKKKK'L* 4;;;,dk:::
kkks$   C$$%DDD++:E('E(c                 r   t          | dd           }|	g x}| _        d}d|i}|j        |rfd|D             }t          |          |k    }|d         }|gg}|dd          D ]>}	|	|dz   k    r1|d                             |           |                    |	g           |	}?|d                             |           |s#t          |          dz  t          |          k     rd}
t          t          |                    D ]m}||         \  }}t                      }||_        |	                    |          |_
        |	                    |          |_        |
|_        |||<   |
|z   |z
  dz   }
n|r1t                              d           |                    d	 
           |D ]}|`d}d|i}|| _        |S )Nr   r	   r  c                 &    g | ]} |          S r!   r!   )r0   	glyphNamer   s     r   r2   z%Coverage.preWrite.<locals>.<listcomp><  s#    >>>zz)$$>>>r   r   rK   r  c                     | j         S r   )StartIDr  s    r   r   z#Coverage.preWrite.<locals>.<lambda>V  s    qy r   r   rJ   r  )getattrr   r   r   r   r   r   r  r5  r   r$  r%  r  r"  r#  sortr   )r   r*   r   formatr(  glyphIDsbrokenOrderr   r)  r   r   r   r   r,  r+  r   s                  @r   preWritezCoverage.preWrite3  s   44((&^6DK&F#(*  '>>>>f>>>8!!X-;
1+4VH6122,  w$(BZt]]G9DD	":T 'S[[1_s6{{22E3v;; % %)ZUC	QQY  ''QWs##QU!QVAYS[5 1$UU *[[ABBB[[(([)))  	
Fv&H $+	/r   c                     t          | dg           D ]-}|                    d|           |                                 .d S )Nr   Glyphr5   )r6  r9   r;   )r   r<   r*   r2  s       r   toXML2zCoverage.toXML2`  sU    42..  iwi000 r   c                 t    t          | dd           }|	g }|| _        |                    |d                    d S )Nr   r6   )r6  r   r   )r   rr   rq   r   r*   r   s         r   r   zCoverage.fromXMLe  s@    44((&^64;--gr   r   r   r   r    r  r/  r;  r>  r   r!   r   r   r  r    sf           ' ' 'R+ + +Z  
         r   r  c                   .    e Zd ZddZd Zd Zd Zd ZdS )	VarIdxMapNc                 8    t          | d          s	i | _        d S d S Nmappingr  rE  r  s     r   r  zVarIdxMap.populateDefaultso  )    	y	!	! 4<<< r   c                    |d         dz  dk    sJ |                                 }|d         }|                    |d         gt          |          t          |          z
  z             t          t	          ||                    | _        d S )NEntryFormati  r   rE  r3  )r!  r'  r   dictziprE  )r   r(  r*   r  mapLists        r   r/  zVarIdxMap.postReads  s    
=
!F
*q	0	0	0	0!!##*Y'	..'"+#j//CLL"@ABBBc*g..//$,,,r   c                 D  
 t          | dd           

	i x
| _        |                                }
fd|D             
t          
          dk    r:
d         
d         k    r(
d= t          
          dk    r
d         
d         k    (d
i}t          
          |d<   d}
D ]}||z  }|dz  }d}|r|dz  }|dz  }|t	          |d          }|d	k    sJ |d	|z
  z	  |d|z  dz
  z  z  }|d
k    rd}n|dk    rd}n|dk    rd}nd}|dz
  dz  |dz
  z  }	|	|d<   |S )NrE  c                      g | ]
}|         S r!   r!   )r0   r   rE  s     r   r2   z&VarIdxMap.preWrite.<locals>.<listcomp>  s    ,,,AWQZ,,,r   r	   r3  MappingCountr   r         rJ   i rK   rF   rI  )r6  rE  r!  r   max)r   r*   r  r(  oredidxinner	innerBits	entrySizeentryFormatrE  s             @r   r;  zVarIdxMap.preWritez  s   D)T**'_7T\!!##*,,,,,,,'GqWR[GBK77r{ 	GqWR[GBK77 '#( \\(>	
$  c3;44
-%) >9Q;5 	  )Q)	b
2i<
 TalA-=%>	?$z99z99z999a-A%)a-8+'(=	/r   c                     t          t          | di                                                     D ]@\  }}d|fd|dz	  fd|dz  ff}|                    d|           |                                 Ad S )NrE  r   outerrQ  rV  r   Map)r   r6  r   r9   r;   )r   r<   r*   r   r6   rq   s         r   r>  zVarIdxMap.toXML2  s    WT9b99??AABB  leUeerkefn5
 ue$$$ r   c                    t          | dd           }|	i }|| _        	 |d         }n'#  |                                |d                  }Y nxY wt          |d                   }t          |d                   }|dk    sJ |dz  |z  ||<   d S )NrE  r   r   r[  rV  r   rQ  )r6  rE  r!  r   )	r   rr   rq   r   r*   rE  r   r[  rV  s	            r   r   zVarIdxMap.fromXML  s    D)T**'_74<0>550g/555
5>
"
"%
5>
"
"%	&RK5('%...s	   ' "Ar   r@  r!   r   r   rB  rB  m  se           0 0 0& & &P  ) ) ) ) )r   rB  c                       e Zd Zd ZdS )VarRegionListc                     |                     d          }|rt          |j                  | _        i | j        dt          | j        d          iS )NfvarRegionAxisCount)rn   r   axesrb  r/   r   )r   r*   	fvarTables      r   r;  zVarRegionList.preWrite  s_     hhv) .in--4
	]
nT]4EFF
 
 r   Nr   r   r    r;  r!   r   r   r_  r_    s#            r   r_  c                   .    e Zd ZddZd Zd Zd Zd ZdS )SingleSubstNc                 8    t          | d          s	i | _        d S d S rD  rF  r  s     r   r  zSingleSubst.populateDefaults  rG  r   c                    i }t          |d                   }| j        dk    rN|d         fd|D             }fd|D             }fd|D             }t          ||          D ]
\  }}	|	||<   nd| j        dk    rGt          |          |d         k    s
J d	            |d
         }
t          ||
          D ]
\  }}|||<   nJ d| j        z              || _        | `d S )Nr  r	   DeltaGlyphIDc                 :    g | ]}                     |          S r!   )r   )r0   rr   r*   s     r   r2   z(SingleSubst.postRead.<locals>.<listcomp>  s%    ;;;D$//$'';;;r   c                      g | ]
}|z   d z  S )   r!   )r0   r   r   s     r   r2   z(SingleSubst.postRead.<locals>.<listcomp>  s"    CCCW%5(CCCr   c                 :    g | ]}                     |          S r!   r   r   s     r   r2   z(SingleSubst.postRead.<locals>.<listcomp>  s'    CCCw!!'**CCCr   rJ   
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTabler   rK  r   rE  )r   r(  r*   rE  input	inputGIDSoutGIDSoutNamesinpoutsubstsubr   s     `         @r   r/  zSingleSubst.postRead  s=   '
%hz&:
;
;%	[AN#5;;;;E;;;9CCCC	CCC7CCCC'CCC8uh''  xsCGCLL{a
e**.
.
.
.' /
.
.L!5ue$$  xsCGCLL 0!DK////$,
kkkr   c                    t          | dd           }|	i x}| _        t          |                                          }|j        fd|D             }t          t          ||                    }d}d }|D ]\  }}	||	|z
  dz  }||z   dz  |	k    r n|d}nd}i }
|| _        t                      }d |D             }d |D             }||_	        ||
d<   |dk    r
|J ||
d	<   n||
d
<   |
S )NrE  c                 B    g | ]\  }} |           |          fS r!   r!   )r0   r   br   s      r   r2   z(SingleSubst.preWrite.<locals>.<listcomp>  s2    >>>1zz!}}jjmm,>>>r   rJ   rm  r	   c                 *    g | ]}|d          d         S )r	   r   r!   r0   items     r   r2   z(SingleSubst.preWrite.<locals>.<listcomp>       333TT1Xa[333r   c                 *    g | ]}|d          d          S r	   r!   r  s     r   r2   z(SingleSubst.preWrite.<locals>.<listcomp>  r  r   r  rj  rp  )
r6  rE  listr   r   r   rK  r   r  r   )r   r*   rE  r   gidItemssortableItemsr8  r   inIDoutIDr(  covrs  ry  r   s                 @r   r;  zSingleSubst.preWrite  sQ   D)T**'_7T\
w}}

%*>>>>>>>(Xu--..- &
%  kdEmT\U"Ee|u%%
U & mFFF($+

#33]333%33]333%#*(:q[[



#8N!8L	/r   c                     t          | j                                                  }|D ]5\  }}|                    dd|fd|fg           |                                 6d S )NSubstitutioninrx  )r   rE  r   r9   r;   )r   r<   r*   r   inGlyphoutGlyphs         r   r>  zSingleSubst.toXML2  s{    
##%%
&
&%   gx~Wox()+ + + r   c                 `    t          | dd           }|	i }|| _        |d         ||d         <   d S )NrE  rx  r  )r6  rE  )r   rr   rq   r   r*   rE  s         r   r   zSingleSubst.fromXML  s<    D)T**'_74<u'%+r   r   r@  r!   r   r   rg  rg    se             *% % %N  & & & & &r   rg  c                   D    e Zd ZddZd Zd Zd Zd Zed             Z	dS )	MultipleSubstNc                 8    t          | d          s	i | _        d S d S rD  rF  r  s     r   r  zMultipleSubst.populateDefaults!  rG  r   c                     i }| j         dk    rEt          |d                   }d |d         D             }t          t          ||                    }nJ d| j         z              || _        | ` d S )Nr	   r  c                     g | ]	}|j         
S r!   )rp  )r0   ss     r   r2   z*MultipleSubst.postRead.<locals>.<listcomp>)  s    777QAL777r   Sequencer   rq  )r   rr  rJ  rK  rE  )r   r(  r*   rE  r   ry  s         r   r/  zMultipleSubst.postRead%  s}    '	[A'(<==677(:"67775#fe$$%%77/!DK////$,
kkkr   c                     t           dd           	i x _        t                      }t          t	                                                    |j                  |_        d _        | fd|j        D             d}|S )NrE  r   r	   c                 F    g | ]}                     |                   S r!   )makeSequence_)r0   r   rE  r   s     r   r2   z*MultipleSubst.preWrite.<locals>.<listcomp>9  s;     %> %> %>). &*%7%7%G%G %> %> %>r   )r  r  )	r6  rE  r  r   r  keysr   r   r   )r   r*   r  r(  rE  s   `   @r   r;  zMultipleSubst.preWrite0  s    D)T**'_7T\

#d7<<>>**@@@#*$+$'%> %> %> %> %>25*%> %> %> (
 
/r   c                     t          | j                                                  }|D ]J\  }}d                    |          }|                    dd|fd|fg           |                                 Kd S )Nr4   r  r  rx  )r   rE  r   r:   r9   r;   )r   r<   r*   r   r  	outGlyphsrx  s          r   r>  zMultipleSubst.toXML2>  s    
##%%
&
&%!  gy	)		3~Wos|$& & &	 r   c                 z   t          | dd           }|	i }|| _        |dk    rPg | _        |D ]D}t          |t                    s|\  }}}	|dk    r | j                            |d                    Ed S |dk    rt          |                    dt          |                              }
| j        |
         }g x}||<   |D ]?}t          |t                    s|\  }}}	|dk    r|                    |d                    @d S |d         r|d         	                    d	          ng }d
 |D             ||d         <   d S )NrE  r  r=  r6   r  r   rp  rx  r4   c                 6    g | ]}|                                 S r!   r   )r0   r   s     r   r2   z)MultipleSubst.fromXML.<locals>.<listcomp>d  s     777!''))777r   r  )
r6  rE  old_coverage_rx   ry   r   intrn   r   r}   )r   rr   rq   r   r*   rE  elementelement_nameelement_attrs_r   r   glyph_mappingr  s                 r   r   zMultipleSubst.fromXMLF  s   D)T**'_74< 
Z4 7 7wgu%% %,"L-w	}W5666	6	Zuyy#g,,//005e$5$&&=75> 2 2wgu%% %,"L-|##-0111	6 */u=eEl  %%%2)77Y777'%+r   c                 0    t                      }| |_        |S r   )r  rp  )r   seqs     r   r  zMultipleSubst.makeSequence_f  s    

##.	*r   r   )
r   r   r    r  r/  r;  r>  r   rC   r  r!   r   r   r  r    s           	 	 	    8 8 8@   ,  r   r  c                   4    e Zd ZddZd Zd Zd Zd Zd ZdS )	ClassDefNc                 8    t          | d          s	i | _        d S d S )N	classDefs)r  r  r  s     r   r  zClassDef.populateDefaultso  )    	{	#	# 4>>> r   c                 \   i }|                                 }| j        dk    r|d         }|d         }	 |                    |d          }n:# t          $ r- t                              d|           t          |          }Y nw xY w|t          |          z   }|t          |          k    r8t                              d|t          |                     t          |          }t          t          ||          |          D ]\  }	}
|
r|
|||	         <   n| j        dk    r|d	         }|D ]}|j	        }|j
        }|j        }
	 |                    |d          }n+# t          $ r t                              d|           Y Ww xY w	 |                    |d          dz   }n@# t          $ r3 |d
k    rt                              d|           t          |          }Y nw xY wt          ||          D ]}	|
r|
|||	         <   n t                              d| j                   || _        | `d S )Nr	   
StartGlyphClassValueArrayTr  z3ClassDef table has start glyph ID out of range: %s.z=ClassDef table has entries for out of range glyph IDs: %s,%s.rJ   ClassRangeRecordr  z1ClassDef table has end glyph ID out of range: %s.zUnknown ClassDef format: %s)r!  r   r   r&  r"  r#  r   rK  r   r$  r%  Classr  )r   r(  r*   r  r  r   	classListr-  r.  r   clsrecordsrecr,  s                 r   r/  zClassDef.postReads  s   )!!##*	[AL!5)*9ooeo66GG
   KKEuMMM*ooGGG S^^#5c*ooKKO
C	NN   
OOE5%00)<< * *|w
 *&)Yz'"#* {a()7 + +sIE
'C
)Cu$77WW   [[FNNNX__Sd_33a7UU   |	kkEsKKK __UUU %(( + + +'*i
7#$+%+, ;;,dk:::$.
kkks5   A 4BBE%FFF!!:GGc                    t          | dd           }|	i | _        d S |j        }g }|                                D ])\  }}|s|                     ||          ||f           *|r|                                 |d         \  }}}	|	||gg}
|dd          D ]P\  }}}||dz   k    s||	k    r5|
d                             ||g           |
                    |||g           |}|}|}	Q|
d                             ||g           |
S d S )Nr  r   r	   r3  )r6  r  r   r   r   r7  r'  )r   r*   r  r   r   r2  r  r   lastNamelastClsr)  r   s               r   _getClassRangeszClassDef._getClassRanges  s[   dK..)4>	6*
%!)) 9 9ni
 <<I&&	378888
 ::<<<"1X47tX&'6"')  w	3$(cWnnBZh'(((]]C),---DHGG	":dH%&&&
= r   c                    d}dg i}|                      |          }|r|d         d         }|d         d         }||z
  dz   }t          |          dz  |dz   k     r\t          t          |                    D ]8}||         \  }	}
}}}t                      }||_        ||_        |	|_        |||<   9d}d|i}nG|d         d         }dg|z  }|D ])\  }	}
}}}t          |
|z
  ||z
  dz             D ]}|	||<   *d}||d}|| _        |S )NrJ   r  r   r	   r3  rK   )r  r  )r  r   r   r  r$  r%  r  r   )r   r*   r8  r(  r)  
startGlyphendGlyph
glyphCountr   r  r   	startNamer,  endNamer  startGlyphNameclassesr   s                     r   r;  zClassDef.preWrite  sg   & "%(%%& Jq	!:Rjm8:%):	&kkAo
Q&&3v;;  +1!9(S%CSSYSWSYVAYYF"F+HH AYq\NcJG/5  +UIsGEJ&j(81(<==  gajjF,IIH$+	/r   c                     t          | j                                                  }|D ]5\  }}|                    dd|fd|fg           |                                 6d S )Nr  r   class)r   r  r   r9   r;   )r   r<   r*   r   r2  r  s         r   r>  zClassDef.toXML2  ss    
%%''
(
(%  nizWi$87C.#IJJJ r   c                 z    t          | dd           }|	i }|| _        t          |d                   ||d         <   d S )Nr  r  r   )r6  r  r  )r   rr   rq   r   r*   r  s         r   r   zClassDef.fromXML  sE    dK..)94>!%.11)E'Nr   r   )	r   r   r    r  r/  r  r;  r>  r   r!   r   r   r  r  m  st           2 2 2h  2  >  2 2 2 2 2r   r  c                   .    e Zd ZddZd Zd Zd Zd ZdS )AlternateSubstNc                 8    t          | d          s	i | _        d S d S )N
alternates)r  r  r  s     r   r  zAlternateSubst.populateDefaults  s)    	|	$	$ 4??? r   c                    i }| j         dk    r`t          |d                   }|d         }t          |          t          |          k    sJ t          ||          D ]\  }}|j        ||<   nJ d| j         z              || _        | ` d S )Nr	   r  AlternateSetr   rq  )r   rr  r   rK  	Alternater  )r   r(  r*   r  rs  altsrw  alts           r   r/  zAlternateSubst.postRead  s    *	[A&x
';<<5
>
"4
e**D		
!
!
!
!eD// $ $ws3mJsOO$ 0!DK////$/
kkkr   c                    d| _         t          | dd           }|	i x}| _        t          |                                          }t          t          |                    D ](}||         \  }}|                    |          ||f||<   )|                                 t                      }d |D             |_
        g }d |D             }|D ],}t                      }	||	_        |                    |	           -d| _        ||dS )Nr	   r  c                     g | ]
}|d          S r  r!   r  s     r   r2   z+AlternateSubst.preWrite.<locals>.<listcomp>      +++Ta+++r   c                     g | ]
}|d          S r3  r!   r  s     r   r2   z+AlternateSubst.preWrite.<locals>.<listcomp>  s    )))4d2h)))r   )r  r  )r   r6  r  r  r   r   r   r   r7  r  r   r  r  r   sortCoverageLast)
r   r*   r  r   r   r2  r   r  setListr  s
             r   r;  zAlternateSubst.preWrite   s   $+t\400*"$$:
z!!
"
"%U 9 9a!H>9cooi(()S8588**,,,

#++U+++#**))5)))'  c
..44>T $:	6	66r   c                 j   t          | j                                                  }|D ]\  }}|                    d|           |                                 |D ]-}|                    d|           |                                 .|                    d           |                                 d S )Nr  r   r  )r   r  r   rl   r;   r9   rp   )r   r<   r*   r   r2  r  r  s          r   r>  zAlternateSubst.toXML2  s    
&&((
)
)%$  inI666  s3///N### r   c                     t          | dd           }|	i }|| _        |d         }g }|||<   |D ]9}t          |t                    s|\  }}}|                    |d                    :d S )Nr  r   )r6  r  rx   ry   r   )	r   rr   rq   r   r*   r  r2  r   r  s	            r   r   zAlternateSubst.fromXML%  s    t\400*:4?Gn)
#*Y  g
We
$
$ !4::eGn	 r   r   r@  r!   r   r   r  r    sd             7 7 74	 	 	    r   r  c                   .    e Zd ZddZd Zd Zd Zd ZdS )LigatureSubstNc                 8    t          | d          s	i | _        d S d S )N	ligatures)r  r  r  s     r   r  zLigatureSubst.populateDefaults6  r  r   c                 @   i }| j         dk    rut          |d                   }|d         }t          |          t          |          k    sJ t          t          |                    D ]}||         j        |||         <   nJ d| j         z              || _        | ` d S )Nr	   r  LigatureSetr   rq  )r   rr  r   r   Ligaturer  )r   r(  r*   r  rs  ligSetsr   s          r   r/  zLigatureSubst.postRead:  s    )	[A&x
';<<5m$7
e**G
$
$
$
$#e** . .q!!*-IeAh. 0!DK////$.
kkkr   c                    d| _         t          | dd           }|	i x}| _        |rt          t	          t          |                    t                    rt                      }t          |	                                d           D ]l\  }}t                      }|dd          |_        t          |          |_        ||_        |                    |d         g                               |           m|}t#          |	                                          }t%          t          |                    D ](}||         \  }	}
|                    |	          |	|
f||<   )|                                 t+                      }d |D             |_        g }d |D             }|D ]H}
t/                      }g x}|_
        |
D ]}|                    |           |                    |           Id| _        ||dS )	Nr	   r  c                 >    t          | d                    | d         fS )Nr   r   )r  s    r   r   z(LigatureSubst.preWrite.<locals>.<lambda>S  s    T!WtTUw?W r   r   r   c                     g | ]
}|d          S r  r!   r  s     r   r2   z*LigatureSubst.preWrite.<locals>.<listcomp>a  r  r   c                     g | ]
}|d          S r  r!   r  s     r   r2   z*LigatureSubst.preWrite.<locals>.<listcomp>d  s    ***4d2h***r   )r  r  )r   r6  r  rx   nextiterry   rJ  r   r   r  	Componentr   	CompCountLigGlyphr   r   r  r   r   r7  r  r   r  r  )r   r*   r  newLigaturescompsligligaturer   r   r2  r   r  r  r  ligSetligss                   r   r;  zLigatureSubst.preWriteG  s   $+dK..) ""9t~ :d4	??33U;; 
 &&<9??,,2W2WXXX ; ;yuSzzHqrrHUHHE!Hb))00::::9
y  
!
!%U 9 9a!H>9cooi(()S8588**,,,

#++U+++#*'**5***'  cMM64&/  sKK
>>& $'	2	22r   c           	         t          | j                                                  }|D ]\  }}|                    d|           |                                 |D ]K}|                    d|j        d                    |j                             |                                 L|	                    d           |                                 d S )Nr  r   r  r4   )r   
components)
r   r  r   rl   r;   r9   r  r:   r  rp   )r   r<   r*   r   r2  r  r  s          r   r>  zLigatureSubst.toXML2q  s    
%%''
(
(%!  im9555  s
#,''  ) ) )M""" r   c                 |   t          | dd           }|	i }|| _        |d         }g }|||<   |D ]}t          |t                    s|\  }}}t	                      }	|d         |	_        |d         }
|
r|
                    d          ng |	_        t          |	j                  |	_	        |
                    |	           d S )Nr  r   r  r4   )r6  r  rx   ry   r  r  r}   r  r   r  r   )r   rr   rq   r   r*   r  r2  r  r  r  r  s              r   r   zLigatureSubst.fromXML}  s    dK..)94>Gn)	$)I 	 	g
We
$
$ !4	3.3<l#:,6>:##C(((B3=s}%%3=;;s	 	r   r   r@  r!   r   r   r  r  4  se             (3 (3 (3T
 
 
    r   r  c                       e Zd Zd Zd ZdS )COLRc                 ^   |                     d          }|                                 D ]^}|j        dk    r|                    |j                   (|                     d          }|                    ||i           ||j        <    nt          d          t          j	        | ||          S )Nr   )offsetLayerRecordCount)	tableDictz$LayerRecordCount converter not found)
r   getConvertersrr   advancer   getConverterByNamereadAssertionErrorr
   rj   )r   rh   r*   	subReaderconvs        r   rj   zCOLR.decompile  s     !!!++)  "" @ @d
i%%%do&&&

!
!"4
5
54yyDBy??6$)5	>	?	??		T64	0	00r   c                 P    d | _         i | j        dt          | j        d          iS )Nr  )r  r/   r   r   r*   s     r   r;  zCOLR.preWrite  s<     $
	]
~dm5GHH
 
 r   N)r   r   r    rj   r;  r!   r   r   r  r    s2        1 1 1$    r   r  c                   4     e Zd Zed             Z fdZ xZS )
LookupListc                     | j         D ]b}|j        D ]X}t          |          j                            d          r  dS t          |          j                            d          r  dS Yct
          )NSubstGSUBPosGPOS)LookupSubTabletyper   endswith
ValueError)r   lsts      r   tablezLookupList.table  s    ;  aZ  rBxx!!'** FFFBxx!!%(( FFF
 	r   c           
         |rd|vst           |d         j        vr"t                                          ||          S |d         j        t                    | j                 }|                                 D ]G}|j        rt          | |j        g           }t          |          D ]\  }}t          |          |v rt          |t          |                    }|j        }	|j        r|j         d|	 }	|j        r|j        \  }
}}|	 d| d|
 d| d}	|                    |	           |                                 |                    ||||j        d|fg           |j        r%t%          |j        d t'          |                     st          | |j        d           }|                    ||||j        g            Id S )NDebgz: z in z (/)r   )r   datasuperr>  r  r  repeatr6  rr   r   strr   locationfeaturero   r;   xmlWriteauxevalvars)r   r<   r*   	debugDatar  r6   lookupIndexr  infotagscriptlanguager  r  s                r   r>  zLookupList.toXML2  s   	 *t##'<DLDU'U'U
''..D
)
))6l 56tzB)  "" 9 9d
k 9D$)R((E&u-- ! !TKI%%iK(8(89:dMc	 #	""S""s	 9!%vhw8888F88X888s	]]9dD$)	+! ! ! !! x TXtT$ZZ88 D$)T**EMM)T5$)R8888+9 9r   )r   r   r    propertyr  r>  __classcell__r  s   @r   r  r    sQ        
  (9 9 9 9 9 9 9 9 9r   r  c                       e Zd Zd ZdS )BaseGlyphRecordArrayc                 r    t          | j        fd          | _        | j                                        S )Nc                 8                         | j                  S r   r   	BaseGlyphr  r*   s    r   r   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>      4??3=11 r   r   )r   BaseGlyphRecordr/   copyr  s    `r   r;  zBaseGlyphRecordArray.preWrite  sB    1111  $ 
				r   Nre  r!   r   r   r'  r'    #            r   r'  c                       e Zd Zd ZdS )BaseGlyphListc                 r    t          | j        fd          | _        | j                                        S )Nc                 8                         | j                  S r   r*  r,  s    r   r   z(BaseGlyphList.preWrite.<locals>.<lambda>  r-  r   r   )r   BaseGlyphPaintRecordr/   r/  r  s    `r   r;  zBaseGlyphList.preWrite  sB    $1111  $ 
				r   Nre  r!   r   r   r2  r2    r0  r   r2  c                   B     e Zd ZdZdZd fd	Ze fd            Z xZS )VariableValuer!   N    c                     t                                          | | j        r|                     |          n||          S r   )r  __new___value_mapper)r  r6   varIdxr  s      r   r:  zVariableValue.__new__  sA    	"0;3Ue	
 
 r   c                 
   | j         r[t          |          }	 t          |          }|                      |          }t          j        |f|          }n# t
          $ r Y nw xY wt                                          |          S r   )r;  r  r  	itertoolschainStopIterationr  _make)r  iterableitr6   r  s       r   rA  zVariableValue._make  s     -X2-HHE e$$Ex,,HH	  	 	 	D	
 
x	 	  s   A 
A! A!)r8  )	r   r   r    	__slots__r;  r:  classmethodrA  r$  r%  s   @r   r7  r7    sl              
! 
! 
! 
! +
! 
! 
! 
! 
!r   r7  r6   r<  c                       e Zd ZdZeZdS )VariableFloatr!   N)r   r   r    rD  floatr;  r!   r   r   rG  rG    s        r   rG  c                       e Zd ZdZeZdS )VariableIntr!   N)r   r   r    rD  r   r;  r!   r   r   rJ  rJ  
  s        r   rJ  c                       e Zd ZdZdZdZdS )
ExtendModer   r	   rJ   N)r   r   r    PADREPEATREFLECTr!   r   r   rL  rL    s        
r   rL  c                   z    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S )CompositeModer   r	   rJ   rK   rF   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rQ                                N)r   r   r    CLEARSRCDESTSRC_OVER	DEST_OVERSRC_INDEST_INSRC_OUTDEST_OUTSRC_ATOP	DEST_ATOPXORSCREENOVERLAYDARKENLIGHTENCOLOR_DODGE
COLOR_BURN
HARD_LIGHT
SOFT_LIGHT
DIFFERENCE	EXCLUSIONMULTIPLYHSL_HUEHSL_SATURATION	HSL_COLORHSL_LUMINOSITYr!   r   r   rQ  rQ    s        	
	
	

r   rQ  c                       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!S )"PaintFormatr	   rJ   )rK   rF   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[              r       N)#r   r   r    PaintColrLayers
PaintSolidPaintVarSolidPaintLinearGradientPaintVarLinearGradientPaintRadialGradientPaintVarRadialGradientPaintSweepGradientPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformPaintVarTransformPaintTranslatePaintVarTranslate
PaintScalePaintVarScalePaintScaleAroundCenterPaintVarScaleAroundCenterPaintScaleUniformPaintVarScaleUniformPaintScaleUniformAroundCenter PaintVarScaleUniformAroundCenterPaintRotatePaintVarRotatePaintRotateAroundCenterPaintVarRotateAroundCenter	PaintSkewPaintVarSkewPaintSkewAroundCenterPaintVarSkewAroundCenterPaintCompositer!   r   r   rx  rx  5  s        !#$&! r   rx  c                   .    e Zd Zd ZddZd ZdefdZdS )Paintc                     	 t          | j                  j        S # t          $ r t	          d| j                   w xY w)NzUnknown Paint format: )rx  r   rr   r  NotImplementedErrorr   s    r   getFormatNamezPaint.getFormatNameZ  sS    E
dk
"
"
''	 E E E	CdkCC	D	DDEs    "=Nc                    |r|n| j         j        }|g }|                    d| j        f           |                    ||           |                    |                                            |                                 |                     ||           |	                    |           |                                 d S )Nr   )
r  r   r   r   rl   ro   r  r;   r>  rp   )r   r<   r*   rq   rr   	tableNames         r   rt   zPaint.toXML`  s    7dd 7)
]5,,$+&'''Y&&&D&&(()))++i9r   c                    | j         t          j        k    r&|j        j        | j        | j        | j        z            S | j         t          j        k    r@|j        j	        D ]}|j
        | j        k    r
|j        gc S t          | j        d          g }|                                 D ]S}|j        Jt          |j        t!          |                     r(|                    t%          | |j                             T|S )Nz not in colr.BaseGlyphList)r   rx  r~  	LayerListr  FirstLayerIndex	NumLayersr  r2  r5  r+  r=  r&  r  
tableClass
issubclassr	  r   r6  rr   )r   colrrecordchildrenr  s        r   getChildrenzPaint.getChildrenl  s   	[K///
.
4/$.@@  
[K...#8 @ @v4:%%\N & dj>>>
?
??(  "" . .d
o!j$t**&M&M!OOGD$),,---	/r   r  c                    t          |          st          d          | g}t                      }|r|                                }t	          |          |v r( ||           |                    t	          |                     |                    t          |                    |                               |dS dS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callableN)	callable	TypeErrorr   popidr   r'  reversedr  )r   r  callbackstackvisitedcurrents         r   traversezPaint.traverse  s    	(		 0	.	/	//&%EE' 5YY[[7kkW8G
;;r'{{<<,,T2233444 	 5 5 5 5 5r   r)   )r   r   r    r  rt   r  r  r  r!   r   r   r  r  X  sd        E E E
 
 
 
  (5$ 5 5 5 5 5 5r   r  uint8)
Mark1Array)DefaultLangSys)MarkCoverageBaseCoverageLigatureCoverageMark1CoverageMark2CoverageBacktrackCoverageInputCoverageLookAheadCoverageVertGlyphCoverageHorizGlyphCoverageTopAccentCoverageExtendedShapeCoverageMathKernCoverage)	ClassDef1	ClassDef2BacktrackClassDefInputClassDefLookAheadClassDefGlyphClassDefMarkAttachClassDef)EntryAnchor
ExitAnchor
BaseAnchorLigatureAnchorMark2Anchor
MarkAnchor)
XPlaDevice
YPlaDevice
XAdvDevice
YAdvDeviceXDeviceTableYDeviceTableDeviceTable)	HorizAxisVertAxis)DefaultMinMax)MinCoordMaxCoord)DefJstfLangSys)ShrinkageEnableGSUBShrinkageDisableGSUBExtensionEnableGSUBExtensionDisableGSUB)ShrinkageEnableGPOSShrinkageDisableGPOSExtensionEnableGPOSExtensionDisableGPOS)ShrinkageJstfMaxExtensionJstfMax)TopRightMathKernTopLeftMathKernBottomRightMathKernBottomLeftMathKern)VertGlyphConstructionHorizGlyphConstruction)	MarkArrayLangSysr  r  AnchorDeviceAxisMinMax	BaseCoordJstfLangSysJstfGSUBModListJstfGPOSModListJstfMaxMathKernMathGlyphConstructionc                 <   d}|j         }|j        |dz
  }|dk     r|S |j        dk    rd}n|j        dk    rd}| |j                 j        j        j        }||         }|j        d         j        j        |k    r0|dz
  }|dk     r|S ||         }|j        d         j        j        |k    0||_        t          t          |j                            D ]I}|j        |         }t          |j                 |         }	 |	            }
d|
_        ||
_        |
|j        |<   Jd}|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  rN   r  rP   )LookupListIndexSubTableIndex	tableTyper  r  r  r  r  
LookupTyper   r   lookupTypesr   ExtSubTable)ttfoverflowRecordokr  extTypelookupslookupsisubTableextSubTableClassextSubTables              r   fixLookupOverFlowsr    sM   0 -!)a+!OO	)&&''&(('~'(.9@
+
q#.'99Q+1__
9;&	 q#.'99 V_%%&& $ $R_R ( !9:7C  ""++$+#&/"
r   c                 @   d}t          | j                                                  }t          |          }|j        dv r|dz  }n|j        dk    r
|j        dz
  }i |_        t          ||          D ]*}||         }|d         }	|d         |j        |	<   | j        |	= +|S )Nr	   r  r  rJ   r  r   )r   rE  r   r   itemName	itemIndexr   )
oldSubTablenewSubTabler	  r
  
oldMappingoldLennewLenr   r  r   s
             r   splitMultipleSubstr    s    [(..0011
j//::: Q;&&++ #a'&


  Q	A$Q#!!W+c#
r   c                 x   d}t          | d          r| j        |_        t          | j                                                  }t          |          }|j        dv r|dz  }n|j        dk    r
|j        dz
  }i |_        t          ||          D ]*}||         }|d         }	|d         |j        |	<   | j        |	= +|S )Nr	   r  r  rJ   r  r   )	r  r  r   r  r   r   r  r  r   )
r  r  r	  r
  oldAltsr  r  r   r  r   s
             r   splitAlternateSubstr    s    K+,, >!,!=++(..0011
g,,;;; 19&&// #a'&


 " "Q	$Q# $Q+S!!
r   c                 @   d}t          | j                                                  }t          |          }|j        dv r|dz  }n|j        dk    r
|j        dz
  }i |_        t          ||          D ]*}||         }|d         }	|d         |j        |	<   | j        |	= +|S )Nr	   r  rJ   r  r   )r   r  r   r   r  r  r   )
r  r  r	  r
  oldLigsr  r  r   r  r   s
             r   splitLigatureSubstr"  "  s    +'--//00
g,,;;; 19&&.. #a'&


 ! !Q	$Q##Aw+C  
r   c           	      4  	
 | }d}| j         |_         | j         dk    r t          | j                  dk    rdD ]!}t          ||t	          | |                     "| j                                        |_        | j        j        }| j        }t          | j                  dz  
|d 
         | j        _        |d 
         | _        |
d          |j        _        |
d          |_        t          | j                  | _        t          |j                  |_        d}n| j         dk    rt          | j	                  dk    rt          | d          s$t          | j	        d         j                  | _        dD ]!}t          ||t	          | |                     "d| _        | j                                        |_        | j                                        |_        | j        j        }| j        j        }| j	        }t          | j	                  dz  
t!          
fd	|                                D                       		fd
|D             | j        _        
fd|                                D             | j        _        |d 
         | _	        	fd|D             |j        _        
fd|                                D             |j        _        |
d          |_	        t          | j	                  | _        t          |j	                  |_        d}|S )NFr	   )ValueFormat1ValueFormat2rJ   TClass2Countr   )r&  r  r$  r%  c              3   .   K   | ]\  }}|k    |V  d S r   r!   r0   kvoldCounts      r   r  zsplitPairPos.<locals>.<genexpr>m  s+      BB!AMM!MMMMBBr   c                     g | ]}|v|	S r!   r!   r0   r   	newGlyphss     r   r2   z splitPairPos.<locals>.<listcomp>o  s#     K K Kq8J8J8J8J8Jr   c                 (    i | ]\  }}|k     ||S r!   r!   r(  s      r   
<dictcomp>z splitPairPos.<locals>.<dictcomp>p  s$    $V$V$VSQqXQqr   c                     g | ]}|v |	S r!   r!   r-  s     r   r2   z splitPairPos.<locals>.<listcomp>s  s     G G GqYr   c                 .    i | ]\  }}|k    ||z
  S r!   r!   r(  s      r   r0  z splitPairPos.<locals>.<dictcomp>t  s/    $a$a$a!TUX`T`T`Q(
T`T`T`r   )r   r   PairSetr   r6  r  r  r   PairSetCountClass1Recordr  Class2Recordr&  	DontSharer  r  r   r   Class1Count)r  r  r	  r  r
  rr   coverager  r  r.  r+  s            @@r   splitPairPosr:  <  s   !(!K$7 8 81 < <, : :d
;gk4889999 %-7799+!(('$%%*( (( 3+		*+ ( 3+		*+ !455+ !455+""A#k&>"?"?!"C"C	m	,	, K !9!!<!IJJ;H : :d
;gk4889999
 + %-7799+%/99;;+!((#-)$')**a/(BBBBy00BBBBB) K K K KH K K K+$V$V$V$VIOO4E4E$V$V$V+!$YhY/+ G G G GH G G G+$a$a$a$ay?P?P$a$a$a+!$XYY/+ 899+ 899+"
r   c                    | j         }|dk     rdS |dz  }||z
  }g g }}g g }	}t          | j        j        | j        j                  D ]u\  }
}|j        |k     r+|                    |
           |                    |           ;|xj        |z  c_        |                    |
           |	                    |           vg g }}| j        j	        D ]|}|
                                |
                                }}|j        d |         |_        |j        |d          |_        |                    |           |                    |           }| j        |_        || j        _        | j        
                                |_        ||j        _        | j        |_        || _         ||_         || j        _        | j        
                                |_        |	|j        _        t          |          | j        _        t          |	          |j        _        || j        _	        | j        
                                |_        ||j        _	        t          |          | j        _        t          |          |j        _        dS )NrJ   FT)
ClassCountrK  r  r   r  
MarkRecordr  r   	BaseArray
BaseRecordr  r  r   r  r   	MarkCount	BaseCount)r  r  r	  
classCountoldClassCountnewClassCountoldMarkCoverageoldMarkRecordsnewMarkCoveragenewMarkRecordsr2  
markRecordoldBaseRecordsnewBaseRecordsr  oldBaseRecordnewBaseRecords                    r   splitMarkBasePosrN    so   $NN	qm+#%r.#%r.!!"  
% 
%Y
 %%)$$$$$$$}$)$$$$$$$"$b!, ' 'S!$#--//- ^N]N;- ^MNN;-&&&&&&&!(#2 '4>>@@#2  (4''$2!$.88::$2!#&~#6#6 #&~#6#6 $2!$.88::$2!#&~#6#6 #&~#6#6 r   )rJ   rK   rF   )rJ   rF   r  r  c                 ^   | |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                  |         } |            }||	_	        n0|j
        j        }t          |j                  |         } |            }|}
t          |d          r|j        dz   |_        	 t          |j                  |         }n2# t           $ r% t"                              d|j         |           Y dS w xY w ||||          }|r|j                            |dz   |
           |S )zd
	An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
	r7  Tr  SubTableCountr	   z)Don't know how to split %s lookup type %sF)r  r  r  r  r  r  r  r  r7  r  r  r  r  r   rQ  
splitTabler&  r"  errorinsert)r  r	  r  r  subIndexsubtablesubTableTyper  newExtSubTableClassnewExtSubTabletoInsertnewSubTableClassr  	splitFuncr
  s                  r   fixSubTableOverFlowsr]    s    
^%	&	,


!."@
A(OH% 	+&& (	Hm$$  %/:,+$(#N$<=k>S>^_&&((.%,.( !9:<H  ""+*.#., !9:<H  ""+(FO$$ 2-1&12<@))   )).  
 
 i+~66 1/Ax000
s   5E +E=<E=c                     dd l } ddlm} |                     d          }t                      }|D ]{\  }}t          }|                    |          }|r2|                    d          }|d         d         }t          |          }||vr"t          ||fi           }	|dv rd|	_	        |	||<   |t                                          D ]\  }
}||
         }
|D ]}|
||<   t          t          t          t          t           t"          t$          t&          dt(          t*          t,          t.          t0          t2          t4          t6          t8          d	d	t:          it<          t>          t@          t:          tB          d
da"tD          d         tD          d<   tD          #                                D ]#}|                                D ]\  }}	||	_$        $dtJ          ia&tO          dd          D ]}tP          tL          d|z  <   tO          dd          D ]}tR          tL          d|z  <   ddl*m+} |D ]\  }}|                    |          }|rx|,                                \  }}t[          |          }||         }	t]          |	d          si |	_/        i |	_0         ||dd          |          \  }}||	j/        |<   ||	j0        |<   ||         }	 |||          \  |	_/        |	_0        d S )Nr   r	   )otDataz([A-Za-z0-9]+)Format(\d+)$rO  T)r	   rJ   rK   rF   rL   rM   rN   rO   )	r	   rJ   rK   rF   rL   rM   rN   rO   rP   rF   )r   r	   rJ   rF   rL   )r  r  mortmorxr  JSTFsizerV  zss%02dd   zcv%02d)buildConverters
converters)1rer_  rc   globalsr
   matchgroupr   r	  r7  _equivalentsr   rg  r  r  r  ContextSubstChainContextSubstExtensionSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosExtensionPosNoncontextualMorphRearrangementMorphContextualMorphLigatureMorphInsertionMorphr  valuesr  r  r  r   r	  r  otConvertersre  groupsr  r  rf  convertersByName)rg  r_  	formatPat	namespacerr   r  	baseClassm
formatTyper  baser  r  
lookupEnumenumr   re  r8  rf  r  s                       r   _buildClassesr    sP   
ZZ566YY   [T5)ood! <
''!**4 a:/
;;9		dYL"	%	%3
CM9T?%%''  ZT4	4$  c9S>> 	 	 
 
   3! !D #6*V%%''  Z##%%  idC3>>
 	
 4.. > >Q$=HqL!!
4.. C CQ$BHqL!! +***** L L[T5ood! L((**<4KK6	43
#|
$
$ CNC"1/%)Y"G"G:&3>&"23 
43*9/%*K*K'3>3''!L Lr   c                     | g S | j         S r   )r   )r9  s    r   rr  rr  u  s    	)	r   )F__doc__r  r   r>  collectionsr   fontTools.misc.py23r   fontTools.misc.roundToolsr   fontTools.misc.textToolsr   r   otBaser
   r   r   r   r    fontTools.feaLib.lookupDebugInfor   r   loggingr   	getLoggerr   r"  objectr   r#   r'   rE   r   r   r   r   r   r  r	  r  r  rB  r_  rg  r  r  r  r  r  r  r'  r2  r7  rG  rJ  rL  rQ  rx  r  rk  r  r  r  r"  r:  rN  rR  r]  r  rr  r!   r   r   <module>r     s              " " " " " " ) ) ) ) ) ) - - - - - - 2 2 2 2 2 2 2 2              T S S S S S S S   g!!    F       v   
       .O! O! O! O! O!y O! O! O!d=4 =4 =4 =4 =4I =4 =4 =4@       K K K K K) K K K\A A A A A9 A A AHN N N N NI N N N                  ]   h  h  h  h  h ' h  h  h VK) K) K) K) K)	 K) K) K)\    I   &N& N& N& N& N&* N& N& N&bK K K K K, K K K\}2 }2 }2 }2 }2' }2 }2 }2@D D D D D- D D DNZ Z Z Z Z, Z Z Zz    9   >$9 $9 $9 $9 $9 $9 $9 $9L    9       I   ! ! ! ! !JJ(0CDD ! ! !4    M   
    -   
           G   <         '      F45 45 45 45 45,,W55 45 45 45| E? 2	#'#5M1 @5 5 5n  2  :  4@ @ @F: : :~ 			 	 		
 
 
03 3 3pbL bL bLL     r   