
    h,                        S SK Jr  S SKJrJrJr  S SKJrJr  S SK	J
r
Jr  S SKJr  S SKJrJr  S SKJrJrJrJr  S SKJr  S S	KrS S	Kr\R4                  " S
5      r " S S5      rS rS r " S S\5      r " S S\5      r  " S S\5      r!S r"S r#S r$S r%S r&S r' S SK(J)r)  \%r*S r.S r/S r0S r1S! r2S" r3\4" 5       S#.S$ jr5S&S% jr6g	! \+ a     S SK,J-r-  \&r* N4! \+ a    \'r*  N?f = ff = f)'    )LerpGlyphSet)AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen)RecordingPenDecomposingRecordingPen)	Transform)defaultdictdeque)sqrtcopysignatan2pi)EnumNzfontTools.varLib.interpolatablec                   p    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSr\S\S\S\S\	S\
S\S\S\S\S\S0rSrg)InterpolatableProblem   nothingmissing	open_path
path_count
node_countnode_incompatibilitycontour_orderwrong_start_pointkinkunderweight
overweight                        	   
       N)__name__
__module____qualname____firstlineno__NOTHINGMISSING	OPEN_PATH
PATH_COUNT
NODE_COUNTNODE_INCOMPATIBILITYCONTOUR_ORDERWRONG_START_POINTKINKUNDERWEIGHT
OVERWEIGHTseverity__static_attributes__r,       X/var/www/html/env/lib/python3.13/site-packages/fontTools/varLib/interpolatableHelpers.pyr   r      s{    GGIJJ1#M+DKJ 	1AAaq1aQBHr>   r   c                 H    [        [        U R                  5       S SS95      $ )zGSort problems by severity, then by glyph name, then by problem message.c                 .    [        S U S    5       5      * $ )Nc              3   t   #    U  H.  n[         R                  US       UR                  SS5      -   v   M0     g7f)type	tolerancer   N)r   r<   get).0ps     r?   	<genexpr>2sort_problems.<locals>.<lambda>.<locals>.<genexpr>2   s7      ! +33AfI>{TUAVV!s   68r!   )min)_s    r?   <lambda>sort_problems.<locals>.<lambda>1   s    3qT r>   T)keyreverse)dictsorteditems)problemss    r?   sort_problemsrT   ,   s+    NN 		
 r>   c                     X* S U SU*  -   $ )zwRotate list by k items forward.  Ie. item at position 0 will be
at position k in returned list.  Negative k is allowed.Nr,   )lks     r?   rot_listrX   <   s     RS6AcrF?r>   c                   H    \ rS rSrSS jrS rS rS rS rS r	S	 r
S
 rSrg)PerContourPenB   Nc                 d    [         R                  " X5        X l        Xl        S U l        / U l        g N)r   __init__	_glyphset_Pen_penvalue)selfPenglyphsets      r?   r^   PerContourPen.__init__C   s(    (!		
r>   c                 Z    U R                  5         U R                  R                  U5        g r]   )_newItemra   moveTo)rc   p0s     r?   _moveToPerContourPen._moveToJ   s    		r>   c                 :    U R                   R                  U5        g r]   )ra   lineTo)rc   p1s     r?   _lineToPerContourPen._lineToN   s    		r>   c                 :    U R                   R                  X5        g r]   )ra   qCurveTo)rc   ro   p2s      r?   _qCurveToOnePerContourPen._qCurveToOneQ   s    		2"r>   c                 <    U R                   R                  XU5        g r]   )ra   curveTo)rc   ro   rt   p3s       r?   _curveToOnePerContourPen._curveToOneT   s    		""%r>   c                 F    U R                   R                  5         S U l         g r]   )ra   	closePathrc   s    r?   
_closePathPerContourPen._closePathW   s    			r>   c                 F    U R                   R                  5         S U l         g r]   )ra   endPathr~   s    r?   _endPathPerContourPen._endPath[   s    			r>   c                 h    U R                  5       =U l        nU R                  R                  U5        g r]   )r`   ra   rb   append)rc   pens     r?   rh   PerContourPen._newItem_   s&    ))+%	C

#r>   )r`   r_   ra   rb   r]   )r-   r.   r/   r0   r^   rk   rp   ru   rz   r   r   rh   r=   r,   r>   r?   rZ   rZ   B   s*    #&r>   rZ   c                       \ rS rSrS rSrg)PerContourOrComponentPend   c                 `    U R                  5         U R                  S   R                  X5        g )N)rh   rb   addComponent)rc   	glyphNametransformations      r?   r   %PerContourOrComponentPen.addComponente   s!    

2##I>r>   r,   N)r-   r.   r/   r0   r   r=   r,   r>   r?   r   r   d   s    ?r>   r   c                   8    \ rS rSrS rSS jrS	S jrSS jrSrg)
SimpleRecordingPointPenj   c                     / U l         g r]   rb   r~   s    r?   r^    SimpleRecordingPointPen.__init__k   s	    
r>   Nc                     g r]   r,   )rc   
identifierkwargss      r?   	beginPath!SimpleRecordingPointPen.beginPathn       r>   c                     g r]   r,   r~   s    r?   r   SimpleRecordingPointPen.endPathq   r   r>   c                 F    U R                   R                  Xc  SOS45        g )NFT)rb   r   )rc   ptsegmentTypes      r?   addPoint SimpleRecordingPointPen.addPointt   s    

2(;uFGr>   r   r]   )returnN)	r-   r.   r/   r0   r^   r   r   r   r=   r,   r>   r?   r   r   j   s    Hr>   r   c                 H    Sn[        X5       H  u  p4XC-
  nX%U-  -  nM     U$ Nr   )zipv0v1sx0x1ds         r?   vdiff_hypot2r   x   s0    	Ab+G	U
  Hr>   c                     Sn[        X5       H>  u  p4XC-
  nX%R                  UR                  -  UR                  UR                  -  -   -  nM@     U$ r   )r   realimagr   s         r?   vdiff_hypot2_complexr      sJ    	Ab+G	VVaff_qvv.. 
 Hr>   c                 @   ^  [        U 4S j[        U5       5       5      $ )Nc              3   8   >#    U  H  u  pTU   U   v   M     g 7fr]   r,   )rF   ijGs      r?   rH    matching_cost.<locals>.<genexpr>   s     7#641qtAw#6s   )sum	enumerate)r   matchings   ` r?   matching_costr      s    79X#6777r>   c                     [        U 5      n[        U 5      u  p#U[        [        U5      5      :H  R	                  5       (       d   e[        S U 5       5      n[        U5      [        X5      4$ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr]   )int)rF   es     r?   rH   <min_cost_perfect_bipartite_matching_scipy.<locals>.<genexpr>   s     %1As   )lenlinear_sum_assignmentlistrangeallr   )r   nrowscolss       r?   )min_cost_perfect_bipartite_matching_scipyr      s_    AA&q)JDDqN"'')))) %%%D:}Q---r>   c                     [        U 5      nS /U-  n[        5       R                  U 5       H	  u  p4XBU'   M     U[        X5      4$ r]   )r   Munkrescomputer   )r   r   r   rowcols        r?   +min_cost_perfect_bipartite_matching_munkresr      sF    AA6A:DI%%a(S	 )q'''r>   c                 
   [        U 5      nUS:  a  [        S5      e[        R                  " [	        U5      5      n[        [        U5      5      n[        X5      nU H!  n[        X5      nXd:  d  M  [        U5      UpCM#     X44$ )Nr&   z4Install Python module 'munkres' or 'scipy >= 0.17.0')r   	Exception	itertoolspermutationsr   r   nextr   )r   r   r   best	best_costrG   costs          r?   .min_cost_perfect_bipartite_matching_bruteforcer      s|    AA1uNOO ))%(3L\"#Da&IQ""1gt)  ?r>   )r   )r   c                     [        [        U R                  5      5      n[        XR                  5      U R                  U R
                  U R                  S-  U R                  S-  U R                  U-  4$ )Nr"   )	r   absarear   meanXmeanYstddevXstddevYcorrelation)statssizes     r?   contour_vector_from_statsr      s`     EJJ D$$D  r>   c                   ^	 [        U 5      n[        [        U5      5      nU  VVs/ s H  oA Vs/ s H  n[        XE5      PM     snPM      snnm	[	        T	5      u  nn[        U	4S j[        U5       5       5      nXgU4$ s  snf s  snnf )Nc              3   4   >#    U  H  nTU   U   v   M     g 7fr]   r,   )rF   r   costss     r?   rH   'matching_for_vectors.<locals>.<genexpr>   s     6XaXs   )r   r   r   r   #min_cost_perfect_bipartite_matchingr   )
m0m1r   identity_matchingr   r   r   r   identity_costr   s
            @r?   matching_for_vectorsr      s~    BAU1X;=>2RR0Rrl2"R02>E 	,E26U1X66MM11 1>s   	BA?B?Bc                 B    Sn[        U 5       H  u  p#US-  U-  nM     U$ )Nr   r!   )reversed)pointsbitsr   bs       r?   points_characteristic_bitsr      s*    D&!	Q "Kr>   r$   c                    / nU (       d  U$ U  VVs/ s H  u  p#[        U6 PM     n nn[        U 5      n[        S:X  d   eU R                  U S [        S-
   5        [        U 5      [        :  a0  U R                  U S [        S-
   5        [        U 5      [        :  a  M0  [	        U5       H  nX   nUR                  U5        XS-      nXv-
  nUR                  US-  5        XS-      n	X-
  n
UR                  X-
  5        UR                  U
R                  -  UR                  U
R                  -  -
  n[        [        [        U5      5      U5      nUR                  US-  5        M     U$ s  snnf )Nr$   r!   r#   r"   )complexr   $_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORextendr   r   r   r   r   r   r   )r   vectorr   rK   r   r   rj   ro   d0rt   d1crosss               r?   points_complex_vectorr      sP   F(./urgrlF/FA/1444
MM&C?!CDE
f+<
<fGCaGHI f+<
<1X Yb E]Wb1f E]Wbg "''!BGGbgg$55c%j)51eai + . M; 0s   E(c                    [        U 5      n[        U 5      nU(       a  U S S S2   n [        U 5      nOUn[        U 5      n[        U5      U-  S:X  d   e[        U5      U-  nSU-  S-
  n[        U5       HI  n	XTU	-
  -  U-  XY-	  -  n
X:X  d  M  UR	                  [        Xi* U-  5      U(       a  US-
  U	-
  OU	U45        MK     g )Nr   r   r!   )r   r   r   r   r   rX   )r   isomorphismsrO   reference_bitsr   r   r   multmaskr   r   s              r?   add_isomorphismsr    s    /7NFA
 ")&1"6*Fv;?av;!DFa<D1X1uo%$)4&"t),7a!eai7S r>   )discrete_axesc          	        ^^ S /[        [        [        U 5      S-
  5      5      -   n[        [        [        U 5      5      5      nU(       Ga  [        U5       VVs/ s H1  u  pV[	        U4S jUR                  5        5       5      (       d  M/  UPM3     nnnU(       a"  [        R                  " S[        U5      U5        O[        R                  " S5         SSK	J
n  [        [        U5      5       V	s/ s H  n	S/[        U5      -  PM     n
n	[        5       nU H"  mUR                  TR                  5       5        M$     [        U5      nU V^s/ s H  m[        U4S jU 5       5      PM     nn[         R"                  " [        [        U5      5      S5       Hv  u  p][%        XU   5       VVs0 s H  u  pUT;   d  M  X_M     nnn[%        XU   5       VVs0 s H  u  pUT;   d  M  X_M     nnnUU:w  a  Ma  ['        X   X   5      X   U'   Mx     U" U
S	S
9nUR)                  5       u  nn[+        [        5      n
[%        UU5       H.  u  nnU
U   R-                  U5        U
U   R-                  U5        M0     S /[        U5      -  n/ n[        5       n[/        U5      nU(       al  UR1                  5       nUR-                  U5        UR3                  U5        [        X   5       H   nUU;  d  M  XSU'   UR3                  U5        M"     U(       a  Ml  [        U5      [        U5      :X  d   S5       e [6        R                  SU5        [6        R                  SU5        X44$ s  snnf s  sn	f s  snf s  snnf s  snnf ! [4         a     NWf = f)Nr!   c              3   B   >#    U  H  u  pUT;  d  M  US :H  v   M     g7fr   Nr,   )rF   rW   vr  s      r?   rH   )find_parents_and_order.<locals>.<genexpr>0  s      Jida1M3I616is   zFound %s base masters: %szNo base master location foundr   )minimum_spanning_treec              3   H   >#    U  H  nTR                  US 5      v   M     g7fr	  )rE   )rF   rW   rV   s     r?   rH   r  @  s     7$QQUU1a[[$s   "r"   T)	overwritez.Not all masters are reachable; report an issuezParents: %sz	Order: %s)r   r   r   r   r   rR   logginginfowarningscipy.sparse.csgraphr  setupdatekeysrQ   tupler   combinationsr   r   nonzeror   addr   popleftr   ImportErrorlog)	glyphsets	locationsr  parentsorderr   rV   basesr  rK   graphaxesvectorsr   rW   r
  i_discrete_locationj_discrete_locationtreer   r   r   r   visitedqueues     `   `                  r?   find_parents_and_orderr*  (  s"   ftE#i.1"4566Gs9~&'E "),
,JaggiJJ , 	 

 LL4c%j%HOO;<-	B38Y3HI3HaaS3y>)3HEI5DAFFH% $<DAJKAu7$77GK!..uS^/DaH%(qz%:'%:TQa=>PDAD%: $ ' &)qz%:'%:TQa=>PDAD%: $ ' '*==*7:wzB I )$?DJD$$EdOSc
s#c
s# ,
 fs9~-GEeG%LEMMOAQ)A'%&
Q *	 % u:"  @?@  	(e$>y
 J
 L''>  		so   .M!M!M= 1M'
AM= M,-AM= .M1>M1M= M7(M7.C>M= 0 M= M= 'M= =
N
	N
c                    U R                   nU R                  nU R                  nX$-
  S-  S-  X3-  -   S-  nX$-   S-  U-   nX$-   S-  U-
  nUS:w  a  [        Xb-
  U5      OX$:  a	  [        S-  OSn[        5       n	US:  a  SnU(       af  U	R                  U R                  * U R                  * 5      n	U	R                  U* 5      n	U	R                  S[        U5      -  S[        U5      -  5      n	U	$ U	R                  [        U5      [        U5      5      n	U	R                  U5      n	U	R                  U R                  U R                  5      n	U	$ )Ng      ?r"   r   r!   )	varianceX
covariance	varianceYr   r   r   	translater   r   rotatescaler   )
r   inversear   cdeltalambda1lambda2thetatranss
             r?   transform_from_statsr:  l  s-   AAAum!AE)c1Eume#Gume#G%&!VE'+q!ae"s(EKE{ u{{l;eV$AW-q4=/@A L	 DM4=9U#U[[9Lr>   )F)7fontTools.ttLib.ttGlyphSetr   fontTools.pens.basePenr   r   r   fontTools.pens.pointPenr   r   fontTools.pens.recordingPenr	   r
   fontTools.misc.transformr   collectionsr   r   mathr   r   r   r   enumr   r   r  	getLoggerr  r   rT   rX   rZ   r   r   r   r   r   r   r   r   scipy.optimizer   r   r  munkresr   r   r   r   r   r   r  r  r*  r:  r,   r>   r?   <module>rF     s   3 G G G M . * * *   9: 8 G D?} ?H. H8.("
4*S'2 () $!H6 CF% AH o  

	
# 8 	,  
: 	,


s*   C
 
C+CC'#C+&C''C+