§
    èƒñjûj  ã            
      óÒ  — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lZdd
lmZ dd	lZ ej        e¦  «        Z G d„ de¦  «        ZdZdZddddddddddœ	Zefd„Z G d„ de¦  «        ZdZ ej        e¦  «        Z dZ! ej        e!¦  «        Z"dZ#dZ$d Z%d!Z&d"Z' ej        e'¦  «        Z(d#Z) ej        e)¦  «        Z*d$Z+ ej        e+¦  «        Z,d%Z- ej        e-¦  «        Z. G d&„ d'e¦  «        Z/ G d(„ d)e/¦  «        Z0 G d*„ d+e/¦  «        Z1 G d,„ d-¦  «        Z2d.„ Z3d/„ Z4e#dfd0„Z5ed1k    r,dd	l6Z6dd	l7Z7 e6j8         e7j9        ¦   «         j:        ¦  «         d	S d	S )2a¯  ttLib/sfnt.py -- low-level module to deal with the sfnt file format.

Defines two public classes:

- SFNTReader
- SFNTWriter

(Normally you don't have to use these classes explicitly; they are
used automatically by ttLib.TTFont.)

The reading and writing of sfnt files is separated in two distinct
classes, since whenever the number of tables changes or whenever
a table's length changes you need to rewrite the whole file anyway.
é    )Úannotations)ÚKeysView)ÚBytesIO)ÚSimpleNamespace)ÚTag)Ússtruct)Ú
TTLibErrorÚTTLibFileIsCollectionErrorN)ÚOrderedDictc                  óT   — e Zd Zd„ Zdd„Zdd
„ZeZdd„Zdd„Zdd„Z	dd„Z
d„ Zd„ ZdS )Ú
SFNTReaderc                ó@  — |rƒ| t           u rz|d         }|                     d¦  «         t          |                     d¦  «        ¦  «        }|                     d¦  «         |dk    r ddlm} t                               |¦  «        S t                               | ¦  «        S )zmReturn an instance of the SFNTReader sub-class which is compatible
        with the input file type.
        r   é   ÚwOF2)ÚWOFF2Reader)r   Úseekr   ÚreadÚfontTools.ttLib.woff2r   ÚobjectÚ__new__)ÚclsÚargsÚkwargsÚinfileÚsfntVersionr   s         úS/data/share/cad/hardware/.venv/lib/python3.11/site-packages/fontTools/ttLib/sfnt.pyr   zSFNTReader.__new__    s•   € ð ð 		3�C�:Ð%Ð%Ø˜!”WˆFØ�KŠK˜‰NŒNˆNÝ˜fŸkšk¨!™nœnÑ-Ô-ˆKØ�KŠK˜‰NŒNˆNØ˜fÒ$Ð$à=Ð=Ð=Ð=Ð=Ð=å—~’~ kÑ2Ô2Ð2å�~Š~˜cÑ"Ô"Ð"ó    r   éÿÿÿÿFc                ó„  — || _         || _        d | _        d | _        t          | _        | j                              d¦  «         | j                              d¦  «        | _        | j                              d¦  «         | j        dk    rðt          | j         ¦  «        }t          |d¦  «        r|s|j        }|j        }n|j        }|j        }d|cxk    r|k     sn t          d|dz
  z  ¦  «        ‚|| _        | j                              ||         ¦  «         | j                              t           ¦  «        }t#          |¦  «        t           k    rt%          d¦  «        ‚t'          j        t*          || ¦  «         ná| j        dk    rud	| _        t,          | _        | j                              t.          ¦  «        }t#          |¦  «        t.          k    rt%          d
¦  «        ‚t'          j        t0          || ¦  «         na| j                              t           ¦  «        }t#          |¦  «        t           k    rt%          d¦  «        ‚t'          j        t*          || ¦  «         t3          | j        ¦  «        | _        | j        dvrt%          d¦  «        ‚i }	t5          | j        ¦  «        D ]I}
|                      ¦   «         }|                     | j         ¦  «         t3          |j        ¦  «        }||	|<   ŒJt=          t?          |	                      ¦   «         d„ ¬¦  «        ¦  «        | _!        | j        d	k    rtE          | ¦  «        | _        d S d S )Nr   r   s   ttcfÚoffsetTable2z2specify a font number between 0 and %d (inclusive)é   ú'Not a Font Collection (not enough data)ó   wOFFÚwoffz!Not a WOFF font (not enough data)z1Not a TrueType or OpenType font (not enough data))ú   ÚOTTOÚtruez1Not a TrueType or OpenType font (bad sfntVersion)c                ó   — | d         j         S )Nr!   )Úoffset)Úis    r   ú<lambda>z%SFNTReader.__init__.<locals>.<lambda>d   s   € ÀqÈÄtÄ{€ r   )Úkey)#ÚfileÚcheckChecksumsÚflavorÚ
flavorDataÚSFNTDirectoryEntryÚDirectoryEntryr   r   r   ÚreadTTCHeaderÚhasattrÚ	numFonts2r    ÚnumFontsÚoffsetTabler
   ÚsfntDirectorySizeÚlenr	   r   ÚunpackÚsfntDirectoryFormatÚWOFFDirectoryEntryÚwoffDirectorySizeÚwoffDirectoryFormatr   ÚrangeÚ	numTablesÚfromFileÚtagr   ÚsortedÚitemsÚtablesÚWOFFFlavorData)Úselfr-   r.   Ú
fontNumberÚ_useLegacyTTCÚheaderr6   r7   ÚdatarE   r*   ÚentryrB   s                r   Ú__init__zSFNTReader.__init__1   sý  € ØˆŒ	Ø,ˆÔàˆŒØˆŒÝ0ˆÔØŒ	�Š�qÑÔÐØœ9Ÿ>š>¨!Ñ,Ô,ˆÔØŒ	�Š�qÑÔÐØÔ˜wÒ&Ð&Ý" 4¤9Ñ-Ô-ˆFÝ�v˜~Ñ.Ô.ð 1°}ð 1Ø!Ô+�Ø$Ô1��à!œ?�Ø$Ô0�Ø˜
Ð-Ð-Ò-Ð- XÒ-Ð-Ð-Ð-Ý0ØHØ !‘|ñ%ñô ð ð %ˆDŒMØŒI�NŠN˜; zÔ2Ñ3Ô3Ð3Ø”9—>’>Õ"3Ñ4Ô4ˆDÝ�4‰yŒyÕ-Ò-Ð-Ý Ð!JÑKÔKÐKÝŒNÕ.°°dÑ;Ô;Ð;Ð;ØÔ Ò(Ð(Ø ˆDŒKÝ"4ˆDÔØ”9—>’>Õ"3Ñ4Ô4ˆDÝ�4‰yŒyÕ-Ò-Ð-Ý Ð!DÑEÔEÐEÝŒNÕ.°°dÑ;Ô;Ð;Ð;à”9—>’>Õ"3Ñ4Ô4ˆDÝ�4‰yŒyÕ-Ò-Ð-Ý Ð!TÑUÔUÐUÝŒNÕ.°°dÑ;Ô;Ð;Ý˜tÔ/Ñ0Ô0ˆÔàÔÐ#GÐGÐGÝÐPÑQÔQÐQØ,.ˆÝ�t”~Ñ&Ô&ð 	 ð 	 ˆAØ×'Ò'Ñ)Ô)ˆEØ�NŠN˜4œ9Ñ%Ô%Ð%Ý�e”i‘.”.ˆCØˆF�3‰KˆKÝ!¥&¨¯ª©¬Ð=RÐ=RÐ"SÑ"SÔ"SÑTÔTˆŒð Œ;˜&Ò Ð Ý,¨TÑ2Ô2ˆDŒOˆOˆOð !Ð r   rB   ústr | bytesÚreturnÚboolc                ó   — || j         v S ©N©rE   ©rG   rB   s     r   Úhas_keyzSFNTReader.has_keyj   s   € Ø�d”kÐ!Ð!r   úKeysView[Tag]c                ó4   — | j                              ¦   «         S rR   )rE   Úkeys©rG   s    r   rX   zSFNTReader.keyso   s   € ØŒ{×ÒÑ!Ô!Ð!r   Úbytesc                ó†  — | j         t          |¦  «                 }|                     | j        ¦  «        }| j        r…|dk    r&t          |dd…         dz   |dd…         z   ¦  «        }nt          |¦  «        }| j        dk    r||j        k    sJ d|z  ¦   «         ‚n&||j        k    rt                               d|¦  «         |S )zFetch the raw table data.ÚheadNé   ó       é   r!   zbad checksum for '%s' table)	rE   r   ÚloadDatar-   r.   ÚcalcChecksumÚcheckSumÚlogÚwarning)rG   rB   rL   rK   Úchecksums        r   Ú__getitem__zSFNTReader.__getitem__r   sÌ   € à”�C ™HœHÔ%ˆØ�~Š~˜dœiÑ(Ô(ˆØÔð 	@Ø�fŠ}ˆ}å'¨¨R¨a¨R¬°;Ñ(>ÀÀbÀcÀcÄÑ(JÑKÔK��å'¨Ñ-Ô-�ØÔ" QÒ&Ð&à 5¤>Ò1Ð1Ð1Ð3PÐSVÑ3VÑ1Ô1Ð1Ð1Ø˜Uœ^Ò+Ð+å—’Ð9¸3Ñ?Ô?Ð?Øˆr   ÚNonec                ó0   — | j         t          |¦  «        = d S rR   )rE   r   rT   s     r   Ú__delitem__zSFNTReader.__delitem__„   s   € ØŒK�˜C™œÐ!Ð!Ð!r   c                ó8   — | j                              ¦   «          d S rR   )r-   ÚcloserY   s    r   rk   zSFNTReader.close‡   s   € ØŒ	�ŠÑÔÐÐÐr   c                óÖ   — t          | j        t          ¦  «        r| j        S | j                             ¦   «         }|d= | j        j        |d<   | j                             ¦   «         |d<   |S )Nr-   Ú	_filenameÚ_filepos)Ú
isinstancer-   r   Ú__dict__ÚcopyÚnameÚtell©rG   Ústates     r   Ú__getstate__zSFNTReader.__getstate__�   sc   € Ý�d”i¥Ñ)Ô)ð 	!à”=Ð ð ”×"Ò"Ñ$Ô$ˆØ�&ˆMØ!œYœ^ˆˆkÑØ œIŸNšNÑ,Ô,ˆˆjÑØˆr   c                óì   — d|vrUt          |                     d¦  «        d¦  «        | _        | j                             |                     d¦  «        ¦  «         | j                             |¦  «         d S )Nr-   rm   Úrbrn   )ÚopenÚpopr-   r   rp   Úupdatert   s     r   Ú__setstate__zSFNTReader.__setstate__œ   sf   € Ø˜ÐÐÝ˜UŸYšY {Ñ3Ô3°TÑ:Ô:ˆDŒIØŒI�NŠN˜5Ÿ9š9 ZÑ0Ô0Ñ1Ô1Ð1ØŒ×Ò˜UÑ#Ô#Ð#Ð#Ð#r   N)r   r   F)rB   rN   rO   rP   )rO   rV   )rB   rN   rO   rZ   )rB   rN   rO   rg   )rO   rg   )Ú__name__Ú
__module__Ú__qualname__r   rM   rU   Ú__contains__rX   rf   ri   rk   rv   r|   © r   r   r   r      sÁ   € € € € € ð#ð #ð #ð"73ð 73ð 73ð 73ðr"ð "ð "ð "ð €Lð"ð "ð "ð "ðð ð ð ð$"ð "ð "ð "ðð ð ð ð
ð 
ð 
ð$ð $ð $ð $ð $r   r   é   Fr!   é   é   r]   é
   é   é   é2   éd   )	r!   é   rƒ   r   r„   r‚   é   r]   é	   c                ó¾   — d|cxk    rdk    sn t          d|z  ¦  «        ‚t          r|dk    rddlm}  || |¦  «        S ddlm}  || t
          |         ¬¦  «        S )aE  Compress 'data' to Zlib format. If 'USE_ZOPFLI' variable is True,
    zopfli is used instead of the zlib module.
    The compression 'level' must be between 0 and 9. 1 gives best speed,
    9 gives best compression (0 gives no compression at all).
    The default value is a compromise between speed and compression (6).
    r   rŒ   zBad compression level: %s)Úcompress)Únumiterations)Ú
ValueErrorÚ
USE_ZOPFLIÚzlibrŽ   Úzopfli.zlibÚZOPFLI_LEVELS)rK   ÚlevelrŽ   s      r   rŽ   rŽ   º   s�   € ð �ˆOˆOŠOˆO˜!ŠOˆOˆOˆOÝÐ4°uÑ<Ñ=Ô=Ð=Ýð B˜ !š˜Ø!Ð!Ð!Ð!Ð!Ð!àˆx˜˜eÑ$Ô$Ð$à(Ð(Ð(Ð(Ð(Ð(àˆx˜­M¸%Ô,@ÐAÑAÔAÐAr   c                  óL   — e Zd Zd„ Z	 	 	 dd„Zd„ Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ ZdS )Ú
SFNTWriterc                óð   — d}|rd|v r	|d         }n|rt          |¦  «        dk    r|d         }| t          u r&|dk    r ddlm} t                               |¦  «        S t                               | ¦  «        S )zpReturn an instance of the SFNTWriter sub-class which is compatible
        with the specified 'flavor'.
        Nr/   rƒ   Úwoff2r   )ÚWOFF2Writer)r9   r—   r   rš   r   r   )r   r   r   r/   rš   s        r   r   zSFNTWriter.__new__Î   s’   € ð ˆØð 	�h &Ð(Ð(Ø˜HÔ%ˆFˆFØð 	•c˜$‘i”i !’m�mØ˜!”WˆFØ•*ÐÐØ˜Ò Ð à=Ð=Ð=Ð=Ð=Ð=å—~’~ kÑ2Ô2Ð2å�~Š~˜cÑ"Ô"Ð"r   r%   Nc                ó&  — || _         || _        t          |¦  «        | _        || _        || _        | j        dk    rCt          | _        t          | _	        t          | _        d| _        t          |t          z  z   | _        nb| j        rJ d| j        z  ¦   «         ‚t           | _        t          | _	        t"          | _        ddlm}  ||d¦  «        \  | _        | _        | _        | j                              ¦   «         | _        | j        | j	        z   || j        j        z  z   | _        | j                              | j        ¦  «         | j                              d| j        | j                              ¦   «         z
  z  ¦  «         t;          ¦   «         | _        d S )Nr$   ÚwOFFúUnknown flavor '%s'r   ©ÚgetSearchRangeé   ó    )r-   r@   r   r   r/   r0   r>   ÚdirectoryFormatr=   ÚdirectorySizer<   r2   Ú	signaturer8   ÚsfntDirectoryEntrySizeÚorigNextTableOffsetr;   r1   ÚfontTools.ttLibrŸ   ÚsearchRangeÚentrySelectorÚ
rangeShiftrs   ÚdirectoryOffsetÚ
formatSizeÚnextTableOffsetr   Úwriter   rE   )rG   r-   r@   r   r/   r0   rŸ   s          r   rM   zSFNTWriter.__init__à   s  € ð ˆŒ	Ø"ˆŒÝ˜{Ñ+Ô+ˆÔØˆŒØ$ˆŒàŒ;˜&Ò Ð Ý#6ˆDÔ Ý!2ˆDÔÝ"4ˆDÔà#ˆDŒNõ " IÕ0FÑ$FÑFð Ô$Ð$ð ”{ÐGÐGÐ$9¸D¼KÑ$GÑGÔGÐGÝ#6ˆDÔ Ý!2ˆDÔÝ"4ˆDÔà6Ð6Ð6Ð6Ð6Ð6àDRÀNØ˜2ñEô EÑAˆDÔ˜dÔ0°$´/ð  $œyŸ~š~Ñ/Ô/ˆÔàÔ ØÔ ñ!à˜$Ô-Ô8Ñ8ñ9ð 	Ôð 	Œ	�Š�tÔ+Ñ,Ô,Ð,àŒ	�Š˜ Ô!5¸¼	¿ºÑ8HÔ8HÑ!HÑIÑJÔJÐJÝ!‘m”mˆŒˆˆr   c                óP   — || j         v rt          d|z  ¦  «        ‚|| j         |<   d S )Núcannot rewrite '%s' table)rE   r	   )rG   rB   rL   s      r   ÚsetEntryzSFNTWriter.setEntry  s5   € Ø�$”+ÐÐÝÐ8¸3Ñ>Ñ?Ô?Ð?à ˆŒ�CÑÐÐr   c                óê  — || j         v rt          d|z  ¦  «        ‚|                      ¦   «         }||_        | j        |_        |dk    r9t          |dd…         dz   |dd…         z   ¦  «        |_        || _        d|_	        nt          |¦  «        |_        | 
                    | j        |¦  «         | j        dk    r'| j        |_        | xj        |j        d	z   d
z  z  c_        | j        |j        d	z   d
z  z   | _        | j                             d| j        | j                             ¦   «         z
  z  ¦  «         | j        | j                             ¦   «         k    sJ ‚|                      ||¦  «         dS )zWrite raw table data to disk.r°   r\   Nr]   r^   r_   Tr$   rƒ   éüÿÿÿr¡   )rE   r	   r2   rB   r­   r)   ra   rb   Ú	headTableÚuncompressedÚsaveDatar-   r/   r¦   Ú
origOffsetÚ
origLengthÚlengthr®   rs   r±   )rG   rB   rK   rL   s       r   Ú__setitem__zSFNTWriter.__setitem__  sl  € à�$”+ÐÐÝÐ8¸3Ñ>Ñ?Ô?Ð?à×#Ò#Ñ%Ô%ˆØˆŒ	ØÔ+ˆŒØ�&Š=ˆ=Ý)¨$¨r°¨r¬(°[Ñ*@À4ÈÈÈÄ9Ñ*LÑMÔMˆEŒNØ!ˆDŒNØ!%ˆEÔÐå)¨$Ñ/Ô/ˆEŒNØ�Š�t”y $Ñ'Ô'Ð'àŒ;˜&Ò Ð Ø#Ô7ˆEÔØÐ$Ô$¨Ô)9¸AÑ)=ÀÑ(CÑCÐ$Ô$à#Ô3¸¼ÀqÑ8HÈBÑ7NÑOˆÔð
 	Œ	�Š˜ Ô!5¸¼	¿ºÑ8HÔ8HÑ!HÑIÑJÔJÐJØÔ# t¤y§~¢~Ñ'7Ô'7Ò7Ð7Ð7Ð7à�Š�c˜5Ñ!Ô!Ð!Ð!Ð!r   c                ó   — | j         |         S rR   rS   rT   s     r   rf   zSFNTWriter.__getitem__5  s   € ØŒ{˜3ÔÐr   c                óÆ  — t          | j                             ¦   «         ¦  «        }t          |¦  «        | j        k    r&t          d| j        t          |¦  «        fz  ¦  «        ‚| j        dk    �rœd| _        d| _        d| _	        | xj	        dt          |¦  «        z  z  c_	        |D ] \  }}| xj	        |j
        dz   dz  z  c_	        Œ!| j        r| j        nt          ¦   «         }|j        � |j        �|j        | _        |j        | _        nNt          | d
¦  «        r0t!          j        d| j        dd…         ¦  «        \  | _        | _        ndx| _        | _        |j        r•t          |j        ¦  «        | _        | j                             dd¦  «         | j                             ¦   «         | _        t3          |j        ¦  «        }t          |¦  «        | _        | j                             |¦  «         ndx| _        x| _        | _        |j        r³| j                             dd¦  «         | j                             ¦   «         }|dz   dz  }| j                             d||z
  z  ¦  «         | j                             ¦   «         | _        t          |j        ¦  «        | _        | j                             |j        ¦  «         ndx| _        | _        | j                             dd¦  «         | j                             ¦   «         | _        n| j        rJ d| j        z  ¦   «         ‚	 tA          j!        | j"        | ¦  «        }| j                             | j#        | j$        z   ¦  «         d}	|D ]$\  }}|dk    rd}	|| %                    ¦   «         z   }Œ%|	r|  &                    |¦  «         | j                             | j#        ¦  «         | j                             |¦  «         d	S )zTAll tables must have been written to disk. Now write the
        directory.
        z-wrong number of tables; expected %d, found %dr$   r#   r   r_   r    rƒ   r³   Nr´   z>HHr   r]   rŠ   r¡   r�   r\   r!   )'rC   rE   rD   r9   r@   r	   r/   r¤   ÚreservedÚtotalSfntSizer¸   r0   rF   ÚmajorVersionÚminorVersionr4   Ústructr:   r´   ÚmetaDataÚmetaOrigLengthr-   r   rs   Ú
metaOffsetrŽ   Ú
metaLengthr®   ÚprivDataÚ
privOffsetÚ
privLengthr¹   r   Úpackr¢   r«   r£   ÚtoStringÚwriteMasterChecksum)
rG   rE   rB   rL   rK   ÚcompressedMetaDataÚoffÚ	paddedOffÚ	directoryÚseenHeads
             r   rk   zSFNTWriter.close8  s²  € õ ˜œ×)Ò)Ñ+Ô+Ñ,Ô,ˆÝˆv‰;Œ;˜$œ.Ò(Ð(ÝØ?Ø”>¥3 v¡;¤;Ð/ñ0ñô ð ð
 Œ;˜&Ò Ñ Ø$ˆDŒNØˆDŒMà!#ˆDÔØÐÔ "¥s¨6¡{¤{Ñ"2Ñ2ÐÔØ$ð Bð B‘
��UØÐ"Ô" uÔ'7¸!Ñ';¸rÑ&AÑAÐ"Ô"Ð"à&*¤oÐK�4”?�?½>Ñ;KÔ;KˆDØÔ Ð,°Ô1BÐ1NØ$(Ô$5�Ô!Ø$(Ô$5�Ô!Ð!å˜4 Ñ-Ô-ð >Ý;A¼=Ø˜tœ~¨a°¨cÔ2ñ<ô <Ñ8�DÔ% tÔ'8Ð'8ð =>Ð=�DÔ%¨Ô(9ØŒ}ð LÝ&)¨$¬-Ñ&8Ô&8�Ô#Ø”	—’˜q !Ñ$Ô$Ð$Ø"&¤)§.¢.Ñ"2Ô"2�”Ý%-¨d¬mÑ%<Ô%<Ð"Ý"%Ð&8Ñ"9Ô"9�”Ø”	—’Ð 2Ñ3Ô3Ð3Ð3àJKÐK�”ÐK $¤/°DÔ4GØŒ}ð 	6Ø”	—’˜q !Ñ$Ô$Ð$Ø”i—n’nÑ&Ô&�Ø  1™W¨™N�	Ø”	—’ ¨°S©Ñ 9Ñ:Ô:Ð:Ø"&¤)§.¢.Ñ"2Ô"2�”Ý"% d¤mÑ"4Ô"4�”Ø”	—’ ¤Ñ.Ô.Ð.Ð.à45Ð5�” $¤/àŒI�NŠN˜1˜aÑ Ô Ð Øœ)Ÿ.š.Ñ*Ô*ˆDŒKˆKð ”{ÐGÐGÐ$9¸D¼KÑ$GÑGÔGÐGØå”L Ô!5°tÑ<Ô<ˆ	àŒ	�Š�tÔ+¨dÔ.@Ñ@ÑAÔAÐAØˆØ ð 	5ð 	5‰JˆC�Ø�fŠ}ˆ}Ø�Ø! E§N¢NÑ$4Ô$4Ñ4ˆIˆIØð 	0Ø×$Ò$ YÑ/Ô/Ð/ØŒ	�Š�tÔ+Ñ,Ô,Ð,ØŒ	�Š˜	Ñ"Ô"Ð"Ð"Ð"r   c                ó$  — g }| j                              ¦   «         D ]'}|                     | j         |         j        ¦  «         Œ(| j        t
          k    rÇddlm}  || j        d¦  «        \  | _	        | _
        | _        t          j        t          | ¦  «        }t          | j                              ¦   «         ¦  «        }|D ]Z\  }}t          ¦   «         }|j        |_        |j        |_        |j        |_        |j        |_        ||                     ¦   «         z   }Œ[t.          t1          | j         ¦  «        t2          z  z   }|t1          |¦  «        k    sJ ‚|                     t5          |¦  «        ¦  «         t7          |¦  «        dz  }	d|	z
  dz  }
|
S )Nr   rž   r    ì   ÿÿ l   º/ac )rE   rX   Úappendrb   r2   r1   r§   rŸ   r@   r¨   r©   rª   r   rÉ   r;   rC   rD   rB   r·   r)   r¸   r¹   rÊ   r8   r9   r¥   ra   Úsum)rG   rÏ   Ú	checksumsrB   rŸ   rE   rL   Ú	sfntEntryÚdirectory_endre   Úchecksumadjustments              r   Ú_calcMasterChecksumzSFNTWriter._calcMasterChecksum  s�  € àˆ	Ø”;×#Ò#Ñ%Ô%ð 	8ð 	8ˆCØ×Ò˜Tœ[¨Ô-Ô6Ñ7Ô7Ð7Ð7àÔÕ"4Ò4Ð4à6Ð6Ð6Ð6Ð6Ð6àDRÀNØ” ñEô EÑAˆDÔ˜dÔ0°$´/õ  œÕ%8¸$Ñ?Ô?ˆIÝ˜DœK×-Ò-Ñ/Ô/Ñ0Ô0ˆFØ$ð =ð =‘
��UÝ.Ñ0Ô0�	Ø %¤	�	”Ø%*¤^�	Ô"Ø#(Ô#3�	Ô Ø#(Ô#3�	Ô Ø%¨	×(:Ò(:Ñ(<Ô(<Ñ<�	�	å)­C°´Ñ,<Ô,<Õ?UÑ,UÑUˆØ¥ I¡¤Ò.Ð.Ð.Ð.à×Ò� iÑ0Ô0Ñ1Ô1Ð1Ý�y‘>”> JÑ.ˆà(¨8Ñ3°zÑAÐØ!Ð!r   c                óä   — |                       |¦  «        }| j                             | j        d         j        dz   ¦  «         | j                             t          j        d|¦  «        ¦  «         d S )Nr\   r]   ú>L)rÙ   r-   r   rE   r)   r®   rÁ   rÉ   )rG   rÏ   rØ   s      r   rË   zSFNTWriter.writeMasterChecksumŸ  s`   € Ø!×5Ò5°iÑ@Ô@ÐàŒ	�Š�t”{ 6Ô*Ô1°AÑ5Ñ6Ô6Ð6ØŒ	�Š�œ DÐ*<Ñ=Ô=Ñ>Ô>Ð>Ð>Ð>r   c                ó   — dS ©NFr�   rY   s    r   ÚreordersTableszSFNTWriter.reordersTables¥  s   € Øˆur   )r%   NN)r}   r~   r   r   rM   r±   rº   rf   rk   rÙ   rË   rÞ   r�   r   r   r—   r—   Í   s±   € € € € € ð#ð #ð #ð, 'ØØð/$ð /$ð /$ð /$ðb!ð !ð !ð"ð "ð "ð< ð  ð  ðE#ð E#ð E#ðN"ð "ð "ð@?ð ?ð ?ðð ð ð ð r   r—   a  
		> # big endian
		TTCTag:                  4s # "ttcf"
		Version:                 L  # 0x00010000 or 0x00020000
		numFonts:                L  # number of fonts
		# OffsetTable[numFonts]: L  # array with offsets from beginning of file
		# ulDsigTag:             L  # version 2.0 only
		# ulDsigLength:          L  # version 2.0 only
		# ulDsigOffset:          L  # version 2.0 only
z¥
		> # big endian
		ulDsigTag:               L  # version 2.0 only
		ulDsigLength:            L  # version 2.0 only
		ulDsigOffset:            L  # version 2.0 only
i   i  i   i  zä
		> # big endian
		sfntVersion:    4s
		numTables:      H    # number of tables
		searchRange:    H    # (max2 <= numTables)*16
		entrySelector:  H    # log2(max2 <= numTables)
		rangeShift:     H    # numTables*16-searchRange
zc
		> # big endian
		tag:            4s
		checkSum:       L
		offset:         L
		length:         L
ab  
		> # big endian
		signature:      4s   # "wOFF"
		sfntVersion:    4s
		length:         L    # total woff file size
		numTables:      H    # number of tables
		reserved:       H    # set to 0
		totalSfntSize:  L    # uncompressed size
		majorVersion:   H    # major version of WOFF file
		minorVersion:   H    # minor version of WOFF file
		metaOffset:     L    # offset to metadata block
		metaLength:     L    # length of compressed metadata
		metaOrigLength: L    # length of uncompressed metadata
		privOffset:     L    # offset to private data block
		privLength:     L    # length of private data block
zº
		> # big endian
		tag:            4s
		offset:         L
		length:         L    # compressed length
		origLength:     L    # original length
		checkSum:       L    # original checksum
c                  óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )r2   c                ó   — d| _         d S rÝ   )rµ   rY   s    r   rM   zDirectoryEntry.__init__û  s   € Ø!ˆÔÐÐr   c                óì   — |                      | j        ¦  «        }t          |¦  «        | j        k    r&t          d| j        t          |¦  «        fz  ¦  «        ‚t	          j        | j        || ¦  «         d S )Nz?unexpected end of table directory: expected %d bytes but got %d)r   r¬   r9   r	   r   r:   Úformat©rG   r-   rK   s      r   rA   zDirectoryEntry.fromFileþ  sr   € Ø�yŠy˜œÑ)Ô)ˆÝˆt‰9Œ9˜œÒ'Ð'õ ØQØ”?¥C¨¡I¤IÐ.ñ/ñô ð õ 	Œ�t”{ D¨$Ñ/Ô/Ð/Ð/Ð/r   c                ó<   — t          j        | j        || ¦  «         d S rR   )r   r:   râ   )rG   Ústrs     r   Ú
fromStringzDirectoryEntry.fromString	  s   € ÝŒ�t”{ C¨Ñ.Ô.Ð.Ð.Ð.r   c                ó6   — t          j        | j        | ¦  «        S rR   )r   rÉ   râ   rY   s    r   rÊ   zDirectoryEntry.toString  s   € ÝŒ|˜DœK¨Ñ.Ô.Ð.r   c                ó¦   — t          | d¦  «        r$d| j        j        | j        t	          | ¦  «        fz  S d| j        j        t	          | ¦  «        fz  S )NrB   z<%s '%s' at %x>z
<%s at %x>)r4   Ú	__class__r}   rB   ÚidrY   s    r   Ú__repr__zDirectoryEntry.__repr__  sO   € Ý�4˜ÑÔð 	FØ$¨¬Ô(?ÀÄÍ2ÈdÉ8Ì8Ð'TÑTÐTà 4¤>Ô#:½B¸t¹H¼HÐ"EÑEÐEr   c                ó�  — |                      | j        ¦  «         |                     | j        ¦  «        }t	          |¦  «        | j        k    rOt          | dd ¦  «        }t          d|�t          |¦  «        nd| j        t	          |¦  «        | j        fz  ¦  «        ‚t          | j	        d¦  «        r|  
                    |¦  «        }|S )NrB   zLunexpected end of '%s' table data: expected %d bytes but got %d at offset %dú????Ú
decodeData)r   r)   r   r¹   r9   Úgetattrr	   r   r4   ré   rî   )rG   r-   rK   rB   s       r   r`   zDirectoryEntry.loadData  sÂ   € Ø�	Š	�$”+ÑÔÐØ�yŠy˜œÑ%Ô%ˆÝˆt‰9Œ9˜œÒ#Ð#õ ˜$  tÑ,Ô,ˆCÝð"ð !$ •C˜‘H”H�H°VØ”KÝ˜‘I”IØ”Kð	ññ	ô 	ð 	õ �4”> <Ñ0Ô0ð 	)Ø—?’? 4Ñ(Ô(ˆDØˆr   c                óà   — t          | j        d¦  «        r|                      |¦  «        }t          |¦  «        | _        |                     | j        ¦  «         |                     |¦  «         d S )NÚ
encodeData)r4   ré   rñ   r9   r¹   r   r)   r®   rã   s      r   r¶   zDirectoryEntry.saveData+  s`   € Ý�4”> <Ñ0Ô0ð 	)Ø—?’? 4Ñ(Ô(ˆDÝ˜$‘i”iˆŒØ�	Š	�$”+ÑÔÐØ�
Š
�4ÑÔÐÐÐr   c                ó   — |S rR   r�   )rG   ÚrawDatas     r   rî   zDirectoryEntry.decodeData2  s   € Øˆr   c                ó   — |S rR   r�   )rG   rK   s     r   rñ   zDirectoryEntry.encodeData5  s   € Øˆr   N)r}   r~   r   rM   rA   ræ   rÊ   rë   r`   r¶   rî   rñ   r�   r   r   r2   r2   ú  sž   € € € € € ð"ð "ð "ð	0ð 	0ð 	0ð/ð /ð /ð/ð /ð /ðFð Fð Fðð ð ð,ð ð ðð ð ðð ð ð ð r   r2   c                  ó   — e Zd ZeZeZdS )r1   N)r}   r~   r   ÚsfntDirectoryEntryFormatrâ   r¥   r¬   r�   r   r   r1   r1   9  s   € € € € € Ø%€FØ'€J€J€Jr   r1   c                  ó2   ‡ — e Zd ZeZeZˆ fd„Zd„ Zd„ Z	ˆ xZ
S )r<   c                óœ   •— t          t          | ¦  «                             ¦   «          t          t          d¦  «        st          | _        d S d S )NÚzlibCompressionLevel)Úsuperr<   rM   r4   ÚZLIB_COMPRESSION_LEVELrù   )rG   ré   s    €r   rM   zWOFFDirectoryEntry.__init__B  sN   ø€ ÝÕ  $Ñ'Ô'×0Ò0Ñ2Ô2Ð2õ Õ)Ð+AÑBÔBð 	?Ý(>ˆDÔ%Ð%Ð%ð	?ð 	?r   c                óz  — dd l }| j        | j        k    r|}n£t          t	          | dd ¦  «        pd¦  «        }| j        | j        k    rt          d|| j        | j        fz  ¦  «        ‚|                     |¦  «        }t          |¦  «        | j        k    r't          d|| j        t          |¦  «        fz  ¦  «        ‚|S )Nr   rB   rí   zTcorrupt WOFF table '%s': compressed length %d is not smaller than original length %dzHunexpected size for decompressed WOFF table '%s': expected %d but got %d)r’   r¹   r¸   r   rï   r	   Ú
decompressr9   )rG   ró   r’   rK   rB   s        r   rî   zWOFFDirectoryEntry.decodeDataM  sÖ   € ØˆˆˆàŒ;˜$œ/Ò)Ð)ØˆDˆDõ •g˜d E¨4Ñ0Ô0Ð:°FÑ;Ô;ˆCØŒ{˜dœoÒ-Ð-Ý ð6à˜DœK¨¬Ð9ñ:ñô ð ð
 —?’? 7Ñ+Ô+ˆDÝ�4‰yŒy˜DœOÒ+Ð+Ý ð-Ø03°T´_ÅcÈ$ÁiÄiÐ/PñQñô ð ð ˆr   c                óî   — t          |¦  «        | _        | j        st          || j        ¦  «        }| j        st          |¦  «        | j        k    r|}| j        | _        n|}t          |¦  «        | _        |S rR   )r9   r¸   rµ   rŽ   rù   r¹   )rG   rK   ÚcompressedDataró   s       r   rñ   zWOFFDirectoryEntry.encodeDataf  ss   € Ý˜d™)œ)ˆŒØÔ ð 	GÝ% d¨DÔ,EÑFÔFˆNØÔð 	'¥ NÑ 3Ô 3°t´Ò FÐ FàˆGØœ/ˆDŒKˆKà$ˆGÝ˜g™,œ,ˆDŒKØˆr   )r}   r~   r   ÚwoffDirectoryEntryFormatrâ   ÚwoffDirectoryEntrySizer¬   rM   rî   rñ   Ú__classcell__)ré   s   @r   r<   r<   >  s`   ø€ € € € € Ø%€FØ'€Jð	?ð 	?ð 	?ð 	?ð 	?ðð ð ð2ð ð ð ð ð ð r   r<   c                  ó    — e Zd ZdZdd„Zd„ ZdS )rF   r$   Nc                óJ  — d | _         d | _        d | _        d | _        |�r�|j         | _         |j        | _        |j        rÖ|j                             |j        ¦  «         |j                             |j        ¦  «        }t          |¦  «        |j        k    r&t          d|j        t          |¦  «        fz  ¦  «        ‚|                      |¦  «        }t          |¦  «        |j        k    r&t          d|j        t          |¦  «        fz  ¦  «        ‚|| _        |j        r‡|j                             |j        ¦  «         |j                             |j        ¦  «        }t          |¦  «        |j        k    r&t          d|j        t          |¦  «        fz  ¦  «        ‚|| _        d S d S d S )Nz=unexpected end of WOFF metadata: expected %d bytes but got %dzFunexpected size for decompressed WOFF metadata: expected %d but got %dzAunexpected end of WOFF private data: expected %d bytes but got %d)r¿   rÀ   rÂ   rÆ   rÅ   r-   r   rÄ   r   r9   r	   Ú_decompressrÃ   rÈ   rÇ   )rG   Úreaderró   rK   s       r   rM   zWOFFFlavorData.__init__w  s½  € Ø ˆÔØ ˆÔØˆŒØˆŒØñ 	%Ø &Ô 3ˆDÔØ &Ô 3ˆDÔð Ô ð %Ø”× Ò  Ô!2Ñ3Ô3Ð3Ø œ+×*Ò*¨6Ô+<Ñ=Ô=�Ý�w‘<”< 6Ô#4Ò4Ð4Ý$ð%Ø(.Ô(9½3¸w¹<¼<Ð'HñIñô ð ð ×'Ò'¨Ñ0Ô0�Ý�t‘9”9 Ô 5Ò5Ð5Ý$ð1Ø4:Ô4IÍ3ÈtÉ9Ì9Ð3UñVñô ð ð !%�”ØÔ ð %Ø”× Ò  Ô!2Ñ3Ô3Ð3Ø”{×'Ò'¨Ô(9Ñ:Ô:�Ý�t‘9”9 Ô 1Ò1Ð1Ý$ð+Ø.4Ô.?ÅÀTÁÄÐ-KñLñô ð ð !%�”��ð;	%ð 	%ð*%ð %r   c                ó4   — dd l }|                     |¦  «        S )Nr   )r’   rý   )rG   ró   r’   s      r   r  zWOFFFlavorData._decompress›  s   € Øˆˆˆà�Š˜wÑ'Ô'Ð'r   rR   )r}   r~   r   ÚFlavorrM   r  r�   r   r   rF   rF   t  s=   € € € € € Ø€Fð"%ð "%ð "%ð "%ðH(ð (ð (ð (ð (r   rF   c                ó8  — t          | ¦  «        dz  }|r| dd|z
  z  z  } d}d}|dz  dk    sJ ‚t          dt          | ¦  «        |¦  «        D ]L}| |||z   …         }t          j        dt          |¦  «        dz  z  |¦  «        }|t	          |¦  «        z   dz  }ŒM|S )a,  Calculate the checksum for an arbitrary block of data.

    If the data length is not a multiple of four, it assumes
    it is to be padded with null byte.

            >>> print(calcChecksum(b"abcd"))
            1633837924
            >>> print(calcChecksum(b"abcdxyz"))
            3655064932
    r   r¡   r   i   ú>%dLrÒ   )r9   r?   rÁ   r:   rÔ   )rK   Ú	remainderÚvalueÚ	blockSizer*   ÚblockÚlongss          r   ra   ra   ¡  s½   € õ �D‘	”	˜A‘€IØð (Ø�˜˜Y™Ñ'Ñ'ˆØ€EØ€IØ�q‰=˜AÒÐÐÐÝ�1•c˜$‘i”i Ñ+Ô+ð 2ð 2ˆØ�Q˜˜Y™Ð&Ô'ˆÝ”˜f­¨E©
¬
°a©Ñ8¸%Ñ@Ô@ˆØ�˜U™œÑ# zÑ1ˆˆØ€Lr   c                ó¤  — |                       d¦  «         |                      t          ¦  «        }t          |¦  «        t          k    rt	          d¦  «        ‚t          ¦   «         }t          j        t          ||¦  «         |j	        dk    rt	          d¦  «        ‚|j
        t          t          t          t          fv sJ d|j
        z  ¦   «         ‚t          j        d|j        z  |                      |j        dz  ¦  «        ¦  «        |_        |j
        t          t          fv r\|                      t$          ¦  «        }t          |¦  «        t$          k    rt	          d¦  «        ‚t          j        t&          ||¦  «         |j
        t          t          fv rÀ|                      d¦  «        }t          |¦  «        dk    rt	          d¦  «        ‚t          j        d|¦  «        d         |_        |                      |j        dz  ¦  «        }t          |¦  «        |j        dz  k    rt	          d¦  «        ‚t          j        d|j        z  |¦  «        |_        |S )	Nr   r"   ÚttcfzNot a Font Collectionúunrecognized TTC version 0x%08xr
  r   rÛ   )r   r   ÚttcHeaderSizer9   r	   r   r   r:   ÚttcHeaderFormatÚTTCTagÚVersionÚTTC_V1ÚTTC_V1_1ÚTTC_V2ÚTTC_V2_1rÁ   r6   r7   ÚttcTailSizeV2ÚttcTailFormatV2r5   r    )r-   rK   rG   s      r   r3   r3   ¹  sð  € Ø‡I‚Iˆa�L„L€LØ�9Š9•]Ñ#Ô#€DÝ
ˆ4�y„y•MÒ!Ð!ÝÐBÑCÔCÐCÝÑÔ€DÝ„N•? D¨$Ñ/Ô/Ð/Ø„{�fÒÐÝÐ0Ñ1Ô1Ð1ØŒ<�F¥H­fµhÐ?Ð?Ð?Ð?Ø)¨D¬LÑ8ñ @Ô?Ð?õ ”}Ø�”Ñ §	¢	¨$¬-¸!Ñ*;Ñ <Ô <ñô €DÔð „|�¥Ð)Ð)Ð)à�yŠy�Ñ'Ô'ˆÝˆt‰9Œ9�Ò%Ð%ÝÐFÑGÔGÐGÝŒ•¨¨dÑ3Ô3Ð3Ø„|�¥(Ð+Ð+Ð+Ø�yŠy˜‰|Œ|ˆÝˆt‰9Œ9˜Š>ˆ>ÝÐFÑGÔGÐGÝœ t¨TÑ2Ô2°1Ô5ˆŒØ�yŠy˜œ¨!Ñ+Ñ,Ô,ˆÝˆt‰9Œ9˜œ¨Ñ*Ò*Ð*ÝÐFÑGÔGÐGÝ"œM¨&°4´>Ñ*AÀ4ÑHÔHˆÔØ€Kr   c                ó  — t          ¦   «         }d|_        ||_        |j        t          t          t
          t          fv sJ d|j        z  ¦   «         ‚||_        |                      d¦  «         |  	                    t          j        t          |¦  «        ¦  «         |                      ¦   «         }|  	                    t          j        d|j        z  gdg|j        z  ¢R Ž ¦  «         |t
          t          fv r*|  	                    t          j        dddd¦  «        ¦  «         |t          t          fv rT|  	                    t          j        d|¦  «        ¦  «         |  	                    t          j        d|z  gdg|z  ¢R Ž ¦  «         |S )Nr  r  r   r
  z>3LrÛ   )r   r  r  r  r  r  r  r6   r   r®   r   rÉ   r  rs   rÁ   )r-   r6   Úversionr5   rG   r)   s         r   ÚwriteTTCHeaderr  Ú  sW  € ÝÑÔ€DØ€D„KØ€D„LØŒ<�F¥H­fµhÐ?Ð?Ð?Ð?Ø)¨D¬LÑ8ñ @Ô?Ð?ð €D„MØ‡I‚Iˆa�L„L€LØ‡J‚J�wŒ|�O¨TÑ2Ô2Ñ3Ô3Ð3Ø�YŠY‰[Œ[€FØ‡J‚J�vŒ{˜6 D¤MÑ1ÐJ°a°S¸4¼=Ñ5HÐJÐJÐJÑKÔKÐKØ•6�8Ð$Ð$Ð$ð 	�
Š
•6”;˜u a¨¨AÑ.Ô.Ñ/Ô/Ð/Ø•8�XÐ&Ð&Ð&Ø�
Š
•6”;˜t YÑ/Ô/Ñ0Ô0Ð0Ø�
Š
•6”;˜v¨	Ñ1ÐF°a°S¸9±_ÐFÐFÐFÑGÔGÐGØ€Mr   Ú__main__);Ú__doc__Ú
__future__r   Úcollections.abcr   Úior   Útypesr   ÚfontTools.misc.textToolsr   ÚfontTools.miscr   r§   r	   r
   rÁ   Úcollectionsr   ÚloggingÚ	getLoggerr}   rc   r   r   rû   r‘   r”   rŽ   r—   r  Úcalcsizer  r  r  r  r  r  r  r;   r8   rö   r¥   r>   r=   r   r  r2   r1   r<   rF   ra   r3   r  ÚsysÚdoctestÚexitÚtestmodÚfailedr�   r   r   ú<module>r1     sw  ððð ð #Ð "Ð "Ð "Ð "Ð "à $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø (Ð (Ð (Ð (Ð (Ð (Ø "Ð "Ð "Ð "Ð "Ð "Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø €€€à€gÔ˜Ñ!Ô!€ðA$ð A$ð A$ð A$ð A$�ñ A$ô A$ð A$ðJ Ð ð €
ð 	ØØØØ	Ø	Ø	Ø	Ø
ðð €ð 0ð Bð Bð Bð Bð&Yð Yð Yð Yð Y�ñ Yô Yð Yð|	€ð !�Ô  Ñ1Ô1€ð€ð !�Ô  Ñ1Ô1€à	€Ø€Ø	€Ø€ðÐ ð %�GÔ$Ð%8Ñ9Ô9Ð ðÐ ð *˜Ô)Ð*BÑCÔCÐ ðÐ ð" %�GÔ$Ð%8Ñ9Ô9Ð ðÐ ð *˜Ô)Ð*BÑCÔCÐ ð<ð <ð <ð <ð <�Vñ <ô <ð <ð~(ð (ð (ð (ð (˜ñ (ô (ð (ð
3ð 3ð 3ð 3ð 3˜ñ 3ô 3ð 3ðl*(ð *(ð *(ð *(ð *(ñ *(ô *(ð *(ðZð ð ð0ð ð ðB ,2¸Qð ð ð ð ð, ˆzÒÐØ€J€J€JØ€N€N€Nà€C„Hˆ_ˆWŒ_ÑÔÔ%Ñ&Ô&Ð&Ð&Ð&ð	 Ðr   