403Webshell
Server IP : 35.80.110.71  /  Your IP : 216.73.216.52
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64
User : ubuntu ( 1000)
PHP Version : 8.3.31
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /lib/python3/dist-packages/fontTools/feaLib/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /lib/python3/dist-packages/fontTools/feaLib/__pycache__/parser.cpython-312.pyc
�

jke������ddlmZddlmZmZmZddlmZddlm	Z	ddl
mZmZm
Z
ddlmcmZddlZddlZddlZej(e�ZGd�de�ZGd	�d
e�Zy)�)�FeatureLibError)�Lexer�IncludingLexer�NonIncludingLexer)�VariableScalar)�getEncoding)�bytechr�tobytes�tostrNc��eZdZdZiZeZedd�D��chc]}d|z��	c}}Zedd�D��chc]}d|z��	c}}Z	dgd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�Zd�Zd�Zd�Zd�Zdhd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d �Z!d!�Z"d"�Z#d#�Z$d$�Z%d%�Z&d&�Z'd'�Z(d(�Z)d)�Z*d*�Z+d+�Z,d,�Z-d-�Z.d.�Z/d/�Z0d0�Z1d1�Z2d2�Z3e4d3��Z5e4d4��Z6d5�Z7d6�Z8d7�Z9d8�Z:d9�Z;d:�Z<d;�Z=d<�Z>d=�Z?d>�Z@d?�ZAd@�ZBdA�ZCdB�ZDdC�ZEdhdD�ZFdE�ZGdF�ZHdG�ZIdH�ZJdI�ZKdJ�ZLdK�ZM	didL�ZNdM�ZOdN�ZPdO�ZQdP�ZRdQ�ZSdR�ZTdS�ZUdT�ZVdU�ZWdV�ZXdW�ZYdX�ZZdY�Z[dhdZ�Z\d[�Z]d\�Z^d]�Z_d^�Z`d_�Zad`�Zbda�Zcdb�Zddhdc�Zee4dd��Zfde�Zgdf�Zhycc}}wcc}}w)j�Parsera
Initializes a Parser object.

    Example:

        .. code:: python

            from fontTools.feaLib.parser import Parser
            parser = Parser(file, font.getReverseGlyphMap())
            parsetree = parser.parse()

    Note: the ``glyphNames`` iterable serves a double role to help distinguish
    glyph names from ranges in the presence of hyphens and to ensure that glyph
    names referenced in a feature file are actually part of a font's glyph set.
    If the iterable is left empty, no glyph name in glyph set checking takes
    place, and all glyph tokens containing hyphens are treated as literal glyph
    names, not as ranges. (Adding a space around the hyphen can, in any case,
    help to disambiguate ranges from glyph names containing hyphens.)

    By default, the parser will follow ``include()`` statements in the feature
    file. To turn this off, pass ``followIncludes=False``. Pass a directory string as
    ``includeDir`` to explicitly declare a directory to search included feature files
    in.
    ��zss%02d�dzcv%02dNc	��d|vr-ddlm}|dd�|rtd��|jd�}|r7tdt	|�dk(rdnd	�d
djd�|D������t
|�|_|jj�|_
t�|_t�|_
t�|_t�|_|j|jh|_d
\|_|_g|_d|_|rt*nt,}|||��|_i|_|j3d��y)N�glyphMapr)�deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentr��sz: z, c3�2K�|]}t|����y�w�N)�repr)�.0�ks  �9/usr/lib/python3/dist-packages/fontTools/feaLib/parser.py�	<genexpr>z"Parser.__init__.<locals>.<genexpr><s����=V�!�d�1�g�=V�s��NN)�
includeDirT��comments)�fontTools.misc.loggingToolsr�	TypeError�pop�len�join�set�glyphNames_�ast�FeatureFile�doc_�SymbolTable�anchors_�
glyphclasses_�lookups_�
valuerecords_�symbol_tables_�next_token_type_�next_token_�
cur_comments_�next_token_location_rr�lexer_�missing�advance_lexer_)�self�featurefile�
glyphNames�followIncludesr�kwargsr�
lexerClasss        r�__init__zParser.__init__-s&�����E��j�*O�P���X��� ���J�/�J����V���)�2�s�2�D�I�I�=V�v�=V�4V�X��
�
�z�?����H�H�(�(�*��	�#�
��
�(�]���#�
��
�(�]���#�}�}�d�.@�.@�A���2>�/���t�/����$(��!�'5�^�;L�
� ���D���������T��*�c	��|jj}|j�
|j�r�|j	d��|j
tjurB|j|jj|j|j����n1|jd�r!|j|j���n�|j
tjur!|j|j!���n�|jd�r!|j|j#���n�|jd�r!|j|j%���n^|jd�r!|j|j'���n,|jd	�r#|j|j)d
����n�|jd�r!|j|j+���n�|jd
�r!|j|j-���n�|jd�r!|j|j/���nb|jd�r#|j|j-d����n.|jd�r |j|j1��n�|jd�r"|j|j3d
���n�|j
tj4urG|j|j6vr/|j|j6|j|��ng|j
tj8ur|jdk(r���t;dj=|j
|j�|j��|j����|jr���|j>rQ|j>jA�D��cgc]\}}d|�d|�d���}}}t;ddjC|�zd��|jScc}}w)z�Parse the file, and return a :class:`fontTools.feaLib.ast.FeatureFile`
        object representing the root of the abstract syntax tree containing the
        parsed contents of the file.NTr��location�include��anon�	anonymous�	anchorDef�languagesystem�lookupF��vertical�	markClass�feature�conditionset�	variation)rO�table�valueRecordDef�;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}"� z (first found at �)zMThe following glyph names are referenced but are missing from the glyph set:
�
)"r*�
statementsr1r3r7�cur_token_type_r�COMMENT�appendr(�Comment�
cur_token_�cur_token_location_�is_cur_keyword_�parse_include_�
GLYPHCLASS�parse_glyphclass_definition_�parse_anonymous_�parse_anchordef_�parse_languagesystem_�
parse_lookup_�parse_markClass_�parse_feature_block_�parse_conditionset_�parse_table_�parse_valuerecord_definition_�NAME�
extensions�SYMBOLr�formatr6�itemsr%)r8rV�name�loc�errors     r�parsezParser.parseNs{���Y�Y�)�)�
��#�#�/�4�3E�3E������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%�i�0��!�!�$�"5�"5�"7�8��%�%��)9�)9�9��!�!�$�"C�"C�"E�F��%�%�&;�<��!�!�$�"7�"7�"9�:��%�%�k�2��!�!�$�"7�"7�"9�:��%�%�&6�7��!�!�$�"<�"<�">�?��%�%�h�/��!�!�$�"4�"4�e�"4�"D�E��%�%�k�2��!�!�$�"7�"7�"9�:��%�%�i�0��!�!�$�";�";�"=�>��%�%�n�5��!�!�$�":�":�"<�=��%�%�k�2��!�!�$�";�";�d�";�"K�L��%�%�g�.��!�!�$�"3�"3�"5�6��%�%�&6�7��!�!�$�"D�"D�e�"D�"T�U��$�$��
�
�2��O�O�t���6��!�!�"B�$�/�/�$�/�/�"B�4�"H�I��%�%����5�$�/�/�S�:P��%�D�DJ�F��,�,�d�o�o�E��,�,���M�#�#�/�4�3E�3E�\�<�<�"&���!3�!3�!5���D�#�.2�3�7��E��"��"&�)�)�E�"2�4���
�
�y�y���s�Qc	��|jd�|jd�|j}|jdk(r#|jd�|jd�y|jt
jk(r�|j�}|jj|�}|�td|z|j��|jd�|jj|j|j||jdd|��S|j!d��|j!d��}}d}|jd	k(r!|jd	�|j!�}|jdk(r!|j#�}|j#�}nd
\}}|jd�|jj||d||||��S)N�<�anchor�NULL�>zUnknown anchor "%s")ro�contourpoint�xDeviceTable�yDeviceTablerBT��variablerxr)�expect_symbol_�expect_keyword_r\r2r1rrj�expect_name_r,�resolverr(�Anchor�x�yrx�expect_number_�
parse_device_)	r8rBro�	anchordefr�r�rxryrzs	         r�
parse_anchor_zParser.parse_anchor_�s���	
���C� ����X�&��+�+�����v�%�� � ��(�����$��� � �E�J�J�.��$�$�&�D��
�
�-�-�d�3�I�� �%�)�D�0�$�2J�2J���
����$��8�8�?�?��������&�3�3�!�!�!�#��
��"�"�D�"�1�4�3F�3F�PT�3F�3U�1�������~�-�� � ��0��.�.�0�L����s�"��-�-�/�L��-�-�/�L�)3�&�L�,����C� ��x�x���
�
��%�%�%���
�	
r?c���g}|jdk(rf|j�}|�|jdk7r�1|jd�|j�}|j	||f�|jdk(r�f|S)Nrt�mark)r2r�r~�expect_markClass_reference_rY)r8�anchorMarksrurLs    r�parse_anchor_marks_zParser.parse_anchor_marks_�s�������#�%��'�'�)�F��~�$�"2�"2�f�"<��� � ��(��8�8�:�I�����	�2�3�
���#�%��r?c��|jd�sJ�|j}|j�|j�}}d}|jdk(r!|j	d�|j�}|j�}|j
d�|jj|||||��}|jj||�|S)NrGrxrR)rxrB)r]r\r�r2r~rr}r(�AnchorDefinitionr,�define)r8rBr�r�rxror�s       rrbzParser.parse_anchordef_�s����#�#�K�0�0�0��+�+���"�"�$�d�&9�&9�&;�1�������~�-�� � ��0��.�.�0�L�� � �"�����C� ��H�H�-�-��!�Q�\�H�.�
�	�	
�
�
���T�9�-��r?c�^�|jd�sJ�|j�}|jj|�\}}}|j	�|jd�|j�}||k(sJd��|jd�|jj|||��S)NrD�}z-bad splitting in Lexer.scan_anonymous_block()rRrA)r]�expect_tag_r5�scan_anonymous_blockr7r}r(�AnonymousBlock)r8�tag�_�contentrB�end_tags      rrazParser.parse_anonymous_�s����#�#�$9�:�:�:���� ��#�{�{�?�?��D���7�H��������C� ��"�"�$���g�~�N�N�N�~����C� ��x�x�&�&�s�G�h�&�G�Gr?c�`�|jd�sJ�|j}|jd��}|j�h}|jdk7r/|j|j��|jdk7r�/|j
d�|jj|||��S)N�AttachT��accept_glyphnamerRrA)	r]r\�parse_glyphclass_r�r2�addr}r(�AttachStatement)r8rB�glyphs�
contourPointss    r�
parse_attach_zParser.parse_attach_�s����#�#�H�-�-�-��+�+���'�'��'�>���,�,�.�/�
����#�%����d�1�1�3�4����#�%����C� ��x�x�'�'��
��'�Q�Qr?c�h�|jdvsJ�|j�|jd|��S)N>�enum�	enumerateT��
enumeratedrK)r[r7�parse_position_)r8rKs  r�parse_enumerate_zParser.parse_enumerate_�s7�����"7�7�7�7������#�#�t�h�#�G�Gr?c�(�|jd�sJ�|j}|jdk7r|jd��}nd}|j	d�|jdk7r|jd��}nd}|j	d�|jdk7r|jd��}nd}|j	d�|jdk7r|jd��}nd}|j	d�|j
j
|||||��S)N�
GlyphClassDef�,Fr�rRrA)r]r\r2r�r}r(�GlyphClassDefStatement)r8rB�
baseGlyphs�ligatureGlyphs�
markGlyphs�componentGlyphss      r�parse_GlyphClassDef_zParser.parse_GlyphClassDef_�s���#�#�O�4�4�4��+�+�����s�"��/�/��/�G�J��J����C� ����s�"�!�3�3�U�3�K�N�!�N����C� ����s�"��/�/��/�G�J��J����C� ����s�"�"�4�4�e�4�L�O�"�O����C� ��x�x�.�.��
�N�O�h�/�
�	
r?c��|j|j}}|jd�|jd��}|jd�|jj|||��}|jj||�|S)N�=Fr�rRrA)r\r[r}r�r(�GlyphClassDefinitionr-r�)r8rBror��
glyphclasss     rr`z#Parser.parse_glyphclass_definition_s{���1�1�4�?�?�$�����C� ��'�'��'�?�����C� ��X�X�2�2�4��(�2�S�
����!�!�$�
�3��r?c��|jd�}g}tt|��D][}dj|d|�dj||d�}}||jvs�:||jvs�I|j||f��]t|�dk(r|d\}}||fSt|�dk(rt
d|z|��dj|D��	cgc]\}}	d|�d|	�d���c}	}�}
t
d|�d	|
�d
�|��cc}	}w)N�-rrzU"%s" is not a glyph in the font, and it can not be split into a range of known glyphsz or �"z - zAmbiguous glyph range "z"; please use z to clarify what you mean)�split�ranger$r%r'rYr)r8rorB�parts�	solutions�i�start�limitr�l�rangess           r�split_glyph_range_zParser.split_glyph_range_#s��&�
�
�3����	��s�5�z�"�	1�A��8�8�E�!�A�J�/����%���)�1D�5�E���(�(�(�U�d�6F�6F�-F�� � �%���0�	1��y�>�Q��$�Q�<�L�E�5��%�<��
��^�q�
 �!�/�15�6���
��[�[�9�!M�4�1�a��A�"6�!M�N�F�!�<@�&�J���
��"Ns�
C;
c	�
�|r�|jtjtjfvr�|rE|jdk(r6|j�|jj|j��S|j�}|j|�|jj||j��S|jtjur�|j�|jj|j�}|�#t!d|jz|j��t#||jj$�r'|jj'||j��S|jj)||j��S|j+d�|j}|jj-|��}|jdk7�r�|jtju�rP|j�}|j}d|vrg|j.r[||j.vrM|j1||�\}}|j||�|j3|||j5|||���n�|jdk(r[|}|j+d�|j�}|j||�|j3|||j5|||���nad|vr7|j.s+t6j9t;t!d|��|���|j|�|j=|��n|jtjur�|j�}|jdk(ry|j}	|j}
|j+d�|j?�}|jd|
d	��d|d	���|jA|
||jC|	|
|���nNd|jd	��}|j|�|j=|��n|jtjur�|j�|jj|j�}|�#t!d|jz|j��t#||jj$�r(|jj'||j��}n'|jj)||j��}|jE|�n#t!d
|j��|jF��|jdk7r���|j+d�|S)NrvrAzUnknown glyph class @%s�[�]r�z.Ambiguous glyph name that looks like a range: �cid�05dzBExpected glyph name, glyph range, or glyph class reference, found )$r1rrj�CIDr2r7r(�	NullGlyphr\�
expect_glyph_�check_glyph_name_in_glyph_set�	GlyphNamer_r-r�r[r�
isinstance�	MarkClass�
MarkClassName�GlyphClassNamer}�
GlyphClassr'r��	add_range�make_glyph_range_�log�warning�strrY�expect_cid_�
add_cid_range�make_cid_range_�	add_classr4)
r8r��accept_null�glyph�gcrBr�r�r��range_location�range_start�	range_end�
glyph_names
             rr�zParser.parse_glyphclass_Ms����� 5� 5�%�*�*�e�i�i�9P� P��t�/�/�6�9��#�#�%��x�x�)�)�4�3K�3K�)�L�L��&�&�(�E��.�.�u�5��8�8�%�%�e�d�6N�6N�%�O�O�� � �E�$4�$4�4����!��#�#�+�+�D�O�O�<�B��z�%�-����?��,�,����"�d�h�h�0�0�1��x�x�-�-�b�4�;S�;S�-�T�T��x�x�.�.�r�D�<T�<T�.�U�U����C� ��+�+�����$�$�h�$�7�����#�%��$�$��
�
�2��*�*�,���3�3���%�<�D�$4�$4��d�FV�FV�9V�#'�#:�#:�5�(�#K�L�E�5��6�6�u�e�D��$�$��u�d�&<�&<�X�u�e�&T���%�%��,�!�E��'�'��,� �.�.�0�E��6�6�u�e�D��$�$��u�d�&<�&<�X�u�e�&T���e�|�D�,<�,<����� /�&T�UZ�T]�$^�$,�!"����6�6�u�=��M�M�%�(��&�&�%�)�)�3��*�*�,���#�#�s�*�%)�%=�%=�N�"&�/�/�K��'�'��,� $� 0� 0� 2�I��6�6��k�#�.�/��i��_�-���(�(�#�!��,�,�^�[�)�T��$'�t���s�&;�!<�J��6�6�z�B��M�M�*�-��&�&�%�*:�*:�:��#�#�%��'�'�/�/����@���:�)�1�D�O�O�C��0�0����b�$�(�(�"4�"4�5����/�/��T�=U�=U�/�V�B����0�0��d�>V�>V�0�W�B�� � ��$�%�7�7;�7G�7G�6J�L��-�-���A���#�%�J	
���C� ��
r?c��gggggf\}}}}}d}|jdv�r�|jd��}d}	|jdk(r|jd�dx}}	|	r*|rtd|j��|j|�n%|r|j|�n|j|�|j
�r!|j|j|��n|jd�d}
|jdk(r�|
�g}
|jd�|	std|j��|j�}|jj|�}|�td	|z|j��|
j|�|jdk(r��|	r|j|
�|jdvr���|s|s|gk(sJ�g|dgt|�z|g|fSt|dt|��rtd
|j��|t|�t|�t|�z}
t|
�r<t|t|�t|�zd�rtd|j��|
}n`|r=|dr8t|�d
kDst|dd�rtd|j��|dd}n!t|�rtd|j��||||||fS)NF>�by�fromr�rRTr��'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrIz%Lookups can only follow marked glyphs�Unknown lookup "%s"z_Positioning cannot be applied in the bactrack glyph sequence, before the marked glyph sequence.z�Positioning values are allowed only in the marked glyph sequence, or after the final glyph node when only one glyph node is marked.���r)r2r�r}rr\rY�is_next_value_�parse_valuerecord_r~rr.r�r$�any)r8rK�prefixr��lookups�values�suffix�hasMarksr��marked�
lookuplist�lookup_namerI�
marked_valuess              r�parse_glyph_pattern_zParser.parse_glyph_pattern_�s
��46�r�2�r�2�2F�/�����������&>�>��'�'��'�>�B��F����3�&��#�#�C�(�$(�(��6���*�J��0�0���
�
�
�b�!���
�
�b�!��
�
�b�!��"�"�$��
�
�d�5�5�h�?�@��
�
�d�#��J��"�"�h�.��%�!#�J��$�$�X�.��)�?��0�0���#�/�/�1�����.�.�{�;���>�)�-��;�T�=U�=U����!�!�&�)��"�"�h�.� ����z�*�[���&>�>�^�f��b�=� �=������V�� 4�f�b�(�K�K��6�-�C��K�(�)�%�8��,�,���
#�3�v�;��V��s�6�{�1J�K�M��=�!��v�c�&�k�C��K�7�9�:�;�)�*��0�0�	��'���F�2�J��v�;��?�c�&��"�+�&6�)�*��0�0�	�� ������V��%�&��,�,�	���F�G�V�V�X�F�Fr?c��|j}|jd��\}}}}}}t|�rtd|�d�|��|s8td|�d�|�}	tjt
|	��|dd|dd}}|||f}
|
S)	NFrJz(No lookups can be specified for "ignore r�zAmbiguous "ignore z)", there should be least one marked glyphrr)r\r�r�rr�r�r�)r8�subrBr�r�r�r�r�r�rq�chainContexts           r�parse_ignore_glyph_pattern_z"Parser.parse_ignore_glyph_pattern_s����+�+��<@�<U�<U��=V�=
�9��������w�<�!�:�3�%�q�A�8��
��#�$�S�E�)R�S���E�
�K�K��E�
�#�#�A�B�Z���!��F�F����/���r?c��|j}|j|�g}|jdk(rA|jd�|j	|j|��|jdk(r�A|jd�|S)Nr�rR)r\r�r2r}rY)r8r�rBr�s    r�parse_ignore_context_zParser.parse_ignore_context_!s{���+�+���8�8��=�>�����#�%�����$����� @� @�� E�F����#�%�	
���C� ��r?c�|�|jd�sJ�|j}|j�|jdvr.|j	d�}|j
j
||��S|jdvr.|j	d�}|j
j||��Std|j��)N�ignore)�
substituter�r�rA)�position�posrz#Expected "substitute" or "position")	r]r\r7r[r�r(�IgnoreSubstStatement�IgnorePosStatementr)r8rBr�s   r�
parse_ignore_zParser.parse_ignore_*s����#�#�H�-�-�-��+�+�������?�?�3�3��5�5�e�<�L��8�8�0�0���0�Q�Q��?�?�1�1��5�5�e�<�L��8�8�.�.�|�h�.�O�O��1�4�3K�3K�
�	
r?c��|jdk(sJ�|j}|j�}tj||��S)NrCrA)r[r\�expect_filename_r(�IncludeStatement)r8rB�filenames   rr^zParser.parse_include_9s@�����)�+�+�+��+�+���(�(�*���#�#�H�x�@�@r?c�P�|jd�sJ�|j}|j�}d\}}|jdvr|j	�dk(}|jdk(r|jd�d}|j
d�|jj||||��S)	N�language)TF>�exclude_dflt�include_dfltr�requiredTrRrA)	r]r\�expect_language_tag_r2rr~r}r(�LanguageStatement)r8rBr	�include_defaultrs     r�parse_language_zParser.parse_language_@s����#�#�J�/�/�/��+�+���,�,�.��$1�!������?�?�"�/�/�1�^�C�O����z�)�� � ��,��H����C� ��x�x�)�)��o�x�(�*�
�	
r?c�`�|jd�sJ�|j}|jd��}|j�g}|jdk7r/|j|j��|jdk7r�/|j
d�|jj|||��S)N�LigatureCaretByIndexTr�rRrA)	r]r\r�r�r2rYr}r(�LigatureCaretByIndexStatement�r8rBr��caretss    r�parse_ligatureCaretByIndex_z"Parser.parse_ligatureCaretByIndex_Os����#�#�$:�;�;�;��+�+���'�'��'�>���%�%�'�(�����#�%��M�M�$�-�-�/�0����#�%����C� ��x�x�5�5�f�f�x�5�X�Xr?c�h�|jd�sJ�|j}|jd��}|jd��g}|jdk7r1|j|jd���|jdk7r�1|j
d�|jj|||��S)N�LigatureCaretByPosTr�r{rRrA)	r]r\r�r�r2rYr}r(�LigatureCaretByPosStatementrs    r�parse_ligatureCaretByPos_z Parser.parse_ligatureCaretByPos_Ys����#�#�$8�9�9�9��+�+���'�'��'�>���%�%�t�%�4�5�����#�%��M�M�$�-�-�t�-�<�=����#�%����C� ��x�x�3�3�F�F�X�3�V�Vr?c�*�|jd�sJ�|j|j�}}|jdk(rd|jj|�}|�t
d|z|j��|jd�|jj||��Sd}|jdk(r|jd�d}|jj|||��}|j||�|jj||�|S)NrIrRr�rAF�useExtensionT)r]r\rr2r.r�rr}r(�LookupReferenceStatementr~�LookupBlock�parse_block_r�)r8rKrBrorI�
use_extension�blocks       rrdzParser.parse_lookup_cs���#�#�H�-�-�-��1�1�4�3D�3D�3F�$�����s�"��]�]�*�*�4�0�F��~�%�)�D�0�$�2J�2J���
����$��8�8�4�4�V�h�4�O�O��
����~�-�� � ��0� �M����$�$�T�=�8�$�L�����%��*��
�
���T�5�)��r?c�
�|jd�sJ�|j}|jtjk(r>|j�}|j
d�|jj||��Sd}d\}}}dddd	d
�}t�}|jdk7�r
|j|vr#td|jz|j��|j|j�|jdk(r$|jd�|jd�
�}n}|jdk(r$|jd�|jd�
�}nJ|j|vrd}|||j!�z}n#td|jz|j��|jdk7r��
|j
d�t#|||g�std|j��|jj||||��S)N�
lookupflagrRrAF)rNNr���)�RightToLeft�IgnoreBaseGlyphs�IgnoreLigatures�IgnoreMarksz%s can be specified only once�MarkAttachmentTyper��UseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)�markAttachment�markFilteringSetrB)r]r\r1r�NUMBERr�r}r(�LookupFlagStatementr&r2rr4r�r~r�rr�)r8rB�value�
value_seenr-r.�flags�seens        r�parse_lookupflag_zParser.parse_lookupflag_|s���#�#�L�1�1�1��+�+��� � �E�L�L�0��'�'�)�E�����$��8�8�/�/���/�I�I��
�2?�/��~�/�� !� ��	
���u�����#�%����4�'�%�3�d�6F�6F�F��-�-���
�H�H�T�%�%�&����#7�7��$�$�%9�:�!%�!7�!7��!7�!O���!�!�%:�:��$�$�%:�;�#'�#9�#9�5�#9�#Q� ��!�!�U�*�!�
���d�&7�&7�&9� :�:��%�9�D�<L�<L�L��-�-���#���#�%�*	
���C� ��J��0@�A�B�!�.��0I�0I��
��x�x�+�+��)�-��	,�
�	
r?c�P�|jd�sJ�|j}|jd��}|j�st	d|��|j�}|j
�}|jd�|jjj|�}|�P|jj|�}||jj|<|jj||�|jj||||��}|j!|�|S)NrLTr�z*Empty glyph class in mark class definitionrRrA)r]r\r��glyphSetrr��expect_class_name_r}r*�markClasses�getr(r�r-r��MarkClassDefinition�
addDefinition)r8rBr�rurorL�mcdefs       rrezParser.parse_markClass_�s���#�#�K�0�0�0��+�+���'�'��'�>����� �!�<�h��
��#�#�%���&�&�(�����C� ��I�I�)�)�-�-�d�3�	������*�*�4�0�I�*3�D�I�I�!�!�$�'����%�%�d�I�6����,�,��v�v��-�
��	����&��r?c�F�|jdvsJ�|jdk(r|j||�S|jdk(r|j||�S|jdk(r|j	||�S|jdk(r|j||�S|j}|j|�\}}}}}}	|jd�t|�r7t|�rtd|��|jj|||||��S|sT|sRt|�d	k(rD|	sB|d
�|j�|jj|d
|d
|d|d||��S|rtd
|��|jj!t#t%||��|||	|��S)N>rr��cursive�base�ligaturer�rRz3If "lookup" is present, no values must be specifiedrAr$rr)r�rBz2"enumerate" is only allowed with pair positionings��
forceChainrB)r[r2�parse_position_cursive_�parse_position_base_�parse_position_ligature_�parse_position_mark_r\r�r}r�rr(�ChainContextPosStatementr$�reverse�PairPosStatement�SinglePosStatement�list�zip)
r8r�rKrBr�r�r�r�r�r�s
          rr�zParser.parse_position_�s������"5�5�5�5����y�(��/�/�
�H�E�E�
�
�
��
'��,�,�Z��B�B�
�
�
��
+��0�0��X�F�F�
�
�
��
'��,�,�Z��B�B��+�+��<@�<U�<U��=
�9�������	
���C� ��w�<��6�{�%�I�8����8�8�4�4�����(�5��
��f��V���)9�(��a�y� ���� ��8�8�,�,��q�	��q�	��q�	��q�	�%�!�
-��
��!�D�h��
��x�x�*�*���V�V�$�%�����+�
�	
r?c��|j}|jd�|rtd|��|jd��}|j	�}|j	�}|jd�|jj||||��S)Nr?z>"enumerate" is not allowed with cursive attachment positioningTr�rRrA)r\r~rr�r�r}r(�CursivePosStatement)r8r�rKrBr��entryAnchor�
exitAnchors       rrDzParser.parse_position_cursive_s����+�+�����Y�'��!�S���
��+�+�T�+�B�
��(�(�*���'�'�)�
����C� ��x�x�+�+���Z�(�,�
�	
r?c��|j}|jd�|rtd|��|jd��}|j	�}|jd�|jj|||��S)Nr@zC"enumerate" is not allowed with mark-to-base attachment positioningTr�rRrA)r\r~rr�r�r}r(�MarkBasePosStatement)r8r�rKrBr@�markss      rrEzParser.parse_position_base_s����+�+�����V�$��!�6���
�
�%�%�t�%�<���(�(�*�����C� ��x�x�,�,�T�5�8�,�L�Lr?c��|j}|jd�|rtd|��|jd��}|j	�g}|j
dk(r@|jd�|j
|j	��|j
dk(r�@|jd�|jj|||��S)NrAzG"enumerate" is not allowed with mark-to-ligature attachment positioningTr��ligComponentrRrA)
r\r~rr�r�r2rYr}r(�MarkLigPosStatement)r8r�rKrB�	ligaturesrTs      rrFzParser.parse_position_ligature_s����+�+�����Z�(��!�:���
�
�*�*�D�*�A�	��)�)�+�,�����.�0�� � ��0��L�L��1�1�3�4����.�0�	
���C� ��x�x�+�+�I�u�x�+�P�Pr?c��|j}|jd�|rtd|��|jd��}|j	�}|jd�|jj|||��S)Nr�zC"enumerate" is not allowed with mark-to-mark attachment positioningTr�rRrA)r\r~rr�r�r}r(�MarkMarkPosStatement)r8r�rKrB�	baseMarksrTs      rrGzParser.parse_position_mark_/s����+�+�����V�$��!�6���
�
�*�*�D�*�A�	��(�(�*�����C� ��x�x�,�,�Y���,�Q�Qr?c��|jd�sJ�|j|j�}}|jd�|jj||��S)N�scriptrRrA)r]r\�expect_script_tag_r}r(�ScriptStatement)r8rBr]s   r�
parse_script_zParser.parse_script_=sV���#�#�H�-�-�-��3�3�T�5L�5L�5N�&�����C� ��x�x�'�'���'�B�Br?c
��|jdvsJ�|j}|jdv}|jd��\}}}}}}t|�rt	d|��g}	|j
dk(rU|j
d�}
|j
dk7rk|jdd�	�}|	j|�|j
dk7r�4n6|j
d
k(r%|j
d
�}
|jd��g}	nd}
|jd�t|	�dk(r!t|�st	d
|j��|
d
k(r�|rt	d|��t|�dk7st|dj��dk7rt	d|��t|	�dk7rt	d|��|jj||d||	d|��St|D�cgc]}|��|��	c}�}
d}t|	�dk(r!t|	dtj�rg}	d}|s�t|�dk(r�t|	�dk(r�|
dk(r�t!|dj��}t!|	dj��}t|�dk(r|t|�z}t|�t|�k7r#t	dt|�t|�fz|��|jj#||	||||��S|r7t|�dk(r)|
dk(r$|jj%||d|d||��S|s�t|�dk(r�t|	�dkDr�|
dk(r�t|dj��}|	D]�}t!|j��st	d|��t|j��dk7s�Et|j��|k7s�bt	d|�dt|j���d�|��|jj%||d||	||��S|s~t|�dkDrpt|	�dk(rbt|	dj��dk(rC|
dk(r>|jj'|||t!|	dj��d||��S|�rt|�dk7rt	d|��t|	�dk7rt	d|��|
dk7rt	d|��t)t!|dj���}t)t!|	dj���}t|�dk(r|t|�z}t|�t|�k7r#t	dt|�t|�fz|��|jj+||||	|��St|�dkDrt|	�dkDrt	d|��t|	�dk7s|rt	d|��|jj-|||||��}|Scc}w)N>r��rsub�
reversesubr�>rbrcFrJz-Substitution statements cannot contain valuesr�rRT)r�r�r�r�rz3Expected "by", "from" or explicit lookup referencesz4Reverse chaining substitutions do not support "from"rz%Expected a single glyph before "from"z)Expected a single glyphclass after "from"rAz\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsrB�zEmpty class in replacementz!Expected a glyph class with 1 or z3 elements after "by", but found a glyph class with z	 elementsz\In reverse chaining single substitutions, only a single glyph or glyph class can be replacedzlIn reverse chaining single substitutions, the replacement (after "by") must be a single glyph or glyph classz8Reverse chaining substitutions cannot call named lookupszJDirect substitution of multiple glyphs by multiple glyphs is not supportedzInvalid substitution statement)r[r\r�r�rr2r~r�rYr}r$r7r(�AlternateSubstStatementr�r�rL�SingleSubstStatement�MultipleSubstStatement�LigatureSubstStatement�sorted� ReverseChainSingleSubstStatement�ChainContextSubstStatement)r8rBrI�
old_prefix�oldr�r��
old_suffixr��new�keywordr�r��num_lookups�is_deletionr��replacements�count�n�rules                    r�parse_substitute_zParser.parse_substitute_CsM�����"M�M�M�M��+�+���/�/�%;�;��
�%�%�u�%�5�	
��������v�;�!�?���
������t�#��*�*�4�0�G��"�"�c�)��+�+�T�t�+�T���
�
�2���"�"�c�)��
�
��
'��*�*�6�2�G��)�)�5�)�A�B�C��G����C� ��s�8�q�=��W��!�E��(�(��
��f���%�J�H����3�x�1�}��C��F�O�O�$5� 6�!� ;�%�&M�x�X�X��3�x�1�}�%�?�����8�8�3�3��C��F�J��A���4��
��g�?����1�?�@�����s�8�q�=�Z��A���
�
�>��C��K��3�s�8�q�=�S��X��]�{�a�?O��#�a�&�/�/�+�,�F���A���� 1�2�L��<� �A�%�+�c�&�k�9���6�{�c�,�/�/�%�?��6�{�C��$5�6�7��	���8�8�0�0��S�*�j�X�PX�1��
��3�s�8�q�=�[�A�-=��8�8�2�2���A����#�!�
3��
� �3�s�8�q�=�S��X��\�k�Q�>N���A����)�*�E��
���A�J�J�L�)�)�*F��Q�Q��q�z�z�|�$��)�c�!�*�*�,�.?�5�.H�)�;�E�7�C8�8;�A�J�J�L�8I�7J�)�U� ���	
��8�8�2�2���A����#�!�
3��
���C��1���C��A�
��C��F�O�O�%�&�!�+��q� ��8�8�2�2�����S��V�_�_�&�'��*�#�!�
3��
���3�x�1�}�%�I����
�3�x�1�}�%�%��	���a��%�N�PX����D��Q����!2�3�4�F�!�$�s�1�v���'8�"9�:�L��<� �A�%�+�c�&�k�9���6�{�c�,�/�/�%�?��6�{�C��$5�6�7��	���8�8�<�<��J��S�8�=��
��s�8�a�<�C��H�q�L�!�#���
��s�8�q�=�K�!�"B�H�M�M��x�x�2�2���Z��8�3�
�����K@s�W;�W;c��|jd�sJ�|j}|jd�|jj	|��S)N�subtablerRrA)r]r\r}r(�SubtableStatement)r8rBs  r�parse_subtable_zParser.parse_subtable_�sG���#�#�J�/�/�/��+�+�����C� ��x�x�)�)�8�)�<�<r?c��|jd�sJ�|j}|j�}|j�}d}d}|jt
jt
jfvs|dk7r |j�}|j�}|jd�|jj|||||��S)N�
parametersgrrRrA)r]r\�expect_decipoint_r�r1rr/�FLOATr}r(�SizeParameters)r8rB�
DesignSize�SubfamilyID�
RangeStart�RangeEnds      r�parse_size_parameters_zParser.parse_size_parameters_s����#�#�L�1�1�1��+�+���+�+�-�
��)�)�+���
���� � �U�\�\�5�;�;�$?�?�;�RS�CS��/�/�1�J��-�-�/�H����C� ��x�x�&�&���Z��H�'�
�	
r?c��|jd�sJ�|j}|j�\}}}}|jj	d|||||��S)N�sizemenuname�sizerA)r]r\�parse_name_r(�FeatureNameStatement)r8rB�
platformID�	platEncID�langID�strings      r�parse_size_menuname_zParser.parse_size_menuname_sa���#�#�N�3�3�3��+�+��04�0@�0@�0B�-�
�I�v�v��x�x�,�,��J�	�6�6�H�-�
�	
r?c	��|jd�sJ�|j|j�}}|jj	||��}|jd�|j|j|j|j|j|j|j|jd�j|�}|r	||�ntd|j!�z|��|jd�|j�}||k7r'td|j!�z|j��|jd�|S)	NrPrA�{)�GDEF�head�hhea�vhearo�BASEzOS/2�STATz"table %s" is not supportedr��
Expected "%s"rR)r]r\r�r(�
TableBlockr}�parse_table_GDEF_�parse_table_head_�parse_table_hhea_�parse_table_vhea_�parse_table_name_�parse_table_BASE_�parse_table_OS_2_�parse_table_STAT_r:r�strip)r8rBrorP�handlerr�s      rrhzParser.parse_table_s8���#�#�G�,�,�,��1�1�4�3C�3C�3E�$�����#�#�D�8�#�<�����C� ��*�*��*�*��*�*��*�*��*�*��*�*��*�*��*�*�	
��#�d�)�	���E�N�!�-��
�
��<�h��
�	
���C� ��"�"�$���d�?�!��$�*�*�,�.��0H�0H��
�	
���C� ��r?c�H�|j}|jdk7s
|j�rz|jd��|jt
jurA|j|jj|j|j���n�|jd�r |j|j��n�|jd�r |j|j��n�|jd�r |j|j��nX|jd�r |j|j!��n'|jd	k(r��`t#d
|j��|jdk7r��k|jr��yyy)Nr�TrrAr�r�rrrRz<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPos)rVr2r3r7rWrrXrYr(rZr[r\r]r�r�rrr�r8rPrVs   rr�zParser.parse_table_GDEF_;sM���%�%�
����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%�h�/��!�!�$�"4�"4�"6�7��%�%�o�6��!�!�$�";�";�"=�>��%�%�&<�=��!�!�$�"B�"B�"D�E��%�%�&:�;��!�!�$�"@�"@�"B�C����C�'��%�U��,�,���#���#�%��);�);r?c��|j}|jdk7s|jr�|jd��|jt
jurA|j|jj|j|j���nW|jd�r |j|j��n&|jdk(r��td|j��|jdk7r��|jr��yy)Nr�TrrA�FontRevisionrRzExpected FontRevision)rVr2r3r7rWrrXrYr(rZr[r\r]�parse_FontRevision_rr�s   rr�zParser.parse_table_head_Ss����%�%�
����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%�n�5��!�!�$�":�":�"<�=����C�'��%�&=�t�?W�?W�X�X����#�%��);�);r?c�$�|j}d}|jdk7s
|j�rf|jd��|jt
jurA|j|jj|j|j���n�|jt
jur�|j|vr�|jj�}|j�}|j|jj|||j���|jdk7r=t!d|j"��|jdk(r��Lt!d|j��|jdk7r��W|jr��eyy)	N)�CaretOffset�Ascender�	Descender�LineGapr�TrrArR�Incomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rVr2r3r7rWrrXrYr(rZr[r\rj�lowerr��	HheaFieldrr4�r8rPrV�fields�keyr1s      rr�zParser.parse_table_hhea_bsP���%�%�
�D�����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%����3����6�8Q��o�o�+�+�-���+�+�-���!�!��H�H�&�&�s�E�D�<T�<T�&�U���#�#�s�*�)�.��0I�0I������C�'��%�M��,�,���'���#�%��);�);r?c�$�|j}d}|jdk7s
|j�rf|jd��|jt
jurA|j|jj|j|j���n�|jt
jur�|j|vr�|jj�}|j�}|j|jj|||j���|jdk7r=t!d|j"��|jdk(r��Lt!d|j��|jdk7r��W|jr��eyy)	N)�VertTypoAscender�VertTypoDescender�VertTypoLineGapr�TrrArRr�z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)rVr2r3r7rWrrXrYr(rZr[r\rjr�r��	VheaFieldrr4r�s      rr�zParser.parse_table_vhea_}sR���%�%�
�M�����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%����3����6�8Q��o�o�+�+�-���+�+�-���!�!��H�H�&�&�s�E�D�<T�<T�&�U���#�#�s�*�)�.��0I�0I������C�'��%�;��,�,���'���#�%��);�);r?c�"�|j}|jdk7s|jr�|jd��|jt
jurA|j|jj|j|j���n[|jd�r$|j�}|r8|j|�n&|jdk(r��td|j��|jdk7r��|jr��yy)Nr�TrrA�nameidrRzExpected nameid)rVr2r3r7rWrrXrYr(rZr[r\r]�
parse_nameid_r)r8rPrV�	statements    rr�zParser.parse_table_name_�s����%�%�
����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%�h�/� �.�.�0�	���%�%�i�0����C�'��%�&7��9Q�9Q�R�R����#�%��);�);r?c��d}d}|jtjvri|j�}|j}|dvrtd|��|jtjvr/|j�}|j�}nd}|j}|dk(r
|xsd}|xsd}n|xsd}|xsd}|j
�}|jd�t|||�}|�td	|��|j||�}||||fS)
z~Parses a name record. See `section 9.e <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_.N�r��Expected platform id 1 or 3r�rr�	rR�Unsupported encoding)
r1r�NUMBERS�expect_any_number_r\r�expect_string_r}r�unescape_string_�r8r�r�r�rBr��encoding�	unescapeds        rr�zParser.parse_name_�s���	���� � �E�M�M�1��0�0�2�J��/�/�H���'�%�&C�X�N�N��$�$��
�
�5� �3�3�5�	��0�0�2���J��/�/�H���?�!��Q�I��[�q�F�!��Q�I��%�v�F��$�$�&�����C� ��z�9�f�=����!�"8�(�C�C��)�)�&�(�;�	��9�f�i�7�7r?c���d}d}|jtjvri|j�}|j}|dvrtd|��|jtjvr/|j�}|j�}nd}|j}|dk(r
|xsd}|xsd}n|xsd}|xsd}|j
�}t|||�}|�td|��|j||�}||||fS)Nr�r�r�rrr�r�)	r1rr�r�r\rr�rr�r�s        r�parse_stat_name_zParser.parse_stat_name_�s���	���� � �E�M�M�1��0�0�2�J��/�/�H���'�%�&C�X�N�N��$�$��
�
�5� �3�3�5�	��0�0�2���J��/�/�H���?�!��Q�I��[�q�F�!��Q�I��%�v�F��$�$�&���z�9�f�=����!�"8�(�C�C��)�)�&�(�;�	��9�f�i�7�7r?c��|jdk(sJ|j��|j|j�}}|dkDrtd|j��|j	�\}}}}|j
j
||||||��S)Nr�i�z*Name id value cannot be greater than 32767rA)r[r\r�rr�r(�
NameRecord)r8rB�nameIDr�r�r�r�s       rr�zParser.parse_nameid_�s������(�*�;�D�O�O�;�*��3�3�T�5L�5L�5N�&���E�>�!�<�d�>V�>V��
�15�0@�0@�0B�-�
�I�v�v��x�x�"�"��J�	�6�6�H�#�
�	
r?c�����dk(r"tjd�j|�}n��fd�}tjd||�}t|dd�}t	|d�S)N�	utf_16_bez\\[0-9a-fA-F]{4}c�(���j|��Sr)�unescape_byte_)�mr�r8s ��r�<lambda>z)Parser.unescape_string_.<locals>.<lambda>�s����!4�!4�Q��!A�r?z\\[0-9a-fA-F]{2}�
surrogatepass)�rer��unescape_unichr_r
r)r8r�r�r�unescape�utf16s` `   rr�zParser.unescape_string_�sY����{�"����*�D�,A�,A�6�J�A�A�H����*�H�f�=�A���;��8���U�K�(�(r?c�T�|jd�dd}tt|d��S�Nrr�)�group�chr�int)�matchrus  rr�zParser.unescape_unichr_�s&���K�K��N�1�2����3�q�"�:��r?c�r�|jd�dd}tt|d��j|�Sr�)r�r	r��decode)r�r�rus   rr�zParser.unescape_byte_s2���K�K��N�1�2����s�1�b�z�"�)�)�(�3�3r?c��|j}|jdk7s
|j�r�|jd��|jt
jurB|j|jj|j|j����n|jd�r|j�}n�|jd�rS|jt��}|j|jj!||d|j���n�|jd�r|j�}nu|jd	�rS|jt��}|j|jj!||d|j���n|jd
k(r���|jdk7r���|jr���yy)Nr�TrrA�HorizAxis.BaseTagList�HorizAxis.BaseScriptListF�VertAxis.BaseTagList�VertAxis.BaseScriptListrR)rVr2r3r7rWrrXrYr(rZr[r\r]�parse_base_tag_list_�parse_base_script_list_r$�BaseAxis)r8rPrV�horiz_bases�
horiz_scripts�
vert_bases�vert_scriptss       rr�zParser.parse_table_BASE_	s����%�%�
����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%�&=�>�"�7�7�9���%�%�&@�A� $� <� <�S��=M� N�
��!�!��H�H�%�%�#�%��!%�!9�!9�	&����%�%�&<�=�!�6�6�8�
��%�%�&?�@�#�;�;�C�
�O�L���!�!��H�H�%�%�"�$��!%�!9�!9�	&������C�'��?���#�%��);�);r?c�$�|j}d}d}|jdk7s
|j�r�|jd��|jt
jurB|j|jj|j|j����nT|jt
ju�r&|jj�}d}|j|vr|j�}n�|jd�r2g}t!d�D]!}|j|j���#np|j|vrAg}|jd	k7rQ|j|j��|jd	k7r�/n!|jd
�r|j#�}|j|jj%|||j���n|jd	k(r���|jdk7r���|jr���yy)N)�FSType�TypoAscender�
TypoDescender�TypoLineGap�	winAscent�
winDescent�XHeight�	CapHeight�WeightClass�
WidthClass�LowerOpSize�UpperOpSize)�UnicodeRange�
CodePageRanger�TrrA�Panose�
rR�Vendor)rVr2r3r7rWrrXrYr(rZr[r\rjr�r�r]r�r��OS2Field)r8rPrV�numbersr�r�r1r�s        rr�zParser.parse_table_OS_2_,s����%�%�
�

��3�����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%����3��o�o�+�+�-�����?�?�g�-� �/�/�1�E��)�)�(�3��E�"�2�Y�<�����T�%8�%8�%:�;�<��_�_��.��E��*�*�c�1����T�%8�%8�%:�;��*�*�c�1��)�)�(�3� �/�/�1�E��!�!��H�H�%�%�c�5�4�;S�;S�%�T�����C�'��3���#�%��);�);r?c�`�|jd�sJ�|jd�g}|jdk7s|jr�|j	�|jd�rR|j�\}}}}|jjd|||||j��}|j|�n3|jdk7r$td|j�d	�|j��|jdk7r��|jr��|jd�|std
|j��|S)N�ElidedFallbackNamer�r�ro�statrArR�Unexpected token z in ElidedFallbackName�Expected "name")r]r}r2r3r7r�r(�STATNameStatementr\rYr[r)r8�namesr�r�r�r��
nameRecords       r�parse_STAT_ElidedFallbackNamez$Parser.parse_STAT_ElidedFallbackNameXs(���#�#�$8�9�9�9����C� ������#�%��);�);����!��#�#�F�+�8<�8M�8M�8O�5�
�I�v�v�!�X�X�7�7������!�5�5�
8��
����Z�(��?�?�c�)�)�+�D�O�O�+<�<V�W��0�0������#�%��);�);�&	
���C� ��!�"3�T�5M�5M�N�N��r?c�T�|jd�sJ�g}|j�}|dvr)|j�stj	d|�d��|j�}|j
d�|jdk7s|jr�|j�|jtjur�H|jd�rT|j}|j�\}}}}|jj!d|||||�	�}	|j#|	�n3|j$d
k(r��t'd|j$��|j��|jdk7r��|jr��|j
d�|jj)||||j�S)N�
DesignAxis)�ital�opsz�slnt�wdth�wghtzUnregistered axis tag z should be uppercase.r�r�rorrArRzExpected "name", got )r]r��isupperr�r�r�r}r2r3r7rWrrXr\r�r(rrYr[r�STATDesignAxisStatement)
r8r	�axisTag�	axisOrderrBr�r�r�r�ros
          r�parse_STAT_design_axiszParser.parse_STAT_design_axists����#�#�L�1�1�1����"�"�$���C�C��O�O�%��K�K�0��	�9N�O�P��'�'�)�	����C� ����#�%��);�);����!��#�#�u�}�}�4���%�%�f�-��3�3��8<�8M�8M�8O�5�
�I�v�v��x�x�1�1��J�	�6�6�H�2������T�"����C�'��%�+�D�O�O�+<�=�t�?W�?W������#�%��);�);�$	
���C� ��x�x�/�/��Y��t�'?�'?�
�	
r?c��|jd�sJ�|jd�g}g}d}|jdk7s
|j�r=|j	d��|j
tjur�K|jd�rT|j}|j�\}}}}|jjd|||||�	�}	|j|	�n�|jd
�r"|j�}|j|�nW|jd�r|j�}n5|jdk(r��t!d
|j�d�|j��|jdk7r��/|jr��=|jd�|st!d|j��|st!d|j��t#|�dkDr�|D]G}t#|j$�dkDs�t!dt#|j$��d�|j��g}
|D]=}|j&}||
vrt!d|�d�|j��|
j|��?|jj)||||j�S)N�	AxisValuer�rr�TrrorrArB�flagrRrz
 in AxisValuezExpected "Axis Name"zExpected "Axis location"rz?Only one value is allowed in a Format 4 Axis Value Record, but z were found.�	Axis tag z already defined.)r]r}r2r3r7rWrrXr\r�r(rrY�parse_STAT_location�expect_stat_flagsr[rr$r�r��STATAxisValueStatement)r8�	locationsr	r3rBr�r�r�r�ro�format4_tagsr�s            r�parse_STAT_axis_value_zParser.parse_STAT_axis_value_�s����#�#�K�0�0�0����C� ��	��������#�%��);�);������.��#�#�u�}�}�4���%�%�f�-��3�3��8<�8M�8M�8O�5�
�I�v�v��x�x�1�1��J�	�6�6�H�2������T�"��%�%�j�1��3�3�5��� � ��*��%�%�f�-��.�.�0�����C�'��%�'����'8�8I�J��,�,���'���#�%��);�);�.	
���C� ��!�"8�$�:R�:R�S�S��!�"<�d�>V�>V�W�W��y�>�A��%�
���x���'�!�+�)�;��x���/�0��>��0�0�	��
��L�%�
)���l�l���,�&�)�#�C�5�(=�=�t�?W�?W����#�#�C�(�

)��x�x�.�.��9�e�T�%=�%=�
�	
r?c	���g}|j�}t|j��dk7r$td|j�d�|j
��|jdk7r�|jtjur"|j�}|j|�nb|jtjur"|j�}|j|�n$td|j�d�|j��|jdk7r��t|�dk(r0|\}}}||ks||kDr td|�d	|�d
|�d�|j��|jj!||�S)Nr%rz must be 4 charactersrRzUnexpected value "z". Expected integer or float.r�zDefault value z is outside of specified range r��.)r�r$r�rr[r\r2r1rr�
expect_float_rYr/r�r4r(�AxisValueLocationStatement)r8r�r�r1�nominal�min_val�max_vals       rrzParser.parse_STAT_location�sn������� ���s�y�y�{��q� �!��D�O�O�,�,E�E��(�(��
�
���#�%��$�$����3��*�*�,���
�
�e�$��&�&�%�,�,�6��+�+�-���
�
�e�$�%�(��)9�)9�(:�;1�1��-�-������#�%��v�;�!��(.�%�G�W�g��� �G�g�$5�%�$�W�I�.*��i�q��	��,��-�-�	���x�x�2�2�3��?�?r?c�<�|j}g}|jdk7s
|j�rr|jd��|jt
jurB|j|jj|j|j����n�|jt
ju�r�|jd�r<|j�}|j|jj|���nx|jd�rM|j!�}|j|jj#|��|j%d��n|jd�rN|j'�}|j|j(�|j|�|j%d�n�|jd	�rv|j+�}|j,D]4}|j(|vs�t/d
|j(�d�|j��|j|�|j%d�n4t/d|j��|j��|jdk(r��n|jdk7r��c|jr��qyy)
Nr�TrrAr�ElidedFallbackNameIDrRr
rzDesignAxis not defined for r#r)rVr2r3r7rWrrXrYr(rZr[r\rjr]rrr�r*r}rr�r!rr)	r8rPrV�design_axesr	r1�
designAxis�axisValueRecordrBs	         rr�zParser.parse_table_STAT_�s+���%�%�
������#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%����3��'�'�(<�=� �>�>�@�E��%�%�d�h�h�&A�&A�%�&H�I��)�)�*@�A� �/�/�1�E��%�%�d�h�h�&C�&C�E�&J�K��'�'��,��)�)�,�7�!%�!<�!<�!>�J��&�&�z�~�~�6��%�%�j�1��'�'��,��)�)�+�6�&*�&A�&A�&C�O�$3�$=�$=���#�<�<�{�:�#2� =�����a� P� $� 8� 8�#��	��%�%�o�6��'�'��,�)�+�D�O�O�+<�=�t�?W�?W������C�'��I���#�%��);�);r?c���|jdvsJ|j��g}|jdk7r/|j|j��|jdk7r�/|j	d�|S)N)r�r�rR)r[r2rYr^r})r8�basess  rr�zParser.parse_base_tag_list_sx�����#
�
�	��?�?�	�
������#�%��L�L��0�0�2�3����#�%����C� ��r?c�*�|jdvsJ|j��|j|�g}|jdk(rA|jd�|j	|j|��|jdk(r�A|jd�|S)N)r�r�r�rR)r[�parse_base_script_record_r2r}rY)r8rt�scriptss   rr�zParser.parse_base_script_list_$s������#
�
�	��?�?�	�
��2�2�5�9�;�����#�%�����$��N�N�4�9�9�%�@�A����#�%�	
���C� ��r?c��|j�}|j�}t|�D�cgc]}|j���}}|||fScc}wr)r^r�r�)r8rt�
script_tag�base_tagr��coordss      rr1z Parser.parse_base_script_record_0sP���,�,�.�
��*�*�,��16�u��>�A�$�%�%�'�>��>��8�V�+�+��?s�Ac���d}|jd�|jd�|jdk(r|jd�n�|j�|j�fg}|jdk(rP|jd�|j	|j�|j�f�|jdk(r�Pt|�}|jd�|S)Nrt�devicervr�rw)r}r~r2r�rY�tuple)r8�results  rr�zParser.parse_device_6s��������C� ����X�&����v�%�� � ��(��*�*�,�d�.A�.A�.C�D�E�F��"�"�c�)��#�#�C�(��
�
�t�2�2�4�d�6I�6I�6K�L�M��"�"�c�)��6�]�F����C� ��
r?c�~�|jtjuxs |jdk(xs|jdk(S)Nrt�()r1rr/r2�r8s rr�zParser.is_next_value_Es?���!�!�U�\�\�1�
'����3�&�
'����3�&�	
r?c��|jtjur|jdk(s|jtjur`|jd��|j}}|r |jj|||��}|S|jj|||��}|S|jd�|j}|jtjur�|j�}|dk(r+|jd�|jj�S|jj|�}|�td	|z|j��|j}|j |j"}	}|j$|j&}}
nK|jd��|jd��|jd��|jd��f\}}	}
}|jdk(r�|j)�|j)�|j)�|j)�f\}}
}}t+|r|nd
|
r|
nd
z|r|nd
z|r|nd
zD��cgc]\}}|��	c}}�}|ddks|d
dkDrtd|j��d\}}
}}|jd�|jj||	|
|||
||||��
Scc}}w)Nr<Tr{)�yAdvancerKrB)�xAdvancerKrBrtrvrwzUnknown valueRecordDef "%s"rdri����r��z+Device value out of valid range (-128..127))NNNN)rKrB)r1rrlr2r/r�r\r(�ValueRecordr}rjrr/r�rr1�
xPlacement�
yPlacementr@r?r�ri)r8rK�numberrB�valro�vrdr1rCrDr@r?�
xPlaDevice�
yPlaDevice�
xAdvDevice�
yAdvDevicer��delta�	allDeltass                   rr�zParser.parse_valuerecord_Ls����!�!�U�\�\�1�d�6F�6F�#�6M�
�
"�
"�e�l�l�
2��#�#�T�#�2��(�(��F���h�h�*�*�#�h��+����J��h�h�*�*�#�h��+����J����C� ��+�+��� � �E�J�J�.��$�$�&�D��v�~��#�#�C�(��x�x�+�+�-�-��$�$�,�,�T�2�C��{�%�1�D�8�$�:R�:R����I�I�E�&+�&6�&6��8H�8H�
�J�"'�.�.�%�.�.�h�H��#�#�T�#�2��#�#�T�#�2��#�#�T�#�2��#�#�T�#�2�	:�6�J�
�H�h����s�"��"�"�$��"�"�$��"�"�$��"�"�$�	>�:�J�
�J�
��7A�
�b�%/�z�R�(9�%/�z�R�(9�&0�z�R�(9��#��e����I���|�d�"�i��m�c�&9�%�A��,�,���
>V�:�J�
�J�
����C� ��x�x�#�#�����������$�
�	
��#s�K
c��|jd�sJ�|j}|j|�}|j�}|j	d�|j
j
|||��}|jj||�|S)NrQrRrA)	r]r\r�rr}r(�ValueRecordDefinitionr/r�)r8rKrBr1rorGs      rriz$Parser.parse_valuerecord_definition_�s����#�#�$4�5�5�5��+�+���'�'��1��� � �"�����C� ��h�h�,�,�T�5�8�,�L�����!�!�$��,��
r?c���|jdk(sJ�|j}|j�}|j�}|j	d�|j
j
|||��S)NrHrRrA)r[r\r^r
r}r(�LanguageSystemStatement)r8rBr]r	s    rrczParser.parse_languagesystem_�sf�����"2�2�2�2��+�+���(�(�*���,�,�.�����C� ��x�x�/�/���8�/�T�Tr?c��|r|jdk(sJ�|jdk(sJ�|j}|j�}|dv}d}d}d}||jvr|}n||jvr|}n|dk(rd}|r|j�}d}	|jdk(r|jd�d}	|r |jj||	|��}
n|jj||	|��}
|j|
||||�|
S)	NrOrM>�valt�vhal�vkrn�vpalFr�Tr)r rB)r[r\r��SS_FEATURE_TAGS�CV_FEATURE_TAGSrr2r~r(�VariationBlock�FeatureBlockr)r8rOrBr�rK�stylisticset�
cv_feature�size_featurerNr r!s           rrfzParser.parse_feature_block_�s)����?�?�k�1�1�1��?�?�i�/�/�/��+�+����� ���:�:�����
����$�&�&�&��L�
�D�(�(�
(��J�
�F�]��L���,�,�.�L��
����~�-�� � ��0� �M���H�H�+�+��\���,��E��H�H�)�)��=�8�*��E�	
���%��<��z�R��r?c���|jdk(sJ|j��|j}|j�}|jd�|jj||��S)NrMrRrA)r[r\r�r}r(�FeatureReferenceStatement)r8rB�featureNames   r�parse_feature_reference_zParser.parse_feature_reference_�s^�����)�+�<�T�_�_�<�+��+�+���&�&�(�����C� ��x�x�1�1�+��1�Q�Qr?c
�$�|jdk(sJ|j��|jj||j|j��}|j	d�|j
D]}|j
��|jdk7s
|j�r,|jd��|jtjurK|jj|jj|j|j���n�|j!d�r\|j}|j#�\}}}}|jj|jj%||||||���n'|jdk(r��t'd	|j��|jdk7r��|jr��,|j	d�|j
D]}|j)��|j	d�|S)
z�Parses a ``featureNames`` statement found in stylistic set features.
        See section `8.c <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#8.c>`_.
        �featureNamesrAr�r�TrrorRr)r[r(�NestedBlockr\r}r0�enter_scoper2r3r7rWrrXrVrYrZr]r�r�r�
exit_scope)	r8r�r!�symtabrBr�r�r�r�s	         r�parse_featureNames_zParser.parse_featureNames_�s������.�0�A�$�/�/�A�0����$�$�����4�+C�+C�%�
��	
���C� ��)�)�	!�F���� �	!����#�%��);�);������.��#�#�u�}�}�4�� � �'�'��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%�f�-��3�3��8<�8H�8H�8J�5�
�I�v�v�� � �'�'��H�H�1�1��Z��F�F�X�2���
���C�'��%�&7��9Q�9Q�R�R�#���#�%��);�);�$	
���C� ��)�)�	 �F�����	 ����C� ��r?c�x�|jdk(sJ|j��|jj||j|j��}|j	d�|j
D]}|j
��|j}|jdk7s
|j�rJ|jd��|jtjurA|j|jj|j|j���n�|j!hd��r,|j|j#||j��n}|j!d�r!|j|j%|��nK|jd	k(r��
t'd
j)|j|j�|j��|jdk7r��<|jr��J|j	d�|j
D]}|j+��|j	d	�|S)N�cvParametersrAr�r�Tr>�SampleTextNameID�FeatUILabelNameID�ParamUILabelNameID�FeatUITooltipTextNameID�	CharacterrRzExpected statement: got {} {})r[r(rdr\r}r0rerVr2r3r7rWrrXrYrZr]�parse_cvNameIDs_�parse_cvCharacter_rrmrf)r8r�r!rgrVs     r�parse_cvParameters_zParser.parse_cvParameters_�s������.�0�A�$�/�/�A�0����$�$�����4�+C�+C�%�
��	
���C� ��)�)�	!�F���� �	!��%�%�
����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%����!�!�$�"7�"7��T�_�_�"M�N��%�%�k�2��!�!�$�"9�"9�#�">�?����C�'��%�3�:�:��,�,�d�o�o���,�,�	��)���#�%��);�);�6	
���C� ��)�)�	 �F�����	 ����C� ��r?c��|j|k(sJ|j��|jj|||j��}|j	d�|j
D]}|j
��|jdk7s
|j�r-|jd��|jtjurK|jj|jj|j|j���n�|j!d�r]|j}|j#�\}}}}	|jj|jj%|||||	||���n'|jdk(r��t'd|j��|jdk7r��|jr��-|j	d�|j
D]}|j)��|j	d�|S)	NrAr�r�TrrorRr)r[r(rdr\r}r0rer2r3r7rWrrXrVrYrZr]r��CVParametersNameStatementrrf)
r8r��
block_namer!rgrBr�r�r�r�s
          rrpzParser.parse_cvNameIDs_*s������*�,�=�d�o�o�=�,����$�$�S�*�t�?W�?W�$�X�����C� ��)�)�	!�F���� �	!����#�%��);�);������.��#�#�u�}�}�4�� � �'�'��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%�f�-��3�3��8<�8H�8H�8J�5�
�I�v�v�� � �'�'��H�H�6�6��"�!���"�!)�7��
����C�'��%�&7��9Q�9Q�R�R�/���#�%��);�);�0	
���C� ��)�)�	 �F�����	 ����C� ��r?c�*�|jdk(sJ|j��|j|j�}}|jd�d|cxk\rdk\snt	djdd�|��|jj|||��S)NrorRi���rz/Character value must be between {:#x} and {:#x}rA)r[r\r�r}rrmr(�CharacterStatement)r8r�rB�	characters    rrqzParser.parse_cvCharacter_Ns������+�-�>�t���>�-�"�6�6��8O�8O�8Q�)�����C� ��I�*��*�!�"�"(�&��H�"5���
�
�x�x�*�*�9�c�H�*�M�Mr?c��|jdk(sJ|j��|j|j�}}|jd�|dkrt	d|��|j
j
||��S)Nr�rRrz&Font revision numbers must be positiverA)r[r\r$r}rr(�FontRevisionStatement)r8rB�versions   rr�zParser.parse_FontRevision_Zst�����.�0�A�$�/�/�A�0� �4�4�d�6H�6H�6J�'�����C� ��a�<�!�"J�H�U�U��x�x�-�-�g��-�I�Ir?c��|j�}i}|jd�|jdk7�rJ|j�|jt
jurtd|j��|j}||vrtd|��|j��|jt
jur|j�}n.|jt
jur|jd��}|jt
jur|j�}n.|jt
jur|jd��}|jd�f||<|jdk7r��J|jd�|j�}||k7rtd|z|j��|jj!||�S)	Nr�r��Expected an axis namezRepeated condition for axis Fr{rRr�)rr}r2r7rWrrjrr\r[r1rr$r/r�r(�ConditionsetStatement)r8ro�
conditions�axis�	min_value�	max_value�	finalnames       rrgzParser.parse_conditionset_ds���� � �"���
����C� ����#�%����!��#�#�5�:�:�5�%�&=�t�?W�?W�X�X��?�?�D��z�!�%�2�4�&�9�4�;S�;S����$�$����3� �.�.�0�	��&�&�%�,�,�6� �/�/��/�?�	��$�$����3� �.�.�0�	��&�&�%�,�,�6� �/�/��/�?�	�����$� )�9�5�J�t��-���#�%�0	
���C� ��%�%�'�	����!�/�D�"8�$�:R�:R�S�S��x�x�-�-�d�J�?�?r?c�<�|jd�|jD]}|j��|j}|jdk7s
|j
�r�|j
d��|jtjurB|j|jj|j|j����nR|jtjur!|j|j!���n|j#d�r!|j|j%���n�|j#ddh�r#|j|j'|�	���n�|j#d
�r!|j|j)���n{|j#d�r!|j|j+���nI|j#d�r!|j|j-���n|j#d
�r"|j|j/|���n�|j#d�r!|j|j1���n�|j#d�r!|j|j3���n�|j#ddh�r$|j|j5d|����nI|j#d�r!|j|j7���n|j#hd��r!|j|j9���n�|j#d�r!|j|j;���n�|j#d�r"|j|j=|���n~|r3|j#d�r"|j|j?|���nI|r3|j#d�r"|j|jA|���n|r1|j#d�r |j|jC��n�|r1|j#d�r |j|jE��n�|jtjFurG|j|jHvr/|j|jH|j|��nK|jdk(r���tKdjM|j|j�|j��|jdk7r���|j
r���|jd�|jD]}|jO��|jQ�}||jRjU�k7r1tKd|jRjU�z|j��|jd�d}	d}
|D]�}tW||jjX�r.t[|j\|j^|j`g�}	�QtW||jjb�s�rt[|j\|j^|j`g�}
��|	�r|
�rg}|jD]�}tW||jjX�r�|jddjg�}|jhdjg�}
tk|
�d k(r|
tk|�z}
tm|�D]a\}}|j|jjc|j\||j^|
|g|j`|jn����c��|j|���||_yyy)!Nr�r�TrrArGr�r�rJrMr�r	rIr#rLrr�Fr�r]>r�rbrcr�ryrQrcrjr}r�rRz7Expected glyph class definition or statement: got {} {}r�rr)8r}r0rerVr2r3r7rWrrXrYr(rZr[r\r_r`r]rbr�rarrrdr5rer�r`rwr{rirhrrr�r�rjrkrrmrfrror�r�rfr�r�r�rCrgr�r7rsr$r�rB)r8r!rKr[r]r\rgrVro�
has_single�has_multiplerr�rsr�r�s                rrzParser.parse_block_�s3��	
���C� ��)�)�	!�F���� �	!��%�%�
����#�%��);�);������.��#�#�u�}�}�4��!�!��H�H�$�$�T�_�_�t�?W�?W�$�X���%�%��)9�)9�9��!�!�$�"C�"C�"E�F��%�%�k�2��!�!�$�"7�"7�"9�:��%�%�v�{�&;�<��!�!�$�"7�"7��"7�"J�K��%�%�i�0��!�!�$�"?�"?�"A�B��%�%�h�/��!�!�$�"4�"4�"6�7��%�%�j�1��!�!�$�"6�"6�"8�9��%�%�h�/��!�!�$�"4�"4�X�">�?��%�%�l�3��!�!�$�"8�"8�":�;��%�%�k�2��!�!�$�"7�"7�"9�:��%�%�u�j�&9�:��!�!��(�(�E�H�(�M���%�%�h�/��!�!�$�"4�"4�"6�7��%�%�&Q�R��!�!�$�"8�"8�":�;��%�%�j�1��!�!�$�"6�"6�"8�9��%�%�&6�7��!�!�$�"D�"D�X�"N�O��$�"6�"6�~�"F��!�!�$�":�":�<�"H�I��� 4� 4�^� D��!�!�$�":�":�:�"F�G��$�"6�"6�|�"D��!�!�$�"=�"=�"?�@��$�"6�"6�~�"F��!�!�$�";�";�"=�>��$�$��
�
�2��O�O�t���6��!�!�"B�$�/�/�$�/�/�"B�4�"H�I����C�'��%�M�T�T��,�,�d�o�o���,�,�	��i���#�%��);�);�v	
���C� ��)�)�	 �F�����	 �� � �"���5�:�:�#�#�%�%�!��%�*�*�"2�"2�"4�4�d�6N�6N��
�	
���C� ��
����	K�A��!�T�X�X�:�:�;�!$�a�h�h����!�,�,�%G�!H�H�
��A�t�x�x�>�>�?�#&����!�(�(�A�L�L�'I�#J�J��		K��,��J��%�%�
)���a����!>�!>�?��X�X�a�[�1�1�3�F�#$�>�>�!�#4�#=�#=�#?�L��<�(�A�-�$��F��3��$-�f�$5�
���5�"�)�)� �H�H�;�;� !��� %� !���!-�a�� 1� !���)*���
<��	�
��%�%�a�(�%
)�& *�E��+'�:r?c��|jtjur2t|t	d��r|j
|k(S|j
|vSy)NrF)rWrrjr��typer[)r8rs  rr]zParser.is_cur_keyword_�sC�����5�:�:�-��!�T�"�X�&����!�+�+����!�+�+�r?c��|j�|jtjurt	d|j
��|jS)NzExpected @NAME)r7rWrr_rr\r[r=s rr8zParser.expect_class_name_s@���������u�'7�'7�7�!�"2�D�4L�4L�M�M����r?c��|j�|jtjur|jStd|j��)NzExpected a CID)r7rWrr�r[rr\r=s rr�zParser.expect_cid_s>���������5�9�9�,��?�?�"��.��0H�0H�I�Ir?c��|j�|jtjurt	d|j
��|jS)NzExpected file name)r7rWr�FILENAMErr\r[r=s rrzParser.expect_filename_s>���������u�~�~�5�!�"6��8P�8P�Q�Q����r?c��|j�|jtjurZ|jjd�|_t
|j�dkDrtd|j��|jS|jtjurd|jzStd|j��)N�\�?z1Glyph names must not be longer than 63 characters�cid%05dzExpected a glyph name or CID)
r7rWrrjr[�lstripr$rr\r�r=s rr�zParser.expect_glyph_s����������5�:�:�-�"�o�o�4�4�T�:�D�O��4�?�?�#�b�(�%�G��,�,����?�?�"�
�
!�
!�U�Y�Y�
.��t���.�.��<�d�>V�>V�W�Wr?c��|jr?|D]9}||jvr�||jvs�!|j|j|<�;yy)z�Adds a glyph name (just `start`) or glyph names of a
        range (`start` and `end`) which are not in the glyph set
        to the "missing list" for future error reporting.

        If no glyph set is present, does nothing.
        N)r'r6r\)r8r	ros   rr�z$Parser.check_glyph_name_in_glyph_set%sT������
B���4�+�+�+���t�|�|�+�)-�)A�)A�D�L�L��&�	
B�r?c��|j�}|jj|�}|�td|z|j��t||jj�std|z|j��|S)NzUnknown markClass @%sz@%s is not a markClass)r8r-r�rr\r�r(r�)r8ro�mcs   rr�z"Parser.expect_markClass_reference_3s����&�&�(��
�
�
�
'�
'��
-��
�:�!�'�$�.��0H�0H��
��"�d�h�h�0�0�1�!�(�4�/��1I�1I��
��	r?c��|j�|jtjurt	d|j
��t
|j�dkDrt	d|j
��|jdzddS)NzExpected a tagr%z'Tags cannot be longer than 4 charactersz    )r7rWrrjrr\r$r[r=s rr�zParser.expect_tag_@su���������u�z�z�1�!�"2�D�4L�4L�M�M��t����!�#�!�9�4�;S�;S��
����&�(�"�1�-�-r?c�\�|j�}|dk(rtd|j��|S)N�dfltz4"dflt" is not a valid script tag; use "DFLT" instead�r�rr\�r8r�s  rr^zParser.expect_script_tag_Js7����� ���&�=�!�F��(�(��
��
r?c�\�|j�}|dk(rtd|j��|S)N�DFLTz6"DFLT" is not a valid language tag; use "dflt" insteadr�r�s  rr
zParser.expect_language_tag_Ss7����� ���&�=�!�H��(�(��
��
r?c��|j�|jtjur|j|k(r|Std|z|j��)Nz
Expected '%s')r7rWrrlr[rr\)r8�symbols  rr}zParser.expect_symbol_\sH���������5�<�<�/�D�O�O�v�4M��M��o��6��8P�8P�Q�Qr?c���|j�|jtjur|j|k(r|jStd|z|j��)Nr��r7rWrrjr[rr\)r8rps  rr~zParser.expect_keyword_bsM���������5�:�:�-�$�/�/�W�2L��?�?�"��o��7��9Q�9Q�R�Rr?c��|j�|jtjur|jStd|j��)NzExpected a namer�r=s rrzParser.expect_name_hs>���������5�:�:�-��?�?�"��/��1I�1I�J�Jr?c��|j�|jtjur|jS|r;|jtj
ur|jdk(r|j
�Std|j��)Nr<zExpected a number)	r7rWrr/r[rl�expect_variable_scalar_rr\)r8r|s  rr�zParser.expect_number_nsm���������5�<�<�/��?�?�"���,�,����<����TW�AW��/�/�1�1��1�4�3K�3K�L�Lr?c���|j�t�}	|jtjk(r|j
dk(r	|S|j
�\}}|j||��U)NrT)r7rrWrrlr[�expect_master_�	add_value)r8�scalarrBr1s    rr�zParser.expect_variable_scalar_vsi�������!����#�#�u�|�|�3����3�8N���
�#�1�1�3�O�H�e����X�u�-�	r?c���i}	|jtjurtd|j��|j
}|j
�|jtjur|j
dk(std|j��|j�}|||<|jtjur|jddk(rnc|j
�|jtjur|j
dk(std|j��|j
���6|j
�t|j
dd�}|j
�||fS)	Nr}r�zExpected an equals signr�:r�z#Expected an comma or an equals signr)rWrrjrr\r[r7rlr�r1r2r�)r8rBr�r1s    rr�zParser.expect_master_�sI������#�#�5�:�:�5�%�&=�t�?W�?W�X�X��?�?�D����!��(�(�E�L�L�8�T�_�_�PS�=S�%�-�t�/G�/G����'�'�)�E�"�H�T�N��$�$��
�
�2�t�7G�7G��7J�c�7Q�����!��(�(�E�L�L�8�T�_�_�PS�=S�%�9�4�;S�;S���
���!�'�(	
�����D�O�O�A�B�'�(���������r?c��|j�|jtjvr|jStd|j��)Nz/Expected a decimal, hexadecimal or octal number)r7rWrr�r[rr\r=s rr�zParser.expect_any_number_�sB���������5�=�=�0��?�?�"��=�t�?W�?W�
�	
r?c��|j�|jtjur|jStd|j��)Nz Expected a floating-point number)r7rWrrr[rr\r=s rr$zParser.expect_float_�sB���������5�;�;�.��?�?�"��.��0H�0H�
�	
r?c���|jtjk(r|j�S|jtjur|j�dzSt
d|j��)Nr��,Expected an integer or floating-point number�r1rrr$r/r�rr\r=s rr~zParser.expect_decipoint_�sa��� � �E�K�K�/��%�%�'�'�
�
"�
"�e�l�l�
2��&�&�(�2�-�-�!�>��@X�@X��
r?c���d}ddd�}|jdk7rZ|j|vr|j�}|||z}n#td|j��|j��|jdk7r�Z|S)Nrrr$)�OlderSiblingFontAttribute�ElidableAxisValueNamerRzUnexpected STAT flag )r2rrr[r\)r8r1r3ros    rrzParser.expect_stat_flags�s�����)*�%&�
�����#�%����5�(��(�(�*����d��+��%�+�D�O�O�+<�=�t�?W�?W������#�%��r?c���|jtjk(r|j�S|jtjur|j�St
d|j��)Nr�r�r=s r�expect_stat_values_zParser.expect_stat_values_�s\��� � �E�K�K�/��%�%�'�'�
�
"�
"�e�l�l�
2��&�&�(�(�!�>��@X�@X��
r?c��|j�|jtjur|jStd|j��)NzExpected a string)r7rWr�STRINGr[rr\r=s rr�zParser.expect_string_�s>���������5�<�<�/��?�?�"��1�4�3K�3K�L�Lr?c�2�|rJ|jr>tj|_|jj	d�\|_|_y|j|j|jc|_|_|_		t|j�\|_|_|_	|jtjk7ry|jj|j|jf��y#t$rd\|_|_Y�jwxYw)Nrr)r3rrXrWr#r[r\r1r2r4�nextr5�
StopIterationrY)r8r s  rr7zParser.advance_lexer_�s����*�*�#(�=�=�D� �8<�8J�8J�8N�8N�q�8Q�5�D�O�T�5���%�%�� � ��)�)�
L�D� �$�/�4�3K�
�
G�
����%�	��)��$��-��$�$��
�
�5�����%�%�t�'7�'7��9R�9R�&S�T���!�
G�:F�7��%�t�'7�
G�s�(C;�;D�Dc�H�djtt|���S)z'abc' --> 'cba'r)r%�reversedrL)rs r�reverse_string_zParser.reverse_string_�s���w�w�x��Q��(�)�)r?c��t�}||kDrtd|��t||dz�D]}|jd|z��|S)z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitrr�)rLrr�rY)r8rBr�r�r:r�s      rr�zParser.make_cid_range_�sS������5�=�!�<�h��
�����	�*�	+�C��M�M�)�c�/�*�	+��
r?c�&�t�}t|�t|�k7rtd|�d|�d�|��|j}tj
j
||g�}|tj
j
||�||�g��}t|�dkDr1|t|�t|�}|t|�t|�}	n|t|�d}|t|�d}	||	k\rtd|��tjd�}
|
j|�rP|
j|	�r?tt|�t|	�dz�D]}|jd	|||fz��|Stjd
�}|j|�rP|j|	�r?tt|�t|	�dz�D]}|jd	|||fz��|Stjd�}
|
j|�rm|
j|	�r\tt|d�t|	d�dz�D]4}d
t|�zt|�d}|j|�|�|����6|Std|�d|�d�|��)z?(location, "a.sc", "d.sc") --> ["a.sc", "b.sc", "c.sc", "d.sc"]zBad range: "z" and "z" should have the same lengthrNz+Start of range must be smaller than its endz^[A-Z]$rz%s%c%sz^[a-z]$z^[0-9]{1,3}$r��000r�r�)rLr$rr��os�path�commonprefixr��compiler�r��ordrYr�r�)r8rBr�r�r:�revr�r��start_range�limit_range�	uppercase�c�	lowercase�digitsr�rEs                rr�zParser.make_glyph_range_�sW������u�:��U��#�!�JO�QV�W���
�
�"�"�����%�%�u�e�n�5���R�W�W�)�)�3�u�:�s�5�z�*B�C�D���v�;��?���F��s�6�{�l�;�K���F��s�6�{�l�;�K���F��
�.�K���F��
�.�K��+�%�!�=�x��
��J�J�z�*�	��?�?�;�'�I�O�O�K�,H��3�{�+�S��-=��-A�B�
>���
�
�h�&�!�V�)<�<�=�
>��M��J�J�z�*�	��?�?�;�'�I�O�O�K�,H��3�{�+�S��-=��-A�B�
>���
�
�h�&�!�V�)<�<�=�
>��M����O�,���<�<��$����k�)B��3�{�B�/��[�"�1E��1I�J�
C���#�a�&�.�3�{�+;�*;�*=�>���
�
�&�&�&�A�B�
C��M��e�U�C�X�N�Nr?)rdTN)F)NFN)i�__name__�
__module__�__qualname__�__doc__rkr(r�rWrXr>rrr�r�rbrar�r�r�r`r�r�r�r�r�rr^rrrrdr5rer�rDrErFrGr`rwr{r�r�rhr�r�r�r�r�r�r�r�r��staticmethodr�r�r�r�rrr!rr�r�r�r1r�r�r�rircrfrarhrrrprqr�rgrr]r8r�rr�r�r�r�r^r
r}r~rr�r�r�r�r$r~rr�r�r7r�r�r�)rr�s00rr
r
s����0�J�

�C�-2�1�f�-=�>��x�!�|�>�O�-2�1�f�-=�>��x�!�|�>�O�KO�+�B=�~4
�l
��"
H�	R�H�
�8�(�Tb�H[G�z�&�

�A�

�Y�W��27
�r�,3
�j
� M�Q�"R�C�x�t=�
�$
��<�0
Y��6�8S�"8�@8�:

�
)������4��4�!�F*�X�8 
�D6
�p@�B'�R
�
�,�
�
�L
�\	�U�$�LR�!�F+�Z"�H
N�J�#@�LRV�r*�h��J��X�B��.���R�S�K�M���6
�
��� �M�U�0�*��*�	�+O��gF?��>s
�E8�E>r
c�*�eZdZd�Zd�Zd�Zd�Zd�Zy)r+c��ig|_yr��scopes_r=s rr>zSymbolTable.__init__,	s���t��r?c�:�|jji�yr)r�rYr=s rrezSymbolTable.enter_scope/	s�������B�r?c�8�|jj�yr)r�r#r=s rrfzSymbolTable.exit_scope2	s�������r?c�(�||jd|<y)Nr�r�)r8ro�items   rr�zSymbolTable.define5	s��!%����R���r?c�f�t|j�D]}|j|�}|s�|cSyr)r�r�r:)r8ro�scoper�s    rr�zSymbolTable.resolve8	s4���d�l�l�+�	�E��9�9�T�?�D����	�r?N)r�r�r�r>rerfr�r�rdr?rr+r++	s��� ��&�r?r+)�fontTools.feaLib.errorr�fontTools.feaLib.lexerrrr�fontTools.feaLib.variableScalarr�fontTools.misc.encodingToolsr�fontTools.misc.textToolsr	r
r�fontTools.feaLib.ast�feaLibr(�loggingr�r��	getLoggerr�r��objectr
r+rdr?r�<module>r�s[��2�K�K�:�4�<�<�"�"��	�	��g����!��Y$O�V�Y$O�xH�&�r?

Youez - 2016 - github.com/yon3zu
LinuXploit