+
    i!                    0   ^ RI t ^ RIHt ^ RIHt ^ RIHt ^ RIHtH	t	 ^ RI
Ht ^ RItRt. RNRNR	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5NR6NR7NR8NR9NR:NR;NR<NR=NR>NR?NR@NRANRBNRCNRDNRENRFNRGNRHNtRI t]! . RJNRKNRLNRMNRNNRONRPNRQNRRNRSNRTNRUNRVNRWNRXNRYNRZNR[NR\NR]NR^NR_NR`NRaNRbNRcNRdNReNRfNRgNRhNRiNRjNRkNRlNRmNRnNRoNRpNRqNRrNRsNRtNRuNRvNRwNRxNRyNRzNR{NR|NR}N4      tR~ t ! R R]4      t ! R R@]4      t ! R R%]4      t ! R R	]4      t ! R R]4      t ! R R
]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t  ! R R]4      t! ! R R]4      t" ! R RE]4      t# ! R R]4      t$ ! R R]4      t% ! R R]4      t& ! R R]4      t' ! R R]4      t( ! R R]4      t) ! R R]4      t* ! R R]4      t+ ! R R]4      t, ! R R]4      t- ! R R"]4      t. ! R R']4      t/ ! R R*]4      t0 ! R R+]4      t1 ! R R,]4      t2 ! R R-]4      t3 ! R R.]4      t4 ! R R(]4      t5 ! R R/]4      t6 ! R R0]4      t7 ! R R1]4      t8 ! R R2]4      t9 ! R R3]4      t: ! R R4]4      t; ! R R5]4      t< ! R R6]4      t= ! R R7]4      t> ! R R:]4      t? ! R R;]4      t@ ! R R>]4      tA ! R R<]4      tB ! R R=]4      tC ! R RD]4      tD ! R RF]4      tE ! R RG]4      tFR tG ! R R8]4      tH ! R R&]H4      tI ! R RC]H4      tJ ! R R?]4      tK ! R R]H4      tL ! R R ]4      tM ! R R]4      tN ! R R9]4      tO ! R R)]4      tP ! R RH]4      tQ ! R RB]4      tR ! R R#]4      tS ! R R$]4      tT ! R RA]4      tU ! R R]4      tV ! R R!]4      tW ! R R]4      tXR# )    N)FeatureLibError)FeatureLibLocation)getEncoding)byteordtobytes)OrderedDictElementFeatureFileComment	GlyphName
GlyphClassGlyphClassNameMarkClassNameAnonymousBlockBlockFeatureBlockNestedBlockLookupBlockGlyphClassDefinitionGlyphClassDefStatement	MarkClassMarkClassDefinitionAlternateSubstStatementAnchorAnchorDefinitionAttachStatementAxisValueLocationStatementBaseAxisCVParametersNameStatementChainContextPosStatementChainContextSubstStatementCharacterStatementConditionsetStatementCursivePosStatementElidedFallbackNameElidedFallbackNameID
ExpressionFeatureNameStatementFeatureReferenceStatementFontRevisionStatement	HheaFieldIgnorePosStatementIgnoreSubstStatementIncludeStatementLanguageStatementLanguageSystemStatementLigatureCaretByIndexStatementLigatureCaretByPosStatementLigatureSubstStatementLookupFlagStatementLookupReferenceStatementMarkBasePosStatementMarkLigPosStatementMarkMarkPosStatementMultipleSubstStatement
NameRecordOS2FieldPairPosStatement ReverseChainSingleSubstStatementScriptStatementSinglePosStatementSingleSubstStatementSizeParameters	StatementSTATAxisValueStatementSTATDesignAxisStatementSTATNameStatementSubtableStatement
TableBlockValueRecordValueRecordDefinition	VheaFieldc                 L    V f   R# RRP                  R V  4       4      ,          # )Nz<device NULL>z<device %s>, c              3   4   "   T F  pR V,          x  K  	  R# 5i)z%d %dN ).0ts   & t/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/fontTools/feaLib/ast.py	<genexpr>!deviceToString.<locals>.<genexpr>U   s     (Ef1fs   )join)devices   &rQ   deviceToStringrV   Q   s$    ~tyy(Ef(EEEE    anchor	anchordefanon	anonymousbycontourcursiverU   enum	enumerateexcludedfltexclude_dfltfeaturefromignoreignorebaseglyphsignoreligaturesignoremarksincludeincludedfltinclude_dfltlanguagelanguagesystemlookup
lookupflagmarkmarkattachmenttype	markclassnameidnull
parameterspospositionrequiredrighttoleft
reversesubrsubscriptsub
substitutesubtabletableusemarkfilteringsetuseextensionvaluerecorddefbasegdefheadhheanamevheavmtxc                 :   \        V R 4      '       d   V P                  4       # \        V \        4      '       dA   \	        V 4      ^8X  d1   \        V ^ ,          4      R,           \        V ^,          4      ,           # V P                  4       \        9   d
   RV ,           # V # )asFeaz - \)hasattrr   
isinstancetuplelenlowerfea_keywords)gs   &rQ   r   r      sn    q'wwy	Au		#a&A+QqT{U"U1Q4[00	
l	"axrW   c                   D   a  ] tR t^t o RtRR ltR tR	R ltR tRt	V t
R# )
r	   z8A base class representing "something" in a feature file.Nc                `    V'       d    \        V\        4      '       g
   \        V!  pWn        R # N)r   r   locationselfr   s   &&rQ   __init__Element.__init__   s!    Jx1CDD)84H rW   c                    R # r   rN   r   builders   &&rQ   buildElement.build   s    rW   c                    \         h)zReturns this element as a string of feature code. For block-type
elements (such as :class:`FeatureBlock`), the `indent` string is
added to the start of each line in the output.)NotImplementedErrorr   indents   &&rQ   r   Element.asFea   s
     "!rW   c                "    V P                  4       # r   r   r   s   &rQ   __str__Element.__str__   s    zz|rW   r   r    )__name__
__module____qualname____firstlineno____doc__r   r   r   r   __static_attributes____classdictcell____classdict__s   @rQ   r	   r	      s!     B!" rW   c                       ] tR t^tRtR# )rB   rN   Nr   r   r   r   r   rN   rW   rQ   rB   rB          rW   c                       ] tR t^tRtR# )r'   rN   Nr   rN   rW   rQ   r'   r'      r   rW   c                   D   a a ] tR t^t oRtRV 3R lltRR ltRtVtV ;t	# )r   zA comment in a feature file.c                :   < \         \        V `  V4       Wn        R # r   )superr   r   text)r   r   r   	__class__s   &&&rQ   r   Comment.__init__   s    gt%h/	rW   c                    V P                   # r   r   r   s   &&rQ   r   Comment.asFea   s    yyrW   r   r   r   
r   r   r   r   r   r   r   r   r   __classcell__r   r   s   @@rQ   r   r      s     &
 rW   c                   >   a  ] tR t^t o RtRR ltR tRR ltRtV t	R# )		NullGlyphz5The NULL glyph, used in glyph deletion substitutions.Nc                0    \         P                  W4       R # r   )r'   r   r   s   &&rQ   r   NullGlyph.__init__   s    D+rW   c                    R# )BThe glyphs in this class as a tuple of :class:`GlyphName` objects.rN   rN   r   s   &rQ   glyphSetNullGlyph.glyphSet   s    	rW   c                    R # )NULLrN   r   s   &&rQ   r   NullGlyph.asFea   s    rW   rN   r   r   
r   r   r   r   r   r   r   r   r   r   r   s   @rQ   r   r      s     ?, rW   r   c                   >   a  ] tR t^t o RtRR ltR tRR ltRtV t	R# )	r   z)A single glyph name, such as ``cedilla``.Nc                <    \         P                  W4       Wn        R # r   )r'   r   glyph)r   r   r   s   &&&rQ   r   GlyphName.__init__   s    D+
rW   c                    V P                   3# r   r   r   s   &rQ   r   GlyphName.glyphSet   s    

}rW   c                ,    \        V P                  4      # r   )r   r   r   s   &&rQ   r   GlyphName.asFea   s    TZZ  rW   r   r   r   r   r   s   @rQ   r   r      s     3
! !rW   c                   \   a  ] tR t^t o RtRR ltR tRR ltR tR t	R t
R	 tR
 tRtV tR# )r   z1A glyph class, such as ``[acute cedilla grave]``.Nc                f    \         P                  W4       Ve   TM. V n        . V n        ^ V n        R # r   )r'   r   glyphsoriginalcurr)r   r   r   s   &&&rQ   r   GlyphClass.__init__   s,    D+ & 2f	rW   c                ,    \        V P                  4      # r   )r   r   r   s   &rQ   r   GlyphClass.glyphSet   s    T[[!!rW   c                   \        V P                  4      '       d   V P                  \        V P                  4      8  dM   V P                  P	                  V P                  V P                  R  4       \        V P                  4      V n        RRP                  \        \        V P                  4      4      ,           R,           # RRP                  \        \        V P                  4      4      ,           R,           # )N[ ])r   r   r   r   extendrT   mapr   r   s   &&rQ   r   GlyphClass.asFea   s    t}}yy3t{{++$$T[[%=>,	#eT]]";<<sBB#eT[["9::S@@rW   c                <    V P                   P                  V4       R# )z6Add a list of :class:`GlyphName` objects to the class.N)r   r   )r   r   s   &&rQ   r   GlyphClass.extend   s    6"rW   c                <    V P                   P                  V4       R# )z4Add a single :class:`GlyphName` object to the class.N)r   append)r   r   s   &&rQ   r   GlyphClass.append  s    5!rW   c                T   V P                   \        V P                  4      8  d3   V P                  P	                  V P                  V P                   R 4       V P                  P                  W34       V P                  P	                  V4       \        V P                  4      V n         R# )zAdd a range (e.g. ``A-Z``) to the class. ``start`` and ``end``
are either :class:`GlyphName` objects or strings representing the
start and end glyphs in the class, and ``glyphs`` is the full list of
:class:`GlyphName` objects in the range.N)r   r   r   r   r   r   r   startendr   s   &&&&rQ   	add_rangeGlyphClass.add_range  sp    
 99s4;;''MM  TYY[!9:e\*6"$	rW   c                   V P                   \        V P                  4      8  d3   V P                  P	                  V P                  V P                   R 4       V P                  P                  RP                  V4      RP                  V4      34       V P                  P	                  V4       \        V P                  4      V n         R# )zAdd a range to the class by glyph ID. ``start`` and ``end`` are the
initial and final IDs, and ``glyphs`` is the full list of
:class:`GlyphName` objects in the range.Nz\{})r   r   r   r   r   r   formatr   s   &&&&rQ   add_cid_rangeGlyphClass.add_cid_range  s     99s4;;''MM  TYY[!9:fmmE2FMM#4FGH6"$	rW   c                n   V P                   \        V P                  4      8  d3   V P                  P	                  V P                  V P                   R 4       V P                  P                  V4       V P                  P	                  VP                  4       4       \        V P                  4      V n         R# )zFAdd glyphs from the given :class:`GlyphClassName` object to the
class.N)r   r   r   r   r   r   r   )r   gcs   &&rQ   	add_classGlyphClass.add_class  st     99s4;;''MM  TYY[!9:R 2;;=)$	rW   )r   r   r   NNr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @rQ   r   r      s6     ;"A#"	%%% %rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i$  zuA glyph class name, such as ``@FRENCH_MARKS``. This must be instantiated
with a :class:`GlyphClassDefinition` object.Nc                l    \         P                  W4       \        V\        4      '       g   Q hWn        R # r   )r'   r   r   r   
glyphclass)r   r  r   s   &&&rQ   r   GlyphClassName.__init__(  s)    D+*&:;;;;$rW   c                H    \        V P                  P                  4       4      # r   )r   r  r   r   s   &rQ   r   GlyphClassName.glyphSet-  s    T__--/00rW   c                <    R V P                   P                  ,           # @)r  r   r   s   &&rQ   r   GlyphClassName.asFea1  s    T__))))rW   )r  r   r   r   r   s   @rQ   r   r   $  s     4%
1* *rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i5  zA mark class name, such as ``@FRENCH_MARKS`` defined with ``markClass``.
This must be instantiated with a :class:`MarkClass` object.Nc                l    \         P                  W4       \        V\        4      '       g   Q hWn        R # r   )r'   r   r   r   	markClass)r   r  r   s   &&&rQ   r   MarkClassName.__init__9  s(    D+)Y////"rW   c                6    V P                   P                  4       # r   )r  r   r   s   &rQ   r   MarkClassName.glyphSet>  s    ~~&&((rW   c                <    R V P                   P                  ,           # r  )r  r   r   s   &&rQ   r   MarkClassName.asFeaB  s    T^^((((rW   )r  r   r   r   r   s   @rQ   r   r   5  s     C#
)) )rW   c                   8   a  ] tR tRt o RtRR ltRR ltRtV tR# )	r   iF  zAn anonymous data block.Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   tagcontent)r   r  r  r   s   &&&&rQ   r   AnonymousBlock.__init__I  s    4*rW   c                    R P                  V P                  4      pW P                  ,          pVRP                  V P                  4      ,          pV# )zanon {} {{
z}} {};

)r   r  r  r   r   ress   && rQ   r   AnonymousBlock.asFeaN  s@    ##DHH-|||""488,,
rW   )r  r  r   r   	r   r   r   r   r   r   r   r   r   r   s   @rQ   r   r   F  s     "
 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   iU  z,A block of statements: feature, lookup, etc.Nc                >    \         P                  W4       . V n        R # r   )rB   r   
statementsr   s   &&rQ   r   Block.__init__X  s    4*rW   c                N    V P                    F  pVP                  V4       K  	  R# )zWhen handed a 'builder' object of comparable interface to
:class:`fontTools.feaLib.builder`, walks the statements in this
block, calling the builder callbacks.N)r  r   )r   r   ss   && rQ   r   Block.build\  s     AGGG !rW   c           
         V\         ,          pTR V,           P                  V P                   Uu. uF  q"P                  VR7      NK  	  up4      ,           R ,           # u upi )
r   )SHIFTrT   r  r   )r   r   r"  s   && rQ   r   Block.asFeac  sR    %f}""DOO#TOqGG6G$:O#TUV	
#Ts   A
)r  r   r   
r   r   r   r   r   r   r   r   r   r   r   s   @rQ   r   r   U  s     6
 
rW   c                   4   a  ] tR tRt o RtR tRR ltRtV tR# )r
   il  zlThe top-level element of the syntax tree, containing the whole feature
file in its ``statements`` attribute.c                B    \         P                  V R R7       / V n        R # )Nr   )r   r   markClassesr   s   &rQ   r   FeatureFile.__init__p  s    td+rW   c                N   a R P                  V3R lV P                   4       4      # )r%  c              3   F   <"   T F  qP                  SR 7      x  K  	  R# 5i)r&  Nr   )rO   r"  r   s   & rQ   rR   $FeatureFile.asFea.<locals>.<genexpr>u  s     IA//s   !)rT   r  r   s   &frQ   r   FeatureFile.asFeat  s    yyIIIIrW   )r,  Nr   r  r   s   @rQ   r
   r
   l  s     -J JrW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   ix  zA named feature block.Nc                L    \         P                  W4       WuV n        V n        R # r   r   r   r   use_extensionr   r   r5  r   s   &&&&rQ   r   FeatureBlock.__init__{      t&(,%	4%rW   c                l   VP                  V P                  V P                  V P                  4       VP                  p/ Vn        \
        P                  W4       VP                  P                  4        F&  w  r4VP                  V. 4      P                  V4       K(  	  W!n        VP                  4        R# )Call the ``start_feature`` callback on the builder object, visit
all the statements in this feature, and then call ``end_feature``.N)start_featurer   r   r5  	features_r   r   items
setdefaultr   end_feature)r   r   featureskeyvalues   &&   rQ   r   FeatureBlock.build  s     	dmmTYY8J8JK $$D"!++113JCR(//6 4$rW   c                4   VR V P                   P                  4       ,          ,           pV P                  '       d
   VR,          pVR,          pV\        P	                  WR7      ,          pW!RV P                   P                  4       ,          ,           ,          pV# )zfeature %s useExtension {
r&  } %s;
)r   stripr5  r   r   r  s   && rQ   r   FeatureBlock.asFea  sr    }tyy'888?"Cuu{{4{//	DIIOO$5555
rW   r   r5  FNr   r)  r   s   @rQ   r   r   x  s      < rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i  zUA block inside another block, for example when found inside a
``cvParameters`` block.Nc                H    \         P                  W4       Wn        W n        R # r   )r   r   r  
block_name)r   r  rN  r   s   &&&&rQ   r   NestedBlock.__init__  s    t&$rW   c                    \         P                  W4       V P                  R 8X  d   VP                  V P                  4       R# R# )ParamUILabelNameIDN)r   r   rN  add_to_cv_num_named_paramsr  r   s   &&rQ   r   NestedBlock.build  s2    D"??22..txx8 3rW   c                    R P                  WP                  4      pV\        P                  WR7      ,          pVRP                  V4      ,          pV# )z{}{} {{
r&  z{}}};
)r   rN  r   r   r  s   && rQ   r   NestedBlock.asFea  sE      9u{{4{//y''
rW   )rN  r  r   r   r)  r   s   @rQ   r   r     s     %
9
 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i  z*A named lookup, containing ``statements``.Nc                L    \         P                  W4       WuV n        V n        R # r   r4  r6  s   &&&&rQ   r   LookupBlock.__init__  r8  rW   c                    VP                  V P                  V P                  V P                  4       \        P                  W4       VP                  4        R # r   )start_lookup_blockr   r   r5  r   r   end_lookup_blockr   s   &&rQ   r   LookupBlock.build  s:    ""4==$))T=O=OPD"  "rW   c                   R P                  V P                  4      pV P                  '       d
   VR,          pVR,          pV\        P	                  WR7      ,          pVRP                  WP                  4      ,          pV# )z
lookup {} rE  rF  r&  z	{}}} {};
)r   r   r5  r   r   r  s   && rQ   r   LookupBlock.asFea  sh    !!$)),?"Cuu{{4{//|""69955
rW   rJ  rK  r   r)  r   s   @rQ   r   r     s     4<#
 rW   c                   D   a a ] tR tRt oRtRR ltRV 3R lltRtVtV ;t	# )rG   i  zA ``table ... { }`` block.c                <    \         P                  W4       Wn        R # r   )r   r   r   )r   r   r   s   &&&rQ   r   TableBlock.__init__  s    t&	rW   c                   < R P                  V P                  P                  4       4      pV\        \        V `  VR7      ,          pVRP                  V P                  P                  4       4      ,          pV# )ztable {} {{
r&  z}} {};
)r   r   rH  r   rG   r   )r   r   r  r   s   && rQ   r   TableBlock.asFea  s\    $$TYY__%67uZ,F,;;z  !233
rW   )r   r   r   r   r   s   @@rQ   rG   rG     s     $ rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i  z!Example: ``@UPPERCASE = [A-Z];``.Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   r   r   )r   r   r   r   s   &&&&rQ   r   GlyphClassDefinition.__init__  s    4*	rW   c                H    \        V P                  P                  4       4      # r   )r   r   r   r   s   &rQ   r   GlyphClassDefinition.glyphSet  s    T[[))+,,rW   c                    R V P                   ,           R,           V P                  P                  4       ,           R,           # )r	  z = ;)r   r   r   r   s   &&rQ   r   GlyphClassDefinition.asFea  s,    TYY&):):)<<sBBrW   )r   r   r   r   r   r   s   @rQ   r   r     s     +
-C CrW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i  zExample: ``GlyphClassDef @UPPERCASE, [B], [C], [D];``. The parameters
must be either :class:`GlyphClass` or :class:`GlyphClassName` objects, or
``None``.Nc                d    \         P                  W4       WuV n        V n        W0n        W@n        R # r   )rB   r   
baseGlyphs
markGlyphsligatureGlyphscomponentGlyphs)r   rn  ro  rp  rq  r   s   &&&&&&rQ   r   GlyphClassDefStatement.__init__  s,     	4*,6(,.rW   c                   V P                   '       d   V P                   P                  4       M	\        4       pV P                  '       d   V P                  P                  4       M	\        4       pV P                  '       d   V P                  P                  4       M	\        4       pV P
                  '       d   V P
                  P                  4       M	\        4       pVP                  V P                  W#WE4       R# )z3Calls the builder's ``add_glyphClassDef`` callback.N)rn  r   r   rp  ro  rq  add_glyphClassDefr   )r   r   r   ligarp   comps   &&    rQ   r   GlyphClassDefStatement.build  s    -1___t'')%'151D1D1Dt""++-%'-1___t'')%'262F2F2Ft##,,.EG!!$--THrW   c                   R P                  V P                  '       d   V P                  P                  4       MRV P                  '       d   V P                  P                  4       MRV P                  '       d   V P                  P                  4       MRV P
                  '       d   V P
                  P                  4       4      # R4      # )zGlyphClassDef {}, {}, {}, {};r   )r   rn  r   rp  ro  rq  r   s   &&rQ   r   GlyphClassDefStatement.asFea  s    .55'+DOO!!#B+/+>+>+>D%%'B'+DOO!!#B,0,@,@,@D  &&(	
 	
 GI	
 	
rW   )rn  rq  rp  ro  r   r   r)  r   s   @rQ   r   r     s     /I
 
rW   c                   @   a  ] tR tRt o RtR tR tR tR	R ltRt	V t
R# )
r   i  a  One `or more` ``markClass`` statements for the same mark class.

While glyph classes can be defined only once, the feature file format
allows expanding mark classes with multiple definitions, each using
different glyphs and anchors. The following are two ``MarkClassDefinitions``
for the same ``MarkClass``::

    markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
    markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

The ``MarkClass`` object is therefore just a container for a list of
:class:`MarkClassDefinition` statements.
c                >    Wn         . V n        \        4       V n        R # r   )r   definitionsr   r   )r   r   s   &&rQ   r   MarkClass.__init__  s    	!mrW   c                   \        V\        4      '       g   Q hV P                  P                  \        P
                  ! V4      4       VP                  4        Fh  pW P                  9   dH   V P                  V,          P                  pVf   RpMRV 2p\        RV: RV: 2VP                  4      hWP                  V&   Kj  	  R# )z@Add a :class:`MarkClassDefinition` statement to this mark class.Nr   z at zGlyph z already defined)
r   r   r|  r   weakrefproxyr   r   r   r   )r   
definitionr   otherLocr   s   &&   rQ   addDefinitionMarkClass.addDefinition  s    *&9::::j 9:((*E#;;u-66#C 
+C%493?ATAT  ",KK +rW   c                H    \        V P                  P                  4       4      # r   )r   r   keysr   s   &rQ   r   MarkClass.glyphSet"  s    T[[%%'((rW   c                J    R P                  R V P                   4       4      pV# )r%  c              3   @   "   T F  qP                  4       x  K  	  R # 5ir   r   )rO   ds   & rQ   rR   "MarkClass.asFea.<locals>.<genexpr>'  s     <+;a		+;   )rT   r|  r  s   && rQ   r   MarkClass.asFea&  s!    ii<4+;+;<<
rW   )r|  r   r   Nr   )r   r   r   r   r   r   r  r   r   r   r   r   s   @rQ   r   r     s#     $
, ) rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i+  a  A single ``markClass`` statement. The ``markClass`` should be a
:class:`MarkClass` object, the ``anchor`` an :class:`Anchor` object,
and the ``glyphs`` parameter should be a `glyph-containing object`_ .

Example:

    .. code:: python

        mc = MarkClass("FRENCH_ACCENTS")
        mc.addDefinition( MarkClassDefinition(mc, Anchor(350, 800),
            GlyphClass([ GlyphName("acute"), GlyphName("grave") ])
        ) )
        mc.addDefinition( MarkClassDefinition(mc, Anchor(350, -200),
            GlyphClass([ GlyphName("cedilla") ])
        ) )

        mc.asFea()
        # markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
        # markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

Nc                    \         P                  W4       \        V\        4      '       g   Q h\        V\        4      '       d   \        V\
        4      '       g   Q hWVuV n        V n        V n        R # r   )	rB   r   r   r   r   r'   r  rX   r   )r   r  rX   r   r   s   &&&&&rQ   r   MarkClassDefinition.__init__B  sV    4*)Y////&&))j.L.LLL3<f0T[rW   c                6    V P                   P                  4       # r   )r   r   r   s   &rQ   r   MarkClassDefinition.glyphSetH  s    {{##%%rW   c                    R P                  V P                  P                  4       V P                  P                  4       V P                  P
                  4      # )zmarkClass {} {} @{};)r   r   r   rX   r  r   r   s   &&rQ   r   MarkClassDefinition.asFeaL  s@    %,,KK!2!2!4dnn6I6I
 	
rW   )rX   r   r  r   r   r   r   s   @rQ   r   r   +  s     ,M&
 
rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   iR  zA ``sub ... from ...`` statement.

``glyph`` and ``replacement`` should be `glyph-containing objects`_.
``prefix`` and ``suffix`` should be lists of `glyph-containing objects`_.Nc                f    \         P                  W4       WVuV n        V n        V n        W@n        R # r   )rB   r   prefixr   suffixreplacement)r   r  r   r  r  r   s   &&&&&&rQ   r    AlternateSubstStatement.__init__X  s*    4*06v,TZ&rW   c                   V P                   P                  4       p\        V4      ^8X  g   Q V4       h\        V4      ^ ,          pV P                   Uu. uF  q3P                  4       NK  	  ppV P
                   Uu. uF  qUP                  4       NK  	  ppV P                  P                  4       pVP                  V P                  WBWg4       R# u upi u upi )z5Calls the builder's ``add_alternate_subst`` callback.N)	r   r   r   listr  r  r  add_alternate_substr   )r   r   r   pr  r"  r  r  s   &&      rQ   r   AlternateSubstStatement.build]  s    

##%5zQ%%UA(,41**,4(,41**,4&&//1##DMM6&V 54s   C:Cc                   R p\        V P                  4      '       g   \        V P                  4      '       d   \        V P                  4      '       d8   VRP                  \	        \
        V P                  4      4      R,           ,          pV\        V P                  4      R,           ,          p\        V P                  4      '       d8   VRRP                  \	        \
        V P                  4      4      ,           ,          pMV\        V P                  4      ,          pVR,          pV\        V P                  4      ,          pVR,          pV# )sub r   'z from rj  )r   r  r  rT   r   r   r   r  r  s   && rQ   r   AlternateSubstStatement.asFeag  s    t{{s4;;//4;;sxxE4;; 783>>5$s**C4;;sSXXc%&=>>>5$$CxuT%%&&s

rW   )r   r  r  r  r   r   r)  r   s   @rQ   r   r   R  s      Q
'
W rW   c                   8   a  ] tR tRt o RtRR ltRR ltRtV tR# )	r   iw  zAn ``Anchor`` element, used inside a ``pos`` rule.

If a ``name`` is given, this will be used in preference to the coordinates.
Other values should be integer.
Nc                    \         P                  W4       W0n        WVuV n        V n        V n        WVuV n        V n        R # r   )r'   r   r   xycontourpointxDeviceTableyDeviceTable)r   r  r  r   r  r  r  r   s   &&&&&&&&rQ   r   Anchor.__init__~  s<     	D+	,-,))/;,4,rW   c                   V P                   e   RP                  V P                   4      # RP                  V P                  V P                  4      pV P                  '       d#   VRP                  V P                  4      ,          pV P
                  '       g   V P                  '       dK   VR,          pV\        V P
                  4      ,          pVR,          pV\        V P                  4      ,          pVR,          pV# )Nz<anchor {}>z<anchor {} {} contourpoint {}r   >)r   r   r  r  r  r  r  rV   r  s   && rQ   r   Anchor.asFea  s    99  ''		22$$TVVTVV4%,,T->->??C 1 1 13JC>$"3"344C3JC>$"3"344Cs

rW   )r  r   r  r  r  r  )NNNNNr   r  r   s   @rQ   r   r   w  s     J rW   c                   8   a  ] tR tRt o RtRR ltRR ltRtV tR# )	r   i  zCA named anchor definition. (2.e.viii). ``name`` should be a string.Nc                j    \         P                  W4       WW43w  V n        V n        V n        V n        R # r   )rB   r   r   r  r  r  )r   r   r  r  r  r   s   &&&&&&rQ   r   AnchorDefinition.__init__  s,    4*7;7O4	46464#4rW   c                    R P                  V P                  V P                  4      pV P                  '       d#   VRP                  V P                  4      ,          pVRP                  V P                  4      ,          pV# )zanchorDef {} {}r  z {};)r   r  r  r  r   r  s   && rQ   r   AnchorDefinition.asFea  s`    &&tvvtvv6%,,T->->??Cv}}TYY''
rW   )r  r   r  r  r   r   r  r   s   @rQ   r   r     s     MP rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i  z&A ``GDEF`` table ``Attach`` statement.Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   r   contourPoints)r   r   r  r   s   &&&&rQ   r   AttachStatement.__init__  s    4**rW   c                    V P                   P                  4       pVP                  V P                  W P                  4       R# )z3Calls the builder's ``add_attach_points`` callback.N)r   r   add_attach_pointsr   r  r   r   r   s   && rQ   r   AttachStatement.build  s.    %%'!!$--9K9KLrW   c                    R P                  V P                  P                  4       RP                  R V P                   4       4      4      # )zAttach {} {};r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   str)rO   cs   & rQ   rR   (AttachStatement.asFea.<locals>.<genexpr>  s     )M:LQ#a&&:L   )r   r   r   rT   r  r   s   &&rQ   r   AttachStatement.asFea  s<    %%KK)M$:L:L)M!M
 	
rW   )r  r   r   r   r)  r   s   @rQ   r   r     s     0+
M

 
rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r    i  a  A chained contextual positioning statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_ .

``lookups`` should be a list of elements representing what lookups
to apply at each glyph position. Each element should be a
:class:`LookupBlock` to apply a single chaining lookup at the given
position, a list of :class:`LookupBlock`\ s to apply multiple
lookups, or ``None`` to apply no lookup. The length of the outer
list should equal the length of ``glyphs``; the inner lists can be
of variable length.Nc                   \         P                  W4       WVuV n        V n        V n        \        V4      V n        \        V4       F  w  rgV'       g   K   \        V4       K  	  R #   \         d    T.T P                  T&    K?  i ; ir   
rB   r   r  r   r  r  lookupsr`   iter	TypeErrorr   r  r   r  r  r   irn   s   &&&&&&  rQ   r   !ChainContextPosStatement.__init__  q    4*06-T[$+G}"7+IAv/L , ! /'-hDLLO/   A''BBc                b   V P                    Uu. uF  q"P                  4       NK  	  ppV P                   Uu. uF  qDP                  4       NK  	  ppV P                   Uu. uF  qfP                  4       NK  	  ppVP	                  V P
                  W5WpP                  4       R# u upi u upi u upi )z7Calls the builder's ``add_chain_context_pos`` callback.N)r  r   r   r  add_chain_context_posr   r  r   r   r  r  r   r   r"  r  s   &&      rQ   r   ChainContextPosStatement.build  s~    (,41**,4(,41**,4(,41**,4%%MM66<<	
 544   B"B'B,c                   R p\        V P                  4      '       gI   \        V P                  4      '       g.   \        V P                   Uu. uF  q3RJNK  	  up4      '       EdS   \        V P                  4      '       d1   VRP                  R V P                   4       4      R,           ,          p\        V P                  4       F  w  rEW%P                  4       R,           ,          pV P                  V,          '       d5   V P                  V,           F  pVRVP                  ,           ,          pK  	  V\        V P                  4      ^,
          8  g   K  VR,          pK  	  \        V P                  4      '       d8   VRRP                  \        \        V P                  4      4      ,           ,          pM0VRP                  \        \        V P                  4      4      ,          pVR,          pV# u upi )pos Nr   c              3   @   "   T F  qP                  4       x  K  	  R # 5ir   r   rO   r   s   & rQ   rR   1ChainContextPosStatement.asFea.<locals>.<genexpr>       ?;a		;r  r   lookup rj  r   r  r  anyr  rT   r`   r   r   r   r   r   r   r  r  r  r   lus   &&     rQ   r   ChainContextPosStatement.asFea  V   4;;4<<8<aTM<8994;;sxx?4;;??#EE!$++.wwy3&<<??"ll1oozBGG33 .s4;;'!++3JC / 4;;sSXXc%&=>>>388Ct{{344Cs

! 9   G3r   r  r  r  r   r   r)  r   s   @rQ   r    r           	/
 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r!   i  a  A chained contextual substitution statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_ .

``lookups`` should be a list of elements representing what lookups
to apply at each glyph position. Each element should be a
:class:`LookupBlock` to apply a single chaining lookup at the given
position, a list of :class:`LookupBlock`\ s to apply multiple
lookups, or ``None`` to apply no lookup. The length of the outer
list should equal the length of ``glyphs``; the inner lists can be
of variable length.Nc                   \         P                  W4       WVuV n        V n        V n        \        V4      V n        \        V4       F  w  rgV'       g   K   \        V4       K  	  R #   \         d    T.T P                  T&    K?  i ; ir   r  r  s   &&&&&&  rQ   r   #ChainContextSubstStatement.__init__  r  r  c                b   V P                    Uu. uF  q"P                  4       NK  	  ppV P                   Uu. uF  qDP                  4       NK  	  ppV P                   Uu. uF  qfP                  4       NK  	  ppVP	                  V P
                  W5WpP                  4       R# u upi u upi u upi )z9Calls the builder's ``add_chain_context_subst`` callback.N)r  r   r   r  add_chain_context_substr   r  r  s   &&      rQ   r    ChainContextSubstStatement.build  s~    (,41**,4(,41**,4(,41**,4''MM66<<	
 544r  c                   R p\        V P                  4      '       gI   \        V P                  4      '       g.   \        V P                   Uu. uF  q3RJNK  	  up4      '       EdS   \        V P                  4      '       d1   VRP                  R V P                   4       4      R,           ,          p\        V P                  4       F  w  rEW%P                  4       R,           ,          pV P                  V,          '       d5   V P                  V,           F  pVRVP                  ,           ,          pK  	  V\        V P                  4      ^,
          8  g   K  VR,          pK  	  \        V P                  4      '       d8   VRRP                  \        \        V P                  4      4      ,           ,          pM0VRP                  \        \        V P                  4      4      ,          pVR,          pV# u upi )r  Nr   c              3   @   "   T F  qP                  4       x  K  	  R # 5ir   r   r  s   & rQ   rR   3ChainContextSubstStatement.asFea.<locals>.<genexpr>"  r  r  r  r  rj  r  r  s   &&     rQ   r    ChainContextSubstStatement.asFea  r  r  r  r   r   r)  r   s   @rQ   r!   r!     r  rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r$   i2  zjA cursive positioning statement. Entry and exit anchors can either
be :class:`Anchor` objects or ``None``.Nc                X    \         P                  W4       Wn        W#uV n        V n        R # r   )rB   r   r  entryAnchor
exitAnchor)r   r  r  r  r   s   &&&&&rQ   r   CursivePosStatement.__init__6  s$    4*$,7)$/rW   c                    VP                  V P                  V P                  P                  4       V P                  V P
                  4       R# )z8Calls the builder object's ``add_cursive_pos`` callback.N)add_cursive_posr   r  r   r  r  r   s   &&rQ   r   CursivePosStatement.build;  s4    MM4??335t7G7G	
rW   c                   V P                   '       d   V P                   P                  4       MR pV P                  '       d   V P                  P                  4       MR pRP                  V P                  P                  4       W#4      # )<anchor NULL>zpos cursive {} {} {};)r  r   r  r   r  )r   r   entryexits   &&  rQ   r   CursivePosStatement.asFeaA  s_    ,0,<,<,<  &&(/*.///t$$&&--doo.C.C.EuSSrW   )r  r  r  r   r   r)  r   s   @rQ   r$   r$   2  s!     /D

T TrW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r)   iG  zExample: ``feature salt;``Nc                L    \         P                  W4       W!uV n        V n        R # r   )rB   r   r   featureName)r   r  r   s   &&&rQ   r   "FeatureReferenceStatement.__init__J  s    4*+3't'rW   c                R    VP                  V P                  V P                  4       R# )z>Calls the builder object's ``add_feature_reference`` callback.N)add_feature_referencer   r  r   s   &&rQ   r   FeatureReferenceStatement.buildN  s    %%dmmT5E5EFrW   c                8    R P                  V P                  4      # )zfeature {};)r   r  r   s   &&rQ   r   FeatureReferenceStatement.asFeaR  s    ##D$4$455rW   )r  r   r   r   r)  r   s   @rQ   r)   r)   G  s     $BG6 6rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r,   iV  zAn ``ignore pos`` statement, containing `one or more` contexts to ignore.

``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
with each of ``prefix``, ``glyphs`` and ``suffix`` being
`glyph-containing objects`_ .Nc                <    \         P                  W4       Wn        R # r   rB   r   chainContextsr   r  r   s   &&&rQ   r   IgnorePosStatement.__init__]      4**rW   c                @   V P                    F~  w  r#pV Uu. uF  qUP                  4       NK  	  ppV Uu. uF  qfP                  4       NK  	  ppV Uu. uF  qwP                  4       NK  	  ppVP                  V P                  W#V. 4       K  	  R# u upi u upi u upi )zSCalls the builder object's ``add_chain_context_pos`` callback on each
rule context.N)r  r   r  r   r   r   r  r   r  r  r   r"  s   &&      rQ   r   IgnorePosStatement.builda  s     '+&8&8"FF,23FqjjlFF3,23FqjjlFF3,23FqjjlFF3))$--QST	 '9333   BBBc           	     ^   . pV P                    F  w  r4pR p\        V4      '       g   \        V4      '       d   \        V4      '       d.   VRP                  \        \        V4      4      R,           ,          pVRP                  R V 4       4      ,          p\        V4      '       d.   VRRP                  \        \        V4      4      ,           ,          pM&VRP                  \        \        V4      4      ,          pVP                  V4       K  	  RRP                  V4      ,           R,           # )r   r   c              3   N   "   T F  qP                  4       R ,           x  K  	  R# 5ir  Nr   r  s   & rQ   rR   +IgnorePosStatement.asFea.<locals>.<genexpr>q  s     @A	C   #%zignore pos rL   rj  r  r   rT   r   r   r   r   r   contextsr  r   r  r  s   &&     rQ   r   IgnorePosStatement.asFeaj  s    &*&8&8"FFC6{{c&kkv;;388Cv$67#==Csxx@@@@v;;3#eV*<!===CsxxE6 233OOC  '9 tyy22S88rW   r  r   r   r)  r   s   @rQ   r,   r,   V  s     %+U9 9rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r-   iz  zAn ``ignore sub`` statement, containing `one or more` contexts to ignore.

``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
with each of ``prefix``, ``glyphs`` and ``suffix`` being
`glyph-containing objects`_ .Nc                <    \         P                  W4       Wn        R # r   r  r	  s   &&&rQ   r   IgnoreSubstStatement.__init__  r  rW   c                @   V P                    F~  w  r#pV Uu. uF  qUP                  4       NK  	  ppV Uu. uF  qfP                  4       NK  	  ppV Uu. uF  qwP                  4       NK  	  ppVP                  V P                  W#V. 4       K  	  R# u upi u upi u upi )zUCalls the builder object's ``add_chain_context_subst`` callback on
each rule context.N)r  r   r  r   r  s   &&      rQ   r   IgnoreSubstStatement.build  s     '+&8&8"FF,23FqjjlFF3,23FqjjlFF3,23FqjjlFF3++DMM66SUV	 '9333r  c           	        . pV P                    F  w  r4pR p\        V4      '       d.   VRP                  \        \        V4      4      R,           ,          pVRP                  R V 4       4      ,          p\        V4      '       d.   VRRP                  \        \        V4      4      ,           ,          pVP                  V4       K  	  RRP                  V4      ,           R,           # )r   r   c              3   N   "   T F  qP                  4       R ,           x  K  	  R# 5ir  r   r  s   & rQ   rR   -IgnoreSubstStatement.asFea.<locals>.<genexpr>  s     <VGGIOOVr  zignore sub rL   rj  r  r  s   &&     rQ   r   IgnoreSubstStatement.asFea  s    &*&8&8"FFC6{{sxxE6 23c99388<V<<<C6{{sSXXc%&8999OOC  '9 tyy22S88rW   r  r   r   r)  r   s   @rQ   r-   r-   z  s     %+W
9 
9rW   c                   J   a a ] tR tRt oRtRV 3R lltR tRR ltRtVt	V ;t
# )	r.   i  zAn ``include()`` statement.c                :   < \         \        V `  V4       Wn        R # r   )r   r.   r   filename)r   r%  r   r   s   &&&rQ   r   IncludeStatement.__init__  s    .x8 rW   c                .    \        R V P                  4      h)zqBuilding an include statement is not implemented yet. Instead, use Parser(..., followIncludes=True) for building.)r   r   r   s   &rQ   r   IncludeStatement.build  s    JMM
 	
rW   c                6    VR V P                   ,          ,           # )zinclude(%s);r%  r   s   &&rQ   r   IncludeStatement.asFea  s    666rW   r*  r   r   )r   r   r   r   r   r   r   r   r   r   r   r   s   @@rQ   r.   r.     s     %!
7 7rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r/   i  z*A ``language`` statement within a feature.Nc                x    \         P                  W4       \        V4      ^8X  g   Q hWn        W n        W0n        R# )   N)rB   r   r   rl   include_defaultrx   )r   rl   r/  rx   r   s   &&&&&rQ   r   LanguageStatement.__init__  s2    4*8}!!! . rW   c                    VP                  V P                  V P                  V P                  V P                  R7       R# )z4Call the builder object's ``set_language`` callback.)r   rl   r/  rx   N)set_languager   rl   r/  rx   r   s   &&rQ   r   LanguageStatement.build  s3    ]]]] 00]]	 	 	
rW   c                    R P                  V P                  P                  4       4      pV P                  '       g
   VR,          pV P                  '       d
   VR,          pVR,          pV# )zlanguage {}z exclude_dfltz	 requiredrj  )r   rl   rH  r/  rx   r  s   && rQ   r   LanguageStatement.asFea  sV    ""4==#6#6#89###?"C===;Cs

rW   )r/  rl   rx   )TFNr   r)  r   s   @rQ   r/   r/     s     4!
 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r0   i  z)A top-level ``languagesystem`` statement.Nc                L    \         P                  W4       WuV n        V n        R # r   )rB   r   r|   rl   )r   r|   rl   r   s   &&&&rQ   r    LanguageSystemStatement.__init__  s    4*&,"T]rW   c                h    VP                  V P                  V P                  V P                  4       R# )z<Calls the builder object's ``add_language_system`` callback.N)add_language_systemr   r|   rl   r   s   &&rQ   r   LanguageSystemStatement.build  s     ##DMM4;;NrW   c                j    R P                  V P                  V P                  P                  4       4      # )zlanguagesystem {} {};)r   r|   rl   rH  r   s   &&rQ   r   LanguageSystemStatement.asFea  s&    &--dkk4==;N;N;PQQrW   )rl   r|   r   r   r)  r   s   @rQ   r0   r0     s     38OR RrW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r*   i  zA ``head`` table ``FontRevision`` statement. ``revision`` should be a
number, and will be formatted to three significant decimal places.Nc                <    \         P                  W4       Wn        R # r   )rB   r   revision)r   r@  r   s   &&&rQ   r   FontRevisionStatement.__init__  s    4* rW   c                R    VP                  V P                  V P                  4       R # r   )set_font_revisionr   r@  r   s   &&rQ   r   FontRevisionStatement.build  s    !!$--?rW   c                8    R P                  V P                  4      # )zFontRevision {:.3f};)r   r@  r   s   &&rQ   r   FontRevisionStatement.asFea  s    %,,T]];;rW   )r@  r   r   r)  r   s   @rQ   r*   r*     s      J!@< <rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r1   i  zA ``GDEF`` table ``LigatureCaretByIndex`` statement. ``glyphs`` should be
a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                L    \         P                  W4       WuV n        V n        R # r   rB   r   r   caretsr   r   rJ  r   s   &&&&rQ   r   &LigatureCaretByIndexStatement.__init__      4*$* T[rW   c                    V P                   P                  4       pVP                  V P                  V\	        V P
                  4      4       R# )zBCalls the builder object's ``add_ligatureCaretByIndex_`` callback.N)r   r   add_ligatureCaretByIndex_r   setrJ  r  s   && rQ   r   #LigatureCaretByIndexStatement.build  s3    %%'))$--T[[AQRrW   c                    R P                  V P                  P                  4       RP                  R V P                   4       4      4      # )zLigatureCaretByIndex {} {};r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  rO   r  s   & rQ   rR   6LigatureCaretByIndexStatement.asFea.<locals>.<genexpr>       )F+Q#a&&+r  r   r   r   rT   rJ  r   s   &&rQ   r   #LigatureCaretByIndexStatement.asFea  s:    ,33KK)F$++)F!F
 	
rW   rJ  r   r   r   r)  r   s   @rQ   r1   r1     s      R4S

 
rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r2   i  zA ``GDEF`` table ``LigatureCaretByPos`` statement. ``glyphs`` should be
a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                L    \         P                  W4       WuV n        V n        R # r   rI  rK  s   &&&&rQ   r   $LigatureCaretByPosStatement.__init__   rM  rW   c                    V P                   P                  4       pVP                  V P                  V\	        V P
                  4      4       R# )z@Calls the builder object's ``add_ligatureCaretByPos_`` callback.N)r   r   add_ligatureCaretByPos_r   rP  rJ  r  s   && rQ   r   !LigatureCaretByPosStatement.build  s3    %%'''vs4;;?OPrW   c                    R P                  V P                  P                  4       RP                  R V P                   4       4      4      # )zLigatureCaretByPos {} {};r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  rT  s   & rQ   rR   4LigatureCaretByPosStatement.asFea.<locals>.<genexpr>  rV  r  rW  r   s   &&rQ   r   !LigatureCaretByPosStatement.asFea	  s:    *11KK)F$++)F!F
 	
rW   rY  r   r   r)  r   s   @rQ   r2   r2     s      R4Q

 
rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r3   i  a?  A chained contextual substitution statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_; ``replacement`` should be a single
`glyph-containing object`_.

If ``forceChain`` is True, this is expressed as a chaining rule
(e.g. ``sub f' i' by f_i``) even when no context is given.Nc                v    \         P                  W4       WVuV n        V n        V n        WEuV n        V n        R # r   )rB   r   r  r   r  r  
forceChain)r   r  r   r  r  rf  r   s   &&&&&&&rQ   r   LigatureSubstStatement.__init__  s3    4*17-T[$+,7)$/rW   c                x   V P                    Uu. uF  q"P                  4       NK  	  ppV P                   Uu. uF  qDP                  4       NK  	  ppV P                   Uu. uF  qfP                  4       NK  	  ppVP	                  V P
                  W5WpP                  V P                  4       R # u upi u upi u upi r   )r  r   r   r  add_ligature_substr   r  rf  r  s   &&      rQ   r   LigatureSubstStatement.build  s    (,41**,4(,41**,4(,41**,4""MM663C3CT__	
 544s   B-B2B7c                   R p\        V P                  4      '       g.   \        V P                  4      '       g   V P                  '       d   \        V P                  4      '       d1   VRP	                  R V P                   4       4      R,           ,          pVRP	                  R V P
                   4       4      ,          p\        V P                  4      '       d1   VRRP	                  R V P                   4       4      ,           ,          pM)VRP	                  R V P
                   4       4      ,          pVR,          pV\        V P                  4      ,          pVR,          pV# )r  r   c              3   @   "   T F  qP                  4       x  K  	  R # 5ir   r   r  s   & rQ   rR   /LigatureSubstStatement.asFea.<locals>.<genexpr>*  r  r  c              3   N   "   T F  qP                  4       R ,           x  K  	  R# 5ir  r   r  s   & rQ   rR   rm  +  s     A[GGIOO[r  c              3   @   "   T F  qP                  4       x  K  	  R # 5ir   r   r  s   & rQ   rR   rm  -  s     %EAggiir  c              3   @   "   T F  qP                  4       x  K  	  R # 5ir   r   r  s   & rQ   rR   rm  /  s     ;{!GGII{r   by rj  )r   r  r  rf  rT   r   r   r  r  s   && rQ   r   LigatureSubstStatement.asFea&  s    t{{s4;;//4???4;;sxx?4;;??#EE388AT[[AAAC4;;sSXX%E%EEEE388;t{{;;;CvuT%%&&s

rW   )rf  r   r  r  r  r   r   r)  r   s   @rQ   r3   r3     s      BD

 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r4   i6  zA ``lookupflag`` statement. The ``value`` should be an integer value
representing the flags in use, but not including the ``markAttachment``
class and ``markFilteringSet`` values, which must be specified as
glyph-containing objects.Nc                T    \         P                  W4       Wn        W n        W0n        R # r   )rB   r   rB  markAttachmentmarkFilteringSet)r   rB  ru  rv  r   s   &&&&&rQ   r   LookupFlagStatement.__init__<  s#     	4*
, 0rW   c                    RpV P                   e   V P                   P                  4       pRpV P                  e   V P                  P                  4       pVP                  V P                  V P
                  W#4       R# )z8Calls the builder object's ``set_lookup_flag`` callback.N)ru  r   rv  set_lookup_flagr   rB  )r   r   
markAttach
markFilters   &&  rQ   r   LookupFlagStatement.buildD  sf    
*,,557J
  ,..779Jtzz:RrW   c                &   . p. ROp^p\        \        V4      4       F;  pV P                  V,          ^ 8w  d   VP                  W5,          4       V^,          pK=  	  V P                  e9   VP                  RP                  V P                  P                  4       4      4       V P                  e9   VP                  RP                  V P                  P                  4       4      4       V'       g   R.pRP                  RP                  V4      4      # )RightToLeftzMarkAttachmentType {}zUseMarkFilteringSet {}0zlookupflag {};r   )r~  IgnoreBaseGlyphsIgnoreLigaturesIgnoreMarks)	ranger   rB  r   ru  r   r   rv  rT   )r   r   r  flagsr   r  s   &&    rQ   r   LookupFlagStatement.asFeaN  s    Us5z"AzzD A%

58$19D # *JJ.55d6I6I6O6O6QRS  ,JJ/66t7L7L7R7R7TUV%C&&sxx}55rW   )ru  rv  rB  )r   NNNr   r)  r   s   @rQ   r4   r4   6  s     !
1S6 6rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r5   i_  zRepresents a ``lookup ...;`` statement to include a lookup in a feature.

The ``lookup`` should be a :class:`LookupBlock` object.Nc                L    \         P                  W4       W!uV n        V n        R # r   )rB   r   r   rn   )r   rn   r   s   &&&rQ   r   !LookupReferenceStatement.__init__d  s    4*&."t{rW   c                P    VP                  V P                  P                  4       R# )z8Calls the builder object's ``add_lookup_call`` callback.N)add_lookup_callrn   r   r   s   &&rQ   r   LookupReferenceStatement.buildh  s     0 01rW   c                L    R P                  V P                  P                  4      # )z
lookup {};)r   rn   r   r   s   &&rQ   r   LookupReferenceStatement.asFeal  s    ""4;;#3#344rW   )r   rn   r   r   r)  r   s   @rQ   r5   r5   _  s     ?825 5rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r6   ip  zA mark-to-base positioning rule. The ``base`` should be a
`glyph-containing object`_. The ``marks`` should be a list of
(:class:`Anchor`, :class:`MarkClass`) tuples.Nc                L    \         P                  W4       WuV n        V n        R # r   )rB   r   r   marks)r   r   r  r   s   &&&&rQ   r   MarkBasePosStatement.__init__u  s    4* $	4:rW   c                    VP                  V P                  V P                  P                  4       V P                  4       R# )z:Calls the builder object's ``add_mark_base_pos`` callback.N)add_mark_base_posr   r   r   r  r   s   &&rQ   r   MarkBasePosStatement.buildy  s)    !!$--1C1C1EtzzRrW   c                (   R P                  V P                  P                  4       4      pV P                   FO  w  r4VRV,           \        ,           RP                  VP                  4       VP
                  4      ,           ,          pKQ  	  VR,          pV# )zpos base {}r%  {} mark @{}rj  )r   r   r   r  r'  r   r   r   r  ams   &&   rQ   r   MarkBasePosStatement.asFea}  sj    ""499??#45JJDA4&=5(=+?+?	166+RRRC s

rW   )r   r  r   r   r)  r   s   @rQ   r6   r6   p  s     5,S rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r7   i  a  A mark-to-ligature positioning rule. The ``ligatures`` must be a
`glyph-containing object`_. The ``marks`` should be a list of lists: each
element in the top-level list represents a component glyph, and is made
up of a list of (:class:`Anchor`, :class:`MarkClass`) tuples representing
mark attachment points for that position.

Example::

    m1 = MarkClass("TOP_MARKS")
    m2 = MarkClass("BOTTOM_MARKS")
    # ... add definitions to mark classes...

    glyph = GlyphName("lam_meem_jeem")
    marks = [
        [ (Anchor(625,1800), m1) ], # Attachments on 1st component (lam)
        [ (Anchor(376,-378), m2) ], # Attachments on 2nd component (meem)
        [ ]                         # No attachments on the jeem
    ]
    mlp = MarkLigPosStatement(glyph, marks)

    mlp.asFea()
    # pos ligature lam_meem_jeem <anchor 625 1800> mark @TOP_MARKS
    # ligComponent <anchor 376 -378> mark @BOTTOM_MARKS;

Nc                L    \         P                  W4       WuV n        V n        R # r   )rB   r   	ligaturesr  )r   r  r  r   s   &&&&rQ   r   MarkLigPosStatement.__init__      4*%."
rW   c                    VP                  V P                  V P                  P                  4       V P                  4       R# )z9Calls the builder object's ``add_mark_lig_pos`` callback.N)add_mark_lig_posr   r  r   r  r   s   &&rQ   r   MarkLigPosStatement.build  s)      0G0G0I4::VrW   c                D   R P                  V P                  P                  4       4      p. pV P                   F  pRpVe   \	        V4      '       g$   RV,           \
        ^,          ,           R,           pM\V FV  w  rgVRV,           \
        ^,          ,           RP                  VP                  4       VP                  4      ,           ,          pKX  	  VP                  V4       K  	  VRV,           \
        ,           R,           P                  V4      ,          pVR,          pV# )zpos ligature {}r   r%  r  r  ligComponentrj  )	r   r  r   r  r   r'  r   r   rT   )r   r   r  ligsltempr  r  s   &&      rQ   r   MarkLigPosStatement.asFea  s    &&t~~';';'=>ADyAf}uqy0?BDA !!)$ (..qwwy!&&ABD  KK  	v%6<<TBBs

rW   )r  r  r   r   r)  r   s   @rQ   r7   r7     s     46W rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r8   i  zA mark-to-mark positioning rule. The ``baseMarks`` must be a
`glyph-containing object`_. The ``marks`` should be a list of
(:class:`Anchor`, :class:`MarkClass`) tuples.Nc                L    \         P                  W4       WuV n        V n        R # r   )rB   r   	baseMarksr  )r   r  r  r   s   &&&&rQ   r   MarkMarkPosStatement.__init__  r  rW   c                    VP                  V P                  V P                  P                  4       V P                  4       R# )z:Calls the builder object's ``add_mark_mark_pos`` callback.N)add_mark_mark_posr   r  r   r  r   s   &&rQ   r   MarkMarkPosStatement.build  s)    !!$--1H1H1JDJJWrW   c                (   R P                  V P                  P                  4       4      pV P                   FO  w  r4VRV,           \        ,           RP                  VP                  4       VP
                  4      ,           ,          pKQ  	  VR,          pV# )zpos mark {}r%  r  rj  )r   r  r   r  r'  r   r  s   &&   rQ   r   MarkMarkPosStatement.asFea  sl    ""4>>#7#7#9:JJDA4&=5(=+?+?	166+RRRC s

rW   )r  r  r   r   r)  r   s   @rQ   r8   r8     s     56X rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r9   i  ay  A multiple substitution statement.

Args:
    prefix: a list of `glyph-containing objects`_.
    glyph: a single glyph-containing object.
    suffix: a list of glyph-containing objects.
    replacement: a list of glyph-containing objects.
    forceChain: If true, the statement is expressed as a chaining rule
        (e.g. ``sub f' i' by f_i``) even when no context is given.
Nc                r    \         P                  W4       WVuV n        V n        V n        W@n        WPn        R # r   )rB   r   r  r   r  r  rf  )r   r  r   r  r  rf  r   s   &&&&&&&rQ   r   MultipleSubstStatement.__init__  s1     	4*/5f,TZ&$rW   c           	     Z   V P                    Uu. uF  q"P                  4       NK  	  ppV P                   Uu. uF  qDP                  4       NK  	  pp\        V P                  R4      '       d   V P                  P                  4       pMV P                  .p\        V4      p. pV P                   Fb  p	\        V	R4      '       d   V	P                  4       p
MV	.p
\        V
4      ^8X  d   \        V
4      V8w  d	   W,          p
VP                  V
4       Kd  	  \        \        V!  4      p\        4       p\        V4       Fb  w  rW9  g   K  VP                  V4       TP                  V P                  TTTT;'       d    W,          ;'       g    RV P                  4       Kd  	  R# u upi u upi )z;Calls the builder object's ``add_multiple_subst`` callback.r   NrN   )r  r   r  r   r   r   r  r   r  ziprP  r`   addadd_multiple_substr   rf  )r   r   r  r  r"  r  	originalscountreplacesrreplaceseen_originalsr  r   s   &&            rQ   r   MultipleSubstStatement.build  sM   (,41**,4(,41**,44::z**

++-III!!Aq*%%**,#7|q S\U%:!/OOG$ " X'$Y/KA-""8,**MM,,22OO 0' 54s
   F#F(c                   R p\        V P                  4      '       g.   \        V P                  4      '       g   V P                  '       d   \        V P                  4      '       d8   VRP	                  \        \        V P                  4      4      R,           ,          pV\        V P                  4      R,           ,          p\        V P                  4      '       d8   VRRP	                  \        \        V P                  4      4      ,           ,          pMV\        V P                  4      ,          pV P                  ;'       g    \        4       .pVR,          pVRP	                  \        \        V4      4      ,          pVR,          pV# )r  r   r  rq  rj  )
r   r  r  rf  rT   r   r   r   r  r   )r   r   r  r  s   &&  rQ   r   MultipleSubstStatement.asFea  s   t{{s4;;//4???4;;sxxE4;; 783>>5$s**C4;;sSXXc%&=>>>5$$C&&779;-vsxxE;/00s

rW   )rf  r   r  r  r  rK  r   r)  r   s   @rQ   r9   r9     s     	%B rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r<   i  a  A pair positioning statement.

``glyphs1`` and ``glyphs2`` should be `glyph-containing objects`_.
``valuerecord1`` should be a :class:`ValueRecord` object;
``valuerecord2`` should be either a :class:`ValueRecord` object or ``None``.
If ``enumerated`` is true, then this is expressed as an
`enumerated pair <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#6.b.ii>`_.
Nc                t    \         P                  W4       WPn        WuV n        V n        W4uV n        V n        R # r   )rB   r   
enumeratedglyphs1valuerecord1glyphs2valuerecord2)r   r  r  r  r  r  r   s   &&&&&&&rQ   r   PairPosStatement.__init__"  s5     	4*$*1'd'*1'd'rW   c                ~   V P                   '       d   V P                  P                  4       V P                  P                  4       .pRp\        P
                  ! V!   F8  w  rERpVP                  V P                  W@P                  WPP                  4       K:  	  V'       g   \        RV P                  4      hR# \        V P                  \        4      ;'       d    \        V P                  \        4      pV'       d^   VP                  V P                  V P                  P                  V P                  V P                  P                  V P                  4       R# VP                  V P                  V P                  P                  4       V P                  V P                  P                  4       V P                  4       R# )a  Calls a callback on the builder object:

* If the rule is enumerated, calls ``add_specific_pair_pos`` on each
  combination of first and second glyphs.
* If the glyphs are both single :class:`GlyphName` objects, calls
  ``add_specific_pair_pos``.
* Else, calls ``add_class_pair_pos``.
FTz%Empty glyph class in positioning ruleN)r  r  r   r  	itertoolsproductadd_specific_pair_posr   r  r  r   r   r   r   add_class_pair_pos)r   r   r   	seen_pairglyph1glyph2is_specifics   &&     rQ   r   PairPosStatement.build0  sP    ???&&($,,*?*?*ABAI"+"3"3Q"7 	--MM6+<+<fFWFW #8
 %;T]]   y9 
 
jLL)?
 ))""!!""!! &&%%'!!%%'!!rW   c                   V P                   '       d   R MRpV P                  '       d~   VRP                  V P                  P	                  4       V P
                  P	                  4       V P                  P	                  4       V P                  P	                  4       4      ,          pV# VRP                  V P                  P	                  4       V P                  P	                  4       V P
                  P	                  4       4      ,          pV# )zenum r   zpos {} {} {} {};zpos {} {} {};)r  r  r   r  r   r  r  r  s   && rQ   r   PairPosStatement.asFea[  s    gb%,,""$!!'')""$!!'')	 C 
 ?))""$dll&8&8&:D<M<M<S<S<U C 
rW   )r  r  r  r  r  rK  r   r)  r   s   @rQ   r<   r<     s      @)V rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r=   ik  a<  A reverse chaining substitution statement. You don't see those every day.

Note the unusual argument order: ``suffix`` comes `before` ``glyphs``.
``old_prefix``, ``old_suffix``, ``glyphs`` and ``replacements`` should be
lists of `glyph-containing objects`_. ``glyphs`` and ``replacements`` should
be one-item lists.
Nc                d    \         P                  W4       WuV n        V n        W0n        W@n        R # r   )rB   r   
old_prefix
old_suffixr   replacements)r   r  r  r   r  r   s   &&&&&&rQ   r   )ReverseChainSingleSubstStatement.__init__t  s)    4*+5((rW   c                   V P                    Uu. uF  q"P                  4       NK  	  ppV P                   Uu. uF  qDP                  4       NK  	  ppV P                  ^ ,          P                  4       pV P                  ^ ,          P                  4       p\        V4      ^8X  d   V\        V4      ,          pVP                  V P                  W5\        \        Wg4      4      4       R# u upi u upi )r   N)
r  r   r  r   r  r   add_reverse_chain_single_substr   dictr  r   r   r  r  r"  r  r  r  s   &&      rQ   r   &ReverseChainSingleSubstStatement.buildz  s    (,81**,8(,81**,8KKN++-	$$Q'002x=A#i.0H..MM64I0H+I	
 98s
   C&C+c                   R p\        V P                  4      '       g   \        V P                  4      '       d   \        V P                  4      '       d1   VRP                  R V P                   4       4      R,           ,          pVRP                  R V P                   4       4      ,          p\        V P                  4      '       d1   VRRP                  R V P                   4       4      ,           ,          pM0VRP                  \        \        V P                  4      4      ,          pVRP                  RP                  R V P                   4       4      4      ,          pV# )zrsub r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r  s   & rQ   rR   9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>  s     B/Qa/r  c              3   F   "   T F  p\        V4      R ,           x  K  	  R# 5ir  r   r  s   & rQ   rR   r         @KqE!HsNNK   !c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r  s   & rQ   rR   r    s     %H1eAhhr   by {};c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r  s   & rQ   rR   r         (M;Laq;Lr  )	r   r  r  rT   r   r   r   r   r  r  s   && rQ   r   &ReverseChainSingleSubstStatement.asFea  s    t3t#7#74??##sxxB$//BBSHH388@DKK@@@C4??##sSXX%H%HHHH388Ct{{344Cy(M4;L;L(M MNN
rW   )r   r  r  r  r   r   r)  r   s   @rQ   r=   r=   k  s     )	
 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r@   i  a  A single substitution statement.

Note the unusual argument order: ``prefix`` and suffix come `after`
the replacement ``glyphs``. ``prefix``, ``suffix``, ``glyphs`` and
``replace`` should be lists of `glyph-containing objects`_. ``glyphs`` and
``replace`` should be one-item lists.
Nc                p    \         P                  W4       W4uV n        V n        WPn        Wn        W n        R # r   )rB   r   r  r  rf  r   r  )r   r   r  r  r  rf  r   s   &&&&&&&rQ   r   SingleSubstStatement.__init__  s.    4*#) T[$#rW   c                   V P                    Uu. uF  q"P                  4       NK  	  ppV P                   Uu. uF  qDP                  4       NK  	  ppV P                  ^ ,          P                  4       pV P                  ^ ,          P                  4       p\        V4      ^8X  d   V\        V4      ,          pVP                  V P                  VV\        \        Wg4      4      V P                  4       R# u upi u upi )z9Calls the builder object's ``add_single_subst`` callback.N)r  r   r  r   r  r   add_single_substr   r   r  rf  r  s   &&      rQ   r   SingleSubstStatement.build  s    (,41**,4(,41**,4KKN++-	$$Q'002x=A#i.0H  MMI01OO	
 54s
   C2C7c                   R p\        V P                  4      '       g.   \        V P                  4      '       g   V P                  '       d   \        V P                  4      '       d1   VRP	                  R V P                   4       4      R,           ,          pVRP	                  R V P
                   4       4      ,          p\        V P                  4      '       d1   VRRP	                  R V P                   4       4      ,           ,          pM)VRP	                  R V P
                   4       4      ,          pVRP                  RP	                  R V P                   4       4      4      ,          pV# )r  r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r  s   & rQ   rR   -SingleSubstStatement.asFea.<locals>.<genexpr>  s     >+Qa+r  c              3   F   "   T F  p\        V4      R ,           x  K  	  R# 5ir  r   r  s   & rQ   rR   r    r  r  c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r  s   & rQ   rR   r    s     %D1eAhhr  c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r  s   & rQ   rR   r    s     :kE!HHkr  r  c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r  s   & rQ   rR   r    r  r  )r   r  r  rf  rT   r   r   r  r  s   && rQ   r   SingleSubstStatement.asFea  s    t{{s4;;//4???4;;sxx>$++>>DD388@DKK@@@C4;;sSXX%D%DDDD388:dkk:::Cy(M4;L;L(M MNN
rW   )rf  r   r  r  r  r   r   r)  r   s   @rQ   r@   r@     s     $
  rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r>   i  zA ``script`` statement.Nc                <    \         P                  W4       Wn        R # r   )rB   r   r|   )r   r|   r   s   &&&rQ   r   ScriptStatement.__init__  s    4*rW   c                R    VP                  V P                  V P                  4       R# )z,Calls the builder's ``set_script`` callback.N)
set_scriptr   r|   r   s   &&rQ   r   ScriptStatement.build  s    4==$++6rW   c                T    R P                  V P                  P                  4       4      # )z
script {};)r   r|   rH  r   s   &&rQ   r   ScriptStatement.asFea  s     ""4;;#4#4#677rW   )r|   r   r   r)  r   s   @rQ   r>   r>     s     !78 8rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r?   i  zA single position statement. ``prefix`` and ``suffix`` should be
lists of `glyph-containing objects`_.

``pos`` should be a one-element list containing a (`glyph-containing object`_,
:class:`ValueRecord`) tuple.Nc                f    \         P                  W4       WVuV n        V n        V n        W@n        R # r   )rB   r   rv   r  r  rf  )r   rv   r  r  rf  r   s   &&&&&&rQ   r   SinglePosStatement.__init__  s)    4*-0&*$+t{$rW   c                r   V P                    Uu. uF  q"P                  4       NK  	  ppV P                   Uu. uF  qDP                  4       NK  	  ppV P                   UUu. uF  w  rgVP                  4       V3NK  	  pppVP	                  V P
                  W5WP                  4       R# u upi u upi u uppi )z7Calls the builder object's ``add_single_pos`` callback.N)r  r   r  rv   add_single_posr   rf  )	r   r   r  r  r"  r  r   rB  rv   s	   &&       rQ   r   SinglePosStatement.build  s    (,41**,4(,41**,459XX>X

e$X>t}}fc??S 54>s   B)B. B3c           
        R p\        V P                  4      '       g/   \        V P                  4      '       g   V P                  '       Ed   \        V P                  4      '       d8   VRP	                  \        \        V P                  4      4      R,           ,          pTRP	                  V P                   Uu. uFL  p\        V^ ,          4      R,           V^,          e   RV^,          P                  4       ,           MR,           NKN  	  up4      ,          p\        V P                  4      '       d8   VRRP	                  \        \        V P                  4      4      ,           ,          pMrTRP	                  V P                   Uu. uFE  p\        V^ ,          4      R,           V^,          e   V^,          P                  4       MR,           NKG  	  up4      ,          pVR,          pV# u upi u upi )r  r   r  r   rj  )r   r  r  rf  rT   r   r   rv   )r   r   r  r  s   &&  rQ   r   SinglePosStatement.asFea  s   t{{s4;;//4???4;;sxxE4;; 783>>388
 "XX	 & !A$K/0t/?adjjl*RI I &	 C 4;;sSXXc%&=>>>388 "XX% !A$K#%19I1rRR% C 	s

#s   8AG'
AG,
)rf  rv   r  r  r   r   r)  r   s   @rQ   r?   r?     s     $%
T rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
rF   i  zRepresents a subtable break.Nc                0    \         P                  W4       R # r   )rB   r   r   s   &&rQ   r   SubtableStatement.__init__   s    4*rW   c                <    VP                  V P                  4       R# )z<Calls the builder objects's ``add_subtable_break`` callback.N)add_subtable_breakr   r   s   &&rQ   r   SubtableStatement.build  s    ""4==1rW   c                    R # )z	subtable;rN   r   s   &&rQ   r   SubtableStatement.asFea  s    rW   rN   r   r   r)  r   s   @rQ   rF   rF     s     &+2 rW   c                   T   a  ] tR tRt o RtRR ltR tR tR tRR lt	R	 t
]
tR
tV tR# )rH   i  zRepresents a value record.Nc                    \         P                  W
4       WuV n        V n        W4uV n        V n        WVuV n        V n        WxuV n        V n	        Wn
        R # r   )r'   r   
xPlacement
yPlacementxAdvanceyAdvance
xPlaDevice
yPlaDevice
xAdvDevice
yAdvDevicevertical)r   r  r  r  r  r  r  r  r  r  r   s   &&&&&&&&&&&rQ   r   ValueRecord.__init__  sO     	D+,6((0$t},6(,6( rW   c                ~   V P                   VP                   8H  ;'       d    V P                  VP                  8H  ;'       d}    V P                  VP                  8H  ;'       d\    V P                  VP                  8H  ;'       d;    V P                  VP                  8H  ;'       d    V P
                  VP
                  8H  # r   )r  r  r  r  r  r  r   others   &&rQ   __eq__ValueRecord.__eq__"  s    OOu/// 4 45#3#334 4/4 4 /4 4 5#3#33	4 4
 5#3#33	
rW   c                .    V P                  V4      '       * # r   )r!  r  s   &&rQ   __ne__ValueRecord.__ne__,  s    ;;u%%%rW   c                   \        V P                  4      \        V P                  4      ,          \        V P                  4      ,          \        V P                  4      ,          \        V P
                  4      ,          \        V P                  4      ,          \        V P                  4      ,          \        V P                  4      ,          # r   )	hashr  r  r  r  r  r  r  r  r   s   &rQ   __hash__ValueRecord.__hash__/  s    !4??#$4==!" 4==!" 4??#	$
 4??#$ 4??#$ 4??#$		
rW   c                   V '       g   R # V P                   V P                  r2V P                  V P                  rTV P                  V P
                  rvV P                  V P                  rV P                  p
Vf3   Vf/   Vf   V
'       d   \        V4      # Vf   V
'       g   \        V4      # T;'       g    ^ pT;'       g    ^ pT;'       g    ^ pT;'       g    ^ pVf    Vf   Vf   V	f   RV: RV: RV: RV: R2	# RV: RV: RV: RV: R\        V4      : R\        V4      : R\        V4      : R\        V	4      : R2# )z<NULL><r   r  )r  r  r  r  r  r  r  r  r  r  rV   )r   r   r  r  r  r  r  r  r  r  r  s   &&         rQ   r   ValueRecord.asFea;  s   1!]]DMM(!%$//J!%$//J== 9H8}$!(8}$ FFFF==q==q """&'Hh?? :&:&:&:&	
 		
rW   c                x   a  \         ;QJ d    V 3R  lR 4       F  '       g   K   R# 	  R# ! V 3R  lR 4       4      # )c              3   @   <"   T F  p\        SV4      R Jx  K  	  R # 5ir   )getattr)rO   vr   s   & rQ   rR   'ValueRecord.__bool__.<locals>.<genexpr>h  s(      
	 D!D(	s   TF)r  r  r  r  r  r  r  r  )r  r   s   frQ   __bool__ValueRecord.__bool__g  sB    s 
	
ss 	
s 	
s 
	
 
 	
rW   )	r  r  r  r  r  r  r  r  r  )
NNNNNNNNFNr   )r   r   r   r   r   r   r!  r$  r(  r   r2  __nonzero__r   r   r   s   @rQ   rH   rH     s.     $!(
&

*
X
 KrW   c                   8   a  ] tR tRt o RtRR ltRR ltRtV tR# )	rI   iy  z+Represents a named value record definition.Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   r   rB  )r   r   rB  r   s   &&&&rQ   r   ValueRecordDefinition.__init__|  s    4*	
rW   c                j    R P                  V P                  P                  4       V P                  4      # )zvalueRecordDef {} {};)r   rB  r   r   r   s   &&rQ   r   ValueRecordDefinition.asFea  s&    &--djj.>.>.@$))LLrW   )r   rB  r   r   r  r   s   @rQ   rI   rI   y  s     5
M MrW   c                     V ^8X  d   V^8X  d
   VR8X  d   R# V ^8X  d   V^ 8X  d
   V^ 8X  d   R# RP                  WV4      # )   i	  r   1{} {} {}r   )pideidlids   &&&rQ   simplify_name_attributesrB    sA    
axC1H	cQh3!8  3//rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r:   i  zRepresents a name record. (`Section 9.e. <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_)Nc                l    \         P                  W4       Wn        W n        W0n        W@n        WPn        R # r   )rB   r   nameID
platformID	platEncIDlangIDstring)r   rE  rF  rG  rH  rI  r   s   &&&&&&&rQ   r   NameRecord.__init__  s)    4*$"rW   c                    VP                  V P                  V P                  V P                  V P                  V P
                  V P                  4       R# )z8Calls the builder object's ``add_name_record`` callback.N)add_name_recordr   rE  rF  rG  rH  rI  r   s   &&rQ   r   NameRecord.build  s:    MMKKOONNKKKK	
rW   c                   R  p\        V P                  V P                  V P                  4      pVf   \	        RV P
                  4      h\        V P                  VR7      pVR8X  dq   RP                  \        ^ \        V4      ^4       Uu. uF?  pV! \        WE,          4      R,          \        WE^,           ,          4      ,           R4      NKA  	  up4      pM0RP                  V Uu. uF  qr! \        V4      R4      NK  	  up4      p\        V P                  V P                  V P                  4      pVR8w  d
   VR,          pR	P                  V P                  W4      # u upi u upi )
c                 R    V ^ 8  d   V ^~8:  d   V R9  d   \        V 4      # W,          # )    )"   \   )chr)r  escape_patterns   &&rQ   escape NameRecord.asFea.<locals>.escape  s(    DyQ$Y1L+@1v%))rW   zUnsupported encoding)encoding	utf_16_ber      z\%04xz\%02xr   znameid {} {}"{}";)r   rF  rG  rH  r   r   r   rI  rT   r  r   r   rB  r   rE  )	r   r   rU  rW  r"  r  escaped_stringbplats	   &&       rQ   r   NameRecord.asFea  s#   	* tL!"8$--HHDKK(3{"WW #1c!fa00 714=3.q51BBHM0N  WWA%NAqfWQZ&BA%NON'U2:CKD"))$++tLL &Os   
AE&E#)rH  rE  rG  rF  rI  r   r   r)  r   s   @rQ   r:   r:     s!      K	
M MrW   c                   4   a  ] tR tRt o RtR tRR ltRtV tR# )r(   i  z4Represents a ``sizemenuname`` or ``name`` statement.c                f    \         P                  W4       VP                  V P                  4       R# )z8Calls the builder object's ``add_featureName`` callback.N)r:   r   add_featureNamerE  r   s   &&rQ   r   FeatureNameStatement.build  s"    ',rW   c                    V P                   R 8X  d   RpMRp\        V P                  V P                  V P                  4      pVR8w  d
   VR,          pRP                  W#V P                  4      # )sizesizemenunamer   r   r   z
{} {}"{}";)rE  rB  rF  rG  rH  r   rI  )r   r   r  r\  s   &&  rQ   r   FeatureNameStatement.asFea  sY    ;;&  CC'U2:CKD""3dkk::rW   rN   Nr   )	r   r   r   r   r   r   r   r   r   r   s   @rQ   r(   r(     s     >-
; ;rW   c                   .   a  ] tR tRt o RtRR ltRtV tR# )rE   i  z+Represents a STAT table ``name`` statement.c                    \        V P                  V P                  V P                  4      pVR 8w  d
   VR,          pRP	                  W P
                  4      # r   r   zname {}"{}";rB  rF  rG  rH  r   rI  r   r   r\  s   && rQ   r   STATNameStatement.asFea  A    'U2:CKD$$T;;77rW   rN   Nr   )r   r   r   r   r   r   r   r   r   s   @rQ   rE   rE     s     58 8rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
rA   i  zA ``parameters`` statement.Nc                `    \         P                  W4       Wn        W n        W0n        W@n        R # r   )rB   r   
DesignSizeSubfamilyID
RangeStartRangeEnd)r   ro  rp  rq  rr  r   s   &&&&&&rQ   r   SizeParameters.__init__  s%    4*$&$ rW   c                    VP                  V P                  V P                  V P                  V P                  V P
                  4       R# )z<Calls the builder object's ``set_size_parameters`` callback.N)set_size_parametersr   ro  rp  rq  rr  r   s   &&rQ   r   SizeParameters.build  s5    ##MMOOOOMM	
rW   c                >   R P                  V P                  V P                  4      pV P                  ^ 8w  g   V P                  ^ 8w  dN   VRP                  \        V P                  ^
,          4      \        V P                  ^
,          4      4      ,          pVR,           # )zparameters {:.1f} {}z {} {}rj  )r   ro  rp  rq  rr  intr  s   && rQ   r   SizeParameters.asFea  sq    $++DOOT=M=MN??a4==A#58??3t';#<c$--RTBT>UVVCSyrW   )ro  rr  rq  rp  r   r   r)  r   s   @rQ   rA   rA     s     %!
 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i  z;Represent a name statement inside a ``cvParameters`` block.Nc           
     D    \         P                  WW#WEVR 7       W`n        R# )r   N)r:   r   rN  )r   rE  rF  rG  rH  rI  rN  r   s   &&&&&&&&rQ   r   "CVParametersNameStatement.__init__  s'     	*( 	 	
 %rW   c                >   RpV P                   R8X  d6   RP                  VP                  P                  V P                  ^ 4      4      pVP                  V P                  4       V P                  V P                   V,           3V n        \        P                  W4       R# )z9Calls the builder object's ``add_cv_parameter`` callback.r   rQ  z_{}N)rN  r   cv_num_named_params_getrE  add_cv_parameterr:   r   )r   r   items   && rQ   r   CVParametersNameStatement.build  sr    ??22<< < < @ @a PQD  -{{DOOd$:;'rW   c                    \        V P                  V P                  V P                  4      pVR 8w  d
   VR,          pRP	                  W P
                  4      # rh  ri  rj  s   && rQ   r   CVParametersNameStatement.asFea  rl  rW   )rN  rE  r   r   r)  r   s   @rQ   r   r     s     E%(8 8rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r"   i  a  
Statement used in cvParameters blocks of Character Variant features (cvXX).
The Unicode value may be written with either decimal or hexadecimal
notation. The value must be preceded by '0x' if it is a hexadecimal value.
The largest Unicode value allowed is 0xFFFFFF.
Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   	characterr  )r   r  r  r   s   &&&&rQ   r   CharacterStatement.__init__  s    4*"rW   c                R    VP                  V P                  V P                  4       R# )z9Calls the builder object's ``add_cv_character`` callback.N)add_cv_characterr  r  r   s   &&rQ   r   CharacterStatement.build  s      :rW   c                8    R P                  V P                  4      # )zCharacter {:#x};)r   r  r   s   &&rQ   r   CharacterStatement.asFea#  s    !((88rW   )r  r  r   r   r)  r   s   @rQ   r"   r"     s     
;9 9rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r   i'  zAn axis definition, being either a ``VertAxis.BaseTagList/BaseScriptList``
pair or a ``HorizAxis.BaseTagList/BaseScriptList`` pair.Nc                b    \         P                  W4       Wn        W n        W0n        . V n        R # r   )rB   r   basesscriptsr  minmax)r   r  r  r  r  r   s   &&&&&&rQ   r   BaseAxis.__init__+  s&    4*
 rW   c                ~    VP                  V P                  V P                  V P                  V P                  4       R# )z6Calls the builder object's ``set_base_axis`` callback.N)set_base_axisr  r  r  r  r   s   &&rQ   r   BaseAxis.build2  s&    djj$,,t{{SrW   c                4   V P                   '       d   R MRpV P                   Uu. uFH  pRP                  V^ ,          V^,          RP                  \	        \
        V^,          4      4      4      NKJ  	  ppV P                   Uu. uF3  pRP                  W#^ ,          V^,          V^,          V^,          4      NK5  	  ppRP                  VRP                  V P                  4      WRP                  V4      4      RP                  V4      ,           # u upi u upi )VertHorizr=  r   z
{}Axis.MinMax {} {} {}, {};z2{}Axis.BaseTagList {};
{}{}Axis.BaseScriptList {};rL   r%  )r  r  r   rT   r   r  r  r  )r   r   	directionr  r  minmaxess   &&    rQ   r   BaseAxis.asFea6  s    "mmmF	 \\
! adAaD#((3sAaD>*BC! 	 
 [[
  ,229dAaD!A$PQRSPTU  	 
 EKKsxx

+V		'@R
IIh  	 

s   AD9D)r  r  r  r  r   r   r)  r   s   @rQ   r   r   '  s      @T   rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r;   iE  zAn entry in the ``OS/2`` table. Most ``values`` should be numbers or
strings, apart from when the key is ``UnicodeRange``, ``CodePageRange``
or ``Panose``, in which case it should be an array of integers.Nc                H    \         P                  W4       Wn        W n        R # r   rB   r   rA  rB  r   rA  rB  r   s   &&&&rQ   r   OS2Field.__init__J      4*
rW   c                R    VP                  V P                  V P                  4       R# )z6Calls the builder object's ``add_os2_field`` callback.N)add_os2_fieldrA  rB  r   s   &&rQ   r   OS2Field.buildO  s    dhh

3rW   c                   R  pRpR	p\        V Uu. uF  qUP                  4       V\        .3NK  	  up4      pTP                  V Uu. uF  qUP                  4       WR.3NK  	  up4       RV.VR&   RR .VR&   V P                  V9   dQ   RP                  W`P                  ,          ^ ,          W`P                  ,          ^,          ! V P                  4      4      # R# u upi u upi )
c                 @    R P                  \        \        V 4      4      # )r   )rT   r   r  )r  s   &rQ   
intarr2str"OS2Field.asFea.<locals>.intarr2strT  s    88CQK((rW   PanosepanoseVendorc                 $    R P                  V 4      # )z"{}"r>  )r  s   &rQ   <lambda> OS2Field.asFea.<locals>.<lambda>i  s    &--2BrW   vendor{} {};r   )FSTypeTypoAscenderTypoDescenderTypoLineGap	winAscent
winDescentXHeight	CapHeightWeightClass
WidthClassLowerOpSizeUpperOpSize)UnicodeRangeCodePageRange)r  r   r  updaterA  r   rB  )r   r   r  numbersrangesr  keywordss   &&     rQ   r   OS2Field.asFeaS  s    	)
 3@1'')aX.@AvFv!'')a_5vFG&
3&(BC88x??"1%x'9!'<TZZ'H   AFs    CC rA  rB  r   r   r)  r   s   @rQ   r;   r;   E  s     G
4 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r+   iq  zAn entry in the ``hhea`` table.Nc                H    \         P                  W4       Wn        W n        R # r   r  r  s   &&&&rQ   r   HheaField.__init__t  r  rW   c                R    VP                  V P                  V P                  4       R# )z7Calls the builder object's ``add_hhea_field`` callback.N)add_hhea_fieldrA  rB  r   s   &&rQ   r   HheaField.buildy      txx4rW   c                    Rp\        V Uu. uF  q3P                  4       V3NK  	  up4      pRP                  W@P                  ,          V P                  4      # u upi )CaretOffsetr  )r  Ascender	DescenderLineGapr  r   r   rA  rB  r   r   fieldsr  r  s   &&   rQ   r   HheaField.asFea}  sI    D8A'')Q89x14::>> 9   Ar  r   r   r)  r   s   @rQ   r+   r+   q       )
5? ?rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
rJ   i  zAn entry in the ``vhea`` table.Nc                H    \         P                  W4       Wn        W n        R # r   r  r  s   &&&&rQ   r   VheaField.__init__  r  rW   c                R    VP                  V P                  V P                  4       R# )z7Calls the builder object's ``add_vhea_field`` callback.N)add_vhea_fieldrA  rB  r   s   &&rQ   r   VheaField.build  r  rW   c                    Rp\        V Uu. uF  q3P                  4       V3NK  	  up4      pRP                  W@P                  ,          V P                  4      # u upi )VertTypoAscenderr  )r  VertTypoDescenderVertTypoLineGapr  r  s   &&   rQ   r   VheaField.asFea  sI    M8A'')Q89x14::>> 9r  r  r   r   r)  r   s   @rQ   rJ   rJ     r  rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
rD   i  zA STAT table Design Axis

Args:
    tag (str): a 4 letter axis tag
    axisOrder (int): an int
    names (list): a list of :class:`STATNameStatement` objects
Nc                `    \         P                  W4       Wn        W n        W0n        W@n        R # r   )rB   r   r  	axisOrdernamesr   )r   r  r  r  r   s   &&&&&rQ   r    STATDesignAxisStatement.__init__  s$    4*"
 rW   c                <    VP                  W P                  4       R # r   )addDesignAxisr   r   s   &&rQ   r   STATDesignAxisStatement.build  s    dMM2rW   c           
        V\         ,          pR V P                   RV P                   R2pTRV,           P                  V P                   Uu. uF  q3P                  VR7      NK  	  up4      R,           ,          pVR,          pV# u upi )zDesignAxis r   z { 
r%  r&  };)r'  r  r  rT   r  r   r   r   r  r"  s   &&  rQ   r   STATDesignAxisStatement.asFea  sw    %DHH:Qt~~&6f=v##TZZ$PZWWFW%;Z$PQTXXXt
 %Qs   B
)r  r   r  r  r   r   r)  r   s   @rQ   rD   rD     s     !3 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r%   i  z]STAT table ElidedFallbackName

Args:
    names: a list of :class:`STATNameStatement` objects
Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   r  r   )r   r  r   s   &&&rQ   r   ElidedFallbackName.__init__      4*
 rW   c                R    VP                  V P                  V P                  4       R # r   )setElidedFallbackNamer  r   r   s   &&rQ   r   ElidedFallbackName.build      %%djj$--@rW   c           
         V\         ,          pR pTRV,           P                  V P                   Uu. uF  q3P                  VR7      NK  	  up4      R,           ,          pVR,          pV# u upi )zElidedFallbackName { 
r%  r&  r  )r'  rT   r  r   r  s   &&  rQ   r   ElidedFallbackName.asFea  s_    %'v##TZZ$PZWWFW%;Z$PQTXXXt
 %Qs   A*
)r   r  r   r   r)  r   s   @rQ   r%   r%     s     !
A rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r&   i  zdSTAT table ElidedFallbackNameID

Args:
    value: an int pointing to an existing name table name ID
Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   rB  r   )r   rB  r   s   &&&rQ   r   ElidedFallbackNameID.__init__  r  rW   c                R    VP                  V P                  V P                  4       R # r   )r  rB  r   r   s   &&rQ   r   ElidedFallbackNameID.build  r  rW   c                "    R V P                    R2# )zElidedFallbackNameID rj  )rB  r   s   &&rQ   r   ElidedFallbackNameID.asFea  s    &tzzl!44rW   )r   rB  r   r   r)  r   s   @rQ   r&   r&     s     !
A5 5rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
rC   i  zA STAT table Axis Value Record

Args:
    names (list): a list of :class:`STATNameStatement` objects
    locations (list): a list of :class:`AxisValueLocationStatement` objects
    flags (int): an int
Nc                T    \         P                  W4       Wn        W n        W0n        R # r   )rB   r   r  	locationsr  )r   r  r  r  r   s   &&&&&rQ   r   STATAxisValueStatement.__init__  s    4*
"
rW   c                <    VP                  W P                  4       R # r   )addAxisValueRecordr   r   s   &&rQ   r   STATAxisValueStatement.build  s    ""47rW   c                   R pV P                    F  pW#P                  4       ,          pK  	  V P                   F"  pW$P                  4       ,          pVR,          pK$  	  V P                  '       dx   RR.p. p^p\	        \        V4      4       F;  pV P                  V,          ^ 8w  d   VP                  WX,          4       V^,          pK=  	  VRRP                  V4       R2,          pVR,          pV# )zAxisValue {
r%  OlderSiblingFontAttributeElidableAxisValueNamezflag r   ;
r  )r  r   r  r  r  r   r   rT   )	r   r   r  r   
nameRecordr  flagStringsr   r  s	   &&       rQ   r   STATAxisValueStatement.asFea  s    H>>##C ' **J##%%C4KC % :::02IJEKD3u:&::$)&&ux0qy ' U388K0155Ct
rW   )r  r  r  r   r   r)  r   s   @rQ   rC   rC     s     8 rW   c                   8   a  ] tR tRt o RtRR ltRR ltRtV tR# )	r   i  z|
A STAT table Axis Value Location

Args:
    tag (str): a 4 letter axis tag
    values (list): a list of ints and/or floats
Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   r  values)r   r  r  r   s   &&&&rQ   r   #AxisValueLocationStatement.__init__  s    4*rW   c                    VR V P                    R2,          pVRP                  R V P                   4       4       R2,          pV# )z	location r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  )rO   r  s   & rQ   rR   3AxisValueLocationStatement.asFea.<locals>.<genexpr>  s     7;a3q66;r  r
  )r  rT   r  )r   r  s   &&rQ   r    AxisValueLocationStatement.asFea  sC    488*A&&#((74;;778<<
rW   )r  r  r   r   r  r   s   @rQ   r   r     s     
 rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
r#   i  z
A variable layout conditionset

Args:
    name (str): the name of this conditionset
    conditions (dict): a dictionary mapping axis tags to a
        tuple of (min,max) userspace coordinates.
Nc                H    \         P                  W4       Wn        W n        R # r   )rB   r   r   
conditions)r   r   r  r   s   &&&&rQ   r   ConditionsetStatement.__init__   s    4*	$rW   c                h    VP                  V P                  V P                  V P                  4       R # r   )add_conditionsetr   r   r  r   s   &&rQ   r   ConditionsetStatement.build%  s       		4??KrW   c           	     (   WR V P                    R2,           R,           ,          pV P                  P                  4        F+  w  pw  rEW\        ,           V RV RV R2,           ,          pK-  	  WR,           RV P                    R2,           ,          pV# )zconditionset r   rF  r
  })r   r  r=  r'  )r   r  r   r  minvaluemaxvalues   &&&   rQ   r   ConditionsetStatement.asFea(  s    -		{!44u<<)-)>)>)@%C%(E>se1XJaz$EEEC *A|$))C000
rW   )r  r   r   )r   r   r)  r   s   @rQ   r#   r#     s     %
L rW   c                   >   a  ] tR tRt o RtRR ltR tR	R ltRtV t	R# )
VariationBlocki0  zCA variation feature block, applicable in a given set of conditions.Nc                \    \         P                  W4       VVVuV n        V n        V n        R # r   )r   r   r   conditionsetr5  )r   r   r%  r5  r   s   &&&&&rQ   r   VariationBlock.__init__3  s*    t& 	9	4$d&8rW   c                n   VP                  V P                  V P                  V P                  4       V P                  R8w  d?   V P                  VP
                  9  d$   \        RV P                   2V P                  4      hVP                  p/ Vn        \        P                  W4       VP                  P                  4        FX  w  r4VP                  P                  V/ 4      P                  V P                  . 4      pVP                  V4       W29  g   KT  . W#&   KZ  	  W!n        VP                  4        R# )r:  r   z,variation block used undefined conditionset N)r;  r   r   r5  r%  conditionsets_r   r<  r   r   r=  feature_variations_r>  r   r?  )r   r   r@  rA  rB  r=  s   &&    rQ   r   VariationBlock.build;  s    	dmmTYY8J8JK'!!)?)??!>t?P?P>QR  $$D"!++113JC//::3CNN!!2E LL" " 4 %rW   c                f   VR V P                   P                  4       ,          ,           pW P                  R,           ,          pV P                  '       d
   VR,          pVR,          pV\        P                  WR7      ,          pW!RV P                   P                  4       ,          ,           ,          pV# )zvariation %s r   rE  rF  r&  rG  )r   rH  r%  r5  r   r   r  s   && rQ   r   VariationBlock.asFeaW  s    ):::  3&&?"Cuu{{4{//	DIIOO$5555
rW   )r%  r   r5  rK  r   r)  r   s   @rQ   r#  r#  0  s     M
8 rW   r#  z    )Yr  fontTools.feaLib.errorr   fontTools.feaLib.locationr   fontTools.misc.encodingToolsr   fontTools.misc.textToolsr   r   collectionsr   r  r'  __all__rV   rP  r   r   objectr	   rB   r'   r   r   r   r   r   r   r   r   r
   r   r   r   rG   r   r   r   r   r   r   r   r   r    r!   r$   r)   r,   r-   r.   r/   r0   r*   r1   r2   r3   r4   r5   r6   r7   r8   r9   r<   r=   r@   r>   r?   rF   rH   rI   rB  r:   r(   rE   rA   r   r"   r   r;   r+   rJ   rD   r%   r&   rC   r   r#   r#  rN   rW   rQ   <module>r4     s    2 8 4 5 # CCC C 	C
 C C C C C C C C C C C  !C" #C$ %C& 'C( )C* !+C, -C.  /C0 1C2 !3C4 5C6 7C8 9C: ;C< =C> ?C@ ACB  CCD ECF GCH ICJ KCL MCN OCP QCR $SCT "UCV WCX YCZ [C\ ]C^ _C` aCb cCd eCf gCh iCj 'kCl mCn oCp qCr sCt uCv wCx yCz {C| }C~ C@ ACB CCD ECLF 555 	5 		5
 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5  	!5" 	#5$ 	%5& 	'5( 	)5* 	+5, 	-5. 	/50 	152 	354 	556 	758 	95: 	;5< 	=5> 	?5@ 	A5B 	C5D 	E5F 	G5H 	I5J 	K5L 	M5N 	O5P 	Q5R 	S5T 	U5V 	W5X 	Y5Z 	[5\ 	]5^ 	_5` 	a5b 	c5d 	e5f 	g5h 	i57tf ,	 		 		g 	
 !
 ! ;% ;%|*Z *")J )"Y 
I 
.	J% 	J5 >% *% , C9 C 
Y 
<* *Z$
) $
N"i "J"Z "Jy 
i 
&7y 7t7 7tT) T*6	 6!9 !9H99 9B7y 7&	 :Ri R<I <
I 
&
) 
&$Y $N&6) &6R5y 5"9 *5) 5p9 *CY CLPy Pf%y %P+9 +\8i 8* *Z	 k* k\	MI 	M0.M .Mb;: ;&8
 8Y 68
 869 9* y  <)y )X?	 ?$?	 ?$i 6 .59 5&%Y %P (I 4/U /rW   