
    jke                        d Z ddl ddlmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z" ddl#Z# e#jH                  d      Z%dZ&dZ'dZ(dZ) G d d      Z*	 	 	 d!de&e'e)dddZ+ ee+      d        Z,d Z-d"dZ.e/d k(  r*ddl0Z0 e.       Z1 e0jd                   e3 e4e1                   yy)#z
Tool to find wrong contour order between different masters, and
other interpolatability (or lack thereof) issues.

Call as:
$ fonttools varLib.interpolatable font1 font2 ...
   )*)test_contour_order)test_starting_point    )RecordingPenDecomposingRecordingPen)TransformPen)StatisticsPenStatisticsControlPen)OpenContourError)piecewiseLinearMapnormalizeLocation)floatToFixedToStr)	Transform)defaultdict)SimpleNamespace)wraps)pformat)sqrtatan2piNzfontTools.varLib.interpolatablegffffff?g      ?gMb`?i  c                   *    e Zd ZdZd Zd Zd ZddZy)Glyph)
recordingsrecordingsNormalized
greenStatscontrolStatsgreenVectorsgreenVectorsNormalizedcontrolVectors	nodeTypesisomorphismspointsopenContoursc                 p    || _         | j                  D ]  }t        | |g         | j                  |       y N)nameITEMSsetattr	_populate)self	glyphnameglyphsetitems       A/usr/lib/python3/dist-packages/fontTools/varLib/interpolatable.py__init__zGlyph.__init__1   s4    	JJ 	$DD$#	$x     c                     | j                   D ]6  }t        t        | |            |k(  st        | |      j                  d        8 y r&   )r(   lengetattrappend)r+   ixr.   s      r/   _fill_inzGlyph._fill_in7   s>    JJ 	1D74&'2-d#**40	1r1   c                    || j                      }|d u | _        | j                  ry t        t        |      }	 |j	                  |d       |j                  | _        ~t        | j                        D ]h  \  }}|j                  D cg c]  \  }}|	 }}}| j                  j                  |       t        |      }	t        |      }
	 |j                  |	       |j                  |
       | j                  j                  d       | j"                  j                  |	       | j$                  j                  |
       | j&                  j                  t)        |	             | j*                  j                  t)        |
             	 t-        |      }t/        |t1        |	d            }|j                  |       | j2                  j                  |       t        |      }	j                  |	       | j6                  j                  t)        |	             |d   dk(  r| j!                  |       |d   dk(  sJ |d	   d
v sJ t9               }t;        |d      }|j                  |       | j<                  j                  |j                         g }| j>                  j                  |       tA        |j                  |d       tA        |j                  |d       k y # t
        $ r |j	                  |       Y w xY wc c}}w # t        $ r7}| j                  j                  d       | j!                  |       Y d }~d }~ww xY w# t4        $ r | j2                  j                  d        Y w xY w)Nr-   T)outputImpliedClosingLineFinverser   addComponentmoveTo)	closePathendPath)!r'   doesnt_existPerContourOrComponentPenr   draw	TypeErrorvaluer   	enumerater!   r5   r
   r   replayr$   r   r7   r   r   r   contour_vector_from_statsr    r   r	   transform_from_statsr   ZeroDivisionErrorr   SimpleRecordingPointPenSegmentToPointPenr#   r"   add_isomorphisms)r+   r-   glyphperContourPenr6   contouropargr!   r   r   erpentpenr#   	converterr"   s                    r/   r*   zGlyph._populate<   s   #!TM0Q	&JJ}tJD (--$T__5 7	?KB+2==9C9I9NN!!),&9J/BLz*|,!!((/
 OO"":.$$\2$$%>z%JK&&'@'NO7.x8#.z4H t$))006 '9JKK
#''../H/TU |~-b!Q<8+++R=$<<<<,.F)&%8INN9% KKv||,L$$\2 V\\<?V\\<>o7	?  	&JJ}%	& : $ !!((.b!" % 7))0067sB   K L =LAM	K=<K=	M,MM	$M10M1Nc                     |#| j                   D ]  }|j                  |        y | j                   |   j                  |       y r&   )r   rD   )r+   pencountor_idxrQ   s       r/   rD   z
Glyph.draw   s@    ?? "S!" OOK(--c2r1   r&   )__name__
__module____qualname__r(   r0   r7   r*   rD    r1   r/   r   r   "   s    E!1
E?N3r1   r   F)	locations	tolerance	kinkinessupemshow_allc             #      eK   |dk\  r|dz  }d|cxk  rdk  sJ  J |dk\  r|dz  }d|k  sJ |xs  D 	cg c]  }	t        |	       c}	}|& D 
	ch c]  }
|
j                         D ]  }	|	  }}
}	t         |      \  e} efd}|D 	]  }t        j	                  d|        D 
cg c]  }
t        ||
       }}
t        |D cg c]  }|d	 c}      dk  rSt        t        | |            D ]T  \  }\  }}
}|j                  r|s
|d||df #d	}t        |j                        D ]  \  }}|s	d
}||||ddf  |sUV d gt               z  }|D 	]   }||   }||j                  s |||      }|$||   }||j                  s8|j                  }|j                  }t        |      t        |      k7  r'|d||   ||   ||t        |      t        |      df ||k7  rt        t        ||            D ]  \  }\  }}||k(  rt        |      t        |      k7  r(|d|||   ||   ||t        |      t        |      df Nt        t        ||            D ]$  \  }\  } }!| |!k7  s|d||||   ||   ||| |!d	f &  t        ||      \  }"}#}$|#|$|z  k  rit        j                  d|#|$z         |#|$z  }%t        j                  d|%       |d||   ||   ||t        t        t        |"                  |"|%df |"||<   |j                   }&|j                   }'|j"                  }(|j"                  })|j$                  }*|j$                  }+|j&                  },|j&                  }-|j(                  }.|j(                  }/||   }"|"\|'rZ|"D 0cg c]  }0|'|0   	 }'}0|"D 0cg c]  }0|)|0   	 })}0|"D 0cg c]  }0|+|0   	 }+}0|"D 0cg c]  }0|-|0   	 }-}0|"D 0cg c]  }0|/|0   	 }/}0g }1t        |,|-      D ]!  \  }2}3	 |1j+                  t-        |2|3             # t        t        |&|'            D ]  \  }\  }4}5|4'|5%t        |4      dk(  st        |4      t        |5      k7  r4t1        |||||"      \  }6}7}8}9|6s|7r<|8|9z  }%t        j                  d|%       |8|9|z  k  sp|d|||   ||   ||d|6|7|%d
f |1|   }:d	};|:s|(|   d   dk  |)|   d   dk  k(  s|;r5t3        d       }<t5        |<t7        |<d
            }=|:j9                  |=       nt3        d       }<|:j9                  |<       t;        |<      }>|;s|(|   n|*|   }?|;s|)|   n|+|   }@|?d   |?d   z  }A|@d   |@d   z  }B|>d   |>d   z  }Cd}D||Dz  }Et        d      D ]  \  }F}G|Frt=        ABz        }H|A|Bz   |Hz
  }H|BC|Bz
  z   }H't=        ABz        }Ht        j                  dGCHAB       t?        |A|Bf      \  }A}BFsH|z  Cdz   kD  sFsodH|z  z   Ck  s{	 FrHCz  dDz  z  }%nCHz  dDz  z  }%t        j                  d|%       |G|||   ||   |||%df   |jB                  }|jB                  }||   |r||   D 0cg c]  }0||0   	 }}0d }E|tD        z  tF        z  |z  }It        t        ||            D ]  \  }\  }4}5|4'|5%t        |4      dk(  st        |4      t        |5      k7  r4t        t        |4            D ]o  }0|4|0   }J|5|0   }K|Jd   rKd   s|4|0dz
     }L|5|0dz
     }M|4|0dz   t        |4      z     }N|5|0dz   t        |5      z     }O|Ld   rMd   r\Ld   rMd   rgtI        Jd    }JtI        Kd    }KtI        Ld    }LtI        Md    }MtI        Nd    }NtI        Od    }O|J|Lz
  }P|N|Jz
  }Q|K|Mz
  }R|O|Kz
  }S|PjJ                  |QjL                  z  |PjL                  |QjJ                  z  z
  }T|RjJ                  |SjL                  z  |RjL                  |SjJ                  z  z
  }U	 TtO        P      tO        Q      z  z  }TUtO        R      tO        S      z  z  }UtO        T      EkD  stO        U      EkD  rvPjJ                  QjJ                  z  |PjL                  |QjL                  z  z   }VRjJ                  SjJ                  z  |RjL                  |SjL                  z  z   }W|Vdk  sWdk  rtO        P      tO        |P      tO        Q      z   z  }XtO        R      tO        |R      tO        S      z   z  }YtO        |X|Yz
        }ZtO        |Z      Ek  rLJKz   d!z  }[LMz   d!z  }\NOz   d!z  }]|[|\z
  }^|]|[z
  }_|^jJ                  |_jL                  z  |^jL                  |_jJ                  z  z
  }`	 `tO        ^      tO        _      z  z  }`tO        `      ||z  z  Ek  r`tO        ^      z  tO        _      z  }atO        |^|_z         }btO        |a|bz        }c|cIk  rcbz  }d|dEkD  rEtO        `      |z  z  }%t        j                  d"cd|`Z       t        j                  d|%       |d#|||   ||   |||0|%d$f r  |s	|d%||   ||   ||d&f 	# 	 y c c}	w c c}	}
w c c}
w c c}w c c}0w c c}0w c c}0w c c}0w c c}0w # t.        $ r |1j+                  d        Y w xY w# t@        $ r d}%Y w xY wc c}0w # t@        $ r Y w xY w# t@        $ r Y w xY ww)'N
   g{Gz?r   r   c                 ^    | y |    } | y |    |    |   |    } |    	|    |   | S r&   r^   )ir,   	glyphsetsparentss     r/   grand_parentztest_gen.<locals>.grand_parent   s\    9AJ9aj$1i)@)H
A aj$1i)@)Hr1   zTesting glyph %smissing)typemaster
master_idxFT	open_path)rm   rn   rQ   rl   
path_count)rl   master_1master_2master_1_idxmaster_2_idxvalue_1value_2
node_count)rl   pathrq   rr   rs   rt   ru   rv   node_incompatibility)	rl   rx   noderq   rr   rs   rt   ru   rv   zmatching_ratio %gztolerance: %gcontour_order)rl   rq   rr   rs   rt   ru   rv   r`   wrong_start_point)
rl   rQ   rq   rr   rs   rt   ru   rv   reversedr`   r9   r;   )underweight
overweightz;%s: actual size %g; threshold size %g, master sizes: %g, %ggh㈵>ztolerance %g)rl   rQ   rq   rr   rs   rt   r`   g?   z7deviation %g; deviation_ratio %g; sin_mid %g; r_diff %gkink)rl   rQ   rq   rr   rs   rt   rF   r`   nothing)rl   rq   rr   rs   rt   )(reprkeysfind_parents_and_orderloginfor   r3   rG   ziprB   r$   r!   r   debuglistranger"   r   r   r   r   r5   lerp_recordings
ValueErrorr   r
   r	   rJ   rH   rI   r   sortedrK   r#   DEFAULT_KINKINESS_LENGTHDEFAULT_KINKINESScomplexrealimagabs)frh   glyphsnamesignore_missingr_   r`   ra   rb   rc   gr-   orderrj   
glyph_name	allGlyphsrO   rn   r'   has_openr6   open	matchingsm1idxglyph1m0idxglyph0m1m0pathIxnodes1nodes2nodeIxn1n2matchingmatching_costidentity_costthis_tolerancem0Isomorphismsm1Isomorphisms	m0Vectors	m1Vectorsm0VectorsNormalizedm1VectorsNormalized
recording0
recording1recording0Normalizedrecording1Normalizedrg   midRecordingc0c1contour0contour1proposed_pointreversemin_cost
first_costrQ   
normalizedmidStatsrV   	midVectorm0Vecm1Vecsize0size1midSizepowertr   problem_typeexpectedSizedeviation_thresholdpt0pt1pt0_prevpt1_prevpt0_nextpt1_nextd0_prevd0_nextd1_prevd1_nextsin0sin1dot0dot1r0r1r_diffmidmid_prevmid_nextmid_d0mid_d1sin_midcrossarc_len	deviationdeviation_ratiori   sf   `                                                                                                    @r/   test_genr      s     BT		QBT		>>1y1!d1g1E~ %.Gx}}G!!G!GG+IyANGU  ~
#Z0AJKXU:x0K	Ky>eE,=>?1D3<	9e,4
 	/J/$ !!%"!*d*U  H%e&8&89 D"&&0#% +	 	 5	8 FS^+	 [	Eu%F~V%5%5 
3E}u%F~V%5%5 !!B!!B2w#b'! ,$)%L$)%L(-(-#&r7#&r7  Rx09#b"+0F "%,F,VV' 6{c&k1&(4(.,1%L,1%L0505+.v;+.v;	  !,5c&&6I,J %(R8 *,B,2,205e05e4949/1/1
!"#  %!%%"%P 6HPV5W2Hm]}y88		'!M1 "/!>		/>: /$)%L$)%L(-(-#'c(m(<#=#+%3	  $,	%  $00N#00N++I++I"("?"?"("?"?**J**J#)#>#> #)#>#>  !'H$=E!F."3!F!F3;<aYq\<	<GO&P!':1'=&P#&P5=>jm>
>IQ'RA(<Q(?'R$'RLj*5 .B. ''B(?@. -6NN3- |"((Xx $'8})8}H5 @SFB	8A=: "W%-
%:NIIo~>*y"88&(;+-,1%L,1%L0505+,+9,3-; . +2.G!&JIbM!$4q$8imA>NQR>R#S%'4d'CH#/ (*>xQU*V$D $NN40'4d'CH#NN84$=h$G	 2<IbMATUWAX  2<IbMATUWAX  !&a58 3 %a58 3"+A,1"= !%u,8A99 3"4J  */3EEM/B05/M/4%/H (/3EEM/BII ] , ' , % % ,25%.+ALE5 %/$09$<w~$M *tlY6N/NQX/X
!7'1:F:P,-I:* ;BL:P,-I:*
 !$		.. I$.0<3549%L49%L8=8=5C%&'" !"Q3"S|"B BB +%.u%56be66A//2CCiO   -6c"bk,B |((Xx$'8})8}H5 
 s8}- nA"1+C"1+Cq6Q 'AH'AH'Q#h-(?@H'Q#h-(?@H{x{ {x{ !3q6*C!3q6*C&4H&4H&4H&4H "HnG&nG!HnG&nG"<<',,69TTD"<<',,69TTD!Gs7| ;;Gs7| ;; 4y1}D	A  #<<',,69TTD"<<',,69TTDax4!8  WWG)DEBWWG)DEB b\F6{Q 9/C (8 3q8H (8 3q8H 8^F%^F$kkFKK7&++:SSG!3v;V#<<
 7|y9'<=B  $c&k1CK?E!&6/2G #EGO 4I #66 &/'&9O&* %&#g,*B%CNIIQ!' IInn="$*')(-e(-e,1,1%&)7	 En|D  )$)%L$)%L(-(-	 	e[	G~' 2
 H  L>h "G<&P>'R " . ''-.d (9 !756N!70 7t - ! !@ - ! !sF  4lj

lj
28l*j=lj
j
A5l
D,l7D lj#l)j5l;j$lj)lj.+lj3Bl$!llDl7lkAl2k&>Fl4k+
E	lk;.B<l,Al3k	lk	lk#l"k##l+	k84l7k88l;	llllc                  r    t        t              }t        | i |D ]  \  }}||   j                  |        |S r&   )r   r   r   r5   )argskwargsproblemsr,   problems        r/   testr   r  sB    4 H&77 ,	7""7+,Or1   c                 x    | |v ry ||    || <   t        ||    dg       D ]  }t        |j                  |||        y )N
components)r4   recursivelyAddGlyph	glyphName)r,   r-   
ttGlyphSetglyf	components        r/   r   r   z  sN    H$Y/HYT)_lB? M	I//:tLMr1   c                 B"  PQ ddl }ddl}|j                  dt        j                        }|j                  ddd       |j                  d	d
d       |j                  ddt        dt        z         |j                  ddt        dt        z         |j                  dd
d       |j                  ddd       |j                  ddd       |j                  ddd       |j                  dd
d       |j                  ddd       |j                  dd
d       |j                  dd t        d!d"#       |j                  d$d%t        d&d'(       |j                  d)d*d
d+       |j                  d,d
d-       |j                  |       } dd.lm}  || j                  rd/nd01       | j                  r	 |d21       | j                  r| j                  j!                         nd}dd3lm} g }g }g }	t&        }
t)        | j*                        }t-        | j*                        d4k(  rqd}| j*                  d   j/                  d5      rdd6lm} |j5                  | j*                  d         }|j6                  D cg c]  }|j8                   c}| _        |j6                  D cg c]  }|j:                   }	}|j<                  D ci c]0  }|j>                  |j@                  |jB                  |jD                  f2 }}|j<                  D ci c]  }|j>                  |jF                   c}Q|jI                         D ci c]  \  }t)        Qfd7|D               }}}n3| j*                  d   j/                  d8      rgdd9l%m&}m'}  || j*                  d         }|jP                  }
 ||      }|j6                  D cg c]  }|jR                   }}|D cg c]1  }|jT                  jV                  d:|jT                  jX                  3 }}g | _        |j6                  D cg c]  }|j:                   }	}|j<                  D ci c]0  }|j>                  |j@                  |jB                  |jD                  f2 }}|j<                  D ci c]  }|j>                  |jF                   c}Q|jI                         D ci c]  \  }t)        Qfd;|D               }}}n| j*                  d   j/                  d<      rdd=l-m.}  || j*                  d         }|d>   j^                  }
d?|v r_i P|d@   }|j<                  D ]3  }|j`                  |jb                  |jd                  dAP|jf                  <   5 dB|v rd|dB   }|jh                  jI                         D ]B  \  }}P|   jk                         }|jI                         D ]  \  } }!tm        | |      P|   |!<    D |d?   }"|dC   }#i }$to        tp              }%|#ts        |"jt                  jw                               }|D ]  }&|"jt                  |&   D ]  }'i }(g })ts        |'j<                  jI                               D ]#  \  }*}+|+d4   |(|*<   |)jy                  |*|+d4   f       % t)        |)      },|,|$vr|j{                  |(dDdEF      |$|,<   t}        |&|%|,   |$|,   |#         dGg}|j{                         g}i g}	ts        Pjw                               D ci c]  }|dA }}ts        |%jw                         dH I      D ]a  },dJdKj                  PfdL|,D              z   dJz   }-|jy                  |-       |jy                  |%|,          |	jy                  tq        |,             c dD| _@        g | _        |	s|D .cg c]  }.i  }	}.| j*                  D ]  }/|/j/                  dM      rGddNlAmB}0  |0|/      }t               }1|j                  |1       |1j^                  }
|jy                  |       n.dd=l-m.}  ||/      }|d>   j^                  }
|jy                  |       |jy                   ||/      j                  dOd4      d           g }%|D ]R  }t        |dP      r|j{                         }2n|}2|%jy                  |2jw                         D ci c]  }||2|   
 c}       T | j>                  rmt        | j>                        }3t        ||%      D -2cg c]  \  }-}2|-|3v r|2 }%}-}2t        ||	      D - cg c]  \  }-} |-|3v r|  }	}-} |D -cg c]	  }-|-|3v s|- }}-|s9ts        t        |%D 24cg c]  }2|2jw                         D ]  }4|4  c}4}2            }t        |      }5|%D ]/  }2t        |2jw                               }6|5|6z
  }7|7s$|7D ]  }4d|2|4<   	 1 |	D )cg c]  })t        |)       }	})| j                  xs t        }8| j                  | j                  nt        }9	 t        jU                  dQt-        |%             t        jU                  dRt        |	             t        |%|||	|
| j                  |8|9| j                  S	      }:to        t              };| j                  |j                  nt        | j                  dT      }| j                  s| j                  r@ddlU}<|:D ]  \  }&}=|;|&   jy                  |=        t        |<j                  |;      |U       nbd}>|:D ];  \  }&}?|;|&   jy                  |?       |&|>k7  rt        dV|& dW|U       |&}>d}@dX|?v r|?dX   n	|?dY   |?dZ   f}A|A@k7  r4d[|?v r|?d[   n	|?d\   |?d]   f}Bt        d^d_j                  |B      z  |U       A}@|?d`   dak(  rt        db|?d[   z  |U       |?d`   dck(  rt        dd|?d[   z  |U       |?d`   dek(  r!t        df|?dg   |?d\   |?dh   |?d]   fz  |U       |?d`   dik(  r&t        dj|?dk   |?dg   |?d\   |?dh   |?d]   fz  |U       |?d`   dlk(  r*t        dm|?dn   |?dk   |?dg   |?d\   |?dh   |?d]   fz  |U       B|?d`   dok(  r't        dp|?dg   dq|?d\   d_|?dh   dq|?d]   |U       q|?d`   drk(  r*t        ds|?dt   |?dg   |?d\   |?dh   |?d]   |?du   fz  |U       |?d`   dvk(  rt        dw|?dt   |?d\   |?d]   fz  |U       |?d`   dxk(  rt        dy|?dt   |?d\   |?d]   fz  |U       |?d`   dzk(  r"t        d{|?dt   |?d|   |?d\   |?d]   fz  |U       |?d`   d}k(  s#t        d~|?d\   d|?d]   |U       > n|:D ]  \  }&}=|;|&   jy                  |=        | j                  rt        jU                  d| j                         d4dlYmZ}C  |C| j                  |%|      5 }D|Dj                  ||8|9       |Dj                  |;       |;s| j                  sDj                          ddd       | j                  rt        jU                  d| j                         d4dlYm_}E  |E| j                  |%|      5 }F|Fj                  ||8|9       |Fj                  |;       |;s| j                  sFj                          ddd       | j                  rt        jU                  d| j                         d4dlYma}G g }Hi }I |G|H|%|      5 }J|Jj                  |dE|8|9       |;jI                         D ])  \  }K}L|KIt-        H      <   Jj                  |K|LidEdE       + |;s| j                  sJj                          ddd       ddlb}Mt        | j                  d      5 }|j                  d       |j                  d       |j                  d       t        H      D ]  \  }N}J|NIv r'|j                  dIN    dj                  d             |j                  dj                  d             |j                  Mj                  J             |j                  d       |j                  d        |j                  d       ddd       |;r|;S yc c}w c c}w c c}w c c}w c c}}w c c}w c c}w c c}w c c}w c c}w c c}}w c c}w c c}.w c c}w c c}2}-w c c} }-w c c}-w c c}4}2w c c})w # 1 sw Y   xY w# 1 sw Y   AxY w# 1 sw Y   xY w# 1 sw Y   xY w# t        $ r0}OOxj                  |z  c_h        t        j                  |O        d}O~Oww xY w)z/Test for interpolatability issues between fontsr   Nzfonttools varLib.interpolatable)descriptionz--glyphsstorez&Space-separate name of glyphs to check)actionhelpz
--show-all
store_truez3Show all glyph pairs, even if no problems are foundz--tolerancez,Error tolerance. Between 0 and 1. Default %s)r   rl   r   z--kinkinessz)How aggressively report kinks. Default %sz--jsonzOutput report in JSON formatz--pdfzOutput report in PDF formatz--psz"Output report in PostScript formatz--htmlzOutput report in HTML formatz--quietz%Only exit with code 1 or 0, no outputz--outputz3Output file for the problem report; Default: stdoutz--ignore-missingz<Will not report glyphs missing from sparse masters as errorsinputsFILE+zSInput a single variable font / DesignSpace / Glyphs file, or multiple TTF/UFO files)metavarrl   nargsr   z--nameNAMEr5   zGName of the master to use in the report. If not provided, all are used.)r  rl   r   r   z-vz	--verbosezRun verbosely.z--debugzRun with debug output.)configLoggerINFOERROR)levelDEBUG)basenamer   z.designspace)DesignSpaceDocumentc              3   N   K   | ]  }t        |t                         y wr&   r   dict.0vaxis_mappingsks     r/   	<genexpr>zmain.<locals>.<genexpr>  #     S1+AtM!4D/EFS   "%z.glyphs)GSFontto_designspace-c              3   N   K   | ]  }t        |t                         y wr&   r  r  s     r/   r  zmain.<locals>.<genexpr>	  r  r  z.ttf)TTFontheadgvarfvar)r?   r   r   avarr   TF)locationr   recalcBoundsz''c                     t        |       | fS r&   )r3   )r  s    r/   <lambda>zmain.<locals>.<lambda>D  s    APQ{ r1   )key' c           
   3   `   K   | ]%  \  }}|d t        t        ||         d       ' yw)=   N)r   r   )r  r  r  axisMappings      r/   r  zmain.<locals>.<genexpr>G  s<      	# !%1 !" 1$6q+a.$I2!"	#s   +.z.ufo)	UFOReader.getGlyphSetzRunning on %d glyphsetszLocations: %s)r   r   r_   rb   r   r`   ra   rc   w)filezGlyph z was not compatible:rn   rs   rt   rm   rq   rr   z  Masters: %s:z, rl   rk   z"    Glyph was missing in master %sro   z'    Glyph has an open path in master %srp   z*    Path count differs: %i in %s, %i in %sru   rv   rw   z5    Node count differs in path %i: %i in %s, %i in %srx   ry   z7    Node %o incompatible in path %i: %s in %s, %s in %srz   r{   z    Contour order differs: z in r|   zD    Contour %d start point differs: %s in %s, %s in %s; reversed: %srQ   r}   r~   z3    Contour %d interpolation is underweight: %s, %sr   z2    Contour %d interpolation is overweight: %s, %sr   z'    Contour %d has a kink at %s: %s, %srF   r   z    Showing z and zWriting PDF to %s)InterpolatablePDF)rh   r   )r`   ra   zWriting PS to %s)InterpolatablePSzWriting HTML to %s)InterpolatableSVG)show_tolerancer`   ra   )r2  show_page_numberwbs   <!DOCTYPE html>
sN   <html><body align="center" style="font-family: sans-serif; text-color: #222">
s6   <title>fonttools varLib.interpolatable report</title>
z
<h1>Glyph z</h1>
zutf-8z$<img src='data:image/svg+xml;base64,s   ' />
s   <hr>
s   </body></html>
)jargparsesysArgumentParsermain__doc__add_argumentfloatDEFAULT_TOLERANCEr   str
parse_args	fontToolsr  verboser   r   splitos.pathr	  DEFAULT_UPEMtupler   r3   endswithfontTools.designspaceLibr
  fromfilesourcesrx   r  axesr'   minimumdefaultmaximummapitems	glyphsLibr  r  upmfontr   
familyName	styleNamefontTools.ttLibr  
unitsPerEmminValuedefaultValuemaxValueaxisTagsegmentscopyr   r   r  r   
variationsr   r5   r,  r   joinr   fontTools.ufoLibr*  r   readInforsplithasattrsetr   r   r`   ra   r   r   r   rc   r   outputstdoutr   quietjsonprintdumpspdfinterpolatablePlotr/  add_title_pageadd_problemsdraw_cupcakepsr0  htmlr1  base64writerG   encode	b64encode	Exceptionr   error)Rr   r5  r6  parserr  r   r	  fontsr   r_   rb   original_args_inputsdesignspacer
  rm   aaxis_triplesr  vvr  r  gsfontsourcefr  rQ  r  axisr  rY  rZ  fvarMappingr  rF   r  r   ttGlyphSetsrh   r,   varlocDictloctagvallocTupler'   _filenamer*  r   r-   accepted_namesgn	glyphsSetglyphSetGlyphNamesdiffr`   ra   problems_genr   rf  r   last_glyphnameplast_master_idxsmaster_idxsmaster_namesr/  ri  r0  rn  r1  svgsglyph_startssvgrO   glyph_problemsrp  rg   rT   r)  r  sR                    `                                                              @@r/   r8  r8    s   $$)LL % F 5  
 B  
 ;>OO	   8;LL	   +  
 *  
 1  
 +  
 4  
 B  
 K  
 b   V   k,EUV
	,=UVT"D&$,,G=zz7#$(KKT[[ TF EEID -
4;;1;;q>"">2D-66t{{1~FK5@5H5HI66;;IDK7B7J7JKVKIKCNCSCS>?AIIqyy99L  5@4D4DEqQVVQUU]EM *//1 Ar 5SPRSSSL 
 [[^$$Y/8DKKN+F::D(0K/:/B/BCVV[[CECNST 1 11663C3CDTETDK7B7J7JKVKIKCNCSCS>?AIIqyy99L  5@4D4DEqQVVQUU]EM *//1 Ar 5SPRSSSL 
 [[^$$V,.$++a.)D<**D~ !F| II D MM,,==1K- T><D-1]]-@-@-B )&1'&:&?&?&A/7~~/? OHe:L (+;K07 F|F| '-	>#DOO$8$8$:;F!' I#y9 "$ (.sxx~~/?(@ 6HC+.q6GCLJJSV}56 $):#;6484D4D)0TPU 5E 5K1 ,%y':K<QSW$ ))+,D	8>{?O?O?Q8RS1;SS &y~~'7=R S 5H(( 	# )1	# 	
   LL&LL8!45$$T(^4#5$ '+# !&'AR'	'KK ;V$2X&D"$DMM$??DLL.(#D<**DLLXh'..sA6q9:!;$ I D4''')HH(--/BQ!Xa[.BCD yyTYY #&eY"7
h~% 
	 
 #&eY"7
h~% 
	 

 #(B$4>+ABB	THHMMOTbRTRTUVFI $ 1-- $#$	$ BKK#"35KIK3"3I"&.."<BSIf*C	N;')"45..]]

 t$++-CJJ4S3Izzyy*6 8&IwY'..w78 djj*3!%$0 BLIqY'..q1 N2yk1EFQO)2+/( (1, </>1BC  
 #&66  (1} x["#J-:!? %
 $))L2IIPQR+6(yI-@1X;NUV 6k1E(S!" 6l2H !) !* !) !*	 "#	 6l2S !&	 !) !* !) !* "#
 6&<<U !&	 !&	 !) !* !) !* "# 6o5 !") !* !) !* "#	 6&99b !) !) !* !) !* !* "# 6m3Q !) !* !* "# 6l2P !) !* !* "# 6f,E !) !'
 !* !*	 "#	 6i/ !"* !*
 "#wBH '3 4"	7#**734 88HH($((3="488yN 'RU""(I #    *

$$&' 77HH'2<!$''YeL &PR!!(I "  )

OO%& 99HH)4995=DL"49EJ 'c""(#(''	 #  .6^^-= )E>.3LT+$$/',). %   

$$&'" dii& -!,-f RS'o 'FAsL(*\!_,=W E L LW UVGGBII'RSGGF,,S12GGI&GGI&' +,-(  [ JK F DTK Fv  T. (4 C



 C U LV' '& &' '&- -  	&&		!s3  <AA%AA5AAAA AA"AA(6AA-+AA25AA7AA< AB 
AB 	AB/AB
5ABAB.	AB"8AB"AB'<AB-L!AC% 'BAC% )AAB2-AAC% <AAB? A
AC% 
A0AC:"AC% C%ACAAC% B2AB<B7AC% B?AC	CAC% CACCAC% CAC"CAC% C%	ADC.+ADDAD__main__)NNFr&   )5r9  interpolatableHelpersinterpolatableTestContourOrderr   interpolatableTestStartingPointr   fontTools.pens.recordingPenr   r   fontTools.pens.transformPenr	   fontTools.pens.statisticsPenr
   r   fontTools.pens.momentsPenr   fontTools.varLib.modelsr   r   fontTools.misc.fixedToolsr   fontTools.misc.transformr   collectionsr   typesr   	functoolsr   pprintr   mathr   r   r   logging	getLoggerr   r<  r   r   rC  r   r   r   r   r8  r[   r6  r   exitintboolr^   r1   r/   <module>r     s    % > @ M 4 L 6 I 7 . # !       g9:    f3 f3V 
	d 	dN x Mzz zvHCHHSh !	 r1   