
    #Vf#s                         d dl mZmZmZmZm	Z	 d dl
mZ d dlZd dlmZmZ d dlZd dlZd dlZd dlZdZdZdZdZd	Zd
ZdZdZdZdZdZ ej>                  e       Z! G d de"      Z#d Z$edz   fdZ%	 ddZ&d Z'd Z(d Z)y)    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatotRound)safeEvalN)Counterdefaultdicti   i @  i       @   ?      i  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	i dfd	Z
d
 Zd Zed        Zed        Zed        Zd Zedd       Zed        Zed        Zed        Zed        Zed        Zd Zd Zd Zd ZddZd Zd Zy)TupleVariationc                 N    |j                         | _        t        |      | _        y N)copyaxeslistcoordinates)selfr   r   s      n/var/www/html/software/conda/envs/catlas/lib/python3.12/site-packages/fontTools/ttLib/tables/TupleVariation.py__init__zTupleVariation.__init__&   s    IIK	,    c                     dj                  t        | j                  j                         D cg c]  \  }}|d| c}}            }d|d| j                  dS c c}}w )N,=z<TupleVariation  >)joinsortedr   itemsr   )r   namevaluer   s       r   __repr__zTupleVariation.__repr__*   sP    xxARSutU+ST
 ,01A1ABB Ts   Ac                 j    | j                   |j                   k(  xr | j                  |j                  k(  S r   )r   r   )r   others     r   __eq__zTupleVariation.__eq__0   s+    5#4#44Pejj9PPr   c                     d | j                   vr
t               S t        t        | j                         D cg c]
  \  }}|	| c}}      }|r|S d S c c}}w r   )r   	frozenset	enumerate)r   ipuseds       r   getUsedPointszTupleVariation.getUsedPoints3   sS    t''';	$2B2B(CU1q}!UVt%% Vs   
A
A
c                 :    t        d | j                  D              S )zReturns True if this TupleVariation has any visible impact.

        If the result is False, the TupleVariation can be omitted from the font
        without making any visible difference.
        c              3   $   K   | ]  }|d u 
 y wr    .0cs     r   	<genexpr>z+TupleVariation.hasImpact.<locals>.<genexpr>A   s     ;Q1D=;   )anyr   )r   s    r   	hasImpactzTupleVariation.hasImpact;   s     ;$*:*:;;;r   c           	      
   |j                  d       |j                          |D ]  }| j                  j                  |      }|!|\  }}}t	        |d      }t        |d      }||k(  r$||k(  r|j                  d|t        |d             n>d|fdt        |d      fdt        |d      fd	t        |d      fg}	|j                  d|	       |j                           d
}
t        | j                        D ]  \  }}t        |      t        k(  r<t        |      dk(  r.|j                  d||d   |d          |j                          d}
Tt        |      t        k(  r'|j                  d||       |j                          d}
|t        j                  d       |j!                  d|z         |j                          d}
 |
s!|j!                  d       |j                          |j#                  d       |j                          y )Ntuple        coord   )axisr$   r?   minr$   maxF   deltar      )ptxyT)cvtr$   zbad delta formatzbad delta #%dz	no deltas)begintagnewliner   getr@   rA   	simpletagfl2strr+   r   typer;   lenintlogerrorcommentendtag)r   writeraxisTagsr?   r$   minValuemaxValuedefaultMinValuedefaultMaxValueattrswrote_any_deltasr,   rC   s                r   toXMLzTupleVariation.toXMLC   s     	!DIIMM$'E ,1)%"%eS/"%eS/.83N$$W4veR?P$Q  x 45 &"34x 45	E $$We4 !	!" !!$"2"23 	(HAuE{e#E
a  Q%(eAh G #' e#  au = #' "		,-23 #' 	(  NN;'NNgr   c           	      d   |dk(  rw|d   }t        |d   d      }t        |d      }t        |d      }t        |j                  d|      d      }t        |j                  d|      d      }	|||	f| j                  |<   y |dk(  rd	|v r<t        |d	         }
t        |d
         }t        |d         }||f| j                  |
<   y d|v r,t        |d         }t        |d         }|| j                  |<   y t        j                  ddj                  t        |j                                     z         y y )Nr=   r?   r$   r>   r<   r@   rA   rC   rE   rF   rG   rH   zbad delta format: %sz, )str2flr@   rA   rK   r   r   r   rQ   warningr    r!   keys)r   r#   r[   _contentr?   r$   rY   rZ   rW   rX   pointrF   rG   rH   s                 r   fromXMLzTupleVariation.fromXMLl   s$   7?=D5>2.E!%oO!%oOeii?DHeii?DH'9DIIdOW_u} t-U3Z(U3Z(+,a&  '%uU|, w0(-  %2TYYvejjl?S5TTU r   Nc           	         t        | j                  j                               t        |      k  s"J d| j                  j                         |f       g }g }|$| j                         }|y| j	                  |      }| j                  |      }|j                  |      }|t        }|j                  |       | j                  |      }	|	|t        z  }|j                  |	       |r|t        z  }|j                  |       |j                  | j                                dj                  |      }|j                  dt        j                   dt#        |      |             dj                  |      |fS )NzUnknown axis tag found.)r   r   r   r   >HH)setr   ra   r/   compilePointscompileCoordrK   EMBEDDED_PEAK_TUPLEappendcompileIntermediateCoordINTERMEDIATE_REGIONPRIVATE_POINT_NUMBERScompileDeltasr    insertstructpackrO   )
r   rV   sharedCoordIndices	pointData	tupleDataauxData
usedPointsr=   flagsintermediateCoords
             r   compilezTupleVariation.compile   sZ   499>>#$H5 	
%IINN8
 	
5 	++-J!**:6I!!(+"&&u-='EU# 99(C(((E./ **ENN9%t))+,((7#FKKs7|UCDxx	"G++r   c           
          g }| j                   }|D ]Y  }|j                  |      }||j                  d       (|j                  t        j                  dt        |d   d                   [ dj                  |      S )Ns     >hrD   r>   r   )r   rK   rk   rq   rr   fl2fir    )r   rV   resultr   r?   triples         r   ri   zTupleVariation.compileCoord   sr    yy 	GDXXd^F~g&fkk$fQi0DEF	G xxr   c           
         d}|D ]H  }| j                   j                  |d      \  }}}t        |d      }t        |d      }||k7  s||k7  sFd} n |sy g }	g }
|D ]  }| j                   j                  |d      \  }}}|	j	                  t        j                  dt        |d                   |
j	                  t        j                  dt        |d                    dj                  |	|
z         S )NFr<   r<   r<   r<   Tr|   r>   r   )	r   rK   r@   rA   rk   rq   rr   r}   r    )r   rV   neededr?   rW   r$   rX   rY   rZ   	minCoords	maxCoordss              r   rl   z'TupleVariation.compileIntermediateCoord   s     	D(,		dO(L%HeX!%oO!%oOO+_1L	 		 	ED(,		dO(L%HeXV[[uXr/BCDV[[uXr/BCD	E xx	I-..r   c           
          i }|}| D ]3  }t        t        j                  d|||dz          d   d      ||<   |dz  }5 ||fS )Nr|   rB   r   r>   )fi2flrq   unpack)rV   dataoffsetr=   posr?   s         r   decompileCoord_zTupleVariation.decompileCoord_   s[     	DdDsQw4G H KRPE$K1HC	 czr   c                    | syt        |       } | j                          t        |       }t               }|dk  r|j	                  |       n+|j	                  |dz	  dz         |j	                  |dz         d}d}d}||k  rd}t        |      }|j	                  d       d }||k  r||k  r|| |   }	|	|z
  }
|d|
cxk  xr dk  nc }|r|
dkD  s|
dk  rnS|r|j	                  |
       n(|j	                  |
dz	         |j	                  |
dz         |	}|dz  }|dz  }||k  r||k  r||r	|dz
  ||<   n|dz
  t
        z  ||<   ||k  r|S )N    r         r   r   rD   )r   sortrO   	bytearrayrk   POINTS_ARE_WORDS)points	numPointsr~   MAX_RUN_LENGTHr   	lastValue	runLength	headerPosuseByteEncodingcurValuerC   s              r   rh   zTupleVariation.compilePoints   sv     fK	 tMM)$MM9>T12MM)d*+	IoIFIMM!"O	/i>&A!#; 9,"*&'5&8D&8O"	 #MM%(MM%1*-MM%$,/$	qQ	# 	/i>&A$ $-My!%.]6F$Fy!9 Io< r   c                 F   |dv sJ |}||   }|dz  }|t         z  dk7  r|t        z  dz  ||   z  }|dz  }|dk(  rt        |       |fS g }t        |      |k  r||   }|dz  }|t        z  dz   }d}	|t         z  dk7  rt	        j                  d      }
|dz  }nt	        j                  d      }
|}|
j                  ||||z           t        j                  dk7  r|
j                          t        |
      |k(  sJ ||z  }|j                  |
       t        |      |k  rg }d}|D ]  }||z  }|j                  |        |}~|D ch c]  }|dk  s|| k\  st        |       }}|r4t        j                  d	d
j                  t        |            d|d       ||fS c c}w )zJ(numPoints, data, offset, tableTag) --> ([point1, point2, ...], newOffset)cvargvarrD   r   r   HrB   Bbigzpoint r   z out of range in 'z' table)r   POINT_RUN_COUNT_MASKrangerO   array	frombytessys	byteorderbyteswapextendrk   strrQ   r`   r    r!   )r   r   r   tableTagr   numPointsInDatar~   	runHeadernumPointsInRunrc   r   
pointsSizeabsolutecurrentrC   r-   	badPointss                    r   decompilePoints_zTupleVariation.decompilePoints_  s    ++++s)q..14.1EE!KdSViWO1HCa)$c**&kO+S	I1HC'*>>!CNE,,2S)+a/
S)+
T#j(89:}}%!v;.000:CMM&!% &kO+*  	%EuGOOG$	% %+Gq1uYSVG	GKK88F9-.: } Hs   FFc                 T   g }g }| j                         dk(  r=| j                  D ]-  }||j                  |d          |j                  |d          / n%| j                  D ]  }||j                  |        t               }| j	                  ||       | j	                  ||       |S )NrB   r   rD   )getCoordWidthr   rk   r   compileDeltaValues_)r   deltaXdeltaYr5   bytearrs        r   ro   zTupleVariation.compileDeltasC  s    1$%% $9ad#ad#	$ %% !9a ! +  1  1r   c                    |
t               }d}t        |       }||k  re| |   }|dk(  rt        j                  | ||      }n=d|cxk  rdk  rn nt        j	                  | ||      }nt        j                  | ||      }||k  re|S )a  [value1, value2, value3, ...] --> bytearray

        Emits a sequence of runs. Each run starts with a
        byte-sized header whose 6 least significant bits
        (header & 0x3F) indicate how many values are encoded
        in this run. The stored length is the actual length
        minus one; run lengths are thus in the range [1..64].
        If the header byte has its most significant bit (0x80)
        set, all values in this run are zero, and no data
        follows. Otherwise, the header byte is followed by
        ((header & 0x3F) + 1) signed values.  If (header &
        0x40) is clear, the delta values are stored as signed
        bytes; if (header & 0x40) is set, the delta values are
        signed 16-bit integers.
        r   r   )r   rO   r   encodeDeltaRunAsZeroes_encodeDeltaRunAsBytes_encodeDeltaRunAsWords_)deltasr   r   	numDeltasr$   s        r   r   z"TupleVariation.compileDeltaValues_V  s    " ?kGK	Io3KEz$<<VS'R%#%$;;FCQ$;;FCQ Io r   c                     |}t        |       }||k  r| |   dk(  r|dz  }||k  r	| |   dk(  r||z
  }|dk\  r#|j                  t        dz         |dz  }|dk\  r#|r|j                  t        |dz
  z         |S )Nr   rD   r   r   )rO   rk   DELTAS_ARE_ZERO)r   r   r   r   r   r   s         r   r   z&TupleVariation.encodeDeltaRunAsZeroes_u  s    K	Io&+"21HC Io&+"2&L	2oNN?R/0OI 2o NN?i!m<=
r   c           	         |}t        |       }||k  r7| |   }d|cxk  rdk  sn n$|dk(  r|dz   |k  r| |dz      dk(  rn|dz  }||k  r7||z
  }|dk\  rL|j                  d       |j                  t        j                  d| ||dz                 |dz  }|dz  }|dk\  rL|r<|j                  |dz
         |j                  t        j                  d| ||              |S )Nr   r   r   rD   r   r   b)rO   rk   r   r   )r   r   r   r   r   r$   r   s          r   r   z%TupleVariation.encodeDeltaRunAsBytes_  s    K	Io3KEE(S( zcAg	1fS1Wo6J1HC Io &L	2oNN2NN5;;sF6FRK,HIJbLFOI	 2o
 NN9q=)NN5;;sF6#,>?@
r   c                    |}t        |       }||k  rA| |   }|dk(  rn6d|cxk  rdk  r n n|dz   |k  rd| |dz      cxk  rdk  rn nn|dz  }||k  rA||z
  }|dk\  rx|j                  t        dz         t        j                  d| ||dz          }t        j
                  dk7  r|j                          |j                  |       |dz  }|dz  }|dk\  rx|rh|j                  t        |dz
  z         t        j                  d| ||       }t        j
                  dk7  r|j                          |j                  |       |S )	Nr   r   r   rD   r   r   hr   )rO   rk   DELTAS_ARE_WORDSr   r   r   r   r   )r   r   r   r   r   r$   r   as           r   r   z%TupleVariation.encodeDeltaRunAsWords_  sD   K	Io3KE z %#%!Gi'VC!G_331HC1 Io2 &L	2oNN+b01C"!=>A}}%

NN1bLFOI 2o NN+y1}=>Cs!34A}}%

NN1
r   c                    g }|}t        |      | k  r||   }|dz  }|t        z  dz   }|t        z  dk7  r|j                  dg|z         n|t        z  dk7  rt        j
                  d      }|dz  }nt        j
                  d      }|}|j                  ||||z           t        j                  dk7  r|j                          t        |      |k(  sJ ||z  }|j                  |       t        |      | k  rt        |      | k(  sJ ||fS )z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)rD   r   r   rB   r   r   )
rO   DELTA_RUN_COUNT_MASKr   r   r   r   r   r   r   r   )	r   r   r   r~   r   r   numDeltasInRunr   
deltasSizes	            r   decompileDeltas_zTupleVariation.decompileDeltas_  s    &kI%S	I1HC'*>>!CNO+1qcN23 00Q6"[[-F!/!!3J"[[-F!/J  cC*,<!=>==E)OO%6{n444z!f%% &kI%& 6{i'''}r   c                 Z    d}| t         z  dk7  r||dz  z  }| t        z  dk7  r||dz  z  }|S )N   r   rB   )rj   rm   )rx   	axisCountsizes      r   getTupleSize_zTupleVariation.getTupleSize_  sD    ''A-IM!D''A-IM!Dr   c                     t        d | j                  D        d      }|yt        |      t        t        fv ryt        |      t
        u rt        |      dk(  ryt        d|z        )zmReturn 2 if coordinates are (x, y) as in gvar, 1 if single values
        as in cvar, or 0 if empty.
        c              3   &   K   | ]	  }||  y wr   r2   r3   s     r   r6   z/TupleVariation.getCoordWidth.<locals>.<genexpr>  s     H!-1Hs   Nr   rD   rB   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)nextr   rN   rP   floatr;   rO   	TypeError)r   
firstDeltas     r   r   zTupleVariation.getCoordWidth  sn     Hd&6&6H$O

U|+
u$ZA)=(*45
 	
r   c                     |dk(  ry | j                         }| j                  D cg c]   }|d n|dk(  r||z  n|d   |z  |d   |z  f" c}| _        y c c}w )Ng      ?rD   r   )r   r   )r   scalar
coordWidthds       r   scaleDeltaszTupleVariation.scaleDeltas  sz    S='')
 %%
 	 y  Q VA$-1/	0
 
s   %Ac                     | j                         }| j                  D cg c]2  }|d n+|dk(  rt        |      nt        |d         t        |d         f4 c}| _        y c c}w NrD   r   )r   r   r   )r   r   r   s      r   roundDeltaszTupleVariation.roundDeltas  sp    '')
 %%
 	 y  Q !A$-1/	0
 
s   7Ac                 6   ddl m} | j                         dk(  rt        d      d | j                  v rgt        | j                        t        |      k7  r,t        dt        | j                        t        |      fz         || j                  ||      | _        y y )Nr   )	iup_deltarD   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)fontTools.varLib.iupr   r   r   r   rO   
ValueError)r   
origCoordsendPtsr   s       r   calcInferredDeltasz!TupleVariation.calcInferredDeltas  s    21$QRR4###4##$J7 >4++,c*o>?   ))9)9:vND $r   c                    ddl m} d | j                  v ry  || j                  |||      }d |v r|r(t        d |D              rdgd gt	        |      dz
  z  z   }t        | j                  |      }t        | j                  j                               }| j                  |      \  }	}
t	        |	      t	        |
      z   }|j                  |      \  }	}
t	        |	      t	        |
      z   }||k  r|j                  | _        y y y )Nr   )iup_delta_optimize)	tolerancec              3   $   K   | ]  }|d u  
 y wr   r2   )r4   r   s     r   r6   z*TupleVariation.optimize.<locals>.<genexpr>2  s     "?19"?r7   )r   r   rD   )
r   r   r   allrO   r   r   r!   ra   rz   )r   r   r   r   isCompositer   deltaOptvarOptrV   ru   rv   unoptimizedLengthoptimizedLengths                r   optimizezTupleVariation.optimize(  s    ;4###%j&I
 8s"?h"?? #8tfH0A&BB#DIIx8F diinn./H!%h!7Iw #IW =!'!9Iw!)ns7|;O!22#)#5#5  3 r   c                 (    | j                  |       | S r   )r   )r   r   s     r   __imul__zTupleVariation.__imul__C  s     r   c                    t        |t              st        S | j                  }t	        |      }|j                  }t	        |      |k7  rt        d      | j                         dk(  r>t        t        |      |      D ]$  \  }}||   }	 |d   |d   z   |d   |d   z   f||<   & | S t        t        |      |      D ]"  \  }}||   }||	||z   ||<   |||||<   $ | S # t        $ r t        d      w xY w)Nz7cannot sum TupleVariation deltas with different lengthsrB   r   rD   z+cannot sum gvar deltas with inferred points)

isinstancer   NotImplementedr   rO   r   r   zipr   r   )r   r'   deltas1lengthdeltas2r,   d2d1s           r   __iadd__zTupleVariation.__iadd__G  s/   %0!!""W##w<6!VWW 1$U6]G4 T2QZT"$Q%"Q%-AA!?GAJT  U6]G4 $2QZ>bn!#bGAJZBN!#GAJ$  ! T$%RSSTs   C  C5r   )g      ?F)__name__
__module____qualname__r   r%   r(   r/   r9   r]   rd   rz   ri   rl   staticmethodr   rh   r   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   r   r   %   s    -CQ&<'RV, 46 $,L	 /&   > >@ 0 0d&  <    : + +Z  4  
 
	
O66r   r   c                     g }t        |      D ]-  }t        j                  | ||      \  }}|j                  |       / |S r   )r   r   r   rk   )rV   sharedTupleCountr   r   r~   _ts          r   decompileSharedTuplesr  i  sG    F#$ "228T6J	6a Mr   rD   c                     t               }|D ]   }|j                  |       }||xx   dz  cc<   " t        |j                  |      d       }|D cg c]  }|d   dkD  s|d    c}S c c}w )NrD   c                     | d    | d   fS r   r2   )items    r   <lambda>z%compileSharedTuples.<locals>.<lambda>|  s    47(DG, r   keyr   )r	   ri   r!   most_common)rV   
variationsMAX_NUM_SHARED_COORDS
coordCountvarr=   sharedCoordsr5   s           r   compileSharedTuplesr  q  s|     J   *5Q
 45,L '3Q!A$(AaD333s   A)A)c                 N   ~g }g }d }t        t              }| D ]D  }	|	j                         }
|
||
xx   dz  cc<   |j                  |	       |j                  |
       F |} ~| syt	        | d   j
                        t        fd| D              sJ d       |D ci c]  }|t        j                  |       c}t	        |       }g }g }|r@fd}t        |j                         |      d   }|j                  |          |t        z  }|D 
cg c]  }
|
|k7  r|
   nd }}
t        | |      D ]>  \  }	}|	j                  |||	      \  }}|j                  |       |j                  |       @ dj                  |      }dj                  |      }|||fS c c}w c c}
w )
NrD   )r   r   r   r   c              3   N   K   | ]  }t        |j                        k(    y wr   )rO   r   )r4   vns     r   r6   z-compileTupleVariationStore.<locals>.<genexpr>  s$      $%AMMas   "%z#Variation sets have different sizesc                 @    | d   }| d   }t        |         |dz
  z  S )Nr   rD   )rO   )pnpointSetcountcompiledPointss      r   r  z'compileTupleVariationStore.<locals>.key  s.    !uHqEE~h/0EAI>>r   r  r   )rt   )r
   rP   r/   rk   rO   r   r   r   rh   rA   r"   TUPLES_SHARE_POINT_NUMBERSr   rz   r    )r  
pointCountrV   sharedTupleIndicesuseSharedPointsnewVariations
pointDatassharedPointspointSetCountr  r   r  tupleVariationCounttuplesr   r  r-   	thisTuplethisDatar  r  s                      @@r   compileTupleVariationStorer*    s    	MJL  $M "">f"Q&!" JJqM%%&A )3  -,- 
 JW=E...x88N j/FD	?
 =..0c:1=N<0199
 ! #)L"8vcAJ 
 J
+ 1ii2DPQiR	8i H	 XXfF88D>D,,E*s   FF"c                    t        |      }g }	|t        z  dk7  rt        j                  ||||       \  }
}ng }
t	        |t
        z        D ]q  }t        j                  d|||dz          \  }}t        j                  ||      }||||z    }||||z    }|	j                  t        |||
| |||             ||z  }||z  }s |	S )Nr   rf   r   )rO   r  r   r   r   TUPLE_COUNT_MASKrq   r   r   rk   decompileTupleVariation_)r   rV   r&  r  sharedTuplesr   r   dataPosnumAxesr~   r$  r  dataSizerx   	tupleSizeru   pointDeltaDatas                    r   decompileTupleVariationStorer4    s     (mGF88Q> . ? ?gx!
g &)99:  --tC#'/BC%"00@	sY/	g((:;$
	
 	y8#$ Mr   c                    |dv sJ |       t        j                  d|dd       d   }d}|t        z  dk(  r||t        z     }	nt        j                  |||      \  }	}|t        z  dk7  r5t        j                  |||      \  }
}t        j                  |||      \  }}nt        |	      \  }
}i }|D ]  }|
|   |	|   ||   f}|dk7  s|||<    d}|t        z  dk7  rt        j                  | |||      \  }}n|}d g| z  }|dk(  rLt        j                  t        |      ||      \  }}t        ||      D ]  \  }}d|cxk  r| k  sn |||<    nw|dk(  rrt        j                  t        |      ||      \  }}t        j                  t        |      ||      \  }}t        |||      D ]  \  }}}d|cxk  r| k  sn ||f||<    t	        ||      S )	Nr   z>HrB   r   r   r   r   r   )rq   r   rj   TUPLE_INDEX_MASKr   r   rm   inferRegion_rn   r   r   rO   r   )r  r.  r$  r   rV   r   ru   rx   r   peakstartendr   r?   regionr   r   
deltas_cvtr-   rC   deltas_xdeltas_yrF   rG   s                           r   r-  r-    s    ''11'MM$Qq	*1-E
C##)E$445"228T3G	c##)#33HdCH
s!11(D#FS!$'
sD  td4j#d)3_$DJ  C%%!+$55	3
 Vj F6(99#f+yRUV
CFJ/ 	"HAuA"
"!q		" 
V	&77FYPST#&77FYPST#68X6 	#GAq!A"
"Fq		# $''r   c                 ~    i i }}| j                         D ]#  \  }}t        |d      ||<   t        |d      ||<   % ||fS )a  Infer start and end for a (non-intermediate) region

    This helper function computes the applicability region for
    variation tuples whose INTERMEDIATE_REGION flag is not set in the
    TupleVariationHeader structure.  Variation tuples apply only to
    certain regions of the variation space; outside that region, the
    tuple has no effect.  To make the binary encoding more compact,
    TupleVariationHeaders can omit the intermediateStartTuple and
    intermediateEndTuple fields.
    r<   )r"   r@   rA   )r8  r9  r:  r?   r$   s        r   r7  r7    sP     R3Ezz| $e%odsOD	$ 3<r   )T)*fontTools.misc.fixedToolsr   r   r   r}   r   rM   r   r_   r   fontTools.misc.textToolsr   r   collectionsr	   r
   iologgingrq   r   rj   rm   rn   r   r   r   r   r   r  r,  r6  	getLoggerr   rQ   objectr   r  r  r*  r4  r-  r7  r2   r   r   <module>rG     s     .  , 	   

        #   g!A	V A	H 1A10D4" KO@-F$N+(\r   