
    9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?j                  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Zy)    )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    o/var/www/html/eeg-assistent/abrechnung/venv/lib/python3.12/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>r3   .   s    Jq%(     	tableSpecc           	      `   g }i }| D ]!  }|j                   }|j                   j                  d      r|j                  dk(  sJ t        }n|j                   j	                  d      s|j                   dv r t
        t        t        d|j                     }n|j                   dk(  rt        }n|j                   dk(  rt        }n|j                   dk(  rt        }ny|j                   d	k(  rt        }nc|j                   d
v rt        }nN|j                  t        vr!d|j                  vr|j                  }t        }nt        |j                  |t              } ||j                   |j                   |j"                  |j$                        }|j&                  r|j&                  }n;|j                  dv r|j)                  |j                        }n|j)                  |      }|j&                  s||_        |j                   dv rw|d   |_        |j*                  j-                         D ]P  }	|	j-                         D ];  }
t/        |j                   |j                   |j"                  |
      ||
j0                  <   = R |j                   d	k(  rl|d   |_        |d	   |_        |j2                  j-                         D ];  }
t/        |j                   |j                   |j"                  |
      ||
j0                  <   = |j7                  |       |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 <+II	99.99((((NYY(DII9V,V&(' ii	N
 YY*$%NYY-'(NYY+%&NYY/)*NYY@@-N99 00S		5I II	!'!%diiAQ!RIIt{{DHH$:J:J
 ??JYYDD'++DII6J'++I6J(DO99@@-m<D%%,,. 88: C5:		4;;#6$S\\2
 99'%34G%HD"(6(GD%--446 16IIt{{DHHc2 . 	$yy 00;$));0&*#y<+z '''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y)BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N rE   c                6   || _         || _        || _        | j                  r(| j                  st        | j                  dd      | _        || _        |j                  d      xs |dv | _        |j                  d      xs |dk(  | _        |dv | _        || _	        y )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    	88DKKtxxV<DH$}}W- 
 :
 2
 !MM,7N4;;N  %
 
, 'r4   c                 `   	
 j                   xr |dkD  }|r j                        

t        u rd}|s6g }t        |      D ]$  }|j	                   j                  |             & |S 
 fd} |       	t        	fdt        |      D              }j                  |
z         |S )z(Read an array of values from the reader.   Fc                  V    j                         j                  fd} | S )Nc                 X    j                  | z  z          j                  i       S r.   )seekread)ifontposreader_copy
recordSizer   s    r2   	read_itemzABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item   s-    $$S1z>%9:99[$;;r4   copyr   )r   r   r   r   readerr   r   s    @@r2   get_read_itemz.BaseConverter.readArray.<locals>.get_read_item   s)    $kkmjj< < ! r4   c              3   "   K   | ]  }  y wr.    ).0r   r   s     r2   	<genexpr>z*BaseConverter.readArray.<locals>.<genexpr>   s     9q9s   )lazygetRecordSizeNotImplementedranger^   r   r   advance)r   r   r   	tableDictcountr   lr   r   r   r   s   ```      @@r2   	readArrayzBaseConverter.readArray   s    yy&UQY++F3J^+A5\ =64;<=H! &I9E%L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 ]  \  }}| j                  |||||        y # 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   sW    	%f- >5

64E1=> 	VVqd]AF	s   (+ 	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                  | j                        }|syt        |j	                  d            S )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrF   intgroup)r   ms     r2   getVarIndexOffsetzBaseConverter.getVarIndexOffset   s6    ))001A1AB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<
((((  *rzz*FG8C= r4   ri   c                   8    e Zd Zed        Zed        Zd Zd Zy)SimpleValuec                     | S r.   r   r   s    r2   toStringzSimpleValue.toString       r4   c                     | S r.   r   r   s    r2   
fromStringzSimpleValue.fromString   r   r4   c                 r    |j                  ||d| j                  |      fgz          |j                          y Nr   )	simpletagr   newliner   s         r2   r   zSimpleValue.xmlWrite   s4    D%GT]]55I+J*K"KLr4   c                 *    | j                  |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      s2       /r4   r   c                       e Zd ZdZd Zd Zy)OptionalValueNc                     || j                   k7  r"|j                  d| j                  |      f       |j                  ||       |j	                          y r   )DEFAULTr^   r   r   r   r   s         r2   r   zOptionalValue.xmlWrite   sD    DLL LL'4==#789D%(r4   c                 J    d|v r| j                  |d         S | j                  S r   )r   r   r   s       r2   r   zOptionalValue.xmlRead   s'    e??5>22||r4   )r\   r   r   r   r   r   r   r4   r2   r   r      s    Gr4   r   c                       e Zd Zed        Zy)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y)Long   c                 "    |j                         S r.   readLongr   s       r2   r   z	Long.read        r4   c                 $    |j                  |      S r.   )readLongArrayr   r   r   r   r   s        r2   r   zLong.readArray      ##E**r4   Nc                 &    |j                  |       y r.   )	writeLongr   s         r2   r   z
Long.write      r4   c                 &    |j                  |       y 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   
      J!+ &r4   r   c                   *    e Zd ZdZd Zd ZddZd Zy)ULongr   c                 "    |j                         S r.   	readULongr   s       r2   r   z
ULong.read      !!r4   c                 $    |j                  |      S r.   )readULongArrayr   s        r2   r   zULong.readArray       $$U++r4   Nc                 &    |j                  |       y r.   
writeULongr   s         r2   r   zULong.write#      % r4   c                 &    |j                  |       y r.   )writeULongArrayr   s        r2   r   zULong.writeArray&      v&r4   r.   r   r   r4   r2   r   r         J",!'r4   r   c                       e Zd Zed        Zy)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y)VarIndexN)r\   r   r   r&   r   r   r4   r2   r  r  0  s     Gr4   r  c                   *    e Zd ZdZd Zd ZddZd Zy)Short   c                 "    |j                         S r.   )	readShortr   s       r2   r   z
Short.read7  r   r4   c                 $    |j                  |      S r.   )readShortArrayr   s        r2   r   zShort.readArray:  r  r4   Nc                 &    |j                  |       y r.   )
writeShortr   s         r2   r   zShort.write=  r  r4   c                 &    |j                  |       y 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y)UShortr  c                 "    |j                         S r.   
readUShortr   s       r2   r   zUShort.readG        ""r4   c                 $    |j                  |      S r.   )readUShortArrayr   s        r2   r   zUShort.readArrayJ  s    %%e,,r4   Nc                 &    |j                  |       y r.   writeUShortr   s         r2   r   zUShort.writeM      5!r4   c                 &    |j                  |       y r.   )writeUShortArrayr   s        r2   r   zUShort.writeArrayP  s    'r4   r.   r   r   r4   r2   r  r  D  s    J#-"(r4   r  c                   *    e Zd ZdZd Zd ZddZd Zy)Int8r   c                 "    |j                         S r.   )readInt8r   s       r2   r   z	Int8.readW  r   r4   c                 $    |j                  |      S r.   )readInt8Arrayr   s        r2   r   zInt8.readArrayZ  r   r4   Nc                 &    |j                  |       y r.   )	writeInt8r   s         r2   r   z
Int8.write]  r   r4   c                 &    |j                  |       y 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y)UInt8r   c                 "    |j                         S r.   )	readUInt8r   s       r2   r   z
UInt8.readg  r   r4   c                 $    |j                  |      S r.   )readUInt8Arrayr   s        r2   r   zUInt8.readArrayj  r  r4   Nc                 &    |j                  |       y r.   )
writeUInt8r   s         r2   r   zUInt8.writem  r  r4   c                 &    |j                  |       y r.   )writeUInt8Arrayr   s        r2   r   zUInt8.writeArrayp  r	  r4   r.   r   r   r4   r2   r5  r5  d  r
  r4   r5  c                       e Zd ZdZd ZddZy)UInt24   c                 "    |j                         S r.   
readUInt24r   s       r2   r   zUInt24.readw  r!  r4   Nc                 &    |j                  |       y 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y)ComputedIntc                 V    |'|j                  |d|       |j                          y y )N=)commentr   r   s         r2   r   zComputedInt.xmlWrite  s,    u56 r4   Nr\   r   r   r   r   r4   r2   rI  rI  ~  s     r4   rI  c                       e Zd Zy)rO   Nr\   r   r   r   r4   r2   rO   rO         r4   rO   c                       e Zd Zy)rP   NrO  r   r4   r2   rP   rP     rP  r4   rP   c                       e Zd Zy)rQ   NrO  r   r4   r2   rQ   rQ     rP  r4   rQ   c                       e Zd ZdZd ZddZy)Tagr   c                 "    |j                         S r.   )readTagr   s       r2   r   zTag.read  s    ~~r4   Nc                 &    |j                  |       y r.   )writeTagr   s         r2   r   z	Tag.write  s    r4   r.   rG  r   r4   r2   rT  rT    s    J r4   rT  c                   .    e Zd ZdZdZd Zd Zd ZddZy)	GlyphIDr  Hc                 n    |j                  |j                  | j                  | j                  |            S r.   )getGlyphNameManyr   typecoder   r   s        r2   r   zGlyphID.readArray  s/    $$T]]DOOUC
 	
r4   c                 l    |j                  |j                  | j                  | j                              S r.   )getGlyphName	readValuer^  r   r   s       r2   r   zGlyphID.read  s(      !1!1$--!QRRr4   c                 Z    |j                  | j                  |j                  |             y r.   )r   r^  getGlyphIDManyr   s        r2   r   zGlyphID.writeArray  s!    $--)<)<V)DEr4   Nc                 Z    |j                  | j                  |j                  |             y r.   )
writeValuer^  
getGlyphIDr   s         r2   r   zGlyphID.write  s    $--)?@r4   r.   )	r\   r   r   r   r^  r   r   r   r   r   r4   r2   rZ  rZ    s#    JH

SFAr4   rZ  c                       e Zd ZdZdZy)	GlyphID32r   LN)r\   r   r   r   r^  r   r4   r2   rh  rh    s    JHr4   rh  c                       e Zd Zd Zy)NameIDc                 n   |j                  ||d|fgz          |r|r|j                  d      }|rv|j                  |      }|j                  d       |r|j	                  |       n@|dk(  r|j	                  d       n)|j	                  d       t
        j                  d|z         |j                          y )Nr   rK       Nonezmissing from name tablez"name id %d missing from name table)r   rY   getDebugNamer   rL  logwarningr   )r   r   r   r   rK   r   	nameTables          r2   r   zNameID.xmlWrite  s    D%GU+;*<"<=E(I --e4%%%d+f_%%f-%%&?@KK Du LMr4   NrM  r   r4   r2   rk  rk    s    r4   rk  c                       e Zd Zd Zy)	STATFlagsc                    |j                  ||d|fgz          g }|dz  r|j                  d       |dz  r|j                  d       |r1|j                  d       |j                  dj	                  |             |j                          y )Nr   r   OlderSiblingFontAttributer  ElidableAxisValueNamerm   )r   r^   r   rL  joinr   r   r   r   r   rK   r   flagss          r2   r   zSTATFlags.xmlWrite  s}    D%GU+;*<"<=4<LL454<LL01OOD!chhuo.r4   NrM  r   r4   r2   ru  ru    s    
r4   ru  c                       e Zd Zed        Zy)
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y)
DeciPointsr  c                 (    |j                         dz  S N
   r  r   s       r2   r   zDeciPoints.read  s      "R''r4   Nc                 >    |j                  t        |dz               y r  )r&  roundr   s         r2   r   zDeciPoints.write  s    5,-r4   r.   rG  r   r4   r2   r  r    s    J(.r4   r  c                   j    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y)	BaseFixedValuec                 V    | j                   t        || j                                     S r.   )fromIntgetattrreaderMethodr   s       r2   r   zBaseFixedValue.read  s$    ||>GFD,=,=>@AAr4   Nc                 Z     t        || j                        | j                  |             y r.   )r  writerMethodtoIntr   s         r2   r   zBaseFixedValue.write  s"    *))*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    sq    J"M!L!LB> / / / / 0 0 0 0r4   r  c                       e Zd ZdZdZdZdZy)Fixedr      r   r   Nr\   r   r   r   r  r  r  r   r4   r2   r  r     s    JMLLr4   r  c                       e Zd ZdZdZdZdZy)F2Dot14r     r  r  Nr  r   r4   r2   r  r    s    JMLLr4   r  c                   d     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                 B    t         |   |      | j                  z   dz  S N   )superr  biasrf   r   	__class__s     r2   r  zAngle.fromInt  s     &1S88r4   c                 B    t         |   |dz  | j                  z
        S r  )r  r  r  r  s     r2   r  zAngle.toInt  s    w}eckSXX566r4   c                 ^    t        t        |      | j                  z        | j                  z  S r.   )r   r  factorr  s     r2   r   zAngle.fromString  s%     uU|cjj01CJJ>>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 7 7 ? ? > >r4   r  c                       e Zd ZdZy)BiasedAngleg      ?N)r\   r   r   r  r   r4   r2   r  r  &  s	     Dr4   r  c                   N    e Zd ZdZd ZddZed        Zed        Zed        Z	y)	Versionr   c                 &    |j                         }|S r.   r   )r   r   r   r   r   s        r2   r   zVersion.read/  s    !r4   Nc                 <    t        |      }|j                  |       y 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  ,  sM    J         r4   r  c                   "    e Zd ZdZdZd ZddZy)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                  | j                        }|j                  d      }|dk\  r|d | }t        |dd      }|t        |dd      k7  rt        j                  d|z         |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   rq  rr  )r   r   r   r   datazeroPosss          r2   r   zChar64.readM  sj    t/))E"a<>D$;dWX>>KK?!CDr4   Nc                 J   t        |dd      }|t        |dd      k7  rt        j                  d|z         t        |      | j                  kD  r$t        j                  d|| j                  fz         |d| j                  z  z   d | j                   }|j                  |       y )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   rq  rr  lenr   	writeData)r   r   r   r   r   r   r  s          r2   r   zChar64.writeW  s    uwyA7578DDKK@5HIt9t&KK6%9QQ ut..0A$//Br4   r.   )r\   r   r   r   r   r   r   r   r4   r2   r  r  D  s     J	r4   r  c                   2    e Zd Zd Zd ZddZd Zd Zd Zy)	rT   c                 T    | j                   xr | j                   j                  |      S r.   )rX   r   r   s     r2   r   zStruct.getRecordSized  s     H4??#@#@#HHr4   c                 J    | j                         }|j                  ||       |S r.   )rX   	decompile)r   r   r   r   tables        r2   r   zStruct.readg  s!    !%r4   Nc                 (    |j                  ||       y r.   )r   r   s         r2   r   zStruct.writel  s    fd#r4   c                     |*|r'|j                  ||dgz          |j                          y y |j                  ||||       y )N)emptyr   )rK   )r   r   toXMLr   s         r2   r   zStruct.xmlWriteo  sF    = ##D%<.*@A!!#KK	4TK:r4   c                 *   d|v rt        |d         ry | j                         }|j                  d      }|t        |      |_        t        |d       }|rd}|j                         D ]  }|j                  sd}t        |d      si |_        |j                  }	|j                  |	vsJ |j                  |	f       t        ||j                  d        t        |j                  |j                        |	|j                  <    |D ]-  }
t        |
t              r|
\  }}}|j                  ||||       ./ |j!                  t#        |dd              |rBr@|j                         D ]-  }|j                  s|j                  }	|	|j                  = |	r,|`/ |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$v;EL 
33
$++- V$$'+$"47+-(!%!1!1J99J6OJ8OO6E499d3,:5>>499,UJtyy)V  	G'5)'.$eWdE7D9	 	'$t*LM!//1 1D((%)%5%5
&tyy1) $ 01 r4   c                 2    dt        | j                        z   S )Nz
Struct of )reprrX   r   s    r2   __repr__zStruct.__repr__  s    d4??333r4   r.   )	r\   r   r   r   r   r   r   r   r  r   r4   r2   rT   rT   c  s"    I
$;(T4r4   rT   c                       e Zd Zd ZddZy)rR   c                     |j                   }| j                         }|j                  ||       |j                  ||j                  z          |S r.   )r   rX   r  r   r:   )r   r   r   r   r   r  s         r2   r   zStructWithLength.read  sA    jj!%C%,,,-r4   Nc                 $   t        |j                               D ]  \  }}|j                  dk(  s n t        |j                        z   }t        |t              r|dz  }ddddj                     }	|j                         }
|	|_	        |j                  ||       |j                         |
z
  }|j                         }|j                  ||||       |j                  |   dd |j                   k(  sJ |j                         |j                  |<   y )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  s   ()<)<)>? 	OItyyN*	 &,,')3e561K:6tG%%'%fd#%%'&0**,

<y&9||K(,?@Q$//,RRRR$0$;$;$=[!r4   r.   r\   r   r   r   r   r   r4   r2   rR   rR     s    >r4   rR   c                   *    e Zd ZdZd Zd Zd ZddZy)r[   r  c                 "    |j                         S r.   r  r   s     r2   
readOffsetzTable.readOffset  r!  r4   c                 &    |j                  d       y r   r%  r   r   s     r2   writeNullOffsetzTable.writeNullOffset      1r4   c                     | j                  |      }|dk(  ry | j                         }|j                  |      }|j                  r||_        ||_        |S |j                  ||       |S r   )r  rX   getSubReaderr   r   r   r  )r   r   r   r   offsetr  s         r2   r   z
Table.read  sg    (Q;!$$V,99!ELEJ  OOFD)r4   Nc                     || j                  |       y |j                         }| j                  |_        |||_        |j	                  || j
                         |j                  ||       y )N
offsetSize)r  r  rK   r   writeSubTabler   r   )r   r   r   r   r   r   	subWriters          r2   r   zTable.write  sa    =  (++-I!YYIN&(3	%  t GMM)T*r4   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y)LTabler   c                 "    |j                         S r.   r   r   s     r2   r  zLTable.readOffset  r   r4   c                 &    |j                  d       y r   r  r  s     r2   r  zLTable.writeNullOffset  s    !r4   N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y)Table24r@  c                 "    |j                         S r.   rB  r   s     r2   r  zTable24.readOffset  r!  r4   c                 &    |j                  d       y r   rE  r  s     r2   r  zTable24.writeNullOffset  r  r4   Nr  r   r4   r2   r  r    s    J#r4   r  c                   $     e Zd Zd Z fdZ xZS )r@   c                     | j                   |   |   }| j                  | j                  | j                  | j                  |      S r.   r   r  rK   rV   rW   r   	tableType
lookupTyperX   s       r2   getConverterzSubStruct.getConverter   8    %%i0<
~~diidhh
KKr4   c                 4    t         t        |   |||d |       y r.   )r  r@   r   r   r   r   r   rK   r   r  s         r2   r   zSubStruct.xmlWrite  s    i'	4eLr4   r\   r   r   r  r   r  r  s   @r2   r@   r@     s    LM Mr4   r@   c                   $     e Zd Zd Z fdZ xZS )r>   c                     | j                   |   |   }| j                  | j                  | j                  | j                  |      S r.   r  r  s       r2   r  zSubTable.getConverter	  r   r4   c                 4    t         t        |   |||d |       y r.   )r  r>   r   r"  s         r2   r   zSubTable.xmlWrite  s    h&y$tUKr4   r#  r  s   @r2   r>   r>     s    LL Lr4   r>   c                       e Zd ZddZy)r?   Nc                 F    d|_         t        j                  | |||||       y )NT)	Extensionr[   r   r   s         r2   r   zExtSubTable.write  s     D&$	5+Fr4   r.   )r\   r   r   r   r   r4   r2   r?   r?     s    Gr4   r?   c                       e Zd Zd Zy)rA   c                     | j                   j                  || j                        }| j                  | j                  | j
                  | j                  |      S r.   )rJ   rY   r]   r  rK   rV   rW   )r   
featureTagrX   s      r2   r  zFeatureParams.getConverter  sA    ++//
D<U<UV
~~diidhh
KKr4   N)r\   r   r   r  r   r4   r2   rA   rA     s    Lr4   rA   c                   ,    e Zd ZdZddddZd ZddZy)	r7   r  Nrj   rE   c                r    t         j                  | |||||       d|d   dk(  r
dz   | _        y dz   | _        y )NrE   r7   21)ri   r   whichr   s         r2   r   zValueFormat.__init__   sC    $Z[ 	 	
 #T"X_cF
#F
r4   c                 V    |j                         }t        |      || j                  <   |S r.   )r   r   r2  r   r   r   r   formats        r2   r   zValueFormat.read&  s(    ""$/7tzzr4   c                 V    |j                  |       t        |      || j                  <   y r.   )r&  r   r2  )r   r   r   r   r5  r   s         r2   r   zValueFormat.write+  s#    6"/7tzzr4   r.   )r\   r   r   r   r   r   r   r   r4   r2   r7   r7     s    JG" G
8r4   r7   c                   ,    e Zd Zd Zd ZddZd Zd Zy)ValueRecordc                 8    dt        || j                           z  S Nr  )r  r2  r   s     r2   r   zValueRecord.getRecordSize1  s    3vdjj)***r4   c                 @    || j                      j                  ||      S r.   )r2  readValueRecordr   s       r2   r   zValueRecord.read4  s    djj!11&$??r4   Nc                 D    || j                      j                  |||       y r.   )r2  writeValueRecordr   s         r2   r   zValueRecord.write7  s    tzz++FD%@r4   c                 F    |y |j                  ||| j                  |       y r.   )r  rK   r   s         r2   r   zValueRecord.xmlWrite:  s     =KK	4E:r4   c                 H    ddl m}  |       }|j                  d |||       |S )Nr   )r8  )otBaser8  r  )r   r   r   r   r8  r   s         r2   r   zValueRecord.xmlRead@  s#    'dE7D1r4   r.   )r\   r   r   r   r   r   r   r   r   r4   r2   r8  r8  0  s    +@A;r4   r8  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y)	AATLookupr  rj   rE   c                    t         j                  | |||||       t        | j                  t              r| j                  dd d       | _        y t        dd d | j                        | _        y )NrE   Value)rK   rV   rW   )rK   rV   rW   rX   )ri   r   
issubclassrX   r   	converterr[   r   s         r2   r   zAATLookup.__init__K  sa    $Z[ 	 	
 doo{3!__'$D_QDN"TtDNr4   c                    |j                         }|dk(  r| j                  ||      S |dk(  r| j                  ||      S |dk(  r| j                  ||      S |dk(  r| j	                  ||      S |dk(  r| j                  ||      S J d|z         )Nr   r  r      r   zunsupported lookup format: %d)r   readFormat0readFormat2readFormat4readFormat6readFormat8r4  s        r2   r   zAATLookup.readV  s    ""$Q;##FD11q[##FD11q[##FD11q[##FD11q[##FD11B9FBB5r4   Nc                    t        t        |j                         D cg c]  \  }}|j                  |      |f c}}            }t        t        t	        d | j                  |||      | j                  |||      | j                  |||      | j                  |||      g                  }	|	d   \  }
}}|j                         } |        |j                         |z
  }||
k(  sJ d||
|fz         y c c}}w )Nr   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
listsortedr  rf  filterbuildFormat0buildFormat2buildFormat6buildFormat8r  )r   r   r   r   r   r   glyphvalrZ   formatsdataSizelookupFormatwriteMethodr   
actualSizes                  r2   r   zAATLookup.writee  s   EKKMRjeST__U+S1RS
 ))&$?))&$?))&$?))&$?	

 /6aj+,""$))+c1
("	
HL
 
	
"/ Ss   C3c                     | j                  |       | j                  |       t        ||      \  }}}| j                  |       | j                  |       | j                  |       y )N)nitemSize)r&  r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShifts         r2   writeBinSearchHeaderzAATLookup.writeBinSearchHeader  s`    8$8$1?2
.]J 	;'=):&r4   c                      t        j                               }t              |k7  ry  j                  j                  }d||z  z   d fdfS )Nr  r   c                  *    j                         S r.   )writeFormat0r   r   rZ   r   s   r2   r3   z(AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF; r4   )r  getGlyphOrderrG  r   )r   r   r   rZ   	numGlyphs	valueSizes   ````  r2   rS  zAATLookup.buildFormat0  sQ    **,-	v;)#NN--		I%%;
 	
r4   c                 z    |j                  d       |D ]%  \  }}| j                  j                  ||d |d        ' y )Nr   r   r   r   )r&  rG  r   )r   r   r   rZ   glyphID_r   s         r2   ri  zAATLookup.writeFormat0  sE    1% 	OHeNN  Et ! 	r4   c                 F    |d   \  }}|}g |dd  D ]/  \  }}||dz   k7  s||k7  rj                  |||f       |x}}|}.|}1 j                  |||f        j                  j                  }	t              dz   |	dz   }}
d j                  z   |
|z  z   d fdfS )Nr   r   r   r  c                  *    j                         S r.   )writeFormat2)r   segmentsr   r   s   r2   r3   z(AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH= r4   )r^   rG  r   r  BIN_SEARCH_HEADER_SIZE)r   r   r   rZ   segStartsegValuesegEndglyphIDcurValuern  ra  rb  ru  s   ```         @r2   rT  zAATLookup.buildFormat2  s    #AY(!' 	!GX&1*$H(<68 <=$++6# 	! 	6845NN--	 ]Q.	A(+++h.AA=
 	
r4   c                    |j                  d       | j                  j                  }t        |      |dz   }}| j	                  |||       |D ]H  \  }}}	|j                  |       |j                  |       | j                  j                  ||d |	d        J |j                  d       |j                  d       |j                  d|z         y )Nr  r   rp  rn  r  r&  rG  r   r  rf  r   r  )
r   r   r   ru  rn  ra  rb  
firstGlyph	lastGlyphr   s
             r2   rt  zAATLookup.writeFormat2  s    1NN--	 ]IM(!!&(H=,4 	(J	5y)z*NN  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   rI  c                  *    j                         S r.   )writeFormat6rj  s   r2   r3   z(AATLookup.buildFormat6.<locals>.<lambda>  rk  r4   )rG  r   r  rv  )r   r   r   rZ   rn  ra  rb  s   ````   r2   rU  zAATLookup.buildFormat6  sO    NN--	 [)a-(+++x!|x.GG;
 	
r4   c                 X   |j                  d       | j                  j                  }t        |      |dz   }}| j	                  |||       |D ]6  \  }}|j                  |       | j                  j                  ||d |d        8 |j                  d       |j                  d|z         y )NrI  r  rp  rn  r  r}  )	r   r   r   rZ   rn  ra  rb  rz  r   s	            r2   r  zAATLookup.writeFormat6  s    1NN--	 [)a-(!!&(H=$ 	NGUw'NN  Et ! 	
 	6"9,-r4   c                      d   d   d   d   }}t              ||z
  dz   k7  ry  j                  j                  }dt              |z  z   d fdfS )Nr   r/  r   rI  r   c                  *    j                         S r.   )writeFormat8rj  s   r2   r3   z(AATLookup.buildFormat8.<locals>.<lambda>  rk  r4   )r  rG  r   )r   r   r   rZ   
minGlyphID
maxGlyphIDrn  s   ````   r2   rV  zAATLookup.buildFormat8  se    !'1vbz!}J
v;*z1A55NN--	Fi'';
 	
r4   c                     |d   d   }|j                  d       |j                  |       |j                  t        |             |D ]%  \  }}| j                  j                  ||d |d        ' y )Nr   r   rp  )r&  r  rG  r   )r   r   r   rZ   firstGlyphID_r   s          r2   r  zAATLookup.writeFormat8  sr    ay|1<(3v;' 	HAuNN  Et ! 	r4   c                     t        |j                               }| j                  j                  ||d |      }t	        |      D ci c]  \  }}|j                  |      | c}}S c c}}w Nr   r   )r  rl  rG  r   r   r`  )r   r   r   rm  r  kr   s          r2   rJ  zAATLookup.readFormat0  s^    **,-	~~''I'V<EdOL5!!!$e+LLLs   A'c                    i }|j                   dz
  }|j                         |j                         }}|d| j                  j                  z   k\  sJ |       t	        |      D ]  }|j                  |||z  z   dz          |j                         }|j                         }	| j                  j                  ||d       }
|dk7  sat	        |	|dz         D ]  }|
||j                  |      <     |S )Nr  r      r   rn  r   r   r   rG  r   r   r   r   r`  )r   r   r   mappingr   rb  ra  r   lastfirstr   r  s               r2   rK  zAATLookup.readFormat2  s    jj1n#..0&2C2C2E(1t~~8888B(B8x 	:AKKa(l*R/0$$&D%%'ENN'''EEv~udQh/ :A49GD--a01:	: r4   c                 $   i }|j                   dz
  }|j                         }|dk\  sJ |       t        |j                               D ]  }|j                  |||z  z   dz          |j                         }|j                         }|j                         }	|dk7  sS|j	                  d      }
|
j                  ||	z          | j
                  j                  |
|d ||z
  dz         }t        |      D ]  \  }}|||j                  ||z         <     |S )Nr  rI  r  rn  r   r   r  )	r   r   r   r   r	  rG  r   r   r`  )r   r   r   r  r   rb  r   r  r  r
  
dataReaderr  r  r  s                 r2   rL  zAATLookup.readFormat4  s   jj1n$$&1}&h&}v((*+ 	>AKKa(l*R/0$$&D%%'E&&(Fv~#003
f-~~//D5L1<L 0  &dO >DAq<=GD--eai89>	> r4   c                    i }|j                   dz
  }|j                         }|d| j                  j                  z   k\  sJ |       t	        |j                               D ]d  }|j                  |||z  z   dz          |j                         }| j                  j                  ||d       }|dk7  sQ|||j                  |      <   f |S )Nr  r  r  rn  r  )	r   r   r   r  r   rb  r   rz  r   s	            r2   rM  zAATLookup.readFormat6  s    jj1n$$&1t~~8888B(B8v((*+ 	<AKKa(l*R/0'')GNN'''EE& 6;))'23	< r4   c                     |j                         }|j                         }| j                  j                  ||d |      }t        |      D ci c]  \  }}|j	                  ||z         | c}}S c c}}w r  )r   rG  r   r   r`  )r   r   r   r  r   r  r  r   s           r2   rN  zAATLookup.readFormat8%  sl    !!#!!#~~''E'RFOPToV
E!!%!),e3VVVs   A1c                     i }|D ]B  }t        |t              s|\  }}}|dk(  s | j                  j                  |||      ||d   <   D |S )NLookuprW  )r/   r0   rG  r   )	r   r   r   r   r   r  rK   a
eltContents	            r2   r   zAATLookup.xmlRead+  s^     	TG'5)&-#a8#(,(>(>q*d(SE!G*%		T
 r4   c           	         |j                  ||       |j                          t        |j                               D ](  \  }}| j                  j                  |||dd|fg       * |j                  |       |j                          y )Nr  rW  )r   rK   r   )begintagr   rQ  r  rG  r   endtag)r   r   r   r   rK   r   rW  s          r2   r   zAATLookup.xmlWrite4  s    4'"5;;=1 	LE5NN##4u8WeDTCU $ 	 	r4   r.   )r\   r   r   rv  r   r   r   r   rf  rS  ri  rT  rt  rU  r  rV  r  rJ  rK  rL  rM  rN  r   r   r   r4   r2   rC  rC  H  s}    EG 	C
@ ' '	

(.
.	
M
(Wr4   rC  c                   &    e Zd Zd ZddZd Zd Zy)AATLookupWithDataOffsetc                 \   |j                         }|j                         }|j                  |      }t        dd d t              }|j	                  |||      }i }	|j                         D ]@  \  }
}|j                  ||z         }| j                         }|j                  ||       ||	|
<   B |	S NDataOffsets)r   r	  rC  r  r   r  rX   r  )r   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultrW  r
  r  items                 r2   r   zAATLookupWithDataOffset.readG  s    '')%%'
**<8=$f=++lD)<$]]_ 	!ME6,,Vj-@AJ??$DNN:t, F5M		!
 r4   Nc                 8   i i d}}}g }	t        ||j                        D ]s  }
t               }||
   j                  ||       |j	                         }|j                  |d       }|d k(  r&|}|t        |      z   }|||<   |	j                  |       |||
<   u |j                         }t        dd d t              }|j                  ||||d        |j                         }|j                  |d       |j                  |d       |	D ]  }|j                  |        y )Nr   )keyr  r   r  )rQ  rf  r   r   r  rY   r  r^   r  rC  r  r   r  r  )r   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatarW  r  r  r
  lookupWriterr  
dataWriterds                     r2   r   zAATLookupWithDataOffset.writeU  s,    022qW|Et7 
	*E%I%L  D1'')D!%%dD1F~ !CI-%+T"##D)#)M% 
	* **,=$f=\4M4H((*
\a8ZA6 	$A  #	$r4   c                 X    t        dd d | j                        }|j                  |||      S r  )rC  rX   r   )r   r   r   r   r  s        r2   r   zAATLookupWithDataOffset.xmlReadx  s)    =$dooF~~eWd33r4   c                 ^    t        dd d | j                        }|j                  |||||       y r  )rC  rX   r   )r   r   r   r   rK   r   r  s          r2   r   z AATLookupWithDataOffset.xmlWrite|  s*    =$dooF	4e<r4   r.   r\   r   r   r   r   r   r   r   r4   r2   r  r  F  s    !$F4=r4   r  c                       e Zd ZdddddZej	                         D  ci c]  \  }}||
 c}}} Zdddd	Zd
 Zd Zd Z	d Z
ddZyc c}}} w )MorxSubtableConverterLayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTNrj   rE   c                :    t         j                  | |||||       y NrE   )ri   r   r   s         r2   r   zMorxSubtableConverter.__init__  s"    $Z[ 	 	
r4   c                 R    |dz  dk7  rd|_         y |dz  dk7  rd|_         y d|_         y )N    r   Any   Vertical
Horizontal)TextDirection)r   r|  subtables      r2   "_setTextDirectionFromCoverageFlagsz8MorxSubtableConverter._setTextDirectionFromCoverageFlags  s2    DLQ%*H"dlq %/H"%1H"r4   c                    |j                   }t               }|j                         |_        |j	                         }|dz  dk7  |dz  dk7  f}| j
                  |   |_        | j                  ||       |j                         |_	        |xj                  |dz  dz  z  c_	        |j	                         |_
        |j                         |_        t        d   j                  |j                        }|J d|j                  z         |j                   |z
  }	|j                  |j                   |j                   |j                  z   |	z
   }
t        |
      |j                  |	z
  k(  sJ t!        |
|j"                        } |       |_        |j$                  j'                  ||       |j)                  ||j                  z          |S )Nr  r   r     morxz!unsupported 'morx' lookup type %s)r  tableTag)r   r#   r   r:   r7  _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   jjN))+  "T\a'%$,1)<= 33H=//q9&&(
	

us{r))
&&(",,. (,,Q[[9
K=KK5 zzC'{{6::

Q^^(Cl(RS4yANN\9999!tfooF	 l	i.C!..()r4   c                    |j                  ||       |j                          |j                  d|j                  z         |j                          |j	                  d|j
                         |j                          |j	                  d|j                         |j                          |j                  dk7  r0|j	                  dd|j                  z         |j                          |j                  d|j                  z         |j                          |j	                  d	d
|j                  z         |j                          |j                  j                  ||       |j                  |       |j                          y )NzStructLength=%dr  r   r  r   r  z0x%04xzMorphType=%dr  r  )r  r   rL  r:   r   r  r  r  r;   r  r@   r  r  r   s         r2   r   zMorxSubtableConverter.xmlWrite  s?   4'+e.@.@@AO53F3FG-U5J5JK>>Q
(U^^2KL.5??:;-X@U@U5UVi.r4   c                    t               }d}d|_        t        t        |      D ]  \  }}}|dk(  rEt	        |d         }|dz  dk7  |dz  dk7  f}	| j
                  |	   |_        | j                  ||       R|dk(  r7|d   |_        |j                  | j                  v rzJ d|j                  z         |dk(  r-|d   |_	        |j                  d	v rJ d
|j                  z         |dk(  rt	        |d         |_        |dk(  rt	        |d         |_
        |j                  d      r|j                  ||||       J |        |dz  dz  |j                  z  |_        |S )Nr   CoverageFlagsr   r  r  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  Morphr  )r#   r  rR  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   N
-3GW-E 	&)GXz/)#HW$56%_2X_4JK$($;$;H$E!77!D--$,W$5!((D,L,LL 1A4E4EEL O+"*7"3*KK .@K J&%hw&78
--$,Xg->$?!!!'*		'8Z>%g%u1	&2 n+ajj8
r4   c                 H   |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                        }	|j                         }
d	|_        |j                   }|j                   d
z  |_         |j                  ||       ||_         |j                  |	   dk(  sJ |j                         |
z
  }t        j                  d|      |j                  |	<   y )Ni   r  r  r  r   r  r  r  r  rn  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  s#   NNZ/B6%)%E%E!!&
"l 	E//:=D1DLDa/E//58Da?LDa/&&,,'%%'' ~~&0fd#%||K(,????%%'&0$*KKf$=[!r4   r.   )r\   r   r   r  r  r  r   r  r   r   r   r   )r   r  rX  s   000r2   r  r    sm     &,%, =O<T<T<V"W"WS38"W
" 

26(@>} #Xs   A
r  c                   z    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y	)	STXHeaderrj   rE   c                   t         j                  | |||||       t        | j                  t              sJ t        dd d t              | _        t        | j                  t              rt        dd d t              | _
        y d | _
        y )NrE   GlyphClassesPerGlyphLookup)ri   r   rF  rX   r   rC  r  classLookupr    rZ  perGlyphLookupr   s         r2   r   zSTXHeader.__init__  sv    $Z[ 	 	
 $//9555$^T4Hdoo'<="+,<dD'"RD"&Dr4   c                    t               }|j                  }|j                  d      }|j                  d      }|j                  d      }d }	d }
|j                         |_        |j                  ||j                         z          |j                  ||j                         z          |j                  ||j                         z          | j                  3|j                  d      }|j                  ||j                         z          t        | j                  t              r|j                  d      }	|	j                  ||j                         z          |j                  d      }|j                  ||j                         z          |j                  d      }
|
j                  ||j                         z          |
j                  |j                  z
  dz  }|dk\  sJ |j                  |      |_        | j                  |
|      |_        nMt        | j                  t              r3|j                  d      }	|	j                  ||j                         z          | j                  j!                  |||      |_        t%        |j                  |j                  z
  |j                  dz  z        }t'        |      D ]r  }t)               }|j*                  j-                  |       t'        |j                        D ]3  }|j/                         }| j1                  ||||	      |j2                  |<   5 t | j                  | j5                  ||      |_        |S )Nr   r  )r   r   r	  r   GlyphClassCountr   r  rF  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	   jj!..q1!..q1!..q1 & 0 0 2cF$4$4$667cF$4$4$667cF$4$4$667*"("5"5a"8$$S6+;+;+=%=>doo':;!..q1LcF$4$4$667!'!4!4Q!7##C&*:*:*<$<=$11!4O  v'7'7'9!9: / 3 36H6L6L LQRR#q((("4"D"DEU"VE"11/4HEO)=>!..q1LcF$4$4$667!--223CT9U!!$4$8$88U=R=RUV=VW
	  	* 	JJELL&#E$9$9: 
-88:
040D0D$j$1!!*-	 *$($=$=*D%E! r4   c                     | j                         }|j                  |j                  ||j                  z  z         }|j	                  |||       |S r.   )rX   r	  r   r   r  )r   r   r  r   r  
transitionentryReaders          r2   r  zSTXHeader._readTransition=  sO    __&
))JJj&;&;;;
 	[$=r4   c                     t        |j                        }||j                  z
  dz  }|j                  |j	                  |            S r:  )r  r  r   r]  r#  )r   r   r   limitnumLigatureGlyphss        r2   r  zSTXHeader._readLigaturesE  sA    FKK "VZZ/A5$$V%;%;<M%NOOr4   c                 .   d}|j                   D ]  }|j                  j                         D ]d  }t        |t              s|j
                  dk7  rt        ||j
                  dz         }|j                  dk7  sLt        ||j                  dz         }f  |S )Nr   rn  r   )r  r  rZ   r/   r    	MarkIndexmaxCurrentIndex)r   r  
numLookupsr  r1   s        r2   _countPerGlyphLookupszSTXHeader._countPerGlyphLookupsJ  s    
 
\\ 	IE&&--/ Ia!67{{f,%(Q[[1_%E
~~/%(Q^^a5G%H
I	I r4   c                    |j                   }g }t        | j                  |            D ]a  }|j                  d      }|j	                  ||j                         z          |j                  | j                  j                  ||i              c |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    jjt11%89 	MA!..q1LcF$4$4$667NN4..33L$KL	M r4   Nc                 d   t               }| j                  j                  ||||j                  d        t	        |j                         d      }t        |j                  j                               dz   }d}	| j                  |	dz  }	|	| j                  j                  z  }	| j                  j                  ||j                        \  }
}| j                  ||j                  ||      \  }}|	t        |      z   }|t        |      z   }|t        |      z   }t	        | j                  ||      d      }|
|t        |      z   }nd }d\  }}| j!                  ||      }| j#                  ||      }|,t        |      dk(  sJ |t        |
      z   }|t        |      z   }|j%                  |       |j%                  |	       |j%                  |       |j%                  |       | j                  |j%                  |       ||j%                  |       |"|j%                  |       |j%                  |       |j'                  |       |j'                  |       |j'                  |       |j'                  |       |
|j'                  |
       ||j'                  |       ||j'                  |       y y )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/A/At 	 	
 -88:A>e00779:Q> "*!Q&!!A!AA"&//"@"@u||"T
K)-)<)<%,,*
& 13~3FF+c..AA)C,??477tDaH!+c..AALL/9,, 66udC..ud;(|$)))".Z"@1C8I4JJO/*/0*+*+*n-#l+*12o.(((&!Z((./$]+ %r4   c           	      6   t               }g i }}|D ]  }t        |      D ]  }	|j                  |	   }
t               }|
j                  |||       |j	                         }t        |      |
j                  k(  s)J dt        |
      |
j                  t        |      fz         |j                  |      }|!t        |      }|||<   |j                  |       |j                  |         t        |j	                         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)   (? 	9E#O4 9
"..z:
+o"";kB'224		Nj&;&;;I$))	NM ; &\\)4
%!$WJ*4HY'NN9- ,,Z8#9	9& -88:A>Yw/3~--r4   c                    | j                   y| j                  |      }t        |j                        |k(  sJ dt        |j                        |fz         t	               }|j                  D ]D  }|j                         }| j                   j                  ||i |d        |j                  |d       F |j                         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    &//6
5(()Z7 	
;5(():67	
7
 ++ 	=F!..0L%%lD"fdK  ! <	=   ""r4   c                     t        |d      sy t               }|j                  D ]  }|j                  |        |j	                         S )Nr  )r   r   r  r&  r  )r   r  r   r   	components        r2   r  zSTXHeader._compileLigComponents  sH    uo.,, 	*Iy)	*  ""r4   c                     t        |d      sy t               }|j                  D ]"  }|j                  |j	                  |             $ |j                         S )Nr  )r   r   r  r&  rf  r  )r   r  r   r   	glyphNames        r2   r  zSTXHeader._compileLigatures  sO    uk* 	;Ity9:	;  ""r4   c                 ^   |j                  ||       |j                          |j                  d|j                  z         |j                          t	        |j
                  j                               D ])  \  }}|j                  d||       |j                          + t        |j                        D ]  \  }}	|j                  d|       |j                          t	        |	j                  j                               D ]  \  }
}|j                  ||d|
id        |j                  d       |j                           t        |j                        D ]  \  }}|j                  d	|       |j                          t	        |j                               D ])  \  }}|j                  d
||       |j                          + |j                  d	       |j                           t        |d      r|j                  d       |j                          t        t        |d            D ])  \  }}|j                  d||       |j                          + |j                  d       |j                          | j!                  |||||       |j                  |       |j                          y )NzGlyphClassCount=%s
GlyphClassrW  r   StateindexonGlyphClass
Transition)r   r   rK   r  r  r  LigComponent)r;  r   )r  r   rL  r  rQ  r  r  r   r   r  r  r  r  r  r   r  _xmlWriteLigatures)r   r   r   r   rK   r   gklassr   r  r  transr   r  rW  rX  s                   r2   r   zSTXHeader.xmlWrite  s~   4'.1F1FFGu11779: 	 HAuAUC	  "+5<<!8 	 Jwj9%+E,=,=,C,C,E%F !
E):6%	   W%	  #5#8#89 	 IAv/q9$V\\^4 $
s##HE#E!!#$ -.	  5/*/#GE?$CD $3##N!3#G!!#$ _-	4eDr4   c                 $   t        |d      sy |j                  d       |j                          t        t	        |d            D ])  \  }}|j                  d||       |j                          + |j                  d       |j                          y )Nr  Ligature)r;  rW  )r   r  r   r   r  r   r  )r   r   r   r   rK   r   r   r@  s           r2   r?  zSTXHeader._xmlWriteLigatures  s    uk*;'ge[9: 	 DAq
!1=	  	%r4   c                 N   t               }t        t        |      D ]  \  }}}|dk(  r#|d   }|d   }	t        |	      |j                  |<   /|dk(  r/| j                  |||      }
|j                  j                  |
       c|dk(  r9| j                  j                  |||      }|j                  j                  |       |dk(  r| j                  |||      |_        |dk(  s| j                  |||      |_         t        |j                  j!                               dz   |_        |S )	Nr7  rW  r   r9  r  r  r  r   )r   rR  r  r   r  _xmlReadStater  r^   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rZ   r  )r   r   r   r   r  r  r  r  rW  r   r  r  s               r2   r   zSTXHeader.xmlRead  s'   -3GW-E 	U)GXz,& ) ),4UO""5)G#**8ZF##E*,,,,44Xz4P%%,,V4O+&*&@&@j$'# K'"&"8"8:t"T!	U" !$E$6$6$=$=$? @1 Dr4   c                     t               }t        t        |      D ]M  \  }}}|dk(  st        |d         }| j	                         }	|	j                  ||||       |	|j                  |<   O |S )Nr=  r<  )r   rR  r  r   rX   r  r  )
r   r   r   r   r  r  r  r  r  r  s
             r2   rF  zSTXHeader._xmlReadState  st    
-3GW-E 	;)GXz,&%h~&>?
!__.
""7Hj$G0:!!*-	; r4   c                     g }t        t        |      D ])  \  }}}|dk(  s|j                  t        |d                + |S )Nr>  r   )rR  r  r^   r   )r   r   r   r   ligComponentsr  r  _eltContents           r2   rG  zSTXHeader._xmlReadLigComponents&  sN    .4Wg.F 	B*GX{.($$Xhw.?%@A	B r4   c                 p    g }t        t        |      D ]   \  }}}|dk(  s|j                  |d          " |S )NrD  rW  )rR  r  r^   )r   r   r   r   ligsr  r  rL  s           r2   rH  zSTXHeader._xmlReadLigatures-  sD    .4Wg.F 	/*GX{*$HW-.	/ r4   r.   )r\   r   r   r   r   r  r  r  r  r   r  r  r  r  r   r?  r   rF  rG  rH  r   r4   r2   r  r    s^    EG 	'-^P
5,n.4# ##&P	,r4   r  c                   &    e Zd Zd ZddZd Zd Zy)CIDGlyphMapc                     |j                         }i }t        |j                  |            D ]  \  }}|dk7  s|j                  |      ||<   ! |S )Nrn  )r   r   r#  r`  )r   r   r   r   numCIDsr  cidrz  s           r2   r   zCIDGlyphMap.read6  s[    ##%%f&<&<W&EF 	9LC& "//8s	9 r4   Nc                    |j                         D ci c]  \  }}||j                  |       }}}|rt        |      dz   nd}	|j                  |	       t	        |	      D ]#  }|j                  |j                  |d             % y c c}}w )Nr   r   rn  r  rf  r  r&  r   rY   )
r   r   r   r   r   r   rS  rW  r  r   s
             r2   r   zCIDGlyphMap.write>  s~    ?D{{}Medooe,,MM"'E
QQ5!< 	7Cuyyf56	7 Ns   Bc                     i }t        t        |      D ].  \  }}}|dk(  s|d   j                         |t        |d         <   0 |S )NCIDrW  rS  )rR  r  stripr   r   r   r   r   r  eNameeAttrs	_eContents           r2   r   zCIDGlyphMap.xmlReadE  sT    (.w(@ 	J$E69~28/2G2G2Ixu./	J r4   c                 &   |j                  ||       |j                          t        |j                               D ]2  \  }}|	|dk7  s|j	                  d||       |j                          4 |j                  |       |j                          y )Nrn  rW  )rS  rW  r  r   rQ  r  r   r  )r   r   r   r   rK   r   rS  rW  s           r2   r   zCIDGlyphMap.xmlWriteL  s    4' / 	$JC Uf_##Es%#@!!#	$ 	r4   r.   r  r   r4   r2   rP  rP  5  s    7r4   rP  c                   &    e Zd Zd ZddZd Zd Zy)GlyphCIDMapc                 L   |j                         }|j                         }|j                  |      }|t        |      kD  r#t        j                  d|t        |      fz         i }t        t        t        |      t        |                  D ]  }||   }	|	dk7  s|	|||   <    |S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restrn  )rl  r   r#  r  rq  rr  r   min)
r   r   r   r   
glyphOrderr   cidsr  rz  rS  s
             r2   r   zGlyphCIDMap.readX  s    '')
!!#%%e,3z?"KK$',c*o&>?
 STC
O<= 	2Gw-Cf}.1z'*+	2 r4   Nc                 *   |j                         D ci c]  \  }}||dk7  r|j                  |      |  }}}|rt        |      dz   nd}	|j                  |	       t	        |	      D ]#  }
|j                  |j                  |
d             % y c c}}w )Nrn  r   r   rU  )r   r   r   r   r   r   r@  rS  r  r   rz  s              r2   r   zGlyphCIDMap.writei  s      ++-
33&= OOA#
 

 #(E
QQ5!U| 	;Guyy&9:	;
s   #Bc                 p    i }t        t        |      D ]   \  }}}|dk(  st        |d         ||d   <   " |S )NrW  r   rW  )rR  r  r   rY  s           r2   r   zGlyphCIDMap.xmlReadt  sK    (.w(@ 	D$E69~*26'?*Cvg'	D r4   c                 &   |j                  ||       |j                          t        |j                               D ]2  \  }}|	|dk7  s|j	                  d||       |j                          4 |j                  |       |j                          y )Nrn  rW  r8  r^  )r   r   r   r   rK   r   rW  rS  s           r2   r   zGlyphCIDMap.xmlWrite{  s    4' / 	$JE33&=##Ec#B!!#	$ 	r4   r.   r  r   r4   r2   r`  r`  W  s    "	;r4   r`  c                   &    e Zd Zd ZddZd Zd Zy)
DeltaValuec                 *   |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 ]A  }|dk(  r|j                         d	}}||z
  }||z	  |
z  }||z  r||	z
  }|j                  |       C |S )
N	StartSizeEndSizeDeltaFormatr   r  r@  illegal DeltaFormatr   )r   r   r   r  )r   r   r^   )r   r   r   r   rk  rl  rm  nItemsnBitsminusOffsetmasksignMaskri  tmpshiftr   r   s                    r2   r   zDeltaValue.read  s    k*	I&.i'>)>>'9$q([ 5jU
a#

Uv 	%Az#..0"UEMEE\T)Ex+e$	% r4   Nc                 $   |d   }|d   }|d   }|}	|dv sJ d       ||z
  dz   }
d|z  }t        |	      |
k(  sJ d|z  dz
  }d\  }}|	D ].  }||z
  }|||z  |z  z  }|dk(  s|j                  |       d\  }}0 |d	k7  r|j                  |       y y )
Nrk  rl  rm  rn  ro  r   )r   r  r   r  )r  r&  )r   r   r   r   r   r   rk  rl  rm  ri  rp  rq  rs  ru  rv  s                  r2   r   zDeltaValue.write  s    k*	I&.
i'>)>>'9$q([ :&(((U
a
U 	#EEME%$,501Cz""3'"
U	# B;s# r4   c                 T    |j                  ||d|fgz          |j                          y 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   ri  ri    s    .$*(r4   ri  c                       e Zd Zd ZddZy)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	|
   } ||      D cg c]  }||z  |	z  ||z  z   c}S c c}w )
NEntryFormatrt   r   r  l    r  0   r   r   r  r@  r   r9  r#  readUInt24Arrayr  )r   r   r   r   fmtrp  	innerBits	innerMask	outerMask
outerShift	entrySizer   raws                r2   r   zVarIdxMapValue.read  s    &>*v&	)^q(	*	)^
#,1,-	$$%%%%$$	

 	 !(
 Y:-#	/B
 	
 
s   ,BNc                 >   |d   }|}|d   j                  t        |             d|dz  z   }d|z  dz
  }	d|z
  }
d|dz  dz	  z   }|j                  |j                  |j                  |j
                  d|   } ||D cg c]  }|d	z  |
z	  ||	z  z   c}       y c c}w )
Nr  rt   r   r  r  r  r   r  l      )setValuer  r=  r)  writeUInt24Arrayr  )r   r   r   r   r   r   r  r  r  r  r  r  r   idxs                 r2   r   zVarIdxMapValue.write  s    &~''G5v&	)^q(	)^
#,1,-	%%&&&&%%	

 
 	 # #
2sYG	
s   =Br.   r   r   r4   r2   r  r    s    
,
r4   r  c                   &    e Zd Zd ZddZd Zd Zy)VarDataValuec                 P   g }|d   }|d   }t        |dz        }|dz  }|r|j                  |j                  }	}n|j                  |j                  }	}t	        ||      t        ||      }}
|j                   ||
             |j                   |	||
z
               ||kD  r||d = |S )Nrs   	NumShorts     )boolr   r  r/  rb  r  extend)r   r   r   r   rZ   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r2   r   zVarDataValue.read  s     01k*	 V+,	&	+1+?+?AVAV.L+1+@+@&BVBV.L[),c+y.IBl2&'nR"W-.{|$r4   Nc                 D   |d   }|d   }t        |dz        }|dz  }|j                  |j                  f|j                  |j                  fd|   \  }	}
t	        ||      t        ||      }} |	|d |         |
|||        ||kD  r|j                  dg||z
  z         y y )Nrs   r  r  r  r  r   )r  r  r3  r   rb  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,AB((&*@*@A*
 *&
 [),c+y.IBfSbk"r+./""A3"{*:#;< r4   c                 T    |j                  ||d|fgz          |j                          y r   ry  r   s         r2   r   zVarDataValue.xmlWrite  rz  r4   c                     t        |d         S r   r|  r   s       r2   r   zVarDataValue.xmlRead  r}  r4   r.   r~  r   r4   r2   r  r    s    .=&(r4   r  c                   &    e Zd Zd ZddZd Zd Zy)TupleValuesc                 4    t        j                  d |      d   S r   )r	   decompileDeltas_)r   r  r   s      r2   r   zTupleValues.read  s    ..tT:1==r4   Nc                 j    |j                   t           }t        t        j                  ||             S )N)optimizeSize)cfgr   bytesr	   compileDeltaValues_)r   r   r   r   rZ   r   optimizeSpeeds          r2   r   zTupleValues.write"  s1    !45..vDUV
 	
r4   c                     t        |d         S r   r|  r   s       r2   r   zTupleValues.xmlRead(  r}  r4   c                 T    |j                  ||d|fgz          |j                          y r   ry  r   s         r2   r   zTupleValues.xmlWrite+  rz  r4   r.   r  r   r4   r2   r  r    s    >
(r4   r  c                   :    e Zd Z	 d	dddddZd Zd	dZd Zd Zy)
	CFF2IndexNrj   )	itemClassitemConverterClassrF   c                t    t         j                  | |||||       || _        | |       | _        y d | _        y r  )ri   r   
_itemClass
_converter)r   rK   rV   rW   rX   r  r  rF   s           r2   r   zCFF2Index.__init__1  sJ     	$Z[ 	 	
 $$6$B  	HL 	r4   c                     j                         dk(  rg S j                         d        }j                  duxr dkD  }|s |dz         }g }|j                  d      }j	                  |dz
         |D ]  }	||	k  sJ j	                  |	|z
        }
 j
                  0 j                         }|j                  |
j                         |}
n( j                   j                  j                  |
      }
|j                  |
       |	} |S  fd} |       }t        |gz        }|S )Nr   c                 f    | j                   | j                  | j                  | j                  d|   S )Nr  r  )r   offSizes     r2   getReadArrayz$CFF2Index.read.<locals>.getReadArrayJ  s:    (())))((	
  r4   Fr   r   c                      	j                         	j                  dz   z  z   dz
         
fd} | S )Nr   c                 r   	j                  | z  z           d      }	j                  |d   z          	j                  |d   |d   z
        }
j                  1
j                         }|j                  |	j                         |}|S 
j
                  
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+%=>'lG$$X
%:;&//
WQZ0GHD2"oo/dD+2H2HI"  K 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  sM    $kkm#ZZ
%g(==A(g>	    ! r4   )r   r7  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  sL     "A:I""$	 !1	yy%3%!)	*GE QJOOJN+! $!V+++v
':;??.//+CMM$f.?.?@D__0??//d;DT"#
$ L! !, &I)u,-A Hr4   c                    |}|j                  t        |             t        |      sy | j                  |D cg c]  }|j                  |       }}nF| j                  :t        |      D cg c]$  \  }}| j                  j                  |||||      & }}}|D cg c]  }t        |       }	}t        t        |	d            }	|	d   }
|
dk  rdn|
dk  rdn|
dk  rdnd	}|j                  |       |j                  |j                  |j                  |j                  d
|   } ||	       |D ]  }|j                  |        y c c}w c c}}w c c}w )Nr   )initialr/     i   r  i   r@  r   r  )r  r  r  r   r  r   r   rP  r(   r;  r=  r)  r  r  r  )r   r   r   r   rZ   r   r  r  r   r  r  r  r   s                r2   r   zCFF2Index.write  sl   #e*%5z??&49:DT\\$':E:__(  )/At %%fdItQGE 
 *//3t9//z'156R[
 E!  7*Z)5KQR 	
 	'" %%&&&&%%	

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

9dgq\NDAB__($U+ 4((tT47A,1G
 &''r4   r.   )r\   r   r   r   r   r   r   r   r   r4   r2   r  r  0  s3     
 
&BH##J(
(r4   r  c                       e Zd Zd Zy)
LookupFlagc                    |j                  ||d|fgz          g }|dz  r|j                  d       |dz  r|j                  d       |dz  r|j                  d       |dz  r|j                  d	       |d
z  r|j                  d       |dz  r|j                  d|dz	  z         |r |j                  dj                  |             |j	                          y )Nr   r   rightToLeftr  ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksr  useMarkFilteringSeti   zmarkAttachmentType[%i]ry  )r   r^   rL  rz  r   r{  s          r2   r   zLookupFlag.xmlWrite  s    D%GU+;*<"<=4<LL'4<LL+,4<LL*+4<LL'4<LL./6>LL1UaZ@Achhuo.r4   NrM  r   r4   r2   r  r    s    r4   r  c                   B     e Zd ZeZ fdZed        Zed        Z xZ	S )
_UInt8Enumc                 D    | j                  t        | 	  |||            S r.   )	enumClassr  r   )r   r   r   r   r  s       r2   r   z_UInt8Enum.read  s    ~~egl64CDDr4   c                 J    t        | j                  |j                               S r.   )r  r  upperr  s     r2   r   z_UInt8Enum.fromString  s    s}}ekkm44r4   c                 T    | j                  |      j                  j                         S r.   )r  rK   lowerr  s     r2   r   z_UInt8Enum.toString  s     }}U#((..00r4   )
r\   r   r   r   r  r   r  r   r   r  r  s   @r2   r  r    s6    IE 5 5 1 1r4   r  c                       e Zd ZeZy)r$   N)r\   r   r   _ExtendModer  r   r4   r2   r$   r$     s    Ir4   r$   c                       e Zd ZeZy)r%   N)r\   r   r   _CompositeModer  r   r4   r2   r%   r%     s    Ir4   r%   c                   @    e Zd ZdZdZdZdZdZed        Z	ed        Z
y)	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    sH    NLH H H Hr4   r  c                   &    e Zd Zd ZddZd Zd Zy)MappingEntriesConverterc                    ddl m} ddlm} |d   }g }d}t	        |      D ]  }	i }
t        |j                               }||
d<   |t
        j                  z  r|j                         }g }t	        |      D ]#  }	|j                         }|j                  |       % ||
d<   |j                         }g }t	        |      D ]U  }	|j                         } ||j                         d      } ||j                         d      }|j                  |||d	       W ||
d
<   |t
        j                  z  r`|j                         }t        |dz        }|dz  }||
d<   g }t	        |      D ]#  }	|j                         }|j                  |       % ||
d<   |t
        j                  z  rBg }	 |j!                         }|dz	  }|dz  }|dz   |z   }|j                  |       |}|sn9||
d<   n|dz   g|
d<   |dz   }|t
        j"                  z  r|j                         |
d<   |t
        j$                  z  rd}|j&                  r|j                         }n|j(                  r|j                         }||
d<    ||j*                  |j,                  d  |d      \  }} |j/                  |        t1        |      |
d<   |j                  |
        |S )Nr   )r   )decoder   r/  formatFlagsfeatureTagsr  tagstartenddesignSpaceSegmentsr     childEntryConjunctivechildEntryIndicesr   entryIdspatchFormatcodePointsBiasi )r  maxValue
codePoints)fontTools.misc.fixedToolsr   fontTools.misc.iftSparseBitSetr  r   r  r7  r  rV  r^   r   r   r  r  rC  r  	readInt24r  r  r  r  r  r   r   rQ  )!r   r   r   r   r  	sbsDecode
entryCountr-  lastEntryIdr  entryr  featureCountfeaturesr  designSpaceCountru  segTagr  r  modeAndCountconjunctive
childCountchildIndicesr  ids
encodedValdeltahasMorecurrentEntryIdr  
codepointsconsumeds!                                    r2   r   zMappingEntriesConverter.read  s   CFL)
z" G	"AE,V-=-=-?@K#.E- />>>%//1|, )A ..*COOC() (0m$#)#4#4#6 /0 QA#^^-F!&//"3R8E 126COOFU3$OP	Q
 08+,/AAA%//1"<$#67)D0
1<-.!z* -A ++-C '',- .:)*/<<< "(!1!1!3J&!OE(4/G%01_u%<NJJ~."0K"  %(j!%01_$5j!)Ao/@@@'-'7'7'9m$/DDD//!,,.D 11!,,.D*.&''0KK

-D8($
H x(&,Z&8l#NN5!OG	"P r4   Nc           
         ddl m} ddlm} |}d}	|D ]  }
|
j	                  dt        d            }|j                  |j                         |t
        j                  z  r|
j	                  dg       }|j                  t        |             |D ]  }|j                  |        |
j	                  dg       }|j                  t        |             |D ]L  }|j                  |d          |j                   ||d	   d
             |j                   ||d   d
             N |t
        j                  z  rb|
j	                  dg       }|
j	                  dd      }t        |      dz  |rdndz  }|j                  |       |D ]  }|j                  |        |t
        j                  z  ra|
j	                  dg       }t!        |      D ]@  \  }}||	z
  dz
  }|t        |      dz
  k  rdnd}|dz  |z  }|j                  |dz         |}	B n|	dz  }	|t
        j"                  z  r!|j                  |
j	                  dd             |t
        j$                  z  sE|
j	                  dd      }|j&                  r|j                  |       n|j(                  r|j                  |       |
j	                  dg       }|j+                   ||D cg c]  }||k\  s	||z
   c}              y c c}w )Nr   )encode)r   r/  r  r  r  r  r  r  r  r  r  Fr  r  r  r   i r  r  r  )r   r  r  r   rY   r  r;  r   r  r  rX  r&  r   r  rF  r  r   r  r  r  r  r  )r   r   r   r   r   r   	sbsEncoder  r-  lastIdr  r  r  r  ru  segr  r  r
  r  r  r   eidr  has_moreencoded_valuer  r  cs                                r2   r   zMappingEntriesConverter.writeV  s   FC 2	YE  ))M3Ea3HIKk//0/>>> 99]B7!!#h-0# )COOC() 99%:B?""3x=1# <COOCJ/$$U3w<%<=$$U3u:r%:;<
 /AAA$yy)<bA#ii(?G #L 1D 8[TVWX!!,/' ,C&&s+, /<<<ii
B/'n !FAs  &L1,E$%C1$4q!H%*aZ8$;M&&}x'?@ F! !/@@@!!%))M1"=>/DDDyy!115//&&t, 11&&t,"YY|R8
  j+VAQUIAH+V!WXe2	Yd ,Ws   
K)K)c           
      <   |D ]  }|j                  dt        d            }|j                  d|j                         |j	                          d|v r-|d   D ]%  }|j                  d|       |j	                          ' d|v r-|d   D ]%  }	|j                  d	|	       |j	                          ' d
|v r8|d
   D ]0  }
|j                  d|
d   |
d   |
d          |j	                          2 d|v ri|j                  dt        |j                  dd                   |j	                          |d   D ]%  }|j                  d|       |j	                          ' d|v r&|j                  d|d          |j	                          d|v rq|j                  d|j                  dd             |j	                          dj                  d |d   D              }|j                  d|       |j	                          |j                  d       |j	                           y )Nr  r   r  )r  r  entryIdr   r  r,  r  designSpaceSegmentr  r  r  r  r  r  F
childEntryr:  r  r  r  ry  c              3   2   K   | ]  }t        |        y wr.   )str)r   r  s     r2   r   z3MappingEntriesConverter.xmlWrite.<locals>.<genexpr>  s     (MAQ(Ms   )	rY   r  r  r   r   r   r   rz  r  )r   r   r   r   rK   r   r  format_flagsr  r  r  r  codePointsStrs                r2   r   z MappingEntriesConverter.xmlWrite  sM    *	 E 99]4Fq4IJLwL4F4FGU" , (C''	'=%%'( % / (C''C'@%%'( %- !67 (C'',J!'lJ	 (  %%'( #e+##+eii(?GH $  !!# !45 (C''C'@%%'( %##M}9M#N!!#u$##$EII6F,J $  !!# #(M|9L(M M##L#F!!#W%U*	 r4   c           
         g }|D ]  }t        |t              s|\  }}}|dk(  s!t        |j                  dd            }dt	        |      i}|D ]x  }	t        |	t              s|	\  }
}}|
dk(  r.|j                  dg       j                  t        |d                N|
dk(  r%|j                  dg       j                  |d          x|
d	k(  rA|j                  d
g       j                  |d   t        |d         t        |d         d       |
dk(  rt        t        |d               |d<   |
dk(  r/|j                  dg       j                  t        |d                |
dk(  rt        |d         |d<   *|
dk(  rt        |d         |d<   B|
dk(  sI|d   j                         D cg c]  }|st        |       c}|d<   { |j                  |        |S c c}w )Nr  r  0r  r  r   r,  r  r   r  r  r  r  r  r  r!  r  r;  r  r  r  )r/   r0   r   rY   r  
setdefaultr^   r  r  splitr   )r   r   r   r   r-  elemrK   format_flags_intr  e_elemenameeattrsecontentr  s                 r2   r   zMappingEntriesConverter.xmlRead  s    '	&DdE*#' D%w#+EIImS,I#J &(:;K(LM% F%fe4 .4+E68	)((R8??$VG_5 ,.((;BB6'?S"66(()>CJJ'-e}).vg)?',VE]'; "999=hvg>W9X56,.(()<bAHH$VG_5 -//7w/Hm,"222:6'?2K./,.,27O,A,A,C/'(qCF/l+;@ u%O'	&P 	/s   .G"6G"r.   r~  r   r4   r2   r  r    s    Pd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)   rC  Cs    r2   r3   r3   	      79; r4   c                 $    t        t        |       S r;  )r)   r  r<  s    r2   r3   r3   	  s    1HUV)W r4   c                 $    t        t        |       S r;  )r)   r  r<  s    r2   r3   r3   	  r>  r4   c                 $    t        t        |       S r;  )r)   r[   r<  s    r2   r3   r3   	  s    '%A6 r4   c                 $    t        t        |       S r;  )r)   r  r<  s    r2   r3   r3   	  s    76a8 r4   c                 $    t        t        |       S r;  )r)   r  r<  s    r2   r3   r3   	  s    WW; r4   )VarCompositeGlyphListrP  r`  rG   rH   rI   r#   rC  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   rA  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\   rq  r  rP  rg   objectri   r   r   r   r   r   r  r  r  r  r+  r5  r?  rI  rO   rP   rQ   rT  rZ  rh  rk  ru  r~  r  r  r  r  r  r  r  r  rT   rR   r[   r  r  r@   r>   r?   rA   r7   r8  rC  r  r  r  rP  r`  ri  r  r  r  r  r  r  r  r  rS   r   r4   r2   <module>rW     se    A J M M - ?  $    .  ! 	    g!
(C(tI C(LjF jZ/- /"K { &8 & 'H '  e  !}e !'H ' (X ( &8 & 'H ' "X " (  	K 		[& 		K 	+ Ak A& 
V $  . .0Z 0:N  n  >G >0% k 0[ >D4] D4N>v >6+F +DU e M MLu LG&( GLE L8( 8&+ 0t t|8=m 8=v|>M |>Bp pf	- D,- ,^2( 2(j-
] -
`0(= 0(f $Q( Q(h *1 1 J H H&em 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& 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 {CG3H %Y:KL!$!);W;68;e3 r4   