Ë
    £ehB! ã                   óV  — d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlZdZg d¢Zd	„ Z eg d
¢«      Zd„ Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d „ d!e«      Z G d"„ d#e«      Z G d$„ d%e«      Z G d&„ d'e«      Z  G d(„ d)e«      Z! G d*„ d+e«      Z" G d,„ d-e«      Z# G d.„ d/e«      Z$ G d0„ d1e«      Z% G d2„ d3e«      Z& G d4„ d5e«      Z' G d6„ d7e«      Z( G d8„ d9e«      Z) G d:„ d;e«      Z* G d<„ d=e«      Z+ G d>„ d?e«      Z, G d@„ dAe«      Z- G dB„ dCe«      Z. G dD„ dEe«      Z/ G dF„ dGe«      Z0 G dH„ dIe«      Z1 G dJ„ dKe«      Z2 G dL„ dMe«      Z3 G dN„ dOe«      Z4 G dP„ dQe«      Z5 G dR„ dSe«      Z6 G dT„ dUe«      Z7 G dV„ dWe«      Z8 G dX„ dYe«      Z9 G dZ„ d[e«      Z: G d\„ d]e«      Z; G d^„ d_e«      Z< G d`„ dae«      Z= G db„ dce«      Z> G dd„ dee«      Z? G df„ dge«      Z@ G dh„ die«      ZA G dj„ dke«      ZB G dl„ dme«      ZC G dn„ doe«      ZD G dp„ dqe«      ZEdr„ ZF G ds„ dte«      ZG G du„ dveG«      ZH G dw„ dxeG«      ZI G dy„ dze«      ZJ G d{„ d|eG«      ZK G d}„ d~e«      ZL G d„ d€e«      ZM G d�„ d‚e«      ZN G dƒ„ d„e«      ZO G d…„ d†e«      ZP G d‡„ dˆe«      ZQ G d‰„ dŠe«      ZR G d‹„ dŒe«      ZS G d�„ dŽe«      ZT G d�„ d�e«      ZU G d‘„ d’e«      ZV G d“„ d”e«      ZWy)•é    )ÚFeatureLibError)ÚFeatureLibLocation)ÚgetEncoding)ÚbyteordÚtobytes)ÚOrderedDictNz    )BÚ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                 ó>   — | €yddj                  d„ | D «       «      z  S )Nz<device NULL>z<device %s>ú, c              3   ó&   K  — | ]	  }d |z  –— Œ y­w)z%d %dN© )Ú.0Úts     úR/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/feaLib/ast.pyú	<genexpr>z!deviceToString.<locals>.<genexpr>T   s   è ø€ Ò(E¸¨°1­Ñ(Eùs   ‚)Újoin)Údevices    rQ   ÚdeviceToStringrU   P   s$   € Ø€~Øà˜tŸy™yÑ(E¸fÔ(EÓEÑEÐEó    )4ÚanchorÚ	anchordefÚanonÚ	anonymousÚbyÚcontourÚcursiverT   Ú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                 óð   — t        | d«      r| j                  «       S t        | t        «      r.t	        | «      dk(  r t        | d   «      dz   t        | d   «      z   S | j                  «       t        v rd| z   S | S )NÚasFeaé   r   z - é   ú\)Úhasattrr‹   Ú
isinstanceÚtupleÚlenÚlowerÚfea_keywords)Úgs    rQ   r‹   r‹   ‘   sh   € Üˆq�'ÔØ�w‰w‹yÐÜ	�A”uÔ	¤# a£&¨A¢+Ü�Q�q‘T‹{˜UÑ"¤U¨1¨Q©4£[Ñ0Ð0Ø	
�‰‹”lÑ	"Ø�a‰xˆàˆrV   c                   ó,   — e Zd ZdZdd„Zd„ Zdd„Zd„ Zy)	r	   z8A base class representing "something" in a feature file.Nc                 óF   — |rt        |t        «      st        |Ž }|| _        y ©N)r�   r   Úlocation©Úselfr™   s     rQ   Ú__init__zElement.__init__Ÿ   s    € áœJ xÔ1CÔDÜ)¨8Ð4ˆHØ ˆ�rV   c                  ó   — y r˜   rN   ©r›   Úbuilders     rQ   ÚbuildzElement.build¥   s   € ØrV   c                 ó   — t         ‚)zÀReturns 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‹   zElement.asFea¨   s
   € ô "Ð!rV   c                 ó"   — | j                  «       S r˜   ©r‹   ©r›   s    rQ   Ú__str__zElement.__str__®   s   € Ø�z‰z‹|ÐrV   r˜   ©Ú )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rœ   r    r‹   r¨   rN   rV   rQ   r	   r	   œ   s   „ ÙBó!òó"órV   r	   c                   ó   — e Zd Zy)rB   N©r«   r¬   r­   rN   rV   rQ   rB   rB   ²   ó   „ ØrV   rB   c                   ó   — e Zd Zy)r'   Nr°   rN   rV   rQ   r'   r'   ¶   r±   rV   r'   c                   ó,   ‡ — e Zd ZdZdˆ fd„	Zdd„Zˆ xZS )r   zA comment in a feature file.c                 ó:   •— t         t        | �  |«       || _        y r˜   )Úsuperr   rœ   Útext)r›   r¶   r™   Ú	__class__s      €rQ   rœ   zComment.__init__½   s   ø€ ÜŒg�tÑ% hÔ/àˆ�	rV   c                 ó   — | j                   S r˜   )r¶   r£   s     rQ   r‹   zComment.asFeaÂ   s   € Ø�y‰yÐrV   r˜   r©   ©r«   r¬   r­   r®   rœ   r‹   Ú__classcell__©r·   s   @rQ   r   r   º   s   ø„ Ù&õ÷
rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)Ú	NullGlyphz5The NULL glyph, used in glyph deletion substitutions.Nc                 ó0   — t         j                  | |«       y r˜   )r'   rœ   rš   s     rQ   rœ   zNullGlyph.__init__É   s   € Ü×Ñ˜D (Õ+rV   c                  ó   — y)úBThe glyphs in this class as a tuple of :class:`GlyphName` objects.rN   rN   r§   s    rQ   ÚglyphSetzNullGlyph.glyphSetÍ   s   € àrV   c                  ó   — y)NÚNULLrN   r£   s     rQ   r‹   zNullGlyph.asFeaÑ   s   € ØrV   r˜   r©   ©r«   r¬   r­   r®   rœ   rÁ   r‹   rN   rV   rQ   r½   r½   Æ   s   „ Ù?ó,òôrV   r½   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   z)A single glyph name, such as ``cedilla``.Nc                 ó>   — t         j                  | |«       || _        y r˜   )r'   rœ   Úglyph)r›   rÇ   r™   s      rQ   rœ   zGlyphName.__init__Ø   s   € Ü×Ñ˜D (Ô+àˆ�
rV   c                 ó   — | j                   fS ©rÀ   )rÇ   r§   s    rQ   rÁ   zGlyphName.glyphSetÝ   s   € à—
‘
ˆ}ÐrV   c                 ó,   — t        | j                  «      S r˜   )r‹   rÇ   r£   s     rQ   r‹   zGlyphName.asFeaá   s   € Ü�T—Z‘ZÓ Ð rV   r˜   r©   rÄ   rN   rV   rQ   r   r   Õ   s   „ Ù3óò
ô!rV   r   c                   óD   — e Zd ZdZdd„Zd„ Zdd„Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zy)r   z1A glyph class, such as ``[acute cedilla grave]``.Nc                 ób   — t         j                  | |«       |�|ng | _        g | _        d| _        y )Nr   )r'   rœ   ÚglyphsÚoriginalÚcurr)r›   rÍ   r™   s      rQ   rœ   zGlyphClass.__init__è   s.   € Ü×Ñ˜D (Ô+à &Ð 2‘f¸ˆŒØˆŒØˆ�	rV   c                 ó,   — t        | j                  «      S rÉ   )r‘   rÍ   r§   s    rQ   rÁ   zGlyphClass.glyphSetï   s   € ä�T—[‘[Ó!Ð!rV   c                 óÄ  — t        | j                  «      r�| j                  t        | j                  «      k  rL| j                  j	                  | j                  | j                  d  «       t        | j                  «      | _        ddj                  t        t        | j                  «      «      z   dz   S ddj                  t        t        | j                  «      «      z   dz   S )Nú[ú ú])r’   rÎ   rÏ   rÍ   ÚextendrS   Úmapr‹   r£   s     rQ   r‹   zGlyphClass.asFeaó   sœ   € Üˆt�}‰}ÔØ�y‰yœ3˜tŸ{™{Ó+Ò+Ø—‘×$Ñ$ T§[¡[°·±°Ð%=Ô>Ü §¡Ó,�”	Ø˜Ÿ™¤#¤e¨T¯]©]Ó";Ó<Ñ<¸sÑBÐBà˜Ÿ™¤#¤e¨T¯[©[Ó"9Ó:Ñ:¸SÑ@Ð@rV   c                 ó:   — | j                   j                  |«       y)z6Add a list of :class:`GlyphName` objects to the class.N)rÍ   rÕ   )r›   rÍ   s     rQ   rÕ   zGlyphClass.extendü   s   € à�‰×Ñ˜6Õ"rV   c                 ó:   — | j                   j                  |«       y)z4Add a single :class:`GlyphName` object to the class.N)rÍ   Úappend)r›   rÇ   s     rQ   rÙ   zGlyphClass.append   s   € à�‰×Ñ˜5Õ!rV   c                 óP  — | j                   t        | j                  «      k  r2| j                  j	                  | j                  | j                   d «       | j                  j                  ||f«       | j                  j	                  |«       t        | j                  «      | _         y)a  Add 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_rangezGlyphClass.add_range  sr   € ð
 �9‰9”s˜4Ÿ;™;Ó'Ò'Ø�M‰M× Ñ  §¡¨T¯Y©Y¨[Ð!9Ô:Ø�‰×Ñ˜e S˜\Ô*Ø�‰×Ñ˜6Ô"Ü˜Ÿ™Ó$ˆ�	rV   c                 óŒ  — | j                   t        | j                  «      k  r2| j                  j	                  | j                  | j                   d «       | j                  j                  dj                  |«      dj                  |«      f«       | j                  j	                  |«       t        | j                  «      | _         y)z¶Add 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_rangezGlyphClass.add_cid_range  s…   € ð �9‰9”s˜4Ÿ;™;Ó'Ò'Ø�M‰M× Ñ  §¡¨T¯Y©Y¨[Ð!9Ô:Ø�‰×Ñ˜fŸm™m¨EÓ2°F·M±MÀ#Ó4FÐGÔHØ�‰×Ñ˜6Ô"Ü˜Ÿ™Ó$ˆ�	rV   c                 óh  — | j                   t        | j                  «      k  r2| j                  j	                  | j                  | j                   d «       | j                  j                  |«       | j                  j	                  |j                  «       «       t        | j                  «      | _         y)zNAdd glyphs from the given :class:`GlyphClassName` object to the
        class.N)rÏ   r’   rÍ   rÎ   rÕ   rÙ   rÁ   )r›   Úgcs     rQ   Ú	add_classzGlyphClass.add_class  st   € ð �9‰9”s˜4Ÿ;™;Ó'Ò'Ø�M‰M× Ñ  §¡¨T¯Y©Y¨[Ð!9Ô:Ø�‰×Ñ˜RÔ Ø�‰×Ñ˜2Ÿ;™;›=Ô)Ü˜Ÿ™Ó$ˆ�	rV   ©NNr©   )r«   r¬   r­   r®   rœ   rÁ   r‹   rÕ   rÙ   rÞ   rá   rä   rN   rV   rQ   r   r   å   s.   „ Ù;óò"óAò#ò"ò	%ò%ó%rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   zyA glyph class name, such as ``@FRENCH_MARKS``. This must be instantiated
    with a :class:`GlyphClassDefinition` object.Nc                 ób   — t         j                  | |«       t        |t        «      sJ ‚|| _        y r˜   )r'   rœ   r�   r   Ú
glyphclass)r›   rè   r™   s      rQ   rœ   zGlyphClassName.__init__'  s*   € Ü×Ñ˜D (Ô+Ü˜*Ô&:Ô;Ð;Ð;Ø$ˆ�rV   c                 óH   — t        | j                  j                  «       «      S rÉ   )r‘   rè   rÁ   r§   s    rQ   rÁ   zGlyphClassName.glyphSet,  s   € ä�T—_‘_×-Ñ-Ó/Ó0Ð0rV   c                 ó4   — d| j                   j                  z   S ©Nú@)rè   r‡   r£   s     rQ   r‹   zGlyphClassName.asFea0  s   € Ø�T—_‘_×)Ñ)Ñ)Ð)rV   r˜   r©   rÄ   rN   rV   rQ   r   r   #  s   „ ñ4ó%ò
1ô*rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   zˆA mark class name, such as ``@FRENCH_MARKS`` defined with ``markClass``.
    This must be instantiated with a :class:`MarkClass` object.Nc                 ób   — t         j                  | |«       t        |t        «      sJ ‚|| _        y r˜   )r'   rœ   r�   r   Ú	markClass)r›   rï   r™   s      rQ   rœ   zMarkClassName.__init__8  s)   € Ü×Ñ˜D (Ô+Ü˜)¤YÔ/Ð/Ð/Ø"ˆ�rV   c                 ó6   — | j                   j                  «       S rÉ   )rï   rÁ   r§   s    rQ   rÁ   zMarkClassName.glyphSet=  s   € à�~‰~×&Ñ&Ó(Ð(rV   c                 ó4   — d| j                   j                  z   S rë   )rï   r‡   r£   s     rQ   r‹   zMarkClassName.asFeaA  s   € Ø�T—^‘^×(Ñ(Ñ(Ð(rV   r˜   r©   rÄ   rN   rV   rQ   r   r   4  s   „ ñCó#ò
)ô)rV   r   c                   ó    — e Zd ZdZdd„Zdd„Zy)r   zAn anonymous data block.Nc                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   ÚtagÚcontent)r›   rô   rõ   r™   s       rQ   rœ   zAnonymousBlock.__init__H  s    € Ü×Ñ˜4 Ô*ØˆŒØˆ�rV   c                 ó–   — dj                  | j                  «      }|| j                  z  }|dj                  | j                  «      z  }|S )Nzanon {} {{
z}} {};

)rà   rô   rõ   ©r›   r¤   Úress      rQ   r‹   zAnonymousBlock.asFeaM  sB   € Ø×#Ñ# D§H¡HÓ-ˆØˆt�|‰|ÑˆØˆ|×"Ñ" 4§8¡8Ó,Ñ,ˆØˆ
rV   r˜   r©   ©r«   r¬   r­   r®   rœ   r‹   rN   rV   rQ   r   r   E  s   „ Ù"óô
rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   z,A block of statements: feature, lookup, etc.Nc                 ó>   — t         j                  | |«       g | _        y r˜   )rB   rœ   Ú
statementsrš   s     rQ   rœ   zBlock.__init__W  s   € Ü×Ñ˜4 Ô*Øˆ�rV   c                 óH   — | j                   D ]  }|j                  |«       Œ y)z¯When 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    zBlock.build[  s#   € ð —‘ò 	ˆAØ�G‰G�GÕñ	rV   c           	      ó¢   — |t         z  }|d|z   j                  | j                  D �cg c]  }|j                  |¬«      ‘Œ c}«      z   dz   S c c}w )Nú
©r¤   )ÚSHIFTrS   rü   r‹   )r›   r¤   rþ   s      rQ   r‹   zBlock.asFeab  sP   € Ø”%‰ˆàØ�f‰}×"Ñ"ÀDÇOÁOÖ#T¸q A§G¡G°6 GÕ$:Ò#TÓUñVàñð	
ùâ#Ts   §A
r˜   r©   ©r«   r¬   r­   r®   rœ   r    r‹   rN   rV   rQ   r   r   T  s   „ Ù6óòô
rV   r   c                   ó   — e Zd ZdZd„ Zdd„Zy)r
   zpThe top-level element of the syntax tree, containing the whole feature
    file in its ``statements`` attribute.c                 ó@   — t         j                  | d ¬«       i | _        y ©N)r™   )r   rœ   ÚmarkClassesr§   s    rQ   rœ   zFeatureFile.__init__o  s   € Ü�‰�t dˆÔ+ØˆÕrV   c                 óL   ‡— dj                  ˆfd„| j                  D «       «      S )Nr   c              3   óB   •K  — | ]  }|j                  ‰¬ «      –— Œ y­w)r  Nr¦   )rO   rþ   r¤   s     €rQ   rR   z$FeatureFile.asFea.<locals>.<genexpr>t  s   øè ø€ ÒI°A˜Ÿ™¨˜×/ÑIùs   ƒ)rS   rü   r£   s    `rQ   r‹   zFeatureFile.asFeas  s   ø€ Ø�y‰yÓI¸¿¹ÔIÓIÐIrV   Nr©   rù   rN   rV   rQ   r
   r
   k  s   „ ñ-òôJrV   r
   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   zA named feature block.Nc                 óN   — t         j                  | |«       ||c| _        | _        y r˜   ©r   rœ   r‡   Úuse_extension©r›   r‡   r  r™   s       rQ   rœ   zFeatureBlock.__init__z  ó!   € Ü�‰�t˜XÔ&Ø(,¨mÐ%ˆŒ	�4Õ%rV   c                 óV  — |j                  | j                  | j                  «       |j                  }i |_        t        j                  | |«       |j                  j                  «       D ]&  \  }}|j                  |g «      j                  |«       Œ( ||_        |j                  «        y)ú‹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‡   Ú	features_r   r    ÚitemsÚ
setdefaultrÕ   Úend_feature)r›   rŸ   ÚfeaturesÚkeyÚvalues        rQ   r    zFeatureBlock.build~  s�   € ð 	×Ñ˜dŸm™m¨T¯Y©YÔ7ð ×$Ñ$ˆØˆÔÜ�‰�D˜'Ô"Ø!×+Ñ+×1Ñ1Ó3ò 	7‰JˆC�Ø×Ñ  RÓ(×/Ñ/°Õ6ð	7à$ˆÔØ×ÑÕrV   c                 óì   — |d| j                   j                  «       z  z   }| j                  r|dz  }|dz  }|t        j	                  | |¬«      z  }||d| j                   j                  «       z  z   z  }|S )Nzfeature %s úuseExtension ú{
r  ú} %s;
)r‡   Ústripr  r   r‹   r÷   s      rQ   r‹   zFeatureBlock.asFea�  ss   € Ø�} t§y¡y§¡Ó'8Ñ8Ñ8ˆØ×ÒØ�?Ñ"ˆCØˆu‰ˆØŒu�{‰{˜4¨ˆ{Ó/Ñ/ˆØˆv˜	 D§I¡I§O¡OÓ$5Ñ5Ñ5Ñ5ˆØˆ
rV   ©FNr©   r  rN   rV   rQ   r   r   w  s   „ Ù ó<òôrV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   zYA block inside another block, for example when found inside a
    ``cvParameters`` block.Nc                 óL   — t         j                  | |«       || _        || _        y r˜   )r   rœ   rô   Ú
block_name)r›   rô   r"  r™   s       rQ   rœ   zNestedBlock.__init__›  s   € Ü�‰�t˜XÔ&ØˆŒØ$ˆ�rV   c                 ó†   — t         j                  | |«       | j                  dk(  r|j                  | j                  «       y y )NÚParamUILabelNameID)r   r    r"  Úadd_to_cv_num_named_paramsrô   rž   s     rQ   r    zNestedBlock.build   s4   € Ü�‰�D˜'Ô"Ø�?‰?Ð2Ò2Ø×.Ñ.¨t¯x©xÕ8ð 3rV   c                 óš   — dj                  || j                  «      }|t        j                  | |¬«      z  }|dj                  |«      z  }|S )Nz{}{} {{
r  z{}}};
)rà   r"  r   r‹   r÷   s      rQ   r‹   zNestedBlock.asFea¥  sI   € Ø× Ñ  ¨¯©Ó9ˆØŒu�{‰{˜4¨ˆ{Ó/Ñ/ˆØˆy×Ñ Ó'Ñ'ˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r   r   —  s   „ ñó%ò
9ô
rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   z*A named lookup, containing ``statements``.Nc                 óN   — t         j                  | |«       ||c| _        | _        y r˜   r  r  s       rQ   rœ   zLookupBlock.__init__¯  r  rV   c                 óœ   — |j                  | j                  | j                  «       t        j	                  | |«       |j                  «        y r˜   )Ústart_lookup_blockr™   r‡   r   r    Úend_lookup_blockrž   s     rQ   r    zLookupBlock.build³  s4   € à×"Ñ" 4§=¡=°$·)±)Ô<Ü�‰�D˜'Ô"Ø× Ñ Õ"rV   c                 óÚ   — dj                  | j                  «      }| j                  r|dz  }|dz  }|t        j	                  | |¬«      z  }|dj                  || j                  «      z  }|S )Nz
lookup {} r  r  r  z	{}}} {};
)rà   r‡   r  r   r‹   r÷   s      rQ   r‹   zLookupBlock.asFea¹  si   € Ø×!Ñ! $§)¡)Ó,ˆØ×ÒØ�?Ñ"ˆCØˆu‰ˆØŒu�{‰{˜4¨ˆ{Ó/Ñ/ˆØˆ|×"Ñ" 6¨4¯9©9Ó5Ñ5ˆØˆ
rV   r  r©   r  rN   rV   rQ   r   r   ¬  s   „ Ù4ó<ò#ôrV   r   c                   ó,   ‡ — e Zd ZdZdd„Zdˆ fd„	Zˆ xZS )rG   zA ``table ... { }`` block.c                 ó>   — t         j                  | |«       || _        y r˜   )r   rœ   r‡   )r›   r‡   r™   s      rQ   rœ   zTableBlock.__init__Æ  s   € Ü�‰�t˜XÔ&Øˆ�	rV   c                 óà   •— dj                  | j                  j                  «       «      }|t        t        | �  |¬«      z  }|dj                  | j                  j                  «       «      z  }|S )Nztable {} {{
r  z}} {};
)rà   r‡   r  rµ   rG   r‹   )r›   r¤   rø   r·   s      €rQ   r‹   zTableBlock.asFeaÊ  s\   ø€ Ø×$Ñ$ T§Y¡Y§_¡_Ó%6Ó7ˆØŒu”Z Ñ,°FÐ,Ó;Ñ;ˆØˆz× Ñ  §¡§¡Ó!2Ó3Ñ3ˆØˆ
rV   r˜   r©   r¹   r»   s   @rQ   rG   rG   Ã  s   ø„ Ù$ó÷ñ rV   rG   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   z!Example: ``@UPPERCASE = [A-Z];``.Nc                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   r‡   rÍ   )r›   r‡   rÍ   r™   s       rQ   rœ   zGlyphClassDefinition.__init__Ô  s    € Ü×Ñ˜4 Ô*ØˆŒ	Øˆ�rV   c                 óH   — t        | j                  j                  «       «      S rÉ   )r‘   rÍ   rÁ   r§   s    rQ   rÁ   zGlyphClassDefinition.glyphSetÙ  s   € ä�T—[‘[×)Ñ)Ó+Ó,Ð,rV   c                 ób   — d| j                   z   dz   | j                  j                  «       z   dz   S )Nrì   z = ú;)r‡   rÍ   r‹   r£   s     rQ   r‹   zGlyphClassDefinition.asFeaÝ  s,   € Ø�T—Y‘Y‰ Ñ&¨¯©×):Ñ):Ó)<Ñ<¸sÑBÐBrV   r˜   r©   rÄ   rN   rV   rQ   r   r   Ñ  s   „ Ù+óò
-ôCrV   r   c                   ó(   — e Zd ZdZ	 dd„Zd„ Zdd„Zy)r   z¡Example: ``GlyphClassDef @UPPERCASE, [B], [C], [D];``. The parameters
    must be either :class:`GlyphClass` or :class:`GlyphClassName` objects, or
    ``None``.Nc                 ój   — t         j                  | |«       ||c| _        | _        || _        || _        y r˜   )rB   rœ   Ú
baseGlyphsÚ
markGlyphsÚligatureGlyphsÚcomponentGlyphs)r›   r7  r8  r9  r:  r™   s         rQ   rœ   zGlyphClassDefStatement.__init__æ  s4   € ô 	×Ñ˜4 Ô*Ø,6¸
Ð(ˆŒ˜œØ,ˆÔØ.ˆÕrV   c                 óÂ  — | j                   r| j                   j                  «       n	t        «       }| j                  r| j                  j                  «       n	t        «       }| j                  r| j                  j                  «       n	t        «       }| j
                  r| j
                  j                  «       n	t        «       }|j                  | j                  ||||«       y)z3Calls the builder's ``add_glyphClassDef`` callback.N)r7  rÁ   r‘   r9  r8  r:  Úadd_glyphClassDefr™   )r›   rŸ   rƒ   Úligaro   Úcomps         rQ   r    zGlyphClassDefStatement.buildî  s”   € à-1¯_ª_ˆt�‰×'Ñ'Ô)Ä%Ã'ˆØ15×1DÒ1Dˆt×"Ñ"×+Ñ+Ô-Ì%Ë'ˆØ-1¯_ª_ˆt�‰×'Ñ'Ô)Ä%Ã'ˆØ26×2FÒ2Fˆt×#Ñ#×,Ñ,Ô.ÌEËGˆØ×!Ñ! $§-¡-°°t¸TÀ4ÕHrV   c                 ób  — dj                  | j                  r| j                  j                  «       nd| j                  r| j                  j                  «       nd| j                  r| j                  j                  «       nd| j
                  r| j
                  j                  «       «      S d«      S )NzGlyphClassDef {}, {}, {}, {};rª   )rà   r7  r‹   r9  r8  r:  r£   s     rQ   r‹   zGlyphClassDefStatement.asFeaö  sŒ   € Ø.×5Ñ5Ø'+§¢ˆD�O‰O×!Ñ!Ô#¸BØ+/×+>Ò+>ˆD×Ñ×%Ñ%Ô'ÀBØ'+§¢ˆD�O‰O×!Ñ!Ô#¸BØ,0×,@Ò,@ˆD× Ñ ×&Ñ&Ó(ó	
ð 	
ð GIó	
ð 	
rV   r˜   r©   r  rN   rV   rQ   r   r   á  s   „ ñð
 QUó/òIô
rV   r   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zy)r   aB  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                 ó>   — || _         g | _        t        «       | _        y r˜   )r‡   Údefinitionsr   rÍ   )r›   r‡   s     rQ   rœ   zMarkClass.__init__  s   € ØˆŒ	ØˆÔÜ!“mˆ�rV   c                 ó@  — t        |t        «      sJ ‚| j                  j                  |«       |j	                  «       D ]^  }|| j
                  v r?| j
                  |   j                  }|€d}nd|› �}t        d|›d|›�|j                  «      ‚|| j
                  |<   Œ` y)z@Add a :class:`MarkClassDefinition` statement to this mark class.Nrª   z at zGlyph z already defined)r�   r   rB  rÙ   rÁ   rÍ   r™   r   )r›   Ú
definitionrÇ   ÚotherLocrÝ   s        rQ   ÚaddDefinitionzMarkClass.addDefinition  s£   € ä˜*Ô&9Ô:Ð:Ð:Ø×Ñ×Ñ 
Ô+Ø×(Ñ(Ó*ò 
	,ˆEØ˜Ÿ™Ñ#ØŸ;™; uÑ-×6Ñ6�ØÐ#Ø‘Cà   
Ð+�CÝ%Ú49¹3Ð?À×ATÑATóð ð ",ˆD�K‰K˜Òñ
	,rV   c                 óH   — t        | j                  j                  «       «      S rÉ   )r‘   rÍ   Úkeysr§   s    rQ   rÁ   zMarkClass.glyphSet#  s   € ä�T—[‘[×%Ñ%Ó'Ó(Ð(rV   c                 óJ   — dj                  d„ | j                  D «       «      }|S )Nr   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr˜   r¦   )rO   Úds     rQ   rR   z"MarkClass.asFea.<locals>.<genexpr>(  s   è ø€ Ò< a˜Ÿ™Ÿ	Ñ<ùó   ‚)rS   rB  r÷   s      rQ   r‹   zMarkClass.asFea'  s!   € Ø�i‰iÑ<¨4×+;Ñ+;Ô<Ó<ˆØˆ
rV   Nr©   )r«   r¬   r­   r®   rœ   rF  rÁ   r‹   rN   rV   rQ   r   r   ÿ  s   „ ñò$ò
,ò )ôrV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   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                 óÄ   — t         j                  | |«       t        |t        «      sJ ‚t        |t        «      rt        |t
        «      sJ ‚|||c| _        | _        | _        y r˜   )	rB   rœ   r�   r   r   r'   rï   rW   rÍ   )r›   rï   rW   rÍ   r™   s        rQ   rœ   zMarkClassDefinition.__init__C  sQ   € Ü×Ñ˜4 Ô*Ü˜)¤YÔ/Ð/Ð/Ü˜&¤&Ô)¬j¸ÄÔ.LÐLÐLØ3<¸fÀfÐ0ˆŒ˜œ T¥[rV   c                 ó6   — | j                   j                  «       S rÉ   )rÍ   rÁ   r§   s    rQ   rÁ   zMarkClassDefinition.glyphSetI  s   € à�{‰{×#Ñ#Ó%Ð%rV   c                 ó°   — dj                  | j                  j                  «       | j                  j                  «       | j                  j
                  «      S )NzmarkClass {} {} @{};)rà   rÍ   r‹   rW   rï   r‡   r£   s     rQ   r‹   zMarkClassDefinition.asFeaM  s@   € Ø%×,Ñ,Ø�K‰K×ÑÓ §¡×!2Ñ!2Ó!4°d·n±n×6IÑ6Ió
ð 	
rV   r˜   r©   rÄ   rN   rV   rQ   r   r   ,  s   „ ñó,Mò&ô
rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   z¹A ``sub ... from ...`` statement.

    ``glyph`` and ``replacement`` should be `glyph-containing objects`_.
    ``prefix`` and ``suffix`` should be lists of `glyph-containing objects`_.Nc                 ój   — t         j                  | |«       |||c| _        | _        | _        || _        y r˜   )rB   rœ   ÚprefixrÇ   ÚsuffixÚreplacement)r›   rS  rÇ   rT  rU  r™   s         rQ   rœ   z AlternateSubstStatement.__init__Y  s0   € Ü×Ñ˜4 Ô*Ø06¸¸vÐ,ˆŒ�T”Z ¤Ø&ˆÕrV   c                 ó   — | j                   j                  «       }t        |«      dk(  sJ |«       ‚t        |«      d   }| j                  D �cg c]  }|j                  «       ‘Œ }}| j
                  D �cg c]  }|j                  «       ‘Œ }}| j                  j                  «       }|j                  | j                  ||||«       yc c}w c c}w )z5Calls the builder's ``add_alternate_subst`` callback.r�   r   N)	rÇ   rÁ   r’   ÚlistrS  rT  rU  Úadd_alternate_substr™   )r›   rŸ   rÇ   ÚprS  rþ   rT  rU  s           rQ   r    zAlternateSubstStatement.build^  s¦   € à—
‘
×#Ñ#Ó%ˆÜ�5‹z˜QŠÐ% Ó%ˆÜ�U“˜A‘ˆØ(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø×&Ñ&×/Ñ/Ó1ˆØ×#Ñ# D§M¡M°6¸5À&È+ÕVùò 5ùÚ4s   ÁCÁ3Cc                 ó  — d}t        | j                  «      st        | j                  «      r¤t        | j                  «      r/|dj                  t	        t
        | j                  «      «      dz   z  }|t        | j                  «      dz   z  }t        | j                  «      rH|ddj                  t	        t
        | j                  «      «      z   z  }n|t        | j                  «      z  }|dz  }|t        | j                  «      z  }|dz  }|S )Núsub rÓ   ú'z from r4  )r’   rS  rT  rS   rÖ   r‹   rÇ   rU  r÷   s      rQ   r‹   zAlternateSubstStatement.asFeah  sÓ   € ØˆÜˆt�{‰{Ôœs 4§;¡;Ô/Ü�4—;‘;ÔØ�s—x‘x¤¤E¨4¯;©;Ó 7Ó8¸3Ñ>Ñ>�Ø”5˜Ÿ™Ó$ sÑ*Ñ*ˆCÜ�4—;‘;ÔØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>‘à”5˜Ÿ™Ó$Ñ$ˆCØˆx‰ˆØŒu�T×%Ñ%Ó&Ñ&ˆØˆs‰
ˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r   r   S  s   „ ñQó
'ò
WôrV   r   c                   ó*   — e Zd ZdZ	 	 	 	 	 dd„Zdd„Zy)r   z¬An ``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                 óˆ   — t         j                  | |«       || _        |||c| _        | _        | _        ||c| _        | _        y r˜   )r'   rœ   r‡   ÚxÚyÚcontourpointÚxDeviceTableÚyDeviceTable)r›   r_  r`  r‡   ra  rb  rc  r™   s           rQ   rœ   zAnchor.__init__  sD   € ô 	×Ñ˜D (Ô+ØˆŒ	Ø,-¨q°,Ð)ˆŒ�”˜Ô)Ø/;¸\Ð,ˆÔ˜4Õ,rV   c                 ó¢  — | j                   �dj                  | j                   «      S dj                  | j                  | j                  «      }| j                  r|dj                  | j                  «      z  }| j
                  s| j                  r:|dz  }|t        | j
                  «      z  }|dz  }|t        | j                  «      z  }|dz  }|S )Nz<anchor {}>z<anchor {} {}ú contourpoint {}rÓ   ú>)r‡   rà   r_  r`  ra  rb  rc  rU   r÷   s      rQ   r‹   zAnchor.asFeaŽ  s»   € Ø�9‰9Ð Ø ×'Ñ'¨¯	©	Ó2Ð2Ø×$Ñ$ T§V¡V¨T¯V©VÓ4ˆØ×ÒØÐ%×,Ñ,¨T×->Ñ->Ó?Ñ?ˆCØ×Ò × 1Ò 1Ø�3‰JˆCØ”> $×"3Ñ"3Ó4Ñ4ˆCØ�3‰JˆCØ”> $×"3Ñ"3Ó4Ñ4ˆCØˆs‰
ˆØˆ
rV   )NNNNNr©   rù   rN   rV   rQ   r   r   x  s#   „ ñð ØØØØóJôrV   r   c                   ó    — e Zd ZdZdd„Zdd„Zy)r   zCA named anchor definition. (2.e.viii). ``name`` should be a string.Nc                 ón   — t         j                  | |«       ||||f\  | _        | _        | _        | _        y r˜   )rB   rœ   r‡   r_  r`  ra  )r›   r‡   r_  r`  ra  r™   s         rQ   rœ   zAnchorDefinition.__init__   s2   € Ü×Ñ˜4 Ô*Ø7;¸QÀÀ<Ð7OÑ4ˆŒ	�4”6˜4œ6 4Õ#4rV   c                 óâ   — dj                  | j                  | j                  «      }| j                  r|dj                  | j                  «      z  }|dj                  | j                  «      z  }|S )NzanchorDef {} {}re  z {};)rà   r_  r`  ra  r‡   r÷   s      rQ   r‹   zAnchorDefinition.asFea¤  s]   € Ø×&Ñ& t§v¡v¨t¯v©vÓ6ˆØ×ÒØÐ%×,Ñ,¨T×->Ñ->Ó?Ñ?ˆCØˆv�}‰}˜TŸY™YÓ'Ñ'ˆØˆ
rV   rå   r©   rù   rN   rV   rQ   r   r   �  s   „ ÙMóPôrV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   z&A ``GDEF`` table ``Attach`` statement.Nc                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   rÍ   ÚcontourPoints)r›   rÍ   rl  r™   s       rQ   rœ   zAttachStatement.__init__¯  s!   € Ü×Ñ˜4 Ô*ØˆŒØ*ˆÕrV   c                 ó†   — | j                   j                  «       }|j                  | j                  || j                  «       y)z3Calls the builder's ``add_attach_points`` callback.N)rÍ   rÁ   Úadd_attach_pointsr™   rl  ©r›   rŸ   rÍ   s      rQ   r    zAttachStatement.build´  s0   € à—‘×%Ñ%Ó'ˆØ×!Ñ! $§-¡-°¸×9KÑ9KÕLrV   c                 ó–   — dj                  | j                  j                  «       dj                  d„ | j                  D «       «      «      S )NzAttach {} {};rÓ   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   ©Ústr)rO   Úcs     rQ   rR   z(AttachStatement.asFea.<locals>.<genexpr>»  s   è ø€ Ò)M°Q¬#¨a¯&Ñ)Mùó   ‚)rà   rÍ   r‹   rS   rl  r£   s     rQ   r‹   zAttachStatement.asFea¹  s<   € Ø×%Ñ%Ø�K‰K×ÑÓ §¡Ñ)M¸$×:LÑ:LÔ)MÓ!Mó
ð 	
rV   r˜   r©   r  rN   rV   rQ   r   r   ¬  s   „ Ù0ó+ò
Mô

rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r    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                 óú   — t         j                  | |«       |||c| _        | _        | _        t        |«      | _        t        |«      D ]  \  }}|sŒ		 d„ |D «        Œ y # t        $ r |g| j                  |<   Y Œ1w xY w)Nc              3   ó    K  — | ]  }|–— Œ y ­wr˜   rN   ©rO   Ú_s     rQ   rR   z4ChainContextPosStatement.__init__.<locals>.<genexpr>Ô  ó   è ø€ Ò'˜1”QÑ'ùó   ‚©	rB   rœ   rS  rÍ   rT  rW  Úlookupsr_   Ú	TypeError©r›   rS  rÍ   rT  r~  r™   Úirm   s           rQ   rœ   z!ChainContextPosStatement.__init__Í  ó{   € Ü×Ñ˜4 Ô*Ø06¸ÀÐ-ˆŒ�T”[ $¤+Ü˜G“}ˆŒÜ" 7Ó+ò 	/‰IˆAˆvÚð/Ù' Ö'ñ	/øô !ò /Ø'- h�D—L‘L “Oð/úó   Á	AÁA:Á9A:c                 ó^  — | j                   D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}|j	                  | j
                  |||| j                  «       yc c}w c c}w c c}w )z7Calls the builder's ``add_chain_context_pos`` callback.N)rS  rÁ   rÍ   rT  Úadd_chain_context_posr™   r~  ©r›   rŸ   rY  rS  r•   rÍ   rþ   rT  s           rQ   r    zChainContextPosStatement.buildØ  s…   € à(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø×%Ñ%Ø�M‰M˜6 6¨6°4·<±<õ	
ùò 5ùÚ4ùÚ4ó   �B ¶B%ÁB*c                 ó,  — d}t        | j                  «      s;t        | j                  «      s&t        | j                  D �cg c]  }|d u‘Œ c}«      �rt        | j                  «      r(|dj                  d„ | j                  D «       «      dz   z  }t        | j                  «      D ]q  \  }}||j                  «       dz   z  }| j                  |   r&| j                  |   D ]  }|d|j                  z   z  }Œ |t        | j                  «      dz
  k  sŒm|dz  }Œs t        | j                  «      r\|ddj                  t        t        | j                  «      «      z   z  }n,|dj                  t        t        | j                  «      «      z  }|dz  }|S c c}w )Núpos rÓ   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr˜   r¦   ©rO   r•   s     rQ   rR   z1ChainContextPosStatement.asFea.<locals>.<genexpr>é  ó   è ø€ Ò?¨a §¡§	Ñ?ùrL  r\  ú lookup r�   r4  ©r’   rS  rT  Úanyr~  rS   r_   rÍ   r‹   r‡   rÖ   rÇ   ©r›   r¤   rø   r_  r�  r•   Úlus          rQ   r‹   zChainContextPosStatement.asFeaá  óN  € Øˆä�—‘ÔÜ�4—;‘;ÔÜ¨4¯<©<Ö8 a�A˜T’MÒ8Õ9ä�4—;‘;ÔØ�s—x‘xÑ?°4·;±;Ô?Ó?À#ÑEÑE�Ü! $§+¡+Ó.ò ‘��1Ø�q—w‘w“y 3‘Ñ&�Ø—<‘< ’?Ø"Ÿl™l¨1™oò 4˜Ø˜z¨B¯G©GÑ3Ñ3™ð4à”s˜4Ÿ;™;Ó'¨!Ñ+Ó+Ø˜3‘J‘Cðô �4—;‘;ÔØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>‘à�3—8‘8œC¤ t§z¡zÓ2Ó3Ñ3ˆCØˆs‰
ˆØˆ
ùò! 9ó   Á Fr˜   r©   r  rN   rV   rQ   r    r    ¿  ó   „ ñó	/ò
ôrV   r    c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r!   aA  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                 óú   — t         j                  | |«       |||c| _        | _        | _        t        |«      | _        t        |«      D ]  \  }}|sŒ		 d„ |D «        Œ y # t        $ r |g| j                  |<   Y Œ1w xY w)Nc              3   ó    K  — | ]  }|–— Œ y ­wr˜   rN   ry  s     rQ   rR   z6ChainContextSubstStatement.__init__.<locals>.<genexpr>  r{  r|  r}  r€  s           rQ   rœ   z#ChainContextSubstStatement.__init__  r‚  rƒ  c                 ó^  — | j                   D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}|j	                  | j
                  |||| j                  «       yc c}w c c}w c c}w )z9Calls the builder's ``add_chain_context_subst`` callback.N)rS  rÁ   rÍ   rT  Úadd_chain_context_substr™   r~  r†  s           rQ   r    z ChainContextSubstStatement.build  s…   € à(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø×'Ñ'Ø�M‰M˜6 6¨6°4·<±<õ	
ùò 5ùÚ4ùÚ4r‡  c                 ó,  — d}t        | j                  «      s;t        | j                  «      s&t        | j                  D �cg c]  }|d u‘Œ c}«      �rt        | j                  «      r(|dj                  d„ | j                  D «       «      dz   z  }t        | j                  «      D ]q  \  }}||j                  «       dz   z  }| j                  |   r&| j                  |   D ]  }|d|j                  z   z  }Œ |t        | j                  «      dz
  k  sŒm|dz  }Œs t        | j                  «      r\|ddj                  t        t        | j                  «      «      z   z  }n,|dj                  t        t        | j                  «      «      z  }|dz  }|S c c}w )Nr[  rÓ   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z3ChainContextSubstStatement.asFea.<locals>.<genexpr>#  rŒ  rL  r\  r�  r�   r4  rŽ  r�  s          rQ   r‹   z ChainContextSubstStatement.asFea  r’  r“  r˜   r©   r  rN   rV   rQ   r!   r!   ù  r”  rV   r!   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r$   znA cursive positioning statement. Entry and exit anchors can either
    be :class:`Anchor` objects or ``None``.Nc                 ó\   — t         j                  | |«       || _        ||c| _        | _        y r˜   )rB   rœ   rè   ÚentryAnchorÚ
exitAnchor)r›   rè   rž  rŸ  r™   s        rQ   rœ   zCursivePosStatement.__init__7  s*   € Ü×Ñ˜4 Ô*Ø$ˆŒØ,7¸Ð)ˆÔ˜$�/rV   c                 ó˜   — |j                  | j                  | j                  j                  «       | j                  | j
                  «       y)z8Calls the builder object's ``add_cursive_pos`` callback.N)Úadd_cursive_posr™   rè   rÁ   rž  rŸ  rž   s     rQ   r    zCursivePosStatement.build<  s4   € à×ÑØ�M‰M˜4Ÿ?™?×3Ñ3Ó5°t×7GÑ7GÈÏÉõ	
rV   c                 óø   — | j                   r| j                   j                  «       nd}| j                  r| j                  j                  «       nd}dj                  | j                  j                  «       ||«      S )Nú<anchor NULL>zpos cursive {} {} {};)rž  r‹   rŸ  rà   rè   )r›   r¤   ÚentryÚexits       rQ   r‹   zCursivePosStatement.asFeaB  s\   € Ø,0×,<Ò,<�× Ñ ×&Ñ&Ô(À/ˆØ*.¯/ª/ˆt�‰×$Ñ$Ô&¸ˆØ&×-Ñ-¨d¯o©o×.CÑ.CÓ.EÀuÈdÓSÐSrV   r˜   r©   r  rN   rV   rQ   r$   r$   3  s   „ ñ/óDò

ôTrV   r$   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r)   zExample: ``feature salt;``Nc                 óN   — t         j                  | |«       ||c| _        | _        y r˜   )rB   rœ   r™   ÚfeatureName)r›   r¨  r™   s      rQ   rœ   z"FeatureReferenceStatement.__init__K  s#   € Ü×Ñ˜4 Ô*Ø+3°[Ð'ˆŒ�tÕ'rV   c                 óP   — |j                  | j                  | j                  «       y)z>Calls the builder object's ``add_feature_reference`` callback.N)Úadd_feature_referencer™   r¨  rž   s     rQ   r    zFeatureReferenceStatement.buildO  s   € à×%Ñ% d§m¡m°T×5EÑ5EÕFrV   c                 ó8   — dj                  | j                  «      S )Nzfeature {};)rà   r¨  r£   s     rQ   r‹   zFeatureReferenceStatement.asFeaS  s   € Ø×#Ñ# D×$4Ñ$4Ó5Ð5rV   r˜   r©   r  rN   rV   rQ   r)   r)   H  s   „ Ù$óBòGô6rV   r)   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r,   zøAn ``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                 ó>   — t         j                  | |«       || _        y r˜   ©rB   rœ   ÚchainContexts©r›   r¯  r™   s      rQ   rœ   zIgnorePosStatement.__init__^  ó   € Ü×Ñ˜4 Ô*Ø*ˆÕrV   c                 ó8  — | j                   D ]|  \  }}}|D �cg c]  }|j                  «       ‘Œ }}|D �cg c]  }|j                  «       ‘Œ }}|D �cg c]  }|j                  «       ‘Œ }}|j                  | j                  |||g «       Œ~ yc c}w c c}w c c}w )z[Calls the builder object's ``add_chain_context_pos`` callback on each
        rule context.N)r¯  rÁ   r…  r™   ©r›   rŸ   rS  rÍ   rT  rY  r•   rþ   s           rQ   r    zIgnorePosStatement.buildb  s‘   € ð '+×&8Ñ&8ò 	UÑ"ˆF�F˜FØ,2Ö3 q�a—j‘j•lÐ3ˆFÐ3Ø,2Ö3 q�a—j‘j•lÐ3ˆFÐ3Ø,2Ö3 q�a—j‘j•lÐ3ˆFÐ3Ø×)Ñ)¨$¯-©-¸ÀÈÐQSÕTñ		UùÚ3ùÚ3ùÚ3ó   ˜BµBÁBc           	      óì  — g }| j                   D ]Í  \  }}}d}t        |«      st        |«      r|t        |«      r%|dj                  t        t        |«      «      dz   z  }|dj                  d„ |D «       «      z  }t        |«      rH|ddj                  t        t        |«      «      z   z  }n"|dj                  t        t        |«      «      z  }|j                  |«       ŒÏ ddj                  |«      z   dz   S )Nrª   rÓ   c              3   óB   K  — | ]  }|j                  «       d z   –— Œ y­w©r\  Nr¦   r‹  s     rQ   rR   z+IgnorePosStatement.asFea.<locals>.<genexpr>r  s   è ø€ Ò@°A §¡£	¨C¥Ñ@ùó   ‚zignore pos rL   r4  ©r¯  r’   rS   rÖ   r‹   rÙ   ©r›   r¤   ÚcontextsrS  rÍ   rT  rø   s          rQ   r‹   zIgnorePosStatement.asFeak  sÛ   € ØˆØ&*×&8Ñ&8ò 
	!Ñ"ˆF�F˜FØˆCÜ�6Œ{œc &œkÜ�v”;Ø˜3Ÿ8™8¤C¬¨vÓ$6Ó7¸#Ñ=Ñ=�CØ�s—x‘xÑ@¸Ô@Ó@Ñ@�Ü�v”;Ø˜3 §¡¬#¬e°VÓ*<Ó!=Ñ=Ñ=‘Cà�s—x‘x¤¤E¨6Ó 2Ó3Ñ3�Ø�O‰O˜CÕ ð
	!ð ˜tŸy™y¨Ó2Ñ2°SÑ8Ð8rV   r˜   r©   r  rN   rV   rQ   r,   r,   W  s   „ ñ%ó+òUô9rV   r,   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r-   zøAn ``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                 ó>   — t         j                  | |«       || _        y r˜   r®  r°  s      rQ   rœ   zIgnoreSubstStatement.__init__‚  r±  rV   c                 ó8  — | j                   D ]|  \  }}}|D �cg c]  }|j                  «       ‘Œ }}|D �cg c]  }|j                  «       ‘Œ }}|D �cg c]  }|j                  «       ‘Œ }}|j                  | j                  |||g «       Œ~ yc c}w c c}w c c}w )z]Calls the builder object's ``add_chain_context_subst`` callback on
        each rule context.N)r¯  rÁ   r™  r™   r³  s           rQ   r    zIgnoreSubstStatement.build†  s‘   € ð '+×&8Ñ&8ò 	WÑ"ˆF�F˜FØ,2Ö3 q�a—j‘j•lÐ3ˆFÐ3Ø,2Ö3 q�a—j‘j•lÐ3ˆFÐ3Ø,2Ö3 q�a—j‘j•lÐ3ˆFÐ3Ø×+Ñ+¨D¯M©M¸6À6È6ÐSUÕVñ		WùÚ3ùÚ3ùÚ3r´  c           	      óz  — g }| j                   D ]”  \  }}}d}t        |«      r%|dj                  t        t        |«      «      dz   z  }|dj                  d„ |D «       «      z  }t        |«      r%|ddj                  t        t        |«      «      z   z  }|j                  |«       Œ– ddj                  |«      z   dz   S )Nrª   rÓ   c              3   óB   K  — | ]  }|j                  «       d z   –— Œ y­wr·  r¦   r‹  s     rQ   rR   z-IgnoreSubstStatement.asFea.<locals>.<genexpr>•  s   è ø€ Ò<°˜AŸG™G›I¨�OÑ<ùr¸  zignore sub rL   r4  r¹  rº  s          rQ   r‹   zIgnoreSubstStatement.asFea�  s´   € ØˆØ&*×&8Ñ&8ò 	!Ñ"ˆF�F˜FØˆCÜ�6Œ{Ø�s—x‘x¤¤E¨6Ó 2Ó3°cÑ9Ñ9�Ø�3—8‘8Ñ<°VÔ<Ó<Ñ<ˆCÜ�6Œ{Ø�s˜SŸX™X¤c¬%°Ó&8Ó9Ñ9Ñ9�Ø�O‰O˜CÕ ð	!ð ˜tŸy™y¨Ó2Ñ2°SÑ8Ð8rV   r˜   r©   r  rN   rV   rQ   r-   r-   {  s   „ ñ%ó+òWô
9rV   r-   c                   ó2   ‡ — e Zd ZdZdˆ fd„	Zd„ Zdd„Zˆ xZS )r.   zAn ``include()`` statement.c                 ó:   •— t         t        | �  |«       || _        y r˜   )rµ   r.   rœ   Úfilename)r›   rÃ  r™   r·   s      €rQ   rœ   zIncludeStatement.__init__Ÿ  s   ø€ ÜÔ Ñ.¨xÔ8Ø ˆ�rV   c                 ó.   — t        d| j                  «      ‚)NzqBuilding an include statement is not implemented yet. Instead, use Parser(..., followIncludes=True) for building.)r   r™   r§   s    rQ   r    zIncludeStatement.build£  s   € äðJà�M‰Mó
ð 	
rV   c                 ó&   — |d| j                   z  z   S )Nzinclude(%s);)rÃ  r£   s     rQ   r‹   zIncludeStatement.asFea«  s   € Ø˜¨¯©Ñ6Ñ6Ð6rV   r˜   r©   )r«   r¬   r­   r®   rœ   r    r‹   rº   r»   s   @rQ   r.   r.   œ  s   ø„ Ù%õ!ò
÷7rV   r.   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r/   z*A ``language`` statement within a feature.Nc                 óz   — t         j                  | |«       t        |«      dk(  sJ ‚|| _        || _        || _        y )Né   )rB   rœ   r’   rk   Úinclude_defaultrw   )r›   rk   rÉ  rw   r™   s        rQ   rœ   zLanguageStatement.__init__²  s:   € Ü×Ñ˜4 Ô*Ü�8‹} Ò!Ð!Ð!Ø ˆŒØ.ˆÔØ ˆ�rV   c                 ó~   — |j                  | j                  | j                  | j                  | j                  ¬«       y)z4Call the builder object's ``set_language`` callback.)r™   rk   rÉ  rw   N)Úset_languager™   rk   rÉ  rw   rž   s     rQ   r    zLanguageStatement.build¹  s3   € à×ÑØ—]‘]Ø—]‘]Ø ×0Ñ0Ø—]‘]ð	 	õ 	
rV   c                 ó¦   — dj                  | j                  j                  «       «      }| j                  s|dz  }| j                  r|dz  }|dz  }|S )Nzlanguage {}z exclude_dfltz	 requiredr4  )rà   rk   r  rÉ  rw   r÷   s      rQ   r‹   zLanguageStatement.asFeaÂ  sQ   € Ø×"Ñ" 4§=¡=×#6Ñ#6Ó#8Ó9ˆØ×#Ò#Ø�?Ñ"ˆCØ�=Š=Ø�;ÑˆCØˆs‰
ˆØˆ
rV   )TFNr©   r  rN   rV   rQ   r/   r/   ¯  s   „ Ù4ó!ò
ôrV   r/   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r0   z)A top-level ``languagesystem`` statement.Nc                 óN   — t         j                  | |«       ||c| _        | _        y r˜   )rB   rœ   r{   rk   )r›   r{   rk   r™   s       rQ   rœ   z LanguageSystemStatement.__init__Ï  s"   € Ü×Ñ˜4 Ô*Ø&,¨hÐ"ˆŒ�T•]rV   c                 óf   — |j                  | j                  | j                  | j                  «       y)z<Calls the builder object's ``add_language_system`` callback.N)Úadd_language_systemr™   r{   rk   rž   s     rQ   r    zLanguageSystemStatement.buildÓ  s    € à×#Ñ# D§M¡M°4·;±;ÀÇÁÕNrV   c                 ój   — dj                  | j                  | j                  j                  «       «      S )Nzlanguagesystem {} {};)rà   r{   rk   r  r£   s     rQ   r‹   zLanguageSystemStatement.asFea×  s&   € Ø&×-Ñ-¨d¯k©k¸4¿=¹=×;NÑ;NÓ;PÓQÐQrV   r˜   r©   r  rN   rV   rQ   r0   r0   Ì  s   „ Ù3ó8òOôRrV   r0   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r*   zŒA ``head`` table ``FontRevision`` statement. ``revision`` should be a
    number, and will be formatted to three significant decimal places.Nc                 ó>   — t         j                  | |«       || _        y r˜   )rB   rœ   Úrevision)r›   rÔ  r™   s      rQ   rœ   zFontRevisionStatement.__init__ß  s   € Ü×Ñ˜4 Ô*Ø ˆ�rV   c                 óP   — |j                  | j                  | j                  «       y r˜   )Úset_font_revisionr™   rÔ  rž   s     rQ   r    zFontRevisionStatement.buildã  s   € Ø×!Ñ! $§-¡-°·±Õ?rV   c                 ó8   — dj                  | j                  «      S )NzFontRevision {:.3f};)rà   rÔ  r£   s     rQ   r‹   zFontRevisionStatement.asFeaæ  s   € Ø%×,Ñ,¨T¯]©]Ó;Ð;rV   r˜   r©   r  rN   rV   rQ   r*   r*   Û  s   „ ñJó!ò@ô<rV   r*   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r1   z˜A ``GDEF`` table ``LigatureCaretByIndex`` statement. ``glyphs`` should be
    a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 óN   — t         j                  | |«       ||c| _        | _        y r˜   ©rB   rœ   rÍ   Úcarets©r›   rÍ   rÛ  r™   s       rQ   rœ   z&LigatureCaretByIndexStatement.__init__î  ó"   € Ü×Ñ˜4 Ô*Ø$*¨FÐ ˆŒ�T•[rV   c                 ó˜   — | j                   j                  «       }|j                  | j                  |t	        | j
                  «      «       y)zBCalls the builder object's ``add_ligatureCaretByIndex_`` callback.N)rÍ   rÁ   Úadd_ligatureCaretByIndex_r™   ÚsetrÛ  ro  s      rQ   r    z#LigatureCaretByIndexStatement.buildò  s3   € à—‘×%Ñ%Ó'ˆØ×)Ñ)¨$¯-©-¸ÄÀTÇ[Á[ÓAQÕRrV   c                 ó–   — dj                  | j                  j                  «       dj                  d„ | j                  D «       «      «      S )NzLigatureCaretByIndex {} {};rÓ   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   rr  ©rO   r_  s     rQ   rR   z6LigatureCaretByIndexStatement.asFea.<locals>.<genexpr>ù  ó   è ø€ Ò)F°Q¬#¨a¯&Ñ)Fùru  ©rà   rÍ   r‹   rS   rÛ  r£   s     rQ   r‹   z#LigatureCaretByIndexStatement.asFea÷  s:   € Ø,×3Ñ3Ø�K‰K×ÑÓ §¡Ñ)F¸$¿+¹+Ô)FÓ!Fó
ð 	
rV   r˜   r©   r  rN   rV   rQ   r1   r1   ê  s   „ ñRó4òSô

rV   r1   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r2   z–A ``GDEF`` table ``LigatureCaretByPos`` statement. ``glyphs`` should be
    a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 óN   — t         j                  | |«       ||c| _        | _        y r˜   rÚ  rÜ  s       rQ   rœ   z$LigatureCaretByPosStatement.__init__  rÝ  rV   c                 ó˜   — | j                   j                  «       }|j                  | j                  |t	        | j
                  «      «       y)z@Calls the builder object's ``add_ligatureCaretByPos_`` callback.N)rÍ   rÁ   Úadd_ligatureCaretByPos_r™   rà  rÛ  ro  s      rQ   r    z!LigatureCaretByPosStatement.build  s3   € à—‘×%Ñ%Ó'ˆØ×'Ñ'¨¯©°v¼sÀ4Ç;Á;Ó?OÕPrV   c                 ó–   — dj                  | j                  j                  «       dj                  d„ | j                  D «       «      «      S )NzLigatureCaretByPos {} {};rÓ   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   rr  rã  s     rQ   rR   z4LigatureCaretByPosStatement.asFea.<locals>.<genexpr>  rä  ru  rå  r£   s     rQ   r‹   z!LigatureCaretByPosStatement.asFea
  s:   € Ø*×1Ñ1Ø�K‰K×ÑÓ §¡Ñ)F¸$¿+¹+Ô)FÓ!Fó
ð 	
rV   r˜   r©   r  rN   rV   rQ   r2   r2   ý  s   „ ñRó4òQô

rV   r2   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r3   aS  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                 óz   — t         j                  | |«       |||c| _        | _        | _        ||c| _        | _        y r˜   )rB   rœ   rS  rÍ   rT  rU  Ú
forceChain)r›   rS  rÍ   rT  rU  rî  r™   s          rQ   rœ   zLigatureSubstStatement.__init__  s9   € Ü×Ñ˜4 Ô*Ø17¸ÀÐ-ˆŒ�T”[ $¤+Ø,7¸Ð)ˆÔ˜$�/rV   c                 ót  — | j                   D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}|j	                  | j
                  |||| j                  | j                  «       y c c}w c c}w c c}w r˜   )rS  rÁ   rÍ   rT  Úadd_ligature_substr™   rU  rî  r†  s           rQ   r    zLigatureSubstStatement.build  s�   € Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø×"Ñ"Ø�M‰M˜6 6¨6°4×3CÑ3CÀTÇ_Á_õ	
ùò 5ùÚ4ùÚ4s   �B+¶B0ÁB5c                 óD  — d}t        | j                  «      s!t        | j                  «      s| j                  r t        | j                  «      r(|dj	                  d„ | j                  D «       «      dz   z  }|dj	                  d„ | j
                  D «       «      z  }t        | j                  «      rN|ddj	                  d„ | j                  D «       «      z   z  }n%|dj	                  d„ | j
                  D «       «      z  }|dz  }|t        | j                  «      z  }|dz  }|S )	Nr[  rÓ   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>+  rŒ  rL  c              3   óB   K  — | ]  }|j                  «       d z   –— Œ y­wr·  r¦   r‹  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>,  s   è ø€ ÒA°˜AŸG™G›I¨�OÑAùr¸  c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>.  s   è ø€ Ò%E°A a§g¡g§iÑ%EùrL  c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>0  s   è ø€ Ò;¨!˜AŸG™GŸIÑ;ùrL  ú by r4  )r’   rS  rT  rî  rS   rÍ   r‹   rU  r÷   s      rQ   r‹   zLigatureSubstStatement.asFea'  sæ   € ØˆÜˆt�{‰{Ôœs 4§;¡;Ô/°4·?²?Ü�4—;‘;ÔØ�s—x‘xÑ?°4·;±;Ô?Ó?À#ÑEÑE�Ø�3—8‘8ÑA°T·[±[ÔAÓAÑAˆCÜ�4—;‘;ÔØ�s˜SŸX™XÑ%E¸¿¹Ô%EÓEÑEÑE‘à�3—8‘8Ñ;¨t¯{©{Ô;Ó;Ñ;ˆCØˆv‰ˆØŒu�T×%Ñ%Ó&Ñ&ˆØˆs‰
ˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r3   r3     s   „ ñBóDò

ôrV   r3   c                   ó(   — e Zd ZdZ	 dd„Zd„ Zdd„Zy)r4   zôA ``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                 óZ   — t         j                  | |«       || _        || _        || _        y r˜   )rB   rœ   r  ÚmarkAttachmentÚmarkFilteringSet)r›   r  rù  rú  r™   s        rQ   rœ   zLookupFlagStatement.__init__=  s+   € ô 	×Ñ˜4 Ô*ØˆŒ
Ø,ˆÔØ 0ˆÕrV   c                 óô   — d}| j                   �| j                   j                  «       }d}| j                  �| j                  j                  «       }|j                  | j                  | j
                  ||«       y)z8Calls the builder object's ``set_lookup_flag`` callback.N)rù  rÁ   rú  Úset_lookup_flagr™   r  )r›   rŸ   Ú
markAttachÚ
markFilters       rQ   r    zLookupFlagStatement.buildE  sh   € àˆ
Ø×ÑÐ*Ø×,Ñ,×5Ñ5Ó7ˆJØˆ
Ø× Ñ Ð,Ø×.Ñ.×7Ñ7Ó9ˆJØ×Ñ §¡¨t¯z©z¸:ÀzÕRrV   c                 óô  — g }g d¢}d}t        t        |«      «      D ]-  }| j                  |z  dk7  r|j                  ||   «       |dz  }Œ/ | j                  �8|j                  dj                  | j                  j                  «       «      «       | j                  �8|j                  dj                  | j                  j                  «       «      «       |sdg}dj                  dj                  |«      «      S )	N)ÚRightToLeftÚIgnoreBaseGlyphsÚIgnoreLigaturesÚIgnoreMarksr�   r   zMarkAttachmentType {}zUseMarkFilteringSet {}Ú0zlookupflag {};rÓ   )	Úranger’   r  rÙ   rù  rà   r‹   rú  rS   )r›   r¤   rø   ÚflagsrÏ   r�  s         rQ   r‹   zLookupFlagStatement.asFeaO  sÞ   € ØˆÚUˆØˆÜ”s˜5“zÓ"ò 	ˆAØ�z‰z˜DÑ  AÒ%Ø—
‘
˜5 ™8Ô$Ø˜1‘9‰Dð	ð ×ÑÐ*Ø�J‰JÐ.×5Ñ5°d×6IÑ6I×6OÑ6OÓ6QÓRÔSØ× Ñ Ð,Ø�J‰JÐ/×6Ñ6°t×7LÑ7L×7RÑ7RÓ7TÓUÔVÙØ�%ˆCØ×&Ñ& s§x¡x°£}Ó5Ð5rV   )r   NNNr©   r  rN   rV   rQ   r4   r4   7  s   „ ñ!ð MQó1òSô6rV   r4   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r5   z…Represents a ``lookup ...;`` statement to include a lookup in a feature.

    The ``lookup`` should be a :class:`LookupBlock` object.Nc                 óN   — t         j                  | |«       ||c| _        | _        y r˜   )rB   rœ   r™   rm   )r›   rm   r™   s      rQ   rœ   z!LookupReferenceStatement.__init__e  s"   € Ü×Ñ˜4 Ô*Ø&.°Ð"ˆŒ�t•{rV   c                 óN   — |j                  | j                  j                  «       y)z8Calls the builder object's ``add_lookup_call`` callback.N)Úadd_lookup_callrm   r‡   rž   s     rQ   r    zLookupReferenceStatement.buildi  s   € à×Ñ §¡× 0Ñ 0Õ1rV   c                 óL   — dj                  | j                  j                  «      S )Nz
lookup {};)rà   rm   r‡   r£   s     rQ   r‹   zLookupReferenceStatement.asFeam  s   € Ø×"Ñ" 4§;¡;×#3Ñ#3Ó4Ð4rV   r˜   r©   r  rN   rV   rQ   r5   r5   `  s   „ ñ?ó8ò2ô5rV   r5   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r6   z­A 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                 óN   — t         j                  | |«       ||c| _        | _        y r˜   )rB   rœ   rƒ   Úmarks)r›   rƒ   r  r™   s       rQ   rœ   zMarkBasePosStatement.__init__v  s"   € Ü×Ñ˜4 Ô*Ø $ eÐˆŒ	�4•:rV   c                 ó‚   — |j                  | j                  | j                  j                  «       | j                  «       y)z:Calls the builder object's ``add_mark_base_pos`` callback.N)Úadd_mark_base_posr™   rƒ   rÁ   r  rž   s     rQ   r    zMarkBasePosStatement.buildz  s)   € à×!Ñ! $§-¡-°·±×1CÑ1CÓ1EÀtÇzÁzÕRrV   c                 óþ   — dj                  | j                  j                  «       «      }| j                  D ]?  \  }}|d|z   t        z   dj                  |j                  «       |j
                  «      z   z  }ŒA |dz  }|S )Nzpos base {}r   ú{} mark @{}r4  )rà   rƒ   r‹   r  r  r‡   ©r›   r¤   rø   ÚaÚms        rQ   r‹   zMarkBasePosStatement.asFea~  ss   € Ø×"Ñ" 4§9¡9§?¡?Ó#4Ó5ˆØ—J‘Jò 	S‰DˆAˆqØ�4˜&‘=¤5Ñ(¨=×+?Ñ+?ÀÇÁÃ	È1Ï6É6Ó+RÑRÑR‰Cð	Sàˆs‰
ˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r6   r6   q  s   „ ñ5ó,òSôrV   r6   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r7   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                 óN   — t         j                  | |«       ||c| _        | _        y r˜   )rB   rœ   Ú	ligaturesr  )r›   r  r  r™   s       rQ   rœ   zMarkLigPosStatement.__init__¡  ó"   € Ü×Ñ˜4 Ô*Ø%.°Ð"ˆŒ˜�
rV   c                 ó‚   — |j                  | j                  | j                  j                  «       | j                  «       y)z9Calls the builder object's ``add_mark_lig_pos`` callback.N)Úadd_mark_lig_posr™   r  rÁ   r  rž   s     rQ   r    zMarkLigPosStatement.build¥  s)   € à× Ñ  §¡°·±×0GÑ0GÓ0IÈ4Ï:É:ÕVrV   c                 ó¾  — dj                  | j                  j                  «       «      }g }| j                  D ]|  }d}|�t	        |«      sd|z   t
        dz  z   dz   }nG|D ]B  \  }}|d|z   t
        dz  z   dj                  |j                  «       |j                  «      z   z  }ŒD |j                  |«       Œ~ |d|z   t
        z   dz   j                  |«      z  }|dz  }|S )	Nzpos ligature {}rª   r   rŒ   r£  r  ÚligComponentr4  )	rà   r  r‹   r  r’   r  r‡   rÙ   rS   )r›   r¤   rø   ÚligsÚlÚtempr  r  s           rQ   r‹   zMarkLigPosStatement.asFea©  sõ   € Ø×&Ñ& t§~¡~×';Ñ';Ó'=Ó>ˆØˆØ—‘ò 	ˆAØˆDØˆy¤ A¤Ø˜f‘}¤u¨q¡yÑ0°?ÑB‘àò ‘D�A�qØØØ ñ!ä !™)ñ$ð (×.Ñ.¨q¯w©w«y¸!¿&¹&ÓAñBñ‘Dðð �K‰K˜Õð	ð 	��v‘¤Ñ%¨Ñ6×<Ñ<¸TÓBÑBˆØˆs‰
ˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r7   r7   †  s   „ ñó46òWôrV   r7   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r8   z°A 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                 óN   — t         j                  | |«       ||c| _        | _        y r˜   )rB   rœ   Ú	baseMarksr  )r›   r#  r  r™   s       rQ   rœ   zMarkMarkPosStatement.__init__Ã  r  rV   c                 ó‚   — |j                  | j                  | j                  j                  «       | j                  «       y)z:Calls the builder object's ``add_mark_mark_pos`` callback.N)Úadd_mark_mark_posr™   r#  rÁ   r  rž   s     rQ   r    zMarkMarkPosStatement.buildÇ  s)   € à×!Ñ! $§-¡-°·±×1HÑ1HÓ1JÈDÏJÉJÕWrV   c                 óþ   — dj                  | j                  j                  «       «      }| j                  D ]?  \  }}|d|z   t        z   dj                  |j                  «       |j
                  «      z   z  }ŒA |dz  }|S )Nzpos mark {}r   r  r4  )rà   r#  r‹   r  r  r‡   r  s        rQ   r‹   zMarkMarkPosStatement.asFeaË  su   € Ø×"Ñ" 4§>¡>×#7Ñ#7Ó#9Ó:ˆØ—J‘Jò 	S‰DˆAˆqØ�4˜&‘=¤5Ñ(¨=×+?Ñ+?ÀÇÁÃ	È1Ï6É6Ó+RÑRÑR‰Cð	Sàˆs‰
ˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r8   r8   ¾  s   „ ñ5ó6òXôrV   r8   c                   ó(   — e Zd ZdZ	 dd„Zd„ Zdd„Zy)r9   a™  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                 óx   — t         j                  | |«       |||c| _        | _        | _        || _        || _        y r˜   )rB   rœ   rS  rÇ   rT  rU  rî  )r›   rS  rÇ   rT  rU  rî  r™   s          rQ   rœ   zMultipleSubstStatement.__init__ß  s9   € ô 	×Ñ˜4 Ô*Ø/5°u¸fÐ,ˆŒ�T”Z ¤Ø&ˆÔØ$ˆ�rV   c           	      ó  — | j                   D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}t        | j                  d«      r| j                  j                  «       }n| j                  g}t        |«      }g }| j                  D ]T  }	t        |	d«      r|	j                  «       }
n|	g}
t        |
«      dk(  rt        |
«      |k7  r|
|z  }
|j                  |
«       ŒV t        t        |Ž «      }t        «       }t        |«      D ]P  \  }}||vsŒ|j                  |«       |j                  | j                  ||||xr ||   xs d| j                  «       ŒR yc c}w c c}w )z;Calls the builder object's ``add_multiple_subst`` callback.rÁ   r�   rN   N)rS  rÁ   rT  r�   rÇ   r’   rU  rÙ   rW  Úziprà  r_   ÚaddÚadd_multiple_substr™   rî  )r›   rŸ   rY  rS  rþ   rT  Ú	originalsÚcountÚreplacesÚrÚreplaceÚseen_originalsr�  rÎ   s                 rQ   r    zMultipleSubstStatement.buildç  sU  € à(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ü�4—:‘:˜zÔ*ØŸ
™
×+Ñ+Ó-‰IàŸ™˜ˆIÜ�I“ˆØˆØ×!Ñ!ò 	%ˆAÜ�q˜*Ô%ØŸ*™*›,‘à˜#�Ü�7‹|˜qÒ ¤S¨£\°UÒ%:Ø! E™/�Ø�O‰O˜GÕ$ð	%ô œ˜X˜Ó'ˆä›ˆÜ$ YÓ/ò 
	‰KˆAˆxØ˜~Ò-Ø×"Ñ" 8Ô,Ø×*Ñ*Ø—M‘MØØØØÒ, ¨!¡Ò2°Ø—O‘Oõñ
	ùò' 5ùÚ4s
   �E7¶E<c                 óx  — d}t        | j                  «      s!t        | j                  «      s| j                  r¤t        | j                  «      r/|dj	                  t        t        | j                  «      «      dz   z  }|t        | j                  «      dz   z  }t        | j                  «      rH|ddj	                  t        t        | j                  «      «      z   z  }n|t        | j                  «      z  }| j                  xs t        «       g}|dz  }|dj	                  t        t        |«      «      z  }|dz  }|S )Nr[  rÓ   r\  rö  r4  )
r’   rS  rT  rî  rS   rÖ   r‹   rÇ   rU  r½   )r›   r¤   rø   rU  s       rQ   r‹   zMultipleSubstStatement.asFea  sò   € ØˆÜˆt�{‰{Ôœs 4§;¡;Ô/°4·?²?Ü�4—;‘;ÔØ�s—x‘x¤¤E¨4¯;©;Ó 7Ó8¸3Ñ>Ñ>�Ø”5˜Ÿ™Ó$ sÑ*Ñ*ˆCÜ�4—;‘;ÔØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>‘à”5˜Ÿ™Ó$Ñ$ˆCØ×&Ñ&Ò7¬9«;¨-ˆØˆv‰ˆØˆs�x‰xœœE ;Ó/Ó0Ñ0ˆØˆs‰
ˆØˆ
rV   r  r©   r  rN   rV   rQ   r9   r9   Ó  s   „ ñ	ð NRó%òôBrV   r9   c                   ó*   — e Zd ZdZ	 	 dd„Zd„ Zdd„Zy)r<   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                 óz   — t         j                  | |«       || _        ||c| _        | _        ||c| _        | _        y r˜   )rB   rœ   Ú
enumeratedÚglyphs1Úvaluerecord1Úglyphs2Úvaluerecord2)r›   r7  r8  r9  r:  r6  r™   s          rQ   rœ   zPairPosStatement.__init__#  s=   € ô 	×Ñ˜4 Ô*Ø$ˆŒØ*1°<Ð'ˆŒ�dÔ'Ø*1°<Ð'ˆŒ�dÕ'rV   c                 óF  — | j                   rž| j                  j                  «       | j                  j                  «       g}d}t	        j
                  |Ž D ]:  \  }}d}|j                  | j                  || j                  || j                  «       Œ< |st        d| j                  «      ‚yt        | j                  t        «      xr t        | j                  t        «      }|r\|j                  | j                  | j                  j                  | j                  | j                  j                  | j                  «       y|j                  | j                  | j                  j                  «       | j                  | j                  j                  «       | j                  «       y)aM  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)r6  r7  rÁ   r9  Ú	itertoolsÚproductÚadd_specific_pair_posr™   r8  r:  r   r�   r   rÇ   Úadd_class_pair_pos)r›   rŸ   r•   Ú	seen_pairÚglyph1Úglyph2Úis_specifics          rQ   r    zPairPosStatement.build1  sT  € ð �?Š?Ø—‘×&Ñ&Ó(¨$¯,©,×*?Ñ*?Ó*AÐBˆAØˆIÜ"+×"3Ñ"3°QÐ"7ò ‘�˜Ø �	Ø×-Ñ-Ø—M‘M 6¨4×+<Ñ+<¸fÀd×FWÑFWõðñ
 Ü%Ø;¸T¿]¹]óð ð ä  §¡¬yÓ9ò 
¼jØ�L‰Lœ)ó?
ˆñ Ø×)Ñ)Ø—‘Ø—‘×"Ñ"Ø×!Ñ!Ø—‘×"Ñ"Ø×!Ñ!õð ×&Ñ&Ø—‘Ø—‘×%Ñ%Ó'Ø×!Ñ!Ø—‘×%Ñ%Ó'Ø×!Ñ!õrV   c                 óì  — | j                   rdnd}| j                  ry|dj                  | j                  j	                  «       | j
                  j	                  «       | j                  j	                  «       | j                  j	                  «       «      z  }|S |dj                  | j                  j	                  «       | j                  j	                  «       | j
                  j	                  «       «      z  }|S )Nzenum rª   zpos {} {} {} {};zpos {} {} {};)r6  r:  rà   r7  r‹   r8  r9  r÷   s      rQ   r‹   zPairPosStatement.asFea\  sË   € ØŸš‰g¨bˆØ×ÒØÐ%×,Ñ,Ø—‘×"Ñ"Ó$Ø×!Ñ!×'Ñ'Ó)Ø—‘×"Ñ"Ó$Ø×!Ñ!×'Ñ'Ó)ó	ñ ˆCð ˆ
ð �?×)Ñ)Ø—‘×"Ñ"Ó$ d§l¡l×&8Ñ&8Ó&:¸D×<MÑ<M×<SÑ<SÓ<Uóñ ˆCð ˆ
rV   r  r©   r  rN   rV   rQ   r<   r<     s    „ ñð Øó@ò)ôVrV   r<   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r=   aP  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                 ój   — t         j                  | |«       ||c| _        | _        || _        || _        y r˜   )rB   rœ   Ú
old_prefixÚ
old_suffixrÍ   Úreplacements)r›   rG  rH  rÍ   rI  r™   s         rQ   rœ   z)ReverseChainSingleSubstStatement.__init__u  s1   € Ü×Ñ˜4 Ô*Ø+5°zÐ(ˆŒ˜œØˆŒØ(ˆÕrV   c                 óÂ  — | j                   D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}| j                  d   j                  «       }| j                  d   j                  «       }t        |«      dk(  r|t        |«      z  }|j                  | j                  ||t        t        ||«      «      «       y c c}w c c}w )Nr   r�   )
rG  rÁ   rH  rÍ   rI  r’   Úadd_reverse_chain_single_substr™   Údictr*  ©r›   rŸ   rY  rS  rþ   rT  r-  r/  s           rQ   r    z&ReverseChainSingleSubstStatement.build{  s´   € Ø(,¯©Ö8 1�!—*‘*•,Ð8ˆÐ8Ø(,¯©Ö8 1�!—*‘*•,Ð8ˆÐ8Ø—K‘K ‘N×+Ñ+Ó-ˆ	Ø×$Ñ$ QÑ'×0Ñ0Ó2ˆÜˆx‹=˜AÒØ¤# i£.Ñ0ˆHØ×.Ñ.Ø�M‰M˜6 6¬4´°I¸xÓ0HÓ+Iõ	
ùò 9ùÚ8s
   �C¶Cc                 ó^  — d}t        | j                  «      st        | j                  «      r t        | j                  «      r(|dj                  d„ | j                  D «       «      dz   z  }|dj                  d„ | j                  D «       «      z  }t        | j                  «      rU|ddj                  d„ | j                  D «       «      z   z  }n,|dj                  t        t        | j                  «      «      z  }|dj                  dj                  d„ | j                  D «       «      «      z  }|S )Nzrsub rÓ   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>Š  s   è ø€ ÒB¨Q¤ a§ÑBùru  c              3   ó8   K  — | ]  }t        |«      d z   –— Œ y­wr·  r¦   r‹  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>‹  ó   è ø€ Ò@¨qœE !›H s�NÑ@ùó   ‚c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>�  s   è ø€ Ò%H°1¤e¨A§hÑ%Hùru  ú by {};c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>�  ó   è ø€ Ò(M°a¬¨q¯Ñ(Mùru  )	r’   rG  rH  rS   rÍ   rÖ   r‹   rà   rI  r÷   s      rQ   r‹   z&ReverseChainSingleSubstStatement.asFea†  sä   € ØˆÜˆt�‰Ô¤3 t§¡Ô#7Ü�4—?‘?Ô#Ø�s—x‘xÑB°$·/±/ÔBÓBÀSÑHÑH�Ø�3—8‘8Ñ@°D·K±KÔ@Ó@Ñ@ˆCÜ�4—?‘?Ô#Ø�s˜SŸX™XÑ%H¸¿¹Ô%HÓHÑHÑH‘à�3—8‘8œC¤ t§{¡{Ó3Ó4Ñ4ˆCØˆy×Ñ §¡Ñ(M¸4×;LÑ;LÔ(MÓ MÓNÑNˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r=   r=   l  s   „ ñó)ò	
ôrV   r=   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r@   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                 óx   — t         j                  | |«       ||c| _        | _        || _        || _        || _        y r˜   )rB   rœ   rS  rT  rî  rÍ   rI  )r›   rÍ   r1  rS  rT  rî  r™   s          rQ   rœ   zSingleSubstStatement.__init__�  s8   € Ü×Ñ˜4 Ô*Ø#)¨6Ð ˆŒ�T”[Ø$ˆŒØˆŒØ#ˆÕrV   c                 óØ  — | j                   D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}| j                  d   j                  «       }| j                  d   j                  «       }t        |«      dk(  r|t        |«      z  }|j                  | j                  ||t        t        ||«      «      | j                  «       yc c}w c c}w )z9Calls the builder object's ``add_single_subst`` callback.r   r�   N)rS  rÁ   rT  rÍ   rI  r’   Úadd_single_substr™   r   r*  rî  rM  s           rQ   r    zSingleSubstStatement.build¤  s¾   € à(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø—K‘K ‘N×+Ñ+Ó-ˆ	Ø×$Ñ$ QÑ'×0Ñ0Ó2ˆÜˆx‹=˜AÒØ¤# i£.Ñ0ˆHØ× Ñ Ø�M‰MØØÜœ˜I xÓ0Ó1Ø�O‰Oõ	
ùò 5ùÚ4s
   �C"¶C'c                 óh  — d}t        | j                  «      s!t        | j                  «      s| j                  r t        | j                  «      r(|dj	                  d„ | j                  D «       «      dz   z  }|dj	                  d„ | j
                  D «       «      z  }t        | j                  «      rN|ddj	                  d„ | j                  D «       «      z   z  }n%|dj	                  d„ | j
                  D «       «      z  }|dj                  dj	                  d„ | j                  D «       «      «      z  }|S )	Nr[  rÓ   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>¸  s   è ø€ Ò>¨Q¤ a§Ñ>ùru  c              3   ó8   K  — | ]  }t        |«      d z   –— Œ y­wr·  r¦   r‹  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>¹  rQ  rR  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>»  s   è ø€ Ò%D°1¤e¨A§hÑ%Dùru  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>½  s   è ø€ Ò:¨œE !ŸHÑ:ùru  rT  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   r¦   r‹  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>¾  rV  ru  )r’   rS  rT  rî  rS   rÍ   rà   rI  r÷   s      rQ   r‹   zSingleSubstStatement.asFea´  sé   € ØˆÜˆt�{‰{Ôœs 4§;¡;Ô/°4·?²?Ü�4—;‘;ÔØ�s—x‘xÑ>°$·+±+Ô>Ó>ÀÑDÑD�Ø�3—8‘8Ñ@°D·K±KÔ@Ó@Ñ@ˆCÜ�4—;‘;ÔØ�s˜SŸX™XÑ%D¸¿¹Ô%DÓDÑDÑD‘à�3—8‘8Ñ:¨d¯k©kÔ:Ó:Ñ:ˆCØˆy×Ñ §¡Ñ(M¸4×;LÑ;LÔ(MÓ MÓNÑNˆØˆ
rV   r˜   r©   r  rN   rV   rQ   r@   r@   ”  s   „ ñó$ò
ô rV   r@   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r>   zA ``script`` statement.Nc                 ó>   — t         j                  | |«       || _        y r˜   )rB   rœ   r{   )r›   r{   r™   s      rQ   rœ   zScriptStatement.__init__Å  s   € Ü×Ñ˜4 Ô*Øˆ�rV   c                 óP   — |j                  | j                  | j                  «       y)z,Calls the builder's ``set_script`` callback.N)Ú
set_scriptr™   r{   rž   s     rQ   r    zScriptStatement.buildÉ  s   € à×Ñ˜4Ÿ=™=¨$¯+©+Õ6rV   c                 óT   — dj                  | j                  j                  «       «      S )Nz
script {};)rà   r{   r  r£   s     rQ   r‹   zScriptStatement.asFeaÍ  s    € Ø×"Ñ" 4§;¡;×#4Ñ#4Ó#6Ó7Ð7rV   r˜   r©   r  rN   rV   rQ   r>   r>   Â  s   „ Ù!óò7ô8rV   r>   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r?   zßA 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                 ój   — t         j                  | |«       |||c| _        | _        | _        || _        y r˜   )rB   rœ   ru   rS  rT  rî  )r›   ru   rS  rT  rî  r™   s         rQ   rœ   zSinglePosStatement.__init__Ø  s/   € Ü×Ñ˜4 Ô*Ø-0°&¸&Ð*ˆŒ�$”+˜tœ{Ø$ˆ�rV   c                 ón  — | j                   D �cg c]  }|j                  «       ‘Œ }}| j                  D �cg c]  }|j                  «       ‘Œ }}| j                  D ��cg c]  \  }}|j                  «       |f‘Œ }}}|j	                  | j
                  |||| j                  «       yc c}w c c}w c c}}w )z7Calls the builder object's ``add_single_pos`` callback.N)rS  rÁ   rT  ru   Úadd_single_posr™   rî  )	r›   rŸ   rY  rS  rþ   rT  r•   r  ru   s	            rQ   r    zSinglePosStatement.buildÝ  s‹   € à(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø(,¯©Ö4 1�!—*‘*•,Ð4ˆÐ4Ø59·X±X×>©¨¨E�—
‘
“˜eÒ$Ð>ˆÑ>Ø×Ñ˜tŸ}™}¨f°f¸cÀ4Ç?Á?ÕSùò 5ùÚ4ùÛ>s   �B'¶B,ÁB1c           
      ó  — d}t        | j                  «      s!t        | j                  «      s| j                  rât        | j                  «      r/|dj	                  t        t        | j                  «      «      dz   z  }|dj	                  | j                  D �cg c]1  }t        |d   «      dz   |d   rd|d   j                  «       z   ndz   ‘Œ3 c}«      z  }t        | j                  «      r†|ddj	                  t        t        | j                  «      «      z   z  }nV|dj	                  | j                  D �cg c].  }t        |d   «      dz   |d   r|d   j                  «       ndz   ‘Œ0 c}«      z  }|dz  }|S c c}w c c}w )Nr‰  rÓ   r   r\  r�   rª   r4  )r’   rS  rT  rî  rS   rÖ   r‹   ru   )r›   r¤   rø   r_  s       rQ   r‹   zSinglePosStatement.asFeaä  sD  € ØˆÜˆt�{‰{Ôœs 4§;¡;Ô/°4·?²?Ü�4—;‘;ÔØ�s—x‘x¤¤E¨4¯;©;Ó 7Ó8¸3Ñ>Ñ>�Ø�3—8‘8ð "ŸX™Xöàô ˜!˜A™$“K #Ñ%ÀÀ1Â¨#°°!±·
±
³Ò*<È2ÓNòóñ ˆCô �4—;‘;ÔØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>‘à�3—8‘8ØMQÏXÉXÖVÈ”�q˜‘t“˜sÑ"°a¸²d a¨¡d§j¡j¤lÀÓCÒVóñ ˆCð 	ˆs‰
ˆØˆ
ùòùò Ws   Â6E8
Ä53E=
r˜   r©   r  rN   rV   rQ   r?   r?   Ñ  s   „ ñ$ó%ò
TôrV   r?   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)rF   zRepresents a subtable break.Nc                 ó0   — t         j                  | |«       y r˜   )rB   rœ   rš   s     rQ   rœ   zSubtableStatement.__init__ü  s   € Ü×Ñ˜4 Õ*rV   c                 ó:   — |j                  | j                  «       y)z<Calls the builder objects's ``add_subtable_break`` callback.N)Úadd_subtable_breakr™   rž   s     rQ   r    zSubtableStatement.buildÿ  s   € à×"Ñ" 4§=¡=Õ1rV   c                  ó   — y)Nz	subtable;rN   r£   s     rQ   r‹   zSubtableStatement.asFea  s   € ØrV   r˜   r©   r  rN   rV   rQ   rF   rF   ù  s   „ Ù&ó+ò2ôrV   rF   c                   óP   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d	d„Zd„ Zd„ Zd„ Zd
d„Zd„ Z	e	Z
y)rH   zRepresents a value record.Nc                 ó¶   — t         j                  | |
«       ||c| _        | _        ||c| _        | _        ||c| _        | _        ||c| _        | _	        |	| _
        y r˜   )r'   rœ   Ú
xPlacementÚ
yPlacementÚxAdvanceÚyAdvanceÚ
xPlaDeviceÚ
yPlaDeviceÚ
xAdvDeviceÚ
yAdvDeviceÚvertical)r›   rr  rs  rt  ru  rv  rw  rx  ry  rz  r™   s              rQ   rœ   zValueRecord.__init__
  s[   € ô 	×Ñ˜D (Ô+Ø,6¸
Ð(ˆŒ˜œØ(0°(Ð$ˆŒ�t”}Ø,6¸
Ð(ˆŒ˜œØ,6¸
Ð(ˆŒ˜œØ ˆ�rV   c                 óB  — | j                   |j                   k(  xr… | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r˜   )rr  rs  rt  ru  rv  rx  ©r›   Úothers     rQ   Ú__eq__zValueRecord.__eq__  sŽ   € à�O‰O˜u×/Ñ/Ñ/ò 4Ø—‘ 5×#3Ñ#3Ñ3ò4à—‘ §¡Ñ/ò4ð —‘ §¡Ñ/ò4ð —‘ 5×#3Ñ#3Ñ3ò	4ð
 —‘ 5×#3Ñ#3Ñ3ð	
rV   c                 ó&   — | j                  |«       S r˜   )r~  r|  s     rQ   Ú__ne__zValueRecord.__ne__(  s   € Ø—;‘;˜uÓ%Ð%Ð%rV   c                 ó`  — t        | j                  «      t        | j                  «      z  t        | j                  «      z  t        | j                  «      z  t        | j
                  «      z  t        | j                  «      z  t        | j                  «      z  t        | j                  «      z  S r˜   )	Úhashrr  rs  rt  ru  rv  rw  rx  ry  r§   s    rQ   Ú__hash__zValueRecord.__hash__+  s”   € ä�—‘Ó!Ü�4—?‘?Ó#ñ$ä�4—=‘=Ó!ñ"ô �4—=‘=Ó!ñ"ô �4—?‘?Ó#ñ	$ô
 �4—?‘?Ó#ñ$ô �4—?‘?Ó#ñ$ô �4—?‘?Ó#ñ$ð		
rV   c                 ó   — | sy| j                   | j                  }}| j                  | j                  }}| j                  | j
                  }}| j                  | j                  }	}| j                  }
|€ |€|€|
rt        |«      S |€|
st        |«      S |xs d}|xs d}|xs d}|xs d}|€|€|€|	€d|›d|›d|›d|›d�	S d|›d|›d|›d|›dt        |«      ›dt        |«      ›dt        |«      ›dt        |	«      ›d�S )Nz<NULL>r   ú<rÓ   rf  )rr  rs  rt  ru  rv  rw  rx  ry  rz  rs  rU   )r›   r¤   r_  r`  rt  ru  rv  rw  rx  ry  rz  s              rQ   r‹   zValueRecord.asFea7  s  € ÙØà�‰ §¡ˆ1ˆØ!Ÿ]™]¨D¯M©M�(ˆØ!%§¡°$·/±/�Jˆ
Ø!%§¡°$·/±/�Jˆ
Ø—=‘=ˆð ˆ9˜˜ØÐ¡HÜ˜8“}Ð$ØÐ!©(Ü˜8“}Ð$ð ŠF�ˆØŠF�ˆØ’=˜qˆØ’=˜qˆð ÐØÐ"ØÐ"ØÑ"â&'ªªH²hÐ?Ð?øò ÚÚÚÜ˜:Õ&Ü˜:Õ&Ü˜:Õ&Ü˜:Õ&ð	
ð 		
rV   c                 ó,   ‡ — t        ˆ fd„dD «       «      S )Nc              3   ó:   •K  — | ]  }t        ‰|«      d u–— Œ y ­wr˜   )Úgetattr)rO   Úvr›   s     €rQ   rR   z'ValueRecord.__bool__.<locals>.<genexpr>d  s%   øè ø€ ò 
àô �D˜!Ó DÔ(ñ
ùs   ƒ)rr  rs  rt  ru  rv  rw  rx  ry  )r�  r§   s   `rQ   Ú__bool__zValueRecord.__bool__c  s   ø€ Üó 
ð	ô
ó 
ð 	
rV   )
NNNNNNNNFNr©   )r«   r¬   r­   r®   rœ   r~  r€  rƒ  r‹   rŠ  Ú__nonzero__rN   rV   rQ   rH   rH     sK   „ Ù$ð ØØØØØØØØØó!ò(
ò&ò

ó*
òX
ð �KrV   rH   c                   ó    — e Zd ZdZdd„Zdd„Zy)rI   z+Represents a named value record definition.Nc                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   r‡   r  )r›   r‡   r  r™   s       rQ   rœ   zValueRecordDefinition.__init__x  s    € Ü×Ñ˜4 Ô*ØˆŒ	Øˆ�
rV   c                 ój   — dj                  | j                  j                  «       | j                  «      S )NzvalueRecordDef {} {};)rà   r  r‹   r‡   r£   s     rQ   r‹   zValueRecordDefinition.asFea}  s&   € Ø&×-Ñ-¨d¯j©j×.>Ñ.>Ó.@À$Ç)Á)ÓLÐLrV   r˜   r©   rù   rN   rV   rQ   rI   rI   u  s   „ Ù5óô
MrV   rI   c                 óh   — | dk(  r|dk(  r|dk(  ry| dk(  r|dk(  r|dk(  rydj                  | ||«      S )Né   r�   i	  rª   r   Ú1ú{} {} {}©rà   )ÚpidÚeidÚlids      rQ   Úsimplify_name_attributesr—  �  sC   € Ø
ˆa‚x�C˜1’H ¨¢ØØ	�Š�c˜Q’h 3¨!¢8Øà× Ñ   c¨3Ó/Ð/rV   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r:   z€Represents a name record. (`Section 9.e. <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_)Nc                 óv   — t         j                  | |«       || _        || _        || _        || _        || _        y r˜   )rB   rœ   ÚnameIDÚ
platformIDÚ	platEncIDÚlangIDÚstring)r›   rš  r›  rœ  r�  rž  r™   s          rQ   rœ   zNameRecord.__init__�  s5   € Ü×Ñ˜4 Ô*ØˆŒØ$ˆŒØ"ˆŒØˆŒØˆ�rV   c                 ó¨   — |j                  | j                  | j                  | j                  | j                  | j
                  | j                  «       y)z8Calls the builder object's ``add_name_record`` callback.N)Úadd_name_recordr™   rš  r›  rœ  r�  rž  rž   s     rQ   r    zNameRecord.build•  s:   € à×ÑØ�M‰MØ�K‰KØ�O‰OØ�N‰NØ�K‰KØ�K‰Kõ	
rV   c                 ó”  — d„ }t        | j                  | j                  | j                  «      }|€t	        d| j
                  «      ‚t        | j                  |¬«      }|dk(  r\dj                  t        dt        |«      d«      D �cg c],  } |t        ||   «      dz  t        ||d	z      «      z   d
«      ‘Œ. c}«      }n/dj                  |D �cg c]  } |t        |«      d«      ‘Œ c}«      }t        | j                  | j                  | j                  «      }|dk7  r|dz  }dj                  | j                  ||«      S c c}w c c}w )Nc                 ó>   — | dk\  r| dk  r| dvrt        | «      S || z  S )Né    é~   )é"   é\   )Úchr)rt  Úescape_patterns     rQ   Úescapez NameRecord.asFea.<locals>.escape¡  s*   € à�DŠy˜Q $šY¨1°LÑ+@Ü˜1“v�à%¨Ñ)Ð)rV   zUnsupported encoding)ÚencodingÚ	utf_16_berª   r   rŒ   é   r�   z\%04xz\%02xrÓ   znameid {} {}"{}";)r   r›  rœ  r�  r   r™   r   rž  rS   r  r’   r   r—  rà   rš  )	r›   r¤   r©  rª  rþ   r�  Úescaped_stringÚbÚplats	            rQ   r‹   zNameRecord.asFea   s   € ò	*ô ˜tŸ™°·±ÀÇÁÓLˆØÐÜ!Ð"8¸$¿-¹-ÓHÐHÜ�D—K‘K¨(Ô3ˆØ�{Ò"ØŸW™Wô # 1¤c¨!£f¨aÓ0öàñ œ7 1 Q¡4›=¨3Ñ.´¸¸1¸q¹5¹Ó1BÑBÀHÕMòó‰Nð  ŸW™WÈAÖ%NÀq¡f¬W°Q«Z¸Õ&BÒ%NÓOˆNÜ'¨¯©¸¿¹ÈÏÉÓUˆØ�2Š:Ø�C‰KˆDØ"×)Ñ)¨$¯+©+°t¸^ÓLÐLùòùò &Os   Â1E ÃEr˜   r©   r  rN   rV   rQ   r:   r:   Š  s   „ ñ Kóò	
ôMrV   r:   c                   ó   — e Zd ZdZd„ Zdd„Zy)r(   z4Represents a ``sizemenuname`` or ``name`` statement.c                 óf   — t         j                  | |«       |j                  | j                  «       y)z8Calls the builder object's ``add_featureName`` callback.N)r:   r    Úadd_featureNamerš  rž   s     rQ   r    zFeatureNameStatement.build¾  s$   € ä×Ñ˜˜wÔ'Ø×Ñ §¡Õ,rV   c                 óÎ   — | j                   dk(  rd}nd}t        | j                  | j                  | j                  «      }|dk7  r|dz  }dj                  ||| j                  «      S )NÚsizeÚsizemenunamer‡   rª   rÓ   z
{} {}"{}";)rš  r—  r›  rœ  r�  rà   rž  )r›   r¤   rô   r¯  s       rQ   r‹   zFeatureNameStatement.asFeaÃ  s[   € Ø�;‰;˜&Ò Ø ‰CàˆCÜ'¨¯©¸¿¹ÈÏÉÓUˆØ�2Š:Ø�C‰KˆDØ×"Ñ" 3¨¨d¯k©kÓ:Ð:rV   Nr©   )r«   r¬   r­   r®   r    r‹   rN   rV   rQ   r(   r(   »  s   „ Ù>ò-ô
;rV   r(   c                   ó   — e Zd ZdZdd„Zy)rE   z+Represents a STAT table ``name`` statement.c                 ó¤   — t        | j                  | j                  | j                  «      }|dk7  r|dz  }dj	                  || j
                  «      S ©Nrª   rÓ   zname {}"{}";©r—  r›  rœ  r�  rà   rž  ©r›   r¤   r¯  s      rQ   r‹   zSTATNameStatement.asFeaÑ  óC   € Ü'¨¯©¸¿¹ÈÏÉÓUˆØ�2Š:Ø�C‰KˆDØ×$Ñ$ T¨4¯;©;Ó7Ð7rV   Nr©   )r«   r¬   r­   r®   r‹   rN   rV   rQ   rE   rE   Î  s
   „ Ù5ô8rV   rE   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)rA   zA ``parameters`` statement.Nc                 óh   — t         j                  | |«       || _        || _        || _        || _        y r˜   )rB   rœ   Ú
DesignSizeÚSubfamilyIDÚ
RangeStartÚRangeEnd)r›   r¾  r¿  rÀ  rÁ  r™   s         rQ   rœ   zSizeParameters.__init__Û  s/   € Ü×Ñ˜4 Ô*Ø$ˆŒØ&ˆÔØ$ˆŒØ ˆ�rV   c                 ó’   — |j                  | j                  | j                  | j                  | j                  | j
                  «       y)z<Calls the builder object's ``set_size_parameters`` callback.N)Úset_size_parametersr™   r¾  r¿  rÀ  rÁ  rž   s     rQ   r    zSizeParameters.buildâ  s5   € à×#Ñ#Ø�M‰MØ�O‰OØ×ÑØ�O‰OØ�M‰Mõ	
rV   c                 ó  — dj                  | j                  | j                  «      }| j                  dk7  s| j                  dk7  rA|dj                  t        | j                  dz  «      t        | j                  dz  «      «      z  }|dz   S )Nzparameters {:.1f} {}r   z {} {}é
   r4  )rà   r¾  r¿  rÀ  rÁ  Úintr÷   s      rQ   r‹   zSizeParameters.asFeaì  sq   € Ø$×+Ñ+¨D¯O©O¸T×=MÑ=MÓNˆØ�?‰?˜aÒ 4§=¡=°AÒ#5Ø�8—?‘?¤3 t§¡¸Ñ';Ó#<¼cÀ$Ç-Á-ÐRTÑBTÓ>UÓVÑVˆCØ�S‰yÐrV   r˜   r©   r  rN   rV   rQ   rA   rA   Ø  s   „ Ù%ó!ò
ôrV   rA   c                   ó(   — e Zd ZdZ	 dd„Zd„ Zdd„Zy)r   z;Represent a name statement inside a ``cvParameters`` block.Nc           	      óJ   — t         j                  | ||||||¬«       || _        y r  )r:   rœ   r"  )r›   rš  r›  rœ  r�  rž  r"  r™   s           rQ   rœ   z"CVParametersNameStatement.__init__ö  s/   € ô 	×ÑØ�&˜* i°¸È(ð 	ô 	
ð %ˆ�rV   c                 ó2  — d}| j                   dk(  r5dj                  |j                  j                  | j                  d«      «      }|j                  | j                  «       | j                  | j                   |z   f| _        t        j                  | |«       y)z9Calls the builder object's ``add_cv_parameter`` callback.rª   r$  z_{}r   N)r"  rà   Úcv_num_named_params_Úgetrš  Úadd_cv_parameterr:   r    )r›   rŸ   Úitems      rQ   r    zCVParametersNameStatement.buildþ  st   € àˆØ�?‰?Ð2Ò2Ø—<‘< × <Ñ <× @Ñ @ÀÇÁÈaÓ PÓQˆDØ× Ñ  §¡Ô-Ø—{‘{ D§O¡O°dÑ$:Ð;ˆŒÜ×Ñ˜˜wÕ'rV   c                 ó¤   — t        | j                  | j                  | j                  «      }|dk7  r|dz  }dj	                  || j
                  «      S r¸  r¹  rº  s      rQ   r‹   zCVParametersNameStatement.asFea  r»  rV   r˜   r©   r  rN   rV   rQ   r   r   ó  s   „ ÙEð SWó%ò(ô8rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r"   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                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   Ú	characterrô   )r›   rÑ  rô   r™   s       rQ   rœ   zCharacterStatement.__init__  s    € Ü×Ñ˜4 Ô*Ø"ˆŒØˆ�rV   c                 óP   — |j                  | j                  | j                  «       y)z9Calls the builder object's ``add_cv_character`` callback.N)Úadd_cv_characterrÑ  rô   rž   s     rQ   r    zCharacterStatement.build  s   € à× Ñ  §¡°·±Õ:rV   c                 ó8   — dj                  | j                  «      S )NzCharacter {:#x};)rà   rÑ  r£   s     rQ   r‹   zCharacterStatement.asFea  s   € Ø!×(Ñ(¨¯©Ó8Ð8rV   r˜   r©   r  rN   rV   rQ   r"   r"     s   „ ñóò
;ô9rV   r"   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r   z‡An axis definition, being either a ``VertAxis.BaseTagList/BaseScriptList``
    pair or a ``HorizAxis.BaseTagList/BaseScriptList`` pair.Nc                 óh   — t         j                  | |«       || _        || _        || _        g | _        y r˜   )rB   rœ   ÚbasesÚscriptsrz  Úminmax)r›   r×  rØ  rz  rÙ  r™   s         rQ   rœ   zBaseAxis.__init__'  s.   € Ü×Ñ˜4 Ô*ØˆŒ
ØˆŒØ ˆŒØˆ�rV   c                 ó|   — |j                  | j                  | j                  | j                  | j                  «       y)z6Calls the builder object's ``set_base_axis`` callback.N)Úset_base_axisr×  rØ  rz  rÙ  rž   s     rQ   r    zBaseAxis.build.  s&   € à×Ñ˜dŸj™j¨$¯,©,¸¿¹ÀtÇ{Á{ÕSrV   c                 óä  — | j                   rdnd}| j                  D �cg c];  }dj                  |d   |d   dj                  t	        t
        |d   «      «      «      ‘Œ= }}| j                  D �cg c]#  }dj                  ||d   |d   |d   |d	   «      ‘Œ% }}d
j                  |dj                  | j                  «      ||dj                  |«      «      dj                  |«      z   S c c}w c c}w )NÚVertÚHorizr’  r   r�   rÓ   rŒ   z
{}Axis.MinMax {} {} {}, {};r�  z2{}Axis.BaseTagList {};
{}{}Axis.BaseScriptList {};rL   r   )rz  rØ  rà   rS   rÖ   rs  rÙ  r×  )r›   r¤   Ú	directionr  rØ  Úminmaxess         rQ   r‹   zBaseAxis.asFea2  s÷   € Ø"Ÿmšm‘F°ˆ	ð —\‘\ö
àð ×Ñ˜a ™d A a¡D¨#¯(©(´3´s¸A¸a¹D³>Ó*BÕCð
ˆð 
ð —[‘[ö
àð ,×2Ñ2°9¸aÀ¹dÀAÀaÁDÈ!ÈAÉ$ÐPQÐRSÑPTÕUð
ˆð 
ð E×KÑKØ�s—x‘x §
¡
Ó+¨V°YÀÇ	Á	È'Ó@Ró
à�I‰I�hÓñ ð 	 ùò
ùò
s   ŸA C(Á/(C-rå   r©   r  rN   rV   rQ   r   r   #  s   „ ñ@óòTô rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r;   zÔAn 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                 óL   — t         j                  | |«       || _        || _        y r˜   ©rB   rœ   r  r  ©r›   r  r  r™   s       rQ   rœ   zOS2Field.__init__F  ó    € Ü×Ñ˜4 Ô*ØˆŒØˆ�
rV   c                 óP   — |j                  | j                  | j                  «       y)z6Calls the builder object's ``add_os2_field`` callback.N)Úadd_os2_fieldr  r  rž   s     rQ   r    zOS2Field.buildK  s   € à×Ñ˜dŸh™h¨¯
©
Õ3rV   c                 ó¤  — d„ }d}d}t        |D �cg c]  }|j                  «       |t        gf‘Œ c}«      }|j                  |D �cg c]  }|j                  «       ||gf‘Œ c}«       d|g|d<   dd„ g|d<   | j                  |v rBd	j                  || j                     d
    || j                     d   | j                  «      «      S yc c}w c c}w )Nc                 ó@   — dj                  t        t        | «      «      S )NrÓ   )rS   rÖ   rs  )r_  s    rQ   Ú
intarr2strz"OS2Field.asFea.<locals>.intarr2strP  s   € Ø—8‘8œC¤ Q›KÓ(Ð(rV   )ÚFSTypeÚTypoAscenderÚTypoDescenderÚTypoLineGapÚ	winAscentÚ
winDescentÚXHeightÚ	CapHeightÚWeightClassÚ
WidthClassÚLowerOpSizeÚUpperOpSize)ÚUnicodeRangeÚCodePageRangeÚPanoseÚpanoseÚVendorc                 ó$   — dj                  | «      S )Nz"{}"r“  )r`  s    rQ   ú<lambda>z OS2Field.asFea.<locals>.<lambda>e  s   € °&·-±-ÀÓ2B€ rV   Úvendorú{} {};r   r�   rª   )rL  r“   rs  Úupdater  rà   r  )r›   r¤   rê  ÚnumbersÚrangesr_  Úkeywordss          rQ   r‹   zOS2Field.asFeaO  sÖ   € ò	)ð
ˆð 3ˆÜ¸Ö@°1˜!Ÿ'™'›) a¬ XÒ.Ò@ÓAˆØ�‰¸vÖF¸!˜!Ÿ'™'›) a¨ _Ò5ÒFÔGØ&¨
Ð3ˆ�ÑØ&Ñ(BÐCˆ�ÑØ�8‰8�xÑØ—?‘?Ø˜Ÿ™Ñ" 1Ñ%Ð'< x°·±Ñ'9¸!Ñ'<¸T¿Z¹ZÓ'Hóð ð ùò AùÚFs   ‘CÁCr˜   r©   r  rN   rV   rQ   r;   r;   A  s   „ ñGóò
4ôrV   r;   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r+   zAn entry in the ``hhea`` table.Nc                 óL   — t         j                  | |«       || _        || _        y r˜   rã  rä  s       rQ   rœ   zHheaField.__init__p  rå  rV   c                 óP   — |j                  | j                  | j                  «       y)z7Calls the builder object's ``add_hhea_field`` callback.N)Úadd_hhea_fieldr  r  rž   s     rQ   r    zHheaField.buildu  ó   € à×Ñ˜tŸx™x¨¯©Õ4rV   c                 ó´   — d}t        |D �cg c]  }|j                  «       |f‘Œ c}«      }dj                  || j                     | j                  «      S c c}w )N)ÚCaretOffsetÚAscenderÚ	DescenderÚLineGaprÿ  ©rL  r“   rà   r  r  ©r›   r¤   Úfieldsr_  r  s        rQ   r‹   zHheaField.asFeay  sI   € ØDˆÜ°Ö8¨A˜!Ÿ'™'›) QšÒ8Ó9ˆØ�‰˜x¨¯©Ñ1°4·:±:Ó>Ð>ùò 9ó   ŒAr˜   r©   r  rN   rV   rQ   r+   r+   m  ó   „ Ù)óò
5ô?rV   r+   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)rJ   zAn entry in the ``vhea`` table.Nc                 óL   — t         j                  | |«       || _        || _        y r˜   rã  rä  s       rQ   rœ   zVheaField.__init__‚  rå  rV   c                 óP   — |j                  | j                  | j                  «       y)z7Calls the builder object's ``add_vhea_field`` callback.N)Úadd_vhea_fieldr  r  rž   s     rQ   r    zVheaField.build‡  r  rV   c                 ó´   — d}t        |D �cg c]  }|j                  «       |f‘Œ c}«      }dj                  || j                     | j                  «      S c c}w )N)ÚVertTypoAscenderÚVertTypoDescenderÚVertTypoLineGaprÿ  r  r  s        rQ   r‹   zVheaField.asFea‹  sI   € ØMˆÜ°Ö8¨A˜!Ÿ'™'›) QšÒ8Ó9ˆØ�‰˜x¨¯©Ñ1°4·:±:Ó>Ð>ùò 9r  r˜   r©   r  rN   rV   rQ   rJ   rJ     r  rV   rJ   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)rD   z²A 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                 óh   — t         j                  | |«       || _        || _        || _        || _        y r˜   )rB   rœ   rô   Ú	axisOrderÚnamesr™   )r›   rô   r  r  r™   s        rQ   rœ   z STATDesignAxisStatement.__init__š  s.   € Ü×Ñ˜4 Ô*ØˆŒØ"ˆŒØˆŒ
Ø ˆ�rV   c                 ó<   — |j                  | | j                  «       y r˜   )ÚaddDesignAxisr™   rž   s     rQ   r    zSTATDesignAxisStatement.build¡  s   € Ø×Ñ˜d D§M¡MÕ2rV   c           	      óê   — |t         z  }d| j                  › d| j                  › d�}|d|z   j                  | j                  D �cg c]  }|j                  |¬«      ‘Œ c}«      dz   z  }|dz  }|S c c}w )NzDesignAxis rÓ   z { 
r   r  ú};)r  rô   r  rS   r  r‹   ©r›   r¤   rø   rþ   s       rQ   r‹   zSTATDesignAxisStatement.asFea¤  su   € Ø”%‰ˆØ˜DŸH™H˜: Q t§~¡~Ð&6°fÐ=ˆØ��v‘×#Ñ#ÀTÇZÁZÖ$PÀ Q§W¡W°F WÕ%;Ò$PÓQÐTXÑXÑXˆØˆt‰ˆØˆ
ùò %Qs   ÁA0
r˜   r©   r  rN   rV   rQ   rD   rD   ‘  s   „ ñó!ò3ôrV   rD   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r%   ziSTAT table ElidedFallbackName

    Args:
        names: a list of :class:`STATNameStatement` objects
    Nc                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   r  r™   )r›   r  r™   s      rQ   rœ   zElidedFallbackName.__init__³  ó    € Ü×Ñ˜4 Ô*ØˆŒ
Ø ˆ�rV   c                 óP   — |j                  | j                  | j                  «       y r˜   )ÚsetElidedFallbackNamer  r™   rž   s     rQ   r    zElidedFallbackName.build¸  ó   € Ø×%Ñ% d§j¡j°$·-±-Õ@rV   c           	      ó´   — |t         z  }d}|d|z   j                  | j                  D �cg c]  }|j                  |¬«      ‘Œ c}«      dz   z  }|dz  }|S c c}w )NzElidedFallbackName { 
r   r  r"  )r  rS   r  r‹   r#  s       rQ   r‹   zElidedFallbackName.asFea»  s]   € Ø”%‰ˆØ'ˆØ��v‘×#Ñ#ÀTÇZÁZÖ$PÀ Q§W¡W°F WÕ%;Ò$PÓQÐTXÑXÑXˆØˆt‰ˆØˆ
ùò %Qs   ©A
r˜   r©   r  rN   rV   rQ   r%   r%   ¬  s   „ ñó!ò
AôrV   r%   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r&   zpSTAT table ElidedFallbackNameID

    Args:
        value: an int pointing to an existing name table name ID
    Nc                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   r  r™   )r›   r  r™   s      rQ   rœ   zElidedFallbackNameID.__init__Ê  r&  rV   c                 óP   — |j                  | j                  | j                  «       y r˜   )r(  r  r™   rž   s     rQ   r    zElidedFallbackNameID.buildÏ  r)  rV   c                 ó"   — d| j                   › d�S )NzElidedFallbackNameID r4  )r  r£   s     rQ   r‹   zElidedFallbackNameID.asFeaÒ  s   € Ø& t§z¡z l°!Ð4Ð4rV   r˜   r©   r  rN   rV   rQ   r&   r&   Ã  s   „ ñó!ò
Aô5rV   r&   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)rC   zÝA 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                 óZ   — t         j                  | |«       || _        || _        || _        y r˜   )rB   rœ   r  Ú	locationsr  )r›   r  r1  r  r™   s        rQ   rœ   zSTATAxisValueStatement.__init__ß  s'   € Ü×Ñ˜4 Ô*ØˆŒ
Ø"ˆŒØˆ�
rV   c                 ó<   — |j                  | | j                  «       y r˜   )ÚaddAxisValueRecordr™   rž   s     rQ   r    zSTATAxisValueStatement.buildå  s   € Ø×"Ñ" 4¨¯©Õ7rV   c                 óŽ  — d}| j                   D ]  }||j                  «       z  }Œ | j                  D ]  }||j                  «       z  }|dz  }Œ | j                  rdddg}g }d}t	        t        |«      «      D ]-  }| j                  |z  dk7  r|j                  ||   «       |dz  }Œ/ |ddj                  |«      › d	�z  }|d
z  }|S )NzAxisValue {
r   ÚOlderSiblingFontAttributeÚElidableAxisValueNamer�   r   zflag rÓ   ú;
r"  )r1  r‹   r  r  r  r’   rÙ   rS   )	r›   r¤   rø   r™   Ú
nameRecordr  ÚflagStringsrÏ   r�  s	            rQ   r‹   zSTATAxisValueStatement.asFeaè  së   € ØˆØŸ™ò 	$ˆHØ�8—>‘>Ó#Ñ#‰Cð	$ð Ÿ*™*ò 	ˆJØ�:×#Ñ#Ó%Ñ%ˆCØ�4‰K‰Cð	ð �:Š:Ø0Ð2IÐJˆEØˆKØˆDÜœ3˜u›:Ó&ò !�Ø—:‘: Ñ$¨Ò)Ø×&Ñ& u¨Q¡xÔ0Ø˜q‘y‘ð!ð �U˜3Ÿ8™8 KÓ0Ð1°Ð5Ñ5ˆCØˆt‰ˆØˆ
rV   r˜   r©   r  rN   rV   rQ   rC   rC   Ö  s   „ ñóò8ôrV   rC   c                   ó    — e Zd ZdZdd„Zdd„Zy)r   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                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   rô   Úvalues)r›   rô   r<  r™   s       rQ   rœ   z#AxisValueLocationStatement.__init__  s    € Ü×Ñ˜4 Ô*ØˆŒØˆ�rV   c                 ó|   — |d| j                   › d�z  }|dj                  d„ | j                  D «       «      › d�z  }|S )Nz	location rÓ   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr˜   rr  )rO   r�  s     rQ   rR   z3AxisValueLocationStatement.asFea.<locals>.<genexpr>  s   è ø€ Ò7 aœ3˜qŸ6Ñ7ùru  r7  )rô   rS   r<  )r›   rø   s     rQ   r‹   z AxisValueLocationStatement.asFea  sC   € Ø�˜4Ÿ8™8˜* AÐ&Ñ&ˆØ�#—(‘(Ñ7¨4¯;©;Ô7Ó7Ð8¸Ð<Ñ<ˆØˆ
rV   r˜   r©   rù   rN   rV   rQ   r   r   þ  s   „ ñóô
rV   r   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r#   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                 óL   — t         j                  | |«       || _        || _        y r˜   )rB   rœ   r‡   Ú
conditions)r›   r‡   rA  r™   s       rQ   rœ   zConditionsetStatement.__init__  s    € Ü×Ñ˜4 Ô*ØˆŒ	Ø$ˆ�rV   c                 óf   — |j                  | j                  | j                  | j                  «       y r˜   )Úadd_conditionsetr™   r‡   rA  rž   s     rQ   r    zConditionsetStatement.build!  s    € Ø× Ñ  §¡°·	±	¸4¿?¹?ÕKrV   c           	      óä   — ||d| j                   › d�z   dz   z  }| j                  j                  «       D ]   \  }\  }}||t        z   |› d|› d|› d�z   z  }Œ" ||dz   d| j                   › d�z   z  }|S )Nzconditionset rÓ   r  r7  ú})r‡   rA  r  r  )r›   rø   r¤   rô   ÚminvalueÚmaxvalues         rQ   r‹   zConditionsetStatement.asFea$  s–   € Øˆv˜-¨¯	©	 {°!Ð4Ñ4°uÑ<Ñ<ˆØ)-¯©×)>Ñ)>Ó)@ò 	FÑ%ˆCÑ%�(˜HØ�6œE‘> s e¨1¨X¨J°a¸°zÀÐ$EÑEÑE‰Cð	Fàˆv˜‰|  $§)¡) ¨CÐ0Ñ0Ñ0ˆØˆ
rV   r˜   )rª   rª   r  rN   rV   rQ   r#   r#     s   „ ñó%ò
LôrV   r#   c                   ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)ÚVariationBlockzCA variation feature block, applicable in a given set of conditions.Nc                 ó\   — t         j                  | |«       |||c| _        | _        | _        y r˜   )r   rœ   r‡   Úconditionsetr  )r›   r‡   rK  r  r™   s        rQ   rœ   zVariationBlock.__init__/  s,   € Ü�‰�t˜XÔ&àØØð 	9ˆŒ	�4Ô$ dÕ&8rV   c                 óJ  — |j                  | j                  | j                  «       | j                  dk7  r;| j                  |j                  vr#t        d| j                  › �| j                  «      ‚|j                  }i |_        t        j                  | |«       |j                  j                  «       D ]V  \  }}|j                  j                  |i «      j                  | j                  g «      }|j                  |«       ||vsŒRg ||<   ŒX ||_        |j                  «        y)r  rÃ   z,variation block used undefined conditionset N)r  r™   r‡   rK  Úconditionsets_r   r  r   r    r  Úfeature_variations_r  rÕ   r  )r›   rŸ   r  r  r  r  s         rQ   r    zVariationBlock.build7  s  € ð 	×Ñ˜dŸm™m¨T¯Y©YÔ7à×Ñ Ò'Ø×!Ñ!¨×)?Ñ)?Ñ?ä!Ø>¸t×?PÑ?PÐ>QÐRØ—‘óð ð ×$Ñ$ˆØˆÔÜ�‰�D˜'Ô"Ø!×+Ñ+×1Ñ1Ó3ò 	#‰JˆC�Ø×/Ñ/×:Ñ:¸3ÀÓC×NÑNØ×!Ñ! 2óˆEð �L‰L˜ÔØ˜(Ò"Ø "�˜’ð	#ð %ˆÔØ×ÑÕrV   c                 ó  — |d| j                   j                  «       z  z   }|| j                  dz   z  }| j                  r|dz  }|dz  }|t        j                  | |¬«      z  }||d| j                   j                  «       z  z   z  }|S )Nzvariation %s rÓ   r  r  r  r  )r‡   r  rK  r  r   r‹   r÷   s      rQ   r‹   zVariationBlock.asFeaS  sˆ   € Ø�¨¯©¯©Ó):Ñ:Ñ:ˆØˆt× Ñ  3Ñ&Ñ&ˆØ×ÒØ�?Ñ"ˆCØˆu‰ˆØŒu�{‰{˜4¨ˆ{Ó/Ñ/ˆØˆv˜	 D§I¡I§O¡OÓ$5Ñ5Ñ5Ñ5ˆØˆ
rV   r  r©   r  rN   rV   rQ   rI  rI  ,  s   „ ÙMó
òô8rV   rI  )XÚfontTools.feaLib.errorr   ÚfontTools.feaLib.locationr   ÚfontTools.misc.encodingToolsr   ÚfontTools.misc.textToolsr   r   Úcollectionsr   r<  r  Ú__all__rU   rà  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   r—  r:   r(   rE   rA   r   r"   r   r;   r+   rJ   rD   r%   r&   rC   r   r#   rI  rN   rV   rQ   ú<module>rW     sŸ  ðÝ 2Ý 8Ý 4ß 5Ý #Û à€òC€òLFñ ò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˜ô !9ôH9˜9ô 9ôB7�yô 7ô&˜	ô ô:R˜iô Rô<˜Iô <ô
 Iô 
ô&
 )ô 
ô&$˜Yô $ôN&6˜)ô &6ôR5˜yô 5ô"˜9ô ô*5˜)ô 5ôp˜9ô ô*C˜Yô CôLP�yô Pôf% yô %ôP+˜9ô +ô\8�iô 8ô%˜ô %ôP˜	ô ôk�*ô kô\	M˜Iô 	Mò0ô.M�ô .Môb;˜:ô ;ô&8˜
ô 8ô�Yô ô68 
ô 8ô69˜ô 9ô* ˆyô  ô<)ˆyô )ôX?�	ô ?ô$?�	ô ?ô$˜iô ô6˜ô ô.5˜9ô 5ô&%˜Yô %ôP ô ô(˜Iô ô4/�Uõ /rV   