
    <`^                         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)dS )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatotRound)safeEvalN)Counterdefaultdicti   i @  i       @   ?      i  c                   D   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S ) TupleVariationc                 `    |                                 | _        t          |          | _        d S N)copyaxeslistcoordinates)selfr   r   s      Elib/python3.11/site-packages/fontTools/ttLib/tables/TupleVariation.py__init__zTupleVariation.__init__'   s'    iikk$)+&&$    c                     d                     t          d | j                                        D                                 }d|d| j        dS )N,c                 "    g | ]\  }}|d |S )= ).0namevalues      r   
<listcomp>z+TupleVariation.__repr__.<locals>.<listcomp>,   s'    YYYmtUTTT551YYYr   z<TupleVariation  >)joinsortedr   itemsr   )r   r   s     r   __repr__zTupleVariation.__repr__+   sP    	&YYtyGXGXYYYZZ	[	[$$%)TT4+;+;+;	<<r   c                 B    | j         |j         k    o| j        |j        k    S r   )r   r   )r   others     r   __eq__zTupleVariation.__eq__/   s!    		U.	.	J49
3JJr   c                     d | j         vrt                      S t          d t          | j                   D                       }|r|nd S )Nc                     g | ]	\  }}||
S r   r   )r    ips      r   r#   z0TupleVariation.getUsedPoints.<locals>.<listcomp>6   s    NNN#!AAr   )r   	frozenset	enumerate)r   useds     r   getUsedPointszTupleVariation.getUsedPoints2   sP    	!!!
++	NN4+;!<!<NNN	O	O$	4r   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V  	d S r   r   r    cs     r   	<genexpr>z+TupleVariation.hasImpact.<locals>.<genexpr>@   s&      55qQd]555555r   )anyr   )r   s    r   	hasImpactzTupleVariation.hasImpact:   s$     
55D$4555	5	55r   c           	         |                     d           |                                 |D ]}| j                            |          }||\  }}}t	          |d          }t          |d          }||k    r-||k    r'|                    d|t          |d                     nNd|fdt          |d          fdt          |d          fd	t          |d          fg}	|                    d|	           |                                 d
}
t          | j	                  D ]\  }}t          |          t          k    rOt          |          dk    r<|                    d||d         |d                    |                                 d}
lt          |          t          k    r/|                    d||           |                                 d}
|Ht                              d           |                    d|z             |                                 d}
|
s)|                    d           |                                 |                    d           |                                 d S )Ntuple        coord   )axisr"   rA   minr"   maxF   deltar      )ptxyT)cvtr"   zbad delta formatzbad delta #%dz	no deltas)begintagnewliner   getrB   rC   	simpletagfl2strr2   r   typer=   lenintlogerrorcommentendtag)r   writeraxisTagsrA   r"   minValuemaxValuedefaultMinValuedefaultMaxValueattrswrote_any_deltasr/   rE   s                r   toXMLzTupleVariation.toXMLB   s}   //'..  d9==5 %HeX%ooO%ooO?""x?'B'BgDub0A0ABBBB tnfXr""#ub!!"fXr""#	U gu%%%
NND,--  ha
5kkUs5zzQ
WeAh%(;;;
NNUs
W!5111
NNII !!!
NN?Q&'''
NN	 	>>+	>>--..r   c           	          |dk    r|d         }t          |d         d          }t          |d          }t          |d          }t          |                    d|          d          }t          |                    d|          d          }	|||	f| j        |<   d S |dk    rd	|v rMt          |d	                   }
t          |d
                   }t          |d                   }||f| j        |
<   d S d|v r6t          |d                   }t          |d                   }|| j        |<   d S t                              dd	                    t          |                                                    z             d S d S )Nr?   rA   r"   r@   r>   rB   rC   rE   rG   rH   rI   rJ   zbad delta format: %sz, )str2flrB   rC   rM   r   r   r   rS   warningr&   r'   keys)r   r!   r]   _contentrA   r"   r[   r\   rY   rZ   pointrH   rI   rJ   s                 r   fromXMLzTupleVariation.fromXMLk   sy   	W__
-4%."%%5__?__?UYYuo66;;8UYYuo66;;8x049T???w
emmU4[!!EsAsA !fDU
5<
 
 CU7^$$E!DSKK&		&..//0 1 1 1 1 1 r   Nc           	      p   t          | j                                                  t          |          k    s$J d| j                                        |f            g }g }|-|                                 }|dS |                     |          }|                     |          }|                    |          }|t          }|                    |           | 	                    |          }	|	|t          z  }|                    |	           |r|t          z  }|                    |           |                    |                                            d                    |          }|                    dt          j        dt#          |          |                     d                    |          |fS )NzUnknown axis tag found.)r   r   r   r   >HH)setr   rc   r4   compilePointscompileCoordrM   EMBEDDED_PEAK_TUPLEappendcompileIntermediateCoordINTERMEDIATE_REGIONPRIVATE_POINT_NUMBERScompileDeltasr&   insertstructpackrQ   )
r   rX   sharedCoordIndices	pointData	tupleDataauxData
usedPointsr?   flagsintermediateCoords
             r   compilezTupleVariation.compile   s   	TY^^		#h--	/	/	/2KTY^^M]M]_g1h	/	/	/)'""$$:8!!*--9


H
%
%%

 
 
'
'%
]5E33H=="5%&&&  !!5
>>)	..##%%&&&HHW'1fk%Wu==>>>	)		g	%%r   c           
      &   t                      }| j        }|D ]k}|                    |          }||                    d           /|                    t	          j        dt          |d         d                               lt          |          S )Ns     >hrF   r@   )	bytearrayr   rM   extendrs   rt   fl2fibytes)r   rX   resultr   rA   triples         r   rk   zTupleVariation.compileCoord   s    ;;&	$ ; ;dHHTNN6n
MM'
MM&+dE&)R$8$899::::	vr   c           
         d}|D ]Q}| j                             |d          \  }}}t          |d          }t          |d          }||k    s||k    rd} nR|sd S t	                      }	t	                      }
|D ]}| j                             |d          \  }}}|	                    t          j        dt          |d                               |
                    t          j        dt          |d                               |	|
z   S )NFr>   r>   r>   r>   Tr~   r@   )	r   rM   rB   rC   r   r   rs   rt   r   )r   rX   neededrA   rY   r"   rZ   r[   r\   	minCoords	maxCoordss              r   rn   z'TupleVariation.compileIntermediateCoord   s   & 
 
d#y}}T?CC8UH__?__??""O(C(CF	E )D 
 
$kk)kk) < <d#y}}T?CC8UHFKeHb&9&9::;;;FKeHb&9&9::;;;;	Y	r   c           
          i }|}| D ]>}t          t          j        d|||dz                      d         d          ||<   |dz  }?||fS )Nr~   rD   r   r@   )fi2flrs   unpack)rX   dataoffsetr?   posrA   s         r   decompileCoord_zTupleVariation.decompileCoord_   s`    
%#  dv}T4CE	?;;A>CC5;!833	r   c                 
   | sdS t          |           } |                                  t          |           }t                      }|dk     r|                    |           n3|                    |dz	  dz             |                    |dz             d}d}d}||k     rd}t          |          }|                    d           d }||k     r||k    r| |         }	|	|z
  }
|d|
cxk    odk    nc }|r|
dk    s|
dk     rn`|r|                    |
           n0|                    |
dz	             |                    |
dz             |	}|dz  }|dz  }||k     r||k    |r	|dz
  ||<   n|dz
  t
          z  ||<   ||k     |S )N    r         r   r   rF   )r   sortrQ   r   rm   POINTS_ARE_WORDS)points	numPointsr   MAX_RUN_LENGTHr   	lastValue	runLength	headerPosuseByteEncodingcurValuerE   s              r   rj   zTupleVariation.compilePoints   s    
 
% <<&++---&kk);;& 	==	==)q.D()))	==T!""".	#)i96{{9	==?	yY.88c{Hy EE))))T))))_ EDLLEAII
  !]]5]]5A:]]54<   I1HCNI# 
yY.88$  ;!AF9"Q*::F99 	i< 
-r   c                     |dv sJ |}||         }|dz  }|t           z  dk    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k    rt	          j        d          }
|dz  }nt	          j        d          }
|}|
                    ||||z                       t          j        dk    r|
                                 t          |
          |k    sJ ||z  }|	                    |
           t          |          |k     g }d}|D ]}||z  }|
                    |           |}~ fd	|D             }|rAt                              d
d                    t          |                    d|d           ||fS )zJ(numPoints, data, offset, tableTag) --> ([point1, point2, ...], newOffset)cvargvarrF   r   r   HrD   Bbigc                 F    h | ]}|d k     s|k    t          |          S )r   )str)r    r0   r   s     r   	<setcomp>z2TupleVariation.decompilePoints_.<locals>.<setcomp>6  s,    AAA!Q!y..s1vv...r   zpoint r   z out of range in 'z' table)r   POINT_RUN_COUNT_MASKrangerQ   array	frombytessys	byteorderbyteswapr   rm   rS   rb   r&   r'   )r   r   r   tableTagr   numPointsInDatar   	runHeadernumPointsInRunre   r   
pointsSizeabsolutecurrentrE   	badPointss   `               r   decompilePoints_zTupleVariation.decompilePoints_  s-    
%	%	%	%	%#I/(#((Q..%(<<BT#YN?!83S
!!&Fo%%Cy9!83!55:>5##))[F!#JJ[FJ	DS^+,---	mufoo///
f++
'
'
'
'*3	==# 	Fo%%( ('  e
e7??7&AAAAvAAA) 8;;;	**++++XXX7 8 8 8
#r   c                 ~   g }g }|                                  dk    rD| j        D ];}||                    |d                    |                    |d                    <n"| j        D ]}||                    |           t                      }|                     ||           |                     ||           |S )NrD   r   rF   )getCoordWidthr   rm   r   compileDeltaValues_)r   deltaXdeltaYr8   bytearrs        r   rq   zTupleVariation.compileDeltas<  s    &&	Q  qy
MM!A$
MM!A$	   qy
MM!KK'67+++67+++	.r   c                 H   |t                      }d}t          |           }||k     rz| |         }|dk    rt                              | ||          }nId|cxk    rdk    r n nt                              | ||          }nt                              | ||          }||k     z|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.
		Nr   r   )r   rQ   r   encodeDeltaRunAsZeroes_encodeDeltaRunAsBytes_encodeDeltaRunAsWords_)deltasr   r   	numDeltasr"   s        r   r   z"TupleVariation.compileDeltaValues_O  s    " _[[7	#&kk)i#;5qjj

0
0g
F
FCC

/
/W
E
ECC

/
/W
E
EC 	i 
.r   c                 $   |}t          |           }||k     r#| |         dk    r|dz  }||k     r| |         dk    ||z
  }|dk    r(|                    t          dz             |dz  }|dk    (|r |                    t          |dz
  z             |S )Nr   rF   r   r   )rQ   rm   DELTAS_ARE_ZERO)r   r   r   r   r   r   s         r   r   z&TupleVariation.encodeDeltaRunAsZeroes_n  s    #&kk)iF3K1,,!83 	iF3K1,,Fl)R
>>/B&'''?9 	R  5
>>/Y]3444	*r   c           	         |}t          |           }||k     rB| |         }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     B||z
  }|dk    rX|                    d           |                    t          j        d| ||dz                                 |dz  }|dz  }|dk    X|rH|                    |dz
             |                    t          j        d| ||                              |S )Nr   r   r   rF   r   r   b)rQ   rm   r   r   )r   r   r   r   r   r"   r   s          r   r   z%TupleVariation.encodeDeltaRunAsBytes_|  sC   #&kk)i#;55C	 qjjSUY&&6#a%=A+=+=	!83 	i Fl)R
>>"
>>%+c6&*:#;<<===	R<6?9	 	R
  8
>>)a-   
>>%+c6&*#566777	*r   c                    |}t          |           }||k     rM| |         }|dk    rn>d|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     M||z
  }|dk    r|                    t          dz             t          j        d| ||dz                      }t          j        dk    r|                                 |                    |           |dz  }|dz  }|dk    |rv|                    t          |dz
  z             t          j        d| ||                   }t          j        dk    r|                                 |                    |           |S )	Nr   r   r   rF   r   r   hr   )rQ   rm   DELTAS_ARE_WORDSr   r   r   r   r   )r   r   r   r   r   r"   r   as           r   r   z%TupleVariation.encodeDeltaRunAsWords_  s   #&kk)i#;5 qjj	 uQ!2!2s1u8T8T8T8TQT8T8T8T8T8T	!83) 	i* Fl)R
>>"R'((({3vfRi/0111	muajjlll
>>!	R<6?9 	R  
>>"i!m4555{3vcz*++1	muajjlll
>>!	*r   c                 r   g }|}t          |          | k     r||         }|dz  }|t          z  dz   }|t          z  dk    r|                    dg|z             n|t          z  dk    rt          j        d          }|dz  }nt          j        d          }|}|                    ||||z                       t          j        dk    r|	                                 t          |          |k    sJ ||z  }|                    |           t          |          | k     t          |          | k    sJ ||fS )z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)rF   r   r   rD   r   r   )
rQ   DELTA_RUN_COUNT_MASKr   r   r   r   r   r   r   r   )	r   r   r   r   r   r   numDeltasInRunr   
deltasSizes	            r   decompileDeltas_zTupleVariation.decompileDeltas_  sT    &#FiCy9!83!55:>?"q((
MM1#&''''$$**k#V 1$ZZk#V Z
T#c*n,-...
}v000v;;.((((:C
MM&# 	Fi$ 
V		!	!	!	!
#r   c                 b    d}| t           z  dk    r||dz  z  }| t          z  dk    r||dz  z  }|S )N   r   rD   )rl   ro   )rz   	axisCountsizes      r   getTupleSize_zTupleVariation.getTupleSize_  sJ    	
$!!a''9q=4!!a''9q=4	+r   c                     t          d | j        D             d          }|dS t          |          t          t          fv rdS t          |          t
          u rt          |          dk    rdS t          d|z            )zb Return 2 if coordinates are (x, y) as in gvar, 1 if single values
		as in cvar, or 0 if empty.
		c              3      K   | ]}||V  	d S r   r   r7   s     r   r9   z/TupleVariation.getCoordWidth.<locals>.<genexpr>  s"      BB1AMQMMMMBBr   Nr   rF   rD   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)nextr   rP   rR   floatr=   rQ   	TypeError)r   
firstDeltas     r   r   zTupleVariation.getCoordWidth  s     BB 0BBBDII*
!	*#u%%
!	*3z??a#7#7
!!+,	 	 r   c                 t    dk    rd S |                                  fd| j        D             | _        d S )Ng      ?c                 Z    g | ]'}|d n dk    r|z  n|d         z  |d         z  f(S NrF   r   r   )r    d
coordWidthscalars     r   r#   z.TupleVariation.scaleDeltas.<locals>.<listcomp>  sb        		 i 4 Aoo 	
F

	
1!v&  r   r   r   )r   r   r   s    `@r   scaleDeltaszTupleVariation.scaleDeltas  s^    s]]	6!!##*       $r   c                 `    |                                  fd| j        D             | _        d S )Nc                     g | ]E}|d n>dk    rt          |          n)t          |d                   t          |d                   fFS r   )r   )r    r   r   s     r   r#   z.TupleVariation.roundDeltas.<locals>.<listcomp>  sh        		 i 4 Aoo 	


	1!&  r   r   )r   r   s    @r   roundDeltaszTupleVariation.roundDeltas  sJ    !!##*      $r   c                 T   ddl m} |                                 dk    rt          d          d | j        v rqt          | j                  t          |          k    r3t          dt          | j                  t          |          fz             || j        ||          | _        d S d S )Nr   )	iup_deltarF   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)fontTools.varLib.iupr   r   r   r   rQ   
ValueError)r   
origCoordsendPtsr   s       r   calcInferredDeltasz!TupleVariation.calcInferredDeltas  s    ,,,,,,	Q	9
 
  
T	$
s:..
/Ds:/0    i 0*fEE4 r         ?Fc                 @   ddl m} d | j        v rd S  || j        |||          }d |v r|r3t          d |D                       rdgd gt	          |          dz
  z  z   }t          | j        |          }t          | j                                                  }| 	                    |          \  }	}
t	          |	          t	          |
          z   }|	                    |          \  }	}
t	          |	          t	          |
          z   }||k     r|j        | _        d S d S d S )Nr   )iup_delta_optimize)	tolerancec              3      K   | ]}|d u V  	d S r   r   )r    r   s     r   r9   z*TupleVariation.optimize.<locals>.<genexpr>&  s&      66!t)666666r   )r   r   rF   )
r   r   r   allrQ   r   r   r'   rc   r|   )r   r   r   r   isCompositer   deltaOptvarOptrX   rw   rx   unoptimizedLengthoptimizedLengths                r   optimizezTupleVariation.optimize  sO   555555	T	6

Fi  ( 
X 7c66X66666 7 x4&CMMA$566H49h//6 TY^^%%&&8X..9g9~~G4x009g^^c'll2?))))D!  *)r   c                 L   t          |t                    st          S | j        }t	          |          }|j        }t	          |          |k    rt          d          |                                 dk    rot          t          |          |          D ]P\  }}||         }	 |d         |d         z   |d         |d         z   f||<   4# t          $ r t          d          w xY wnAt          t          |          |          D ]#\  }}||         }||	||z   ||<   |||||<   $| S )Nz7cannot sum TupleVariation deltas with different lengthsrD   r   rF   z+cannot sum gvar deltas with inferred points)

isinstancer   NotImplementedr   rQ   r   r   zipr   r   )r   r+   deltas1lengthdeltas2r/   d2d1s           r   __iadd__zTupleVariation.__iadd__7  s`   	E>	*	* 
'w<<&'\\V	=
 
  
QE&MM7++  uq"	Ba52a5="Q%"Q%-0WQZZ   3  	 E&MM7++  uq"	B	~".r'WQZZ	WQZ	+s   %CCr   )r   F)__name__
__module____qualname__r   r)   r,   r4   r;   r_   rf   r|   rk   rn   staticmethodr   rj   r   rq   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   %   s'       ' ' '= = =K K K     6 6 6' ' 'R1 1 1. 13d  &  &  &  &D	 	 	  &   , > > ,>@ - - ,-^  &    ,<   ,   ,: % % ,%N   ,2   ,     	 	 	F F F* * * *6# # # # #r   r   c                     g }t          |          D ]6}t                              | ||          \  }}|                    |           7|S r   )r   r   r   rm   )rX   sharedTupleCountr   r   r   _ts          r   decompileSharedTuplesr  ]  sT    

 
!
!  Q,,XtVDD)!V--r   rF   c                     t                      }|D ]'}|                    |           }||xx         dz  cc<   (t          |                    |          d           }d |D             S )NrF   c                 $    | d          | d         fS r   r   )items    r   <lambda>z%compileSharedTuples.<locals>.<lambda>o  s    T!WHd1g& r   keyc                 6    g | ]}|d          d k    |d         S )rF   r   r   r7   s     r   r#   z'compileSharedTuples.<locals>.<listcomp>q  s%    000!qtaxx1xxxr   )r	   rk   r'   most_common)rX   
variationsMAX_NUM_SHARED_COORDS
coordCountvarr?   sharedCoordss          r   compileSharedTuplesr  e  s    ii  S


8
$
$%Uq .//&&   	10|0000r   Tc                    g }g }d t          t                    }| D ]S}|                                }	|	||	xx         dz  cc<   |                    |           |                    |	           T|} ~| sdS t	          | d         j                  t          fd| D                       s
J d            d |D             t	          |           }
g }g }|rSfd}t          |                                |          d         |                                        |
t          z  }
fd	|D             }t          | |          D ]J\  }}|                    |||
          \  }}|                    |           |                    |           Kd                    |          }d                    |          }|
||fS )NrF   )r   r   r   r   c              3   H   K   | ]}t          |j                  k    V  d S r   )rQ   r   )r    vns     r   r9   z-compileTupleVariationStore.<locals>.<genexpr>  s2      88C!#888888r   z#Variation sets have different sizesc                 D    i | ]}|t                               |          S r   )r   rj   )r    pointSets     r   
<dictcomp>z.compileTupleVariationStore.<locals>.<dictcomp>  s8     $ $ $	 N88BB $ $ $r   c                 Z    | d         }| d         }t          |                   |dz
  z  S )Nr   rF   )rQ   )pnr"  countcompiledPointss      r   r  z'compileTupleVariationStore.<locals>.key  s1    e8a55
nX&
'
'519
55r   r  c                 0    g | ]}|k    r|         nd S )r   r   )r    r   r'  sharedPointss     r   r#   z.compileTupleVariationStore.<locals>.<listcomp>  s=     ! ! ! *0<)?)?~f%%S ! ! !r   )rv   r   )r
   rR   r4   rm   rQ   r   r   rC   r(   TUPLES_SHARE_POINT_NUMBERSr   r|   r&   )r  
pointCountrX   sharedTupleIndicesuseSharedPointsnewVariations
pointDataspointSetCountr  r   tupleVariationCounttuplesr   r  r0   	thisTuplethisDatar'  r   r)  s                    @@@r   compileTupleVariationStorer5  t  sI     S!!
  Q??&^1qF 	A	"##8888Z88888__:____$ $"$ $ $ :

 	46 6 6 6 6 ]((**444Q7,++n\*+++33! ! ! ! !! ! ! 
J''  SQq		(,>!	LL)X--	++h
((6

VT))r   c                    t          |          }g }	|t          z  dk    r!t                              ||||           \  }
}ng }
t	          |t
          z            D ]}t          j        d|||dz                      \  }}t                              ||          }||||z            }||||z            }|		                    t          |||
| |||                     ||z  }||z  }|	S )Nr   rh   r   )rQ   r*  r   r   r   TUPLE_COUNT_MASKrs   r   r   rm   decompileTupleVariation_)r   rX   r1  r+  sharedTuplesr   r   dataPosnumAxesr   r)  r  dataSizerz   	tupleSizerw   pointDeltaDatas                    r   decompileTupleVariationStorer?    s    x==
55!;;(99tWh( (, ,
#&66
7
7 	 	QM%c#a%i99/(E**5'::)3y())'H"445.--(|\Xy.2 2 3 3 3 #	X''r   c                 \   |dv s
J |            t          j        d|dd                   d         }d}|t          z  dk    r||t          z           }	nt                              |||          \  }	}|t          z  dk    r?t                              |||          \  }
}t                              |||          \  }}nt          |	          \  }
}i }|D ]$}|
|         |	|         ||         f}|dk    r|||<   %d}|t          z  dk    r!t          	                    | |||          \  }}n|}d g| z  }|dk    rXt          
                    t          |          ||          \  }}t          ||          D ]\  }}d|cxk    r| k     rn |||<   n|dk    rt          
                    t          |          ||          \  }}t          
                    t          |          ||          \  }}t          |||          D ]\  }}}d|cxk    r| k     r
n ||f||<   t	          ||          S )	Nr   z>HrD   r   r   r   r   r   )rs   r   rl   TUPLE_INDEX_MASKr   r   ro   inferRegion_rp   r   r   rQ   r   )r+  r9  r)  r   rX   r   rw   rz   r   peakstartendr   rA   regionr   r   
deltas_cvtr0   rE   deltas_xdeltas_yrH   rI   s                           r   r8  r8    s   $$$$h$$$	tT!A#Y	'	'	*
  Q&&	e..	/$$,,XtSAA)$
  Q&&--hcBB*%++HdC@@(#ssD!!*%
  T;T
CI-&4:
""q((//y#x) )+&## &&:
"33v;;	3   /*cfj))  ha1zF1I & 11v;;	3   -(C 11v;;	3   -(CVXx00  gaA1zAF1ItV$$$r   c                     i i }}|                                  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(   rB   rC   )rC  rD  rE  rA   r"   s        r   rB  rB    sV     "jjll  ]dEE3%+%oo#d))	r   )T)*fontTools.misc.fixedToolsr   r   r   r   r   rO   r   ra   r   fontTools.misc.textToolsr   r   collectionsr	   r
   iologgingrs   r   rl   ro   rp   r   r   r   r   r   r*  r7  rA  	getLoggerr  rS   objectr   r  r  r5  r?  r8  rB  r   r   r   <module>rR     s                . - - - - -  , , , , , , , , 				   




        #   g!!u u u u uV u u up   ,a/1 1 1 1" 048* 8* 8* 8*v  .,% ,% ,%^    r   