
    #Vfa                    2   d dl mZmZmZmZm	Z
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 ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z(m)Z*m+Z+ d dl,m-Z- d d	l.m/Z/ d d
l0Z0d d
l1Z1d dl2m3Z3 d d
l4Z4 e4jj                  e6      Z7d Z8d Z9 G d de:      Z;	 d dl<m=Z=  G d de=      Z? G d de@      ZA G d deA      ZB G d deB      ZC G d deB      ZD G d deD      ZE G d deD      ZF G d d eF      ZG G d! d"eCeF      ZH G d# d$eD      ZI G d% d&eD      ZJ G d' d(eD      ZK G d) d*eD      ZL G d+ d,eD      ZM G d- d.eD      ZN G d/ d0eNeL      ZO G d1 d2eNeJ      ZP G d3 d4eNeF      ZQ G d5 d6eB      ZR G d7 d8eB      ZS G d9 d:eS      ZT G d; d<eJ      ZU G d= d>eJ      ZV G d? d@eB      ZW G dA dBeW      ZX G dC dDeW      ZY G dE dFeY      ZZ G dG dHeY      Z[ G dI dJe[      Z\ G dK dLe\      Z] G dM dNeB      Z^ G dO dPeB      Z_ G dQ dReA      Z` G dS dTe`      Za G dU dVe`      Zb G dW dXeb      Zc G dY dZeb      Zd G d[ d\e`      Ze G d] d^eb      Zf G d_ d`ecef      Zg G da dbeb      Zh G dc ddeD      Zi G de dfei      Zj G dg dheA      Zk G di djeA      Zl G dk dleA      Zm G dm dneA      Zn G do dpeA      Zo G dq dreA      Zp G ds dteA      Zq G du dveA      Zr G dw dxeA      Zs G dy dzeJ      Zt G d{ d|eL      Zu G d} d~eu      Z' G d deu      Z)i deKdeIdeLdeJdeMdeFde_d eGd"eHdNe^d6eRd8eSd:eTd<eUdBeXdFeZdHe[i dJe\dLe]de`debdecdeddfejdteqdverdxesdzetd~e'de)d>eVdpeodrepdeaeaeaemd d d d d d d	Zvy
# e>$ r
 d dl=m=Z= Y w xY w)    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)getSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)lookupTypesAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest)partialN)Optionalc                 "    t        | t              S N)
isinstancetuple)ts    l/var/www/html/software/conda/envs/catlas/lib/python3.12/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>r+   )   s    Jq%(     c           	         g }i }| D ]  \  }}}}}|}	|j                  d      r|dk(  sJ t        }
n|j                  d      s|dv rt        t        t
        d|   }
na|dk(  rt        }
nU|dk(  rt        }
nI|dk(  rt        }
n=|d	k(  rt        }
n1|d
v rt        }
n&|t        vrd|vr	|}	t        }
nt        ||t              }
 |
||||      }|j                  r|j                  }n'|dv r|j                  |      }n|j                  |	      }|j                  s||_        |dv rY|d   |_        |j                   j#                         D ]2  }|j#                         D ]  }t%        ||||      ||j&                  <    4 |d	k(  rN|d   |_        |d	   |_        |j(                  j#                         D ]  }t%        ||||      ||j&                  <    |j-                  |       ||vs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)uint8r/   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r5   r6   r7   r   featureParamTypes)
startswithr.   endswithComputedUInt8ComputedUShortComputedULongr5   r6   r7   r8   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__rA   defaultFeatureParamsappend)	tableSpectableNamespace
convertersconvertersByNametpnamerepeatauxdescr	tableNameconverterClassconvrK   r)   clss                  r*   buildConvertersr_   ,   s?    J(1 6&$D&#u	??=)>!>(N]]7#t/L'L&(' 	N
 Z%N]"(N[ &N_$*N;;-N))cm	!'!%b.:J!KdFCUC??J=='++B/J'++I6J(DO;;-m<D%%,,. S88: SC5:4c5R$S\\2SS ?"%34G%HD"(6(GD%--446 O16tVS#1N .O$++1T1+!%m6&n '''r,   c                       e Zd ZdZy)_MissingItem N)rO   
__module____qualname__	__slots__rb   r,   r*   ra   ra   l   s    Ir,   ra   )UserListc                   $    e Zd Zd Zd Zd Zd Zy)	_LazyListc                 8    | j                  t        ||            S r&   )__getitem__slice)selfijs      r*   __getslice__z_LazyList.__getslice__w   s    a,,r,   c                    t        |t              r3t        |j                  t	        |              }|D cg c]  }| |   	 c}S | j
                  |   }t        |t              rx| j                  j                  | j                  |d   | j                  z  z          | j                  j                  | j                  | j                  i       }|| j
                  |<   |S c c}w Nr   )r'   rk   rangeindiceslendatara   readerseekpos
recordSizer]   readfont)rl   krs   rm   items        r*   rj   z_LazyList.__getitem__z   s    aQYYs4y12G%,-DG--yy|dL)KKTXXQ$//(AAB99>>$++tyy"=DDIIaL .s   Cc                     t        |t              rt        |      }nt        |t              rnt        S t        |       |z   S r&   )r'   rh   listNotImplementedrl   others     r*   __add__z_LazyList.__add__   s7    eY'KEt$!!DzE!!r,   c                 J    t        |t              st        S |t        |       z   S r&   )r'   r   r   r   s     r*   __radd__z_LazyList.__radd__   s!    %&!!tDz!!r,   N)rO   rc   rd   ro   rj   r   r   rb   r,   r*   rh   rh   v   s    -	""r,   rh   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 r<   c                    || _         || _        || _        || _        |j	                  d      xs |dv | _        |j	                  d      xs |dk(  | _        |dv | _        || _        y )Nr0   )DesignAxisRecordSizeValueRecordSize
LookupTyper2   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountr   AxisValueCountr   	AxisCountBaseGlyphRecordCountLayerRecordCount)	rW   rX   rY   rK   rC   isCountisLookupTypeisPropagatedr=   rl   rW   rX   rY   rK   r=   s         r*   __init__zBaseConverter.__init__   sx    	$}}W- 
 :
 2
 !MM,7N4;;N  %
 
  'r,   c                    |j                   xr |dkD  }|r| j                  |      }|t        u rd}|s6g }t        |      D ]$  }|j	                  | j                  |||             & |S t               }|j                         |_        |j                  j                  |_	        ||_
        | |_        |_        |j                  d t        |      D               |j                  ||z         |S )z(Read an array of values from the reader.   Fc              3   4   K   | ]  }t        |g        y wr&   )ra   ).0rm   s     r*   	<genexpr>z*BaseConverter.readArray.<locals>.<genexpr>   s     =1\1#&=s   )lazygetRecordSizer   rr   rQ   rz   rh   copyrv   rx   r{   r]   ry   extendadvance)	rl   rv   r{   	tableDictcountr   ry   lrm   s	            r*   	readArrayzBaseConverter.readArray   s    yy&UQY++F3J^+A5\ =64;<=HA{{}AHHHLLAEAFAF%ALHH=e==NN5:-.Hr,   c                 >    t        | d      r| j                  S t        S )N
staticSize)hasattrr   r   rl   rv   s     r*   r   zBaseConverter.getRecordSize   s    4&??"r,   c                     t        |       )zRead a value from the reader.NotImplementedErrorrl   rv   r{   r   s       r*   rz   zBaseConverter.read       !$''r,   c                     	 t        |      D ]  \  }}| j                  |||||        y # t        $ r}|j                  fz   |_         d }~ww xY wr&   )	enumeratewrite	Exceptionargs)rl   writerr{   r   rM   rm   valuees           r*   
writeArrayzBaseConverter.writeArray   sW    	%f- >5

64E1=> 	VVqd]AF	s   (+ 	AA

Ac                     t        |       )zWrite a value to the writer.r   rl   r   r{   r   r   repeatIndexs         r*   r   zBaseConverter.write   r   r,   c                     t        |       )zRead a value from XML.r   rl   attrscontentr{   s       r*   xmlReadzBaseConverter.xmlRead   r   r,   c                     t        |       )zWrite a value to XML.r   rl   	xmlWriterr{   r   rW   r   s         r*   xmlWritezBaseConverter.xmlWrite   r   r,   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searchr=   intgroup)rl   ms     r*   getVarIndexOffsetzBaseConverter.getVarIndexOffset   s6    ))001A1AB1771:r,   r&   )rO   rc   rd   __doc__r   r   r   rz   r   r   r   r   recompiler   r$   r   r   rb   r,   r*   r   r      sZ    '" '8.
((((  *rzz*FG8C= r,   r   c                   8    e Zd Zed        Zed        Zd Zd Zy)SimpleValuec                     | S r&   rb   r   s    r*   toStringzSimpleValue.toString       r,   c                     | S r&   rb   r   s    r*   
fromStringzSimpleValue.fromString   r   r,   c                 r    |j                  ||d| j                  |      fgz          |j                          y Nr   )	simpletagr   newliner   s         r*   r   zSimpleValue.xmlWrite   s4    D%GT]]55I+J*K"KLr,   c                 *    | j                  |d         S r   )r   r   s       r*   r   zSimpleValue.xmlRead   s    uW~..r,   N)rO   rc   rd   staticmethodr   r   r   r   rb   r,   r*   r   r      s2       /r,   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   )DEFAULTrQ   r   r   r   r   s         r*   r   zOptionalValue.xmlWrite  sD    DLL LL'4==#789D%(r,   c                 J    d|v r| j                  |d         S | j                  S r   )r   r   r   s       r*   r   zOptionalValue.xmlRead  s'    e??5>22||r,   )rO   rc   rd   r   r   r   rb   r,   r*   r   r     s    Gr,   r   c                       e Zd Zed        Zy)IntValuec                     t        | d      S rq   )r   r   s    r*   r   zIntValue.fromString  s    5!}r,   NrO   rc   rd   r   r   rb   r,   r*   r   r     s     r,   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       r*   rz   z	Long.read        r,   c                 $    |j                  |      S r&   )readLongArrayrl   rv   r{   r   r   s        r*   r   zLong.readArray      ##E**r,   Nc                 &    |j                  |       y r&   )	writeLongr   s         r*   r   z
Long.write"      r,   c                 &    |j                  |       y r&   )writeLongArrayrl   r   r{   r   rM   s        r*   r   zLong.writeArray%      f%r,   r&   rO   rc   rd   r   rz   r   r   r   rb   r,   r*   r   r         J!+ &r,   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       r*   rz   z
ULong.read,      !!r,   c                 $    |j                  |      S r&   )readULongArrayr   s        r*   r   zULong.readArray/      $$U++r,   Nc                 &    |j                  |       y r&   
writeULongr   s         r*   r   zULong.write2      % r,   c                 &    |j                  |       y r&   )writeULongArrayr   s        r*   r   zULong.writeArray5      v&r,   r&   r   rb   r,   r*   r  r  )      J",!'r,   r  c                       e Zd Zed        Zy)Flags32c                     d| z  S )Nz0x%08Xrb   r   s    r*   r   zFlags32.toString:      %r,   N)rO   rc   rd   r   r   rb   r,   r*   r  r  9  s       r,   r  c                       e Zd ZeZy)VarIndexN)rO   rc   rd   r!   r   rb   r,   r*   r  r  ?  s     Gr,   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       r*   rz   z
Short.readF  r  r,   c                 $    |j                  |      S r&   )readShortArrayr   s        r*   r   zShort.readArrayI  r  r,   Nc                 &    |j                  |       y r&   )
writeShortr   s         r*   r   zShort.writeL  r  r,   c                 &    |j                  |       y r&   )writeShortArrayr   s        r*   r   zShort.writeArrayO  r  r,   r&   r   rb   r,   r*   r  r  C  r  r,   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       r*   rz   zUShort.readV        ""r,   c                 $    |j                  |      S r&   )readUShortArrayr   s        r*   r   zUShort.readArrayY  s    %%e,,r,   Nc                 &    |j                  |       y r&   writeUShortr   s         r*   r   zUShort.write\      5!r,   c                 &    |j                  |       y r&   )writeUShortArrayr   s        r*   r   zUShort.writeArray_  s    'r,   r&   r   rb   r,   r*   r#  r#  S  s    J#-"(r,   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       r*   rz   z	Int8.readf  r   r,   c                 $    |j                  |      S r&   )readInt8Arrayr   s        r*   r   zInt8.readArrayi  r   r,   Nc                 &    |j                  |       y r&   )	writeInt8r   s         r*   r   z
Int8.writel  r   r,   c                 &    |j                  |       y r&   )writeInt8Arrayr   s        r*   r   zInt8.writeArrayo  r   r,   r&   r   rb   r,   r*   r1  r1  c  r   r,   r1  c                   *    e Zd ZdZd Zd ZddZd Zy)UInt8r   c                 "    |j                         S r&   )	readUInt8r   s       r*   rz   z
UInt8.readv  r  r,   c                 $    |j                  |      S r&   )readUInt8Arrayr   s        r*   r   zUInt8.readArrayy  r  r,   Nc                 &    |j                  |       y r&   )
writeUInt8r   s         r*   r   zUInt8.write|  r  r,   c                 &    |j                  |       y r&   )writeUInt8Arrayr   s        r*   r   zUInt8.writeArray  r  r,   r&   r   rb   r,   r*   r;  r;  s  r  r,   r;  c                       e Zd ZdZd ZddZy)UInt24   c                 "    |j                         S r&   
readUInt24r   s       r*   rz   zUInt24.read  r'  r,   Nc                 &    |j                  |       y r&   writeUInt24r   s         r*   r   zUInt24.write  r-  r,   r&   rO   rc   rd   r   rz   r   rb   r,   r*   rE  rE    s    J#"r,   rE  c                       e Zd Zd Zy)ComputedIntc                 V    |'|j                  |d|       |j                          y y )N=)commentr   r   s         r*   r   zComputedInt.xmlWrite  s,    u56 r,   NrO   rc   rd   r   rb   r,   r*   rO  rO    s     r,   rO  c                       e Zd Zy)rD   NrO   rc   rd   rb   r,   r*   rD   rD         r,   rD   c                       e Zd Zy)rE   NrU  rb   r,   r*   rE   rE     rV  r,   rE   c                       e Zd Zy)rF   NrU  rb   r,   r*   rF   rF     rV  r,   rF   c                       e Zd ZdZd ZddZy)Tagr   c                 "    |j                         S r&   )readTagr   s       r*   rz   zTag.read  s    ~~r,   Nc                 &    |j                  |       y r&   )writeTagr   s         r*   r   z	Tag.write  s    r,   r&   rM  rb   r,   r*   rZ  rZ    s    J r,   rZ  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        r*   r   zGlyphID.readArray  s/    $$T]]DOOUC
 	
r,   c                 l    |j                  |j                  | j                  | j                              S r&   )getGlyphName	readValuerd  r   r   s       r*   rz   zGlyphID.read  s(      !1!1$--!QRRr,   c                 Z    |j                  | j                  |j                  |             y r&   )r   rd  getGlyphIDManyr   s        r*   r   zGlyphID.writeArray  s!    $--)<)<V)DEr,   Nc                 Z    |j                  | j                  |j                  |             y r&   )
writeValuerd  
getGlyphIDr   s         r*   r   zGlyphID.write  s    $--)?@r,   r&   )	rO   rc   rd   r   rd  r   rz   r   r   rb   r,   r*   r`  r`    s#    JH

SFAr,   r`  c                       e Zd ZdZdZy)	GlyphID32r   LN)rO   rc   rd   r   rd  rb   r,   r*   rn  rn    s    JHr,   rn  c                       e Zd Zd Zy)NameIDc                 @   |j                  ||d|fgz          |rt|rr|j                  d      }|r_|j                  |      }|j                  d       |r|j	                  |       n)|j	                  d       t
        j                  d|z         |j                          y )Nr   rW     zmissing from name tablez"name id %d missing from name table)r   rL   getDebugNamer   rR  logwarningr   )rl   r   r{   r   rW   r   	nameTables          r*   r   zNameID.xmlWrite  s    D%GU+;*<"<=E(I --e4%%%d+%%&?@KK Du LMr,   NrS  rb   r,   r*   rq  rq    s    r,   rq  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  ElidableAxisValueNamers   )r   rQ   r   rR  joinr   rl   r   r{   r   rW   r   flagss          r*   r   zSTATFlags.xmlWrite  s}    D%GU+;*<"<=4<LL454<LL01OOD!chhuo.r,   NrS  rb   r,   r*   ry  ry    s    
r,   ry  c                       e Zd Zed        Zy)
FloatValuec                     t        |       S r&   )floatr   s    r*   r   zFloatValue.fromString      U|r,   Nr   rb   r,   r*   r  r    s     r,   r  c                       e Zd ZdZd ZddZy)
DeciPointsr  c                 (    |j                         dz  S N
   r%  r   s       r*   rz   zDeciPoints.read  s      "R''r,   Nc                 >    |j                  t        |dz               y r  )r,  roundr   s         r*   r   zDeciPoints.write  s    5,-r,   r&   rM  rb   r,   r*   r  r    s    J(.r,   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       r*   rz   zBaseFixedValue.read  s$    ||>GFD,=,=>@AAr,   Nc                 Z     t        || j                        | j                  |             y r&   )r  writerMethodtoIntr   s         r*   r   zBaseFixedValue.write  s"    *))*4::e+<=r,   c                 .    t        || j                        S r&   )fi2flprecisionBitsr^   r   s     r*   r  zBaseFixedValue.fromInt      UC--..r,   c                 .    t        || j                        S r&   )fl2fir  r  s     r*   r  zBaseFixedValue.toInt   r  r,   c                 .    t        || j                        S r&   )str2flr  r  s     r*   r   zBaseFixedValue.fromString      eS..//r,   c                 .    t        || j                        S r&   )fl2strr  r  s     r*   r   zBaseFixedValue.toString  r  r,   r&   )rO   rc   rd   r   r   r  r  r  rz   r   classmethodr  r  r   r   rb   r,   r*   r  r    sq    J"M!L!LB> / / / / 0 0 0 0r,   r  c                       e Zd ZdZdZdZdZy)Fixedr      r   r   NrO   rc   rd   r   r  r  r  rb   r,   r*   r  r    s    JMLLr,   r  c                       e Zd ZdZdZdZdZy)F2Dot14r     r  r  Nr  rb   r,   r*   r  r    s    JMLLr,   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r^   r   	__class__s     r*   r  zAngle.fromInt!  s     &1S88r,   c                 B    t         |   |dz  | j                  z
        S r  )r  r  r  r  s     r*   r  zAngle.toInt%  s    w}eckSXX566r,   c                 ^    t        t        |      | j                  z        | j                  z  S r&   )r
   r  factorr  s     r*   r   zAngle.fromString)  s%     uU|cjj01CJJ>>r,   c                 .    t        || j                        S r&   )r	   r  r  s     r*   r   zAngle.toString.  s    *5#**==r,   )rO   rc   rd   r  r  r  r  r  r   r   __classcell__r  s   @r*   r  r    s]     D"F9 9 7 7 ? ? > >r,   r  c                       e Zd ZdZy)BiasedAngleg      ?N)rO   rc   rd   r  rb   r,   r*   r  r  3  s	     Dr,   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   )rl   rv   r{   r   r   s        r*   rz   zVersion.read<  s    !r,   Nc                 <    t        |      }|j                  |       y r&   )fi2ver   r   s         r*   r   zVersion.write@  s    er,   c                     t        |       S r&   )ve2fir   s    r*   r   zVersion.fromStringD  r  r,   c                     d| z  S )N0x%08xrb   r   s    r*   r   zVersion.toStringH  r  r,   c                     t        | d      S )Nr  )r  )vs    r*   	fromFloatzVersion.fromFloatL  s    Q|r,   r&   )
rO   rc   rd   r   rz   r   r   r   r   r  rb   r,   r*   r  r  9  sM    J         r,   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   ru  rv  )rl   rv   r{   r   ru   zeroPosss          r*   rz   zChar64.readZ  sj    t/))E"a<>D$;dWX>>KK?!CDr,   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   ru  rv  rt   r   	writeData)rl   r   r{   r   r   r   ru   s          r*   r   zChar64.writed  s    uwyA7578DDKK@5HIt9t&KK6%9QQ ut..0A$//Br,   r&   )rO   rc   rd   r   r   rz   r   rb   r,   r*   r  r  Q  s     J	r,   r  c                   2    e Zd Zd Zd ZddZd Zd Zd Zy)	rI   c                 T    | j                   xr | j                   j                  |      S r&   )rK   r   r   s     r*   r   zStruct.getRecordSizeq  s     H4??#@#@#HHr,   c                 J    | j                         }|j                  ||       |S r&   )rK   	decompile)rl   rv   r{   r   tables        r*   rz   zStruct.readt  s!    !%r,   Nc                 (    |j                  ||       y r&   )r   r   s         r*   r   zStruct.writey  s    fd#r,   c                     |*|r'|j                  ||dgz          |j                          y y |j                  ||||       y )N)emptyr   )rW   )r   r   toXMLr   s         r*   r   zStruct.xmlWrite|  sF    = ##D%<.*@A!!#KK	4TK:r,   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   rK   rL   r   r  r   getConvertersr   r  rW   setattrr   __dict__r'   r(   fromXMLpopulateDefaultsr  )rl   r   r   r{   r  r  
noPostReadcleanPropagationr]   r  elementrW   s               r*   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 r,   c                 2    dt        | j                        z   S )Nz
Struct of )reprrK   )rl   s    r*   __repr__zStruct.__repr__  s    d4??333r,   r&   )	rO   rc   rd   r   rz   r   r   r   r  rb   r,   r*   rI   rI   p  s"    I
$;(T4r,   rI   c                       e Zd Zd ZddZy)rG   c                     |j                   }| j                         }|j                  ||       |j                  ||j                  z          |S r&   )rx   rK   r  rw   r1   )rl   rv   r{   r   rx   r  s         r*   rz   zStructWithLength.read  sA    jj!%C%,,,-r,   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 )Nr1   r      i     >[= )r   r  r      ޭ)r   r  rW   rt   itemsr'   r   r   getDataLengthr1   r   getSubWriterr   
getAllData)rl   r   r{   r   r   r   	convIndexr]   lengthIndexdeadbeefbeforelengthlengthWriters                r*   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$;$;$=[!r,   r&   rO   rc   rd   rz   r   rb   r,   r*   rG   rG     s    >r,   rG   c                   *    e Zd ZdZd Zd Zd ZddZy)rN   r  c                 "    |j                         S r&   r%  r   s     r*   
readOffsetzTable.readOffset  r'  r,   c                 &    |j                  d       y rq   r+  rl   r   s     r*   writeNullOffsetzTable.writeNullOffset      1r,   c                     | j                  |      }|dk(  ry | j                         }|j                  |      }|j                  r||_        ||_        |S |j                  ||       |S rq   )r  rK   getSubReaderr   rv   r{   r  )rl   rv   r{   r   offsetr  s         r*   rz   z
Table.read  sg    (Q;!$$V,99!ELEJ  OOFD)r,   Nc                     || j                  |       y |j                         }| j                  |_        |||_        |j	                  || j
                         |j                  ||       y )N
offsetSize)r  r  rW   r   writeSubTabler   r   )rl   r   r{   r   r   r   	subWriters          r*   r   zTable.write  sa    =  (++-I!YYIN&(3	%  t GMM)T*r,   r&   )rO   rc   rd   r   r  r  rz   r   rb   r,   r*   rN   rN     s    J#	+r,   rN   c                       e Zd ZdZd Zd Zy)LTabler   c                 "    |j                         S r&   r  r   s     r*   r  zLTable.readOffset  r  r,   c                 &    |j                  d       y rq   r
  r  s     r*   r  zLTable.writeNullOffset  s    !r,   NrO   rc   rd   r   r  r  rb   r,   r*   r  r    s    J"r,   r  c                       e Zd ZdZd Zd Zy)Table24rF  c                 "    |j                         S r&   rH  r   s     r*   r  zTable24.readOffset  r'  r,   c                 &    |j                  d       y rq   rK  r  s     r*   r  zTable24.writeNullOffset  r  r,   Nr  rb   r,   r*   r  r    s    J#r,   r  c                   $     e Zd Zd Z fdZ xZS )r7   c                     | j                   |   |   }| j                  | j                  | j                  | j                  |      S r&   r   r  rW   rX   rY   rl   	tableType
lookupTyperK   s       r*   getConverterzSubStruct.getConverter  8    %%i0<
~~diidhh
KKr,   c                 4    t         t        |   |||d |       y r&   )r  r7   r   rl   r   r{   r   rW   r   r  s         r*   r   zSubStruct.xmlWrite  s    i'	4eLr,   rO   rc   rd   r   r   r  r  s   @r*   r7   r7     s    LM Mr,   r7   c                   $     e Zd Zd Z fdZ xZS )r5   c                     | j                   |   |   }| j                  | j                  | j                  | j                  |      S r&   r  r  s       r*   r   zSubTable.getConverter  r!  r,   c                 4    t         t        |   |||d |       y r&   )r  r5   r   r#  s         r*   r   zSubTable.xmlWrite  s    h&y$tUKr,   r$  r  s   @r*   r5   r5     s    LL Lr,   r5   c                       e Zd ZddZy)r6   Nc                 F    d|_         t        j                  | |||||       y )NT)	ExtensionrN   r   r   s         r*   r   zExtSubTable.write  s     D&$	5+Fr,   r&   )rO   rc   rd   r   rb   r,   r*   r6   r6     s    Gr,   r6   c                       e Zd Zd Zy)r8   c                     | j                   j                  || j                        }| j                  | j                  | j
                  | j                  |      S r&   )rA   rL   rP   r  rW   rX   rY   )rl   
featureTagrK   s      r*   r   zFeatureParams.getConverter%  sA    ++//
D<U<UV
~~diidhh
KKr,   N)rO   rc   rd   r   rb   r,   r*   r8   r8   $  s    Lr,   r8   c                   ,    e Zd ZdZddddZd ZddZy)	r.   r  Nr   r<   c                r    t         j                  | |||||       d|d   dk(  r
dz   | _        y dz   | _        y )Nr<   r.   21)r   r   whichr   s         r*   r   zValueFormat.__init__-  sC    $Z[ 	 	
 #T"X_cF
#F
r,   c                 V    |j                         }t        |      || j                  <   |S r&   )r&  r   r3  rl   rv   r{   r   formats        r*   rz   zValueFormat.read3  s(    ""$/7tzzr,   c                 V    |j                  |       t        |      || j                  <   y r&   )r,  r   r3  )rl   r   r{   r   r6  r   s         r*   r   zValueFormat.write8  s#    6"/7tzzr,   r&   )rO   rc   rd   r   r   rz   r   rb   r,   r*   r.   r.   *  s    JG" G
8r,   r.   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  )rt   r3  r   s     r*   r   zValueRecord.getRecordSize>  s    3vdjj)***r,   c                 @    || j                      j                  ||      S r&   )r3  readValueRecordr   s       r*   rz   zValueRecord.readA  s    djj!11&$??r,   Nc                 D    || j                      j                  |||       y r&   )r3  writeValueRecordr   s         r*   r   zValueRecord.writeD  s    tzz++FD%@r,   c                 F    |y |j                  ||| j                  |       y r&   )r  rW   r   s         r*   r   zValueRecord.xmlWriteG  s     =KK	4E:r,   c                 H    ddl m}  |       }|j                  d |||       |S )Nr   )r9  )otBaser9  r  )rl   r   r   r{   r9  r   s         r*   r   zValueRecord.xmlReadM  s#    'dE7D1r,   r&   )rO   rc   rd   r   rz   r   r   r   rb   r,   r*   r9  r9  =  s    +@A;r,   r9  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  r   r<   c                    t         j                  | |||||       t        | j                  t              r| j                  dd d       | _        y t        dd d | j                        | _        y )Nr<   Value)rW   rX   rY   )rW   rX   rY   rK   )r   r   
issubclassrK   r   	converterrN   r   s         r*   r   zAATLookup.__init__X  sa    $Z[ 	 	
 doo{3!__'$D_QDN"TtDNr,   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readFormat8r5  s        r*   rz   zAATLookup.readc  s    ""$Q;##FD11q[##FD11q[##FD11q[##FD11q[##FD11B9FBB5r,   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)
r   sortedr  rl  filterbuildFormat0buildFormat2buildFormat6buildFormat8r  )rl   r   r{   r   r   r   glyphvalrM   formatsdataSizelookupFormatwriteMethodrx   
actualSizes                  r*   r   zAATLookup.writer  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         r*   writeBinSearchHeaderzAATLookup.writeBinSearchHeader  s`    8$8$1?2
.]J 	;'=):&r,   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{   rl   rM   r   s   r*   r+   z(AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF; r,   )rt   getGlyphOrderrH  r   )rl   r   r{   rM   	numGlyphs	valueSizes   ````  r*   rS  zAATLookup.buildFormat0  sQ    **,-	v;)#NN--		I%%;
 	
r,   c                 z    |j                  d       |D ]%  \  }}| j                  j                  ||d |d        ' y )Nr   r   r   r   )r,  rH  r   )rl   r   r{   rM   glyphID_r   s         r*   ri  zAATLookup.writeFormat0  sE    1% 	OHeNN  Et ! 	r,   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{   segmentsrl   r   s   r*   r+   z(AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH= r,   )rQ   rH  r   rt   BIN_SEARCH_HEADER_SIZE)rl   r   r{   rM   segStartsegValuesegEndglyphIDcurValuern  ra  rb  ru  s   ```         @r*   rT  zAATLookup.buildFormat2  s    #AY(!' 	!GX&1*$H(<68 <=$++6# 	! 	6845NN--	 ]Q.	A(+++h.AA=
 	
r,   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    r  r,  rH  r   rt   rf  r   r  )
rl   r   r{   ru  rn  ra  rb  
firstGlyph	lastGlyphr   s
             r*   rt  zAATLookup.writeFormat2  s    1NN--	 ]IM(!!&(H=,4 	(J	5y)z*NN  Et ! 	 	6"6"9,-r,   c                       j                   j                  }t              |dz   }}d j                  z   |dz   |z  z   d fdfS )Nr  r   rJ  c                  *    j                         S r&   )writeFormat6rj  s   r*   r+   z(AATLookup.buildFormat6.<locals>.<lambda>  rk  r,   )rH  r   rt   rv  )rl   r   r{   rM   rn  ra  rb  s   ````   r*   rU  zAATLookup.buildFormat6  sO    NN--	 [)a-(+++x!|x.GG;
 	
r,   c                 X   |j                  d       | j                  j                  }t        |      |dz   }}| j	                  |||       |D ]6  \  }}|j                  |       | j                  j                  ||d |d        8 |j                  d       |j                  d|z         y )NrJ  r  rp  r}  r  r~  )	rl   r   r{   rM   rn  ra  rb  rz  r   s	            r*   r  zAATLookup.writeFormat6  s    1NN--	 [)a-(!!&(H=$ 	NGUw'NN  Et ! 	
 	6"9,-r,   c                      d   d   d   d   }}t              ||z
  dz   k7  ry  j                  j                  }dt              |z  z   d fdfS )Nr   r0  r   rJ  r   c                  *    j                         S r&   )writeFormat8rj  s   r*   r+   z(AATLookup.buildFormat8.<locals>.<lambda>  rk  r,   )rt   rH  r   )rl   r   r{   rM   
minGlyphID
maxGlyphIDrn  s   ````   r*   rV  zAATLookup.buildFormat8  se    !'1vbz!}J
v;*z1A55NN--	Fi'';
 	
r,   c                     |d   d   }|j                  d       |j                  |       |j                  t        |             |D ]%  \  }}| j                  j                  ||d |d        ' y )Nr   r   rp  )r,  rt   rH  r   )rl   r   r{   rM   firstGlyphID_r   s          r*   r  zAATLookup.writeFormat8  sr    ay|1<(3v;' 	HAuNN  Et ! 	r,   c                     t        |j                               }| j                  j                  ||d |      }t	        |      D ci c]  \  }}|j                  |      | c}}S c c}}w Nr   r   )rt   rl  rH  r   r   rf  )rl   rv   r{   rm  ru   r|   r   s          r*   rK  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   r}  r   rx   r&  rH  r   rr   rw   rz   rf  )rl   rv   r{   mappingrx   rb  ra  rm   lastfirstr   r|   s               r*   rL  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:	: r,   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  rJ  r  r}  r   r   r  )	rx   r&  rr   rw   r
  rH  r   r   rf  )rl   rv   r{   r  rx   rb  rm   r  r  r  
dataReaderru   r|   r  s                 r*   rM  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>	> r,   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  r}  r  )	rl   rv   r{   r  rx   rb  rm   rz  r   s	            r*   rN  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	< r,   c                     |j                         }|j                         }| j                  j                  ||d |      }t        |      D ci c]  \  }}|j	                  ||z         | c}}S c c}}w r  )r&  rH  r   r   rf  )rl   rv   r{   r  r   ru   r|   r   s           r*   rO  zAATLookup.readFormat82  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'   r(   rH  r   )	rl   r   r   r{   r   r  rW   a
eltContents	            r*   r   zAATLookup.xmlRead8  s^     	TG'5)&-#a8#(,(>(>q*d(SE!G*%		T
 r,   c           	         |j                  ||       |j                          t        |j                               D ](  \  }}| j                  j                  |||dd|fg       * |j                  |       |j                          y )Nr  rW  )r   rW   r   )begintagr   rQ  r  rH  r   endtag)rl   r   r{   r   rW   r   rW  s          r*   r   zAATLookup.xmlWriteA  s    4'"5;;=1 	LE5NN##4u8WeDTCU $ 	 	r,   r&   )rO   rc   rd   rv  r   rz   r   r   rf  rS  ri  rT  rt  rU  r  rV  r  rK  rL  rM  rN  rO  r   r   rb   r,   r*   rD  rD  U  s}    EG 	C
@ ' '	

(.
.	
M
(Wr,   rD  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
  rD  r#  rz   r  rK   r  )rl   rv   r{   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultrW  r  r  r}   s                 r*   rz   zAATLookupWithDataOffset.readT  s    '')%%'
**<8=$f=++lD)<$]]_ 	!ME6,,Vj-@AJ??$DNN:t, F5M		!
 r,   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  rl  r   r   r  rL   rt   rQ   r  rD  r#  r   r  r  )rl   r   r{   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatarW  r  ru   r  lookupWriterr  
dataWriterds                     r*   r   zAATLookupWithDataOffset.writeb  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  #	$r,   c                 X    t        dd d | j                        }|j                  |||      S r  )rD  rK   r   )rl   r   r   r{   r  s        r*   r   zAATLookupWithDataOffset.xmlRead  s)    =$dooF~~eWd33r,   c                 ^    t        dd d | j                        }|j                  |||||       y r  )rD  rK   r   )rl   r   r{   r   rW   r   r  s          r*   r   z AATLookupWithDataOffset.xmlWrite  s*    =$dooF	4e<r,   r&   rO   rc   rd   rz   r   r   r   rb   r,   r*   r  r  S  s    !$F4=r,   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)TTNr   r<   c                :    t         j                  | |||||       y )Nr<   )r   r   r   s         r*   r   zMorxSubtableConverter.__init__  s"    $Z[ 	 	
r,   c                 R    |dz  dk7  rd|_         y |dz  dk7  rd|_         y d|_         y )N    r   Any   Vertical
Horizontal)TextDirection)rl   r  subtables      r*   "_setTextDirectionFromCoverageFlagsz8MorxSubtableConverter._setTextDirectionFromCoverageFlags  s2    DLQ%*H"dlq %/H"%1H"r,   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)ru   tableTag)rx   r   r  r1   r=  _PROCESSING_ORDERSProcessingOrderr  r&  Reservedr2   SubFeatureFlagsr   rL   ru   rt   r   r  r7   r  rw   )rl   rv   r{   r   rx   r   r  orderKeyrK   headerLengthru   	subReaders               r*   rz   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!..()r,   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   rR  r1   r   r  r  r  r2   r  r7   r  r  r   s         r*   r   zMorxSubtableConverter.xmlWrite  s?   4'+e.@.@@AO53F3FG-U5J5JK>>Q
(U^^2KL.5??:;-X@U@U5UVi.r,   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  rC   r  )
rl   r   r   r{   r   covFlagseltNameeltAttrsr  r  s
             r*   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
r,   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  r}  r  z>L)r  r  r  r  r  rt   r  r  r1   r   structpack)rl   r   r{   r   r   r   r  reverseOrderlogicalOrderr  r  origReservedr  s                r*   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$=[!r,   r&   )rO   rc   rd   r  r  r  r   r  rz   r   r   r   )r   r  rX  s   000r*   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	)	STXHeaderr   r<   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 )Nr<   GlyphClassesPerGlyphLookup)r   r   rG  rK   r   rD  r#  classLookupr   r`  perGlyphLookupr   s         r*   r   zSTXHeader.__init__  sv    $Z[ 	 	
 $//9555$^T4Hdoo'<="+,<dD'"RD"&Dr,   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   rx   r
  r  GlyphClassCountrw   r  rG  rK   r   r)  LigComponents_readLigatures	Ligaturesr   r  rz   r  r   rr   r   StatesrQ   r&  _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)rl   rv   r{   r   r  rx   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexs                      r*   rz   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! r,   c                     | j                         }|j                  |j                  ||j                  z  z         }|j	                  |||       |S r&   )rK   r
  rx   r   r  )rl   rv   r  r{   r  
transitionentryReaders          r*   r  zSTXHeader._readTransitionJ  sO    __&
))JJj&;&;;;
 	[$=r,   c                     t        |j                        }||j                  z
  dz  }|j                  |j	                  |            S r;  )rt   ru   rx   rc  r)  )rl   rv   r{   limitnumLigatureGlyphss        r*   r  zSTXHeader._readLigaturesR  sA    FKK "VZZ/A5$$V%;%;<M%NOOr,   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   r}  r   )r  r  rM   r'   r   	MarkIndexmaxCurrentIndex)rl   r  
numLookupsr  r)   s        r*   _countPerGlyphLookupszSTXHeader._countPerGlyphLookupsW  s    
 
\\ 	IE&&--/ Ia!67{{f,%(Q[[1_%E
~~/%(Q^^a5G%H
I	I r,   c                    |j                   }g }t        | j                  |            D ]a  }|j                  d      }|j	                  ||j                         z          |j                  | j                  j                  ||i              c |S rq   )	rx   rr   r  r
  rw   r  rQ   r  rz   )rl   r  rv   r{   rx   lookupsr  r  s           r*   r  zSTXHeader._readPerGlyphLookupsf  s    jjt11%89 	MA!..q1LcF$4$4$667NN4..33L$KL	M r,   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
  rM   r  rK   actionHeaderSizecompileActionsr  _compileStatesrt   _compilePerGlyphLookups_compileLigComponents_compileLigaturesr  r  )rl   r   r{   r   r   r   glyphClassWriterglyphClassDataglyphClassCountglyphClassTableOffset
actionDataactionIndexstateArrayDataentryTableDatastateArrayOffsetentryTableOffsetperGlyphOffsetperGlyphDataactionOffsetligaturesOffsetligComponentsOffsetligComponentsDataligaturesDatas                          r*   r   zSTXHeader.writeo  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((./$]+ %r,   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   rr   r  r   r  rt   r   r  rL   rQ   r,  r   r   )rl   r{   statesr  r  stateArrayWriterentriesentryIDsr  r   r  entryWriter	entryDatar  r  r  s                   r*   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~--r,   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 )Nr,   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   r  )	r  r  rt   r  r   r  r   r  r  )rl   r  r{   r  r   r  r  s          r*   r  z!STXHeader._compilePerGlyphLookups  s    &//6
5(()Z7 	
;5(():67	
7
 ++ 	=F!..0L%%lD"fdK  ! <	=   ""r,   c                     t        |d      sy t               }|j                  D ]  }|j                  |        |j	                         S )Nr  )r   r   r  r,  r  )rl   r  r{   r   	components        r*   r  zSTXHeader._compileLigComponents  sH    uo.,, 	*Iy)	*  ""r,   c                     t        |d      sy t               }|j                  D ]"  }|j                  |j	                  |             $ |j                         S )Nr  )r   r   r  r,  rl  r  )rl   r  r{   r   	glyphNames        r*   r  zSTXHeader._compileLigatures  sO    uk* 	;Ity9:	;  ""r,   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   rW   r  r  r  LigComponent)r8  r   )r  r   rR  r  rQ  r  r  r   r   r  r  r  r  r  r   r  _xmlWriteLigatures)rl   r   r{   r   rW   r   gklassr  r  r   transrm   r  rW  rX  s                   r*   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r,   c                 $   t        |d      sy |j                  d       |j                          t        t	        |d            D ])  \  }}|j                  d||       |j                          + |j                  d       |j                          y )Nr  Ligature)r8  rW  )r   r  r   r   r  r   r  )rl   r   r{   r   rW   r   rm   r=  s           r*   r<  zSTXHeader._xmlWriteLigatures  s    uk*;'ge[9: 	 DAq
!1=	  	%r,   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 )	Nr5  rW  r   r7  r  r  r  r   )r   rR  r  r   r  _xmlReadStater  rQ   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r
  rM   r  )rl   r   r   r{   r  r  r  r  rW  r   r  r  s               r*   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r,   c                     t               }t        t        |      D ]M  \  }}}|dk(  st        |d         }| j	                         }	|	j                  ||||       |	|j                  |<   O |S )Nr:  r9  )r   rR  r  r   rK   r  r  )
rl   r   r   r{   r  r  r  r  r   r  s
             r*   rC  zSTXHeader._xmlReadState)  st    
-3GW-E 	;)GXz,&%h~&>?
!__.
""7Hj$G0:!!*-	; r,   c                     g }t        t        |      D ])  \  }}}|dk(  s|j                  t        |d                + |S )Nr;  r   )rR  r  rQ   r   )rl   r   r   r{   ligComponentsr  r  _eltContents           r*   rD  zSTXHeader._xmlReadLigComponents3  sN    .4Wg.F 	B*GX{.($$Xhw.?%@A	B r,   c                 p    g }t        t        |      D ]   \  }}}|dk(  s|j                  |d          " |S )NrA  rW  )rR  r  rQ   )rl   r   r   r{   ligsr  r  rI  s           r*   rE  zSTXHeader._xmlReadLigatures:  sD    .4Wg.F 	/*GX{*$HW-.	/ r,   r&   )rO   rc   rd   r   rz   r  r  r  r  r   r  r  r  r  r   r<  r   rC  rD  rE  rb   r,   r*   r  r    s^    EG 	'-^P
5,n.4# ##&P	,r,   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 )Nr}  )r&  r   r)  rf  )rl   rv   r{   r   numCIDsr  cidrz  s           r*   rz   zCIDGlyphMap.readC  s[    ##%%f&<&<W&EF 	9LC& "//8s	9 r,   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   r}  r  rl  r
  r,  rr   rL   )
rl   r   r{   r   r   r   rP  rW  r  r   s
             r*   r   zCIDGlyphMap.writeK  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  rP  )rR  r  stripr   rl   r   r   r{   r  eNameeAttrs	_eContents           r*   r   zCIDGlyphMap.xmlReadR  sT    (.w(@ 	J$E69~28/2G2G2Ixu./	J r,   c                 &   |j                  ||       |j                          t        |j                               D ]2  \  }}|	|dk7  s|j	                  d||       |j                          4 |j                  |       |j                          y )Nr}  rT  )rP  rW  r  r   rQ  r  r   r  )rl   r   r{   r   rW   r   rP  rW  s           r*   r   zCIDGlyphMap.xmlWriteY  s    4' / 	$JC Uf_##Es%#@!!#	$ 	r,   r&   r  rb   r,   r*   rM  rM  B  s    7r,   rM  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 restr}  )rl  r&  r)  rt   ru  rv  rr   min)
rl   rv   r{   r   
glyphOrderr   cidsr  rz  rP  s
             r*   rz   zGlyphCIDMap.reade  s    '')
!!#%%e,3z?"KK$',c*o&>?
 STC
O<= 	2Gw-Cf}.1z'*+	2 r,   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 )Nr}  r   r   rR  )rl   r   r{   r   r   r   r=  rP  r  r   rz  s              r*   r   zGlyphCIDMap.writev  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 )NrT  r   rW  )rR  r  r   rV  s           r*   r   zGlyphCIDMap.xmlRead  sK    (.w(@ 	D$E69~*26'?*Cvg'	D r,   c                 &   |j                  ||       |j                          t        |j                               D ]2  \  }}|	|dk7  s|j	                  d||       |j                          4 |j                  |       |j                          y )Nr}  rT  r6  r[  )rl   r   r{   r   rW   r   rW  rP  s           r*   r   zGlyphCIDMap.xmlWrite  s    4' / 	$JE33&=##Ec#B!!#	$ 	r,   r&   r  rb   r,   r*   r]  r]  d  s    "	;r,   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  rF  illegal DeltaFormatr   )r   r   r   r  )rr   r&  rQ   )rl   rv   r{   r   rh  ri  rj  nItemsnBitsminusOffsetmasksignMaskrf  tmpshiftrm   r   s                    r*   rz   zDeltaValue.read  s    k*	I&.i'>)>>'9$q([ 5jU
a#

Uv 	%Az#..0"UEMEE\T)Ex+e$	% r,   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 )
Nrh  ri  rj  rk  rl  r   )r   r  r   r  )rt   r,  )rl   r   r{   r   r   r   rh  ri  rj  rf  rm  rn  rp  rr  rs  s                  r*   r   zDeltaValue.write  s    k*	I&.
i'>)>>'9$q([ :&(((U
a
U 	#EEME%$,501Cz""3'"
U	# B;s# r,   c                 T    |j                  ||d|fgz          |j                          y r   r   r   r   s         r*   r   zDeltaValue.xmlWrite  +    D%GU+;*<"<=r,   c                     t        |d         S r   r   r   s       r*   r   zDeltaValue.xmlRead      g''r,   r&   rO   rc   rd   rz   r   r   r   rb   r,   r*   rf  rf    s    .$*(r,   rf  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EntryFormatr   r   r  l    r  0   r   r   r  rF  r   )r?  r)  readUInt24Arrayr  )rl   rv   r{   r   fmtrm  	innerBits	innerMask	outerMask
outerShift	entrySizer   raws                r*   rz   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  r   r   r  r  r  r   r  l      )setValuert   rC  r/  writeUInt24Arrayr  )rl   r   r{   r   r   r   r  r  r  r  r  r  r   idxs                 r*   r   zVarIdxMapValue.write  s    &~''G5v&	)^q(	)^
#,1,-	%%&&&&%%	

 
 	 # #
2sYG	
s   =Br&   r  rb   r,   r*   r}  r}    s    
,
r,   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 )Nr   	NumShorts     )boolr   r  r5  r_  r
  r   )rl   rv   r{   r   rM   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r*   rz   zVarDataValue.read  s     01k*	 V+,	&	+1+?+?AVAV.L+1+@+@&BVBV.L[),c+y.IBl2&'nR"W-.{|$r,   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 )Nr   r  r  r  r  r   )r  r!  r9  r   r_  r
  writeSmallArray)rl   r   r{   r   rM   r   r  r  r  writeBigArrayr  r  r  s                r*   r   zVarDataValue.write  s     01k*	 V+,	&	 **F,A,AB((&*@*@A,
 ,(
 [),c+y.IBfSbk"r+./""A3"{*:#;< r,   c                 T    |j                  ||d|fgz          |j                          y r   rv  r   s         r*   r   zVarDataValue.xmlWrite#  rw  r,   c                     t        |d         S r   ry  r   s       r*   r   zVarDataValue.xmlRead'  rz  r,   r&   r{  rb   r,   r*   r  r    s    .=&(r,   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]r}  )r   rQ   rR  r~  r   r  s          r*   r   zLookupFlag.xmlWrite,  s    D%GU+;*<"<=4<LL'4<LL+,4<LL*+4<LL'4<LL./6>LL1UaZ@Achhuo.r,   NrS  rb   r,   r*   r  r  +  s    r,   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  rz   )rl   rv   r{   r   r  s       r*   rz   z_UInt8Enum.readC  s    ~~egl64CDDr,   c                 J    t        | j                  |j                               S r&   )r  r  upperr  s     r*   r   z_UInt8Enum.fromStringF  s    s}}ekkm44r,   c                 T    | j                  |      j                  j                         S r&   )r  rW   lowerr  s     r*   r   z_UInt8Enum.toStringJ  s     }}U#((..00r,   )
rO   rc   rd   r   r  rz   r  r   r   r  r  s   @r*   r  r  @  s6    IE 5 5 1 1r,   r  c                       e Zd ZeZy)r   N)rO   rc   rd   _ExtendModer  rb   r,   r*   r   r   O  s    Ir,   r   c                       e Zd ZeZy)r    N)rO   rc   rd   _CompositeModer  rb   r,   r*   r    r    S  s    Ir,   r    int8int16r3   r/   uint24r4   char64r  OffsetLOffsetOffset24r>   c                 $    t        t        |       S N)rK   )r#   rD  Cs    r*   r+   r+         79; r,   c                 $    t        t        |       S r  )r#   r  r  s    r*   r+   r+     s    1HUV)W r,   c                 $    t        t        |       S r  )r#   r  r  s    r*   r+   r+     r  r,   c                 $    t        t        |       S r  )r#   rN   r  s    r*   r+   r+     s    '%A6 r,   c                 $    t        t        |       S r  )r#   r  r  s    r*   r+   r+     s    76a8 r,   c                 $    t        t        |       S r  )r#   r  r  s    r*   r+   r+     s    WW; r,   )	r?   r@   r   rD  r  r  OffsetTo	LOffsetToLOffset24To)wfontTools.misc.fixedToolsr   r  r   r  r   r  r   r  r   r  r   r  fontTools.misc.roundToolsr	   r
   fontTools.misc.textToolsr   r   r   r   r   fontTools.ttLibr   rB  r   r   r   r   r   otTablesr   r   r   r   r   r   r   r   r   r  r    r  r!   	itertoolsr"   	functoolsr#   r   r  typingr$   logging	getLoggerrO   ru  r  r_   r(   ra   collectionsrf   ImportErrorrh   objectr   r   r   r   r   r  r  r  r  r#  r1  r;  rE  rO  rD   rE   rF   rZ  r`  rn  rq  ry  r  r  r  r  r  r  r  r  r  rI   rG   rN   r  r  r7   r5   r6   r8   r.   r9  rD  r  r  r  rM  r]  rf  r}  r  r  r  rH   rb   r,   r*   <module>r     s0    K M M *     "  	    g!
(=(@5 "$
" "<\F \~/- /"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 *1 1 J /
D/ U/ U	/
 f/ f/ e/ f/ w/ / w/ 
3/ w/ / f/  *!/" U#/$ w%/& U'/( ;)/* f+/, e-/. v//0 1/2 ;3/4 *5/6 n7/8 L9/: *;/< *=/> ]?/@ A/D ;E/F ;G/H !I/J %!);W;68;]/ K7  "!!"s   N NN