
    ޺i.(                        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rS SKr\R0                  " 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 r.Sr/S  r0S! r1\2" 5       S".S# jr3g! \) a     S SK*J+r+  \$r( N/! \) a    \%r(  N:f = ff = f)$    )LerpGlyphSet)AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen)RecordingPenDecomposingRecordingPen)	Transform)defaultdictdeque)sqrtcopysignatan2piNz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+       e/var/www/piano.thomer.com/venv/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      $ )z6Sort problem groups by their most severe problem type.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>1   s7      ! +33AfI>{TUAVV!s   68r    )min)_s    r>   <lambda>sort_problems.<locals>.<lambda>0   s    3qT r=   T)keyreverse)dictsorteditems)problemss    r>   sort_problemsrS   +   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_listrW   ;   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)PerContourPenA   Nc                 X    [         R                  " X5        Xl        S U l        / U l        g N)r   __init___Pen_penvalue)selfPenglyphsets      r>   r]   PerContourPen.__init__B   s#    (		
r=   c                 Z    U R                  5         U R                  R                  U5        g r\   )_newItemr_   moveTo)ra   p0s     r>   _moveToPerContourPen._moveToH   s    		r=   c                 :    U R                   R                  U5        g r\   )r_   lineTo)ra   p1s     r>   _lineToPerContourPen._lineToL   s    		r=   c                 :    U R                   R                  X5        g r\   )r_   qCurveTo)ra   rm   p2s      r>   _qCurveToOnePerContourPen._qCurveToOneO   s    		2"r=   c                 <    U R                   R                  XU5        g r\   )r_   curveTo)ra   rm   rr   p3s       r>   _curveToOnePerContourPen._curveToOneR   s    		""%r=   c                 F    U R                   R                  5         S U l         g r\   )r_   	closePathra   s    r>   
_closePathPerContourPen._closePathU   s    			r=   c                 F    U R                   R                  5         S U l         g r\   )r_   endPathr|   s    r>   _endPathPerContourPen._endPathY   s    			r=   c                 h    U R                  5       =U l        nU R                  R                  U5        g r\   )r^   r_   r`   append)ra   pens     r>   rf   PerContourPen._newItem]   s&    ))+%	C

#r=   )r^   r_   r`   r\   )r,   r-   r.   r/   r]   ri   rn   rs   rx   r}   r   rf   r<   r+   r=   r>   rY   rY   A   s*    #&r=   rY   c                       \ rS rSrS rSrg)PerContourOrComponentPenb   c                 `    U R                  5         U R                  S   R                  X5        g )N)rf   r`   addComponent)ra   	glyphNametransformations      r>   r   %PerContourOrComponentPen.addComponentc   s!    

2##I>r=   r+   N)r,   r-   r.   r/   r   r<   r+   r=   r>   r   r   b   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)
SimpleRecordingPointPenh   c                     / U l         g r\   r`   r|   s    r>   r]    SimpleRecordingPointPen.__init__i   s	    
r=   Nc                     g r\   r+   )ra   
identifierkwargss      r>   	beginPath!SimpleRecordingPointPen.beginPathl       r=   c                     g r\   r+   r|   s    r>   r   SimpleRecordingPointPen.endPatho   r   r=   c                 F    U R                   R                  Xc  SOS45        g )NFT)r`   r   )ra   ptsegmentTypes      r>   addPoint SimpleRecordingPointPen.addPointr   s    

2(;uFGr=   r   r\   )returnN)	r,   r-   r.   r/   r]   r   r   r   r<   r+   r=   r>   r   r   h   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   v   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+   )rE   ijGs      r>   rG    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)rE   es     r>   rG   <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_costrF   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  VVs/ s H  o1 Vs/ s H  n[        X45      PM     snPM      snnm[        T5      u  nn[        U4S j[	        U5       5       5      nXVU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+   )rE   r   costss     r>   rG   'matching_for_vectors.<locals>.<genexpr>   s     6XaXs   )r   r   #min_cost_perfect_bipartite_matchingr   r   )	m0m1r   r   r   r   r   identity_costr   s	           @r>   matching_for_vectorsr      sp    BA;=>2RR0Rrl2"R02>E 	,E26U1X66MM11 1>s   	A0A+A0+A0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   rJ   r   r   rh   rm   d0rr   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   rW   )r   isomorphismsrN   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 [        R                  SU5        [        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+   )rE   rV   vr  s      r>   rG   )find_parents_and_order.<locals>.<genexpr>/  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  )rD   )rE   rV   rU   s     r>   rG   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   rQ   loginfowarningscipy.sparse.csgraphr	  setupdatekeysrP   tupler   combinationsr   r   nonzeror   addr   popleftr   ImportError)	glyphsets	locationsr  parentsorderr   rU   basesr	  rJ   graphaxesvectorsr   rV   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 , 	 

 HH0#e*eDKK78-	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; /M%AM; M*+AM; ,M/<M/M; M5&M5,C>M; . M; M; %M; ;
NN)4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   r   logging	getLoggerr  r   rS   rW   rY   r   r   r   r   r   r   r   r   scipy.optimizer   r   r  munkresr   r   r   r   r   r   r  r  r&  r+   r=   r>   <module>r2     s   3 G G G M . * * *  9: 8 G B?} ?H. H8.((
4*S'	2 () $!H6 CF% Ac  

	
# 8 	,  
: 	,


s*   B? ?C CCC CC 