U
    Q»{jN¢ ã                ‡  @   sà  d 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	m
Z
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ZddlZddlZejd Ze e¡ZdZdZ G dd„ de!ƒZ"G dd„ de!ƒZ#dd„ Z$G dd„ de!ƒZ%G dd„ de%ƒZ&G dd„ de%ƒZ'G dd„ de%ƒZ(G dd„ de%ƒZ)G dd „ d e)ƒZ*G d!d"„ d"e)ƒZ+G d#d$„ d$e!ƒZ,G d%d&„ d&e,ƒZ-G d'd(„ d(e-ƒZ.G d)d*„ d*e,ƒZ/G d+d,„ d,e,ƒZ0G d-d.„ d.e!ƒZ1G d/d0„ d0e!ƒZ2G d1d2„ d2e!ƒZ3d3d4„ Z4d5d6„ Z5d7d8„ Z6d9d:„ Z7d;d<„ Z8d=d>„ Z9d?d@„ Z:dAdB„ Z;dCdD„ Z<dEdF„ Z=dGdH„ Z>dIdJ„ Z?dKdL„ Z@dMdN„ ZAG dOdP„ dPe!ƒZBG dQdR„ dReBƒZCG dSdT„ dTeBƒZDdUdV„ ZEdWdX„ ZFG dYdZ„ dZeBƒZGG d[d\„ d\eBƒZHG d]d^„ d^eBƒZIG d_d`„ d`eIƒZJG dadb„ dbeIƒZKG dcdd„ ddeIƒZLG dedf„ dfeBƒZMG dgdh„ dhe!ƒZNdidj„ ZOdkdl„ ZPdmdn„ ZQdodp„ ZRdqdr„ ZSdsdt„ ZTdudv„ ZUG dwdx„ dxe!ƒZVG dydz„ dzeBƒZWd{d|„ ZXd}d~„ ZYdd€„ ZZd�d‚„ Z[G dƒd„„ d„eIƒZ\G d…d†„ d†eBƒZ]G d‡dˆ„ dˆeBƒZ^d‰dŠ„ Z_d‹dŒ„ Z`d�dŽ„ ZaG d�d�„ d�e!ƒZbG d‘d’„ d’e!ƒZcG d“d”„ d”eBƒZdd•d–d—d˜dedƒ fd™dšdd›dœdeDƒ fd�dždœdeDƒ fdŸd dœdeDƒ fd¡d¢dœdeDƒ fd£d¤dœdeDƒ fd¥d¦d§d¨d©dªd«d¬d­d®d¯ddd¯ddgdfd°d±d²d®ddddgdfd³d´dµd¶d·d¸d¹dºd»d¼d½d¾deMƒ fd¿dÀdÁd¾deWƒ fdÂdÃdÄdeJƒ fdÅd0d¾de]ƒ fdÆdÇd¾de\ƒ fdÈd2d¾deLƒ fdÉdÊd¾de^ƒ fg$Zed•d¬d­d®d¯ddd¯ddgdfdÅd0d¾de]ƒ fdÆdÇd¾de\ƒ fdÈd2d¾deLƒ fdÉdÊd¾de^ƒ fgZfdËZgdÌZhdÍehegdÎddfdÏdÐdÑdÒdÓdÔdÕdÖd×dØdÙdÚdÛdÜdÝdÞdßdàdádâdãd¾deKƒ fgZidÍehegdÎddfdÏdÐdÑdÒdÓdÔdÕdÖd×dØdÙdÝdÞdâdãd¾deKƒ fgZjdädå„ Zkekeiƒ ekeeƒ G dædç„ dçejlƒZmG dèdé„ déejlƒZnG dêdë„ dëe!ƒZodìdí„ ZpG dîdï„ dïeoƒZqG dðdñ„ dñeoƒZrG dòdó„ dóeoƒZsG dôdõ„ dõe!ƒZtG död÷„ d÷etƒZuG dødù„ dùetƒZvG dúdû„ dûetƒZwG düdý„ dýe!ƒZxdþ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�d�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�d=�d>�d?�d@�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dX�dY�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dx�dy�dz�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š�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º�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Ú�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ú�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�d�d�d�d�d�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�d=�d>�d?�d@�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dX�dY�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dx�dy�dz�d{�d|�d}�d~�d�d€�d��d‚�dƒ�d„�g‡Zy�d…Zze{eyƒezk�sìt|‚i Z}e~ezƒD ]Zee}eye < �qø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�d�d�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�d=�d>�d?�d@�dA�dB�dC�dD�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dX�dY�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dx�dy�dz�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š�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º�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Ú�dÛ�dÜ�dÝ�dÞ�dß�dà�dá�dâgåZ€�d†Z�e{e€ƒe�k�s¸t|‚dþdÿ�dã�dä�då�dæ�dç�dè�dé�dê�dë�dì�d�d�d�da�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�dk�dl�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(�d)�d*�d+�d,�d-�d.�d/�d0�d1�d2�d3�d4�d5�d6�d7�d8�d9�d:�d;�d<�dœ�d™�d¡�d=�d>�d?�d@�dA�dB�dC�dD�d”�d¢�d§�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dX�dY�dZ�d[�d\�d]�d^�d_�d`�da�db�dc�dd�de�df�dg�dh�di�dj�dk�dl�dm�dn�do�dp�dq�dr�ds�dt�du�dv�dw�dxg¦Z‚�d‡Zƒe{e‚ƒeƒk�sht|‚dþdÿ�då�dæ�dé�dê�dë�dì�d�d�d�da�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�dk�dl�d	�d
�d�d�d�d*�d+�d,�d/�d8�d9�dœ�d™�d¡�d>�d?�d@�dA�dB�dC�dD�d”�d¢�d§�dE�dF�dG�dH�dI�dJ�dK�dL�dM�dN�dO�dP�dQ�dR�dS�dT�dU�dV�dW�dXgWZ„�dˆZ…e{e„ƒe…k�sÜt|‚dS (‰  a+  cffLib: read/write Adobe CFF fonts

OpenType fonts with PostScript outlines embed a completely independent
font file in Adobe's *Compact Font Format*. So dealing with OpenType fonts
requires also dealing with CFF. This module allows you to read and write
fonts written in the CFF format.

In 2016, OpenType 1.8 introduced the `CFF2 <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2>`_
format which, along with other changes, extended the CFF format to deal with
the demands of variable fonts. This module parses both original CFF and CFF2.

é    )Ússtruct)ÚpsCharStrings)Ú	unionRectÚintRect)ÚbytechrÚbyteordÚ	bytesjoinÚtobytesÚtostrÚsafeEval)ÚTTFont)ÚOTTableWriter)ÚOTTableReader)ÚotTables)ÚBytesIONé   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                   @   s~   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zddd„Z	dd„ Z
ddd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) Ú
CFFFontSetan  A CFF font "file" can contain more than one font, although this is
    extremely rare (and not allowed within OpenType fonts).

    This class is the entry point for parsing a CFF table. To actually
    manipulate the data inside the CFF font, you will want to access the
    ``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet``
    object can either be treated as a dictionary (with appropriate
    ``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict`
    objects, or as a list.

    .. code:: python

            from fontTools import ttLib
            tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf")
            tt["CFF "].cff
            # <fontTools.cffLib.CFFFontSet object at 0x101e24c90>
            tt["CFF "].cff[0] # Here's your actual font data
            # <fontTools.cffLib.TopDict object at 0x1020f1fd0>

    Nc                 C   s8  || _ t t| d¡| ¡ |dk	rL|r*dnd}| j|krhtd|| jf ƒ‚n| jdks^tdƒ‚| jdk}|sÆt d| d¡¡d	 | _	| 
| j¡ td
d„ t||d�D ƒƒ| _t||d�| _t|ƒ| _nLt d| d¡¡d	 | _| 
| j¡ dg| _|j}t||| j|d�| _d| _t||d�| _| j| j_| j| j_dS )a‹  Parse a binary CFF file into an internal representation. ``file``
        should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
        é   Né   r   ú2Invalid CFF 'major' version: expected %d, found %d©r   r   úUnknown CFF formatÚBr   c                 s   s   | ]}t |ƒV  qd S ©N©r
   ©Ú.0Ús© r   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/cffLib/__init__.pyÚ	<genexpr>b   s     z'CFFFontSet.decompile.<locals>.<genexpr>©ÚisCFF2ú>HÚCFF2Font)ÚotFontr   ÚunpackÚcffHeaderFormatÚreadÚmajorÚ
ValueErrorÚAssertionErrorÚstructÚoffSizeÚseekÚhdrSizeÚlistÚIndexÚ	fontNamesÚTopDictIndexÚtopDictIndexÚIndexedStringsÚstringsÚtopDictSizeÚgetGlyphOrderÚGlobalSubrsIndexÚGlobalSubrs)ÚselfÚfiler%   r"   Úexpected_majorÚcff2GetGlyphOrderr   r   r   Ú	decompileF   s@    

ÿÿ
   ÿ
zCFFFontSet.decompilec                 C   s
   t | jƒS r   )Úlenr2   ©r;   r   r   r   Ú__len__s   s    zCFFFontSet.__len__c                 C   s
   t | jƒS r   )r0   r2   rA   r   r   r   Úkeysv   s    zCFFFontSet.keysc                 C   s   | j S r   )r4   rA   r   r   r   Úvaluesy   s    zCFFFontSet.valuesc                 C   sd   t |dƒr| ¡ }nFt|tƒrR|}z| j |¡}W qZ tk
rN   t|ƒ‚Y qZX nt|ƒ‚| j	| S )z{Return TopDict instance identified by name (str) or index (int
        or any object that implements `__index__`).
        Ú	__index__)
ÚhasattrrE   Ú
isinstanceÚstrr2   Úindexr*   ÚKeyErrorÚ	TypeErrorr4   )r;   ZnameOrIndexrI   Únamer   r   r   Ú__getitem__|   s    


zCFFFontSet.__getitem__c                 C   sÜ  || _ |dk	r8|rdnd}| j|krTtd|| jf ƒ‚n| jdksJtdƒ‚| jdk}|jrr|sr| jD ]}| ¡  qd|s~tƒ }nd}t|ƒ}| jj	|| |d�}|rØd| _
| t t| ¡¡ | ¡ | _| t d	| j¡¡ n2d
| _
d
| _| t t| ¡¡ | t d| j¡¡ |�sDtƒ }	| jD ]}
|	 |
¡ �q| |	j	|| |d�¡ | |¡ |�sb| | 	¡ ¡ | | jj	|| |d�¡ | jD ],}t|dƒ�rœ|jdk�r€| ¡ }||_�q€| |¡}|D ]}| |¡ �q¼| |¡ dS )a˜  Write the object back into binary representation onto the given file.
        ``file`` should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
        Nr   r   r   r   r   r!   é   r#   é   r   Úcharset)r%   r)   r*   r+   ZrecalcBBoxesr4   ÚrecalcFontBBoxr5   Ú	CFFWriterÚgetCompilerr/   Úaddr   Úpackr'   ÚgetDataLengthr7   r,   r-   r1   r2   Úappendr:   rF   rP   r8   ÚgetChildrenÚtoFile)r;   r<   r%   r"   r=   ÚtopDictr6   ÚwriterZtopCompilerr2   rL   rP   ÚchildrenÚchildr   r   r   ÚcompileŒ   sZ    	
ÿÿ









zCFFFontSet.compilec                 C   s¶   |j d| jd� | ¡  |j d| jd� | ¡  | jD ]B}|jdt|ƒd� | ¡  | | }| |¡ | d¡ | ¡  q6| ¡  | d¡ | ¡  | j	 |¡ | d¡ | ¡  dS )z÷Write the object into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff.toXML(writer)

        r)   ©ÚvalueÚminorÚCFFFont©rL   r:   N)
Ú	simpletagr)   Únewlinera   r2   Úbegintagr
   ÚtoXMLÚendtagr:   )r;   Ú	xmlWriterÚfontNameÚfontr   r   r   rg   Ì   s"    





zCFFFontSet.toXMLc                 C   s8  || _ t| dƒsd| _t| dƒs&d| _|dk�r–| jdkr¬t| dƒsJd| _t| dƒsZd| _t| d	ƒsltƒ | _t| d
ƒs„g | _t	ƒ | _
|d }| j |¡ t| jd�}d|_nb| jdk�rt| dƒsÈd| _t| d	ƒsÚtƒ | _t| d
ƒsìdg| _| j j}t| j|d�}t	d|ƒ| _
| j
 |¡ |D ].}t|tƒ�r2�q|\}}}| |||¡ �qt|dƒ�r4|jd jdk�r4|j}	|	D ]}
t|
dƒ�rv|j|
j_�qvnž|d	k�rtj}t| d	ƒ�sºtƒ | _|D ]@}t|tƒ�rÒ�q¾|\}}}|ƒ }| |||¡ | j |¡ �q¾n2|dk�rt|d ƒ| _n|dk�r4t|d ƒ| _dS )z?Reads data from the XML element into the ``CFFFontSet`` object.r)   r   ra   r   rb   r-   rO   r/   r:   r2   rL   )r:   Nr   rN   r$   )r:   r>   ÚVarStoreÚPrivater`   )r%   rF   r)   ra   r-   r/   r9   r:   r2   r3   r4   rW   ÚTopDictrP   r8   rG   rH   ÚfromXMLÚFDArrayÚvstorerl   rm   r   ÚT2CharStringÚint)r;   rL   ÚattrsÚcontentr%   rj   rZ   r>   ÚelementÚfdArrayÚfontDictZsubrCharStringClassÚsubrr   r   r   ro   é   sv    










 ÿ




zCFFFontSet.fromXMLc                 C   s   ddl m} || |ƒ d S )Nr   )Ú_convertCFFToCFF2)Z	CFFToCFF2rz   )r;   r%   rz   r   r   r   ÚconvertCFFToCFF2-  s    zCFFFontSet.convertCFFToCFF2c                 C   s   ddl m} || |ƒ d S )Nr   )Ú_convertCFF2ToCFF)Z	CFF2ToCFFr|   )r;   r%   r|   r   r   r   ÚconvertCFF2ToCFF2  s    zCFFFontSet.convertCFF2ToCFFc                 C   s   ddl m} || ƒ d S )Nr   )Údesubroutinize)Ú
transformsr~   )r;   r~   r   r   r   r~   7  s    zCFFFontSet.desubroutinizec                 C   s   ddl m} || ƒ d S )Nr   )Úremove_hints)r   r€   )r;   r€   r   r   r   r€   <  s    zCFFFontSet.remove_hintsc                 C   s   ddl m} || ƒ d S )Nr   )Úremove_unused_subroutines)r   r�   )r;   r�   r   r   r   r�   A  s    z$CFFFontSet.remove_unused_subroutines)N)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   rB   rC   rD   rM   r^   rg   ro   r{   r}   r~   r€   r�   r   r   r   r   r   0   s   
-
@
Dr   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	rR   zXHelper class for serializing CFF data to binary. Used by
    :meth:`CFFFontSet.compile`.c                 C   s   g | _ || _d S r   )Údatar"   ©r;   r"   r   r   r   Ú__init__K  s    zCFFWriter.__init__c                 C   s   | j  |¡ d S r   )r†   rW   )r;   Útabler   r   r   rT   O  s    zCFFWriter.addc           	      C   sR  d }d}t   td|¡ |d }d}|g}| jD ]f}t|dƒrd|| ¡  }t|tƒrp|jrp| ¡ | _n|t	|ƒ }t|dƒr†| 
||¡ |}| |¡ q.||kr q¦|}qt   td¡ | ¡ }| jrÖt d| j¡| jd< n"t|d ƒ| _t d	| j¡| jd< dg}| jD ]:}t|d
ƒ�r | |¡ n
| |¡ | | ¡ | ¡ �q||k�sNt‚d S )Nr   z CFFWriter.toFile() iteration: %dr   rV   ÚsetPosz#CFFWriter.toFile() writing to file.r#   éÿÿÿÿr   rY   )ÚlogÚDEBUGr†   rF   rV   rG   ÚTopDictIndexCompilerr"   r7   r@   rŠ   rW   Útellr,   rU   ÚcalcOffSizer-   rY   Úwriter+   )	r;   r<   ZlastPosListÚcountÚposZposListÚitemÚendPosÚbeginr   r   r   rY   R  s@    




zCFFWriter.toFileN)r‚   rƒ   r„   r…   rˆ   rT   rY   r   r   r   r   rR   G  s   rR   c                 C   s2   | dk rd}n | dk rd}n| dk r*d}nd}|S )Né   r   i   r   i   r   rO   r   )ZlargestOffsetr-   r   r   r   r�   y  s    r�   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚIndexCompilerz…Base class for writing CFF `INDEX data <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#5-index-data>`_
    to binary.Nc                 C   sB   |d kr$t |dƒr$|j}|d k	s$t‚|| _|  ||¡| _|| _d S ©Nr"   )rF   r"   r+   ÚgetItemsÚitemsÚparent)r;   r›   r6   rœ   r"   r   r   r   rˆ   ‰  s    zIndexCompiler.__init__c                 C   s   |S r   r   ©r;   r›   r6   r   r   r   rš   ‘  s    zIndexCompiler.getItemsc                 C   sT   | j rLd}|g}| j D ]2}t|dƒr2|| ¡  }n|t|ƒ }| |¡ qng }|S )Nr   rV   )r›   rF   rV   r@   rW   )r;   r“   Úoffsetsr”   r   r   r   Ú
getOffsets”  s    

zIndexCompiler.getOffsetsc                 C   sV   | j rd}nd}| jrN|  ¡ d }t|ƒ}|d t| jƒd |  | d }n|}|S )NrO   r   r‹   r   )r"   r›   rŸ   r�   r@   )r;   Z	countSizeZ
lastOffsetr-   Ú
dataLengthr   r   r   rV   £  s$    ÿþýüÿ	zIndexCompiler.getDataLengthc           	      C   sÌ   |   ¡ }| jr t|t| jƒƒ nt|t| jƒƒ | jrÈt|d ƒ}t||ƒ | }tj	}|D ]2}|d|ƒ|d … }t|ƒ| ks„t
‚| |¡ q\| jD ]0}t|dƒr°| |¡ q–t|dd�}| |¡ q–d S )Nr‹   ú>lrY   Úlatin1©Úencoding)rŸ   r"   ÚwriteCard32r@   r›   ÚwriteCard16r�   Ú
writeCard8r,   rU   r+   r‘   rF   rY   r	   )	r;   r<   rž   r-   rU   ÚoffsetÚ	binOffsetr”   r†   r   r   r   rY   ¹  s$    


zIndexCompiler.toFile)N)	r‚   rƒ   r„   r…   rˆ   rš   rŸ   rV   rY   r   r   r   r   r˜   …  s   
r˜   c                   @   s   e Zd Zdd„ ZdS )ÚIndexedStringsCompilerc                 C   s   |j S r   ©r6   r�   r   r   r   rš   Ò  s    zIndexedStringsCompiler.getItemsN)r‚   rƒ   r„   rš   r   r   r   r   rª   Ñ  s   rª   c                       sH   e Zd ZdZdd„ Zdd„ Z‡ fdd„Z‡ fdd	„Z‡ fd
d„Z‡  Z	S )rŽ   z/Helper class for writing the TopDict to binary.c                 C   s$   g }|D ]}|  | || ¡¡ q|S r   ©rW   rS   ©r;   r›   r6   Úoutr”   r   r   r   rš   Ù  s    zTopDictIndexCompiler.getItemsc                 C   s$   g }| j D ]}| | |¡¡ q
|S r   ©r›   ÚextendrX   )r;   r6   r\   rZ   r   r   r   rX   ß  s    
z TopDictIndexCompiler.getChildrenc                    s.   | j rd| jd  ¡ g}|S tt| ƒ ¡ S d S ©Nr   )r"   r›   rV   ÚsuperrŽ   rŸ   )r;   rž   ©Ú	__class__r   r   rŸ   å  s    zTopDictIndexCompiler.getOffsetsc                    s*   | j r| jd  ¡ }|S tt| ƒ ¡ S d S r±   )r"   r›   rV   r²   rŽ   )r;   r    r³   r   r   rV   ì  s    z"TopDictIndexCompiler.getDataLengthc                    s,   | j r| jd  |¡ ntt| ƒ |¡ d S r±   )r"   r›   rY   r²   rŽ   ©r;   r<   r³   r   r   rY   ó  s    zTopDictIndexCompiler.toFile)
r‚   rƒ   r„   r…   rš   rX   rŸ   rV   rY   Ú__classcell__r   r   r³   r   rŽ   Ö  s   rŽ   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚFDArrayIndexCompilerz®Helper class for writing the
    `Font DICT INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#10-font-dict-index-font-dicts-and-fdselect>`_
    to binary.c                 C   s$   g }|D ]}|  | || ¡¡ q|S r   r¬   r­   r   r   r   rš   ÿ  s    zFDArrayIndexCompiler.getItemsc                 C   s$   g }| j D ]}| | |¡¡ q
|S r   r¯   )r;   r6   r\   rx   r   r   r   rX     s    
z FDArrayIndexCompiler.getChildrenc                 C   sº   |   ¡ }| jr t|t| jƒƒ nt|t| jƒƒ t|d ƒ}t||ƒ | }tj	}|D ]2}|d|ƒ|d … }t|ƒ| ks~t
‚| |¡ qV| jD ]$}t|dƒrª| |¡ q�| |¡ q�d S )Nr‹   r¡   rY   )rŸ   r"   r¥   r@   r›   r¦   r�   r§   r,   rU   r+   r‘   rF   rY   )r;   r<   rž   r-   rU   r¨   r©   r”   r   r   r   rY     s     


zFDArrayIndexCompiler.toFilec                 C   s   || j jd< d S )Nrp   ©rœ   ÚrawDict©r;   r“   r•   r   r   r   rŠ     s    zFDArrayIndexCompiler.setPosN)r‚   rƒ   r„   r…   rš   rX   rY   rŠ   r   r   r   r   r·   ú  s
   r·   c                   @   s   e Zd ZdZdd„ ZdS )ÚGlobalSubrsCompilerz§Helper class for writing the `global subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 C   s*   g }|D ]}|  | j¡ | |j¡ q|S r   ©r^   r"   rW   Úbytecode©r;   r›   r6   r®   Úcsr   r   r   rš   '  s
    zGlobalSubrsCompiler.getItemsN)r‚   rƒ   r„   r…   rš   r   r   r   r   r»   #  s   r»   c                   @   s   e Zd ZdZdd„ ZdS )ÚSubrsCompilerz¦Helper class for writing the `local subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 C   s   || j j }|| j jd< d S ©NÚSubrs)rœ   r“   r¹   )r;   r“   r•   r¨   r   r   r   rŠ   3  s    zSubrsCompiler.setPosN)r‚   rƒ   r„   r…   rŠ   r   r   r   r   rÀ   /  s   rÀ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚCharStringsCompilerz¡Helper class for writing the `CharStrings INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 C   s*   g }|D ]}|  | j¡ | |j¡ q|S r   r¼   r¾   r   r   r   rš   <  s
    zCharStringsCompiler.getItemsc                 C   s   || j jd< d S ©NÚCharStringsr¸   rº   r   r   r   rŠ   C  s    zCharStringsCompiler.setPosN)r‚   rƒ   r„   r…   rš   rŠ   r   r   r   r   rÃ   8  s   rÃ   c                   @   sX   e Zd ZdZeZddd„Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zddd„Zdd„ ZdS )r1   z§This class represents what the CFF spec calls an INDEX (an array of
    variable-sized objects). `Index` items can be addressed and set using
    Python list indexing.Nc                 C   s$  g | _ g  | _}| jj}|d kr$d S || _t td|| ¡ ¡ || _|rRt	|ƒ}nt
|ƒ}|dkrfd S d g| | _ t|ƒ}t td||¡ |dksžtd| ƒ‚dd|  }t|d ƒD ]2}| |¡}	||	 }	t d|	¡\}
| t|
ƒ¡ q¶| ¡ d | _| | j|d	  ¡ t td
|| ¡ ¡ d S )Núloading %s at %sr   z    index count: %s offSize: %srO   zoffSize too large: %só    r   ú>Lr‹   ú    end of %s at %s)r›   rž   r´   r‚   Ú_isCFF2rŒ   r�   r�   r<   Ú
readCard32Ú
readCard16Ú	readCard8r+   Úranger(   r,   r&   rW   rs   Ú
offsetBaser.   )r;   r<   r"   rž   rL   r’   r-   ÚpadrI   Úchunkr¨   r   r   r   rˆ   N  s4    


zIndex.__init__c                 C   s
   t | jƒS r   )r@   r›   rA   r   r   r   rB   k  s    zIndex.__len__c                 C   s†   | j | }|d k	r|S | j| | j }| j|d  | j|  }| j}| |¡ | |¡}t|ƒ|ksht‚|  ||||¡}|| j |< |S ©Nr   )	r›   rž   rÏ   r<   r.   r(   r@   r+   ÚproduceItem)r;   rI   r”   r¨   Úsizer<   r†   r   r   r   rM   n  s    



zIndex.__getitem__c                 C   s   || j |< d S r   ©r›   )r;   rI   r”   r   r   r   Ú__setitem__|  s    zIndex.__setitem__c                 C   s   |S r   r   )r;   rI   r†   r<   r¨   r   r   r   rÓ     s    zIndex.produceItemc                 C   s   | j  |¡ dS )zAdd an item to an INDEX.N)r›   rW   )r;   r”   r   r   r   rW   ‚  s    zIndex.appendc                 C   s   | j | |||d�S ©Nr!   ©ÚcompilerClass©r;   r6   rœ   r"   r   r   r   rS   †  s    zIndex.getCompilerc                 C   s   | j dd…= dS )zEmpty the INDEX.NrÕ   rA   r   r   r   Úclear‰  s    zIndex.clear)NN)N)r‚   rƒ   r„   r…   r˜   rÙ   rˆ   rB   rM   rÖ   rÓ   rW   rS   rÛ   r   r   r   r   r1   G  s   

r1   c                       sR   e Zd ZdZeZejZejZ	d‡ fdd„	Z
dd„ Zdd„ Zd	d
„ Zdd„ Z‡  ZS )r9   ay  This index contains all the global subroutines in the font. A global
    subroutine is a set of ``CharString`` data which is accessible to any
    glyph in the font, and are used to store repeated instructions - for
    example, components may be encoded as global subroutines, but so could
    hinting instructions.

    Remember that when interpreting a ``callgsubr`` instruction (or indeed
    a ``callsubr`` instruction) that you will need to add the "subroutine
    number bias" to number given:

    .. code:: python

            tt = ttLib.TTFont("Almendra-Bold.otf")
            u = tt["CFF "].cff[0].CharStrings["udieresis"]
            u.decompile()

            u.toXML(XMLWriter(sys.stdout))
            # <some stuff>
            # -64 callgsubr <-- Subroutine which implements the dieresis mark
            # <other stuff>

            tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG
            # <T2CharString (bytecode) at 103451d10>

            tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT
            # <T2CharString (source) at 103451390>

    ("The bias applied depends on the number of subrs (gsubrs). If the number of
    subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less
    than 33900, it is 1131; otherwise it is 32768.",
    `Subroutine Operators <https://docs.microsoft.com/en-us/typography/opentype/otspec180/cff2charstr#section4.4>`)
    Nc                    s8   t t| ƒj||d� || _|| _|r*|| _|r4|| _d S r×   )r²   r9   rˆ   ÚglobalSubrsÚprivateÚfdSelectrw   )r;   r<   rÜ   rÝ   rÞ   rw   r"   r³   r   r   rˆ   ´  s    	zGlobalSubrsIndex.__init__c                 C   sn   | j d k	r| j }nJt| dƒrX| jd k	rXt| dƒrF| jd k	rF| j| }nd}| j| j}nd }| j||| jd�S )Nrw   rÞ   r   ©rÝ   rÜ   )rÝ   rF   rw   rÞ   rm   Ú	subrClassrÜ   )r;   rI   r†   r<   r¨   rÝ   ÚfdIndexr   r   r   rÓ   Å  s    
zGlobalSubrsIndex.produceItemc                 C   s|   |  d¡ | ¡  tt| ƒƒD ]X}| | }| ¡ rD|jd|dd� n|jd|d� | ¡  | |¡ | d¡ | ¡  qdS )a  Write the subroutines index into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff[0].GlobalSubrs.toXML(writer)

        zDThe 'index' attribute is only for humans; it is ignored when parsed.Ú
CharStringr   )rI   Úraw©rI   N)Úcommentre   rÎ   r@   ÚneedsDecompilationrf   rg   rh   )r;   ri   Úiry   r   r   r   rg   Ò  s    
ÿ

zGlobalSubrsIndex.toXMLc                 C   s0   |dkrd S |   ¡ }| |||¡ |  |¡ d S )Nrâ   )rà   ro   rW   )r;   rL   rt   ru   ry   r   r   r   ro   ë  s
    zGlobalSubrsIndex.fromXMLc                 C   s$   d }t | dƒr| j| }| | |fS )NrÞ   )rF   rÞ   )r;   rI   Úselr   r   r   ÚgetItemAndSelectorò  s    

z#GlobalSubrsIndex.getItemAndSelector)NNNNNN)r‚   rƒ   r„   r…   r»   rÙ   r   rr   rà   ÚcharStringClassrˆ   rÓ   rg   ro   ré   r¶   r   r   r³   r   r9   Ž  s   !      ùr9   c                   @   s   e Zd ZdZeZdS )Ú
SubrsIndexz¹This index contains a glyph's local subroutines. A local subroutine is a
    private set of ``CharString`` data which is accessible only to the glyph to
    which the index is attached.N)r‚   rƒ   r„   r…   rÀ   rÙ   r   r   r   r   rë   ù  s   rë   c                       s6   e Zd ZdZeZd
‡ fdd„	Zdd„ Zdd	„ Z‡  Z	S )r3   a‡  This index represents the array of ``TopDict`` structures in the font
    (again, usually only one entry is present). Hence the following calls are
    equivalent:

    .. code:: python

            tt["CFF "].cff[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>
            tt["CFF "].cff.topDictIndex[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>

    Nr   c                    s¢   || _ |d k	rŠ|rŠ|| _g | _| jj}t td|| ¡ ¡ || _d}d g| | _d|g| _	| ¡ | _
| | j
| ¡ t td|| ¡ ¡ ntt| ƒj||d� d S )NrÆ   r   r   rÉ   r!   )r>   rÊ   r›   r´   r‚   rŒ   r�   r�   r<   rž   rÏ   r.   r²   r3   rˆ   )r;   r<   r>   ZtopSizer"   rL   r’   r³   r   r   rˆ     s    

zTopDictIndex.__init__c                 C   s*   t | j||| j| j| jd�}| |¡ |S r×   )rn   r6   r:   r>   rÊ   r?   )r;   rI   r†   r<   r¨   Útopr   r   r   rÓ   #  s    ú
zTopDictIndex.produceItemc                 C   sL   t t| ƒƒD ]:}|jd|d� | ¡  | |  |¡ | d¡ | ¡  qd S ©NÚFontDicträ   ©rÎ   r@   rf   re   rg   rh   ©r;   ri   rç   r   r   r   rg   /  s    
zTopDictIndex.toXML)NNr   N)
r‚   rƒ   r„   r…   rŽ   rÙ   rˆ   rÓ   rg   r¶   r   r   r³   r   r3     s
   r3   c                   @   s(   e Zd ZeZdd„ Zdd„ Zdd„ ZdS )ÚFDArrayIndexc                 C   sL   t t| ƒƒD ]:}|jd|d� | ¡  | |  |¡ | d¡ | ¡  qd S rí   rï   rð   r   r   r   rg   ;  s    
zFDArrayIndex.toXMLc                 C   s*   t | j||| j| j| jd�}| |¡ |S ©N)r"   rq   )rî   r6   r:   rÊ   rq   r?   )r;   rI   r†   r<   r¨   rx   r   r   r   rÓ   C  s    ú
zFDArrayIndex.produceItemc                 C   sN   |dkrd S t ƒ }|D ](}t|tƒr&q|\}}}| |||¡ q|  |¡ d S )Nrî   )rî   rG   rH   ro   rW   )r;   rL   rt   ru   rx   rv   r   r   r   ro   O  s    

zFDArrayIndex.fromXMLN)r‚   rƒ   r„   r·   rÙ   rg   rÓ   ro   r   r   r   r   rñ   8  s   rñ   c                   @   sF   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )ÚVarStoreDataNc                 C   s   || _ d | _|| _tƒ | _d S r   )r<   r†   Ú
otVarStorer   rk   )r;   r<   rô   r   r   r   rˆ   \  s    zVarStoreData.__init__c                 C   sh   | j rdt| j ƒ}|dkr&| j  ¡ | _n| j  |¡| _i }t| j|ƒ}t ¡ | _| j || j	¡ d | _| S ©Niÿÿ  )
r<   rÌ   r(   r†   r   Úotrl   rô   r?   rk   )r;   ÚlengthZglobalStateÚreaderr   r   r   r?   b  s    

zVarStoreData.decompilec                 C   s$   t ƒ }| j || j¡ | ¡ | _d S r   )r   rô   r^   rk   Z
getAllDatar†   )r;   r[   r   r   r   r^   r  s    zVarStoreData.compilec                 C   s   | j  || j¡ d S r   )rô   rg   rk   )r;   ri   rL   r   r   r   ÚwriteXMLy  s    zVarStoreData.writeXMLc                 C   sB   t  ¡ | _|D ].}t|tƒr|\}}}| j |||| j¡ qqd S r   )rö   rl   rô   rG   Útuplero   rk   )r;   rL   rt   ru   rœ   rv   r   r   r   ÚxmlRead|  s    


zVarStoreData.xmlReadc                 C   s
   t | jƒS r   ©r@   r†   rA   r   r   r   rB   †  s    zVarStoreData.__len__c                 C   s"   |d krd}| j j| }|j}|S r±   )rô   ZVarDataZVarRegionCount)r;   ZvsIndexZvarDataÚ
numRegionsr   r   r   ÚgetNumRegions‰  s
    zVarStoreData.getNumRegions)NN)
r‚   rƒ   r„   rˆ   r?   r^   rù   rû   rB   rþ   r   r   r   r   ró   [  s   

ró   c                   @   s6   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚFDSelectNc                 C   sœ  |�rŒt |ƒ| _| jdkr@ddlm} |d| |¡ƒ ¡ | _�q˜| jdkrÖd g| }t|ƒ}d }d }t|ƒD ]8}	t|ƒ}
|d k	r˜t||
ƒD ]}|||< qŠ|
}t |ƒ}ql|d k	rÎt|ƒ}
t||
ƒD ]}|||< qÀ|| _n´| jdk�rxd g| }t|ƒ}d }d }t|ƒD ]>}	t|ƒ}
|d k	�r4t||
ƒD ]}|||< �q$|
}t|ƒ}�q|d k	�rpt|ƒ}
t||
ƒD ]}|||< �q`|| _nd�s˜t	d| ƒ‚n|| _g | _d S )Nr   )Úarrayr   r   rO   Fzunsupported FDSelect format: %s)
rÍ   Úformatr   r(   ÚtolistÚgidArrayrÌ   rÎ   rË   r+   )r;   r<   Ú	numGlyphsr  r   r  ÚnRangesÚfdÚprevrç   ÚfirstÚglyphIDr   r   r   rˆ   ’  sT    









zFDSelect.__init__c                 C   s
   t | jƒS r   )r@   r  rA   r   r   r   rB   Ä  s    zFDSelect.__len__c                 C   s
   | j | S r   ©r  ©r;   rI   r   r   r   rM   Ç  s    zFDSelect.__getitem__c                 C   s   || j |< d S r   r
  )r;   rI   ÚfdSelectValuer   r   r   rÖ   Ê  s    zFDSelect.__setitem__c                 C   s   | j  |¡ d S r   )r  rW   )r;   r  r   r   r   rW   Í  s    zFDSelect.append)NNN)r‚   rƒ   r„   rˆ   rB   rM   rÖ   rW   r   r   r   r   rÿ   ‘  s
   
2rÿ   c                   @   sf   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZeZdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )rÅ   a  The ``CharStrings`` in the font represent the instructions for drawing
    each glyph. This object presents a dictionary interface to the font's
    CharStrings, indexed by glyph name:

    .. code:: python

            tt["CFF "].cff[0].CharStrings["a"]
            # <T2CharString (bytecode) at 103451e90>

    See :class:`fontTools.misc.psCharStrings.T1CharString` and
    :class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile,
    compile and interpret the glyph drawing instructions in the returned objects.

    Nc	                 C   sŒ   || _ || _|d k	rZt||||||d�| _i  | _}	tt|ƒƒD ]}
|
|	||
 < q@d| _n.i | _d| _|| _|d k	rz|| _	|d k	rˆ|| _
d S )Nr!   r   r   )rÜ   ÚvarStorerë   ÚcharStringsIndexÚcharStringsrÎ   r@   ÚcharStringsAreIndexedrÝ   rÞ   rw   )r;   r<   rP   rÜ   rÝ   rÞ   rw   r"   r  r  rç   r   r   r   rˆ   á  s,         ÿ
zCharStrings.__init__c                 C   s   t | j ¡ ƒS r   )r0   r  rC   rA   r   r   r   rC     s    zCharStrings.keysc                 C   s   | j r| jS t| j ¡ ƒS d S r   )r  r  r0   r  rD   rA   r   r   r   rD     s    zCharStrings.valuesc                 C   s
   || j kS r   )r  )r;   rL   r   r   r   Úhas_key  s    zCharStrings.has_keyc                 C   s
   t | jƒS r   )r@   r  rA   r   r   r   rB     s    zCharStrings.__len__c                 C   s   | j | }| jr| j| }|S r   )r  r  r  )r;   rL   Ú
charStringr   r   r   rM     s    

zCharStrings.__getitem__c                 C   s*   | j r| j| }|| j|< n
|| j|< d S r   )r  r  r  )r;   rL   r  rI   r   r   r   rÖ     s    
zCharStrings.__setitem__c                 C   sZ   | j r| j| }| j |¡S t| dƒrDt| dƒr>| j| j}qHd}nd }| j| |fS d S )Nrw   rÞ   r   )r  r  r  ré   rF   ÚfdSelectIndex)r;   rL   rI   rè   r   r   r   ré      s    


zCharStrings.getItemAndSelectorc                 C   sœ   t |  ¡ ƒ}|D ]†}|  |¡\}}| ¡ r2dg}ng }|d krV| dd|fg| ¡ n| dd|fd|fg| ¡ | ¡  | |¡ | d¡ | ¡  qd S )N)rã   r   râ   rL   r  )ÚsortedrC   ré   ræ   rf   re   rg   rh   )r;   ri   ÚnamesrL   ZcharStrr  rã   r   r   r   rg   .  s     þ

zCharStrings.toXMLc           
   	   C   sº   |D ]°}t |tƒrq|\}}}|dkr(qd}t| dƒrnzt|d ƒ}W n tk
r^   d}Y nX | j| j}n| j}|d }tj	}||| j
d�}	|	 |||¡ |dkr¬||	_|	| |< qd S )Nrâ   r‹   rw   r  r   rL   rß   )rG   rH   rF   r   rJ   rw   rm   rÝ   r   rr   rÜ   ro   r  )
r;   rL   rt   ru   rv   ZfdIDrÝ   Ú	glyphNamerê   r  r   r   r   ro   B  s*    



zCharStrings.fromXML)NN)r‚   rƒ   r„   r…   rˆ   rC   rD   r  Ú__contains__rB   rM   rÖ   ré   rg   ro   r   r   r   r   rÅ   Ñ  s     ÷
!rÅ   c                 C   s   t |  d¡ƒS rÒ   )r   r(   )r<   r   r   r   rÍ   \  s    rÍ   c                 C   s   t  d|  d¡¡\}|S )Nr#   r   ©r,   r&   r(   ©r<   r`   r   r   r   rÌ   `  s    rÌ   c                 C   s   t  d|  d¡¡\}|S )NrÈ   rO   r  r  r   r   r   rË   e  s    rË   c                 C   s   |   t|ƒ¡ d S r   )r‘   r   r  r   r   r   r§   j  s    r§   c                 C   s   |   t d|¡¡ d S ©Nr#   ©r‘   r,   rU   r  r   r   r   r¦   n  s    r¦   c                 C   s   |   t d|¡¡ d S ©NrÈ   r  r  r   r   r   r¥   r  s    r¥   c                 C   s   t | ƒS r   )r   r_   r   r   r   Ú	packCard8v  s    r  c                 C   s   t  d| ¡S r  ©r,   rU   r_   r   r   r   Ú
packCard16z  s    r  c                 C   s   t  d| ¡S r  r  r_   r   r   r   Ú
packCard32~  s    r   c                 C   s(   i }| D ]\}}}}}||f||< q|S r   r   ©r‰   ÚdÚoprL   ÚargÚdefaultÚconvr   r   r   ÚbuildOperatorDict‚  s    r'  c                 C   sT   i }| D ]F\}}}}}t |tƒr:t|d ƒt|d ƒ }nt|ƒ}||f||< q|S ©Nr   r   )rG   rú   r   r!  r   r   r   ÚbuildOpcodeDict‰  s    
r)  c                 C   s&   g }| D ]\}}}}}|  |¡ q|S r   )rW   )r‰   Úlr#  rL   r$  r%  r&  r   r   r   Ú
buildOrder”  s    r+  c                 C   s,   i }| D ]\}}}}}|d k	r|||< q|S r   r   r!  r   r   r   ÚbuildDefaults›  s
    
r,  c                 C   s$   i }| D ]\}}}}}|||< q|S r   r   r!  r   r   r   ÚbuildConverters£  s    
r-  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSimpleConverterc              	   C   sF   t |dƒs|  ||¡S |j}| ¡ }z|  ||¡W ¢S | |¡ X d S )Nr<   )rF   Ú_readr<   r�   r.   )r;   rœ   r`   r<   r“   r   r   r   r(   «  s    
zSimpleConverter.readc                 C   s   |S r   r   ©r;   rœ   r`   r   r   r   r/  µ  s    zSimpleConverter._readc                 C   s   |S r   r   r0  r   r   r   r‘   ¸  s    zSimpleConverter.writec                 C   s   |j ||d� | ¡  d S )Nr_   )rd   re   ©r;   ri   rL   r`   r   r   r   ÚxmlWrite»  s    zSimpleConverter.xmlWritec                 C   s   |d S ©Nr`   r   ©r;   rL   rt   ru   rœ   r   r   r   rû   ¿  s    zSimpleConverter.xmlReadN)r‚   rƒ   r„   r(   r/  r‘   r2  rû   r   r   r   r   r.  ª  s
   
r.  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚASCIIConverterc                 C   s   t |dd�S ©NÚasciir£   r   r0  r   r   r   r/  Ä  s    zASCIIConverter._readc                 C   s   t |dd�S r6  ©r	   r0  r   r   r   r‘   Ç  s    zASCIIConverter.writec                 C   s"   |j |t|dd�d� | ¡  d S )Nr7  r£   r_   ©rd   r
   re   r1  r   r   r   r2  Ê  s    zASCIIConverter.xmlWritec                 C   s   t |d dd�S )Nr`   r7  r£   r8  r4  r   r   r   rû   Î  s    zASCIIConverter.xmlReadN©r‚   rƒ   r„   r/  r‘   r2  rû   r   r   r   r   r5  Ã  s   r5  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚLatin1Converterc                 C   s   t |dd�S ©Nr¢   r£   r   r0  r   r   r   r/  Ó  s    zLatin1Converter._readc                 C   s   t |dd�S r<  r8  r0  r   r   r   r‘   Ö  s    zLatin1Converter.writec                 C   s<   t |dd�}|dkr"t dd|¡}|j||d� | ¡  d S )Nr¢   r£   )ÚNoticeÚ	Copyrightz	[\r\n]\s+ú r_   )r
   ÚreÚsubrd   re   r1  r   r   r   r2  Ù  s
    zLatin1Converter.xmlWritec                 C   s   t |d dd�S )Nr`   r¢   r£   r8  r4  r   r   r   rû   à  s    zLatin1Converter.xmlReadNr:  r   r   r   r   r;  Ò  s   r;  c                 C   s&   zt | ƒ}W n   t| ƒ}Y nX |S r   )rs   Úfloat)r   r`   r   r   r   ÚparseNumä  s
    rC  c                 C   s`   g }| D ]>}t |tƒrq|\}}}|d  ¡ }dd„ |D ƒ}| |¡ qt|ƒdkr\|d }|S )Nr`   c                 S   s   g | ]}t |ƒ‘qS r   )Úeval©r   Úvalr   r   r   Ú
<listcomp>ó  s     z"parseBlendList.<locals>.<listcomp>r   r   )rG   rH   ÚsplitrW   r@   )r   Ú	valueListrv   rL   rt   ru   Ú	blendListr   r   r   ÚparseBlendListì  s    

rK  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚNumberConverterc                 C   s„   t |tƒrj| |¡ | ¡  | ¡  d dd„ |D ƒ¡}|jt|d� | ¡  | ¡  | 	|¡ | ¡  n|j||d� | ¡  d S )Nr?  c                 S   s   g | ]}t |ƒ‘qS r   ©rH   rE  r   r   r   rG     s     z,NumberConverter.xmlWrite.<locals>.<listcomp>r_   ©
rG   r0   rf   re   ÚindentÚjoinrd   ÚkBlendDictOpNameÚdedentrh   )r;   ri   rL   r`   Ú
blendValuer   r   r   r2  û  s    



zNumberConverter.xmlWritec                 C   s.   |  dd ¡}|d krt|ƒ}nt|d ƒ}|S r3  )ÚgetrK  rC  )r;   rL   rt   ru   rœ   ÚvalueStringr`   r   r   r   rû   
  s
    
zNumberConverter.xmlReadN©r‚   rƒ   r„   r2  rû   r   r   r   r   rL  ú  s   rL  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚArrayConverterc                 C   sª   |r|t |d tƒr|| |¡ | ¡  | ¡  |D ].}d dd„ |D ƒ¡}|jt|d� | ¡  q0| ¡  | 	|¡ | ¡  n*d dd„ |D ƒ¡}|j||d� | ¡  d S )Nr   r?  c                 S   s   g | ]}t |ƒ‘qS r   rM  rE  r   r   r   rG    s     z+ArrayConverter.xmlWrite.<locals>.<listcomp>r_   c                 S   s   g | ]}t |ƒ‘qS r   rM  rE  r   r   r   rG  !  s     rN  )r;   ri   rL   r`   rI  rS  r   r   r   r2    s    



zArrayConverter.xmlWritec                 C   s8   |  dd ¡}|d krt|ƒ}n| ¡ }dd„ |D ƒ}|S )Nr`   c                 S   s   g | ]}t |ƒ‘qS r   )rC  )r   r`   r   r   r   rG  +  s     z*ArrayConverter.xmlRead.<locals>.<listcomp>)rT  rK  rH  )r;   rL   rt   ru   rœ   rU  rI  rD   r   r   r   rû   %  s    
zArrayConverter.xmlReadNrV  r   r   r   r   rW    s   rW  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTableConverterc                 C   s2   |  |¡ | ¡  | |¡ | |¡ | ¡  d S r   )rf   re   rg   rh   r1  r   r   r   r2  0  s
    


zTableConverter.xmlWritec                 C   s<   |   ¡ ƒ }|D ](}t|tƒrq|\}}}| |||¡ q|S r   )ÚgetClassrG   rH   ro   )r;   rL   rt   ru   rœ   Úobrv   r   r   r   rû   7  s    


zTableConverter.xmlReadNrV  r   r   r   r   rX  /  s   rX  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚPrivateDictConverterc                 C   s   t S r   )ÚPrivateDictrA   r   r   r   rY  B  s    zPrivateDictConverter.getClassc           
      C   s~   |\}}|j }|j}z
|j}W n tk
r6   d }Y nX t|j||||d�}| |¡ | |¡}	t|	ƒ|kspt	‚| 
|	¡ |S rò   )r<   rÊ   rq   ÚAttributeErrorr\  r6   r.   r(   r@   r+   r?   )
r;   rœ   r`   rÔ   r¨   r<   r"   rq   Zprivr†   r   r   r   r/  E  s    




zPrivateDictConverter._readc                 C   s   dS )N)r   r   r   r0  r   r   r   r‘   T  s    zPrivateDictConverter.writeN©r‚   rƒ   r„   rY  r/  r‘   r   r   r   r   r[  A  s   r[  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSubrsConverterc                 C   s   t S r   )rë   rA   r   r   r   rY  Y  s    zSubrsConverter.getClassc                 C   s(   |j }|j}| |j| ¡ t||d�S r×   )r<   rÊ   r.   r¨   rë   )r;   rœ   r`   r<   r"   r   r   r   r/  \  s    zSubrsConverter._readc                 C   s   dS r±   r   r0  r   r   r   r‘   b  s    zSubrsConverter.writeNr^  r   r   r   r   r_  X  s   r_  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚCharStringsConverterc              
   C   s„   |j }|j}|j}t|dd ƒ}|j}t|dƒrP|j}t|dƒrF|j}	nd }	d }
nd\}	}|j}
| 	|¡ t
||||
|	|||d�}|S )Nrl   rp   rÿ   )NN)r"   r  )r<   rÊ   rP   Úgetattrr:   rF   rp   rÿ   rm   r.   rÅ   )r;   rœ   r`   r<   r"   rP   r  rÜ   rw   rÞ   rÝ   r  r   r   r   r/  g  s2    


ø
zCharStringsConverter._readc                 C   s   dS r±   r   r0  r   r   r   r‘   „  s    zCharStringsConverter.writec           	      C   sp   t |dƒr,|j}t |dƒr"|j}nd }d }n|jd d   }}}td d |j|||t|dd ƒd�}| |||¡ |S )Nrp   rÿ   rl   )r  )rF   rp   rÿ   rm   rÅ   r:   ra  ro   )	r;   rL   rt   ru   rœ   rw   rÞ   rÝ   r  r   r   r   rû   ‡  s$    


ù	zCharStringsConverter.xmlReadN©r‚   rƒ   r„   r/  r‘   rû   r   r   r   r   r`  f  s   r`  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚCharsetConverterc                 C   s”  t |dƒ}|dk�r|j}|j}| |¡ t td|¡ t|ƒ}|dkrZt|||j|ƒ}n(|dksj|dkr~t	|||j||ƒ}nt
‚t|ƒ|ks’t‚t td| ¡ ¡ i }g }	|D ]`}
|
|krþ||
 }|
d t|ƒ |krâ|d7 }qÄ|d ||
< |
d t|ƒ }
d||
< |	 |
¡ q°|	}nT|�s*d|jk�r>|dk�s8t‚d }n.|dk�rNt}n|dk�r^t}n|dk�rlt}|�r�t|ƒ|jk�r�|d |j… }|S )	NÚROSr   zloading charset at %sr   r   z    charset end at %sú#rÅ   )rF   r  r<   r.   rŒ   r�   rÍ   ÚparseCharset0r6   ÚparseCharsetÚNotImplementedErrorr@   r+   r�   rH   rW   r¹   ÚcffISOAdobeStringsÚcffIExpertStringsÚcffExpertSubsetStrings)r;   rœ   r`   ÚisCIDr  r<   r  rP   ZallNamesZ
newCharsetr  Únr   r   r   r/  ¤  sL    






zCharsetConverter._readc                 C   s   dS r±   r   r0  r   r   r   r‘   Ò  s    zCharsetConverter.writec                 C   s   |  d¡ | ¡  d S )Nz8charset is dumped separately as the 'GlyphOrder' element)rå   re   r1  r   r   r   r2  Õ  s    
zCharsetConverter.xmlWritec                 C   s   d S r   r   r4  r   r   r   rû   Ü  s    zCharsetConverter.xmlReadNr:  r   r   r   r   rc  £  s   .rc  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚCharsetCompilerc                 C   s\   |d dkst ‚t|jdƒ}t|||ƒ}t|||ƒ}t|ƒt|ƒk rL|| _n|| _|| _d S )Nr   ú.notdefrd  )r+   rF   ÚdictObjÚpackCharset0ÚpackCharsetr@   r†   rœ   )r;   r6   rP   rœ   rl  Údata0r†   r   r   r   rˆ   á  s    zCharsetCompiler.__init__c                 C   s   || j jd< d S )NrP   r¸   rº   r   r   r   rŠ   ì  s    zCharsetCompiler.setPosc                 C   s
   t | jƒS r   rü   rA   r   r   r   rV   ï  s    zCharsetCompiler.getDataLengthc                 C   s   |  | j¡ d S r   ©r‘   r†   rµ   r   r   r   rY   ò  s    zCharsetCompiler.toFileN©r‚   rƒ   r„   rˆ   rŠ   rV   rY   r   r   r   r   rn  à  s   rn  c                 C   s|   d }t tdfttdfttdfg}t| ƒ}|D ]J\}}}|d k	rB qx||krLq,|}t|ƒD ]}| | || krXd } q,qXq,|S )Nr   r   r   )ÚcffISOAdobeStringCountri  ÚcffExpertStringCountrj  ÚcffExpertSubsetStringCountrk  r@   rÎ   )rP   ZpredefinedCharSetValZpredefinedCharSetsZlcsZcntZpcsÚcsvrç   r   r   r   ÚgetStdCharSetö  s"    ýrz  c                 C   s   t | dd … ƒS )Nr   )rs   ©rL   r6   r   r   r   ÚgetCIDfromName  s    r|  c                 C   s
   |  | ¡S r   )ÚgetSIDr{  r   r   r   ÚgetSIDfromName  s    r~  c                 C   sJ   d}t |ƒg}|rt}nt}| dd … D ]}| t|||ƒƒ¡ q(t|ƒS r(  )r  r|  r~  rW   r  r   )rP   rl  r6   Úfmtr†   Ú	getNameIDrL   r   r   r   rq    s    
rq  c                 C   sì   d}g }d }d}|rt }nt}| dd … D ]R}|||ƒ}	|d krF|	}n2|d |	krx|| }
|
dkrfd}| ||
f¡ |	}|	}q*|r¤|| }
|
dkr–d}| ||
f¡ t|ƒg}|dkr¼t}nt}|D ]\}}
| t|ƒ||
ƒ ¡ qÄt|ƒS )Nr   r   éÿ   r   )r|  r~  rW   r  r  r   )rP   rl  r6   r  Úrangesr  Úendr€  rL   ÚSIDÚnLeftr†   Ú	nLeftFuncr   r   r   rr  !  s<    

rr  c                 C   sj   dg}|r>t | d ƒD ]$}t|ƒ}| dt|ƒ d¡ ¡ qn(t | d ƒD ]}t|ƒ}| || ¡ qJ|S ©Nro  r   ZcidrN   )rÎ   rÌ   rW   rH   Úzfill)r  r<   r6   rl  rP   rç   ÚCIDr„  r   r   r   rf  F  s    rf  c                 C   s¢   dg}d}|dkrt }nt}|| k ržt|ƒ}||ƒ}	|rjt|||	 d ƒD ]}
| dt|
ƒ d¡ ¡ qJn&t|||	 d ƒD ]}| || ¡ q|||	 d }q|S r‡  )rÍ   rÌ   rÎ   rW   rH   rˆ  )r  r<   r6   rl  r  rP   r’   r†  r  r…  r‰  r„  r   r   r   rg  S  s    rg  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚEncodingCompilerc                 C   sZ   t |tƒrt‚t|jj||jƒ}t|jj||jƒ}t|ƒt|ƒk rJ|| _	n|| _	|| _
d S r   )rG   rH   r+   ÚpackEncoding0rp  rP   r6   ÚpackEncoding1r@   r†   rœ   )r;   r6   r¤   rœ   rs  Zdata1r   r   r   rˆ   h  s    zEncodingCompiler.__init__c                 C   s   || j jd< d S )NÚEncodingr¸   rº   r   r   r   rŠ   r  s    zEncodingCompiler.setPosc                 C   s
   t | jƒS r   rü   rA   r   r   r   rV   u  s    zEncodingCompiler.getDataLengthc                 C   s   |  | j¡ d S r   rt  rµ   r   r   r   rY   x  s    zEncodingCompiler.toFileNru  r   r   r   r   rŠ  g  s   
rŠ  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚEncodingConverterc                 C   s¤   |dkrdS |dkrdS |dks$t ‚|j}| |¡ t td|¡ t|ƒ}|d@ }|r^tdƒ‚|d@ }|dkr‚t|j|||j	ƒ}n|dkrœt
|j|||j	ƒ}|S d S )	Nr   ÚStandardEncodingr   ÚExpertEncodingzloading Encoding at %sé€   z*Encoding supplements are not yet supportedé   )r+   r<   r.   rŒ   r�   rÍ   rh  ÚparseEncoding0rP   r6   ÚparseEncoding1)r;   rœ   r`   r<   r  ÚhaveSupplementr¤   r   r   r   r/  }  s8    
   ÿ   ÿzEncodingConverter._readc                 C   s   |dkrdS |dkrdS dS )Nr�  r   r�  r   r   r0  r   r   r   r‘   –  s
    zEncodingConverter.writec                 C   sˆ   |dkr"|j ||d� | ¡  d S | |¡ | ¡  tt|ƒƒD ]0}|| }|dkr@|j dt|ƒ|d� | ¡  q@| |¡ | ¡  d S )N)r�  r�  rc   ro  Úmap)ÚcoderL   )rd   re   rf   rÎ   r@   Úhexrh   )r;   ri   rL   r`   r—  r  r   r   r   r2  �  s    


zEncodingConverter.xmlWritec           	      C   sZ   d|kr|d S dgd }|D ]6}t |tƒr.q|\}}}t|d ƒ}|d }|||< q|S )NrL   ro  r—   r—  )rG   rH   r   )	r;   rL   rt   ru   rœ   r¤   rv   r—  r  r   r   r   rû   ¬  s    



zEncodingConverter.xmlReadNr:  r   r   r   r   rŽ  |  s   rŽ  c                 C   sF   t |ƒ}dgd }td|d ƒD ] }t |ƒ}|dkr | | ||< q |S )Nro  r—   r   r   ©rÍ   rÎ   )rP   r<   r•  r6   ZnCodesr¤   r	  r—  r   r   r   r“  º  s    
r“  c           
      C   sl   t |ƒ}dgd }d}t|ƒD ]H}t |ƒ}t |ƒ}	t|||	 d ƒD ]}| | ||< |d }qD|d }q|S )Nro  r—   r   r™  )
rP   r<   r•  r6   r  r¤   r	  rç   r—  r…  r   r   r   r”  Ä  s    


r”  c           	      C   s¶   d}i }t t|ƒƒD ]}|| }|dkr|||< qg }| dd … D ]}| |¡}| |¡ qB|rv|d d krv| ¡  q\t|ƒtt|ƒƒg}|D ]}|d kržd}| t|ƒ¡ qŽt|ƒS )Nr   ro  r   r‹   ©rÎ   r@   rT  rW   Úpopr  r   )	rP   r¤   r6   r  Úmr—  rL   Úcodesr†   r   r   r   r‹  Ò  s$    


r‹  c                 C   s  d}i }t t|ƒƒD ]}|| }|dkr|||< qg }d }d}	| dd … D ]H}| |d¡}|d krh|}n&|	d |krŽ|	| }
| ||
f¡ |}|}	qJ|	| }
| ||
f¡ |rÈ|d d dkrÈ| ¡  qªt|ƒtt|ƒƒg}|D ]*\}}
|dkrôd}| t|ƒt|
ƒ ¡ qàt|ƒS )Nr   ro  r   r‹   rš  )rP   r¤   r6   r  rœ  r—  rL   r‚  r  rƒ  r…  r†   r   r   r   rŒ  é  s8    

rŒ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚFDArrayConverterc                 C   s`   z
|j }W n tk
r"   d }Y nX |j}|j}| |¡ t||d�}||_|j|_|j|_|S r×   )	rl   r]  r<   rÊ   r.   rñ   rq   r6   r:   )r;   rœ   r`   rq   r<   r"   rw   r   r   r   r/    s    


zFDArrayConverter._readc                 C   s   dS r±   r   r0  r   r   r   r‘     s    zFDArrayConverter.writec                 C   s8   t ƒ }|D ](}t|tƒrq
|\}}}| |||¡ q
|S r   )rñ   rG   rH   ro   )r;   rL   rt   ru   rœ   rw   rv   r   r   r   rû     s    

zFDArrayConverter.xmlReadNrb  r   r   r   r   rž    s   rž  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚFDSelectConverterc                 C   s    |j }| |¡ t||jƒ}|S r   )r<   r.   rÿ   r  )r;   rœ   r`   r<   rÞ   r   r   r   r/  (  s    
zFDSelectConverter._readc                 C   s   dS r±   r   r0  r   r   r   r‘   .  s    zFDSelectConverter.writec                 C   s    |  |d|jfg¡ | ¡  d S ©Nr  )rd   r  re   r1  r   r   r   r2  3  s    zFDSelectConverter.xmlWritec           	      C   s$   t |d ƒ}d }d }t|||ƒ}|S r   )r   rÿ   )	r;   rL   rt   ru   rœ   r  r<   r  rÞ   r   r   r   rû   7  s
    zFDSelectConverter.xmlReadNr:  r   r   r   r   rŸ  '  s   rŸ  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚVarStoreConverterc                 C   s$   |j }| |¡ t|ƒ}| ¡  |S r   )r<   r.   ró   r?   )r;   rœ   r`   r<   r  r   r   r   r/  @  s
    
zVarStoreConverter._readc                 C   s   dS r±   r   r0  r   r   r   r‘   G  s    zVarStoreConverter.writec                 C   s   |  ||¡ d S r   )rù   r1  r   r   r   r2  J  s    zVarStoreConverter.xmlWritec                 C   s   t ƒ }| ||||¡ |S r   )ró   rû   )r;   rL   rt   ru   rœ   r  r   r   r   rû   M  s    zVarStoreConverter.xmlReadNr:  r   r   r   r   r¡  ?  s   r¡  c                 C   s.   d}t |ƒg}| D ]}| t |ƒ¡ qt|ƒS r±   )r  rW   r   )ÚfdSelectArrayr  r†   rI   r   r   r   ÚpackFDSelect0S  s
    
r£  c           
      C   s¬   d}g }t | ƒ}d}t|ƒD ]&}| | }||kr| ||g¡ |}q|d }t|ƒg}| tt |ƒƒ¡ |D ](}	| t|	d ƒ¡ | t|	d ƒ¡ ql| t|ƒ¡ t|ƒS )Nr   r‹   r   r   )r@   rÎ   rW   r  r  r   ©
r¢  r  ZfdRangesZlenArrayZlastFDIndexrç   rá   ZsentinelGIDr†   ZfdRanger   r   r   ÚpackFDSelect3[  s"    
r¥  c           
      C   s¬   d}g }t | ƒ}d}t|ƒD ]&}| | }||kr| ||g¡ |}q|d }t|ƒg}| tt |ƒƒ¡ |D ](}	| t|	d ƒ¡ | t|	d ƒ¡ ql| t|ƒ¡ t|ƒS )NrO   r‹   r   r   )r@   rÎ   rW   r  r   r  r   r¤  r   r   r   ÚpackFDSelect4p  s"    
r¦  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚFDSelectCompilerc                 C   sŒ   |j }|j}|dkr t|ƒ| _nb|dkr4t|ƒ| _nN|dkrHt|ƒ| _n:t|ƒ}t|ƒ}t|ƒt|ƒk rv|| _d|_ n|| _d|_ || _d S )Nr   r   rO   )r  r  r£  r†   r¥  r¦  r@   rœ   )r;   rÞ   rœ   r  r¢  rs  Zdata3r   r   r   rˆ   †  s     zFDSelectCompiler.__init__c                 C   s   || j jd< d S )Nrÿ   r¸   rº   r   r   r   rŠ   œ  s    zFDSelectCompiler.setPosc                 C   s
   t | jƒS r   rü   rA   r   r   r   rV   Ÿ  s    zFDSelectCompiler.getDataLengthc                 C   s   |  | j¡ d S r   rt  rµ   r   r   r   rY   ¢  s    zFDSelectCompiler.toFileNru  r   r   r   r   r§  …  s   r§  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚVarStoreCompilerc                 C   s@   || _ |js| ¡  tdt|jƒƒ}t|ƒ|jg}t|ƒ| _d S rõ   )rœ   r†   r^   Úminr@   r  r   )r;   ÚvarStoreDatarœ   ZvarStoreDataLenr†   r   r   r   rˆ   §  s    zVarStoreCompiler.__init__c                 C   s   || j jd< d S )Nrl   r¸   rº   r   r   r   rŠ   ¯  s    zVarStoreCompiler.setPosc                 C   s
   t | jƒS r   rü   rA   r   r   r   rV   ²  s    zVarStoreCompiler.getDataLengthc                 C   s   |  | j¡ d S r   rt  rµ   r   r   r   rY   µ  s    zVarStoreCompiler.toFileNru  r   r   r   r   r¨  ¦  s   r¨  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚROSConverterc                 C   s<   |\}}}|  |dt|ƒfdt|ƒfd|fg¡ | ¡  d S ©NZRegistryZOrderZ
Supplementr9  )r;   ri   rL   r`   ÚregistryÚorderZ
supplementr   r   r   r2  º  s    


ýþzROSConverter.xmlWritec                 C   s   |d |d t |d ƒfS r¬  )r   r4  r   r   r   rû   Æ  s    zROSConverter.xmlReadNrV  r   r   r   r   r«  ¹  s   r«  )é   ZmaxstackÚnumberNN)é   é   rd  )r„  r„  r°  ))r±  é   ZSyntheticBaser°  NN)r   Úversionr„  NNr=  r„  )r±  r   r>  r   ZFullName)r±  é&   ÚFontNamer   Z
FamilyName)rO   ÚWeightr„  NN))r±  r   ZisFixedPitchr°  r   N))r±  r   ZItalicAngler°  r   N))r±  r   ZUnderlinePositionr°  iœÿÿÿN))r±  rO   ZUnderlineThicknessr°  é2   N))r±  rN   Z	PaintTyper°  r   N))r±  é   ZCharstringTyper°  r   N)r±  é   Ú
FontMatrixr   gü©ñÒMbP?)é   ZUniqueIDr°  NNrN   ÚFontBBox))r±  é   ZStrokeWidthr°  r   N)é   ZXUIDr   NN))r±  é   Ú
PostScriptr„  NN))r±  é   ZBaseFontNamer„  NN))r±  é   ZBaseFontBlendÚdeltaNN))r±  é   ÚCIDFontVersionr°  r   N))r±  é    ÚCIDFontRevisionr°  r   N))r±  é!   ÚCIDFontTyper°  r   N))r±  é"   ÚCIDCountr°  i"  Né   rP   r°  ))r±  é#   ZUIDBaser°  NNé   r�  é   rm   )r°  r°  )r±  é%   )r±  é$   rp   é   é   rl   ÚblendrÃ  )rÂ  Úvsindexr°  NNrJ  )r¹  Z
BlueValuesrÄ  NN)rº  Z
OtherBluesrÄ  NN)r¾  ZFamilyBluesrÄ  NN)é	   ZFamilyOtherBluesrÄ  NN))r±  r×  Z	BlueScaler°  g}?5^ºI¤?N))r±  é
   Z	BlueShiftr°  rº  N))r±  é   ZBlueFuzzr°  r   N)rØ  ZStdHWr°  NN)rÙ  ZStdVWr°  NN))r±  r±  Z	StemSnapHrÄ  NN))r±  r¼  Z	StemSnapVrÄ  NN))r±  r¿  Z	ForceBoldr°  r   N))r±  rÍ  ZForceBoldThresholdr°  NN))r±  rÏ  ZlenIVr°  NN))r±  rÓ  ZLanguageGroupr°  r   N))r±  rÐ  ZExpansionFactorr°  g¸…ëQ¸®?N))r±  é   ZinitialRandomSeedr°  r   N)r³  ÚdefaultWidthXr°  r   N)rÀ  ÚnominalWidthXr°  r   NrÚ  rÂ   c                 C   sŠ   t t| ƒƒD ]x}| | \}}}}}|d k	r,q|dkr<tƒ }n6|dkrLtƒ }n&|dkr\tƒ }n|dkrjd }ndsrt‚|||||f| |< qd S )N)rÄ  r   r°  r„  rJ  F)rÎ   r@   rW  rL  r5  r+   )r‰   rç   r#  rL   r$  r%  r&  r   r   r   ÚaddConverters=  s    rÝ  c                   @   s   e Zd ZeeƒZdS )ÚTopDictDecompilerN)r‚   rƒ   r„   r'  ÚtopDictOperatorsÚ	operatorsr   r   r   r   rÞ  S  s   rÞ  c                   @   s   e Zd ZeeƒZdS )ÚPrivateDictDecompilerN)r‚   rƒ   r„   r'  ÚprivateDictOperatorsrà  r   r   r   r   rá  W  s   rá  c                   @   sb   e Zd ZdZd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S )ÚDictCompilerr   Nc           	      C   s®   |rt |tƒst‚|d kr6t|dƒr6|j}|d k	s6t‚|| _|| _|| _|| _i }|jD ]J}t	||d ƒ}|d krrqX|j
| }| ||¡}||j |¡kršqX|||< qX|| _d S r™   )rG   r5   r+   rF   r"   rp  r6   rœ   r®  ra  Ú
convertersr‘   ÚdefaultsrT  r¹   )	r;   rp  r6   rœ   r"   r¹   rL   r`   r&  r   r   r   rˆ   ^  s(    


zDictCompiler.__init__c                 C   s   d S r   r   rº   r   r   r   rŠ   t  s    zDictCompiler.setPosc                 C   s   t |  d¡ƒS )NrV   )r@   r^   rA   r   r   r   rV   w  s    zDictCompiler.getDataLengthc                 C   sâ   t   td| jj|¡ | j}g }| jjD ]®}| |¡}|d kr>q&| j| \}}t	|t
ƒr®t|ƒ}t|ƒ|ksrtdƒ‚t|ƒD ]0}	||	 }
||	 }t| d|
 ƒ}| ||ƒ¡ qznt| d| ƒ}| ||ƒ¡ | |¡ q&t|ƒ}|S )Nz-- compiling %s for %szvalue doesn't match arg typeZarg_)rŒ   r�   r´   r‚   r¹   rp  r®  rT  ÚopcodesrG   rú   r@   r+   rÎ   ra  rW   r   )r;   Úreasonr¹   r†   rL   r`   r#  ZargTyper*  rç   r$  ÚvZ
arghandlerr   r   r   r^   z  s*    

zDictCompiler.compilec                 C   s   |   d¡}| |¡ d S )NrY   )r^   r‘   )r;   r<   r†   r   r   r   rY   ’  s    
zDictCompiler.toFilec                 C   sJ   t |tƒr>dd„ |D ƒ}| tdƒ¡ | ttƒ¡ t|ƒ}nt|ƒ}|S )Nc                 S   s   g | ]}t |ƒ‘qS r   ©ÚencodeNumberrE  r   r   r   rG  ˜  s     z+DictCompiler.arg_number.<locals>.<listcomp>r   )rG   r0   rW   rê  r   ÚblendOpr   )r;   Únumr†   Zdatumr   r   r   Ú
arg_number–  s    

zDictCompiler.arg_numberc                 C   s   t  | j |¡¡S r   )r   ÚencodeIntCFFr6   r}  )r;   r   r   r   r   Úarg_SID   s    zDictCompiler.arg_SIDc                 C   s&   g }|D ]}|  |  |¡¡ qt|ƒS r   )rW   rí  r   )r;   r`   r†   rì  r   r   r   Ú	arg_array£  s    zDictCompiler.arg_arrayc                 C   sn   |sdS |d }t |tƒr&|  |¡}n@g }d}|D ]}| || ¡ |}q2g }|D ]}| t|ƒ¡ qRt|ƒS )Nó    r   )rG   r0   Úarg_delta_blendrW   rê  r   )r;   r`   Zval0r†   r®   Úlastrè  rì  r   r   r   Ú	arg_delta©  s    
zDictCompiler.arg_deltac                 C   s,  t |d ƒ}t |ƒ}|| d }|| jkrˆt| jd | ƒ}g }tt |ƒ|ƒ}|dkrXq†|d|… }|  |¡}	| |	¡ ||d… }q@n dg| }
dg| }d}d}||k ræ|| d }|| |
|< |}|| dd… ||< |d7 }q¤|
}|D ]}| |¡ qîdd„ |D ƒ}| t|ƒ¡ | tt	ƒ¡ |S )aM  A delta list with blend lists has to be *all* blend lists.

        The value is a list is arranged as follows::

                [
                        [V0, d0..dn]
                        [V1, d0..dn]
                        ...
                        [Vm, d0..dn]
                ]

        ``V`` is the absolute coordinate value from the default font, and ``d0-dn``
        are the delta values from the *n* regions. Each ``V`` is an absolute
        coordinate from the default font.

        We want to return a list::

                [
                        [v0, v1..vm]
                        [d0..dn]
                        ...
                        [d0..dn]
                        numBlends
                        blendOp
                ]

        where each ``v`` is relative to the previous default font value.
        r   r   Nc                 S   s   g | ]}t |ƒ‘qS r   ré  rE  r   r   r   rG  û  s     z0DictCompiler.arg_delta_blend.<locals>.<listcomp>)
r@   ÚmaxBlendStackrs   r©  rò  r°   rW   rê  r   rë  )r;   r`   Z
numMastersZ	numBlendsZnumStackZnumBlendValuesr®   ZnumValZvalListZout1Z	firstListZ	deltaListrç   ZprevValZdefaultValueZrelValueListrJ  r   r   r   rò  º  s<    





zDictCompiler.arg_delta_blend)N)r‚   rƒ   r„   rõ  rˆ   rŠ   rV   r^   rY   rí  rï  rð  rô  rò  r   r   r   r   rã  [  s   

rã  c                 C   s"   t | tƒrt | ¡S t | ¡S d S r   )rG   rB  r   ZencodeFloatrî  )rì  r   r   r   rê  	  s    

rê  c                   @   s   e Zd ZeeƒZdd„ ZdS )ÚTopDictCompilerc                 C   sú  | j }g }| jjd kr¬t| jdƒrr| jjrrt| jdƒr<d }nt| jjƒ}|d krh| t|| jj| ƒ¡ n
|| jd< t| jdƒrÔ| jj	rÔ| jj	}t
|tƒsÔ| t||| ƒ¡ n(t| jdƒrÔ| jj}t|| ƒ}| |¡ t| jdƒ�r4| jj}t|ƒdk�r | jj}	| jjD ]}
| |	|
 j¡ �qt|| ƒ}| |¡ t| jdƒ�r†g }| jj}	| jjD ]}
| |	|
 ¡ �qVt||| |d�}| |¡ t| jd	ƒ�r¾| jj || ¡}| |¡ | | |¡¡ t| jd
ƒ�rö| jj || ¡}| |¡ | | |¡¡ |S )NrP   rd  r�  rl   rÿ   r   rÅ   r!   rp   rm   )r"   rp  r>   rF   rP   rz  rW   rn  r¹   r�  rG   rH   rŠ  rl   r¨  rÿ   r@   rÅ   r  r§  rÃ   rp   rS   r°   rX   rm   )r;   r6   r"   r\   ZcharsetCoder¤   rª  ZvarStoreComprÞ   r  rL   ZfdSelectCompr›   ZcharStringsCompZfdArrayIndexCompÚprivCompr   r   r   rX   	  sX    ÿ








zTopDictCompiler.getChildrenN)r‚   rƒ   r„   r)  rß  ræ  rX   r   r   r   r   rö  	  s   rö  c                       s.   e Zd ZeeƒZd‡ fdd„	Zdd„ Z‡  ZS )ÚFontDictCompilerNc           	         sº   t t| ƒj||||d� g }| j}tt|jƒt|jƒ ƒD ]^}||jkrT| 	|¡ q:|j
 |¡}|d k	r~|j| }| ||¡}t||d ƒ|kr:| 	|¡ q:|r¶t dd t|ƒ¡ ¡ d S )Nr!   z:Some CFF FDArray/FontDict keys were ignored upon compile: r?  )r²   rø  rˆ   rp  r  Úseträ  r®  r¹   rW   rå  rT  r(   ra  rŒ   ÚwarningrP  )	r;   rp  r6   rœ   r"   ÚignoredNamesrL   r%  r&  r³   r   r   rˆ   H	  s$    

ÿÿzFontDictCompiler.__init__c                 C   s>   g }t | jdƒr:| jj || ¡}| |¡ | | |¡¡ |S ©Nrm   )rF   rp  rm   rS   rW   r°   rX   )r;   r6   r\   r÷  r   r   r   rX   i	  s    
zFontDictCompiler.getChildren)N)	r‚   rƒ   r„   r)  rß  ræ  rˆ   rX   r¶   r   r   r³   r   rø  E	  s   !rø  c                   @   s(   e Zd ZeZeeƒZdd„ Zdd„ Z	dS )ÚPrivateDictCompilerc                 C   s"   || }||f| j jd< || _d S rü  )rœ   r¹   r“   )r;   r“   r•   rÔ   r   r   r   rŠ   v	  s    zPrivateDictCompiler.setPosc                 C   s*   g }t | jdƒr&| | jj || ¡¡ |S rÁ   )rF   rp  rW   rÂ   rS   )r;   r6   r\   r   r   r   rX   {	  s    zPrivateDictCompiler.getChildrenN)
r‚   rƒ   r„   ÚmaxStackLimitrõ  r)  râ  ræ  rŠ   rX   r   r   r   r   rý  r	  s   rý  c                   @   sH   e Zd Zddd„Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Z	dS )ÚBaseDictNc                 C   sd   |d k|d kkst ‚i | _g | _|| _|d kr2d S || _|| _|d k	r`t td| jj	|¡ || _
d S )NrÆ   )r+   r¹   Ú	skipNamesr6   rÊ   r<   rŒ   r�   r´   r‚   r¨   )r;   r6   r<   r¨   r"   r   r   r   rˆ   ƒ	  s    zBaseDict.__init__c                 C   sF   t   td| jjt|ƒ¡ |  | j| ¡}| |¡ | ¡ | _	|  
¡  d S )Nz    length %s is %d)rŒ   r�   r´   r‚   r@   ÚdecompilerClassr6   r?   ZgetDictr¹   ÚpostDecompile)r;   r†   Údecr   r   r   r?   �	  s
    

zBaseDict.decompilec                 C   s   d S r   r   rA   r   r   r   r  —	  s    zBaseDict.postDecompilec                 C   s   | j | |||d�S r×   rØ   rÚ   r   r   r   rS   š	  s    zBaseDict.getCompilerc                 C   sˆ   |d d… |dd …   kr$dkr0n nt |ƒ‚| j |d ¡}|d krR| j |¡}|d krbt |ƒ‚| j| }| | |¡}t| ||ƒ |S )Nr   éþÿÿÿÚ__)r]  r¹   rT  rå  rä  r(   Úsetattr)r;   rL   r`   r&  r   r   r   Ú__getattr__�	  s    (
zBaseDict.__getattr__c                 C   sŠ   | j D ]F}|| jkrqt| |d ƒ}|d kr4|dkr4q| j| }| |||¡ qt| jƒt| j ƒ }|r†| dd t	|ƒ¡ ¡ | 
¡  d S )NrP   zsome keys were ignored: %sr?  )r®  r   ra  rä  r2  rù  r¹   rå   rP  r  re   )r;   ri   rL   r`   r&  rû  r   r   r   rg   ®	  s    



ÿzBaseDict.toXMLc                 C   s*   | j | }| |||| ¡}t| ||ƒ d S r   )rä  rû   r  )r;   rL   rt   ru   r&  r`   r   r   r   ro   Ç	  s    
zBaseDict.fromXML)NNNN)N)
r‚   rƒ   r„   rˆ   r?   r  rS   r  rg   ro   r   r   r   r   rÿ  ‚	  s   

rÿ  c                       sj   e Zd ZdZeeƒZeeƒZe	Z
eeƒZeZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z‡  ZS )rn   ad  The ``TopDict`` represents the top-level dictionary holding font
    information. CFF2 tables contain a restricted set of top-level entries
    as described `here <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#7-top-dict-data>`_,
    but CFF tables may contain a wider range of information. This information
    can be accessed through attributes or through the dictionary returned
    through the ``rawDict`` property:

    .. code:: python

            font = tt["CFF "].cff[0]
            font.FamilyName
            # 'Linux Libertine O'
            font.rawDict["FamilyName"]
            # 'Linux Libertine O'

    More information is available in the CFF file's private dictionary, accessed
    via the ``Private`` property:

    .. code:: python

            tt["CFF "].cff[0].Private.BlueValues
            # [-15, 0, 515, 515, 666, 666]

    Nc                    s^   t t| ƒj||||d� || _|| _|rFttƒ| _|ƒ | _t	tƒ| _
nttƒ| _t	tƒ| _
d S r×   )r²   rn   rˆ   r>   r:   r,  ÚtopDictOperators2rå  rP   r+  r®  rß  )r;   r6   r<   r¨   r:   r>   r"   r³   r   r   rˆ   í	  s    	

zTopDict.__init__c                 C   s   | j S )z.Returns a list of glyph names in the CFF font.)rP   rA   r   r   r   r8   
  s    zTopDict.getGlyphOrderc                 C   sH   | j  d¡}|d krd S | j |¡ | jr8t| jƒ| _nt| jƒ| _d S rÄ   )r¹   rT  r<   r.   rÊ   rË   r  rÌ   )r;   r¨   r   r   r   r  
  s    zTopDict.postDecompilec                 C   sV   t | dƒr|  ¡  t | dƒr$dg| _t | dƒr8t | dƒsFddddg| _t | |¡ d S )NrÅ   rd  r�  rÆ  rÈ  rÊ  rÌ  )rF   ÚdecompileAllCharStringsr   rÿ  rg   )r;   ri   r   r   r   rg   
  s    

üzTopDict.toXMLc                 C   sD   t | j ¡ ƒD ]0\}}z| ¡  W q   t d|¡ ‚ Y qX qd S )NzError in charstring %s)Ú	enumeraterÅ   rD   r?   rŒ   Úerror)r;   rç   r  r   r   r   r	   
  s    zTopDict.decompileAllCharStringsc                 C   sp   d }| j  ¡ D ]0}| | j ¡}|d k	r|d k	r:t||ƒ}q|}q|d kr^| jd d d … | _ntt|ƒƒ| _d S )Nr½  )rÅ   rD   Z
calcBoundsr   rå  r½  r0   r   )r;   ZfontBBoxr  Zboundsr   r   r   rQ   )
  s    zTopDict.recalcFontBBox)NNNNNN)r‚   rƒ   r„   r…   r,  rß  rå  r-  rä  rö  rÙ   r+  r®  rÞ  r  rˆ   r8   r  rg   r	  rQ   r¶   r   r   r³   r   rn   Í	  s$         ù	rn   c                       sL   e Zd Zi ZeeƒZeZddddgZ	dgZ
eZd
‡ fdd„	Zdd	„ Z‡  ZS )rî   r¶  r»  r·  rm   Nc                    s,   t t| ƒj||||d� || _|  |¡ d S r×   )r²   rî   rˆ   rq   ÚsetCFF2)r;   r6   r<   r¨   r:   r"   rq   r³   r   r   rˆ   \
  s    	zFontDict.__init__c                 C   s&   |r| j | _d| _n| j| _d| _d S )NTF)Ú	orderCFF2r®  rÊ   ÚorderCFFr‡   r   r   r   r  i
  s
    zFontDict.setCFF2)NNNNNN)r‚   rƒ   r„   rå  r-  rß  rä  rø  rÙ   r  r  rÞ  r  rˆ   r  r¶   r   r   r³   r   rî   9
  s         ùrî   c                       sT   e Zd ZeeƒZeeƒZeeƒZ	e
ZeZd‡ fdd„	Zedd„ ƒZd	dd„Z‡  ZS )
r\  Nc                    sh   t t| ƒj||||d� || _|rJttƒ| _ttƒ| _d  | _	| _
d| _nttƒ| _ttƒ| _d| _d S )Nr!   TF)r²   r\  rˆ   rq   r,  ÚprivateDictOperators2rå  r+  r®  rÜ  rÛ  rÊ   râ  )r;   r6   r<   r¨   r"   rq   r³   r   r   rˆ   z
  s    



zPrivateDict.__init__c                 C   s   | j S r   )rÊ   rA   r   r   r   Úin_cff2‰
  s    zPrivateDict.in_cff2c                 C   s.   |d krt | dƒr| j}nd}| j |¡}|S )NrÖ  r   )rF   rÖ  rq   rþ   )r;   Úvirý   r   r   r   rþ   �
  s    
zPrivateDict.getNumRegions)NNNNN)N)r‚   rƒ   r„   r,  râ  rå  r-  rä  r+  r®  rá  r  rý  rÙ   rˆ   Úpropertyr  rþ   r¶   r   r   r³   r   r\  s
  s   
r\  c                   @   sJ   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )r5   zSID -> string mapping.Nc                 C   s.   |d krg }ndd„ t |dd�D ƒ}|| _d S )Nc                 S   s   g | ]}t |d d�‘qS )r¢   r£   r   r   r   r   r   rG  Ÿ
  s     z+IndexedStrings.__init__.<locals>.<listcomp>Fr!   )r1   r6   )r;   r<   r6   r   r   r   rˆ   ›
  s    zIndexedStrings.__init__c                 C   s   t | d | dd�S )NFr!   )rª   rA   r   r   r   rS   ¢
  s    zIndexedStrings.getCompilerc                 C   s
   t | jƒS r   )r@   r6   rA   r   r   r   rB   ¥
  s    zIndexedStrings.__len__c                 C   s"   |t k rt| S | j|t   S d S r   )ÚcffStandardStringCountÚcffStandardStringsr6   )r;   r„  r   r   r   rM   ¨
  s    zIndexedStrings.__getitem__c                 C   sn   t | dƒs|  ¡  t|dd�}|tkr0t| }n:|| jkrF| j| }n$t| jƒt }| j |¡ || j|< |S )NÚstringMappingr¢   r£   )	rF   ÚbuildStringMappingr
   ÚcffStandardStringMappingr  r@   r6   r  rW   )r;   r   r„  r   r   r   r}  ®
  s    



zIndexedStrings.getSIDc                 C   s   | j S r   r«   rA   r   r   r   Ú
getStrings¼
  s    zIndexedStrings.getStringsc                 C   s2   i | _ tt| jƒƒD ]}|t | j | j| < qd S r   )r  rÎ   r@   r6   r  r  r   r   r   r  ¿
  s    z!IndexedStrings.buildStringMapping)N)r‚   rƒ   r„   r…   rˆ   rS   rB   rM   r}  r  r  r   r   r   r   r5   ˜
  s   
r5   ro  ÚspaceZexclamZquotedblZ
numbersignÚdollarÚpercentZ	ampersandZ
quoterightZ	parenleftZ
parenrightZasteriskÚplusÚcommaZhyphenZperiodÚslashÚzeroÚoneÚtwoÚthreeÚfourÚfiveÚsixÚsevenÚeightÚnineÚcolonÚ	semicolonÚlessÚequalZgreaterÚquestionÚatÚAr   ÚCÚDÚEÚFÚGÚHÚIÚJÚKÚLÚMÚNÚOÚPÚQÚRÚSÚTÚUÚVÚWÚXÚYÚZZbracketleftZ	backslashZbracketrightZasciicircumZ
underscoreZ	quoteleftÚaÚbÚcr"  ÚeÚfÚgÚhrç   ÚjÚkr*  rœ  rm  ÚoÚpÚqÚrr   ÚtÚurè  ÚwÚxÚyÚzZ	braceleftÚbarZ
bracerightZ
asciitildeZ
exclamdownÚcentZsterlingZfractionÚyenZflorinÚsectionÚcurrencyZquotesingleZquotedblleftZguillemotleftZguilsinglleftZguilsinglrightÚfiÚflZendashÚdaggerZ	daggerdblZperiodcenteredZ	paragraphZbulletZquotesinglbaseZquotedblbaseZquotedblrightZguillemotrightÚellipsisZperthousandZquestiondownZgraveÚacuteZ
circumflexÚtildeZmacronZbreveZ	dotaccentZdieresisÚringZcedillaZhungarumlautZogonekZcaronZemdashZAEZordfeminineZLslashÚOslashZOEZordmasculineZaeZdotlessiZlslashÚoslashZoeZ
germandblsZonesuperiorZ
logicalnotÚmuZ	trademarkZEthZonehalfZ	plusminusZThornZ
onequarterÚdivideZ	brokenbarZdegreeÚthornZthreequartersZtwosuperiorÚ
registeredÚminusÚethÚmultiplyZthreesuperiorÚ	copyrightÚAacuteZAcircumflexZ	AdieresisÚAgraveÚAringÚAtildeZCcedillaÚEacuteZEcircumflexZ	EdieresisÚEgraveÚIacuteZIcircumflexZ	IdieresisÚIgraveÚNtildeÚOacuteZOcircumflexZ	OdieresisÚOgraveÚOtildeÚScaronÚUacuteZUcircumflexZ	UdieresisÚUgraveÚYacuteZ	YdieresisZZcaronÚaacuteZacircumflexZ	adieresisÚagraveÚaringÚatildeZccedillaÚeacuteZecircumflexZ	edieresisÚegraveÚiacuteZicircumflexZ	idieresisÚigraveÚntildeÚoacuteZocircumflexZ	odieresisÚograveÚotildeÚscaronÚuacuteZucircumflexZ	udieresisÚugraveÚyacuteZ	ydieresisZzcaronZexclamsmallZHungarumlautsmallZdollaroldstyleZdollarsuperiorZampersandsmallZ
AcutesmallZparenleftsuperiorZparenrightsuperiorZtwodotenleaderZonedotenleaderZzerooldstyleZoneoldstyleZtwooldstyleZthreeoldstyleZfouroldstyleZfiveoldstyleZsixoldstyleZsevenoldstyleZeightoldstyleZnineoldstyleZcommasuperiorZthreequartersemdashZperiodsuperiorZquestionsmallZ	asuperiorZ	bsuperiorZcentsuperiorZ	dsuperiorZ	esuperiorZ	isuperiorZ	lsuperiorZ	msuperiorZ	nsuperiorZ	osuperiorZ	rsuperiorZ	ssuperiorZ	tsuperiorÚffÚffiÚfflZparenleftinferiorZparenrightinferiorZCircumflexsmallZhyphensuperiorZ
GravesmallZAsmallZBsmallZCsmallZDsmallZEsmallZFsmallZGsmallZHsmallZIsmallZJsmallZKsmallZLsmallZMsmallZNsmallZOsmallZPsmallZQsmallZRsmallZSsmallZTsmallZUsmallZVsmallZWsmallZXsmallZYsmallZZsmallZcolonmonetaryZ	onefittedZrupiahZ
TildesmallZexclamdownsmallZcentoldstyleZLslashsmallZScaronsmallZZcaronsmallZDieresissmallZ
BrevesmallZ
CaronsmallZDotaccentsmallZMacronsmallZ
figuredashZhypheninferiorZOgoneksmallZ	RingsmallZCedillasmallZquestiondownsmallZ	oneeighthZthreeeighthsZfiveeighthsZseveneighthsZonethirdZ	twothirdsZzerosuperiorZfoursuperiorZfivesuperiorZsixsuperiorZsevensuperiorZeightsuperiorZninesuperiorZzeroinferiorZoneinferiorZtwoinferiorZthreeinferiorZfourinferiorZfiveinferiorZsixinferiorZseveninferiorZeightinferiorZnineinferiorZcentinferiorZdollarinferiorZperiodinferiorZcommainferiorZAgravesmallZAacutesmallZAcircumflexsmallZAtildesmallZAdieresissmallZ
AringsmallZAEsmallZCcedillasmallZEgravesmallZEacutesmallZEcircumflexsmallZEdieresissmallZIgravesmallZIacutesmallZIcircumflexsmallZIdieresissmallZEthsmallZNtildesmallZOgravesmallZOacutesmallZOcircumflexsmallZOtildesmallZOdieresissmallZOEsmallZOslashsmallZUgravesmallZUacutesmallZUcircumflexsmallZUdieresissmallZYacutesmallZ
ThornsmallZYdieresissmallz001.000z001.001z001.002z001.003ZBlackZBoldZBookZLightZMediumZRegularZRomanZSemiboldi‡  éå   é¦   éW   )†r…   ZfontTools.miscr   r   ZfontTools.misc.arrayToolsr   r   ZfontTools.misc.textToolsr   r   r   r	   r
   r   ZfontTools.ttLibr   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.ttLib.tablesr   rö   Úior   r,   Úloggingr@  r�   Ú	getLoggerr‚   rŒ   r'   rþ  Úobjectr   rR   r�   r˜   rª   rŽ   r·   r»   rÀ   rÃ   r1   r9   rë   r3   rñ   ró   rÿ   rÅ   rÍ   rÌ   rË   r§   r¦   r¥   r  r  r   r'  r)  r+  r,  r-  r.  r5  r;  rC  rK  rL  rW  rX  r[  r_  r`  rc  rn  rz  r|  r~  rq  rr  rf  rg  rŠ  rŽ  r“  r”  r‹  rŒ  rž  rŸ  r¡  r£  r¥  r¦  r§  r¨  r«  rß  r  rQ  rë  râ  r  rÝ  ZDictDecompilerrÞ  rá  rã  rê  rö  rø  rý  rÿ  rn   rî   r\  r5   r  r  r@   r+   r  rÎ   Z_iri  rv  rj  rw  rk  rx  r   r   r   r   Ú<module>   s�   

  2L$)	Gk7#6@ ==%>
"!Û*ùûã"ûé '=-Kl:%1€ € € ù   € › i€ Ú *©Z