a
    ZXht                    @   s  d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZ 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mZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; d dl<Z<d dl=Z=d dl>m?Z? d dl@Z@d dlAZAd dlBZBe@CeDZEdddZFdddZGG dd deHZIdS )    )sstruct)Tagtostr
binary2numsafeEval)FeatureLibError)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYLOOKUP_DEBUG_ENV_VAR)Parser)FeatureFile)VariableScalar)builder)
maxCtxFont)newTablegetTableModule)otBaseotTables)AlternateSubstBuilderChainContextPosBuilderChainContextSubstBuilderLigatureSubstBuilderMultipleSubstBuilderCursivePosBuilderMarkBasePosBuilderMarkLigPosBuilderMarkMarkPosBuilderReverseChainSingleSubstBuilderSingleSubstBuilderClassPairPosSubtableBuilderPairPosBuilderSinglePosBuilderChainContextualRuleAnySubstBuilder)OpenTypeLibError)OnlineVarStoreBuilder)buildVarDevTable)addFeatureVariationsRaw)normalizeValuepiecewiseLinearMap)defaultdictN)StringIOFc                 C   s   t | |}|j||d dS )a  Add features from a file to a font. Note that this replaces any features
    currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        featurefile: Either a path or file object (in which case we
            parse it into an AST), or a pre-parsed AST instance.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    tablesdebugN)Builderbuild)fontfeaturefiler-   r.   r    r3   ]/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/fontTools/feaLib/builder.pyaddOpenTypeFeatures3   s    
r5   c                 C   s*   t t|}|r||_t| |||d dS )ae  Add features from a string to a font. Note that this replaces any
    features currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        features: A string containing feature code.
        filename: The directory containing ``filename`` is used as the root of
            relative ``include()`` paths; if ``None`` is provided, the current
            directory is assumed.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    r,   N)r+   r   namer5   )r1   featuresfilenamer-   r.   r2   r3   r3   r4   addOpenTypeFeaturesFromStringE   s    r9   c                   @   s  e Zd Zedd dD Zdd Zddd	Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%ddHdIZ&dJdK Z'ddLdMZ(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2dbdc Z3ddde Z4dfdg Z5dhdi Z6djdk Z7g fdldmZ8dndo Z9dpdq Z:drds Z;ddtduZ<dvdw Z=dxdy Z>dzd{ Z?d|d} Z@d~d ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd e\j]D Z^dd Z_dS )r/   c                 c   s   | ]}t |V  qd S N)r   .0tagr3   r3   r4   	<genexpr>_   s   zBuilder.<genexpr>)
BASEGDEFGPOSGSUBOS/2headhhear6   vheaSTATc                 C   s  || _ t|tr |d  | _| _nd | | _| _| | _d | _d|v rh|d j| _t	dd | jD | _t
 | _d | _d| _d | _d| _t
 | _d| _i | _d | _d | _d | _g | _i i d| _i | _i | _i | _g | _d | _i | _d| _t
 | _i | _ t
 | _!i | _"i | _#t$t%| _&d | _'d | _(g | _)d | _*d | _+i | _,i | _-i | _.i | _/i | _0i | _1i | _2i | _3i | _4i | _5i | _6i | _7i | _8d S )Nfvarc                 S   s   g | ]
}|j qS r3   )axisTag)r<   axr3   r3   r4   
<listcomp>|       z$Builder.__init__.<locals>.<listcomp>r   F)rB   rA   )9r1   
isinstancer   	parseTreefileZgetReverseGlyphMapglyphMapvarstorebuilderaxesr%   setdefault_language_systems_script_lookupflag_lookupflag_markFilterSet_use_extension_language_systemsseen_non_DFLT_script_named_lookups_cur_lookup_cur_lookup_name_cur_feature_name_lookups_lookup_locations	features_required_features_feature_variations_aalt_features_aalt_location_aalt_alternates_aalt_use_extension_featureNames_featureNames_ids_cv_parameters_cv_parameters_ids_cv_num_named_params_r*   listcv_characters_size_parameters_fontRevision_names_base_horiz_axis_base_vert_axis_attachPoints_ligCaretCoords_ligCaretPoints_glyphClassDefs_markAttach_markAttachClassID_markFilterSets_os2_hhea_vhea_stat_conditionsets_model_cache)selfr1   r2   r3   r3   r4   __init__o   sn    


zBuilder.__init__NFc           
         s,   j d u rt j j  _  j   |d u r: j}n4t|}| j }|rndt	|}t
d| dd|v r~   d|v r   d|v r   d|v r   d|v r   d	|v rΈ   d
|v rވ   dD ]}||vrq |} jr || |jjdks8|jjdks8|jjdkrRt| } j|< ||_q| jv r j|= qt fdddD rd	 jv rt j jd	 _ d|v rԈ ! }|r| jd< nd jv rԈ jd= d|v r " }	|	r|	 jd< nd jv r jd= |s t#j$%t&r( '  d S )N, z9The following tables were requested but are unsupported: .rB   rD   rE   rF   r6   rC   rG   rA   rB   r   c                 3   s   | ]}| j v V  qd S r:   )r1   r;   r   r3   r4   r>      rL   z Builder.build.<locals>.<genexpr>r@   r?   )(rN   r   rO   rP   parser0   supportedTables	frozensetjoinsortedNotImplementedErrorbuild_feature_aalt_
build_head
build_hhea
build_vhea
build_name
build_OS_2
build_STAT	makeTablerc   makeFeatureVariations
ScriptListScriptCountFeatureListFeatureCount
LookupListLookupCountr   r1   tableanyr   usMaxContext	buildGDEF	buildBASEosenvirongetr
   	buildDebg)
r   r-   r.   unsupportedZunsupported_stringr=   r   Z	fontTablegdefbaser3   r   r4   r0      sx    







$

zBuilder.buildc                 C   s4   || j |}| j|_| j|_| j|_| j| |S r:   )	r1   rV   
lookupflagrW   markFilterSetrX   	extensionr_   append)r   locationbuilder_classresultr3   r3   r4   get_chained_lookup_   s    zBuilder.get_chained_lookup_c                 C   s2   | j D ]&\}}|||f}| j|g | qd S r:   )rY   ra   
setdefaultr   )r   lookupZfeature_namescriptlangkeyr3   r3   r4   add_lookup_to_feature_  s    
zBuilder.add_lookup_to_feature_c                 C   s   | j r6t| j |kr6| j j| jkr6| j j| jkr6| j S | jrL| j rLtd||| j|| _ | j| j _| j| j _| j	| j _
| j| j  | jr| j | j| j< | jr| | j | j | j S )NOWithin a named lookup block, all rules must be of the same lookup type and flag)r\   typer   rV   r   rW   r]   r   r1   rX   r   r_   r   r[   r^   r   )r   r   r   r3   r3   r4   get_lookup_  s0    


zBuilder.get_lookup_c              
      s  | j s| jsd S dd | j D }| j dg D ]\}fdd| j D }|spdkrptd|f  q0|D ]j\}}}}|D ]X}t|ts|g}|D ]>}|  D ],\}	}
|	|	g   
 fdd	|
D  qqqqtq0d
d | D }dd | D }|s|sd S dd | j D | _| j}g | _| | jd| j |rb| |t}||_|rz| |t}||_|   | j
| d S )Nc                 S   s   i | ]\}}|t |qS r3   )rm   )r<   gar3   r3   r4   
<dictcomp>)  rL   z/Builder.build_feature_aalt_.<locals>.<dictcomp>)Naaltc                    s*   g | ]"\\}}}}| kr||||fqS r3   r3   r<   r   r   featurelookups)r6   r3   r4   rK   +  s   z/Builder.build_feature_aalt_.<locals>.<listcomp>r   z#%s: Feature %s has not been definedc                 3   s   | ]}| vr|V  qd S r:   r3   r<   r   )alts_for_glyphr3   r4   r>   ;  s   z.Builder.build_feature_aalt_.<locals>.<genexpr>c                 S   s&   i | ]\}}t |d kr||d qS )   r   lenr<   glyphreplr3   r3   r4   r   >  s   c                 S   s"   i | ]\}}t |d kr||qS )r   r   r   r3   r3   r4   r   A  rL   c                 S   s*   i | ]"\\}}}}|d kr|||f|qS )r   r3   r   r3   r3   r4   r   D  s   )rd   rf   itemsra   warningswarnrM   rm   ZgetAlternateGlyphsr   extendr_   start_featurere   rg   r   r   mappingr   
alternatesend_feature)r   r   r   r   r   r   r   
lookuplistr   r   altssingleZmultiZold_lookupsZsingle_lookupZmulti_lookupr3   )r   r6   r4   r   "  sP    

zBuilder.build_feature_aalt_c                 C   s^   | j s
d S | jd}|sRtd }| jd< |d| j d|_d|_d |_|_| j |_	d S )NrD   s6                                                         g      ?i<_l   e )
rp   r1   r   r   	decompiletableVersionZmagicNumbercreatedmodifiedZfontRevisionr   r   r3   r3   r4   r   U  s    zBuilder.build_headc                 C   s   | j s
d S | jd}|s@td }| jd< |d| j d|_d| j v rV| j d |_d| j v rl| j d |_d| j v r| j d |_d| j v r| j d |_	d S )NrE   $                                          ZcaretoffsetZascenderZ	descenderZlinegap)
r|   r1   r   r   r   r   ZcaretOffsetascentdescentlineGapr   r3   r3   r4   r   a  s    



zBuilder.build_hheac                 C   s   | j s
d S | jd}|s@td }| jd< |d| j d|_d| j v rV| j d |_d| j v rl| j d |_d| j v r| j d |_d S )NrF   r   i  ZverttypoascenderZverttypodescenderZverttypolinegap)	r}   r1   r   r   r   r   r   r   r   r   r3   r3   r4   r   r  s    


zBuilder.build_vheac                 C   s4   dd |j D }tddD ]}||vr|  S qd S )Nc                 S   s   g | ]
}|j qS r3   )nameID)r<   r6   r3   r3   r4   rK     rL   z,Builder.get_user_name_id.<locals>.<listcomp>   i  )namesrange)r   r   ZnameIDsZuser_name_idr3   r3   r4   get_user_name_id  s    zBuilder.get_user_name_idc                 C   s   d }|dkrJt  }| j\|_|_|_|_|| jv rB| j| |_nd|_n|| j	v r| js\n(|| jv sjJ t 
 }d|_| j| |_n|| jv rt  }d|_| j|dfd|_| j|dfd|_| j|dfd|_| j|d|_| j|dfd|_t| j| |_| j| |_|S )Nsizer   FeatUILabelNameIDFeatUITooltipTextNameIDSampleTextNameIDZParamUILabelNameID_0)r   ZFeatureParamsSizero   
DesignSizeSubfamilyID
RangeStartRangeEndri   ZSubfamilyNameIDrh   ZFeatureParamsStylisticSetVersionZUINameIDrj   ZFeatureParamsCharacterVariantsFormatrk   r   r   r   r   rl   ZNumNamedParametersZFirstParamUILabelNameIDr   rn   Z	CharCountZ	Character)r   r=   paramsr3   r3   r4   buildFeatureParams  sL    

zBuilder.buildFeatureParamsc           	      C   s   | j s
d S | jd}|s2td }| jd< g |_| j D ]}|\}}}}}t|ts|}|| jv r|| jvr| 	|| j|< | j| d usJ | j| }nD|d | j
v r|| jvr| 	|| j|< | j| d usJ | j| }|||||| q8|j  d S )Nr6   r   )rq   r1   r   r   r   rM   intrh   ri   r   rj   rk   setNamesort)	r   r   r6   r   
platformID	platEncIDlangIDstringr=   r3   r3   r4   r     s,    





zBuilder.build_namec                 C   s  | j s
d S | jd}|sNtd }| jd< dttdj }||| j d}d| j v rh| j d |_	d| j v rtd
 }| j d \
|_|_|_|_|_|_|_|_|_|_||_d| j v r| j d |_d| j v r| j d |_d| j v r| j d |_d	| j v r| j d	 |_d
| j v r(| j d
 |_d| j v rLtd| j d  d |_d| j v rd| j d |_d| j v r|| j d |_d| j v r|| j d  d| j v r|  | j d }|\|_!|_"d}d| j v r| j d |_#d}d| j v r| j d |_$d}d| j v r| j d |_%d}d| j v r4| j d |_&d}dd }t'||j(|_(|dkr^||d |dkrr||d |dkr||d d S )NrC       r   ZfstypepanoseZtypoascenderZtypodescenderZtypolinegapZ	winascentZ
windescentvendorz'''ZweightclassZ
widthclassZunicoderangeZcodepageranger   Zxheight   Z	capheightZloweropsize   Zupperopsizec                 S   s$   |D ]}t | |st| |d qd S )Nr   )hasattrsetattr)r   attrsattrr3   r3   r4   	checkattr
  s    
z%Builder.build_OS_2.<locals>.checkattr)ulCodePageRange1ulCodePageRange2)sxHeight
sCapHeightZusDefaultCharZusBreakCharr   )usLowerOpticalPointSizeusUpperOpticalPointSize))r{   r1   r   r   r   calcsizer   ZOS2_format_0r   ZfsTypeZPanoseZbFamilyTypeZbSerifStyleZbWeightZbProportionZ	bContrastZbStrokeVariationZ	bArmStyleZbLetterFormZbMidlineZbXHeightr   ZsTypoAscenderZsTypoDescenderZsTypoLineGapZusWinAscentZusWinDescentr   Z	achVendIDZusWeightClassZusWidthClassZsetUnicodeRangesbuild_codepages_r   r   r  r  r  r  maxversion)r   r   datar  r   pagesr   r3   r3   r4   r     s    









zBuilder.build_OS_2c                 C   s\   dD ]}|| j v rt| d|qt|tr:|| j d< nt|trP|| j d< nt|d S )N)ElidedFallbackNameElidedFallbackNameIDz is already set.r  r  )r~   r   rM   r   rm   AssertionError)r   valuer   tokenr3   r3   r4   setElidedFallbackName!  s    


zBuilder.setElidedFallbackNamec                 C   s   d| j vrg | j d< |jdd | j d D v rBtd|j d||jdd | j d D v rptd|j d|| j d | d S )	N
DesignAxesc                 s   s   | ]}|j V  qd S r:   )r=   r<   rr3   r3   r4   r>   4  rL   z(Builder.addDesignAxis.<locals>.<genexpr>z$DesignAxis already defined for tag "z".c                 s   s   | ]}|j V  qd S r:   )	axisOrderr  r3   r3   r4   r>   9  rL   z+DesignAxis already defined for axis number r   )r~   r=   r   r  r   )r   Z
designAxisr   r3   r3   r4   addDesignAxis1  s    

zBuilder.addDesignAxisc                 C   s   d| j vrg | j d< | j d D ]Z}dd |jD dd |jD krdd |jD dd |jD kr|j|jkrtd|q| j d | d S )NAxisValueRecordsc                 S   s   h | ]}|  qS r3   ZasFear<   nr3   r3   r4   	<setcomp>F  rL   z-Builder.addAxisValueRecord.<locals>.<setcomp>c                 S   s   h | ]}|  qS r3   r  r  r3   r3   r4   r  G  rL   c                 S   s   h | ]}|  qS r3   r  r  r3   r3   r4   r  H  rL   c                 S   s   h | ]}|  qS r3   r  r  r3   r3   r4   r  I  rL   z8An AxisValueRecord with these values is already defined.)r~   r   	locationsflagsr   r   )r   ZaxisValueRecordr   Zrecord_r3   r3   r4   addAxisValueRecord@  s$    


zBuilder.addAxisValueRecordc                    s  | j s
d S | j d}|s$tdd | j d}i  g }|D ]}g  |j< q<|d urJ|D ]}i }|jdkrv|j|d< t|jdkr |jd }|j}t|dkr||d |j	d t|dkr||d |d |j	d	 t|d
kr|\}	}
}||	|
||j	d  |j 
| qZ|dd |jD |j	d |
| qZ fdd|D }| jd}|std }| jd< g |_	d| j v r| j d }||}|std| dd nd| j v r| j d }tj| j|||d d S )Nr  zDesignAxes not definedr  r   r  r   )r  r6   r   )r  ZlinkedValuer6      )ZnominalValueZrangeMinValueZrangeMaxValuer6   c                 S   s   i | ]}|j |jd  qS )r   )r=   valuesr<   ir3   r3   r4   r   ~  rL   z&Builder.build_STAT.<locals>.<dictcomp>)r   r6   c                    s&   g | ]}|j |j|j |j d qS ))Zorderingr=   r6   r  )r  r=   r   )r<   r   Z
axisValuesr3   r4   rK     s   z&Builder.build_STAT.<locals>.<listcomp>r6   r  zElidedFallbackNameID z; points to a nameID that does not exist in the "name" tabler  )r  ZelidedFallbackName)r~   r   r   r=   r  r   r  r  updater   r   r1   r   ZgetDebugNameotlZbuildStatTable)r   rR   ZaxisValueRecordsZformat4_locationsr=   ZavrZ
valuesDictr   r  ZnominalZminValZmaxValZ
designAxesZ	nameTabler   r6   r3   r"  r4   r   R  s    











zBuilder.build_STATc                     s   ddddddddd	d
dddddddddddddddddddddd   fd!d"|D }g }t dD ]T}|d# t |d$ |d d$ D ].}||v r||  d%7  < q||  d&7  < qqbd'd" |D S )(Nr   r   r   r     r                              0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   )i  i  i  i  i  i  i  i  i  ij  i  i  i  i  iQ  ie  ib  ia  i`  i_  i^  i]  i\  iY  iW  iT  i  i  i  iR  i  c                    s   g | ]}| v r | qS r3   r3   r<   pZ
pages2bitsr3   r4   rK     rL   z,Builder.build_codepages_.<locals>.<listcomp>     10c                 S   s   g | ]}t |d d d qS )N)r   r?  r3   r3   r4   rK     rL   )r   r   )r   r
  bitsr!  jr3   rA  r4   r    sR    !
zBuilder.build_codepages_c                 C   sL   | j s| jsd S t }d|_| | j |_| | j|_td}||_	|S )Nr   r?   )
rr   rs   r   r?   r   buildBASEAxisZ	HorizAxisZVertAxisr   r   )r   r   r   r3   r3   r4   r     s    zBuilder.buildBASEc                 C   s   t  }d|_||_|S Nr   )r   	BaseCoordr   Z
Coordinate)r   cZcoordr3   r3   r4   buildBASECoord  s    zBuilder.buildBASECoordc                    s  |sd S |\}}}t  }t  |_||j_t||j_t  |_g |j_t||j_t	|D ]$  fdd|D }t  } d |_
t  |_t  |j_| d |jj_g |jj_t d |jj_g |j_ d D ]}|jjj| | q|D ]f\}}	}
t  }| |	|_| |
|_d|_|dkrB||j_qt  }||_||_|jj| qt|jj|j_|jj| q^|S )Nc                    s(   g | ] }|d   d  kr|dd qS )r   r   Nr3   )r<   recordr   r3   r4   rK     s   z)Builder.buildBASEAxis.<locals>.<listcomp>r   r   r   dflt)r   ZAxisZBaseTagListZBaselineTagr   ZBaseTagCountZBaseScriptListZBaseScriptRecordZBaseScriptCountr   ZBaseScriptTagZ
BaseScriptZ
BaseValuesindexZDefaultIndexrK  ZBaseCoordCountZBaseLangSysRecordr   rM  ZMinMaxZMinCoordZMaxCoordZFeatMinMaxCountZDefaultMinMaxZBaseLangSysTagZBaseLangSysCount)r   axisbasesscriptsminmaxZminmax_for_scriptrN  rL  languageZ	min_coordZ	max_coordZminmax_recordZlang_recordr3   rO  r4   rI    sP    








zBuilder.buildBASEAxisc                 C   s   t  }|  |_t| j| j|_t	| j
| j| j|_|  |_|  |_|jrXdnd|_| jr| j }|rd|_||_| }|| d| jv r| jd j| | j  t|j|j|j|j|jfst|drtd}||_|S d S d S )Ni  r   i  rA   VarStorer@   )r   r@   buildGDEFGlyphClassDef_GlyphClassDefr$  ZbuildAttachListrt   rP   Z
AttachListZbuildLigCaretListru   rv   ZLigCaretListbuildGDEFMarkAttachClassDef_MarkAttachClassDefbuildGDEFMarkGlyphSetsDef_ZMarkGlyphSetsDefr   rQ   finishrW  optimizeZremap_device_varidxesr1   r   r   clearr   r   r   )r   r   storeZ
varidx_mapr   r3   r3   r4   r     sB    






	zBuilder.buildGDEFc                 C   s   | j rdd | j  D }nRi }| jD ]}||  q&| jj D ]&}|jD ]}|	 D ]}d||< q\qPqF|rt
 }||_|S d S d S )Nc                 S   s   i | ]\}\}}||qS r3   r3   r<   r   rL  _r3   r3   r4   r   8  rL   z3Builder.buildGDEFGlyphClassDef_.<locals>.<dictcomp>r  )rw   r   r_   r#  ZinferGlyphClassesrN   ZmarkClassesr  definitionsglyphSetr   rY  	classDefs)r   classesr   	markClassmarkClassDefr   r   r3   r3   r4   rX  6  s    

zBuilder.buildGDEFGlyphClassDef_c                 C   s.   dd | j  D }|sd S t }||_|S )Nc                 S   s   i | ]\}\}}||qS r3   r3   ra  r3   r3   r4   r   I  rL   z8Builder.buildGDEFMarkAttachClassDef_.<locals>.<dictcomp>)rx   r   r   r[  re  )r   re  r   r3   r3   r4   rZ  H  s    z$Builder.buildGDEFMarkAttachClassDef_c                 C   s<   g }t | j dd dD ]\}}|| qt|| jS )Nc                 S   s   | d S rJ  r3   )itemr3   r3   r4   <lambda>S  rL   z4Builder.buildGDEFMarkGlyphSetsDef_.<locals>.<lambda>r   )r   rz   r   r   r$  ZbuildMarkGlyphSetsDefrP   )r   Zsetsglyphsid_r3   r3   r4   r\  P  s    z"Builder.buildGDEFMarkGlyphSetsDef_c                 C   s:   d| j vr$td| j d< i | j d _| j| j d jt< d S )NZDebg)r1   r   r	  r`   r	   r   r3   r3   r4   r   X  s    
zBuilder.buildDebgc           
      C   sV  |dv sJ || j D ]
}d |_qg }| j D ]}|j|kr<q,| |}|j|d ud}|d u rjtd|j|D ]<}t||_tt	|j|d d| j
| t	|j< || qnq,g }|D ]}z||  W q ty } ztt	||j|W Y d }~qd }~0  tyN } z2| j
| t	|j j}	tt	||	|W Y d }~qd }~0 0 q|S )Nr   )Zis_named_lookupr   )r   r6   r   )r_   lookup_indexr   get_lookup_name_Zpromote_lookup_typer   r   r   r   strr`   r   r0   r$   	Exception)
r   r=   r   r   r6   ZresolvedlZ	otLookupser   r3   r3   r4   buildLookups_^  s@    




&(zBuilder.buildLookups_c              
      s   t t|d  }d|_t |_g |j_t |_g |j_t |_| ||j_	i }i }i }dd }t
| j |dD ]h\}}|\}	}
}ttdd |D }|dko|dk}| ||}t|d	kr|s|sqv|D ]P}z,| j| t| j|d
| j| t|< W q ty&   td Y q0 q||f}||}|d u rt|jj}t }||_t |_| ||j_t||j_t||j_|jj | |||< |!|	i !|
g  | | j"|	|
f|krv|||	|
f< qvt
| D ]\}	}t }|	|_#t$ |_$d |j$_%g |j$_&t
| D ]\}
}t& }t' |_'d |j'_(||	|
f  d u rnd|j'_)n |j'_) fdd|D |j'_*t|j'j*|j'_+|
dkr|j'|j$_%n|
|_,|j$j& | q*t|j$j&|j$_-|jj | qt|jj|j_.t|jj|j_+t|jj	|j_|S )Nr   c                 S   s(   | d d | d d | d d | d fS )Nr   r   r   r3   )fr3   r3   r4   rj    rL   z#Builder.makeTable.<locals>.<lambda>rk  c                 s   s   | ]}|j d ur|j V  qd S r:   )rn  r<   rr  r3   r3   r4   r>     s   z$Builder.makeTable.<locals>.<genexpr>rA   r   r   )r   zWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.i  c                    s   g | ]}| kr|qS r3   r3   r   Zreq_feature_indexr3   r4   rK     s   z%Builder.makeTable.<locals>.<listcomp>rP  )/getattrr   r   r   ZScriptRecordr   ZFeatureRecordr   rt  ZLookupr   ra   r   tupledictfromkeysany_feature_variationsr   r`   rp  _replaceKeyErrorr   r   r   Z
FeatureTagZFeaturer   ZFeatureParamsrm   ZLookupListIndexr   r   r   rb   Z	ScriptTagZScriptZDefaultLangSysZLangSysRecordZLangSysZLookupOrderZReqFeatureIndexZFeatureIndexr   Z
LangSysTagZLangSysCountr   )r   r=   r   Zfeature_indicesZrequired_feature_indicesrT  ZsortFeatureTagr   r   r   r   feature_tagZlookup_indicesZsize_featureZforce_featureixZfeature_keyZfeature_indexZfrecZlang_featuresZsrecZlangrecr3   rw  r4   r     s    














zBuilder.makeTablec                 C   s   i }d}| j  D ]|\\}}}}g ||< | D ]\\}}	| j| }
g }|	D ].}|j|krZqJ|jd ushJ ||j d}qJ|| |
|f q0q|r| D ]\}}t| j||| qd S )NFT)rc   r   r   r   rn  r   r'   r1   )r   r   	table_tagZfeature_varsZhas_any_variationsrb  r  
variationsconditionsetbuildersZraw_conditionsetindicesbZconditions_and_lookupsr3   r3   r4   r     s&    


zBuilder.makeFeatureVariationsc                    sX   | j  D ]H\\}}}}||kr"q
| D ]&\}}t fdd|D r*  dS q*q
dS )Nc                 3   s   | ]}|j  kV  qd S r:   )r   )r<   r  r  r3   r4   r>     rL   z1Builder.any_feature_variations.<locals>.<genexpr>TF)rc   r   r   )r   r  r  rb  r   r  r  r  r3   r  r4   r|    s    zBuilder.any_feature_variationsc                 C   s(   dd | j  D }||v r$|| S d S )Nc                 S   s   i | ]\}}||qS r3   r3   )r<   kvr3   r3   r4   r     rL   z,Builder.get_lookup_name_.<locals>.<dictcomp>)r[   r   )r   r   revr3   r3   r4   ro    s    zBuilder.get_lookup_name_c                 C   s|   |dkr |dkr | j r td||dkr:| jr@td|nd| _||f| j v rhtd| | f || j ||f d S )NDFLTrP  z_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz1"languagesystem %s %s" has already been specified)rT   r   rZ   stripadd)r   r   r   rV  r3   r3   r4   add_language_system  s(    zBuilder.add_language_systemc                 C   s   | j rt| j S tdhS d S )N)r  rP  )rT   r   r   r3   r3   r4   get_default_language_systems_$  s    
z%Builder.get_default_language_systems_c                 C   s\   |r|dkrt d||  | _d| _d | _|| _d| _d | _|| _|dkrX|| _	|| _
d S )Nr   zL'useExtension' keyword for feature blocks is allowed only for 'aalt' featurer  r   )r   r  rY   rU   r\   r^   rV   rW   rX   re   rg   r   r   r6   Zuse_extensionr3   r3   r4   r   /  s    
zBuilder.start_featurec                 C   s6   | j d usJ d | _ d | _d | _d| _d | _d| _d S )Nr   F)r^   rY   r\   rV   rW   rX   r   r3   r3   r4   r   @  s    zBuilder.end_featurec                 C   sb   || j v rtd| || jdkr,td||| _d | j |< d | _|| _| jd u r^d| _d | _d S )Nz$Lookup "%s" has already been definedr   zpLookup blocks cannot be placed inside 'aalt' features; move it out, and then refer to it with a lookup statementr   )r[   r   r^   r]   r\   rX   rV   rW   r  r3   r3   r4   start_lookup_blockI  s     



zBuilder.start_lookup_blockc                 C   s:   | j d usJ d | _ d | _d| _| jd u r6d| _d | _d S )NFr   )r]   r\   rX   r^   rV   rW   r   r3   r3   r4   end_lookup_block\  s    
zBuilder.end_lookup_blockc                 C   s<   || j v sJ |d | _| j | }|d ur8| || j d S r:   )r[   r\   r   r^   )r   lookup_namer   r3   r3   r4   add_lookup_calle  s
    
zBuilder.add_lookup_callc                 C   s
   || _ d S r:   )rp   )r   r   revisionr3   r3   r4   set_font_revisionl  s    zBuilder.set_font_revisionc                    s  t |dksJ | jdv r*td| j || jd u r>td|d | _| j|| jf}| j|d d|d f |dksx|r r d d  | j|< n&| j|g } fdd	|D | j|< t| j|fg| _|r| j|f}|| j	v rtd
|
 | j
 | j	| 
 f || j| j	|< d S )Nr%  r   r   z7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksr   rP  r   c                    s   g | ]}| vr|qS r3   r3   )r<   xr   r3   r4   rK     rL   z(Builder.set_language.<locals>.<listcomp>zPLanguage %s (script %s) has already specified feature %s as its required feature)r   r^   r   r\   rU   ra   r   r   rY   rb   r  )r   r   rV  include_defaultrequiredr   Zcur_lookupsr3   r  r4   set_languageo  sD    



zBuilder.set_languagec                 C   s~   t |}| j|}|d ur |S t| jd }|| j|< |D ]<}|| jv rj| j| \}}td||f |||f| j|< q<|S )Nr   z=Glyph %s already has been assigned a MarkAttachmentType at %s)r   ry   r   r   rx   r   )r   r   rl  rm  r   rb  locr3   r3   r4   getMarkAttachClass_  s"    

zBuilder.getMarkAttachClass_c                 C   s8   t |}| j|}|d ur |S t| j}|| j|< |S r:   )r   rz   r   r   )r   r   rl  rm  r3   r3   r4   getMarkFilterSet_  s    

zBuilder.getMarkFilterSet_c                 C   s\   |d@ }|d ur(|  ||}||d> B }|d urL| ||}|dB }|| _nd | _|| _d S )N   r(  r)  )r  r  rW   rV   )r   r   r  Z
markAttachZ
markFilterZmarkAttachClassr   r3   r3   r4   set_lookup_flag  s    zBuilder.set_lookup_flagc                 C   sp   | j dv rtd| j  || j d u r.td|| j|dfhkrBd S d | _|| _d| _d | _| j|dddd d S )	Nr  z5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksrP  r   TF)r  r  )r^   r   rY   r\   rU   rV   rW   r  )r   r   r   r3   r3   r4   
set_script  s&    

zBuilder.set_scriptc                    s>   g }|D ]0}|dur.|  fdd|D  q| d q|S )zHelper for building chain contextual substitutions

        Given a list of lookup names, finds the LookupBuilder for each name.
        If an input name is None, it gets mapped to a None LookupBuilder.
        Nc                    s   g | ]} j |jqS r3   )r[   r   r6   rv  r   r3   r4   rK     rL   z1Builder.find_lookup_builders_.<locals>.<listcomp>)r   )r   r   Zlookup_buildersr   r3   r   r4   find_lookup_builders_  s    zBuilder.find_lookup_builders_c                 C   s$   |D ]}| j |t | qd S r:   )rt   r   rS   r#  )r   r   rl  ZcontourPointsr   r3   r3   r4   add_attach_points  s    zBuilder.add_attach_pointsc                 C   s(   | j dkrtd|| j||f d S )Nr   z9Feature references are only allowed inside "feature aalt")r^   r   rd   r   )r   r   ZfeatureNamer3   r3   r4   add_feature_reference  s
    
zBuilder.add_feature_referencec                 C   s   | j | d S r:   )rh   r  r   r=   r3   r3   r4   add_featureName  s    zBuilder.add_featureNamec                 C   s   | j | d S r:   )rj   r  r  r3   r3   r4   add_cv_parameter  s    zBuilder.add_cv_parameterc                 C   s,   || j v r| j |  d7  < n
d| j |< dS )zbAdds new items to ``self.cv_num_named_params_``
        or increments the count of existing items.r   N)rl   r  r3   r3   r4   add_to_cv_num_named_params  s    
z"Builder.add_to_cv_num_named_paramsc                 C   s   | j | | d S r:   )rn   r   )r   	characterr=   r3   r3   r4   add_cv_character  s    zBuilder.add_cv_characterc                 C   s"   |r|||f| _ n|||f| _d S r:   )rs   rr   )r   rS  rT  verticalrU  r3   r3   r4   set_base_axis  s    zBuilder.set_base_axisc           	      C   sV   | j dkrtd| j  |||||g| _| jD ]"\}}||| j f}| j|g  q.d S )Nr   z9Parameters statements are not allowed within "feature %s")r^   r   ro   rY   ra   r   )	r   r   r   r   r   r   r   r   r   r3   r3   r4   set_size_parameters  s    
zBuilder.set_size_parametersc                 C   sv   |  |t}| D ]\\}}||jv rf||j| krRtdd|d|| ntdd| |||j|< qd S )Nz7Removing duplicate substitution from "%s" to "%s" at %sr   z%Already defined substitution for "%s")r   r#   r   r   loginfor   r   )r   r   r   r   r   r  r3   r3   r4   add_any_subst_  s    
zBuilder.add_any_subst_c           	      C   s~   | j dkr@| D ](\}}| j|g }||vr|| qd S |sL|sL|r`| |||| d S | |dd | D  d S )Nr   c                 S   s   i | ]\}}|f|fqS r3   r3   )r<   r   r  r3   r3   r4   r   ;  rL   z,Builder.add_single_subst.<locals>.<dictcomp>)r^   r   rf   r   r   add_single_subst_chained_r  )	r   r   prefixsuffixr   
forceChainZ
from_glyphZto_glyphr   r3   r3   r4   add_single_subst.  s    
zBuilder.add_single_substc                 C   s<   |s|s|r"|  ||||| d S | ||ft|i d S r:   )add_multi_subst_chained_r  ry  )r   r   r  r   r  replacementsr  r3   r3   r4   add_multiple_subst?  s    zBuilder.add_multiple_substc                    s   | j dkr4| j|g    fdd|D  d S |s<|rr| |t}| |t}|j	t
||hg||g n| |t}||jv rtd| |||j|< d S )Nr   c                 3   s   | ]}| vr|V  qd S r:   r3   r   r   r3   r4   r>   N  rL   z.Builder.add_alternate_subst.<locals>.<genexpr>z)Already defined alternates for glyph "%s")r^   rf   r   r   r   r   r   r   rulesr   r"   r   r   )r   r   r  r   r  replacementchainr   r3   r  r4   add_alternate_substK  s    

zBuilder.add_alternate_substc                    sX   |s|s|r"|  ||||  d S t|s4td|| | fddtj| D  d S )N!Empty glyph class in substitutionc                    s   i | ]}| fqS r3   r3   r   r  r3   r4   r   p  rL   z.Builder.add_ligature_subst.<locals>.<dictcomp>)add_ligature_subst_chained_allr   r  	itertoolsproduct)r   r   r  rl  r  r  r  r3   r  r4   add_ligature_subst^  s    

zBuilder.add_ligature_substc              	   C   sN   t |rt |rt |s"td|| |t}|jt|||| | d S N,Empty glyph class in contextual substitution)r  r   r   r   r  r   r"   r  r   r   r  rl  r  r   r   r3   r3   r4   add_chain_context_substt  s    zBuilder.add_chain_context_substc                 C   s|   |rt |rt |std|| |t}||t}|d u rJ| |t}|j| |j	
t|t| g||g d S r  )r  r   r   r   find_chainable_substr   r   r   r#  r  r   r"   rm   keys)r   r   r  r  r   r  subr3   r3   r4   r    s    z!Builder.add_single_subst_chained_c                 C   st   t |rt |std|| |t}|||it}|d u rJ| |t}||j|< |j	t
||hg||g d S r  )r  r   r   r   r  r   r   r   r  r   r"   )r   r   r  r   r  r  r  r  r3   r3   r4   r    s    
z Builder.add_multi_subst_chained_c           
   	   C   s   t |rt |std|| |t}|||}|d u rF| |t}tj| D ]B}|j	
||}	|	|krtd| d|	 d| d|||j	|< qP|jt||||g d S )Nr  z!Conflicting ligature sub rules: 'z' maps to 'z' and '')r  r   r   r   Zfind_chainable_ligature_substr   r   r  r  	ligaturesr   r  r   r"   )
r   r   r  rl  r  r  r  r  r   existingr3   r3   r4   r    s"    z#Builder.add_ligature_subst_chained_c                 C   s0   |st d|| |t}|j|||f d S )Nr  )r   r   r   r  r   )r   r   Z
old_prefix
old_suffixr   r   r3   r3   r4   add_reverse_chain_single_subst  s    
z&Builder.add_reverse_chain_single_substc                 C   s   |s|s|r|  |||| n| |t}|D ]z\}}|sDtd|| j||dd}	|D ]N}
z|||
|	 W qX ty } ztt||j|W Y d }~qXd }~0 0 qXq.d S )N%Empty glyph class in positioning ruleFpairPosContext)	add_single_pos_chained_r   r!   r   makeOpenTypeValueRecordadd_posr$   rp  r   )r   r   r  r  posr  r   rl  r  ZotValueRecordr   rs  r3   r3   r4   add_single_pos  s     zBuilder.add_single_posc                 C   st   |r|st d|| |t}| j||dd}| j||dd}ttt|}	ttt|}
|||	||
| d S Nr  Tr  )r   r   r    r  ry  r   rS   ZaddClassPair)r   r   Zglyphclass1value1Zglyphclass2value2r   v1v2Zcls1Zcls2r3   r3   r4   add_class_pair_pos  s    
zBuilder.add_class_pair_posc           	      C   sT   |r|st d|| |t}| j||dd}| j||dd}|||||| d S r  )r   r   r    r  ZaddGlyphPair)	r   r   Zglyph1r  Zglyph2r  r   r  r  r3   r3   r4   add_specific_pair_pos  s    
zBuilder.add_specific_pair_posc              	   C   s>   |st d|| |t}|||| ||| || d S Nr  )r   r   r   add_attachmentmakeOpenTypeAnchor)r   r   Z
glyphclassZentryAnchorZ
exitAnchorr   r3   r3   r4   add_cursive_pos  s    


zBuilder.add_cursive_posc           	      C   sd   |  |t}| ||| |s(td||D ]2\}}| ||}|D ]}||j|i |j< qDq,d S r  )r   r   
add_marks_r   r  rS  r   r6   )	r   r   rS  marksr   
baseAnchorrg  otBaseAnchorr   r3   r3   r4   add_mark_base_pos  s    
zBuilder.add_mark_base_posc                 C   s|   |  |t}g }|std||D ]@}i }| ||| |D ]\}}	| ||||	j< q<|| q"|D ]}
||j|
< qhd S r  )r   r   r   r  r  r6   r   r  )r   r   r  
componentsr   ZcomponentAnchorsr  ZanchorsZ	ligAnchorrg  r   r3   r3   r4   add_mark_lig_pos  s    
zBuilder.add_mark_lig_posc           	      C   sd   |  |t}| ||| |s(td||D ]2\}}| ||}|D ]}||j|i |j< qDq,d S r  )r   r   r  r   r  	baseMarksr   r6   )	r   r   r  r  r   r  rg  r  ZbaseMarkr3   r3   r4   add_mark_mark_pos  s    
zBuilder.add_mark_mark_posc              	   C   sN   t |rt |rt |s"td|| |t}|jt|||| | d S )N0Empty glyph class in contextual positioning rule)r  r   r   r   r  r   r"   r  r  r3   r3   r4   add_chain_context_pos  s    zBuilder.add_chain_context_posc                 C   s  |rt |rt |std|| |t}g }|jD ]\}}}}|| q4g }	|D ]z\}
}|d u rp|	d  qT| j||dd}|||
|}|d u r| 	|t
}|| |
D ]}|||| q|	| qTt|t|	ksJ ||	f|jt|dd |D ||	 d S )Nr  Fr  c                 S   s   g | ]\}}|qS r3   r3   )r<   r   r  r3   r3   r4   rK   A  rL   z3Builder.add_single_pos_chained_.<locals>.<listcomp>)r  r   r   r   r  r   r   r  Zfind_chainable_single_posr   r!   r  r   r"   )r   r   r  r  r  r  targetsrb  r   subsrl  r  ZotValuer  r   r3   r3   r4   r  &  s6    

zBuilder.add_single_pos_chained_c           
   	   C   s   |D ]\}}|j D ]r}|j D ]b}||jvrT| |t|j}|j|f|j|< q |j| d }	|j|	kr t	d||	|jf |q qqdS )z)Helper for add_mark_{base,liga,mark}_pos.r   z&Glyph %s cannot be in both @%s and @%sN)
rc  rl  rd  r  r  copydeepcopyanchorr6   r   )
r   r   ZlookupBuilderr  rb  rg  rh  markZotMarkAnchorZexistingMarkClassr3   r3   r4   r  D  s     



zBuilder.add_marks_c                 C   s   | j | d S r:   )r\   add_subtable_break)r   r   r3   r3   r4   r  W  s    zBuilder.add_subtable_breakc                 C   sB   | j |d\}}|r0||kr0td||f |||f| j |< d S )NNNz0Glyph %s was assigned to a different class at %s)rw   r   r   )r   r   r   Z
glyphClassZoldClassZoldLocationr3   r3   r4   setGlyphClass_Z  s    zBuilder.setGlyphClass_c                 C   sd   |D ]}|  ||d q|D ]}|  ||d q|D ]}|  ||d q4|D ]}|  ||d qLd S )Nr   r   r  r%  )r  )r   r   Z
baseGlyphsZligatureGlyphsZ
markGlyphsZcomponentGlyphsr   r3   r3   r4   add_glyphClassDefd  s    zBuilder.add_glyphClassDefc                 C   s"   |D ]}|| j vr|| j |< qd S r:   )rv   r   r   rl  Zcaretsr   r3   r3   r4   add_ligatureCaretByIndex_p  s    
z!Builder.add_ligatureCaretByIndex_c                 C   s2   t |ts|S | ||\}}|d ur.||fS |S r:   )rM   r   makeVariablePos)r   r   caretdefaultdevicer3   r3   r4   makeLigCaretu  s    
zBuilder.makeLigCaretc                    s6    fdd|D }|D ]}|j vr|j |< qd S )Nc                    s   g | ]}  |qS r3   )r   )r<   r  r   r   r3   r4   rK   ~  rL   z3Builder.add_ligatureCaretByPos_.<locals>.<listcomp>)ru   r  r3   r  r4   add_ligatureCaretByPos_}  s    
zBuilder.add_ligatureCaretByPos_c                 C   s   | j |||||g d S r:   )rq   r   )r   r   r   r   r   r   r   r3   r3   r4   add_name_record  s    zBuilder.add_name_recordc                 C   s   || j |< d S r:   )r{   r   r   r  r3   r3   r4   add_os2_field  s    zBuilder.add_os2_fieldc                 C   s   || j |< d S r:   )r|   r  r3   r3   r4   add_hhea_field  s    zBuilder.add_hhea_fieldc                 C   s   || j |< d S r:   )r}   r  r3   r3   r4   add_vhea_field  s    zBuilder.add_vhea_fieldc                    st   d| j vrtd|dd | jD   fdd| D }d| j v rf| j d jfdd| D }|| j|< d S )NrH   z?Cannot add feature variations to a font without an 'fvar' tablec                 S   s    i | ]}|j |j|j|jfqS r3   )rI   ZminValuedefaultValueZmaxValue)r<   rR  r3   r3   r4   r     s   z,Builder.add_conditionset.<locals>.<dictcomp>c                    s2   i | ]*\}\}}|t | | t | | fqS r3   )r(   )r<   r=   Zbottomtop)axisMapr3   r4   r     s
   
avarc                    s*   i | ]"\ } t  fd d|D qS )c                 3   s(   | ] } v rt |  n|V  qd S r:   )r)   )r<   r  )rR  r   r3   r4   r>     s   z6Builder.add_conditionset.<locals>.<dictcomp>.<genexpr>)ry  )r<   Zcondition_range)r   )rR  r4   r     s   )r1   r   rR   r   segmentsr   )r   r   r   r  r3   )r
  r   r4   add_conditionset  s"    



zBuilder.add_conditionsetc                 C   sj   | j std|| j|_|js(|jd fS || j | j| jd\}}d }|d urb|dkrbt	|}||fS )Nz5Can't define a variable scalar in a non-variable fontr  l    )
rQ   r   rR   Z	does_varyr  Zadd_to_variation_storer   r1   r   r&   )r   r   	varscalarr  rQ  r  r3   r3   r4   r    s    
zBuilder.makeVariablePosc                 C   s^   d }t |ts,|d ur$tt|}||fS | ||\}}|d urV|d urVtd|||fS )N4Can't define a device coordinate and variable scalar)rM   r   r$  buildDevicerz  r  r   )r   r  ZdeviceTabler   r  r  r3   r3   r4   makeAnchorPos  s    
zBuilder.makeAnchorPosc                 C   s   |du rdS d\}}|j dur.tt|j }|jdurHtt|j}| |j|j |\}}| |j|j|\}}t|||j	||}|S )zast.Anchor --> otTables.AnchorNr  )
ZxDeviceTabler$  r  rz  ZyDeviceTabler  r  yZbuildAnchorZcontourpoint)r   r   r  ZdeviceXZdeviceYr  r  Z	otlanchorr3   r3   r4   r    s    

zBuilder.makeOpenTypeAnchorc                 C   s<   i | ]4\}}}}| d s|d  |dd  ||fqS )ZReservedr   r   N)
startswithlower)r<   rb  r6   isDevicer3   r3   r4   r     s   

zBuilder.<dictcomp>c                 C   s   |sdS i }| j  D ]\}\}}t||d}|s4q|rLtt|||< qt|tr|dd d }	|	d  |	dd  }
t||
rt	d|| 
||\||< }|dur|||	< q|||< q|r|s|jrddinddi}t|}|S )	z&ast.ValueRecord --> otBase.ValueRecordNr   r%  ZDevicer   r  ZYAdvanceZXAdvance)_VALUEREC_ATTRSr   rx  r$  r  rz  rM   r   r  r   r  r  Z
buildValue)r   r   r  r  ZvrZastNameZotNamer  valZotDeviceNameZfeaDeviceNamer  ZvalRecr3   r3   r4   r    s0    




zBuilder.makeOpenTypeValueRecord)NF)F)F)F)`__name__
__module____qualname__r   r   r   r0   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r  r   rM  rI  r   rX  rZ  r\  r   rt  r   r   r|  ro  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r   ZvalueRecordFormatr  r  r3   r3   r3   r4   r/   ^   s   L
>3+TU-,$#d	
	
	-	 
	
	
$r/   )NF)NNF)JZfontTools.miscr   ZfontTools.misc.textToolsr   r   r   r   ZfontTools.feaLib.errorr   Z fontTools.feaLib.lookupDebugInfor   r	   r
   ZfontTools.feaLib.parserr   ZfontTools.feaLib.astr   ZfontTools.feaLib.variableScalarr   ZfontTools.otlLibr   r$  ZfontTools.otlLib.maxContextCalcr   ZfontTools.ttLibr   r   ZfontTools.ttLib.tablesr   r   ZfontTools.otlLib.builderr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   ZfontTools.otlLib.errorr$   ZfontTools.varLib.varStorer%   ZfontTools.varLib.builderr&   ZfontTools.varLib.featureVarsr'   ZfontTools.varLib.modelsr(   r)   collectionsr*   r  r  ior+   loggingr   r   	getLoggerr  r  r5   r9   objectr/   r3   r3   r3   r4   <module>   s8   H

 
