U
    #vh                     @   sv  d Z ddlT ddlmZ ddlmZ ddlmZ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$ddl%Z%e$&dZ'dZ(dZ)dZ*dZ+G dd dZ,d'de(e)e+dg dddZ-ee-dd Z.d d! Z/d"d# Z0d(d$d%Z1e2d&krrddl3Z3e1 Z4e35e6e7e4 dS ))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lerpRecordings)TransformPen)StatisticsPenStatisticsControlPen)OpenContourError)piecewiseLinearMapnormalizeLocation)floatToFixedToStr)	Transform)defaultdict)SimpleNamespace)wraps)pformat)sqrtatan2piNzfontTools.varLib.interpolatablegffffff?g      ?gMb`?i  c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )Glyph)	
recordings
greenStatscontrolStatsgreenVectorscontrolVectors	nodeTypesisomorphismspointsopenContoursc                 C   s,   || _ | jD ]}t| |g  q| | d S N)nameITEMSsetattr	_populate)self	glyphnameglyphsetitem r+   C/tmp/pip-unpacked-wheel-1ufboor8/fontTools/varLib/interpolatable.py__init__4   s    
zGlyph.__init__c                 C   s2   | j D ]&}tt| ||krt| |d  qd S r"   )r$   lengetattrappend)r'   ixr*   r+   r+   r,   _fill_in:   s    
zGlyph._fill_inc                 C   s  || j  }|d k| _| jrd S tt|d}z|j|dd W n tk
rZ   || Y nX |j| _~t| jD ]j\}}dd |jD }| j	
| t|d}t|d}z$|| || | j
d W nB tk
r }	 z"| j
d | | W Y qpW 5 d }	~	X Y nX | j
| | j
| | j
t| | j
t| |d dkrd| | qp|d d	ksvt|d
 dkstt }
t|
d}|| | j
|
j g }| j
| t|
j|d t|
j|d qpd S )Nr)   T)ZoutputImpliedClosingLinec                 S   s   g | ]\}}|qS r+   r+   ).0opargr+   r+   r,   
<listcomp>N   s     z#Glyph._populate.<locals>.<listcomp>Fr   ZaddComponentZmoveTo)Z	closePathZendPath)r#   doesnt_existZPerContourOrComponentPenr   draw	TypeErrorvaluer   	enumerater   r0   r
   r   replayr!   r   r2   r   r   r   contour_vector_from_statsr   AssertionErrorZSimpleRecordingPointPenZSegmentToPointPenr    r   Zadd_isomorphisms)r'   r)   glyphZperContourPenr1   contourr   r   r   er    	converterr   r+   r+   r,   r&   ?   sR    









zGlyph._populateNc                 C   s4   |d kr | j D ]}|| qn| j | | d S r"   )r   r:   )r'   ZpenZcountor_idxrB   r+   r+   r,   r:   w   s    
z
Glyph.draw)N)__name__
__module____qualname__r$   r-   r2   r&   r:   r+   r+   r+   r,   r   '   s
   8r   F)	locations	tolerance	kinkinessupemshow_alldiscrete_axesc          V      #   sr
  |dkr|d9 }d|  kr$dks*n t |dkr:|d9 }d|ksFt |pVdd D }|d krndd D }t||	d	\}
fd
d}|D 	]؉ td   fddD }tdd |D dkrqtt||D ]t\}\}}}|jr|sވ tj	||dfV  qd}t|j
D ].\}}|s.qd} tj|||dfV  q|rqqd gt }|
D 	]}|| }|d ksf|jsqf|| }|d krqf|| }|d ksf|jsqf|j|j}t|tkr tj|| || ||t|tdfV  qf|krtt|D ]\}\}}||kr@q&t|t|kr tj||| || ||t|t|dfV  q&tt||D ]D\}\}}||kr tj|||| || ||||d	fV  qqq&t||\} }!| |k r. tj|| || ||ttt|!|!| dfV  |!||< |j}"|j|j}#|j|j}$|j|| }!|!d k	rrfdd|!D fdd|!D fdd|!D g }%t|$D ]T\}&}'z(t }(tt|&j|'j|(_|%|( W n  tk
r   |%d  Y nX qtt|"D ]\}\})}*|)d ks|*d kst|)dkst|)t|*krXqt|||||!\} }+},| |k r tj||| || ||d|+|,| d
fV  |%| }-|-r|#| d dk | d dk krtd d}.|-|. t |.}/|#| }0| }1|0d |0d  }2|1d |1d  }3|/d |/d  }4ttj!tj"fD ]\}5}6|5r\t#|2|3}7q>nt$|2|3 }7t%d|6|4|7|2|3 |5s|7| |4d ks|5r>d|7|  |4k r>z|5r|7|4 } n|4|7 } W n t&k
r   d} Y nX t%d|   |6||| || ||| dfV  q>q|j'}|j'|| d k	rPrPfd d|| D d!}8|t( t) | }9tt|D ]\}\})}*|)d ksr|*d ksrt|)dksrt|)t|*krqrtt|)D ]v}:|)|: };|*|: }<|;d r|<d sq|)|:d  }=|*|:d  }>|)|:d t|)  }?|*|:d t|*  }@|=d rJ|>d rJq|=d rb|>d rbqt*|;d  };t*|<d  }<t*|=d  }=t*|>d  }>t*|?d  }?t*|@d  }@|;|= }A|?|; }B|<|> }C|@|< }D|Aj+|Bj, |Aj,|Bj+  }E|Cj+|Dj, |Cj,|Dj+  }Fz,|Et-|At-|B  }E|Ft-|Ct-|D  }FW n t&k
rB   Y qY nX t-|E|8kst-|F|8krdq|Aj+|Bj+ |Aj,|Bj,  }G|Cj+|Dj+ |Cj,|Dj,  }H|Gdk s|Hdk rqt-|At-|At-|B  }It-|Ct-|Ct-|D  }Jt-|I|J }Kt-|K|8k rq|;|< d" }L|=|> d" }M|?|@ d" }N|L|M }O|N|L }P|Oj+|Pj, |Oj,|Pj+  }Qz|Qt-|Ot-|P  }QW n t&k
	rz   Y qY nX t-|Q||  |8k	rq|Qt-|O t-|P }Rt-|O|P }St-|R|S }T|T|9k 	rАq|T|S }U|U|8k	rq|8t-|Q|  } t%d#|T|U|Q|K t%d|   tj.||| || |||:| d$fV  qĐqr|rf tj/|| || ||d%fV  qfqd S )&N
   g{Gz?r   r   c                 S   s   g | ]}t |qS r+   )repr)r4   gr+   r+   r,   r7      s     ztest_gen.<locals>.<listcomp>c                 S   s   h | ]}|  D ]}|qqS r+   keys)r4   r)   rP   r+   r+   r,   	<setcomp>   s     
  ztest_gen.<locals>.<setcomp>rM   c                    sJ   | d krd S |  } | d kr d S |  d k	rF |  | d krF|  } q | S r"   r+   )ir(   )	glyphsetsparentsr+   r,   grand_parent   s    
ztest_gen.<locals>.grand_parentzTesting glyph %sc                    s   g | ]}t  |qS r+   )r   )r4   r)   )
glyph_namer+   r,   r7      s     c                 S   s   g | ]}|d k	rdqS )Nr   r+   )r4   rA   r+   r+   r,   r7      s      )typemaster
master_idxFT)rZ   r[   r\   rB   )rZ   master_1master_2master_1_idxmaster_2_idxvalue_1value_2)rZ   pathr]   r^   r_   r`   ra   rb   )	rZ   rc   noder]   r^   r_   r`   ra   rb   )rZ   r]   r^   r_   r`   ra   rb   rI   c                    s   g | ]} | qS r+   r+   r4   rU   )m1Isomorphismsr+   r,   r7   9  s     c                    s   g | ]} | qS r+   r+   re   )	m1Vectorsr+   r,   r7   :  s     c                    s   g | ]} | qS r+   r+   re   )
recording1r+   r,   r7   ;  s     )
rZ   rB   r]   r^   r_   r`   ra   rb   reversedrI   r3   z;%s: actual size %g; threshold size %g, master sizes: %g, %ggh㈵>ztolerance %g)rZ   rB   r]   r^   r_   r`   rI   c                    s   g | ]} | qS r+   r+   re   )m1r+   r,   r7     s     g?   z=kink: deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g)rZ   rB   r]   r^   r_   r`   r<   rI   )rZ   r]   r^   r_   r`   )0r@   Zfind_parents_and_orderloginfor.   r=   zipr9   InterpolatableProblemMISSINGr!   	OPEN_PATHr   
PATH_COUNT
NODE_COUNTNODE_INCOMPATIBILITYr   CONTOUR_ORDERlistranger   r   r   r   r   r<   r0   
ValueErrorr   WRONG_START_POINTr
   r>   r?   UNDERWEIGHT
OVERWEIGHTmaxr   debugZeroDivisionErrorr    DEFAULT_KINKINESS_LENGTHDEFAULT_KINKINESScomplexrealimagabsKINKNOTHING)VrV   glyphsnamesignore_missingrH   rI   rJ   rK   rL   rM   orderrX   Z	allGlyphsr\   rA   r)   r#   Zhas_openr1   openZ	matchingsZm1idxZglyph1Zm0idxZglyph0Zm0ZpathIxZnodes1Znodes2ZnodeIxZn1Zn2Zthis_toleranceZmatchingZm0IsomorphismsZ	m0VectorsZ
recording0ZmidRecordingZc0Zc1rZcontour0Zcontour1Zproposed_pointreverserB   ZmidStatsZ	midVectorZm0VecZm1VecZsize0Zsize1ZmidSizeZ
overweightZproblem_typeZexpectedSizetZdeviation_thresholdrU   Zpt0Zpt1Zpt0_prevZpt1_prevZpt0_nextZpt1_nextZd0_prevZd0_nextZd1_prevZd1_nextZsin0Zsin1Zdot0Zdot1Zr0Zr1Zr_diffZmidZmid_prevZmid_nextZmid_d0Zmid_d1Zsin_midZcrossZarc_lenZ	deviationZdeviation_ratior+   )rY   rV   rj   rf   rg   rW   rh   r,   test_gen   s     




	







    

(








r   c                  O   s.   t t}t| |D ]\}}|| | q|S r"   )r   rv   r   r0   )argskwargsproblemsr(   problemr+   r+   r,   testI  s    r   c                 C   sB   | |krd S ||  || < t ||  dg D ]}t|j||| q(d S )N
components)r/   recursivelyAddGlyphZ	glyphName)r(   r)   Z
ttGlyphSetglyf	componentr+   r+   r,   r   Q  s
    r   c                 C   s"   t j| }|rt j|dd | S )NT)exist_ok)osrc   dirnamemakedirs)rc   r   r+   r+   r,   ensure_parent_dirZ  s    r   c           W         sv  ddl }ddl}|jdtjd}|jdddd |jd	d
dd |jddtdt d |jddtdt d |jdd
dd |jdddd |jdddd |jdddd |jdd
dd |jdddd |jdd
dd |jdd t	d!d"d# |jd$d%t	d&d'd( |jd)d*d
d+d |jd,d
d-d |
| } dd.lm} || jrJd/nd0d1 | jrd|d2d1 | jrv| j nd}dd3lm} g }g }g }	t t}
t| j}t| jd4krd}| jd d5rXdd6lm} || jd }d7d8 |jD | _d9d8 |jD }	d:d; |jD fd<d=|jD d>d= |jD fd?d= D n| jd d@rddAlm }m!} || jd }|j"}
||}dBd8 |jD }dCd8 |D }g | _dDd8 |jD }	dEd= |jD dFd= |jD fdGd= D n| jd dHs(| jd dIrddJl#m$} || jd }|dK j%}
|dL }i |jD ]}|j&|j'|j(dM|j)< q^dN}dO|kr |dO }t*|j+dPdrdQd= D dR}nH|j, D ]<\}}| - }| D ]\}}t.||| |< qސqi }t/t0}dS|kr|dS }|dT }|dkr>t1|j23 }|D ]} |j2|  D ]}!i }"g }#t1|!j D ](\}$}%|%d4 |"|$< |#4|$|%d4 f qjt|#}&|&|kr|j5|"dRdNdU||&< t6| ||& ||& | qPqBndV|krj|dL j}'|dV j7j8d }(|(j9})|dkrt1|)3 }|D ]F} |)|  }*|*j:}+t*|+dWdh},t*|+dWd}-d}.t;|*j<D ]>}/|/dXkrv|,=|- n|/dWkrt>|.t?st@|.}-|/}.q\tA|+dYsq |+jBjC}0|,D ]}-|0jD|- }1|1jED ]}2|0jFjG|2 }3i }"g }#t;|3jHD ]0\}4}|'|4 j)}$|jI}%|%|"|$< |#4|$|%f qt|#}&|&|krF|j5|"dRdNdU||&< ||& ||& |  | < q̐qq dZg}|5 g}i g}	d[d= t13 D t1|3 d\d] d^D ]Z}&d_d`Jfdadb|&D  d_ }5|r|5dc7 }5|4|5 |4||&  |	4t0|& qdR| _Kg | _|	s&ddd8 |D }	| jD ]}6|6derrddflLmM}7 |7|6}tN }8|O|8 |8j%}
|4| n(ddJl#m$} ||6}|dK j%}
|4| |4||6Pdgd4d  q,t|dhk rtQRdi dS g }|D ]<}tA|djr|5 n||4fdkd=3 D  q| jSrnt| jS  fdld8tT||D } fdmd8tT||	D }	 fdnd8|D }|st1tdod8 |D }t|}9|D ]4t3 }:|9|: };|;r|;D ]}<d|<< qqfdpd8|	D }	| jUpt}=| jVdk	r| jVnt}>z$tQWdqt| tQWdrtX|	 tY||||	|
| jK|=|>| jZds
}?t/t[}@| j\dk	r`|j]nt^t_| j\dt}A| j`s| ja	rddla}B|?D ]\} }C|@|  4|C 	qtb|Bc|@|Adu qd}D|?D ]\} }E|@|  4|E | |Dk
rtbdv|  dw|Adu | }Dd}Fdx|Ek
r|Edx fn|Edy |Edz f}G|G|Fk
rnd{|Ek
rD|Ed{ fn|Ed| |Ed} f}Htbd~dJ|H |Adu |G}F|Ed tdjek
rtbd|Ed{  |Adu 	q|Ed tdjfk
rtbd|Ed{  |Adu 	q|Ed tdjgk
rtbd|Ed |Ed| |Ed |Ed} f |Adu 	q|Ed tdjhkr<tbd|Ed |Ed |Ed| |Ed |Ed} f |Adu 	q|Ed tdjikrtbd|Ed |Ed |Ed |Ed| |Ed |Ed} f |Adu 	q|Ed tdjjkrtbd|Ed |Ed| |Ed |Ed} f |Adu 	q|Ed tdjkkrtbd|Ed |Ed |Ed| |Ed |Ed} |Ed f |Adu n|Ed tdjlkr:tbd|Ed |Ed| |Ed} f |Adu n|Ed tdjmkrntbd|Ed |Ed| |Ed} f |Adu nf|Ed tdjnkrtbd|Ed |Ed |Ed| |Ed} f |Adu n,|Ed tdjok	rtbd|Ed| |Ed} f |Adu 	qn|?D ]\} }C|@|  4|C qtp|@}@dD ]}Et*| |E}I|Idkr qtQWd|Eq |I d4dlrms}Jmt}K |EdkrP|Jn|K}L|Lt_|I||d\}M|Mju||=|>d |@r|Mv|@ |Mw|@ |@s| j`s|Mx  |@r|My  |Mz  W 5 Q R X q| j{r&tQWd| j{ d4dlrm|}N g }Oi }P|N|O||db}Q|Qju|dN|=|>d |@ D ]*\}R}S|R|Pt|O< |Qjw|R|SidNdNd q |@sb| j`sb|Qx  W 5 Q R X ddl}}Tt^t_| j{d}A|A~d |A~d |A~d t;|OD ]d\}U}Q|U|Pkr|A~d|P|U  dd |A~dd |A~|T|Q |A~d |A~d q|A~d W 5 Q R X W n> tk
rf }V z|V j|7  _tQ|V  W 5 d}V~VX Y nX |@rr|@S dS )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   rZ   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)metavarrZ   nargsr   z--nameNAMEr0   zGName of the master to use in the report. If not provided, all are used.)r   rZ   r   r   z-vz	--verbosezRun verbosely.z--debugzRun with debug output.)configLoggerINFOWARNING)levelDEBUG)basenamer   z.designspace)DesignSpaceDocumentc                 S   s   g | ]
}|j qS r+   )rc   r4   r[   r+   r+   r,   r7     s     zmain.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r+   locationr   r+   r+   r,   r7     s     c                 S   s   h | ]}t |d s|jqS )minimum)hasattrr#   r4   ar+   r+   r,   rS     s    
 zmain.<locals>.<setcomp>c                    s*   i | ]"}|j  kr|j |j|j|jfqS r+   r#   r   defaultmaximumr   rT   r+   r,   
<dictcomp>  s   
 zmain.<locals>.<dictcomp>c                 S   s   i | ]}|j |jqS r+   r#   mapr   r+   r+   r,   r     s      c                    s*   i | ]"\ } t  fd d|D qS )c                 3   s    | ]}t |t  V  qd S r"   r   dictr4   vaxis_mappingskr+   r,   	<genexpr>  s     "main.<locals>.<dictcomp>.<genexpr>tupler4   vvr   r   r,   r     s    )z.glyphsz.glyphspackage)GSFontto_designspacec                 S   s   g | ]
}|j qS r+   )font)r4   sourcer+   r+   r,   r7     s     c                 S   s    g | ]}d |j j|j jf qS )z%s-%s)rm   Z
familyNameZ	styleName)r4   fr+   r+   r,   r7     s     c                 S   s   g | ]
}|j qS r+   r   r   r+   r+   r,   r7     s     c                 S   s    i | ]}|j |j|j|jfqS r+   r   r   r+   r+   r,   r     s     c                 S   s   i | ]}|j |jqS r+   r   r   r+   r+   r,   r     s      c                    s*   i | ]"\ } t  fd d|D qS )c                 3   s    | ]}t |t  V  qd S r"   r   r   r   r+   r,   r     s     r   r   r   r   r   r,   r     s    z.ttfz.otf)TTFontheadfvarr8   r   r   FavarZVarStorec                 S   s   i | ]}|d dddqS )r8   r   r   r   r+   )r4   tagr+   r+   r,   r     s      Tgvarr   )r   
normalizedZrecalcBoundsZCFF2vsindexZblendvstorez''c                 S   s   i | ]
}|d qS )r   r+   r   r+   r+   r,   r   d  s      c                 S   s   t | | fS r"   )r.   )r   r+   r+   r,   <lambda>e      zmain.<locals>.<lambda>)key' c                 3   s.   | ]&\}}d |t t| | df V  qdS )z%s=%s   N)r   r   r4   r   r   )axisMappingr+   r,   r   h  s    zmain.<locals>.<genexpr>z (normalized)c                 S   s   g | ]}i qS r+   r+   )r4   _r+   r+   r,   r7   ~  s     z.ufo)	UFOReader.rk   z9Font file does not seem to be variable. Nothing to check.getGlyphSetc                    s   i | ]}| | qS r+   r+   )r4   r   r3   r+   r,   r     s      c                    s   g | ]\}}| kr|qS r+   r+   )r4   r#   r)   accepted_namesr+   r,   r7     s   c                    s   g | ]\}}| kr|qS r+   r+   )r4   r#   r   r   r+   r,   r7     s   c                    s   g | ]}| kr|qS r+   r+   )r4   r#   r   r+   r,   r7     s      c                 S   s   g | ]}|  D ]}|qqS r+   rQ   )r4   r)   gnr+   r+   r,   r7     s     
  c                    s,   g | ]$}t | fd d| D qS )c                    s   i | ]\}}| kr||qS r+   r+   r   rT   r+   r,   r     s       z#main.<locals>.<listcomp>.<dictcomp>)r   items)r4   loc)axis_triplesrM   r+   r,   r7     s   zRunning on %d glyphsetszLocations: %s)	r   r   rH   rK   r   rI   rJ   rL   rM   w)filezGlyph z was not compatible:r\   r_   r`   r[   r]   r^   z  Masters: %s:z, rZ   z"    Glyph was missing in master %sz'    Glyph has an open path in master %sz*    Path count differs: %i in %s, %i in %sra   rb   z5    Node count differs in path %i: %i in %s, %i in %src   z7    Node %o incompatible in path %i: %s in %s, %s in %srd   z-    Contour order differs: %s in %s, %s in %szD    Contour %d start point differs: %s in %s, %s in %s; reversed: %srB   ri   z3    Contour %d interpolation is underweight: %s, %sz2    Contour %d interpolation is overweight: %s, %sz'    Contour %d has a kink at %s: %s, %sr<   z    Showing %s and %s)psZpdfzWriting %s to %s)InterpolatablePSInterpolatablePDFr   )rV   r   )rI   rJ   zWriting HTML to %s)InterpolatableSVG)show_tolerancerI   rJ   )r   Z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>
)argparsesysArgumentParsermain__doc__add_argumentfloatDEFAULT_TOLERANCEr   str
parse_argsZ	fontToolsr   verboser}   r   splitos.pathr   setDEFAULT_UPEMr   r   r.   endswithZfontTools.designspaceLibr   ZfromfilesourcesZaxesr   Z	glyphsLibr   r   ZupmZfontTools.ttLibr   Z
unitsPerEmZminValuedefaultValueZmaxValueaxisTagr/   tablesegmentscopyr   r   r   sortedZ
variationsrR   r0   r   r   ZcffZtopDictIndexZCharStringsprivater=   programadd
isinstanceintr@   r   r   Z
otVarStoreZVarDataZVarRegionIndexZVarRegionListZRegionZVarRegionAxisZ	PeakCoordjoinr   ZfontTools.ufoLibr   r   ZreadInforsplitrl   warningr#   rn   rI   rJ   rm   r   r   rL   rv   outputstdoutr   r   quietjsonprintdumpsro   rp   rq   rr   rs   rt   ru   ry   rz   r{   r   r   Zsort_problemsupperZinterpolatablePlotr   r   Zadd_title_pageZadd_summaryZadd_problemsZdraw_cupcakeZ	add_indexZadd_table_of_contentshtmlr   base64writeencode	b64encode	Exceptionr   error)Wr   r   r   parserr   r   r   Zfontsr   rH   rK   Zoriginal_args_inputsZdesignspacer   r   r   Zgsfontr   r   r   Zaxisr   r   r  r	  ZfvarMappingr   r<   ZttGlyphSetsrV   r   r   r(   varZlocDictr   r   valZlocTupleZfvarAxesZcff2Zcharstringscsr  Z	vsindicesr   Zlast_opr5   ZvarStoreZvarDataZregionIndexZregionZ	axisIndexr#   filenamer   rm   Z	glyphsSetZglyphSetGlyphNamesZdiffr   rI   rJ   Zproblems_genr   r   r  r   Zlast_glyphnamepZlast_master_idxsZmaster_idxsZmaster_namesr6   r   r   ZPlotterClassdocr   ZsvgsZglyph_startssvgrA   Zglyph_problemsr  rU   rC   r+   )r   r   r   r   rM   r)   r,   r   a  s   







$


 


  
   


















 






 





	


			
	

    







r   __main__)NNF)N)8r   ZinterpolatableHelpersZinterpolatableTestContourOrderr   ZinterpolatableTestStartingPointr   ZfontTools.pens.recordingPenr   r   r   ZfontTools.pens.transformPenr	   ZfontTools.pens.statisticsPenr
   r   ZfontTools.pens.momentsPenr   ZfontTools.varLib.modelsr   r   ZfontTools.misc.fixedToolsr   ZfontTools.misc.transformr   collectionsr   typesr   	functoolsr   pprintr   mathr   r   r   loggingr   	getLoggerrl   r   r   r   r  r   r   r   r   r   r   rE   r   r   exitr  boolr+   r+   r+   r,   <module>   sd   
Z      M
	
    X
