From 7cd6acf12670f3773113f67ed2acb35cb21c32a0 Mon Sep 17 00:00:00 2001 From: Garret Fick Date: Sun, 24 Jul 2016 17:08:47 +0800 Subject: [PATCH] Add many render tests based on the Umaco gerger specification. Fix multiple rendering bugs, especially related to holes in flashed apertures --- gerber/cam.py | 2 +- gerber/gerber_statements.py | 4 +- gerber/primitives.py | 35 +++-- gerber/render/cairo_backend.py | 105 +++++++++++--- gerber/render/rs274x_backend.py | 12 +- gerber/rs274x.py | 24 +++- .../tests/golden/example_coincident_hole.png | Bin 0 -> 47261 bytes .../tests/golden/example_cutin_multiple.png | Bin 0 -> 1348 bytes gerber/tests/golden/example_flash_circle.png | Bin 0 -> 5978 bytes gerber/tests/golden/example_flash_obround.png | Bin 0 -> 3443 bytes gerber/tests/golden/example_flash_polygon.png | Bin 0 -> 4087 bytes .../tests/golden/example_flash_rectangle.png | Bin 0 -> 1731 bytes .../tests/golden/example_fully_coincident.png | Bin 0 -> 71825 bytes .../example_not_overlapping_contour.png | Bin 0 -> 71825 bytes .../example_not_overlapping_touching.png | Bin 0 -> 96557 bytes .../golden/example_overlapping_contour.png | Bin 0 -> 33301 bytes .../golden/example_overlapping_touching.png | Bin 0 -> 33301 bytes .../tests/golden/example_simple_contour.png | Bin 0 -> 31830 bytes .../tests/golden/example_single_contour.png | Bin 0 -> 556 bytes .../tests/golden/example_single_contour_3.png | Bin 0 -> 2297 bytes .../tests/golden/example_single_quadrant.png | Bin 0 -> 9658 bytes .../tests/golden/example_two_square_boxes.png | Bin 18247 -> 18219 bytes .../resources/example_coincident_hole.gbr | 24 ++++ gerber/tests/resources/example_cutin.gbr | 18 +++ .../resources/example_cutin_multiple.gbr | 28 ++++ .../tests/resources/example_flash_circle.gbr | 10 ++ .../tests/resources/example_flash_obround.gbr | 10 ++ .../tests/resources/example_flash_polygon.gbr | 10 ++ .../resources/example_flash_rectangle.gbr | 10 ++ .../resources/example_fully_coincident.gbr | 23 ++++ .../tests/resources/example_level_holes.gbr | 39 ++++++ .../example_not_overlapping_contour.gbr | 20 +++ .../example_not_overlapping_touching.gbr | 20 +++ .../resources/example_overlapping_contour.gbr | 20 +++ .../example_overlapping_touching.gbr | 20 +++ .../resources/example_simple_contour.gbr | 16 +++ .../resources/example_single_contour_1.gbr | 15 ++ .../resources/example_single_contour_2.gbr | 15 ++ .../resources/example_single_contour_3.gbr | 15 ++ .../resources/example_single_quadrant.gbr | 18 +++ gerber/tests/test_cairo_backend.py | 128 +++++++++++++++++- gerber/tests/test_primitives.py | 106 +++++++++++++++ 42 files changed, 699 insertions(+), 48 deletions(-) create mode 100644 gerber/tests/golden/example_coincident_hole.png create mode 100644 gerber/tests/golden/example_cutin_multiple.png create mode 100644 gerber/tests/golden/example_flash_circle.png create mode 100644 gerber/tests/golden/example_flash_obround.png create mode 100644 gerber/tests/golden/example_flash_polygon.png create mode 100644 gerber/tests/golden/example_flash_rectangle.png create mode 100644 gerber/tests/golden/example_fully_coincident.png create mode 100644 gerber/tests/golden/example_not_overlapping_contour.png create mode 100644 gerber/tests/golden/example_not_overlapping_touching.png create mode 100644 gerber/tests/golden/example_overlapping_contour.png create mode 100644 gerber/tests/golden/example_overlapping_touching.png create mode 100644 gerber/tests/golden/example_simple_contour.png create mode 100644 gerber/tests/golden/example_single_contour.png create mode 100644 gerber/tests/golden/example_single_contour_3.png create mode 100644 gerber/tests/golden/example_single_quadrant.png create mode 100644 gerber/tests/resources/example_coincident_hole.gbr create mode 100644 gerber/tests/resources/example_cutin.gbr create mode 100644 gerber/tests/resources/example_cutin_multiple.gbr create mode 100644 gerber/tests/resources/example_flash_circle.gbr create mode 100644 gerber/tests/resources/example_flash_obround.gbr create mode 100644 gerber/tests/resources/example_flash_polygon.gbr create mode 100644 gerber/tests/resources/example_flash_rectangle.gbr create mode 100644 gerber/tests/resources/example_fully_coincident.gbr create mode 100644 gerber/tests/resources/example_level_holes.gbr create mode 100644 gerber/tests/resources/example_not_overlapping_contour.gbr create mode 100644 gerber/tests/resources/example_not_overlapping_touching.gbr create mode 100644 gerber/tests/resources/example_overlapping_contour.gbr create mode 100644 gerber/tests/resources/example_overlapping_touching.gbr create mode 100644 gerber/tests/resources/example_simple_contour.gbr create mode 100644 gerber/tests/resources/example_single_contour_1.gbr create mode 100644 gerber/tests/resources/example_single_contour_2.gbr create mode 100644 gerber/tests/resources/example_single_contour_3.gbr create mode 100644 gerber/tests/resources/example_single_quadrant.gbr diff --git a/gerber/cam.py b/gerber/cam.py index 28918cb..f64aa34 100644 --- a/gerber/cam.py +++ b/gerber/cam.py @@ -260,7 +260,7 @@ class CamFile(object): If provided, save the rendered image to `filename` """ - ctx.set_bounds(self.bounds) + ctx.set_bounds(self.bounding_box) ctx._paint_background() if invert: diff --git a/gerber/gerber_statements.py b/gerber/gerber_statements.py index 52e7ac3..3212c1c 100644 --- a/gerber/gerber_statements.py +++ b/gerber/gerber_statements.py @@ -279,9 +279,9 @@ class ADParamStmt(ParamStmt): return cls('AD', dcode, 'R', ([width, height],)) @classmethod - def circle(cls, dcode, diameter): + def circle(cls, dcode, diameter, hole_diameter): '''Create a circular aperture definition statement''' - return cls('AD', dcode, 'C', ([diameter],)) + return cls('AD', dcode, 'C', ([diameter, hole_diameter],)) @classmethod def obround(cls, dcode, width, height): diff --git a/gerber/primitives.py b/gerber/primitives.py index 90b6fb9..b8ee344 100644 --- a/gerber/primitives.py +++ b/gerber/primitives.py @@ -370,12 +370,13 @@ class Arc(Primitive): class Circle(Primitive): """ """ - def __init__(self, position, diameter, **kwargs): + def __init__(self, position, diameter, hole_diameter = 0, **kwargs): super(Circle, self).__init__(**kwargs) validate_coordinates(position) self.position = position self.diameter = diameter - self._to_convert = ['position', 'diameter'] + self.hole_diameter = hole_diameter + self._to_convert = ['position', 'diameter', 'hole_diameter'] @property def flashed(self): @@ -384,6 +385,10 @@ class Circle(Primitive): @property def radius(self): return self.diameter / 2. + + @property + def hole_radius(self): + return self.hole_diameter / 2. @property def bounding_box(self): @@ -402,7 +407,7 @@ class Circle(Primitive): if not isinstance(other, Circle): return False - if self.diameter != other.diameter: + if self.diameter != other.diameter or self.hole_diameter != other.hole_diameter: return False equiv_position = tuple(map(add, other.position, offset)) @@ -456,13 +461,14 @@ class Rectangle(Primitive): Only aperture macro generated Rectangle objects can be rotated. If you aren't in a AMGroup, then you don't need to worry about rotation """ - def __init__(self, position, width, height, **kwargs): + def __init__(self, position, width, height, hole_diameter=0, **kwargs): super(Rectangle, self).__init__(**kwargs) validate_coordinates(position) self.position = position self.width = width self.height = height - self._to_convert = ['position', 'width', 'height'] + self.hole_diameter = hole_diameter + self._to_convert = ['position', 'width', 'height', 'hole_diameter'] @property def flashed(self): @@ -477,6 +483,11 @@ class Rectangle(Primitive): def upper_right(self): return (self.position[0] + (self._abs_width / 2.), self.position[1] + (self._abs_height / 2.)) + + @property + def hole_radius(self): + """The radius of the hole. If there is no hole, returns 0""" + return self.hole_diameter / 2. @property def bounding_box(self): @@ -499,12 +510,12 @@ class Rectangle(Primitive): math.sin(math.radians(self.rotation)) * self.width) def equivalent(self, other, offset): - '''Is this the same as the other rect, ignoring the offiset?''' + """Is this the same as the other rect, ignoring the offset?""" if not isinstance(other, Rectangle): return False - if self.width != other.width or self.height != other.height or self.rotation != other.rotation: + if self.width != other.width or self.height != other.height or self.rotation != other.rotation or self.hole_diameter != other.hole_diameter: return False equiv_position = tuple(map(add, other.position, offset)) @@ -655,13 +666,14 @@ class RoundRectangle(Primitive): class Obround(Primitive): """ """ - def __init__(self, position, width, height, **kwargs): + def __init__(self, position, width, height, hole_diameter=0, **kwargs): super(Obround, self).__init__(**kwargs) validate_coordinates(position) self.position = position self.width = width self.height = height - self._to_convert = ['position', 'width', 'height'] + self.hole_diameter = hole_diameter + self._to_convert = ['position', 'width', 'height', 'hole_diameter'] @property def flashed(self): @@ -676,6 +688,11 @@ class Obround(Primitive): def upper_right(self): return (self.position[0] + (self._abs_width / 2.), self.position[1] + (self._abs_height / 2.)) + + @property + def hole_radius(self): + """The radius of the hole. If there is no hole, returns 0""" + return self.hole_diameter / 2. @property def orientation(self): diff --git a/gerber/render/cairo_backend.py b/gerber/render/cairo_backend.py index 0cb230b..78ccf34 100644 --- a/gerber/render/cairo_backend.py +++ b/gerber/render/cairo_backend.py @@ -20,13 +20,14 @@ try: except ImportError: import cairocffi as cairo -from operator import mul, div import math +from operator import mul, div import tempfile +from ..primitives import * from .render import GerberContext, RenderSettings from .theme import THEMES -from ..primitives import * + try: from cStringIO import StringIO @@ -219,15 +220,30 @@ class GerberCairoContext(GerberContext): center = tuple(map(mul, circle.position, self.scale)) if not self.invert: ctx = self.ctx - ctx.set_source_rgba(*color, alpha=self.alpha) + ctx.set_source_rgba(color[0], color[1], color[2], alpha=self.alpha) ctx.set_operator(cairo.OPERATOR_OVER if circle.level_polarity == "dark" else cairo.OPERATOR_CLEAR) else: ctx = self.mask_ctx ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) ctx.set_operator(cairo.OPERATOR_CLEAR) + + if circle.hole_diameter > 0: + ctx.push_group() + ctx.set_line_width(0) ctx.arc(center[0], center[1], radius=circle.radius * self.scale[0], angle1=0, angle2=2 * math.pi) - ctx.fill() + ctx.fill() + + if circle.hole_diameter > 0: + # Render the center clear + + ctx.set_source_rgba(color[0], color[1], color[2], self.alpha) + ctx.set_operator(cairo.OPERATOR_CLEAR) + ctx.arc(center[0], center[1], radius=circle.hole_radius * self.scale[0], angle1=0, angle2=2 * math.pi) + ctx.fill() + + ctx.pop_group_to_source() + ctx.paint_with_alpha(1) def _render_rectangle(self, rectangle, color): ll = map(mul, rectangle.lower_left, self.scale) @@ -253,48 +269,95 @@ class GerberCairoContext(GerberContext): ll[1] = ll[1] - center[1] matrix.rotate(rectangle.rotation) ctx.transform(matrix) - + + if rectangle.hole_diameter > 0: + ctx.push_group() + ctx.set_line_width(0) ctx.rectangle(ll[0], ll[1], width, height) ctx.fill() + if rectangle.hole_diameter > 0: + # Render the center clear + ctx.set_source_rgba(color[0], color[1], color[2], self.alpha) + ctx.set_operator(cairo.OPERATOR_CLEAR) + center = map(mul, rectangle.position, self.scale) + ctx.arc(center[0], center[1], radius=rectangle.hole_radius * self.scale[0], angle1=0, angle2=2 * math.pi) + ctx.fill() + + ctx.pop_group_to_source() + ctx.paint_with_alpha(1) + if rectangle.rotation != 0: ctx.restore() def _render_obround(self, obround, color): + + if not self.invert: + ctx = self.ctx + ctx.set_source_rgba(color[0], color[1], color[2], alpha=self.alpha) + ctx.set_operator(cairo.OPERATOR_OVER if obround.level_polarity == "dark" else cairo.OPERATOR_CLEAR) + else: + ctx = self.mask_ctx + ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) + ctx.set_operator(cairo.OPERATOR_CLEAR) + + if obround.hole_diameter > 0: + ctx.push_group() + self._render_circle(obround.subshapes['circle1'], color) self._render_circle(obround.subshapes['circle2'], color) self._render_rectangle(obround.subshapes['rectangle'], color) + if obround.hole_diameter > 0: + # Render the center clear + ctx.set_source_rgba(color[0], color[1], color[2], self.alpha) + ctx.set_operator(cairo.OPERATOR_CLEAR) + center = map(mul, obround.position, self.scale) + ctx.arc(center[0], center[1], radius=obround.hole_radius * self.scale[0], angle1=0, angle2=2 * math.pi) + ctx.fill() + + ctx.pop_group_to_source() + ctx.paint_with_alpha(1) + def _render_polygon(self, polygon, color): + + # TODO Ths does not handle rotation of a polygon + if not self.invert: + ctx = self.ctx + ctx.set_source_rgba(color[0], color[1], color[2], alpha=self.alpha) + ctx.set_operator(cairo.OPERATOR_OVER if polygon.level_polarity == "dark" else cairo.OPERATOR_CLEAR) + else: + ctx = self.mask_ctx + ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0) + ctx.set_operator(cairo.OPERATOR_CLEAR) + if polygon.hole_radius > 0: - self.ctx.push_group() + ctx.push_group() vertices = polygon.vertices - - self.ctx.set_source_rgba(color[0], color[1], color[2], self.alpha) - self.ctx.set_operator(cairo.OPERATOR_OVER if (polygon.level_polarity == "dark" and not self.invert) else cairo.OPERATOR_CLEAR) - self.ctx.set_line_width(0) - self.ctx.set_line_cap(cairo.LINE_CAP_ROUND) + + ctx.set_line_width(0) + ctx.set_line_cap(cairo.LINE_CAP_ROUND) # Start from before the end so it is easy to iterate and make sure it is closed - self.ctx.move_to(*map(mul, vertices[-1], self.scale)) + ctx.move_to(*map(mul, vertices[-1], self.scale)) for v in vertices: - self.ctx.line_to(*map(mul, v, self.scale)) + ctx.line_to(*map(mul, v, self.scale)) - self.ctx.fill() + ctx.fill() if polygon.hole_radius > 0: # Render the center clear center = tuple(map(mul, polygon.position, self.scale)) - self.ctx.set_source_rgba(color[0], color[1], color[2], self.alpha) - self.ctx.set_operator(cairo.OPERATOR_CLEAR) - self.ctx.set_line_width(0) - self.ctx.arc(center[0], center[1], polygon.hole_radius * self.scale[0], 0, 2 * math.pi) - self.ctx.fill() + ctx.set_source_rgba(color[0], color[1], color[2], self.alpha) + ctx.set_operator(cairo.OPERATOR_CLEAR) + ctx.set_line_width(0) + ctx.arc(center[0], center[1], polygon.hole_radius * self.scale[0], 0, 2 * math.pi) + ctx.fill() - self.ctx.pop_group_to_source() - self.ctx.paint_with_alpha(1) + ctx.pop_group_to_source() + ctx.paint_with_alpha(1) def _render_drill(self, circle, color): self._render_circle(circle, color) diff --git a/gerber/render/rs274x_backend.py b/gerber/render/rs274x_backend.py index 972edcb..15e9154 100644 --- a/gerber/render/rs274x_backend.py +++ b/gerber/render/rs274x_backend.py @@ -151,7 +151,7 @@ class Rs274xContext(GerberContext): # Select the right aperture if not already selected if aperture: if isinstance(aperture, Circle): - aper = self._get_circle(aperture.diameter) + aper = self._get_circle(aperture.diameter, aperture.hole_diameter) elif isinstance(aperture, Rectangle): aper = self._get_rectangle(aperture.width, aperture.height) elif isinstance(aperture, Obround): @@ -275,10 +275,10 @@ class Rs274xContext(GerberContext): self._pos = primitive.position - def _get_circle(self, diameter, dcode = None): + def _get_circle(self, diameter, hole_diameter, dcode = None): '''Define a circlar aperture''' - aper = self._circles.get(diameter, None) + aper = self._circles.get((diameter, hole_diameter), None) if not aper: if not dcode: @@ -287,15 +287,15 @@ class Rs274xContext(GerberContext): else: self._next_dcode = max(dcode + 1, self._next_dcode) - aper = ADParamStmt.circle(dcode, diameter) - self._circles[diameter] = aper + aper = ADParamStmt.circle(dcode, diameter, hole_diameter) + self._circles[(diameter, hole_diameter)] = aper self.header.append(aper) return aper def _render_circle(self, circle, color): - aper = self._get_circle(circle.diameter) + aper = self._get_circle(circle.diameter, circle.hole_diameter) self._render_flash(circle, aper) def _get_rectangle(self, width, height, dcode = None): diff --git a/gerber/rs274x.py b/gerber/rs274x.py index 260fbf8..e88bba7 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -482,15 +482,33 @@ class GerberParser(object): aperture = None if shape == 'C': diameter = modifiers[0][0] - aperture = Circle(position=None, diameter=diameter, units=self.settings.units) + + if len(modifiers[0]) >= 2: + hole_diameter = modifiers[0][1] + else: + hole_diameter = 0 + + aperture = Circle(position=None, diameter=diameter, hole_diameter=hole_diameter, units=self.settings.units) elif shape == 'R': width = modifiers[0][0] height = modifiers[0][1] - aperture = Rectangle(position=None, width=width, height=height, units=self.settings.units) + + if len(modifiers[0]) >= 3: + hole_diameter = modifiers[0][2] + else: + hole_diameter = 0 + + aperture = Rectangle(position=None, width=width, height=height, hole_diameter=hole_diameter, units=self.settings.units) elif shape == 'O': width = modifiers[0][0] height = modifiers[0][1] - aperture = Obround(position=None, width=width, height=height, units=self.settings.units) + + if len(modifiers[0]) >= 3: + hole_diameter = modifiers[0][2] + else: + hole_diameter = 0 + + aperture = Obround(position=None, width=width, height=height, hole_diameter=hole_diameter, units=self.settings.units) elif shape == 'P': outer_diameter = modifiers[0][0] number_vertices = int(modifiers[0][1]) diff --git a/gerber/tests/golden/example_coincident_hole.png b/gerber/tests/golden/example_coincident_hole.png new file mode 100644 index 0000000000000000000000000000000000000000..9855b11f3b3d1f229a445051f803253a6bf30d0b GIT binary patch literal 47261 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 D-@YBL literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_cutin_multiple.png b/gerber/tests/golden/example_cutin_multiple.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc1191aba635753719e01daf965d8ea51ea1114 GIT binary patch literal 1348 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 QU|?YIboFyt=akR{0Q@dV;Q#;t literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_flash_obround.png b/gerber/tests/golden/example_flash_obround.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd4dc327c0b41b3006e5da6e45bd9a0873b89ab GIT binary patch literal 3443 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 I>zopr0A8l^N&o-= literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_flash_rectangle.png b/gerber/tests/golden/example_flash_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..797e0c39d6fd3dd4af58a02d87e746f1915c2594 GIT binary patch literal 1731 zcmeAS@N?(olHy`uVBq!ia0y~yVBEmKz~Ifn#K6EXkIz+@fq{W7$=lt9;Xep2*t>i( z0|Q%yr;B4q#hkZyqjQ2wWe$A2Tz!4r?Ooiv`ERruI=C^UI_9-CXec@wYVjZGP;*{!B@+X>V2vUlH$mS4fV@XfKR zf6FcJpI1(N{@;6YU9sPJ-_N(Jxm7d{&szUa(3Xkif%OWRsEf=D4M74f3>}Ic3VyfTyrF`dom#^P@{`zyiU4Ing4U{}5 z-CVGB=9if(+ZOp07cQ#|Yusvde%0kHmwp>Q7Qq8Am=>Pc`0Ss(-q*RiUw&d!F8tqb zEmQXU&|Kz!+B# zqoiJ{%Scy0*rsoFEIad^xtdsXm+73wbS*t{C&`S*!P_7dB4rkJe*OfNs}I=`!Q_VdFg3o z@$;ict`^*wDc$`3U&YRs*8&!aONlpeC_KxVo&EZJc=cV!%4x65Shu~|RrKoD0-Mvl ztd1-So|8)U?EJqteqGh^daa*`Z zB>L{wV`ba_c-wa9q-tqvNS)~>ty zc=}h5pN@I)KOXN@T3o~K$P)5)w)0!v?V^RNwr{=t`>kO64M`5A1#!Ny^LDl6T@1dn z_4}E(r{~HwG7GpkELFPr;#+fWAmj5uIW4KF`~Jl~@n8`QSm``{E|+D*zVORy7cLH; zyC_V(qe045HS_xY*hR}b-Y*xPyXc!Br_utqV<&5Y4m$i<=boT{_H`7Vh`3QVsaal2W~c_hEsK&$<-`u{>(N0uu` zAAZq%`D{vimz!$)n}=#04ZAcRYDOnNdGY<^9wkSXE2%~COQr|p&A$_VPr$_?b`PU# zd_nPg#mf8X3W6>UxgvF}kM{m?^jpQ?p|aR6bKh6B<~xhk&bl)v1TB%6{46@(@Ks8j zVWyoF!{kG0*Sh5r*94tq5p+-zO_|}+ZxH5Mw)u>)3oxcBEIYE5YOfcWjk!3- z`SNmckc+=ye5T*2Kbc8&PgOb^q%u`rE>-{J;xBmr*sPjBaW5ekho#d(Z)q3lE?T}L zK6PHHXKU=0S1f`7nrq!YpIfyuO7-rxMHfBt*XoE_2s*M{$#z?pdUuZuD3#Rxn{vu# z^#Mi>r3G2*_4T#Fk2My%u1o!VNok|8fQ!Rb9;>szv%R0zU$|DAllGVWwHL3|!Q<~) z1Os+E?S47=x%Qb&_VcP{1g>8j8$WHn-oKqGEP@Rt#`kxX=B|u8!Z*ut`Okvbmv5Y0 zZStEGm?o%ruF~}WU*g<)#{aFqVMg}#>H1osr)pbR1RZ=zH@^KWp8n)U&nF#o)w4gI zo}S9ha(9Z5xFbu!^`4m1eZHYaZ#G?>vh@9pkWe#MLG>N&s%KxPF`Q7=b&dZW^Rw}@ z?S0uoo+{_g8~?ITbA_Kj8FoSR;eW*rhIh*+E-~#-)z>?JqjJsT13%{_SXgP!Hhp1o z{><5%TP)%?=Kl+R5y8;n?R|0o-c2cw7yY@reAg@KYTJJwTFj?rU0OSD^4`S6ys%Y? zLh5r$SOgDvYzpGdU!zf1>iO{Fv_^aV?{jmDE18pZ7av_QJ3Og+l~!?J=B`8YFV?a< zvKUw`j@!NG(!M>H z^Lb6vm9Cg>ztsokbIErpFiEh_4GRuUSgR%QlcVj3XVcsWh6(J*1vrNi!x7{X{#pEt Y9T#Wml!`uNU|?YIboFyt=akR{0Ea>&CjbBd literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_fully_coincident.png b/gerber/tests/golden/example_fully_coincident.png new file mode 100644 index 0000000000000000000000000000000000000000..4e522ff1bd5d9f174dd02ed2ac12727cb61082a4 GIT binary patch literal 71825 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 literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_not_overlapping_contour.png b/gerber/tests/golden/example_not_overlapping_contour.png new file mode 100644 index 0000000000000000000000000000000000000000..4e522ff1bd5d9f174dd02ed2ac12727cb61082a4 GIT binary patch literal 71825 zcmeAS@N?(olHy`uVBq!ia0y~y5OZN*;NHQ(#K6EXF}3|G0|NtFlDE4H!+#K5uy^@n z1_lKNPZ!6KiaBrYF!DASFdW!W>^;5B@=0RSbIwdrpM&cd86cqM(a!5HSs-i%h8ubF z_+V@p{lNZ=4vY<>Pt1sfF=6xs!_6=zj8;fagINO;ayWJdTa_B_b?Fiwi_pj20L0uox{a;6X83Tp)si zVYIkF1jcA_0S}AO;sPENqs0XxC`OA5q_7w*F5rPNT3o<`VzjtG1jX7tu0E6LnM|+@Ypf=Qj3rp+YK%UH3@2D-smoLh7es<(N{>v#kkJIoxPH;VFs%?QBl-o? zZH{1>)2}f@R2du#*UXlsTzr9Ac)u3{)fN#qPE2xLoQ{$JY}7!t!G={IRlD8Jqf9PT zIDks~1kcT0V!iWFDwcwNP(^c~>KUeoe8G6TL8eQwH|u1lPS7ArK7?HIIc^Cl_4= zMJ^~Gf^kDFxaK|+z8gKH52%5|M(y@O3>iMKOxi7s*m0-?$LQrZVd&wxzziIomfv*H z6K}u_kVg-&SYrgi3NMgH6HGAt=>?8y39plnrlF>_E8qYy=$mvj8?`J50JnAyD0qo| zM@{Sws$dr@Yed>CLrv?c;D9Mvo>JI?W{CnQ6I_@+>1ZLEC6J`y?j?5q5^5k{?F8kp zFN;zN`%ul&@dbHt0k>+mHfm9r5DRwK$0<7NE~A>|3O0)+cvHtBR0nH=L#1O$il8@Y z-kb&w6#=)Ci`Y@i!H8~9&^z#`cGscVt_ZfBaf(hAn(d+BP>ETZV%Ub}6GxCw9tf#+ zPee6K!5$p*pQq>?Lo@3MI2ri`ZJObV>R=;bke4l-PbTT1I@rS-Y)Ph`hgvM zK5)|sXH>IwYv(!;|f zLQBLG!Cr}ro1(J{Eg~VUk|{dd&}>fz+rB$^(~Wji&+~w@P>%1(By-eAxiA|PDI4@v zyKT`TB^(qf2bN9IDMO2tzhFzOgEl#!M!Xfc$lJC!#SyI%vjuCY4&3wrt@LOCCp)u6 zDF@L?4*_tpyU{v{6}|LO00mY8x0jgBG8v{WBiLF1)JO;f1zf|gDLNKTs7`bOyX2^5 zWWgNN@QDE@j*w+32REa}&I54!WPy$<_c^q3TpMi3tSLG>&@Ax-`-&@Q(*rBiBw*nV zN&+j~PBv+vMnXXoC=vp?Cb4crvmM+vagg;A`+^qJ{@}pw3fQzj9?cRzuq6&Bo9>~R z1qr%JFR`A5sKMn94wdZSO$jQfW>riFxod-gDmQvbavbdWP|ZjKv|MHbPG~xwC!2Pn zSuY2UIa@EW6g02ogL9eK;uJ?Y)L{8A3v9iRD)%O|u%8ch@#%m~3hJmX-k}Q0~mr4`nPGUtbNx%&f1xr=#YiQ*@C}TLpd5Nv@KuKKj}$@-H6j~O#Y4g3i!~!1(5&zT`TRhD zmskO6G2KuFwxV!~&I41_)X)XaBy5438mduK!wMHrCXsMF$s~tbvM%5Od2oTXDmPlu z(I5r3WZx8>2NtN7aDhY7Dri$fI%)~J0o>_XAg;=7;f@+6OTk`@)rdSGiW=~1z~x@Y z@)XAFXl7}E+@&yM5~~YZdT<4Wii3(OcgIqcbbX)*>|g^gu?x+p0h|pEl_ZTw2YXc8 zb-a8 z#CirbTREhGd~!h2OUz(8s)IAZ!Q~&kseuPI8c%qFqOqcH66+JxBF(`GY?km89R+FB z*xCg4d|%L}hB>HadANeivT!-cWQ3X|6!^iOuk{j}Fdx-jo?y?v57^WYikeL(G=d7Q z4;_3X;BK}RWuoJ3x7ch zV>FuW;4E}w?j+VXXo-ap)6h>>*NLe5c zij*4@C$XYdCJySL(AprY%Dn(JpDbVpYv`WDie7pYfOQC}a-)|XNua7#yn9xD$BiqYPlUpU`1oP%xj&x?vJ(VD+bn zF)&P+agr(GJZf22ZN$yMaN<-7|#oHNvAWt~X)M?m* z>WR5vCn-&4oiG>0NegsAHn${iV#q?Z`HKq3*AYHq4yq`=ZfFDfL7?L#(~9FLQE{Oc z6tIg7A{jz|qNIN{no%UfoTn%OcmkXXHqX#uScmG3CE)PT^buny zM@{^nKsoY2g&KFmZ&Yu1g3?Wb!DQA08mQjr0eQn<(n+QS9aL{vfxIDcEQQga8O0k4 z;56QoxQSr~YQmY&0rCc$K_tVOXQBN-SD zl&Wzzd`0!fL6A2dC{1QPpoi*>6CiICw4P*2&`0$~1jri}XHysj8d1HW28xY2$(tBD z4x_||zyy#t{0t%)Tppu%qr(l9oZV;YFeIU-&K4z*H=KRM7$%~51C;9zq^of^{6O`F zBPdZlV4lqCAcpD<4v;rK^qpivD<=+=fxJ<1GKF!%L=ahLqp)!Jrh9aVmxJ0&1C^AO{L4*_k>FsAgZDM#}j_Ou$Qrl$^$?%~IHI5WOR_o5tVW>c@E(}0*Si>(LF$S53C~+hK z$}tXwYTOKcpHa%MJD{joU^JPPAsscT<$*#xVA@HhhHO-Cl!Lsn;$#Zr0a;XUoCbMA zBxMuB13Of2n1X_Qm0=`<0jf71FoC?WbcPOt1Zq+PwepjH6j7KMYL8aKl; z)Pw_WQ7mAZ%*wDC)f?az#e{h$nHo${y#a1foH(1pc)$zQ8{ig&O4=rd1k_^q0Juf5 z$taRxLpMrnKw1=Ira*;`R(3h8HJMJOOS|B=ApWWtfYS0vo_B zikyT^3=AlK0JkU_uKI{Ed^n0?5V%E=pgEb9p$4^_1-B?R^qpj4s6)-e;1)&1krYOT z^{C+oZc(gB*u>EA9W^+>EsABvkqid}QGEw)Q54VAVR&GH>RM2XqM_4AjGI*3){W{5zoyumGs z2cWdM2DL#AZc!A>J;}sy4b>aq7R8PeDU1xeQN00fQN$!}VrbZl>J4x)?`Isz;J||F z4RDL%`3xNf1wNG60JkU_gnh&q1W?<%;1a3L*<$*c@pPz!Bvi=rfb69Zc31Kgr$xaK3qfY$i{wl zW`P07(aWkNHKEN%CjN>Vc=$#L6i=xUfk^!yr(Ex5y^v=*>KGdFW@SL@e1KaN0dr0=p?5yOEs7POY>d|V0JkWn zq;6tB?|gt;6j?@*3}~H?25^glb*2sjTIb^cs729`1@Z=J=L6iLaL`oaW0eJ(p^8s#AICz1)ftq8$EeZws$*c@$oeyw}VnWYJCiKn+xJ7XSR5ze? zKEN%CC5f9D&^sUC7DbUkBm-LKqXFEa-~=Tq)Xv8NP>aH$M2(w4fg2?!fm;+TppYs; zZLJw`Gc@e*5koI1z%2@aDJPlGyB^>cg%T)%+(fBc!7U003pH+r1#BobgIg3GM^hLX zLQqD3AT5eUkRPg0%3yGdLIG4;1x!V$7{D!x7EtY-g;G9(TNDj{L7reoDeb^5iVdIw z^#y880&Y>1fjn^+r9fQ(YEc|819?In#S`Eb#f`%$j0`0xWj3TmAw5HffdR!2;1)%K z>10-h1E^y{;1)&1sT4+r52#~2;1U*fc z0cue+yz~)cU~otE9jHZdAV!Uwq2V#AYe6lF1SODbBT)hn+@dh(KFP%JKnf*1z%7ay zhf)|B3ffWP2;8FR0j0AYsNErOi-HZ5BYRN20d7$!&(vXHIEK=8bpW*}8WKU?Kpo2j zwtQlw_7!e3QCKx0o z9=LV!V?Ia%wLJ-LUHkxLQM6(M+`6!l1G(@OO0oyHEh2*VI7fw$tSOo#==a0P1fjQOMvLxUK|iW<~1E-*!m!J$@-n}MMZrDJwL0OSda$*c?v$5GP6 z1G|~53<02Ww_!6%h!;#g!^EI*I)#zpfGJ8k*x{VU$Z!SZ?FXpM>ln}|6c;GJ70gG8 zq;;S%-K!vPNTBxF#6cky1oB1?N{6&zGsqjVAaA6hdP5WB4GxeuKBI)~0}GHh8c#AY zG~7h>251z~<2=Y4QYhZA02MS(K=~~}6(!aF0nJ;01~Sk`GHO8n0}W)Lk7U?^Is>4A z4D^wV_aOg)1~Sk_G8*JT@s|Sf_z~1R9d5+U03OId8_9SeJ(HCIG?2l7Hj?qdCykNe z38ShK8AyBa)fEpWeps)osJJ9Av4opA8#K3Vbg^|GlwOIx7T_Gr6oH&78 z+c^}2+^PYJi%OIv^#bH17f=FGutsrGF38sfAYWfW=_4#qpUKJ~0L~a*D3NCZnk8TY z)u#dd$SJBJ599|CQ2JPfQW0GM4dihg1o108k16Wr{$4)O-tfG4Qg(a;U@2I_z( zxY=<)6yy!m0Z(wVj=G;ATewXygiQz!Ti;umB}?2rL_19iX?-0a{3 zc>`_06Wr|B4{GZ<)S%>;CQy#q4~jpuxe+Ch#C%X`jy5-P8i^aQskKvN?OXoH^M76oW(1Z~h0)S>`SjWB#bDLBC`iZ7td$1o42 z2nM$(dO>m25RMY7pcaLLI4EEr$fA@XpccgfR!|!JfHGgx0BTVLfZA{j7AOPX;1-1j zsJdW~d5%130&Y=+fGSpob0~!~xJ7Xa)IMOij#AcwTNI|CtkhtQQsRMH6b((Fs5nrI z;tf!X!od{ejRX-CZ-8193q(NPFqnpt)IcqY08r`7Fau>2{Q#&%p#kb0F`Pk}*#fsH zLO>NOLmEn-tpL=bxCF{E4B05&0JkW1g1s>n#T(!j1!y3H0c{!;)S>_nWH6vjqk>u# z;DHPVv}sgOivm25fi{u>Zc!*mf;=vO(#vZAwJ5*?8EDg};1&gVAOmeA1Kgsp1gD)7 zsNPWB%+SCBiVd`)0@R`q01fG)&5eLt6iwie+KCcU6CxQLKz&;V1!d&e1GgwRKpk#| zCn)VfaEn3^9I|gvoCIo7D9C_(9e^@94sKB#0cQ-|2V3M61#VFYw1R4k z6{nD^$_t3Iw$%8hAmTU_kK$s70}17RV0|P|`TKMKKMW@oZ2G z0<|a_O2G!LM{yFUMFCoC!N7398pR4wi(*3)*a~A5UxQi{ptTkZXak<$76oXn1q0fE zC%8ocT5G|8w%P*Rq5!S6Kp*e~wI~`uYc0?RJV7lA&{_)y^Z`#$ivqOPf`I{bwFS6E z0a|OpfHvR>Zc%{NS}>puc!FCLptTkZXak<$76oXn1q0e@3vi19wAKQBz!TJ>XaKFX zKp*e~wJ1PqEf~;?2~djywAO+Ft(X9}C_rm17|@CdaEk)8)`9`8m;kpZKx-`+&;~rg zEegY%KIHa7xlQ9RHEG7R3i}8HGCL32sq< z2QL^Fpp0ICTNL2I3$$reaEk&wc)<{W(p?9)C~CkX2n?%G@)@{A0d^EOifchF3eeOD z0|V-yC#Xfy0Gb+MU_c%81hpu@QzHxuPzF80Eeg=o2m{)nC#XdMo*F?L^aQmiz*8d( z2T%%5aEoFusPJc~Kp9y8wJ02vL2<+ohZ3ux7R3c{!P!ubQigz96dB+)>H(DD4seU& z3TV8J;Q70NviVkj3 zbb)IO1C(AXxJ4lf4%-0VJJ;0P>aGL2`qs+jS6Z} zC}@NIhdPZ4YEev>1oj{5G%Bb?aRM|+hBl1~Zc%s~OJQVSaF9XqIH*No1nNqlO{0Qa z6q#WEp-!WMS`-d^VAm?4suDZs0@l1gJ$}2F@23 zP}+8&7R3QSuqSq*%oKrI6gMDI=a1qE&=^HE*b^^M1_VGYiUe@6$$;VqP>W&>xGCSj zj_e0ei=qLvdXs_S1ByYQ7DWPR5f=l)9+VUdYEgjKS}-uYN3jCbq5!S6U|?uK8SZcZ zwJ1PqEf~;NTYy^>ptTkZXsaziEeh~j3((qX3t+oKQ zD8Oqi7|>Q*fLavbwH6Ght1ZAS3eZ{$2DH@{;1&gFtpx+xY720S0<_kG0d2Jfs6_!@ zYr%lF+5*&~H~?B}!GN~f0@R`aueD%cKwWJCYEgjKS}>rkwg9y#z-uiSP*+=kTNI$R z77S>sEx;`b&{_)yv|<9>q5!S6U_e`K0cufz*IF%Bllt*o9G~7%PV}P_}P@5VCQ_nDg zXG74N8qX$1LS{oyn;HjHjJP4QAq)pl26<*UrZIwNLl_u-psc##QQypv0h%FWV6Z_c zLy}MGFo2eIGBBX7*lK7@5n})?>tsM%v2{Shh#S1D6TJ*c;F!q@Ue<|Th7`;_!vtQ| z$-wYI7rDeMn0SV1fetu*6rc>U?r=(D3;@lFF)-{v86cUXwwXZ#JYvcagEByJZek=u z2x#`0fx!)>*j7KG!{7z3SQ(O$tHXx;lR6BbjUo&TsCz{k)}PQ}fHXB2Q07A#9;b*g zK$;q;^C1TujkuvrjRPq2ArC+y0%>ZX&WC)Mc!o*A5bW^{^N_Prg?}33gsI>pcmpLX z?NQv!;BgY1q~4%(WKEtHI4t6c-{OS+yG{y-HVArC~uiiPS!>|ZkxuUMvYM6b7NdY`z#xMb8 z;p&7)h9jU+Lk0#TxD};O0%~dqOa$9}0%Z|4sHt%X;%if6UxS(&4xpuh z3}{^vP*Z~gk}<9zH+R8JjX-d<-mnU}!~r!m6hO1n3=9D%3->@xjW^%|hrtRtCP336 z4QC;qkVh_XKuwJekW~HxWx*n-sj&^>30vee3mUvQ0Gh~UU|4`MQUGdd+yIZjGa!#; zHh`KMtHDJ%!#iX@fSMW!pxIXjh65;#nHBD7jNoOR3=9uY*5Y?fjAYOOkNq%Ipd`$x zCv+IXz=b2j9^@R^V3Z=pa2aAZ%CxBiuMu~{PH=FbPMa=Zn8|to(tK>lNA|XY^-NZ1 zQ=_36*&7pPoneADH4ca(hwKUOG)8Ds;{nQwIu+H;4A7U@aNq(}xxQv+=Q_{$SI z43MS<>H_eFm=rMvNK*rKKEy%Eh#T6}K%Ea!;GW5PAXJSlW1cH)EdXf48S31~gr+l0 z4}`#Z4RtYihkqJl0cfQv1KJcSi~42;3rNX;Iya&;Ig()xxMoC~LQOoW!>|urmojvq zOxziQBp_u8>b?<1kOX+xmZ1YBrCvOt!_Wur3NRc&p1ErXND*Ub2j?CJlZlGA8N6& z`J_(6K1jwwDK-+cX0l!YEt^3vHqIz-X0U?99!jy{nIh%@Y0se+8wSm1m_VCG7|@Fi z&_D)wtp$3q0UF2vueD%6D>j%<>Oj_7FrXD1fhl5;wH9crEkFYq3m{boYO(RaY9=dq ztpx)EYO(P^X(lUZ(+C3t18T8R(0Yamv}pw74U}TT!Z(c(v}uHafdRGHn4`Rz0kmlZ zbdDLyz7f9(kqn?sBMb~^#m4Fxpb1AM~6zDU#tN#2ctZMSqHzgBmy+Gb}=Gh#k;3;#S}VCuasj z>E+o z%mCUn!oYyKZ=~T_iWqp)2m@L-jqBB`Rn?^u>K-o9)MR79&XwwJ- z1M0q!2DKD1@TL(4v?p0kP=h?+ z=}>0GodAuyImku1g6T|F1Mna$1H(Gxl6k`PGfWbo)lUoz4A+s9vWHh1BM+oxMjh}> zQQ6Gk1}SJ!2RtuLjAS?r$wsIHo;y$IG#En4a+Cqj2A34E0}PP-g)-pjAZEn!2B~z7Eo`zM)n4WUmD{a&?+4UhK5+=XmU~8%y14;8y-Mu zjvty7$q)~z4N>=vBu$EBxDRQ`q7Ha6fpkEOLhXetni$CdnHph0?S(8np#z;7VL<7H zG+3mFfwrN7ib0fKh=YI;H)tCwNCIV*rvlSVR?s$7kOayq&kb|WFoCwAf+SE@dEW3& zV+3tO1?5VVRh~I2n;AgcP(hgtWp1QwVkE<$y6d)HBps5kaS_=l$qQYR# z873)6!a*%6dQ>-qH;sVmFqBQ}Y?C6vn?^vDH_C3w#V2&Yn?^vz6!NC^2E`OH@TL*; zqT)cQ5jS|#2zpU*z}1Kwyn2&?fdQqcc)&H26}) zWMDuoD&{C`ZUC>|WI&r6*{8Z0ybTrPag;4)`;;~}C_$q8fDLj%-#0nZffZ6zB%qvX zzL*8`+||xdFU-lYzkjd2Xa( zUWyoa^(LsPaRh08?!tsKOyJd<3}|yByCz0DfLCuaFrdthIA|MjgI8}dFfgFZjl6J9 zV+60>WMDv@8}U7%16jSvz<@G0vVeIeD|q!L0|Nuf+{hI5%?;qyn+yyN$ioQ@w^GEw zt2aSS4df|}fEj0)z^gYI7*OU$R!xdL0A9Vxz|era%+*3>{9@Qgg6^8gki$OE1YA}L}8pe4tkegyIYaEBTr z?j4XGIRnaor-H>y))+`rg8^m0Q()#9rgf0^0Rzf_Cx>?$<8nyF%78N9c|>J%LoqaB zQ3gDjCPg0LgcO4f8ORZP@r2F;Xl8ZrL5|pf6tRL1NQ((&0XS&z;s>-CL|Fh18oa21 zjE|spNkD@a_n_4nN&x~IywHbw17*nbjq2ux=TL8;ECDy06nQ`x>J5|yTf0x_JWz+E zPt+nrH%06Nc#$Rp1Iqb0puvj|_D~(jE4CVrrigt2ujfN6LqLNU6*f>;T}93{(Oq8jwX83=BVz$BYf;oN01{`t1+$BCj-L+9pnJ?HR6UW z>ttXkK;BsWfNv%%cv&X{1H%sFU3~>J&oqITbuut8+(E9RcetfFf|qqNpv{fMC~Sr- z>ttX+of|nfDH5`*lYyZ@5;?~#KcNFz*2%zt($oM=jX;)lGBBVtH9%7%kY$|=3@A+v z(9{TcStkPnYE$FG#4}Atps|6{)Tr=Ja}0x|9Mq=99>vWHkV!@c)TTz<#K;N#kZg?F z)bKy416hQD*3@XYpCXn58RTYAK;H0ofZvGw60|fDK(2otSkGhyFY5%gL6B>>57W;y zftPhMFfbfJj*TBmn-##D1Q-}l=SJj=xFO3r8Bpg&9MT-Y%Q_j*=0?t*)PXGPWMDv9 zuLWvqfR}ZGhDVUo`4-j9kY$|=3=GI~BcP@RWLYQL+{lFqXPUsvIzcT5%#CeMP zX2`Nm1_lP?K~7Lp1G20WZICly#+fF_vQ7q+xsg?qA|cB<85kJ$Az7FlNHv~cp!?DhXXp#G{Kr0ACRZ{G@R28LYo?>3&5`^ zY=$*8P#1u6O^5_FH9!ql)CJ%-PwLD7FQfu>Fp#}*B}L2!GStn0vH%>^qBsUEnNb#i zgIW~L(1I3a0r-T8XPPELb0o?Fa1Zyig9gwXi89FfL}_yZ5431TSpY6HG1359U7#)i zk36BX16ul{EC2_!DDFUWWCQX7a8Qe49n2e5NU;HGQHaC5fxP!vVCI=7ZKyXkOh@YV zaCoO3%!GOaWj^GH%H{{)b#S=Of;HB0K3@C$~py?19 zm^Y9IIYBK7JE%8M201}33VCSz6=f^CK;xOFa;P^@=1_0=r5*H!dIM!s*&Ef(4=kav zfwBbLY*OS0&}jppRE5$h*?mIi2V_PGt)$RR5&Hw$VG7cLd_E4SMezqZl!UTk3)G_c z151X;)2N^pg&eeT!VrR7Ku((&32jL=h#_Ua15!ra@1Xuh>6Jt{q+JBB&qnW+Y(A;; z3)%xk>6IjC&2$Zh1{BJQtuxA-UqIFtp!7;WEsD3$sA$kfN@@vgGhOwe20cLTt{BWY zvq%sc;vbObh$Xz!E<#5XQRhQ=R5nAFbuysMhqz6Qge>c1K${P7KA{6y*2#dn`?TSA ziWp>BCj$e@?$ZOlM%|EQoeZeEPap8jbcHPIWMDw)d=$()vk0=RlYs%H^RdG%EfBn{ z6Ey9CJR2ONuo<$f6LcvI@-l^UlOiF@Izc;lkjGM&pU{D>wO~N$e1KXMkhK;JsJl-O zI2v_BmUS{Ppscodz%kPmvetru0cEwthlyvDAZslcP&*$L{%I2-Yb_X1J0E)#H$&H2 zFraom;wDBy*IF>3c0T-1>Oj|8Ffbr@K0qysnXt5j-1#`bZ`5r9P0lEtj|bK>T_MXl z85mGHA0MWlQGzV%WMDw)eEd+_+yQM{GN6oe${BS-mUS|q?ml%$69g~o1T_$lcb}d; zsRLQo$-uyX-1S&sJku32FVDb$vio$4>SoBYPEZ2@X$BG0qJS*xWMDv9m33jl870WF zP6h^)-KV=IMnaZ#qD`ARXd87ymUS{PI3Vvnec_z85xlGu)IdO<#P&U*16kI|z`%gK z`*Z>G%%hNHoeT^pyHBU6Z-y-EWME+Uf;5BxYEeLzbuuuZ>^=>caV80}tP`}n61LNw zfnn98NXW8I(4Yp=LRwIZ!W&v6G3-NH80%pB_RxcKu(be2-H=Tq3=9nWk$PAQBxW8} zf)+9j;YbByKEgWQwx}j?=P*+`pz+Kj$XW}uGUJ9{+DFJ*3kKBH7H?EHL)TiM4SAYPinM{&{0u0o zEq0&Kse{D^@@fmvVhiY63kC+{)fS-E#eZlci2-?$7N~Urol8MoZE?WMsQWl9ji9Wy zm^LvI7U9UNEe=TCHRgtjb z@CNcu)E&#B;NC##h{ObF!M%af5jnSNGTa*|9g*cCC*j^e?uaxz)=GhU19>Ov0mqjJ zZy@hPeb8|S;SJ=D$cMm32yY;FL@M;N5#B)Vi0qkY1os9?M zg47XdxNn3=JIJdo4)A9h!ICpdN94h78H6{GJ0c&#o8aC+>4^LgvW2@AW!bmfK}1L) z??hF|gL@lgC+b;NM211`hAi0Jfp8M?z~&ZFJ-E%tJ5d|vB_VvR1smHxQ2*wRb)V`< zUWdR%-}bXbCTB`BsW|+eG4YxLM^n$Mm+Q{|PI-2^M?vzr1y9u%<{bP&&2 z0{#N&4vdDYDV>oT(4%QDOhr1Z-rG}fbHFB08PCA5z#QqY`fG;vX$v8vmkbBEkZuWx zIPzph>m=y;@vo7tB1m90P8Rcm9!0+f>Gr&aZ_5zQikOUK``)t%XKgS-vR!Jn0Nhy& zNaDMsWZ~isEeV7=XW5STZ42Jje~J>65P23{Yb8w+tUFLtOLo& zmK0W=ae@rLF)(aH^7?}IY=qZ0AYTT+8zX^m@Lr@~T=8xd!d)^*H?KHkPCo*V#0SXt zm0T&ULs%b&?3FqupbGQyIZ$d;VFhOp$xl63gpkPce25k8rKe6voa4Z3`OsjGdA)uA|Btur|C#>g0xJR$zpA@A zU?su}Us!HrU}#9ZcMpCETgg(G{R|8TJo4@1VL^7GA69fRFfcUlt&M?Y$pyly+#ut@ z_*nJtO|PNFr2{{#Ok-eR@cC$(CI~YtU_O#ro9}c)!mm*bfqS2U;egBbWHI=~A*Py8 zV?hfquiu^F3QK&T+d{y0g9xAR8c5c(BUvM9(}`rw0)#Iegw7*bvlGdh3CEWqSrdlj znqY5WNT*1_8@$7 z2H7`7$B}%KjO?5H-iF<BFShxnS&%_iX^k* z=@ulJn@BPm&(9#qR3gc&c<}^DMiNOz^IO^T!j(0n^-$>%cGWLkfTw*-i*=M$ASstM@EYT3;OmZKZ%#lWosL zq=5umB!_J=H%2&YjSG_XqCR~Hhh@W>JfLZP!Ow`K=1`7g*cxS5gv(xdBN?_d1<7Ty zNI|w?mJ7mVpqt1*xfzVbrf4HvRsw5TfkrxJT{;R67|H9F@}9BL=Y}E3Pi+Z!}~5I@5>-tv#bhXO@bMcH9MB4Agq~zY>nIsq<~37 zisgpmT!`e?uo2msmA8ia{#=I~&bz-L zrJ3|#q!8E}g%kpxk&4sJR;E)OhIz=o<+F`@7(Z5 zik!GBmI&{>L3Z@|Y&nE?wjoDb@E4@=LoQJo43Fr*3+`RWF`alsrw&$kz3@Vc0XLz|KVUc4Es#fYn1s)n zN5atNPJ;msB>pCs5ITjF=-kt(basEm|Y9qN+A*2Bz_a7HrAOJK7FtY>oIDw4Yv za2a+N!`gr`$VC~K;ARWhMe_$lk+p~!b{oSQ;d79xC5BUin=N2nlLL{+T9gdCKf|=_ zK~580LYsHMnym-4k+tXPYV0pkUZt0&|uel6w<;lf)!nLi;FJk>c>crXxC&V8Qze zIRj1YjC=y?j)yEkG%Ojqg*SV^!hHpD&Jx&s0+z8>Ag2Zn!)_s%qy8W{s-Zkd41Qnl zOe9A!*mp)wf%UDPAlqG|k`@T-+fL|33abyTGh7W}K_Z6~BnQfq#J<83yd+XgF_?Eo zPJs;toI&bXGTc#43xo}(8FV9C(lEm{5o*bS3S>)?lf<^df)}~yVDRsZoB|ut=|Qf7 za}?7q!V+nLDN-jBRXL)-`_zlxaN4ANm7JqL2l?D*m*<; ze&=)zax$9ZcP7aaro|d5@E>p`iD|<;iR|F+jz}HYeb8acka9ze`OfS?VvK$k^tnaWiWRJt3S*VQ6x(o*pkF-U`gdCvL&7!ksDw> zNkNX1CyHqY!=RQ-n2h9;30*T-tznj!AzNaWB=!b2CR&LcT%4Ve8(`Ocryv*SPgK$l z!s5gLInhs;HiMNNS{5A8LAE3Yf$@j!dHYK*wweS(zd2OvjbfV!3p44_SP%+Td^31-lVLXgyi z)-z3p&{=r{=weflID>~v+Cc;8to#h{iEUtE1_sdLI2GtTa1V5$AxNrXT@g2IEdax% ziID~~pf$Z4Yz7{rO7f(R1ngpo@32J$pnV2QQp9|qQ$r2b$X<#w;!cB3k{p070|uF- zU^W06C-wBB9}scCZBMB@5ULBuEOhY!SBl8+_XW zNDzciO^Dpk0rduK89YdwVd@E;2-xoD^~kO@G~%8Hi-2(0v?yp0LvAMPYM5(bYtukR zO;OpL06QxbHnR%~k5wsRZ=m6^0DPz+NHJ&&-HbC$xlrGIfh~Ff$z@HB+yGtL+mMIs zq)H=hGw7;~3(&>!AoUC{9MTTfL4(5zHnR(o@jao#0X-|!As5*X{4-etp^0b(Y?&ZP z!xp8@3Ifn1@fFzxK4mA{sC!t;gjYV1NDRvY*rp50a{)RJy6d<56Ke@Gg&V}g( z>0JgRdBnjGYFcli%7O>SrAc=y>XPO>Cy&(fR_68)( zz_7zV%@H=A--qlC9>vY@O(Kv3#vmFP+$Kg|fSxGU09)G%mSR4slL6iQb^vk!BUqT> zK!g!@6|_+M09(Qbl1i|c$@&%==oQGx`HaHm1+a6Gky0~gZKnxzq2deZ&K{6C3W?1eq*i@W=YcS!@Ioml8s4UeeSluV zP-L608TfLv67S{FP}Z=e(v6I#zO9fPJ3 zl%m4JC5`bgG{#Yi3eaZ0iBNB#6cv{yMjl9jdIP1XkUXiAU;~Li)S_YuXip-<8z@Bu zXa~Uz=&E0oq5{;S@PQUCC`HADxo4Q3K?@g@qC&$Vjqx%xHc*O+D+-$%M4{e5DJnp_ zG?k#)T0y?Q&cuL@IviIj@DJ6&8(2{ zKq)Ffn_0I((;7-qku^E;fFH!IC`E-sr4jdyGY}`C6cwNY!G1%6qk#`OsrjDJQDA|@ zQ2=y*HYhH=-$pcEBblr}dwK>Xlfi|mO!(6(ZTCssgCJp&sAYEdv9f_eg_ zq^Oz{>EHtKgaYI=B8UcuXd`Y8Xr6q6)Qn{S9nDq<^#n>m0oogF0`bHI=q6E!Q8QUx zpc?=-A?L^s6CxeBpf-apeS|1xU;wo!PC(mNE|B97AX1RBqSR(SRe=Zo=K4oc2K)PH#tKrU|?XdpA_i;y|W}iAE_U}@cx930`vx% z4amN0;7<{o0By=gz_v($j03eOPC#2&YmghFpcaJ(w2i+8x$FY%nG1my6KSyZkRYQ# zXB~Gzi;2(3{gWSvkwJ1WM8Sfl&G=WZ@?t)gK$B~QR z9sX&IU!h4#8QB{=iko4ZL|{jNfUIT!wJ03KA@K)2I}9SuziACQ~i2O^BP zUqB1B8sy{*YEf)~Zho7GZ1)+3%?*8!AcSpc0@(p-QCye;$zfK=kz~++hUpii5Oe@t zCks*x#>*x}I%GrK`U1HQ1GOk#KsWH!BF8GIMFELa_%2kiLD?sC8jeG^gkD7sKTwO} z4Z`jeBI!MqCNNO6LKdZ<0JSI%=tCu7YivO}K)3cCfbP{3 zKuMemDPji{Az|Br+`I$ryLzAjNe4%eGasl$Q2_17EJAKdfm#$6&@O8sa%_NF6muZS z8MX6qL}fGV+@J#}9tWM4BMwQ<3F63Q$i$O64X+{o+WKr7QAj}32ue`_YEke&V;rTZc%rnK!3~mbQHu)D*+tDz zZ=e(vk|%W^KT2w4a5j!9P@dip!0cuesh(Wx8QdEFi6b8`#EJ{%UYEjI97A`17 z1*k>g1F20KP>PBx3Y!_iAn6mes5mttlA#-toluL4sV8(AN+I4rDJnoMiUduFYf*{{ zP>W&%v~Pe?RDdo$HG|lVQdF!;5j!9U2@jN_0@R|o0onD6T2y3Bj%2Wg1UX7k0cues zKo^^%6cwNr#T!U)EP(A<0jDY76FLn75YJsfu0ugB3IRx847I4(qO_TT2~t!9Adho_ z&PjF9fp`L??*TffgaeXcP)mxcNs$bK5Ko+d?OOu53DlxcfaXb*uEz_XG{z&4P8w=K zarUH6!v%;ZoOLGlLf-eHctbnnVG$C>X9nJT7q* z+2i6TbQ+o<{=0+R{{^)u9DE`EdxzX01hps@Ko3c{j^YhI&=HUjZ)`^K#^f_h8jvdV zKq0a>KrM zdyrc*2O^BP7eLqj$0NrEs6}xBa@=(T^xO`xK@4XUHZxd3N?PPGJy46nAs8GU4d;-3 z2WnBgfE0okkbA`p%O*uKtc4`0UC4D9s70{=((`rzU0e^b7IXrGLmDHbVF}-b3YN=0 zp~E1@4^B}IrO4q2YEgWE+?%ifdgvTj0|Tf<@dJ|U;l;!Q`?7bBt@>2B7$iRTSMguD z93*pn*%@;O1&|id9v+7OkiszpC7FYcScUF{%R)&8Vn*Bz>W~me8M{ajpUHZl7!pu> zkOK;I74HMcc{C1g$ld^*>ju5vQ30hU2Ay301G24f0&+`(L1{uH1N3@W)FQ<3gbo8A zB>kgwNhK*j-4IwcICvw@)psH1dB7(ka8Vwt!DZIdmqJ7lg={jS)H>g3{7p0G&+^oen{1X@E}bH~^UrL2YT6C~jtePKThhG#czu#26sc zA*d}4@B!tvyR%*ND*UzOoyPhG(dOiC_tvfP&y*7(kaWL#IPfS{k6E z1sNdIA*d}4&eyJB={_G97~2(uh$2 z-5LQdKTuj444@0Dpwl5JEe(e0Cv_O0(;+A=jRxx!F$TzVNCQesR3!()mO&0LQC8prA zyaaiS2YgLy3Aki#utP4Oz<0=l3$6>W6I8%?JHk1Q@xXP+u`H{Q8?_9e%U6CtdaR)+ zZkn1R#_$I+PKGiY0&Y?Kf#{fu+)M=RBW8e{@YNuN;waD!xbwi(1?t!Zs71kW9_()g zl+iv=i=tsV*dG%h*HD0c!N34&Q9!SEJb@B7amH7c$_!5o!ko)Vg5sgLnz0g92(@Fgyp>fT$f5Q0t=MGT2K3 zpgZ3|)`BspbpgFz0kwkyYF#`~0!Kbd2L;@^D1dapP&z2!*2NCUC>u%#1>Cy01M!9_ za?F5Q7YuA*Zyd-$PQjqo1w%5}8wqmA{SZ*=q9GCN4Fkxj;$TlOFo0SY2Ry)OUIL|` z1!`R+7=XRegWLdR0JSa*Am=u{gT)NkFwc`Z3^O3TqjHo425McL0Z-UBWTSW^%ZQsn z4cxRp5Q*Xq>zS+!#oz??0D8DR*aikr>!RT$*c%0~GkU->pw`6!$gp??N|OiFx=4Tw zZSFzw2B>wh0n*=)L&-p()`bov(C4GL*4BudAq+fZcfcGuY(dwCK&M8KJ1F4R#RhP1 z0JVbxYF#iurbbXZD4^B_bZP{pg92_{K&D1eJ1C&m1p{Pi z0d#Qd!XXTt@yd{!+zg=Bg@PeC zS)IiIYF#iurbbX!XEA_U7YvZ85tP+g44~EpbZP{7bru5ysC5CI8bMi+#QjE-0asXxC0^GWQOpQE1o|I$& zwJsQB!G#)fPmuxCx>x`nICV%zE(9Aut&1<2Z#<;6dj=P3dm_+3s6SJz*p2&fUAoMuyc99t_8O)Y`~4A6DTzjsCB^*2d*ws zko$w+)&=yc$0C%-1GO$1APYL+M@WF}0F7510ACf0x+;qS)S`F*?qxZopm@U~MU0^U zJb|U4hFtiATND=Hc~=4C1wstq76s%u^bX_+Kn75Yg24}5kGP;j2dG8C5Du=qzo9f_ zK`n}gZg7O}Mu~9Hc*TKIaQuBmi9gVI#RKrv!2vH6Z-B-t3c&5j1n8|J;P7AowI|V4it)R=Y7|wt*lLhkV zI=Dr_unZgX^=8yp+=Q0g&Ii=x35?2Yv(-T<{I4p@P`;f~^3P>W&%IPJhr zB!&h$s6`P0?mvG(UJAzmYEdvirbbX~ST!k<0WvkR0D18y1Gq&2nHoV^yvYD+Q9!0f zP!?}8fLj!hsS%XLn+)I<1!QUjW$`8hs6_#p8bMjS$p9X&fJ}{`EZ$@QwJ4xdBPjh4 z@OTAeY6NBRCIh%d0ht;>S-i;rYEeL@Mo<=SGBAKz6p*PAl*OA2;1&gBY6NBRCIhHN z0ht;>S(C*8YEeL@Mo<=SGJskX3_;+M^CL=C3~Es{$bixSYB2$BQ8<7P|3)n)z%2>| z@PaVZVglTvn9u_nWk4+^z%7a=;NdTn64Q9!0fP*!9?S`?6}5tJ2KkQN1GY6N9P7NkW1nHoV^ zkp*s1K&M7fR%C%&6p*PA)Ww_N76oK#1Z71Qq(uRl8hL;+xdd)eK&D1eR%Ah16ah0q zfev1g1v(|?dTF$$2!p}5_^)*rj(dA6eLd77-QWbtsGvJCCZAz~wlz>@RvAEZCXlv9 z1Io-Q18B|!($+YDQm=znVK6}28mKd?pj8+QkhTWo`goY-4I5L$7%qT|y9$&xBxufr z0n*k$nOOzTnLw6dG$0QQgXT;aAj>dN#ydglI++;2%P>&KJHc}%kYyOCzeKP~YK2Xj;9qtui|!$2L#U;wScU;r<}K<$$-fL38JfR|yQ zj(9RupVVQ1EWg~0$>hJiXY0$PQ^09l5CI_BA+kRrwaS%!hK2!jE%3WEW% z3tq18HPA{5&?*c_ zTLX1!1hfi+0n*k$nHmAF>tq18HP8x*v!H|qUWS1>HNr5Hl>yw=K%E+40IkAc058Kp zok0by!eD@mUZ4(MfL38JfJZOT1}{E%r7<$3fX3StP#VV!HHw=V7$$+5>;lL;b{H7; zO^#%Mj9#D)UVv9&K$c;kj&XukVK6|JVW5t2Ht?s2F+i4KppJ2ZR$(wemSLcbaWa6` zbuvKO8YojE44_pQ4B)l~>eL7WXcYznxUGRYHNpT|g~0%BYoJbzFo0HJK-wCpQzPJ2 z7?8FG>eL8>I4B8%mtmkzjeu5RFhJTGs8b`LRTvDAwg$@72m@$cCj+>xfjTw909x0{ z0A7ZHIyC}mQGl0WpiYf|TNIFG7^sUdz%2^MG7Qv37~mE~gBz&jSA#O#0d7$^fKTm? zLuuH8TNL1B7^sUdz%2^MG7OZ?9=JsTUWS1>#tCUrfR|yQj&Xup6p&>YsAHVq76o`2 z2I?3mq(uQ*hJm^W1Kgs3EWVWq81e3 z76rq8Q11hEY6RS(VAv1pv!af3f?E^}?VvuZ5=xg9+@fe$3`z%vDA5gWQ5@j3<7Q~c zKxt!v)^##GkeScQ;2?wCmxZ(_3P8*GP-jsgEei0p^r*9_kQPM@XafZ5EGoD~!LSbG z4b)jw&^}ZKhV3A4pw6O#TNDkuLEbkO` z-asuXz%7acpltu7Q#vT2TRNQ9zbkpcWP27R7-qP})J6{A2*PC~koA25M0OYEdv$|IlGTD=NS( ziUjHTtPE&H1-M1=29$D8iwbayqTy_f7z0{S0d7%j0A+C0=@4*>g24%tl~ATbAT0_9 zP^%BEr~tPpI6za2sM8_f76rpbkS9?49-wud3<{tOgH}?2TNExJPoPeRfLjy|3qYPg zSq2ShQ3!y>=+FuZP>X`W36#)Kr$az33J1^*WYp;pNQ+_#sN{stph9|-{zlvk;L!`T z!3%JU0z7(wHh2MUQB3GO&%}VTos0p}qVNE%$wk>t25nJ*M=wwZFCZ<7C7|Fy9pePI zC>S<@I&Y|BoZuD(L+4K&h6dCzPH>B&;ZBVh1L_zjq(#y21tfvIS)BpWqHtif<7Pme z4uP~N7Jv?gN1YCVv?u~V6$9#Y2&6@!0h+T#oeqJtC_+HPHmK7f;1&e~7s!98(;?s% z1%oNbf5;ou8Nho_85%Z$yn(zy9dsMTOjZVmR6A}4)aejNi(-Mrd{ze3=@3YZA^?;x zP^Uv6Es6|KF@dr{9lTS7fuRJ{$41$p&H!#vFi3%liTfxu3AjbUuosjukT<9^Fo0VW z4%Q&oqRe7IS`;rpW3?z_oZuD(gYQor2GlW5NQ+{D{(M#j&=}_f_C>5HYXKlh8??rg zVav143~1w>;MPUMyBaYD)bUP8>jJbTAPQwt2GY8yu&EJa2tb*gfV3_SfUcfL9q)v+ zE*{j|aWkwy87POeE*^k&Anz?>fV3_ifVM}W4tPRZ7au^&B2rMAZIIT*2hfssl+9%f zkk-YAY3G?3P)9r=t&1O^f(*6LfV3|DfaYINr$!*Hi$9>{!Kh=Nkk*CFqs>MSaxb+H5F4b)jwNb3T0&IQ^mD!6sQ06OOabruyeUcmr5=K`(R0Jkn0 zK<8Yb6&v8z#R1Sc7ih%>xOI^LI_Cnd*Z{XKz-L>a6&v8z1^8?Wv|U3z^x1L*%oNU2Do(rT5i#RT5Nz@7Yv}YEgqm28{pOjcrhnxu>o#ffEIJ26&v8z z1$Z$hsMvs%5?~VCx&STaL@O%5tqTUwVotQ80^GU)FXlv@8iBMfK#Mt1r$!*H3-Dr2 zw4wssx&WVTfjTt;X7K23JP%R0<@SDZE6J6x&SZcM4cLev@SqrTcFLLg2yWuKxbQ^oNK|r0B&6{fX=o+ zIoE=L0o=N9P_yG^SoE`h?(ZFa%AHIM$Nnt7$NV)+Yn}Ole$4Ca$wOR}hG-t9hfCnR*Ruv8ps=2HDU~?Yqc15IDow2XvfWfx>k!JMtL&> z!veMWtPCh?wHO%mKx07x)6O%YuGL~-C$IXDUR*Qk*7%0#|QzH#1 zYqb~{4xiLvV8}S0&WO5Ji{Std$WfsEBq*H|h8Zp(8-ne)(K;s#pF!RR4P>BoPCz%X zGJpp%P&+3KXF$^vpn(ju&Pf9+D4ZT_W;5D8Mpk)~7MF?mW1_Njr z23iLNysi_x3I%v1H23abrA-5T_*#083yVi4DhZI2JkWr)I}KJb)5{LWf%>pi!c~G zL8%S24C4UGA`Axbt`P>%G7Qv37!06YBMc0nWf-W7Fc`qAFu=<&P#0l9R$+jbVW2L; zU;wYe058KpU4#MNHNpU1hJm^Wg8{S(g8{S*qXA_R1_OB42m@#t2I?XV2GFh%1_sbF z4Aey!kX0DqsS%Wx26$a3cp1h5ltmbjRT$u@5ww;Dcoha{Y6PvN0bYdxo*F@GX@FN@ zfTu>#S{k5L7~rW9w3Y^V6$W@}1g)h3UWEak8bNJofLCFFr$*3P8sJqJ;HeR`mIing z254#ot);;LT7?0g8bNDmfLCFFr$*3P8lY7e44`Eg=q(LU`3RaCL2GG%S7CscVW4(M zz`I7k0~u(=1j9d29o=A3BZk%?VW0_L1&LMtX9Es7QA(;3l<2}p}#%Y)4f zXvGA$MZvJ^LnH%QF#&E-F!cV=K`SO8Eeg=o2wE`#X;CbYozIF^Oh8%`pn(k3VglTv z01afI6%&va1!y1xt(btcD7HM?j9yHDTNI$d3$$Va(xPZM&xAI10clbE`1L6gZDs`0 zqF|{1p@TNu329L@?5`0+oj`@QC=S@yhy`>auOxxCC_opjtw27;kpbGGc)&TI6>aPS z(xUh<=RDIVlx2a?7DdI$bVf;(Ath*wV$b8v4Kb+ge{hR}!R|vO$_ZKw43HKD!~CB* z3Mfb8Fo4%}GBh~Xh@o{#AT5dmfp**-sNGCRi{b&xd{&gh_86coih{oLOelx#F+f`s z7H88L1yK_Mq(u?)a5L&*dkhTV76pUer%05;_CVeMwZR##|I|S_Y>$Bf(xPaHt`S2y zY>$Bf(xNyJYsVddvep#ZqDWwv&w2*=JOc)3i^8DoJkv9jC9}{Lg~YLRMq^ZOfY)_0 z^gP+zun{#jKpB@2 z#6CtI&_?wJxJAM6`iIT~ls!$*76oXr1^ilQ@W2AJMUh}SpS1?fQIkMT{Tm0;8BuKj zt?Og}O^u+Opv3@fQGljKP)^WdV1TqJ-aOfia)K5EWL+l%XlexI1T6;0x=w}-^UpV- zoS?-3Uf0P0ni@elL5l&hu9E>YHG*=276W8mCj-ZkbVuY9v_Q8^gL*5VsS%VDv=|`k zI>A#TC?{w!K-P6KxIEd6a)K5E0|U540h$^?8{~wvC9f))d0T_=Ob!E{IDgZ4ld)PnkMpur2YVgk~lV7T-l66K&h1_nrrf??(l z9kiJdNQGW(3lrP>`R`idIZOS`-r|oo_-plaqk~(xNzVD*YhxnVbv^kTD7d zm1mpLiwSUxf}!YhBw8^6X;Cn|{HcRhOh8%`4O}&1XvGAiMd2W5$BkA@Kw1n6bxCPBGHNoNQ;6Y^`{P6F#%~& zG@PmtLn|gAEeeN1J8raM0@9*bU^kx?t(btcC@wUeZ$c|3AT5d)htdzC6%&vag~_AM zXvGAiMFE-`K`SO8EsBP+8ZoqD0@9)Y9n6VZOh8%`CQmn`6%&vaMZ>-tF|=X=(xSL9 z>--|*GdUR;AY&8^yFN#v6%&va1%q9;7;4!FX;D0QeL6i5bv6XrqWJT0Gg`+3(xPDa z_bC!}0u|b#0G(}ta;^mfv_%2B_xfTqNF$&Px79Y{P0claJdAu3rTnh$hivqOR0_9u_255@{bhZV` zxfTr2F^UA{`Dn=&(xP~C@hAMQSZLEE5j6bSkXuzJhFrEZ{J*ht`t44vtxd3rp73jQM-x-k%3=BMpZ|AonZ{cBJcyk!kN=gt}{ZD5O z$U2BYpj+0o(?Di3N4`&ghKPaqZcG5jX2G=|krp89 z;Bp7%fxY5p@*CYN+fqSZF<4PqkM0#?uvZGt{y_K2*_j}-d2-jGdnEyE)UHVMP&sfC z>_x7}|IxhIU=McIGlNg)&iZj0tVJprJyaUDgSDg?-NMk)4)%P?v7cz3XLt{G@R{@$ zbO(P>1p84__BWaz8SIk5ep$U3!!MHHSP`!Nhi<>cd9ai7&i_HT|34&*_dfrF?tgD^ zs#x>jB6>_dZ~|M?U2zB9njL?fZ44L~#GiS(IEKstd)Z3vBf9(7C4t<(Vahl3v=ajf zSktQ*<~D-OYI^q{-TB+W$t~itErui0z>Yk<>n*x1cOZ#6^*ToMS%c$3=iMjtxG1m( z$Hmv!Pw0LT0^1U8@gH463oNnw#~XC(Tfk|=?9)GVi7jA>Z=W!Ntt*H{`>rb1tHA9kl?HD&Wzopr017jnd;kCd literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_not_overlapping_touching.png b/gerber/tests/golden/example_not_overlapping_touching.png new file mode 100644 index 0000000000000000000000000000000000000000..d4854956060efd55348c2d963f4ebad5b552c1d3 GIT binary patch literal 96557 zcmeAS@N?(olHy`uVBq!ia0y~y5OZN*;NHQ(#K6EXF}3|G0|NtFlDE4H!+#K5uy^@n z1_lKNPZ!6KiaBrYF!DASFdW!W>^;5B@=0RSbIwdrpM&cd86cqM(a!5HSs-i%h8ubF z_+V@p{lNZ=4vY<>Pt1sfF=6xs!_6=zj8;fagINO;ayWJdTa_B_b?Fiwi_pj20L0uox{a;6X83Tp)si zVYIkF1jcA_0S}AO;sPENqs0XxC`OA5q_7w*F5rPNT3o<`VzjtG1jX?^jme`@O~I z&U^{^7-E7y!6Vg74A2SDsK2q+7+&d6d?=~Hdnm> zl`uBZ+ho%I|64CFFaQ7A@9F=4od5sp{r{i$FLWcTZg};xJXG{E6oG%ft(qhOh<-&S8twDx>8Zvsdq3?Jy<>B7Xo zuwqJ$HzLG#{x^cjgXjQ5aE)>`FyQ2)%h0&gd+{CFVGUUw&io7v3<~nC(~#pb>V-Tg zDX&t|qK@Oq!A+MRFq z`Cg&<>+(tI{{mt1AbNoaxF$OF_NQvM|7FM5QxBnLIi*e2csnD2?&1DC~TXiFAx)$H6GquW5_q@vtPlq5qKYj>+DmIOk;Tn-O zn`eIS+a0-oa*G_uqabN8ZcztSn*nzEp__h~$ZqkA+$FKynI9ekAT>#n3(inkFx8L_4%CWRQ4O39YlVi` zZ>``>Kd$7syxvm1+y312>=(KqBMxFs{reUtsdoDphTLB7*8WyyWpyudG&!VNg3@P& z1cem*`m^0d+*9WKW+L2)M{<8NySoxHEds; z^3fPkw3Z+@H5-fy1z8vvK7@FQ?N2d&FI&F3PMy;h?k$kRenf%`u=9&kKC z*%=rZ_He6q>ti_T{v_S@h42LJ@Nf|%RGTIp%}10G-XQmbYy;!CS;7ho3=M}gBcG(= za8xkZQAdL|owyDyRQb@Hy$@VLHfRNJ(r`kQ^^o%6&n#@^LqMdL*wIdSxpf%TP2IEQ z85kOzG$L&drrooCm-g3Bs0yY2{J;+C05ts3jI=q6!%edxZdw(%sbUjSVVVyrhki6- zb(5x-nBx(6jXf8X_P}8TA{s3}F)}cm=$+&mF}w2pj@e(WJyFx}hil*j^=VV?q8R~BK5#^k0`kI`H($D=TtVdiGx;Tg+j{s05vbM)az&^ z=>co(VYVI63(Dnz}+{xqZKLM^3eK4*WBWgy&e$Q4quv8ZzI z(}tJp`WYZe82+K@SIEG?Fh%D_BlcolgAtU-AKcZ9{9ueD7ruhzLZ_fj51u16=E1oz zAnaz5L=`BxgKZSi;{vr}6(m%->q6lTQ@JZ(NhtB5HZPxnp}~A<%E9Tm(3U)E1$aPP z2-FO_H*pf{epo{uEtTu5gDd6-H>c>Fa78acmtxI%^Sn+r$sqa{wY*UGfT{Y&H`o{$ zDwMs%L=v&bU0f5Wckw}QijKxP>?PETOqR{bjLFuVWM|a4g7W*s$;09lSh$=Tz7Fvz`pcQMz zbJBBu2cBRjtqR=q;HnR_r-PZ|4GkhN zrTSQfje$XfQI-4NW$fYfhY4IfUDb^Ia1KZDv>B3~{&h`aMQ&>I3aert)DXVh-;6`s4{Mm#pk$)(k zqVu2~Q5LKNwOYZU#K6Gt;HgCwBLhQR$0XK2d$6bSAJ(8&=YiD$n;POxu~#nkkZQQ5 zMkDe-IC@F`AsJgq?r@T+&KsWd=KX{@2t>C$KgG(xz~OU}sR(;5d|)>?ML7j+YLLMm zP!-wW2GoJyL7N)xV7N#Yn~N%fy~F}0Ao|I_K`AOP@X;%j#(BecA#h=^M_iS=Vi|g2U}tA%hb>KgaGRp@;3p#X1VOHW;fC~r z<4g<;Hl34LS+KY39KM1_h|VuaVLXUEq*m+zH_sRRnxgZ-6+NBrS&1!0h0K}6x@QVJ zq-s%yIu;1|z_ULFLPf@9CYR5S9xYxH(qg*dj@ zTcM!JthnKK1KGc>$04pewJItG+vtSAK;$TXg45+gk zAnPR-kcFP}rcTAutZV2B*wnz)0dLlcBNqn@`%YwXF)&PER^?tX346x#@&q;Ne#Cl- z1=wQmCY*vaRy532xmT=0OHmE4u#JW~bZSOAY(+FynBgrfP&nD2*5zVg_~7a#_CXDM zHLL;d?mf_+qVr%a_G(z85t5#2rszE2MbCLtBCri?c)6Wqx)%m74EDkM%^){@SS~Z4 zfq`Ma!%3zaSd-HOS8x)y_ddylW8Cb4D5TVUx*&z|Pd$3vrDE%8rbQB z+ycWN*srTGFdX35h-9cowCbMxzp=A=itDv9-ov?5#gsA@ELgyyrj+`Cfkn7?PNSpi zxr2!kmS*h_cz9gPH;DiKeeKrXUBBOM+w<45PjJr1v!7#N#)D`Z?qo3rh6DW(n;7b{ z?qth!)tKeDp$xix5V`aMRDxGVZepkl+&fL@^S7r}*7MF?1PyI{xYAW=Zv`*Gyr#Q= zN`3!RlUP5fW(M8VW83{zWA!dGkWDaLV{+e{fuZ63h7`s>^R8~$eBWo+S{*CoQIQ6N zV>%2B4fUH+82@w@t}oR1baR8GEOH8R=rOTkU|^`wo2JuXAHH7o^q$(C_xhF>mwt_4~oBYq+F(k&%Jnfbhl?#yj4#Lbi1u%(FeUst+_Y2vfr_|7g7s1H%LTX*vzN zqkXM^pIvhM)FPBYzzP{~IBn0Lrqgh#r@Gg9;`z3-FHi=Ui;^NXF)X^0ebOjDe%2)pDOnQ&o#^D{!P1-n~G}RoylMq=}gmU zSZ?&rl+V>p+H5gOFz%QQi8vW=u>-=Zu1`w6w=X9D_+`sopkWTLa4b%$5bzc|aM^3} zsWQVGYuzKSE(JLr7I6=r{#0UOV30pJiS@&uu*>J_j9+fsgc>XVIzVo!sGp|O5N?Ro zO+RWgOBfg!0`$Da4rH%HbJM%^Grli|S3CuyO}YpB(ru`nj$Io?xcvb%F|w zeFrA79_U}{nYvrz&9%jAUV$h1K+XYSfy4Xx7#J!fr|B@%UCg?5Ghgj)m>5cV_@T2W zl7Zns_J$P3531PR^mqx_P3I#wG5p{~cT+sJQrtfAB-4ZK2sg389nHYN@Ik?@h=Jii z@a7c856`itsD}OoP`hH@bXD$#YDuiA{JlQ7eA;(@66=B5tEdIkf#+ISip-jJRqh6( zCGc=kL3UGsn7ugz!-JO*n;0~%Vh^Wz;BYG5n8Nsh0ed*{LgKDIViQBfj4Iv8XKzn` zEwh=s7&OE5L*eKi`MIDd0pq3Ki2Q6L*@1-z#jTxQzMRpo9-4?wF}-mk%u?`llE#Td>j`)b`jny_6iHIyA* zfPrRc??2CHV_;|jg+UAUmv4qlt$DmN+ zM6?M&jV)*xF)-9Lo|j-?_z*Bnhav7X_LwsQ#~j!cSL|*w1*h;2nmUmTd)A@5DHofY zltFGPg}cdWIov^@(b$H*GRR4H4D+9xnLz7q!s7GLJ6wCuxcRTF8#Te!%V@*yr-QeVOuUD13!9N%+ zIh|jJB{}U81(~J^Pfo`{u7^46!R4Rvj0_Cr$tRf}9L8RZPXtF@ZNw&q2e-H9V~soo zA8_6B{=g(whX2da0&1Qgwt%Xfro-@~9iHv(#=%?!O5^>Homm+e{s?-DG5nd0wG@A_ z5bUb=n^PDM^!H+G&@~+QT+GbC@E|mD6T^dWv~0c*WIQjONQMvXuePSl z+^&E9_Q#UGJVpiv1qW>51gbW6bi>0bHVrwP%%7ZQVPN4Q7C(^BC!O^1Oa5G|1})xc7-_#dCd%Fu|2 zy6wnO7dOdYkb&WYImkjbtWkGhy5wdChKBzeQWy_>#@?ojpX|oYz;IwQNXcfjc4otG ztZq6uiIw3zBIBjYAjRDS(;uvi3=AMAm0@?%d61JHTm~gyRjgf>hWQ?#6s|Bym75{X z1FdWKXITMZ?#sjah_gVHG2321c`NWe<4d!N8o0`%h#rhC)CZfXRXQi`=+seqJCe>AJETLKp4tHPz$F6v$2g7#HXEPVtA(q&vxIDhaDemel^V*wiclO#~cQR1Kk@_ z7#W^oPg>&O)E=I6l8NCI*3{k*J{9b~^&l_wqZOV9c57lOJog`&#L8e31kZx!+>s*k z!1W)!3=9XjK@q8lwZZvds>Egnh6gtzH!(CgV2?*ha2@lfLzSC>1FfHT;54=%1J@rm zorttG8Occv^FRD$U}#WJJ;}r{?=04O&&Cu~$Ji)?63(1sdyg$Vk$yN0rMCXC2VBSe zPzNbFgO&v=Y_T;s^Fe9rvp2kxUI-t6VPIhRq5dD#RZs$@tyZjkg#*QgptJ?5K^XMY zu@;~H;6bQ{{QDrAPNR*mJYW^U()R>8{}!U8%0})|f!ZSiXD6{T>}ki^isAq#CJ&I4 z=VGm56oNp-`GM!4wDcaWanO(+f;o`Uzz>R)d!g{OtKs}%jirC{V0GyWQ9|e_DQ_wmJ^PI4>q3l4(?uP@sqp-^bsWd;}{-KqD zp@AKg<>u#LEvLNFK^2TUC<9;(qy;fx7rj3}iIw5QezcU-5r`#_%+pUYG5pAfyU5B1 z*+tc#(is>Ugd#UFFzn05>Y{h&LG^Gd$jyHaVC}lR(*gC(AJ~Ensau8GB5z>FQV2k5 zk3WmxIqvRCq#XCa_lF7t!-2UVj-?a;*B%W)2sd>hyGj4BIRgVj-DHrv4Y8M&)4`=>dBi3L2DwbE zrGWi(PznB_3gqm5^y2b8mf{jpW4It{y+F`NIxL*#O)vis>ZGf3Gbr4_T3Xi32i3%N zQ$eow#G1w*Sc6N;xMq-&m1yDgffZXgF;3HAXi%R5A3l^8hdGFWfx$+Q|1TrM4^D3} zh6Bb}$Lt&SgTo0_pEI1##~M!e_tpNM1`et{prBg62rZqc~V(oeU5CP}Ck06WQuSE@~2bZyo zX)4SB877Pvt5ZN8{eAkWOrGJvVo-5lcM5BgdVgjHD+8qBs9Auu!I`fODxwtHK=ve~ z4IkFb!P2&40hPctJK!;Q_c&50Jve7`jh*3##WWoThJV=m!udx*PD%%rnjh|Cty}i= zgWA9i$H7Yeqq%9%ek^XX0o5%H^^@VLycl^^-XG2NpBWkKnpC+N8s=l|Qa#uT>g9pv zHy9Y|E@CUn8^pm$95lbdzz`pV+TQ%oh9x-#D1nv??^lGkH?JEb1=J6t^B)-*?o9)^ z$$lfYF4ciH zzGpu>Lxnad^1L=-b<<|!G)9IGb|4F7 z4tdgDXpJ%zG0z*^{5lTGXB}5_R9^3?2JcG%O_T=k9xakUAI<)u0P_8L1z*VO|CG|@ z$dk7}zMY-H%HZG%GOj`kx-1%X4C@Fem;-D<5i##V$ptIXpGkN6kOxH@62Jw?e$aT! zfy-HDlS=PFmf3^m04sv9xrrBSTFk5~;Eh5jU+Lu|1@j(F{jUrRQxi`zF)Yx6t|ma8 z1LOcrL@ba3#eB$VtWH`F&LJO)LH4X#ans{kC1hU-Xq@&zq{!(+^a+~>>R{8t;ZEWM ztx|=#Y7e*l7X}7@P`mj6H*__@NtF5I2il;zsUi+!VcapSZn^}n1Zw7kvYGg0)Tk3! z7Qu%xD|sIj1P@e~dgks2?Lb@eP7gE}4|UUl)1OTE89tPNoV{lobRh`pw7Xa08777Y zJ3-Bg3U;ii$u1t8nm~OEhCTgh%8}0@8D^?L6A)@tF131 zwNpP>)tqEzuwezIxcqGBawn7__J;EyHz~{mg@L)b>=r-QeG=PIW|SWYgGc?}pPR(W zz;J(GZ8mCp(g@rrmoxZ1smAVccbprt2cQOxvIVGT+NKSU7$^$01T0#yG! zU}V?_8s}oDJB`&%`%i(Yrt6@3=Kwos#mq$gV{cJr!hfiO^4)>mpgQnCyQ%a^tM`yi zjiBWKecTJd%6hJ2;WAKLb*dnt>X3KWwp-1#zHihv5_=?u6xG4q{+n zIDd4xHG>0apo`%HE7r2$$81AxhKBQ??o)$4Xbn4NiqZ#%(`s-~ile2cADvjjNgvdc zWKg`c1hT<0to$R=+`Gbz>tzfL{>dkq7#d(3Nl;77d{CKs;5j&6jA!sgEmw-~xs4K# zd)9+m6%Rx~S@S`q30l+zV@cwtHm5K$9N6qR8M03>@-8FNQk91F&!)>VJOHivVR(=U zUBZqUb$i4?qaX6%U{c4L@hX%-!Q=p%9AQ`>G^;mdZaH`-YA?z0ucfqam&9YnD^$pYjgaJ9j36|_JUBjzen!A_bA3Z@0GP@U9J9)ejs zEieKVhaaR6F(-$#;^o2TpJD6_KU6_Ev%(N-Ww#!*kmCSoPMzU_Drns!My`wV0u`Ab z-heGSgyyF00hn%juo9f3o+66zD5L?%1L_~<@iBZ@4>ryYYYNu_b?py)2b*#iYe}$5 z7u0SB&y6rt_@8y#bPlrZ$89@k4T09Q!{{rOAl1f)bBJ)VK@KP7KZ}_e{;-3h7qqYf zTjkR53fv+z2dk-H)_iT{3Gv5eD8p%@;OP+?Zm<%5G*@+NU~!cQC=?EqBSLB#a!Bca zY~W)^ILXAoP?v|ysYBDW^jX02^5qK@z+tS;E+%( z+0FozRvsX^XbZB7zW=mfXSfG0#eZzT8cOM)nx(=WYzjZt^fb>;N|u4)!&R`?m!p-K zT8lB81qY^sx~mNH5vBNaH>7;`@6k~ih6-hnjSG0Nrg8s+Gguiu=z%PBsKgp`A3;6) zhV|gEK6MQ>m~7T#DKM9UvN=P%GQ47GM;b3~`2KXc3`0dB$Vm^nu@(hKKtt?%j6f+x zAjv9YE=Ii~pa4qY8lWC81IHCK7h$XFmV!!OhKGm*-j0;OE0pJ*U~CWv4NNi2JC3dT zJs=KB-g~4#F8YvzHIU*JK~DPN1NN3BTJ<}z>!|_yD#{v&X=e~_nuhGA)P2Vo8^l3P zJ_aq=+EA3X(*m7iIt&fr;8@X0!4^sZUEpfPADq5VWun%;`$Dj!Z+pMAz%?Fj20iob9FvVIn*|~$$w;))_RJ5w@DYmldHYjBt zc#Wv)E+UbQcLQtG9S8NFSAixl820SJS`4s*8!7ui6VeQOI#HXw z4<=)&>L7K-gSAWGP4PCQf&KtPxr2-iT;LS1(d(r)?(8k%ExP>(1qmmoRm!<(8qW(Lr*T?U2^{8*#TKIse-1EkJq zcn{hpiP1{=vl^V7=7Zvc!TthjuKTkMOF8f#+`#-03~%-BE`W4w!70i{cKtobx?Ki_ zKfAD&m;XUMy9zN-VrjUKwN3CN8l0ZMBU=m)7Nb?b^R+Rn6>x_6p$vDEbp?`}j(on& z3tqR&z);hL%}EdLf|3)s%3!d&h^=E+kqv64eAovLrupm8;;s)fm=4Sam*7)W;JNNQ z(v(O8!@Ql04WMNJ3=NyGmX`U)K?OLt#$bp~##RvQnGTA%3Vm=mu16~`Ykq%w8;w~O zJm>{Avl#Zp!P|4^7J{P!3-IAE1SC3=IX?()fd;pnP}W zHMp{{LCbd)SQ2@IIH8eb|JhX3;+c>TZ2tLewnQNHY*W6!>p4 z98d=rPkUfnMo>ly7EA)Qoa({l;fE@0wVlIPP_Nu!E2w5+hzs33am{DQX)vHo1ADNf zafeoj(r9>U@o6Y>7O?0Tgv1{h+W0 z?HEDs|2ni{DaExwYh4&VY(oT7Byuo?$E{;*xDPHZ60jBG6+xi-Hy$*b$?%{aTVt*v zeTo}91H)CY84v!Wr6w&+%(5v2H1WyM@P8V7=)xIkec*xnejKjXo%~Gweqj7n>J_rBLt$N8=A&L=N1Ilmqk6 z2AeW`kOk!k2D>zDfyR-1hKT_@qt3ukkF{xc1T?hL@EqI_d2k-J9d)1>OPJX}d^lef zUVNrUfbt#$KiK%j$1@lzxWQpC?>@Gs-3RxcNCs&A5g>}yO^-oc z7w`&R28LB=!DJVYnZOsgfbCm_=uN33ZKqmLRpZ2b;54|p4#>pTj5_ch)KORuS|Y`8 zfE(*z&wg-6!45R;%g`|WB5E^g{sPP%-iMRmQg6=;la-LOm#)T^AO;T`xIX;iVSo%# z9axRE+5>O>*uw{o-SxTH%1+4Ej~a-Q_h{`+yG2;s#0hazKio~Spkvn{d5)nW{mFGn z1})HX2ZjUESl#sR$l=VL3LK>bcpr~+*5gNAZ&T?`qdV)(xdE#Ixj;wWiw zKz&F?WW4`K8PBlBnAsr}oU0y)V=J8wSR17=LaUI5`$kyWEDhVi11t96wowB=>X1Rh zek_w4b>Q{^gFK>^$wrz^{@}VtpBcRIgMs0|eCSquly+3Zc2JuIwDE(1fx!;zj7uDN zCILLT!N6b_j@m$YzZy$8L23;RXLtjl?=T|j93uZ{GatAN8nR_@Sc$E+dtfTLnE_gD zH0T>(3ny`KZCnp-ZXTG9+8ut-izS>OwMK(JBAlWP5pMdBX`{h>AQ)T%J50gWSEvv? zro#Z9++bix!qz}|APOonKfHq^5gybcvmzC<$b7ICT(LZ;MD#pMco0sinbV)bzyakrla-%e(LP6_JK^s397#?I|bJBuIpb`@@M8!~1gxcENGX=Bv@}Ugu`T$ON0^hBI zG(5ilAh!`i4QP2L149Vbsf~~}LvDs2R^W1X#UgAS^bl}K@E($CucFR!I&8(PejB!f zTU-sRyy1=VM5IagAAA;&g@6RA&{y=?U3J(Khl*PYUA4fjE_mJAGbSO@z~f!tIF?%Oc@*n-VXQ#5+{7#hIKei<141)wGYKo}luPjzJ1=aLvX9kVK*cz$(z>7oA zgXeA;rYuLPEgRlrnH-rn3sl=PXdo)^d20|&odsMmY|IDlgPUIr_p$ab{!IZDCWhdq z&WE#DGah*72xOp(LBRzzoR(slh5&CIVPIhKf)^&-NJ}R6s4PFg@F5Rx=2jLmCa21hJZ@cnESI9Gv>hi z4H+0dsKG}azW+ix=qqu~XQlw~)Cj|ayVxe(KP>BsWC#H5F=JqOV2dr7D%?R%ngX7) zX4tbCbvXMUmKh|_c0&dRh6(UO{CEL0gg}ed?cS9$t^h9@VmPoLTOs~I59A_KaI7@! z$JXWfAO?;&FNhL()FnX`*;pbDQfV;!bA-1B?;S%b2VD5d7*}wBGx>q_*z(+hO&~Wx zDvgGCZ1dX-W`W%l3~|$a)JDaJI4tF*Jh=7AP~!)8)4Wp%H$Bkad4cr-WR#2H-vw-$ z?kXrTg@eb77=8$0%XC^wpfdbCq+qUDh!S-TU0CXs{h%dC3=AKhB2rTkXuCNy{_2l- z>M`hphq)L6=3#5;#LY0|W{B$q7d#7cu(>HN6x1kyOpY*outm*vtFSawz?%&j7!H&p z$|h&f*%MGV{gE@@!LWw`9C;2MSl!fV$jvYhQaCAKTVmEQ9kjvbfITEaT2RN;Dk`z0 zr+jchz%b7R9(VVyBE_A$%w47rOTc9~!+C7=O2hKBGfWNX;GQ8vg&($XnimcVr+P^A zR-~bp1nZY$_IUn)mj5y^9QcfAr5Yn0KK5s-b~M90(Be@Bh6k-!i-MS*NQMtO5NGSB zV=0{u2!nRGK6nhNdp>MJjl4Jq%<&IM(%Z8Q-cH%O3(-z#Fyv-f1PRGi*jgzK3CDC8 zIv|0xViLBBZXzht-J1?cZdItxnTKU57i2P>VZkay`sP3!>~g@m$er5(nv|YmEt~Fw zg6J+Ji1M+GHy+sTwV0U!GBv``upPCc`yhf@4t#KfnuZu6%KrpS+n{57S=%==)Chx< z_W^5cz2^lb$8;Ee@PP{+25c>qDWGM~3w}YY`LiCi6p+A7-774>wlVxitX7r#~xAtQZ{NPCzV*u|pWME*3&%+i_`JjLTZx#WaAdi-u zQZWPS!y!mKPeIJNzehU6ZV%7#^$azj{kxzem9Wi>9MCsRV?2-!Zm2W-z*;ob>Gkq4 zJopM#QiobJ%@4;6C~0JXk$LMM-&GW?`&rJzzoUj zaaXXk3J&}>N@F|_54A88OU=??4q6KEAqJ98LL5+osvdJj1bh@0=)faM_>jzRq;d5J z(Uu9U4|J4|(uVTmttzlJc~Mfb3(sA)VKOQER_DOVmy zBH|8dfqp|jf3g^Z{wdIE0R{$t*lhvGtIQPU8FDvVhg1g*>e$i~2WV@>hiYg7*n*nI z)k85W7s!-4LxcKsc!$#-v5K<6{OJUd2ap*Nh6kb8;*P~2jqw9`w+92mhbU|P9oSu9$@Sq1#ESup*eaL%2WPMz_zX$o z4yoAYki9@NM<0?QWxwJo|xHL*FiePI2 zAWL`|7y@#!Id3T_$e=aI2R>{;77seA>w!JQk00z%gX}%#){lmIXi>ErQB<`f%1?*V z9lWd+;Ke@-3>DGX+!TL!2CIV&q|v!&CzjsA0dY|A2_2g?~9etc8U8fqZNO(mz6v=`ierjQukFXu%dz`k;Q^J;?YW z!;dW}iR(c>=F}E+TAkqmKVt5^9MRExu+s87iw2|z&hP{4KCt@JGguvVLY;jbTNB|= zgp@37q>5ny4{AWY$E=V8A|ZKWfeoVB@&=yZ87lPNSu=V;N^FLGu#>NmH|`v$m)Okk zqY7fmgWK3L;XlxUnJc6qiSEN$)Koqnvj7dygqWs)7&!Q6hj3Gq^ zfr`E@SnA`3?@4Ev9(;yI-DGU_aXx7CW(BnU{y-IVm99Ky>n;w`L1Cy+L`0n=qK%+2 zcd{>RdV?YEB9`V|K;bbR2I%w#Lq#l>e7E4#r5Et&4TiW_lvePb#h3%F`j9~nh7iPz zvK`W5=6&;|eH-Gz^H&TETG+;XR!Aj_F+gV385p!c*F2yvLk|J%{eW!!U|?`)MOmwK zAR03@!Kx4kq|G1q5!K8CZi`baKS1ZhfsW&?#a8v{pP#{cpdV7HH71J;Nl(;QLH97x}Bh~)=(;V1(`Lw|oimI1p5UqSf}ysMUh z;lO?@jj0B4&=Lj6)(-}T1Mw&c%E1*&`2?*w8srfb@_Hm!=@*u9g6DV{7=CnOa}uk> zX4w43gL=?$%AsPpyo*n3>AGBSaC8*(aXEE>jYCc9CUbMwo943yn{v$#%1LzHdm!^} zU-kX1*UxX)S#F=a<-y74PgsA5VmYhg!A;QG)rpW`X4t61MeJRV0dsE%drp*psgc6AghxY8tk#183o=t@*x9K95w7lIai=z zI_4=O4;Dh5Uye9}VK$PR>MPf)1HlGqj5S=4(#@d~%Z7P}JtkHR z4+Nq1q^?Fj>Y(9yD8|7j3re7_KkflPLx&SlS^kKz(`*DEjRHEIaRZhUYZTfHxgUTJ zAz@%(aKds>MFT@-2?O|4El@Guh;qirgH92Q<8w5im8wDv{J2R7A`~95Ld6 zsJ!~J@{i<|-eOpb?Xg?O>lDR>@)qv?1+WhCO?+oOAHOHM4}_ z0Qev+1_p+j4iq=-*o+xY;DfY4HFF>$oX#R@%DA5I?hjZYqgV`fm$8J?2kD+j2I!1B z!-tbt^4x*-pcX|PG(sFuj$Zh)64OcGgS0@)ajz

K{8$M;58^K9+5}LhWngGn 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 literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_single_contour.png b/gerber/tests/golden/example_single_contour.png new file mode 100644 index 0000000000000000000000000000000000000000..33416388debf1d64b1aa3e31808d51f61d2265de GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0y~yVAux2983%h48JEm2xeelU`z6LcVYMsf(!O8pUl9( z_|VhEF{EP7+Z%@2!ih4+KdOu0j#we!6IkU@cG2<3Qm!Vxb$sg_H7tJC$+YM>9Sn?b z)Zi#Bdi6lf!!TfDP|nq$Y+0cz*LMF|9w-0w^GrUzzW*O&>teJ&zL$>CW#|6v{_*M4 zsfmRm_n+1)2{H*ODo{u;GEfD)+N!=sd-vRE@#kjyYySVqUB9vUgzxHiN6(a0XMS|b zFU#7obMuZZx1RW>EL~A;7%}7hSwGWCuF6$@OYU1&{{A%c;^)QF-%Iale-ol!^gr#t z%SA8Ewd->CR&2ib#`DQirHRtd{o`NF_tJd(_eTAPH+SnEn@^m2xbuw9_V=;&=2dl{ zs{X!hU*9|5C5})1Q})ujTlZ@JWL3zhPn^!&`DbU4yj}e5dmpV^nmZ#_{&`!j6s9%x zSZBn_E0XF-OM{ksglP$jp7csxbjT}p)1!A=i@toh;30TI*A1oaGtJyF6*2UngG86&z=AP literal 0 HcmV?d00001 diff --git a/gerber/tests/golden/example_single_contour_3.png b/gerber/tests/golden/example_single_contour_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1eecfee0637f64098d3572f87539867fd0f4a828 GIT binary patch literal 2297 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 literal 18247 zcmeAS@N?(olHy`uVBq!ia0y~y;CaHpzjIq`yzs@fEh z&29N{kLGS}ioRcCT|Ql%nSp_!VeRhve|z@T&Z}ZQbMETThc_?&yQ0m&z`*bWxZZP0JetPfYr}rctmwvVVDmG*B^sDF9!ajF{E@qByMxbz3{g<3=>A#;Gh@{2XHWq zrUytcjE2K#IEFz&0?bZOM~uO3n0yr)q6`c-PG-T`Z&FO*?6OT#aJF?MFO1zVcMThi zeZVgaGy(|bjv5ad`5X-#1_p-Fl*2HZtwsw4a0rYR3eaE}Efhuz1xQjDZ7GZv3XqgA z+EM_81Mv;;_3C{eVQT?EIvGYAL1hMynP`N*JwLK;b}q)dEsI zTAhGHfp*o2LfP90kQE6N_J7s*Ch87ij}FB#Fffb`B!ZH{=qM`#1Hbx2v00l`*Fs& zpPPY!;mHxi`nXXxC^$#M1QH6P;V>Ew1C|EPbtcs_Ft9xVoeMBpMnMzeX!#5Yh|zEu z4TsS*Fq#GiMH*OUcx>Of`QIPEQ3XZF^bPAj-xO{z{NoBb5r*%}?{2^3p6lE8Yzopr0LFr$3IG5A diff --git a/gerber/tests/resources/example_coincident_hole.gbr b/gerber/tests/resources/example_coincident_hole.gbr new file mode 100644 index 0000000..4f896ea --- /dev/null +++ b/gerber/tests/resources/example_coincident_hole.gbr @@ -0,0 +1,24 @@ +G04 ex2: overlapping* +%FSLAX24Y24*% +%MOMM*% +%SRX1Y1I0.000J0.000*% +%ADD10C,1.00000*% +G01* +%LPD*% +G36* +X0Y50000D02* +Y100000D01* +X100000D01* +Y0D01* +X0D01* +Y50000D01* +G04 first fully coincident linear segment* +X10000D01* +X50000Y10000D01* +X90000Y50000D01* +X50000Y90000D01* +X10000Y50000D01* +G04 second fully coincident linear segment* +X0D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_cutin.gbr b/gerber/tests/resources/example_cutin.gbr new file mode 100644 index 0000000..365e5e1 --- /dev/null +++ b/gerber/tests/resources/example_cutin.gbr @@ -0,0 +1,18 @@ +G04 Umaco uut-in example* +%FSLAX24Y24*% +G75* +G36* +X20000Y100000D02* +G01* +X120000D01* +Y20000D01* +X20000D01* +Y60000D01* +X50000D01* +G03* +X50000Y60000I30000J0D01* +G01* +X20000D01* +Y100000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_cutin_multiple.gbr b/gerber/tests/resources/example_cutin_multiple.gbr new file mode 100644 index 0000000..8e19429 --- /dev/null +++ b/gerber/tests/resources/example_cutin_multiple.gbr @@ -0,0 +1,28 @@ +G04 multiple cutins* +%FSLAX24Y24*% +%MOMM*% +%SRX1Y1I0.000J0.000*% +%ADD10C,1.00000*% +%LPD*% +G36* +X1220000Y2570000D02* +G01* +Y2720000D01* +X1310000D01* +Y2570000D01* +X1250000D01* +Y2600000D01* +X1290000D01* +Y2640000D01* +X1250000D01* +Y2670000D01* +X1290000D01* +Y2700000D01* +X1250000D01* +Y2670000D01* +Y2640000D01* +Y2600000D01* +Y2570000D01* +X1220000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_flash_circle.gbr b/gerber/tests/resources/example_flash_circle.gbr new file mode 100644 index 0000000..20b2566 --- /dev/null +++ b/gerber/tests/resources/example_flash_circle.gbr @@ -0,0 +1,10 @@ +G04 Flashes of circular apertures* +%FSLAX24Y24*% +%MOMM*% +%ADD10C,0.5*% +%ADD11C,0.5X0.25*% +D10* +X000000Y000000D03* +D11* +X010000D03* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_flash_obround.gbr b/gerber/tests/resources/example_flash_obround.gbr new file mode 100644 index 0000000..5313f82 --- /dev/null +++ b/gerber/tests/resources/example_flash_obround.gbr @@ -0,0 +1,10 @@ +G04 Flashes of rectangular apertures* +%FSLAX24Y24*% +%MOMM*% +%ADD10O,0.46X0.26*% +%ADD11O,0.46X0.26X0.19*% +D10* +X000000Y000000D03* +D11* +X010000D03* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_flash_polygon.gbr b/gerber/tests/resources/example_flash_polygon.gbr new file mode 100644 index 0000000..177cf9b --- /dev/null +++ b/gerber/tests/resources/example_flash_polygon.gbr @@ -0,0 +1,10 @@ +G04 Flashes of rectangular apertures* +%FSLAX24Y24*% +%MOMM*% +%ADD10P,.40X6*% +%ADD11P,.40X6X0.0X0.19*% +D10* +X000000Y000000D03* +D11* +X010000D03* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_flash_rectangle.gbr b/gerber/tests/resources/example_flash_rectangle.gbr new file mode 100644 index 0000000..8fde812 --- /dev/null +++ b/gerber/tests/resources/example_flash_rectangle.gbr @@ -0,0 +1,10 @@ +G04 Flashes of rectangular apertures* +%FSLAX24Y24*% +%MOMM*% +%ADD10R,0.44X0.25*% +%ADD11R,0.44X0.25X0.19*% +D10* +X000000Y000000D03* +D11* +X010000D03* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_fully_coincident.gbr b/gerber/tests/resources/example_fully_coincident.gbr new file mode 100644 index 0000000..3764128 --- /dev/null +++ b/gerber/tests/resources/example_fully_coincident.gbr @@ -0,0 +1,23 @@ +G04 ex1: non overlapping* +%FSLAX24Y24*% +%MOMM*% +%ADD10C,1.00000*% +G01* +%LPD*% +G36* +X0Y50000D02* +Y100000D01* +X100000D01* +Y0D01* +X0D01* +Y50000D01* +G04 first fully coincident linear segment* +X-10000D01* +X-50000Y10000D01* +X-90000Y50000D01* +X-50000Y90000D01* +X-10000Y50000D01* +G04 second fully coincident linear segment* +X0D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_level_holes.gbr b/gerber/tests/resources/example_level_holes.gbr new file mode 100644 index 0000000..1b4e189 --- /dev/null +++ b/gerber/tests/resources/example_level_holes.gbr @@ -0,0 +1,39 @@ +G04 This file illustrates how to use levels to create holes* +%FSLAX25Y25*% +%MOMM*% +G01* +G04 First level: big square - dark polarity* +%LPD*% +G36* +X250000Y250000D02* +X1750000D01* +Y1750000D01* +X250000D01* +Y250000D01* +G37* +G04 Second level: big circle - clear polarity* +%LPC*% +G36* +G75* +X500000Y1000000D02* +G03* +X500000Y1000000I500000J0D01* +G37* +G04 Third level: small square - dark polarity* +%LPD*% +G36* +X750000Y750000D02* +X1250000D01* +Y1250000D01* +X750000D01* +Y750000D01* +G37* +G04 Fourth level: small circle - clear polarity* +%LPC*% +G36* +G75* +X1150000Y1000000D02* +G03* +X1150000Y1000000I250000J0D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_not_overlapping_contour.gbr b/gerber/tests/resources/example_not_overlapping_contour.gbr new file mode 100644 index 0000000..e3ea631 --- /dev/null +++ b/gerber/tests/resources/example_not_overlapping_contour.gbr @@ -0,0 +1,20 @@ +G04 Non-overlapping contours* +%FSLAX24Y24*% +%MOMM*% +%ADD10C,1.00000*% +G01* +%LPD*% +G36* +X0Y50000D02* +Y100000D01* +X100000D01* +Y0D01* +X0D01* +Y50000D01* +X-10000D02* +X-50000Y10000D01* +X-90000Y50000D01* +X-50000Y90000D01* +X-10000Y50000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_not_overlapping_touching.gbr b/gerber/tests/resources/example_not_overlapping_touching.gbr new file mode 100644 index 0000000..3b9b955 --- /dev/null +++ b/gerber/tests/resources/example_not_overlapping_touching.gbr @@ -0,0 +1,20 @@ +G04 Non-overlapping and touching* +%FSLAX24Y24*% +%MOMM*% +%ADD10C,1.00000*% +G01* +%LPD*% +G36* +X0Y50000D02* +Y100000D01* +X100000D01* +Y0D01* +X0D01* +Y50000D01* +D02* +X-50000Y10000D01* +X-90000Y50000D01* +X-50000Y90000D01* +X0Y50000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_overlapping_contour.gbr b/gerber/tests/resources/example_overlapping_contour.gbr new file mode 100644 index 0000000..74886a2 --- /dev/null +++ b/gerber/tests/resources/example_overlapping_contour.gbr @@ -0,0 +1,20 @@ +G04 Overlapping contours* +%FSLAX24Y24*% +%MOMM*% +%ADD10C,1.00000*% +G01* +%LPD*% +G36* +X0Y50000D02* +Y100000D01* +X100000D01* +Y0D01* +X0D01* +Y50000D01* +X10000D02* +X50000Y10000D01* +X90000Y50000D01* +X50000Y90000D01* +X10000Y50000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_overlapping_touching.gbr b/gerber/tests/resources/example_overlapping_touching.gbr new file mode 100644 index 0000000..27fce15 --- /dev/null +++ b/gerber/tests/resources/example_overlapping_touching.gbr @@ -0,0 +1,20 @@ +G04 Overlapping and touching* +%FSLAX24Y24*% +%MOMM*% +%ADD10C,1.00000*% +G01* +%LPD*% +G36* +X0Y50000D02* +Y100000D01* +X100000D01* +Y0D01* +X0D01* +Y50000D01* +D02* +X50000Y10000D01* +X90000Y50000D01* +X50000Y90000D01* +X0Y50000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_simple_contour.gbr b/gerber/tests/resources/example_simple_contour.gbr new file mode 100644 index 0000000..d851760 --- /dev/null +++ b/gerber/tests/resources/example_simple_contour.gbr @@ -0,0 +1,16 @@ +G04 Ucamco ex. 4.6.4: Simple contour* +%FSLAX25Y25*% +%MOIN*% +%ADD10C,0.010*% +G36* +X200000Y300000D02* +G01* +X700000D01* +Y100000D01* +X1100000Y500000D01* +X700000Y900000D01* +Y700000D01* +X200000D01* +Y300000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_single_contour_1.gbr b/gerber/tests/resources/example_single_contour_1.gbr new file mode 100644 index 0000000..e9f9a75 --- /dev/null +++ b/gerber/tests/resources/example_single_contour_1.gbr @@ -0,0 +1,15 @@ +G04 Ucamco ex. 4.6.5: Single contour #1* +%FSLAX25Y25*% +%MOMM*% +%ADD11C,0.01*% +G01* +D11* +X3000Y5000D01* +G36* +X50000Y50000D02* +X60000D01* +Y60000D01* +X50000D01* +Y50000Y50000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_single_contour_2.gbr b/gerber/tests/resources/example_single_contour_2.gbr new file mode 100644 index 0000000..085c72c --- /dev/null +++ b/gerber/tests/resources/example_single_contour_2.gbr @@ -0,0 +1,15 @@ +G04 Ucamco ex. 4.6.5: Single contour #2* +%FSLAX25Y25*% +%MOMM*% +%ADD11C,0.01*% +G01* +D11* +X3000Y5000D01* +X50000Y50000D02* +G36* +X60000D01* +Y60000D01* +X50000D01* +Y50000Y50000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_single_contour_3.gbr b/gerber/tests/resources/example_single_contour_3.gbr new file mode 100644 index 0000000..40de149 --- /dev/null +++ b/gerber/tests/resources/example_single_contour_3.gbr @@ -0,0 +1,15 @@ +G04 Ucamco ex. 4.6.5: Single contour #2* +%FSLAX25Y25*% +%MOMM*% +%ADD11C,0.01*% +G01* +D11* +X3000Y5000D01* +X50000Y50000D01* +G36* +X60000D01* +Y60000D01* +X50000D01* +Y50000Y50000D01* +G37* +M02* \ No newline at end of file diff --git a/gerber/tests/resources/example_single_quadrant.gbr b/gerber/tests/resources/example_single_quadrant.gbr new file mode 100644 index 0000000..c398601 --- /dev/null +++ b/gerber/tests/resources/example_single_quadrant.gbr @@ -0,0 +1,18 @@ +G04 Ucamco ex. 4.5.8: Single quadrant* +%FSLAX23Y23*% +%MOIN*% +%ADD10C,0.010*% +G74* +D10* +X1100Y600D02* +G03* +X700Y1000I400J0D01* +X300Y600I0J400D01* +X700Y200I400J0D01* +X1100Y600I0J400D01* +X300D02* +G01* +X1100D01* +X700Y200D02* +Y1000D01* +M02* \ No newline at end of file diff --git a/gerber/tests/test_cairo_backend.py b/gerber/tests/test_cairo_backend.py index e298439..38cffba 100644 --- a/gerber/tests/test_cairo_backend.py +++ b/gerber/tests/test_cairo_backend.py @@ -8,16 +8,125 @@ import os from ..render.cairo_backend import GerberCairoContext from ..rs274x import read, GerberFile from .tests import * +from nose.tools import assert_tuple_equal + +def test_render_two_boxes(): + """Umaco exapmle of two boxes""" + _test_render('resources/example_two_square_boxes.gbr', 'golden/example_two_square_boxes.png') -TWO_BOXES_FILE = os.path.join(os.path.dirname(__file__), - 'resources/example_two_square_boxes.gbr') -TWO_BOXES_EXPECTED = os.path.join(os.path.dirname(__file__), - 'golden/example_two_square_boxes.png') +def test_render_single_quadrant(): + """Umaco exapmle of a single quadrant arc""" + _test_render('resources/example_single_quadrant.gbr', 'golden/example_single_quadrant.png') -def test_render_polygon(): - _test_render(TWO_BOXES_FILE, TWO_BOXES_EXPECTED) +def test_render_simple_contour(): + """Umaco exapmle of a simple arrow-shaped contour""" + gerber = _test_render('resources/example_simple_contour.gbr', 'golden/example_simple_contour.png') + + # Check the resulting dimensions + assert_tuple_equal(((2.0, 11.0), (1.0, 9.0)), gerber.bounding_box) + + +def test_render_single_contour_1(): + """Umaco example of a single contour + + The resulting image for this test is used by other tests because they must generate the same output.""" + _test_render('resources/example_single_contour_1.gbr', 'golden/example_single_contour.png') + + +def test_render_single_contour_2(): + """Umaco exapmle of a single contour, alternate contour end order + + The resulting image for this test is used by other tests because they must generate the same output.""" + _test_render('resources/example_single_contour_2.gbr', 'golden/example_single_contour.png') + + +def test_render_single_contour_3(): + """Umaco exapmle of a single contour with extra line""" + _test_render('resources/example_single_contour_3.gbr', 'golden/example_single_contour_3.png') + + +def test_render_not_overlapping_contour(): + """Umaco example of D02 staring a second contour""" + _test_render('resources/example_not_overlapping_contour.gbr', 'golden/example_not_overlapping_contour.png') + + +def test_render_not_overlapping_touching(): + """Umaco example of D02 staring a second contour""" + _test_render('resources/example_not_overlapping_touching.gbr', 'golden/example_not_overlapping_touching.png') + + +def test_render_overlapping_touching(): + """Umaco example of D02 staring a second contour""" + _test_render('resources/example_overlapping_touching.gbr', 'golden/example_overlapping_touching.png') + + +def test_render_overlapping_contour(): + """Umaco example of D02 staring a second contour""" + _test_render('resources/example_overlapping_contour.gbr', 'golden/example_overlapping_contour.png') + + +def _DISABLED_test_render_level_holes(): + """Umaco example of using multiple levels to create multiple holes""" + + # TODO This is clearly rendering wrong. I'm temporarily checking this in because there are more + # rendering fixes in the related repository that may resolve these. + _test_render('resources/example_level_holes.gbr', 'golden/example_overlapping_contour.png') + + +def _DISABLED_test_render_cutin(): + """Umaco example of using a cutin""" + + # TODO This is clearly rendering wrong. + _test_render('resources/example_cutin.gbr', 'golden/example_cutin.png') + + +def test_render_fully_coincident(): + """Umaco example of coincident lines rendering two contours""" + + _test_render('resources/example_fully_coincident.gbr', 'golden/example_fully_coincident.png') + + +def test_render_coincident_hole(): + """Umaco example of coincident lines rendering a hole in the contour""" + + _test_render('resources/example_coincident_hole.gbr', 'golden/example_coincident_hole.png') + + +def test_render_cutin_multiple(): + """Umaco example of a region with multiple cutins""" + + _test_render('resources/example_cutin_multiple.gbr', 'golden/example_cutin_multiple.png') + + +def test_flash_circle(): + """Umaco example a simple circular flash with and without a hole""" + + _test_render('resources/example_flash_circle.gbr', 'golden/example_flash_circle.png') + + +def test_flash_rectangle(): + """Umaco example a simple rectangular flash with and without a hole""" + + _test_render('resources/example_flash_rectangle.gbr', 'golden/example_flash_rectangle.png') + + +def test_flash_obround(): + """Umaco example a simple obround flash with and without a hole""" + + _test_render('resources/example_flash_obround.gbr', 'golden/example_flash_obround.png') + + +def test_flash_polygon(): + """Umaco example a simple polygon flash with and without a hole""" + + _test_render('resources/example_flash_polygon.gbr', 'golden/example_flash_polygon.png', 'golden/example_flash_polygon.png') + +def _resolve_path(path): + return os.path.join(os.path.dirname(__file__), + path) + def _test_render(gerber_path, png_expected_path, create_output_path = None): """Render the gerber file and compare to the expected PNG output. @@ -33,6 +142,11 @@ def _test_render(gerber_path, png_expected_path, create_output_path = None): This is primarily to help with """ + gerber_path = _resolve_path(gerber_path) + png_expected_path = _resolve_path(png_expected_path) + if create_output_path: + create_output_path = _resolve_path(create_output_path) + gerber = read(gerber_path) # Create PNG image to the memory stream @@ -56,3 +170,5 @@ def _test_render(gerber_path, png_expected_path, create_output_path = None): expected_bytes = expected_file.read() assert_equal(expected_bytes, actual_bytes) + + return gerber diff --git a/gerber/tests/test_primitives.py b/gerber/tests/test_primitives.py index a88497c..bc67891 100644 --- a/gerber/tests/test_primitives.py +++ b/gerber/tests/test_primitives.py @@ -236,6 +236,12 @@ def test_circle_radius(): c = Circle((1, 1), 2) assert_equal(c.radius, 1) +def test_circle_hole_radius(): + """ Test Circle primitive hole radius calculation + """ + c = Circle((1, 1), 4, 2) + assert_equal(c.hole_radius, 1) + def test_circle_bounds(): """ Test Circle bounding box calculation """ @@ -243,35 +249,81 @@ def test_circle_bounds(): assert_equal(c.bounding_box, ((0, 2), (0, 2))) def test_circle_conversion(): + """Circle conversion of units""" + # Circle initially metric, no hole c = Circle((2.54, 25.4), 254.0, units='metric') c.to_metric() #shouldn't do antyhing assert_equal(c.position, (2.54, 25.4)) assert_equal(c.diameter, 254.) + assert_equal(c.hole_diameter, 0.) c.to_inch() assert_equal(c.position, (0.1, 1.)) assert_equal(c.diameter, 10.) + assert_equal(c.hole_diameter, 0) #no effect c.to_inch() assert_equal(c.position, (0.1, 1.)) assert_equal(c.diameter, 10.) + assert_equal(c.hole_diameter, 0) + + # Circle initially metric, with hole + c = Circle((2.54, 25.4), 254.0, 127.0, units='metric') + c.to_metric() #shouldn't do antyhing + assert_equal(c.position, (2.54, 25.4)) + assert_equal(c.diameter, 254.) + assert_equal(c.hole_diameter, 127.) + + c.to_inch() + assert_equal(c.position, (0.1, 1.)) + assert_equal(c.diameter, 10.) + assert_equal(c.hole_diameter, 5.) + + #no effect + c.to_inch() + assert_equal(c.position, (0.1, 1.)) + assert_equal(c.diameter, 10.) + assert_equal(c.hole_diameter, 5.) + + # Circle initially inch, no hole c = Circle((0.1, 1.0), 10.0, units='inch') #No effect c.to_inch() assert_equal(c.position, (0.1, 1.)) assert_equal(c.diameter, 10.) + assert_equal(c.hole_diameter, 0) c.to_metric() assert_equal(c.position, (2.54, 25.4)) assert_equal(c.diameter, 254.) + assert_equal(c.hole_diameter, 0) #no effect c.to_metric() assert_equal(c.position, (2.54, 25.4)) assert_equal(c.diameter, 254.) + assert_equal(c.hole_diameter, 0) + + c = Circle((0.1, 1.0), 10.0, 5.0, units='inch') + #No effect + c.to_inch() + assert_equal(c.position, (0.1, 1.)) + assert_equal(c.diameter, 10.) + assert_equal(c.hole_diameter, 5.) + + c.to_metric() + assert_equal(c.position, (2.54, 25.4)) + assert_equal(c.diameter, 254.) + assert_equal(c.hole_diameter, 127.) + + #no effect + c.to_metric() + assert_equal(c.position, (2.54, 25.4)) + assert_equal(c.diameter, 254.) + assert_equal(c.hole_diameter, 127.) def test_circle_offset(): c = Circle((0, 0), 1) @@ -355,6 +407,15 @@ def test_rectangle_ctor(): assert_equal(r.position, pos) assert_equal(r.width, width) assert_equal(r.height, height) + +def test_rectangle_hole_radius(): + """ Test rectangle hole diameter calculation + """ + r = Rectangle((0,0), 2, 2) + assert_equal(0, r.hole_radius) + + r = Rectangle((0,0), 2, 2, 1) + assert_equal(0.5, r.hole_radius) def test_rectangle_bounds(): """ Test rectangle bounding box calculation @@ -369,6 +430,9 @@ def test_rectangle_bounds(): assert_array_almost_equal(ybounds, (-math.sqrt(2), math.sqrt(2))) def test_rectangle_conversion(): + """Test converting rectangles between units""" + + # Initially metric no hole r = Rectangle((2.54, 25.4), 254.0, 2540.0, units='metric') r.to_metric() @@ -385,7 +449,29 @@ def test_rectangle_conversion(): assert_equal(r.position, (0.1, 1.0)) assert_equal(r.width, 10.0) assert_equal(r.height, 100.0) + + # Initially metric with hole + r = Rectangle((2.54, 25.4), 254.0, 2540.0, 127.0, units='metric') + r.to_metric() + assert_equal(r.position, (2.54,25.4)) + assert_equal(r.width, 254.0) + assert_equal(r.height, 2540.0) + assert_equal(r.hole_diameter, 127.0) + + r.to_inch() + assert_equal(r.position, (0.1, 1.0)) + assert_equal(r.width, 10.0) + assert_equal(r.height, 100.0) + assert_equal(r.hole_diameter, 5.0) + + r.to_inch() + assert_equal(r.position, (0.1, 1.0)) + assert_equal(r.width, 10.0) + assert_equal(r.height, 100.0) + assert_equal(r.hole_diameter, 5.0) + + # Initially inch, no hole r = Rectangle((0.1, 1.0), 10.0, 100.0, units='inch') r.to_inch() assert_equal(r.position, (0.1, 1.0)) @@ -401,6 +487,26 @@ def test_rectangle_conversion(): assert_equal(r.position, (2.54,25.4)) assert_equal(r.width, 254.0) assert_equal(r.height, 2540.0) + + # Initially inch with hole + r = Rectangle((0.1, 1.0), 10.0, 100.0, 5.0, units='inch') + r.to_inch() + assert_equal(r.position, (0.1, 1.0)) + assert_equal(r.width, 10.0) + assert_equal(r.height, 100.0) + assert_equal(r.hole_diameter, 5.0) + + r.to_metric() + assert_equal(r.position, (2.54,25.4)) + assert_equal(r.width, 254.0) + assert_equal(r.height, 2540.0) + assert_equal(r.hole_diameter, 127.0) + + r.to_metric() + assert_equal(r.position, (2.54,25.4)) + assert_equal(r.width, 254.0) + assert_equal(r.height, 2540.0) + assert_equal(r.hole_diameter, 127.0) def test_rectangle_offset(): r = Rectangle((0, 0), 1, 2)