o
    hN                    @   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 ZZdd Z[G dd deIZ\G dd deBZ]G dd deBZ^dd Z_dd Z`dd ZaG dd de!ZbG dd de!ZcG dd deBZdg ddddded fddddddeD fddddeD fddddeD fddddeD fddddeD fddddddddddg ddfddddg ddfdddddddddddddeM fdddddeW fddddeJ fdd0dde] fdddde\ fdd2ddeL fdddde^ fZeddddg ddfdd0dde] fdddde\ fdd2ddeL fdddde^ fgZfdZgdZhdehegdddfdddddddddddddddddddddddeK fgZidehegdddfdddddddddddddddddeK fgZjdd Zkekei ekee G dd dejlZmG dd dejlZnG dd de!Zodd ZpG dd deoZqG dd deoZrG dd deoZsG dd de!ZtG dd detZuG dd detZvG dd detZwG dd de!Zxg dZyd Zze{eyezksJ i Z|e}ezD ]	Z~e~e|eye~ < qg dZdZe{eeksJ g dZdZe{eeksJ g dZdZe{eeksJ 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r&|rdnd}| j|kr%td|| jf n| jdv s/J d| jdk}|sctd|dd	 | _|	| j
 td
d t||dD | _t||d| _t|| _n&t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   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/cffLib/__init__.py	<genexpr>b   s    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   
   t | jS r   )lenr1   r:   r   r   r   __len__s      
zCFFFontSet.__len__c                 C   r?   r   )r/   r1   rA   r   r   r   keysv   rC   zCFFFontSet.keysc                 C      | j S r   )r3   rA   r   r   r   valuesy      zCFFFontSet.valuesc                 C   s\   t |dr
| }nt|tr%|}z| j|}W n ty$   t|w t|| j	| S )z{Return TopDict instance identified by name (str) or index (int
        or any object that implements `__index__`).
        	__index__)
hasattrrH   
isinstancestrr1   indexr*   KeyError	TypeErrorr3   )r:   nameOrIndexrL   namer   r   r   __getitem__|   s   



zCFFFontSet.__getitem__c                 C   s  || _ |dur|rdnd}| j|krtd|| jf n| jdv s%J d| jdk}|jr9|s9| jD ]}|  q2|s?t }nd}t|}| jj|| |d}|rld| _	|
tt|  | | _|
td	| j nd
| _	d
| _|
tt|  |
td| j |st }	| jD ]}
|	|
 q|
|	j|| |d |
| |s|
|  |
| 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*   recalcBBoxesr3   recalcFontBBoxr4   	CFFWritergetCompilerr.   addr   packr'   getDataLengthr6   r+   r,   r0   r1   appendr9   rI   rT   r7   getChildrentoFile)r:   r;   r%   r"   r<   topDictr5   writertopCompilerr1   rP   rT   childrenchildr   r   r   compile   s^   	









zCFFFontSet.compilec                 C   s   |j d| jd |  |j d| jd |  | jD ]!}|jdt|d |  | | }|| |d |  q|  |d |  | j	| |d |  dS )zWrite 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rP   r9   N)
	simpletagr)   newlinerg   r1   begintagr
   toXMLendtagr9   )r:   	xmlWriterfontNamefontr   r   r   rm      s"   





zCFFFontSet.toXMLc                 C   s.  || _ t| dsd| _t| dsd| _|dkr| jdkrUt| ds$d| _t| ds,d| _t| d	s5t | _t| d
sAg | _t	 | _
|d }| j| t| jd}d|_n0| jdkrt| dsbd| _t| d	skt | _t| d
stdg| _| j j}t| j|d}t	d|| _
| j
| |D ]}t|trq|\}}}|||| qt|dr|jd jdu r|j}	|	D ]}
t|
dr|j|
j_qdS dS dS |d	krtj}t| d	st | _|D ]}t|trq|\}}}| }|||| | j| qdS |dkrt|d | _dS |dkrt|d | _dS dS )z?Reads data from the XML element into the ``CFFFontSet`` object.r)   r   rg   r   rh   r,   rS   r.   r9   r1   rP   )r9   Nr   rR   r$   )r9   r=   VarStorePrivaterf   )r%   rI   r)   rg   r,   r.   r8   r9   r1   r2   r3   r\   TopDictrT   r7   rJ   rK   fromXMLFDArrayvstorerr   rs   r   T2CharStringint)r:   rP   attrscontentr%   rp   r_   r=   elementfdArrayfontDictsubrCharStringClasssubrr   r   r   ru      s~   



















zCFFFontSet.fromXMLc                 C      ddl m} || | d S )Nr   )_convertCFFToCFF2)	CFFToCFF2r   )r:   r%   r   r   r   r   convertCFFToCFF2-     zCFFFontSet.convertCFFToCFF2c                 C   r   )Nr   )_convertCFF2ToCFF)	CFF2ToCFFr   )r:   r%   r   r   r   r   convertCFF2ToCFF2  r   zCFFFontSet.convertCFF2ToCFFc                 C      ddl m} ||  d S )Nr   )desubroutinize)
transformsr   )r:   r   r   r   r   r   7     zCFFFontSet.desubroutinizec                 C   r   )Nr   )remove_hints)r   r   )r:   r   r   r   r   r   <  r   zCFFFontSet.remove_hintsc                 C   r   )Nr   )remove_unused_subroutines)r   r   )r:   r   r   r   r   r   A  r   z$CFFFontSet.remove_unused_subroutinesr   )__name__
__module____qualname____doc__r>   rB   rD   rF   rQ   rd   rm   ru   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 )	rW   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      | j | d S r   )r   r\   )r:   tabler   r   r   rY   O     zCFFWriter.addc           	      C   sN  d }d}	 t  td| |d }d}|g}| jD ]3}t|dr3||  }t|tr2|jr2| | _n|t	| }t|drD|
|| |}|| q||krQn|}qt  td | }| jrltd| j| jd< nt|d	 | _td
| j| jd< dg}| jD ]}t|dr|| n|| || |  q||ksJ d S )Nr   Tz CFFWriter.toFile() iteration: %dr   r[   setPosz#CFFWriter.toFile() writing to file.r#   r   r^   )logDEBUGr   rI   r[   rJ   TopDictIndexCompilerr"   r6   r@   r   r\   tellr+   rZ   calcOffSizer,   r^   write)	r:   r;   lastPosListcountposposListitemendPosbeginr   r   r   r^   R  sF   






zCFFWriter.toFileN)r   r   r   r   r   rY   r^   r   r   r   r   rW   G  s
    rW   c                 C   s8   | dk rd}|S | dk rd}|S | dk rd}|S d}|S )N   r   i   r   i   r   rS   r   )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 )IndexCompilerzBase 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"   )rI   r"   getItemsitemsparent)r:   r   r5   r   r"   r   r   r   r     s   
zIndexCompiler.__init__c                 C   s   |S r   r   r:   r   r5   r   r   r   r        zIndexCompiler.getItemsc                 C   sV   | j r'd}|g}| j D ]}t|dr||  }n|t| }|| q|S g }|S )Nr   r[   )r   rI   r[   r@   r\   )r:   r   offsetsr   r   r   r   
getOffsets  s   

zIndexCompiler.getOffsetsc                 C   sX   | j rd}nd}| jr(|  d }t|}|d t| jd |  | d }|S |}|S )NrS   r   r   r   )r"   r   r   r   r@   )r:   	countSize
lastOffsetr,   
dataLengthr   r   r   r[     s&   zIndexCompiler.getDataLengthc           	      C   s   |   }| jrt|t| j nt|t| j | jrdt|d }t|| | }tj	}|D ]}|d||d  }t|| ksBJ |
| q.| jD ]}t|drX|| qKt|dd}|
| qKd S d S )Nr   >lr^   latin1encoding)r   r"   writeCard32r@   r   writeCard16r   
writeCard8r+   rZ   r   rI   r^   r	   )	r:   r;   r   r,   rZ   offset	binOffsetr   r   r   r   r   r^     s(   


	zIndexCompiler.toFiler   )	r   r   r   r   r   r   r   r[   r^   r   r   r   r   r     s    
r   c                   @   s   e Zd Zdd ZdS )IndexedStringsCompilerc                 C   s   |j S r   r5   r   r   r   r   r     rG   zIndexedStringsCompiler.getItemsN)r   r   r   r   r   r   r   r   r         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   $   g }|D ]}| |||  q|S r   r\   rX   r:   r   r5   outr   r   r   r   r        zTopDictIndexCompiler.getItemsc                 C   $   g }| j D ]
}||| q|S r   r   extendr]   )r:   r5   rb   r_   r   r   r   r]        
z TopDictIndexCompiler.getChildrenc                    s*   | j rd| jd  g}|S tt|  S Nr   )r"   r   r[   superr   r   )r:   r   	__class__r   r   r     s   zTopDictIndexCompiler.getOffsetsc                    s&   | j r| jd  }|S tt|  S r   )r"   r   r[   r   r   )r:   r   r   r   r   r[     s   z"TopDictIndexCompiler.getDataLengthc                    s.   | j r| jd | d S tt| | d S r   )r"   r   r^   r   r   r:   r;   r   r   r   r^     s   zTopDictIndexCompiler.toFile)
r   r   r   r   r   r]   r   r[   r^   __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 )FDArrayIndexCompilerzHelper 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   r   r   r   r   r   r   r   r     r   zFDArrayIndexCompiler.getItemsc                 C   r   r   r   )r:   r5   rb   r~   r   r   r   r]     r   z FDArrayIndexCompiler.getChildrenc                 C   s   |   }| jrt|t| j nt|t| j t|d }t|| | }tj	}|D ]}|d||d  }t|| ks?J |
| q+| jD ]}t|drU|| qH|
| qHd S )Nr   r   r^   )r   r"   r   r@   r   r   r   r   r+   rZ   r   rI   r^   )r:   r;   r   r,   rZ   r   r   r   r   r   r   r^     s"   


zFDArrayIndexCompiler.toFilec                 C      || j jd< d S )Nrv   r   rawDictr:   r   r   r   r   r   r     r   zFDArrayIndexCompiler.setPosN)r   r   r   r   r   r]   r^   r   r   r   r   r   r     s    r   c                   @      e Zd ZdZdd ZdS )GlobalSubrsCompilerzHelper 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   *   g }|D ]}| | j ||j q|S r   rd   r"   r\   bytecoder:   r   r5   r   csr   r   r   r   '  
   zGlobalSubrsCompiler.getItemsN)r   r   r   r   r   r   r   r   r   r   #      r   c                   @   r   )SubrsCompilerzHelper 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   /  r   r   c                   @   s    e Zd ZdZdd Zdd ZdS )CharStringsCompilerzHelper 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   r   r   r   r   r   r   r   r   <  r   zCharStringsCompiler.getItemsc                 C   r   NCharStringsr   r   r   r   r   r   C  r   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 )r0   zThis 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||  || _|r)t	|}nt
|}|dkr3d S d g| | _ t|}ttd|| |dksOJ d| dd|  }t|d D ]}||}	||	 }	td|	\}
|t|
 q[| d | _|| j|d	   ttd
||  d S )Nloading %s at %sr   z    index count: %s offSize: %srS   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&   r\   ry   
offsetBaser-   )r:   r;   r"   r   rP   r   r,   padrL   chunkr   r   r   r   r   N  s4   


zIndex.__init__c                 C   r?   r   )r@   r   rA   r   r   r   rB   k  rC   zIndex.__len__c                 C   s   | j | }|d ur|S | j| | j }| j|d  | j|  }| j}|| ||}t||ks4J | ||||}|| j |< |S Nr   )r   r   r   r;   r-   r(   r@   produceItem)r:   rL   r   r   sizer;   r   r   r   r   rQ   n  s   



zIndex.__getitem__c                 C      || j |< d S r   r   )r:   rL   r   r   r   r   __setitem__|     zIndex.__setitem__c                 C      |S r   r   )r:   rL   r   r;   r   r   r   r   r     r   zIndex.produceItemc                 C   s   | j | dS )zAdd an item to an INDEX.N)r   r\   )r:   r   r   r   r   r\        zIndex.appendc                 C      | j | |||dS Nr!   compilerClassr:   r5   r   r"   r   r   r   rX        zIndex.getCompilerc                 C   s   | j dd= dS )zEmpty the INDEX.Nr   rA   r   r   r   clear  r   zIndex.clearNNr   )r   r   r   r   r   r   r   rB   rQ   r   r   r\   rX   r   r   r   r   r   r0   G  s    

r0   c                       s^   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 )r8   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                    s<   t t| j||d || _|| _|r|| _|r|| _d S d S r   )r   r8   r   globalSubrsprivatefdSelectr}   )r:   r;   r  r  r  r}   r"   r   r   r   r     s   	
zGlobalSubrsIndex.__init__c                 C   sn   | j d ur	| j }n%t| dr,| jd ur,t| dr#| jd ur#| j| }nd}| j| j}nd }| j||| jdS )Nr}   r  r   r  r  )r  rI   r}   r  rs   	subrClassr  )r:   rL   r   r;   r   r  fdIndexr   r   r   r     s   
zGlobalSubrsIndex.produceItemc                 C   s|   | d |  tt| D ],}| | }| r"|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   )rL   rawrL   N)commentrk   r   r@   needsDecompilationrl   rm   rn   )r:   ro   ir   r   r   r   rm     s   



zGlobalSubrsIndex.toXMLc                 C   s0   |dkrd S |   }|||| | | d S )Nr  )r  ru   r\   )r:   rP   rz   r{   r   r   r   r   ru     s
   zGlobalSubrsIndex.fromXMLc                 C   s$   d }t | dr| j| }| | |fS )Nr  )rI   r  )r:   rL   selr   r   r   getItemAndSelector  s   

z#GlobalSubrsIndex.getItemAndSelectorNNNNNN)r   r   r   r   r   r   r   rx   r  charStringClassr   r   rm   ru   r  r   r   r   r   r   r8     s     !r8   c                   @   s   e Zd ZdZeZdS )
SubrsIndexzThis 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 )r2   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rF|rF|| _g | _| jj}ttd||  || _d}d g| | _d|g| _	| | _
|| j
|  ttd||  d S tt| j||d d S )Nr   r   r   r   r!   )r=   r   r   r   r   r   r   r   r;   r   r   r-   r   r2   r   )r:   r;   r=   topSizer"   rP   r   r   r   r   r     s   

zTopDictIndex.__init__c                 C   *   t | j||| j| j| jd}|| |S r   )rt   r5   r9   r=   r   r>   )r:   rL   r   r;   r   topr   r   r   r   #     
zTopDictIndex.produceItemc                 C   L   t t| D ]}|jd|d |  | | | |d |  qd S NFontDictr
  r   r@   rl   rk   rm   rn   r:   ro   r  r   r   r   rm   /     

zTopDictIndex.toXML)NNr   N)
r   r   r   r   r   r   r   r   rm   r   r   r   r   r   r2     s    r2   c                   @   s(   e Zd ZeZdd Zdd Zdd ZdS )FDArrayIndexc                 C   r  r  r  r  r   r   r   rm   ;  r  zFDArrayIndex.toXMLc                 C   r  N)r"   rw   )r  r5   r9   r   rw   r>   )r:   rL   r   r;   r   r~   r   r   r   r   C  r  zFDArrayIndex.produceItemc                 C   sN   |dkrd S t  }|D ]}t|trq|\}}}|||| q| | d S )Nr  )r  rJ   rK   ru   r\   )r:   rP   rz   r{   r~   r|   r   r   r   ru   O  s   

zFDArrayIndex.fromXMLN)r   r   r   r   r   rm   r   ru   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   rq   )r:   r;   r   r   r   r   r   \  s   zVarStoreData.__init__c                 C   sh   | j r2t| j }|dkr| j  | _n| j || _i }t| j|}t | _| j|| j	 d | _| S Ni  )
r;   r   r(   r   r   otrr   r   r>   rq   )r:   lengthglobalStatereaderr   r   r   r>   b  s   

zVarStoreData.decompilec                 C   s$   t  }| j|| j | | _d S r   )r   r   rd   rq   
getAllDatar   )r:   r`   r   r   r   rd   r  s   zVarStoreData.compilec                 C   s   | j || j d S r   )r   rm   rq   )r:   ro   rP   r   r   r   writeXMLy  s   zVarStoreData.writeXMLc                 C   sD   t  | _|D ]}t|tr|\}}}| j|||| j q	 qd S r   )r"  rr   r   rJ   tupleru   rq   )r:   rP   rz   r{   r   r|   r   r   r   xmlRead|  s   


zVarStoreData.xmlReadc                 C   r?   r   r@   r   rA   r   r   r   rB     rC   zVarStoreData.__len__c                 C   s"   |d u rd}| j j| }|j}|S r   )r   VarDataVarRegionCount)r:   vsIndexvarData
numRegionsr   r   r   getNumRegions  s
   zVarStoreData.getNumRegionsr  )
r   r   r   r   r>   rd   r'  r)  rB   r0  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  |rt || _| jdkrddlm} |d|| | _d S | jdkrkd g| }t|}d }d }t|D ]}	t|}
|d urKt||
D ]}|||< qD|
}t |}q5|d urft|}
t||
D ]}|||< q_|| _d S | jdkrd g| }t|}d }d }t|D ]}	t|}
|d urt||
D ]}|||< q|
}t|}q|d urt|}
t||
D ]}|||< q|| _d S J d| || _g | _d S )Nr   )arrayr   r   rS   Fzunsupported FDSelect format: %s)	r   formatr2  r(   tolistgidArrayr   r   r   )r:   r;   	numGlyphsr3  r2  r5  nRangesfdprevr  firstglyphIDr   r   r   r     sT   














zFDSelect.__init__c                 C   r?   r   )r@   r5  rA   r   r   r   rB     rC   zFDSelect.__len__c                 C   s
   | j | S r   r5  r:   rL   r   r   r   rQ     rC   zFDSelect.__getitem__c                 C   r   r   r<  )r:   rL   fdSelectValuer   r   r   r     r   zFDSelect.__setitem__c                 C   r   r   )r5  r\   )r:   r>  r   r   r   r\     r   zFDSelect.append)NNN)r   r   r   r   rB   rQ   r   r\   r   r   r   r   r1    s    
2r1  c                   @   sj   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r.t||||||d| _i  | _}	tt|D ]}
|
|	||
 < q d| _d S i | _d| _|| _|d ur>|| _	|d urG|| _
d S d S )Nr!   r   r   )r  varStorer  charStringsIndexcharStringsr   r@   charStringsAreIndexedr  r  r}   )r:   r;   rT   r  r  r  r}   r"   r?  rA  r  r   r   r   r     s$   


zCharStrings.__init__c                 C   s   t | j S r   )r/   rA  rD   rA   r   r   r   rD     r   zCharStrings.keysc                 C   s   | j r| jS t| j S r   )rB  r@  r/   rA  rF   rA   r   r   r   rF     s   zCharStrings.valuesc                 C   s
   || j v S r   )rA  )r:   rP   r   r   r   has_key  rC   zCharStrings.has_keyc                 C   r?   r   )r@   rA  rA   r   r   r   rB     rC   zCharStrings.__len__c                 C   s   | j | }| jr| j| }|S r   )rA  rB  r@  )r:   rP   
charStringr   r   r   rQ     s   

zCharStrings.__getitem__c                 C   s,   | j r| j| }|| j|< d S || j|< d S r   )rB  rA  r@  )r:   rP   rD  rL   r   r   r   r     s   
zCharStrings.__setitem__c                 C   sV   | j r| j| }| j|S t| dr"t| dr| j| j}nd}nd }| j| |fS )Nr}   r  r   )rB  rA  r@  r  rI   fdSelectIndex)r:   rP   rL   r  r   r   r   r     s   


zCharStrings.getItemAndSelectorc                 C   s   t |  }|D ]C}| |\}}| rdg}ng }|d u r+|dd|fg|  n|dd|fd|fg|  |  || |d |  qd S )N)r	  r   r  rP   rE  )sortedrD   r  r  rl   rk   rm   rn   )r:   ro   namesrP   charStrrE  r	  r   r   r   rm   .  s"   


zCharStrings.toXMLc           
   	   C   s   |D ]W}t |tr
q|\}}}|dkrqd}t| dr6zt|d }W n ty.   d}Y nw | j| j}n| j}|d }tj	}||| j
d}	|	||| |dkrU||	_|	| |< qd S )Nr  r   r}   rE  r   rP   r  )rJ   rK   rI   r   rM   r}   rs   r  r   rx   r  ru   rE  )
r:   rP   rz   r{   r|   fdIDr  	glyphNamer  rD  r   r   r   ru   B  s.   



zCharStrings.fromXMLr  )r   r   r   r   r   rD   rF   rC  __contains__rB   rQ   r   r  rm   ru   r   r   r   r   r     s    
!r   c                 C      t | dS r   )r   r(   )r;   r   r   r   r   \  r   r   c                 C      t d| d\}|S )Nr#   r   r+   r&   r(   r;   rf   r   r   r   r   `     r   c                 C   rM  )Nr   rS   rN  rO  r   r   r   r   e  rP  r   c                 C   s   |  t| d S r   )r   r   rO  r   r   r   r   j  r   r   c                 C      |  td| d S Nr#   r   r+   rZ   rO  r   r   r   r   n     r   c                 C   rQ  Nr   rS  rO  r   r   r   r   r  rT  r   c                 C   s   t | S r   )r   re   r   r   r   	packCard8v     rV  c                 C      t d| S rR  r+   rZ   re   r   r   r   
packCard16z     rZ  c                 C   rX  rU  rY  re   r   r   r   
packCard32~  r[  r\  c                 C   s(   i }| D ]\}}}}}||f||< q|S r   r   r   doprP   argdefaultconvr   r   r   buildOperatorDict  s   rc  c                 C   sT   i }| D ]#\}}}}}t |trt|d t|d  }nt|}||f||< q|S Nr   r   )rJ   r(  r   r]  r   r   r   buildOpcodeDict  s   
re  c                 C   s&   g }| D ]\}}}}}| | q|S r   )r\   )r   lr_  rP   r`  ra  rb  r   r   r   
buildOrder  s   rg  c                 C   s,   i }| D ]\}}}}}|d ur|||< q|S r   r   r]  r   r   r   buildDefaults  s   rh  c                 C   s$   i }| D ]\}}}}}|||< q|S r   r   r]  r   r   r   buildConverters  s   
ri  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   sJ   t |ds| ||S |j}| }z| ||W || S || w )Nr;   )rI   _readr;   r   r-   )r:   r   rf   r;   r   r   r   r   r(     s   
zSimpleConverter.readc                 C   r   r   r   r:   r   rf   r   r   r   rk    r   zSimpleConverter._readc                 C   r   r   r   rl  r   r   r   r     r   zSimpleConverter.writec                 C   s   |j ||d |  d S )Nre   )rj   rk   r:   ro   rP   rf   r   r   r   xmlWrite  s   zSimpleConverter.xmlWritec                 C   s   |d S Nrf   r   r:   rP   rz   r{   r   r   r   r   r)    rW  zSimpleConverter.xmlReadN)r   r   r   r(   rk  r   rn  r)  r   r   r   r   rj    s    
rj  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASCIIConverterc                 C      t |ddS Nasciir   r   rl  r   r   r   rk    r[  zASCIIConverter._readc                 C   rs  rt  r	   rl  r   r   r   r     r[  zASCIIConverter.writec                 C   s"   |j |t|ddd |  d S )Nru  r   re   rj   r
   rk   rm  r   r   r   rn    s   zASCIIConverter.xmlWritec                 C      t |d ddS )Nrf   ru  r   rv  rp  r   r   r   r)    r   zASCIIConverter.xmlReadNr   r   r   rk  r   rn  r)  r   r   r   r   rr    s
    rr  c                   @   rq  )
Latin1Converterc                 C   rs  Nr   r   r   rl  r   r   r   rk    r[  zLatin1Converter._readc                 C   rs  r{  rv  rl  r   r   r   r     r[  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+ re   )r
   resubrj   rk   rm  r   r   r   rn    s
   zLatin1Converter.xmlWritec                 C   rx  )Nrf   r   r   rv  rp  r   r   r   r)    r   zLatin1Converter.xmlReadNry  r   r   r   r   rz    s
    rz  c                 C   s$   zt | }W |S    t| }Y |S r   )ry   float)r   rf   r   r   r   parseNum  s   

r  c                 C   s`   g }| D ]}t |trq|\}}}|d  }dd |D }|| qt|dkr.|d }|S )Nrf   c                 S      g | ]}t |qS r   )evalr   valr   r   r   
<listcomp>      z"parseBlendList.<locals>.<listcomp>r   r   )rJ   rK   splitr\   r@   )r   	valueListr|   rP   rz   r{   	blendListr   r   r   parseBlendList  s   

r  c                   @      e Zd Zdd Zdd ZdS )NumberConverterc                 C   s   t |tr6|| |  |  ddd |D }|jt|d |  |  |	| |  d S |j||d |  d S )Nr~  c                 S   r  r   rK   r  r   r   r   r     r  z,NumberConverter.xmlWrite.<locals>.<listcomp>re   
rJ   r/   rl   rk   indentjoinrj   kBlendDictOpNamededentrn   )r:   ro   rP   rf   
blendValuer   r   r   rn    s   


zNumberConverter.xmlWritec                 C   s0   | dd }|d u rt|}|S t|d }|S ro  )getr  r  )r:   rP   rz   r{   r   valueStringrf   r   r   r   r)  
  s   zNumberConverter.xmlReadNr   r   r   rn  r)  r   r   r   r   r    s    r  c                   @   r  )ArrayConverterc                 C   s   |r?t |d tr?|| |  |  |D ]}ddd |D }|jt|d |  q|  |	| |  d S ddd |D }|j||d |  d S )Nr   r~  c                 S   r  r   r  r  r   r   r   r    r  z+ArrayConverter.xmlWrite.<locals>.<listcomp>re   c                 S   r  r   r  r  r   r   r   r  !  r  r  )r:   ro   rP   rf   r  r  r   r   r   rn    s   


zArrayConverter.xmlWritec                 C   s:   | dd }|d u rt|}|S | }dd |D }|S )Nrf   c                 S   r  r   )r  )r   rf   r   r   r   r  +  r  z*ArrayConverter.xmlRead.<locals>.<listcomp>)r  r  r  )r:   rP   rz   r{   r   r  r  rF   r   r   r   r)  %  s   zArrayConverter.xmlReadNr  r   r   r   r   r    s    r  c                   @   r  )TableConverterc                 C   s2   | | |  || || |  d S r   )rl   rk   rm   rn   rm  r   r   r   rn  0  s
   


zTableConverter.xmlWritec                 C   s<   |    }|D ]}t|trq|\}}}|||| q|S r   )getClassrJ   rK   ru   )r:   rP   rz   r{   r   obr|   r   r   r   r)  7  s   


zTableConverter.xmlReadNr  r   r   r   r   r  /  s    r  c                   @   $   e Zd Zdd Zdd Zdd ZdS )PrivateDictConverterc                 C      t S r   )PrivateDictrA   r   r   r   r  B  r   zPrivateDictConverter.getClassc           
      C   s|   |\}}|j }|j}z|j}W n ty   d }Y nw t|j||||d}|| ||}	t|	|ks7J |	|	 |S r  )
r;   r   rw   AttributeErrorr  r5   r-   r(   r@   r>   )
r:   r   rf   r   r   r;   r"   rw   privr   r   r   r   rk  E  s   



zPrivateDictConverter._readc                 C      dS )N)r   r   r   rl  r   r   r   r   T  r   zPrivateDictConverter.writeNr   r   r   r  rk  r   r   r   r   r   r  A  s    r  c                   @   r  )SubrsConverterc                 C   r  r   )r  rA   r   r   r   r  Y  r   zSubrsConverter.getClassc                 C   s(   |j }|j}||j|  t||dS r   )r;   r   r-   r   r  )r:   r   rf   r;   r"   r   r   r   rk  \  s   zSubrsConverter._readc                 C   r  r   r   rl  r   r   r   r   b  r   zSubrsConverter.writeNr  r   r   r   r   r  X  s    r  c                   @   r  )CharStringsConverterc              
   C   s   |j }|j}|j}t|dd }|j}t|dr(|j}t|dr#|j}	nd }	d }
nd\}	}|j}
|	| t
||||
|	|||d}|S )Nrr   rv   r1  r  )r"   r?  )r;   r   rT   getattrr9   rI   rv   r1  rs   r-   r   )r:   r   rf   r;   r"   rT   r?  r  r}   r  r  rA  r   r   r   rk  g  s2   



zCharStringsConverter._readc                 C   r  r   r   rl  r   r   r   r     r   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 )Nrv   r1  rr   )r?  )rI   rv   r1  rs   r   r9   r  ru   )	r:   rP   rz   r{   r   r}   r  r  rA  r   r   r   r)    s$   


	zCharStringsConverter.xmlReadNr   r   r   rk  r   r)  r   r   r   r   r  f  s    r  c                   @   rq  )
CharsetConverterc                 C   s  t |d}|dkr|j}|j}|| ttd| t|}|dkr,t|||j|}n|dks4|dkr>t	|||j||}nt
t||ksHJ ttd|  i }g }	|D ]9}
|
|v r||
 }|
d t| |v ry|d7 }|
d t| |v sk|d ||
< |
d t| }
d||
< |	|
 qW|	}n$|sd|jvr|dksJ d }n|dkrt}n|dkrt}n|dkrt}|rt||jkr|d |j }|S )	NROSr   zloading charset at %sr   r   z    charset end at %s#r   )rI   r6  r;   r-   r   r   r   parseCharset0r5   parseCharsetNotImplementedErrorr@   r   rK   r\   r   cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r:   r   rf   isCIDr6  r;   r3  rT   allNames
newCharsetrJ  nr   r   r   rk    sN   

zCharsetConverter._readc                 C   r  r   r   rl  r   r   r   r     r   zCharsetConverter.writec                 C   s   | d |  d S )Nz8charset is dumped separately as the 'GlyphOrder' element)r  rk   rm  r   r   r   rn    s   
zCharsetConverter.xmlWritec                 C      d S r   r   rp  r   r   r   r)    r   zCharsetConverter.xmlReadNry  r   r   r   r   r    s
    .r  c                   @   rq  )
CharsetCompilerc                 C   s\   |d dksJ t |jd}t|||}t|||}t|t|k r&|| _n|| _|| _d S )Nr   .notdefr  )rI   dictObjpackCharset0packCharsetr@   r   r   )r:   r5   rT   r   r  data0r   r   r   r   r     s   
zCharsetCompiler.__init__c                 C   r   )NrT   r   r   r   r   r   r     r   zCharsetCompiler.setPosc                 C   r?   r   r*  rA   r   r   r   r[     rC   zCharsetCompiler.getDataLengthc                 C      | | j d S r   r   r   r   r   r   r   r^     r   zCharsetCompiler.toFileNr   r   r   r   r   r[   r^   r   r   r   r   r    s
    r  c                 C   s~   d }t tdfttdfttdfg}t| }|D ]&\}}}|d ur" |S ||kr'q|}t|D ]}| | || kr;d } nq-q|S )Nr   r   r   )cffISOAdobeStringCountr  cffExpertStringCountr  cffExpertSubsetStringCountr  r@   r   )rT   predefinedCharSetValpredefinedCharSetslcscntpcscsvr  r   r   r   getStdCharSet  s(   r  c                 C   s   t | dd  S )Nr   )ry   rP   r5   r   r   r   getCIDfromName  r   r  c                 C   s
   | | S r   )getSIDr  r   r   r   getSIDfromName  rC   r  c                 C   sJ   d}t |g}|rt}nt}| dd  D ]}|t||| qt|S rd  )rV  r  r  r\   rZ  r   )rT   r  r5   fmtr   	getNameIDrP   r   r   r   r    s   
r  c                 C   s   d}g }d }d}|rt }nt}| dd  D ])}|||}	|d u r#|	}n|d |	kr<|| }
|
dkr3d}|||
f |	}|	}q|rR|| }
|
dkrKd}|||
f t|g}|dkr^t}nt}|D ]\}}
|t|||
  qbt|S )Nr   r      r   )r  r  r\   rV  rZ  r   )rT   r  r5   r  rangesr:  endr  rP   SIDnLeftr   	nLeftFuncr   r   r   r  !  s<   

r  c                 C   sl   dg}|r t | d D ]}t|}|dt|d  q|S t | d D ]}t|}|||  q&|S Nr  r   cidrR   )r   r   r\   rK   zfill)r6  r;   r5   r  rT   r  CIDr  r   r   r   r  F  s   r  c                 C   s   dg}d}|dkrt }nt}|| k rRt|}||}	|r5t|||	 d D ]}
|dt|
d  q%nt|||	 d D ]	}|||  q>||	 d }|| k s|S r  )r   r   r   r\   rK   r  )r6  r;   r5   r  r  rT   r   r  r:  r  r  r  r   r   r   r  S  s"   
r  c                   @   rq  )
EncodingCompilerc                 C   sZ   t |trJ t|jj||j}t|jj||j}t|t|k r%|| _n|| _|| _	d S r   )
rJ   rK   packEncoding0r  rT   r5   packEncoding1r@   r   r   )r:   r5   r   r   r  data1r   r   r   r   h  s   
zEncodingCompiler.__init__c                 C   r   )NEncodingr   r   r   r   r   r   r  r   zEncodingCompiler.setPosc                 C   r?   r   r*  rA   r   r   r   r[   u  rC   zEncodingCompiler.getDataLengthc                 C   r  r   r  r   r   r   r   r^   x  r   zEncodingCompiler.toFileNr  r   r   r   r   r  g  s
    
r  c                   @   rq  )
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rBt|j|||j}|S |dkrOt	|j|||j}|S )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s   z*Encoding supplements are not yet supported   )
r;   r-   r   r   r   r  parseEncoding0rT   r5   parseEncoding1)r:   r   rf   r;   r  haveSupplementr   r   r   r   rk  }  s.   
zEncodingConverter._readc                 C   s   |dkrdS |dkrdS dS )Nr  r   r  r   r   rl  r   r   r   r     s
   zEncodingConverter.writec                 C   s   |dv r|j ||d |  d S || |  tt|D ]}|| }|dkr8|j dt||d |  q || |  d S )N)r  r  ri   r  map)coderP   )rj   rk   rl   r   r@   hexrn   )r:   ro   rP   rf   r  rJ  r   r   r   rn    s   

zEncodingConverter.xmlWritec           	      C   sZ   d|v r|d S dgd }|D ]}t |trq|\}}}t|d }|d }|||< q|S )NrP   r  r   r  )rJ   rK   r   )	r:   rP   rz   r{   r   r   r|   r  rJ  r   r   r   r)    s   



zEncodingConverter.xmlReadNry  r   r   r   r   r  |  s
    r  c                 C   sF   t |}dgd }td|d D ]}t |}|dkr | | ||< q|S )Nr  r   r   r   r   r   )rT   r;   r  r5   nCodesr   r;  r  r   r   r   r    s   
r  c           
      C   sl   t |}dgd }d}t|D ]$}t |}t |}	t|||	 d D ]}| | ||< |d }q"|d }q|S )Nr  r   r   r  )
rT   r;   r  r5   r7  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 ]}||}|| q!|rB|d d u rB|  |rB|d d u s6t|tt|g}|D ]}|d u rVd}|t| qNt|S )Nr   r  r   r   r   r@   r  r\   poprV  r   )	rT   r   r5   r  mr  rP   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 ]$}||d}|d u r4|}n|	d |krG|	| }
|||
f |}|}	q%|	| }
|||
f |rm|d d dkrm|  |rm|d d dks_t|tt|g}|D ]\}}
|dkrd}|t|t|
  qyt|S )Nr   r  r   r   r  )rT   r   r5   r  r  r  rP   r  r:  r  r  r   r   r   r   r    s<   r  c                   @   r  )FDArrayConverterc                 C   s^   z|j }W n ty   d }Y nw |j}|j}|| t||d}||_|j|_|j|_|S r   )	rr   r  r;   r   r-   r  rw   r5   r9   )r:   r   rf   rw   r;   r"   r}   r   r   r   rk    s   

zFDArrayConverter._readc                 C   r  r   r   rl  r   r   r   r     r   zFDArrayConverter.writec                 C   s8   t  }|D ]}t|trq|\}}}|||| q|S r   )r  rJ   rK   ru   )r:   rP   rz   r{   r   r}   r|   r   r   r   r)    s   

zFDArrayConverter.xmlReadNr  r   r   r   r   r    s    r  c                   @   rq  )
FDSelectConverterc                 C   s    |j }|| t||j}|S r   )r;   r-   r1  r6  )r:   r   rf   r;   r  r   r   r   rk  (  s   
zFDSelectConverter._readc                 C   r  r   r   rl  r   r   r   r   .  r   zFDSelectConverter.writec                 C   s    | |d|jfg |  d S Nr3  )rj   r3  rk   rm  r   r   r   rn  3  s   zFDSelectConverter.xmlWritec           	      C   s$   t |d }d }d }t|||}|S r  )r   r1  )	r:   rP   rz   r{   r   r  r;   r6  r  r   r   r   r)  7  s
   zFDSelectConverter.xmlReadNry  r   r   r   r   r  '  s
    r  c                   @   rq  )
VarStoreConverterc                 C   s$   |j }|| t|}|  |S r   )r;   r-   r  r>   )r:   r   rf   r;   r?  r   r   r   rk  @  s
   
zVarStoreConverter._readc                 C   r  r   r   rl  r   r   r   r   G  r   zVarStoreConverter.writec                 C   s   | || d S r   )r'  rm  r   r   r   rn  J  r   zVarStoreConverter.xmlWritec                 C   s   t  }||||| |S r   )r  r)  )r:   rP   rz   r{   r   r?  r   r   r   r)  M  s   zVarStoreConverter.xmlReadNry  r   r   r   r   r  ?  s
    r  c                 C   s.   d}t |g}| D ]	}|t | q	t|S r   )rV  r\   r   )fdSelectArrayr  r   rL   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  q6|t| t|S )Nr   r   r   r   )r@   r   r\   rV  rZ  r   
r  r  fdRangeslenArraylastFDIndexr  r  sentinelGIDr   fdRanger   r   r   packFDSelect3[  $   
r  c           
      C   s   d}g }t | }d}t|D ]}| | }||kr!|||g |}q|d }t|g}|tt | |D ]}	|t|	d  |t|	d  q6|t| t|S )NrS   r   r   r   )r@   r   r\   rV  r\  rZ  r   r  r   r   r   packFDSelect4p  r  r  c                   @   rq  )
FDSelectCompilerc                 C   s   |j }|j}|dkrt|| _n1|dkrt|| _n'|dkr$t|| _nt|}t|}t|t|k r;|| _d|_ n|| _d|_ || _d S )Nr   r   rS   )r3  r5  r  r   r  r  r@   r   )r:   r  r   r  r  r  data3r   r   r   r     s    
zFDSelectCompiler.__init__c                 C   r   )Nr1  r   r   r   r   r   r     r   zFDSelectCompiler.setPosc                 C   r?   r   r*  rA   r   r   r   r[     rC   zFDSelectCompiler.getDataLengthc                 C   r  r   r  r   r   r   r   r^     r   zFDSelectCompiler.toFileNr  r   r   r   r   r    s
    r  c                   @   rq  )
VarStoreCompilerc                 C   s@   || _ |js
|  tdt|j}t||jg}t|| _d S r!  )r   r   rd   minr@   rZ  r   )r:   varStoreDatar   varStoreDataLenr   r   r   r   r     s   zVarStoreCompiler.__init__c                 C   r   )Nrr   r   r   r   r   r   r     r   zVarStoreCompiler.setPosc                 C   r?   r   r*  rA   r   r   r   r[     rC   zVarStoreCompiler.getDataLengthc                 C   r  r   r  r   r   r   r   r^     r   zVarStoreCompiler.toFileNr  r   r   r   r   r    s
    r  c                   @   r  )ROSConverterc                 C   s<   |\}}}| |dt|fdt|fd|fg |  d S NRegistryOrder
Supplementrw  )r:   ro   rP   rf   registryorder
supplementr   r   r   rn    s   


zROSConverter.xmlWritec                 C   s   |d |d t |d fS r  )r   rp  r   r   r   r)    s   zROSConverter.xmlReadNr  r   r   r   r   r    s    r  )   maxstacknumberNN)      r  )r  r  r  ))r     SyntheticBaser  NN)r   versionr  NNr|  r  )r  r   r}  r   FullName)r  &   FontNamer   
FamilyName)rS   Weightr  NN))r  r   isFixedPitchr  r   N))r  r   ItalicAngler  r   N))r  r   UnderlinePositionr  iN))r  rS   UnderlineThicknessr  2   N))r  rR   	PaintTyper  r   N))r     CharstringTyper  r   N)r     
FontMatrixr2  )MbP?r   r   r$  r   r   )   UniqueIDr  NNrR   FontBBox)r   r   r   r   ))r     StrokeWidthr  r   N)   XUIDr2  NN))r     
PostScriptr  NN))r     BaseFontNamer  NN))r     BaseFontBlenddeltaNN))r     CIDFontVersionr  r   N))r      CIDFontRevisionr  r   N))r  !   CIDFontTyper  r   N))r  "   CIDCountr  i"  N   rT   r  ))r  #   UIDBaser  NN   r     rs   )r  r  )r  %   )r  $   rv         rr   blendr0  )r.  vsindexr  NNr  )r   
BlueValuesr2  NN)r"  
OtherBluesr2  NN)r(  FamilyBluesr2  NN)	   FamilyOtherBluesr2  NN))r  rI  	BlueScaler  g}?5^I?N))r  
   	BlueShiftr  r"  N))r     BlueFuzzr  r   N)rL  StdHWr  NN)rN  StdVWr  NN))r  r  	StemSnapHr2  NN))r  r%  	StemSnapVr2  NN))r  r*  	ForceBoldr  r   N))r  r;  ForceBoldThresholdr  NN))r  r>  lenIVr  NN))r  rB  LanguageGroupr  r   N))r  r?  ExpansionFactorr  gQ?N))r     initialRandomSeedr  r   N)r  defaultWidthXr  r   N)r,  nominalWidthXr  r   NrY  r   c                 C   s   t t| D ]:}| | \}}}}}|d urq|dv rt }n|dkr&t }n|dkr.t }n	|dkr5d }nJ |||||f| |< qd S )N)r2  r2  r  r  r  )r   r@   r  r  rr  )r   r  r_  rP   r`  ra  rb  r   r   r   addConverters=  s   r]  c                   @      e Zd ZeeZdS )TopDictDecompilerN)r   r   r   rc  topDictOperators	operatorsr   r   r   r   r_  S  r   r_  c                   @   r^  )PrivateDictDecompilerN)r   r   r   rc  privateDictOperatorsra  r   r   r   r   rb  W  r   rb  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 rt|dr|j}|d usJ || _|| _|| _|| _i }|jD ]%}t||d }|d u r9q,|j	| }|
||}||j|krMq,|||< q,|| _d S r   )rJ   r4   rI   r"   r  r5   r   r  r  
convertersr   defaultsr  r   )	r:   r  r5   r   r"   r   rP   rf   rb  r   r   r   r   ^  s(   



zDictCompiler.__init__c                 C   r  r   r   r   r   r   r   r   t  r   zDictCompiler.setPosc                 C   rL  )Nr[   )r@   rd   rA   r   r   r   r[   w  r   zDictCompiler.getDataLengthc                 C   s   t  td| jj| | j}g }| jjD ]W}||}|d u rq| j| \}}t	|t
rWt|}t||ks9J dt|D ]}	||	 }
||	 }t| d|
 }||| q=nt| d| }||| || qt|}|S )Nz-- compiling %s for %szvalue doesn't match arg typearg_)r   r   r   r   r   r  r  r  opcodesrJ   r(  r@   r   r  r\   r   )r:   reasonr   r   rP   rf   r_  argTyperf  r  r`  v
arghandlerr   r   r   rd   z  s,   

zDictCompiler.compilec                 C   s   |  d}|| d S )Nr^   )rd   r   )r:   r;   r   r   r   r   r^     s   
zDictCompiler.toFilec                 C   sL   t |tr dd |D }|td |tt t|}|S t|}|S )Nc                 S   r  r   encodeNumberr  r   r   r   r    r  z+DictCompiler.arg_number.<locals>.<listcomp>r   )rJ   r/   r\   rn  r   blendOpr   )r:   numr   datumr   r   r   
arg_number  s   
zDictCompiler.arg_numberc                 C   s   t | j|S r   )r   encodeIntCFFr5   r  )r:   r   r   r   r   arg_SID  r   zDictCompiler.arg_SIDc                 C   s&   g }|D ]
}| | | qt|S r   )r\   rr  r   )r:   rf   r   rp  r   r   r   	arg_array  s   zDictCompiler.arg_arrayc                 C   st   |sdS |d }t |tr| |}t|S g }d}|D ]}|||  |}qg }|D ]	}|t| q,t|S )N    r   )rJ   r/   arg_delta_blendr\   rn  r   )r:   rf   val0r   r   lastrk  rp  r   r   r   	arg_delta  s   


zDictCompiler.arg_deltac                 C   s6  t |d }t |}|| d }|| jkrFt| jd | }g }	 tt ||}|dkr/	 |S |d| }| |}	||	 ||d }q!dg| }
dg| }d}d}||k rx|| d }|| |
|< |}|| dd ||< |d7 }||k sX|
}|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   TNc                 S   r  r   rm  r  r   r   r   r    r  z0DictCompiler.arg_delta_blend.<locals>.<listcomp>)
r@   maxBlendStackry   r  rw  r   r\   rn  r   ro  )r:   rf   
numMasters	numBlendsnumStacknumBlendValuesr   numValvalListout1	firstList	deltaListr  prevValdefaultValuerelValueListr  r   r   r   rw    sD   



	
zDictCompiler.arg_delta_blendr   )r   r   r   r{  r   r   r[   rd   r^   rr  rt  ru  rz  rw  r   r   r   r   rd  [  s    

rd  c                 C   s   t | tr
t| S t| S r   )rJ   r  r   encodeFloatrs  )rp  r   r   r   rn  	  s   


rn  c                   @   s   e Zd ZeeZdd ZdS )TopDictCompilerc                 C   s  | j }g }| jjd u rVt| jdr9| jjr9t| jdrd }nt| jj}|d u r4|t|| jj|  n|| jd< t| jdrU| jj	rU| jj	}t
|tsU|t|||  nt| jdrj| jj}t|| }|| t| jdr| jj}t|dkr| jj}	| jjD ]
}
||	|
 j qt|| }|| t| jdrg }| jj}	| jjD ]	}
||	|
  qt||| |d}|| t| jd	r| jj|| }|| ||| t| jd
r| jj|| }|| ||| |S )NrT   r  r  rr   r1  r   r   r!   rv   rs   )r"   r  r=   rI   rT   r  r\   r  r   r  rJ   rK   r  rr   r  r1  r@   r   rE  r  r   rv   rX   r   r]   rs   )r:   r5   r"   rb   charsetCoder   r  varStoreCompr  rA  rP   fdSelectCompr   charStringsCompfdArrayIndexCompprivCompr   r   r   r]   	  sZ   








zTopDictCompiler.getChildrenN)r   r   r   re  r`  rh  r]   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 r*|	| q|j
|}|d ur?|j| }|||}t||d |krL|	| q|r]tddt|  d S d S )Nr!   z:Some CFF FDArray/FontDict keys were ignored upon compile: r~  )r   r  r   r  rF  setre  r  r   r\   rf  r  r(   r  r   warningr  )	r:   r  r5   r   r"   ignoredNamesrP   ra  rb  r   r   r   r   H	  s(   


zFontDictCompiler.__init__c                 C   s>   g }t | jdr| jj|| }|| ||| |S Nrs   )rI   r  rs   rX   r\   r   r]   )r:   r5   rb   r  r   r   r   r]   i	  s   
zFontDictCompiler.getChildrenr   )	r   r   r   re  r`  rh  r   r]   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   )rI   r  r\   r   rX   )r:   r5   rb   r   r   r   r]   {	  s   zPrivateDictCompiler.getChildrenN)
r   r   r   maxStackLimitr{  re  rc  rh  r   r]   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   sh   |d u |d u ks
J i | _ g | _|| _|d u rd S || _|| _|d ur2ttd| jj| || _	d S d S )Nr   )
r   	skipNamesr5   r   r;   r   r   r   r   r   )r:   r5   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@   decompilerClassr5   r>   getDictr   postDecompile)r:   r   decr   r   r   r>   	  s
   

zBaseDict.decompilec                 C   r  r   r   rA   r   r   r   r  	  r   zBaseDict.postDecompilec                 C   r   r   r   r   r   r   r   rX   	  r   zBaseDict.getCompilerc                 C   s   |d d |dd    krdkrt | | j|d }|d u r'| j|}|d u r/t || j| }|| |}t| || |S )Nr   __)r  r   r  rf  re  r(   setattr)r:   rP   rf   rb  r   r   r   __getattr__	  s   "
zBaseDict.__getattr__c                 C   s   | j D ]#}|| jv rqt| |d }|d u r|dkrq| j| }|||| qt| jt| j  }|rE|ddt	|  |
  d S d S )NrT   zsome keys were ignored: %sr~  )r  r  r  re  rn  r  r   r  r  rF  rk   )r:   ro   rP   rf   rb  r  r   r   r   rm   	  s   



zBaseDict.toXMLc                 C   s*   | j | }||||| }t| || d S r   )re  r)  r  )r:   rP   rz   r{   rb  rf   r   r   r   ru   	  s   
zBaseDict.fromXML)NNNNr   )
r   r   r   r   r>   r  rX   r  rm   ru   r   r   r   r   r  	  s    

r  c                       sv   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 )rt   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 || _|| _|r$tt| _| | _t	t| _
d S tt| _t	t| _
d S r   )r   rt   r   r=   r9   rh  topDictOperators2rf  rT   rg  r  r`  )r:   r5   r;   r   r9   r=   r"   r   r   r   r   	  s   	

zTopDict.__init__c                 C   rE   )z.Returns a list of glyph names in the CFF font.)rT   rA   r   r   r   r7   
     zTopDict.getGlyphOrderc                 C   sJ   | j d}|d u rd S | j| | jrt| j| _d S t| j| _d S r   )r   r  r;   r-   r   r   r6  r   )r:   r   r   r   r   r  
  s   zTopDict.postDecompilec                 C   sR   t | dr	|   t | drdg| _t | drt | ds!g d| _t| | d S )Nr   r  r  )r4  r6  r8  r:  )rI   decompileAllCharStringsr  r  rm   )r:   ro   r   r   r   rm   
  s   


zTopDict.toXMLc                 C   s<   t | j D ]\}}z|  W q   td|  d S )NzError in charstring %s)	enumerater   rF   r>   r   error)r:   r  rD  r   r   r   r   
  s   zTopDict.decompileAllCharStringsc                 C   sr   d }| j  D ]}|| j }|d ur|d urt||}q|}q|d u r0| jd d d  | _d S tt|| _d S )Nr'  )r   rF   
calcBoundsr   rf  r'  r/   r   )r:   fontBBoxrD  boundsr   r   r   rV   )
  s   zTopDict.recalcFontBBoxr  )r   r   r   r   rh  r`  rf  ri  re  r  r   rg  r  r_  r  r   r7   r  rm   r  rV   r   r   r   r   r   rt   	  s&    	rt   c                       sT   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  rs   rs   Nc                    s,   t t| j||||d || _| | d S r   )r   r  r   rw   setCFF2)r:   r5   r;   r   r9   r"   rw   r   r   r   r   \
  s   	zFontDict.__init__c                 C   s(   |r| j | _d| _d S | j| _d| _d S )NTF)	orderCFF2r  r   orderCFFr   r   r   r   r  i
  s
   

zFontDict.setCFF2r  )r   r   r   rf  ri  r`  re  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                    sj   t t| j||||d || _|r&tt| _tt| _d  | _	| _
d| _d S tt| _tt| _d| _d S )Nr!   TF)r   r  r   rw   rh  privateDictOperators2rf  rg  r  r\  r[  r   rc  )r:   r5   r;   r   r"   rw   r   r   r   r   z
  s   





zPrivateDict.__init__c                 C   rE   r   )r   rA   r   r   r   in_cff2
  r  zPrivateDict.in_cff2c                 C   s.   |d u rt | dr| j}nd}| j|}|S )NrE  r   )rI   rE  rw   r0  )r:   vir/  r   r   r   r0  
  s   
zPrivateDict.getNumRegions)NNNNNr   )r   r   r   rh  rc  rf  ri  re  rg  r  rb  r  r  r   r   propertyr  r0  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 )r4   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   r  
  s    z+IndexedStrings.__init__.<locals>.<listcomp>Fr!   )r0   r5   )r:   r;   r5   r   r   r   r   
  s   
zIndexedStrings.__init__c                 C   s   t | d | ddS )NFr!   )r   rA   r   r   r   rX   
  r   zIndexedStrings.getCompilerc                 C   r?   r   )r@   r5   rA   r   r   r   rB   
  rC   zIndexedStrings.__len__c                 C   s   |t k rt| S | j|t   S r   )cffStandardStringCountcffStandardStringsr5   )r:   r  r   r   r   rQ   
  s   zIndexedStrings.__getitem__c                 C   sr   t | ds	|   t|dd}|tv rt| }|S || jv r%| j| }|S t| jt }| j| || j|< |S )NstringMappingr   r   )	rI   buildStringMappingr
   cffStandardStringMappingr  r@   r5   r  r\   )r:   r   r  r   r   r   r  
  s   



zIndexedStrings.getSIDc                 C   rE   r   r   rA   r   r   r   
getStrings
  rG   zIndexedStrings.getStringsc                 C   s2   i | _ tt| jD ]}|t | j | j| < q
d S r   )r  r   r@   r5   r  r=  r   r   r   r  
  s   z!IndexedStrings.buildStringMappingr   )r   r   r   r   r   rX   rB   rQ   r  r  r  r   r   r   r   r4   
  s    
r4   (  r  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krf  r  r  opqrr   turk  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.003BlackBoldBookLightMediumRegularRomanSemiboldi  )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  rf  r  r  r  r   r  r  r   r  r  rk  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/  r0  r1  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  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  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  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  rK  rH  rP  r  r  r  r  r  r  r  r  rC  rQ  rV  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'     )Wr  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  rK  rH  rP  r  r  r  r  r  r  r  rC  rQ  rV  r  r  r  r  r  r  r  r  r  r  r  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+   loggingr  r   	getLoggerr   r   r'   r  objectr   rW   r   r   r   r   r   r   r   r   r0   r8   r  r2   r  r  r1  r   r   r   r   r   r   r   rV  rZ  r\  rc  re  rg  rh  ri  rj  rr  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  ro  rc  r  r]  DictDecompilerr_  rb  rd  rn  r  r  r  r  rt   r  r  r4   r  r  r@   r  r   _ir  r  r  r  r  r  r   r   r   r   <module>   s    

  2L$)	Gk7#6@ ==%>
"!	
 !"#$%*" '=-Kl:%0   
 i
 *
Z