K2
[bort-board.git] / bom / ibom.html
CommitLineData
51129dfe
IS
1<!DOCTYPE html>\r
2<html lang="en">\r
3\r
4<head>\r
5 <meta charset="UTF-8">\r
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">\r
7 <title>Interactive BOM for KiCAD</title>\r
8 <style type="text/css">\r
9:root {\r
10 --pcb-edge-color: black;\r
11 --pad-color: #878787;\r
12 --pad-color-highlight: #D04040;\r
13 --pin1-outline-color: #ffb629;\r
14 --pin1-outline-color-highlight: #b4ff03;\r
15}\r
16\r
17html, body {\r
18 margin: 0px;\r
19 height: 100%;\r
20 font-family: Verdana, sans-serif;\r
21}\r
22\r
23.dark {\r
24 --pcb-edge-color: #eee;\r
25 --pad-color: #808080;\r
26 --pin1-outline-color: #ffa800;\r
27 --pin1-outline-color-highlight: #ccff00;\r
28 background-color: #252c30;\r
29 color: #eee;\r
30}\r
31\r
32button {\r
33 background-color: #eee;\r
34 border: 1px solid #888;\r
35 color: black;\r
36 height: 44px;\r
37 width: 44px;\r
38 text-align: center;\r
39 text-decoration: none;\r
40 display: inline-block;\r
41 font-size: 14px;\r
42 font-weight: bolder;\r
43}\r
44\r
45.dark button {\r
46 /* This will be inverted */\r
47 background-color: #c3b7b5;\r
48}\r
49\r
50button.depressed {\r
51 background-color: #0a0;\r
52 color: white;\r
53}\r
54\r
55.dark button.depressed {\r
56 /* This will be inverted */\r
57 background-color: #b3b;\r
58}\r
59\r
60button:focus {\r
61 outline: 0;\r
62}\r
63\r
64button#tb-btn {\r
65 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");\r
66 background-size: 32px 32px;\r
67 background-position: 5px 5px;\r
68 background-repeat: no-repeat;\r
69}\r
70\r
71button#lr-btn {\r
72 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");\r
73 background-size: 32px 32px;\r
74 background-position: 5px 5px;\r
75 background-repeat: no-repeat;\r
76}\r
77\r
78button#bom-btn {\r
79 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");\r
80 background-size: 32px 32px;\r
81 background-position: 5px 5px;\r
82 background-repeat: no-repeat;\r
83}\r
84\r
85button#copy {\r
86 background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");\r
87 background-position: 6px 6px;\r
88 background-repeat: no-repeat;\r
89 background-size: 26px 26px;\r
90 border-radius: 6px;\r
91 height: 40px;\r
92 width: 40px;\r
93 margin: 10px 5px;\r
94}\r
95\r
96button#copy:active {\r
97 box-shadow: inset 0px 0px 5px #6c6c6c;\r
98}\r
99\r
100textarea.clipboard-temp {\r
101 position: fixed;\r
102 top: 0;\r
103 left: 0;\r
104 width: 2em;\r
105 height: 2em;\r
106 padding: 0;\r
107 border: None;\r
108 outline: None;\r
109 box-shadow: None;\r
110 background: transparent;\r
111}\r
112\r
113.left-most-button {\r
114 border-right: 0;\r
115 border-top-left-radius: 6px;\r
116 border-bottom-left-radius: 6px;\r
117}\r
118\r
119.middle-button {\r
120 border-right: 0;\r
121}\r
122\r
123.right-most-button {\r
124 border-top-right-radius: 6px;\r
125 border-bottom-right-radius: 6px;\r
126}\r
127\r
128.button-container {\r
129 font-size: 0;\r
130}\r
131\r
132.dark .button-container {\r
133 filter: invert(1);\r
134}\r
135\r
136@media print {\r
137 .hideonprint {\r
138 display: none;\r
139 }\r
140}\r
141\r
142canvas {\r
143 cursor: crosshair;\r
144}\r
145\r
146canvas:active {\r
147 cursor: grabbing;\r
148}\r
149\r
150.fileinfo {\r
151 width: 100%;\r
152 max-width: 1000px;\r
153 border: none;\r
154 padding: 5px;\r
155}\r
156\r
157.fileinfo .title {\r
158 font-size: 20pt;\r
159 font-weight: bold;\r
160}\r
161\r
162.fileinfo td {\r
163 overflow: hidden;\r
164 white-space: nowrap;\r
165 max-width: 1px;\r
166 width: 50%;\r
167 text-overflow: ellipsis;\r
168}\r
169\r
170.bom {\r
171 border-collapse: collapse;\r
172 font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;\r
173 font-size: 10pt;\r
174 table-layout: fixed;\r
175 width: 100%;\r
176 margin-top: 1px;\r
177}\r
178\r
179.bom th, .bom td {\r
180 border: 1px solid black;\r
181 padding: 5px;\r
182 word-wrap: break-word;\r
183 text-align: center;\r
184 position: relative;\r
185}\r
186\r
187.dark .bom th, .dark .bom td {\r
188 border: 1px solid #777;\r
189}\r
190\r
191.bom th {\r
192 background-color: #CCCCCC;\r
193 background-clip: padding-box;\r
194}\r
195\r
196.dark .bom th {\r
197 background-color: #3b4749;\r
198}\r
199\r
200.bom tr.highlighted:nth-child(n) {\r
201 background-color: #cfc;\r
202}\r
203\r
204.dark .bom tr.highlighted:nth-child(n) {\r
205 background-color: #226022;\r
206}\r
207\r
208.bom tr:nth-child(even) {\r
209 background-color: #f2f2f2;\r
210}\r
211\r
212.dark .bom tr:nth-child(even) {\r
213 background-color: #313b40;\r
214}\r
215\r
216.bom tr {\r
217 transition: background-color 0.2s;\r
218}\r
219\r
220.bom .numCol {\r
221 width: 25px;\r
222}\r
223\r
224.bom .Description {\r
225 width: 10%;\r
226}\r
227\r
228.bom .Part {\r
229 width: 10%;\r
230}\r
231\r
232.bom .Value {\r
233 width: 15%;\r
234}\r
235\r
236.bom .Quantity {\r
237 width: 65px;\r
238}\r
239\r
240.bom th .sortmark {\r
241 position: absolute;\r
242 right: 1px;\r
243 top: 1px;\r
244 margin-top: -5px;\r
245 border-width: 5px;\r
246 border-style: solid;\r
247 border-color: transparent transparent #221 transparent;\r
248 transform-origin: 50% 85%;\r
249 transition: opacity 0.2s, transform 0.4s;\r
250}\r
251\r
252.dark .bom th .sortmark {\r
253 filter: invert(1);\r
254}\r
255\r
256.bom th .sortmark.none {\r
257 opacity: 0;\r
258}\r
259\r
260.bom th .sortmark.desc {\r
261 transform: rotate(180deg);\r
262}\r
263\r
264.bom th:hover .sortmark.none {\r
265 opacity: 0.5;\r
266}\r
267\r
268.bom .bom-checkbox {\r
269 width: 30px;\r
270 position: relative;\r
271 user-select: none;\r
272 -moz-user-select: none;\r
273}\r
274\r
275.bom .bom-checkbox:before {\r
276 content: "";\r
277 position: absolute;\r
278 border-width: 15px;\r
279 border-style: solid;\r
280 border-color: #51829f transparent transparent transparent;\r
281 visibility: hidden;\r
282 top: -15px;\r
283}\r
284\r
285.bom .bom-checkbox:after {\r
286 content: "Double click to set/unset all";\r
287 position: absolute;\r
288 color: white;\r
289 top: -35px;\r
290 left: -26px;\r
291 background: #51829f;\r
292 padding: 5px 15px;\r
293 border-radius: 8px;\r
294 white-space: nowrap;\r
295 visibility: hidden;\r
296}\r
297\r
298.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {\r
299 visibility: visible;\r
300 transition: visibility 0.2s linear 1s;\r
301}\r
302\r
303.split {\r
304 -webkit-box-sizing: border-box;\r
305 -moz-box-sizing: border-box;\r
306 box-sizing: border-box;\r
307 overflow-y: auto;\r
308 overflow-x: hidden;\r
309 background-color: inherit;\r
310}\r
311\r
312.split.split-horizontal, .gutter.gutter-horizontal {\r
313 height: 100%;\r
314 float: left;\r
315}\r
316\r
317.gutter {\r
318 background-color: #ddd;\r
319 background-repeat: no-repeat;\r
320 background-position: 50%;\r
321 transition: background-color 0.3s;\r
322}\r
323\r
324.dark .gutter {\r
325 background-color: #777;\r
326}\r
327\r
328.gutter.gutter-horizontal {\r
329 background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');\r
330 cursor: ew-resize;\r
331 width: 5px;\r
332}\r
333\r
334.gutter.gutter-vertical {\r
335 background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');\r
336 cursor: ns-resize;\r
337 height: 5px;\r
338}\r
339\r
340.searchbox {\r
341 float: left;\r
342 height: 40px;\r
343 margin: 10px 5px;\r
344 padding: 12px 32px;\r
345 font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;\r
346 font-size: 18px;\r
347 box-sizing: border-box;\r
348 border: 1px solid #888;\r
349 border-radius: 6px;\r
350 outline: none;\r
351 background-color: #eee;\r
352 transition: background-color 0.2s, border 0.2s;\r
353 background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');\r
354 background-position: 10px 10px;\r
355 background-repeat: no-repeat;\r
356}\r
357\r
358.dark .searchbox {\r
359 background-color: #111;\r
360 color: #eee;\r
361}\r
362\r
363.searchbox::placeholder {\r
364 color: #ccc;\r
365}\r
366\r
367.dark .searchbox::placeholder {\r
368 color: #666;\r
369}\r
370\r
371.filter {\r
372 width: calc(60% - 64px);\r
373}\r
374\r
375.reflookup {\r
376 width: calc(40% - 10px);\r
377}\r
378\r
379input[type=text]:focus {\r
380 background-color: white;\r
381 border: 1px solid #333;\r
382}\r
383\r
384.dark input[type=text]:focus {\r
385 background-color: #333;\r
386 border: 1px solid #ccc;\r
387}\r
388\r
389mark.highlight {\r
390 background-color: #5050ff;\r
391 color: #fff;\r
392 padding: 2px;\r
393 border-radius: 6px;\r
394}\r
395\r
396.dark mark.highlight {\r
397 background-color: #76a6da;\r
398 color: #111;\r
399}\r
400\r
401.menubtn {\r
402 background-color: white;\r
403 font-size: 16px;\r
404 border: none;\r
405 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");\r
406 background-position: center;\r
407 background-repeat: no-repeat;\r
408}\r
409\r
410.dark .menubtn {\r
411 filter: invert(1);\r
412}\r
413\r
414.menu {\r
415 position: relative;\r
416 display: inline-block;\r
417}\r
418\r
419.menu-content {\r
420 display: none;\r
421 position: absolute;\r
422 background-color: white;\r
423 right: 0;\r
424 min-width: 300px;\r
425 box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);\r
426 z-index: 100;\r
427 padding: 8px;\r
428}\r
429\r
430.dark .menu-content {\r
431 background-color: #111;\r
432}\r
433\r
434.menu:hover .menu-content {\r
435 display: block;\r
436}\r
437\r
438.menu:hover .menubtn {\r
439 background-color: #eee;\r
440}\r
441\r
442.dark .menu:hover .menubtn {}\r
443\r
444.menu-label {\r
445 display: inline-block;\r
446 padding: 8px;\r
447 border: 1px solid #ccc;\r
448 border-top: 0;\r
449 width: calc(100% - 18px);\r
450}\r
451\r
452.menu-label-top {\r
453 border-top: 1px solid #ccc;\r
454}\r
455\r
456.menu-textbox {\r
457 float: left;\r
458 height: 24px;\r
459 margin: 10px 5px;\r
460 padding: 5px 5px;\r
461 font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;\r
462 font-size: 14px;\r
463 box-sizing: border-box;\r
464 border: 1px solid #888;\r
465 border-radius: 4px;\r
466 outline: none;\r
467 background-color: #eee;\r
468 transition: background-color 0.2s, border 0.2s;\r
469 width: calc(100% - 10px);\r
470}\r
471\r
472.dark .menu-textbox {\r
473 background-color: #222;\r
474 color: #eee;\r
475}\r
476\r
477#topmostdiv {\r
478 transition: background-color 0.3s;\r
479}\r
480\r
481#top {\r
482 height: 78px;\r
483 border-bottom: 2px solid black;\r
484}\r
485\r
486.dark #top {\r
487 border-bottom: 2px solid #ccc;\r
488}\r
489\r
490#dbg {\r
491 display: block;\r
492}\r
493\r
494::-webkit-scrollbar {\r
495 width: 8px;\r
496}\r
497\r
498::-webkit-scrollbar-track {\r
499 background: #aaa;\r
500}\r
501\r
502::-webkit-scrollbar-thumb {\r
503 background: #666;\r
504 border-radius: 3px;\r
505}\r
506\r
507::-webkit-scrollbar-thumb:hover {\r
508 background: #555;\r
509}\r
510\r
511.slider {\r
512 -webkit-appearance: none;\r
513 width: 100%;\r
514 margin: 3px 0;\r
515 padding: 0;\r
516 outline: none;\r
517 opacity: 0.7;\r
518 -webkit-transition: .2s;\r
519 transition: opacity .2s;\r
520 border-radius: 3px;\r
521}\r
522\r
523.slider:hover {\r
524 opacity: 1;\r
525}\r
526\r
527.slider:focus {\r
528 outline: none;\r
529}\r
530\r
531.slider::-webkit-slider-runnable-track {\r
532 -webkit-appearance: none;\r
533 width: 100%;\r
534 height: 8px;\r
535 background: #d3d3d3;\r
536 border-radius: 3px;\r
537 border: none;\r
538}\r
539\r
540.slider::-webkit-slider-thumb {\r
541 -webkit-appearance: none;\r
542 width: 15px;\r
543 height: 15px;\r
544 border-radius: 50%;\r
545 background: #0a0;\r
546 cursor: pointer;\r
547 margin-top: -4px;\r
548}\r
549\r
550.dark .slider::-webkit-slider-thumb {\r
551 background: #3d3;\r
552}\r
553\r
554.slider::-moz-range-thumb {\r
555 width: 15px;\r
556 height: 15px;\r
557 border-radius: 50%;\r
558 background: #0a0;\r
559 cursor: pointer;\r
560}\r
561\r
562.slider::-moz-range-track {\r
563 height: 8px;\r
564 background: #d3d3d3;\r
565 border-radius: 3px;\r
566}\r
567\r
568.dark .slider::-moz-range-thumb {\r
569 background: #3d3;\r
570}\r
571\r
572.slider::-ms-track {\r
573 width: 100%;\r
574 height: 8px;\r
575 border-width: 3px 0;\r
576 background: transparent;\r
577 border-color: transparent;\r
578 color: transparent;\r
579 transition: opacity .2s;\r
580}\r
581\r
582.slider::-ms-fill-lower {\r
583 background: #d3d3d3;\r
584 border: none;\r
585 border-radius: 3px;\r
586}\r
587\r
588.slider::-ms-fill-upper {\r
589 background: #d3d3d3;\r
590 border: none;\r
591 border-radius: 3px;\r
592}\r
593\r
594.slider::-ms-thumb {\r
595 width: 15px;\r
596 height: 15px;\r
597 border-radius: 50%;\r
598 background: #0a0;\r
599 cursor: pointer;\r
600 margin: 0;\r
601}\r
602\r
603.shameless-plug {\r
604 font-size: 0.8em;\r
605 text-align: center;\r
606 display: block;\r
607}\r
608\r
609.shameless-plug a {\r
610 color: #0278a4;\r
611}\r
612\r
613.dark .shameless-plug a {\r
614 color: #00b9fd;\r
615}\r
616\r
617 </style>\r
618 <script type="text/javascript" >\r
619///////////////////////////////////////////////\r
620/*\r
621 Split.js - v1.3.5\r
622 MIT License\r
623 https://github.com/nathancahill/Split.js\r
624*/\r
625!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});\r
626\r
627///////////////////////////////////////////////\r
628\r
629///////////////////////////////////////////////\r
630var config = {"redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "layer_view": "FB"}\r
631///////////////////////////////////////////////\r
632\r
633///////////////////////////////////////////////\r
273f8d46 634var pcbdata = {"font_data": {"J": {"l": [[[0.5238095238095237, -1.0476190476190474], [0.5238095238095237, -0.3333333333333333], [0.47619047619047616, -0.19047619047619047], [0.38095238095238093, -0.09523809523809523], [0.23809523809523808, -0.047619047619047616], [0.14285714285714285, -0.047619047619047616]]], "w": 0.7619047619047619}, "*": {"l": [[[0.38095238095238093, -1.0476190476190474], [0.38095238095238093, -0.8095238095238095]], [[0.14285714285714285, -0.9047619047619047], [0.38095238095238093, -0.8095238095238095], [0.6190476190476191, -0.9047619047619047]], [[0.23809523809523808, -0.6190476190476191], [0.38095238095238093, -0.8095238095238095], [0.5238095238095237, -0.6190476190476191]]], "w": 0.7619047619047619}, "N": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.8095238095238094, -0.047619047619047616], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "1": {"l": [[[0.7619047619047619, -0.047619047619047616], [0.19047619047619047, -0.047619047619047616]], [[0.47619047619047616, -0.047619047619047616], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -0.9047619047619047], [0.2857142857142857, -0.8095238095238095], [0.19047619047619047, -0.7619047619047619]]], "w": 0.9523809523809523}, "P": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "3": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.7619047619047619, -1.0476190476190474], [0.42857142857142855, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.2857142857142857, -0.047619047619047616], [0.19047619047619047, -0.09523809523809523], [0.14285714285714285, -0.14285714285714285]]], "w": 0.9523809523809523}, "2": {"l": [[[0.19047619047619047, -0.9523809523809523], [0.23809523809523808, -1.0], [0.3333333333333333, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666666, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.7619047619047619], [0.7142857142857142, -0.6190476190476191], [0.14285714285714285, -0.047619047619047616], [0.7619047619047619, -0.047619047619047616]]], "w": 0.9523809523809523}, "5": {"l": [[[0.7142857142857142, -1.0476190476190474], [0.23809523809523808, -1.0476190476190474], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6190476190476191], [0.3333333333333333, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.14285714285714285]]], "w": 0.9523809523809523}, "4": {"l": [[[0.6666666666666666, -0.7142857142857142], [0.6666666666666666, -0.047619047619047616]], [[0.42857142857142855, -1.0952380952380951], [0.19047619047619047, -0.38095238095238093], [0.8095238095238095, -0.38095238095238093]]], "w": 0.9523809523809523}, "7": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.8095238095238095, -1.0476190476190474], [0.38095238095238093, -0.047619047619047616]]], "w": 0.9523809523809523}, "6": {"l": [[[0.6666666666666666, -1.0476190476190474], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -1.0], [0.3333333333333333, -0.9523809523809523], [0.23809523809523808, -0.8095238095238095], [0.19047619047619047, -0.6190476190476191], [0.19047619047619047, -0.23809523809523808], [0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.47619047619047616], [0.7142857142857142, -0.5714285714285714], [0.6666666666666666, -0.6190476190476191], [0.5714285714285714, -0.6666666666666666], [0.38095238095238093, -0.6666666666666666], [0.2857142857142857, -0.6190476190476191], [0.23809523809523808, -0.5714285714285714], [0.19047619047619047, -0.47619047619047616]]], "w": 0.9523809523809523}, "9": {"l": [[[0.2857142857142857, -0.047619047619047616], [0.47619047619047616, -0.047619047619047616], [0.5714285714285714, -0.09523809523809523], [0.6190476190476191, -0.14285714285714285], [0.7142857142857142, -0.2857142857142857], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.8571428571428571], [0.7142857142857142, -0.9523809523809523], [0.6666666666666666, -1.0], [0.5714285714285714, -1.0476190476190474], [0.38095238095238093, -1.0476190476190474], [0.2857142857142857, -1.0], [0.23809523809523808, -0.9523809523809523], [0.19047619047619047, -0.8571428571428571], [0.19047619047619047, -0.6190476190476191], [0.23809523809523808, -0.5238095238095237], [0.2857142857142857, -0.47619047619047616], [0.38095238095238093, -0.42857142857142855], [0.5714285714285714, -0.42857142857142855], [0.6666666666666666, -0.47619047619047616], [0.7142857142857142, -0.5238095238095237], [0.7619047619047619, -0.6190476190476191]]], "w": 0.9523809523809523}, "8": {"l": [[[0.38095238095238093, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.23809523809523808, -0.7142857142857142], [0.19047619047619047, -0.8095238095238095], [0.19047619047619047, -0.8571428571428571], [0.23809523809523808, -0.9523809523809523], [0.2857142857142857, -1.0], [0.38095238095238093, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666666, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.8095238095238095], [0.7142857142857142, -0.7142857142857142], [0.6666666666666666, -0.6666666666666666], [0.5714285714285714, -0.6190476190476191], [0.38095238095238093, -0.6190476190476191], [0.2857142857142857, -0.5714285714285714], [0.23809523809523808, -0.5238095238095237], [0.19047619047619047, -0.42857142857142855], [0.19047619047619047, -0.23809523809523808], [0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.42857142857142855], [0.7142857142857142, -0.5238095238095237], [0.6666666666666666, -0.5714285714285714], [0.5714285714285714, -0.6190476190476191]]], "w": 0.9523809523809523}, "R": {"l": [[[0.8095238095238094, -0.047619047619047616], [0.4761904761904761, -0.5238095238095237]], [[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "U": {"l": [[[0.23809523809523803, -1.0476190476190474], [0.23809523809523803, -0.23809523809523808], [0.28571428571428564, -0.14285714285714285], [0.33333333333333326, -0.09523809523809523], [0.4285714285714285, -0.047619047619047616], [0.619047619047619, -0.047619047619047616], [0.7142857142857142, -0.09523809523809523], [0.7619047619047619, -0.14285714285714285], [0.8095238095238094, -0.23809523809523808], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}}, "modules": [{"layer": "F", "center": [94.726, 64.5], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [94.726, 64.5], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H1", "bbox": {"pos": [92.250999, 62.024998999999994], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [94.726, 144.00199999999998], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [94.726, 144.00199999999998], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H2", "bbox": {"pos": [92.250999, 141.526999], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [179.054, 144.00199999999998], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [179.054, 144.00199999999998], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H3", "bbox": {"pos": [176.57899899999998, 141.526999], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [179.054, 64.5], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [179.054, 64.5], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H4", "bbox": {"pos": [176.57899899999998, 62.024998999999994], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [99.298, 112.252], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 94.472], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 97.012], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 99.55199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 102.092], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 104.63199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 107.172], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 109.71199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 112.252], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J1", "bbox": {"pos": [95.66579899999999, 91.982799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [175.244, 137.652], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 119.872], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 122.41199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 124.952], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 127.49199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 130.03199999999998], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 132.572], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 135.112], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 137.652], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J2", "bbox": {"pos": [171.611799, 117.38279899999999], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [99.298, 86.85199999999999], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 69.072], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 71.612], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 74.152], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 76.692], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 79.232], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 81.77199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 84.312], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 86.85199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J3", "bbox": {"pos": [95.66579899999999, 66.582799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [175.244, 86.85199999999999], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 69.072], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 71.612], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 74.152], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 76.692], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 79.232], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 81.77199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 84.312], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 86.85199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J4", "bbox": {"pos": [171.611799, 66.582799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [99.298, 137.652], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 119.872], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 122.41199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 124.952], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 127.49199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 130.03199999999998], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 132.572], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 135.112], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 137.652], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J5", "bbox": {"pos": [95.66579899999999, 117.38279899999999], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [175.244, 112.252], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 94.472], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 97.012], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 99.55199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 102.092], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 104.63199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 107.172], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 109.71199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 112.252], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J6", "bbox": {"pos": [171.611799, 91.982799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [134.477, 139.684], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [139.477, 139.684], "drillsize": [1.524, 1.524], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [2.032, 2.032]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [134.477, 139.684], "drillsize": [1.524, 1.524], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.032, 2.032]}], "drawings": [], "ref": "J7", "bbox": {"pos": [130.753999, 134.857999], "size": [11.557001999999999, 9.652002]}}, {"layer": "F", "center": [115.93499999999999, 141.081], "pads": [{"layers": ["F", "B"], "angle": -180.0, "pos": [115.93499999999999, 141.081], "drillsize": [1.02, 1.02], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.53, 1.53]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [118.475, 141.081], "drillsize": [1.02, 1.02], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.53, 1.53]}], "drawings": [], "ref": "J8", "bbox": {"pos": [114.38999899999999, 137.630999], "size": [5.630002, 6.905002]}}, {"layer": "F", "center": [111.23599999999999, 69.326], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 69.326], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 69.326], "drillsize": [1.016, 1.016], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}], "drawings": [], "ref": "P8", "bbox": {"pos": [109.460999, 67.55099899999999], "size": [6.100002, 59.450002]}}, {"layer": "F", "center": [159.75, 69.326], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 69.326], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 69.326], "drillsize": [1.016, 1.016], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}], "drawings": [], "ref": "P9", "bbox": {"pos": [157.974999, 67.55099899999999], "size": [6.100002, 59.450002]}}, {"layer": "F", "center": [105.648, 114.792], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 94.472], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 97.012], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 99.55199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 102.092], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 104.63199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 107.172], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 109.71199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 112.252], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 114.792], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN1", "bbox": {"pos": [104.122999, 92.94699899999999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [167.624, 89.392], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 69.072], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 71.612], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 74.152], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 76.692], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 79.232], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 81.77199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 84.312], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 86.85199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 89.392], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN2", "bbox": {"pos": [166.098999, 67.546999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [167.878, 140.192], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 119.872], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 122.41199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 124.952], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 127.49199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 130.03199999999998], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 132.572], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 135.112], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 137.652], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 140.192], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN3", "bbox": {"pos": [166.35299899999998, 118.346999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [105.648, 140.192], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 119.872], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 122.41199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 124.952], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 127.49199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 130.03199999999998], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 132.572], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 135.112], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 137.652], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 140.192], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN4", "bbox": {"pos": [104.122999, 118.346999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [105.648, 89.392], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 69.072], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 71.612], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 74.152], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 76.692], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 79.232], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 81.77199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 84.312], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 86.85199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 89.392], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN5", "bbox": {"pos": [104.122999, 67.546999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [167.624, 114.792], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 94.472], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 97.012], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 99.55199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 102.092], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 104.63199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 107.172], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 109.71199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 112.252], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 114.792], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN6", "bbox": {"pos": [166.098999, 92.94699899999999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [140.7, 108.94999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 91.17], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 91.17], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U1", "bbox": {"pos": [132.24179999999998, 90.128599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [140.7, 86.08999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 68.31], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 68.31], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U2", "bbox": {"pos": [132.24179999999998, 67.268599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [128.0, 131.81], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 114.03], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 114.03], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U3", "bbox": {"pos": [119.5418, 112.988599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [128.0, 108.94999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 91.17], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 91.17], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U4", "bbox": {"pos": [119.5418, 90.128599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [153.13, 131.81], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 114.03], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 114.03], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U5", "bbox": {"pos": [144.6718, 112.988599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [128.0, 86.08999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 68.31], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 68.31], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U6", "bbox": {"pos": [119.5418, 67.268599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [153.4, 86.08999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 68.31], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 68.31], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U7", "bbox": {"pos": [144.9418, 67.268599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [153.4, 108.94999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 91.17], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 91.17], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U8", "bbox": {"pos": [144.9418, 90.128599], "size": [9.2964, 19.862802]}}], "edges": [{"start": [182.60999999999999, 60.943999999999996], "end": [182.60999999999999, 147.558], "type": "segment", "width": 0.0025399999999999997}, {"start": [91.17, 60.943999999999996], "end": [182.60999999999999, 60.943999999999996], "type": "segment", "width": 0.0025399999999999997}, {"start": [91.17, 147.558], "end": [182.60999999999999, 147.558], "type": "segment", "width": 0.0025399999999999997}, {"start": [91.17, 60.943999999999996], "end": [91.17, 147.558], "type": "segment", "width": 0.0025399999999999997}], "bom": {"both": [[6, "74166", "NEW-DIP254P762X508-16", [["U3", 22], ["U4", 23], ["U5", 24], ["U6", 25], ["U7", 26], ["U8", 27]], []], [2, "4504", "NEW-DIP254P762X508-16", [["U1", 20], ["U2", 21]], []], [6, "4609X-101-103LF", "USE-SIP-9_P2.54mm", [["RN1", 14], ["RN2", 15], ["RN3", 16], ["RN4", 17], ["RN5", 18], ["RN6", 19]], []], [6, "CONN8_640456-8", "640456-8", [["J1", 4], ["J2", 5], ["J3", 6], ["J4", 7], ["J5", 8], ["J6", 9]], []], [1, "CON2_P5MM_VER_STERM-BLK", "796683-2", [["J7", 10]], []], [1, "640456-2", "TE_640456-2", [["J8", 11]], []], [2, "BeagleBone_Black_Header", "Socket_BeagleBone_Black", [["P8", 12], ["P9", 13]], []]], "B": [], "F": [[6, "74166", "NEW-DIP254P762X508-16", [["U3", 22], ["U4", 23], ["U5", 24], ["U6", 25], ["U7", 26], ["U8", 27]], []], [2, "4504", "NEW-DIP254P762X508-16", [["U1", 20], ["U2", 21]], []], [6, "4609X-101-103LF", "USE-SIP-9_P2.54mm", [["RN1", 14], ["RN2", 15], ["RN3", 16], ["RN4", 17], ["RN5", 18], ["RN6", 19]], []], [6, "CONN8_640456-8", "640456-8", [["J1", 4], ["J2", 5], ["J3", 6], ["J4", 7], ["J5", 8], ["J6", 9]], []], [1, "CON2_P5MM_VER_STERM-BLK", "796683-2", [["J7", 10]], []], [1, "640456-2", "TE_640456-2", [["J8", 11]], []], [2, "BeagleBone_Black_Header", "Socket_BeagleBone_Black", [["P8", 12], ["P9", 13]], []]]}, "silkscreen": {"B": [{"start": [99.298, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [175.244, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [99.298, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [175.244, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [99.298, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [175.244, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [131.2112, 139.684], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}], "F": [{"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J1", "thickness": 0.15, "pos": [96.50399999999999, 114.538], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [99.298, 112.252], "height": 1.0}, {"start": [101.838, 113.649], "end": [101.838, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [101.838, 93.075], "end": [95.869, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 93.075], "end": [95.869, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 113.649], "end": [101.838, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [99.298, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J2", "thickness": 0.15, "pos": [177.27599999999998, 140.192], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [175.244, 137.652], "height": 1.0}, {"start": [177.784, 139.049], "end": [177.784, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [177.784, 118.475], "end": [171.815, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 118.475], "end": [171.815, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 139.049], "end": [177.784, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [175.244, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J3", "thickness": 0.15, "pos": [96.25, 89.13799999999999], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [99.298, 86.85199999999999], "height": 1.0}, {"start": [101.838, 88.249], "end": [101.838, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [101.838, 67.675], "end": [95.869, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 67.675], "end": [95.869, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 88.249], "end": [101.838, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [99.298, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J4", "thickness": 0.15, "pos": [177.27599999999998, 89.392], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [175.244, 86.85199999999999], "height": 1.0}, {"start": [177.784, 88.249], "end": [177.784, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [177.784, 67.675], "end": [171.815, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 67.675], "end": [171.815, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 88.249], "end": [177.784, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [175.244, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J5", "thickness": 0.15, "pos": [96.50399999999999, 140.192], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [99.298, 137.652], "height": 1.0}, {"start": [101.838, 139.049], "end": [101.838, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [101.838, 118.475], "end": [95.869, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 118.475], "end": [95.869, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 139.049], "end": [101.838, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [99.298, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J6", "thickness": 0.15, "pos": [177.27599999999998, 114.792], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [175.244, 112.252], "height": 1.0}, {"start": [177.784, 113.649], "end": [177.784, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [177.784, 93.075], "end": [171.815, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 93.075], "end": [171.815, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 113.649], "end": [177.784, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [175.244, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J7", "thickness": 0.15, "pos": [130.667, 135.874], "height": 1.0}, {"start": [131.2112, 139.684], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [131.84619999999998, 135.06119999999999], "end": [131.84619999999998, 144.30679999999998], "type": "segment", "width": 0.15239999999999998}, {"start": [142.1078, 135.06119999999999], "end": [131.84619999999998, 135.06119999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [142.1078, 144.30679999999998], "end": [142.1078, 135.06119999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [131.84619999999998, 144.30679999999998], "end": [142.1078, 144.30679999999998], "type": "segment", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [134.477, 139.684], "height": 1.0}, {"width": 1.0003499999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J8", "thickness": 0.049999999999999996, "pos": [121.015, 143.62099999999998], "height": 1.0003499999999999}, {"start": [115.93499999999999, 137.831], "radius": 0.09999999999999999, "type": "circle", "width": 0.19999999999999998}, {"start": [119.74499999999999, 138.541], "end": [119.74499999999999, 144.261], "type": "segment", "width": 0.127}, {"start": [114.66499999999999, 138.541], "end": [119.74499999999999, 138.541], "type": "segment", "width": 0.127}, {"start": [114.66499999999999, 144.261], "end": [114.66499999999999, 138.541], "type": "segment", "width": 0.127}, {"start": [119.74499999999999, 144.261], "end": [114.66499999999999, 144.261], "type": "segment", "width": 0.127}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "P8", "thickness": 0.15, "pos": [110.47399999999999, 66.786], "height": 1.0}, {"start": [109.68599999999999, 67.776], "end": [109.68599999999999, 69.326], "type": "segment", "width": 0.15}, {"start": [112.506, 70.596], "end": [109.966, 70.596], "type": "segment", "width": 0.15}, {"start": [112.506, 68.056], "end": [112.506, 70.596], "type": "segment", "width": 0.15}, {"start": [111.23599999999999, 67.776], "end": [109.68599999999999, 67.776], "type": "segment", "width": 0.15}, {"start": [115.04599999999999, 68.056], "end": [112.506, 68.056], "type": "segment", "width": 0.15}, {"start": [115.04599999999999, 126.476], "end": [109.966, 126.476], "type": "segment", "width": 0.15}, {"start": [109.966, 126.476], "end": [109.966, 70.596], "type": "segment", "width": 0.15}, {"start": [115.04599999999999, 126.476], "end": [115.04599999999999, 68.056], "type": "segment", "width": 0.15}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "P9", "thickness": 0.15, "pos": [158.988, 66.786], "height": 1.0}, {"start": [158.2, 67.776], "end": [158.2, 69.326], "type": "segment", "width": 0.15}, {"start": [161.01999999999998, 70.596], "end": [158.48, 70.596], "type": "segment", "width": 0.15}, {"start": [161.01999999999998, 68.056], "end": [161.01999999999998, 70.596], "type": "segment", "width": 0.15}, {"start": [159.75, 67.776], "end": [158.2, 67.776], "type": "segment", "width": 0.15}, {"start": [163.56, 68.056], "end": [161.01999999999998, 68.056], "type": "segment", "width": 0.15}, {"start": [163.56, 126.476], "end": [158.48, 126.476], "type": "segment", "width": 0.15}, {"start": [158.48, 126.476], "end": [158.48, 70.596], "type": "segment", "width": 0.15}, {"start": [163.56, 126.476], "end": [163.56, 68.056], "type": "segment", "width": 0.15}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN1", "thickness": 0.15, "pos": [105.648, 117.332], "height": 1.0}, {"start": [107.048, 116.192], "end": [107.048, 115.692], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 116.192], "end": [107.048, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 115.692], "end": [104.24799999999999, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 93.092], "end": [104.24799999999999, 93.592], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 93.092], "end": [104.74799999999999, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 93.092], "end": [106.548, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 93.092], "end": [107.048, 93.592], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN2", "thickness": 0.15, "pos": [167.624, 91.932], "height": 1.0}, {"start": [169.024, 90.792], "end": [169.024, 90.292], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 90.792], "end": [169.024, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 90.292], "end": [166.224, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 67.692], "end": [166.224, 68.192], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 67.692], "end": [166.724, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 67.692], "end": [168.524, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 67.692], "end": [169.024, 68.192], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN3", "thickness": 0.15, "pos": [167.878, 142.732], "height": 1.0}, {"start": [169.278, 141.59199999999998], "end": [169.278, 141.09199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 141.59199999999998], "end": [169.278, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 141.09199999999998], "end": [166.47799999999998, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 118.49199999999999], "end": [166.47799999999998, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 118.49199999999999], "end": [166.97799999999998, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [169.278, 118.49199999999999], "end": [168.778, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [169.278, 118.49199999999999], "end": [169.278, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN4", "thickness": 0.15, "pos": [105.648, 142.732], "height": 1.0}, {"start": [107.048, 141.59199999999998], "end": [107.048, 141.09199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 141.59199999999998], "end": [107.048, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 141.09199999999998], "end": [104.24799999999999, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 118.49199999999999], "end": [104.24799999999999, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 118.49199999999999], "end": [104.74799999999999, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 118.49199999999999], "end": [106.548, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 118.49199999999999], "end": [107.048, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN5", "thickness": 0.15, "pos": [105.648, 91.932], "height": 1.0}, {"start": [107.048, 90.792], "end": [107.048, 90.292], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 90.792], "end": [107.048, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 90.292], "end": [104.24799999999999, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 67.692], "end": [104.24799999999999, 68.192], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 67.692], "end": [104.74799999999999, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 67.692], "end": [106.548, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 67.692], "end": [107.048, 68.192], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN6", "thickness": 0.15, "pos": [167.624, 117.332], "height": 1.0}, {"start": [169.024, 116.192], "end": [169.024, 115.692], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 116.192], "end": [169.024, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 115.692], "end": [166.224, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 93.092], "end": [166.224, 93.592], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 93.092], "end": [166.724, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 93.092], "end": [168.524, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 93.092], "end": [169.024, 93.592], "type": "segment", "width": 0.09999999999999999}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U1", "thickness": 0.049999999999999996, "pos": [136.12165, 88.6271], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [136.89, 90.20479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [136.5852, 90.20479999999999], "end": [134.4008, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [137.1948, 90.20479999999999], "end": [136.5852, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [139.811, 90.20479999999999], "end": [137.1948, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [133.969, 109.9152], "end": [139.811, 109.9152], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U2", "thickness": 0.049999999999999996, "pos": [136.12165, 65.7671], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [136.89, 67.34479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [136.5852, 67.34479999999999], "end": [134.4008, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [137.1948, 67.34479999999999], "end": [136.5852, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [139.811, 67.34479999999999], "end": [137.1948, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [133.969, 87.0552], "end": [139.811, 87.0552], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U3", "thickness": 0.049999999999999996, "pos": [123.42165, 111.4871], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [124.19, 113.06479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [123.8852, 113.06479999999999], "end": [121.7008, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [124.4948, 113.06479999999999], "end": [123.8852, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [127.11099999999999, 113.06479999999999], "end": [124.4948, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [121.26899999999999, 132.77519999999998], "end": [127.11099999999999, 132.77519999999998], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U4", "thickness": 0.049999999999999996, "pos": [123.42165, 88.6271], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [124.19, 90.20479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [123.8852, 90.20479999999999], "end": [121.7008, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [124.4948, 90.20479999999999], "end": [123.8852, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [127.11099999999999, 90.20479999999999], "end": [124.4948, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [121.26899999999999, 109.9152], "end": [127.11099999999999, 109.9152], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U5", "thickness": 0.049999999999999996, "pos": [148.55165, 111.4871], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [149.32, 113.06479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [149.0152, 113.06479999999999], "end": [146.83079999999998, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [149.6248, 113.06479999999999], "end": [149.0152, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [152.24099999999999, 113.06479999999999], "end": [149.6248, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [146.399, 132.77519999999998], "end": [152.24099999999999, 132.77519999999998], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U6", "thickness": 0.049999999999999996, "pos": [123.42165, 65.7671], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [124.19, 67.34479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [123.8852, 67.34479999999999], "end": [121.7008, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [124.4948, 67.34479999999999], "end": [123.8852, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [127.11099999999999, 67.34479999999999], "end": [124.4948, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [121.26899999999999, 87.0552], "end": [127.11099999999999, 87.0552], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U7", "thickness": 0.049999999999999996, "pos": [148.82165, 65.7671], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [149.59, 67.34479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [149.2852, 67.34479999999999], "end": [147.1008, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [149.8948, 67.34479999999999], "end": [149.2852, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [152.511, 67.34479999999999], "end": [149.8948, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [146.66899999999998, 87.0552], "end": [152.511, 87.0552], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U8", "thickness": 0.049999999999999996, "pos": [148.82165, 88.6271], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [149.59, 90.20479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [149.2852, 90.20479999999999], "end": [147.1008, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [149.8948, 90.20479999999999], "end": [149.2852, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [152.511, 90.20479999999999], "end": [149.8948, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [146.66899999999998, 109.9152], "end": [152.511, 109.9152], "type": "segment", "width": 0.15239999999999998}]}, "edges_bbox": {"minx": 91.168729, "miny": 60.942729, "maxx": 182.611271, "maxy": 147.559271}, "metadata": {"date": "2019-01-18", "company": "kremlinware unlimited", "revision": "K2", "title": "bort's brain"}}\r
51129dfe
IS
635///////////////////////////////////////////////\r
636\r
637///////////////////////////////////////////////\r
638/* Utility functions */\r
639\r
640var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +\r
641 pcbdata.metadata.revision + '__';\r
642var storage;\r
643\r
644function initStorage(key) {\r
645 try {\r
646 window.localStorage.getItem("blank");\r
647 storage = window.localStorage;\r
648 } catch (e) {\r
649 // localStorage not available\r
650 }\r
651 if (!storage) {\r
652 try {\r
653 window.sessionStorage.getItem("blank");\r
654 storage = window.sessionStorage;\r
655 } catch (e) {\r
656 // sessionStorage also not available\r
657 }\r
658 }\r
659}\r
660\r
661function readStorage(key) {\r
662 if (storage) {\r
663 return storage.getItem(storagePrefix + '#' + key);\r
664 } else {\r
665 return null;\r
666 }\r
667}\r
668\r
669function writeStorage(key, value) {\r
670 if (storage) {\r
671 storage.setItem(storagePrefix + '#' + key, value);\r
672 }\r
673}\r
674\r
675function fancyDblClickHandler(el, onsingle, ondouble) {\r
676 return function() {\r
677 if (el.getAttribute("data-dblclick") == null) {\r
678 el.setAttribute("data-dblclick", 1);\r
679 setTimeout(function() {\r
680 if (el.getAttribute("data-dblclick") == 1) {\r
681 onsingle();\r
682 }\r
683 el.removeAttribute("data-dblclick");\r
684 }, 200);\r
685 } else {\r
686 el.removeAttribute("data-dblclick");\r
687 ondouble();\r
688 }\r
689 }\r
690}\r
691\r
692function smoothScrollToRow(rowid) {\r
693 document.getElementById(rowid).scrollIntoView({\r
694 behavior: "smooth",\r
695 block: "center",\r
696 inline: "nearest"\r
697 });\r
698}\r
699\r
700function focusInputField(input) {\r
701 input.scrollIntoView(false);\r
702 input.focus();\r
703 input.select();\r
704}\r
705\r
706function copyToClipboard() {\r
707 var text = '';\r
708 for (var node of bomhead.childNodes[0].childNodes) {\r
709 if (node.firstChild) {\r
710 text = text + node.firstChild.nodeValue;\r
711 }\r
712 if (node != bomhead.childNodes[0].lastChild) {\r
713 text += '\t';\r
714 }\r
715 }\r
716 text += '\n';\r
717 for (var row of bombody.childNodes) {\r
718 for (var cell of row.childNodes) {\r
719 for (var node of cell.childNodes) {\r
720 if (node.nodeName == "INPUT") {\r
721 if (node.checked) {\r
722 text = text + '✓';\r
723 }\r
724 } else if (node.nodeName == "MARK") {\r
725 text = text + node.firstChild.nodeValue;\r
726 } else {\r
727 text = text + node.nodeValue;\r
728 }\r
729 }\r
730 if (cell != row.lastChild) {\r
731 text += '\t';\r
732 }\r
733 }\r
734 text += '\n';\r
735 }\r
736 var textArea = document.createElement("textarea");\r
737 textArea.classList.add('clipboard-temp');\r
738 textArea.value = text;\r
739\r
740 document.body.appendChild(textArea);\r
741 textArea.focus();\r
742 textArea.select();\r
743\r
744 try {\r
745 if (document.execCommand('copy')) {\r
746 console.log('Bom copied to clipboard.');\r
747 }\r
748 } catch (err) {\r
749 console.log('Can not copy to clipboard.');\r
750 }\r
751\r
752 document.body.removeChild(textArea);\r
753}\r
754\r
755function removeGutterNode(node) {\r
756 for (var i = 0; i < node.childNodes.length; i++) {\r
757 if (node.childNodes[i].classList &&\r
758 node.childNodes[i].classList.contains("gutter")) {\r
759 node.removeChild(node.childNodes[i]);\r
760 break;\r
761 }\r
762 }\r
763}\r
764\r
765function cleanGutters() {\r
766 removeGutterNode(document.getElementById("bot"));\r
767 removeGutterNode(document.getElementById("canvasdiv"));\r
768}\r
769\r
770var units = {\r
771 prefixes: {\r
772 giga: ["G", "g", "giga", "Giga", "GIGA"],\r
773 mega: ["M", "mega", "Mega", "MEGA"],\r
774 kilo: ["K", "k", "kilo", "Kilo", "KILO"],\r
775 milli: ["m", "milli", "Milli", "MILLI"],\r
776 micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ\r
777 nano: ["N", "n", "nano", "Nano", "NANO"],\r
778 pico: ["P", "p", "pico", "Pico", "PICO"],\r
779 },\r
780 unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],\r
781 unitsLong: [\r
782 "OHM", "Ohm", "ohm", "ohms",\r
783 "FARAD", "Farad", "farad",\r
784 "HENRY", "Henry", "henry"\r
785 ],\r
786 getMultiplier: function(s) {\r
787 if (this.prefixes.giga.includes(s)) return 1e9;\r
788 if (this.prefixes.mega.includes(s)) return 1e6;\r
789 if (this.prefixes.kilo.includes(s)) return 1e3;\r
790 if (this.prefixes.milli.includes(s)) return 1e-3;\r
791 if (this.prefixes.micro.includes(s)) return 1e-6;\r
792 if (this.prefixes.nano.includes(s)) return 1e-9;\r
793 if (this.prefixes.pico.includes(s)) return 1e-12;\r
794 return 1;\r
795 },\r
796 valueRegex: null,\r
797}\r
798\r
799function initUtils() {\r
800 var allPrefixes = units.prefixes.giga\r
801 .concat(units.prefixes.mega)\r
802 .concat(units.prefixes.kilo)\r
803 .concat(units.prefixes.milli)\r
804 .concat(units.prefixes.micro)\r
805 .concat(units.prefixes.nano)\r
806 .concat(units.prefixes.pico);\r
807 var allUnits = units.unitsShort.concat(units.unitsLong);\r
808 units.valueRegex = new RegExp("^([0-9\.]+)" +\r
809 "\\s*(" + allPrefixes.join("|") + ")?" +\r
810 "(" + allUnits.join("|") + ")?" +\r
811 "(\\b.*)?$", "");\r
812 units.valueAltRegex = new RegExp("^([0-9]*)" +\r
813 "(" + units.unitsShort.join("|") + ")?" +\r
814 "([GgMmKkUuNnPp])?" +\r
815 "([0-9]*)" +\r
816 "(\\b.*)?$", "");\r
817 for (var bomtable of Object.values(pcbdata.bom)) {\r
818 for (var row of bomtable) {\r
819 row.push(parseValue(row[1], row[3][0][0]));\r
820 }\r
821 }\r
822}\r
823\r
824function parseValue(val, ref) {\r
825 var inferUnit = (unit, ref) => {\r
826 if (unit) {\r
827 unit = unit.toLowerCase();\r
828 if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {\r
829 unit = 'r';\r
830 }\r
831 unit = unit[0];\r
832 } else {\r
833 ref = /^([a-z]+)\d+$/i.exec(ref);\r
834 if (ref) {\r
835 ref = ref[1].toLowerCase();\r
836 if (ref == "c") unit = 'f';\r
837 else if (ref == "l") unit = 'h';\r
838 else if (ref == "r" || ref == "rv") unit = 'r';\r
839 else unit = null;\r
840 }\r
841 }\r
842 return unit;\r
843 };\r
844 val = val.replace(/,/g, "");\r
845 var match = units.valueRegex.exec(val);\r
846 var unit;\r
847 if (match) {\r
848 val = parseFloat(match[1]);\r
849 if (match[2]) {\r
850 val = val * units.getMultiplier(match[2]);\r
851 }\r
852 unit = inferUnit(match[3], ref);\r
853 if (!unit) return null;\r
854 else return {\r
855 val: val,\r
856 unit: unit,\r
857 extra: match[4],\r
858 }\r
859 }\r
860 match = units.valueAltRegex.exec(val);\r
861 if (match && (match[1] || match[4])) {\r
862 val = parseFloat(match[1] + "." + match[4]);\r
863 if (match[3]) {\r
864 val = val * units.getMultiplier(match[3]);\r
865 }\r
866 unit = inferUnit(match[2], ref);\r
867 if (!unit) return null;\r
868 else return {\r
869 val: val,\r
870 unit: unit,\r
871 extra: match[5],\r
872 }\r
873 }\r
874 return null;\r
875}\r
876\r
877function valueCompare(a, b, stra, strb) {\r
878 if (a === null && b === null) {\r
879 // Failed to parse both values, compare them as strings.\r
880 if (stra != strb) return stra > strb ? 1 : -1;\r
881 else return 0;\r
882 } else if (a === null) {\r
883 return 1;\r
884 } else if (b === null) {\r
885 return -1;\r
886 } else {\r
887 if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;\r
888 else if (a.val != b.val) return a.val > b.val ? 1 : -1;\r
889 else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;\r
890 else return 0;\r
891 }\r
892}\r
893\r
894///////////////////////////////////////////////\r
895\r
896///////////////////////////////////////////////\r
897/* PCB rendering code */\r
898\r
899var redrawOnDrag = true;\r
900var boardRotation = 0;\r
901\r
902function deg2rad(deg) {\r
903 return deg * Math.PI / 180;\r
904}\r
905\r
906function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {\r
907 var point = [\r
908 linepoint[0] * text.width + offsetx,\r
909 linepoint[1] * text.height + offsety\r
910 ];\r
911 // Adding half a line height here is technically a bug\r
912 // but pcbnew currently does the same, text is slightly shifted.\r
913 point[0] -= (point[1] + text.height * 0.5) * tilt;\r
914 return point;\r
915}\r
916\r
917function drawtext(ctx, text, color, flip) {\r
918 ctx.save();\r
919 ctx.translate(...text.pos);\r
920 var angle = -text.angle;\r
921 if (text.attr.includes("mirrored")) {\r
922 ctx.scale(-1, 1);\r
923 angle = -angle;\r
924 }\r
925 var tilt = 0;\r
926 if (text.attr.includes("italic")) {\r
927 tilt = 0.125;\r
928 }\r
929 var interline = (text.height * 1.5 + text.thickness) / 2;\r
930 var txt = text.text.split("\n");\r
931 // KiCad ignores last empty line.\r
932 if (txt[txt.length-1] == '') txt.pop();\r
933 ctx.rotate(deg2rad(angle));\r
934 ctx.fillStyle = color;\r
935 ctx.strokeStyle = color;\r
936 ctx.lineCap = "round";\r
937 ctx.lineWidth = text.thickness;\r
938 for (var i in txt) {\r
939 var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;\r
940 var lineWidth = 0;\r
941 for (var c of txt[i]) {\r
942 lineWidth += pcbdata.font_data[c].w * text.width;\r
943 }\r
944 var offsetx = 0;\r
945 switch (text.horiz_justify) {\r
946 case -1:\r
947 // Justify left, do nothing\r
948 break;\r
949 case 0:\r
950 // Justify center\r
951 offsetx -= lineWidth / 2;\r
952 break;\r
953 case 1:\r
954 // Justify right\r
955 offsetx -= lineWidth;\r
956 break;\r
957 }\r
958 for (var c of txt[i]) {\r
959 for (var line of pcbdata.font_data[c].l) {\r
960 // Drawing each segment separately instead of\r
961 // polyline because round line caps don't work in joints\r
962 for (var i = 0; i < line.length - 1; i++) {\r
963 ctx.beginPath();\r
964 ctx.moveTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));\r
965 ctx.lineTo(...calcFontPoint(line[i + 1], text, offsetx, offsety, tilt));\r
966 ctx.stroke();\r
967 }\r
968 }\r
969 offsetx += pcbdata.font_data[c].w * text.width;\r
970 }\r
971 }\r
972 ctx.restore();\r
973}\r
974\r
975function drawedge(ctx, scalefactor, edge, color) {\r
976 ctx.strokeStyle = color;\r
977 ctx.lineWidth = Math.max(1 / scalefactor, edge.width);\r
978 ctx.lineCap = "round";\r
979 if (edge.type == "segment") {\r
980 ctx.beginPath();\r
981 ctx.moveTo(...edge.start);\r
982 ctx.lineTo(...edge.end);\r
983 ctx.stroke();\r
984 }\r
985 if (edge.type == "arc") {\r
986 ctx.beginPath();\r
987 ctx.arc(\r
988 ...edge.start,\r
989 edge.radius,\r
990 deg2rad(edge.startangle),\r
991 deg2rad(edge.endangle));\r
992 ctx.stroke();\r
993 }\r
994 if (edge.type == "circle") {\r
995 ctx.beginPath();\r
996 ctx.arc(\r
997 ...edge.start,\r
998 edge.radius,\r
999 0, 2 * Math.PI);\r
1000 ctx.closePath();\r
1001 ctx.stroke();\r
1002 }\r
1003}\r
1004\r
1005function drawRoundRect(ctx, color, size, radius, ctxmethod) {\r
1006 ctx.beginPath();\r
1007 ctx.strokeStyle = color;\r
1008 var x = size[0] * -0.5;\r
1009 var y = size[1] * -0.5;\r
1010 var width = size[0];\r
1011 var height = size[1];\r
1012 ctx.moveTo(x, 0);\r
1013 ctx.arcTo(x, y + height, x + width, y + height, radius);\r
1014 ctx.arcTo(x + width, y + height, x + width, y, radius);\r
1015 ctx.arcTo(x + width, y, x, y, radius);\r
1016 ctx.arcTo(x, y, x, y + height, radius);\r
1017 ctx.closePath();\r
1018 ctxmethod();\r
1019}\r
1020\r
1021function drawOblong(ctx, color, size, ctxmethod) {\r
1022 drawRoundRect(ctx, color, size, Math.min(size[0], size[1]) / 2, ctxmethod);\r
1023}\r
1024\r
1025function drawPolygons(ctx, color, polygons, ctxmethod) {\r
1026 ctx.fillStyle = color;\r
1027 for (var polygon of polygons) {\r
1028 ctx.beginPath();\r
1029 for (var vertex of polygon) {\r
1030 ctx.lineTo(...vertex)\r
1031 }\r
1032 ctx.closePath();\r
1033 ctxmethod();\r
1034 }\r
1035}\r
1036\r
1037function drawPolygonShape(ctx, shape, color) {\r
1038 ctx.save();\r
1039 ctx.translate(...shape.pos);\r
1040 ctx.rotate(deg2rad(-shape.angle));\r
1041 drawPolygons(ctx, color, shape.polygons, ctx.fill.bind(ctx));\r
1042 ctx.restore();\r
1043}\r
1044\r
1045function drawDrawing(ctx, layer, scalefactor, drawing, color) {\r
1046 if (["segment", "arc", "circle"].includes(drawing.type)) {\r
1047 drawedge(ctx, scalefactor, drawing, color);\r
1048 } else if (drawing.type == "polygon") {\r
1049 drawPolygonShape(ctx, drawing, color);\r
1050 } else {\r
1051 drawtext(ctx, drawing, color, layer == "B");\r
1052 }\r
1053}\r
1054\r
1055function drawCircle(ctx, radius, ctxmethod) {\r
1056 ctx.beginPath();\r
1057 ctx.arc(0, 0, radius, 0, 2 * Math.PI);\r
1058 ctx.closePath();\r
1059 ctxmethod();\r
1060}\r
1061\r
1062function drawPad(ctx, pad, color, outline) {\r
1063 ctx.save();\r
1064 ctx.translate(...pad.pos);\r
1065 ctx.rotate(deg2rad(pad.angle));\r
1066 if (pad.offset) {\r
1067 ctx.translate(...pad.offset);\r
1068 }\r
1069 ctx.fillStyle = color;\r
1070 ctx.strokeStyle = color;\r
1071 var ctxmethod = outline ? ctx.stroke.bind(ctx) : ctx.fill.bind(ctx);\r
1072 if (pad.shape == "rect") {\r
1073 var rect = [...pad.size.map(c => -c * 0.5), ...pad.size];\r
1074 if (outline) {\r
1075 ctx.strokeRect(...rect);\r
1076 } else {\r
1077 ctx.fillRect(...rect);\r
1078 }\r
1079 } else if (pad.shape == "oval") {\r
1080 drawOblong(ctx, color, pad.size, ctxmethod);\r
1081 } else if (pad.shape == "circle") {\r
1082 drawCircle(ctx, pad.size[0] / 2, ctxmethod);\r
1083 } else if (pad.shape == "roundrect") {\r
1084 drawRoundRect(ctx, color, pad.size, pad.radius, ctxmethod);\r
1085 } else if (pad.shape == "custom") {\r
1086 drawPolygons(ctx, color, pad.polygons, ctxmethod);\r
1087 }\r
1088 if (pad.type == "th" && !outline) {\r
1089 ctx.fillStyle = "#CCCCCC";\r
1090 if (pad.drillshape == "oblong") {\r
1091 drawOblong(ctx, "#CCCCCC", pad.drillsize, ctxmethod);\r
1092 } else {\r
1093 drawCircle(ctx, pad.drillsize[0] / 2, ctxmethod);\r
1094 }\r
1095 }\r
1096 ctx.restore();\r
1097}\r
1098\r
1099function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight) {\r
1100 if (highlight) {\r
1101 // draw bounding box\r
1102 if (module.layer == layer) {\r
1103 ctx.save();\r
1104 ctx.globalAlpha = 0.2;\r
1105 ctx.translate(...module.bbox.pos);\r
1106 ctx.fillStyle = padcolor;\r
1107 ctx.fillRect(\r
1108 0, 0,\r
1109 ...module.bbox.size);\r
1110 ctx.globalAlpha = 1;\r
1111 ctx.strokeStyle = padcolor;\r
1112 ctx.strokeRect(\r
1113 0, 0,\r
1114 ...module.bbox.size);\r
1115 ctx.restore();\r
1116 }\r
1117 }\r
1118 // draw drawings\r
1119 for (var drawing of module.drawings) {\r
1120 if (drawing.layer == layer) {\r
1121 drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);\r
1122 }\r
1123 }\r
1124 // draw pads\r
1125 for (var pad of module.pads) {\r
1126 if (pad.layers.includes(layer)) {\r
1127 drawPad(ctx, pad, padcolor, false);\r
1128 if (pad.pin1 && highlightpin1) {\r
1129 drawPad(ctx, pad, outlinecolor, true);\r
1130 }\r
1131 }\r
1132 }\r
1133}\r
1134\r
1135function drawEdges(canvas, scalefactor) {\r
1136 var ctx = canvas.getContext("2d");\r
1137 var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');\r
1138 for (var edge of pcbdata.edges) {\r
1139 drawedge(ctx, scalefactor, edge, edgecolor);\r
1140 }\r
1141}\r
1142\r
1143function drawModules(canvas, layer, scalefactor, highlightedModules) {\r
1144 var ctx = canvas.getContext("2d");\r
1145 ctx.lineWidth = 3 / scalefactor;\r
1146 var style = getComputedStyle(topmostdiv);\r
1147 var padcolor = style.getPropertyValue('--pad-color');\r
1148 var outlinecolor = style.getPropertyValue('--pin1-outline-color');\r
1149 if (highlightedModules.length > 0) {\r
1150 padcolor = style.getPropertyValue('--pad-color-highlight');\r
1151 outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');\r
1152 }\r
1153 for (var i = 0; i < pcbdata.modules.length; i++) {\r
1154 var mod = pcbdata.modules[i];\r
1155 var highlight = highlightedModules.includes(i);\r
1156 if (highlightedModules.length == 0 || highlight) {\r
1157 drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight);\r
1158 }\r
1159 }\r
1160}\r
1161\r
1162function drawSilkscreen(canvas, layer, scalefactor) {\r
1163 var ctx = canvas.getContext("2d");\r
1164 for (var d of pcbdata.silkscreen[layer]) {\r
1165 if (["segment", "arc", "circle"].includes(d.type)) {\r
1166 drawedge(ctx, scalefactor, d, "#aa4");\r
1167 } else if (d.type == "polygon") {\r
1168 drawPolygonShape(ctx, d, "#4aa");\r
1169 } else {\r
1170 drawtext(ctx, d, "#4aa", layer == "B");\r
1171 }\r
1172 }\r
1173}\r
1174\r
1175function clearCanvas(canvas) {\r
1176 var ctx = canvas.getContext("2d");\r
1177 ctx.save();\r
1178 ctx.setTransform(1, 0, 0, 1, 0, 0);\r
1179 ctx.clearRect(0, 0, canvas.width, canvas.height);\r
1180 ctx.restore();\r
1181}\r
1182\r
1183function drawHighlightsOnLayer(canvasdict) {\r
1184 clearCanvas(canvasdict.highlight);\r
1185 drawModules(canvasdict.highlight, canvasdict.layer,\r
1186 canvasdict.transform.s, highlightedModules);\r
1187}\r
1188\r
1189function drawHighlights() {\r
1190 drawHighlightsOnLayer(allcanvas.front);\r
1191 drawHighlightsOnLayer(allcanvas.back);\r
1192}\r
1193\r
1194function drawBackground(canvasdict) {\r
1195 clearCanvas(canvasdict.bg);\r
1196 clearCanvas(canvasdict.silk);\r
1197 drawEdges(canvasdict.bg, canvasdict.transform.s);\r
1198 drawModules(canvasdict.bg, canvasdict.layer, canvasdict.transform.s, []);\r
1199 drawSilkscreen(canvasdict.silk, canvasdict.layer, canvasdict.transform.s);\r
1200}\r
1201\r
1202function prepareCanvas(canvas, flip, transform) {\r
1203 var ctx = canvas.getContext("2d");\r
1204 ctx.setTransform(1, 0, 0, 1, 0, 0);\r
1205 var fontsize = 1.55;\r
1206 ctx.scale(transform.zoom, transform.zoom);\r
1207 ctx.translate(transform.panx, transform.pany);\r
1208 if (flip) {\r
1209 ctx.scale(-1, 1);\r
1210 }\r
1211 ctx.translate(transform.x, transform.y);\r
1212 ctx.rotate(deg2rad(boardRotation));\r
1213 ctx.scale(transform.s, transform.s);\r
1214}\r
1215\r
1216function prepareLayer(canvasdict) {\r
1217 var flip = (canvasdict.layer == "B");\r
1218 for (var c of ["bg", "silk", "highlight"]) {\r
1219 prepareCanvas(canvasdict[c], flip, canvasdict.transform);\r
1220 }\r
1221}\r
1222\r
1223function rotateVector(v, angle) {\r
1224 angle = deg2rad(angle);\r
1225 return [\r
1226 v[0] * Math.cos(angle) - v[1] * Math.sin(angle),\r
1227 v[0] * Math.sin(angle) + v[1] * Math.cos(angle)\r
1228 ];\r
1229}\r
1230\r
1231function applyRotation(bbox) {\r
1232 var corners = [\r
1233 [bbox.minx, bbox.miny],\r
1234 [bbox.minx, bbox.maxy],\r
1235 [bbox.maxx, bbox.miny],\r
1236 [bbox.maxx, bbox.maxy],\r
1237 ];\r
1238 corners = corners.map((v) => rotateVector(v, boardRotation));\r
1239 return {\r
1240 minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),\r
1241 miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),\r
1242 maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),\r
1243 maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),\r
1244 }\r
1245}\r
1246\r
1247function recalcLayerScale(canvasdict) {\r
1248 var canvasdivid = {\r
1249 "F": "frontcanvas",\r
1250 "B": "backcanvas"\r
1251 } [canvasdict.layer];\r
1252 var width = document.getElementById(canvasdivid).clientWidth * 2;\r
1253 var height = document.getElementById(canvasdivid).clientHeight * 2;\r
1254 var bbox = applyRotation(pcbdata.edges_bbox);\r
1255 var scalefactor = 0.98 * Math.min(\r
1256 width / (bbox.maxx - bbox.minx),\r
1257 height / (bbox.maxy - bbox.miny)\r
1258 );\r
1259 if (scalefactor < 0.1) {\r
1260 scalefactor = 1;\r
1261 }\r
1262 canvasdict.transform.s = scalefactor;\r
1263 var flip = (canvasdict.layer == "B");\r
1264 if (flip) {\r
1265 canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;\r
1266 } else {\r
1267 canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;\r
1268 }\r
1269 canvasdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;\r
1270 for (var c of ["bg", "silk", "highlight"]) {\r
1271 canvas = canvasdict[c];\r
1272 canvas.width = width;\r
1273 canvas.height = height;\r
1274 canvas.style.width = (width / 2) + "px";\r
1275 canvas.style.height = (height / 2) + "px";\r
1276 }\r
1277 console.log("Scale factor " + canvasdivid + ": ", canvasdict.transform);\r
1278}\r
1279\r
1280function redrawCanvas(layerdict) {\r
1281 prepareLayer(layerdict);\r
1282 drawBackground(layerdict);\r
1283 drawHighlightsOnLayer(layerdict);\r
1284}\r
1285\r
1286function resizeCanvas(layerdict) {\r
1287 recalcLayerScale(layerdict);\r
1288 redrawCanvas(layerdict);\r
1289}\r
1290\r
1291function resizeAll() {\r
1292 resizeCanvas(allcanvas.front);\r
1293 resizeCanvas(allcanvas.back);\r
1294}\r
1295\r
1296function bboxScan(layer, x, y) {\r
1297 var result = [];\r
1298 for (var i = 0; i < pcbdata.modules.length; i++) {\r
1299 var module = pcbdata.modules[i];\r
1300 if (module.layer == layer) {\r
1301 var b = module.bbox;\r
1302 if (b.pos[0] <= x && b.pos[0] + b.size[0] >= x &&\r
1303 b.pos[1] <= y && b.pos[1] + b.size[1] >= y) {\r
1304 result.push(i);\r
1305 }\r
1306 }\r
1307 }\r
1308 return result;\r
1309}\r
1310\r
1311function handleMouseDown(e, layerdict) {\r
1312 if (e.which != 1) {\r
1313 return;\r
1314 }\r
1315 e.preventDefault();\r
1316 e.stopPropagation();\r
1317 layerdict.transform.mousestartx = e.offsetX;\r
1318 layerdict.transform.mousestarty = e.offsetY;\r
1319 layerdict.transform.mousedownx = e.offsetX;\r
1320 layerdict.transform.mousedowny = e.offsetY;\r
1321 layerdict.transform.mousedown = true;\r
1322}\r
1323\r
1324function handleMouseClick(e, layerdict) {\r
1325 var x = e.offsetX;\r
1326 var y = e.offsetY;\r
1327 var t = layerdict.transform;\r
1328 if (layerdict.layer == "B") {\r
1329 x = (2 * x / t.zoom - t.panx + t.x) / -t.s;\r
1330 } else {\r
1331 x = (2 * x / t.zoom - t.panx - t.x) / t.s;\r
1332 }\r
1333 y = (2 * y / t.zoom - t.y - t.pany) / t.s;\r
1334 var v = rotateVector([x, y], -boardRotation);\r
1335 var modules = bboxScan(layerdict.layer, v[0], v[1]);\r
1336 if (modules.length > 0) {\r
1337 modulesClicked(modules);\r
1338 drawHighlights();\r
1339 }\r
1340}\r
1341\r
1342function handleMouseUp(e, layerdict) {\r
1343 e.preventDefault();\r
1344 e.stopPropagation();\r
1345 if (e.which == 1 &&\r
1346 layerdict.transform.mousedown &&\r
1347 layerdict.transform.mousedownx == e.offsetX &&\r
1348 layerdict.transform.mousedowny == e.offsetY) {\r
1349 // This is just a click\r
1350 handleMouseClick(e, layerdict);\r
1351 layerdict.transform.mousedown = false;\r
1352 return;\r
1353 }\r
1354 if (e.which == 3) {\r
1355 // Reset pan and zoom on right click.\r
1356 layerdict.transform.panx = 0;\r
1357 layerdict.transform.pany = 0;\r
1358 layerdict.transform.zoom = 1;\r
1359 redrawCanvas(layerdict);\r
1360 } else if (!redrawOnDrag) {\r
1361 redrawCanvas(layerdict);\r
1362 }\r
1363 layerdict.transform.mousedown = false;\r
1364}\r
1365\r
1366function handleMouseMove(e, layerdict) {\r
1367 if (!layerdict.transform.mousedown) {\r
1368 return;\r
1369 }\r
1370 e.preventDefault();\r
1371 e.stopPropagation();\r
1372 var dx = e.offsetX - layerdict.transform.mousestartx;\r
1373 var dy = e.offsetY - layerdict.transform.mousestarty;\r
1374 layerdict.transform.panx += 2 * dx / layerdict.transform.zoom;\r
1375 layerdict.transform.pany += 2 * dy / layerdict.transform.zoom;\r
1376 layerdict.transform.mousestartx = e.offsetX;\r
1377 layerdict.transform.mousestarty = e.offsetY;\r
1378 if (redrawOnDrag) {\r
1379 redrawCanvas(layerdict);\r
1380 }\r
1381}\r
1382\r
1383function handleMouseWheel(e, layerdict) {\r
1384 e.preventDefault();\r
1385 e.stopPropagation();\r
1386 var t = layerdict.transform;\r
1387 var wheeldelta = e.deltaY;\r
1388 if (e.deltaMode == 1) {\r
1389 // FF only, scroll by lines\r
1390 wheeldelta *= 30;\r
1391 } else if (e.deltaMode == 2) {\r
1392 wheeldelta *= 300;\r
1393 }\r
1394 var m = Math.pow(1.1, -wheeldelta / 40);\r
1395 // Limit amount of zoom per tick.\r
1396 if (m > 2) {\r
1397 m = 2;\r
1398 } else if (m < 0.5) {\r
1399 m = 0.5;\r
1400 }\r
1401 t.zoom *= m;\r
1402 var zoomd = (1 - m) / t.zoom;\r
1403 t.panx += 2 * e.offsetX * zoomd;\r
1404 t.pany += 2 * e.offsetY * zoomd;\r
1405 redrawCanvas(layerdict);\r
1406 console.log(layerdict.transform.zoom);\r
1407}\r
1408\r
1409function addMouseHandlers(div, layerdict) {\r
1410 div.onmousedown = function(e) {\r
1411 handleMouseDown(e, layerdict);\r
1412 };\r
1413 div.onmousemove = function(e) {\r
1414 handleMouseMove(e, layerdict);\r
1415 };\r
1416 div.onmouseup = function(e) {\r
1417 handleMouseUp(e, layerdict);\r
1418 };\r
1419 div.onmouseout = function(e) {\r
1420 handleMouseUp(e, layerdict);\r
1421 }\r
1422 div.onwheel = function(e) {\r
1423 handleMouseWheel(e, layerdict);\r
1424 }\r
1425 for (var element of [div, layerdict.bg, layerdict.silk, layerdict.highlight]) {\r
1426 element.addEventListener("contextmenu", function(e) {\r
1427 e.preventDefault();\r
1428 }, false);\r
1429 }\r
1430}\r
1431\r
1432function setRedrawOnDrag(value) {\r
1433 redrawOnDrag = value;\r
1434 writeStorage("redrawOnDrag", value);\r
1435}\r
1436\r
1437function setBoardRotation(value) {\r
1438 boardRotation = value * 5;\r
1439 writeStorage("boardRotation", boardRotation);\r
1440 document.getElementById("rotationDegree").textContent = boardRotation;\r
1441 resizeAll();\r
1442}\r
1443\r
1444function initRender() {\r
1445 allcanvas = {\r
1446 front: {\r
1447 transform: {\r
1448 x: 0,\r
1449 y: 0,\r
1450 s: 1,\r
1451 panx: 0,\r
1452 pany: 0,\r
1453 zoom: 1,\r
1454 mousestartx: 0,\r
1455 mousestarty: 0,\r
1456 mousedown: false,\r
1457 },\r
1458 bg: document.getElementById("F_bg"),\r
1459 silk: document.getElementById("F_slk"),\r
1460 highlight: document.getElementById("F_hl"),\r
1461 layer: "F",\r
1462 },\r
1463 back: {\r
1464 transform: {\r
1465 x: 0,\r
1466 y: 0,\r
1467 s: 1,\r
1468 panx: 0,\r
1469 pany: 0,\r
1470 zoom: 1,\r
1471 mousestartx: 0,\r
1472 mousestarty: 0,\r
1473 mousedown: false,\r
1474 },\r
1475 bg: document.getElementById("B_bg"),\r
1476 silk: document.getElementById("B_slk"),\r
1477 highlight: document.getElementById("B_hl"),\r
1478 layer: "B",\r
1479 }\r
1480 };\r
1481 addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);\r
1482 addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);\r
1483}\r
1484\r
1485///////////////////////////////////////////////\r
1486\r
1487///////////////////////////////////////////////\r
1488/* DOM manipulation and misc code */\r
1489\r
1490var bomsplit;\r
1491var canvassplit;\r
1492var canvaslayout = "default";\r
1493var bomlayout = "default";\r
1494var bomSortFunction = null;\r
1495var currentSortColumn = null;\r
1496var currentSortOrder = null;\r
1497var currentHighlightedRowId;\r
1498var highlightHandlers = [];\r
1499var highlightedModules = [];\r
1500var checkboxes = [];\r
1501var bomCheckboxes = "";\r
1502var highlightpin1 = false;\r
1503var lastClicked;\r
1504\r
1505function dbg(html) {\r
1506 dbgdiv.innerHTML = html;\r
1507}\r
1508\r
1509function setDarkMode(value) {\r
1510 if (value) {\r
1511 topmostdiv.classList.add("dark");\r
1512 } else {\r
1513 topmostdiv.classList.remove("dark");\r
1514 }\r
1515 writeStorage("darkmode", value);\r
1516 redrawCanvas(allcanvas.front);\r
1517 redrawCanvas(allcanvas.back);\r
1518}\r
1519\r
1520function setHighlightPin1(value) {\r
1521 writeStorage("highlightpin1", value);\r
1522 highlightpin1 = value;\r
1523 redrawCanvas(allcanvas.front);\r
1524 redrawCanvas(allcanvas.back);\r
1525}\r
1526\r
1527function getStoredCheckboxRefs(checkbox) {\r
1528 function convert(ref) {\r
1529 var intref = parseInt(ref);\r
1530 if (isNaN(intref)) {\r
1531 for (var i = 0; i < pcbdata.modules.length; i++) {\r
1532 if (pcbdata.modules[i].ref == ref) {\r
1533 return i;\r
1534 }\r
1535 }\r
1536 return -1;\r
1537 } else {\r
1538 return intref;\r
1539 }\r
1540 }\r
1541 var existingRefs = readStorage("checkbox_" + checkbox);\r
1542 if (!existingRefs) {\r
1543 return new Set();\r
1544 } else {\r
1545 return new Set(existingRefs.split(",").map(r => convert(r)));\r
1546 }\r
1547}\r
1548\r
1549function getCheckboxState(checkbox, references) {\r
1550 var storedRefsSet = getStoredCheckboxRefs(checkbox);\r
1551 var currentRefsSet = new Set(references.map(r => r[1]));\r
1552 // Get difference of current - stored\r
1553 var difference = new Set(currentRefsSet);\r
1554 for (ref of storedRefsSet) {\r
1555 difference.delete(ref);\r
1556 }\r
1557 if (difference.size == 0) {\r
1558 // All the current refs are stored\r
1559 return "checked";\r
1560 } else if (difference.size == currentRefsSet.size) {\r
1561 // None of the current refs are stored\r
1562 return "unchecked";\r
1563 } else {\r
1564 // Some of the refs are stored\r
1565 return "indeterminate";\r
1566 }\r
1567}\r
1568\r
1569function setBomCheckboxState(checkbox, element, references) {\r
1570 var state = getCheckboxState(checkbox, references);\r
1571 element.checked = (state == "checked");\r
1572 element.indeterminate = (state == "indeterminate");\r
1573}\r
1574\r
1575function createCheckboxChangeHandler(checkbox, references) {\r
1576 return function() {\r
1577 refsSet = getStoredCheckboxRefs(checkbox);\r
1578 if (this.checked) {\r
1579 // checkbox ticked\r
1580 for (var ref of references) {\r
1581 refsSet.add(ref[1]);\r
1582 }\r
1583 } else {\r
1584 // checkbox unticked\r
1585 for (var ref of references) {\r
1586 refsSet.delete(ref[1]);\r
1587 }\r
1588 }\r
1589 writeStorage("checkbox_" + checkbox, [...refsSet].join(","));\r
1590 }\r
1591}\r
1592\r
1593function createRowHighlightHandler(rowid, refs) {\r
1594 return function() {\r
1595 if (currentHighlightedRowId) {\r
1596 if (currentHighlightedRowId == rowid) {\r
1597 return;\r
1598 }\r
1599 document.getElementById(currentHighlightedRowId).classList.remove("highlighted");\r
1600 }\r
1601 document.getElementById(rowid).classList.add("highlighted");\r
1602 currentHighlightedRowId = rowid;\r
1603 highlightedModules = refs.map(r => r[1]);\r
1604 drawHighlights();\r
1605 }\r
1606}\r
1607\r
1608function entryMatches(entry) {\r
1609 // check refs\r
1610 for (var ref of entry[3]) {\r
1611 if (ref[0].toLowerCase().indexOf(filter) >= 0) {\r
1612 return true;\r
1613 }\r
1614 }\r
1615 // check value\r
1616 if (entry[1].toLowerCase().indexOf(filter) >= 0) {\r
1617 return true;\r
1618 }\r
1619 // check footprint\r
1620 if (entry[2].toLowerCase().indexOf(filter) >= 0) {\r
1621 return true;\r
1622 }\r
1623 return false;\r
1624}\r
1625\r
1626function findRefInEntry(entry) {\r
1627 return entry[3].filter(r => r[0].toLowerCase() == reflookup);\r
1628}\r
1629\r
1630function highlightFilter(s) {\r
1631 if (!filter) {\r
1632 return s;\r
1633 }\r
1634 var parts = s.toLowerCase().split(filter);\r
1635 if (parts.length == 1) {\r
1636 return s;\r
1637 }\r
1638 var r = "";\r
1639 var pos = 0;\r
1640 for (var i in parts) {\r
1641 if (i > 0) {\r
1642 r += '<mark class="highlight">' +\r
1643 s.substring(pos, pos + filter.length) +\r
1644 '</mark>';\r
1645 pos += filter.length;\r
1646 }\r
1647 r += s.substring(pos, pos + parts[i].length);\r
1648 pos += parts[i].length;\r
1649 }\r
1650 return r;\r
1651}\r
1652\r
1653function checkboxSetUnsetAllHandler(checkboxname) {\r
1654 return function() {\r
1655 var checkboxnum = 0;\r
1656 while (checkboxnum < checkboxes.length &&\r
1657 checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {\r
1658 checkboxnum++;\r
1659 }\r
1660 if (checkboxnum >= checkboxes.length) {\r
1661 return;\r
1662 }\r
1663 var allset = true;\r
1664 var checkbox;\r
1665 var row;\r
1666 for (row of bombody.childNodes) {\r
1667 checkbox = row.childNodes[checkboxnum + 1].childNodes[0];\r
1668 if (!checkbox.checked || checkbox.indeterminate) {\r
1669 allset = false;\r
1670 break;\r
1671 }\r
1672 }\r
1673 for (row of bombody.childNodes) {\r
1674 checkbox = row.childNodes[checkboxnum + 1].childNodes[0];\r
1675 checkbox.checked = !allset;\r
1676 checkbox.indeterminate = false;\r
1677 checkbox.onchange();\r
1678 }\r
1679 }\r
1680}\r
1681\r
1682function createColumnHeader(name, cls, comparator) {\r
1683 var th = document.createElement("TH");\r
1684 th.innerHTML = name;\r
1685 th.classList.add(cls);\r
1686 th.style.cursor = "pointer";\r
1687 var span = document.createElement("SPAN");\r
1688 span.classList.add("sortmark");\r
1689 span.classList.add("none");\r
1690 th.appendChild(span);\r
1691 th.onclick = function() {\r
1692 if (currentSortColumn && this !== currentSortColumn) {\r
1693 // Currently sorted by another column\r
1694 currentSortColumn.childNodes[1].classList.remove(currentSortOrder);\r
1695 currentSortColumn.childNodes[1].classList.add("none");\r
1696 currentSortColumn = null;\r
1697 currentSortOrder = null;\r
1698 }\r
1699 if (currentSortColumn && this === currentSortColumn) {\r
1700 // Already sorted by this column\r
1701 if (currentSortOrder == "asc") {\r
1702 // Sort by this column, descending order\r
1703 bomSortFunction = function(a, b) {\r
1704 return -comparator(a, b);\r
1705 }\r
1706 currentSortColumn.childNodes[1].classList.remove("asc");\r
1707 currentSortColumn.childNodes[1].classList.add("desc");\r
1708 currentSortOrder = "desc";\r
1709 } else {\r
1710 // Unsort\r
1711 bomSortFunction = null;\r
1712 currentSortColumn.childNodes[1].classList.remove("desc");\r
1713 currentSortColumn.childNodes[1].classList.add("none");\r
1714 currentSortColumn = null;\r
1715 currentSortOrder = null;\r
1716 }\r
1717 } else {\r
1718 // Sort by this column, ascending order\r
1719 bomSortFunction = comparator;\r
1720 currentSortColumn = this;\r
1721 currentSortColumn.childNodes[1].classList.remove("none");\r
1722 currentSortColumn.childNodes[1].classList.add("asc");\r
1723 currentSortOrder = "asc";\r
1724 }\r
1725 populateBomBody();\r
1726 }\r
1727 return th;\r
1728}\r
1729\r
1730function populateBomHeader() {\r
1731 while (bomhead.firstChild) {\r
1732 bomhead.removeChild(bomhead.firstChild);\r
1733 }\r
1734 var tr = document.createElement("TR");\r
1735 var th = document.createElement("TH");\r
1736 th.classList.add("numCol");\r
1737 tr.appendChild(th);\r
1738 checkboxes = bomCheckboxes.split(",").filter((e) => e);\r
1739 var checkboxCompareClosure = function(checkbox) {\r
1740 return (a, b) => {\r
1741 var stateA = getCheckboxState(checkbox, a[3]);\r
1742 var stateB = getCheckboxState(checkbox, b[3]);\r
1743 if (stateA > stateB) return -1;\r
1744 if (stateA < stateB) return 1;\r
1745 return 0;\r
1746 }\r
1747 }\r
1748 for (var checkbox of checkboxes) {\r
1749 th = createColumnHeader(\r
1750 checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));\r
1751 th.onclick = fancyDblClickHandler(\r
1752 th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));\r
1753 tr.appendChild(th);\r
1754 }\r
1755 tr.appendChild(createColumnHeader("References", "References", (a, b) => {\r
1756 var i = 0;\r
1757 while (i < a[3].length && i < b[3].length) {\r
1758 if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;\r
1759 i++;\r
1760 }\r
1761 return a[3].length - b[3].length;\r
1762 }));\r
1763 // Extra fields\r
1764 if (config.extra_fields.length > 0) {\r
1765 var extraFieldCompareClosure = function(fieldIndex) {\r
1766 return (a, b) => {\r
1767 var fa = a[4][fieldIndex];\r
1768 var fb = b[4][fieldIndex];\r
1769 if (fa != fb) return fa > fb ? 1 : -1;\r
1770 else return 0;\r
1771 }\r
1772 }\r
1773 for (var i in config.extra_fields) {\r
1774 tr.appendChild(createColumnHeader(\r
1775 config.extra_fields[i], "extra", extraFieldCompareClosure(i)));\r
1776 }\r
1777 }\r
1778 tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {\r
1779 return valueCompare(a[5], b[5], a[1], b[1]);\r
1780 }));\r
1781 tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {\r
1782 if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;\r
1783 else return 0;\r
1784 }));\r
1785 tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {\r
1786 return a[3].length - b[3].length;\r
1787 }));\r
1788 bomhead.appendChild(tr);\r
1789}\r
1790\r
1791function populateBomBody() {\r
1792 while (bom.firstChild) {\r
1793 bom.removeChild(bom.firstChild);\r
1794 }\r
1795 highlightHandlers = [];\r
1796 currentHighlightedRowId = null;\r
1797 var first = true;\r
1798 switch (canvaslayout) {\r
1799 case 'F':\r
1800 bomtable = pcbdata.bom.F;\r
1801 break;\r
1802 case 'FB':\r
1803 bomtable = pcbdata.bom.both;\r
1804 break;\r
1805 case 'B':\r
1806 bomtable = pcbdata.bom.B;\r
1807 break;\r
1808 }\r
1809 if (bomSortFunction) {\r
1810 bomtable = bomtable.slice().sort(bomSortFunction);\r
1811 }\r
1812 for (var i in bomtable) {\r
1813 var bomentry = bomtable[i];\r
1814 if (filter && !entryMatches(bomentry)) {\r
1815 continue;\r
1816 }\r
1817 var references = bomentry[3];\r
1818 if (reflookup) {\r
1819 references = findRefInEntry(bomentry);\r
1820 if (references.length == 0) {\r
1821 continue;\r
1822 }\r
1823 }\r
1824 var tr = document.createElement("TR");\r
1825 var td = document.createElement("TD");\r
1826 var rownum = +i + 1;\r
1827 tr.id = "bomrow" + rownum;\r
1828 td.textContent = rownum;\r
1829 tr.appendChild(td);\r
1830 // Checkboxes\r
1831 for (var checkbox of checkboxes) {\r
1832 if (checkbox) {\r
1833 td = document.createElement("TD");\r
1834 var input = document.createElement("input");\r
1835 input.type = "checkbox";\r
1836 input.onchange = createCheckboxChangeHandler(checkbox, references);\r
1837 setBomCheckboxState(checkbox, input, references);\r
1838 td.appendChild(input);\r
1839 tr.appendChild(td);\r
1840 }\r
1841 }\r
1842 // References\r
1843 td = document.createElement("TD");\r
1844 td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));\r
1845 tr.appendChild(td);\r
1846 // Extra fields\r
1847 for (var i in config.extra_fields) {\r
1848 td = document.createElement("TD");\r
1849 td.innerHTML = highlightFilter(bomentry[4][i]);\r
1850 tr.appendChild(td);\r
1851 }\r
1852 // Value\r
1853 td = document.createElement("TD");\r
1854 td.innerHTML = highlightFilter(bomentry[1]);\r
1855 tr.appendChild(td);\r
1856 // Footprint\r
1857 td = document.createElement("TD");\r
1858 td.innerHTML = highlightFilter(bomentry[2]);\r
1859 tr.appendChild(td);\r
1860 // Quantity\r
1861 td = document.createElement("TD");\r
1862 td.textContent = bomentry[3].length;\r
1863 tr.appendChild(td);\r
1864 bom.appendChild(tr);\r
1865 var handler = createRowHighlightHandler(tr.id, references);\r
1866 tr.onmousemove = handler;\r
1867 highlightHandlers.push({\r
1868 id: tr.id,\r
1869 handler: handler,\r
1870 refs: references\r
1871 });\r
1872 if ((filter || reflookup) && first) {\r
1873 handler();\r
1874 first = false;\r
1875 }\r
1876 }\r
1877}\r
1878\r
1879function highlightPreviousRow() {\r
1880 if (!currentHighlightedRowId) {\r
1881 highlightHandlers[highlightHandlers.length - 1].handler();\r
1882 } else {\r
1883 if (highlightHandlers.length > 1 &&\r
1884 highlightHandlers[0].id == currentHighlightedRowId) {\r
1885 highlightHandlers[highlightHandlers.length - 1].handler();\r
1886 } else {\r
1887 for (var i = 0; i < highlightHandlers.length - 1; i++) {\r
1888 if (highlightHandlers[i + 1].id == currentHighlightedRowId) {\r
1889 highlightHandlers[i].handler();\r
1890 break;\r
1891 }\r
1892 }\r
1893 }\r
1894 }\r
1895 smoothScrollToRow(currentHighlightedRowId);\r
1896}\r
1897\r
1898function highlightNextRow() {\r
1899 if (!currentHighlightedRowId) {\r
1900 highlightHandlers[0].handler();\r
1901 } else {\r
1902 if (highlightHandlers.length > 1 &&\r
1903 highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {\r
1904 highlightHandlers[0].handler();\r
1905 } else {\r
1906 for (var i = 1; i < highlightHandlers.length; i++) {\r
1907 if (highlightHandlers[i - 1].id == currentHighlightedRowId) {\r
1908 highlightHandlers[i].handler();\r
1909 break;\r
1910 }\r
1911 }\r
1912 }\r
1913 }\r
1914 smoothScrollToRow(currentHighlightedRowId);\r
1915}\r
1916\r
1917function populateBomTable() {\r
1918 populateBomHeader();\r
1919 populateBomBody();\r
1920}\r
1921\r
1922function modulesClicked(moduleIndexes) {\r
1923 var lastClickedIndex = moduleIndexes.indexOf(lastClicked);\r
1924 var index = moduleIndexes[(lastClickedIndex + 1) % moduleIndexes.length];\r
1925 for (var handler of highlightHandlers) {\r
1926 if (handler.refs.map(r => r[1]).indexOf(index) >= 0) {\r
1927 lastClicked = index;\r
1928 handler.handler();\r
1929 smoothScrollToRow(currentHighlightedRowId);\r
1930 break;\r
1931 }\r
1932 }\r
1933}\r
1934\r
1935function updateFilter(input) {\r
1936 filter = input.toLowerCase();\r
1937 populateBomTable();\r
1938}\r
1939\r
1940function updateRefLookup(input) {\r
1941 reflookup = input.toLowerCase();\r
1942 populateBomTable();\r
1943}\r
1944\r
1945function silkscreenVisible(visible) {\r
1946 if (visible) {\r
1947 allcanvas.front.silk.style.display = "";\r
1948 allcanvas.back.silk.style.display = "";\r
1949 writeStorage("silkscreenVisible", true);\r
1950 } else {\r
1951 allcanvas.front.silk.style.display = "none";\r
1952 allcanvas.back.silk.style.display = "none";\r
1953 writeStorage("silkscreenVisible", false);\r
1954 }\r
1955}\r
1956\r
1957function changeCanvasLayout(layout) {\r
1958 document.getElementById("fl-btn").classList.remove("depressed");\r
1959 document.getElementById("fb-btn").classList.remove("depressed");\r
1960 document.getElementById("bl-btn").classList.remove("depressed");\r
1961 switch (layout) {\r
1962 case 'F':\r
1963 document.getElementById("fl-btn").classList.add("depressed");\r
1964 if (bomlayout != "bom-only") {\r
1965 canvassplit.collapse(1);\r
1966 }\r
1967 break;\r
1968 case 'B':\r
1969 document.getElementById("bl-btn").classList.add("depressed");\r
1970 if (bomlayout != "bom-only") {\r
1971 canvassplit.collapse(0);\r
1972 }\r
1973 break;\r
1974 default:\r
1975 document.getElementById("fb-btn").classList.add("depressed");\r
1976 if (bomlayout != "bom-only") {\r
1977 canvassplit.setSizes([50, 50]);\r
1978 }\r
1979 }\r
1980 canvaslayout = layout;\r
1981 writeStorage("canvaslayout", layout);\r
1982 resizeAll();\r
1983 populateBomTable();\r
1984}\r
1985\r
1986function populateMetadata() {\r
1987 document.getElementById("title").innerHTML = pcbdata.metadata.title;\r
1988 document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;\r
1989 document.getElementById("company").innerHTML = pcbdata.metadata.company;\r
1990 document.getElementById("filedate").innerHTML = pcbdata.metadata.date;\r
1991 if (pcbdata.metadata.title != "") {\r
1992 document.title = pcbdata.metadata.title + " BOM";\r
1993 }\r
1994}\r
1995\r
1996function changeBomLayout(layout) {\r
1997 document.getElementById("bom-btn").classList.remove("depressed");\r
1998 document.getElementById("lr-btn").classList.remove("depressed");\r
1999 document.getElementById("tb-btn").classList.remove("depressed");\r
2000 switch (layout) {\r
2001 case 'bom-only':\r
2002 document.getElementById("bom-btn").classList.add("depressed");\r
2003 if (bomsplit) {\r
2004 bomsplit.destroy();\r
2005 bomsplit = null;\r
2006 canvassplit.destroy();\r
2007 canvassplit = null;\r
2008 }\r
2009 document.getElementById("frontcanvas").style.display = "none";\r
2010 document.getElementById("backcanvas").style.display = "none";\r
2011 document.getElementById("bot").style.height = "";\r
2012 break;\r
2013 case 'top-bottom':\r
2014 document.getElementById("tb-btn").classList.add("depressed");\r
2015 document.getElementById("frontcanvas").style.display = "";\r
2016 document.getElementById("backcanvas").style.display = "";\r
2017 document.getElementById("bot").style.height = "calc(100% - 80px)";\r
2018 document.getElementById("bomdiv").classList.remove("split-horizontal");\r
2019 document.getElementById("canvasdiv").classList.remove("split-horizontal");\r
2020 document.getElementById("frontcanvas").classList.add("split-horizontal");\r
2021 document.getElementById("backcanvas").classList.add("split-horizontal");\r
2022 if (bomsplit) {\r
2023 bomsplit.destroy();\r
2024 bomsplit = null;\r
2025 canvassplit.destroy();\r
2026 canvassplit = null;\r
2027 }\r
2028 bomsplit = Split(['#bomdiv', '#canvasdiv'], {\r
2029 sizes: [50, 50],\r
2030 onDragEnd: resizeAll,\r
2031 direction: "vertical",\r
2032 gutterSize: 5\r
2033 });\r
2034 canvassplit = Split(['#frontcanvas', '#backcanvas'], {\r
2035 sizes: [50, 50],\r
2036 gutterSize: 5,\r
2037 onDragEnd: resizeAll\r
2038 });\r
2039 break;\r
2040 case 'left-right':\r
2041 document.getElementById("lr-btn").classList.add("depressed");\r
2042 document.getElementById("frontcanvas").style.display = "";\r
2043 document.getElementById("backcanvas").style.display = "";\r
2044 document.getElementById("bot").style.height = "calc(100% - 80px)";\r
2045 document.getElementById("bomdiv").classList.add("split-horizontal");\r
2046 document.getElementById("canvasdiv").classList.add("split-horizontal");\r
2047 document.getElementById("frontcanvas").classList.remove("split-horizontal");\r
2048 document.getElementById("backcanvas").classList.remove("split-horizontal");\r
2049 if (bomsplit) {\r
2050 bomsplit.destroy();\r
2051 bomsplit = null;\r
2052 canvassplit.destroy();\r
2053 canvassplit = null;\r
2054 }\r
2055 bomsplit = Split(['#bomdiv', '#canvasdiv'], {\r
2056 sizes: [50, 50],\r
2057 onDragEnd: resizeAll,\r
2058 gutterSize: 5\r
2059 });\r
2060 canvassplit = Split(['#frontcanvas', '#backcanvas'], {\r
2061 sizes: [50, 50],\r
2062 gutterSize: 5,\r
2063 direction: "vertical",\r
2064 onDragEnd: resizeAll\r
2065 });\r
2066 }\r
2067 bomlayout = layout;\r
2068 writeStorage("bomlayout", layout);\r
2069 changeCanvasLayout(canvaslayout);\r
2070}\r
2071\r
2072function focusFilterField() {\r
2073 focusInputField(document.getElementById("filter"));\r
2074}\r
2075\r
2076function focusRefLookupField() {\r
2077 focusInputField(document.getElementById("reflookup"));\r
2078}\r
2079\r
2080function toggleBomCheckbox(bomrowid, checkboxnum) {\r
2081 if (!bomrowid || checkboxnum > checkboxes.length) {\r
2082 return;\r
2083 }\r
2084 var bomrow = document.getElementById(bomrowid);\r
2085 var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];\r
2086 checkbox.checked = !checkbox.checked;\r
2087 checkbox.indeterminate = false;\r
2088 checkbox.onchange();\r
2089}\r
2090\r
2091function checkBomCheckbox(bomrowid, checkboxname) {\r
2092 var checkboxnum = 0;\r
2093 while (checkboxnum < checkboxes.length &&\r
2094 checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {\r
2095 checkboxnum++;\r
2096 }\r
2097 if (!bomrowid || checkboxnum >= checkboxes.length) {\r
2098 return;\r
2099 }\r
2100 var bomrow = document.getElementById(bomrowid);\r
2101 var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];\r
2102 checkbox.checked = true;\r
2103 checkbox.indeterminate = false;\r
2104 checkbox.onchange();\r
2105}\r
2106\r
2107function setBomCheckboxes(value) {\r
2108 bomCheckboxes = value;\r
2109 writeStorage("bomCheckboxes", value);\r
2110 populateBomTable();\r
2111}\r
2112\r
2113document.onkeydown = function(e) {\r
2114 switch (e.key) {\r
2115 case "n":\r
2116 if (document.activeElement.type == "text") {\r
2117 return;\r
2118 }\r
2119 if (currentHighlightedRowId !== null) {\r
2120 checkBomCheckbox(currentHighlightedRowId, "placed");\r
2121 highlightNextRow();\r
2122 e.preventDefault();\r
2123 }\r
2124 break;\r
2125 case "ArrowUp":\r
2126 highlightPreviousRow();\r
2127 e.preventDefault();\r
2128 break;\r
2129 case "ArrowDown":\r
2130 highlightNextRow();\r
2131 e.preventDefault();\r
2132 break;\r
2133 default:\r
2134 break;\r
2135 }\r
2136 if (e.altKey) {\r
2137 switch (e.key) {\r
2138 case "f":\r
2139 focusFilterField();\r
2140 e.preventDefault();\r
2141 break;\r
2142 case "r":\r
2143 focusRefLookupField();\r
2144 e.preventDefault();\r
2145 break;\r
2146 case "z":\r
2147 changeBomLayout("bom-only");\r
2148 e.preventDefault();\r
2149 break;\r
2150 case "x":\r
2151 changeBomLayout("left-right");\r
2152 e.preventDefault();\r
2153 break;\r
2154 case "c":\r
2155 changeBomLayout("top-bottom");\r
2156 e.preventDefault();\r
2157 break;\r
2158 case "v":\r
2159 changeCanvasLayout("F");\r
2160 e.preventDefault();\r
2161 break;\r
2162 case "b":\r
2163 changeCanvasLayout("FB");\r
2164 e.preventDefault();\r
2165 break;\r
2166 case "n":\r
2167 changeCanvasLayout("B");\r
2168 e.preventDefault();\r
2169 break;\r
2170 default:\r
2171 break;\r
2172 }\r
2173 if (e.key >= '1' && e.key <= '9') {\r
2174 toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));\r
2175 }\r
2176 }\r
2177}\r
2178\r
2179function initDefaults() {\r
2180 bomlayout = readStorage("bomlayout");\r
2181 if (bomlayout === null) {\r
2182 bomlayout = config.bom_view;\r
2183 }\r
2184 if (!['bom-only', 'left-right', 'top-bottom'].includes(bomlayout)) {\r
2185 bomlayout = config.bom_view;\r
2186 }\r
2187 canvaslayout = readStorage("canvaslayout");\r
2188 if (canvaslayout === null) {\r
2189 canvaslayout = config.layer_view;\r
2190 }\r
2191 bomCheckboxes = readStorage("bomCheckboxes");\r
2192 if (bomCheckboxes === null) {\r
2193 bomCheckboxes = config.checkboxes;\r
2194 }\r
2195 document.getElementById("bomCheckboxes").value = bomCheckboxes;\r
2196\r
2197 var b = readStorage("silkscreenVisible");\r
2198 if (b === null) {\r
2199 b = config.show_silkscreen;\r
2200 }\r
2201 document.getElementById("silkscreenCheckbox").checked = b;\r
2202 silkscreenVisible(b);\r
2203\r
2204 b = readStorage("redrawOnDrag");\r
2205 if (b === null) {\r
2206 b = config.redraw_on_drag;\r
2207 }\r
2208 document.getElementById("dragCheckbox").checked = b;\r
2209 setRedrawOnDrag(b);\r
2210\r
2211 b = readStorage("darkmode");\r
2212 if (b === null) {\r
2213 b = config.dark_mode;\r
2214 }\r
2215 document.getElementById("darkmodeCheckbox").checked = b;\r
2216 setDarkMode(b);\r
2217\r
2218 b = readStorage("highlightpin1");\r
2219 if (b === null) {\r
2220 b = config.highlight_pin1;\r
2221 }\r
2222 document.getElementById("highlightpin1Checkbox").checked = b;\r
2223 setHighlightPin1(b);\r
2224\r
2225 boardRotation = readStorage("boardRotation");\r
2226 if (boardRotation === null) {\r
2227 boardRotation = config.board_rotation * 5;\r
2228 } else {\r
2229 boardRotation = parseInt(boardRotation);\r
2230 }\r
2231 document.getElementById("boardRotation").value = boardRotation / 5;\r
2232 document.getElementById("rotationDegree").textContent = boardRotation;\r
2233}\r
2234\r
2235window.onload = function(e) {\r
2236 initUtils();\r
2237 initRender();\r
2238 initStorage();\r
2239 initDefaults();\r
2240 cleanGutters();\r
2241 populateMetadata();\r
2242 dbgdiv = document.getElementById("dbg");\r
2243 bom = document.getElementById("bombody");\r
2244 bomhead = document.getElementById("bomhead");\r
2245 filter = "";\r
2246 reflookup = "";\r
2247 // Triggers render\r
2248 changeBomLayout(bomlayout);\r
2249}\r
2250\r
2251window.onresize = resizeAll;\r
2252window.matchMedia("print").addListener(resizeAll);\r
2253\r
2254///////////////////////////////////////////////\r
2255\r
2256 </script>\r
2257</head>\r
2258\r
2259<body>\r
2260<div id="topmostdiv" style="width: 100%; height: 100%">\r
2261 <div id="top">\r
2262 <div style="float: right;">\r
2263 <div class="hideonprint menu" style="float: right; margin: 10px; top: 8px;">\r
2264 <button class="menubtn"></button>\r
2265 <div class="menu-content">\r
2266 <label class="menu-label menu-label-top">\r
2267 <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">\r
2268 Dark mode\r
2269 </label>\r
2270 <label class="menu-label">\r
2271 <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">\r
2272 Show silkscreen\r
2273 </label>\r
2274 <label class="menu-label">\r
2275 <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">\r
2276 Highlight first pin\r
2277 </label>\r
2278 <label class="menu-label">\r
2279 <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">\r
2280 Continuous redraw on drag\r
2281 </label>\r
2282 <label class="menu-label">\r
2283 <span>Board rotation</span>\r
2284 <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>\r
2285 <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">\r
2286 </label>\r
2287 <label class="menu-label">\r
2288 <div style="margin-left: 5px">Bom checkboxes</div>\r
2289 <input id="bomCheckboxes" class="menu-textbox" type=text\r
2290 oninput="setBomCheckboxes(this.value)">\r
2291 </label>\r
2292 <label class="menu-label">\r
2293 <span class="shameless-plug">\r
2294 <span>Created using</span>\r
2295 <a target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>\r
2296 </span>\r
2297 </label>\r
2298 </div>\r
2299 </div>\r
2300 <div class="button-container hideonprint"\r
2301 style="float: right; margin: 10px; position: relative; top: 8px">\r
2302 <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"\r
2303 title="Front only">F\r
2304 </button>\r
2305 <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"\r
2306 title="Front and Back">FB\r
2307 </button>\r
2308 <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"\r
2309 title="Back only">B\r
2310 </button>\r
2311 </div>\r
2312 <div class="button-container hideonprint"\r
2313 style="float: right; margin: 10px; position: relative; top: 8px">\r
2314 <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"\r
2315 title="BOM only"></button>\r
2316 <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"\r
2317 title="BOM left, drawings right"></button>\r
2318 <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"\r
2319 title="BOM top, drawings bot"></button>\r
2320 </div>\r
2321 </div>\r
2322 <div id="fileinfodiv" style="overflow: auto;">\r
2323 <table class="fileinfo">\r
2324 <tbody>\r
2325 <tr>\r
2326 <td id="title" class="title" style="width: 70%">\r
2327 Title\r
2328 </td>\r
2329 <td id="revision" class="title" style="width: 30%">\r
2330 Revision\r
2331 </td>\r
2332 </tr>\r
2333 <tr>\r
2334 <td id="company">\r
2335 Kicad version\r
2336 </td>\r
2337 <td id="filedate">\r
2338 Date\r
2339 </td>\r
2340 </tr>\r
2341 </tbody>\r
2342 </table>\r
2343 </div>\r
2344 </div>\r
2345 <div id="bot" class="split" style="height: calc(100% - 80px)">\r
2346 <div id="bomdiv" class="split split-horizontal">\r
2347 <div style="width: 100%">\r
2348 <input id="reflookup" class="searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"\r
2349 oninput="updateRefLookup(this.value)">\r
2350 <input id="filter" class="searchbox filter hideonprint" type="text" placeholder="Filter"\r
2351 oninput="updateFilter(this.value)">\r
2352 <div class="button-container hideonprint" style="float: left">\r
2353 <button id="copy" title="Copy bom table to clipboard"\r
2354 onclick="copyToClipboard()"></button>\r
2355 </div>\r
2356 </div>\r
2357 <div id="dbg"></div>\r
2358 <table class="bom">\r
2359 <thead id="bomhead">\r
2360 </thead>\r
2361 <tbody id="bombody">\r
2362 </tbody>\r
2363 </table>\r
2364 </div>\r
2365 <div id="canvasdiv" class="split split-horizontal">\r
2366 <div id="frontcanvas" class="split" style="overflow: hidden">\r
2367 <div style="position: relative; width: 100%; height: 100%;">\r
2368 <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>\r
2369 <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>\r
2370 <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>\r
2371 </div>\r
2372 </div>\r
2373 <div id="backcanvas" class="split" style="overflow: hidden">\r
2374 <div style="position: relative; width: 100%; height: 100%;">\r
2375 <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>\r
2376 <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>\r
2377 <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>\r
2378 </div>\r
2379 </div>\r
2380 </div>\r
2381 </div>\r
2382</div>\r
2383</body>\r
2384\r
2385</html>\r