569 lines
101 KiB
OpenSCAD
569 lines
101 KiB
OpenSCAD
// Generated by SolidPython <Unknown> on 2025-09-08 06:43:34
|
|
|
|
|
|
scale(v = 0.0000010000) {
|
|
translate(v = [-176162531, -72954546, 0]) {
|
|
difference() {
|
|
linear_extrude(convexity = 10, height = 2850000) {
|
|
polygon(points = [[131213899.2582568675, 51504136.1925114766], [131322961.1450932473, 51602983.4876628667], [131427033.4434460700, 51707053.7829912156], [131525874.5944232941, 51816104.6726151481], [131619246.5432596207, 51929873.5120421499], [131706924.4075352252, 52048086.2937974632], [131788697.0187926441, 52170458.3073561117], [131864367.4311287850, 52296694.8248580173], [131933753.3955310285, 52426491.8109482452], [131996687.7988158464, 52559536.6550326645], [132053019.0661133975, 52695508.9241863117], [132102611.5259304792, 52834081.1349053234], [132145345.7369083166, 52974919.5418341309], [132181118.7754931301, 53117684.9415800571], [132209844.4838224947, 53262033.4896680042], [132231453.6772334278, 53407617.5286776870], [132245894.3108902276, 53554086.4255596548], [132253131.6051326990, 53701087.4161216170], [132253148.1292413920, 53848266.4546466470], [132245943.8434186429, 53995269.0665961355], [132231536.0988845825, 54141741.2023476064], [132209959.5960872918, 54287330.0899088308], [132181266.3011285216, 54431685.0845522285], [132145525.3206049204, 54574458.5133318007], [132102822.7351685613, 54715306.5124343708], [132053261.3922043890, 54853889.8553650752], [131996960.6581275314, 54989874.7699568421], [131934056.1308933049, 55122933.7422496080], [131864699.3134158701, 55252746.3052921742], [131789057.2486802191, 55378999.8109728545], [131707312.1174248457, 55501390.1830215976], [131619660.7993682474, 55619622.6493629590], [131526314.3990321904, 55733412.4520627260], [131427497.7373047322, 55842485.5331561118], [131323448.8099688888, 55946579.1947044656], [131214409.1214805245, 56045450.9765909687], [131144127.0656185150, 56106104.2244711742], [131144108.6774217337, 56106120.4915215373], [130980510.8611069918, 56254466.1425165683], [130980492.8777911961, 56254482.8560757861], [130953885.3395007998, 56279827.5169951245], [130953850.6306188852, 56279862.2430811599], [130928519.1580728292, 56306482.3375511691], [130928502.4534272254, 56306500.3291470855], [130780237.8909005970, 56470171.6374789476], [130780221.6329644322, 56470190.0337345377], [130756227.2904007584, 56498021.3911554590], [130756196.1535789669, 56498059.3530556262], [130733596.7819408923, 56527034.8829472438], [130733581.9218227565, 56527054.4257105514], [130602079.3822011352, 56704474.1533214524], [130602065.0063161254, 56704494.0549957156], [130580915.0838191807, 56734543.9087273777], [130580887.8191112131, 56734584.7406172901], [130561238.3299171031, 56765636.4797864035], [130561225.4575277567, 56765657.3853909448], [130447752.1806984991, 56955115.8059417307], [130447739.8253995627, 56955137.0212498009], [130429638.1367162168, 56987115.7922980860], [130429615.0068616718, 56987159.1006963924], [130413104.7547553778, 57019987.8153588995], [130413093.9941411167, 57020009.8823453113], [130318743.4788517952, 57219681.2572004274], [130318733.2632022500, 57219703.5816984698], [130303854.2474116236, 57253303.1028273180], [130303835.4753040969, 57253348.4703874663], [130290623.5632968098, 57287637.8027235493], [130290615.0181535929, 57287660.8184406981], [130216296.4843825400, 57495620.9906144068], [130216288.5068267137, 57495644.2091697305], [130204775.5473372191, 57530540.6945905685], [130204761.3138763607, 57530587.6841226742], [130194975.0601314753, 57566007.2008976862], [130194968.8128055781, 57566030.9435518682], [130141398.4399561137, 57780275.8800737187], [130141392.7773706615, 57780299.7689379528], [130133356.8201874495, 57816156.9345130622], [130133347.2625357211, 57816205.0931968987], [130127080.9734529555, 57852413.4700194299], [130127077.0841474831, 57852437.7108117267], [130094771.1094986349, 58070902.8148307130], [130094767.8164517432, 58070927.1437959746], [130090286.3010333180, 58107399.4476787969], [130090281.5112941563, 58107448.3114274666], [130087595.5727148652, 58144096.6219602451], [130087594.0789095610, 58144121.1272913814], [130076863.8228337765, 58364701.1338128000], [130076862.9310592860, 58364725.6684301123], [130075092.9080227315, 58438291.0878120512], [130075092.6188165694, 58438315.6369274780], [130079560.3298669159, 67454047.5810131580], [130076018.2738393843, 67601261.9571875334], [130065255.6406022161, 67748112.7928943783], [130047298.0792614371, 67894258.3648860902], [130022188.8784497529, 68039346.3735452592], [129989988.5665958524, 68183027.0686249435], [129950774.7660140246, 68324954.0923593193], [129904642.0057877898, 68464785.3143943846], [129851701.4938959628, 68602183.6565344334], [129792080.8491359353, 68736817.9052991718], [129725923.7934830189, 68868363.5103545785], [129653389.8056340814, 68996503.3668738455], [129574653.7365666628, 69120928.5799535215], [129489905.3880423903, 69241339.2092369944], [129399349.0550684780, 69357444.9919544607], [129303203.0334239006, 69468966.0426308215], [129201699.0934326351, 69575633.5277812481], [129095081.9212570786, 69677190.3139625043], [128983608.5290567279, 69773391.5876197666], [128867547.6354295462, 69864005.4452389181], [128747179.0176410526, 69948813.4523713440], [128622792.8371881694, 70027611.1701961309], [128494688.9403345883, 70100208.6483410448], [128363176.1352994591, 70166430.8827781230], [128228571.4478412867, 70226118.2376902550], [128091199.3570343256, 70279126.8302897066], [127951391.0130755156, 70325328.8776638508], [127809483.4390121251, 70364613.0048092008], [127665818.7183119357, 70396884.5131127089], [127520743.1702328622, 70422065.6086333841], [127374606.5149843097, 70440095.5896326154], [127227761.0306886882, 70450930.9929023236], [127080548.4278419465, 70454546.0000000000], [123698499.0230739117, 70454546.0000000000], [123698474.3814669847, 70454546.3036504984], [123624632.4981852174, 70456366.4389982969], [123624607.8715431541, 70456367.3497653753], [123454185.5982018411, 70464773.9659038335], [123454161.1516830027, 70464775.4721206874], [123417600.8687483817, 70467477.8570905924], [123417552.1230143458, 70467482.6630683690], [123381168.0273284018, 70471972.0676938146], [123381143.7573558092, 70471975.3645716459], [123211224.0894753337, 70497180.5663088858], [123211199.8580610305, 70497184.4651764631], [123175005.6491716951, 70503464.7561804354], [123174957.5098202974, 70503474.3316927850], [123139115.0577137321, 70511523.0234656483], [123139091.1787739843, 70511528.6943424940], [122972533.3230496794, 70553249.2653188556], [122972509.5904721171, 70553255.5205062479], [122937105.2427556068, 70563053.2230444252], [122937058.2737726718, 70563067.4709296227], [122902177.3226209581, 70574590.5807094723], [122902154.1145079732, 70574598.5648248941], [122740487.6114431322, 70632443.7645664066], [122740464.6062599868, 70632452.3158327490], [122706191.0829394907, 70645673.0726735443], [122706145.7366620153, 70645691.8557166755], [122672562.2090925723, 70660578.4096571207], [122672539.8953131437, 70660588.6301196963], [122517321.6817092448, 70734001.3777311146], [122517299.6254730225, 70734012.1427230537], [122484486.9993135482, 70750528.6307510585], [122484443.7124509811, 70750551.7680611461], [122452481.0361926407, 70768658.4005100280], [122452459.8316406757, 70768670.7588911355], [122305184.7437452227, 70856944.0494816452], [122305163.8488695323, 70856956.9245263934], [122274128.1233988404, 70876610.0809327215], [122274087.3128273040, 70876637.3496848196], [122244053.3059247434, 70897789.6838737726], [122244033.4148116708, 70897804.0611554384], [122106119.7922300398, 71000087.7746814638], [122106100.2599439472, 71000102.6357853264], [122077140.3261636198, 71022703.1899305582], [122077102.3849112540, 71022734.3275116682], [122049286.2912697941, 71046728.6548990011], [122049267.9051578939, 71046744.9126201570], [121922043.9314666688, 71162054.0010065883], [121922025.9498767853, 71162070.7050489932], [121895420.7077802569, 71187401.0012420416], [121895386.0012420416, 71187435.7077802569], [121870055.7050489932, 71214040.9498767853], [121870039.0010065883, 71214058.9314666688], [121754729.9126201570, 71341282.9051578939], [121754713.6548990011, 71341301.2912697941], [121730719.3275116682, 71369117.3849112540], [121730688.1899305582, 71369155.3261636198], [121708087.6357853264, 71398115.2599439472], [121708072.7746814638, 71398134.7922300398], [121605789.0611554682, 71536048.4148116410], [121605774.6838738024, 71536068.3059247136], [121584622.3496848792, 71566102.3128272295], [121584595.0809327811, 71566143.1233987659], [121564941.9245263189, 71597178.8488696814], [121564929.0494815707, 71597199.7437453717], [121476655.7588908672, 71744474.8316411823], [121476643.4005097598, 71744496.0361931473], [121458536.7680610716, 71776458.7124511451], [121458513.6307509840, 71776501.9993137121], [121441997.1427231133, 71809314.6254729033], [121441986.3777311742, 71809336.6817091256], [121368573.6301198602, 71964554.8953128010], [121368563.4096572846, 71964577.2090922296], [121353676.8557166308, 71998160.7366621345], [121353658.0726734996, 71998206.0829396099], [121340437.3158328682, 72032479.6062596738], [121340428.7645665258, 72032502.6114428192], [121282583.5648248941, 72194169.1145079732], [121282575.5807094723, 72194192.3226209581], [121271052.4709296227, 72229073.2737726718], [121271038.2230444252, 72229120.2427556068], [121261240.5205062479, 72264524.5904721171], [121261234.2653188556, 72264548.3230496794], [121219513.6943424940, 72431106.1787739843], [121219508.0234656483, 72431130.0577137321], [121211459.3316927850, 72466972.5098202974], [121211449.7561804354, 72467020.6491716951], [121205169.4651764631, 72503214.8580610305], [121205165.5663088858, 72503239.0894753337], [121179971.4160025567, 72673084.2546603382], [121179968.1129779220, 72673108.5744595975], [121175471.3525138348, 72709567.3451128900], [121175466.5415917486, 72709616.1912244856], [121172764.1447573453, 72746251.6912700534], [121172762.6397578269, 72746276.1881593317], [121164337.5435617268, 72917772.9610165507], [121164336.6401992291, 72917797.4874623567], [121163435.1173052192, 72954521.4587714970], [121163435.1173052192, 72954570.5412285328], [121164336.6401992291, 72991294.5125376433], [121164337.5435617268, 72991319.0389834493], [121172762.6397578269, 73162815.8118406087], [121172764.1447573453, 73162840.3087298870], [121175466.5415917486, 73199475.8087754250], [121175471.3525138348, 73199524.6548870206], [121179968.1129779518, 73235983.4255405962], [121179971.4160025865, 73236007.7453398556], [121205165.5663088709, 73405852.9105245769], [121205169.4651764482, 73405877.1419388801], [121211449.7561804354, 73442071.3508282900], [121211459.3316927850, 73442119.4901796877], [121219508.0234656781, 73477961.9422863573], [121219513.6943425238, 73477985.8212261051], [121261234.2653188556, 73644543.6769503206], [121261240.5205062479, 73644567.4095278829], [121271038.2230444252, 73679971.7572443932], [121271052.4709296227, 73680018.7262273282], [121282575.5807094723, 73714899.6773790419], [121282583.5648248941, 73714922.8854920268], [121340428.7645664066, 73876589.3885568678], [121340437.3158327490, 73876612.3937400132], [121353658.0726735443, 73910885.9170605093], [121353676.8557166755, 73910931.2633379847], [121368563.4096571207, 73944514.7909074277], [121368573.6301196963, 73944537.1046868563], [121441986.3777311146, 74099755.3182907552], [121441997.1427230537, 74099777.3745269775], [121458513.6307510585, 74132590.0006864518], [121458536.7680611461, 74132633.2875490189], [121476643.4005100280, 74164595.9638073593], [121476655.7588911355, 74164617.1683593243], [121564929.0494816452, 74311892.2562547773], [121564941.9245263934, 74311913.1511304677], [121584595.0809327215, 74342948.8766011596], [121584622.3496848196, 74342989.6871726960], [121605774.6838737726, 74373023.6940752566], [121605789.0611554384, 74373043.5851883292], [121708072.7746814638, 74510957.2077699602], [121708087.6357853264, 74510976.7400560528], [121730688.1899305582, 74539936.6738363802], [121730719.3275116682, 74539974.6150887460], [121754713.6548990011, 74567790.7087302059], [121754729.9126201570, 74567809.0948421061], [121870039.0010065883, 74695033.0685333312], [121870055.7050489932, 74695051.0501232147], [121895386.0012420416, 74721656.2922197431], [121895420.7077802569, 74721690.9987579584], [121922025.9498767853, 74747021.2949510068], [121922043.9314666688, 74747037.9989934117], [122049267.9051578939, 74862347.0873798430], [122049286.2912697941, 74862363.3451009989], [122077102.3849112540, 74886357.6724883318], [122077140.3261636198, 74886388.8100694418], [122106100.2599439472, 74908989.3642146736], [122106119.7922300398, 74909004.2253185362], [122244033.4148116410, 75011287.9388445318], [122244053.3059247136, 75011302.3161261976], [122274087.3128272295, 75032454.6503151208], [122274128.1233987659, 75032481.9190672189], [122305163.8488696814, 75052135.0754736811], [122305184.7437453717, 75052147.9505184293], [122452459.8316411823, 75140421.2411091328], [122452481.0361931473, 75140433.5994902402], [122484443.7124511451, 75158540.2319389284], [122484486.9993137121, 75158563.3692490160], [122517299.6254729033, 75175079.8572768867], [122517321.6817091256, 75175090.6222688258], [122672539.8953128010, 75248503.3698801398], [122672562.2090922296, 75248513.5903427154], [122706145.7366621345, 75263400.1442833692], [122706191.0829396099, 75263418.9273265004], [122740464.6062596738, 75276639.6841671318], [122740487.6114428192, 75276648.2354334742], [122902154.1145079732, 75334493.4351751059], [122902177.3226209581, 75334501.4192905277], [122937058.2737726718, 75346024.5290703773], [122937105.2427556068, 75346038.7769555748], [122972509.5904721171, 75355836.4794937521], [122972533.3230496794, 75355842.7346811444], [123139091.1787738949, 75397563.3056574762], [123139115.0577136427, 75397568.9765343219], [123174957.5098203123, 75405617.6683072150], [123175005.6491717100, 75405627.2438195646], [123211199.8580611199, 75411907.5348235518], [123211224.0894754231, 75411911.4336911291], [123381143.7573557347, 75437116.6354283392], [123381168.0273283273, 75437119.9323061705], [123417552.1230143458, 75441609.3369316310], [123417600.8687483817, 75441614.1429094076], [123454161.1516831219, 75444316.5278793275], [123454185.5982019603, 75444318.0340961814], [123624607.8715431690, 75452724.6502346247], [123624632.4981852323, 75452725.5610017031], [123698474.3814669847, 75454545.6963495016], [123698499.0230739117, 75454546.0000000000], [127085998.4518949538, 75454546.0000000000], [127233118.2749885023, 75458156.4491203874], [127379871.6580326408, 75468978.2015584111], [127525917.5508508980, 75486985.5042897910], [127670904.3380072415, 75512135.0035065114], [127814482.9539341927, 75544366.1500758529], [127956307.7233334929, 75583601.3453168869], [128096037.1934111267, 75629746.1278242469], [128233334.9559483230, 75682689.4008902609], [128367870.4572293460, 75742303.6999786198], [128499319.7938697338, 75808445.4996030778], [128627366.4926367104, 75880955.5588752627], [128751702.2723797262, 75959659.3048876673], [128872027.7862394601, 76044367.2530105412], [128988053.3423438072, 76134875.4630878568], [129099499.6012626141, 76230966.0304382741], [129206098.2485355735, 76332407.6104750335], [129307592.6406571269, 76438955.9756832570], [129403738.4229647964, 76550354.6036159992], [129494304.1179370135, 76666335.2944866866], [129579071.6824942380, 76786618.8168819249], [129657837.0329498053, 76910915.5800269693], [129730410.5363569707, 77038926.3309974819], [129796617.4670619220, 77170342.8751891553], [129856298.4273692816, 77304848.8183204681], [129909309.7313009202, 77442120.3281691521], [129955523.7505316585, 77581826.9142245650], [129994829.2216619104, 77723632.2233635634], [130027131.5140921772, 77867194.8496436477], [130052352.8578530699, 78012169.1562628001], [130070432.5308411866, 78158206.1077011973], [130081327.0050121844, 78304954.1100495905], [130085010.3583389223, 78452072.1259352416], [130100069.1327647269, 108840311.6740783453], [130100069.4457999915, 108840336.2028812915], [130101909.4044844806, 108913839.9126072973], [130101910.3190914840, 108913864.4263516068], [130112841.4423322529, 109134254.4667775333], [130112842.9579605907, 109134278.9507117718], [130115560.8018863648, 109170894.9135504812], [130115565.6321977675, 109170943.7330818027], [130120075.9677780718, 109207382.3428691030], [130120079.2795544565, 109207406.6490885317], [130152549.0496147275, 109425665.6085987538], [130152552.9566008300, 109425689.8262705058], [130158844.9289075881, 109461863.3869842291], [130158854.5187479109, 109461911.4984538555], [130166912.9850264490, 109497732.9519623071], [130166918.6621098816, 109497756.8168086112], [130220614.6898618490, 109711784.8429595828], [130220620.9506168962, 109711808.5613725036], [130230426.5167293102, 109747191.6969519854], [130230440.7738354355, 109747238.6374832094], [130241969.8409361839, 109782098.2993006557], [130241977.8287078887, 109782121.4931720197], [130316383.5088519305, 109989859.4389989376], [130316392.0631417036, 109989882.4299600273], [130329616.8844724894, 110024134.7220154554], [130329635.6716779023, 110024180.0399971008], [130344524.4193441421, 110057742.5280321687], [130344534.6409543902, 110057764.8277821541], [130438934.1222399771, 110257214.0626961589], [130438944.8877643049, 110257236.1050111800], [130455461.7293371111, 110290028.0149076432], [130455484.8658915758, 110290071.2743389159], [130473590.0506427586, 110322013.6865108162], [130473602.4077502340, 110322034.8775952607], [130587087.4801218510, 110511276.5160447359], [130587100.3533064872, 110511297.3976462930], [130606750.3078761995, 110542313.4369752109], [130606777.5711847246, 110542354.2216604948], [130627925.0044485331, 110572369.2425095141], [130627939.3781664670, 110572389.1210506707], [130759418.2105860859, 110749602.4839786440], [130759433.0675790906, 110749622.0039664507], [130782027.0844628364, 110778563.7698286176], [130782058.2122272700, 110778601.6873816550], [130806044.4361963123, 110806400.5447313190], [130806060.6882362813, 110806418.9194792807], [130954268.3331004381, 110969899.0509273410], [130954285.0309638679, 110969917.0215011388], [130979605.7348868251, 110996506.0674237609], [130979640.4276293665, 110996540.7530427128], [131006234.6727111042, 111021855.9962517023], [131006252.6467134953, 111021872.6904244274], [131169763.2098190635, 111170046.7607859820], [131169781.5879040509, 111170063.0090522766], [131197585.3703458309, 111194043.5238952786], [131197623.2942903042, 111194074.6438725144], [131226569.6993257999, 111216662.7169592232], [131226589.2223641425, 111216677.5699434131], [131403829.5813222378, 111348120.0080315471], [131403849.4628146887, 111348134.3776670247], [131433868.8257513940, 111369275.6467660815], [131433909.6160344630, 111369302.9016987234], [131464929.6899157166, 111388946.4865714312], [131464950.5741603971, 111388959.3554676473], [131654215.5132878572, 111502405.5638274997], [131654236.7069094479, 111502417.9165830314], [131686182.8363888562, 111520516.5414350331], [131686226.1005704105, 111520539.6691055000], [131719021.4015830606, 111537049.7763644308], [131719043.4461083710, 111537060.5373620391], [131918512.0621727556, 111631419.0588622689], [131918534.3640213162, 111631429.2758929580], [131952099.9088204950, 111646311.1310382038], [131952145.2306592166, 111646329.9089369625], [131986400.2377684712, 111659547.6961270720], [131986423.2304857373, 111659556.2456953675], [132194176.4514725208, 111733919.2643521279], [132194199.6469837278, 111733927.2473607063], [132229061.6756117493, 111745449.1556305438], [132229108.6190697402, 111745463.4030969143], [132264493.7675201297, 111755261.7029170543], [132264517.4872182310, 111755267.9588012844], [132478556.5355764776, 111808920.0338064581], [132478580.4015880972, 111808925.7059890181], [132514403.5091835558, 111816976.8160016090], [132514451.6226214767, 111816986.3959618211], [132550626.4746574163, 111823270.9397331029], [132550650.6931309700, 111823274.8417459130], [132768916.3158517927, 111855699.7906657457], [132768940.6227508038, 111855703.0974506736], [132805380.1579868495, 111860205.9501039386], [132805428.9785090685, 111860210.7703899443], [132842045.4986975938, 111862921.0950063318], [132842069.9829425663, 111862922.6056067497], [133062462.2634769678, 111873808.4705342650], [133062486.7774085701, 111873809.3801072240], [133135990.8634276539, 111875634.2444365919], [133136015.3922943622, 111875634.5524347574], [170664389.0144088566, 111886524.9716200531], [170811527.0073052347, 111890179.0632814020], [170958296.3264447451, 111901046.2351506054], [171104355.7923935652, 111919100.6216504574], [171249353.6650770903, 111944298.7442483902], [171392940.7609463930, 111976579.9208825231], [171534771.2938836515, 112015866.4120966643], [171674503.7079207897, 112062063.6082517654], [171811801.4997745156, 112115060.2573645264], [171946334.0292143822, 112174728.7330249399], [172077777.3153082132, 112240925.3417453021], [172205814.8166320622, 112313490.6690024287], [172330138.1935656071, 112392249.9631396979], [172450448.0508341491, 112477013.5562034249], [172566454.6585129499, 112567577.3207015246], [172677878.6497519016, 112663723.1611812711], [172784451.6935477853, 112765219.5394474119], [172885917.1409391165, 112871822.0321529061], [172982030.6430640817, 112983273.9194149673], [173072560.7396058142, 113099306.8030525595], [173157289.4161913395, 113219641.2529387921], [173236012.6294127107, 113343987.4799227118], [173308540.7982073426, 113472046.0337039381], [173374699.2604027689, 113603508.5239621699], [173434328.6933412254, 113738058.3630281985], [173487285.4975569844, 113875371.5282836258], [173533442.1425942779, 114015117.3424751908], [173572687.4741251171, 114156959.2700499892], [173604926.9816312790, 114300555.7276001126], [173630083.0260037482, 114445560.9064616859], [173648095.0265135765, 114591625.6054920703], [173658919.6067018807, 114738398.0720137060], [173662531.0000000000, 114885537.1191011965], [173662531.0000000000, 125418577.9769262373], [173662531.3036504984, 125418602.6185331643], [173664351.4389982820, 125492444.5018143207], [173664352.3497653604, 125492469.1284563839], [173672758.9659038186, 125662891.4017978758], [173672760.4721206725, 125662915.8483167142], [173675462.8570906222, 125699476.1312516332], [173675467.6630683839, 125699524.8769856691], [173679957.0676938593, 125735908.9726718068], [173679960.3645716906, 125735933.2426443994], [173705165.5663088858, 125905852.9105247408], [173705169.4651764631, 125905877.1419390440], [173711449.7561804354, 125942071.3508284241], [173711459.3316927850, 125942119.4901798218], [173719508.0234656632, 125977961.9422863722], [173719513.6943425238, 125977985.8212261200], [173761234.2653188705, 126144543.6769503355], [173761240.5205062628, 126144567.4095278978], [173771038.2230444551, 126179971.7572444677], [173771052.4709296525, 126180018.7262274027], [173782575.5807096362, 126214899.6773795038], [173782583.5648250580, 126214922.8854924887], [173840428.7645662725, 126376589.3885565102], [173840437.3158326149, 126376612.3937396556], [173853658.0726736188, 126410885.9170606583], [173853676.8557167649, 126410931.2633381337], [173868563.4096572995, 126444514.7909077853], [173868573.6301198602, 126444537.1046872139], [173941986.3777306974, 126599755.3182898760], [173941997.1427226365, 126599777.3745260984], [173958513.6307509840, 126632590.0006862283], [173958536.7680610716, 126632633.2875487953], [173976643.4005101323, 126664595.9638074636], [173976655.7588912249, 126664617.1683594286], [174064929.0494818389, 126811892.2562550604], [174064941.9245266020, 126811913.1511307508], [174084595.0809327066, 126842948.8766010851], [174084622.3496848047, 126842989.6871726215], [174105774.6838739216, 126873023.6940754205], [174105789.0611555874, 126873043.5851884931], [174208072.7746814787, 127010957.2077700049], [174208087.6357853413, 127010976.7400560975], [174230688.1899304986, 127039936.6738362759], [174230719.3275116086, 127039974.6150886416], [174254713.6548990607, 127067790.7087302655], [174254729.9126202166, 127067809.0948421657], [174370039.0010069609, 127195033.0685337633], [174370055.7050493658, 127195051.0501236469], [174395386.0012417734, 127221656.2922194898], [174395420.7077799737, 127221690.9987577051], [174422025.9498772323, 127247021.2949514389], [174422043.9314671457, 127247037.9989938438], [174549267.9051579535, 127362347.0873798728], [174549286.2912698388, 127362363.3451010287], [174577102.3849112988, 127386357.6724883765], [174577140.3261636794, 127386388.8100694865], [174606100.2599435449, 127408989.3642143458], [174606119.7922296226, 127409004.2253182083], [174744033.4148117304, 127511287.9388445914], [174744053.3059248030, 127511302.3161262572], [174774087.3128271997, 127532454.6503151059], [174774128.1233987212, 127532481.9190672040], [174805163.8488696814, 127552135.0754736960], [174805184.7437453866, 127552147.9505184442], [174952459.8316406608, 127640421.2411088347], [174952481.0361926258, 127640433.5994899422], [174984443.7124511003, 127658540.2319388986], [174984486.9993136823, 127658563.3692489862], [175017299.6254730225, 127675079.8572769314], [175017321.6817092299, 127675090.6222688705], [175172539.8953126371, 127748503.3698800802], [175172562.2090920806, 127748513.5903426558], [175206145.7366621494, 127763400.1442833692], [175206191.0829395950, 127763418.9273265004], [175240464.6062606275, 127776639.6841675043], [175240487.6114437878, 127776648.2354338467], [175402154.1145076454, 127834493.4351750016], [175402177.3226206303, 127834501.4192904234], [175437058.2737725079, 127846024.5290703326], [175437105.2427554429, 127846038.7769555300], [175472509.5904714465, 127855836.4794935584], [175472533.3230490088, 127855842.7346809506], [175639091.1787742078, 127897563.3056575507], [175639115.0577139556, 127897568.9765343964], [175674957.5098204613, 127905617.6683072448], [175675005.6491718590, 127905627.2438195944], [175711199.8580611050, 127911907.5348235518], [175711224.0894754231, 127911911.4336911291], [175881069.2546600401, 127937105.5839973986], [175881093.5744592845, 127937108.8870220333], [175917552.3451130986, 127941605.6474861801], [175917601.1912246943, 127941610.4584082663], [175954236.6912699938, 127944312.8552426547], [175954261.1881592572, 127944314.3602421731], [176125757.9610165358, 127952739.4564382732], [176125782.4874623418, 127952740.3598007709], [176162506.4587714672, 127953641.8826947808], [176162555.5412285328, 127953641.8826947808], [176199279.5125376582, 127952740.3598007709], [176199304.0389834642, 127952739.4564382732], [176370800.8118407428, 127944314.3602421731], [176370825.3087300062, 127944312.8552426547], [176407460.8087753057, 127941610.4584082663], [176407509.6548869014, 127941605.6474861801], [176443968.4255407155, 127937108.8870220333], [176443992.7453399599, 127937105.5839973986], [176613837.9105245769, 127911911.4336911291], [176613862.1419388950, 127911907.5348235518], [176650056.3508281410, 127905627.2438195944], [176650104.4901795387, 127905617.6683072448], [176685946.9422860444, 127897568.9765343964], [176685970.8212257922, 127897563.3056575507], [176852528.6769509912, 127855842.7346809506], [176852552.4095285535, 127855836.4794935584], [176887956.7572445571, 127846038.7769555300], [176888003.7262274921, 127846024.5290703326], [176922884.6773793697, 127834501.4192904234], [176922907.8854923546, 127834493.4351750016], [177084574.3885564208, 127776648.2354337722], [177084597.3937395811, 127776639.6841674298], [177118870.9170604050, 127763418.9273265153], [177118916.2633378506, 127763400.1442833841], [177152499.7909073532, 127748513.5903429091], [177152522.1046867967, 127748503.3698803335], [177307740.3182908297, 127675090.6222688407], [177307762.3745270371, 127675079.8572769016], [177340575.0006861687, 127658563.3692490757], [177340618.2875487506, 127658540.2319389880], [177372580.9638076723, 127640433.5994897783], [177372602.1683596373, 127640421.2411086708], [177519877.2562550902, 127552147.9505181462], [177519898.1511307955, 127552135.0754733980], [177550933.8766010404, 127532481.9190673530], [177550974.6871725619, 127532454.6503152549], [177581008.6940754652, 127511302.3161260784], [177581028.5851885378, 127511287.9388444126], [177718942.2077703774, 127409004.2253182083], [177718961.7400564551, 127408989.3642143458], [177747921.6738363206, 127386388.8100694865], [177747959.6150887012, 127386357.6724883765], [177775775.7087301612, 127362363.3451010287], [177775794.0948420465, 127362347.0873798728], [177903018.0685328543, 127247037.9989938438], [177903036.0501227677, 127247021.2949514389], [177929641.2922200263, 127221690.9987577051], [177929675.9987582266, 127221656.2922194898], [177955006.2949506342, 127195051.0501236469], [177955022.9989930391, 127195033.0685337633], [178070332.0873802602, 127067809.0948416293], [178070348.3451014161, 127067790.7087297291], [178094342.6724881828, 127039974.6150889397], [178094373.8100692928, 127039936.6738365740], [178116974.3642146587, 127010976.7400560975], [178116989.2253185213, 127010957.2077700049], [178219272.9388444126, 126873043.5851884931], [178219287.3161260784, 126873023.6940754205], [178240439.6503151953, 126842989.6871726215], [178240466.9190672934, 126842948.8766010851], [178260120.0754733980, 126811913.1511307508], [178260132.9505181611, 126811892.2562550604], [178348406.2411087751, 126664617.1683594286], [178348418.5994898677, 126664595.9638074636], [178366525.2319389284, 126632633.2875487953], [178366548.3692490160, 126632590.0006862283], [178383064.8572773635, 126599777.3745260984], [178383075.6222693026, 126599755.3182898760], [178456488.3698801398, 126444537.1046872139], [178456498.5903427005, 126444514.7909077853], [178471385.1442832351, 126410931.2633381337], [178471403.9273263812, 126410885.9170606583], [178484624.6841673851, 126376612.3937396556], [178484633.2354337275, 126376589.3885565102], [178542478.4351749122, 126214922.8854926229], [178542486.4192903340, 126214899.6773796380], [178554009.5290703177, 126180018.7262274921], [178554023.7769555151, 126179971.7572445571], [178563821.4794938266, 126144567.4095275849], [178563827.7346812189, 126144543.6769500226], [178605548.3056574762, 125977985.8212261200], [178605553.9765343368, 125977961.9422863722], [178613602.6683072150, 125942119.4901798218], [178613612.2438195646, 125942071.3508284241], [178619892.5348235369, 125905877.1419390440], [178619896.4336911142, 125905852.9105247408], [178645101.6354283094, 125735933.2426445186], [178645104.9323061407, 125735908.9726719260], [178649594.3369316459, 125699524.8769855499], [178649599.1429094076, 125699476.1312515140], [178652301.5278792977, 125662915.8483168036], [178652303.0340961516, 125662891.4017979652], [178660709.6502346396, 125492469.1284563839], [178660710.5610017180, 125492444.5018143207], [178662530.6963495016, 125418602.6185331643], [178662531.0000000000, 125418577.9769262373], [178662531.0000000000, 114888728.6509692222], [178666145.0624478757, 114741535.2720941901], [178676977.6365582049, 114594708.8711131066], [178695002.9174531102, 114448591.0216381699], [178720177.4646093249, 114303533.8644135296], [178752440.6079317927, 114159886.9839406759], [178791714.5939677060, 114017996.5659848452], [178837904.7732894123, 113878204.5632783175], [178890899.8285996020, 113740847.8714156747], [178950572.0430009067, 113606257.5169507563], [179016777.6077930927, 113474757.8596231937], [179089356.9690469503, 113346665.8106637448], [179168135.2121271491, 113222290.0690420568], [179252922.4832310677, 113101930.3775116652], [179343514.4469343126, 112985876.8002333939], [179439692.7786322832, 112874409.0237306654], [179541225.6906988919, 112767795.6828491986], [179647868.4910894334, 112666293.7133534551], [179759364.1730423570, 112570147.7327175140], [179875444.0344610214, 112479589.4506016672], [179995828.3254775107, 112394837.1104389280], [180120226.9226462245, 112316094.9634712040], [180248340.0281333327, 112243552.7765096277], [180379858.8922225237, 112177385.3746009022], [180514466.5573959947, 112117752.2197021246], [180651838.6221945286, 112064797.0263814330], [180791644.0230174363, 112018647.4154691547], [180933545.8319794536, 111979414.6064941734], [181077202.0688969195, 111947193.1496480256], [181222266.5254563093, 111922060.6979200393], [181368389.5995641351, 111904077.8199563771], [181515219.1378842890, 111893287.8540902138], [181662413.5593328774, 111889716.5060763806], [219212358.9162607789, 111900613.1851981431], [219212383.4676534235, 111900612.8908939958], [219285955.5192414522, 111898827.4190122485], [219285980.0560080409, 111898826.5220280439], [219506578.7843860686, 111888048.9127251655], [219506603.2917344272, 111888047.4136016816], [219543254.5146919489, 111885353.4360980690], [219543303.3820629418, 111885348.6354106963], [219579778.1792923808, 111880858.7772638798], [219579802.5098549128, 111880855.4785941243], [219798281.3000677824, 111848498.5001909435], [219798305.5423097312, 111848494.6051684171], [219834515.9706468880, 111842219.6917252839], [219834564.1317726672, 111842210.1223725677], [219870422.8854651451, 111834165.2828670442], [219870446.7753146291, 111834159.6143058240], [220084699.8298249245, 111780535.1380158812], [220084723.5733027458, 111780528.8846363127], [220120144.1945099533, 111770733.5157116205], [220120191.1851917505, 111770719.2699273229], [220155088.2724387348, 111759196.9888697863], [220155111.4913140237, 111759189.0050532371], [220363073.7421383560, 111684813.8878677487], [220363096.7580016553, 111684805.3364040405], [220397386.1720883250, 111671583.9242001921], [220397431.5394086838, 111671565.1392916292], [220431030.6062761843, 111656676.4736460298], [220431052.9303831756, 111656666.2515258044], [220630719.9431536496, 111562257.3545117229], [220630742.0095651448, 111562246.5873867571], [220663569.7196281552, 111545726.5658626556], [220663613.0263162851, 111545703.4228872955], [220695590.2297793925, 111527591.8763569295], [220695611.4439482689, 111527579.5144584477], [220885058.7375596166, 111414046.7933262885], [220885079.6418331861, 111414033.9143184870], [220916129.2395324707, 111394374.5109248906], [220916170.0681789219, 111394347.2329452038], [220946217.1974679232, 111373187.3728183359], [220946237.0972269177, 111373172.9902911782], [221123638.6928547323, 111241610.7248308659], [221123658.2335055470, 111241595.8580739498], [221152630.4487553537, 111218986.5590451360], [221152668.4058350921, 111218955.4089786410], [221180495.8531074524, 111194951.1835719049], [221180514.2466536760, 111194934.9190413803], [221344160.2673668563, 111046611.1659574062], [221344178.2560532689, 111046594.4547439069], [221370793.8415213525, 111021253.1787437201], [221370828.5611868799, 111021218.4568288773], [221396168.1129017770, 110994601.2297391295], [221396184.8229498863, 110994583.2399701625], [221544497.9742791951, 110830927.6107763499], [221544514.2376181185, 110830909.2161764950], [221568516.6602355540, 110803080.2139018476], [221568547.8078429997, 110803042.2548041940], [221591155.2299241722, 110774068.5749216825], [221591170.0954151750, 110774049.0333078057], [221722720.8680318594, 110596638.9150836766], [221722735.2492698133, 110596619.0143929720], [221743893.1628155112, 110566570.5143730938], [221743920.4381501377, 110566529.6839596033], [221763577.8300231397, 110535478.8127351552], [221763590.7076766789, 110535457.9076272845], [221877111.1556500196, 110346003.2594475895], [221877123.5161741674, 110345982.0444779098], [221895232.9910942614, 110314003.6677662581], [221895256.1312640607, 110313960.3595789522], [221911774.0260831416, 110281131.5793723911], [221911784.7917785645, 110281109.5122634470], [222006180.7536118925, 110081436.3838408142], [222006190.9742858708, 110081414.0590716302], [222021077.4632590711, 110047814.0277464241], [222021096.2452285588, 110047768.6592092365], [222034315.4360416830, 110013478.3886737078], [222034323.9860143661, 110013455.3722564429], [222108685.6306719482, 109805488.3036427498], [222108693.6129842699, 109805465.0842503160], [222120213.6332874596, 109770567.2506313473], [222120227.8760275543, 109770520.2590267807], [222130020.9502856433, 109735099.0033224374], [222130027.2021270394, 109735075.2594395429], [222183637.7983969152, 109520818.7314373702], [222183643.4654104710, 109520794.8412206918], [222191685.9818698168, 109484935.5664353371], [222191695.5481024981, 109484887.4046897590], [222197968.1157202721, 109448676.5699231625], [222197972.0091723204, 109448652.3274289221], [222230314.8338456154, 109230171.4414984584], [222230318.1309391558, 109230147.1107222736], [222234805.6261378527, 109193672.0227048695], [222234810.4236594439, 109193623.1550229937], [222237502.0267894566, 109156971.7576194704], [222237503.5243252814, 109156947.2501740307], [222248266.8426079154, 108936347.8240547329], [222248267.7380025685, 108936323.2872300744], [222250048.4436789751, 108862751.1201285571], [222250048.7363926172, 108862726.5687168986], [222239254.6382633150, 78454622.8433696479], [222242816.7464473546, 78307422.1262134016], [222253598.0905984938, 78160585.8687014431], [222271572.9828273356, 78014455.6967601627], [222296698.1004740596, 77869383.8098717630], [222328912.8875749707, 77725719.8568632901], [222368139.7008130252, 77583810.0931921452], [222414283.9966518879, 77443996.5464104116], [222467234.5592020154, 77306616.1918189377], [222526863.7682712972, 77172000.1402954459], [222593027.9069520533, 77040472.8402596414], [222665567.5080035925, 76912351.2956962436], [222744307.7381974757, 76787944.3021177649], [222829058.8196941614, 76667551.7023160458], [222919616.4874449074, 76551463.6636828780], [223015762.4815022647, 76439959.9788613915], [223117265.0730681121, 76333309.3913922608], [223223879.6229993999, 76231768.9479964226], [223335349.1714319587, 76135583.3790465444], [223451405.0570999980, 76044984.5087230504], [223571767.5648555756, 75960190.6962782294], [223696146.5998318195, 75881406.3097515404], [223824242.3866239488, 75808821.2334056944], [223955746.1917999089, 75742610.4100729823], [224090341.0680013597, 75682933.4195124805], [224227702.6178444624, 75629934.0937937945], [224367499.7757751346, 75583740.1706365645], [224509395.6059923470, 75544462.9855409861], [224653048.1145262718, 75512197.2034484595], [224798111.0735012591, 75487020.5905832201], [224944234.8556096852, 75468993.8270212263], [225091067.2767700851, 75458160.3604413867], [225238266.7201946676, 75454546.0000000000], [228626562.9769260883, 75454546.0000000000], [228626587.6185330153, 75454545.6963495016], [228700429.5018147826, 75452725.5610017031], [228700454.1284568310, 75452724.6502346247], [228870876.4017979503, 75444318.0340961814], [228870900.8483168185, 75444316.5278793275], [228907461.1312516928, 75441614.1429094076], [228907509.8769857287, 75441609.3369316310], [228943893.9726716280, 75437119.9323061854], [228943918.2426441908, 75437116.6354283541], [229113837.9105245769, 75411911.4336911291], [229113862.1419388950, 75411907.5348235518], [229150056.3508281410, 75405627.2438195944], [229150104.4901795387, 75405617.6683072448], [229185946.9422860444, 75397568.9765343964], [229185970.8212257922, 75397563.3056575507], [229352528.6769509912, 75355842.7346809506], [229352552.4095285535, 75355836.4794935584], [229387956.7572445571, 75346038.7769555300], [229388003.7262274921, 75346024.5290703326], [229422884.6773793697, 75334501.4192904234], [229422907.8854923546, 75334493.4351750016], [229584574.3885564208, 75276648.2354337722], [229584597.3937395811, 75276639.6841674298], [229618870.9170604050, 75263418.9273265153], [229618916.2633378506, 75263400.1442833841], [229652499.7909073532, 75248513.5903429091], [229652522.1046867967, 75248503.3698803335], [229807740.3182908297, 75175090.6222688407], [229807762.3745270371, 75175079.8572769016], [229840575.0006861687, 75158563.3692490757], [229840618.2875487506, 75158540.2319389880], [229872580.9638076723, 75140433.5994897783], [229872602.1683596373, 75140421.2411086708], [230019877.2562550902, 75052147.9505181462], [230019898.1511307955, 75052135.0754733980], [230050933.8766010404, 75032481.9190673530], [230050974.6871725619, 75032454.6503152549], [230081008.6940754652, 75011302.3161260784], [230081028.5851885378, 75011287.9388444126], [230218942.2077703774, 74909004.2253182083], [230218961.7400564551, 74908989.3642143458], [230247921.6738363206, 74886388.8100694865], [230247959.6150887012, 74886357.6724883765], [230275775.7087301612, 74862363.3451010287], [230275794.0948420465, 74862347.0873798728], [230403018.0685328543, 74747037.9989938438], [230403036.0501227677, 74747021.2949514389], [230429641.2922200263, 74721690.9987577051], [230429675.9987582266, 74721656.2922194898], [230455006.2949506342, 74695051.0501236469], [230455022.9989930391, 74695033.0685337633], [230570332.0873802602, 74567809.0948416293], [230570348.3451014161, 74567790.7087297291], [230594342.6724881828, 74539974.6150889397], [230594373.8100692928, 74539936.6738365740], [230616974.3642146587, 74510976.7400560975], [230616989.2253185213, 74510957.2077700049], [230719272.9388444126, 74373043.5851884931], [230719287.3161260784, 74373023.6940754205], [230740439.6503151953, 74342989.6871726215], [230740466.9190672934, 74342948.8766010851], [230760120.0754733980, 74311913.1511307508], [230760132.9505181611, 74311892.2562550604], [230848406.2411087751, 74164617.1683594286], [230848418.5994898677, 74164595.9638074636], [230866525.2319389284, 74132633.2875487953], [230866548.3692490160, 74132590.0006862283], [230883064.8572773635, 74099777.3745260984], [230883075.6222693026, 74099755.3182898760], [230956488.3698801398, 73944537.1046872139], [230956498.5903427005, 73944514.7909077853], [230971385.1442832351, 73910931.2633381337], [230971403.9273263812, 73910885.9170606583], [230984624.6841673851, 73876612.3937396556], [230984633.2354337275, 73876589.3885565102], [231042478.4351749122, 73714922.8854926229], [231042486.4192903340, 73714899.6773796380], [231054009.5290703177, 73680018.7262274921], [231054023.7769555151, 73679971.7572445571], [231063821.4794938266, 73644567.4095275849], [231063827.7346812189, 73644543.6769500226], [231105548.3056574762, 73477985.8212261200], [231105553.9765343368, 73477961.9422863722], [231113602.6683072150, 73442119.4901798218], [231113612.2438195646, 73442071.3508284241], [231119892.5348235369, 73405877.1419390440], [231119896.4336911142, 73405852.9105247408], [231145090.5839974880, 73236007.7453393936], [231145093.8870221078, 73235983.4255401343], [231149590.6474862099, 73199524.6548867226], [231149595.4584082961, 73199475.8087751269], [231152297.8552426696, 73162840.3087298870], [231152299.3602421880, 73162815.8118406087], [231160724.4564383030, 72991319.0389834493], [231160725.3598007858, 72991294.5125376433], [231161626.8826947808, 72954570.5412285179], [231161626.8826947808, 72954521.4587714821], [231160725.3598007858, 72917797.4874623567], [231160724.4564383030, 72917772.9610165507], [231152299.3602421880, 72746276.1881593913], [231152297.8552426696, 72746251.6912701130], [231149595.4584082961, 72709616.1912248731], [231149590.6474862099, 72709567.3451132774], [231145093.8870221078, 72673108.5744598657], [231145090.5839974880, 72673084.2546606064], [231119896.4336911142, 72503239.0894752592], [231119892.5348235369, 72503214.8580609560], [231113612.2438195646, 72467020.6491715759], [231113602.6683072150, 72466972.5098201782], [231105553.9765343368, 72431130.0577136278], [231105548.3056574762, 72431106.1787738800], [231063827.7346812189, 72264548.3230499774], [231063821.4794938266, 72264524.5904724151], [231054023.7769555151, 72229120.2427554429], [231054009.5290703177, 72229073.2737725079], [231042486.4192903340, 72194192.3226203620], [231042478.4351749122, 72194169.1145073771], [230984633.2354337275, 72032502.6114434898], [230984624.6841673851, 72032479.6062603444], [230971403.9273263812, 71998206.0829393417], [230971385.1442832351, 71998160.7366618663], [230956498.5903427005, 71964577.2090922147], [230956488.3698801398, 71964554.8953127861], [230883075.6222693026, 71809336.6817101240], [230883064.8572773635, 71809314.6254739016], [230866548.3692490160, 71776501.9993137717], [230866525.2319389284, 71776458.7124512047], [230848418.5994898677, 71744496.0361925364], [230848406.2411087751, 71744474.8316405714], [230760132.9505181611, 71597199.7437449396], [230760120.0754733980, 71597178.8488692492], [230740466.9190672934, 71566143.1233989149], [230740439.6503151953, 71566102.3128273785], [230719287.3161260784, 71536068.3059245795], [230719272.9388444126, 71536048.4148115069], [230616989.2253185213, 71398134.7922299951], [230616974.3642146587, 71398115.2599439025], [230594373.8100692928, 71369155.3261634260], [230594342.6724881828, 71369117.3849110603], [230570348.3451014161, 71341301.2912702709], [230570332.0873802602, 71341282.9051583707], [230455022.9989930391, 71214058.9314662367], [230455006.2949506342, 71214040.9498763531], [230429675.9987582266, 71187435.7077805102], [230429641.2922200263, 71187401.0012422949], [230403036.0501227677, 71162070.7050485611], [230403018.0685328543, 71162054.0010061562], [230275794.0948420465, 71046744.9126201272], [230275775.7087301612, 71046728.6548989713], [230247959.6150887012, 71022734.3275116235], [230247921.6738363206, 71022703.1899305135], [230218961.7400564551, 71000102.6357856542], [230218942.2077703774, 71000087.7746817917], [230081028.5851882696, 70897804.0611554086], [230081008.6940751970, 70897789.6838737428], [230050974.6871728003, 70876637.3496848941], [230050933.8766012788, 70876610.0809327960], [230019898.1511303186, 70856956.9245263040], [230019877.2562546134, 70856944.0494815558], [229872602.1683593392, 70768670.7588911653], [229872580.9638073742, 70768658.4005100578], [229840618.2875488997, 70750551.7680611014], [229840575.0006863177, 70750528.6307510138], [229807762.3745269775, 70734012.1427230686], [229807740.3182907701, 70734001.3777311295], [229652522.1046873629, 70660588.6301199198], [229652499.7909079194, 70660578.4096573442], [229618916.2633378506, 70645691.8557166308], [229618870.9170604050, 70645673.0726734996], [229584597.3937393725, 70632452.3158324957], [229584574.3885562122, 70632443.7645661533], [229422907.8854923546, 70574598.5648249984], [229422884.6773793697, 70574590.5807095766], [229388003.7262274921, 70563067.4709296674], [229387956.7572445571, 70563053.2230444700], [229352552.4095285535, 70553255.5205064416], [229352528.6769509912, 70553249.2653190494], [229185970.8212257922, 70511528.6943424493], [229185946.9422860444, 70511523.0234656036], [229150104.4901795387, 70503474.3316927552], [229150056.3508281410, 70503464.7561804056], [229113862.1419388950, 70497184.4651764482], [229113837.9105245769, 70497180.5663088709], [228943918.2426441908, 70471975.3645716459], [228943893.9726716280, 70471972.0676938146], [228907509.8769857287, 70467482.6630683690], [228907461.1312516928, 70467477.8570905924], [228870900.8483168185, 70464775.4721206725], [228870876.4017979503, 70464773.9659038186], [228700454.1284568310, 70456367.3497653753], [228700429.5018147826, 70456366.4389982969], [228626587.6185330153, 70454546.3036504984], [228626562.9769260883, 70454546.0000000000], [225234362.7062848210, 70454546.0000000000], [225087229.7237529159, 70450934.9045730978], [224940463.2774533629, 70440111.2164893299], [224794404.5111693144, 70422100.6980440766], [224649405.1342787445, 70396946.7185495198], [224505814.3051510155, 70364709.8487657905], [224363977.7903733850, 70325467.7150462419], [224224237.1321467459, 70279314.8124138415], [224086928.8258501589, 70226362.2770165354], [223952383.5097617209, 70166737.6185119301], [223820925.1688826382, 70100584.4130245596], [223692870.3547783494, 70028061.9574131966], [223568527.4233275950, 69949344.8856865019], [223448195.7921965718, 69864622.7484818995], [223332165.2198460698, 69774099.5566304624], [223220715.1077891290, 69677993.2898960859], [223114113.8277960122, 69576535.3720832020], [223012618.0756536424, 69469970.1137672812], [222916472.2530408204, 69358554.1239932477], [222825907.8790130317, 69242555.6923655570], [222741143.0325018466, 69122254.1430038661], [222662381.8271805048, 68997939.1619293988], [222589813.9199616313, 68869910.0995063782], [222523614.0543003976, 68738475.2496018857], [222463941.6394137740, 68603951.1072162390], [222410940.3664230704, 68466661.6063631475], [222364737.8623461723, 68326937.3400373906], [222325445.3827717602, 68185114.7641482502], [222293157.5439550281, 68041535.3873298764], [222267952.0949828625, 67896544.9485925138], [222249889.7305538952, 67750492.5847836733], [222239013.9448252916, 67603729.9898623675], [222235350.6211881638, 67456598.2984466553], [222224563.8748501837, 37069205.3383235484], [222224563.5652083158, 37069180.8072810993], [222222733.6138921380, 36995670.2658087239], [222222732.7025687397, 36995645.7497443706], [222211830.6169506311, 36775234.5118862763], [222211829.1044942141, 36775210.0255554542], [222209115.9240034819, 36738590.4260756597], [222209111.0996940434, 36738541.6015379727], [222204605.0834996402, 36702099.1505708024], [222204601.7745501995, 36702074.8417498693], [222172156.9079983830, 36483792.2270526141], [222172153.0037213564, 36483768.0067193657], [222165864.9982974231, 36447590.4252327457], [222165855.4135169983, 36447542.3082770482], [222157800.5547807813, 36411716.6796689704], [222157794.8800461292, 36411692.8120065704], [222104119.4379476905, 36197639.2762726024], [222104113.1794195473, 36197615.5550005659], [222094310.8562974930, 36162228.1154796779], [222094296.6032769978, 36162181.1691182777], [222082770.4110337198, 36127317.1001245677], [222082762.4251198173, 36127293.9032907188], [222008372.9071237147, 35919529.2074039206], [222008364.3545680046, 35919506.2134544402], [221995142.0380095243, 35885249.4366172031], [221995123.2539007068, 35885204.1125982106], [221980236.6405903101, 35851637.0877290219], [221980226.4203427434, 35851614.7849385813], [221885838.6502671242, 35652138.1745173484], [221885827.8859820962, 35652116.1291530058], [221869312.8096273243, 35619319.6557544395], [221869289.6751829684, 35619276.3902147338], [221851185.8893802166, 35587329.4129877687], [221851173.5331448019, 35587308.2188525349], [221737695.7708599865, 35398039.1862231940], [221737682.8984264433, 35398018.3015786782], [221718033.9809687138, 35366997.7203925624], [221718006.7188033462, 35366956.9296610057], [221696859.9667857289, 35336937.4144502208], [221696845.5934621096, 35336917.5329138115], [221565369.7950311899, 35159677.3465221226], [221565354.9383160174, 35159657.8235629201], [221542761.2542850077, 35130711.6345860139], [221542730.1267327368, 35130673.7111772820], [221518743.8961586654, 35102870.5250792801], [221518727.6440562010, 35102852.1474546343], [221370518.9542268515, 34939346.3264423534], [221370502.2561909258, 34939328.3530309424], [221345181.2165561914, 34912735.0951238647], [221345146.5231463313, 34912700.4039614052], [221318551.6249628663, 34887381.0871257484], [221318533.6504697502, 34887364.3902541995], [221155018.2286426425, 34739166.2928635776], [221154999.8499652147, 34739150.0419516861], [221127195.1100654900, 34715165.6125559807], [221127157.1846403480, 34715134.4874604791], [221098209.5320755243, 34692542.6786504239], [221098190.0081539154, 34692527.8232000098], [220920941.3049533665, 34561063.5069017261], [220920921.4224858880, 34561049.1348660961], [220890900.5374236405, 34539904.3275978789], [220890859.7449260950, 34539877.0680750385], [220859837.8909220099, 34520230.1602137089], [220859817.0054436326, 34520217.2891331464], [220670540.6219694912, 34406751.7881893516], [220670519.4270338416, 34406739.4333269447], [220638571.2770860493, 34388637.7171302214], [220638528.0100477636, 34388614.5854887217], [220605730.4668490291, 34372101.6337682456], [220605708.4207874238, 34372090.8709113449], [220406225.6962175965, 34277716.0233969837], [220406203.3927651048, 34277705.8045942485], [220372635.4035917819, 34262821.3658322915], [220372590.0783560276, 34262802.5846596733], [220338332.4450322688, 34249582.4873294756], [220338309.4505288005, 34249573.9362633675], [220130539.9360229075, 34175197.8776993603], [220130516.7386717498, 34175189.8932882026], [220095651.9230699837, 34163665.9596107751], [220095604.9757853448, 34163651.7096315548], [220060216.9013318121, 34153851.6789762601], [220060193.1796543896, 34153845.4219848216], [219846136.1672002673, 34100183.8466747552], [219846112.2991703153, 34100178.1734862998], [219810286.1488338709, 34092125.6355996653], [219810238.0312573612, 34092116.0539363325], [219774060.0425015986, 34085830.3921580911], [219774035.8219154775, 34085826.4894501045], [219555751.1058529615, 34053395.7636078522], [219555726.7968177199, 34053392.4562331811], [219519284.0540217757, 34048888.8008393273], [219519235.2291716635, 34048883.9796928018], [219482615.4540060163, 34046173.1714747697], [219482590.9675772786, 34046171.6606046185], [219262179.0239292383, 34035283.8535461053], [219262154.5078058839, 34035282.9438108951], [219188643.8479408622, 34033457.7546104044], [219188619.3168784082, 34033457.4465576857], [181660672.9813074172, 34022567.0977688730], [181513534.9885505140, 34018913.0059040189], [181366765.6695591211, 34008045.8338448852], [181220706.2037669420, 33989991.4471691251], [181075708.3312471807, 33964793.3244096562], [180932121.2355479598, 33932512.1476286277], [180790290.7027860880, 33893225.6562824175], [180650558.2889290154, 33847028.4600104466], [180513260.4972578585, 33794031.8107956424], [180378727.9680027366, 33734363.3350483030], [180247284.6820950210, 33668166.7262562066], [180119247.1809572577, 33595601.3989422247], [179994923.8042088151, 33516842.1047628000], [179874613.9471234679, 33432078.5116714425], [179758607.3396247923, 33341514.7471598201], [179647183.3485623002, 33245368.9066805169], [179540610.3049379289, 33143872.5284280740], [179439144.8577127755, 33037270.0357494354], [179343031.3557471931, 32925818.1485263556], [179252501.2593576610, 32809785.2649396583], [179167772.5829165876, 32689450.8151159808], [179089049.3698306084, 32565104.5882046968], [179016521.2011619508, 32437046.0345059410], [178950362.7390820682, 32305583.5443385206], [178890733.3062491119, 32171033.7053727433], [178837776.5021273792, 32033720.5402243249], [178791619.8571726084, 31893974.7261463702], [178752374.5257122517, 31752132.7986907847], [178720135.0182643533, 31608536.3412652835], [178694978.9739373028, 31463531.1625309177], [178676966.9734602273, 31317466.4636318497], [178666142.3932915628, 31170693.9972428568], [178662531.0000000000, 31023554.9502890110], [178662531.0000000000, 20490514.0230737589], [178662530.6963495016, 20490489.3814668283], [178660710.5610017180, 20416647.4981856756], [178660709.6502346396, 20416622.8715436198], [178652303.0340961814, 20246200.5982020833], [178652301.5278793275, 20246176.1516832411], [178649599.1429094076, 20209615.8687484376], [178649594.3369316459, 20209567.1230143942], [178645104.9323061407, 20173183.0273280442], [178645101.6354283094, 20173158.7573554590], [178619896.4336910546, 20003239.0894749723], [178619892.5348234773, 20003214.8580606692], [178613612.2438195646, 19967020.6491715610], [178613602.6683072150, 19966972.5098201632], [178605553.9765344560, 19931130.0577141158], [178605548.3056575954, 19931106.1787743717], [178563827.7346810400, 19764548.3230493478], [178563821.4794936478, 19764524.5904717743], [178554023.7769555449, 19729120.2427554689], [178554009.5290703475, 19729073.2737725452], [178542486.4192904830, 19694192.3226208128], [178542478.4351750612, 19694169.1145078205], [178484633.2354336679, 19532502.6114433296], [178484624.6841673255, 19532479.6062601879], [178471403.9273265600, 19498206.0829397775], [178471385.1442834139, 19498160.7366623059], [178456498.5903427899, 19464577.2090924978], [178456488.3698802292, 19464554.8953130729], [178383075.6222685874, 19309336.6817086488], [178383064.8572766483, 19309314.6254724227], [178366548.3692491651, 19276501.9993140288], [178366525.2319390774, 19276458.7124514543], [178348418.5994898975, 19244496.0361925922], [178348406.2411088049, 19244474.8316406310], [178260132.9505183101, 19097199.7437451966], [178260120.0754735470, 19097178.8488695025], [178240466.9190670252, 19066143.1233984865], [178240439.6503149271, 19066102.3128269538], [178219287.3161264658, 19036068.3059251010], [178219272.9388448000, 19036048.4148120284], [178116989.2253188193, 18898134.7922304347], [178116974.3642149568, 18898115.2599443458], [178094373.8100692928, 18869155.3261634819], [178094342.6724881828, 18869117.3849111088], [178070348.3451010287, 18841301.2912698276], [178070332.0873798728, 18841282.9051579349], [177955022.9989933372, 18714058.9314666055], [177955006.2949509323, 18714040.9498767145], [177929675.9987581372, 18687435.7077804208], [177929641.2922199368, 18687401.0012422055], [177903036.0501230657, 18662070.7050488517], [177903018.0685331523, 18662054.0010064505], [177775794.0948417187, 18546744.9126198553], [177775775.7087298334, 18546728.6548987031], [177747959.6150888503, 18522734.3275117651], [177747921.6738364697, 18522703.1899306439], [177718961.7400559485, 18500102.6357852630], [177718942.2077698708, 18500087.7746814080], [177581028.5851883888, 18397804.0611555018], [177581008.6940753162, 18397789.6838738322], [177550974.6871727109, 18376637.3496848457], [177550933.8766011894, 18376610.0809327476], [177519898.1511304677, 18356956.9245264046], [177519877.2562547624, 18356944.0494816527], [177372602.1683594584, 18268670.7588912249], [177372580.9638074934, 18268658.4005101174], [177340618.2875487208, 18250551.7680609897], [177340575.0006861389, 18250528.6307509020], [177307762.3745270073, 18234012.1427230574], [177307740.3182907999, 18234001.3777311295], [177152522.1046871841, 18160588.6301198527], [177152499.7909077406, 18160578.4096572734], [177118916.2633377314, 18145691.8557165749], [177118870.9170602858, 18145673.0726734437], [177084597.3937400281, 18132452.3158327341], [177084574.3885568678, 18132443.7645663880], [176922907.8854919374, 18074598.5648248382], [176922884.6773789525, 18074590.5807094276], [176888003.7262275517, 18063067.4709296860], [176887956.7572446167, 18063053.2230444811], [176852552.4095284343, 18053255.5205064043], [176852528.6769508719, 18053249.2653190047], [176685970.8212257028, 18011528.6943424195], [176685946.9422859550, 18011523.0234655775], [176650104.4901798666, 18003474.3316928148], [176650056.3508284688, 18003464.7561804652], [176613862.1419388354, 17997184.4651764482], [176613837.9105245173, 17997180.5663088709], [176443992.7453397512, 17971986.4160025753], [176443968.4255405068, 17971983.1129779406], [176407509.6548868716, 17967486.3525138088], [176407460.8087752759, 17967481.5415917300], [176370825.3087297380, 17964779.1447573304], [176370800.8118404746, 17964777.6397578046], [176199304.0389835238, 17956352.5435617119], [176199279.5125377178, 17956351.6401992217], [176162555.5412285328, 17955450.1173052117], [176162506.4587714672, 17955450.1173052117], [176125782.4874622822, 17956351.6401992217], [176125757.9610164762, 17956352.5435617119], [175954261.1881595254, 17964777.6397578046], [175954236.6912702620, 17964779.1447573304], [175917601.1912247241, 17967481.5415917300], [175917552.3451131284, 17967486.3525138088], [175881093.5744594932, 17971983.1129779406], [175881069.2546602488, 17971986.4160025753], [175711224.0894754827, 17997180.5663088709], [175711199.8580611646, 17997184.4651764482], [175675005.6491715312, 18003464.7561804652], [175674957.5098201334, 18003474.3316928148], [175639115.0577140450, 18011523.0234655775], [175639091.1787742972, 18011528.6943424195], [175472533.3230491281, 18053249.2653190047], [175472509.5904715657, 18053255.5205064043], [175437105.2427553833, 18063053.2230444811], [175437058.2737724483, 18063067.4709296860], [175402177.3226210475, 18074590.5807094276], [175402154.1145080626, 18074598.5648248382], [175240487.6114431322, 18132443.7645663880], [175240464.6062599719, 18132452.3158327341], [175206191.0829397142, 18145673.0726734437], [175206145.7366622686, 18145691.8557165749], [175172562.2090922594, 18160578.4096572734], [175172539.8953128159, 18160588.6301198527], [175017321.6817092001, 18234001.3777311295], [175017299.6254729927, 18234012.1427230574], [174984486.9993138611, 18250528.6307509020], [174984443.7124512792, 18250551.7680609897], [174952481.0361925066, 18268658.4005101174], [174952459.8316405416, 18268670.7588912249], [174805184.7437452376, 18356944.0494816527], [174805163.8488695323, 18356956.9245264046], [174774128.1233988106, 18376610.0809327476], [174774087.3128272891, 18376637.3496848457], [174744053.3059246838, 18397789.6838738322], [174744033.4148116112, 18397804.0611555018], [174606119.7922299802, 18500087.7746815160], [174606100.2599439025, 18500102.6357853711], [174577140.3261637092, 18522703.1899305098], [174577102.3849113286, 18522734.3275116310], [174549286.2912699878, 18546728.6548988521], [174549267.9051581025, 18546744.9126200043], [174422043.9314666390, 18662054.0010066442], [174422025.9498767257, 18662070.7050490454], [174395420.7077803016, 18687401.0012419783], [174395386.0012421012, 18687435.7077801935], [174370055.7050488293, 18714040.9498769753], [174370039.0010064244, 18714058.9314668663], [174254729.9126201272, 18841282.9051579349], [174254713.6548989713, 18841301.2912698276], [174230719.3275118172, 18869117.3849111088], [174230688.1899307072, 18869155.3261634819], [174208087.6357850432, 18898115.2599443458], [174208072.7746811807, 18898134.7922304347], [174105789.0611552000, 19036048.4148120284], [174105774.6838735342, 19036068.3059251010], [174084622.3496850729, 19066102.3128269538], [174084595.0809329748, 19066143.1233984865], [174064941.9245264530, 19097178.8488695025], [174064929.0494816899, 19097199.7437451966], [173976655.7588911951, 19244474.8316406310], [173976643.4005101025, 19244496.0361925922], [173958536.7680609226, 19276458.7124514543], [173958513.6307508349, 19276501.9993140288], [173941997.1427233517, 19309314.6254724227], [173941986.3777314126, 19309336.6817086488], [173868573.6301197708, 19464554.8953130729], [173868563.4096572101, 19464577.2090924978], [173853676.8557165861, 19498160.7366623059], [173853658.0726734400, 19498206.0829397775], [173840437.3158326745, 19532479.6062601879], [173840428.7645663321, 19532502.6114433296], [173782583.5648250282, 19694169.1145075597], [173782575.5807096064, 19694192.3226205520], [173771052.4709295928, 19729073.2737727761], [173771038.2230443954, 19729120.2427556999], [173761240.5205063820, 19764524.5904715657], [173761234.2653189898, 19764548.3230491392], [173719513.6943424046, 19931106.1787743717], [173719508.0234655440, 19931130.0577141158], [173711459.3316927850, 19966972.5098201632], [173711449.7561804354, 19967020.6491715610], [173705169.4651765227, 20003214.8580606692], [173705165.5663089454, 20003239.0894749723], [173679960.3645716906, 20173158.7573554590], [173679957.0676938593, 20173183.0273280442], [173675467.6630683541, 20209567.1230143942], [173675462.8570905924, 20209615.8687484376], [173672760.4721206725, 20246176.1516832411], [173672758.9659038186, 20246200.5982020833], [173664352.3497653604, 20416622.8715436198], [173664351.4389982820, 20416647.4981856756], [173662531.3036504984, 20490489.3814668283], [173662531.0000000000, 20490514.0230737589], [173662531.0000000000, 31020363.4027132653], [173658916.9375455379, 31167556.7817225382], [173648084.3634156287, 31314383.1828350462], [173630059.0824879110, 31460501.0324418917], [173604884.5352861881, 31605558.1897943243], [173572621.3919055164, 31749205.0703912228], [173533347.4057992995, 31891095.4884657227], [173487157.2263948917, 32030887.4912863448], [173434162.1709905565, 32168244.1832560636], [173374489.9564837813, 32302834.5378211215], [173308284.3915759325, 32434334.1952396072], [173235705.0301958323, 32562426.2442818768], [173156926.7869805098, 32686801.9859756306], [173072139.5157324076, 32807161.6775681265], [172981547.5518765748, 32923215.2548976801], [172885369.2200191021, 33034683.0314394049], [172783836.3077865541, 33141296.3723474219], [172677193.5072245002, 33242798.3418567479], [172565697.8250946105, 33338944.3224934377], [172449617.9634962678, 33429502.6045952812], [172329233.6722961366, 33514254.9447306171], [172204835.0749424398, 33592997.0916559845], [172076721.9692693651, 33665539.2785605118], [171945203.1049942672, 33731706.6803972721], [171810595.4396358132, 33791339.8352090865], [171673223.3746545017, 33844295.0284277052], [171533417.9736517966, 33890444.6392228827], [171391516.1645148396, 33929677.4480655789], [171247859.9274269044, 33961898.9047647715], [171102795.4707040191, 33987031.3563310057], [170956672.3964395225, 34005014.2341186330], [170809842.8579711914, 34015804.1997947395], [170662648.4363840520, 34019375.5476048738], [133112694.7670915425, 34008478.8124410138], [133112670.2212437242, 34008479.1066105887], [133039114.7705941498, 34010263.7672979161], [133039090.2393624336, 34010264.6638753787], [132818541.1674282402, 34021037.3944706023], [132818516.6655947566, 34021038.8929156885], [132781873.6627987176, 34023731.6531501934], [132781824.8063577116, 34023736.4516693726], [132745358.1098422557, 34028224.2859834060], [132745333.7846748680, 34028227.5831659734], [132526903.2156112641, 34060569.9911468178], [132526878.9787047356, 34060573.8844157234], [132490676.4723916948, 34066845.9772291109], [132490628.3217183948, 34066855.5422840491], [132454777.2528385222, 34074896.7779933289], [132454753.3680866361, 34074902.4440156072], [132240545.6843779832, 34128502.9393095747], [132240521.9458992183, 34128509.1898941398], [132205108.7147250473, 34138300.1893014684], [132205061.7337079942, 34138314.4287414625], [132170171.6853345633, 34149831.5957572535], [132170148.4711063206, 34149839.5760321990], [131962227.3715274930, 34224181.7659751624], [131962204.3601754457, 34224190.3136566207], [131927921.5788378865, 34237405.8921663389], [131927876.2200970054, 34237424.6688071564], [131894283.3265311420, 34252306.8095623329], [131894261.0064747930, 34252317.0272071660], [131694629.6242048889, 34346684.6915233210], [131694607.5616732836, 34346695.4539524242], [131661785.5140005797, 34363208.2913270071], [131661742.2145266235, 34363231.4242725670], [131629770.1131472588, 34381335.1626981273], [131629748.9022965282, 34381347.5192750022], [131440330.5065285563, 34494831.5102164000], [131440309.6053700745, 34494844.3837068155], [131409264.5023326427, 34514495.3935790360], [131409223.6792771816, 34514522.6599641740], [131379180.3925851583, 34535673.5827890784], [131379160.4952875376, 34535687.9592534751], [131201779.9622553289, 34667194.9604230970], [131201760.4238338917, 34667209.8209502921], [131172791.3571359217, 34689809.6834771782], [131172753.4037924558, 34689840.8206147328], [131144928.3718905300, 34713835.1576809809], [131144909.9798386246, 34713851.4155285656], [130981276.2117736936, 34862114.4750015736], [130981258.2243244350, 34862131.1793977097], [130954644.2849227041, 34887462.1651880443], [130954609.5669376403, 34887496.8730996549], [130929270.8590343595, 34914103.4605052471], [130929254.1494190991, 34914121.4431062490], [130780943.6108102351, 35077712.1793754846], [130780927.3476260900, 35077730.5667086914], [130756924.9369399697, 35105548.6344496459], [130756893.7887899280, 35105586.5787557289], [130734285.5205935985, 35134549.0859112963], [130734270.6543971151, 35134568.6200195029], [130602712.1841707081, 35311910.9831685945], [130602697.8019328564, 35311930.8762934208], [130581538.1616464406, 35341968.0238698423], [130581510.8834158927, 35342008.8390110731], [130561850.8652990460, 35373048.2381547093], [130561837.9857438058, 35373069.1355765089], [130448299.0316825658, 35562454.5911070853], [130448286.6689509600, 35562475.7983711287], [130430173.6532071084, 35594442.6448250860], [130430150.5076973289, 35594485.9375842065], [130413628.1462885290, 35627303.1919649541], [130413617.3774574697, 35627325.2513724491], [130319191.7854797393, 35826929.2403985634], [130319181.5613582134, 35826951.5574888736], [130304289.6728063375, 35860540.1309464797], [130304270.8830035329, 35860585.4842366129], [130291045.3564261049, 35894864.4290622026], [130291036.8020672649, 35894887.4379327968], [130216634.2780015320, 36102786.9551712945], [130216626.2909903228, 36102810.1670827344], [130205098.9996105433, 36137696.8717861101], [130205084.7465375811, 36137743.8486690074], [130195283.4708699286, 36173154.2370717525], [130195277.2133968920, 36173177.9737356305], [130141614.5587836653, 36387370.0939353183], [130141608.8858304322, 36387393.9770419598], [130133557.2467295676, 36423242.7109017372], [130133547.6677020341, 36423290.8587972969], [130127265.0694379061, 36459491.5434681550], [130127261.1691357940, 36459515.7792438716], [130094855.3754887730, 36677936.9535692632], [130094852.0712473392, 36677961.2777788043], [130090353.6547412276, 36714426.6704206988], [130090348.8420444578, 36714475.5254671574], [130087645.4483794868, 36751117.7452994809], [130087643.9428241998, 36751142.2466970831], [130076807.2108798474, 36971688.1831738502], [130076806.3071836233, 36971712.7141443640], [130075000.3012925833, 37045267.6438009888], [130075000.0000000000, 37045292.1895624101], [130075000.0000000000, 49113182.6128609553], [130075000.3011813015, 49113207.1540894806], [130076805.6401992291, 49186748.5125377104], [130076806.5435617268, 49186773.0389835089], [130087639.2764217257, 49407278.3820055351], [130087640.7814212441, 49407302.8788948134], [130090343.1782556325, 49443938.3789401948], [130090347.9891777188, 49443987.2250517905], [130094844.7496417761, 49480445.9957047701], [130094848.0526664108, 49480470.3155040294], [130127241.9261072874, 49698852.0715327710], [130127245.8249748647, 49698876.3029470742], [130133526.1159788668, 49735070.5118366256], [130133535.6914912164, 49735118.6511880234], [130141584.3832639903, 49770961.1032941192], [130141590.0541408360, 49770984.9822338670], [130195233.0974527597, 49985140.0155775473], [130195239.3526401520, 49985163.7481551170], [130205037.0551783890, 50020568.0958718657], [130205051.3030635864, 50020615.0648547858], [130216574.4128434658, 50055496.0160065815], [130216582.3969588876, 50055519.2241195813], [130290957.9983106703, 50263385.1047392190], [130290966.5495770127, 50263408.1099223569], [130304187.3064178228, 50297681.6332428902], [130304206.0894609541, 50297726.9795203656], [130319092.6434013844, 50331310.5070897564], [130319102.8638639599, 50331332.8208691776], [130413494.7455571592, 50530907.6867041886], [130413505.5105490983, 50530929.7429404110], [130430021.9985767603, 50563742.3690991774], [130430045.1358868480, 50563785.6559617519], [130448151.7683360577, 50595748.3322206736], [130448164.1267171651, 50595769.5367726386], [130561663.2433302253, 50785131.3727643192], [130561676.1183749735, 50785152.2676400170], [130581329.2747814655, 50816187.9931109771], [130581356.5435335636, 50816228.8036825061], [130602508.8777225614, 50846262.8105851337], [130602523.2550042272, 50846282.7016982064], [130734036.5480001867, 51023607.8498518988], [130734051.4091040492, 51023627.3821379915], [130756651.9632491469, 51052587.3159181401], [130756683.1008302569, 51052625.2571705133], [130780677.4282176495, 51080441.3508120552], [130780693.6859388053, 51080459.7369239479], [130928954.6104134172, 51244040.4591267332], [130928971.3144558221, 51244058.4407166243], [130954301.6106487066, 51270663.6828129888], [130954336.3171869218, 51270698.3893511966], [130980941.5592837781, 51296028.6855445430], [130980959.5408736616, 51296045.3895869479], [131144540.2630757838, 51444306.3140609488], [131144558.6491876841, 51444322.5717821047], [131213899.2582568675, 51504136.1925114766]]);
|
|
}
|
|
translate(v = [0, 0, -3000000]) {
|
|
linear_extrude(convexity = 10, height = 9000000) {
|
|
polygon(points = [[134075000.0000000000, 38008758.2351448461], [134075000.0000000000, 48150000.0000000000], [139700000.0000000000, 48150000.0000000000], [139798017.1403295696, 48154815.2733278051], [139895090.3220161200, 48169214.7195967659], [139990284.6772544682, 48193059.6642677933], [140082683.4323650897, 48226120.4674887136], [140171396.7368260026, 48268078.7356516421], [140255570.2330195904, 48318530.3876974583], [140334393.2841636539, 48376989.5466372594], [140407106.7811865509, 48442893.2188134491], [140473010.4533627331, 48515606.7158363536], [140531469.6123025417, 48594429.7669803947], [140581921.2643483579, 48678603.2631740049], [140623879.5325112939, 48767316.5676349103], [140656940.3357322216, 48859715.3227455392], [140680785.2804032266, 48954909.6779838726], [140695184.7266722023, 49051982.8596704379], [140700000.0000000000, 49150000.0000000000], [140700000.0000000000, 49750000.0000000000], [140695184.7266722023, 49848017.1403295621], [140680785.2804032266, 49945090.3220161274], [140656940.3357322216, 50040284.6772544608], [140623879.5325112939, 50132683.4323650897], [140581921.2643483579, 50221396.7368259951], [140531469.6123025417, 50305570.2330196053], [140473010.4533627331, 50384393.2841636464], [140407106.7811865509, 50457106.7811865509], [140334393.2841636539, 50523010.4533627406], [140255570.2330195904, 50581469.6123025417], [140250000.0000000000, 50584808.2814897224], [140250000.0000000000, 56982940.4849924147], [140309393.2841636539, 57026989.5466372594], [140382106.7811865509, 57092893.2188134491], [140448010.4533627331, 57165606.7158363536], [140506469.6123025417, 57244429.7669803947], [140556921.2643483579, 57328603.2631740049], [140598879.5325112939, 57417316.5676349103], [140631940.3357322216, 57509715.3227455392], [140655785.2804032266, 57604909.6779838726], [140670184.7266722023, 57701982.8596704379], [140675000.0000000000, 57800000.0000000000], [140675000.0000000000, 58400000.0000000000], [140670184.7266722023, 58498017.1403295621], [140655785.2804032266, 58595090.3220161274], [140631940.3357322216, 58690284.6772544608], [140598879.5325112939, 58782683.4323650897], [140556921.2643483579, 58871396.7368259951], [140506469.6123025417, 58955570.2330196053], [140448010.4533627331, 59034393.2841636464], [140382106.7811865509, 59107106.7811865509], [140309393.2841636539, 59173010.4533627406], [140230570.2330195904, 59231469.6123025417], [140146396.7368260026, 59281921.2643483579], [140057683.4323650897, 59323879.5325112864], [139965284.6772544682, 59356940.3357322067], [139870090.3220161200, 59380785.2804032341], [139773017.1403295696, 59395184.7266721949], [139675000.0000000000, 59400000.0000000000], [134075569.6689103544, 59400000.0000000000], [134099591.7203668356, 107875914.0057790428], [218249706.8595425487, 107900333.6632250249], [218224905.8084288836, 38033177.9520300925], [134075000.0000000000, 38008758.2351448461]]);
|
|
}
|
|
}
|
|
translate(v = [0, 0, 1400000]) {
|
|
linear_extrude(convexity = 10, height = 3000000) {
|
|
polygon(points = [[133025000.0000000000, 37008468.0000000000], [133025000.0000000000, 49150000.0000000000], [133025240.7636663914, 49154900.8570164815], [133025960.7359798402, 49159754.5161008090], [133027152.9832133949, 49164514.2338627204], [133028806.0233744383, 49169134.1716182530], [133030903.9367825836, 49173569.8368413001], [133033426.5193848759, 49177778.5116509795], [133036349.4773318619, 49181719.6642081812], [133039644.6609406769, 49185355.3390593305], [133043280.3357918113, 49188650.5226681381], [133047221.4883490205, 49191573.4806151241], [133051430.1631586999, 49194096.0632174164], [133055865.8283817470, 49196193.9766255617], [133060485.7661372721, 49197847.0167866126], [133065245.4838991910, 49199039.2640201598], [133070099.1429835260, 49199759.2363336086], [133075000.0000000000, 49200000.0000000000], [139650000.0000000000, 49200000.0000000000], [139650000.0000000000, 49700000.0000000000], [139250000.0000000000, 49700000.0000000000], [139245099.1429835260, 49700240.7636663914], [139240245.4838992059, 49700960.7359798402], [139235485.7661372721, 49702152.9832133874], [139230865.8283817470, 49703806.0233744383], [139226430.1631587148, 49705903.9367825836], [139222221.4883490205, 49708426.5193848759], [139218280.3357918262, 49711349.4773318619], [139214644.6609406769, 49714644.6609406695], [139211349.4773318768, 49718280.3357918188], [139208426.5193848610, 49722221.4883490205], [139205903.9367825687, 49726430.1631586999], [139203806.0233744383, 49730865.8283817470], [139202152.9832133949, 49735485.7661372796], [139200960.7359798253, 49740245.4838991910], [139200240.7636663914, 49745099.1429835185], [139200000.0000000000, 49750000.0000000000], [139200000.0000000000, 57800000.0000000000], [139200240.7636663914, 57804900.8570164815], [139200960.7359798253, 57809754.5161008090], [139202152.9832133949, 57814514.2338627204], [139203806.0233744383, 57819134.1716182530], [139205903.9367825687, 57823569.8368413001], [139208426.5193848610, 57827778.5116509795], [139211349.4773318768, 57831719.6642081812], [139214644.6609406769, 57835355.3390593305], [139218280.3357918262, 57838650.5226681381], [139222221.4883490205, 57841573.4806151241], [139226430.1631587148, 57844096.0632174164], [139230865.8283817470, 57846193.9766255617], [139235485.7661372721, 57847847.0167866126], [139240245.4838992059, 57849039.2640201598], [139245099.1429835260, 57849759.2363336086], [139250000.0000000000, 57850000.0000000000], [139625000.0000000000, 57850000.0000000000], [139625000.0000000000, 58350000.0000000000], [133075074.0000000000, 58350000.0000000000], [133070171.6018611938, 58350240.9154777899], [133065316.4462659806, 58350961.3403004557], [133060555.3204995692, 58352154.3320083842], [133055934.1057175100, 58353808.3941948861], [133051497.3348064721, 58355907.5872926787], [133047287.7632378340, 58358431.6821774468], [133043345.9570494145, 58361356.3551081717], [133039709.9019260556, 58364653.4221258014], [133036414.6371460706, 58368291.1106512994], [133033491.9179209918, 58372234.3656658977], [133030969.9093827754, 58376445.1875229701], [133028872.9151671082, 58380882.9981361181], [133027221.1432085037, 58385505.0320147872], [133026030.5110041946, 58390266.7483789697], [133025312.4922232479, 58395122.2603817284], [133025074.0061391443, 58400024.7773033231], [133050087.0061391443, 108875648.7773033231], [133050329.9565512538, 108880547.0709154904], [133051051.6156015694, 108885398.0000459552], [133052245.0402646214, 108890154.8942835182], [133053898.7486947030, 108894771.9879193306], [133055996.8306918591, 108899204.8602553010], [133058519.1007726640, 108903410.8629720360], [133061441.2923731953, 108907349.5304451138], [133064735.2913157493, 108910982.9690616578], [133068369.4062931240, 108914276.2217918485], [133072308.6737683117, 108917197.6045077294], [133076515.1943558156, 108919719.0108138472], [133080948.4974488616, 108921816.1824565530], [133085565.9305837750, 108923468.9427108914], [133090323.0697961301, 108924661.3904992342], [133095174.1470202357, 108925382.0533742905], [133100072.4904200733, 108925623.9978947192], [219250047.4904200733, 108950623.9978947192], [219254950.4235864878, 108950384.4593511671], [219259806.2399122119, 108949665.3069619238], [219264568.1368401051, 108948473.4722434431], [219269190.2170507610, 108946820.4426385760], [219273627.9308415353, 108944722.1507953852], [219277838.5055169165, 108942198.8210010380], [219281781.3576510847, 108939274.7742510140], [219285418.4842492640, 108935978.1938323081], [219288714.8290379047, 108932340.8536801338], [219291638.6203528941, 108928397.8121263981], [219294161.6773692369, 108924187.0739915371], [219296259.6817206144, 108919749.2242769003], [219297912.4118908346, 108915127.0369881094], [219299103.9381178916, 108910365.0628598481], [219299822.7759324014, 108905509.1999556273], [219300061.9968498349, 108900606.2512815297], [219274550.9968498349, 37033450.2512815222], [219274308.6918088198, 37028551.4864123166], [219273587.5862336457, 37023700.0314010680], [219272394.6190662384, 37018942.5700702518], [219270741.2698044777, 37014324.8817746565], [219268643.4480390251, 37009891.4008829519], [219266121.3403610587, 37005684.7892016321], [219263199.2161138356, 37001745.5254556313], [219259905.1938575506, 36998111.5157759860], [219256270.9707943201, 36994817.7289426476], [219252331.5177574456, 36991895.8598923758], [219248124.7426994443, 36989374.0247296616], [219243691.1259173155, 36987276.4901754707], [219239073.3305252194, 36985623.4400572404], [219234315.7919223607, 36984430.7810870856], [219229464.2902071178, 36983709.9897972122], [219224565.5096513331, 36983468.0021053031], [133075014.5096513331, 36958468.0021053031], [133070112.6804618388, 36958707.4322004691], [133065257.9362095892, 36959426.2607047483], [133060497.0479981601, 36960617.5623506755], [133055875.8827124089, 36962269.8600161150], [133051438.9611322582, 36964367.2352960557], [133047229.0290148258, 36966889.4818621352], [133043286.6452775598, 36969812.3001324758], [133039649.7912493199, 36973107.5313763618], [133036353.5047544986, 36976743.4289983362], [133033429.5425549597, 36980684.9643881321], [133030906.0744021386, 36984894.1643899232], [133028807.4116468132, 36989330.4771395847], [133027153.7730209976, 36993951.1627454832], [133025961.0898486823, 36998711.7050490305], [133025240.8525617272, 37003566.2404978499], [133025000.0000000000, 37008468.0000000000]]);
|
|
}
|
|
}
|
|
translate(v = [176162531, 125454546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
translate(v = [176162531, 20454546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
translate(v = [228662531, 72954546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
translate(v = [123662531, 72954546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/***********************************************
|
|
********* SolidPython code: **********
|
|
************************************************
|
|
|
|
from pcbnewTransition import pcbnew
|
|
import numpy as np
|
|
import json
|
|
from collections import OrderedDict
|
|
from kikit.common import *
|
|
from kikit.defs import *
|
|
from kikit.substrate import Substrate, extractRings, toShapely, linestringToKicad
|
|
from kikit.export import gerberImpl, pasteDxfExport
|
|
from kikit.export import exportSettingsJlcpcb
|
|
# Allow importing solid from this dir
|
|
import os
|
|
import sys
|
|
cur_path = os.path.abspath(os.path.dirname(__file__))
|
|
if cur_path not in sys.path:
|
|
sys.path.insert(0, cur_path)
|
|
import solid
|
|
import solid.utils
|
|
import subprocess
|
|
import shutil
|
|
from kikit.common import removeComponents, parseReferences
|
|
|
|
from shapely.geometry import Point
|
|
|
|
|
|
OUTER_BORDER = fromMm(7.5)
|
|
INNER_BORDER = fromMm(5)
|
|
MOUNTING_HOLES_COUNT = 3
|
|
MOUNTING_HOLE_R = fromMm(1)
|
|
HOLE_SPACING = fromMm(20)
|
|
|
|
def addBottomCounterpart(board, item):
|
|
item = item.Duplicate()
|
|
item.SetLayer(Layer.B_Paste)
|
|
board.Add(item)
|
|
|
|
def addRoundedCorner(board, center, start, end, thickness):
|
|
corner = pcbnew.PCB_SHAPE()
|
|
corner.SetShape(STROKE_T.S_ARC)
|
|
corner.SetCenter(toKiCADPoint((center[0], center[1])))
|
|
corner.SetStart(toKiCADPoint((start[0], start[1])))
|
|
|
|
if np.cross(start - center, end - center) > 0:
|
|
corner.SetArcAngleAndEnd(fromDegrees(90), True)
|
|
else:
|
|
corner.SetArcAngleAndEnd(fromDegrees(-90), True)
|
|
corner.SetWidth(thickness)
|
|
corner.SetLayer(Layer.F_Paste)
|
|
board.Add(corner)
|
|
addBottomCounterpart(board, corner)
|
|
|
|
def addLine(board, start, end, thickness):
|
|
line = pcbnew.PCB_SHAPE()
|
|
line.SetShape(STROKE_T.S_SEGMENT)
|
|
line.SetStart(toKiCADPoint((start[0], start[1])))
|
|
line.SetEnd(toKiCADPoint((end[0], end[1])))
|
|
line.SetWidth(thickness)
|
|
line.SetLayer(Layer.F_Paste)
|
|
board.Add(line)
|
|
addBottomCounterpart(board, line)
|
|
|
|
def addBite(board, origin, direction, normal, thickness):
|
|
"""
|
|
Adds a bite to the stencil, direction points to the bridge, normal points
|
|
inside the stencil
|
|
"""
|
|
direction = normalize(direction) * thickness
|
|
normal = normalize(normal) * thickness
|
|
center = toKiCADPoint((origin[0], origin[1])) + toKiCADPoint((normal[0], normal[1]))
|
|
start = origin
|
|
end = center + toKiCADPoint((direction[0], direction[1]))
|
|
# addLine(board, end, end + normal / 2, thickness)
|
|
addRoundedCorner(board, center, start, end, thickness)
|
|
|
|
def numberOfCuts(length, bridgeWidth, bridgeSpacing):
|
|
"""
|
|
Return number of bridges which fit inside the length and cut length
|
|
"""
|
|
count = round(np.floor((length + bridgeWidth) / (bridgeWidth + bridgeSpacing)))
|
|
cutLength = round((length - (count - 1) * bridgeWidth) / count)
|
|
return count, cutLength
|
|
|
|
def addFrame(board, rect, bridgeWidth, bridgeSpacing, clearance):
|
|
"""
|
|
Add rectangular frame to the board
|
|
"""
|
|
R=fromMm(1)
|
|
|
|
corners = [
|
|
(tl(rect), toKiCADPoint((R, 0)), toKiCADPoint((0, R))), # TL
|
|
(tr(rect), toKiCADPoint((0, R)), toKiCADPoint((-R, 0))), # TR
|
|
(br(rect), toKiCADPoint((-R, 0)), toKiCADPoint((0, -R))), # BR
|
|
(bl(rect), toKiCADPoint((0, -R)), toKiCADPoint((R, 0))) # BL
|
|
]
|
|
for c, sOffset, eOffset in corners:
|
|
addRoundedCorner(board, c + sOffset + eOffset, c + sOffset, c + eOffset, clearance)
|
|
|
|
count, cutLength = numberOfCuts(rect.GetWidth() - 2 * R, bridgeWidth, bridgeSpacing)
|
|
for i in range(count):
|
|
start = round(rect.GetX() + R + i * bridgeWidth + i * cutLength)
|
|
end = start + cutLength
|
|
|
|
y1, y2 = rect.GetY(), rect.GetY() + rect.GetHeight()
|
|
addLine(board, toKiCADPoint((start, y1)), toKiCADPoint((end, y1)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((start, y1)), toKiCADPoint((-1, 0)), toKiCADPoint((0, 1)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((end, y1)), toKiCADPoint((1, 0)), toKiCADPoint((0, 1)), clearance)
|
|
addLine(board, toKiCADPoint((start, y2)), toKiCADPoint((end, y2)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((start, y2)), toKiCADPoint((-1, 0)), toKiCADPoint((0, -1)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((end, y2)), toKiCADPoint((1, 0)), toKiCADPoint((0, -1)), clearance)
|
|
|
|
count, cutLength = numberOfCuts(rect.GetHeight() - 2 * R, bridgeWidth, bridgeSpacing)
|
|
for i in range(count):
|
|
start = rect.GetY() + R + i * bridgeWidth + i * cutLength
|
|
end = start + cutLength
|
|
|
|
x1, x2 = rect.GetX(), rect.GetX() + rect.GetWidth()
|
|
addLine(board, toKiCADPoint((x1, start)), toKiCADPoint((x1, end)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((x1, start)), toKiCADPoint((0, -1)), toKiCADPoint((1, 0)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((x1, end)), toKiCADPoint((0, 1)), toKiCADPoint((1, 0)), clearance)
|
|
addLine(board, toKiCADPoint((x2, start)), toKiCADPoint((x2, end)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((x2, start)), toKiCADPoint((0, -1)), toKiCADPoint((-1, 0)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((x2, end)), toKiCADPoint((0, 1)), toKiCADPoint((-1, 0)), clearance)
|
|
|
|
def addHole(board, position, radius):
|
|
circle = pcbnew.PCB_SHAPE()
|
|
circle.SetShape(STROKE_T.S_CIRCLE)
|
|
circle.SetCenter(toKiCADPoint((position[0], position[1])))
|
|
# Set 3'oclock point of the circle to set radius
|
|
circle.SetEnd(toKiCADPoint((position[0], position[1])) + toKiCADPoint((radius/2, 0)))
|
|
|
|
circle.SetWidth(radius)
|
|
circle.SetLayer(Layer.F_Paste)
|
|
board.Add(circle)
|
|
addBottomCounterpart(board, circle)
|
|
|
|
def addJigFrame(board, jigFrameSize, bridgeWidth=fromMm(2),
|
|
bridgeSpacing=fromMm(10), clearance=fromMm(0.5)):
|
|
"""
|
|
Given a Pcbnew board finds the board outline and creates a stencil for
|
|
KiKit's stencil jig.
|
|
|
|
Mainly, adds mounting holes and mouse bites to define the panel outline.
|
|
|
|
jigFrameSize is a tuple (width, height).
|
|
"""
|
|
bBox = findBoardBoundingBox(board)
|
|
frameSize = rectByCenter(rectCenter(bBox),
|
|
jigFrameSize[0] + 2 * (OUTER_BORDER + INNER_BORDER),
|
|
jigFrameSize[1] + 2 * (OUTER_BORDER + INNER_BORDER))
|
|
cutSize = rectByCenter(rectCenter(bBox),
|
|
jigFrameSize[0] + 2 * (OUTER_BORDER + INNER_BORDER) - fromMm(1),
|
|
jigFrameSize[1] + 2 * (OUTER_BORDER + INNER_BORDER) - fromMm(1))
|
|
addFrame(board, cutSize, bridgeWidth, bridgeSpacing, clearance)
|
|
|
|
for i in range(MOUNTING_HOLES_COUNT):
|
|
x = frameSize.GetX() + OUTER_BORDER / 2 + (i + 1) * (frameSize.GetWidth() - OUTER_BORDER) / (MOUNTING_HOLES_COUNT + 1)
|
|
addHole(board, toKiCADPoint((x, OUTER_BORDER / 2 + frameSize.GetY())), MOUNTING_HOLE_R)
|
|
addHole(board, toKiCADPoint((x, - OUTER_BORDER / 2 +frameSize.GetY() + frameSize.GetHeight())), MOUNTING_HOLE_R)
|
|
for i in range(MOUNTING_HOLES_COUNT):
|
|
y = frameSize.GetY() + OUTER_BORDER / 2 + (i + 1) * (frameSize.GetHeight() - OUTER_BORDER) / (MOUNTING_HOLES_COUNT + 1)
|
|
addHole(board, toKiCADPoint((OUTER_BORDER / 2 + frameSize.GetX(), y)), MOUNTING_HOLE_R)
|
|
addHole(board, toKiCADPoint((- OUTER_BORDER / 2 +frameSize.GetX() + frameSize.GetWidth(), y)), MOUNTING_HOLE_R)
|
|
|
|
PIN_TOLERANCE = fromMm(0.05)
|
|
addHole(board, tl(frameSize) + toKiCADPoint((OUTER_BORDER / 2, OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
addHole(board, tr(frameSize) + toKiCADPoint((-OUTER_BORDER / 2, OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
addHole(board, br(frameSize) + toKiCADPoint((-OUTER_BORDER / 2, -OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
addHole(board, bl(frameSize) + toKiCADPoint((OUTER_BORDER / 2, -OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
|
|
def jigMountingHoles(jigFrameSize, origin=toKiCADPoint((0, 0))):
|
|
""" Get list of all mounting holes in a jig of given size """
|
|
w, h = jigFrameSize
|
|
holes = [
|
|
toKiCADPoint((0, (w + INNER_BORDER) / 2)),
|
|
toKiCADPoint((0, -(w + INNER_BORDER) / 2)),
|
|
toKiCADPoint(((h + INNER_BORDER) / 2, 0)),
|
|
toKiCADPoint((-(h + INNER_BORDER) / 2, 0)),
|
|
]
|
|
return [x + origin for x in holes]
|
|
|
|
def createOuterPolygon(board, jigFrameSize, outerBorder):
|
|
bBox = findBoardBoundingBox(board)
|
|
centerpoint = rectCenter(bBox)
|
|
holes = jigMountingHoles(jigFrameSize, centerpoint)
|
|
|
|
outerSubstrate = Substrate(collectEdges(board, Layer.Edge_Cuts))
|
|
outerSubstrate.substrates = outerSubstrate.substrates.buffer(outerBorder)
|
|
tabs = []
|
|
for hole in holes:
|
|
tab, _ = outerSubstrate.tab(hole, centerpoint - hole, INNER_BORDER, maxHeight=fromMm(1000))
|
|
tabs.append(tab)
|
|
outerSubstrate.union(tabs)
|
|
outerSubstrate.union([Point(x).buffer(INNER_BORDER / 2) for x in holes])
|
|
outerSubstrate.millFillets(fromMm(3))
|
|
return outerSubstrate.exterior(), holes
|
|
|
|
def createOffsetPolygon(board, offset):
|
|
outerSubstrate = Substrate(collectEdges(board, Layer.Edge_Cuts))
|
|
outerSubstrate.substrates = outerSubstrate.substrates.buffer(offset)
|
|
return outerSubstrate.exterior()
|
|
|
|
def m2countersink():
|
|
HEAD_DIA = fromMm(4.5)
|
|
HOLE_LEN = fromMm(10)
|
|
SINK_EXTRA = fromMm(0.3)
|
|
sinkH = np.sqrt(HEAD_DIA**2 / 4)
|
|
|
|
sink = solid.cylinder(d1=0, d2=HEAD_DIA, h=sinkH)
|
|
sinkE = solid.cylinder(d=HEAD_DIA, h=SINK_EXTRA)
|
|
hole = solid.cylinder(h=HOLE_LEN, d=fromMm(2))
|
|
return sinkE + solid.utils.down(sinkH)(sink) + solid.utils.down(HOLE_LEN)(hole)
|
|
|
|
def mirrorX(linestring, origin):
|
|
return [(2 * origin - x, y) for x, y in linestring]
|
|
|
|
def makeRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder, innerBorder, tolerance, topSide):
|
|
bBox = findBoardBoundingBox(board)
|
|
centerpoint = rectCenter(bBox)
|
|
|
|
top = jigThickness - fromMm(0.15)
|
|
pcbBottom = jigThickness - pcbThickness
|
|
|
|
outerPolygon, holes = createOuterPolygon(board, jigFrameSize, outerBorder)
|
|
outerRing = outerPolygon.exterior.coords
|
|
if topSide:
|
|
outerRing = mirrorX(outerRing, centerpoint[0])
|
|
body = solid.linear_extrude(height=top, convexity=10)(solid.polygon(
|
|
outerRing))
|
|
|
|
innerRings = [x.exterior.coords for x in listGeometries(createOffsetPolygon(board, - innerBorder))]
|
|
if topSide:
|
|
innerRings = [mirrorX(innerRing, centerpoint[0]) for innerRing in innerRings]
|
|
|
|
innerCutout = solid.utils.down(jigThickness)(
|
|
solid.linear_extrude(height=3 * jigThickness, convexity=10)(solid.polygon(innerRings[0])))
|
|
for innerRing in innerRings[1:]:
|
|
innerCutout = innerCutout + solid.utils.down(jigThickness)(
|
|
solid.linear_extrude(height=3 * jigThickness, convexity=10)(solid.polygon(innerRing)))
|
|
registerRing = createOffsetPolygon(board, tolerance).exterior.coords
|
|
if topSide:
|
|
registerRing = mirrorX(registerRing, centerpoint[0])
|
|
registerCutout = solid.utils.up(jigThickness - pcbThickness)(
|
|
solid.linear_extrude(height=jigThickness, convexity=10)(solid.polygon(registerRing)))
|
|
|
|
register = body - innerCutout - registerCutout
|
|
for hole in holes:
|
|
register = register - solid.translate([hole[0], hole[1], top])(m2countersink())
|
|
return solid.scale(toMm(1))(
|
|
solid.translate([-centerpoint[0], -centerpoint[1], 0])(register))
|
|
|
|
def makeTopRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder=fromMm(3), innerBorder=fromMm(1),
|
|
tolerance=fromMm(0.05)):
|
|
"""
|
|
Create a SolidPython representation of the top register
|
|
"""
|
|
return makeRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder, innerBorder, tolerance, True)
|
|
|
|
def makeBottomRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder=fromMm(3), innerBorder=fromMm(1),
|
|
tolerance=fromMm(0.05)):
|
|
"""
|
|
Create a SolidPython representation of the top register
|
|
"""
|
|
return makeRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder, innerBorder, tolerance, False)
|
|
|
|
def renderScad(infile, outfile):
|
|
infile = os.path.abspath(infile)
|
|
outfile = os.path.abspath(outfile)
|
|
try:
|
|
subprocess.run(["openscad", "-o", outfile, infile],
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
message = f"Cannot render {outfile}, OpenSCAD error:\n"
|
|
message += (e.stdout.decode("utf-8") + "\n") if e.stdout is not None else ""
|
|
message += (e.stderr.decode("utf-8") + "\n") if e.stderr is not None else ""
|
|
raise RuntimeError(message)
|
|
except FileNotFoundError as e:
|
|
message = f"OpenSCAD is not available.\n"
|
|
message += f"Did you install it? Program `openscad` has to be in PATH"
|
|
raise RuntimeError(message)
|
|
|
|
def shapelyToSHAPE_POLY_SET(polygon):
|
|
p = pcbnew.SHAPE_POLY_SET()
|
|
p.AddOutline(linestringToKicad(polygon.exterior))
|
|
return p
|
|
|
|
def cutoutComponents(board, components):
|
|
topCutout = extractComponentPolygons(components, pcbnew.F_CrtYd)
|
|
for polygon in topCutout:
|
|
zone = pcbnew.PCB_SHAPE()
|
|
zone.SetShape(STROKE_T.S_POLYGON)
|
|
zone.SetPolyShape(shapelyToSHAPE_POLY_SET(polygon))
|
|
zone.SetLayer(Layer.F_Paste)
|
|
board.Add(zone)
|
|
bottomCutout = extractComponentPolygons(components, pcbnew.B_CrtYd)
|
|
for polygon in bottomCutout:
|
|
zone = pcbnew.PCB_SHAPE()
|
|
zone.SetShape(STROKE_T.S_POLYGON)
|
|
zone.SetPolyShape(shapelyToSHAPE_POLY_SET(polygon))
|
|
zone.SetLayer(Layer.B_Paste)
|
|
board.Add(zone)
|
|
|
|
def setStencilLayerVisibility(boardName):
|
|
prlPath = os.path.splitext(boardName)[0] + ".kicad_prl"
|
|
try:
|
|
with open(prlPath, encoding="utf-8") as f:
|
|
# We use ordered dict, so we preserve the ordering of the keys and
|
|
# thus, formatting
|
|
prl = json.load(f, object_pairs_hook=OrderedDict)
|
|
except FileNotFoundError:
|
|
# KiCAD didn't generate project local settings, let's create an empty one
|
|
prl = {
|
|
"board": {}
|
|
}
|
|
prl["board"]["visible_layers"] = "ffc000c_7ffffffe"
|
|
prl["board"]["visible_items"] = [
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
9,
|
|
10,
|
|
12,
|
|
13,
|
|
21,
|
|
22,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
34,
|
|
35
|
|
]
|
|
with open(prlPath, "w", encoding="utf-8") as f:
|
|
json.dump(prl, f, indent=2)
|
|
pass
|
|
|
|
from pathlib import Path
|
|
import os
|
|
|
|
def create(inputboard, outputdir, jigsize, jigthickness, pcbthickness,
|
|
registerborder, tolerance, ignore, cutout):
|
|
board = pcbnew.LoadBoard(inputboard)
|
|
refs = parseReferences(ignore)
|
|
removeComponents(board, refs)
|
|
|
|
Path(outputdir).mkdir(parents=True, exist_ok=True)
|
|
|
|
jigsize = (fromMm(jigsize[0]), fromMm(jigsize[1]))
|
|
addJigFrame(board, jigsize)
|
|
cutoutComponents(board, getComponents(board, parseReferences(cutout)))
|
|
|
|
stencilFile = os.path.join(outputdir, "stencil.kicad_pcb")
|
|
board.Save(stencilFile)
|
|
|
|
setStencilLayerVisibility(stencilFile)
|
|
|
|
plotPlan = [
|
|
# name, id, comment
|
|
("PasteBottom", pcbnew.B_Paste, "Paste Bottom"),
|
|
("PasteTop", pcbnew.F_Paste, "Paste top"),
|
|
]
|
|
# get a copy of exportSettingsJlcpcb dictionary and
|
|
# exclude the Edge.Cuts layer for creation of stencil gerber files
|
|
exportSettings = exportSettingsJlcpcb.copy()
|
|
exportSettings["ExcludeEdgeLayer"] = True
|
|
gerberDir = os.path.join(outputdir, "gerber")
|
|
gerberImpl(stencilFile, gerberDir, plotPlan, False, exportSettings)
|
|
|
|
shutil.make_archive(os.path.join(outputdir, "gerbers"), "zip", gerberDir)
|
|
|
|
jigthickness = fromMm(jigthickness)
|
|
pcbthickness = fromMm(pcbthickness)
|
|
outerBorder, innerBorder = fromMm(registerborder[0]), fromMm(registerborder[1])
|
|
tolerance = fromMm(tolerance)
|
|
topRegister = makeTopRegister(board, jigsize,jigthickness, pcbthickness,
|
|
outerBorder, innerBorder, tolerance)
|
|
bottomRegister = makeBottomRegister(board, jigsize,jigthickness, pcbthickness,
|
|
outerBorder, innerBorder, tolerance)
|
|
|
|
topRegisterFile = os.path.join(outputdir, "topRegister.scad")
|
|
solid.scad_render_to_file(topRegister, topRegisterFile)
|
|
renderScad(topRegisterFile, os.path.join(outputdir, "topRegister.stl"))
|
|
|
|
bottomRegisterFile = os.path.join(outputdir, "bottomRegister.scad")
|
|
solid.scad_render_to_file(bottomRegister, bottomRegisterFile)
|
|
renderScad(bottomRegisterFile, os.path.join(outputdir, "bottomRegister.stl"))
|
|
|
|
def printedStencilSubstrate(outlineDxf, thickness, frameHeight, frameWidth, frameClearance):
|
|
bodyOffset = solid.utils.up(0) if frameWidth + frameClearance == 0 else solid.offset(r=frameWidth + frameClearance)
|
|
body = solid.linear_extrude(height=thickness + frameHeight)(
|
|
bodyOffset(solid.import_dxf(outlineDxf)))
|
|
boardOffset = solid.utils.up(0) if frameClearance == 0 else solid.offset(r=frameClearance)
|
|
board = solid.utils.up(thickness)(
|
|
solid.linear_extrude(height=thickness + frameHeight)(
|
|
boardOffset(solid.import_dxf(outlineDxf))))
|
|
return body - board
|
|
|
|
def getComponents(board, references):
|
|
"""
|
|
Return a list of components based on designator
|
|
"""
|
|
return [f for f in board.GetFootprints() if f.GetReference() in references]
|
|
|
|
def collectFootprintEdges(footprint, layer):
|
|
"""
|
|
Return all edges on given layer in given footprint
|
|
"""
|
|
return [e for e in footprint.GraphicalItems() if e.GetLayer() == layer]
|
|
|
|
def extractComponentPolygons(footprints, srcLayer):
|
|
"""
|
|
Return a list of shapely polygons with holes for already placed components.
|
|
The source layer defines the geometry on which the cutout is computed.
|
|
Usually it a font or back courtyard
|
|
"""
|
|
polygons = []
|
|
for f in footprints:
|
|
edges = collectFootprintEdges(f, srcLayer)
|
|
for ring in extractRings(edges):
|
|
polygons.append(toShapely(ring, edges))
|
|
return polygons
|
|
|
|
def printedStencil(outlineDxf, holesDxf, extraHoles, thickness, frameHeight, frameWidth,
|
|
frameClearance, enlargeHoles, front):
|
|
zScale = -1 if front else 1
|
|
xRotate = 180 if front else 0
|
|
substrate = solid.scale([1, 1, zScale])(printedStencilSubstrate(outlineDxf,
|
|
thickness, frameHeight, frameWidth, frameClearance))
|
|
holesOffset = solid.utils.up(0) if enlargeHoles == 0 else solid.offset(delta=enlargeHoles)
|
|
holes = solid.linear_extrude(height=4*thickness, center=True)(
|
|
holesOffset(solid.import_dxf(holesDxf)))
|
|
substrate -= holes
|
|
for h in extraHoles:
|
|
substrate -= solid.scale([toMm(1), -toMm(1), 1])(
|
|
solid.linear_extrude(height=4*thickness, center=True)(
|
|
solid.polygon(h.exterior.coords)))
|
|
return solid.rotate(a=xRotate, v=[1, 0, 0])(substrate)
|
|
|
|
def createPrinted(inputboard, outputdir, pcbthickness, thickness, framewidth,
|
|
ignore, cutout, frameclearance, enlargeholes):
|
|
"""
|
|
Create a 3D printed self-registering stencil.
|
|
"""
|
|
board = pcbnew.LoadBoard(inputboard)
|
|
refs = parseReferences(ignore)
|
|
cutoutComponents = getComponents(board, parseReferences(cutout))
|
|
removeComponents(board, refs)
|
|
Path(outputdir).mkdir(parents=True, exist_ok=True)
|
|
|
|
# We create the stencil based on DXF export. Using it avoids the necessity
|
|
# to interpret KiCAD PAD shapes which constantly change with newer and newer
|
|
# versions.
|
|
height = min(pcbthickness, max(0.5, pcbthickness - 0.3))
|
|
bottomPaste, topPaste, outline = pasteDxfExport(board, outputdir)
|
|
# On Windows, OpenSCAD requires to use forward slashes instead of backslashes,
|
|
# hence, the replacement:
|
|
if os.name == "nt":
|
|
bottomPaste = bottomPaste.replace("\\", "/")
|
|
topPaste = topPaste.replace("\\", "/")
|
|
outline = outline.replace("\\", "/")
|
|
|
|
topCutout = extractComponentPolygons(cutoutComponents, pcbnew.F_CrtYd)
|
|
bottomCutout = extractComponentPolygons(cutoutComponents, pcbnew.B_CrtYd)
|
|
topStencil = printedStencil(outline, topPaste, topCutout, thickness, height,
|
|
framewidth, frameclearance, enlargeholes, True)
|
|
bottomStencil = printedStencil(outline, bottomPaste, bottomCutout, thickness,
|
|
height, framewidth, frameclearance, enlargeholes, False)
|
|
|
|
bottomStencilFile = os.path.join(outputdir, "bottomStencil.scad")
|
|
solid.scad_render_to_file(bottomStencil, bottomStencilFile,
|
|
file_header=f'$fa = 0.4; $fs = 0.4;', include_orig_code=True)
|
|
renderScad(bottomStencilFile, os.path.join(outputdir, "bottomStencil.stl"))
|
|
|
|
topStencilFile = os.path.join(outputdir, "topStencil.scad")
|
|
solid.scad_render_to_file(topStencil, topStencilFile,
|
|
file_header=f'$fa = 0.4; $fs = 0.4;', include_orig_code=True)
|
|
renderScad(topStencilFile, os.path.join(outputdir, "topStencil.stl"))
|
|
|
|
|
|
|
|
|
|
|
|
************************************************/
|