aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/mandel.py14
-rw-r--r--logo/vector-logo-2-BW.svg587
-rw-r--r--logo/vector-logo-2.pngbin0 -> 90783 bytes
-rw-r--r--logo/vector-logo-inkscape_master.svg1471
-rw-r--r--py/asmx64.c10
-rw-r--r--py/emit.h2
-rw-r--r--py/gc.c4
-rw-r--r--py/lexerunix.c5
-rw-r--r--py/mpconfig.h85
-rw-r--r--py/obj.h8
-rw-r--r--py/objbool.c10
-rw-r--r--py/objboundmeth.c9
-rw-r--r--py/objcell.c8
-rw-r--r--py/objclass.c9
-rw-r--r--py/objclosure.c9
-rw-r--r--py/objcomplex.c66
-rw-r--r--py/objdict.c2
-rw-r--r--py/objexcept.c9
-rw-r--r--py/objfloat.c44
-rw-r--r--py/objfun.c27
-rw-r--r--py/objgenerator.c20
-rw-r--r--py/objinstance.c8
-rw-r--r--py/objint.c1
-rw-r--r--py/objlist.c3
-rw-r--r--py/objmodule.c9
-rw-r--r--py/objnone.c1
-rw-r--r--py/objrange.c18
-rw-r--r--py/objset.c10
-rw-r--r--py/objslice.c10
-rw-r--r--py/objstr.c2
-rw-r--r--py/objtuple.c2
-rw-r--r--py/objtype.c1
-rw-r--r--py/py.mk105
-rw-r--r--py/repl.c5
-rw-r--r--py/repl.h2
-rw-r--r--py/runtime.c100
-rw-r--r--py/showbc.c4
-rw-r--r--py/vm.c2
-rw-r--r--stm/Makefile95
-rw-r--r--stm/i2c.c18
-rw-r--r--stm/led.c24
-rw-r--r--stm/led.h16
-rw-r--r--stm/main.c22
-rw-r--r--stm/mpconfigport.h6
-rw-r--r--stm/servo.c10
-rw-r--r--teensy/Makefile155
-rw-r--r--teensy/README.md31
-rw-r--r--teensy/gchelper.s36
-rw-r--r--teensy/led.c86
-rw-r--r--teensy/led.h9
-rw-r--r--teensy/lexerteensy.c33
-rw-r--r--teensy/lexerteensy.h8
-rw-r--r--teensy/main.c474
-rw-r--r--teensy/main.cpp245
-rw-r--r--teensy/malloc0.c57
-rw-r--r--teensy/mk20dx256.ld164
-rw-r--r--teensy/mpconfigport.h21
-rw-r--r--teensy/printf.c305
-rw-r--r--teensy/std.h22
-rw-r--r--teensy/string0.c110
-rw-r--r--teensy/usb.c44
-rw-r--r--teensy/usb.h9
-rw-r--r--unix-cpy/Makefile94
-rw-r--r--unix-cpy/main.c1
-rw-r--r--unix-cpy/mpconfigport.h6
-rw-r--r--unix/Makefile99
-rw-r--r--unix/main.c163
-rw-r--r--unix/mpconfigport.h6
68 files changed, 4407 insertions, 644 deletions
diff --git a/examples/mandel.py b/examples/mandel.py
new file mode 100644
index 000000000..b13b7d87f
--- /dev/null
+++ b/examples/mandel.py
@@ -0,0 +1,14 @@
+@micropython.native
+def in_set(c):
+ z = 0
+ for i in range(40):
+ z = z*z + c
+ if abs(z) > 60:
+ return False
+ return True
+
+for v in range(31):
+ line = []
+ for u in range(91):
+ line.append('*' if in_set((u / 30 - 2) + (v / 15 - 1) * 1j) else ' ')
+ print(''.join(line))
diff --git a/logo/vector-logo-2-BW.svg b/logo/vector-logo-2-BW.svg
new file mode 100644
index 000000000..d7ff920f9
--- /dev/null
+++ b/logo/vector-logo-2-BW.svg
@@ -0,0 +1,587 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="765.09448"
+ height="779.328"
+ id="svg2"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="vector-logo-BW-1.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1316"
+ inkscape:window-height="1086"
+ id="namedview127"
+ showgrid="false"
+ inkscape:zoom="1.1875869"
+ inkscape:cx="382.63129"
+ inkscape:cy="304.25291"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer3" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4981">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4983" />
+ <stop
+ style="stop-color:#616200;stop-opacity:1;"
+ offset="1"
+ id="stop4985" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4903">
+ <stop
+ style="stop-color:#c60000;stop-opacity:1;"
+ offset="0"
+ id="stop4905" />
+ <stop
+ id="stop4907"
+ offset="0.04422363"
+ style="stop-color:#ff0000;stop-opacity:1;" />
+ <stop
+ id="stop4909"
+ offset="0.36034104"
+ style="stop-color:#ff8b00;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffff00;stop-opacity:1;"
+ offset="1"
+ id="stop4911" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4873">
+ <stop
+ id="stop4875"
+ offset="0"
+ style="stop-color:#c60000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ff0000;stop-opacity:1;"
+ offset="0.38491711"
+ id="stop4877" />
+ <stop
+ style="stop-color:#ff8b00;stop-opacity:1;"
+ offset="0.77155995"
+ id="stop4879" />
+ <stop
+ id="stop4881"
+ offset="1"
+ style="stop-color:#ffff00;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4821">
+ <stop
+ style="stop-color:#c60000;stop-opacity:1;"
+ offset="0"
+ id="stop4823" />
+ <stop
+ id="stop4861"
+ offset="0.38577998"
+ style="stop-color:#ff0000;stop-opacity:1;" />
+ <stop
+ id="stop4829"
+ offset="0.77155995"
+ style="stop-color:#ff8b00;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffff00;stop-opacity:1;"
+ offset="1"
+ id="stop4825" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4809">
+ <stop
+ style="stop-color:#fa8400;stop-opacity:1;"
+ offset="0"
+ id="stop4811" />
+ <stop
+ id="stop4817"
+ offset="0.25452197"
+ style="stop-color:#fcc100;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffff00;stop-opacity:1;"
+ offset="1"
+ id="stop4813" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4344">
+ <stop
+ style="stop-color:#ef0000;stop-opacity:1;"
+ offset="0"
+ id="stop4346" />
+ <stop
+ id="stop4805"
+ offset="0.45368573"
+ style="stop-color:#f75401;stop-opacity:1;" />
+ <stop
+ style="stop-color:#fff802;stop-opacity:1;"
+ offset="1"
+ id="stop4348" />
+ </linearGradient>
+ <symbol
+ id="*Paper_Space0" />
+ <symbol
+ id="*Paper_Space" />
+ <symbol
+ id="*Model_Space" />
+ <pattern
+ height="8"
+ id="Hatch"
+ patternUnits="userSpaceOnUse"
+ width="8"
+ x="0"
+ y="0">
+ <path
+ d="M8 4 l-4,4"
+ linecap="square"
+ stroke="#000000"
+ stroke-width="0.25"
+ id="path3049" />
+ <path
+ d="M6 2 l-4,4"
+ linecap="square"
+ stroke="#000000"
+ stroke-width="0.25"
+ id="path3051" />
+ <path
+ d="M4 0 l-4,4"
+ linecap="square"
+ stroke="#000000"
+ stroke-width="0.25"
+ id="path3053" />
+ </pattern>
+ <marker
+ refX="0"
+ refY="0"
+ orient="auto"
+ id="DistanceX"
+ style="overflow:visible">
+ <path
+ d="M 3,-3 -3,3 M 0,-5 0,5"
+ id="path3046"
+ style="stroke:#000000;stroke-width:0.5" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4803"
+ x1="387.54962"
+ y1="113.39538"
+ x2="363.88544"
+ y2="299.19879"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4815"
+ x1="269.98376"
+ y1="444.30634"
+ x2="414.03595"
+ y2="496.92322"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4821"
+ id="linearGradient4839"
+ x1="279.8494"
+ y1="358.39282"
+ x2="244.67528"
+ y2="428.27463"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4821"
+ id="linearGradient4849"
+ x1="253.54097"
+ y1="412.24292"
+ x2="231.52107"
+ y2="464.03766"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4821"
+ id="linearGradient4859"
+ x1="452.4986"
+ y1="352.22678"
+ x2="493.78342"
+ y2="414.70935"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4871"
+ x1="474.69635"
+ y1="404.02155"
+ x2="514.33685"
+ y2="463.21555"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4891"
+ x1="417.96875"
+ y1="360.03708"
+ x2="341.68771"
+ y2="375.65771"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4903"
+ id="radialGradient4901"
+ cx="434.08942"
+ cy="495.59387"
+ fx="434.08942"
+ fy="495.59387"
+ r="50.650486"
+ gradientTransform="matrix(1.2124098,-0.04331903,0.00527986,0.14777225,-94.821533,430.98259)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4921"
+ x1="588.93628"
+ y1="413.79886"
+ x2="502.7338"
+ y2="489.19949"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4903"
+ id="linearGradient4931"
+ x1="166.69272"
+ y1="412.81537"
+ x2="220.14532"
+ y2="492.14993"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4941"
+ x1="221.63501"
+ y1="537.67871"
+ x2="212.0386"
+ y2="581.11884"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4951"
+ x1="525.33746"
+ y1="548.20868"
+ x2="535.51666"
+ y2="594.10468"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4961"
+ x1="206.68782"
+ y1="476.74197"
+ x2="188.67377"
+ y2="567.22272"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4977"
+ x1="515.50256"
+ y1="496.73953"
+ x2="534.86096"
+ y2="564.27228"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4997"
+ x1="162.10312"
+ y1="552.79834"
+ x2="165.07007"
+ y2="570.50104"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5007"
+ x1="194.88599"
+ y1="636.06677"
+ x2="188.0181"
+ y2="617.05273"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5017"
+ x1="271.59793"
+ y1="628.52673"
+ x2="300.13556"
+ y2="626.55975"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5027"
+ x1="469.60657"
+ y1="643.60687"
+ x2="469.95093"
+ y2="601.64478"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5037"
+ x1="517.4696"
+ y1="651.47473"
+ x2="515.84698"
+ y2="600.98907"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5047"
+ x1="270.94226"
+ y1="667.21051"
+ x2="273.90927"
+ y2="601.64478"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="g3058"
+ transform="translate(10.5,-283.5375)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="work"
+ style="display:inline">
+ <path
+ d="m 454.71085,42.269961 c -1.84306,-4.16383 -8.01725,-8.0321 -10.56009,-8.00789 -2.54283,0.0242 -6.85424,-1.17464 -5.27554,-5.5465 1.5787,-4.37185 7.70455,-4.42682 10.36862,-3.40045 2.66408,1.02637 8.60663,3.31382 10.67443,17.60551 2.0678,14.29168 -3.36437,3.51316 -5.20742,-0.65067 z"
+ id="path3072-7"
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zzzzzz" />
+ <path
+ d="m 376.90653,28.503352 c -4.55875,2.209186 -5.68635,-4.51432 -3.82908,-7.783822 1.85727,-3.269502 7.61779,-7.338561 11.18656,-8.748148 3.56877,-1.409587 7.0703,-1.282096 7.84101,0.66902 -0.69594,7.238184 -10.63974,13.653764 -15.19849,15.86295 z"
+ id="path3070-4"
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zzzcz" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ d="m 403.00043,144.27939 c 4.82135,0.33482 12.51176,-7.97481 11.47067,-15.50764 -1.04109,-7.53282 -5.44177,-13.47845 -11.01274,-13.50791 -5.57097,-0.0295 -13.08577,7.35435 -11.63515,14.13061 0.51844,2.59416 1.94883,8.72762 4.71599,5.74451 3.28523,-0.66156 0.59669,-2.45848 2.46895,-6.60993 0.84584,-1.49606 3.82062,-1.93456 5.14537,-0.32025 1.32475,1.61431 1.77634,5.60243 -1.5359,7.25691 -2.05971,0.74048 -3.01527,-1.474 -5.65724,0.71791 -2.64197,2.19191 3.30447,8.07516 6.04005,8.09579 z"
+ id="path3066-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czzccczczc" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ d="m 376.55272,127.26886 c -1.7364,0.68278 -2.36572,4.04539 -0.81525,5.89961 1.43203,1.71258 4.93182,0.31723 5.56335,2.97696 2.88715,2.89045 -3.88391,5.71124 -6.32342,4.6879 -7.56769,-1.97924 -11.14524,-14.48231 -6.5713,-23.62082 6.45515,-8.40383 14.45784,-6.27094 18.5915,0.0414 2.09136,3.25743 3.09899,7.58994 2.16742,11.37571 -0.95226,2.46814 -1.37316,6.89393 -5.31942,7.45248 -0.4445,-1.6504 -3.25454,-1.51236 -1.81483,-3.27307 1.63819,-2.00345 0.66929,-3.60155 -0.11497,-4.90747 -0.99007,-1.64863 -3.62668,-1.31548 -5.36308,-0.6327 z"
+ id="path3068-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zsccccccssz" />
+ <path
+ id="path4649"
+ style="fill:#000000;display:inline"
+ d="m 14.658212,571.87891 132.584628,-61.6619 -6.07018,-18.06946 c -2.88978,-8.60218 -1.76874,-23.61644 7.17673,-32.71776 8.94548,-9.10131 11.5393,-10.67252 11.5393,-10.67252 0,0 0.54727,-10.45307 0.54727,-17.46859 0,-17.1284 3.33975,-27.5856 11.93957,-37.38339 5.5019,-6.26838 21.51726,-12.9533 28.20968,-13.83449 4.85197,-0.63886 8.61903,-0.34111 15.53938,1.66667 -0.12917,-4.16054 0.587,-8.90949 2.98755,-13.61296 6.539,-12.81204 13.21525,-17.88639 25.329,-19.25177 8.84468,-0.99693 13.77411,0.35925 28.90302,7.95165 10.03175,5.03446 21.3543,11.19832 24.99504,13.92565 4.01538,3.00798 6.20949,5.2793 10.2812,7.07677 2.41013,-3.60268 6.94338,-10.5171 10.95422,-17.57461 2.33429,-4.10744 10.37611,-17.13568 13.53048,-21.85455 1.57719,-2.35944 6.41985,-8.37195 6.41985,-8.37195 0,0 -1.31142,-8.12758 -0.88067,-12.36731 0.58935,-5.80072 0.97428,-7.57349 4.83184,-12.3627 -3.77939,-2.14565 -3.08319,-1.41947 -7.08681,-3.94365 -20.25239,-12.76862 -34.16873,-27.84627 -40.15509,-56.30446 -5.10584,-24.27216 -4.4007,-41.40703 2.45205,-67.21417 7.7036,-29.01143 15.18952,-45.36816 29.55351,-59.03876 14.92537,-11.0627 12.43198,-2.04001 13.59689,-19.366352 0.91324,-13.583101 11.8782,-40.347468 29.45422,-53.60083 9.58947,-7.231026 21.97858,-3.80485 29.59099,6.499002 10.53054,14.253709 0.17853,14.404082 17.63051,6.752714 20.86592,-9.148123 32.54883,23.523546 33.42248,37.14046 1.05673,16.470376 -1.16843,26.010386 -2.86333,33.904326 4.07154,3.62047 2.58248,1.74759 10.76968,11.51853 8.3892,10.012 12.1486,33.75453 11.34494,62.78361 -0.94573,34.16092 -9.95422,79.26151 -18.82188,96.91198 -7.28684,14.50413 -24.53772,51.74222 -33.64333,81.36391 7.04951,-6.89289 20.03619,-17.09193 31.68777,-23.60977 19.57067,-10.94775 35.86826,-17.6548 52.92838,-23.0765 14.60926,-4.27271 23.92007,0.94007 28.81773,14.86833 l 2.78896,8.35016 14.37056,-0.70574 c 12.36244,-0.6071 16.19906,0.35898 27.45466,6.91325 10.81349,6.29685 14.16725,9.98514 19.32611,21.25359 5.56944,12.16516 6.09614,15.76469 4.8874,33.4003 l -1.35481,19.76574 10.91438,9.60721 c 16.75872,14.75164 25.36378,34.92912 25.42245,59.61145 -0.50196,4.11911 -0.21508,4.42147 -0.93671,9.20235 38.87789,17.76784 115.57654,54.01999 115.57654,54.01999 L 382.42702,706.07474 z m 370.564338,17.77562 c 9.05475,-2.46466 13.58602,-7.58834 18.33472,-10.80361 -10.97449,-12.30208 -18.65245,-25.92708 -26.74569,-45.63149 -4.82799,4.2971 -6.82318,5.90884 -14.22414,10.22159 -13.42149,7.82108 -23.29409,12.77694 -57.4254,4.90126 -6.20655,-1.43214 -10.39595,-5.23376 -17.19163,-10.18726 3.19112,8.85178 13.86295,22.82829 20.52994,29.96884 9.60429,2.44089 16.74117,5.22791 37.62625,4.98794 20.88508,-0.23997 27.9957,-7.12402 28.16531,-6.11681 1.46865,8.72131 -10.15732,15.08153 -17.76404,15.8875 -28.685,3.03932 -35.00933,-2.21337 -14.62245,8.09979 5.86099,2.96492 34.26238,1.13691 43.31713,-1.32775 z m -80.78275,-2.78657 c -0.89959,-3.50631 -9.45553,-13.31314 -16.50253,-22.41247 -12.72217,0.86257 -31.67329,-0.15844 -50.36917,-1.39061 1.28995,5.05783 2.66671,9.35459 8.01513,16.24454 21.31675,7.41613 29.38807,8.69456 58.85657,7.55854 z m 196.55253,-1.05658 c 7.48368,-7.7352 12.59399,-14.06394 14.48282,-24.0163 -9.86035,0.32816 -31.29112,-0.21889 -43.67612,-1.59123 -2.69192,9.78937 -7.53001,16.5494 -12.60926,27.22235 15.18807,0.0987 34.6126,-0.34167 41.80256,-1.61482 z m -39.5462,-25.77116 c -14.22026,-1.04341 -24.64197,-1.70322 -34.91073,-5.06032 1.48042,5.45477 11.46978,23.84715 21.5113,29.43516 8.27915,-6.74863 11.17085,-18.04429 13.39943,-24.37484 z m 89.8385,17.75618 c 11.06658,-12.35693 10.92734,-17.54469 12.64857,-22.88767 -11.30062,3.12506 -19.72285,3.93232 -32.57321,6.37359 -1.89748,6.90764 -8.91109,16.08982 -13.29931,23.08728 10.8857,-1.22697 19.80754,-2.14697 33.22395,-6.5732 z m -317.64736,-1.93287 c -3.6673,-5.08173 -5.86306,-11.13515 -7.03993,-15.06225 -9.55859,-2.04306 -25.015,-11.46938 -36.15974,-15.65039 -0.84013,3.61202 0.47555,6.43514 1.89431,9.82309 3.08034,2.34947 5.43298,4.84837 12.48233,8.01965 11.52918,5.18662 18.20624,9.12314 28.82303,12.8699 z m 186.64301,-6.91909 c 0,-1.28295 -3.83994,-11.06621 -8.53319,-21.74059 -12.64973,-28.77081 -15.90521,-45.89651 -15.92698,-83.78673 -0.0252,-43.63944 7.06295,-74.30199 28.38761,-122.803 12.2828,-27.93634 24.14205,-48.33846 31.75211,-88.421 -6.5755,13.7585 -12.42832,19.89196 -19.64511,27.05989 -21.77232,21.62492 -35.43644,26.31219 -52.19205,28.77556 -10.17306,1.49562 -14.72264,2.13603 -24.70943,1.96892 -2.20297,3.58807 -4.85267,2.59811 -6.46175,8.54423 7.20281,-3.74693 18.38353,-7.60728 30.32987,-0.36061 13.17431,13.17431 13.24085,43.09586 0.21129,95.05167 -9.8248,39.17692 -10.19364,71.64538 -1.16772,102.79178 6.95963,24.01643 12.71354,36.38943 22.12232,47.57108 6.06993,7.21372 15.83313,10.51196 15.83313,5.3488 z m 171.97615,-4.87721 c 13.62786,-7.80295 31.09463,-25.81562 31.4869,-37.0782 l 0.58746,-16.86667 c 0,0 -3.33814,8.50328 -11.45734,16.98325 -8.1192,8.47997 -26.38286,19.25438 -30.88292,21.72921 -0.59939,9.46563 -4.06332,14.42941 -11.30069,24.85736 9.79893,-3.37732 9.75496,-2.86192 21.56659,-9.62495 z m -399.08628,2.32889 c -9.51845,-4.1386 -13.88481,-11.58962 -21.31996,-16.28929 -24.47145,0 -34.7761,15.07859 -41.53164,27.12964 17.4467,-7.24642 26.52906,-13.51756 62.8516,-10.84035 z m 89.61415,-12.03996 c -2.96659,-6.9594 -8.5975,-16.20369 -10.65302,-24.42661 -3.32741,-13.53845 -4.3118,-22.83307 -5.06108,-33.41904 l -18.6361,-1.69054 c -31.57594,-2.86434 -59.06629,-14.64122 -75.55586,-32.36812 -3.26858,-3.51386 -5.96093,-5.2139 -9.24658,-6.38882 -8.83027,1.85899 -18.19769,18.97121 -17.02277,27.01586 1.72967,11.84307 9.77201,29.61721 24.56626,41.34153 29.28013,23.2043 51.68723,28.03568 82.41647,30.05478 2.27989,0.18213 20.99745,0.37832 29.19268,-0.11904 z m 264.96688,-7.59969 c 33.17591,-8.05353 46.3337,-14.29038 61.72491,-29.25789 11.72243,-11.39971 11.62368,-12.00816 13.38605,-19.93479 -1.76237,-24.37548 -10.99587,-32.58734 -21.33375,-43.1616 -7.10687,5.87459 -13.24631,10.18619 -26.84018,17.60995 -31.82211,17.37834 -38.09788,19.98117 -66.15889,27.43875 -24.8411,6.60186 -60.30618,8.65945 -85.18479,4.94212 -7.56759,-1.13074 -9.34913,-1.85205 -13.95251,-3.79109 0.68374,8.63522 7.02657,30.89277 10.82601,41.77378 5.85555,2.06914 18.69644,5.78501 34.4079,7.46 28.99254,3.09087 68.65671,2.86054 93.12525,-3.07923 z m -365.96517,-6.98934 c -5.0073,-3.79319 -15.04979,-12.14598 -26.38792,-21.11757 6.87309,9.82709 12.8483,20.9029 25.99019,29.94259 -0.31926,-1.74227 -1.30034,-6.15635 0.39773,-8.82502 z m 174.38151,-1.39223 c 8.72133,-4.41943 14.88236,-9.7945 17.9439,-12.18733 -0.16949,-5.33012 -1.96982,-10.02782 -3.00289,-16.61725 -5.90678,-37.67641 -6.18805,-69.1294 7.50831,-116.04264 2.5688,-8.79876 5.75412,-45.31512 1.84029,-56.21297 -4.15354,-11.56552 -8.69358,-14.90016 -17.33371,-12.7316 -5.78093,1.45094 -5.51517,0.17011 -11.73672,5.14607 1.0504,7.27539 1.10708,15.71047 6.08564,25.05696 12.61234,23.67774 10.04037,24.96125 6.07567,37.49464 -0.80298,2.53841 -1.39124,6.08864 -4.82329,7.33709 -3.15456,1.14751 -1.8964,-5.88138 0.0582,-12.92767 0.60282,-2.17313 2.32281,-7.87334 1.10528,-10.03655 -5.37151,6.5601 -6.42148,9.38748 -15.06036,13.65848 -5.32605,2.63316 -11.99257,1.71174 -0.30128,-5.9013 7.61084,-4.95596 10.77639,-10.24385 10.46707,-14.34625 -0.19426,-2.57633 -3.44437,-6.27437 -5.1785,-10.15885 -2.95007,-6.60823 -5.00615,-11.70751 -6.65592,-18.64964 -3.20086,3.77493 -5.80141,7.7042 -9.13729,13.97818 6.84133,7.31246 20.83987,10.94638 11.58225,12.67671 -3.45945,0.64661 -9.07768,-1.13387 -16.27078,-5.30088 -2.41603,3.72551 -4.24198,6.80353 -6.5319,10.81176 -2.28992,4.00822 -4.12029,6.94889 -5.67048,10.8996 6.96825,5.81107 15.45195,13.68903 26.17377,16.60289 10.72182,2.91386 11.93048,1.81646 22.97428,2.92452 8.08128,5.08204 -1.31616,6.05381 -11.71739,5.63634 -7.72997,-10e-4 -16.68583,-2.45555 -27.3221,-7.48731 l -15.82285,-7.48536 c 0,0 -3.06581,4.00289 -5.03127,7.72575 -1.96547,3.72286 -3.65744,5.08829 -8.51011,14.63572 5.39938,8.24057 21.38867,17.40027 34.0222,21.44203 15.60992,4.99399 29.77899,-0.61753 20.03332,8.24165 -4.77168,3.11205 -23.06532,0.34123 -36.22874,-4.79739 -8.4245,-3.28868 -19.18735,-8.49378 -24.61997,-12.59132 -5.53498,12.6329 -11.68573,26.99993 -12.28004,37.31432 6.18795,5.30367 11.08101,8.82246 19.05566,13.46691 7.97464,4.64445 21.23563,8.43556 38.12535,9.28723 8.06886,0.40688 26.8554,-2.79414 19.3361,6.04739 -2.78905,4.51264 -40.55852,2.69964 -55.15569,-2.64757 -12.63477,-4.62834 -18.39389,-7.79019 -22.54456,-9.32048 0.87979,14.6001 0.83026,23.60031 4.89448,36.52707 6.47504,8.03684 11.89338,12.51719 20.9989,18.3279 9.36449,5.97597 36.47534,8.40209 52.65514,0.20322 z m 71.04877,-46.86676 c 2.01191,-4.81899 3.55163,-8.01603 2.84173,-13.05158 -8.64059,-0.0422 -14.24253,-0.23689 -22.38977,-0.63094 0.0772,2.83697 -1.21774,5.73561 0.71057,12.63131 6.62798,0.13993 10.95098,0.8768 18.83747,1.05121 z m 60.69911,-17.42006 c -16.72593,3.26065 -31.86913,4.08213 -47.43678,5.19683 0,6.69555 0.89777,8.55515 -2.39691,14.13601 15.50399,-0.88119 27.14231,-0.37451 43.43305,-3.92524 4.34288,-2.54075 4.81198,-9.06671 6.40064,-15.4076 z m -222.03564,12.70347 c -0.97306,-3.81428 -0.25243,-6.58413 -1.12863,-9.70076 -8.25005,-1.12617 -21.49922,-3.43658 -33.54337,-8.6327 -0.88242,5.9656 -1.14728,11.10158 -0.75873,13.11902 9.66693,2.79108 23.72921,6.39833 35.43073,5.21444 z m 278.8326,-17.63462 c 0,-7.11998 -0.59369,-10.11696 -1.21216,-16.9789 -16.77359,7.82453 -31.16323,15.51069 -41.44376,18.24206 0,5.08121 1.52729,9.81275 -1.36723,16.17841 15.99663,-4.76599 30.24741,-9.57801 44.02315,-17.44157 z m -320.05512,-3.74728 c -11.74917,-6.64801 -19.20995,-8.74125 -29.3989,-17.90926 -0.896,4.75835 -2.84738,10.8932 -2.41728,16.52949 6.3047,5.34257 17.04699,11.94895 30.08288,14.71307 -0.70178,-6.82655 1.7333,-7.60222 1.7333,-13.3333 z m 231.16785,3.04374 c 32.71147,-1.72578 82.63308,-20.13988 112.14976,-46.77174 13.17222,-11.88483 14.16734,-16.48227 19.19028,-22.58022 -6.72623,-21.95934 -23.10937,-30.88619 -52.47628,-27.09337 -9.09958,10.84233 -11.42188,13.14169 -16.90851,17.78987 -20.06442,16.99825 -48.82085,30.62251 -68.78212,33.08945 -22.75093,2.81168 -32.65783,5.24837 -42.09969,3.98007 -1.17151,4.45359 -1.48486,28.22713 -1.26376,44.07058 10.50162,0.56952 12.36516,-0.48907 50.19032,-2.48464 z M 276.78384,433.68138 c -5.90367,-1.70236 -10.37843,-3.21456 -16.13577,-5.74862 -15.74008,-6.92788 -28.01105,-15.33626 -33.173,-22.50945 -3.16903,-4.40378 -8.3879,-10.85021 -11.14489,-16.58687 -3.93192,0.43165 -10.05094,-1.75702 -17.22847,0.008 -6.31534,1.55334 -16.02671,5.22627 -20.65262,12.28631 -5.25291,8.01696 -2.99984,14.67589 9.95705,29.42833 12.17383,13.86092 39.39341,27.4351 59.05309,34.39284 6.52626,2.3097 9.85362,2.60604 18.12668,4.80988 3.41262,-16.06779 7.58035,-27.1149 11.19793,-36.08081 z m 283.10033,27.17019 c 5.65583,-4.52247 19.05654,-17.6262 23.46248,-26.93841 1.46865,-4.61255 2.31492,-7.43835 2.46148,-13.53036 -8.07785,7.41954 -20.69954,19.4848 -28.24204,23.45757 1.26938,4.85395 2.24311,9.49077 2.31808,17.0112 z M 184.06726,436.45411 c -5.42113,-2.75384 -11.20479,-11.96506 -13.69948,-17.54592 -1.6802,10.28053 -2.84362,14.68142 -1.40535,25.23377 7.60658,5.55895 8.95679,8.0796 13.34246,9.936 z m 111.11253,-33.62532 c 3.68104,-5.90159 6.65065,-12.22571 9.51435,-18.0567 -5.74197,-4.83069 -18.72997,-12.23804 -28.86211,-17.79891 -16.4056,-9.0039 -20.24108,-11.70929 -30.26022,-10.37712 -13.02685,1.73206 -18.94914,10.62343 -18.94914,21.41668 0,16.10626 13.17906,29.86637 38.4375,40.13216 9.06503,3.68432 10.64355,4.38638 16.35224,5.95632 6.22307,-8.82933 9.1123,-13.80922 13.76738,-21.27243 z m 161.6848,5.12952 c 22.63107,-8.51735 49.20882,-22.61083 57.1498,-29.78111 12.96065,-11.70277 10.3598,-33.89411 -1.2579,-33.89411 -6.87273,0 -35.40483,13.00679 -52.90578,22.56803 -26.8587,14.67371 -44.8684,28.7812 -50.74299,49.79679 7.93069,-0.13292 5.46088,0.55312 17.91385,-1.00227 7.75246,-0.96829 21.18181,-4.42758 29.84302,-7.68733 z M 403.62471,290.55367 c 15.61963,-7.12645 32.55171,-23.65944 39.6446,-37.37571 12.67211,-24.50505 17.08482,-40.94985 16.96043,-63.20656 -0.0988,-17.66936 -2.22983,-25.37692 -5.96578,-33.79573 -9.34193,-21.0517 -8.93615,-12.72592 -15.57631,-3.23371 -14.59385,20.86213 -25.17757,13.93615 -36.67009,5.72186 -12.40144,-8.86396 -6.23357,-6.35803 -19.06466,0.05 -10.03859,5.01338 -13.74028,3.70353 -21.34972,-1.0759 -7.60944,-4.77943 -13.66344,-10.00271 -17.2088,-22.09047 -3.85578,-13.14613 -1.7647,-12.74535 -13.09418,-4.84192 -22.98228,27.70184 -38.47232,103.39088 -11.78054,141.46771 17.53828,25.01903 50.94648,33.50906 84.10505,18.38046 z m -22.89229,-9.68061 c -0.21982,-1.04433 1.6154,-9.17646 0.20423,-15.5132 -2.91746,-13.10058 8.70009,-13.55304 9.43196,-2.81046 1.2534,10.76354 -4.37091,22.85472 -9.04883,21.11409 z m -59.56637,-9.07044 c -2.51607,-2.51606 -0.85951,-14.85117 2.02722,-20.245 4.60766,-6.8664 8.89219,-5.26144 5.61435,6.27018 1.88143,9.69023 -0.006,17.33132 -7.64157,13.97482 z M 431.99283,146.54508 c 2.86718,-3.05194 6.92032,-9.6352 9.00707,-14.62943 4.82046,-11.53709 4.95806,-40.928499 0.24435,-52.209975 -6.78957,-16.249808 -23.78528,-17.542624 -33.31908,-5.504293 -5.48703,6.928474 -9.40835,16.546333 -12.07927,10.371084 -1.06188,-2.4551 0.23568,-4.730687 1.46773,-7.857746 6.92011,-17.56393 -1.81554,-22.981026 -11.86101,-23.661753 -6.53281,-0.442693 -12.25518,2.972328 -20.24769,11.040967 -9.70032,9.792702 -17.78524,27.905126 -17.78524,49.330526 0,14.08222 3.45321,21.10568 9.27614,26.51831 5.82293,5.41263 11.49057,9.62395 19.23768,9.61982 7.74711,-0.004 9.08725,-5.01839 17.23334,-6.36358 6.95308,3.23098 9.89267,10.46839 22.51112,11.10913 8.72012,0.44279 12.75849,-3.97736 16.31486,-7.76298 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsscssscsssscsscscssscssssscssscscccsssscscccccsccssccssssscccccccccccccccccccccccsccssscsscccsssccsscsccscccccccsscssccssccsssccssccccccsssscsssscssssccscscsccscscscsccsscsccscccccccccccccccccccccccccccssccssccscssccssscccccccccccccscsssscssssscsscsssssssscsccssccscccccsssssssssccscc" />
+ <path
+ d="m 750.58773,574.76657 0,56.09559 L 382.54724,764.8179 14.50676,630.86216 l 0,-56.61975 368.34752,133.55687 z"
+ id="path3354-2"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <g
+ transform="translate(0,2.9296876e-6)"
+ id="g5049-8"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline">
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3290-6"
+ d="m 321.48422,721.5392 -22.36609,12.913 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3292-0"
+ d="m 75.569784,632.03363 -22.366085,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3294-1"
+ d="m 305.08992,715.57213 -22.36608,12.91307 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3296-2"
+ d="m 288.69563,709.6051 -22.36609,12.9131 0,30.0332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3298-6"
+ d="m 272.30133,703.63806 -22.36608,12.91304 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3300-0"
+ d="m 255.90704,697.67102 -22.36609,12.91307 0,30.03331" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3302-5"
+ d="m 239.51274,691.70399 -22.36608,12.91306 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3304-4"
+ d="m 223.11845,685.73695 -22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3306-6"
+ d="m 206.72415,679.76992 -22.36609,12.91306 0,30.03332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3308-7"
+ d="m 190.32985,673.80288 -22.36608,12.91307 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3310-9"
+ d="m 173.93556,667.83585 -22.36609,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3312-3"
+ d="m 157.54126,661.86881 -22.36608,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3314-4"
+ d="m 141.14697,655.90177 -22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3316-7"
+ d="m 124.75267,649.93474 -22.36608,12.91306 0,30.03329" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3318-8"
+ d="m 108.35837,643.9677 -22.36608,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3320-8"
+ d="m 91.96408,638.00067 -22.366085,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3322-1"
+ d="m 443.61027,721.5392 22.36608,12.913 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3324-6"
+ d="m 476.39886,709.6051 22.36608,12.9131 0,30.0332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3326-3"
+ d="m 460.00456,715.57213 22.36609,12.91307 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3328-8"
+ d="m 525.58175,691.70399 22.36608,12.91306 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3330-7"
+ d="m 509.18745,697.67102 22.36609,12.91307 0,30.03331" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3332-6"
+ d="m 492.79316,703.63806 22.36608,12.91304 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3334-1"
+ d="m 558.37034,679.76992 22.36608,12.91306 0,30.03332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3336-7"
+ d="m 541.97604,685.73695 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3338-2"
+ d="m 607.55322,661.86881 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3340-3"
+ d="m 574.76463,673.80288 22.36609,12.91307 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3342-7"
+ d="m 591.15893,667.83585 22.36609,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3344-8"
+ d="m 689.5247,632.03363 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3346-5"
+ d="m 623.94752,655.90177 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3348-8"
+ d="m 640.34182,649.93474 22.36608,12.91306 0,30.03329" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3350-5"
+ d="m 656.73611,643.9677 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3352-8"
+ d="m 673.13041,638.00067 22.36608,12.91306 0,30.03328" />
+ </g>
+ </g>
+</svg>
diff --git a/logo/vector-logo-2.png b/logo/vector-logo-2.png
new file mode 100644
index 000000000..3ad2383ff
--- /dev/null
+++ b/logo/vector-logo-2.png
Binary files differ
diff --git a/logo/vector-logo-inkscape_master.svg b/logo/vector-logo-inkscape_master.svg
new file mode 100644
index 000000000..19415d41b
--- /dev/null
+++ b/logo/vector-logo-inkscape_master.svg
@@ -0,0 +1,1471 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="765.09448"
+ height="779.328"
+ id="svg2"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="vector-logo-inkscape_master.svg"
+ inkscape:export-filename="R:\Mark_Sector\!!Projects-2\microPython\Logo\vector-logo-4.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1609"
+ inkscape:window-height="1086"
+ id="namedview127"
+ showgrid="false"
+ inkscape:zoom="1.1668212"
+ inkscape:cx="347.36024"
+ inkscape:cy="357.11268"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer6" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4981">
+ <stop
+ style="stop-color:#370000;stop-opacity:1;"
+ offset="0"
+ id="stop4983" />
+ <stop
+ style="stop-color:#616200;stop-opacity:1;"
+ offset="1"
+ id="stop4985" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4903">
+ <stop
+ style="stop-color:#c60000;stop-opacity:1;"
+ offset="0"
+ id="stop4905" />
+ <stop
+ id="stop4907"
+ offset="0.04422363"
+ style="stop-color:#ff0000;stop-opacity:1;" />
+ <stop
+ id="stop4909"
+ offset="0.36034104"
+ style="stop-color:#ff8b00;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffff00;stop-opacity:1;"
+ offset="1"
+ id="stop4911" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4873">
+ <stop
+ id="stop4875"
+ offset="0"
+ style="stop-color:#c60000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ff0000;stop-opacity:1;"
+ offset="0.38491711"
+ id="stop4877" />
+ <stop
+ style="stop-color:#ff8b00;stop-opacity:1;"
+ offset="0.77155995"
+ id="stop4879" />
+ <stop
+ id="stop4881"
+ offset="1"
+ style="stop-color:#ffff00;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4821">
+ <stop
+ style="stop-color:#c60000;stop-opacity:1;"
+ offset="0"
+ id="stop4823" />
+ <stop
+ id="stop4861"
+ offset="0.38577998"
+ style="stop-color:#ff0000;stop-opacity:1;" />
+ <stop
+ id="stop4829"
+ offset="0.77155995"
+ style="stop-color:#ff8b00;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffff00;stop-opacity:1;"
+ offset="1"
+ id="stop4825" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4809">
+ <stop
+ style="stop-color:#fa8400;stop-opacity:1;"
+ offset="0"
+ id="stop4811" />
+ <stop
+ id="stop4817"
+ offset="0.25452197"
+ style="stop-color:#fcc100;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffff00;stop-opacity:1;"
+ offset="1"
+ id="stop4813" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4344">
+ <stop
+ style="stop-color:#ef0000;stop-opacity:1;"
+ offset="0"
+ id="stop4346" />
+ <stop
+ id="stop4805"
+ offset="0.45368573"
+ style="stop-color:#f75401;stop-opacity:1;" />
+ <stop
+ style="stop-color:#fff802;stop-opacity:1;"
+ offset="1"
+ id="stop4348" />
+ </linearGradient>
+ <symbol
+ id="*Paper_Space0" />
+ <symbol
+ id="*Paper_Space" />
+ <symbol
+ id="*Model_Space" />
+ <pattern
+ height="8"
+ id="Hatch"
+ patternUnits="userSpaceOnUse"
+ width="8"
+ x="0"
+ y="0">
+ <path
+ d="M8 4 l-4,4"
+ linecap="square"
+ stroke="#000000"
+ stroke-width="0.25"
+ id="path3049" />
+ <path
+ d="M6 2 l-4,4"
+ linecap="square"
+ stroke="#000000"
+ stroke-width="0.25"
+ id="path3051" />
+ <path
+ d="M4 0 l-4,4"
+ linecap="square"
+ stroke="#000000"
+ stroke-width="0.25"
+ id="path3053" />
+ </pattern>
+ <marker
+ refX="0"
+ refY="0"
+ orient="auto"
+ id="DistanceX"
+ style="overflow:visible">
+ <path
+ d="M 3,-3 -3,3 M 0,-5 0,5"
+ id="path3046"
+ style="stroke:#000000;stroke-width:0.5" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4803"
+ x1="387.54962"
+ y1="113.39538"
+ x2="363.88544"
+ y2="299.19879"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4815"
+ x1="269.98376"
+ y1="444.30634"
+ x2="414.03595"
+ y2="496.92322"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4821"
+ id="linearGradient4839"
+ x1="279.8494"
+ y1="358.39282"
+ x2="244.67528"
+ y2="428.27463"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4821"
+ id="linearGradient4849"
+ x1="253.54097"
+ y1="412.24292"
+ x2="231.52107"
+ y2="464.03766"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4821"
+ id="linearGradient4859"
+ x1="452.4986"
+ y1="352.22678"
+ x2="493.78342"
+ y2="414.70935"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4871"
+ x1="474.69635"
+ y1="404.02155"
+ x2="514.33685"
+ y2="463.21555"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4891"
+ x1="417.96875"
+ y1="360.03708"
+ x2="341.68771"
+ y2="375.65771"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4903"
+ id="radialGradient4901"
+ cx="434.08942"
+ cy="495.59387"
+ fx="434.08942"
+ fy="495.59387"
+ r="50.650486"
+ gradientTransform="matrix(1.2124098,-0.04331903,0.00527986,0.14777225,-94.821533,430.98259)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4921"
+ x1="588.93628"
+ y1="413.79886"
+ x2="502.7338"
+ y2="489.19949"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4903"
+ id="linearGradient4931"
+ x1="166.69272"
+ y1="412.81537"
+ x2="220.14532"
+ y2="492.14993"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4941"
+ x1="221.63501"
+ y1="537.67871"
+ x2="212.0386"
+ y2="581.11884"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4809"
+ id="linearGradient4951"
+ x1="525.33746"
+ y1="548.20868"
+ x2="535.51666"
+ y2="594.10468"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4961"
+ x1="206.68782"
+ y1="476.74197"
+ x2="188.67377"
+ y2="567.22272"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4977"
+ x1="515.50256"
+ y1="496.73953"
+ x2="534.86096"
+ y2="564.27228"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4873"
+ id="linearGradient4997"
+ x1="162.10312"
+ y1="552.79834"
+ x2="165.07007"
+ y2="570.50104"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5007"
+ x1="194.88599"
+ y1="636.06677"
+ x2="188.0181"
+ y2="617.05273"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5017"
+ x1="271.59793"
+ y1="628.52673"
+ x2="300.13556"
+ y2="626.55975"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5027"
+ x1="469.60657"
+ y1="643.60687"
+ x2="469.95093"
+ y2="601.64478"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5037"
+ x1="517.4696"
+ y1="651.47473"
+ x2="515.84698"
+ y2="600.98907"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4981"
+ id="linearGradient5047"
+ x1="270.94226"
+ y1="667.21051"
+ x2="273.90927"
+ y2="601.64478"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="g3058"
+ transform="translate(10.5,-283.5375)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="BW art"
+ style="display:none">
+ <path
+ d="m 454.71085,42.269964 c -1.84306,-4.16383 -8.01725,-8.0321 -10.56009,-8.00789 -2.54283,0.0242 -6.85424,-1.17464 -5.27554,-5.5465 1.5787,-4.37185 7.70455,-4.42682 10.36862,-3.40045 2.66408,1.02637 8.60663,3.31382 10.67443,17.60551 2.0678,14.29168 -3.36437,3.51316 -5.20742,-0.65067 z"
+ id="path3072-7-6"
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zzzzzz" />
+ <path
+ d="m 376.90653,28.503355 c -4.55875,2.209186 -5.68635,-4.51432 -3.82908,-7.783822 1.85727,-3.269502 7.61779,-7.338561 11.18656,-8.748148 3.56877,-1.409587 7.0703,-1.282096 7.84101,0.66902 -0.69594,7.238184 -10.63974,13.653764 -15.19849,15.86295 z"
+ id="path3070-4-5"
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zzzcz" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ d="m 403.00043,144.27939 c 4.82135,0.33482 12.51176,-7.97481 11.47067,-15.50764 -1.04109,-7.53282 -5.44177,-13.47845 -11.01274,-13.50791 -5.57097,-0.0295 -13.08577,7.35435 -11.63515,14.13061 0.51844,2.59416 1.94883,8.72762 4.71599,5.74451 3.28523,-0.66156 0.59669,-2.45848 2.46895,-6.60993 0.84584,-1.49606 3.82062,-1.93456 5.14537,-0.32025 1.32475,1.61431 1.77634,5.60243 -1.5359,7.25691 -2.05971,0.74048 -3.01527,-1.474 -5.65724,0.71791 -2.64197,2.19191 3.30447,8.07516 6.04005,8.09579 z"
+ id="path3066-0-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czzccczczc" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ d="m 376.55272,127.26886 c -1.7364,0.68278 -2.36572,4.04539 -0.81525,5.89961 1.43203,1.71258 4.93182,0.31723 5.56335,2.97696 2.88715,2.89045 -3.88391,5.71124 -6.32342,4.6879 -7.56769,-1.97924 -11.14524,-14.48231 -6.5713,-23.62082 6.45515,-8.40383 14.45784,-6.27094 18.5915,0.0414 2.09136,3.25743 3.09899,7.58994 2.16742,11.37571 -0.95226,2.46814 -1.37316,6.89393 -5.31942,7.45248 -0.4445,-1.6504 -3.25454,-1.51236 -1.81483,-3.27307 1.63819,-2.00345 0.66929,-3.60155 -0.11497,-4.90747 -0.99007,-1.64863 -3.62668,-1.31548 -5.36308,-0.6327 z"
+ id="path3068-9-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zsccccccssz" />
+ <path
+ id="path4649-0"
+ style="fill:#000000;display:inline"
+ d="m 14.658212,571.87891 132.584628,-61.6619 -6.07018,-18.06946 c -2.88978,-8.60218 -1.76874,-23.61644 7.17673,-32.71776 8.94548,-9.10131 11.5393,-10.67252 11.5393,-10.67252 0,0 0.54727,-10.45307 0.54727,-17.46859 0,-17.1284 3.33975,-27.5856 11.93957,-37.38339 5.5019,-6.26838 21.51726,-12.9533 28.20968,-13.83449 4.85197,-0.63886 8.61903,-0.34111 15.53938,1.66667 -0.12917,-4.16054 0.587,-8.90949 2.98755,-13.61296 6.539,-12.81204 13.21525,-17.88639 25.329,-19.25177 8.84468,-0.99693 13.77411,0.35925 28.90302,7.95165 10.03175,5.03446 21.3543,11.19832 24.99504,13.92565 4.01538,3.00798 6.20949,5.2793 10.2812,7.07677 2.41013,-3.60268 6.94338,-10.5171 10.95422,-17.57461 2.33429,-4.10744 10.37611,-17.13568 13.53048,-21.85455 1.57719,-2.35944 6.41985,-8.37195 6.41985,-8.37195 0,0 -1.31142,-8.12758 -0.88067,-12.36731 0.58935,-5.80072 0.97428,-7.57349 4.83184,-12.3627 -3.77939,-2.14565 -3.08319,-1.41947 -7.08681,-3.94365 -20.25239,-12.76862 -34.16873,-27.84627 -40.15509,-56.30446 -5.10584,-24.27216 -4.4007,-41.40703 2.45205,-67.21417 7.7036,-29.01143 15.18952,-45.36816 29.55351,-59.03876 14.92537,-11.0627 12.43198,-2.04001 13.59689,-19.366349 0.91324,-13.583101 11.8782,-40.347468 29.45422,-53.60083 9.58947,-7.231026 21.97858,-3.80485 29.59099,6.499002 10.53054,14.253709 0.17853,14.404082 17.63051,6.752714 20.86592,-9.148123 32.54883,23.523546 33.42248,37.14046 1.05673,16.470373 -1.16843,26.010383 -2.86333,33.904323 4.07154,3.62047 2.58248,1.74759 10.76968,11.51853 8.3892,10.012 12.1486,33.75453 11.34494,62.78361 -0.94573,34.16092 -9.95422,79.26151 -18.82188,96.91198 -7.28684,14.50413 -24.53772,51.74222 -33.64333,81.36391 7.04951,-6.89289 20.03619,-17.09193 31.68777,-23.60977 19.57067,-10.94775 35.86826,-17.6548 52.92838,-23.0765 14.60926,-4.27271 23.92007,0.94007 28.81773,14.86833 l 2.78896,8.35016 14.37056,-0.70574 c 12.36244,-0.6071 16.19906,0.35898 27.45466,6.91325 10.81349,6.29685 14.16725,9.98514 19.32611,21.25359 5.56944,12.16516 6.09614,15.76469 4.8874,33.4003 l -1.35481,19.76574 10.91438,9.60721 c 16.75872,14.75164 25.36378,34.92912 25.42245,59.61145 -0.50196,4.11911 -0.21508,4.42147 -0.93671,9.20235 38.87789,17.76784 115.57654,54.01999 115.57654,54.01999 L 382.42702,706.07474 z m 370.564338,17.77562 c 9.05475,-2.46466 13.58602,-7.58834 18.33472,-10.80361 -10.97449,-12.30208 -18.65245,-25.92708 -26.74569,-45.63149 -4.82799,4.2971 -6.82318,5.90884 -14.22414,10.22159 -13.42149,7.82108 -23.29409,12.77694 -57.4254,4.90126 -6.20655,-1.43214 -10.39595,-5.23376 -17.19163,-10.18726 3.19112,8.85178 13.86295,22.82829 20.52994,29.96884 9.60429,2.44089 16.74117,5.22791 37.62625,4.98794 20.88508,-0.23997 27.9957,-7.12402 28.16531,-6.11681 1.46865,8.72131 -10.15732,15.08153 -17.76404,15.8875 -28.685,3.03932 -35.00933,-2.21337 -14.62245,8.09979 5.86099,2.96492 34.26238,1.13691 43.31713,-1.32775 z m -80.78275,-2.78657 c -0.89959,-3.50631 -9.45553,-13.31314 -16.50253,-22.41247 -12.72217,0.86257 -31.67329,-0.15844 -50.36917,-1.39061 1.28995,5.05783 2.66671,9.35459 8.01513,16.24454 21.31675,7.41613 29.38807,8.69456 58.85657,7.55854 z m 196.55253,-1.05658 c 7.48368,-7.7352 12.59399,-14.06394 14.48282,-24.0163 -9.86035,0.32816 -31.29112,-0.21889 -43.67612,-1.59123 -2.69192,9.78937 -7.53001,16.5494 -12.60926,27.22235 15.18807,0.0987 34.6126,-0.34167 41.80256,-1.61482 z m -39.5462,-25.77116 c -14.22026,-1.04341 -24.64197,-1.70322 -34.91073,-5.06032 1.48042,5.45477 11.46978,23.84715 21.5113,29.43516 8.27915,-6.74863 11.17085,-18.04429 13.39943,-24.37484 z m 89.8385,17.75618 c 11.06658,-12.35693 10.92734,-17.54469 12.64857,-22.88767 -11.30062,3.12506 -19.72285,3.93232 -32.57321,6.37359 -1.89748,6.90764 -8.91109,16.08982 -13.29931,23.08728 10.8857,-1.22697 19.80754,-2.14697 33.22395,-6.5732 z m -317.64736,-1.93287 c -3.6673,-5.08173 -5.86306,-11.13515 -7.03993,-15.06225 -9.55859,-2.04306 -25.015,-11.46938 -36.15974,-15.65039 -0.84013,3.61202 0.47555,6.43514 1.89431,9.82309 3.08034,2.34947 5.43298,4.84837 12.48233,8.01965 11.52918,5.18662 18.20624,9.12314 28.82303,12.8699 z m 186.64301,-6.91909 c 0,-1.28295 -3.83994,-11.06621 -8.53319,-21.74059 -12.64973,-28.77081 -15.90521,-45.89651 -15.92698,-83.78673 -0.0252,-43.63944 7.06295,-74.30199 28.38761,-122.803 12.2828,-27.93634 24.14205,-48.33846 31.75211,-88.421 -6.5755,13.7585 -12.42832,19.89196 -19.64511,27.05989 -21.77232,21.62492 -35.43644,26.31219 -52.19205,28.77556 -10.17306,1.49562 -14.72264,2.13603 -24.70943,1.96892 -2.20297,3.58807 -4.85267,2.59811 -6.46175,8.54423 7.20281,-3.74693 18.38353,-7.60728 30.32987,-0.36061 13.17431,13.17431 13.24085,43.09586 0.21129,95.05167 -9.8248,39.17692 -10.19364,71.64538 -1.16772,102.79178 6.95963,24.01643 12.71354,36.38943 22.12232,47.57108 6.06993,7.21372 15.83313,10.51196 15.83313,5.3488 z m 171.97615,-4.87721 c 13.62786,-7.80295 31.09463,-25.81562 31.4869,-37.0782 l 0.58746,-16.86667 c 0,0 -3.33814,8.50328 -11.45734,16.98325 -8.1192,8.47997 -26.38286,19.25438 -30.88292,21.72921 -0.59939,9.46563 -4.06332,14.42941 -11.30069,24.85736 9.79893,-3.37732 9.75496,-2.86192 21.56659,-9.62495 z m -399.08628,2.32889 c -9.51845,-4.1386 -13.88481,-11.58962 -21.31996,-16.28929 -24.47145,0 -34.7761,15.07859 -41.53164,27.12964 17.4467,-7.24642 26.52906,-13.51756 62.8516,-10.84035 z m 89.61415,-12.03996 c -2.96659,-6.9594 -8.5975,-16.20369 -10.65302,-24.42661 -3.32741,-13.53845 -4.3118,-22.83307 -5.06108,-33.41904 l -18.6361,-1.69054 c -31.57594,-2.86434 -59.06629,-14.64122 -75.55586,-32.36812 -3.26858,-3.51386 -5.96093,-5.2139 -9.24658,-6.38882 -8.83027,1.85899 -18.19769,18.97121 -17.02277,27.01586 1.72967,11.84307 9.77201,29.61721 24.56626,41.34153 29.28013,23.2043 51.68723,28.03568 82.41647,30.05478 2.27989,0.18213 20.99745,0.37832 29.19268,-0.11904 z m 264.96688,-7.59969 c 33.17591,-8.05353 46.3337,-14.29038 61.72491,-29.25789 11.72243,-11.39971 11.62368,-12.00816 13.38605,-19.93479 -1.76237,-24.37548 -10.99587,-32.58734 -21.33375,-43.1616 -7.10687,5.87459 -13.24631,10.18619 -26.84018,17.60995 -31.82211,17.37834 -38.09788,19.98117 -66.15889,27.43875 -24.8411,6.60186 -60.30618,8.65945 -85.18479,4.94212 -7.56759,-1.13074 -9.34913,-1.85205 -13.95251,-3.79109 0.68374,8.63522 7.02657,30.89277 10.82601,41.77378 5.85555,2.06914 18.69644,5.78501 34.4079,7.46 28.99254,3.09087 68.65671,2.86054 93.12525,-3.07923 z m -365.96517,-6.98934 c -5.0073,-3.79319 -15.04979,-12.14598 -26.38792,-21.11757 6.87309,9.82709 12.8483,20.9029 25.99019,29.94259 -0.31926,-1.74227 -1.30034,-6.15635 0.39773,-8.82502 z m 174.38151,-1.39223 c 8.72133,-4.41943 14.88236,-9.7945 17.9439,-12.18733 -0.16949,-5.33012 -1.96982,-10.02782 -3.00289,-16.61725 -5.90678,-37.67641 -6.18805,-69.1294 7.50831,-116.04264 2.5688,-8.79876 5.75412,-45.31512 1.84029,-56.21297 -4.15354,-11.56552 -8.69358,-14.90016 -17.33371,-12.7316 -5.78093,1.45094 -5.51517,0.17011 -11.73672,5.14607 1.0504,7.27539 1.10708,15.71047 6.08564,25.05696 12.61234,23.67774 10.04037,24.96125 6.07567,37.49464 -0.80298,2.53841 -1.39124,6.08864 -4.82329,7.33709 -3.15456,1.14751 -1.8964,-5.88138 0.0582,-12.92767 0.60282,-2.17313 2.32281,-7.87334 1.10528,-10.03655 -5.37151,6.5601 -6.42148,9.38748 -15.06036,13.65848 -5.32605,2.63316 -11.99257,1.71174 -0.30128,-5.9013 7.61084,-4.95596 10.77639,-10.24385 10.46707,-14.34625 -0.19426,-2.57633 -3.44437,-6.27437 -5.1785,-10.15885 -2.95007,-6.60823 -5.00615,-11.70751 -6.65592,-18.64964 -3.20086,3.77493 -5.80141,7.7042 -9.13729,13.97818 6.84133,7.31246 20.83987,10.94638 11.58225,12.67671 -3.45945,0.64661 -9.07768,-1.13387 -16.27078,-5.30088 -2.41603,3.72551 -4.24198,6.80353 -6.5319,10.81176 -2.28992,4.00822 -4.12029,6.94889 -5.67048,10.8996 6.96825,5.81107 15.45195,13.68903 26.17377,16.60289 10.72182,2.91386 11.93048,1.81646 22.97428,2.92452 8.08128,5.08204 -1.31616,6.05381 -11.71739,5.63634 -7.72997,-10e-4 -16.68583,-2.45555 -27.3221,-7.48731 l -15.82285,-7.48536 c 0,0 -3.06581,4.00289 -5.03127,7.72575 -1.96547,3.72286 -3.65744,5.08829 -8.51011,14.63572 5.39938,8.24057 21.38867,17.40027 34.0222,21.44203 15.60992,4.99399 29.77899,-0.61753 20.03332,8.24165 -4.77168,3.11205 -23.06532,0.34123 -36.22874,-4.79739 -8.4245,-3.28868 -19.18735,-8.49378 -24.61997,-12.59132 -5.53498,12.6329 -11.68573,26.99993 -12.28004,37.31432 6.18795,5.30367 11.08101,8.82246 19.05566,13.46691 7.97464,4.64445 21.23563,8.43556 38.12535,9.28723 8.06886,0.40688 26.8554,-2.79414 19.3361,6.04739 -2.78905,4.51264 -40.55852,2.69964 -55.15569,-2.64757 -12.63477,-4.62834 -18.39389,-7.79019 -22.54456,-9.32048 0.87979,14.6001 0.83026,23.60031 4.89448,36.52707 6.47504,8.03684 11.89338,12.51719 20.9989,18.3279 9.36449,5.97597 36.47534,8.40209 52.65514,0.20322 z m 71.04877,-46.86676 c 2.01191,-4.81899 3.55163,-8.01603 2.84173,-13.05158 -8.64059,-0.0422 -14.24253,-0.23689 -22.38977,-0.63094 0.0772,2.83697 -1.21774,5.73561 0.71057,12.63131 6.62798,0.13993 10.95098,0.8768 18.83747,1.05121 z m 60.69911,-17.42006 c -16.72593,3.26065 -31.86913,4.08213 -47.43678,5.19683 0,6.69555 0.89777,8.55515 -2.39691,14.13601 15.50399,-0.88119 27.14231,-0.37451 43.43305,-3.92524 4.34288,-2.54075 4.81198,-9.06671 6.40064,-15.4076 z m -222.03564,12.70347 c -0.97306,-3.81428 -0.25243,-6.58413 -1.12863,-9.70076 -8.25005,-1.12617 -21.49922,-3.43658 -33.54337,-8.6327 -0.88242,5.9656 -1.14728,11.10158 -0.75873,13.11902 9.66693,2.79108 23.72921,6.39833 35.43073,5.21444 z m 278.8326,-17.63462 c 0,-7.11998 -0.59369,-10.11696 -1.21216,-16.9789 -16.77359,7.82453 -31.16323,15.51069 -41.44376,18.24206 0,5.08121 1.52729,9.81275 -1.36723,16.17841 15.99663,-4.76599 30.24741,-9.57801 44.02315,-17.44157 z m -320.05512,-3.74728 c -11.74917,-6.64801 -19.20995,-8.74125 -29.3989,-17.90926 -0.896,4.75835 -2.84738,10.8932 -2.41728,16.52949 6.3047,5.34257 17.04699,11.94895 30.08288,14.71307 -0.70178,-6.82655 1.7333,-7.60222 1.7333,-13.3333 z m 231.16785,3.04374 c 32.71147,-1.72578 82.63308,-20.13988 112.14976,-46.77174 13.17222,-11.88483 14.16734,-16.48227 19.19028,-22.58022 -6.72623,-21.95934 -23.10937,-30.88619 -52.47628,-27.09337 -9.09958,10.84233 -11.42188,13.14169 -16.90851,17.78987 -20.06442,16.99825 -48.82085,30.62251 -68.78212,33.08945 -22.75093,2.81168 -32.65783,5.24837 -42.09969,3.98007 -1.17151,4.45359 -1.48486,28.22713 -1.26376,44.07058 10.50162,0.56952 12.36516,-0.48907 50.19032,-2.48464 z M 276.78384,433.68138 c -5.90367,-1.70236 -10.37843,-3.21456 -16.13577,-5.74862 -15.74008,-6.92788 -28.01105,-15.33626 -33.173,-22.50945 -3.16903,-4.40378 -8.3879,-10.85021 -11.14489,-16.58687 -3.93192,0.43165 -10.05094,-1.75702 -17.22847,0.008 -6.31534,1.55334 -16.02671,5.22627 -20.65262,12.28631 -5.25291,8.01696 -2.99984,14.67589 9.95705,29.42833 12.17383,13.86092 39.39341,27.4351 59.05309,34.39284 6.52626,2.3097 9.85362,2.60604 18.12668,4.80988 3.41262,-16.06779 7.58035,-27.1149 11.19793,-36.08081 z m 283.10033,27.17019 c 5.65583,-4.52247 19.05654,-17.6262 23.46248,-26.93841 1.46865,-4.61255 2.31492,-7.43835 2.46148,-13.53036 -8.07785,7.41954 -20.69954,19.4848 -28.24204,23.45757 1.26938,4.85395 2.24311,9.49077 2.31808,17.0112 z M 184.06726,436.45411 c -5.42113,-2.75384 -11.20479,-11.96506 -13.69948,-17.54592 -1.6802,10.28053 -2.84362,14.68142 -1.40535,25.23377 7.60658,5.55895 8.95679,8.0796 13.34246,9.936 z m 111.11253,-33.62532 c 3.68104,-5.90159 6.65065,-12.22571 9.51435,-18.0567 -5.74197,-4.83069 -18.72997,-12.23804 -28.86211,-17.79891 -16.4056,-9.0039 -20.24108,-11.70929 -30.26022,-10.37712 -13.02685,1.73206 -18.94914,10.62343 -18.94914,21.41668 0,16.10626 13.17906,29.86637 38.4375,40.13216 9.06503,3.68432 10.64355,4.38638 16.35224,5.95632 6.22307,-8.82933 9.1123,-13.80922 13.76738,-21.27243 z m 161.6848,5.12952 c 22.63107,-8.51735 49.20882,-22.61083 57.1498,-29.78111 12.96065,-11.70277 10.3598,-33.89411 -1.2579,-33.89411 -6.87273,0 -35.40483,13.00679 -52.90578,22.56803 -26.8587,14.67371 -44.8684,28.7812 -50.74299,49.79679 7.93069,-0.13292 5.46088,0.55312 17.91385,-1.00227 7.75246,-0.96829 21.18181,-4.42758 29.84302,-7.68733 z M 403.62471,290.55367 c 15.61963,-7.12645 32.55171,-23.65944 39.6446,-37.37571 12.67211,-24.50505 17.08482,-40.94985 16.96043,-63.20656 -0.0988,-17.66936 -2.22983,-25.37692 -5.96578,-33.79573 -9.34193,-21.0517 -8.93615,-12.72592 -15.57631,-3.23371 -14.59385,20.86213 -25.17757,13.93615 -36.67009,5.72186 -12.40144,-8.86396 -6.23357,-6.35803 -19.06466,0.05 -10.03859,5.01338 -13.74028,3.70353 -21.34972,-1.0759 -7.60944,-4.77943 -13.66344,-10.00271 -17.2088,-22.09047 -3.85578,-13.14613 -1.7647,-12.74535 -13.09418,-4.84192 -22.98228,27.70184 -38.47232,103.39088 -11.78054,141.46771 17.53828,25.01903 50.94648,33.50906 84.10505,18.38046 z m -22.89229,-9.68061 c -0.21982,-1.04433 1.6154,-9.17646 0.20423,-15.5132 -2.91746,-13.10058 8.70009,-13.55304 9.43196,-2.81046 1.2534,10.76354 -4.37091,22.85472 -9.04883,21.11409 z m -59.56637,-9.07044 c -2.51607,-2.51606 -0.85951,-14.85117 2.02722,-20.245 4.60766,-6.8664 8.89219,-5.26144 5.61435,6.27018 1.88143,9.69023 -0.006,17.33132 -7.64157,13.97482 z M 431.99283,146.54508 c 2.86718,-3.05194 6.92032,-9.6352 9.00707,-14.62943 4.82046,-11.53709 4.95806,-40.928496 0.24435,-52.209972 -6.78957,-16.249808 -23.78528,-17.542624 -33.31908,-5.504293 -5.48703,6.928474 -9.40835,16.546333 -12.07927,10.371084 -1.06188,-2.4551 0.23568,-4.730687 1.46773,-7.857746 6.92011,-17.56393 -1.81554,-22.981026 -11.86101,-23.661753 -6.53281,-0.442693 -12.25518,2.972328 -20.24769,11.040967 -9.70032,9.792702 -17.78524,27.905126 -17.78524,49.330523 0,14.08222 3.45321,21.10568 9.27614,26.51831 5.82293,5.41263 11.49057,9.62395 19.23768,9.61982 7.74711,-0.004 9.08725,-5.01839 17.23334,-6.36358 6.95308,3.23098 9.89267,10.46839 22.51112,11.10913 8.72012,0.44279 12.75849,-3.97736 16.31486,-7.76298 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsscssscsssscsscscssscssssscssscscccsssscscccccsccssccssssscccccccccccccccccccccccsccssscsscccsssccsscsccscccccccsscssccssccsssccssccccccsssscsssscssssccscscsccscscscsccsscsccscccccccccccccccccccccccccccssccssccscssccssscccccccccccccscsssscssssscsscsssssssscsccssccscccccsssssssssccscc" />
+ <path
+ d="m 750.58773,574.76657 0,56.09559 L 382.54724,764.8179 14.50676,630.86216 l 0,-56.61975 368.34752,133.55687 z"
+ id="path3354-2"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <g
+ transform="translate(0,5.93005e-6)"
+ id="g5049-8"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline">
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3290-6"
+ d="m 321.48422,721.5392 -22.36609,12.913 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3292-0"
+ d="m 75.569784,632.03363 -22.366085,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3294-1-0"
+ d="m 305.08992,715.57213 -22.36608,12.91307 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3296-2"
+ d="m 288.69563,709.6051 -22.36609,12.9131 0,30.0332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3298-6-6"
+ d="m 272.30133,703.63806 -22.36608,12.91304 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3300-0-1"
+ d="m 255.90704,697.67102 -22.36609,12.91307 0,30.03331" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3302-5"
+ d="m 239.51274,691.70399 -22.36608,12.91306 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3304-4-3"
+ d="m 223.11845,685.73695 -22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3306-6"
+ d="m 206.72415,679.76992 -22.36609,12.91306 0,30.03332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3308-7"
+ d="m 190.32985,673.80288 -22.36608,12.91307 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3310-9"
+ d="m 173.93556,667.83585 -22.36609,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3312-3"
+ d="m 157.54126,661.86881 -22.36608,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3314-4"
+ d="m 141.14697,655.90177 -22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3316-7"
+ d="m 124.75267,649.93474 -22.36608,12.91306 0,30.03329" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3318-8"
+ d="m 108.35837,643.9677 -22.36608,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3320-8"
+ d="m 91.96408,638.00067 -22.366085,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3322-1"
+ d="m 443.61027,721.5392 22.36608,12.913 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3324-6"
+ d="m 476.39886,709.6051 22.36608,12.9131 0,30.0332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3326-3"
+ d="m 460.00456,715.57213 22.36609,12.91307 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3328-8"
+ d="m 525.58175,691.70399 22.36608,12.91306 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3330-7"
+ d="m 509.18745,697.67102 22.36609,12.91307 0,30.03331" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3332-6"
+ d="m 492.79316,703.63806 22.36608,12.91304 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3334-1-8"
+ d="m 558.37034,679.76992 22.36608,12.91306 0,30.03332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3336-7"
+ d="m 541.97604,685.73695 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3338-2"
+ d="m 607.55322,661.86881 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3340-3"
+ d="m 574.76463,673.80288 22.36609,12.91307 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3342-7"
+ d="m 591.15893,667.83585 22.36609,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3344-8"
+ d="m 689.5247,632.03363 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3346-5-9"
+ d="m 623.94752,655.90177 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3348-8"
+ d="m 640.34182,649.93474 22.36608,12.91306 0,30.03329" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3350-5"
+ d="m 656.73611,643.9677 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000000;stroke-width:9.60000038;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3352-8"
+ d="m 673.13041,638.00067 22.36608,12.91306 0,30.03328" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="color fill"
+ style="display:inline">
+ <path
+ style="fill:url(#linearGradient4839);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 222.79968,387.16768 0.82214,-22.19775 15.62064,-11.50995 23.01989,0.82214 46.86193,27.95273 -27.13059,48.5062 -38.64053,-19.73134 z"
+ id="path4831"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4803);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 305.01358,171.76725 18.9092,-41.92909 18.9092,-13.15423 4.1107,18.08706 22.19775,20.55348 11.50995,-3.28856 12.33208,-5.75497 24.66417,13.97636 18.08706,-11.50994 11.50995,-12.33209 17.26492,26.30845 -0.82214,72.34824 -42.75123,51.79476 -30.41914,13.97636 -36.99626,1.64428 -38.64054,-26.30845 -16.44278,-54.26118 z"
+ id="path4795"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4815);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 277.06086,443.07313 62.48256,-106.87807 14.79851,-17.26492 26.30845,1.64428 9.86567,28.77486 -19.73134,129.89797 10.68781,54.26118 31.24128,47.68406 -36.99626,18.08706 -54.26117,-0.82214 -38.64054,-52.61689 -12.33208,-50.15049 z"
+ id="path4807"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="fill:url(#linearGradient4849);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 269.66161,473.49228 -54.26118,-15.62064 -39.46267,-34.52984 -5.75498,-21.37562 29.59701,-19.73133 23.01989,4.11069 18.9092,25.48631 41.10695,19.73134 z"
+ id="path4841"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4859);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 403.67027,419.2311 8.22139,-28.77486 86.3246,-46.86193 23.84203,-2.46642 8.22139,26.30845 -40.28481,36.99626 -36.99626,13.15422 z"
+ id="path4851"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4871);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 399.55957,475.13656 2.46642,-54.26118 62.48257,-4.93283 60.01615,-39.46268 8.22139,-12.33208 46.03979,7.39925 17.26492,35.35198 -53.43904,41.92909 -73.99252,23.84203 z"
+ id="path4863"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4891);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 342.83198,320.57442 12.33209,-18.08706 52.6169,-7.39925 35.35197,-32.06343 20.55348,-27.13058 -26.30845,90.43529 -32.88556,77.28107 -2.46642,94.54599 27.95273,86.3246 -33.7077,-22.19775 -24.66417,-61.66043 3.28855,-73.99252 15.62065,-69.88182 -10.68781,-37.81839 z"
+ id="path4883"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#radialGradient4901);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 399.55957,475.9587 73.17038,-4.93284 27.13059,-6.57711 -9.86567,30.41914 -89.61316,1.64428 z"
+ id="path4893"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4921);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 492.39893,467.8906 60.97616,-26.22631 36.71683,-32.78288 -3.27829,37.37249 -40.65077,32.12722 -54.41959,19.01408 z"
+ id="path4913"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4931);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 165.8814,410.84838 40.65077,39.33946 39.33946,18.35842 26.88197,6.55657 -0.65566,19.66974 -77.36761,-20.98105 -30.16025,-26.22631 z"
+ id="path4923"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4941);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 289.8007,558.37136 24.25933,31.47157 -70.15537,2.62263 -95.72602,-62.94314 3.93394,-19.66973 39.33947,31.47157 43.2734,17.70276 z"
+ id="path4933"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4951);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 418.30961,549.19215 106.21654,8.52355 68.84406,-19.01407 35.40552,-36.06117 1.31131,43.92906 -67.53274,41.96209 -118.67404,6.55658 z"
+ id="path4943"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4961);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 271.44228,491.49428 17.70276,66.22142 -69.49971,-3.27829 -41.30644,-20.32538 -29.50459,-30.16026 -7.21224,-26.2263 22.94802,-30.81592 30.81591,28.19328 49.17433,13.76882 z"
+ id="path4953"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4977);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 401.91816,495.42822 97.03734,2.62263 101.62694,-51.1413 27.53763,32.12723 0,26.22631 -47.86301,41.30643 -95.72603,10.49053 -67.53274,-9.17921 z"
+ id="path4969"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4997);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 117.36273,585.90898 30.16025,-39.99512 24.25934,0.65566 31.47156,24.25934 z"
+ id="path4989"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient5007);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 172.43797,625.9041 39.99512,-6.55657 -19.01407,17.70275 z"
+ id="path4999"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient5017);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 261.60742,627.21542 34.74986,-5.24526 -5.24527,14.42447 z"
+ id="path5009"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient5027);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 385.52672,650.16344 17.0471,-31.47157 24.25934,-11.80184 1.96697,27.53762 39.33946,-9.1792 72.12235,9.1792 -17.0471,9.17921 z"
+ id="path5019"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient5037);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 424.21053,631.80502 66.87708,-6.55657 96.38168,4.5896 24.25934,-19.66973 -116.05142,-15.08013 -58.35353,6.55658 z"
+ id="path5029"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient5047);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 197.35296,637.05028 26.22631,-36.06117 193.41902,1.96697 -36.06117,45.24038 -89.82511,-9.83486 7.21224,-15.08013 -43.27341,3.93395 z"
+ id="path5039"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="snake and chip"
+ style="display:inline">
+ <path
+ d="m 454.71085,42.269961 c -1.84306,-4.16383 -8.01725,-8.0321 -10.56009,-8.00789 -2.54283,0.0242 -6.85424,-1.17464 -5.27554,-5.5465 1.5787,-4.37185 7.70455,-4.42682 10.36862,-3.40045 2.66408,1.02637 8.60663,3.31382 10.67443,17.60551 2.0678,14.29168 -3.36437,3.51316 -5.20742,-0.65067 z"
+ id="path3072-7"
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zzzzzz" />
+ <path
+ d="m 376.90653,28.503352 c -4.55875,2.209186 -5.68635,-4.51432 -3.82908,-7.783822 1.85727,-3.269502 7.61779,-7.338561 11.18656,-8.748148 3.56877,-1.409587 7.0703,-1.282096 7.84101,0.66902 -0.69594,7.238184 -10.63974,13.653764 -15.19849,15.86295 z"
+ id="path3070-4"
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zzzcz" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ d="m 403.00043,144.27939 c 4.82135,0.33482 12.51176,-7.97481 11.47067,-15.50764 -1.04109,-7.53282 -5.44177,-13.47845 -11.01274,-13.50791 -5.57097,-0.0295 -13.08577,7.35435 -11.63515,14.13061 0.51844,2.59416 1.94883,8.72762 4.71599,5.74451 3.28523,-0.66156 0.59669,-2.45848 2.46895,-6.60993 0.84584,-1.49606 3.82062,-1.93456 5.14537,-0.32025 1.32475,1.61431 1.77634,5.60243 -1.5359,7.25691 -2.05971,0.74048 -3.01527,-1.474 -5.65724,0.71791 -2.64197,2.19191 3.30447,8.07516 6.04005,8.09579 z"
+ id="path3066-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czzccczczc" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
+ d="m 376.55272,127.26886 c -1.7364,0.68278 -2.36572,4.04539 -0.81525,5.89961 1.43203,1.71258 4.93182,0.31723 5.56335,2.97696 2.88715,2.89045 -3.88391,5.71124 -6.32342,4.6879 -7.56769,-1.97924 -11.14524,-14.48231 -6.5713,-23.62082 6.45515,-8.40383 14.45784,-6.27094 18.5915,0.0414 2.09136,3.25743 3.09899,7.58994 2.16742,11.37571 -0.95226,2.46814 -1.37316,6.89393 -5.31942,7.45248 -0.4445,-1.6504 -3.25454,-1.51236 -1.81483,-3.27307 1.63819,-2.00345 0.66929,-3.60155 -0.11497,-4.90747 -0.99007,-1.64863 -3.62668,-1.31548 -5.36308,-0.6327 z"
+ id="path3068-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zsccccccssz" />
+ <path
+ id="path4649"
+ style="fill:#000000;display:inline"
+ d="m 194.01136,631.57786 c 0,0 6.14317,-2.85153 10.0835,-8.26108 -6.37148,3.00141 -11.34115,5.4807 -23.17647,5.11326 8.42472,2.40125 13.09297,3.14782 13.09297,3.14782 z m 405.59181,-15.63369 -30.84807,-3.42261 8.24142,11.85178 z m -88.65927,4.80256 c -1.61076,-8.86957 -3.36449,-11.9843 -5.71636,-16.0913 -8.31238,-0.40738 -31.3356,-0.96193 -42.25313,0.57072 4.49758,4.41013 5.55193,10.56268 10.74722,16.77444 10.12811,-1.1875 28.96735,-1.83889 37.22227,-1.25386 z m -212.77128,-0.54172 c 2.58463,-3.22962 2.71765,-5.62041 9.38149,-11.09101 -14.9173,-5.88167 -38.94241,-3.29507 -51.90193,-2.16322 -4.94367,6.06469 -9.79427,14.48095 -13.53016,19.90496 14.14563,-4.23611 47.50546,-7.94287 56.0506,-6.65073 z m 263.54725,4.74708 c -2.50343,-4.93841 -8.9331,-12.76544 -15.75938,-16.17998 -6.82629,-3.41454 -17.36789,-3.7813 -28.48361,-4.12615 4.29939,4.79352 6.60458,9.46544 7.45227,17.42873 9.06908,0.56403 26.51398,0.0318 36.79072,2.8774 z m -104.04426,-4.01256 c 1.22419,-6.42487 -3.26083,-14.48017 -10.23446,-16.32998 -7.59023,5.13837 -12.15387,14.5548 -17.48427,21.58721 6.59062,-1.8056 17.86208,-3.76519 27.71873,-5.25723 z m -225.80894,5.2974 c 1.01602,-4.74132 6.96531,-11.07292 11.31671,-18.12675 -13.77073,3.82355 -28.195,13.29102 -35.91963,21.14497 8.42472,-1.70944 24.60292,-1.424 24.60292,-3.01822 z m 58.86081,-0.5186 c -3.08302,-0.75612 -15.68236,0.98297 -18.79524,2.21618 9.45431,-0.0296 13.68842,0.45636 17.05647,4.11575 1.52517,-1.69146 1.9443,-3.72599 1.73877,-6.33193 z m 207.93641,11.42226 31.39282,-0.70758 -35.4871,-4.7828 c -12.68914,-1.71019 -27.39053,-1.48732 -37.89843,0.34168 l -32.62505,8.82412 34.04737,-3.33375 c 10.64901,-1.0427 30.50662,-0.11483 40.57039,-0.34167 z m -89.94855,4.39167 c 2.71291,-5.69933 6.39798,-12.93476 10.20267,-19.94891 2.556,-3.08493 2.8267,-5.06 0.9506,-6.93603 -4.60074,-1.10669 -7.09894,0.57308 -15.62312,10.55326 -6.34523,7.42905 -8.02332,12.52196 -10.59246,17.95542 4.41904,-1.76025 9.26638,-1.47385 15.06231,-1.62374 z m -15.88883,-16.85169 14.74639,-16.40602 -24.26522,0.20554 c -13.91391,0.11785 -6.09345,3.51192 -1.66333,8.84485 -4.40787,-0.62759 -5.01081,0.89015 -11.12131,-2.38009 -6.2287,-3.33346 -35.91772,-2.5726 -49.67832,-0.92014 -8.00562,5.14654 -16.84561,11.90818 -20.80111,18.56469 6.1157,0.90153 10.6696,0.62198 23.7101,0.0642 19.159,-0.81961 26.2774,-0.10457 37.085,3.72586 7.3562,2.60709 20.16937,4.46047 22.19357,4.62099 4.90705,-9.47753 5.16451,-9.19423 9.79423,-16.31988 z M 14.658212,571.87891 147.24284,510.21701 141.17266,492.14755 c -2.88978,-8.60218 -1.76874,-23.61644 7.17673,-32.71776 8.94548,-9.10131 11.5393,-10.67252 11.5393,-10.67252 0,0 0.54727,-10.45307 0.54727,-17.46859 0,-17.1284 3.33975,-27.5856 11.93957,-37.38339 5.5019,-6.26838 21.51726,-12.9533 28.20968,-13.83449 4.85197,-0.63886 8.61903,-0.34111 15.53938,1.66667 -0.12917,-4.16054 0.587,-8.90949 2.98755,-13.61296 6.539,-12.81204 13.21525,-17.88639 25.329,-19.25177 8.84468,-0.99693 13.77411,0.35925 28.90302,7.95165 10.03175,5.03446 21.3543,11.19832 24.99504,13.92565 4.01538,3.00798 6.20949,5.2793 10.2812,7.07677 2.41013,-3.60268 6.94338,-10.5171 10.95422,-17.57461 2.33429,-4.10744 10.37611,-17.13568 13.53048,-21.85455 1.57719,-2.35944 6.41985,-8.37195 6.41985,-8.37195 0,0 -1.31142,-8.12758 -0.88067,-12.36731 0.58935,-5.80072 0.97428,-7.57349 4.83184,-12.3627 -3.77939,-2.14565 -3.08319,-1.41947 -7.08681,-3.94365 -20.25239,-12.76862 -34.16873,-27.84627 -40.15509,-56.30446 -5.10584,-24.27216 -4.4007,-41.40703 2.45205,-67.21417 7.7036,-29.01143 15.18952,-45.36816 29.55351,-59.03876 14.92537,-11.0627 12.43198,-2.04001 13.59689,-19.366352 0.91324,-13.583101 11.8782,-40.347468 29.45422,-53.60083 9.58947,-7.231026 21.97858,-3.80485 29.59099,6.499002 10.53054,14.253709 0.17853,14.404082 17.63051,6.752714 20.86592,-9.148123 32.54883,23.523546 33.42248,37.14046 1.05673,16.470376 -1.16843,26.010386 -2.86333,33.904326 4.07154,3.62047 2.58248,1.74759 10.76968,11.51853 8.3892,10.012 12.1486,33.75453 11.34494,62.78361 -0.94573,34.16092 -9.95422,79.26151 -18.82188,96.91198 -7.28684,14.50413 -24.53772,51.74222 -33.64333,81.36391 7.04951,-6.89289 20.03619,-17.09193 31.68777,-23.60977 19.57067,-10.94775 35.86826,-17.6548 52.92838,-23.0765 14.60926,-4.27271 23.92007,0.94007 28.81773,14.86833 l 2.78896,8.35016 14.37056,-0.70574 c 12.36244,-0.6071 16.19906,0.35898 27.45466,6.91325 10.81349,6.29685 14.16725,9.98514 19.32611,21.25359 5.56944,12.16516 6.09614,15.76469 4.8874,33.4003 l -1.35481,19.76574 10.91438,9.60721 c 16.75872,14.75164 25.36378,34.92912 25.42245,59.61145 -0.50196,4.11911 -0.21508,4.42147 -0.93671,9.20235 38.87789,17.76784 115.57654,54.01999 115.57654,54.01999 L 382.42702,706.07474 z m 370.564338,17.77562 c 9.05475,-2.46466 13.58602,-7.58834 18.33472,-10.80361 -10.97449,-12.30208 -18.65245,-25.92708 -26.74569,-45.63149 -4.82799,4.2971 -6.82318,5.90884 -14.22414,10.22159 -13.42149,7.82108 -23.29409,12.77694 -57.4254,4.90126 -6.20655,-1.43214 -10.39595,-5.23376 -17.19163,-10.18726 3.19112,8.85178 13.86295,22.82829 20.52994,29.96884 9.60429,2.44089 16.74117,5.22791 37.62625,4.98794 20.88508,-0.23997 27.9957,-7.12402 28.16531,-6.11681 1.46865,8.72131 -10.15732,15.08153 -17.76404,15.8875 -28.685,3.03932 -35.00933,-2.21337 -14.62245,8.09979 5.86099,2.96492 34.26238,1.13691 43.31713,-1.32775 z m -80.78275,-2.78657 c -0.89959,-3.50631 -9.45553,-13.31314 -16.50253,-22.41247 -12.72217,0.86257 -31.67329,-0.15844 -50.36917,-1.39061 1.28995,5.05783 2.66671,9.35459 8.01513,16.24454 21.31675,7.41613 29.38807,8.69456 58.85657,7.55854 z m 196.55253,-1.05658 c 7.48368,-7.7352 12.59399,-14.06394 14.48282,-24.0163 -9.86035,0.32816 -31.29112,-0.21889 -43.67612,-1.59123 -2.69192,9.78937 -7.53001,16.5494 -12.60926,27.22235 15.18807,0.0987 34.6126,-0.34167 41.80256,-1.61482 z m -39.5462,-25.77116 c -14.22026,-1.04341 -24.64197,-1.70322 -34.91073,-5.06032 1.48042,5.45477 11.46978,23.84715 21.5113,29.43516 8.27915,-6.74863 11.17085,-18.04429 13.39943,-24.37484 z m 89.8385,17.75618 c 11.06658,-12.35693 10.92734,-17.54469 12.64857,-22.88767 -11.30062,3.12506 -19.72285,3.93232 -32.57321,6.37359 -1.89748,6.90764 -8.91109,16.08982 -13.29931,23.08728 10.8857,-1.22697 19.80754,-2.14697 33.22395,-6.5732 z m -317.64736,-1.93287 c -3.6673,-5.08173 -5.86306,-11.13515 -7.03993,-15.06225 -9.55859,-2.04306 -25.015,-11.46938 -36.15974,-15.65039 -0.84013,3.61202 0.47555,6.43514 1.89431,9.82309 3.08034,2.34947 5.43298,4.84837 12.48233,8.01965 11.52918,5.18662 18.20624,9.12314 28.82303,12.8699 z m 186.64301,-6.91909 c 0,-1.28295 -3.83994,-11.06621 -8.53319,-21.74059 -12.64973,-28.77081 -15.90521,-45.89651 -15.92698,-83.78673 -0.0252,-43.63944 7.06295,-74.30199 28.38761,-122.803 12.2828,-27.93634 24.14205,-48.33846 31.75211,-88.421 -6.5755,13.7585 -12.42832,19.89196 -19.64511,27.05989 -21.77232,21.62492 -35.43644,26.31219 -52.19205,28.77556 -10.17306,1.49562 -14.72264,2.13603 -24.70943,1.96892 -2.20297,3.58807 -4.85267,2.59811 -6.46175,8.54423 7.20281,-3.74693 18.38353,-7.60728 30.32987,-0.36061 13.17431,13.17431 13.24085,43.09586 0.21129,95.05167 -9.8248,39.17692 -10.19364,71.64538 -1.16772,102.79178 6.95963,24.01643 12.71354,36.38943 22.12232,47.57108 6.06993,7.21372 15.83313,10.51196 15.83313,5.3488 z m 171.97615,-4.87721 c 13.62786,-7.80295 31.09463,-25.81562 31.4869,-37.0782 l 0.58746,-16.86667 c 0,0 -3.33814,8.50328 -11.45734,16.98325 -8.1192,8.47997 -26.38286,19.25438 -30.88292,21.72921 -0.59939,9.46563 -4.06332,14.42941 -11.30069,24.85736 9.79893,-3.37732 9.75496,-2.86192 21.56659,-9.62495 z m -399.08628,2.32889 c -9.51845,-4.1386 -13.88481,-11.58962 -21.31996,-16.28929 -24.47145,0 -34.7761,15.07859 -41.53164,27.12964 17.4467,-7.24642 26.52906,-13.51756 62.8516,-10.84035 z m 89.61415,-12.03996 c -2.96659,-6.9594 -8.5975,-16.20369 -10.65302,-24.42661 -3.32741,-13.53845 -4.3118,-22.83307 -5.06108,-33.41904 l -18.6361,-1.69054 c -31.57594,-2.86434 -59.06629,-14.64122 -75.55586,-32.36812 -3.26858,-3.51386 -5.96093,-5.2139 -9.24658,-6.38882 -8.83027,1.85899 -18.19769,18.97121 -17.02277,27.01586 1.72967,11.84307 9.77201,29.61721 24.56626,41.34153 29.28013,23.2043 51.68723,28.03568 82.41647,30.05478 2.27989,0.18213 20.99745,0.37832 29.19268,-0.11904 z m 264.96688,-7.59969 c 33.17591,-8.05353 46.3337,-14.29038 61.72491,-29.25789 11.72243,-11.39971 11.62368,-12.00816 13.38605,-19.93479 -1.76237,-24.37548 -10.99587,-32.58734 -21.33375,-43.1616 -7.10687,5.87459 -13.24631,10.18619 -26.84018,17.60995 -31.82211,17.37834 -38.09788,19.98117 -66.15889,27.43875 -24.8411,6.60186 -60.30618,8.65945 -85.18479,4.94212 -7.56759,-1.13074 -9.34913,-1.85205 -13.95251,-3.79109 0.68374,8.63522 7.02657,30.89277 10.82601,41.77378 5.85555,2.06914 18.69644,5.78501 34.4079,7.46 28.99254,3.09087 68.65671,2.86054 93.12525,-3.07923 z m -365.96517,-6.98934 c -5.0073,-3.79319 -15.04979,-12.14598 -26.38792,-21.11757 6.87309,9.82709 12.8483,20.9029 25.99019,29.94259 -0.31926,-1.74227 -1.30034,-6.15635 0.39773,-8.82502 z m 174.38151,-1.39223 c 8.72133,-4.41943 14.88236,-9.7945 17.9439,-12.18733 -0.16949,-5.33012 -1.96982,-10.02782 -3.00289,-16.61725 -5.90678,-37.67641 -6.18805,-69.1294 7.50831,-116.04264 2.5688,-8.79876 5.75412,-45.31512 1.84029,-56.21297 -4.15354,-11.56552 -8.69358,-14.90016 -17.33371,-12.7316 -5.78093,1.45094 -5.51517,0.17011 -11.73672,5.14607 1.0504,7.27539 1.10708,15.71047 6.08564,25.05696 12.61234,23.67774 10.04037,24.96125 6.07567,37.49464 -0.80298,2.53841 -1.39124,6.08864 -4.82329,7.33709 -3.15456,1.14751 -1.8964,-5.88138 0.0582,-12.92767 0.60282,-2.17313 2.32281,-7.87334 1.10528,-10.03655 -5.37151,6.5601 -6.42148,9.38748 -15.06036,13.65848 -5.32605,2.63316 -11.99257,1.71174 -0.30128,-5.9013 7.61084,-4.95596 10.77639,-10.24385 10.46707,-14.34625 -0.19426,-2.57633 -3.44437,-6.27437 -5.1785,-10.15885 -2.95007,-6.60823 -5.00615,-11.70751 -6.65592,-18.64964 -3.20086,3.77493 -5.80141,7.7042 -9.13729,13.97818 6.84133,7.31246 20.83987,10.94638 11.58225,12.67671 -3.45945,0.64661 -9.07768,-1.13387 -16.27078,-5.30088 -2.41603,3.72551 -4.24198,6.80353 -6.5319,10.81176 -2.28992,4.00822 -4.12029,6.94889 -5.67048,10.8996 6.96825,5.81107 15.45195,13.68903 26.17377,16.60289 10.72182,2.91386 11.93048,1.81646 22.97428,2.92452 8.08128,5.08204 -1.31616,6.05381 -11.71739,5.63634 -7.72997,-10e-4 -16.68583,-2.45555 -27.3221,-7.48731 l -15.82285,-7.48536 c 0,0 -3.06581,4.00289 -5.03127,7.72575 -1.96547,3.72286 -3.65744,5.08829 -8.51011,14.63572 5.39938,8.24057 21.38867,17.40027 34.0222,21.44203 15.60992,4.99399 29.77899,-0.61753 20.03332,8.24165 -4.77168,3.11205 -23.06532,0.34123 -36.22874,-4.79739 -8.4245,-3.28868 -19.18735,-8.49378 -24.61997,-12.59132 -5.53498,12.6329 -11.68573,26.99993 -12.28004,37.31432 6.18795,5.30367 11.08101,8.82246 19.05566,13.46691 7.97464,4.64445 21.23563,8.43556 38.12535,9.28723 8.06886,0.40688 26.8554,-2.79414 19.3361,6.04739 -2.78905,4.51264 -40.55852,2.69964 -55.15569,-2.64757 -12.63477,-4.62834 -18.39389,-7.79019 -22.54456,-9.32048 0.87979,14.6001 0.83026,23.60031 4.89448,36.52707 6.47504,8.03684 11.89338,12.51719 20.9989,18.3279 9.36449,5.97597 36.47534,8.40209 52.65514,0.20322 z m 71.04877,-46.86676 c 2.01191,-4.81899 3.55163,-8.01603 2.84173,-13.05158 -8.64059,-0.0422 -14.24253,-0.23689 -22.38977,-0.63094 0.0772,2.83697 -1.21774,5.73561 0.71057,12.63131 6.62798,0.13993 10.95098,0.8768 18.83747,1.05121 z m 60.69911,-17.42006 c -16.72593,3.26065 -31.86913,4.08213 -47.43678,5.19683 0,6.69555 0.89777,8.55515 -2.39691,14.13601 15.50399,-0.88119 27.14231,-0.37451 43.43305,-3.92524 4.34288,-2.54075 4.81198,-9.06671 6.40064,-15.4076 z m -222.03564,12.70347 c -0.97306,-3.81428 -0.25243,-6.58413 -1.12863,-9.70076 -8.25005,-1.12617 -21.49922,-3.43658 -33.54337,-8.6327 -0.88242,5.9656 -1.14728,11.10158 -0.75873,13.11902 9.66693,2.79108 23.72921,6.39833 35.43073,5.21444 z m 278.8326,-17.63462 c 0,-7.11998 -0.59369,-10.11696 -1.21216,-16.9789 -16.77359,7.82453 -31.16323,15.51069 -41.44376,18.24206 0,5.08121 1.52729,9.81275 -1.36723,16.17841 15.99663,-4.76599 30.24741,-9.57801 44.02315,-17.44157 z m -320.05512,-3.74728 c -11.74917,-6.64801 -19.20995,-8.74125 -29.3989,-17.90926 -0.896,4.75835 -2.84738,10.8932 -2.41728,16.52949 6.3047,5.34257 17.04699,11.94895 30.08288,14.71307 -0.70178,-6.82655 1.7333,-7.60222 1.7333,-13.3333 z m 231.16785,3.04374 c 32.71147,-1.72578 82.63308,-20.13988 112.14976,-46.77174 13.17222,-11.88483 14.16734,-16.48227 19.19028,-22.58022 -6.72623,-21.95934 -23.10937,-30.88619 -52.47628,-27.09337 -9.09958,10.84233 -11.42188,13.14169 -16.90851,17.78987 -20.06442,16.99825 -48.82085,30.62251 -68.78212,33.08945 -22.75093,2.81168 -32.65783,5.24837 -42.09969,3.98007 -1.17151,4.45359 -1.48486,28.22713 -1.26376,44.07058 10.50162,0.56952 12.36516,-0.48907 50.19032,-2.48464 z M 276.78384,433.68138 c -5.90367,-1.70236 -10.37843,-3.21456 -16.13577,-5.74862 -15.74008,-6.92788 -28.01105,-15.33626 -33.173,-22.50945 -3.16903,-4.40378 -8.3879,-10.85021 -11.14489,-16.58687 -3.93192,0.43165 -10.05094,-1.75702 -17.22847,0.008 -6.31534,1.55334 -16.02671,5.22627 -20.65262,12.28631 -5.25291,8.01696 -2.99984,14.67589 9.95705,29.42833 12.17383,13.86092 39.39341,27.4351 59.05309,34.39284 6.52626,2.3097 9.85362,2.60604 18.12668,4.80988 3.41262,-16.06779 7.58035,-27.1149 11.19793,-36.08081 z m 283.10033,27.17019 c 5.65583,-4.52247 19.05654,-17.6262 23.46248,-26.93841 1.46865,-4.61255 2.31492,-7.43835 2.46148,-13.53036 -8.07785,7.41954 -20.69954,19.4848 -28.24204,23.45757 1.26938,4.85395 2.24311,9.49077 2.31808,17.0112 z M 184.06726,436.45411 c -5.42113,-2.75384 -11.20479,-11.96506 -13.69948,-17.54592 -1.6802,10.28053 -2.84362,14.68142 -1.40535,25.23377 7.60658,5.55895 8.95679,8.0796 13.34246,9.936 z m 111.11253,-33.62532 c 3.68104,-5.90159 6.65065,-12.22571 9.51435,-18.0567 -5.74197,-4.83069 -18.72997,-12.23804 -28.86211,-17.79891 -16.4056,-9.0039 -20.24108,-11.70929 -30.26022,-10.37712 -13.02685,1.73206 -18.94914,10.62343 -18.94914,21.41668 0,16.10626 13.17906,29.86637 38.4375,40.13216 9.06503,3.68432 10.64355,4.38638 16.35224,5.95632 6.22307,-8.82933 9.1123,-13.80922 13.76738,-21.27243 z m 161.6848,5.12952 c 22.63107,-8.51735 49.20882,-22.61083 57.1498,-29.78111 12.96065,-11.70277 10.3598,-33.89411 -1.2579,-33.89411 -6.87273,0 -35.40483,13.00679 -52.90578,22.56803 -26.8587,14.67371 -44.8684,28.7812 -50.74299,49.79679 7.93069,-0.13292 5.46088,0.55312 17.91385,-1.00227 7.75246,-0.96829 21.18181,-4.42758 29.84302,-7.68733 z M 403.62471,290.55367 c 15.61963,-7.12645 32.55171,-23.65944 39.6446,-37.37571 12.67211,-24.50505 17.08482,-40.94985 16.96043,-63.20656 -0.0988,-17.66936 -2.22983,-25.37692 -5.96578,-33.79573 -9.34193,-21.0517 -8.93615,-12.72592 -15.57631,-3.23371 -14.59385,20.86213 -25.17757,13.93615 -36.67009,5.72186 -12.40144,-8.86396 -6.23357,-6.35803 -19.06466,0.05 -10.03859,5.01338 -13.74028,3.70353 -21.34972,-1.0759 -7.60944,-4.77943 -13.66344,-10.00271 -17.2088,-22.09047 -3.85578,-13.14613 -1.7647,-12.74535 -13.09418,-4.84192 -22.98228,27.70184 -38.47232,103.39088 -11.78054,141.46771 17.53828,25.01903 50.94648,33.50906 84.10505,18.38046 z m -22.89229,-9.68061 c -0.21982,-1.04433 1.6154,-9.17646 0.20423,-15.5132 -2.91746,-13.10058 8.70009,-13.55304 9.43196,-2.81046 1.2534,10.76354 -4.37091,22.85472 -9.04883,21.11409 z m -59.56637,-9.07044 c -2.51607,-2.51606 -0.85951,-14.85117 2.02722,-20.245 4.60766,-6.8664 8.89219,-5.26144 5.61435,6.27018 1.88143,9.69023 -0.006,17.33132 -7.64157,13.97482 z M 431.99283,146.54508 c 2.86718,-3.05194 6.92032,-9.6352 9.00707,-14.62943 4.82046,-11.53709 4.95806,-40.928499 0.24435,-52.209975 -6.78957,-16.249808 -23.78528,-17.542624 -33.31908,-5.504293 -5.48703,6.928474 -9.40835,16.546333 -12.07927,10.371084 -1.06188,-2.4551 0.23568,-4.730687 1.46773,-7.857746 6.92011,-17.56393 -1.81554,-22.981026 -11.86101,-23.661753 -6.53281,-0.442693 -12.25518,2.972328 -20.24769,11.040967 -9.70032,9.792702 -17.78524,27.905126 -17.78524,49.330526 0,14.08222 3.45321,21.10568 9.27614,26.51831 5.82293,5.41263 11.49057,9.62395 19.23768,9.61982 7.74711,-0.004 9.08725,-5.01839 17.23334,-6.36358 6.95308,3.23098 9.89267,10.46839 22.51112,11.10913 8.72012,0.44279 12.75849,-3.97736 16.31486,-7.76298 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccscccccccccccccccscsccsscccsccccscsccscccccsscssscsssscsscscssscssssscssscscccsssscscccccsccssccssssscccccccccccccccccccccccsccssscsscccsssccsscsccscccccccsscssccssccsssccssccccccsssscsssscssssccscscsccscscscsccsscsccscccccccccccccccccccccccccccssccssccscssccssscccccccccccccscsssscssssscsscsssssssscsccssccscccccsssssssssccscc" />
+ <path
+ d="m 751.29906,574.49054 0,56.09559 -368.04049,133.95574 -368.040477,-133.95574 0,-56.61975 368.347517,133.55687 z"
+ id="path3354-4"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <g
+ transform="translate(0.11034178,-0.45120379)"
+ id="g5049-2"
+ style="stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline">
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3290-8"
+ d="m 321.48422,721.5392 -22.36609,12.913 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3292-8"
+ d="m 75.569784,632.03363 -22.366085,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3294-1"
+ d="m 305.08992,715.57213 -22.36608,12.91307 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3296-8"
+ d="m 288.69563,709.6051 -22.36609,12.9131 0,30.0332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3298-6"
+ d="m 272.30133,703.63806 -22.36608,12.91304 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3300-0"
+ d="m 255.90704,697.67102 -22.36609,12.91307 0,30.03331" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3302-2"
+ d="m 239.51274,691.70399 -22.36608,12.91306 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3304-4"
+ d="m 223.11845,685.73695 -22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3306-9"
+ d="m 206.72415,679.76992 -22.36609,12.91306 0,30.03332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3308-0"
+ d="m 190.32985,673.80288 -22.36608,12.91307 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3310-2"
+ d="m 173.93556,667.83585 -22.36609,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3312-2"
+ d="m 157.54126,661.86881 -22.36608,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3314-1"
+ d="m 141.14697,655.90177 -22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3316-5"
+ d="m 124.75267,649.93474 -22.36608,12.91306 0,30.03329" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3318-4"
+ d="m 108.35837,643.9677 -22.36608,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3320-4"
+ d="m 91.96408,638.00067 -22.366085,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3322-4"
+ d="m 443.61027,721.5392 22.36608,12.913 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3324-2"
+ d="m 476.39886,709.6051 22.36608,12.9131 0,30.0332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3326-5"
+ d="m 460.00456,715.57213 22.36609,12.91307 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3328-0"
+ d="m 525.58175,691.70399 22.36608,12.91306 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3330-4"
+ d="m 509.18745,697.67102 22.36609,12.91307 0,30.03331" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3332-2"
+ d="m 492.79316,703.63806 22.36608,12.91304 0,30.0333" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3334-1"
+ d="m 558.37034,679.76992 22.36608,12.91306 0,30.03332" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3336-2"
+ d="m 541.97604,685.73695 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3338-7"
+ d="m 607.55322,661.86881 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3340-7"
+ d="m 574.76463,673.80288 22.36609,12.91307 0,30.03325" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3342-9"
+ d="m 591.15893,667.83585 22.36609,12.91306 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3344-5"
+ d="m 689.5247,632.03363 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3346-5"
+ d="m 623.94752,655.90177 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3348-4"
+ d="m 640.34182,649.93474 22.36608,12.91306 0,30.03329" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3350-0"
+ d="m 656.73611,643.9677 22.36609,12.91307 0,30.03328" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#3e3e3e;stroke-width:9.60000038;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3352-3"
+ d="m 673.13041,638.00067 22.36608,12.91306 0,30.03328" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="dxf lineart"
+ style="display:none">
+ <g
+ style="display:inline"
+ transform="translate(-1595.256,-3899.9)"
+ id="layer1">
+ <g
+ transform="translate(1605.7072,3616.6359)"
+ id="g3058-1" />
+ <g
+ transform="translate(1605.7072,3616.6359)"
+ id="g3060">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 376.28676,565.33282 a 50.505437,50.505437 0 0 0 2.94079,-22.54604 4.006761,4.006761 0 1 0 -7.97559,0.77878 42.491917,42.491917 0 0 1 -2.47419,18.96875 4.0067627,4.0067627 0 0 0 7.50899,2.79851 z"
+ id="path3062-7"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 310.44438,550.74978 a 59.389614,59.389614 0 0 1 1.23877,-16.00076 4.0067628,4.0067628 0 0 1 7.83278,1.69238 51.376093,51.376093 0 0 0 -1.07162,13.84176 4.0067635,4.0067635 0 0 1 -7.99993,0.46662 z"
+ id="path3064-4"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 392.10618,427.13329 a 12.200345,12.200345 0 0 0 12.0626,-15.93766 22.471543,22.471543 0 0 0 -5.15835,-8.6452 11.14774,11.14774 0 0 0 -16.96297,10.95558 4.0067603,4.0067603 0 0 0 7.93984,-1.08418 3.13422,3.13422 0 0 1 4.03924,-3.41591 14.458023,14.458023 0 0 1 2.51573,4.64997 4.186825,4.186825 0 0 1 -4.13955,5.46937 4.0067602,4.0067602 0 0 0 -0.29654,8.00803 z"
+ id="path3066-09"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 371.77724,411.5205 a 15.711594,15.711594 0 0 0 -0.4822,-3.9744 3.414554,3.414554 0 0 0 -6.42324,-0.56196 8.601878,8.601878 0 0 0 3.73033,11.08591 4.00676,4.00676 0 0 1 -3.83196,7.03793 16.615399,16.615399 0 0 1 -7.20551,-21.41355 11.428075,11.428075 0 0 1 21.49777,1.88081 23.725114,23.725114 0 0 1 0.72814,6.0015 4.0067635,4.0067635 0 0 1 -8.01333,-0.0562 z"
+ id="path3068-4"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 379.3526,301.76746 a 23.936355,23.936355 0 0 0 -9.95309,7.37952 4.0067642,4.0067642 0 1 1 -6.27618,-4.98259 31.949875,31.949875 0 0 1 13.28523,-9.85006 4.0067605,4.0067605 0 0 1 2.94404,7.45313 z"
+ id="path3070-8"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 445.68236,329.11654 a 17.364203,17.364203 0 0 0 -11.77173,-12.76486 4.0067634,4.0067634 0 1 1 2.3854,-7.65026 25.377723,25.377723 0 0 1 17.20435,18.65581 4.0067633,4.0067633 0 0 1 -7.81802,1.75931 z"
+ id="path3072-8"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 573.77832,824.21829 a 231.49358,231.49358 0 0 0 42.29005,-25.76377 97.552014,97.552014 0 0 1 -10.48364,37.94069 29.283353,29.283353 0 0 1 -12.73834,12.73834 208.98141,208.98141 0 0 1 -37.85329,14.91063 102.01883,102.01883 0 0 0 18.78522,-39.82589 z"
+ id="path3074-2"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 409.47237,828.37833 a 223.48006,223.48006 0 0 0 206.73547,-40.24557 97.552014,97.552014 0 0 0 -0.19497,-3.41849 80.161845,80.161845 0 0 0 -11.72761,-36.13952 26.25055,26.25055 0 0 0 -21.76496,-12.45524 215.19714,215.19714 0 0 1 -186.57181,44.02404 217.80817,217.80817 0 0 0 13.52388,48.23478 z"
+ id="path3076-4"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 517.45426,842.3746 a 107.84051,107.84051 0 0 1 -13.06728,29.83277 381.1671,381.1671 0 0 0 15.49202,-1.3351 208.98141,208.98141 0 0 0 21.55961,-3.44895 94.005315,94.005315 0 0 0 22.97314,-39.0461 231.49358,231.49358 0 0 1 -46.95749,13.99738 z"
+ id="path3078-5"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 450.45349,871.92484 a 82.150232,82.150232 0 0 0 12.01617,-26.0055 231.49358,231.49358 0 0 0 46.23144,-2.09169 99.826988,99.826988 0 0 1 -14.33124,28.90521 381.1671,381.1671 0 0 1 -43.91637,-0.80802 z"
+ id="path3080-5"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 413.65999,837.94547 a 231.49358,231.49358 0 0 0 40.66298,7.38175 74.136712,74.136712 0 0 1 -12.82798,25.25052 39.270306,39.270306 0 0 1 -20.00183,-17.43165 217.80817,217.80817 0 0 1 -7.83317,-15.20062 z"
+ id="path3082-1"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 394.76071,771.6117 a 207.18362,207.18362 0 0 0 23.71188,4.47646 73.871194,73.871194 0 0 0 1.94716,-13.81518 232.6189,232.6189 0 0 1 -26.66931,-1.40174 217.80817,217.80817 0 0 0 1.01027,10.74046 z"
+ id="path3084-7"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 426.49583,776.96489 a 207.18362,207.18362 0 0 0 44.08456,-0.76029 79.152083,79.152083 0 0 0 9.83174,-22.10671 232.6189,232.6189 0 0 1 -51.96427,7.99697 81.884715,81.884715 0 0 1 -1.95203,14.87003 z"
+ id="path3086-1"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 489.28386,751.49075 a 87.165603,87.165603 0 0 1 -8.50621,23.18584 207.18362,207.18362 0 0 0 55.05061,-17.86255 77.758554,77.758554 0 0 0 2.10781,-27.07964 232.6189,232.6189 0 0 1 -48.65221,21.75635 z"
+ id="path3088-1"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 393.3415,752.76013 a 217.80817,217.80817 0 0 1 1.1775,-30.55375 283.78976,283.78976 0 0 1 1.37461,-10.69942 202.37681,202.37681 0 0 0 114.74785,-44.62022 l 13.46305,-9.42693 a 30.662014,30.662014 0 0 1 30.54534,-2.67237 43.31958,43.31958 0 0 1 24.50085,32.62626 224.60538,224.60538 0 0 1 -185.8092,65.34643 z"
+ id="path3090-5"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 397.2145,703.38787 a 194.36329,194.36329 0 0 0 108.49341,-42.81743 23.586902,23.586902 0 0 0 7.177,-26.78491 9.918601,9.918601 0 0 0 -9.0861,-6.36216 46.235274,46.235274 0 0 0 -20.07565,4.19848 368.58869,368.58869 0 0 0 -82.20858,51.76929 283.78976,283.78976 0 0 0 -4.30008,19.99673 z"
+ id="path3092-2"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 330.50955,405.93841 a 43.354257,43.354257 0 0 0 -21.50063,22.02808 209.96578,209.96578 0 0 0 -17.42053,85.99371 70.711924,70.711924 0 0 0 11.83735,38.4211 73.780204,73.780204 0 0 0 36.19311,28.46005 56.856184,56.856184 0 0 0 26.52196,2.98592 76.570466,76.570466 0 0 0 22.51248,-6.43214 134.78926,134.78926 0 0 0 31.95362,-20.63291 86.740478,86.740478 0 0 0 29.81077,-62.11513 288.53091,288.53091 0 0 0 -2.17155,-48.33622 33.216431,33.216431 0 0 0 -13.19493,-22.44209 85.769489,85.769489 0 0 1 -11.32318,18.65937 20.678757,20.678757 0 0 1 -29.15081,3.20659 l -12.48299,-10.06693 -5.83399,3.19814 a 20.393506,20.393506 0 0 1 -20.81496,1.9248 43.705101,43.705101 0 0 1 -23.03486,-26.94516 75.590657,75.590657 0 0 1 -1.90086,-7.90718 z"
+ id="path3094-7"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 382.94763,426.06136 16.66009,13.43555 a 12.665237,12.665237 0 0 0 17.85416,-1.96395 77.755969,77.755969 0 0 0 11.39889,-77.33361 16.166727,16.166727 0 0 0 -27.11236,-4.71923 57.567866,57.567866 0 0 0 -9.01787,14.03492 4.00676,4.00676 0 0 1 -7.47927,-2.8312 l 3.66419,-11.92814 a 20.187638,20.187638 0 0 0 -4.10085,-15.3254 13.55444,13.55444 0 0 0 -18.36656,-2.78633 67.577137,67.577137 0 0 0 -26.35813,74.91214 35.691581,35.691581 0 0 0 18.81131,22.00464 12.379986,12.379986 0 0 0 12.99693,-1.44218 l 11.04947,-6.05721 z"
+ id="path3096-6"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 179.88519,850.89001 a 143.93977,143.93977 0 0 0 -60.7871,11.41043 39.086677,39.086677 0 0 1 31.634,-33.28021 75.323314,75.323314 0 0 0 2.87715,2.61567 204.7432,204.7432 0 0 0 26.27595,19.25411 z"
+ id="path3098-1"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 180.7201,841.94194 a 63.377551,63.377551 0 0 1 -1.06614,-14.26533 168.39098,168.39098 0 0 0 36.56014,14.90295 79.890316,79.890316 0 0 0 10.90348,21.32858 196.72968,196.72968 0 0 1 -46.39748,-21.9662 z"
+ id="path3100-4"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 155.0269,736.60456 a 82.876006,82.876006 0 0 0 27.62666,25.09115 130.32087,130.32087 0 0 0 74.55456,16.14168 164.72099,164.72099 0 0 0 15.34776,62.39714 160.37746,160.37746 0 0 1 -136.796,-59.85916 67.309794,67.309794 0 0 1 -0.20129,-8.24674 45.220678,45.220678 0 0 1 19.46831,-35.52407 z"
+ id="path3102-2"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 139.14621,796.42854 a 168.39098,168.39098 0 0 0 32.78872,26.71342 71.391072,71.391072 0 0 0 -0.11078,12.70846 196.72968,196.72968 0 0 1 -12.97919,-10.28113 67.309794,67.309794 0 0 1 -19.69875,-29.14075 z"
+ id="path3104-3"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 341.4891,589.85722 a 55.435829,55.435829 0 0 0 -3.2324,14.50355 71.84369,71.84369 0 0 1 11.19892,-6.75508 18.566982,18.566982 0 0 1 23.47316,6.28961 55.133466,55.133466 0 0 1 9.2031,25.28531 115.24382,115.24382 0 0 1 -6.52826,51.71425 126.76861,126.76861 0 0 0 -6.84034,27.96367 258.78206,258.78206 0 0 0 9.55239,109.18435 88.989436,88.989436 0 0 0 27.4297,41.50727 115.2534,115.2534 0 0 0 7.14653,-5.382 225.82169,225.82169 0 0 1 -26.33907,-132.83166 291.80328,291.80328 0 0 1 25.82839,-92.10092 8852.0265,8852.0265 0 0 0 12.90415,-27.67305 271.41458,271.41458 0 0 0 20.23505,-62.43919 94.753998,94.753998 0 0 1 -19.66016,23.69024 142.80278,142.80278 0 0 1 -33.85334,21.85959 84.583986,84.583986 0 0 1 -24.86854,7.10529 64.869704,64.869704 0 0 1 -25.64928,-1.92123 z"
+ id="path3106-2"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 369.13833,815.32419 a 74.028904,74.028904 0 0 1 -95.89339,5.11915 156.70747,156.70747 0 0 0 7.87587,19.12 72.321745,72.321745 0 0 0 10.15696,15.35524 101.22787,101.22787 0 0 0 67.15775,-1.90467 4.00676,4.00676 0 1 1 2.87252,7.48098 109.24139,109.24139 0 0 1 -57.82815,5.65243 72.321745,72.321745 0 0 0 22.40696,10.97918 68.754331,68.754331 0 0 0 26.53851,2.32182 115.2534,115.2534 0 0 0 46.29388,-15.39035 97.002956,97.002956 0 0 1 -28.05765,-43.64199 266.79558,266.79558 0 0 1 -1.52326,-5.09179 z"
+ id="path3108-2"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 331.35491,621.89163 a 63.83017,63.83017 0 0 0 -6.26256,9.21212 593.88382,593.88382 0 0 0 -3.81437,6.93228 23.165032,23.165032 0 0 0 9.50587,5.45484 4.00676,4.00676 0 0 1 -2.23105,7.69668 31.178552,31.178552 0 0 1 -11.14625,-5.8833 593.88382,593.88382 0 0 0 -6.91493,13.6255 407.95821,407.95821 0 0 1 -4.08498,8.0845 48.659079,48.659079 0 0 0 46.84863,19.18747 4.0067617,4.0067617 0 1 1 1.2638,7.91324 56.672599,56.672599 0 0 1 -52.22496,-19.38464 407.95821,407.95821 0 0 1 -16.52659,27.58179 65.112051,65.112051 0 0 0 52.57372,21.39817 4.0067601,4.0067601 0 1 1 0.51631,7.99687 73.125571,73.125571 0 0 1 -57.61157,-22.48672 105.69968,105.69968 0 0 0 -14.77227,40.38221 82.248315,82.248315 0 0 0 75.51268,24.07677 4.00676,4.00676 0 0 1 1.54551,7.86307 90.261836,90.261836 0 0 1 -78.11221,-21.76739 156.70747,156.70747 0 0 0 3.66136,45.9627 66.015383,66.015383 0 0 0 97.64216,0.62811 266.79558,266.79558 0 0 1 -5.90981,-98.5153 134.78213,134.78213 0 0 1 7.27275,-29.73136 107.2303,107.2303 0 0 0 6.07431,-48.11829 47.119946,47.119946 0 0 0 -7.86545,-21.61014 10.553462,10.553462 0 0 0 -13.34213,-3.57501 63.83017,63.83017 0 0 0 -14.61804,9.78433 55.435829,55.435829 0 0 0 2.04764,10.34614 80.71878,80.71878 0 0 0 10.60797,22.29072 29.900833,29.900833 0 0 1 0,33.65259 4.0067602,4.0067602 0 0 1 -6.62426,-4.50951 21.887312,21.887312 0 0 0 1.95062,-21.10962 31.201566,31.201566 0 0 1 -14.27347,19.66503 4.0067611,4.0067611 0 0 1 -4.14047,-6.86098 23.188046,23.188046 0 0 0 9.62936,-28.26012 88.732301,88.732301 0 0 1 -4.82714,-12.57156 63.449349,63.449349 0 0 1 -1.35018,-5.35119 z"
+ id="path3110-1"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 269.57245,713.65446 a 113.7132,113.7132 0 0 0 -11.4262,37.77549 110.10404,110.10404 0 0 1 -96.97148,-61.264 49.107667,49.107667 0 0 1 17.58582,-15.78918 36.418066,36.418066 0 0 1 25.93358,-3.17223 30.817043,30.817043 0 0 0 2.53011,4.95806 72.633968,72.633968 0 0 0 22.72798,22.72798 103.55567,103.55567 0 0 0 39.62019,14.76388 z"
+ id="path3112-6"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 215.86437,750.95726 a 106.24555,106.24555 0 0 0 1.67841,15.89514 122.30735,122.30735 0 0 1 -30.97555,-12.14953 74.862486,74.862486 0 0 1 -7.75035,-4.98777 64.183337,64.183337 0 0 1 2.26887,-20.3627 118.11756,118.11756 0 0 0 34.77862,21.60486 z"
+ id="path3114-8"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 174.63302,723.11977 a 72.196858,72.196858 0 0 0 -3.81679,19.80765 74.862486,74.862486 0 0 1 -13.79039,-18.41208 28.198881,28.198881 0 0 1 -1.92017,-21.94772 49.107667,49.107667 0 0 1 1.46515,-3.93072 118.11756,118.11756 0 0 0 18.0622,24.48287 z"
+ id="path3116-5"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 273.73824,706.13565 a 95.542154,95.542154 0 0 1 -39.51377,-14.0248 64.620448,64.620448 0 0 1 -20.22046,-20.22046 22.803523,22.803523 0 0 1 26.02263,-33.94491 149.61449,149.61449 0 0 1 55.90254,31.71704 399.94469,399.94469 0 0 1 -19.33967,31.99615 113.7132,113.7132 0 0 0 -2.85127,4.47698 z"
+ id="path3118-7"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 545.05438,752.02278 a 85.772074,85.772074 0 0 0 0.38873,-26.93543 232.6189,232.6189 0 0 0 34.00718,-26.74347 119.25749,119.25749 0 0 1 -9.91732,37.83297 207.18362,207.18362 0 0 1 -24.47859,15.84593 z"
+ id="path3120-6"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 240.84019,867.78115 a 71.876795,71.876795 0 0 1 -15.21004,-22.88963 168.39098,168.39098 0 0 0 50.89266,3.05759 80.335265,80.335265 0 0 0 20.63345,23.4764 154.30544,154.30544 0 0 1 -49.09939,-2.03029 196.72968,196.72968 0 0 1 -7.21668,-1.61407 z"
+ id="path3122-1"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 224.02047,753.88817 a 118.11756,118.11756 0 0 0 33.39064,5.54325 164.72099,164.72099 0 0 0 -0.36757,10.377 122.30735,122.30735 0 0 1 -30.98247,-1.21337 98.23203,98.23203 0 0 1 -2.0406,-14.70688 z"
+ id="path3124-8"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 581.2891,728.10608 a 34.26407,34.26407 0 0 1 29.81506,16.25927 88.175365,88.175365 0 0 1 12.89998,39.75227 105.56553,105.56553 0 0 1 -11.28476,55.92633 37.296873,37.296873 0 0 1 -16.22425,16.22424 216.99493,216.99493 0 0 1 -75.76537,22.57231 389.18062,389.18062 0 0 1 -78.68798,0.40113 47.283826,47.283826 0 0 1 -24.9978,-18.12609 123.26692,123.26692 0 0 1 -63.75725,26.29987 76.767852,76.767852 0 0 1 -29.63164,-2.59243 80.335265,80.335265 0 0 1 -16.39729,-6.79646 162.31896,162.31896 0 0 1 -60.80272,-0.7795 204.7432,204.7432 0 0 1 -48.82219,-16.5864 135.92625,135.92625 0 0 0 -81.12913,11.60923 4.00676,4.00676 0 0 1 -5.7421,-3.49872 47.100197,47.100197 0 0 1 33.74161,-46.48812 75.323314,75.323314 0 0 1 -16.95274,-50.45011 53.234199,53.234199 0 0 1 23.22968,-42.03299 82.876006,82.876006 0 0 1 -0.83023,-1.5231 36.212402,36.212402 0 0 1 -2.46585,-28.18481 57.121187,57.121187 0 0 1 27.515,-32.79109 44.431586,44.431586 0 0 1 27.61588,-4.68162 30.817043,30.817043 0 0 1 39.77667,-32.33039 157.62801,157.62801 0 0 1 57.39495,32.08215 399.94469,399.94469 0 0 0 3.51298,-6.97563 601.89734,601.89734 0 0 1 14.79775,-28.20148 71.84369,71.84369 0 0 1 11.98838,-15.82569 63.449349,63.449349 0 0 1 3.83179,-24.13961 81.793724,81.793724 0 0 1 -37.16337,-30.40815 78.725445,78.725445 0 0 1 -13.17884,-42.77522 217.9793,217.9793 0 0 1 18.0854,-89.27573 51.367777,51.367777 0 0 1 27.79302,-27.10727 75.590657,75.590657 0 0 1 32.44045,-67.61214 21.56796,21.56796 0 0 1 29.22504,4.43363 28.201159,28.201159 0 0 1 5.85316,14.40068 24.180247,24.180247 0 0 1 39.32928,8.34011 85.769489,85.769489 0 0 1 1.73021,58.95357 41.229951,41.229951 0 0 1 18.16135,29.10313 296.54442,296.54442 0 0 1 2.23278,49.6552 279.4281,279.4281 0 0 1 -25.87209,110.0002 8860.04,8860.04 0 0 1 -12.91584,27.69811 283.78976,283.78976 0 0 0 -14.4139,37.46509 376.60221,376.60221 0 0 1 75.15967,-45.76261 54.248794,54.248794 0 0 1 23.55518,-4.92616 17.932121,17.932121 0 0 1 16.42701,11.50232 31.600422,31.600422 0 0 1 1.24923,18.60663 38.675535,38.675535 0 0 1 36.42124,-1.99531 51.333101,51.333101 0 0 1 29.44345,50.99757 127.27101,127.27101 0 0 1 -6.19086,29.58379 z"
+ id="path3126-9"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 8.01352,861.4055 0,50.1886 34.304866,12.48595 20.748018,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.564258,2.3892 20.748018,-11.97888 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.924741,8.61681 6.564258,2.38919 20.748018,-11.97887 a 4.0067603,4.0067603 0 0 1 4.006761,6.93991 l -14.924741,8.6168 6.564258,2.3892 20.748017,-11.97888 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.61681 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56426,2.3892 20.74801,-11.97888 a 4.0067635,4.0067635 0 0 1 4.00676,6.93992 l -14.92474,8.6168 6.56426,2.38919 20.74802,-11.97887 a 4.0067603,4.0067603 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56426,2.3892 20.74801,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.61681 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92475,8.6168 6.56426,2.3892 20.74802,-11.97888 a 4.0067635,4.0067635 0 0 1 4.00676,6.93992 l -14.92474,8.6168 6.56426,2.38919 20.74802,-11.97887 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.6168 6.56425,2.3892 20.74802,-11.97888 a 4.0067635,4.0067635 0 0 1 4.00676,6.93992 l -14.92474,8.6168 6.56426,2.38918 20.74802,-11.97886 a 4.00676,4.00676 0 0 1 4.00676,6.93991 l -14.92474,8.61685 6.56426,2.3891 20.74801,-11.97883 a 4.0067678,4.0067678 0 0 1 4.00676,6.93993 l -14.92474,8.6168 6.56426,2.3892 20.74802,-11.9789 a 4.00676,4.00676 0 0 1 4.00676,6.9399 l -14.92474,8.6168 69.97762,25.4698 0,-50.1886 L 8.01352,861.4055 z"
+ id="path3128"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 736.08097,861.4055 0,50.1886 -34.30487,12.48595 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56425,2.3892 -20.74802,-11.97888 a 4.0067603,4.0067603 0 0 0 -4.00676,6.93991 l 14.92474,8.61681 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74801,-11.97888 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.61681 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74801,-11.97888 a 4.006766,4.006766 0 0 0 -4.00677,6.93992 l 14.92475,8.6168 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56425,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.61681 -6.56426,2.38919 -20.74802,-11.97887 a 4.0067603,4.0067603 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74801,-11.97888 a 4.0067635,4.0067635 0 0 0 -4.00676,6.93992 l 14.92474,8.6168 -6.56426,2.38919 -20.74802,-11.97887 a 4.00676,4.00676 0 0 0 -4.00676,6.93991 l 14.92474,8.6168 -6.56426,2.3892 -20.74802,-11.97888 a 4.006761,4.006761 0 0 0 -4.00675,6.93992 l 14.92474,8.6168 -6.56426,2.38918 -20.74802,-11.97886 a 4.0067603,4.0067603 0 0 0 -4.00676,6.93991 l 14.92474,8.61685 -6.56426,2.3891 -20.74802,-11.97883 a 4.0067678,4.0067678 0 0 0 -4.00676,6.93993 l 14.92474,8.6168 -6.56425,2.3892 -20.74802,-11.9789 a 4.00676,4.00676 0 0 0 -4.00676,6.9399 l 14.92474,8.6168 -69.97763,25.4698 0,-50.1886 360.02697,-131.0391 z"
+ id="path3130"
+ style="fill:none;stroke:#00ff00" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,914.39966 a 4.00676,4.00676 0 0 0 2.636367,3.76513 l 36.060572,13.12497 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31104 8.380775,3.05036 0,27.22771 a 4.0067605,4.0067605 0 0 0 8.013521,0 l 0,-24.31103 8.380775,3.05035 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31103 8.380776,3.05035 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31104 8.380774,3.05035 0,27.22772 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31103 8.38078,3.05035 0,27.22772 a 4.0067605,4.0067605 0 0 0 8.01352,0 l 0,-24.31104 8.38077,3.05036 0,27.22771 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31103 8.38078,3.05035 0,27.22769 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31101 8.38077,3.05036 0,27.22775 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31107 8.38078,3.05035 0,27.22772 a 4.0067605,4.0067605 0 0 0 8.01352,0 l 0,-24.31104 8.38078,3.05036 0,27.22768 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.311 8.38077,3.05035 0,27.22775 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.31106 8.38078,3.05036 0,27.2277 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.311 8.38077,3.0503 0,27.2277 a 4.0067605,4.0067605 0 0 0 8.01352,0 l 0,-24.311 8.38078,3.0504 0,27.2277 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.3111 8.38077,3.0504 0,27.2277 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-24.311 78.05196,28.4086 a 4.00676,4.00676 0 0 0 2.74079,0 l 78.05195,-28.4086 0,24.311 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.2277 8.38078,-3.0504 0,24.3111 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.2277 8.38078,-3.0504 0,24.311 a 4.00676,4.00676 0 0 0 8.01351,0 l 0,-27.2277 8.38078,-3.0503 0,24.311 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.2277 8.38078,-3.05036 0,24.31106 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22775 8.38077,-3.05035 0,24.311 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22768 8.38078,-3.05036 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38077,-3.05035 0,24.31107 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22775 8.38078,-3.05036 0,24.31101 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22769 8.38077,-3.05035 0,24.31103 a 4.006765,4.006765 0 0 0 8.01353,0 l 0,-27.22771 8.38077,-3.05036 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38078,-3.05035 0,24.31103 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38077,-3.05035 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38078,-3.05035 0,24.31103 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 8.38077,-3.05035 0,24.31103 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22771 8.38078,-3.05036 0,24.31104 a 4.00676,4.00676 0 0 0 8.01352,0 l 0,-27.22772 36.06057,-13.12497 a 4.00676,4.00676 0 0 0 2.63637,-3.76513 l 0,-58.7164 a 4.00676,4.00676 0 0 0 -2.31343,-3.63136 L 637.06594,803.22244 a 4.0067602,4.0067602 0 0 0 -3.38666,7.26271 l 95.94824,44.7414 L 372.04724,985.37513 14.466964,855.22655 121.47719,805.32686 a 4.0067602,4.0067602 0 1 0 -3.38666,-7.26271 L 2.31343,852.0519 A 4.00676,4.00676 0 0 0 0,855.68326 l 0,58.7164 z"
+ id="path3132"
+ style="fill:none;stroke:#00ff00" />
+ </g>
+ <g
+ transform="translate(1605.7072,3616.6359)"
+ id="g3210">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 382.52092,430.86458 14.57154,11.75125 a 16.671997,16.671997 0 0 0 23.50249,-2.58528 81.762729,81.762729 0 0 0 11.98627,-81.3186 20.173487,20.173487 0 0 0 -33.84358,-5.87562 61.574626,61.574626 0 0 0 -9.65625,15.02408 l 3.75178,-12.2133 a 24.194398,24.194398 0 0 0 -4.86625,-18.69008 17.5612,17.5612 0 0 0 -23.7958,-3.60998 71.583897,71.583897 0 0 0 -27.92096,79.3538 39.698341,39.698341 0 0 0 20.92309,24.4749 16.386746,16.386746 0 0 0 16.9218,-1.69218 l 8.42587,-4.61899 z"
+ id="path3212"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 372.53226,563.93357 a 46.498677,46.498677 0 0 0 2.70749,-20.7574"
+ id="path3214-2"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 315.59954,535.59521 a 55.382854,55.382854 0 0 0 -1.1552,14.92126"
+ id="path3216-7"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 333.7265,400.35197 a 47.361017,47.361017 0 0 0 -28.39168,26.01605 213.97254,213.97254 0 0 0 -17.75297,87.63472 74.718685,74.718685 0 0 0 12.5081,40.59816 77.786964,77.786964 0 0 0 38.15864,30.00562 60.862944,60.862944 0 0 0 28.391,3.19634 80.577226,80.577226 0 0 0 23.69051,-6.76872 138.79602,138.79602 0 0 0 32.90348,-21.24625 90.747238,90.747238 0 0 0 31.18781,-64.98437 292.53766,292.53766 0 0 0 -2.20171,-49.00746 37.223191,37.223191 0 0 0 -19.05684,-27.8772"
+ id="path3218-9"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 341.21132,638.22132 A 27.194806,27.194806 0 0 1 329.9731,671.50499"
+ id="path3220-5"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 339.16702,584.93246 a 59.442589,59.442589 0 0 0 -2.62324,41.16208 84.725541,84.725541 0 0 0 11.13454,23.3972 25.894073,25.894073 0 0 1 0,29.14308"
+ id="path3222-4"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 543.44764,871.08733 A 98.012075,98.012075 0 0 0 570.2837,821.42548"
+ id="path3224-3"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 514.2071,838.88789 a 103.83375,103.83375 0 0 1 -17.74383,37.76773"
+ id="path3226-1"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 421.457,780.4836 a 77.877955,77.877955 0 0 0 3.04257,-22.27427"
+ id="path3228-2"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 472.9134,779.94366 a 83.158843,83.158843 0 0 0 12.90414,-31.57337"
+ id="path3230-3"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 539.22236,759.60757 a 81.765314,81.765314 0 0 0 1.84844,-36.48441"
+ id="path3232-3"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 391.12429,774.81454 a 211.19038,211.19038 0 0 0 189.93266,-42.69491 30.25731,30.25731 0 0 1 26.63776,14.35042 84.168605,84.168605 0 0 1 12.3138,37.94589 101.55877,101.55877 0 0 1 -10.85646,53.80364 33.290113,33.290113 0 0 1 -14.48129,14.48129 212.98817,212.98817 0 0 1 -74.36638,22.15551 385.17386,385.17386 0 0 1 -77.47265,0.43588 43.277066,43.277066 0 0 1 -24.83099,-20.18217 221.81493,221.81493 0 0 1 -27.46482,-133.33866 287.79652,287.79652 0 0 1 25.47373,-90.83627 8856.0333,8856.0333 0 0 0 12.91,-27.68558 275.42134,275.42134 0 0 0 25.50174,-108.44606"
+ id="path3234-4"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 392.25445,423.12927 a 8.193585,8.193585 0 0 0 8.10107,-10.70351 18.464783,18.464783 0 0 0 -3.87707,-6.71529 7.14098,7.14098 0 0 0 -10.46107,7.25345"
+ id="path3236"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 366.68615,421.58902 a 12.608639,12.608639 0 0 1 -5.46792,-16.24974 7.421314,7.421314 0 0 1 13.9605,1.22139 19.718354,19.718354 0 0 1 0.60517,4.98795"
+ id="path3238"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 389.47225,756.31817 A 228.61214,228.61214 0 0 0 583.37899,688.82115"
+ id="path3240-1"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 459.3636,841.71136 a 78.143472,78.143472 0 0 1 -16.53187,33.5809"
+ id="path3242-1"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 392.42787,707.68071 a 198.37005,198.37005 0 0 0 115.80144,-43.99632 27.593662,27.593662 0 0 0 8.39617,-31.33493 13.925361,13.925361 0 0 0 -12.75656,-8.93223 50.242034,50.242034 0 0 0 -21.81541,4.56232 372.59545,372.59545 0 0 0 -84.1007,53.16609"
+ id="path3244-3"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 508.22931,663.68439 13.57702,-9.50673 a 34.668775,34.668775 0 0 1 34.53685,-3.02158 47.326341,47.326341 0 0 1 27.14527,47.017 123.26425,123.26425 0 0 1 -10.72617,40.58526"
+ id="path3246-8"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 406.48872,831.64439 A 227.48682,227.48682 0 0 0 620.27078,789.98146"
+ id="path3248-7"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 449.59137,328.23689 A 21.370963,21.370963 0 0 0 435.10333,312.52655"
+ id="path3250"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 377.88058,298.04089 a 27.943115,27.943115 0 0 0 -11.61916,8.61479"
+ id="path3252"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 405.51281,864.5415 a 92.996196,92.996196 0 0 1 -31.02418,-45.31207 262.78882,262.78882 0 0 1 -9.70029,-110.87486 130.77537,130.77537 0 0 1 7.05655,-28.84752 111.23706,111.23706 0 0 0 6.30128,-49.91627 51.126706,51.126706 0 0 0 -8.53427,-23.44772 14.560222,14.560222 0 0 0 -18.40765,-4.93232 67.83693,67.83693 0 0 0 -29.60939,27.93811 597.89058,597.89058 0 0 0 -14.69925,28.01374 403.95145,403.95145 0 0 1 -26.97769,46.72672 109.70644,109.70644 0 0 0 -17.9377,49.28344 160.71423,160.71423 0 0 0 15.54459,88.15775 76.328505,76.328505 0 0 0 47.24616,39.64424 72.761092,72.761092 0 0 0 28.08507,2.45713 119.26016,119.26016 0 0 0 65.1447,-28.32178"
+ id="path3254-4"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 316.38638,638.66914 a 27.171792,27.171792 0 0 0 13.28194,8.67007"
+ id="path3256-2"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 301.72732,667.31527 a 52.665839,52.665839 0 0 0 52.15985,22.84307"
+ id="path3258-7"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 280.75734,702.63171 a 69.118811,69.118811 0 0 0 57.84206,25.07701"
+ id="path3260-7"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 262.24527,750.93628 a 86.255075,86.255075 0 0 0 80.51388,26.67467"
+ id="path3262-9"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 265.41082,807.63634 a 70.022143,70.022143 0 0 0 105.72256,-0.1937"
+ id="path3264-3"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 359.87178,856.7544 a 105.23463,105.23463 0 0 1 -70.88249,1.63225"
+ id="path3266-1"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 307.96308,873.8255 a 158.3122,158.3122 0 0 1 -60.70711,-0.50438 200.73644,200.73644 0 0 1 -91.02887,-44.71853 71.316554,71.316554 0 0 1 -24.67254,-56.62182 49.227439,49.227439 0 0 1 24.65824,-40.8605"
+ id="path3268-9"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 261.07655,773.42067 a 126.31411,126.31411 0 0 1 -76.46616,-15.22138 78.869246,78.869246 0 0 1 -31.12248,-31.80322 32.205641,32.205641 0 0 1 -2.19301,-25.06626 53.114427,53.114427 0 0 1 25.58496,-30.49097 40.424826,40.424826 0 0 1 30.8812,-2.93695"
+ id="path3270-8"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 275.88011,710.39411 a 99.548914,99.548914 0 0 1 -43.79174,-14.89339 68.627208,68.627208 0 0 1 -21.47423,-21.47423 26.810283,26.810283 0 0 1 30.59503,-39.9093 153.62125,153.62125 0 0 1 59.7228,34.69979"
+ id="path3272-6"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 278.74109,843.70013 A 164.38422,164.38422 0 0 1 131.88286,781.93476"
+ id="path3274-5"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 261.75187,755.43438 A 114.1108,114.1108 0 0 1 156.58875,689.88039"
+ id="path3276-0"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 198.87079,856.80555 a 139.93301,139.93301 0 0 0 -84.10393,11.85358 43.093437,43.093437 0 0 1 37.33346,-43.91361"
+ id="path3278-2"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 219.36836,839.27942 a 75.883556,75.883556 0 0 0 19.43078,32.12534"
+ id="path3280-8"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 176.21099,821.06404 a 67.384312,67.384312 0 0 0 0.91717,23.32019"
+ id="path3282-6"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 219.82446,748.19616 a 102.23879,102.23879 0 0 0 2.92741,23.87741"
+ id="path3284-0"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 179.26009,722.11589 A 68.190098,68.190098 0 0 0 174.935,751.80737"
+ id="path3286-2"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 372.04724,989.63904 0,58.71636"
+ id="path3288-4"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 310.98422,1005.0767 -22.36609,12.913 0,30.0333"
+ id="path3290"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 65.069784,915.57113 -22.366085,12.91307 0,30.03328"
+ id="path3292"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 294.58992,999.10963 -22.36608,12.91307 0,30.0333"
+ id="path3294"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 278.19563,993.1426 -22.36609,12.9131 0,30.0332"
+ id="path3296"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 261.80133,987.17556 -22.36608,12.91304 0,30.0333"
+ id="path3298"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 245.40704,981.20852 -22.36609,12.91307 0,30.03331"
+ id="path3300"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 229.01274,975.24149 -22.36608,12.91306 0,30.03325"
+ id="path3302"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 212.61845,969.27445 -22.36609,12.91307 0,30.03328"
+ id="path3304"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 196.22415,963.30742 -22.36609,12.91306 0,30.03332"
+ id="path3306"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 179.82985,957.34038 -22.36608,12.91307 0,30.03325"
+ id="path3308"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 163.43556,951.37335 -22.36609,12.91306 0,30.03328"
+ id="path3310"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 147.04126,945.40631 -22.36608,12.91307 0,30.03328"
+ id="path3312"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 130.64697,939.43927 -22.36609,12.91307 0,30.03328"
+ id="path3314"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 114.25267,933.47224 -22.366084,12.91306 0,30.03329"
+ id="path3316"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 97.858375,927.5052 -22.366085,12.91307 0,30.03328"
+ id="path3318"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 81.46408,921.53817 -22.366085,12.91306 0,30.03328"
+ id="path3320"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 433.11027,1005.0767 22.36608,12.913 0,30.0333"
+ id="path3322"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 465.89886,993.1426 22.36608,12.9131 0,30.0332"
+ id="path3324"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 449.50456,999.10963 22.36609,12.91307 0,30.0333"
+ id="path3326"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 515.08175,975.24149 22.36608,12.91306 0,30.03325"
+ id="path3328"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 498.68745,981.20852 22.36609,12.91307 0,30.03331"
+ id="path3330"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 482.29316,987.17556 22.36608,12.91304 0,30.0333"
+ id="path3332"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 547.87034,963.30742 22.36608,12.91306 0,30.03332"
+ id="path3334"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 531.47604,969.27445 22.36609,12.91307 0,30.03328"
+ id="path3336"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 597.05322,945.40631 22.36609,12.91307 0,30.03328"
+ id="path3338"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 564.26463,957.34038 22.36609,12.91307 0,30.03325"
+ id="path3340"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 580.65893,951.37335 22.36609,12.91306 0,30.03328"
+ id="path3342"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 679.0247,915.57113 22.36609,12.91307 0,30.03328"
+ id="path3344"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 613.44752,939.43927 22.36609,12.91307 0,30.03328"
+ id="path3346"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 629.84182,933.47224 22.36608,12.91306 0,30.03329"
+ id="path3348"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 646.23611,927.5052 22.36609,12.91307 0,30.03328"
+ id="path3350"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 662.63041,921.53817 22.36608,12.91306 0,30.03328"
+ id="path3352"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 740.08773,855.68326 0,58.7164 L 372.04724,1048.3554 4.00676,914.39966 l 0,-58.7164"
+ id="path3354-8"
+ style="fill:none;stroke:#0000ff" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 119.78386,801.69551 4.00676,855.68326 372.04724,989.63904 740.08773,855.68326 635.37261,806.85379"
+ id="path3356"
+ style="fill:none;stroke:#0000ff" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/py/asmx64.c b/py/asmx64.c
index ed9ca80f5..d3158170f 100644
--- a/py/asmx64.c
+++ b/py/asmx64.c
@@ -1,16 +1,18 @@
#include <stdio.h>
#include <assert.h>
-#include <sys/types.h>
-#include <sys/mman.h>
#include <string.h>
#include "misc.h"
-#include "asmx64.h"
#include "mpconfig.h"
// wrapper around everything in this file
#if MICROPY_EMIT_X64
+#include <sys/types.h>
+#include <sys/mman.h>
+
+#include "asmx64.h"
+
#if defined(__OpenBSD__) || defined(__MACH__)
#define MAP_ANONYMOUS MAP_ANON
#endif
@@ -155,7 +157,7 @@ void asm_x64_end_pass(asm_x64_t *as) {
//as->code_base = m_new(byte, as->code_size); need to allocale executable memory
uint actual_alloc;
as->code_base = alloc_mem(as->code_size, &actual_alloc, true);
- printf("code_size: %u\n", as->code_size);
+ //printf("code_size: %u\n", as->code_size);
}
/*
diff --git a/py/emit.h b/py/emit.h
index ea6573103..66e87fd4c 100644
--- a/py/emit.h
+++ b/py/emit.h
@@ -5,7 +5,7 @@
* is not known until the end of pass 1.
* As a consequence, we don't know the maximum stack size until the end of pass 2.
* This is problematic for some emitters (x64) since they need to know the maximum
- * stack size to compile the entry to the function, and this effects code size.
+ * stack size to compile the entry to the function, and this affects code size.
*/
typedef enum {
diff --git a/py/gc.c b/py/gc.c
index 7d4cac6e7..054a3cc31 100644
--- a/py/gc.c
+++ b/py/gc.c
@@ -6,6 +6,8 @@
#include "mpconfig.h"
#include "gc.h"
+#if MICROPY_ENABLE_GC
+
// a machine word is big enough to hold a pointer
/*
#define BYTES_PER_WORD (8)
@@ -380,3 +382,5 @@ int main(void) {
gc_dump_at();
}
*/
+
+#endif // MICROPY_ENABLE_GC
diff --git a/py/lexerunix.c b/py/lexerunix.c
index 14c28c16d..5336610ba 100644
--- a/py/lexerunix.c
+++ b/py/lexerunix.c
@@ -4,8 +4,11 @@
#include <fcntl.h>
#include "misc.h"
+#include "mpconfig.h"
#include "lexer.h"
+#if MICROPY_ENABLE_LEXER_UNIX
+
typedef struct _str_buf_t {
bool free; // free src_beg when done
const char *src_beg; // beginning of source
@@ -78,3 +81,5 @@ mp_lexer_t *mp_import_open_file(qstr mod_name) {
vstr_printf(vstr, "%s.py", qstr_str(mod_name));
return mp_lexer_new_from_file(vstr_str(vstr)); // TODO does lexer need to copy the string? can we free it here?
}
+
+#endif // MICROPY_ENABLE_LEXER_UNIX
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 56495d915..2017ba366 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -4,26 +4,67 @@
#include <mpconfigport.h>
-#ifndef INT_FMT
-// printf format spec to use for machine_int_t and friends
-#ifdef __LP64__
-// Archs where machine_int_t == long, long != int
-#define UINT_FMT "%lu"
-#define INT_FMT "%ld"
-#else
-// Archs where machine_int_t == int
-#define UINT_FMT "%u"
-#define INT_FMT "%d"
+// Any options not explicitly set in mpconfigport.h will get default
+// values below.
+
+/*****************************************************************************/
+/* Micro Python emitters */
+
+// Whether to emit CPython byte codes (for debugging/testing)
+// Enabling this overrides all other emitters
+#ifndef MICROPY_EMIT_CPYTHON
+#define MICROPY_EMIT_CPYTHON (0)
#endif
-#endif //INT_FMT
+// Whether to emit x64 native code
+#ifndef MICROPY_EMIT_X64
+#define MICROPY_EMIT_X64 (0)
+#endif
-// Any options not explicitly set in mpconfigport.h will get default
-// values below.
+// Whether to emit thumb native code
+#ifndef MICROPY_EMIT_THUMB
+#define MICROPY_EMIT_THUMB (0)
+#endif
+
+// Whether to enable the thumb inline assembler
+#ifndef MICROPY_EMIT_INLINE_THUMB
+#define MICROPY_EMIT_INLINE_THUMB (0)
+#endif
+
+/*****************************************************************************/
+/* Internal debugging stuff */
// Whether to collect memory allocation stats
#ifndef MICROPY_MEM_STATS
-#define MICROPY_MEM_STATS (1)
+#define MICROPY_MEM_STATS (0)
+#endif
+
+// Whether to build code to show byte code
+#ifndef MICROPY_SHOW_BC
+#define MICROPY_SHOW_BC (0)
+#endif
+
+/*****************************************************************************/
+/* Fine control over Python features */
+
+// Whether to include the garbage collector
+#ifndef MICROPY_ENABLE_GC
+#define MICROPY_ENABLE_GC (0)
+#endif
+
+// Whether to include REPL helper function
+#ifndef MICROPY_ENABLE_REPL_HELPERS
+#define MICROPY_ENABLE_REPL_HELPERS (0)
+#endif
+
+// Whether to include lexer helper function for unix
+#ifndef MICROPY_ENABLE_LEXER_UNIX
+#define MICROPY_ENABLE_LEXER_UNIX (0)
+#endif
+
+// Whether to support float and complex types
+#ifndef MICROPY_ENABLE_FLOAT
+#define MICROPY_ENABLE_FLOAT (0)
#endif
// Whether to support slice object and correspondingly
@@ -31,3 +72,19 @@
#ifndef MICROPY_ENABLE_SLICE
#define MICROPY_ENABLE_SLICE (1)
#endif
+
+/*****************************************************************************/
+/* Miscellaneous settings */
+
+// printf format spec to use for machine_int_t and friends
+#ifndef INT_FMT
+#ifdef __LP64__
+// Archs where machine_int_t == long, long != int
+#define UINT_FMT "%lu"
+#define INT_FMT "%ld"
+#else
+// Archs where machine_int_t == int
+#define UINT_FMT "%u"
+#define INT_FMT "%d"
+#endif
+#endif //INT_FMT
diff --git a/py/obj.h b/py/obj.h
index 351310afa..49167bfcc 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -15,8 +15,8 @@ typedef machine_int_t mp_small_int_t;
typedef machine_float_t mp_float_t;
#endif
-// Anything that wants to be a Micro Python object must
-// have mp_obj_base_t as its first member (except NULL and small ints)
+// Anything that wants to be a Micro Python object must have
+// mp_obj_base_t as its first member (except NULL and small ints)
struct _mp_obj_type_t;
struct _mp_obj_base_t {
@@ -107,6 +107,7 @@ struct _mp_obj_type_t {
__next__ gen-instance
*/
};
+
typedef struct _mp_obj_type_t mp_obj_type_t;
// Constant objects, globally accessible
@@ -201,10 +202,12 @@ qstr mp_obj_str_get(mp_obj_t self_in);
// float
extern const mp_obj_type_t float_type;
mp_float_t mp_obj_float_get(mp_obj_t self_in);
+mp_obj_t mp_obj_float_binary_op(int op, mp_float_t lhs_val, mp_obj_t rhs);
// complex
extern const mp_obj_type_t complex_type;
void mp_obj_complex_get(mp_obj_t self_in, mp_float_t *real, mp_float_t *imag);
+mp_obj_t mp_obj_complex_binary_op(int op, mp_float_t lhs_real, mp_float_t lhs_imag, mp_obj_t rhs_in);
#endif
// tuple
@@ -240,6 +243,7 @@ typedef struct _mp_obj_fun_native_t { // need this so we can define const object
// for const function objects, make an empty, const map
// such functions won't be able to access the global scope, but that's probably okay
} mp_obj_fun_native_t;
+
extern const mp_obj_type_t fun_native_type;
extern const mp_obj_type_t fun_bc_type;
void mp_obj_fun_bc_get(mp_obj_t self_in, int *n_args, uint *n_state, const byte **code);
diff --git a/py/objbool.c b/py/objbool.c
index 54f2b5da1..cfab7db06 100644
--- a/py/objbool.c
+++ b/py/objbool.c
@@ -34,14 +34,8 @@ static mp_obj_t bool_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args
const mp_obj_type_t bool_type = {
{ &mp_const_type },
"bool",
- bool_print, // print
- bool_make_new, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .print = bool_print,
+ .make_new = bool_make_new,
};
static const mp_obj_bool_t false_obj = {{&bool_type}, false};
diff --git a/py/objboundmeth.c b/py/objboundmeth.c
index f4f306ae0..78e5c6249 100644
--- a/py/objboundmeth.c
+++ b/py/objboundmeth.c
@@ -36,14 +36,7 @@ mp_obj_t bound_meth_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
const mp_obj_type_t bound_meth_type = {
{ &mp_const_type },
"bound_method",
- NULL, // print
- NULL, // make_new
- bound_meth_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .call_n = bound_meth_call_n,
};
mp_obj_t mp_obj_new_bound_meth(mp_obj_t self, mp_obj_t meth) {
diff --git a/py/objcell.c b/py/objcell.c
index 628a289d5..264125bf3 100644
--- a/py/objcell.c
+++ b/py/objcell.c
@@ -26,14 +26,6 @@ void mp_obj_cell_set(mp_obj_t self_in, mp_obj_t obj) {
const mp_obj_type_t cell_type = {
{ &mp_const_type },
"cell",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
};
mp_obj_t mp_obj_new_cell(mp_obj_t obj) {
diff --git a/py/objclass.c b/py/objclass.c
index 086645cbb..d13d1775a 100644
--- a/py/objclass.c
+++ b/py/objclass.c
@@ -63,14 +63,7 @@ mp_map_t *mp_obj_class_get_locals(mp_obj_t self_in) {
const mp_obj_type_t class_type = {
{ &mp_const_type },
"class",
- NULL, // print
- NULL, // make_new
- class_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .call_n = class_call_n,
};
mp_obj_t mp_obj_new_class(mp_map_t *class_locals) {
diff --git a/py/objclosure.c b/py/objclosure.c
index 347f7a79f..b372ee6fe 100644
--- a/py/objclosure.c
+++ b/py/objclosure.c
@@ -35,14 +35,7 @@ mp_obj_t closure_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
const mp_obj_type_t closure_type = {
{ &mp_const_type },
"closure",
- NULL, // print
- NULL, // make_new
- closure_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .call_n = closure_call_n,
};
mp_obj_t mp_obj_new_closure(mp_obj_t fun, mp_obj_t closure_tuple) {
diff --git a/py/objcomplex.c b/py/objcomplex.c
index 9a814980c..1036bae42 100644
--- a/py/objcomplex.c
+++ b/py/objcomplex.c
@@ -48,14 +48,14 @@ static mp_obj_t complex_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *a
{
mp_float_t real, imag;
if (MP_OBJ_IS_TYPE(args[1], &complex_type)) {
- mp_obj_get_complex(args[1], &real, &imag);
+ mp_obj_complex_get(args[1], &real, &imag);
} else {
real = mp_obj_get_float(args[1]);
imag = 0;
}
if (MP_OBJ_IS_TYPE(args[0], &complex_type)) {
mp_float_t real2, imag2;
- mp_obj_get_complex(args[0], &real2, &imag2);
+ mp_obj_complex_get(args[0], &real2, &imag2);
real -= imag2;
imag += real2;
} else {
@@ -80,9 +80,37 @@ static mp_obj_t complex_unary_op(int op, mp_obj_t o_in) {
}
static mp_obj_t complex_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
- mp_float_t lhs_real, lhs_imag, rhs_real, rhs_imag;
- mp_obj_complex_get(lhs_in, &lhs_real, &lhs_imag);
- mp_obj_complex_get(rhs_in, &rhs_real, &rhs_imag);
+ mp_obj_complex_t *lhs = lhs_in;
+ return mp_obj_complex_binary_op(op, lhs->real, lhs->imag, rhs_in);
+}
+
+const mp_obj_type_t complex_type = {
+ { &mp_const_type },
+ "complex",
+ .print = complex_print,
+ .make_new = complex_make_new,
+ .unary_op = complex_unary_op,
+ .binary_op = complex_binary_op,
+};
+
+mp_obj_t mp_obj_new_complex(mp_float_t real, mp_float_t imag) {
+ mp_obj_complex_t *o = m_new_obj(mp_obj_complex_t);
+ o->base.type = &complex_type;
+ o->real = real;
+ o->imag = imag;
+ return o;
+}
+
+void mp_obj_complex_get(mp_obj_t self_in, mp_float_t *real, mp_float_t *imag) {
+ assert(MP_OBJ_IS_TYPE(self_in, &complex_type));
+ mp_obj_complex_t *self = self_in;
+ *real = self->real;
+ *imag = self->imag;
+}
+
+mp_obj_t mp_obj_complex_binary_op(int op, mp_float_t lhs_real, mp_float_t lhs_imag, mp_obj_t rhs_in) {
+ mp_float_t rhs_real, rhs_imag;
+ mp_obj_get_complex(rhs_in, &rhs_real, &rhs_imag); // can be any type, this function will convert to float (if possible)
switch (op) {
case RT_BINARY_OP_ADD:
case RT_BINARY_OP_INPLACE_ADD:
@@ -115,32 +143,4 @@ static mp_obj_t complex_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
return mp_obj_new_complex(lhs_real, lhs_imag);
}
-const mp_obj_type_t complex_type = {
- { &mp_const_type },
- "complex",
- complex_print, // print
- complex_make_new, // make_new
- NULL, // call_n
- complex_unary_op, // unary_op
- complex_binary_op, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
-};
-
-mp_obj_t mp_obj_new_complex(mp_float_t real, mp_float_t imag) {
- mp_obj_complex_t *o = m_new_obj(mp_obj_complex_t);
- o->base.type = &complex_type;
- o->real = real;
- o->imag = imag;
- return o;
-}
-
-void mp_obj_complex_get(mp_obj_t self_in, mp_float_t *real, mp_float_t *imag) {
- assert(MP_OBJ_IS_TYPE(self_in, &complex_type));
- mp_obj_complex_t *self = self_in;
- *real = self->real;
- *imag = self->imag;
-}
-
#endif
diff --git a/py/objdict.c b/py/objdict.c
index a00d172cf..66a442fba 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -66,8 +66,6 @@ const mp_obj_type_t dict_type = {
.print = dict_print,
.make_new = dict_make_new,
.binary_op = dict_binary_op,
- .getiter = NULL,
- .methods = NULL,
};
mp_obj_t mp_obj_new_dict(int n_args) {
diff --git a/py/objexcept.c b/py/objexcept.c
index 8414fb0f6..829b14785 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -38,14 +38,7 @@ void exception_print(void (*print)(void *env, const char *fmt, ...), void *env,
const mp_obj_type_t exception_type = {
{ &mp_const_type },
"exception",
- exception_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .print = exception_print,
};
mp_obj_t mp_obj_new_exception(qstr id) {
diff --git a/py/objfloat.c b/py/objfloat.c
index 1176a1671..d21472d5d 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -53,27 +53,12 @@ static mp_obj_t float_unary_op(int op, mp_obj_t o_in) {
}
static mp_obj_t float_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
+ mp_obj_float_t *lhs = lhs_in;
if (MP_OBJ_IS_TYPE(rhs_in, &complex_type)) {
- return complex_type.binary_op(op, lhs_in, rhs_in);
+ return mp_obj_complex_binary_op(op, lhs->value, 0, rhs_in);
+ } else {
+ return mp_obj_float_binary_op(op, lhs->value, rhs_in);
}
- mp_float_t lhs_val = mp_obj_get_float(lhs_in);
- mp_float_t rhs_val = mp_obj_get_float(rhs_in);
- switch (op) {
- case RT_BINARY_OP_ADD:
- case RT_BINARY_OP_INPLACE_ADD: lhs_val += rhs_val; break;
- case RT_BINARY_OP_SUBTRACT:
- case RT_BINARY_OP_INPLACE_SUBTRACT: lhs_val -= rhs_val; break;
- case RT_BINARY_OP_MULTIPLY:
- case RT_BINARY_OP_INPLACE_MULTIPLY: lhs_val *= rhs_val; break;
- /* TODO floor(?) the value
- case RT_BINARY_OP_FLOOR_DIVIDE:
- case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: val = lhs_val / rhs_val; break;
- */
- case RT_BINARY_OP_TRUE_DIVIDE:
- case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: lhs_val /= rhs_val; break;
- return NULL; // op not supported
- }
- return mp_obj_new_float(lhs_val);
}
const mp_obj_type_t float_type = {
@@ -83,7 +68,6 @@ const mp_obj_type_t float_type = {
.make_new = float_make_new,
.unary_op = float_unary_op,
.binary_op = float_binary_op,
- .methods = NULL,
};
mp_obj_t mp_obj_new_float(mp_float_t value) {
@@ -99,4 +83,24 @@ mp_float_t mp_obj_float_get(mp_obj_t self_in) {
return self->value;
}
+mp_obj_t mp_obj_float_binary_op(int op, mp_float_t lhs_val, mp_obj_t rhs_in) {
+ mp_float_t rhs_val = mp_obj_get_float(rhs_in); // can be any type, this function will convert to float (if possible)
+ switch (op) {
+ case RT_BINARY_OP_ADD:
+ case RT_BINARY_OP_INPLACE_ADD: lhs_val += rhs_val; break;
+ case RT_BINARY_OP_SUBTRACT:
+ case RT_BINARY_OP_INPLACE_SUBTRACT: lhs_val -= rhs_val; break;
+ case RT_BINARY_OP_MULTIPLY:
+ case RT_BINARY_OP_INPLACE_MULTIPLY: lhs_val *= rhs_val; break;
+ /* TODO floor(?) the value
+ case RT_BINARY_OP_FLOOR_DIVIDE:
+ case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: val = lhs_val / rhs_val; break;
+ */
+ case RT_BINARY_OP_TRUE_DIVIDE:
+ case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: lhs_val /= rhs_val; break;
+ return NULL; // op not supported
+ }
+ return mp_obj_new_float(lhs_val);
+}
+
#endif
diff --git a/py/objfun.c b/py/objfun.c
index 494546281..51b4329c6 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -72,14 +72,7 @@ mp_obj_t fun_native_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
const mp_obj_type_t fun_native_type = {
{ &mp_const_type },
"function",
- NULL, // print
- NULL, // make_new
- fun_native_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .call_n = fun_native_call_n,
};
mp_obj_t rt_make_function_0(mp_fun_0_t fun) {
@@ -172,14 +165,7 @@ mp_obj_t fun_bc_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
const mp_obj_type_t fun_bc_type = {
{ &mp_const_type },
"function",
- NULL, // print
- NULL, // make_new
- fun_bc_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .call_n = fun_bc_call_n,
};
mp_obj_t mp_obj_new_fun_bc(int n_args, uint n_state, const byte *code) {
@@ -284,14 +270,7 @@ mp_obj_t fun_asm_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
static const mp_obj_type_t fun_asm_type = {
{ &mp_const_type },
"function",
- NULL, // print
- NULL, // make_new
- fun_asm_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .call_n = fun_asm_call_n,
};
mp_obj_t mp_obj_new_fun_asm(uint n_args, void *fun) {
diff --git a/py/objgenerator.c b/py/objgenerator.c
index cc3d90de1..7eeb4ef80 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -39,14 +39,7 @@ mp_obj_t gen_wrap_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
const mp_obj_type_t gen_wrap_type = {
{ &mp_const_type },
"generator",
- NULL, // print
- NULL, // make_new
- gen_wrap_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .call_n = gen_wrap_call_n,
};
mp_obj_t mp_obj_new_gen_wrap(uint n_locals, uint n_stack, mp_obj_t fun) {
@@ -94,14 +87,9 @@ mp_obj_t gen_instance_iternext(mp_obj_t self_in) {
const mp_obj_type_t gen_instance_type = {
{ &mp_const_type },
"generator",
- gen_instance_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- gen_instance_getiter, // getiter
- gen_instance_iternext, // iternext
- .methods = NULL,
+ .print = gen_instance_print,
+ .getiter = gen_instance_getiter,
+ .iternext = gen_instance_iternext,
};
// args are in reverse order in the array
diff --git a/py/objinstance.c b/py/objinstance.c
index a1d71093a..209643e2b 100644
--- a/py/objinstance.c
+++ b/py/objinstance.c
@@ -92,14 +92,6 @@ void mp_obj_instance_store_attr(mp_obj_t self_in, qstr attr, mp_obj_t value) {
const mp_obj_type_t instance_type = {
{ &mp_const_type },
"instance",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
};
mp_obj_t mp_obj_new_instance(mp_obj_t class) {
diff --git a/py/objint.c b/py/objint.c
index 0ba42d10c..9cd5ebae2 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -34,7 +34,6 @@ const mp_obj_type_t int_type = {
{ &mp_const_type },
"int",
.make_new = int_make_new,
- .methods = NULL,
};
mp_obj_t mp_obj_new_int(machine_int_t value) {
diff --git a/py/objlist.c b/py/objlist.c
index b642b7015..df9e1974f 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -274,12 +274,12 @@ static const mp_method_t list_type_methods[] = {
{ "sort", &list_sort_obj },
{ NULL, NULL }, // end-of-list sentinel
};
+
const mp_obj_type_t list_type = {
{ &mp_const_type },
"list",
.print = list_print,
.make_new = list_make_new,
- .unary_op = NULL,
.binary_op = list_binary_op,
.getiter = list_getiter,
.methods = list_type_methods,
@@ -346,7 +346,6 @@ static const mp_obj_type_t list_it_type = {
{ &mp_const_type },
"list_iterator",
.iternext = list_it_iternext,
- .methods = NULL,
};
mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, int cur) {
diff --git a/py/objmodule.c b/py/objmodule.c
index 3412573eb..3e7a0f7fc 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -24,14 +24,7 @@ void module_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_
const mp_obj_type_t module_type = {
{ &mp_const_type },
"module",
- module_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .print = module_print,
};
mp_obj_t mp_obj_new_module(qstr module_name) {
diff --git a/py/objnone.c b/py/objnone.c
index 173817a4d..c0efe6c0f 100644
--- a/py/objnone.c
+++ b/py/objnone.c
@@ -18,7 +18,6 @@ const mp_obj_type_t none_type = {
{ &mp_const_type },
"NoneType",
.print = none_print,
- .methods = NULL,
};
static const mp_obj_none_t none_obj = {{&none_type}};
diff --git a/py/objrange.c b/py/objrange.c
index 5c51656e8..a2a0e67b0 100644
--- a/py/objrange.c
+++ b/py/objrange.c
@@ -25,14 +25,7 @@ mp_obj_t range_getiter(mp_obj_t o_in) {
static const mp_obj_type_t range_type = {
{ &mp_const_type} ,
"range",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- range_getiter,
- NULL, // iternext
- .methods = NULL,
+ .getiter = range_getiter,
};
// range is a class and instances are immutable sequence objects
@@ -70,14 +63,7 @@ mp_obj_t range_it_iternext(mp_obj_t o_in) {
static const mp_obj_type_t range_it_type = {
{ &mp_const_type },
"range_iterator",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- range_it_iternext,
- .methods = NULL,
+ .iternext = range_it_iternext,
};
mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step) {
diff --git a/py/objset.c b/py/objset.c
index 264e14237..67dab11df 100644
--- a/py/objset.c
+++ b/py/objset.c
@@ -57,14 +57,8 @@ static mp_obj_t set_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args)
const mp_obj_type_t set_type = {
{ &mp_const_type },
"set",
- set_print, // print
- set_make_new, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .print = set_print,
+ .make_new = set_make_new,
};
mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) {
diff --git a/py/objslice.c b/py/objslice.c
index 360869a49..d95ccef06 100644
--- a/py/objslice.c
+++ b/py/objslice.c
@@ -23,14 +23,7 @@ void ellipsis_print(void (*print)(void *env, const char *fmt, ...), void *env, m
const mp_obj_type_t ellipsis_type = {
{ &mp_const_type },
"ellipsis",
- ellipsis_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = NULL,
+ .print = ellipsis_print,
};
static const mp_obj_ellipsis_t ellipsis_obj = {{&ellipsis_type}};
@@ -58,7 +51,6 @@ const mp_obj_type_t slice_type = {
{ &mp_const_type },
"slice",
.print = slice_print,
- .methods = NULL,
};
// TODO: Make sure to handle "empty" values, which are signified by None in CPython
diff --git a/py/objstr.c b/py/objstr.c
index 66041c587..cc9f7f85b 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -189,6 +189,7 @@ static const mp_method_t str_type_methods[] = {
{ "format", &str_format_obj },
{ NULL, NULL }, // end-of-list sentinel
};
+
const mp_obj_type_t str_type = {
{ &mp_const_type },
"str",
@@ -236,7 +237,6 @@ static const mp_obj_type_t str_it_type = {
{ &mp_const_type },
"str_iterator",
.iternext = str_it_iternext,
- .methods = NULL,
};
mp_obj_t mp_obj_new_str_iterator(mp_obj_str_t *str, int cur) {
diff --git a/py/objtuple.c b/py/objtuple.c
index a59e674b1..593b14e9f 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -103,7 +103,6 @@ const mp_obj_type_t tuple_type = {
.make_new = tuple_make_new,
.binary_op = tuple_binary_op,
.getiter = tuple_getiter,
- .methods = NULL,
};
// the zero-length tuple
@@ -166,7 +165,6 @@ static const mp_obj_type_t tuple_it_type = {
{ &mp_const_type },
"tuple_iterator",
.iternext = tuple_it_iternext,
- .methods = NULL,
};
static mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, int cur) {
diff --git a/py/objtype.c b/py/objtype.c
index 993de040b..8778c180c 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -27,5 +27,4 @@ const mp_obj_type_t mp_const_type = {
"type",
.print = type_print,
.call_n = type_call_n,
- .methods = NULL,
};
diff --git a/py/py.mk b/py/py.mk
new file mode 100644
index 000000000..3ed8a3e3d
--- /dev/null
+++ b/py/py.mk
@@ -0,0 +1,105 @@
+# default settings; can be overriden in main Makefile
+
+ifndef PY_SRC
+PY_SRC = ../py
+endif
+
+ifndef BUILD
+BUILD = build
+endif
+
+# to create the build directory
+
+$(BUILD):
+ mkdir -p $@
+
+# where py object files go (they have a name prefix to prevent filename clashes)
+
+PY_BUILD = $(BUILD)/py.
+
+# py object files
+
+PY_O_BASENAME = \
+ nlrx86.o \
+ nlrx64.o \
+ nlrthumb.o \
+ malloc.o \
+ gc.o \
+ qstr.o \
+ vstr.o \
+ unicode.o \
+ lexer.o \
+ lexerunix.o \
+ parse.o \
+ scope.o \
+ compile.o \
+ emitcommon.o \
+ emitpass1.o \
+ emitcpy.o \
+ emitbc.o \
+ asmx64.o \
+ emitnx64.o \
+ asmthumb.o \
+ emitnthumb.o \
+ emitinlinethumb.o \
+ runtime.o \
+ map.o \
+ obj.o \
+ objbool.o \
+ objboundmeth.o \
+ objcell.o \
+ objclass.o \
+ objclosure.o \
+ objcomplex.o \
+ objdict.o \
+ objexcept.o \
+ objfloat.o \
+ objfun.o \
+ objgenerator.o \
+ objinstance.o \
+ objint.o \
+ objlist.o \
+ objmodule.o \
+ objnone.o \
+ objrange.o \
+ objset.o \
+ objslice.o \
+ objstr.o \
+ objtuple.o \
+ objtype.o \
+ builtin.o \
+ builtinimport.o \
+ vm.o \
+ showbc.o \
+ repl.o \
+
+# prepend the build destination prefix to the py object files
+
+PY_O = $(addprefix $(PY_BUILD), $(PY_O_BASENAME))
+
+$(PY_BUILD)emitnx64.o: $(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h
+ $(CC) $(CFLAGS) -DN_X64 -c -o $@ $<
+
+$(PY_BUILD)emitnthumb.o: $(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h
+ $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $<
+
+$(PY_BUILD)%.o: $(PY_SRC)/%.S
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+$(PY_BUILD)%.o: $(PY_SRC)/%.c mpconfigport.h
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+# optimising gc for speed; 5ms down to 4ms on pybv2
+$(PY_BUILD)gc.o: $(PY_SRC)/gc.c
+ $(CC) $(CFLAGS) -O3 -c -o $@ $<
+
+# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
+$(PY_BUILD)vm.o: $(PY_SRC)/vm.c
+ $(CC) $(CFLAGS) -O3 -c -o $@ $<
+
+# header dependencies
+
+$(PY_BUILD)parse.o: $(PY_SRC)/grammar.h
+$(PY_BUILD)compile.o: $(PY_SRC)/grammar.h
+$(PY_BUILD)/emitcpy.o: $(PY_SRC)/emit.h
+$(PY_BUILD)emitbc.o: $(PY_SRC)/emit.h
diff --git a/py/repl.c b/py/repl.c
index 4241ef0e4..473313c1e 100644
--- a/py/repl.c
+++ b/py/repl.c
@@ -1,6 +1,9 @@
#include "misc.h"
+#include "mpconfig.h"
#include "repl.h"
+#if MICROPY_ENABLE_REPL_HELPERS
+
bool str_startswith_word(const char *str, const char *head) {
int i;
for (i = 0; str[i] && head[i]; i++) {
@@ -42,3 +45,5 @@ bool mp_repl_is_compound_stmt(const char *line) {
}
return n_paren > 0 || n_brack > 0 || n_brace > 0;
}
+
+#endif // MICROPY_ENABLE_REPL_HELPERS
diff --git a/py/repl.h b/py/repl.h
index 02fe523ed..23259fa90 100644
--- a/py/repl.h
+++ b/py/repl.h
@@ -1 +1,3 @@
+#if MICROPY_ENABLE_REPL_HELPERS
bool mp_repl_is_compound_stmt(const char *line);
+#endif
diff --git a/py/runtime.c b/py/runtime.c
index 7f9ce2027..0457f0df4 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -452,57 +452,63 @@ mp_obj_t rt_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
// then fail
// note that list does not implement + or +=, so that inplace_concat is reached first for +=
- if (MP_OBJ_IS_SMALL_INT(lhs) && MP_OBJ_IS_SMALL_INT(rhs)) {
+ if (MP_OBJ_IS_SMALL_INT(lhs)) {
mp_small_int_t lhs_val = MP_OBJ_SMALL_INT_VALUE(lhs);
- mp_small_int_t rhs_val = MP_OBJ_SMALL_INT_VALUE(rhs);
- switch (op) {
- case RT_BINARY_OP_OR:
- case RT_BINARY_OP_INPLACE_OR: lhs_val |= rhs_val; break;
- case RT_BINARY_OP_XOR:
- case RT_BINARY_OP_INPLACE_XOR: lhs_val ^= rhs_val; break;
- case RT_BINARY_OP_AND:
- case RT_BINARY_OP_INPLACE_AND: lhs_val &= rhs_val; break;
- case RT_BINARY_OP_LSHIFT:
- case RT_BINARY_OP_INPLACE_LSHIFT: lhs_val <<= rhs_val; break;
- case RT_BINARY_OP_RSHIFT:
- case RT_BINARY_OP_INPLACE_RSHIFT: lhs_val >>= rhs_val; break;
- case RT_BINARY_OP_ADD:
- case RT_BINARY_OP_INPLACE_ADD: lhs_val += rhs_val; break;
- case RT_BINARY_OP_SUBTRACT:
- case RT_BINARY_OP_INPLACE_SUBTRACT: lhs_val -= rhs_val; break;
- case RT_BINARY_OP_MULTIPLY:
- case RT_BINARY_OP_INPLACE_MULTIPLY: lhs_val *= rhs_val; break;
- case RT_BINARY_OP_FLOOR_DIVIDE:
- case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: lhs_val /= rhs_val; break;
-#if MICROPY_ENABLE_FLOAT
- case RT_BINARY_OP_TRUE_DIVIDE:
- case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: return mp_obj_new_float((mp_float_t)lhs_val / (mp_float_t)rhs_val);
-#endif
-
- // TODO implement modulo as specified by Python
- case RT_BINARY_OP_MODULO:
- case RT_BINARY_OP_INPLACE_MODULO: lhs_val %= rhs_val; break;
-
- // TODO check for negative power, and overflow
- case RT_BINARY_OP_POWER:
- case RT_BINARY_OP_INPLACE_POWER:
- {
- int ans = 1;
- while (rhs_val > 0) {
- if (rhs_val & 1) {
- ans *= lhs_val;
+ if (MP_OBJ_IS_SMALL_INT(rhs)) {
+ mp_small_int_t rhs_val = MP_OBJ_SMALL_INT_VALUE(rhs);
+ switch (op) {
+ case RT_BINARY_OP_OR:
+ case RT_BINARY_OP_INPLACE_OR: lhs_val |= rhs_val; break;
+ case RT_BINARY_OP_XOR:
+ case RT_BINARY_OP_INPLACE_XOR: lhs_val ^= rhs_val; break;
+ case RT_BINARY_OP_AND:
+ case RT_BINARY_OP_INPLACE_AND: lhs_val &= rhs_val; break;
+ case RT_BINARY_OP_LSHIFT:
+ case RT_BINARY_OP_INPLACE_LSHIFT: lhs_val <<= rhs_val; break;
+ case RT_BINARY_OP_RSHIFT:
+ case RT_BINARY_OP_INPLACE_RSHIFT: lhs_val >>= rhs_val; break;
+ case RT_BINARY_OP_ADD:
+ case RT_BINARY_OP_INPLACE_ADD: lhs_val += rhs_val; break;
+ case RT_BINARY_OP_SUBTRACT:
+ case RT_BINARY_OP_INPLACE_SUBTRACT: lhs_val -= rhs_val; break;
+ case RT_BINARY_OP_MULTIPLY:
+ case RT_BINARY_OP_INPLACE_MULTIPLY: lhs_val *= rhs_val; break;
+ case RT_BINARY_OP_FLOOR_DIVIDE:
+ case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: lhs_val /= rhs_val; break;
+ #if MICROPY_ENABLE_FLOAT
+ case RT_BINARY_OP_TRUE_DIVIDE:
+ case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: return mp_obj_new_float((mp_float_t)lhs_val / (mp_float_t)rhs_val);
+ #endif
+
+ // TODO implement modulo as specified by Python
+ case RT_BINARY_OP_MODULO:
+ case RT_BINARY_OP_INPLACE_MODULO: lhs_val %= rhs_val; break;
+
+ // TODO check for negative power, and overflow
+ case RT_BINARY_OP_POWER:
+ case RT_BINARY_OP_INPLACE_POWER:
+ {
+ int ans = 1;
+ while (rhs_val > 0) {
+ if (rhs_val & 1) {
+ ans *= lhs_val;
+ }
+ lhs_val *= lhs_val;
+ rhs_val /= 2;
}
- lhs_val *= lhs_val;
- rhs_val /= 2;
+ lhs_val = ans;
+ break;
}
- lhs_val = ans;
- break;
- }
- default: assert(0);
- }
- if (fit_small_int(lhs_val)) {
- return MP_OBJ_NEW_SMALL_INT(lhs_val);
+ default: assert(0);
+ }
+ if (fit_small_int(lhs_val)) {
+ return MP_OBJ_NEW_SMALL_INT(lhs_val);
+ }
+ } else if (MP_OBJ_IS_TYPE(rhs, &float_type)) {
+ return mp_obj_float_binary_op(op, lhs_val, rhs);
+ } else if (MP_OBJ_IS_TYPE(rhs, &complex_type)) {
+ return mp_obj_complex_binary_op(op, lhs_val, 0, rhs);
}
} else if (MP_OBJ_IS_OBJ(lhs)) {
mp_obj_base_t *o = lhs;
diff --git a/py/showbc.c b/py/showbc.c
index eb7d41b24..aea0aff67 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -8,6 +8,8 @@
#include "mpconfig.h"
#include "bc0.h"
+#if MICROPY_SHOW_BC
+
#define DECODE_UINT do { unum = *ip++; if (unum > 127) { unum = ((unum & 0x3f) << 8) | (*ip++); } } while (0)
#define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0)
#define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0)
@@ -363,3 +365,5 @@ void mp_show_byte_code(const byte *ip, int len) {
printf("\n");
}
}
+
+#endif // MICROPY_SHOW_BC
diff --git a/py/vm.c b/py/vm.c
index 8e7ef7485..5e3ec0baf 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -106,7 +106,7 @@ bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **
case MP_BC_LOAD_CONST_SMALL_INT:
unum = (ip[0] | (ip[1] << 8) | (ip[2] << 16)) - 0x800000;
ip += 3;
- PUSH((mp_obj_t)(unum << 1 | 1));
+ PUSH(MP_OBJ_NEW_SMALL_INT(unum));
break;
case MP_BC_LOAD_CONST_DEC:
diff --git a/stm/Makefile b/stm/Makefile
index cd998dd88..fecd52527 100644
--- a/stm/Makefile
+++ b/stm/Makefile
@@ -1,9 +1,16 @@
+# define main target
+all: all2
+
+# include py core make definitions
+include ../py/py.mk
+
+# program for deletion
+RM = /bin/rm
+
STMSRC=lib
#STMOTGSRC=lib-otg
FATFSSRC=fatfs
CC3KSRC=cc3k
-PYSRC=../py
-BUILD=build
DFU=../tools/dfu.py
TARGET=PYBOARD
@@ -11,7 +18,7 @@ AS = arm-none-eabi-as
CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mabi=aapcs-linux -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -Wdouble-promotion -DSTM32F40XX -DHSE_VALUE=8000000
-CFLAGS = -I. -I$(PYSRC) -I$(FATFSSRC) -I$(STMSRC) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4) -D$(TARGET)
+CFLAGS = -I. -I$(PY_SRC) -I$(FATFSSRC) -I$(STMSRC) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4) -D$(TARGET)
#CFLAGS += -I$(STMOTGSRC) -DUSE_HOST_MODE -DUSE_OTG_MODE
LDFLAGS = --nostdlib -T stm32f405.ld
@@ -43,53 +50,6 @@ SRC_S = \
startup_stm32f40xx.s \
gchelper.s \
-PY_O = \
- nlrthumb.o \
- gc.o \
- malloc.o \
- qstr.o \
- vstr.o \
- unicode.o \
- lexer.o \
- parse.o \
- scope.o \
- compile.o \
- emitcommon.o \
- emitpass1.o \
- emitbc.o \
- asmthumb.o \
- emitnthumb.o \
- emitinlinethumb.o \
- runtime.o \
- map.o \
- obj.o \
- objbool.o \
- objboundmeth.o \
- objcell.o \
- objclass.o \
- objclosure.o \
- objcomplex.o \
- objdict.o \
- objexcept.o \
- objfloat.o \
- objfun.o \
- objgenerator.o \
- objinstance.o \
- objint.o \
- objlist.o \
- objmodule.o \
- objnone.o \
- objrange.o \
- objset.o \
- objslice.o \
- objstr.o \
- objtuple.o \
- objtype.o \
- builtin.o \
- builtinimport.o \
- vm.o \
- repl.o \
-
SRC_FATFS = \
ff.c \
diskio.c \
@@ -146,10 +106,10 @@ SRC_CC3K = \
ccspi.c \
pybcc3k.c \
-OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(PY_O) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o))
+OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o)) $(PY_O)
#OBJ += $(addprefix $(BUILD)/, $(SRC_STM_OTG:.c=.o))
-all: $(BUILD) $(BUILD)/flash.dfu
+all2: $(BUILD) $(BUILD)/flash.dfu
$(BUILD)/flash.dfu: $(BUILD)/flash0.bin $(BUILD)/flash1.bin
python $(DFU) -b 0x08000000:$(BUILD)/flash0.bin -b 0x08020000:$(BUILD)/flash1.bin $@
@@ -164,9 +124,6 @@ $(BUILD)/flash.elf: $(OBJ)
$(LD) $(LDFLAGS) -o $@ $(OBJ)
arm-none-eabi-size $@
-$(BUILD):
- mkdir -p $@
-
$(BUILD)/%.o: %.s
$(AS) -o $@ $<
@@ -185,31 +142,7 @@ $(BUILD)/%.o: $(STMSRC)/%.c
$(BUILD)/%.o: $(CC3KSRC)/%.c
$(CC) $(CFLAGS) -c -o $@ $<
-$(BUILD)/%.o: $(PYSRC)/%.s
- $(AS) -o $@ $<
-
-$(BUILD)/%.o: $(PYSRC)/%.S
- $(CC) $(CFLAGS) -c -o $@ $<
-
-$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h
- $(CC) $(CFLAGS) -c -o $@ $<
-
-$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h
- $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $<
-
-# optimising gc for speed; 5ms down to 4ms
-$(BUILD)/gc.o: $(PYSRC)/gc.c
- $(CC) $(CFLAGS) -O3 -c -o $@ $<
-
-# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
-$(BUILD)/vm.o: $(PYSRC)/vm.c
- $(CC) $(CFLAGS) -O3 -c -o $@ $<
-
-$(BUILD)/parse.o: $(PYSRC)/grammar.h
-$(BUILD)/compile.o: $(PYSRC)/grammar.h
-$(BUILD)/emitbc.o: $(PYSRC)/emit.h
-
clean:
- /bin/rm -rf $(BUILD)
+ $(RM) -rf $(BUILD)
-.PHONY: all clean
+.PHONY: all all2 clean
diff --git a/stm/i2c.c b/stm/i2c.c
index 9e25ff983..22c908566 100644
--- a/stm/i2c.c
+++ b/stm/i2c.c
@@ -326,18 +326,20 @@ static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_read_obj, i2c_obj_read);
static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_readAndStop_obj, i2c_obj_readAndStop);
static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_stop_obj, i2c_obj_stop);
+static const mp_method_t i2c_methods[] = {
+ { "start", &i2c_obj_start_obj },
+ { "write", &i2c_obj_write_obj },
+ { "read", &i2c_obj_read_obj },
+ { "readAndStop", &i2c_obj_readAndStop_obj },
+ { "stop", &i2c_obj_stop_obj },
+ { NULL, NULL },
+};
+
static const mp_obj_type_t i2c_obj_type = {
{ &mp_const_type },
"I2C",
.print = i2c_obj_print,
- .methods = {
- { "start", &i2c_obj_start_obj },
- { "write", &i2c_obj_write_obj },
- { "read", &i2c_obj_read_obj },
- { "readAndStop", &i2c_obj_readAndStop_obj },
- { "stop", &i2c_obj_stop_obj },
- { NULL, NULL },
- }
+ .methods = i2c_methods,
};
// create the I2C object
diff --git a/stm/led.c b/stm/led.c
index 9809c2177..eb7c76ef1 100644
--- a/stm/led.c
+++ b/stm/led.c
@@ -8,10 +8,10 @@
#include "led.h"
/* LED numbers, used internally */
-#define PYB_LED_1 (0)
-#define PYB_LED_2 (1)
-#define PYB_LED_3 (2)
-#define PYB_LED_4 (3)
+#define PYB_LED_1 (1)
+#define PYB_LED_2 (2)
+#define PYB_LED_3 (3)
+#define PYB_LED_4 (4)
#if defined(PYBOARD)
#define PYB_LED1_PORT (GPIOA)
@@ -63,8 +63,8 @@ void led_init(void) {
/* Turn off LEDs */
PYB_LED_OFF(PYB_LED1_PORT, PYB_LED1_PIN);
PYB_LED_OFF(PYB_LED2_PORT, PYB_LED2_PIN);
- PYB_LED_OFF(PYB_LED3_PORT, PYB_LED1_PIN);
- PYB_LED_OFF(PYB_LED4_PORT, PYB_LED2_PIN);
+ PYB_LED_OFF(PYB_LED3_PORT, PYB_LED3_PIN);
+ PYB_LED_OFF(PYB_LED4_PORT, PYB_LED4_PIN);
/* Initialize LEDs */
GPIO_InitStructure.GPIO_Pin = PYB_LED1_PIN;
@@ -176,15 +176,17 @@ mp_obj_t led_obj_off(mp_obj_t self_in) {
static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);
static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);
+static const mp_method_t led_methods[] = {
+ { "on", &led_obj_on_obj },
+ { "off", &led_obj_off_obj },
+ { NULL, NULL },
+};
+
static const mp_obj_type_t led_obj_type = {
{ &mp_const_type },
"Led",
.print = led_obj_print,
- .methods = {
- { "on", &led_obj_on_obj },
- { "off", &led_obj_off_obj },
- { NULL, NULL },
- }
+ .methods = led_methods,
};
mp_obj_t pyb_Led(mp_obj_t led_id) {
diff --git a/stm/led.h b/stm/led.h
index fcbfa1763..c68f3e414 100644
--- a/stm/led.h
+++ b/stm/led.h
@@ -1,13 +1,13 @@
typedef enum {
- PYB_LED_R1 = 0,
- PYB_LED_R2 = 1,
- PYB_LED_G1 = 2,
- PYB_LED_G2 = 3,
+ PYB_LED_R1 = 1,
+ PYB_LED_R2 = 2,
+ PYB_LED_G1 = 3,
+ PYB_LED_G2 = 4,
//STM32F4DISC
- PYB_LED_R = 0,
- PYB_LED_G = 1,
- PYB_LED_B = 2,
- PYB_LED_O = 3,
+ PYB_LED_R = 1,
+ PYB_LED_G = 2,
+ PYB_LED_B = 3,
+ PYB_LED_O = 4,
} pyb_led_t;
void led_init(void);
diff --git a/stm/main.c b/stm/main.c
index 07c974eff..a038c89b7 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -689,22 +689,18 @@ static MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close);
// TODO gc hook to close the file if not already closed
+static const mp_method_t file_methods[] = {
+ { "read", &file_obj_read_obj },
+ { "write", &file_obj_write_obj },
+ { "close", &file_obj_close_obj },
+ {NULL, NULL},
+};
+
static const mp_obj_type_t file_obj_type = {
{ &mp_const_type },
"File",
- file_obj_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {
- { "read", &file_obj_read_obj },
- { "write", &file_obj_write_obj },
- { "close", &file_obj_close_obj },
- {NULL, NULL},
- }
+ .print = file_obj_print,
+ .methods = file_methods,
};
mp_obj_t pyb_io_open(mp_obj_t o_filename, mp_obj_t o_mode) {
diff --git a/stm/mpconfigport.h b/stm/mpconfigport.h
index 4cea332f3..dfa46cc50 100644
--- a/stm/mpconfigport.h
+++ b/stm/mpconfigport.h
@@ -2,11 +2,11 @@
// options to control how Micro Python is built
-#define MICROPY_ENABLE_FLOAT (1)
-#define MICROPY_EMIT_CPYTHON (0)
-#define MICROPY_EMIT_X64 (0)
#define MICROPY_EMIT_THUMB (1)
#define MICROPY_EMIT_INLINE_THUMB (1)
+#define MICROPY_ENABLE_GC (1)
+#define MICROPY_ENABLE_REPL_HELPERS (1)
+#define MICROPY_ENABLE_FLOAT (1)
// type definitions for the specific machine
diff --git a/stm/servo.c b/stm/servo.c
index 31190ce79..cc9633a99 100644
--- a/stm/servo.c
+++ b/stm/servo.c
@@ -137,14 +137,16 @@ static mp_obj_t servo_obj_angle(mp_obj_t self_in, mp_obj_t angle) {
static MP_DEFINE_CONST_FUN_OBJ_2(servo_obj_angle_obj, servo_obj_angle);
+static const mp_method_t servo_methods[] = {
+ { "angle", &servo_obj_angle_obj },
+ { NULL, NULL },
+};
+
static const mp_obj_type_t servo_obj_type = {
{ &mp_const_type },
"Servo",
.print = servo_obj_print,
- .methods = {
- { "angle", &servo_obj_angle_obj },
- { NULL, NULL },
- }
+ .methods = servo_methods,
};
mp_obj_t pyb_Servo(mp_obj_t servo_id) {
diff --git a/teensy/Makefile b/teensy/Makefile
new file mode 100644
index 000000000..98b467a06
--- /dev/null
+++ b/teensy/Makefile
@@ -0,0 +1,155 @@
+ifeq ($(ARDUINO),)
+$(error Please define ARDUINO (where TeensyDuino is installed))
+endif
+TOOLS_PATH = $(ARDUINO)/hardware/tools
+COMPILER_PATH = $(TOOLS_PATH)/arm-none-eabi/bin
+CORE_PATH = $(ARDUINO)/hardware/teensy/cores/teensy3
+
+PYSRC=../py
+BUILD=build
+
+AS = $(COMPILER_PATH)/arm-none-eabi-as
+CC = $(COMPILER_PATH)/arm-none-eabi-gcc
+LD = $(COMPILER_PATH)/arm-none-eabi-ld
+OBJCOPY = $(COMPILER_PATH)/arm-none-eabi-objcopy
+SIZE = $(COMPILER_PATH)/arm-none-eabi-size
+
+CFLAGS_TEENSY = -DF_CPU=96000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH -D__MK20DX256__
+CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -fsingle-precision-constant -Wdouble-promotion $(CFLAGS_TEENSY)
+CFLAGS = -I. -I$(PYSRC) -I$(CORE_PATH) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4)
+LDFLAGS = -nostdlib -T mk20dx256.ld
+LIBS = -L $(COMPILER_PATH)/../lib/gcc/arm-none-eabi/4.7.2/thumb2 -lgcc
+
+SRC_C = \
+ main.c \
+ lexerteensy.c \
+ led.c \
+ malloc0.c \
+ printf.c \
+ string0.c \
+ usb.c \
+
+SRC_S = \
+ gchelper.s \
+
+PY_O = \
+ nlrthumb.o \
+ gc.o \
+ malloc.o \
+ qstr.o \
+ vstr.o \
+ unicode.o \
+ lexer.o \
+ parse.o \
+ scope.o \
+ compile.o \
+ emitcommon.o \
+ emitpass1.o \
+ emitbc.o \
+ asmthumb.o \
+ emitnthumb.o \
+ emitinlinethumb.o \
+ runtime.o \
+ map.o \
+ obj.o \
+ objbool.o \
+ objboundmeth.o \
+ objcell.o \
+ objclass.o \
+ objclosure.o \
+ objcomplex.o \
+ objdict.o \
+ objexcept.o \
+ objfloat.o \
+ objfun.o \
+ objgenerator.o \
+ objinstance.o \
+ objint.o \
+ objlist.o \
+ objmodule.o \
+ objnone.o \
+ objrange.o \
+ objset.o \
+ objslice.o \
+ objstr.o \
+ objtuple.o \
+ objtype.o \
+ builtin.o \
+ builtinimport.o \
+ vm.o \
+ showbc.o \
+ repl.o \
+
+SRC_TEENSY = \
+ mk20dx128.c \
+ pins_teensy.c \
+ analog.c \
+ usb_desc.c \
+ usb_dev.c \
+ usb_mem.c \
+ usb_serial.c \
+ yield.c \
+
+OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(PY_O) $(SRC_TEENSY:.c=.o))
+#LIB = -lreadline
+# the following is needed for BSD
+#LIB += -ltermcap
+PROG = micropython
+
+all: hex
+hex: $(PROG).hex
+
+post_compile: $(PROG).hex
+ $(TOOLS_PATH)/teensy_post_compile -file="$(basename $<)" -path="$(CURDIR)" -tools="$(TOOLS_PATH)"
+
+reboot:
+ -$(TOOLS_PATH)/teensy_reboot
+
+upload: post_compile reboot
+
+$(PROG).elf: $(BUILD) $(OBJ)
+ $(CC) $(LDFLAGS) -o "$@" -Wl,-Map,$(PROG).map $(OBJ) $(LIBS)
+
+%.hex: %.elf
+ $(SIZE) "$<"
+ $(OBJCOPY) -O ihex -R .eeprom "$<" "$@"
+
+$(BUILD):
+ mkdir -p $@
+
+$(BUILD)/%.o: %.s
+ $(AS) -o $@ $<
+
+$(BUILD)/%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+$(BUILD)/%.o: $(PYSRC)/%.S
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+$(BUILD)/%.o: $(CORE_PATH)/%.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h
+ $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $<
+
+# optimising gc for speed; 5ms down to 4ms
+$(BUILD)/gc.o: $(PYSRC)/gc.c
+ $(CC) $(CFLAGS) -O3 -c -o $@ $<
+
+# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
+$(BUILD)/vm.o: $(PYSRC)/vm.c
+ $(CC) $(CFLAGS) -O3 -c -o $@ $<
+
+$(BUILD)/main.o: mpconfigport.h
+$(BUILD)/parse.o: $(PYSRC)/grammar.h
+$(BUILD)/compile.o: $(PYSRC)/grammar.h
+$(BUILD)/emitbc.o: $(PYSRC)/emit.h
+
+clean:
+ /bin/rm -rf $(BUILD)
+ /bin/rm -f $(PROG).elf $(PROG).hex $(PROG).map
+
+.PHONY: clean
diff --git a/teensy/README.md b/teensy/README.md
new file mode 100644
index 000000000..31339cd79
--- /dev/null
+++ b/teensy/README.md
@@ -0,0 +1,31 @@
+Build Instructions for Teensy 3.1
+
+This assumes that you have TeensyDuino installed and set the ARUINO environment
+variable pointing to the where Arduino with TeensyDuino is installed.
+
+```
+cd teensy
+ARDUINO=~/arduino-1.0.5 make
+```
+
+To build the loader
+
+```
+cd teensy/loader
+make
+```
+
+To upload micropython to the Teensy 3.1.
+
+Press the Program button on the Teensy 3.1
+```
+make upload
+```
+
+Currently, the python prompt is through the USB serial interface.
+
+The LED will blink (100 msec on/100 msec off) while waiting for the USB Serial
+device to be configured, and will blink (200 msec on/200 msec off) while
+sitting at the readline prompt.
+
+Currently, there is no I/O support configured (no GPIO, ADC, etc).
diff --git a/teensy/gchelper.s b/teensy/gchelper.s
new file mode 100644
index 000000000..f8735d283
--- /dev/null
+++ b/teensy/gchelper.s
@@ -0,0 +1,36 @@
+ .syntax unified
+ .cpu cortex-m4
+ .thumb
+ .text
+ .align 2
+
+@ void gc_helper_get_regs_and_clean_stack(r0=uint regs[10], r1=heap_end)
+ .global gc_helper_get_regs_and_clean_stack
+ .thumb
+ .thumb_func
+ .type gc_helper_get_regs_and_clean_stack, %function
+gc_helper_get_regs_and_clean_stack:
+ @ store registers into given array
+ str r4, [r0], #4
+ str r5, [r0], #4
+ str r6, [r0], #4
+ str r7, [r0], #4
+ str r8, [r0], #4
+ str r9, [r0], #4
+ str r10, [r0], #4
+ str r11, [r0], #4
+ str r12, [r0], #4
+ str r13, [r0], #4
+
+ @ clean the stack from given pointer up to current sp
+ movs r0, #0
+ mov r2, sp
+ b.n .entry
+.loop:
+ str r0, [r1], #4
+.entry:
+ cmp r1, r2
+ bcc.n .loop
+ bx lr
+
+ .size gc_helper_get_regs_and_clean_stack, .-gc_helper_get_regs_and_clean_stack
diff --git a/teensy/led.c b/teensy/led.c
new file mode 100644
index 000000000..1aad2a365
--- /dev/null
+++ b/teensy/led.c
@@ -0,0 +1,86 @@
+#include <stdio.h>
+
+#include "misc.h"
+#include "mpconfig.h"
+#include "obj.h"
+#include "led.h"
+
+#include "Arduino.h"
+
+void led_init(void) {
+}
+
+void led_state(pyb_led_t led, int state) {
+ uint8_t pin;
+
+ if (led == 0) {
+ pin = LED_BUILTIN;
+ } else {
+ return;
+ }
+ digitalWrite(pin, state);
+}
+
+void led_toggle(pyb_led_t led) {
+ uint8_t pin;
+
+ if (led == 0) {
+ pin = LED_BUILTIN;
+ } else {
+ return;
+ }
+
+ digitalWrite(pin, !digitalRead(pin));
+}
+
+/******************************************************************************/
+/* Micro Python bindings */
+
+typedef struct _pyb_led_obj_t {
+ mp_obj_base_t base;
+ uint led_id;
+} pyb_led_obj_t;
+
+void led_obj_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+ pyb_led_obj_t *self = self_in;
+ print(env, "<LED %lu>", self->led_id);
+}
+
+mp_obj_t led_obj_on(mp_obj_t self_in) {
+ pyb_led_obj_t *self = self_in;
+ led_state(self->led_id, 1);
+ return mp_const_none;
+}
+
+mp_obj_t led_obj_off(mp_obj_t self_in) {
+ pyb_led_obj_t *self = self_in;
+ led_state(self->led_id, 0);
+ return mp_const_none;
+}
+
+static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);
+static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);
+
+static const mp_obj_type_t led_obj_type = {
+ { &mp_const_type },
+ "Led",
+ led_obj_print, // print
+ NULL, // make_new
+ NULL, // call_n
+ NULL, // unary_op
+ NULL, // binary_op
+ NULL, // getiter
+ NULL, // iternext
+ { // method list
+ { "on", &led_obj_on_obj },
+ { "off", &led_obj_off_obj },
+ { NULL, NULL },
+ }
+};
+
+mp_obj_t pyb_Led(mp_obj_t led_id) {
+ pyb_led_obj_t *o = m_new_obj(pyb_led_obj_t);
+ o->base.type = &led_obj_type;
+ o->led_id = mp_obj_get_int(led_id);
+ return o;
+}
diff --git a/teensy/led.h b/teensy/led.h
new file mode 100644
index 000000000..c5a481254
--- /dev/null
+++ b/teensy/led.h
@@ -0,0 +1,9 @@
+typedef enum {
+ PYB_LED_BUILTIN = 0,
+} pyb_led_t;
+
+void led_init(void);
+void led_state(pyb_led_t led, int state);
+void led_toggle(pyb_led_t led);
+
+mp_obj_t pyb_Led(mp_obj_t led_id);
diff --git a/teensy/lexerteensy.c b/teensy/lexerteensy.c
new file mode 100644
index 000000000..eefaf6665
--- /dev/null
+++ b/teensy/lexerteensy.c
@@ -0,0 +1,33 @@
+#include <stdint.h>
+#include <stdio.h>
+
+#include "misc.h"
+#include "lexer.h"
+#include "lexerteensy.h"
+
+unichar str_buf_next_char(mp_lexer_str_buf_t *sb) {
+ if (sb->src_cur < sb->src_end) {
+ return *sb->src_cur++;
+ } else {
+ return MP_LEXER_CHAR_EOF;
+ }
+}
+
+void str_buf_free(mp_lexer_str_buf_t *sb) {
+ if (sb->free) {
+ m_del(char, (char*)sb->src_beg, 0 /* don't know allocated size of src */);
+ }
+}
+
+mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, mp_lexer_str_buf_t *sb) {
+ sb->free = free_str;
+ sb->src_beg = str;
+ sb->src_cur = str;
+ sb->src_end = str + len;
+ return mp_lexer_new(src_name, sb, (mp_lexer_stream_next_char_t)str_buf_next_char, (mp_lexer_stream_close_t)str_buf_free);
+}
+
+mp_lexer_t *mp_import_open_file(qstr mod_name) {
+ printf("import not implemented\n");
+ return NULL;
+}
diff --git a/teensy/lexerteensy.h b/teensy/lexerteensy.h
new file mode 100644
index 000000000..961a70ada
--- /dev/null
+++ b/teensy/lexerteensy.h
@@ -0,0 +1,8 @@
+typedef struct _py_lexer_str_buf_t {
+ bool free; // free src_beg when done
+ const char *src_beg; // beginning of source
+ const char *src_cur; // current location in source
+ const char *src_end; // end (exclusive) of source
+} mp_lexer_str_buf_t;
+
+mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, mp_lexer_str_buf_t *sb);
diff --git a/teensy/main.c b/teensy/main.c
new file mode 100644
index 000000000..3711cd60d
--- /dev/null
+++ b/teensy/main.c
@@ -0,0 +1,474 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "nlr.h"
+#include "misc.h"
+#include "mpconfig.h"
+#include "mpqstr.h"
+#include "lexer.h"
+#include "lexerteensy.h"
+#include "parse.h"
+#include "obj.h"
+#include "compile.h"
+#include "runtime0.h"
+#include "runtime.h"
+#include "repl.h"
+#include "usb.h"
+#include "gc.h"
+#include "led.h"
+
+#include "Arduino.h"
+
+extern uint32_t _heap_start;
+
+#ifdef USE_READLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+#if 0
+static char *str_join(const char *s1, int sep_char, const char *s2) {
+ int l1 = strlen(s1);
+ int l2 = strlen(s2);
+ char *s = m_new(char, l1 + l2 + 2);
+ memcpy(s, s1, l1);
+ if (sep_char != 0) {
+ s[l1] = sep_char;
+ l1 += 1;
+ }
+ memcpy(s + l1, s2, l2);
+ s[l1 + l2] = 0;
+ return s;
+}
+
+static char *prompt(char *p) {
+#ifdef USE_READLINE
+ char *line = readline(p);
+ if (line) {
+ add_history(line);
+ }
+#else
+ static char buf[256];
+ fputs(p, stdout);
+ char *s = fgets(buf, sizeof(buf), stdin);
+ if (!s) {
+ return NULL;
+ }
+ int l = strlen(buf);
+ if (buf[l - 1] == '\n') {
+ buf[l - 1] = 0;
+ } else {
+ l++;
+ }
+ char *line = m_new(char, l);
+ memcpy(line, buf, l);
+#endif
+ return line;
+}
+#endif
+
+static const char *help_text =
+"Welcome to Micro Python!\n\n"
+"This is a *very* early version of Micro Python and has minimal functionality.\n\n"
+"Specific commands for the board:\n"
+" pyb.info() -- print some general information\n"
+" pyb.gc() -- run the garbage collector\n"
+" pyb.delay(<n>) -- wait for n milliseconds\n"
+" pyb.Led(<n>) -- create Led object for LED n (n=0)\n"
+" Led methods: on(), off()\n"
+" pyb.gpio(<pin>) -- read gpio pin\n"
+" pyb.gpio(<pin>, <val>) -- set gpio pin\n"
+#if 0
+" pyb.Servo(<n>) -- create Servo object for servo n (n=1,2,3,4)\n"
+" Servo methods: angle(<x>)\n"
+" pyb.switch() -- return True/False if switch pressed or not\n"
+" pyb.accel() -- get accelerometer values\n"
+" pyb.rand() -- get a 16-bit random number\n"
+#endif
+;
+
+// get some help about available functions
+static mp_obj_t pyb_help(void) {
+ printf("%s", help_text);
+ return mp_const_none;
+}
+
+// get lots of info about the board
+static mp_obj_t pyb_info(void) {
+ // get and print unique id; 96 bits
+ {
+ byte *id = (byte*)0x40048058;
+ printf("ID=%02x%02x%02x%02x:%02x%02x%02x%02x:%02x%02x%02x%02x\n", id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7], id[8], id[9], id[10], id[11]);
+ }
+
+ // get and print clock speeds
+ printf("CPU=%u\nBUS=%u\nMEM=%u\n", F_CPU, F_BUS, F_MEM);
+
+ // to print info about memory
+ {
+ extern void *_sdata;
+ extern void *_edata;
+ extern void *_sbss;
+ extern void *_ebss;
+ extern void *_estack;
+ extern void *_etext;
+ printf("_sdata=%p\n", &_sdata);
+ printf("_edata=%p\n", &_edata);
+ printf("_sbss=%p\n", &_sbss);
+ printf("_ebss=%p\n", &_ebss);
+ printf("_estack=%p\n", &_estack);
+ printf("_etext=%p\n", &_etext);
+ printf("_heap_start=%p\n", &_heap_start);
+ }
+
+ // GC info
+ {
+ gc_info_t info;
+ gc_info(&info);
+ printf("GC:\n");
+ printf(" %lu total\n", info.total);
+ printf(" %lu used %lu free\n", info.used, info.free);
+ printf(" 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block);
+ }
+
+#if 0
+ // free space on flash
+ {
+ DWORD nclst;
+ FATFS *fatfs;
+ f_getfree("0:", &nclst, &fatfs);
+ printf("LFS free: %u bytes\n", (uint)(nclst * fatfs->csize * 512));
+ }
+#endif
+
+ return mp_const_none;
+}
+
+#define RAM_START (0x1FFF8000) // fixed for chip
+#define HEAP_END (0x20006000) // tunable
+#define RAM_END (0x20008000) // fixed for chip
+
+void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end);
+
+void gc_collect(void) {
+ uint32_t start = micros();
+ gc_collect_start();
+ gc_collect_root((void**)RAM_START, (((uint32_t)&_heap_start) - RAM_START) / 4);
+ machine_uint_t regs[10];
+ gc_helper_get_regs_and_clean_stack(regs, HEAP_END);
+ gc_collect_root((void**)HEAP_END, (RAM_END - HEAP_END) / 4); // will trace regs since they now live in this function on the stack
+ gc_collect_end();
+ uint32_t ticks = micros() - start; // TODO implement a function that does this properly
+
+ if (0) {
+ // print GC info
+ gc_info_t info;
+ gc_info(&info);
+ printf("GC@%lu %luus\n", start, ticks);
+ printf(" %lu total\n", info.total);
+ printf(" %lu used %lu free\n", info.used, info.free);
+ printf(" 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block);
+ }
+}
+
+mp_obj_t pyb_gc(void) {
+ gc_collect();
+ return mp_const_none;
+}
+
+mp_obj_t pyb_gpio(int n_args, mp_obj_t *args) {
+ //assert(1 <= n_args && n_args <= 2);
+
+ uint pin = mp_obj_get_int(args[0]);
+ if (pin > CORE_NUM_DIGITAL) {
+ goto pin_error;
+ }
+
+ if (n_args == 1) {
+ // get pin
+ pinMode(pin, INPUT);
+ return MP_OBJ_NEW_SMALL_INT(digitalRead(pin));
+ }
+
+ // set pin
+ pinMode(pin, OUTPUT);
+ digitalWrite(pin, rt_is_true(args[1]));
+ return mp_const_none;
+
+pin_error:
+ nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_ValueError, "pin %d does not exist", (void *)(machine_uint_t)pin));
+}
+
+MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_gpio_obj, 1, 2, pyb_gpio);
+
+#if 0
+mp_obj_t pyb_hid_send_report(mp_obj_t arg) {
+ mp_obj_t *items = mp_obj_get_array_fixed_n(arg, 4);
+ uint8_t data[4];
+ data[0] = mp_obj_get_int(items[0]);
+ data[1] = mp_obj_get_int(items[1]);
+ data[2] = mp_obj_get_int(items[2]);
+ data[3] = mp_obj_get_int(items[3]);
+ usb_hid_send_report(data);
+ return mp_const_none;
+}
+#endif
+
+mp_obj_t pyb_delay(mp_obj_t count) {
+ delay(mp_obj_get_int(count));
+ return mp_const_none;
+}
+
+mp_obj_t pyb_led(mp_obj_t state) {
+ led_state(PYB_LED_BUILTIN, rt_is_true(state));
+ return state;
+}
+
+char *strdup(const char *str) {
+ uint32_t len = strlen(str);
+ char *s2 = m_new(char, len + 1);
+ memcpy(s2, str, len);
+ s2[len] = 0;
+ return s2;
+}
+
+#define READLINE_HIST_SIZE (8)
+
+static const char *readline_hist[READLINE_HIST_SIZE] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+
+void stdout_tx_str(const char *str) {
+// usart_tx_str(str);
+ usb_vcp_send_str(str);
+}
+
+int readline(vstr_t *line, const char *prompt) {
+ stdout_tx_str(prompt);
+ int len = vstr_len(line);
+ int escape = 0;
+ int hist_num = 0;
+ for (;;) {
+ char c;
+ for (;;) {
+ if (usb_vcp_rx_any() != 0) {
+ c = usb_vcp_rx_get();
+ break;
+#if 0
+ } else if (usart_rx_any()) {
+ c = usart_rx_char();
+ break;
+#endif
+ }
+ //delay(1);
+ //if (storage_needs_flush()) {
+ // storage_flush();
+ //}
+ }
+ if (escape == 0) {
+ if (c == 4 && vstr_len(line) == len) {
+ return 0;
+ } else if (c == '\r') {
+ stdout_tx_str("\r\n");
+ for (int i = READLINE_HIST_SIZE - 1; i > 0; i--) {
+ readline_hist[i] = readline_hist[i - 1];
+ }
+ readline_hist[0] = strdup(vstr_str(line));
+ return 1;
+ } else if (c == 27) {
+ escape = true;
+ } else if (c == 127) {
+ if (vstr_len(line) > len) {
+ vstr_cut_tail(line, 1);
+ stdout_tx_str("\b \b");
+ }
+ } else if (32 <= c && c <= 126) {
+ vstr_add_char(line, c);
+ stdout_tx_str(line->buf + line->len - 1);
+ }
+ } else if (escape == 1) {
+ if (c == '[') {
+ escape = 2;
+ } else {
+ escape = 0;
+ }
+ } else if (escape == 2) {
+ escape = 0;
+ if (c == 'A') {
+ // up arrow
+ if (hist_num < READLINE_HIST_SIZE && readline_hist[hist_num] != NULL) {
+ // erase line
+ for (int i = line->len - len; i > 0; i--) {
+ stdout_tx_str("\b \b");
+ }
+ // set line to history
+ line->len = len;
+ vstr_add_str(line, readline_hist[hist_num]);
+ // draw line
+ stdout_tx_str(readline_hist[hist_num]);
+ // increase hist num
+ hist_num += 1;
+ }
+ }
+ } else {
+ escape = 0;
+ }
+ delay(10);
+ }
+}
+
+void do_repl(void) {
+ stdout_tx_str("Micro Python for Teensy 3.1\r\n");
+ stdout_tx_str("Type \"help()\" for more information.\r\n");
+
+ vstr_t line;
+ vstr_init(&line);
+
+ for (;;) {
+ vstr_reset(&line);
+ int ret = readline(&line, ">>> ");
+ if (ret == 0) {
+ // EOF
+ break;
+ }
+
+ if (vstr_len(&line) == 0) {
+ continue;
+ }
+
+ if (mp_repl_is_compound_stmt(vstr_str(&line))) {
+ for (;;) {
+ vstr_add_char(&line, '\n');
+ int len = vstr_len(&line);
+ int ret = readline(&line, "... ");
+ if (ret == 0 || vstr_len(&line) == len) {
+ // done entering compound statement
+ break;
+ }
+ }
+ }
+
+ mp_lexer_str_buf_t sb;
+ mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", vstr_str(&line), vstr_len(&line), false, &sb);
+ mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT);
+ mp_lexer_free(lex);
+
+ if (pn != MP_PARSE_NODE_NULL) {
+ mp_obj_t module_fun = mp_compile(pn, true);
+ if (module_fun != mp_const_none) {
+ nlr_buf_t nlr;
+ uint32_t start = micros();
+ if (nlr_push(&nlr) == 0) {
+ rt_call_function_0(module_fun);
+ nlr_pop();
+ // optional timing
+ if (0) {
+ uint32_t ticks = micros() - start; // TODO implement a function that does this properly
+ printf("(took %lu us)\n", ticks);
+ }
+ } else {
+ // uncaught exception
+ mp_obj_print((mp_obj_t)nlr.ret_val);
+ printf("\n");
+ }
+ }
+ }
+ }
+
+ stdout_tx_str("\r\n");
+}
+
+void main(void) {
+ pinMode(LED_BUILTIN, OUTPUT);
+ // Wait for host side to get connected
+ while (!usb_vcp_is_connected()) {
+ ;
+ }
+
+ led_init();
+ led_state(PYB_LED_BUILTIN, 1);
+
+// int first_soft_reset = true;
+
+soft_reset:
+
+ // GC init
+ gc_init(&_heap_start, (void*)HEAP_END);
+
+ qstr_init();
+ rt_init();
+
+#if 1
+ printf("About to add functions()\n");
+ // add some functions to the python namespace
+ {
+ rt_store_name(qstr_from_str_static("help"), rt_make_function_0(pyb_help));
+ mp_obj_t m = mp_obj_new_module(qstr_from_str_static("pyb"));
+ rt_store_attr(m, qstr_from_str_static("info"), rt_make_function_0(pyb_info));
+ rt_store_attr(m, qstr_from_str_static("gc"), rt_make_function_0(pyb_gc));
+ rt_store_attr(m, qstr_from_str_static("delay"), rt_make_function_1(pyb_delay));
+ rt_store_attr(m, qstr_from_str_static("led"), rt_make_function_1(pyb_led));
+ rt_store_attr(m, qstr_from_str_static("Led"), rt_make_function_1(pyb_Led));
+ rt_store_attr(m, qstr_from_str_static("gpio"), (mp_obj_t)&pyb_gpio_obj);
+ rt_store_name(qstr_from_str_static("pyb"), m);
+ }
+#endif
+
+ // Turn bootup LED off
+ led_state(PYB_LED_BUILTIN, 0);
+
+ do_repl();
+
+ printf("PYB: soft reboot\n");
+
+// first_soft_reset = false;
+ goto soft_reset;
+}
+
+double __aeabi_f2d(float x) {
+ // TODO
+ return 0.0;
+}
+
+float __aeabi_d2f(double x) {
+ // TODO
+ return 0.0;
+}
+
+double sqrt(double x) {
+ // TODO
+ return 0.0;
+}
+
+machine_float_t machine_sqrt(machine_float_t x) {
+ // TODO
+ return x;
+}
+
+// stub out __libc_init_array. It's called by mk20dx128.c and is used to call
+// global C++ constructors. Since this is a C-only projects, we don't need to
+// call constructors.
+void __libc_init_array(void) {
+}
+
+char * ultoa(unsigned long val, char *buf, int radix)
+{
+ unsigned digit;
+ int i=0, j;
+ char t;
+
+ while (1) {
+ digit = val % radix;
+ buf[i] = ((digit < 10) ? '0' + digit : 'A' + digit - 10);
+ val /= radix;
+ if (val == 0) break;
+ i++;
+ }
+ buf[i + 1] = 0;
+ for (j=0; j < i; j++, i--) {
+ t = buf[j];
+ buf[j] = buf[i];
+ buf[i] = t;
+ }
+ return buf;
+}
diff --git a/teensy/main.cpp b/teensy/main.cpp
new file mode 100644
index 000000000..52ce51cda
--- /dev/null
+++ b/teensy/main.cpp
@@ -0,0 +1,245 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "Arduino.h"
+
+extern "C"
+{
+#include "nlr.h"
+#include "misc.h"
+#include "mpconfig.h"
+#include "lexer.h"
+#include "lexerteensy.h"
+#include "parse.h"
+#include "obj.h"
+#include "compile.h"
+#include "runtime0.h"
+#include "runtime.h"
+#include "repl.h"
+#include "usb.h"
+}
+
+#ifdef USE_READLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+#if 0
+static char *str_join(const char *s1, int sep_char, const char *s2) {
+ int l1 = strlen(s1);
+ int l2 = strlen(s2);
+ char *s = m_new(char, l1 + l2 + 2);
+ memcpy(s, s1, l1);
+ if (sep_char != 0) {
+ s[l1] = sep_char;
+ l1 += 1;
+ }
+ memcpy(s + l1, s2, l2);
+ s[l1 + l2] = 0;
+ return s;
+}
+
+static char *prompt(char *p) {
+#ifdef USE_READLINE
+ char *line = readline(p);
+ if (line) {
+ add_history(line);
+ }
+#else
+ static char buf[256];
+ fputs(p, stdout);
+ char *s = fgets(buf, sizeof(buf), stdin);
+ if (!s) {
+ return NULL;
+ }
+ int l = strlen(buf);
+ if (buf[l - 1] == '\n') {
+ buf[l - 1] = 0;
+ } else {
+ l++;
+ }
+ char *line = m_new(char, l);
+ memcpy(line, buf, l);
+#endif
+ return line;
+}
+#endif
+
+#define READLINE_HIST_SIZE (8)
+
+static const char *readline_hist[READLINE_HIST_SIZE] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+
+void stdout_tx_str(const char *str) {
+// usart_tx_str(str);
+ usb_vcp_send_str(str);
+}
+
+static elapsedMillis ledTime;
+static uint8_t ledState;
+
+int readline(vstr_t *line, const char *prompt) {
+ stdout_tx_str(prompt);
+ int len = vstr_len(line);
+ int escape = 0;
+ int hist_num = 0;
+ for (;;) {
+ char c;
+ ledState = 1;
+ ledTime = 0;
+ digitalWrite(LED_BUILTIN, ledState);
+ for (;;) {
+ if (ledTime > 200) {
+ ledState = !ledState;
+ digitalWrite(LED_BUILTIN, ledState);
+ ledTime = 0;
+ }
+ if (usb_vcp_rx_any() != 0) {
+ c = usb_vcp_rx_get();
+ break;
+#if 0
+ } else if (usart_rx_any()) {
+ c = usart_rx_char();
+ break;
+#endif
+ }
+ //delay(1);
+ //if (storage_needs_flush()) {
+ // storage_flush();
+ //}
+ }
+ if (escape == 0) {
+ if (c == 4 && vstr_len(line) == len) {
+ return 0;
+ } else if (c == '\r') {
+ stdout_tx_str("\r\n");
+ for (int i = READLINE_HIST_SIZE - 1; i > 0; i--) {
+ readline_hist[i] = readline_hist[i - 1];
+ }
+ readline_hist[0] = strdup(vstr_str(line));
+ return 1;
+ } else if (c == 27) {
+ escape = true;
+ } else if (c == 127) {
+ if (vstr_len(line) > len) {
+ vstr_cut_tail(line, 1);
+ stdout_tx_str("\b \b");
+ }
+ } else if (32 <= c && c <= 126) {
+ vstr_add_char(line, c);
+ stdout_tx_str(line->buf + line->len - 1);
+ }
+ } else if (escape == 1) {
+ if (c == '[') {
+ escape = 2;
+ } else {
+ escape = 0;
+ }
+ } else if (escape == 2) {
+ escape = 0;
+ if (c == 'A') {
+ // up arrow
+ if (hist_num < READLINE_HIST_SIZE && readline_hist[hist_num] != NULL) {
+ // erase line
+ for (int i = line->len - len; i > 0; i--) {
+ stdout_tx_str("\b \b");
+ }
+ // set line to history
+ line->len = len;
+ vstr_add_str(line, readline_hist[hist_num]);
+ // draw line
+ stdout_tx_str(readline_hist[hist_num]);
+ // increase hist num
+ hist_num += 1;
+ }
+ }
+ } else {
+ escape = 0;
+ }
+ delay(10);
+ }
+}
+
+void setup(void) {
+ pinMode(LED_BUILTIN, OUTPUT);
+ ledState = 1;
+ digitalWrite(LED_BUILTIN, ledState);
+ ledTime = 0;
+ // Wait for host side to get connected
+ while (!usb_vcp_is_connected()) {
+ if (ledTime > 100) {
+ ledState = !ledState;
+ digitalWrite(LED_BUILTIN, ledState);
+ ledTime = 0;
+ }
+ }
+ digitalWrite(LED_BUILTIN, 0);
+
+ qstr_init();
+ rt_init();
+
+ stdout_tx_str("Micro Python for Teensy 3.1\r\n");
+ stdout_tx_str("Type \"help()\" for more information.\r\n");
+}
+
+void loop(void) {
+ vstr_t line;
+ vstr_init(&line);
+
+ vstr_reset(&line);
+ int ret = readline(&line, ">>> ");
+ if (ret == 0) {
+ // EOF
+ return;
+ }
+
+ if (vstr_len(&line) == 0) {
+ return;
+ }
+
+ if (mp_repl_is_compound_stmt(vstr_str(&line))) {
+ for (;;) {
+ vstr_add_char(&line, '\n');
+ int len = vstr_len(&line);
+ int ret = readline(&line, "... ");
+ if (ret == 0 || vstr_len(&line) == len) {
+ // done entering compound statement
+ break;
+ }
+ }
+ }
+
+ mp_lexer_str_buf_t sb;
+ mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", vstr_str(&line), vstr_len(&line), false, &sb);
+ mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT);
+ mp_lexer_free(lex);
+
+ if (pn != MP_PARSE_NODE_NULL) {
+ mp_obj_t module_fun = mp_compile(pn, true);
+ if (module_fun != mp_const_none) {
+ nlr_buf_t nlr;
+ uint32_t start = micros();
+ if (nlr_push(&nlr) == 0) {
+ rt_call_function_0(module_fun);
+ nlr_pop();
+ // optional timing
+ if (0) {
+ uint32_t ticks = micros() - start; // TODO implement a function that does this properly
+ printf("(took %lu us)\n", ticks);
+ }
+ } else {
+ // uncaught exception
+ mp_obj_print((mp_obj_t)nlr.ret_val);
+ printf("\r\n");
+ }
+ }
+ }
+}
+
+// for sqrt
+#include <math.h>
+machine_float_t machine_sqrt(machine_float_t x) {
+ return sqrt(x);
+}
+
diff --git a/teensy/malloc0.c b/teensy/malloc0.c
new file mode 100644
index 000000000..1a6cb708e
--- /dev/null
+++ b/teensy/malloc0.c
@@ -0,0 +1,57 @@
+#include <stdint.h>
+#include "std.h"
+#include "mpconfig.h"
+#include "gc.h"
+
+#if 0
+static uint32_t mem = 0;
+
+void *malloc(size_t n) {
+ if (mem == 0) {
+ extern uint32_t _heap_start;
+ mem = (uint32_t)&_heap_start; // need to use big ram block so we can execute code from it (is it true that we can't execute from CCM?)
+ }
+ void *ptr = (void*)mem;
+ mem = (mem + n + 3) & (~3);
+ if (mem > 0x20000000 + 0x18000) {
+ void __fatal_error(const char*);
+ __fatal_error("out of memory");
+ }
+ return ptr;
+}
+
+void free(void *ptr) {
+}
+
+void *realloc(void *ptr, size_t n) {
+ return malloc(n);
+}
+
+#endif
+
+void *calloc(size_t sz, size_t n) {
+ char *ptr = malloc(sz * n);
+ for (int i = 0; i < sz * n; i++) {
+ ptr[i] = 0;
+ }
+ return ptr;
+}
+
+void *malloc(size_t n) {
+ void *m = gc_alloc(n);
+ return m;
+}
+
+void free(void *ptr) {
+ gc_free(ptr);
+}
+
+void *realloc(void *ptr, size_t n) {
+ return gc_realloc(ptr, n);
+}
+
+void __assert_func(void) {
+ printf("\nASSERT FAIL!");
+ for (;;) {
+ }
+}
diff --git a/teensy/mk20dx256.ld b/teensy/mk20dx256.ld
new file mode 100644
index 000000000..da57cbe5c
--- /dev/null
+++ b/teensy/mk20dx256.ld
@@ -0,0 +1,164 @@
+/* Teensyduino Core Library
+ * http://www.pjrc.com/teensy/
+ * Copyright (c) 2013 PJRC.COM, LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * 1. The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * 2. If the Software is incorporated into a build system that allows
+ * selection among a list of target devices, then similar target
+ * devices manufactured by PJRC.COM must be included in the list of
+ * target devices and selectable in the same manner.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+MEMORY
+{
+ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K
+ RAM (rwx) : ORIGIN = 0x1FFF8000, LENGTH = 64K
+}
+
+/* produce a link error if there is not this amount of RAM for these sections */
+_minimum_stack_size = 2K;
+_minimum_heap_size = 16K;
+
+/* INCLUDE common.ld */
+
+/* Teensyduino Core Library
+ * http://www.pjrc.com/teensy/
+ * Copyright (c) 2013 PJRC.COM, LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * 1. The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * 2. If the Software is incorporated into a build system that allows
+ * selection among a list of target devices, then similar target
+ * devices manufactured by PJRC.COM must be included in the list of
+ * target devices and selectable in the same manner.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+
+
+SECTIONS
+{
+ .text : {
+ . = 0;
+ KEEP(*(.vectors))
+ *(.startup*)
+ /* TODO: does linker detect startup overflow onto flashconfig? */
+ . = 0x400;
+ KEEP(*(.flashconfig*))
+ *(.text*)
+ *(.rodata*)
+ . = ALIGN(4);
+ KEEP(*(.init))
+ . = ALIGN(4);
+ __preinit_array_start = .;
+ KEEP (*(.preinit_array))
+ __preinit_array_end = .;
+ __init_array_start = .;
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ __init_array_end = .;
+ } > FLASH = 0xFF
+
+ .ARM.exidx : {
+ __exidx_start = .;
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ __exidx_end = .;
+ } > FLASH
+ _etext = .;
+
+ .usbdescriptortable (NOLOAD) : {
+ /* . = ORIGIN(RAM); */
+ . = ALIGN(512);
+ *(.usbdescriptortable*)
+ } > RAM
+
+ .dmabuffers (NOLOAD) : {
+ . = ALIGN(4);
+ *(.dmabuffers*)
+ } > RAM
+
+ .usbbuffers (NOLOAD) : {
+ . = ALIGN(4);
+ *(.usbbuffers*)
+ } > RAM
+
+ .data : AT (_etext) {
+ . = ALIGN(4);
+ _sdata = .;
+ *(.data*)
+ . = ALIGN(4);
+ _edata = .;
+ } > RAM
+
+ .noinit (NOLOAD) : {
+ *(.noinit*)
+ } > RAM
+
+ .bss : {
+ . = ALIGN(4);
+ _sbss = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = .;
+ __bss_end = .;
+ } > RAM
+
+ /* this is to define the start of the heap, and make sure we have a minimum size */
+ .heap :
+ {
+ . = ALIGN(4);
+ _heap_start = .; /* define a global symbol at heap start */
+ . = . + _minimum_heap_size;
+ } >RAM
+
+ /* this just checks there is enough RAM for the stack */
+ .stack :
+ {
+ . = ALIGN(4);
+ . = . + _minimum_stack_size;
+ . = ALIGN(4);
+ } >RAM
+
+ _estack = ORIGIN(RAM) + LENGTH(RAM);
+}
+
+
+
+
diff --git a/teensy/mpconfigport.h b/teensy/mpconfigport.h
new file mode 100644
index 000000000..4cea332f3
--- /dev/null
+++ b/teensy/mpconfigport.h
@@ -0,0 +1,21 @@
+#include <stdint.h>
+
+// options to control how Micro Python is built
+
+#define MICROPY_ENABLE_FLOAT (1)
+#define MICROPY_EMIT_CPYTHON (0)
+#define MICROPY_EMIT_X64 (0)
+#define MICROPY_EMIT_THUMB (1)
+#define MICROPY_EMIT_INLINE_THUMB (1)
+
+// type definitions for the specific machine
+
+#define BYTES_PER_WORD (4)
+
+typedef int32_t machine_int_t; // must be pointer size
+typedef uint32_t machine_uint_t; // must be pointer size
+typedef void *machine_ptr_t; // must be of pointer size
+typedef const void *machine_const_ptr_t; // must be of pointer size
+typedef float machine_float_t;
+
+machine_float_t machine_sqrt(machine_float_t x);
diff --git a/teensy/printf.c b/teensy/printf.c
new file mode 100644
index 000000000..71b27b821
--- /dev/null
+++ b/teensy/printf.c
@@ -0,0 +1,305 @@
+#include <stdint.h>
+#include <stdarg.h>
+#include "std.h"
+#include "misc.h"
+//#include "lcd.h"
+//#include "usart.h"
+#include "usb.h"
+
+#define PF_FLAG_LEFT_ADJUST (0x01)
+#define PF_FLAG_SHOW_SIGN (0x02)
+#define PF_FLAG_SPACE_SIGN (0x04)
+#define PF_FLAG_NO_TRAILZ (0x08)
+#define PF_FLAG_ZERO_PAD (0x10)
+
+// tricky; we compute pad string by: pad_chars + (flags & PF_FLAG_ZERO_PAD)
+#define PF_PAD_SIZE PF_FLAG_ZERO_PAD
+static const char *pad_chars = " 0000000000000000";
+
+typedef struct _pfenv_t {
+ void *data;
+ void (*print_strn)(void *, const char *str, unsigned int len);
+} pfenv_t;
+
+static void print_str_dummy(void *data, const char *str, unsigned int len) {
+}
+
+const pfenv_t pfenv_dummy = {0, print_str_dummy};
+
+static int pfenv_print_strn(const pfenv_t *pfenv, const char *str, unsigned int len, int flags, int width) {
+ int pad = width - len;
+ if (pad > 0 && (flags & PF_FLAG_LEFT_ADJUST) == 0) {
+ while (pad > 0) {
+ int p = pad;
+ if (p > PF_PAD_SIZE)
+ p = PF_PAD_SIZE;
+ pfenv->print_strn(pfenv->data, pad_chars + (flags & PF_FLAG_ZERO_PAD), p);
+ pad -= p;
+ }
+ }
+ pfenv->print_strn(pfenv->data, str, len);
+ while (pad > 0) {
+ int p = pad;
+ if (p > PF_PAD_SIZE)
+ p = PF_PAD_SIZE;
+ pfenv->print_strn(pfenv->data, pad_chars, p);
+ pad -= p;
+ }
+ return len;
+}
+
+// enough room for 32 signed number
+#define INT_BUF_SIZE (12)
+
+static int pfenv_print_int(const pfenv_t *pfenv, unsigned int x, int sgn, int base, int base_char, int flags, int width) {
+ char sign = 0;
+ if (sgn) {
+ if ((int)x < 0) {
+ sign = '-';
+ x = -x;
+ } else if (flags & PF_FLAG_SHOW_SIGN) {
+ sign = '+';
+ } else if (flags & PF_FLAG_SPACE_SIGN) {
+ sign = ' ';
+ }
+ }
+
+ char buf[INT_BUF_SIZE];
+ char *b = buf + INT_BUF_SIZE;
+
+ if (x == 0) {
+ *(--b) = '0';
+ } else {
+ do {
+ int c = x % base;
+ x /= base;
+ if (c >= 10) {
+ c += base_char - 10;
+ } else {
+ c += '0';
+ }
+ *(--b) = c;
+ } while (b > buf && x != 0);
+ }
+
+ if (b > buf && sign != 0) {
+ *(--b) = sign;
+ }
+
+ return pfenv_print_strn(pfenv, b, buf + INT_BUF_SIZE - b, flags, width);
+}
+
+void pfenv_prints(const pfenv_t *pfenv, const char *str) {
+ pfenv->print_strn(pfenv->data, str, strlen(str));
+}
+
+int pfenv_printf(const pfenv_t *pfenv, const char *fmt, va_list args) {
+ int chrs = 0;
+ for (;;) {
+ {
+ const char *f = fmt;
+ while (*f != '\0' && *f != '%') {
+ ++f; // XXX UTF8 advance char
+ }
+ if (f > fmt) {
+ pfenv->print_strn(pfenv->data, fmt, f - fmt);
+ chrs += f - fmt;
+ fmt = f;
+ }
+ }
+
+ if (*fmt == '\0') {
+ break;
+ }
+
+ // move past % character
+ ++fmt;
+
+ // parse flags, if they exist
+ int flags = 0;
+ while (*fmt != '\0') {
+ if (*fmt == '-') flags |= PF_FLAG_LEFT_ADJUST;
+ else if (*fmt == '+') flags |= PF_FLAG_SHOW_SIGN;
+ else if (*fmt == ' ') flags |= PF_FLAG_SPACE_SIGN;
+ else if (*fmt == '!') flags |= PF_FLAG_NO_TRAILZ;
+ else if (*fmt == '0') flags |= PF_FLAG_ZERO_PAD;
+ else break;
+ ++fmt;
+ }
+
+ // parse width, if it exists
+ int width = 0;
+ for (; '0' <= *fmt && *fmt <= '9'; ++fmt) {
+ width = width * 10 + *fmt - '0';
+ }
+
+ // parse precision, if it exists
+ int prec = -1;
+ if (*fmt == '.') {
+ ++fmt;
+ if (*fmt == '*') {
+ ++fmt;
+ prec = va_arg(args, int);
+ } else {
+ prec = 0;
+ for (; '0' <= *fmt && *fmt <= '9'; ++fmt) {
+ prec = prec * 10 + *fmt - '0';
+ }
+ }
+ if (prec < 0) {
+ prec = 0;
+ }
+ }
+
+ // parse long specifiers (current not used)
+ //bool long_arg = false;
+ if (*fmt == 'l') {
+ ++fmt;
+ //long_arg = true;
+ }
+
+ if (*fmt == '\0') {
+ break;
+ }
+
+ switch (*fmt) {
+ case 'b':
+ if (va_arg(args, int)) {
+ chrs += pfenv_print_strn(pfenv, "true", 4, flags, width);
+ } else {
+ chrs += pfenv_print_strn(pfenv, "false", 5, flags, width);
+ }
+ break;
+ case 'c':
+ {
+ char str = va_arg(args, int);
+ chrs += pfenv_print_strn(pfenv, &str, 1, flags, width);
+ break;
+ }
+ case 's':
+ {
+ const char *str = va_arg(args, const char*);
+ if (str) {
+ if (prec < 0) {
+ prec = strlen(str);
+ }
+ chrs += pfenv_print_strn(pfenv, str, prec, flags, width);
+ } else {
+ chrs += pfenv_print_strn(pfenv, "(null)", 6, flags, width);
+ }
+ break;
+ }
+ case 'u':
+ chrs += pfenv_print_int(pfenv, va_arg(args, int), 0, 10, 'a', flags, width);
+ break;
+ case 'd':
+ chrs += pfenv_print_int(pfenv, va_arg(args, int), 1, 10, 'a', flags, width);
+ break;
+ case 'x':
+ case 'p': // ?
+ chrs += pfenv_print_int(pfenv, va_arg(args, int), 0, 16, 'a', flags, width);
+ break;
+ case 'X':
+ case 'P': // ?
+ chrs += pfenv_print_int(pfenv, va_arg(args, int), 0, 16, 'A', flags, width);
+ break;
+ default:
+ pfenv->print_strn(pfenv->data, fmt, 1);
+ chrs += 1;
+ break;
+ }
+ ++fmt;
+ }
+ return chrs;
+}
+
+void stdout_print_strn(void *data, const char *str, unsigned int len) {
+ // send stdout to USART, USB CDC VCP, and LCD if nothing else
+#if 0
+ int any = 0;
+ if (usart_is_enabled()) {
+ usart_tx_strn_cooked(str, len);
+ any = true;
+ }
+#endif
+ if (usb_vcp_is_enabled()) {
+ usb_vcp_send_strn_cooked(str, len);
+// any = true;
+ }
+#if 0
+ if (!any) {
+ lcd_print_strn(str, len);
+ }
+#endif
+}
+
+static const pfenv_t pfenv_stdout = {0, stdout_print_strn};
+
+int printf(const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ int ret = pfenv_printf(&pfenv_stdout, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+int vprintf(const char *fmt, va_list ap) {
+ return pfenv_printf(&pfenv_stdout, fmt, ap);
+}
+
+// need this because gcc optimises printf("%c", c) -> putchar(c), and printf("a") -> putchar('a')
+int putchar(int c) {
+ char chr = c;
+ stdout_print_strn(0, &chr, 1);
+ return chr;
+}
+
+// need this because gcc optimises printf("string\n") -> puts("string")
+int puts(const char *s) {
+ stdout_print_strn(0, s, strlen(s));
+ char chr = '\n';
+ stdout_print_strn(0, &chr, 1);
+ return 1;
+}
+
+typedef struct _strn_pfenv_t {
+ char *cur;
+ size_t remain;
+} strn_pfenv_t;
+
+void strn_print_strn(void *data, const char *str, unsigned int len) {
+ strn_pfenv_t *strn_pfenv = data;
+ if (len > strn_pfenv->remain) {
+ len = strn_pfenv->remain;
+ }
+ memcpy(strn_pfenv->cur, str, len);
+ strn_pfenv->cur += len;
+ strn_pfenv->remain -= len;
+}
+
+int vsnprintf(char *str, size_t size, const char *fmt, va_list ap) {
+ strn_pfenv_t strn_pfenv;
+ strn_pfenv.cur = str;
+ strn_pfenv.remain = size;
+ pfenv_t pfenv;
+ pfenv.data = &strn_pfenv;
+ pfenv.print_strn = strn_print_strn;
+ int len = pfenv_printf(&pfenv, fmt, ap);
+ // add terminating null byte
+ if (size > 0) {
+ if (strn_pfenv.remain == 0) {
+ strn_pfenv.cur[-1] = 0;
+ } else {
+ strn_pfenv.cur[0] = 0;
+ }
+ }
+ return len;
+}
+
+int snprintf(char *str, size_t size, const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ int ret = vsnprintf(str, size, fmt, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/teensy/std.h b/teensy/std.h
new file mode 100644
index 000000000..587b9f888
--- /dev/null
+++ b/teensy/std.h
@@ -0,0 +1,22 @@
+typedef unsigned int size_t;
+
+void __assert_func(void);
+
+void *malloc(size_t n);
+void free(void *ptr);
+void *calloc(size_t sz, size_t n);
+void *realloc(void *ptr, size_t n);
+
+void *memcpy(void *dest, const void *src, size_t n);
+void *memmove(void *dest, const void *src, size_t n);
+void *memset(void *s, int c, size_t n);
+
+int strlen(const char *str);
+int strcmp(const char *s1, const char *s2);
+int strncmp(const char *s1, const char *s2, size_t n);
+char *strndup(const char *s, size_t n);
+char *strcpy(char *dest, const char *src);
+char *strcat(char *dest, const char *src);
+
+int printf(const char *fmt, ...);
+int snprintf(char *str, size_t size, const char *fmt, ...);
diff --git a/teensy/string0.c b/teensy/string0.c
new file mode 100644
index 000000000..2a5f25597
--- /dev/null
+++ b/teensy/string0.c
@@ -0,0 +1,110 @@
+#include <stdint.h>
+#include "std.h"
+
+void *memcpy(void *dest, const void *src, size_t n) {
+ // TODO align and copy 32 bits at a time
+ uint8_t *d = dest;
+ const uint8_t *s = src;
+ for (; n > 0; n--) {
+ *d++ = *s++;
+ }
+ return dest;
+}
+
+void *memmove(void *dest, const void *src, size_t n) {
+ if (src < dest && dest < src + n) {
+ // need to copy backwards
+ uint8_t *d = dest + n - 1;
+ const uint8_t *s = src + n - 1;
+ for (; n > 0; n--) {
+ *d-- = *s--;
+ }
+ return dest;
+ } else {
+ // can use normal memcpy
+ return memcpy(dest, src, n);
+ }
+}
+
+void *memset(void *s, int c, size_t n) {
+ uint8_t *s2 = s;
+ for (; n > 0; n--) {
+ *s2++ = c;
+ }
+ return s;
+}
+
+int strlen(const char *str) {
+ int len = 0;
+ for (const char *s = str; *s; s++) {
+ len += 1;
+ }
+ return len;
+}
+
+int strcmp(const char *s1, const char *s2) {
+ while (*s1 && *s2) {
+ char c1 = *s1++; // XXX UTF8 get char, next char
+ char c2 = *s2++; // XXX UTF8 get char, next char
+ if (c1 < c2) return -1;
+ else if (c1 > c2) return 1;
+ }
+ if (*s2) return -1;
+ else if (*s1) return 1;
+ else return 0;
+}
+
+int strncmp(const char *s1, const char *s2, size_t n) {
+ while (*s1 && *s2 && n > 0) {
+ char c1 = *s1++; // XXX UTF8 get char, next char
+ char c2 = *s2++; // XXX UTF8 get char, next char
+ n--;
+ if (c1 < c2) return -1;
+ else if (c1 > c2) return 1;
+ }
+ if (n == 0) return 0;
+ else if (*s2) return -1;
+ else if (*s1) return 1;
+ else return 0;
+}
+
+char *strndup(const char *s, size_t n) {
+ size_t len = strlen(s);
+ if (n > len) {
+ n = len;
+ }
+ char *s2 = malloc(n + 1);
+ memcpy(s2, s, n);
+ s2[n] = '\0';
+ return s2;
+}
+
+char *strcpy(char *dest, const char *src) {
+ char *d = dest;
+ while (*src) {
+ *d++ = *src++;
+ }
+ *d = '\0';
+ return dest;
+}
+
+// needed because gcc optimises strcpy + strcat to this
+char *stpcpy(char *dest, const char *src) {
+ while (*src) {
+ *dest++ = *src++;
+ }
+ *dest = '\0';
+ return dest;
+}
+
+char *strcat(char *dest, const char *src) {
+ char *d = dest;
+ while (*d) {
+ d++;
+ }
+ while (*src) {
+ *d++ = *src++;
+ }
+ *d = '\0';
+ return dest;
+}
diff --git a/teensy/usb.c b/teensy/usb.c
new file mode 100644
index 000000000..a045a2ed6
--- /dev/null
+++ b/teensy/usb.c
@@ -0,0 +1,44 @@
+#include "Arduino.h"
+
+#include "usb.h"
+#include "usb_serial.h"
+
+int usb_vcp_is_connected(void)
+{
+ return usb_configuration && (usb_cdc_line_rtsdtr & (USB_SERIAL_DTR | USB_SERIAL_RTS));
+}
+
+int usb_vcp_is_enabled(void)
+{
+ return 1;
+}
+
+int usb_vcp_rx_any(void)
+{
+ return usb_serial_available();
+}
+
+char usb_vcp_rx_get(void)
+{
+ return usb_serial_getchar();
+}
+
+void usb_vcp_send_str(const char* str)
+{
+ usb_vcp_send_strn(str, strlen(str));
+}
+
+void usb_vcp_send_strn(const char* str, int len)
+{
+ usb_serial_write(str, len);
+}
+
+void usb_vcp_send_strn_cooked(const char *str, int len)
+{
+ for (const char *top = str + len; str < top; str++) {
+ if (*str == '\n') {
+ usb_serial_putchar('\r');
+ }
+ usb_serial_putchar(*str);
+ }
+}
diff --git a/teensy/usb.h b/teensy/usb.h
new file mode 100644
index 000000000..8f32309ec
--- /dev/null
+++ b/teensy/usb.h
@@ -0,0 +1,9 @@
+void usb_init(void);
+int usb_vcp_is_enabled(void);
+int usb_vcp_is_connected(void);
+int usb_vcp_rx_any(void);
+char usb_vcp_rx_get(void);
+void usb_vcp_send_str(const char* str);
+void usb_vcp_send_strn(const char* str, int len);
+void usb_vcp_send_strn_cooked(const char *str, int len);
+void usb_hid_send_report(uint8_t *buf); // 4 bytes for mouse: ?, x, y, ?
diff --git a/unix-cpy/Makefile b/unix-cpy/Makefile
index a1eb9b77e..d2d698713 100644
--- a/unix-cpy/Makefile
+++ b/unix-cpy/Makefile
@@ -1,95 +1,37 @@
-PYSRC=../py
-BUILD=build
+# define main target
+PROG = cpy
+all: $(PROG)
+
+# include py core make definitions
+include ../py/py.mk
+# program for deletion
+RM = /bin/rm
+
+# compiler settings
CC = gcc
-CFLAGS = -I. -I$(PYSRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG
+CFLAGS = -I. -I$(PY_SRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG
LDFLAGS = -lm
+# source files
SRC_C = \
main.c \
-PY_O = \
- nlrx86.o \
- nlrx64.o \
- malloc.o \
- qstr.o \
- vstr.o \
- unicode.o \
- lexer.o \
- lexerunix.o \
- parse.o \
- scope.o \
- compile.o \
- emitcommon.o \
- emitpass1.o \
- emitcpy.o \
- runtime.o \
- map.o \
- obj.o \
- objbool.o \
- objboundmeth.o \
- objcell.o \
- objclass.o \
- objclosure.o \
- objcomplex.o \
- objdict.o \
- objexcept.o \
- objfloat.o \
- objfun.o \
- objgenerator.o \
- objinstance.o \
- objint.o \
- objlist.o \
- objmodule.o \
- objnone.o \
- objrange.o \
- objset.o \
- objslice.o \
- objstr.o \
- objtuple.o \
- objtype.o \
- builtin.o \
- builtinimport.o \
- vm.o \
- showbc.o \
- repl.o \
-
-OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(PY_O))
+OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) $(PY_O)
LIB =
-PROG = cpy
$(PROG): $(BUILD) $(OBJ)
$(CC) -o $@ $(OBJ) $(LIB) $(LDFLAGS)
-
-$(BUILD):
- mkdir -p $@
+ strip $(PROG)
+ size $(PROG)
$(BUILD)/%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
-$(BUILD)/%.o: $(PYSRC)/%.S
- $(CC) $(CFLAGS) -c -o $@ $<
-
-$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h
- $(CC) $(CFLAGS) -c -o $@ $<
-
-$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h
- $(CC) $(CFLAGS) -DN_X64 -c -o $@ $<
-
-$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h
- $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $<
-
-# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
-$(BUILD)/vm.o: $(PYSRC)/vm.c
- $(CC) $(CFLAGS) -O3 -c -o $@ $<
-
$(BUILD)/main.o: mpconfigport.h
-$(BUILD)/parse.o: $(PYSRC)/grammar.h
-$(BUILD)/compile.o: $(PYSRC)/grammar.h
-$(BUILD)/emitcpy.o: $(PYSRC)/emit.h
-$(BUILD)/emitbc.o: $(PYSRC)/emit.h
clean:
- /bin/rm -rf $(BUILD)
+ $(RM) -f $(PROG)
+ $(RM) -rf $(BUILD)
-.PHONY: clean
+.PHONY: all clean
diff --git a/unix-cpy/main.c b/unix-cpy/main.c
index eba97f527..ea85e3275 100644
--- a/unix-cpy/main.c
+++ b/unix-cpy/main.c
@@ -11,7 +11,6 @@
#include "obj.h"
#include "compile.h"
#include "runtime0.h"
-#include "runtime.h"
void do_file(const char *file) {
mp_lexer_t *lex = mp_lexer_new_from_file(file);
diff --git a/unix-cpy/mpconfigport.h b/unix-cpy/mpconfigport.h
index 983b166a5..3fc186677 100644
--- a/unix-cpy/mpconfigport.h
+++ b/unix-cpy/mpconfigport.h
@@ -1,10 +1,8 @@
// options to control how Micro Python is built
-#define MICROPY_ENABLE_FLOAT (1)
#define MICROPY_EMIT_CPYTHON (1)
-#define MICROPY_EMIT_X64 (0)
-#define MICROPY_EMIT_THUMB (0)
-#define MICROPY_EMIT_INLINE_THUMB (0)
+#define MICROPY_ENABLE_LEXER_UNIX (1)
+#define MICROPY_ENABLE_FLOAT (1)
// type definitions for the specific machine
diff --git a/unix/Makefile b/unix/Makefile
index 984f1c3bf..a3faea290 100644
--- a/unix/Makefile
+++ b/unix/Makefile
@@ -1,106 +1,39 @@
-PYSRC=../py
-BUILD=build
+# define main target
+PROG = py
+all: $(PROG)
+
+# include py core make definitions
+include ../py/py.mk
+# program for deletion
+RM = /bin/rm
+
+# compiler settings
CC = gcc
-CFLAGS = -I. -I$(PYSRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG
+CFLAGS = -I. -I$(PY_SRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG
LDFLAGS = -lm
+# source files
SRC_C = \
main.c \
-PY_O = \
- nlrx86.o \
- nlrx64.o \
- nlrthumb.o \
- malloc.o \
- qstr.o \
- vstr.o \
- unicode.o \
- lexer.o \
- lexerunix.o \
- parse.o \
- scope.o \
- compile.o \
- emitcommon.o \
- emitpass1.o \
- emitcpy.o \
- emitbc.o \
- asmx64.o \
- emitnx64.o \
- asmthumb.o \
- emitnthumb.o \
- emitinlinethumb.o \
- runtime.o \
- map.o \
- obj.o \
- objbool.o \
- objboundmeth.o \
- objcell.o \
- objclass.o \
- objclosure.o \
- objcomplex.o \
- objdict.o \
- objexcept.o \
- objfloat.o \
- objfun.o \
- objgenerator.o \
- objinstance.o \
- objint.o \
- objlist.o \
- objmodule.o \
- objnone.o \
- objrange.o \
- objset.o \
- objslice.o \
- objstr.o \
- objtuple.o \
- objtype.o \
- builtin.o \
- builtinimport.o \
- vm.o \
- showbc.o \
- repl.o \
-
-OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(PY_O))
+OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) $(PY_O)
LIB = -lreadline
# the following is needed for BSD
#LIB += -ltermcap
-PROG = py
$(PROG): $(BUILD) $(OBJ)
$(CC) -o $@ $(OBJ) $(LIB) $(LDFLAGS)
strip $(PROG)
size $(PROG)
-$(BUILD):
- mkdir -p $@
-
$(BUILD)/%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
-$(BUILD)/%.o: $(PYSRC)/%.S
- $(CC) $(CFLAGS) -c -o $@ $<
-
-$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h
- $(CC) $(CFLAGS) -c -o $@ $<
-
-$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h
- $(CC) $(CFLAGS) -DN_X64 -c -o $@ $<
-
-$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h
- $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $<
-
-# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
-$(BUILD)/vm.o: $(PYSRC)/vm.c
- $(CC) $(CFLAGS) -O3 -c -o $@ $<
-
$(BUILD)/main.o: mpconfigport.h
-$(BUILD)/parse.o: $(PYSRC)/grammar.h
-$(BUILD)/compile.o: $(PYSRC)/grammar.h
-$(BUILD)/emitcpy.o: $(PYSRC)/emit.h
-$(BUILD)/emitbc.o: $(PYSRC)/emit.h
clean:
- /bin/rm -rf $(BUILD)
+ $(RM) -f $(PROG)
+ $(RM) -rf $(BUILD)
-.PHONY: clean
+.PHONY: all clean
diff --git a/unix/main.c b/unix/main.c
index a06dc3679..920aed344 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -20,6 +20,52 @@
#include <readline/history.h>
#endif
+static void execute_from_lexer(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, bool is_repl) {
+ if (lex == NULL) {
+ return;
+ }
+
+ if (0) {
+ // just tokenise
+ while (!mp_lexer_is_kind(lex, MP_TOKEN_END)) {
+ mp_token_show(mp_lexer_cur(lex));
+ mp_lexer_to_next(lex);
+ }
+ mp_lexer_free(lex);
+ return;
+ }
+
+ mp_parse_node_t pn = mp_parse(lex, input_kind);
+ mp_lexer_free(lex);
+
+ if (pn == MP_PARSE_NODE_NULL) {
+ // parse error
+ return;
+ }
+
+ //printf("----------------\n");
+ //parse_node_show(pn, 0);
+ //printf("----------------\n");
+
+ mp_obj_t module_fun = mp_compile(pn, is_repl);
+
+ if (module_fun == mp_const_none) {
+ // compile error
+ return;
+ }
+
+ // execute it
+ nlr_buf_t nlr;
+ if (nlr_push(&nlr) == 0) {
+ rt_call_function_0(module_fun);
+ nlr_pop();
+ } else {
+ // uncaught exception
+ mp_obj_print((mp_obj_t)nlr.ret_val);
+ printf("\n");
+ }
+}
+
static char *str_join(const char *s1, int sep_char, const char *s2) {
int l1 = strlen(s1);
int l2 = strlen(s2);
@@ -80,28 +126,11 @@ static void do_repl(void) {
}
mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", line, strlen(line), false);
- mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT);
- mp_lexer_free(lex);
-
- if (pn != MP_PARSE_NODE_NULL) {
- //mp_parse_node_show(pn, 0);
- mp_obj_t module_fun = mp_compile(pn, true);
- if (module_fun != mp_const_none) {
- nlr_buf_t nlr;
- if (nlr_push(&nlr) == 0) {
- rt_call_function_0(module_fun);
- nlr_pop();
- } else {
- // uncaught exception
- mp_obj_print((mp_obj_t)nlr.ret_val);
- printf("\n");
- }
- }
- }
+ execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, true);
}
}
-void do_file(const char *file) {
+static void do_file(const char *file) {
// hack: set dir for import based on where this file is
{
const char * s = strrchr(file, '/');
@@ -115,58 +144,17 @@ void do_file(const char *file) {
}
mp_lexer_t *lex = mp_lexer_new_from_file(file);
- //const char *pysrc = "def f():\n x=x+1\n print(42)\n";
- //mp_lexer_t *lex = mp_lexer_from_str_len("<>", pysrc, strlen(pysrc), false);
- if (lex == NULL) {
- return;
- }
-
- if (0) {
- // just tokenise
- while (!mp_lexer_is_kind(lex, MP_TOKEN_END)) {
- mp_token_show(mp_lexer_cur(lex));
- mp_lexer_to_next(lex);
- }
- mp_lexer_free(lex);
-
- } else {
- // compile
-
- mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT);
- mp_lexer_free(lex);
-
- if (pn != MP_PARSE_NODE_NULL) {
- //printf("----------------\n");
- //parse_node_show(pn, 0);
- //printf("----------------\n");
- mp_obj_t module_fun = mp_compile(pn, false);
- //printf("----------------\n");
+ execute_from_lexer(lex, MP_PARSE_FILE_INPUT, false);
+}
-#if MICROPY_EMIT_CPYTHON
- if (!comp_ok) {
- printf("compile error\n");
- }
-#else
- if (1 && module_fun != mp_const_none) {
- // execute it
- nlr_buf_t nlr;
- if (nlr_push(&nlr) == 0) {
- rt_call_function_0(module_fun);
- nlr_pop();
- } else {
- // uncaught exception
- mp_obj_print((mp_obj_t)nlr.ret_val);
- printf("\n");
- }
- }
-#endif
- }
- }
+static void do_str(const char *str) {
+ mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", str, strlen(str), false);
+ execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, false);
}
typedef struct _test_obj_t {
mp_obj_base_t base;
- bool value;
+ int value;
} test_obj_t;
static void test_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
@@ -188,21 +176,17 @@ static mp_obj_t test_set(mp_obj_t self_in, mp_obj_t arg) {
static MP_DEFINE_CONST_FUN_OBJ_1(test_get_obj, test_get);
static MP_DEFINE_CONST_FUN_OBJ_2(test_set_obj, test_set);
+static const mp_method_t test_methods[] = {
+ { "get", &test_get_obj },
+ { "set", &test_set_obj },
+ { NULL, NULL },
+};
+
static const mp_obj_type_t test_type = {
{ &mp_const_type },
"Test",
.print = test_print,
- .make_new = NULL,
- .call_n = NULL,
- .unary_op = NULL,
- .binary_op = NULL,
- .getiter = NULL,
- .iternext = NULL,
- .methods = {
- { "get", &test_get_obj },
- { "set", &test_set_obj },
- { NULL, NULL },
- }
+ .methods = test_methods,
};
mp_obj_t test_obj_new(int value) {
@@ -212,6 +196,11 @@ mp_obj_t test_obj_new(int value) {
return o;
}
+int usage(void) {
+ printf("usage: py [-c <command>] [<filename>]\n");
+ return 1;
+}
+
int main(int argc, char **argv) {
qstr_init();
rt_init();
@@ -227,12 +216,24 @@ int main(int argc, char **argv) {
if (argc == 1) {
do_repl();
- } else if (argc == 2) {
- do_file(argv[1]);
} else {
- printf("usage: py [<file>]\n");
- return 1;
+ for (int a = 1; a < argc; a++) {
+ if (argv[a][0] == '-') {
+ if (strcmp(argv[a], "-c") == 0) {
+ if (a + 1 >= argc) {
+ return usage();
+ }
+ do_str(argv[a + 1]);
+ a += 1;
+ } else {
+ return usage();
+ }
+ } else {
+ do_file(argv[a]);
+ }
+ }
}
+
rt_deinit();
//printf("total bytes = %d\n", m_get_total_bytes_allocated());
diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h
index 7a4622b8b..832764121 100644
--- a/unix/mpconfigport.h
+++ b/unix/mpconfigport.h
@@ -5,11 +5,13 @@
#define MICROPY_USE_READLINE (1)
#endif
-#define MICROPY_ENABLE_FLOAT (1)
-#define MICROPY_EMIT_CPYTHON (0)
#define MICROPY_EMIT_X64 (1)
#define MICROPY_EMIT_THUMB (0)
#define MICROPY_EMIT_INLINE_THUMB (0)
+#define MICROPY_MEM_STATS (1)
+#define MICROPY_ENABLE_REPL_HELPERS (1)
+#define MICROPY_ENABLE_LEXER_UNIX (1)
+#define MICROPY_ENABLE_FLOAT (1)
// type definitions for the specific machine