a
    ¥Q•hN¢ ã                (   @   sL  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®g d¯¢dfd°d±d²d®g d³¢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®g d¯¢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!ƒZxg dÿ¢Zy�d Zze{eyƒezk�sÂJ ‚i Z|e}ezƒD ]Z~e~e|eye~ < �qÎg �d¢Z�dZ€e{eƒe€k�sJ ‚g �d¢Z��dZ‚e{e�ƒe‚k�s&J ‚g �d¢Zƒ�dZ„e{eƒƒe„k�sHJ ‚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urL|r*dnd}| j|krhtd|| jf ƒ‚n| jdv s^J 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   úR/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/cffLib/__init__.pyÚ	<genexpr>b   ó    z'CFFFontSet.decompile.<locals>.<genexpr>©ÚisCFF2ú>HÚCFF2Font)ÚotFontr   ÚunpackÚcffHeaderFormatÚreadÚmajorÚ
ValueErrorÚ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   sb   t |dƒr| ¡ }nDt|tƒrP|}z| j |¡}W qX tyL   t|ƒ‚Y qX0 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ur8|rdnd}| j|krTtd|| jf ƒ‚n| jdv sJJ 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u �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+   Ú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*   Únewlinerb   r2   Úbegintagr
   ÚtoXMLÚendtagr:   )r;   Ú	xmlWriterÚfontNameÚfontr   r   r   rh   Ì   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u �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   rb   r   rc   r-   rO   r/   r:   r2   rL   )r:   Nr   rN   r%   )r:   r>   ÚVarStoreÚPrivatera   )r&   rF   r*   rb   r-   r/   r9   r:   r2   r3   r4   rX   ÚTopDictrP   r8   rG   rH   ÚfromXMLÚFDArrayÚvstorerm   rn   r   ÚT2CharStringÚint)r;   rL   ÚattrsÚcontentr&   rk   r[   r>   ÚelementÚfdArrayÚfontDictZsubrCharStringClassÚsubrr   r   r   rp   é   st    










ÿ




zCFFFontSet.fromXMLc                 C   s   ddl m} || |ƒ d S )Nr   )Ú_convertCFFToCFF2)Z	CFFToCFF2r{   )r;   r&   r{   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_   rh   rp   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 )	rS   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‡   rX   )r;   Útabler   r   r   rU   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�sNJ ‚d S )Nr   z CFFWriter.toFile() iteration: %dr   rW   ÚsetPosz#CFFWriter.toFile() writing to file.r$   éÿÿÿÿr   rZ   )ÚlogÚDEBUGr‡   rF   rW   rG   ÚTopDictIndexCompilerr#   r7   r@   r‹   rX   Útellr,   rV   ÚcalcOffSizer-   rZ   Úwrite)	r;   r<   ZlastPosListÚcountÚposZposListÚitemÚendPosÚbeginr   r   r   rZ   R  s@    




zCFFWriter.toFileN)rƒ   r„   r…   r†   r‰   rU   rZ   r   r   r   r   rS   G  s   rS   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 u r$t |dƒr$|j}|d us$J ‚|| _|  ||¡| _|| _d S ©Nr#   )rF   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   rW   )rœ   rF   rW   r@   rX   )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	countSizeÚ
lastOffsetr-   Ú
dataLengthr   r   r   rW   £  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„J ‚| 
|¡ q\| jD ]0}t|dƒr°| |¡ q–t|dd�}| 
|¡ q–d S )NrŒ   ú>lrZ   Úlatin1©Úencoding)r    r#   ÚwriteCard32r@   rœ   ÚwriteCard16r‘   Ú
writeCard8r,   rV   r’   rF   rZ   r	   )	r;   r<   rŸ   r-   rV   ÚoffsetÚ	binOffsetr•   r‡   r   r   r   rZ   ¹  s$    


zIndexCompiler.toFile)N)	rƒ   r„   r…   r†   r‰   r›   r    rW   rZ   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   ©rX   rT   ©r;   rœ   r6   Úoutr•   r   r   r   r›   Ù  s    zTopDictIndexCompiler.getItemsc                 C   s$   g }| j D ]}| | |¡¡ q
|S r   ©rœ   ÚextendrY   )r;   r6   r]   r[   r   r   r   rY   ß  s    
z TopDictIndexCompiler.getChildrenc                    s.   | j rd| jd  ¡ g}|S tt| ƒ ¡ S d S ©Nr   )r#   rœ   rW   Ú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œ   rW   r´   r�   )r;   r¢   rµ   r   r   rW   ì  s    z"TopDictIndexCompiler.getDataLengthc                    s,   | j r| jd  |¡ ntt| ƒ |¡ d S r³   )r#   rœ   rZ   r´   r�   ©r;   r<   rµ   r   r   rZ   ó  s    zTopDictIndexCompiler.toFile)
rƒ   r„   r…   r†   r›   rY   r    rW   rZ   Ú__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]   ry   r   r   r   rY     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~J ‚| 
|¡ qV| jD ]$}t|dƒrª| |¡ q�| 
|¡ q�d S )NrŒ   r£   rZ   )r    r#   r§   r@   rœ   r¨   r‘   r©   r,   rV   r’   rF   rZ   )r;   r<   rŸ   r-   rV   rª   r«   r•   r   r   r   rZ     s     


zFDArrayIndexCompiler.toFilec                 C   s   || j jd< d S )Nrq   ©r�   ÚrawDict©r;   r”   r–   r   r   r   r‹     s    zFDArrayIndexCompiler.setPosN)rƒ   r„   r…   r†   r›   rY   rZ   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#   rX   Ú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 u r$d S || _t td|| ¡ ¡ || _|rRt	|ƒ}nt
|ƒ}|dkrfd S d g| | _ t|ƒ}t td||¡ |dksžJ 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Ú	readCard8Úranger)   r,   r'   rX   rt   Ú
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 ur|S | j| | j }| j|d  | j|  }| j}| |¡ | |¡}t|ƒ|kshJ ‚|  ||||¡}|| j |< |S ©Nr   )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œ   rX   )r;   r•   r   r   r   rX   ‚  s    zIndex.appendc                 C   s   | j | |||d�S ©Nr"   ©ÚcompilerClass©r;   r6   r�   r#   r   r   r   rT   †  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Õ   rX   rT   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ÚfdSelectrx   )r;   r<   rÞ   rß   rà   rx   r#   rµ   r   r   r‰   ´  s    	zGlobalSubrsIndex.__init__c                 C   sn   | j d ur| j }nJt| dƒrX| jd urXt| dƒrF| jd urF| j| }nd}| j| j}nd }| j||| jd�S )Nrx   rà   r   ©rß   rÞ   )rß   rF   rx   rà   rn   Ú	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)Úcommentrf   rÐ   r@   ÚneedsDecompilationrg   rh   ri   )r;   rj   Úirz   r   r   r   rh   Ò  s    
ÿ

zGlobalSubrsIndex.toXMLc                 C   s0   |dkrd S |   ¡ }| |||¡ |  |¡ d S )Nrä   )râ   rp   rX   )r;   rL   ru   rv   rz   r   r   r   rp   ë  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   rs   râ   ÚcharStringClassr‰   rÕ   rh   rp   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 u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Ù   )ro   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@   rg   rf   rh   ri   ©r;   rj   ré   r   r   r   rh   /  s    
zTopDictIndex.toXML)NNr   N)
rƒ   r„   r…   r†   r�   rÛ   r‰   rÕ   rh   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   rh   ;  s    
zFDArrayIndex.toXMLc                 C   s*   t | j||| j| j| jd�}| |¡ |S ©N)r#   rr   )rð   r6   r:   rÌ   rr   r?   )r;   rI   r‡   r<   rª   ry   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   rp   rX   )r;   rL   ru   rv   ry   rw   r   r   r   rp   O  s    

zFDArrayIndex.fromXMLN)rƒ   r„   r…   r¹   rÛ   rh   rÕ   rp   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   rl   )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   Úotrm   rö   r?   rl   )r;   ÚlengthZglobalStateÚreaderr   r   r   r?   b  s    

zVarStoreData.decompilec                 C   s$   t ƒ }| j || j¡ | ¡ | _d S r   )r   rö   r_   rl   Ú
getAllDatar‡   )r;   r\   r   r   r   r_   r  s    zVarStoreData.compilec                 C   s   | j  || j¡ d S r   )rö   rh   rl   )r;   rj   rL   r   r   r   ÚwriteXMLy  s    zVarStoreData.writeXMLc                 C   sB   t  ¡ | _|D ].}t|tƒr|\}}}| j |||| j¡ qqd S r   )rø   rm   rö   rG   Útuplerp   rl   )r;   rL   ru   rv   r�   rw   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 u rd}| j j| }|j}|S r³   )rö   ÚVarDataÚVarRegionCount)r;   Ú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 ur˜t||
ƒD ]}|||< qŠ|
}t |ƒ}ql|d urÎt|ƒ}
t||
ƒD ]}|||< qÀ|| _n´| jdk�rxd g| }t|ƒ}d }d }t|ƒD ]>}	t|ƒ}
|d u�r4t||
ƒD ]}|||< �q$|
}t|ƒ}�q|d u�rpt|ƒ}
t||
ƒD ]}|||< �q`|| _nd�s˜J d| ƒ‚n|| _g | _d S )Nr   )Úarrayr   r   rO   Fzunsupported FDSelect format: %s)	rÏ   Úformatr  r)   ÚtolistÚgidArrayrÎ   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	  rX   )r;   r  r   r   r   rX   Í  s    zFDSelect.append)NNN)rƒ   r„   r…   r‰   rB   rM   rØ   rX   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 urZt||||||d�| _i  | _}	tt|ƒƒD ]}
|
|	||
 < q@d| _n.i | _d| _|| _|d urz|| _	|d urˆ|| _
d S )Nr"   r   r   )rÞ   ÚvarStorerí   ÚcharStringsIndexÚcharStringsrÐ   r@   ÚcharStringsAreIndexedrß   rà   rx   )r;   r<   rP   rÞ   rß   rà   rx   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 v 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 )Nrx   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 u 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è   rg   rf   rh   ri   )r;   rj   ÚnamesrL   ZcharStrr  rå   r   r   r   rh   .  s     þ

zCharStrings.toXMLc           
   	   C   s¸   |D ]®}t |tƒrq|\}}}|dkr(qd}t| dƒrlzt|d ƒ}W n ty\   d}Y n0 | j| j}n| j}|d }tj	}||| j
d�}	|	 |||¡ |dkrª||	_|	| |< qd S )Nrä   rŒ   rx   r  r   rL   rá   )rG   rH   rF   r   rJ   rx   rn   rß   r   rs   rÞ   rp   r  )
r;   rL   ru   rv   rw   ZfdIDrß   Ú	glyphNamerì   r  r   r   r   rp   B  s*    



zCharStrings.fromXML)NN)rƒ   r„   r…   r†   r‰   rC   rD   r  Ú__contains__rB   rM   rØ   rë   rh   rp   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<   ra   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,   rV   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,   rV   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   )rX   )rŠ   Úlr)  rL   r*  r+  r,  r   r   r   Ú
buildOrder”  s    r1  c                 C   s,   i }| D ]\}}}}}|d ur|||< q|S r   r   r'  r   r   r   ÚbuildDefaults›  s
    
r2  c                 C   s$   i }| D ]\}}}}}|||< q|S r   r   r'  r   r   r   ÚbuildConverters£  s    
r3  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   sN   t |dƒs|  ||¡S |j}| ¡ }z|  ||¡W | |¡ S | |¡ 0 d S )Nr<   )rF   Ú_readr<   r�   r.   )r;   r�   ra   r<   r”   r   r   r   r)   «  s    

þzSimpleConverter.readc                 C   s   |S r   r   ©r;   r�   ra   r   r   r   r5  µ  s    zSimpleConverter._readc                 C   s   |S r   r   r6  r   r   r   r’   ¸  s    zSimpleConverter.writec                 C   s   |j ||d� | ¡  d S )Nr`   )re   rf   ©r;   rj   rL   ra   r   r   r   ÚxmlWrite»  s    zSimpleConverter.xmlWritec                 C   s   |d S ©Nra   r   ©r;   rL   ru   rv   r�   r   r   r   rþ   ¿  s    zSimpleConverter.xmlReadN)rƒ   r„   r…   r)   r5  r’   r8  rþ   r   r   r   r   r4  ª  s
   
r4  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   r6  r   r   r   r5  Ä  s    zASCIIConverter._readc                 C   s   t |dd�S r<  ©r	   r6  r   r   r   r’   Ç  s    zASCIIConverter.writec                 C   s"   |j |t|dd�d� | ¡  d S )Nr=  r¥   r`   ©re   r
   rf   r7  r   r   r   r8  Ê  s    zASCIIConverter.xmlWritec                 C   s   t |d dd�S )Nra   r=  r¥   r>  r:  r   r   r   rþ   Î  s    zASCIIConverter.xmlReadN©rƒ   r„   r…   r5  r’   r8  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 )
ÚLatin1Converterc                 C   s   t |dd�S ©Nr¤   r¥   r   r6  r   r   r   r5  Ó  s    zLatin1Converter._readc                 C   s   t |dd�S rB  r>  r6  r   r   r   r’   Ö  s    zLatin1Converter.writec                 C   s<   t |dd�}|dv r"t dd|¡}|j||d� | ¡  d S )Nr¤   r¥   )ÚNoticeÚ	Copyrightz	[\r\n]\s+ú r`   )r
   ÚreÚsubre   rf   r7  r   r   r   r8  Ù  s
    zLatin1Converter.xmlWritec                 C   s   t |d dd�S )Nra   r¤   r¥   r>  r:  r   r   r   rþ   à  s    zLatin1Converter.xmlReadNr@  r   r   r   r   rA  Ò  s   rA  c                 C   s&   zt | ƒ}W n   t| ƒ}Y n0 |S r   )rt   Úfloat)r   ra   r   r   r   ÚparseNumä  s
    rI  c                 C   s`   g }| D ]>}t |tƒrq|\}}}|d  ¡ }dd„ |D ƒ}| |¡ qt|ƒdkr\|d }|S )Nra   c                 S   s   g | ]}t |ƒ‘qS r   )Úeval©r   Úvalr   r   r   Ú
<listcomp>ó  r!   z"parseBlendList.<locals>.<listcomp>r   r   )rG   rH   ÚsplitrX   r@   )r   Ú	valueListrw   rL   ru   rv   Ú	blendListr   r   r   ÚparseBlendListì  s    

rQ  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 )NrE  c                 S   s   g | ]}t |ƒ‘qS r   ©rH   rK  r   r   r   rM     r!   z,NumberConverter.xmlWrite.<locals>.<listcomp>r`   ©
rG   r0   rg   rf   ÚindentÚjoinre   ÚkBlendDictOpNameÚdedentri   )r;   rj   rL   ra   Ú
blendValuer   r   r   r8  û  s    



zNumberConverter.xmlWritec                 C   s.   |  dd ¡}|d u rt|ƒ}nt|d ƒ}|S r9  )ÚgetrQ  rI  )r;   rL   ru   rv   r�   ÚvalueStringra   r   r   r   rþ   
  s
    
zNumberConverter.xmlReadN©rƒ   r„   r…   r8  rþ   r   r   r   r   rR  ú  s   rR  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   rE  c                 S   s   g | ]}t |ƒ‘qS r   rS  rK  r   r   r   rM    r!   z+ArrayConverter.xmlWrite.<locals>.<listcomp>r`   c                 S   s   g | ]}t |ƒ‘qS r   rS  rK  r   r   r   rM  !  r!   rT  )r;   rj   rL   ra   rO  rY  r   r   r   r8    s    



zArrayConverter.xmlWritec                 C   s8   |  dd ¡}|d u rt|ƒ}n| ¡ }dd„ |D ƒ}|S )Nra   c                 S   s   g | ]}t |ƒ‘qS r   )rI  )r   ra   r   r   r   rM  +  r!   z*ArrayConverter.xmlRead.<locals>.<listcomp>)rZ  rQ  rN  )r;   rL   ru   rv   r�   r[  rO  rD   r   r   r   rþ   %  s    
zArrayConverter.xmlReadNr\  r   r   r   r   r]    s   r]  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTableConverterc                 C   s2   |  |¡ | ¡  | |¡ | |¡ | ¡  d S r   )rg   rf   rh   ri   r7  r   r   r   r8  0  s
    


zTableConverter.xmlWritec                 C   s<   |   ¡ ƒ }|D ](}t|tƒrq|\}}}| |||¡ q|S r   )ÚgetClassrG   rH   rp   )r;   rL   ru   rv   r�   Úobrw   r   r   r   rþ   7  s    


zTableConverter.xmlReadNr\  r   r   r   r   r^  /  s   r^  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   r_  B  s    zPrivateDictConverter.getClassc           
      C   s|   |\}}|j }|j}z
|j}W n ty4   d }Y n0 t|j||||d�}| |¡ | |¡}	t|	ƒ|ksnJ ‚| 	|	¡ |S rô   )
r<   rÌ   rr   ÚAttributeErrorrb  r6   r.   r)   r@   r?   )
r;   r�   ra   rÖ   rª   r<   r#   rr   Zprivr‡   r   r   r   r5  E  s    




zPrivateDictConverter._readc                 C   s   dS )N)r   r   r   r6  r   r   r   r’   T  s    zPrivateDictConverter.writeN©rƒ   r„   r…   r_  r5  r’   r   r   r   r   ra  A  s   ra  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   r_  Y  s    zSubrsConverter.getClassc                 C   s(   |j }|j}| |j| ¡ t||d�S rÙ   )r<   rÌ   r.   rª   rí   )r;   r�   ra   r<   r#   r   r   r   r5  \  s    zSubrsConverter._readc                 C   s   dS r³   r   r6  r   r   r   r’   b  s    zSubrsConverter.writeNrd  r   r   r   r   re  X  s   re  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 )Nrm   rq   r  )NN)r#   r  )r<   rÌ   rP   Úgetattrr:   rF   rq   r  rn   r.   rÇ   )r;   r�   ra   r<   r#   rP   r  rÞ   rx   rà   rß   r  r   r   r   r5  g  s2    


ø
zCharStringsConverter._readc                 C   s   dS r³   r   r6  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 )Nrq   r  rm   )r  )rF   rq   r  rn   rÇ   r:   rg  rp   )	r;   rL   ru   rv   r�   rx   rà   rß   r  r   r   r   rþ   ‡  s$    


ù	zCharStringsConverter.xmlReadN©rƒ   r„   r…   r5  r’   rþ   r   r   r   r   rf  f  s   rf  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’J ‚t td| ¡ ¡ i }g }	|D ]`}
|
|v rþ||
 }|
d t|ƒ |v râ|d7 }qÄ|d ||
< |
d t|ƒ }
d||
< |	 |
¡ q°|	}nT|�s*d|jv�r>|dk�s8J ‚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�   rH   rX   r»   ÚcffISOAdobeStringsÚcffIExpertStringsÚcffExpertSubsetStrings)r;   r�   ra   ÚisCIDr
  r<   r  rP   ZallNamesZ
newCharsetr  Únr   r   r   r5  ¤  sL    






zCharsetConverter._readc                 C   s   dS r³   r   r6  r   r   r   r’   Ò  s    zCharsetConverter.writec                 C   s   |  d¡ | ¡  d S )Nz8charset is dumped separately as the 'GlyphOrder' element)rç   rf   r7  r   r   r   r8  Õ  s    
zCharsetConverter.xmlWritec                 C   s   d S r   r   r:  r   r   r   rþ   Ü  s    zCharsetConverter.xmlReadNr@  r   r   r   r   ri  £  s   .ri  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J ‚t |jdƒ}t|||ƒ}t|||ƒ}t|ƒt|ƒk rL|| _n|| _|| _d S )Nr   ú.notdefrj  )rF   ÚdictObjÚpackCharset0ÚpackCharsetr@   r‡   r�   )r;   r6   rP   r�   rr  Ú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   rW   ï  s    zCharsetCompiler.getDataLengthc                 C   s   |  | j¡ d S r   ©r’   r‡   r·   r   r   r   rZ   ò  s    zCharsetCompiler.toFileN©rƒ   r„   r…   r‰   r‹   rW   rZ   r   r   r   r   rt  à  s   rt  c                 C   s|   d }t tdfttdfttdfg}t| ƒ}|D ]J\}}}|d urB qx||krLq,|}t|ƒD ]}| | || krXd } q,qXq,|S )Nr   r   r   )ÚcffISOAdobeStringCountro  ÚcffExpertStringCountrp  ÚcffExpertSubsetStringCountrq  r@   rÐ   )rP   ZpredefinedCharSetValZpredefinedCharSetsZlcsÚcntZpcsÚcsvré   r   r   r   ÚgetStdCharSetö  s"    ýr�  c                 C   s   t | dd … ƒS )Nr   )rt   ©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…  rX   r%  r   )rP   rr  r6   Úfmtr‡   Ú	getNameIDrL   r   r   r   rw    s    
rw  c                 C   sì   d}g }d }d}|rt }nt}| dd … D ]R}|||ƒ}	|d u 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…  rX   r#  r%  r   )rP   rr  r6   r†  Úrangesr  Úendr‡  rL   ÚSIDÚnLeftr‡   Ú	nLeftFuncr   r   r   rx  !  s<    

rx  c                 C   sj   dg}|r>t | d ƒD ]$}t|ƒ}| dt|ƒ d¡ ¡ qn(t | d ƒD ]}t|ƒ}| || ¡ qJ|S ©Nru  r   ÚcidrN   )rÐ   rÎ   rX   rH   Úzfill)r
  r<   r6   rr  rP   ré   ÚCIDr‹  r   r   r   rl  F  s    rl  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Ð   rX   rH   r�  )r
  r<   r6   rr  r†  rP   r“   r�  r  rŒ  r‘  r‹  r   r   r   rm  S  s    rm  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J ‚t|jj||jƒ}t|jj||jƒ}t|ƒt|ƒk rJ|| _n|| _|| _	d S r   )
rG   rH   ÚpackEncoding0rv  rP   r6   ÚpackEncoding1r@   r‡   r�   )r;   r6   r¦   r�   ry  Ú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   rW   u  s    zEncodingCompiler.getDataLengthc                 C   s   |  | j¡ d S r   rz  r·   r   r   r   rZ   x  s    zEncodingCompiler.toFileNr{  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$J ‚|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Ï   rn  ÚparseEncoding0rP   r6   ÚparseEncoding1)r;   r�   ra   r<   r†  ÚhaveSupplementr¦   r   r   r   r5  }  s,    
ÿÿzEncodingConverter._readc                 C   s   |dkrdS |dkrdS dS )Nr˜  r   r™  r   r   r6  r   r   r   r’   –  s
    zEncodingConverter.writec                 C   sˆ   |dv r"|j ||d� | ¡  d S | |¡ | ¡  tt|ƒƒD ]0}|| }|dkr@|j dt|ƒ|d� | ¡  q@| |¡ | ¡  d S )N)r˜  r™  rd   ru  Úmap)ÚcoderL   )re   rf   rg   rÐ   r@   Úhexri   )r;   rj   rL   ra   r   r  r   r   r   r8  �  s    


zEncodingConverter.xmlWritec           	      C   sZ   d|v r|d S dgd }|D ]6}t |tƒr.q|\}}}t|d ƒ}|d }|||< q|S )NrL   ru  r˜   r   )rG   rH   r   )	r;   rL   ru   rv   r�   r¦   rw   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 )Nru  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 )Nru  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 u rv| ¡  q\t|ƒtt|ƒƒg}|D ]}|d u ržd}| t|ƒ¡ qŽt|ƒS )Nr   ru  r   rŒ   ©rÐ   r@   rZ  rX   Ú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 u 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   ru  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y    d }Y n0 |j}|j}| |¡ t||d�}||_|j|_|j|_|S rÙ   )	rm   rc  r<   rÌ   r.   ró   rr   r6   r:   )r;   r�   ra   rr   r<   r#   rx   r   r   r   r5    s    


zFDArrayConverter._readc                 C   s   dS r³   r   r6  r   r   r   r’     s    zFDArrayConverter.writec                 C   s8   t ƒ }|D ](}t|tƒrq
|\}}}| |||¡ q
|S r   )ró   rG   rH   rp   )r;   rL   ru   rv   r�   rx   rw   r   r   r   rþ     s    

zFDArrayConverter.xmlReadNrh  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�   ra   r<   rà   r   r   r   r5  (  s    
zFDSelectConverter._readc                 C   s   dS r³   r   r6  r   r   r   r’   .  s    zFDSelectConverter.writec                 C   s    |  |d|jfg¡ | ¡  d S ©Nr  )re   r  rf   r7  r   r   r   r8  3  s    zFDSelectConverter.xmlWritec           	      C   s$   t |d ƒ}d }d }t|||ƒ}|S r©  )r   r  )	r;   rL   ru   rv   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�   ra   r<   r  r   r   r   r5  @  s
    
zVarStoreConverter._readc                 C   s   dS r³   r   r6  r   r   r   r’   G  s    zVarStoreConverter.writec                 C   s   |  ||¡ d S r   )rü   r7  r   r   r   r8  J  s    zVarStoreConverter.xmlWritec                 C   s   t ƒ }| ||||¡ |S r   )rõ   rþ   )r;   rL   ru   rv   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#  rX   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Ð   rX   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Ð   rX   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«  ry  Ú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   rW   Ÿ  s    zFDSelectCompiler.getDataLengthc                 C   s   |  | j¡ d S r   rz  r·   r   r   r   rZ   ¢  s    zFDSelectCompiler.toFileNr{  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 )Nrm   rº   r¼   r   r   r   r‹   ¯  s    zVarStoreCompiler.setPosc                 C   s
   t | jƒS r   rÿ   rA   r   r   r   rW   ²  s    zVarStoreCompiler.getDataLengthc                 C   s   |  | j¡ d S r   rz  r·   r   r   r   rZ   µ  s    zVarStoreCompiler.toFileNr{  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 ©NÚRegistryÚOrderÚ
Supplementr?  )r;   rj   rL   ra   ÚregistryÚorderZ
supplementr   r   r   r8  º  s    


ýþzROSConverter.xmlWritec                 C   s   |d |d t |d ƒfS r¶  )r   r:  r   r   r   rþ   Æ  s    zROSConverter.xmlReadNr\  r   r   r   r   rµ  ¹  s   rµ  )é   ZmaxstackÚnumberNN)é   é   rj  )r‹  r‹  r½  ))r¾  é   ZSyntheticBaser½  NN)r   Úversionr‹  NNrC  r‹  )r¾  r   rD  r   ZFullName)r¾  é&   ÚFontNamer   Ú
FamilyName)rO   ÚWeightr‹  NN))r¾  r   ZisFixedPitchr½  r   N))r¾  r   Ú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  )çü©ñÒMbP?r   r   rË  r   r   )é   ZUniqueIDr½  NNrN   ÚFontBBox)r   r   r   r   ))r¾  é   ZStrokeWidthr½  r   N)é   ZXUIDr  NN))r¾  é   Z
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–  é   rn   )r½  r½  )r¾  é%   )r¾  é$   rq   é   é   rm   ÚblendrÒ  )rÑ  Úvsindexr½  NNrP  )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 ur,q|dv r<tƒ }n6|dkrLtƒ }n&|dkr\tƒ }n|dkrjd }ndsrJ ‚|||||f| |< qd S )N)rÓ  r  r½  r‹  rP  F)rÐ   r@   r]  rR  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J ‚|d u r6t|dƒr6|j}|d us6J ‚|| _|| _|| _|| _i }|jD ]J}t||d ƒ}|d u rrqX|j	| }| 
||¡}||j |¡kršqX|||< qX|| _d S rš   )rG   r5   rF   r#   rv  r6   r�   r»  rg  Ú
convertersr’   ÚdefaultsrZ  r»   )	r;   rv  r6   r�   r#   r»   rL   ra   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 )NrW   )r@   r_   rA   r   r   r   rW   w  s    zDictCompiler.getDataLengthc                 C   sâ   t   td| jj|¡ | j}g }| jjD ]®}| |¡}|d u r>q&| j| \}}t	|t
ƒr®t|ƒ}t|ƒ|ksrJ dƒ‚t|ƒD ]0}	||	 }
||	 }t| d|
 ƒ}| ||ƒ¡ qznt| d| ƒ}| ||ƒ¡ | |¡ q&t|ƒ}|S )Nz-- compiling %s for %szvalue doesn't match arg typeÚarg_)r�   rŽ   r¶   rƒ   r»   rv  r»  rZ  ÚopcodesrG   rý   r@   rÐ   rg  rX   r   )r;   Úreasonr»   r‡   rL   ra   r)  ÚargTyper0  ré   r*  ÚvÚ
arghandlerr   r   r   r_   z  s*    

zDictCompiler.compilec                 C   s   |   d¡}| |¡ d S )NrZ   )r_   r’   )r;   r<   r‡   r   r   r   rZ   ’  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   ©ÚencodeNumberrK  r   r   r   rM  ˜  r!   z+DictCompiler.arg_number.<locals>.<listcomp>r   )rG   r0   rX   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   )rX   rÿ  r   )r;   ra   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 )Nr!   r   )rG   r0   Úarg_delta_blendrX   rü  r   )r;   ra   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û  rK  r   r   r   rM  û  r!   z0DictCompiler.arg_delta_blend.<locals>.<listcomp>)
r@   ÚmaxBlendStackrt   r³  r  r²   rX   rü  r   rý  )r;   ra   Ú
numMastersÚ	numBlendsZnumStackZnumBlendValuesr°   ZnumValZvalListZout1Z	firstListZ	deltaListré   ÚprevValÚdefaultValueZrelValueListrP  r   r   r   r  º  s<    





zDictCompiler.arg_delta_blend)N)rƒ   r„   r…   r  r‰   r‹   rW   r_   rZ   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   rH  r   Ú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 u r¬t| jdƒrr| jjrrt| jdƒr<d }nt| jjƒ}|d u 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   rj  r–  rm   r  r   rÇ   r"   rq   rn   )r#   rv  r>   rF   rP   r�  rX   rt  r»   r–  rG   rH   r’  rm   r²  r  r@   rÇ   r  r°  rÅ   rq   rT   r²   rY   rn   )r;   r6   r#   r]   ZcharsetCoder¦   r´  ZvarStoreComprà   r  rL   ZfdSelectComprœ   ZcharStringsCompZfdArrayIndexCompÚprivCompr   r   r   rY   	  sX    ÿ








zTopDictCompiler.getChildrenN)rƒ   r„   r…   r/  rî  rö  rY   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v rT| 	|¡ q:|j
 |¡}|d u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: rE  )r´   r  r‰   rv  r  Úsetró  r»  r»   rX   rô  rZ  r)   rg  r�   ÚwarningrV  )	r;   rv  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 ©Nrn   )rF   rv  rn   rT   rX   r²   rY   )r;   r6   r]   r  r   r   r   rY   i	  s    
zFontDictCompiler.getChildren)N)	rƒ   r„   r…   r/  rî  rö  r‰   rY   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   rv  rX   rÄ   rT   )r;   r6   r]   r   r   r   rY   {	  s    zPrivateDictCompiler.getChildrenN)
rƒ   r„   r…   ÚmaxStackLimitr  r/  rñ  rö  r‹   rY   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 u |d u ksJ ‚i | _ g | _|| _|d u r2d S || _|| _|d ur`t td| jj|¡ || _	d S )NrÈ   )
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?   Ú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   rT   š	  s    zBaseDict.getCompilerc                 C   sˆ   |d d… |dd …   kr$dkr0n nt |ƒ‚| j |d ¡}|d u rR| j |¡}|d u rbt |ƒ‚| j| }| | |¡}t| ||ƒ |S )Nr   éþÿÿÿÚ__)rc  r»   rZ  rô  ró  r)   Úsetattr)r;   rL   ra   r,  r   r   r   Ú__getattr__�	  s    (
zBaseDict.__getattr__c                 C   sŠ   | j D ]F}|| jv rqt| |d ƒ}|d u r4|dkr4q| j| }| |||¡ qt| jƒt| j ƒ }|r†| dd t	|ƒ¡ ¡ | 
¡  d S )NrP   zsome keys were ignored: %srE  )r»  r  rg  ró  r8  r  r»   rç   rV  r  rf   )r;   rj   rL   ra   r,  r  r   r   r   rh   ®	  s    



ÿzBaseDict.toXMLc                 C   s*   | j | }| |||| ¡}t| ||ƒ d S r   )ró  rþ   r  )r;   rL   ru   rv   r,  ra   r   r   r   rp   Ç	  s    
zBaseDict.fromXML)NNNN)N)
rƒ   r„   r…   r‰   r?   r  rT   r  rh   rp   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 )ro   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´   ro   r‰   r>   r:   r2  ÚtopDictOperators2rô  rP   r1  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 u rd S | j |¡ | jr8t| jƒ| _nt| jƒ| _d S rÆ   )r»   rZ  r<   r.   rÌ   rÍ   r
  rÎ   )r;   rª   r   r   r   r  
  s    zTopDict.postDecompilec                 C   sR   t | dƒr|  ¡  t | dƒr$dg| _t | dƒr8t | dƒsBg d¢| _t | |¡ d S )NrÇ   rj  r–  )rÕ  r×  rÙ  rÛ  )rF   ÚdecompileAllCharStringsr  r  rh   )r;   rj   r   r   r   rh   
  s    


zTopDict.toXMLc                 C   sD   t | j ¡ ƒD ]0\}}z| ¡  W q   t d|¡ ‚ Y q0 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 ur|d ur:t||ƒ}q|}q|d u r^| jd d d … | _ntt|ƒƒ| _d S )NrÍ  )rÇ   rD   Ú
calcBoundsr   rô  rÍ  r0   r   )r;   ZfontBBoxr  Úboundsr   r   r   rR   )
  s    zTopDict.recalcFontBBox)NNNNNN)rƒ   r„   r…   r†   r2  rî  rô  r3  ró  r  rÛ   r1  r»  rí  r  r‰   r8   r  rh   r   rR   r¸   r   r   rµ   r   ro   Í	  s$         ù	ro   c                       sH   e Zd Zi ZeeƒZeZg d¢Z	dgZ
eZd‡ fdd„	Zdd„ Z‡  ZS )	rð   )rÃ  rÊ  rÅ  rn   rn   Nc                    s,   t t| ƒj||||d� || _|  |¡ d S rÙ   )r´   rð   r‰   rr   ÚsetCFF2)r;   r6   r<   rª   r:   r#   rr   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ô  r3  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 )
rb  Nc                    sh   t t| ƒj||||d� || _|rJttƒ| _ttƒ| _d  | _	| _
d| _nttƒ| _ttƒ| _d| _d S )Nr"   TF)r´   rb  r‰   rr   r2  ÚprivateDictOperators2rô  r1  r»  rë  rê  rÌ   rñ  )r;   r6   r<   rª   r#   rr   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 u rt | dƒr| j}nd}| j |¡}|S )Nrå  r   )rF   rå  rr   r  )r;   Úvir  r   r   r   r  �
  s    
zPrivateDict.getNumRegions)NNNNN)N)rƒ   r„   r…   r2  rñ  rô  r3  ró  r1  r»  rð  r  r  rÛ   r‰   Úpropertyr)  r  r¸   r   r   rµ   r   rb  s
  s   
rb  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 u 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   rM  Ÿ
  r!   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   rT   ¢
  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v r0t| }n:|| jv rF| j| }n$t| jƒt }| j |¡ || j|< |S )NÚstringMappingr¤   r¥   )	rF   ÚbuildStringMappingr
   ÚcffStandardStringMappingr.  r@   r6   r,  rX   )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‰   rT   rB   rM   r„  r1  r/  r   r   r   r   r5   ˜
  s   
r5   (‡  ru  ÚspaceÚexclamÚquotedblÚ
numbersignÚdollarÚpercentÚ	ampersandÚ
quoterightÚ	parenleftÚ
parenrightÚasteriskÚplusÚcommaÚhyphenÚperiodÚslashÚzeroÚoneÚtwoÚthreeÚfourÚfiveÚsixÚsevenÚeightÚnineÚcolonÚ	semicolonÚlessÚequalÚ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ÚZÚbracketleftÚ	backslashÚbracketrightÚasciicircumÚ
underscoreÚ	quoteleftÚaÚbÚcr(  ÚeÚfÚgÚhré   ÚjÚkr0  r¥  rs  ÚoÚpÚqÚrr   ÚtÚurù  ÚwÚxÚyÚzÚ	braceleftÚbarÚ
bracerightÚ
asciitildeÚ
exclamdownÚcentÚsterlingÚfractionÚyenÚflorinÚsectionÚcurrencyÚquotesingleÚquotedblleftÚguillemotleftÚguilsinglleftÚguilsinglrightÚfiÚflÚendashÚdaggerÚ	daggerdblÚperiodcenteredÚ	paragraphÚbulletÚquotesinglbaseÚquotedblbaseÚquotedblrightÚguillemotrightÚellipsisÚperthousandÚquestiondownÚgraveÚacuteÚ
circumflexÚtildeÚmacronÚbreveÚ	dotaccentÚdieresisÚringÚcedillaÚhungarumlautÚogonekÚcaronÚemdashÚAEÚordfeminineÚLslashÚOslashÚOEÚordmasculineÚaeÚdotlessiÚlslashÚoslashÚoeÚ
germandblsÚonesuperiorÚ
logicalnotÚmuÚ	trademarkÚEthÚonehalfÚ	plusminusÚThornÚ
onequarterÚdivideÚ	brokenbarÚdegreeÚthornÚthreequartersÚtwosuperiorÚ
registeredÚminusÚethÚmultiplyÚthreesuperiorÚ	copyrightÚAacuteÚAcircumflexÚ	AdieresisÚAgraveÚAringÚAtildeÚCcedillaÚEacuteÚEcircumflexÚ	EdieresisÚEgraveÚIacuteÚIcircumflexÚ	IdieresisÚIgraveÚNtildeÚOacuteÚOcircumflexÚ	OdieresisÚOgraveÚOtildeÚScaronÚUacuteÚUcircumflexÚ	UdieresisÚUgraveÚYacuteÚ	YdieresisÚZcaronÚaacuteÚacircumflexÚ	adieresisÚagraveÚaringÚatildeÚccedillaÚeacuteÚecircumflexÚ	edieresisÚegraveÚiacuteÚicircumflexÚ	idieresisÚigraveÚntildeÚoacuteÚocircumflexÚ	odieresisÚograveÚotildeÚscaronÚuacuteÚucircumflexÚ	udieresisÚugraveÚyacuteÚ	ydieresisÚzcaronÚexclamsmallÚHungarumlautsmallÚdollaroldstyleÚdollarsuperiorÚampersandsmallÚ
AcutesmallÚparenleftsuperiorÚparenrightsuperiorÚtwodotenleaderÚonedotenleaderÚzerooldstyleÚoneoldstyleÚtwooldstyleÚthreeoldstyleÚfouroldstyleÚfiveoldstyleÚsixoldstyleÚsevenoldstyleÚeightoldstyleÚnineoldstyleÚcommasuperiorÚthreequartersemdashÚperiodsuperiorÚquestionsmallÚ	asuperiorÚ	bsuperiorÚcentsuperiorÚ	dsuperiorÚ	esuperiorÚ	isuperiorÚ	lsuperiorÚ	msuperiorÚ	nsuperiorÚ	osuperiorÚ	rsuperiorÚ	ssuperiorÚ	tsuperiorÚffÚffiÚfflÚparenleftinferiorÚparenrightinferiorÚCircumflexsmallÚhyphensuperiorÚ
GravesmallÚAsmallÚBsmallÚCsmallÚDsmallÚEsmallÚFsmallÚGsmallÚHsmallÚIsmallÚJsmallÚKsmallÚLsmallÚMsmallÚNsmallÚOsmallÚPsmallÚQsmallÚRsmallÚSsmallÚTsmallÚUsmallÚVsmallÚWsmallÚXsmallÚYsmallÚZsmallÚcolonmonetaryÚ	onefittedÚrupiahÚ
TildesmallÚexclamdownsmallÚcentoldstyleÚLslashsmallÚScaronsmallÚZcaronsmallÚDieresissmallÚ
BrevesmallÚ
CaronsmallÚDotaccentsmallÚMacronsmallÚ
figuredashÚhypheninferiorÚOgoneksmallÚ	RingsmallÚCedillasmallÚquestiondownsmallÚ	oneeighthÚthreeeighthsÚfiveeighthsÚseveneighthsÚonethirdÚ	twothirdsÚzerosuperiorÚfoursuperiorÚfivesuperiorÚsixsuperiorÚsevensuperiorÚeightsuperiorÚninesuperiorÚzeroinferiorÚoneinferiorÚtwoinferiorÚthreeinferiorÚfourinferiorÚfiveinferiorÚsixinferiorÚseveninferiorÚeightinferiorÚnineinferiorÚcentinferiorÚdollarinferiorÚperiodinferiorÚcommainferiorÚAgravesmallÚAacutesmallÚAcircumflexsmallÚAtildesmallÚAdieresissmallÚ
AringsmallÚAEsmallÚCcedillasmallÚEgravesmallÚEacutesmallÚEcircumflexsmallÚEdieresissmallÚIgravesmallÚIacutesmallÚIcircumflexsmallÚIdieresissmallÚEthsmallÚNtildesmallÚOgravesmallÚOacutesmallÚOcircumflexsmallÚOtildesmallÚOdieresissmallÚOEsmallÚOslashsmallÚUgravesmallÚUacutesmallÚUcircumflexsmallÚUdieresissmallÚYacutesmallÚ
ThornsmallÚYdieresissmallz001.000z001.001z001.002z001.003ZBlackÚBoldZBookZLightZMediumÚRegularZRomanZSemiboldi‡  )åru  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  r   rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  r(  ru  rv  rw  rx  ré   ry  rz  r0  r¥  rs  r{  r|  r}  r~  r   r  r€  rù  r�  r‚  rƒ  r„  r…  r†  r‡  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  r�  r�  r‘  r’  r“  r”  r•  r–  r—  r˜  r™  rš  r›  rœ  r�  rž  rŸ  r   r¡  r¢  r£  r¤  r¥  r¦  r§  r¨  r©  rª  r«  r¬  r­  r®  r¯  r°  r±  r²  r³  r´  rµ  r¶  r·  r¸  r¹  rº  r»  r¼  r½  r¾  r¿  rÀ  rÁ  rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÎ  rÏ  rÐ  rÑ  rÒ  rÓ  rÔ  rÕ  rÖ  r×  rØ  rÙ  rÚ  rÛ  rÜ  rÝ  rÞ  rß  rà  rá  râ  rã  rä  rå  ræ  rç  rè  ré  rê  rë  rì  rí  rî  rï  rð  rñ  rò  ró  rô  rõ  rö  r÷  rø  rù  rú  rû  rü  rý  rþ  rÿ  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  éå   )¦ru  r2  r  r  r  r  r  r  r  r  r  r  r>  r?  r@  rŒ  r  r  r  r  r  r  r  r  r   r!  rL  rM  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r–  r—  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rÇ  rÄ  rÌ  rh  ri  rj  rk  rl  rm  rn  ro  r¿  rÍ  rÒ  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r€  r�  r‚  rƒ  r„  r…  r†  r‡  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  r�  r�  r‘  r’  r“  r”  r•  r–  r—  r˜  r™  rš  r›  rœ  r�  rž  rŸ  r   r¡  r¢  r£  é¦   )Wru  r2  r  r  r  r  r  r  r>  r?  r@  rŒ  r  r  r  r  r  r  r  r  r   r!  rL  rM  r"  r#  r$  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r–  r—  r4  r5  r6  r7  r9  rU  rV  rW  rZ  rc  rd  rÇ  rÄ  rÌ  ri  rj  rk  rl  rm  rn  ro  r¿  rÍ  rÒ  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r€  r�  r‚  rƒ  éW   )…r†   ÚfontTools.miscr   r   ÚfontTools.misc.arrayToolsr   r   ÚfontTools.misc.textToolsr   r   r   r	   r
   r   ÚfontTools.ttLibr   ÚfontTools.ttLib.tables.otBaser   r   ÚfontTools.ttLib.tablesr   rø   Úior   r,   ÚloggingrF  rŽ   Ú	getLoggerrƒ   r�   r(   r  Úobjectr   rS   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/  r1  r2  r3  r4  r;  rA  rI  rQ  rR  r]  r^  ra  re  rf  ri  rt  r�  rƒ  r…  rw  rx  rl  rm  r’  r—  rœ  r�  r“  r”  r§  r¨  rª  r¬  r®  r¯  r°  r²  rµ  rî  r  rW  rý  rñ  r(  rì  ÚDictDecompilerrí  rð  rò  rü  r  r  r  r  ro   rð   rb  r5   r-  r,  r@   r0  rÐ   Ú_iro  r|  rp  r}  rq  r~  r   r   r   r   Ú<module>   s´   

  2L$)	Gk7#6@ ==%>
"!Û*ùûã"ûé '=-Kl:%0   
 i
 *
Z