
    RjO                    	   d dl mZmZmZmZm	Z
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 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$ dd
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z0m1Z2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;Z;d dl<Z<d dl=m>Z> d dl?Z?d dl@mAZA  e?jB        eC          ZDd ZEdeFe$         fdZG G d deH          ZI G d deI          ZJ G d deJ          ZK G d deJ          ZL G d deL          ZM G d deL          ZN G d  d!eN          ZO G d" d#eKeN          ZP G d$ d%eL          ZQ G d& d'eL          ZR G d( d)eL          ZS G d* d+eL          ZT G d, d-eL          ZU G d. d/eL          ZV G d0 d1eVeT          ZW G d2 d3eVeR          ZX G d4 d5eVeN          ZY G d6 d7eJ          ZZ G d8 d9eJ          Z[ G d: d;e[          Z\ G d< d=eR          Z] G d> d?eR          Z^ G d@ dAeJ          Z_ G dB dCe_          Z` G dD dEe_          Za G dF dGea          Zb G dH dIea          Zc G dJ dKec          Zd G dL dMed          Ze G dN dOeJ          Zf G dP dQeJ          Zg G dR dSeI          Zh G dT dUeh          Zi G dV dWeh          Zj G dX dYej          Zk G dZ d[ej          Zl G d\ d]eh          Zm G d^ d_ej          Zn G d` daeken          Zo G db dcej          Zp G dd deeL          Zq G df dgeq          Zr G dh dieI          Zs G dj dkeI          Zt G dl dmeI          Zu G dn doeI          Zv G dp dqeI          Zw G dr dseI          Zx G dt dueI          Zy G dv dweI          Zz G dx dyeI          Z{ G dz d{          Z| G d| d}eI          Z} G d~ deR          Z~ G d deT          Z G d de          Z/ G d de          Z1 G d deA          Z G d deI          Zi deSdeQdeMdeTdeRdeUdeNdegd!eOd#ePdOefd7eZd9e[d;e\d=e]dCe`dGebi dIecdKeddMeedehdedejdekdeldgerdueydwezdye{de~de/de1d?e^d e8e}e|           e8e}e'          ewexeieieieud d d d d d dZdS )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)OPTIMIZE_FONT_SPEEDgetSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)	FieldSpec)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optional)IntFlagc                 ,    t          | t                    S N)
isinstancetuple)ts    d/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>r3   .   s    Jq%((     	tableSpecc           	      h   g }i }| D ]}|j         }|j                             d          r|j        dk    sJ t          }n|j                             d          s	|j         dv r!t
          t          t          d|j                 }n|j         dk    rt          }n|j         dk    rt          }nx|j         dk    rt          }ne|j         d	k    rt          }nR|j         d
v rt          }nA|j        t          vrd|j        vr|j        }t          }nt          |j        |t                    } ||j         |j        |j        |j                  }|j        r|j        }n9|j        dv r|                    |j                  }n|                    |          }|j        s||_        |j         dv ri|d         |_        |j                                        D ]B}	|	                                D ]+}
t/          |j         |j        |j        |
          ||
j        <   ,C|j         d	k    r_|d         |_        |d	         |_        |j                                        D ]+}
t/          |j         |j        |j        |
          ||
j        <   ,|                    |           |j         |vsJ |j                     |||j         <   ||fS )zGiven a table spec from otData.py, build a converter object for each
    field of the table. This is called for each table in otData.py, and
    the results are assigned to the corresponding class in otTables.py.ValueFormatuint16Count)StructLength	MorphType)uint8r8   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r>   r?   r@   r   featureParamTypes)name
startswithtyper7   endswithComputedUInt8ComputedUShortComputedULongr>   r?   r@   rA   StructWithLengthconverterMappingStructevalrepeatauxrF   
tableClassgetr   valuesTable__name__rJ   defaultFeatureParamsappend)r5   tableNamespace
convertersconvertersByNamespec	tableNameconverterClassconvrX   r1   clss              r2   buildConvertersrg   1   s	    J <+ <+I	9.. 	S9(((((NNY(( 	SDI9V,V,V&('  i	NN
 Y*$$%NNY-''(NNY+%%&NNY/))*NNY@@@-NN9 000S	5I5I I	!'!%diAQ!R!R~It{DH$:J
 
 
 ? 	7JJYDDD'++DI66JJ'++I66J 	)(DO9@@@-m<D%,,..  88::  C5:	4;#6 6$S\22 9''%34G%HD"(6(GD%-4466  16It{DHc2 2 .. 	$y 0000$)000&*##'''r4   c                       e Zd ZdZddddZd Zd Zd Zd	 Zdd
Z	d Z
d Z ej        d          Zdee         fdZdS )BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N rE   c                ,   || _         || _        || _        | j        r"| j        st          | j        dd          | _        || _        |                    d          p|dv | _        |                    d          p|dk    | _        |dv | _        || _	        d S )Nz<string>rU   r9   )DesignAxisRecordSizeValueRecordSize
LookupTyper;   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountrl   AxisValueCountrm   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList	NumGlyphsMaxGlyphMapEntryIndexMaxEntryIndex
NumEntries)
rK   rV   rW   compilerX   rN   isCountisLookupTypeisPropagatedrF   selfrK   rV   rW   rX   rF   s         r2   __init__zBaseConverter.__init__{   s    	8 	=DK 	=txV<<DH$}}W-- 
 :
 2
 !MM,77N4;;N  %
 
, 'r4   c                    	
 j         o|dk    }|r                                

t          u rd}|s@g }t          |          D ],}|                                         |                     -|S 
 fd} |            	t          	fdt          |          D                       }                    |
z             |S )z(Read an array of values from the reader.   Fc                  T                                     j        fd} | S )Nc                 h                         | z  z                                  i           S r.   )seekread)ifontposreader_copy
recordSizer   s    r2   	read_itemzABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item   s6    $$S1z>%9:::99[$;;;r4   copyr   )r   r   r   r   readerr   r   s    @@r2   get_read_itemz.BaseConverter.readArray.<locals>.get_read_item   sN    $kkmmj< < < < < < < < < ! r4   c              3      K   | ]}V  d S r.    ).0r   r   s     r2   	<genexpr>z*BaseConverter.readArray.<locals>.<genexpr>   s#      99q999999r4   )lazygetRecordSizeNotImplementedranger^   r   r   advance)r   r   r   	tableDictcountr   lr   r   r   r   s   ```      @@r2   	readArrayzBaseConverter.readArray   s   y&UQY 	++F33J^++ 	A5\\ = =64;;<<<<H! ! ! ! ! ! ! ! &I9999E%LL99999ANN5:-...Hr4   c                 >    t          | d          r| j        S t          S )N
staticSize)hasattrr   r   r   r   s     r2   r   zBaseConverter.getRecordSize   s"    4&& 	#?"r4   c                      t          |           )zRead a value from the reader.NotImplementedErrorr   r   r   r   s       r2   r   zBaseConverter.read       !$'''r4   c                     	 t          |          D ]\  }}|                     |||||           d S # t          $ r}|j        |fz   |_         d }~ww xY wr.   )	enumeratewrite	Exceptionargs)r   writerr   r   rZ   r   valuees           r2   
writeArrayzBaseConverter.writeArray   sz    	%f-- > >5

64E1====> > 	 	 	Vqd]AF	s   .2 
AAAc                      t          |           )zWrite a value to the writer.r   r   r   r   r   r   repeatIndexs         r2   r   zBaseConverter.write   r   r4   c                      t          |           )zRead a value from XML.r   r   attrscontentr   s       r2   xmlReadzBaseConverter.xmlRead   r   r4   c                      t          |           )zWrite a value to XML.r   r   	xmlWriterr   r   rK   r   s         r2   xmlWritezBaseConverter.xmlWrite   r   r4   zVarIndexBase\s*\+\s*(\d+)returnc                     | j                             | j                  }|sdS t          |                    d                    S )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrF   intgroup)r   ms     r2   getVarIndexOffsetzBaseConverter.getVarIndexOffset   s>    )001ABB 	41771::r4   r.   )r\   
__module____qualname____doc__r   r   r   r   r   r   r   r   rer   r   r+   r   r   r   r4   r2   ri   ri   w   s         "'" "' "' "' "' "'H  <  
( ( (  ( ( ( (( ( (( ( (  *rz*FGG8C=      r4   ri   c                   F    e Zd Zed             Zed             Zd Zd ZdS )SimpleValuec                     | S r.   r   r   s    r2   toStringzSimpleValue.toString       r4   c                     | S r.   r   r   s    r2   
fromStringzSimpleValue.fromString   r   r4   c                     |                     ||d|                     |          fgz              |                                 d S Nr   )	simpletagr   newliner   s         r2   r   zSimpleValue.xmlWrite   sI    D%GT]]55I5I+J*K"KLLLr4   c                 8    |                      |d                   S r   )r   r   s       r2   r   zSimpleValue.xmlRead   s    uW~...r4   N)r\   r   r   staticmethodr   r   r   r   r   r4   r2   r   r      sf          \   \  / / / / /r4   r   c                       e Zd ZdZd Zd ZdS )OptionalValueNc                     || j         k    r*|                    d|                     |          f           |                    ||           |                                 d S r   )DEFAULTr^   r   r   r   r   s         r2   r   zOptionalValue.xmlWrite   s`    DL  LL'4==#7#78999D%(((r4   c                 N    d|v r|                      |d                   S | j        S r   )r   r   r   s       r2   r   zOptionalValue.xmlRead   s+    e??5>222|r4   )r\   r   r   r   r   r   r   r4   r2   r   r      s7        G      r4   r   c                   $    e Zd Zed             ZdS )IntValuec                 "    t          | d          S Nr   r   r   s    r2   r   zIntValue.fromString  s    5!}}r4   Nr\   r   r   r   r   r   r4   r2   r   r     s-          \  r4   r   c                   ,    e Zd ZdZd Zd ZddZd ZdS )Long   c                 *    |                                 S r.   readLongr   s       r2   r   z	Long.read         r4   c                 ,    |                     |          S r.   )readLongArrayr   r   r   r   r   s        r2   r   zLong.readArray      ##E***r4   Nc                 0    |                     |           d S r.   )	writeLongr   s         r2   r   z
Long.write      r4   c                 0    |                     |           d S r.   )writeLongArrayr   r   r   r   rZ   s        r2   r   zLong.writeArray      f%%%%%r4   r.   r\   r   r   r   r   r   r   r   r   r4   r2   r   r   
  Z        J! ! !+ + +       & & & & &r4   r   c                   ,    e Zd ZdZd Zd ZddZd ZdS )ULongr   c                 *    |                                 S r.   	readULongr   s       r2   r   z
ULong.read      !!!r4   c                 ,    |                     |          S r.   )readULongArrayr   s        r2   r   zULong.readArray       $$U+++r4   Nc                 0    |                     |           d S r.   
writeULongr   s         r2   r   zULong.write#      %     r4   c                 0    |                     |           d S r.   )writeULongArrayr   s        r2   r   zULong.writeArray&      v&&&&&r4   r.   r   r   r4   r2   r   r     Z        J" " ", , ,! ! ! !' ' ' ' 'r4   r   c                   $    e Zd Zed             ZdS )Flags32c                     d| z  S )Nz0x%08Xr   r   s    r2   r   zFlags32.toString+      %r4   N)r\   r   r   r   r   r   r4   r2   r  r  *  s-            \     r4   r  c                       e Zd ZeZdS )VarIndexN)r\   r   r   r&   r   r   r4   r2   r  r  0  s         GGGr4   r  c                   ,    e Zd ZdZd Zd ZddZd ZdS )Short   c                 *    |                                 S r.   )	readShortr   s       r2   r   z
Short.read7  r   r4   c                 ,    |                     |          S r.   )readShortArrayr   s        r2   r   zShort.readArray:  r  r4   Nc                 0    |                     |           d S r.   )
writeShortr   s         r2   r   zShort.write=  r  r4   c                 0    |                     |           d S r.   )writeShortArrayr   s        r2   r   zShort.writeArray@  r
  r4   r.   r   r   r4   r2   r  r  4  r  r4   r  c                   ,    e Zd ZdZd Zd ZddZd ZdS )UShortr  c                 *    |                                 S r.   
readUShortr   s       r2   r   zUShort.readG        """r4   c                 ,    |                     |          S r.   )readUShortArrayr   s        r2   r   zUShort.readArrayJ  s    %%e,,,r4   Nc                 0    |                     |           d S r.   writeUShortr   s         r2   r   zUShort.writeM      5!!!!!r4   c                 0    |                     |           d S r.   )writeUShortArrayr   s        r2   r   zUShort.writeArrayP  s    '''''r4   r.   r   r   r4   r2   r  r  D  sZ        J# # #- - -" " " "( ( ( ( (r4   r  c                   ,    e Zd ZdZd Zd ZddZd ZdS )Int8r   c                 *    |                                 S r.   )readInt8r   s       r2   r   z	Int8.readW  r   r4   c                 ,    |                     |          S r.   )readInt8Arrayr   s        r2   r   zInt8.readArrayZ  r   r4   Nc                 0    |                     |           d S r.   )	writeInt8r   s         r2   r   z
Int8.write]  r   r4   c                 0    |                     |           d S r.   )writeInt8Arrayr   s        r2   r   zInt8.writeArray`  r   r4   r.   r   r   r4   r2   r,  r,  T  r   r4   r,  c                   ,    e Zd ZdZd Zd ZddZd ZdS )UInt8r   c                 *    |                                 S r.   )	readUInt8r   s       r2   r   z
UInt8.readg  r   r4   c                 ,    |                     |          S r.   )readUInt8Arrayr   s        r2   r   zUInt8.readArrayj  r  r4   Nc                 0    |                     |           d S r.   )
writeUInt8r   s         r2   r   zUInt8.writem  r  r4   c                 0    |                     |           d S r.   )writeUInt8Arrayr   s        r2   r   zUInt8.writeArrayp  r
  r4   r.   r   r   r4   r2   r6  r6  d  r  r4   r6  c                        e Zd ZdZd ZddZdS )UInt24   c                 *    |                                 S r.   
readUInt24r   s       r2   r   zUInt24.readw  r"  r4   Nc                 0    |                     |           d S r.   writeUInt24r   s         r2   r   zUInt24.writez  r(  r4   r.   r\   r   r   r   r   r   r   r4   r2   r@  r@  t  s<        J# # #" " " " " "r4   r@  c                       e Zd Zd ZdS )ComputedIntc                 j    |0|                     |d|           |                                 d S d S )N=)commentr   r   s         r2   r   zComputedInt.xmlWrite  sG    uu5666 r4   Nr\   r   r   r   r   r4   r2   rJ  rJ  ~  s#                 r4   rJ  c                       e Zd ZdS )rO   Nr\   r   r   r   r4   r2   rO   rO             Dr4   rO   c                       e Zd ZdS )rP   NrP  r   r4   r2   rP   rP     rQ  r4   rP   c                       e Zd ZdS )rQ   NrP  r   r4   r2   rQ   rQ     rQ  r4   rQ   c                        e Zd ZdZd ZddZdS )Tagr   c                 *    |                                 S r.   )readTagr   s       r2   r   zTag.read  s    ~~r4   Nc                 0    |                     |           d S r.   )writeTagr   s         r2   r   z	Tag.write  s    r4   r.   rH  r   r4   r2   rU  rU    s<        J          r4   rU  c                   0    e Zd ZdZdZd Zd Zd ZddZdS )	GlyphIDr  Hc                 j    |                     |                    | j        | j        |                    S r.   )getGlyphNameManyr   typecoder   r   s        r2   r   zGlyphID.readArray  s3    $$T]DOUCC
 
 	
r4   c                 h    |                     |                    | j        | j                            S r.   )getGlyphName	readValuer_  r   r   s       r2   r   zGlyphID.read  s*      !1!1$-!Q!QRRRr4   c                 b    |                     | j        |                    |                     d S r.   )r   r_  getGlyphIDManyr   s        r2   r   zGlyphID.writeArray  s.    $-)<)<V)D)DEEEEEr4   Nc                 b    |                     | j        |                    |                     d S r.   )
writeValuer_  
getGlyphIDr   s         r2   r   zGlyphID.write  s,    $-)?)?@@@@@r4   r.   )	r\   r   r   r   r_  r   r   r   r   r   r4   r2   r[  r[    sk        JH
 
 

S S SF F FA A A A A Ar4   r[  c                       e Zd ZdZdZdS )	GlyphID32r   LN)r\   r   r   r   r_  r   r4   r2   ri  ri    s        JHHHr4   ri  c                       e Zd Zd ZdS )NameIDc                    |                     ||d|fgz              |r|r|                    d          }|r|                    |          }|                    d           |r|                    |           nN|dk    r|                    d           n2|                    d           t
                              d|z             |                                 d S )Nr   rK       Nonezmissing from name tablez"name id %d missing from name table)r   rY   getDebugNamer   rM  logwarningr   )r   r   r   r   rK   r   	nameTables          r2   r   zNameID.xmlWrite  s    D%GU+;*<"<=== 	NE 	N((I 	N --e44%%% N%%d++++f__%%f----%%&?@@@KK Du LMMMr4   NrN  r   r4   r2   rl  rl    s#            r4   rl  c                       e Zd Zd ZdS )	STATFlagsc                 P   |                     ||d|fgz              g }|dz  r|                    d           |dz  r|                    d           |r=|                    d           |                    d                    |                     |                                 d S )Nr   r   OlderSiblingFontAttributer  ElidableAxisValueNamern   )r   r^   r   rM  joinr   r   r   r   r   rK   r   flagss          r2   r   zSTATFlags.xmlWrite  s    D%GU+;*<"<===4< 	6LL45554< 	2LL0111 	/OOD!!!chhuoo...r4   NrN  r   r4   r2   rv  rv    s#        
 
 
 
 
r4   rv  c                   $    e Zd Zed             ZdS )
FloatValuec                      t          |           S r.   )floatr   s    r2   r   zFloatValue.fromString      U||r4   Nr   r   r4   r2   r  r    s-          \  r4   r  c                        e Zd ZdZd ZddZdS )
DeciPointsr  c                 0    |                                 dz  S N
   r   r   s       r2   r   zDeciPoints.read  s      ""R''r4   Nc                 P    |                     t          |dz                       d S r  )r'  roundr   s         r2   r   zDeciPoints.write  s(    5,,-----r4   r.   rH  r   r4   r2   r  r    s<        J( ( (. . . . . .r4   r  c                       e Zd ZeZeZeZeZd ZddZ	e
d             Ze
d             Ze
d             Ze
d             ZdS )	BaseFixedValuec                 b    |                       t          || j                                        S r.   )fromIntgetattrreaderMethodr   s       r2   r   zBaseFixedValue.read  s*    ||>GFD,=>>@@AAAr4   Nc                 h     t          || j                  |                     |                     d S r.   )r  writerMethodtoIntr   s         r2   r   zBaseFixedValue.write  s1    *)**4::e+<+<=====r4   c                 ,    t          || j                  S r.   )fi2flprecisionBitsrf   r   s     r2   r  zBaseFixedValue.fromInt      UC-...r4   c                 ,    t          || j                  S r.   )fl2fir  r  s     r2   r  zBaseFixedValue.toInt  r  r4   c                 ,    t          || j                  S r.   )str2flr  r  s     r2   r   zBaseFixedValue.fromString      eS.///r4   c                 ,    t          || j                  S r.   )fl2strr  r  s     r2   r   zBaseFixedValue.toString  r  r4   r.   )r\   r   r   r   r   r  r  r  r   r   classmethodr  r  r   r   r   r4   r2   r  r    s        J"M!L!LB B B> > > > / / [/ / / [/ 0 0 [0 0 0 [0 0 0r4   r  c                       e Zd ZdZdZdZdZdS )Fixedr      r   r   Nr\   r   r   r   r  r  r  r   r4   r2   r  r     s"        JMLLLLr4   r  c                       e Zd ZdZdZdZdZdS )F2Dot14r     r  r  Nr  r   r4   r2   r  r    s"        JMLLLLr4   r  c                   |     e Zd ZdZdZe fd            Ze fd            Zed             Zed             Z	 xZ
S )Angleg        g     ?c                 \    t                                          |          | j        z   dz  S N   )superr  biasrf   r   	__class__s     r2   r  zAngle.fromInt  s%    &&1S88r4   c                 \    t                                          |dz  | j        z
            S r  )r  r  r  r  s     r2   r  zAngle.toInt  s$    ww}}eckSX5666r4   c                 Z    t          t          |          | j        z            | j        z  S r.   )r   r  factorr  s     r2   r   zAngle.fromString  s&     uU||cj011CJ>>r4   c                 ,    t          || j                  S r.   )r
   r  r  s     r2   r   zAngle.toString!  s    *5#*===r4   )r\   r   r   r  r  r  r  r  r   r   __classcell__r  s   @r2   r  r    s         D"F9 9 9 9 [9 7 7 7 7 [7 ? ? [? > > [> > > > >r4   r  c                       e Zd ZdZdS )BiasedAngleg      ?N)r\   r   r   r  r   r4   r2   r  r  &  s         DDDr4   r  c                   b    e Zd ZdZd ZddZed             Zed             Zed             Z	dS )	Versionr   c                 .    |                                 }|S r.   r   )r   r   r   r   r   s        r2   r   zVersion.read/  s    !!r4   Nc                 N    t          |          }|                    |           d S r.   )fi2ver   r   s         r2   r   zVersion.write3  s'    er4   c                      t          |           S r.   )ve2fir   s    r2   r   zVersion.fromString7  r  r4   c                     d| z  S )N0x%08xr   r   s    r2   r   zVersion.toString;  r  r4   c                 "    t          | d          S )Nr  )r  )vs    r2   	fromFloatzVersion.fromFloat?  s    Q||r4   r.   )
r\   r   r   r   r   r   r   r   r   r  r   r4   r2   r  r  ,  s        J            \     \    \  r4   r  c                   $    e Zd ZdZdZd ZddZdS )Char64zAn ASCII string with up to 64 characters.

    Unused character positions are filled with 0x00 bytes.
    Used in Apple AAT fonts in the `gcid` table.
    @   c                    |                     | j                  }|                    d          }|dk    r
|d |         }t          |dd          }|t          |dd          k    rt                              d|z             |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   rr  rs  )r   r   r   r   datazeroPosss          r2   r   zChar64.readM  s    t//))E""a<<>D$;;;dWX>>>>>KK?!CDDDr4   Nc                 f   t          |dd          }|t          |dd          k    rt                              d|z             t          |          | j        k    r$t                              d|| j        fz             |d| j        z  z   d | j                 }|                    |           d S )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   rr  rs  lenr   	writeData)r   r   r   r   r   r   r  s          r2   r   zChar64.writeW  s    uwyAAA7578DDDDDKK@5HIIIt99t&&KK6%9QQ   ut..0A$/0ABr4   r.   )r\   r   r   r   r   r   r   r   r4   r2   r  r  D  sH          J  	 	 	 	 	 	r4   r  c                   4    e Zd Zd Zd ZddZd Zd Zd ZdS )	rT   c                 D    | j         o| j                             |          S r.   )rX   r   r   s     r2   r   zStruct.getRecordSized  s    H4?#@#@#H#HHr4   c                 Z    |                                  }|                    ||           |S r.   )rX   	decompile)r   r   r   r   tables        r2   r   zStruct.readg  s*    !!%%%r4   Nc                 2    |                     ||           d S r.   r   r   s         r2   r   zStruct.writel  s    fd#####r4   c                     |4|r0|                     ||dgz              |                                 d S d S |                    ||||           d S )N)emptyr   )rK   )r   r   toXMLr   s         r2   r   zStruct.xmlWriteo  sk    =  ##D%<.*@AAA!!#####KK	4TK:::::r4   c                 *   d|v rt          |d                   rd S |                                 }|                    d          }|t          |          |_        t          |d           }|rd}|                                D ]{}|j        rrd}t          |d          si |_        |j        }	|j	        |	vsJ |j	        |	f            t          ||j	        d            t          |j        |j	                  |	|j	        <   ||D ]6}
t          |
t                    r|
\  }}}|                    ||||           67|                    t#          |dd                      |r3|r1|                                D ]}|j        r|j        }	|	|j	        = |	s|`|S )Nr  FormatpostReadFT_propagator)
propagator)r   rX   rY   r   r  r   getConvertersr   r  rK   setattrr   __dict__r/   r0   fromXMLpopulateDefaultsr  )r   r   r   r   r  r  
noPostReadcleanPropagationre   r  elementrK   s               r2   r   zStruct.xmlRead|  s   ew 8 84!!8$$v;;EL 
333
 	V$++-- V V$ V'+$"477 .+-(!%!1J9J666J8O666E49d333,:5>49,U,UJty) 	 	G'5)) '.$eWdE7D9999'$t*L*LMMM 	1 1!//11 1 1D( 1%)%5
&ty1) 1 $ 0r4   c                 0    dt          | j                  z   S )Nz
Struct of )reprrX   r   s    r2   __repr__zStruct.__repr__  s    d4?3333r4   r.   )	r\   r   r   r   r   r   r   r   r  r   r4   r2   rT   rT   c  sw        I I I  
$ $ $ $; ; ;( ( (T4 4 4 4 4r4   rT   c                       e Zd Zd ZddZdS )rR   c                     |j         }|                                 }|                    ||           |                    ||j        z              |S r.   )r   rX   r  r   r:   )r   r   r   r   r   r  s         r2   r   zStructWithLength.read  sK    j!!%%%C%,,---r4   Nc                 R   t          |                                          D ]\  }}|j        dk    r nt          |j                  |z   }t          |t                    r|dz  }dddd|j                 }	|                                }
|	|_	        |
                    ||           |                                |
z
  }|                                }|                    ||||           |j        |         dd |j                 k    sJ |                                |j        |<   d S )Nr:   r      i     >[= )r   r  r      ޭ)r   r  rK   r  itemsr/   r   r   getDataLengthr:   r   getSubWriterr   
getAllData)r   r   r   r   r   r   	convIndexre   lengthIndexdeadbeefbeforelengthlengthWriters                r2   r   zStructWithLength.write  s7   ()<)<)>)>?? 	 	OItyN** +&,'')3e566 	1K:66tG%%''%fd###%%''&0**,,

<y&999|K(,?@Q$/@Q,RRRRR$0$;$;$=$=[!!!r4   r.   r\   r   r   r   r   r   r4   r2   rR   rR     s7          > > > > > >r4   rR   c                   ,    e Zd ZdZd Zd Zd ZddZdS )r[   r  c                 *    |                                 S r.   r   r   s     r2   
readOffsetzTable.readOffset  r"  r4   c                 0    |                     d           d S r   r&  r   r   s     r2   writeNullOffsetzTable.writeNullOffset      1r4   c                     |                      |          }|dk    rd S |                                 }|                    |          }|j        r||_        ||_        n|                    ||           |S r   )r  rX   getSubReaderr   r   r   r  )r   r   r   r   offsetr  s         r2   r   z
Table.read  sv    ((Q;;4!!$$V,,9 	*!ELEJJOOFD)))r4   Nc                     ||                      |           d S |                                }| j        |_        |||_        |                    || j                   |                    ||           d S )N
offsetSize)r  r  rK   r   writeSubTabler   r   )r   r   r   r   r   r   	subWriters          r2   r   zTable.write  s~    =  (((((++--I!YIN&(3	%  t GGGMM)T*****r4   r.   )r\   r   r   r   r  r  r   r   r   r4   r2   r[   r[     sZ        J# # #    	+ 	+ 	+ 	+ 	+ 	+r4   r[   c                       e Zd ZdZd Zd ZdS )LTabler   c                 *    |                                 S r.   r   r   s     r2   r  zLTable.readOffset  r   r4   c                 0    |                     d           d S r   r  r  s     r2   r  zLTable.writeNullOffset  s    !r4   Nr\   r   r   r   r  r  r   r4   r2   r  r    s7        J" " "    r4   r  c                       e Zd ZdZd Zd ZdS )Table24rA  c                 *    |                                 S r.   rC  r   s     r2   r  zTable24.readOffset  r"  r4   c                 0    |                     d           d S r   rF  r  s     r2   r  zTable24.writeNullOffset  r	  r4   Nr  r   r4   r2   r  r    s7        J# # #    r4   r  c                   $     e Zd Zd Z fdZ xZS )r@   c                 v    | j         |         |         }|                     | j        | j        | j        |          S r.   r   r  rK   rV   rW   r   	tableType
lookupTyperX   s       r2   getConverterzSubStruct.getConverter   2    %i0<
~~didh
KKKr4   c                 `    t          t          |                               |||d |           d S r.   )r  r@   r   r   r   r   r   rK   r   r  s         r2   r   zSubStruct.xmlWrite  s/    i''	4eLLLLLr4   r\   r   r   r!  r   r  r  s   @r2   r@   r@     sS        L L LM M M M M M M M Mr4   r@   c                   $     e Zd Zd Z fdZ xZS )r>   c                 v    | j         |         |         }|                     | j        | j        | j        |          S r.   r  r  s       r2   r!  zSubTable.getConverter	  r"  r4   c                 `    t          t          |                               |||d |           d S r.   )r  r>   r   r$  s         r2   r   zSubTable.xmlWrite  s/    h&&y$tUKKKKKr4   r%  r  s   @r2   r>   r>     sS        L L LL L L L L L L L Lr4   r>   c                       e Zd ZddZdS )r?   Nc                 R    d|_         t                              | |||||           d S )NT)	Extensionr[   r   r   s         r2   r   zExtSubTable.write  s,    D&$	5+FFFFFr4   r.   )r\   r   r   r   r   r4   r2   r?   r?     s.        G G G G G Gr4   r?   c                       e Zd Zd ZdS )rA   c                     | j                             || j                  }|                     | j        | j        | j        |          S r.   )rJ   rY   r]   r  rK   rV   rW   )r   
featureTagrX   s      r2   r!  zFeatureParams.getConverter  s;    +//
D<UVV
~~didh
KKKr4   N)r\   r   r   r!  r   r4   r2   rA   rA     s(        L L L L Lr4   rA   c                   .    e Zd ZdZddddZd ZddZdS )	r7   r  Nrj   rE   c                v    t                               | |||||           d|d         dk    rdndz   | _        d S )NrE   r7   21)ri   r   whichr   s         r2   r   zValueFormat.__init__   sN    $Z[ 	 	
 	
 	
 #T"X__cc#F


r4   c                 \    |                                 }t          |          || j        <   |S r.   )r!  r   r4  r   r   r   r   formats        r2   r   zValueFormat.read&  s,    ""$$/77tzr4   c                 ^    |                     |           t          |          || j        <   d S r.   )r'  r   r4  )r   r   r   r   r7  r   s         r2   r   zValueFormat.write+  s0    6"""/77tzr4   r.   )r\   r   r   r   r   r   r   r   r4   r2   r7   r7     sb        JG" G G G G G  
8 8 8 8 8 8r4   r7   c                   .    e Zd Zd Zd ZddZd Zd ZdS )ValueRecordc                 <    dt          || j                           z  S Nr  )r  r4  r   s     r2   r   zValueRecord.getRecordSize1  s    3vdj)****r4   c                 D    || j                                      ||          S r.   )r4  readValueRecordr   s       r2   r   zValueRecord.read4  s    dj!11&$???r4   Nc                 J    || j                                      |||           d S r.   )r4  writeValueRecordr   s         r2   r   zValueRecord.write7  s'    tz++FD%@@@@@r4   c                 H    |d S |                     ||| j        |           d S r.   )r  rK   r   s         r2   r   zValueRecord.xmlWrite:  s,    =DKK	4E:::::r4   c                 V    ddl m}  |            }|                    d |||           |S )Nr   )r:  )otBaser:  r  )r   r   r   r   r:  r   s         r2   r   zValueRecord.xmlRead@  s<    ''''''dE7D111r4   r.   )r\   r   r   r   r   r   r   r   r   r4   r2   r:  r:  0  sk        + + +@ @ @A A A A; ; ;    r4   r:  c                       e Zd ZdZdddZd ZddZe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 )	AATLookupr  rj   rE   c                    t                               | |||||           t          | j        t                    r|                     dd d           | _        d S t          dd d | j                  | _        d S )NrE   Value)rK   rV   rW   )rK   rV   rW   rX   )ri   r   
issubclassrX   r   	converterr[   r   s         r2   r   zAATLookup.__init__K  s    $Z[ 	 	
 	
 	
 do{33 	!__'$D_QQDNNN"Tt  DNNNr4   c                 \   |                                 }|dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S J d|z              )Nr   r  r      r   Fzunsupported lookup format: %d)r!  readFormat0readFormat2readFormat4readFormat6readFormat8r6  s        r2   r   zAATLookup.readV  s    ""$$Q;;##FD111q[[##FD111q[[##FD111q[[##FD111q[[##FD111B9FBBB5r4   Nc                 .   t          t          fd|                                D                                 }t          t          t          d |                     ||          |                     ||          |                     ||          |                     ||          g                              }|d         \  }}	}
|                                } |
             |                                |z
  }||k    sJ d|	||fz              d S )Nc                 D    g | ]\  }}                     |          |fS r   rg  )r   glyphvalr   s      r2   
<listcomp>z#AATLookup.write.<locals>.<listcomp>g  s.    RRRjeST__U++S1RRRr4   r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	listsortedr  filterbuildFormat0buildFormat2buildFormat6buildFormat8r  )r   r   r   r   r   r   rZ   formatsdataSizelookupFormatwriteMethodr   
actualSizes     `          r2   r   zAATLookup.writee  s;   RRRREKKMMRRRSS
 
 ))&$??))&$??))&$??))&$??	 
 

 
 /6aj+,""$$))++c1
("""HL
 
 #""""r4   c                    |                      |           |                      |           t          ||          \  }}}|                      |           |                      |           |                      |           d S )N)nitemSize)r'  r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShifts         r2   writeBinSearchHeaderzAATLookup.writeBinSearchHeader  s    8$$$8$$$1?2
 2
 2
.]J 	;'''=))):&&&&&r4   c                      t                                                    }t                    |k    rd S  j        j        }d||z  z   d fdfS )Nr  r   c                  2                                    S r.   )writeFormat0r   r   rZ   r   s   r2   r3   z(AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF;; r4   )r  getGlyphOrderrI  r   )r   r   r   rZ   	numGlyphs	valueSizes   ````  r2   rZ  zAATLookup.buildFormat0  sn    **,,--	v;;)##4N-		I%%;;;;;;;
 	
r4   c                 ~    |                     d           |D ]$\  }}| j                            ||d |d            %d S )Nr   r   r   r   )r'  rI  r   )r   r   r   rZ   glyphID_r   s         r2   rn  zAATLookup.writeFormat0  sb    1% 	 	OHeN  Et !    	 	r4   c                 P    |d         \  }}|}g |dd          D ]5\  }}||dz   k    s||k    r                     |||f           |x}}|}3|}6                     |||f            j        j        }	t                    dz   |	dz   }}
d j        z   |
|z  z   d fdfS )Nr   r   r   r  c                  2                                    S r.   )writeFormat2)r   segmentsr   r   s   r2   r3   z(AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH== r4   )r^   rI  r   r  BIN_SEARCH_HEADER_SIZE)r   r   r   rZ   segStartsegValuesegEndglyphIDcurValuers  rf  rg  rz  s   ```         @r2   r[  zAATLookup.buildFormat2  s    #AY(!' 	! 	!GX&1*$$H(<(<68 <===$++6# 684555N-	 ]]Q.	A(++h.AA=======
 	
r4   c                    |                     d           | j        j        }t          |          |dz   }}|                     |||           |D ]O\  }}}	|                     |           |                     |           | j                            ||d |	d            P|                     d           |                     d           |                    d|z             d S )Nr  r   ru  ro  r  r'  rI  r   r  rk  r   r  )
r   r   r   rz  rs  rf  rg  
firstGlyph	lastGlyphr   s
             r2   ry  zAATLookup.writeFormat2  s   1N-	 ]]IM(!!&(H===,4 	 	(J	5y)))z***N  Et !     	6"""6"""9,-----r4   c                       j         j        }t                    |dz   }}d j        z   |dz   |z  z   d fdfS )Nr  r   rK  c                  2                                    S r.   )writeFormat6ro  s   r2   r3   z(AATLookup.buildFormat6.<locals>.<lambda>  rp  r4   )rI  r   r  r{  )r   r   r   rZ   rs  rf  rg  s   ````   r2   r\  zAATLookup.buildFormat6  s^    N-	 [[)a-(++x!|x.GG;;;;;;;
 	
r4   c                 p   |                     d           | j        j        }t          |          |dz   }}|                     |||           |D ]9\  }}|                     |           | j                            ||d |d            :|                     d           |                    d|z             d S )NrK  r  ru  ro  r  r  )	r   r   r   rZ   rs  rf  rg  r  r   s	            r2   r  zAATLookup.writeFormat6  s    1N-	 [[)a-(!!&(H===$ 	 	NGUw'''N  Et !     	6"""9,-----r4   c                      d         d         d         d         }}t                    ||z
  dz   k    rd S  j        j        }dt                    |z  z   d fdfS )Nr   r1  r   rK  r   c                  2                                    S r.   )writeFormat8ro  s   r2   r3   z(AATLookup.buildFormat8.<locals>.<lambda>  rp  r4   )r  rI  r   )r   r   r   rZ   
minGlyphID
maxGlyphIDrs  s   ````   r2   r]  zAATLookup.buildFormat8  s~    !'1vbz!}J
v;;*z1A5554N-	Fi'';;;;;;;
 	
r4   c                    |d         d         }|                     d           |                     |           |                     t          |                     |D ]$\  }}| j                            ||d |d            %d S )Nr   r   ru  )r'  r  rI  r   )r   r   r   rZ   firstGlyphID_r   s          r2   r  zAATLookup.writeFormat8  s    ay|1<(((3v;;''' 	 	HAuN  Et !    	 	r4   c                     t                                                    }| j                            |d |          }fdt	          |          D             S )Nr   r   c                 B    i | ]\  }}                     |          |S r   ra  )r   kr   r   s      r2   
<dictcomp>z)AATLookup.readFormat0.<locals>.<dictcomp>  s-    LLL5!!!$$eLLLr4   )r  rq  rI  r   r   )r   r   r   rr  r  s     `  r2   rL  zAATLookup.readFormat0  sZ    **,,--	~''I'VVLLLLIdOOLLLLr4   c                    i }|j         dz
  }|                                |                                }}|d| j        j        z   k    s
J |            t	          |          D ]}|                    |||z  z   dz              |                                }|                                }	| j                            ||d           }
|dk    r.t	          |	|dz             D ]}|
||                    |          <   |S )Nr  r      r   ro  r   r   r!  rI  r   r   r   r   ra  )r   r   r   mappingr   rg  rf  r   lastfirstr   r  s               r2   rM  zAATLookup.readFormat2  s   j1n#..00&2C2C2E2E(1t~88888(888x 	: 	:AKKa(l*R/000$$&&D%%''EN'''EEEv~~udQh// : :A49GD--a0011r4   c                 p   i }|j         dz
  }|                                }|dk    s
J |            t          |                                          D ]}|                    |||z  z   dz              |                                }|                                }|                                }	|dk    r|                    d          }
|
                    ||	z              | j                            |
|d ||z
  dz             }t          |          D ] \  }}|||                    ||z             <   !|S )Nr  rK  r  ro  r   r   r  )	r   r!  r   r   r  rI  r   r   ra  )r   r   r   r  r   rg  r   r  r  r  
dataReaderr  r  r  s                 r2   rN  zAATLookup.readFormat4  sL   j1n$$&&1}}}h}}}v((**++ 	> 	>AKKa(l*R/000$$&&D%%''E&&((Fv~~#0033
f---~//D5L1<L 0   &dOO > >DAq<=GD--eai8899r4   c                    i }|j         dz
  }|                                }|d| j        j        z   k    s
J |            t	          |                                          D ]o}|                    |||z  z   dz              |                                }| j                            ||d           }|dk    r|||                    |          <   p|S )Nr  r  r  ro  r  )	r   r   r   r  r   rg  r   r  r   s	            r2   rO  zAATLookup.readFormat6  s    j1n$$&&1t~88888(888v((**++ 	< 	<AKKa(l*R/000''))GN'''EEE&  6;))'223r4   c                     |                                 |                                 }| j                            |d |          }fdt          |          D             S )Nr  c                 H    i | ]\  }}                     |z             |S r   r  )r   r  r   r  r   s      r2   r  z)AATLookup.readFormat8.<locals>.<dictcomp>)  s1    VVV
E!!%!),,eVVVr4   )r!  rI  r   r   )r   r   r   r   r  r  s     `  @r2   rP  zAATLookup.readFormat8%  sh    !!##!!##~''E'RRVVVVViPTooVVVVr4   c                     i }|D ]H}t          |t                    r1|\  }}}|dk    r%| j                            |||          ||d         <   I|S )NLookuprT  )r/   r0   rI  r   )	r   r   r   r   r   r  rK   a
eltContents	            r2   r   zAATLookup.xmlRead+  sj     	T 	TG'5)) T&-#a8##(,(>(>q*d(S(SE!G*%r4   c           	      >   |                     ||           |                                 t          |                                          D ]'\  }}| j                            |||dd|fg           (|                    |           |                                 d S )Nr  rT  )r   rK   r   )begintagr   rX  r  rI  r   endtag)r   r   r   r   rK   r   rT  s          r2   r   zAATLookup.xmlWrite4  s    4'''"5;;==11 	 	LE5N##4u8WeDTCU $     	r4   r.   )r\   r   r   r{  r   r   r   r   rk  rZ  rn  r[  ry  r\  r  r]  r  rL  rM  rN  rO  rP  r   r   r   r4   r2   rE  rE  H  s_       EG 	 	 	 	 	C C C
 
 
 
@ ' ' \'	
 	
 	
  
 
 
(. . .
 
 
. . .	
 	
 	
  M M M
    (  W W W      r4   rE  c                   (    e Zd Zd ZddZd Zd ZdS )AATLookupWithDataOffsetc                    |                                 }|                                 }|                    |          }t          dd d t                    }|                    |||          }i }	|                                D ]L\  }
}|                    ||z             }|                                 }|                    ||           ||	|
<   M|	S NDataOffsets)r   r  rE  r  r   r  rX   r  )r   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultrT  r  r  items                 r2   r   zAATLookupWithDataOffset.readG  s    ''))%%''
**<88=$f==++lD)<<$]]__ 	! 	!ME6,,Vj-@AAJ??$$DNN:t,,, F5MMr4   Nc                    i i d}}}g }	t          ||j                  D ]}
t                      }||
                             ||           |                                }|                    |d           }|d k    r.|}|t          |          z   }|||<   |	                    |           |||
<   |                                }t          dd d t                    }|                    ||||d            |                                }|                    |d           |                    |d           |	D ]}|                    |           d S )Nr   )keyr  r   r  )rX  rg  r   r   r  rY   r  r^   r  rE  r  r   r  r  )r   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatarT  r  r  r  lookupWriterr  
dataWriterds                     r2   r   zAATLookupWithDataOffset.writeU  sy    022qW|Et777 
	* 
	*E%I%L  D111''))D!%%dD11F~~ !CII-%+T"##D)))#)M%   **,,=$f==\4M4HHH((**
\a888ZA666 	$ 	$A  ####	$ 	$r4   c                 ^    t          dd d | j                  }|                    |||          S r  )rE  rX   r   )r   r   r   r   r  s        r2   r   zAATLookupWithDataOffset.xmlReadx  s-    =$doFF~~eWd333r4   c                 f    t          dd d | j                  }|                    |||||           d S r  )rE  rX   r   )r   r   r   r   rK   r   r  s          r2   r   z AATLookupWithDataOffset.xmlWrite|  s7    =$doFF	4e<<<<<r4   r.   r\   r   r   r   r   r   r   r   r4   r2   r  r  F  sV          !$ !$ !$ !$F4 4 4= = = = =r4   r  c                       e Zd ZdddddZd e                                D             Zddd	d
Zd Zd Zd Z	d Z
ddZdS )MorxSubtableConverterLayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTc                     i | ]\  }}||	S r   r   )r   r  rU  s      r2   r  z MorxSubtableConverter.<dictcomp>  s    "W"W"WS3"W"W"Wr4   Nrj   rE   c                F    t                               | |||||           d S NrE   )ri   r   r   s         r2   r   zMorxSubtableConverter.__init__  s6    $Z[ 	 	
 	
 	
 	
 	
r4   c                 \    |dz  dk    r	d|_         d S |dz  dk    r	d|_         d S d|_         d S )N    r   Any   Vertical
Horizontal)TextDirection)r   r}  subtables      r2   "_setTextDirectionFromCoverageFlagsz8MorxSubtableConverter._setTextDirectionFromCoverageFlags  sJ    DLQ%*H"""dlq  %/H"""%1H"""r4   c                    |j         }t                      }|                                |_        |                                }|dz  dk    |dz  dk    f}| j        |         |_        |                     ||           |                                |_	        |xj	        |dz  dz  z  c_	        |                                |_
        |                                |_        t          d                             |j
                  }|J d|j
        z              |j         |z
  }	|j        |j         |j         |j        z   |	z
           }
t          |
          |j        |	z
  k    sJ t!          |
|j                  } |            |_        |j                            ||           |                    ||j        z              |S )	Nr  r   r     morxFz!unsupported 'morx' lookup type %s)r  tableTag)r   r#   r   r:   r8  _PROCESSING_ORDERSProcessingOrderr  r!  Reservedr;   SubFeatureFlagsr   rY   r  r  r   r  r@   r  r   )r   r   r   r   r   r   r}  orderKeyrX   headerLengthr  	subReaders               r2   r   zMorxSubtableConverter.read  s   jNN))++  ""T\a'%$,1)<= 3H=//q999&&((
	

us{r))

&&((",,.. (,,Q[99
K=KKK5 zC'{6:
Q^(Cl(RRS4yyAN\99999!tfoFFF	 jll	i...C!.()))r4   c                 H   |                     ||           |                                 |                    d|j        z             |                                 |                    d|j                   |                                 |                    d|j                   |                                 |j        dk    r3|                    dd|j        z             |                                 |                    d|j        z             |                                 |                    d	d
|j	        z             |                                 |j
                            ||           |                    |           |                                 d S )NzStructLength=%dr  r   r  r   r  z0x%04xzMorphType=%dr  r  )r  r   rM  r:   r   r  r  r  r;   r  r@   r  r  r   s         r2   r   zMorxSubtableConverter.xmlWrite  s   4'''+e.@@AAAO53FGGG-U5JKKK>Q
(U^2KLLL.5?:;;;-X@U5UVVVi...r4   c                     t                      }d}d|_        t          t          |          D ]:\  }}}|dk    rPt	          |d                   }|dz  dk    |dz  dk    f}	| j        |	         |_        |                     ||           ]|dk    r.|d         |_        |j        | j        v sJ d|j        z              |dk    r)|d         |_	        |j	        d	v sJ d
|j	        z              |dk    rt	          |d                   |_        |dk    rt	          |d                   |_
        |                    d          r|                    ||||           2J |            |dz  dz  |j        z  |_        |S )Nr   CoverageFlagsr   r  r  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  MorphFr  )r#   r  rY  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  rN   r  )
r   r   r   r   r   covFlagseltNameeltAttrsr  r  s
             r2   r   zMorxSubtableConverter.xmlRead  s   NN
-3GW-E-E 	& 	&)GXz/))#HW$566%_2X_4JK$($;H$E!77!DDDD---$,W$5!(D,LLLL1A4EE MLLL O++"*7"3*KKKK.@ LKKK J&&%hw&788

---$,Xg->$?$?!!!!'** &		'8Z>>>>%g%%un+aj8
r4   c                    |j         dz  dz	  }| j        |j                 \  }}||j        dk    rdndz  }||rdndz  }||j        dk    rdndz  }||rdndz  }||_        t          |j                  }	|                                }
d	|_        |j         }|j         d
z  |_         |	                    ||           ||_         |j        |	         dk    sJ |                                |
z
  }t          j        d|          |j        |	<   d S )Ni   r  r  r  r   r  r  r  r  ro  r  z>L)r  r  r  r  r  r  r  r  r:   r   structpack)r   r   r   r   r   r   r  reverseOrderlogicalOrderr  r  origReservedr   s                r2   r   zMorxSubtableConverter.write  s8   NZ/B6%)%E!&
"l 	E/:==DD1DL/DDa/E/588DDa?L/DDa/&&,''%%''' ~&0fd###%|K(,?????%%''&0$*Kf$=$=[!!!r4   r.   )r\   r   r   r  r  r  r   r  r   r   r   r   r   r4   r2   r  r    s         &,%,  #X"W<N<T<T<V<V"W"W"W
" 
 
 
 
 

2 2 2  6  (  @> > > > > >r4   r  c                   |    e Zd ZdddZd Zd Zd Zd Zd Zdd
Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd	S )	STXHeaderrj   rE   c                4   t                               | |||||           t          | j        t                    sJ t          dd d t                    | _        t          | j        t                    rt          dd d t                    | _
        d S d | _
        d S )NrE   GlyphClassesPerGlyphLookup)ri   r   rH  rX   r   rE  r  classLookupr    r[  perGlyphLookupr   s         r2   r   zSTXHeader.__init__  s    $Z[ 	 	
 	
 	
 $/955555$^T4HHdo'<== 	'"+,<dD'"R"RD"&Dr4   c                 R   t                      }|j        }|                    d          }|                    d          }|                    d          }d }	d }
|                                |_        |                    ||                                z              |                    ||                                z              |                    ||                                z              | j        ?|                    d          }|                    ||                                z              t          | j        t                    r|                    d          }	|	                    ||                                z              |                    d          }|                    ||                                z              |                    d          }
|
                    ||                                z              |
j        |j        z
  dz  }|dk    sJ |
                    |          |_        |                     |
|          |_        nYt          | j        t                    r?|                    d          }	|	                    ||                                z              | j                            |||          |_        t%          |j        |j        z
  |j        dz  z            }t'          |          D ]u}t)                      }|j                            |           t'          |j                  D ]6}|                                }|                     ||||	          |j        |<   7v| j        |                     |||          |_        |S )Nr   r  )r   r   r  r   GlyphClassCountr   r  rH  rX   r!   r$  LigComponents_readLigatures	Ligaturesr"   r  r   r  r   r   r   Statesr^   r!  _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r   r   r   r   r  r   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexs                      r2   r   zSTXHeader.read  s   j!..q11!..q11!..q11 & 0 0 2 2cF$4$4$6$66777cF$4$4$6$66777cF$4$4$6$66777*"("5"5a"8"8$$S6+;+;+=+=%=>>>do':;; 	8!..q11LcF$4$4$6$66777!'!4!4Q!7!7##C&*:*:*<*<$<===$11!44O  v'7'7'9'9!9::: / 36H6L LQRR#q(((("4"D"DEU"V"VE"11/4HHEOO)=>> 	8!..q11LcF$4$4$6$66777!-223CT9UU!$4$88U=RUV=VW
 
	  	** 	 	JJJEL&&&#E$9::  
-88::
040D0D$j$1 1!*--
 *$($=$=*D% %E! r4   c                     |                                  }|                    |j        ||j        z  z             }|                    |||           |S r.   )rX   r  r   r   r  )r   r   r  r   r  
transitionentryReaders          r2   r  zSTXHeader._readTransition=  sX    __&&
))Jj&;;;
 
 	[$===r4   c                     t          |j                  }||j        z
  dz  }|                    |                    |                    S r<  )r  r  r   r^  r$  )r   r   r   limitnumLigatureGlyphss        r2   r  zSTXHeader._readLigaturesE  sF    FK  "VZ/A5$$V%;%;<M%N%NOOOr4   c                    d}|j         D ]y}|j                                        D ]]}t          |t                    rF|j        dk    rt          ||j        dz             }|j        dk    rt          ||j        dz             }^z|S )Nr   ro  r   )r  r  rZ   r/   r    	MarkIndexmaxCurrentIndex)r   r  
numLookupsr
  r1   s        r2   _countPerGlyphLookupszSTXHeader._countPerGlyphLookupsJ  s    
 
\ 	I 	IE&--// I Ia!677 I{f,,%(Q[1_%E%E
~//%(Q^a5G%H%H
I r4   c                 >   |j         }g }t          |                     |                    D ]p}|                    d          }|                    ||                                z              |                    | j                            ||i                      q|S r   )	r   r   r  r  r   r   r^   r  r   )r   r  r   r   r   lookupsr  r  s           r2   r  zSTXHeader._readPerGlyphLookupsY  s    jt11%8899 	M 	MA!..q11LcF$4$4$6$66777NN4.33L$KKLLLLr4   Nc                    t                      }| j                            ||||j        d            t	          |                                d          }t          |j                                                  dz   }d}	| j        |	dz  }	|	| j	        j
        z  }	| j	                            ||j                  \  }
}|                     ||j        ||          \  }}|	t          |          z   }|t          |          z   }|t          |          z   }t	          |                     ||          d          }|
|t          |          z   }nd }d\  }}|                     ||          }|                     ||          }|9t          |          dk    sJ |t          |
          z   }|t          |          z   }|                    |           |                    |	           |                    |           |                    |           | j        |                    |           ||                    |           |*|                    |           |                    |           |                    |           |                    |           |                    |           |                    |           |
|                    |
           ||                    |           ||                    |           d S d S )N)r   r  r   r  r   )NNr   )r   r  r   r  r   r  r  rZ   r  rX   actionHeaderSizecompileActionsr  _compileStatesr  _compilePerGlyphLookups_compileLigComponents_compileLigaturesr  r  )r   r   r   r   r   r   glyphClassWriterglyphClassDataglyphClassCountglyphClassTableOffset
actionDataactionIndexstateArrayDataentryTableDatastateArrayOffsetentryTableOffsetperGlyphOffsetperGlyphDataactionOffsetligaturesOffsetligComponentsOffsetligComponentsDataligaturesDatas                          r2   r   zSTXHeader.writeb  s=   (??dIu/At 	 	
 	
 	
 -88::A>>e07799::Q> "*!Q&!!AA"&/"@"@u|"T"T
K)-)<)<%,*
 *
& 13~3F3FF+c..A.AA)C,?,??477tDDaHH!+c..A.AALLL/9,, 66udCC..ud;;(|$$))))".Z"@1C8I4J4JJO/***/000*+++*+++*n---#l+++*1222o...(((((((((&&&!Z((((.///$]+++++ %$r4   c           	         t                      }g i }}|D ]}t          |          D ]}	|j        |	         }
t                      }|
                    |||           |                                }t          |          |
j        k    s/J dt          |
          |
j        t          |          fz              |                    |          }|)t          |          }|||<   |	                    |           |
                    |           t          |                                d          }t          t          |          d          }||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r  r   r  r  r   r  rY   r^   r'  r   r   )r   r   statesr$  r'  stateArrayWriterentriesentryIDsr
  r  r  entryWriter	entryDatar  r(  r)  s                   r2   r  zSTXHeader._compileStates  s`   (?? 	9 	9E#O44 9 9
".z:
+oo"";kBBB'2244		NNj&;;;;I$$)	NNM  <;; &\\)44
%!$WJ*4HY'NN9--- ,,Z8888#9$ -88::A>>Yw//33~--r4   c                    | j         dS |                     |          }t          |j                  |k    s!J dt          |j                  |fz              t	                      }|j        D ]K}|                                }| j                             ||i |d            |                    |d           L|                                S )Nr4   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   r  )	r  r  r  r  r   r  r   r  r  )r   r  r   r  r   r  r  s          r2   r  z!STXHeader._compilePerGlyphLookups  s    &3//66
5())Z777;5()):67 877
 + 	= 	=F!..00L%%lD"fdKKK  ! <<<<  """r4   c                     t          |d          sd S t                      }|j        D ]}|                    |           |                                S )Nr  )r   r   r  r'  r  )r   r  r   r   	components        r2   r   zSTXHeader._compileLigComponents  s]    uo.. 	4, 	* 	*Iy))))  """r4   c                     t          |d          sd S t                      }|j        D ]*}|                    |                    |                     +|                                S )Nr  )r   r   r  r'  rg  r  )r   r  r   r   	glyphNames        r2   r!  zSTXHeader._compileLigatures  sh    uk** 	4 	; 	;Ity99::::  """r4   c                 >   |                     ||           |                                 |                    d|j        z             |                                 t	          |j                                                  D ]1\  }}|                    d||           |                                 2t          |j	                  D ]\  }}	|                     d|           |                                 t	          |	j
                                                  D ] \  }
}|                    ||d|
id           !|                    d           |                                 t          |j                  D ]\  }}|                     d	|           |                                 t	          |                                          D ]1\  }}|                    d
||           |                                 2|                    d	           |                                 t          |d          r|                     d           |                                 t          t          |d                    D ]1\  }}|                    d||           |                                 2|                    d           |                                 |                     |||||           |                    |           |                                 d S )NzGlyphClassCount=%s
GlyphClassrT  r   StateindexonGlyphClass
Transition)r   r   rK   r  r  r  LigComponent)rD  r   )r  r   rM  r  rX  r  r  r   r   r  r  r  r  r  r   r  _xmlWriteLigatures)r   r   r   r   rK   r   gklassr	  r
  r  transr   r  rT  rU  s                   r2   r   zSTXHeader.xmlWrite  sE   4'''.1FFGGGu17799:: 	  	 HAuAUCCC!*5<!8!8 	  	 Jwj999%+E,=,C,C,E,E%F%F  !
E):6%	      W%%%"5#899 	  	 IAv/q999$V\\^^44 $ $
s##HE#EEE!!####-...5/** 	 ///#GE?$C$CDD $ $3##N!3#GGG!!####_---	4eDDDr4   c                 l   t          |d          sd S |                    d           |                                 t          t	          |d                    D ]1\  }}|                    d||           |                                 2|                    d           |                                 d S )Nr  Ligature)rD  rT  )r   r  r   r   r  r   r  )r   r   r   r   rK   r   r   rI  s           r2   rH  zSTXHeader._xmlWriteLigatures  s    uk** 	F;'''ge[99:: 	  	 DAq
!1===%%%r4   c                    t                      }t          t          |          D ]\  }}}|dk    r(|d         }|d         }	t          |	          |j        |<   4|dk    r2|                     |||          }
|j                            |
           l|dk    r7| j        	                    |||          }|j
                            |           |dk    r|                     |||          |_        |dk    r|                     |||          |_        t          |j                                                  dz   |_        |S )	Nr@  rT  r   rB  r  r  r  r   )r   rY  r  r   r  _xmlReadStater  r^   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rZ   r  )r   r   r   r   r  r  r  r  rT  r   r
  r  s               r2   r   zSTXHeader.xmlRead  sZ   -3GW-E-E 	U 	U)GXz,&& ) ),4UOO"5))G##**8ZFF##E****,,,,44Xz4PP%,,V4444O++&*&@&@j$' '## K''"&"8"8:t"T"T #E$6$=$=$?$? @ @1 Dr4   c                     t                      }t          t          |          D ]W\  }}}|dk    rKt          |d                   }|                                 }	|	                    ||||           |	|j        |<   X|S )NrF  rE  )r   rY  r  r   rX   r  r  )
r   r   r   r   r
  r  r  r  r  r  s
             r2   rO  zSTXHeader._xmlReadState  s    

-3GW-E-E 	; 	;)GXz,&&%h~&>??
!__..
""7Hj$GGG0:!*-r4   c                     g }t          t          |          D ]4\  }}}|dk    r(|                    t          |d                              5|S )NrG  r   )rY  r  r^   r   )r   r   r   r   ligComponentsr  r  _eltContents           r2   rP  zSTXHeader._xmlReadLigComponents&  s\    .4Wg.F.F 	B 	B*GX{.(($$Xhw.?%@%@AAAr4   c                     g }t          t          |          D ]'\  }}}|dk    r|                    |d                    (|S )NrM  rT  )rY  r  r^   )r   r   r   r   ligsr  r  rU  s           r2   rQ  zSTXHeader._xmlReadLigatures-  sO    .4Wg.F.F 	/ 	/*GX{*$$HW-...r4   r.   )r\   r   r   r   r   r  r  r  r  r   r  r  r   r!  r   rH  r   rO  rP  rQ  r   r4   r2   r  r    s+       EG 	' 	' 	' 	' 	'- - -^  P P P
    5, 5, 5, 5,n. . .4# # # # # ## # #& & &P	 	 	  ,        r4   r  c                   (    e Zd Zd ZddZd Zd ZdS )CIDGlyphMapc                     |                                 }i }t          |                    |                    D ]#\  }}|dk    r|                    |          ||<   $|S Nro  )r!  r   r$  ra  )r   r   r   r   numCIDsr  cidr  s           r2   r   zCIDGlyphMap.read6  si    ##%%%f&<&<W&E&EFF 	9 	9LC&  "//88sr4   Nc                    fd|                                 D             }|rt          |          dz   nd}|                    |           t          |          D ]+}|                    |                    |d                     ,d S )Nc                 B    i | ]\  }}|                     |          S r   rS  )r   r]  rT  r   s      r2   r  z%CIDGlyphMap.write.<locals>.<dictcomp>?  s+    MMMedooe,,MMMr4   r   r   ro  r  r  r'  r   rY   )	r   r   r   r   r   r   r  r   r]  s	     `      r2   r   zCIDGlyphMap.write>  s    MMMMu{{}}MMM"'.E

QQ5!!!<< 	7 	7Cuyyf556666	7 	7r4   c                     i }t          t          |          D ]<\  }}}|dk    r0|d                                         |t          |d                   <   =|S )NCIDrT  r]  )rY  r  stripr   r   r   r   r   r  eNameeAttrs	_eContents           r2   r   zCIDGlyphMap.xmlReadE  s^    (.w(@(@ 	J 	J$E69~~28/2G2G2I2Ixu../r4   c                 b   |                     ||           |                                 t          |                                          D ]9\  }}|2|dk    r,|                    d||           |                                 :|                    |           |                                 d S )Nro  rb  )r]  rT  r  r   rX  r  r   r  )r   r   r   r   rK   r   r]  rT  s           r2   r   zCIDGlyphMap.xmlWriteL  s    4''' // 	$ 	$JC Uf__##Es%#@@@!!###r4   r.   r  r   r4   r2   rY  rY  5  sU          7 7 7 7      r4   rY  c                   (    e Zd Zd ZddZd Zd ZdS )GlyphCIDMapc                    |                                 }|                                }|                    |          }|t          |          k    r,t                              d|t          |          fz             i }t          t          t          |          t          |                              D ]}||         }	|	dk    r|	|||         <   |S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restro  )rq  r!  r$  r  rr  rs  r   min)
r   r   r   r   
glyphOrderr   cidsr  r  r]  s
             r2   r   zGlyphCIDMap.readX  s    ''))
!!##%%e,,3z??""KK$',c*oo&>?  
 STC
OO<<== 	2 	2Gw-Cf}}.1z'*+r4   Nc                    fd|                                 D             }|rt          |          dz   nd}|                    |           t          |          D ]+}|                    |                    |d                     ,d S )Nc                 R    i | ]#\  }}||dk                         |          |$S r[  rS  )r   rI  r]  r   s      r2   r  z%GlyphCIDMap.write.<locals>.<dictcomp>j  s@     
 
 
33&== OOA#0==r4   r   r   ro  r`  )	r   r   r   r   r   r   r  r   r  s	     `      r2   r   zGlyphCIDMap.writei  s    
 
 
 
++--
 
 

 #(.E

QQ5!!!U|| 	; 	;Guyy&99::::	; 	;r4   c                     i }t          t          |          D ]*\  }}}|dk    rt          |d                   ||d         <   +|S )Nrb  r   rT  )rY  r  r   rd  s           r2   r   zGlyphCIDMap.xmlReadt  sR    (.w(@(@ 	D 	D$E69~~*26'?*C*Cvg'r4   c                 b   |                     ||           |                                 t          |                                          D ]9\  }}|2|dk    r,|                    d||           |                                 :|                    |           |                                 d S )Nro  rb  rA  ri  )r   r   r   r   rK   r   rT  r]  s           r2   r   zGlyphCIDMap.xmlWrite{  s    4''' // 	$ 	$JE33&==##Ec#BBB!!###r4   r.   r  r   r4   r2   rk  rk  W  sU          "	; 	; 	; 	;      r4   rk  c                   (    e Zd Zd ZddZd Zd ZdS )
DeltaValuec                 X   |d         }|d         }|d         }|dv s
J d            ||z
  dz   }d|z  }d|z  }	d|z  dz
  }
d|dz
  z  }g }d\  }}t          |          D ]J}|dk    r|                                d	}}||z
  }||z	  |
z  }||z  r||	z
  }|                    |           K|S )
N	StartSizeEndSizeDeltaFormatr   r  rA  illegal DeltaFormatr   )r   r   r   r  )r   r!  r^   )r   r   r   r   rw  rx  ry  nItemsnBitsminusOffsetmasksignMaskru  tmpshiftr   r   s                    r2   r   zDeltaValue.read  s   k*	I&.i''')>'''9$q([ 5jU
a#

Uv 	% 	%Azz#..00"UEMEE\T)Ex ,+e$$$$r4   Nc                 X   |d         }|d         }|d         }|}	|dv s
J d            ||z
  dz   }
d|z  }t          |	          |
k    sJ d|z  dz
  }d\  }}|	D ]2}||z
  }|||z  |z  z  }|dk    r|                    |           d\  }}3|d	k    r|                    |           d S d S )
Nrw  rx  ry  rz  r{  r   )r   r  r   r  )r  r'  )r   r   r   r   r   r   rw  rx  ry  ru  r|  r}  r  r  r  s                  r2   r   zDeltaValue.write  s   k*	I&.
i''')>'''9$q([ :&((((U
a
U 	# 	#EEME%$,501Czz""3'''"
UB;;s##### ;r4   c                 f    |                     ||d|fgz              |                                 d S r   r   r   r   s         r2   r   zDeltaValue.xmlWrite  =    D%GU+;*<"<===r4   c                 ,    t          |d                   S r   r   r   s       r2   r   zDeltaValue.xmlRead      g'''r4   r.   r\   r   r   r   r   r   r   r   r4   r2   ru  ru    sU          .$ $ $ $*  ( ( ( ( (r4   ru  c                       e Zd Zd ZddZdS )VarIdxMapValuec                    	
 |d         }|d         }d|dz  z   }d|z  dz
  	d	z
  
d|z
  d|dz  dz	  z   }|j         |j        |j        |j        d	|         }	
fd
 ||          D             S )NEntryFormatrt   r   r  l    r  0   r   r   r  rA  r   c                 ,    g | ]}|z  z  |z  z  S r   r   )r   raw	innerMask	outerMask
outerShifts     r2   rV  z'VarIdxMapValue.read.<locals>.<listcomp>  s;     
 
 
 Y:-#	/B
 
 
r4   r:  r$  readUInt24Arrayr  )r   r   r   r   fmtr|  	innerBits	entrySizer   r  r  r  s            @@@r2   r   zVarIdxMapValue.read  s    &>*v&	)^q(	*	)^
#,1,-	$%%$	
 

 	
 
 
 
 
 
 y((
 
 
 	
r4   Nc                     |d         }|}|d                              t          |                     d|dz  z   }d|z  dz
  d|z
  d|dz  dz	  z   }	|j        |j        |j        |j        d|	         }
 |
fd	|D                        d S )
Nr  rt   r   r  r  r  r   r  c                 ,    g | ]}|d z  z	  |z  z  S )l      r   )r   idxr  r  s     r2   rV  z(VarIdxMapValue.write.<locals>.<listcomp>  s<        #
2sYG  r4   )setValuer  r>  r*  writeUInt24Arrayr	  )r   r   r   r   r   r   r  r  r  r  r   r  r  s              @@r2   r   zVarIdxMapValue.write  s    &~''G555v&	)^q(	)^
#,1,-	%&&%	
 

 
 	
    "  	
 	
 	
 	
 	
r4   r.   r  r   r4   r2   r  r    s7        
 
 
,
 
 
 
 
 
r4   r  c                   (    e Zd Zd ZddZd Zd ZdS )VarDataValuec                 j   g }|d         }|d         }t          |dz            }|dz  }|r|j        |j        }	}n|j        |j        }	}t	          ||          t          ||          }}
|                     ||
                     |                     |	||
z
                       ||k    r||d = |S )Nrs   	NumShorts     )boolr   r  r0  rm  r  extend)r   r   r   r   rZ   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r2   r   zVarDataValue.read  s     01k*	 V+,,	&	 	W+1+?AV.LL+1+@&BV.L[),,c+y.I.IBll2&&'''nnR"W--...{||$r4   Nc                 t   |d         }|d         }t          |dz            }|dz  }|j        |j        f|j        |j        fd|         \  }	}
t	          ||          t          ||          }} |	|d |                     |
|||                    ||k    r|                    dg||z
  z             d S d S )Nrs   r  r  r  r  r   )r  r  r4  r   rm  r  writeSmallArray)r   r   r   r   rZ   r   r  r  r  writeBigArrayr  r  r  s                r2   r   zVarDataValue.write  s     01k*	 V+,,	&	 *F,AB(&*@A*
 *
 *&
 [),,c+y.I.IBfSbSk"""r+~.///""A3"{*:#;<<<<< r4   c                 f    |                     ||d|fgz              |                                 d S r   r  r   s         r2   r   zVarDataValue.xmlWrite  r  r4   c                 ,    t          |d                   S r   r  r   s       r2   r   zVarDataValue.xmlRead  r  r4   r.   r  r   r4   r2   r  r    sU          .= = = =&  ( ( ( ( (r4   r  c                   (    e Zd Zd ZddZd Zd ZdS )TupleValuesc                 8    t          j        d |          d         S r   )r	   decompileDeltas_)r   r  r   s      r2   r   zTupleValues.read  s    .tT::1==r4   Nc                 n    |j         t                   }t          t          j        ||                     S )N)optimizeSize)cfgr   bytesr	   compileDeltaValues_)r   r   r   r   rZ   r   optimizeSpeeds          r2   r   zTupleValues.write"  s7    !45.vDUVVV
 
 	
r4   c                 ,    t          |d                   S r   r  r   s       r2   r   zTupleValues.xmlRead(  r  r4   c                 f    |                     ||d|fgz              |                                 d S r   r  r   s         r2   r   zTupleValues.xmlWrite+  r  r4   r.   r  r   r4   r2   r  r    sU        > > >
 
 
 
( ( (    r4   r  c                   <    e Zd Z	 d	dddddZd Zd	dZd Zd ZdS )
	CFF2IndexNrj   )	itemClassitemConverterClassrF   c                z    t                               | |||||           || _        |
 |            nd | _        d S r  )ri   r   
_itemClass
_converter)r   rK   rV   rW   rX   r  r  rF   s           r2   r   zCFF2Index.__init__1  sY     	$Z[ 	 	
 	
 	
 $$6$B    	r4   c                                                      dk    rg S                                 d            }j        duodk    }|s |dz             }g }|                    d          }                    |dz
             |D ]}	||	k    sJ                     |	|z
            }
 j        3                                 }|                    |
j                   |}
n" j         j        	                    |
          }
|
                    |
           |	}|S  fd} |            }t          |gz            }|S )Nr   c                 D    | j         | j        | j        | j        d|         S )Nr  r  )r   offSizes     r2   getReadArrayz$CFF2Index.read.<locals>.getReadArrayJ  s3    ())(	 
  r4   Fr   r   c                      	                                 	j        dz   z  z   dz
             
fd} | S )Nr   c                    	                     | z  z               d          }	                     |d         z              	                    |d         |d         z
            }
j        3
                                }|                    |	j                   |}n"
j        
j                            |          }|S )Nr  r   r   )r   r  r  r  
localStater  r   )r   r  r  objdata_posr   r  
offset_posr   r   r   s       r2   r   z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemq  s    $$Z!g+%=>>>'illG$$X
%:;;;&//
WQZ0GHHD2"oo//dD+2HIII"4#33D$??Kr4   r   )r   r  r  r   r   r   r   r  r  r   r   s    @@@@r2   r   z%CFF2Index.read.<locals>.get_read_itemk  s    $kkmm#Z
%g(==A(Lg>>	                      ! r4   )r   r8  r   popr  r  r  r  r  r   r^   r   )r   r   r   r   r   r   r  r  
lastOffsetr  r  r  r   r   r   r   r  r  s   ```            @@@r2   r   zCFF2Index.readD  s     ""A::I""$$	 	 	 !L11	y%3%!) 1	i	**GE QJOOJN+++! $ $!V++++v
':;;?.//++CMM$f.?@@@DD_0?//d;;DT"""#

L! ! ! ! ! ! ! ! ! !, &I)u,--A Hr4   c                 <    |}                     t          |                     t          |          sd S  j        fd|D             }n% j         fdt	          |          D             }d |D             }t          t          |d                    }|d         }|dk     rdn|dk     rd	n	|d
k     rdnd}	                    |	           j        j	        j
        j        d|	         }
 |
|           |D ]}                    |           d S )Nc                 :    g | ]}|                               S r   r  )r   r  r   s     r2   rV  z#CFF2Index.write.<locals>.<listcomp>  s%    :::DT\\$'':::r4   c           	      R    g | ]#\  }}j                             ||          $S r   )r  r   )r   r   r  r   r   r   r   s      r2   rV  z#CFF2Index.write.<locals>.<listcomp>  sE       At %%fdItQGG  r4   c                 ,    g | ]}t          |          S r   )r  )r   r  s     r2   rV  z#CFF2Index.write.<locals>.<listcomp>  s    ///3t99///r4   r   )initialr1     i   r  i   rA  r   r  )r  r  r  r  r   rW  r(   r<  r>  r*  r  r	  r  )r   r   r   r   rZ   r   r  r  r  r  r   r  s   ````        r2   r   zCFF2Index.write  s   #e**%%%5zz 	F?&::::E:::EE_(      (//  E
 0////z'155566R[
 E!! A 7**Z)5K5KQR 	
 	'""" %&&%	
 

 
 	
7 	# 	#DT""""	# 	#r4   c                     | j         .|                                  }|                    d |||           |S | j        | j                            |||          S t	                      r.   )r  r  r  r   r   )r   r   r   r   r  s        r2   r   zCFF2Index.xmlRead  sd    ?&//##CKKeWd333J_(?**5'4@@@%'''r4   c           
         | j         2t          |          D ] \  }}|                    ||d|fg|           !d S | j        ;t          |          D ])\  }}| j                            |||||d|fgz              *d S t                      )NrD  )r  r   r  r  r   r   )r   r   r   r   rK   r   r   r  s           r2   r   zCFF2Index.xmlWrite  s    ?&$U++ B B4

9dgq\NDAAAAB B_($U++  4((tT47A,1G    
 &'''r4   r.   )r\   r   r   r   r   r   r   r   r   r4   r2   r  r  0  s         
 
 
 
 
 
&B B BH## ## ## ##J( ( (
( 
( 
( 
( 
(r4   r  c                       e Zd Zd ZdS )
LookupFlagc                    |                     ||d|fgz              g }|dz  r|                    d           |dz  r|                    d           |dz  r|                    d           |dz  r|                    d	           |d
z  r|                    d           |dz  r|                    d|dz	  z             |r(|                    d                    |                     |                                 d S )Nr   r   rightToLeftr  ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksr  useMarkFilteringSeti   zmarkAttachmentType[%i]rz  )r   r^   rM  r{  r   r|  s          r2   r   zLookupFlag.xmlWrite  s*   D%GU+;*<"<===4< 	(LL'''4< 	-LL+,,,4< 	,LL*+++4< 	(LL'''4< 	0LL.///6> 	BLL1UaZ@AAA 	/chhuoo...r4   NrN  r   r4   r2   r  r    s#            r4   r  c                   N     e Zd ZeZ fdZed             Zed             Z xZ	S )
_UInt8Enumc                 p    |                      t                                          |||                    S r.   )	enumClassr  r   )r   r   r   r   r  s       r2   r   z_UInt8Enum.read  s)    ~~eggll64CCDDDr4   c                 P    t          | j        |                                          S r.   )r  r  upperr  s     r2   r   z_UInt8Enum.fromString  s    s}ekkmm444r4   c                 Z    |                      |          j                                        S r.   )r  rK   lowerr  s     r2   r   z_UInt8Enum.toString  s#    }}U##(..000r4   )
r\   r   r   r   r  r   r  r   r   r  r  s   @r2   r  r    sx        IE E E E E 5 5 [5 1 1 [1 1 1 1 1r4   r  c                       e Zd ZeZdS )r$   N)r\   r   r   _ExtendModer  r   r4   r2   r$   r$     s        IIIr4   r$   c                       e Zd ZeZdS )r%   N)r\   r   r   _CompositeModer  r   r4   r2   r%   r%     s        IIIr4   r%   c                   N    e Zd ZdZdZdZdZdZed             Z	ed             Z
dS )	MappingEntryFormatr   r  r   r   r  c                 (    | t           j        z  dk    S )Nr  r  CODE_POINT_BIAS_BITSr  s    r2   bias_present_u16z#MappingEntryFormat.bias_present_u16      )>>4GGr4   c                 (    | t           j        z  dk    S )Nr  r  r  s    r2   bias_present_u24z#MappingEntryFormat.bias_present_u24  r  r4   N)r\   r   r   HAS_SUBSET_DEFHAS_CHILD_ENTRIESHAS_ENTRY_IDHAS_PATCH_FORMATr  propertyr  r  r   r4   r2   r  r    sl        NLH H XH H H XH H Hr4   r  c                   (    e Zd Zd ZddZd Zd ZdS )MappingEntriesConverterc                    ddl m} ddlm} |d         }g }d}t	          |          D ]}	i }
t          |                                          }||
d<   |t
          j        z  r|                                }g }t	          |          D ]+}	|                                }|	                    |           ,||
d<   |
                                }g }t	          |          D ]k}	|                                } ||                                d          } ||                                d          }|	                    |||d	           l||
d
<   |t
          j        z  rr|                                }t          |dz            }|dz  }||
d<   g }t	          |          D ]+}	|                                }|	                    |           ,||
d<   |t
          j        z  rJg }	 |                                }|dz	  }|dz  }|dz   |z   }|	                    |           |}|snA||
d<   n|dz   g|
d<   |dz   }|t
          j        z  r|                                |
d<   |t
          j        z  rd}|j        r|                                }n|j        r|
                                }||
d<    ||j        |j        d          |d          \  }} |                    |            t1          |          |
d<   |	                    |
           |S )Nr   )r   )decoder   r1  formatFlagsfeatureTagsr  tagstartenddesignSpaceSegmentsr     childEntryConjunctivechildEntryIndicesTr   entryIdspatchFormatcodePointsBiasi )r  maxValue
codePoints)fontTools.misc.fixedToolsr   fontTools.misc.iftSparseBitSetr   r   r  r8  r  rW  r^   r!  r   r  r  rD  r  	readInt24r  r  r  r  r  r   r   rX  )!r   r   r   r   r  	sbsDecode
entryCountr6  lastEntryIdr  entryr  featureCountfeaturesr  designSpaceCountrz  segTagr  r  modeAndCountconjunctive
childCountchildIndicesr  ids
encodedValdeltahasMorecurrentEntryIdr  
codepointsconsumeds!                                    r2   r   zMappingEntriesConverter.read  s   CCCCCCFFFFFFL)
z"" G	" G	"AE,V-=-=-?-?@@K#.E- />> 8%//11|,, ) )A ..**COOC(((('/m$#)#4#4#6#6 /00 Q QA#^^--F!E&//"3"3R88E% 1 1266COOFU3$O$OPPPP/7+,/AA 	:%//11"<$#677)D0
1<-.!z** - -A ++--C '',,,,-9)*/<< . "(!1!1!3!3J&!OE(4/G%01_u%<NJJ~..."0K"  %(j!!%01_$5j!)Ao/@@ :'-'7'7'9'9m$/DD 9/ /!,,..DD 1 /!,,..D*.&''0yK
-D8( ( ($
H x(((&,Z&8&8l#NN5!!!!r4   Nc                 p   ddl m} ddlm} |}d}	|D ] }
|
                    dt          d                    }|                    |j                   |t
          j        z  r|
                    dg           }|                    t          |                     |D ]}|
                    |           |
                    dg           }|                    t          |                     |D ]g}|
                    |d                    |                     ||d	         d
                     |                     ||d         d
                     h|t
          j        z  rt|
                    dg           }|
                    dd          }t          |          dz  |rdndz  }|                    |           |D ]}|                    |           |t
          j        z  rp|
                    dg           }t!          |          D ]I\  }}||	z
  dz
  }|t          |          dz
  k     rdnd}|dz  |z  }|                    |dz             |}	Jn|	dz  }	|t
          j        z  r)|                    |
                    dd                     |t
          j        z  r|
                    dd          |j        r|                               n|j        r|                               |
                    dg           }|                     |fd|D                                  "d S )Nr   )encode)r   r1  r  r  r  r  r  r  r  r
  r	  Fr  r  r  r   i r  r  r  c                 &    g | ]}|k    |z
  S r   r   )r   cr  s     r2   rV  z1MappingEntriesConverter.write.<locals>.<listcomp>  s#    +V+V+VAQUIIAHIIIr4   )r  r'  r  r   rY   r  r<  r   r  r  rY  r'  r   r  rG  r  r   r  r  r  r  r  )r   r   r   r   r   r   	sbsEncoder  r6  lastIdr  r  r  r  rz  segr  r  r  r  r  r   eidr!  has_moreencoded_valuer$  r  s                              @r2   r   zMappingEntriesConverter.writeV  s   FFFFFFCCCCCC 2	Y 2	YE  ))M3Ea3H3HIIKk/000/>> 
< 99]B77!!#h--000# ) )COOC(((( 99%:B??""3x==111# < <COOCJ///$$UU3w<%<%<===$$UU3u:r%:%:;;;;/AA ,$yy)<bAA#ii(?GG #L 1 1D 8[=WTTVWX!!,///' , ,C&&s++++/<< ii
B//'nn ! !FAs  &L1,E$%C1$4$4qq!H%*aZ8$;M&&}x'?@@@ FF! !/@@ ?!!%))M1"="=>>>/DD Yyy!1155/ -&&t,,,, 1 -&&t,,,"YY|R88
  +V+V+V+Vj+V+V+V!W!WXXXe2	Y 2	Yr4   c           
      ,   |D ]}|                     dt          d                    }|                    d|j                   |                                 d|v r6|d         D ]-}|                    d|           |                                 .d|v r6|d         D ]-}	|                    d	|	           |                                 .d
|v rJ|d
         D ]A}
|                    d|
d         |
d         |
d                    |                                 Bd|v r|                    dt          |                     dd                               |                                 |d         D ]-}|                    d|           |                                 .d|v r1|                    d|d                    |                                 d|v r|                    d|                     dd                     |                                 d                    d |d         D                       }|                    d|           |                                 |                    d           |                                 d S )Nr  r   r  )r  r  entryIdr   r  r.  r  designSpaceSegmentr  r  r  r  r
  r	  F
childEntryrC  r  r  r  rz  c              3   4   K   | ]}t          |          V  d S r.   )strr   r)  s     r2   r   z3MappingEntriesConverter.xmlWrite.<locals>.<genexpr>  s(      (M(MAQ(M(M(M(M(M(Mr4   )	rY   r  r  r   r   r   r   r{  r  )r   r   r   r   rK   r   r  format_flagsr-  r  r,  r  codePointsStrs                r2   r   z MappingEntriesConverter.xmlWrite  s    *	  *	 E 99]4Fq4I4IJJLwL4FGGGU"" , ( (C''	'===%%''''%% / ( (C''C'@@@%%''''$-- !67 ( (C'',J!'lJ	 (    %%''''"e++##+eii(?GGHH $    !!### !45 ( (C''C'@@@%%''''%%##M}9M#NNN!!###u$$##$EII6F,J,J $    !!### #(M(M|9L(M(M(M M M##L#FFF!!###W%%%U*	  *	 r4   c           
         g }|D ]I}t          |t                    s|\  }}}|dk    r#t          |                    dd                    }dt	          |          i}|D ]}	t          |	t                    s|	\  }
}}|
dk    r=|                    dg                               t          |d                              b|
dk    r0|                    dg                               |d                    |
d	k    rZ|                    d
g                               |d         t          |d                   t          |d                   d           |
dk    r't          t          |d                             |d<   %|
dk    r>|                    dg                               t          |d                              i|
dk    rt          |d                   |d<   |
dk    rt          |d                   |d<   |
dk    r'd |d         	                                D             |d<   |                    |           K|S )Nr  r  0r1  r  r   r.  r  r2  r  r  r  r  r  r	  r3  r
  rD  r  r  r  c                 0    g | ]}|t          |          S r   r   r6  s     r2   rV  z3MappingEntriesConverter.xmlRead.<locals>.<listcomp>  s3     / / /'(q/FF/ / /r4   )
r/   r0   r   rY   r  
setdefaultr^   r  r  split)r   r   r   r   r6  elemrK   format_flags_intr  e_elemenameeattrsecontents                r2   r   zMappingEntriesConverter.xmlRead  s    '	& '	&DdE** #' D%w#+EIImS,I,I#J#J &(:;K(L(LM%  F%fe44 ! .4+E68	))((R88??$VG_55    ,..((;;BB6'?SSSS"666(()>CCJJ'-e}).vg)?)?',VE]';';     "9999=hvg>W>W9X9X566,..(()<bAAHH$VG_55    -///7w/H/Hm,,"2222:6'?2K2K.//,../ /,27O,A,A,C,C/ / /l+ u%%%r4   r.   r  r   r4   r2   r  r    s_        P P Pd9Y 9Y 9Y 9Yv+  +  + Z* * * * *r4   r  int8int16int32r<   r8   uint24r=   char64r  MappingEntriesOffsetLOffsetOffset24	TupleList)r  )r  c                 .    t          t          |           S N)rX   )r)   rE  Cs    r2   r3   r3   	      79;;; r4   c                 .    t          t          |           S rO  )r)   r  rP  s    r2   r3   r3   	  s    1HUV)W)W)W r4   c                 .    t          t          |           S rO  )r)   r  rP  s    r2   r3   r3   	  rR  r4   c                 .    t          t          |           S rO  )r)   r[   rP  s    r2   r3   r3   	  s    '%A666 r4   c                 .    t          t          |           S rO  )r)   r  rP  s    r2   r3   r3   	  s    76a888 r4   c                 .    t          t          |           S rO  )r)   r  rP  s    r2   r3   r3   	  s    WW;;; r4   )VarCompositeGlyphListrY  rk  rG   rH   rI   r#   rE  r  r  OffsetTo	LOffsetToLOffset24To)r  r   r  r   r  r   r  r   r  r   r  r   r  %fontTools.ttLib.tables.TupleVariationr	   fontTools.misc.roundToolsr
   r   fontTools.misc.textToolsr   r   r   r   r   fontTools.misc.lazyToolsr   fontTools.ttLibr   r   rC  r   r   r   r   r   otDataSchemar   otTablesr   r   r   r   r   r    r!   r"   r#   r$   r  r%   r  r&   	itertoolsr'   r(   	functoolsr)   typesr*   r   r  typingr+   loggingenumr,   	getLoggerr\   rr  r  rW  rg   objectri   r   r   r   r   r   r  r  r  r  r,  r6  r@  rJ  rO   rP   rQ   rU  r[  ri  rl  rv  r  r  r  r  r  r  r  r  r  rT   rR   r[   r  r  r@   r>   r?   rA   r7   r:  rE  r  r  r  rY  rk  ru  r  r  r  r  r  r  r  r  rS   r   r4   r2   <module>rk     s                  A @ @ @ @ @ J J J J J J J J M M M M M M M M M M M M M M - - - - - - ? ? ? ? ? ? ? ?              $ # # # # #                            . - - - - - - -       ! ! ! ! ! ! 				              g!!
(
(C(tI C( C( C( C(Lj j j j jF j j jZ/ / / / /- / / /"    K       {   & & & & &8 & & & ' ' ' ' 'H ' ' '          e      ! ! ! ! !}e ! ! !' ' ' ' 'H ' ' ' ( ( ( ( (X ( ( ( & & & & &8 & & & ' ' ' ' 'H ' ' ' " " " " "X " " "         (      	 	 	 	 	K 	 	 		 	 	 	 	[& 	 	 		 	 	 	 	K 	 	 	    +   A A A A Ak A A A&       
    V   $              . . . . . . . .0 0 0 0 0Z 0 0 0:    N            n      > > > > >G > > >0    %       k   0    [   >D4 D4 D4 D4 D4] D4 D4 D4N> > > > >v > > >6+ + + + +F + + +D    U       e   M M M M M M M ML L L L Lu L L LG G G G G&( G G GL L L L LE L L L8 8 8 8 8( 8 8 8&    +   0t t t t t t t t|8= 8= 8= 8= 8=m 8= 8= 8=v|> |> |> |> |>M |> |> |>Bp p p p p p p pf	    -   D, , , , ,- , , ,^2( 2( 2( 2( 2( 2( 2( 2(j-
 -
 -
 -
 -
] -
 -
 -
`0( 0( 0( 0( 0(= 0( 0( 0(f       $Q( Q( Q( Q( Q( Q( Q( Q(h       *1 1 1 1 1 1 1 1           J   H H H H H H H H&e e e e em e e eP3
D3 U3 T	3
 U3 f3 f3 e3 f3 w3 3 w3 
33 w3 3  f!3" *#3$ U%3 3& w'3( U)3* ;+3, f-3. -/30 e132 v334 536 ;738 *93: n;3< L=3> *?3@ *A3B ]C3D E3F {CCCG3 3H %WY:KLLL!$!);;WW;;6688;;e3 3 3   r4   