Files
feeder_mk2/pcb/mobo/bom/ibom.html

4346 lines
263 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html,
body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
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");
}
button#lr-btn {
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");
}
button#bom-btn {
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");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
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");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 10px 10px 10px 0px;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 5px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
position: relative;
}
.bom th,
.bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th,
.dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.bom .value {
width: 15%;
}
.bom .quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal,
.gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
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==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
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");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 10px 10px 10px 0px;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid,
.dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
width: 100%;
height: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
height: 78px;
border-bottom: 2px solid black;
}
.dark #top {
border-bottom: 2px solid #ccc;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas,
#backcanvas {
touch-action: none;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!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}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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seIgFlvnD+V3E4PloBcAFGAWz+QO57vl8eY/5aPla+Tv5JYBVAuJkbHjv+deWBLBX+acIJflD+RR5//nQ+YAFSfnzeY6Ai3mN+VcAGflZ+Ul5KuKDSMFARAUF+SQFCAXyefwFaIDIBZQFqAUiBdT5NAXiBYj5kgXtuUwFmfksBbIFZuLyBSVBZ/nEBQRApAWqBYP56gUUBbb51AViBR/5mAUGBQ/5OAUt+RAF2YG5ThO0igV6BYX5NgXEeWoFxPl/+VQF2gVO+boFLgV0BWAFRgUyBUL5t0bEip2AfgUf+QEFKgVBBXYFIQWjeUIFOnlABc4FEgUxBR4Fmvmt+awF5CAd+RwF+fn+BcoFvAVh+b/5WQVhBbVAifk6BXkF+gUFBah5ngV4BXjhs3CEBR4AuPmVBdYFaQU5ecEFGgWOBeEF0/m0BaAF2AVtBUUFXgWp4N4gi4BcBbG+BwiPebYFtQVR+dkFTgXw+XoFrgUM+SAATPnreYv5rPnL+ez5dnm7eY+55oQsAFv5VwCyBTYg+ai5GH+5h/mloF2AUvlPvO/5UHk+gAC5Jwjwebf5r3mxBSYFQvk3BTHkUECcBb0F7wAyeecoM7mkefYFJPnjebH5kPkMeRsF9fmcecj5jAWFBcwFxQXXBU/QlCLkihUFoIWWXoR5ywXEeZCFmQXl+aT52QXj+dN5owXoBVsF0QXz+fsFT/lL+de5K/lXAPZ5j7khACqAlwWC+SJ51cCQ4b+54vlvAEB5lwrPBTiFbwVAQtUFXwX7uar59/nSBX8FXIUVQM+0YK7v+cigSkCyeYN5xHkviEgFDgWj+bCF9vnwhZSFkQUSBYl5DAXNeb8F6IVC+eMiBI4fzoqFYIXVBeqF5AXQhTH5VflwhRSFDQVT+VSFUQWgBbSFfcAHBe4FNnnHBTt5DfAgAFz5znmHea55Inl7rKgSvIWH+bmypbnK/u/5z7BheU8ET3kveWr5qIXGBaaFInkGSBGFPQWwBYsFqaKE+XaFoQVaBS6FuQWbBe6FSIVGhZmM0oXphQ7GbBI4hTnA0Hl5hUN5GoWCBfUFioCNBREFzQXbBZ6FFnn0hYcFjIV+hav5AYWPuft5FwUhhdv5SXnWTm/IXnn3BR15AoVPBUTQwoWDWO8FAwXAwDf5EoV3+Y6AhgWphXEFX3myEhmiQVg4hUqF+Pk2hdAIpfn2hbb55IWU+XqFnYV0BYaFPHke+duFMoV42aoSAja4eSCFR4U+gOCF8nm2hWeFhXmkhWP51fnOhW2FroX6hS0F3YUs+T6FN7kDhcyF6/m8+aOF/PlXBf8FqaGzKCAoYyjeebOFcehPBZhFyQUWZASAccBihWuFXHmShZuFkEW4BW35VjJh4KcoG2y8gDhFoKYEQI9EM7k/hQIFf4UwhY6FOoVkXjkFogWlhQaF+7kVha0FGvlohTMFAQLIqNRFb/nvhXRFiMAnhasFI/n/hdqF9HkcRQiFIAX0+ZMFAkVphV4Ff2Kv1nColmw0RdmFNbnp1qn5DEXfhaeFzEXW+bJFbEXyRUsAnEVNBdxFLQUqRWRFJQVYudpgVEXaRWJFhvn6RfRFUkXNhSxFDoWaeQGAlkWKReMFykVSBSaF6kXGFG6S4jY8UskFJSDp1p5FBYWmRaxFvkX0gP5F14U2RdsFdkXtBeRFuv6Vxu3oA7CRRbpFdXmpgF7GsUW/hfFFPkXk+X5FV4XFhVxFiIVp+cFFj4XVhVE52UWPNAHSUUXtQEVFBIU5eUxFUIXeRReF1fkKRSlFNUVYBXVFUwWCRR0FWUVk0dUoWEhjKAsFhUWVbh1FCEBdRcSFMkUJReVFSUWVRcBFJYWDRW4FVYWhRXAmOUV9pNNFIIXRRe1FEXmdRcZF3UWlRb1FcIX9RVVF1kVbRfxF9kUThWFFOUXkwodFOYWzRU+8jEXnRUtFlYBaheZFlxLJRbdFHYWpRdEF6UXTBWNFrJJ7RdUoHzhvRT35bUVzRadFC0XfRcMFf0WJRSxAgMUbRdVFSkW1RVuFI0VqRRDFU9SaRfm5gf60RbimkkXzRaH5i0UoxWZFaMXzcOtFdwDthWMF1IUTBcNFqkU7hc+FTUXVFPT4CygzRfj5n0VGRdJFv0U0xatF6MX0xZOAjMVuhfkFYMWjRZlFkMWcxcsULUX5RQj5H0UrhZTFyMWahcLFdvkWRWLFowASxaBFaUWsxY9FJ3nPRdUokfSwxQVFfMWqxTgA8EBUxRrFK0VaxQDFOsVogHrFN4UsxbjFbMVPhY1FE0WfnorFMAVwxSrFxUUmRSSF9sXj+TdFmMV3RdjFQ0XuxUbFu4VQxWU03MWuRf7FlsWBxRdFwcVlRQ7FFUUABUDFTMVlhTjFpEUZRQ5Fj3GpMrBw8VKkxUsA5MWIxWrFgsXR+VdF7EUYxQzFIEWuxUFF0cUFxROFQRTFxb24OkV+xdJ5ZMWx5JXF1sW2xeeFZIV9RfXF4sWNxSDFbsX5xeDFssXyHkTF5F6dxYnFPcXlxX3FqoVnRdXFqMUixXTFWcXhxcDF90XSxfjFM8VsFHPFrVR5Rd3F+HlfABXFq8VIxevFmsWhxaPFusXjxXvFhsWtxf8FC+jFxb7FlgXnxQZFKcU/RTXFw8XXRffFzsWPxZHF20UhRQTFeohVoM5FJMVKxf95vcWGRWqF6sVDxQBFACVOxbAALsUTxc3FU8UyxQ5FGjLHxfTSPMXiRRfFK8VfRTfFIcUjxagl6CVPxS3F08U4JQEIeCUq0gQlbkWxgJfFJCVeRZdF/8V1xRQlwCWBRXnFO0XgJY3k78WnxZ/F/3lEJfAla8VsJWnFtcXaxdvFDcWbRSAlD0UvxTr5bjiCJebFX8UeRRTFA8WIJT1FHCXSJcIF2cWSxbZFz8U0JdcFyFoqJYwlekXMJcQlAsUSJctF6cV3xVwlciU8JVHFWCUHxbQlg4lmJYvFaiUsJdYlcUWSJToljsUyJWPFjiXMxZglfCWHxdD4HcUoTJ4lsCXLxWIl18U2JULFZCUoJYElD8XBJbnFziVhJbQlSBCZCuVqCcWtRQHFGiWnCIPF2iXIJZwlKSVAJWklUsVGJdgl1wVjtjlFsIKqJXoFhUVxJVXFCSV/xaUluiVWRbvF8iX7xezFXBF16PUl5OiNJR/5zSU/xdTFSSVlJXolO8U5xVUl1CU1Jf8FyiVQJWn+ZcWF+S0lmiWkJXYl5CXlJWgl3CUhJbwlYCWHxXUl1SjCmMMlx0VrJUUlWiXsJR0lASVTJbIlWMVOJaAl9UVCRUclXMVCJbzFPoDnJTbFlyV+JdclmcW3JUEl9yV7JRklByVZJayWL0UMJdElIyXQeZ8lxSVXJXJFNyVdJTMlhiVzJa4ltSVgpdDFQyXmJRbFHyVjJXbFmyXJJf8lqSWApekljyV4xX0l1iAvJUaRH8XvJRqAuKVIJfClfyWIpQYlBsUopeSl94iUpXimeSUwJVClOKWFJV8lGyVSJQilAUVApaSlHsUNRRSlx0g5RUWIpyXwxfzFCCUCpf4ljKXCpSSlCiXGJf8F2SVSpZilkKXHRQjFV8WtJb4ltiWCpUqlA0U9JdUlqKXqpZKl1Si+UtqlsqVWxRclCqW/JWtF2yWUJaalrKWexdYgAiVLJV3FwiWghXAldKUlJQylTqWEpRUlxKWzJS4lbKXIVCJFLkUrJd/FfKWwpT8lgaWixc6luyUqpb0l7qVx2JAl+yiiRTGl6iX9xfalbSUbxRnFQaVMpfrFoMVmpRGlmFpzxQKSyyXcpe5F3iXypQWlt8VbJcGlOyWVJcil4aXppeeZUaXQJWfFMSWrJf6lcKX/Rcal+iWlpR6FK3mnuV6FvYWQRUyFoAAshWm58EVHedcF57zospGFs4WPBSB5C4XJBSKFMHmFJeKFREUbhfG5mSVLpZ/5usxAhYeF1oV8pUSF4yX4pTqFQEV3JRHFDyV3hU15lYUgpcelDnK5VueleIUqhRCFDqWJpVD5JaVNxcZ54EXehWz5LAAc+TBFQ4WwTguloYVFWBVAK6UH+Wul2qDzhWB5W6VLhaKFu6WERS25PwVPJRDFzUCAhZaF4kVfpV+FhIW/pUOl5wB3pQClD6UipU+lD4VkpemleGV5sgqFhGX/qd+l8nlXpXilRqXkZQ4loaVgReOla3mTpY6AVnn9hWBlJwUBhWv5I4WvuWOFiEUiefsQqdjSrOhFJbkJxCB5oeI4hbDZ84AWBT+lyvnrhdhldGXipQ4gt5SmDMkFE7k+gHal/KVtJesFJqWPpbxF94UohbplMwVprnDZqaLv+cZlXrADpWsFrYX3pd0lDyWqpfMlMmWFjA1++vnOZQD5pmXxpSgFKoDKpWGlR6VmhVD5hmXcpcZlvl56pesl5mUeZZRlXmUipTsFewUCZWYAQmW+hSJl/oUOAAAAmnBFkmUIRZyFPvnUyBSK9vSu8QplgHmNzE8Fi+TJBc/W3wA+QLwFFvnJhVKFr6X/BU24XIpeYjiFrgjQef35KwXJZUWF0yXMpbeF1mXPpT5l5qU6+aIIPWVUikZlQPhG4NUFQwUOBRZlI6WAZcClOGWHxbNlkoq9Zn1li2V2vollfAUZBcMFa2WjZaOloSWdZTr53WW7ZfNlcWUHZYNl6QXVxWdlnmVIpV2FfGUL+VOloGV9ufllLIAAAFLBhaVlOCVTSr3oAISrpYplg5TKZXlu3KXhheplBPlsZZhlxEWHpVdll+j/TK9KiTRBZbFop/huZWFlyaVtpa4FNGW2ZWKl9mVncHLKoMSY5an5CyisJQalmgXhZZZl6WVppXplvkj1yrYQC2VY5UlYcaXfJbjlLaUupd5ljOX2ZUu4x+gY5SCFsCCU5cRl4iU05SMF62UYJfslW2XA5YLl0crk5SLlTcrY5Zzlz2UpZUSlVGWppeWlnaUg5ejlbOVi5TjltOV45TxlLKUdpUzleuWV6Erlhvmi5QRAVOU+JSVF7mUjZa9lY2WTxVFlInldCELlBuV25eLl8SWS5S9lqWVvZWWlbqUW5Z7liuXe5arleaVmZf7lGuUhpVrlkWUo5V+5gij65fdl7OX25Q2lMeXO5YHlruX0+cBlX2VHBXllg4UOACm55wUlZYulZoXc9hAJdwV8hb551XxPBXXlqGWXCgiGvAWI5QelIeX2ZZXlNTlBZaDAU7l8pYLFLLgRZfoFhOWN8HnlgmUMhbllP2VF5SyADnmb+VJlZWW+nNas2hDg5RL5ZcR8BYc5qGX1YNfAnRSFJa3lOmXE5bhlVU7EXkFoVoX9efDlxHmkZbTFuoXS5VtFw+UvpXLlE4VY+UfltEWn5aZlF+WbxVfl52UbZSG5o+XZZePlUEWF5RBlDgCPua9+fPnl5SJ51lAXcBIay+X8heulpwibpdyl26UfBXB5u+UphXZlBMX0SH/0/r4n5SxlvuWh+exl9KVkZf0FJuXx5UPlE2W0ZfvlM8UYFS480vnMZcqFuBXWxfgVAaWEFf+lg+XvZYz5E6U9hWPlfYUT5eBls6W7eQAA4gAAVMIV7IVz5Tglx7BRILpA0BW+eelaK8DtOPBAMlzJBWFwOGBRINTIHwCgxEmF3wXehZllnBW/5dwV/+WT5YAV0+VKAKIVQOUTheuAyUDmPtIVZgDwQAXMTwVOeqplT0nqZYI0nwUoFR1l9+UneRYVm5rAiouFIlg+gEFommWS5YWll4XEFWllJKW35VNlbKW4pBdwkzioZX4VjEAERY2lEyVTedxlJBVsFbsFHBUQRd9lvBUJuSwADnk2oKYVYBUSwP7aAWVKJDVl/IV2FVDl3Pww5U4VRniJFc95WhXuFWgVssUFWp55BGWG+UiO0HkBFQ7lQcWGpYqlXGWhFUHlDfkRFfzluGUlFSvkTGUdFZDl/hVG5e0lf6Uf5S7lF2VAZR9ldIVcFdOl0EV8FQGFM8AAAJI8+YUVMGXuwP5lIiTWFSf5SwCnFftlu0mX+TvlWmX7pXvlMcVhwEcViLq1pQD5i4D5hY7lDqz7gKwV42VceXxFP+U5ZQYVORX2efkVgOVFFV+5DXqJNOUVteWr5QF50qyvBfd54XlHZW4VJEXu5SVuT3jC5UwlL+XVBW/lRaVEFTzlKaU8RT8VNmXGhR4VHuWyFEawz+X4+a/lSRU3pSkVgxU55csV7BX8ZboV/xUzpbkVIAApucVlHIWgpey4+8pdxDXlNhV15dd5nPZwlU3lDbmiIEiVyOUkle2A14CG/AtlPeUVgG8VvRWWBLC6XxXDFWQV43B/FX/lrJX2eTsVXPlQZWXlBxXkIHqGBZwGhjOFl3k8XucVC2WXFUX54pU3FVhlqBUUFeIVxpXWWhSVRoZYlQklA+X05eEV6pUj5SsVWWUslRsVbJV6lfsV44Vmhck03/J8lQ8F765ClelOvaW1uUgI9bln5YtBe6X2lU0VjpWyBdNgQhQKuuelvcXdFSRl1JWcZbP4qpXlhUSVd+XNFcDlWmjjQMa6OZXLxXmVOXmMFYOll+XqZMWVsuXllRmV4ZXRiG+FTCW5lfUV7xWJJTSV+xQtlXP5fpXMlVqVgZVAlfOlBpWhlTr5amVLhCcVV3lr5YF5PqWheVvl5BKuFXaVSOXt5eAls5XFjM8VmJWXpdiVIRV4lfjl3xXIhcSVbZX/BbOVNYxxlQvMWXkHlQWV/RW4lQBlMuXDlYyVn2VrFdkVomUOAH9lIBXQZdOVoC6UwLyVkJU2FW+AIHm+ZI1l6TTy2LwFy0HtZciVieXYIIxk+sx++WdclGmtRQDApvlxpfqwfZVzFcwVE/nX5SAlIxU65XplifCtVgxm/0n9+OPGaFWp+Y9lnUVYVUqVOFVNlXSVSxWbZReVX3lb+AjsX4DoDsgaZ5QLBQFoFaIzuetB9FXBFc2lz5VUJebl6kWJGPHUnfnnYMTRrUV8VY2FxHmCVanFfRWOpUmlx5Wm5TSFI5VZFQXlhhWbFcXlybm/lVOV0mW/LgDAVeXzlWW5DeUIFVKUzeXXFQ0V2mUOlfcVkF6mVV3lyuXyla8VTYU05Z6V+FVWZYSVk2WalfoV2pWnBbVgIZXGVWCVJwQQlWaVK+XAeXAVKGVWVVnA6GV5pRKVW5WUFYS0SwB5Cs/lOBXulUEVTaVOhakVYRUElWeVZZXplWaFA3YEBeAgGVV0FVlV2FXCVblVTFVf5RllmRUgZTpVgJW7efkVEmVcldcFjNnUFeZVBl4wlYuFm+UPeYlVG5Vt5eJV25X+ZZyErpV3lVHlh5WARXlVQxUllZNloxWUFZK8YnmTVYD5HlXVVTlVt6VzVfSVr5UZFUyV2lXCZbpVbJVr+e6WHVVmhffyS1bmVcf5uu6oZRf5NpWPwCmVm5UuJQLlkv5XVdylcAVrEr2V9FUB5Zrl+VXtpeAF6BV0wO9VcZWfVS1l95WZ5XTl3lUM5URVr1WgKGmwdYWS/jwFENXYVb9VceX/VQTlPpVFVY5VOaI+QJl6gjQLBakF31XKVcbl6lVpFcHlo1WUFQbkB6EE1UdFSNUaZQjlw2VQ1Z/lL5WipTjVWMQfiAjVrUVE1SjVP1Wx5a2lGlVu5fBVHNVwqMCFOYU81VHlDZVO5czVixX1VUtVwOXU1QI2iNUS1UdlCnlM1XVVrNWRFbrlTWVK1dzVVQW81STVUuUs1WJVKJXiXmSValR61f0FxNW/xWjVAtXk1ULVUpVm1Vwk8UBUVTMVBtU21fzVvOXpZf5V6xUAFXpV/2VnVWIVGZW4EiJ45lWsGqW525ioZf2YK3L1FbBVkpW6ZUIAOqwd5bG+YUi0RcFYFF7U5ajVseXwgOOlQ8AlAD9FLLjdwHnVJ+XQeYuA81Vu+aWVWtUqgEnV6BWNoMlA+/k3lazZGdU9FSTVKADRwuUlOdXsFcXVGgWF1Q2cJQD51YRlpdVHAOXVLFVipYnVFuWNzPXVFYBWhenVGhUt1T9FbdX73B3VvQC51f3VBdUhrEXVa9WD1W6VgtWXZfVF49X2ZTwUU9XzBeJFs9VG5YvVPVzL1SqAm9X51T3VG9V91QPVGJVD1bvVrZVj1SwANdWHxZdyx9Vp1dB5c9UZ5X2VF9Uy1SyAndUZFd3VFAW91cXV29VngMPVu1Vs1S35B9XgJRAV30TT1afVv9Xn1e3VwaUgNTfV69Wwutg1UDUVgCPV3+VaVU1VR1UtVUOFQyAhVfPl5CC5pCra1eVRldFVQoUb5dZYO6V5pW1ljRVwVY7VZiQq0sVBtNUYlZlVfKUrZQQVl+UUZX9VhDWEVclV4hWTYIwaWdoVVceFAjUnZRxlj5UsFV6V+QU+1Z+Vv2UsAH9lk5XnVbm5u8QfQueAkVX8hQj69hXQ5TeVkVhUIAk865V2VbcVDlWKJXQgTSCJwIjVxvRLBZLVM1VOhRrVN+VY1VXVMwUSFeWikxVwxc41dZWrhQ+VqlUc4B41rqWU1eIV/hAfQl2VATVdFdbV16WFlWE1ZNUY1RTVptXUNdeAuLDMjh9Vq5QuNarVUtUqVfMVqtBDlXA1aqW6NdE1KOjtFXE1btWuNSE1RTXhNXzlsNUExb4174AIrqDVuTVBNXgVbjW3pQ01MNUSNaYFXVUSgmLV47lA+Lkg+TXdNSkV70C9Ndrl/TXxBV1VzYwvBcrlH0AKlYzV2VXJFRT5UzUpNYQ1DVUHVSQ1PBVflcYV2jVB1WaF+pQb2NOF/JV+efXl6+VxVV2Ag1WIlcNVdxV2NZBeztr4RXuVlJVVVUJVW1W0lVs1sDXiNZE1GZW8/N15a1VJlQhAEzUU+dM1qjXENfnlpDUHNXkVpeU6NRLAhqyi+ed59DX+eTd5G+W3NQiVmhX2VWmV7NXfeYaAyLU+pbeV61Xn5XU1uFUiNejVYjVeNfLVD+UvhYS1JdWfhVSVazUDlSrQO1XMVUQ1b5WrFXoVvtXHVSyFmgCUNcDlLjTVMD1VgoXwFXGViBV2pWw1OLUcNaxVvy6L8NNIn6X8NVHlgjVMFcI1bLVf5X816TWdeX9BCrWyNZ+Fy2UKNUI17+UUtXbVqTVjpZy1/pVjlX7VbJX5FYHVZhVmhS40NAE9VWi11zXitfCV2+VDVdY1qZUytcVVInkrMLok5BIMtVNVqtVgtay1ELWkFb5V5BXs1XPyb8iBtfg1ILWh+aG1AxU/Ney1OzXvldy16jVT5Zo1s+X2tTOVe5RSsicVoFVFJZ2gEFVfgFBVENVx1bM1Ovn8/h4I1uVwxehVh2WBFZtV6zUMaCU1mrXC1QxwkQCuCK7VGFW1Ncy1STV4VcbVETVate14XbUUXrxVDYWzFTVVkyWiVcO1HbU9eHjAWnByVZO1auVktZflYcWy1ZrVajXNVbC1jnmGVQi1JYDiIMKhzrVXNUuVcJUDVVi1yBUPNbY1ZTU1hZl5e9jAtaZlBTX9lQO1JrVe1d6VkbVE5dG1OeQB2nk1QbUktfWVSbVPlSU1abVctQGV1rX2eX9l+pUHtbjVXCSuECcVeugmNbGVPqVRMBY1SiTYtTY1uLVPNbjVNl4SpK1FgTUfNYbV07VTeeG1mNWfteeVvrVCNtGS84Bd+Tk1BHV95Wu1xrWkdWk1HbWhQPySGRALZcs17lWktf21SjUWMJs1s7WNNVW1KF6r5eWA6JUjNVx1hHW/xcR1GzXqwCm19VXbtTC1GjXslcm57VXHNbo1jsbpBOZV1HXlucM1kHnWVWKVkXnXtVh1t7WHtVKUWnX3ZW5VUnV31SqVKjURtYVVoHWWtQFV45Xr+fu16nU8gAZlVxwnFYg09WWmNT6lX9C96AB1IwBJVf818QW5sthsH5pWhWWMX8DWdYo1oTXeVG211LVNNTPFsIHLvEKi56XRdXk1ipVEdV81g5V2dWblI7WpdQkeDDSN1Zl1nTXWxUB1wYQgdTS1YXVhHvuUuma0RWV1sXVGtTiVVXX5dSx1nDVhJPEVPn4ZdYX55XUxVbx18XXNle11DtWytSWAJGzFdUokUXV9dc11qrXv5cN10NUzNaF1ujUTdTASjKTPFU11DHWDdfMVC3VDtUJ1y3UcJNMVEXW9dan5/XW5ec21LLV9+iB1inX7Ncp1rIVqdbm1qOVAacH5CGXmlQw1YrXLlWhlLDXjNcZ1PrXRtR9qv7VAaoq1lVWrtdt15LXqtazV7bWddRWQvkCWunp1fXlKtarVoWUvtXx1b7X4lbxlFrWjlc51EHVBVQK1E4XKoM0oEVUXNbAVjDVxVcw1SBWPwFK1mHV/ddh1kMVnpYT1erX4hcq1hrVzda11CxXZ5ey1UPVjdS65H6UM9XuViPVkBRd1r7UQ9fdFN3UAlbu1+RWcle51L0BdULok5yjAVZc1QpVntSCFK5V3NYr561SVtQd1hxXw1Uz1RLUA+Qm11sUqtY2VxrUi9QRVSXXCdVwRyKa69f+1BvXHZZV17PWiNbA1jnVY9Ty1ZDVAFQUVoBWGlZ6+8tm22iK1yGUDam618VXfder1IXWFdZ5SPDXA9XI1zPX29Wj1J5VqleR12NW09b+CmR6+9fz1IPXR9Yx1bPWx9S/Ve1U6FYdVt3VZtSAAmyB49f8FU0HfgJrA3nUiXgoVtXpxla1y58CWNVe1XrXPVSO1MUxX8lN14kWYtfQVpwjPtUbVm7WeNQn13jWINU3KQLXPFZ31CTWrZZ7V6PXpFXn1ezXi9cp1a/nQddL1HqWZMtUUcvQLKAr1coZQ5dMGyQVFeBY1vACx1ew18dWqRUJFZa6zKG3sMqVHtkoIU7W5dSrQfhWCdX01WvXWIO4lp6FRJfh1y8WBBRLlQvV8dQtApvU+VQ51NXU6+cICOSWvklilCPlePK7MIWVc5Sj18XU/9cx1o3WUdcZYlrjgpVyl7TXgDW01SPVQDQxV7+WwDfJ1mtUADbs0ibjgpdSldNVoDWCumdWfNS219IAikvf1S3Ut9UANOUVYuDKlpA1ypZ/1FA2XdSxA1A3Vdcl1tCX0DcclEKWtRcwNkA329TgNNA0J5dD10gLXaKbFWqUCDYX5ZA3z1Yk13/WcDSN1e9Xc9feIvA0+xW8lJA2yDSwNfuVf9TANSg2LdWINqg1dpVs0aGA1pe01qCLI1VHlyPVYDWz1Ig1cDRb1NpwmYKYNPaU+pRAN+tXWDZgNMnUBgAYNe3UP9S31mMqTNGYN3qULBZYNDNX/1WwNA7X2DcoNr9XRtRAlVaUMGqXFdHXv9UINmfWhxb4NffVzteINTcEuDeYNbg31flYNGA3CDRkNHPVy1dwN1wWepV2hM9B5DaENKQ3X9ZQNHA3Z9fbVKg0IDYjETkVVDcENNqVhDR/1ug2RDYoNTQ1mtS0NcQ2mJbkNIQ101d0NqQ1g9eu1JQ2O9am1+A0URc4NHQ2uDbUNKtXkDTl1DQ27VAMN2zXzDW4yDIDhRcRexA05hYIN9Q3sDZsNv/X+DfO1flD7DfMYmg1HDdoNkw16DfMV0Q2GDQDVlw0XANcNJyWgDXoFxw2g9Y8NuFXPDX4NtA1vDXsNDA3SDTk1Pw2eDcUNWw1O9TsNjjLvDUQNtw1wxRCNRQ1pDX1FMw2UtTCN5Q0LJe0N26Gv9ckNqw3yDXF1Tw3ojaa12w1YjTr5Vw3IDYiNdXnIjWsN0nU39VQN0I1zDeSN9zTwjZNF/A3gjfcNJw1RDSSN77VGDa0NcI0gjeyNKA35DbSNhI0tdekNTI1lDY4NfrIr9csUa/WQpcZlveWQjerVuA0m1fO1lQ24jUkNFg11Db8NfQ36DVKNeA0sjS9AOQ2PNGhSXQ26jSqNUw3YDbyNU/UddcYNejIJDZqEYw05hRMN3I39DecNQI3iDW/FL/XajfkNbo16jesNpw1HEIaN6o3iDSwYg6HmjW/1BI0RDUGNPI2hjVkNDo3qDUaRIo0LBWKNsY30jRsNIY2ejZC1mPX59XP1hfX5FTm1oJWQBUTh+vkK9QuVfVUYtWF5HrX3NU31I1WFdWUFJ2SPtbN1xvVZ9TmN9nV8RbCNcgXKZDxV8bVMtX8NarVwDbnlULUflTu1ynX5FSX11bUVZTe0VWW28Si1iGW9Vei1NzU1jWuVqzWa9S31OLgUiuSJsJX9je6N8XUJjX/1XY3GjdYgW42zjQ2Zn6XvNYGNmY3BjYeN3tWjjRm1442FjXa1JY3hnNasMpSvdVFVLrXK9VMVF7W1jRh13rVH9Xi1h+XZzC2NW3WDjSb1w40V1YtVJ43j2C+FH42N1fuV01WojbVVao3yJWL1gVUBhX9l8LVL9WkgZsB9bGZYopbsFCcVccQbpZ9CioW8/Mcga42PwPxKG40dtf4BNXybaN4Vz1KMoLRFhUXcdTl5/EoQTe2NUE1I+ceNMo0JvsfkS/AxbnTwp6BsTc/VUeVcTfqNRTUdjQV19E34TSxRf/Q/kpoA4k071ZJNboDcTUeVog2vDdD1YbAYcHHK69wIcPqAqk3QNXylUk1xjaj1sk32jQKN2PaBSb5AGeCZKHG1TCXsTdUF5k03jcL1vE2lNb5lu/lrkNhqToQbYN4s/4C0RZi1LhXyeW5NCg1DdVZN8A3RtR24YgaOZY9cTk0WJSFNpmXhTUSNuFW7dZkN3mUYTS515DVHNY91IKYOPAC5FY1IZWRNAfWfdUH1FPWLQVT1gE0CTeKW/6kh8JH1+rXyNTH1UU0LVVG1SfWVcq1+DU2M9axlT2UoTdtVnk3O9fmNmE0OAA55i/X5TZU5M40+DF7xC41vdd+Nu42/jZi1/42N9XRNnXUnqESK5aIIWZeNjLXj9RKNs1WeTVz1Ao3rTduNOInbTcG1TbXSTeD1g03ZTTj1WxW7FXlNr433CYyJZ5TFTTZelpX3ZdaVutoATc31wtVPTdu2gWX4NRxNoLUelcu5MQ18TZXVN028tbt5XPkPTV71wvl9+KaVxPV+8EKVov5BZaAogzK8BU9VDY0ajZpeWEBQjvkNH4jgFLtNhYVANbMNGrXm9Y/1so2WXvSM8PV6BYTNDfX5lZDVg03djWtoewi8WojV9M3odas1WdVZ5WTNRo0CTazNibJ2lBzNsg1PterlvM0Yjam1kM1u9cYV2gBTjYi1ICkFuYY1UJVLja615U1LTdRNi0Gh9cLV+LUjuW81O03gTZdNQ41oTUeNldWwjWY0+blgTchN1o08TSbN9415jbP1I00sgGv5OE0TTceh3Nm/TLNNgHk+dWBVfnXv+QF1HehBdV01v3VATR1NCbQY2QpxevWbdVaNmk3V+RlNpQ2Q9RTNLfUrRBHNtM2ghdHNKI02zeP58c18zWGNDo2aHONAkc3Tdad1+407da1NsQ0dTcqaqc0ndV/5pc3pTeXNo9VxDVXNf/Sn+cXNtc3XjRFNZc3MzbBNzNT9mG+RNc0xdR3NaU1NlQ3NXk3TZayNwygo5Is1TCUZzXSNnc31zd3NAs3hzS3N080WJbPN4o2s9dnNo81DTY7NOU3flQ91j00c2cGyQWgK9UW1NsUltdylSDXltXmlMFWH9TKNYmlroOvS3wCQNETIiU11eQ21NFULRXRVFk1DdQdNSc2/TSuxlGkx5PIIlFU5NR/NNoXfze5NfHXvBA4NlM0jDI8oxNFYhdxVy7VgQNUFSlVQLTANgCWkjZiN980nmFJV3wBGGrJVOTXyVWgtGk1GzdgNWC18jRj1+1XpteB1UM0BhSm5402vjZ3p/ER0NYhlOnWWVW61opXSrN9N2M26TQvMcVJylTWNrY3OwLZ1Lw1kdQ510s0S9fNA8s1KmfQg4RAntUr1C013eX+Nms0jAFjNjzWmdfReouSY2frN503czeQtts3aTRIt/E2UzYjIKaJnTUHNDBUtTddND410LTLNLABc+W51bs2tFeTZ8mXKzSBVdXUxhavN5gDxhdfAiYWiINVNP01rTbu8CtlgLSu1GfVMzXbNH7X/9bBNttj2TRTZCwXP8vxVQ2VRLcYtmlUOzdC1BfVGFSwAQhUiFZ71/5UlgOgShxDuLRc1qRqHUr7NscYPphBVc7hWVIF1tS0ZoK1lGvWH9ZDNOqzKdX9lUvUuLV4VXAgIddMV1fXIde/5sOVf0Af10rWhze95H9WFxV9InpxPBBTlPuWzFbbVVC0mLWbN5aUTLdcFxAj6hvtlaeVd9dHlPM2kzZLN0o3hpastmPl48BstEeUc5THNfNUSzdgtzI2spUctX3npSNMtmy2G5UPNLYVXLYst1k29uXctZ1QP0KctqeXPLRcthtULLXaN0U2CeV8tpNkVQNOMTy1zLS8tJM2LzYctxFXdLdimcZW25ZHlmc27LXCt0gVgrZNN/L6lnDMtyuVbLfMtk/Vx9UMNoK3EVX0Qvy3IrSrl5y1orZctey3XLQctmK1M5eKMvLnhuGct6eWsDYCtRK059Ry1NC1gdVa1IABtLUcAkwBeAHUAXgBtnJYABACWAItBrAAoAKgAI3DDIAQAg8AtnA4AKoAuACgAeADjIBwAKq0reRMgqIBJoBQAZwgGrT+AkgD0AJgA4ECYAISA8TCvueqtbZyoAPhAZgAOrY5586W3tmj5DnkjhaNYmfkOeecFEEDrAJ6tIpS1YL6tjnnBVb3oTcCerc0AWIDkcIGtwJVYgOBAUa0yLTkg8QC+rWGtWICpLMwAnq1QZbVYrq2/lUrASa2OeWpqcQxprUGtcs3UylGt/LWRANUgua1OeTGtpa3zpddwla0mFZO5awD1re6tQED1rb+Vo0CJrWmtmfnDhViAvHjdrWyFhoCBrayFcEWcoEOtwa30wE2tXa0gAI+5UGVKAEOt86UqTYWtZwVYgJtwua2shd6tMSj9rdmtU/hrrXBFaaCdrY6A3a2/lc0AB62Orc+5WICtrVOtrIXzpd7Au60jhcHKua3F9ZEAlsC5rXsVkQCnrZn5wZWTuautU60wzSmtO62/rb+VJ3Cvrd3hAG2HrSAAG/kprYGtp1URrbyIua1r+XBFIQAfrRBtGa2TreBt4mUXrTCA8G3nBQKAyG1r+dmtCQC5rUVlF62EbVOtupVwRTBgga26lVBlUcDGBfdNKa0VrVOteS2CFRetL61MbcIVLG3SiMhtHJUxraRt4G2MLSutcG1TrSm586VobY6tKbn3rVhtwm3JuecFNqDcbQZVMa1sbeBtHS0rrTRomfkA5RetQoC5rX9lI4X3IIGtf2UilKeQyG1QdViAUQDGbbWtWm1TrdhNKa18bY6tP5UxrWBtdm1qajIAia2jucPABAA2AHYAvMBHAG+wBAB/uRuFoAByze95KbnwAFz5j7nbFQAAagAAovAAMyAqgIm5cACWAMm5KADEAJYA8ADJuSkAoW3xIHgAeADFBU15mfnkcMPAKoCPufAAMAj0APAAlnFTIGx5DZxuAEcA9XTveSEAaQAqgA55pW20KBVtcvRVbZYANW3FBfJ+DW2EgK2cQgAtbWVt7W0aIdVtPSDFBR1p73nrIFFtXPnwAI+5/BVarAAAgiqAUyAAABIAAMoIwDPA821arA55ibnFBfpY73lhbRFtBhjKzAAA6uttAADyAABy8EBkAGcIUW3JuRVtaAAUADlt6W2CgG9tj205wGgAjEA5bcUFr37vebcgxa1Pua1tDIAjbfeCY221bUIAQSh9bUVtQgAlbcNtlW2Q7cUFprTveVMgUyDrbQAAWkNREQCJuRIA/BUqgLNtV21c+Yat8n5HAOFmsO3FbaDt5W1I7V1t421HAGyF73nrbYm5UyBkgDPAlGkOeaEAibkYAEIA6yAAAIozwMm5thVkAPAAtABoALQAb23JuR9tuW0M7fltIABA7VTtiO0dbcjtDO31bWj5Cu3w7dTt4O2dbd1tDO29bWj5i23JuX4AtAAKFZOVV22JuTbF4EAKFfAAibl1nMm5xAD1dAztk21o+UQwq22Vuc1tTgDsAOZAJQDwAOttUyCzbY5U9AC2FfbtRADwAPFAL23YQG9tq231ABAA620oACUAEADduWe5eW2HbWj5621nbbNtA60sACHtq21gACkA3bnPbWDtRu2U4G9tEW3duRKtLgDdXL7t/u15bQDtaPkhbcm5UW1RbesgsW36lQltngDJbalt6W2ZbXqVqwB/bQztMO1o+R1AA215FVrttO267UIA4a3vefLAcO0g7Urto2107VDtLADcbFNtl238FZdtKoBQALKtJQDEAMUFMi19bdoAaQBzwINt8ABRbWUALgDwANRA4u2LAHvtcu1A7UftzW2n7eftl+0BANftQSh1bWrtxgWdAGkAbIBL1WBl3+2/7T7tEgBvbVMgwgCwAMPAr20y7UIA4ECCecPtj+3z7RDti+177c7tmfkhbVIAEW2Tle3tSW0pbdMA3e0QAFltfe1QHSwAegCteQAdBAB/7e2cZB1V7cAdeACxbWAdEB397dAdde2Z+X7twQAUAL7tl22JuTAdQgDm7TbFZO3QHYPtmflwHSftCB067fTt0B2o7WntZ236lRIAibnrbYxYWqxnCG/GChVqwItt8EB7bXvtFO317U9tje3N7bFtxWVYHZ3tuB0Zbfgdve3aAIwdLACBALAd2gCz7dOtY+3K7UgdRwD6gIJ5QO02AMfto+2iHSrtQgBkgIJ5x22nbSqAF203bXdtD21PbRQAL22S7dLtp+1S7fwAP20SgBYdIAAyAIJ5a/nrbYttj7l47SqAOe157YntTgDwABIAaABhAOltkfql7eXtjZw9XE4dKB0gAPNAj7mK7W1t4+3iHZYdqe2freFt0W2xbZwdl23VHUIAUyDx7WAAaADpbT0gKABarB25ie3wAEUxEgCzuXj4uR35HaEAZwhTIDodKzBR7SgADZyVuS2cXgBlHd4dzB0gAI1t8B21HQ4dE+2WHYIdmx39bdsdYO11HUvtCR2SHUIdNh01HScdux31HQkdWh2XHdoAI+2OefYdC+17HfLtQW1SHcVlsh3yHSJwih0ALNoAKh2EgGodGh1HAFBAsB30AG4dxx007bcdZx1m+u95uh0t7VMgbR0dHUqI3R29Hfbtaq2DHfntIx1cbLO5igCTHboAMx1zHRYwCx1LHSsd+9xgnfrtqB1PbWFtkW0xbVMgbe2JbUYdaW0mHQQd5h1EHfLtFR1TIIttAAAaz6BkAFFtKoBXbdsVDnl3bWHtMR1haJLtBNDxHWhggnlZEKiddh2eHY4dQgBpoLAdth0I7Tsdbx13HTz+gO2LAA/tIh1anYgd7x3BYPKd2gCKnZqdNx3anXCdDx2VHfNAaQCrbSqALe1X7dRA8ACrbfwdLADDQIJ5zO2s7RQA7O36gAAA0qEAa/k87SwAAu23bWSAIR0jHWgA9AARHZHttB2PbS76aAAu+vEdOEDWHU8d0J3a7V4dnp2f7ZsdkJ3uHS8dyp3vHR2wLh36nQWdQ21GnWIdZx3/0N6dybnhbddt/BXwADsVDZ1RbY+5620qgIttEW28nSR5umazuQyAiEDgnUcASECCeQkGFp2vHcaddx0qoBCdUJ2GnVadE53VnQcdM8BUHZfV/+0QAD/t5B1AHSAd9B2QHQdtFx1F9TNtc20LbYtt8ACLbesg+2287Qed6yCSrWAAl22h7WedzO3qHVoAq21RbRIAZ237bUOdtp3HIAadHh2VndmdIAACgIJ5UyAOeVei74CLbVz5wp2XbaKd4p0QgGgAUp20HcXtdADxHfcg3p1nbd8dch0KHUodhIBAndoAIJ3vnUIAakCCeSFtIQARbfFtzJ04HaydPe3ZbZyd74Dpnc8dFZ1znVWd/20VHRIA121scBOxgYUcHSTtHeD/bY0dRfVr7Rvtm3koAFvt8ACqAOAd/20bHentme3A7SAAmR357TkdYR1F7TKdtB1l7YUApR3V7eBdkgV9uW8Ajq3AXTGtgMSere6tUa3erfpdjnn+rSZdRY0praGtQa3ObX2tQa3d4bGtha1jTcDt0Vj1rSmt+YzprSmtam17taZtl63gbQ55+a0erUWtKa22XZL1pm2MbX5d9l01rRGtP61+XQ2t3ABibWGtLa3IbfkV7a2+XWetI4W2XayFwO0mXcOtEa1eNP2tIpSBAMhtM60Xre5d060LrVZdy61UIMVdFDWmwGOt2601XaZtMV1nrcetjm3drd3haV39rTetlm3gbfd1pm09XY6tT63fAEptjq1vrd8AyG1frdwAzV2frTetbV2BhUBttm2fraBteG0ilAFAmfkwbXjAQm3obYhtCV0obSmtu10YbfsAUm3obThtB10EbchtxG37AItd7Zy7FRRtZV3UbTGta103XX+toOXIbcxtrG3ybRRt110CbREk8m2ibfJtkm3ybbJt010qde2tI13qbbptVl0GbaZtu10mbV215m0RrQNd6m3nBf/Qxm3trXNdf2XObcdddm0dXVptqtnaXZn5711cbdptcEWqoK5tYbkrHfAAoq3CANPA1ZwEAKgAtB3DIKh5zZytnCyAwyCwIAHAIaBAAAA"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* Utility functions */
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
pcbdata.metadata.revision + '__#';
var storage;
function initStorage(key) {
try {
window.localStorage.getItem("blank");
storage = window.localStorage;
} catch (e) {
// localStorage not available
}
if (!storage) {
try {
window.sessionStorage.getItem("blank");
storage = window.sessionStorage;
} catch (e) {
// sessionStorage also not available
}
}
}
function readStorage(key) {
if (storage) {
return storage.getItem(storagePrefix + key);
} else {
return null;
}
}
function writeStorage(key, value) {
if (storage) {
storage.setItem(storagePrefix + key, value);
}
}
function fancyDblClickHandler(el, onsingle, ondouble) {
return function() {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function() {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 200);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
}
function smoothScrollToRow(rowid) {
document.getElementById(rowid).scrollIntoView({
behavior: "smooth",
block: "center",
inline: "nearest"
});
}
function focusInputField(input) {
input.scrollIntoView(false);
input.focus();
input.select();
}
function copyToClipboard() {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text = text + node.firstChild.nodeValue;
}
if (node != bomhead.childNodes[0].lastChild) {
text += '\t';
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
text = text + '✓';
}
} else if (node.nodeName == "MARK") {
text = text + node.firstChild.nodeValue;
} else {
text = text + node.nodeValue;
}
}
if (cell != row.lastChild) {
text += '\t';
}
}
text += '\n';
}
var textArea = document.createElement("textarea");
textArea.classList.add('clipboard-temp');
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
if (document.execCommand('copy')) {
console.log('Bom copied to clipboard.');
}
} catch (err) {
console.log('Can not copy to clipboard.');
}
document.body.removeChild(textArea);
}
function removeGutterNode(node) {
for (var i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].classList &&
node.childNodes[i].classList.contains("gutter")) {
node.removeChild(node.childNodes[i]);
break;
}
}
}
function cleanGutters() {
removeGutterNode(document.getElementById("bot"));
removeGutterNode(document.getElementById("canvasdiv"));
}
var units = {
prefixes: {
giga: ["G", "g", "giga", "Giga", "GIGA"],
mega: ["M", "mega", "Mega", "MEGA"],
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
milli: ["m", "milli", "Milli", "MILLI"],
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
nano: ["N", "n", "nano", "Nano", "NANO"],
pico: ["P", "p", "pico", "Pico", "PICO"],
},
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
unitsLong: [
"OHM", "Ohm", "ohm", "ohms",
"FARAD", "Farad", "farad",
"HENRY", "Henry", "henry"
],
getMultiplier: function(s) {
if (this.prefixes.giga.includes(s)) return 1e9;
if (this.prefixes.mega.includes(s)) return 1e6;
if (this.prefixes.kilo.includes(s)) return 1e3;
if (this.prefixes.milli.includes(s)) return 1e-3;
if (this.prefixes.micro.includes(s)) return 1e-6;
if (this.prefixes.nano.includes(s)) return 1e-9;
if (this.prefixes.pico.includes(s)) return 1e-12;
return 1;
},
valueRegex: null,
}
function initUtils() {
var allPrefixes = units.prefixes.giga
.concat(units.prefixes.mega)
.concat(units.prefixes.kilo)
.concat(units.prefixes.milli)
.concat(units.prefixes.micro)
.concat(units.prefixes.nano)
.concat(units.prefixes.pico);
var allUnits = units.unitsShort.concat(units.unitsLong);
units.valueRegex = new RegExp("^([0-9\.]+)" +
"\\s*(" + allPrefixes.join("|") + ")?" +
"(" + allUnits.join("|") + ")?" +
"(\\b.*)?$", "");
units.valueAltRegex = new RegExp("^([0-9]*)" +
"(" + units.unitsShort.join("|") + ")?" +
"([GgMmKkUuNnPp])?" +
"([0-9]*)" +
"(\\b.*)?$", "");
if (config.fields.includes("Value")) {
var index = config.fields.indexOf("Value");
pcbdata.bom["parsedValues"] = {};
for (var id in pcbdata.bom.fields) {
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
}
}
}
function parseValue(val, ref) {
var inferUnit = (unit, ref) => {
if (unit) {
unit = unit.toLowerCase();
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
unit = 'r';
}
unit = unit[0];
} else {
ref = /^([a-z]+)\d+$/i.exec(ref);
if (ref) {
ref = ref[1].toLowerCase();
if (ref == "c") unit = 'f';
else if (ref == "l") unit = 'h';
else if (ref == "r" || ref == "rv") unit = 'r';
else unit = null;
}
}
return unit;
};
val = val.replace(/,/g, "");
var match = units.valueRegex.exec(val);
var unit;
if (match) {
val = parseFloat(match[1]);
if (match[2]) {
val = val * units.getMultiplier(match[2]);
}
unit = inferUnit(match[3], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[4],
}
}
match = units.valueAltRegex.exec(val);
if (match && (match[1] || match[4])) {
val = parseFloat(match[1] + "." + match[4]);
if (match[3]) {
val = val * units.getMultiplier(match[3]);
}
unit = inferUnit(match[2], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[5],
}
}
return null;
}
function valueCompare(a, b, stra, strb) {
if (a === null && b === null) {
// Failed to parse both values, compare them as strings.
if (stra != strb) return stra > strb ? 1 : -1;
else return 0;
} else if (a === null) {
return 1;
} else if (b === null) {
return -1;
} else {
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
else return 0;
}
}
function validateSaveImgDimension(element) {
var valid = false;
var intValue = 0;
if (/^[1-9]\d*$/.test(element.value)) {
intValue = parseInt(element.value);
if (intValue <= 16000) {
valid = true;
}
}
if (valid) {
element.classList.remove("invalid");
} else {
element.classList.add("invalid");
}
return intValue;
}
function saveImage(layer) {
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
var bgcolor = null;
if (!document.getElementById("render-save-transparent").checked) {
var style = getComputedStyle(topmostdiv);
bgcolor = style.getPropertyValue("background-color");
}
if (!width || !height) return;
// Prepare image
var canvas = document.createElement("canvas");
var layerdict = {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
bg: canvas,
fab: canvas,
silk: canvas,
highlight: canvas,
layer: layer,
}
// Do the rendering
recalcLayerScale(layerdict, width, height);
prepareLayer(layerdict);
clearCanvas(canvas, bgcolor);
drawBackground(layerdict, false);
drawHighlightsOnLayer(layerdict, false);
// Save image
var imgdata = canvas.toDataURL("image/png");
var filename = pcbdata.metadata.title;
if (pcbdata.metadata.revision) {
filename += `.${pcbdata.metadata.revision}`;
}
filename += `.${layer}.png`;
saveFile(filename, dataURLtoBlob(imgdata));
}
function saveSettings() {
var data = {
type: "InteractiveHtmlBom settings",
version: 1,
pcbmetadata: pcbdata.metadata,
settings: settings,
}
var blob = new Blob([JSON.stringify(data, null, 4)], {
type: "application/json"
});
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}
function loadSettings() {
var input = document.createElement("input");
input.type = "file";
input.accept = ".settings.json";
input.onchange = function(e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = readerEvent => {
var content = readerEvent.target.result;
var newSettings;
try {
newSettings = JSON.parse(content);
} catch (e) {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
if (newSettings.type != "InteractiveHtmlBom settings") {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
if (metadataMatches) {
for (var k in pcbdata.metadata) {
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
metadataMatches = false;
}
}
}
if (!metadataMatches) {
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
if (!confirm(
`Settins file metadata does not match current metadata.\n\n` +
`Page metadata:\n${currentMetadata}\n\n` +
`Settings file metadata:\n${fileMetadata}\n\n` +
`Press OK if you would like to import settings anyway.`)) {
return;
}
}
overwriteSettings(newSettings.settings);
}
reader.readAsText(file, 'UTF-8');
}
input.click();
}
function overwriteSettings(newSettings) {
initDone = false;
Object.assign(settings, newSettings);
writeStorage("bomlayout", settings.bomlayout);
writeStorage("bommode", settings.bommode);
writeStorage("canvaslayout", settings.canvaslayout);
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
for (var checkbox of settings.checkboxes) {
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
}
writeStorage("markWhenChecked", settings.markWhenChecked);
padsVisible(settings.renderPads);
document.getElementById("padsCheckbox").checked = settings.renderPads;
fabricationVisible(settings.renderFabrication);
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
silkscreenVisible(settings.renderSilkscreen);
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
referencesVisible(settings.renderReferences);
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
valuesVisible(settings.renderValues);
document.getElementById("valuesCheckbox").checked = settings.renderValues;
tracksVisible(settings.renderTracks);
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
zonesVisible(settings.renderZones);
document.getElementById("zonesCheckbox").checked = settings.renderZones;
dnpOutline(settings.renderDnpOutline);
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
setRedrawOnDrag(settings.redrawOnDrag);
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
setDarkMode(settings.darkMode);
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
setHighlightPin1(settings.highlightpin1);
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
showFootprints(settings.show_footprints);
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
initDone = true;
prepCheckboxes();
changeBomLayout(settings.bomlayout);
}
function saveFile(filename, blob) {
var link = document.createElement("a");
var objurl = URL.createObjectURL(blob);
link.download = filename;
link.href = objurl;
link.click();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime
});
}
var settings = {
canvaslayout: "default",
bomlayout: "default",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: false,
redrawOnDrag: true,
boardRotation: 0,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
columnOrder: [],
hiddenColumns: [],
}
function initDefaults() {
settings.bomlayout = readStorage("bomlayout");
if (settings.bomlayout === null) {
settings.bomlayout = config.bom_view;
}
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
settings.bomlayout = config.bom_view;
}
settings.bommode = readStorage("bommode");
if (settings.bommode === null) {
settings.bommode = "grouped";
}
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
settings.bommode = "grouped";
}
settings.canvaslayout = readStorage("canvaslayout");
if (settings.canvaslayout === null) {
settings.canvaslayout = config.layer_view;
}
var bomCheckboxes = readStorage("bomCheckboxes");
if (bomCheckboxes === null) {
bomCheckboxes = config.checkboxes;
}
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
document.getElementById("bomCheckboxes").value = bomCheckboxes;
settings.markWhenChecked = readStorage("markWhenChecked") || "";
populateMarkWhenCheckedOptions();
function initBooleanSetting(storageString, def, elementId, func) {
var b = readStorage(storageString);
if (b === null) {
b = def;
} else {
b = (b == "true");
}
document.getElementById(elementId).checked = b;
func(b);
}
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
if ("tracks" in pcbdata) {
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
} else {
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
tracksVisible(false);
zonesVisible(false);
}
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
var hcols = JSON.parse(readStorage("hiddenColumns"));
if (hcols === null) {
hcols = [];
}
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
var cord = JSON.parse(readStorage("columnOrder"));
if (cord === null) {
cord = fields;
} else {
cord = cord.filter(e => fields.includes(e));
if (cord.length != fields.length)
cord = fields;
}
settings.columnOrder = cord;
settings.boardRotation = readStorage("boardRotation");
if (settings.boardRotation === null) {
settings.boardRotation = config.board_rotation * 5;
} else {
settings.boardRotation = parseInt(settings.boardRotation);
}
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function() {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function(eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function(eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for (callback of this.callbacks[eventType])
callback(event);
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
var point = [
linepoint[0] * text.width + offsetx,
linepoint[1] * text.height + offsety
];
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
return point;
}
function drawText(ctx, text, color) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if ("svgpath" in text) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
ctx.translate(...text.pos);
ctx.translate(text.thickness * 0.5, 0);
var angle = -text.angle;
if (text.attr.includes("mirrored")) {
ctx.scale(-1, 1);
angle = -angle;
}
var tilt = 0;
if (text.attr.includes("italic")) {
tilt = 0.125;
}
var interline = text.height * 1.5 + text.thickness;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
for (var i in txt) {
var lineWidth = text.thickness + interline / 2 * tilt;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
}
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
}
}
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
var inOverbar = false;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
} else if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
if (txt[i][j] != '~') {
inOverbar = !inOverbar;
}
}
var glyph = pcbdata.font_data[txt[i][j]];
if (inOverbar) {
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
if (!lastHadOverbar) {
overbarStart[0] += text.height * 1.4 * tilt;
lastHadOverbar = true;
}
ctx.beginPath();
ctx.moveTo(...overbarStart);
ctx.lineTo(...overbarEnd);
ctx.stroke();
} else {
lastHadOverbar = false;
}
for (var line of glyph.l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var k = 1; k < line.length; k++) {
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
}
ctx.stroke();
}
offsetx += glyph.w * text.width;
}
offsety += interline;
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
if ("svgpath" in edge) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "rect") {
ctx.moveTo(...edge.start);
ctx.lineTo(edge.start[0], edge.end[1]);
ctx.lineTo(...edge.end);
ctx.lineTo(edge.end[0], edge.start[1]);
ctx.lineTo(...edge.start);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
if("filled" in edge && edge.filled)
ctx.fill();
else
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if ("svgpath" in shape) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, scalefactor, shape, color) {
ctx.save();
if (!("svgpath" in shape)) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
if("filled" in shape && !shape.filled) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke(getPolygonsPath(shape));
} else {
ctx.fillStyle = color;
ctx.fill(getPolygonsPath(shape));
}
ctx.restore();
}
function drawDrawing(ctx, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, scalefactor, drawing, color);
} else {
drawText(ctx, drawing, color);
}
}
function getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline) {
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(deg2rad(pad.angle));
if (pad.offset) {
ctx.translate(...pad.offset);
}
ctx.fillStyle = color;
ctx.strokeStyle = color;
var path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
ctx.restore();
}
function drawPadHole(ctx, pad, padHoleColor) {
if (pad.type != "th") return;
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(deg2rad(pad.angle));
ctx.fillStyle = padHoleColor;
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
ctx.restore();
}
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
if (highlight) {
// draw bounding box
if (footprint.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...footprint.bbox.pos);
ctx.rotate(deg2rad(-footprint.bbox.angle));
ctx.translate(...footprint.bbox.relpos);
ctx.fillStyle = colors.pad;
ctx.fillRect(0, 0, ...footprint.bbox.size);
ctx.globalAlpha = 1;
ctx.strokeStyle = colors.pad;
ctx.strokeRect(0, 0, ...footprint.bbox.size);
ctx.restore();
}
}
// draw drawings
for (var drawing of footprint.drawings) {
if (drawing.layer == layer) {
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
}
}
// draw pads
if (settings.renderPads) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, colors.pad, outline);
if (pad.pin1 && settings.highlightpin1) {
drawPad(ctx, pad, colors.outline, true);
}
}
}
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, colors.padHole);
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawDrawing(ctx, scalefactor, edge, edgecolor);
}
}
function drawFootprints(canvas, layer, scalefactor, highlight) {
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3 / scalefactor;
var style = getComputedStyle(topmostdiv);
var colors = {
pad: style.getPropertyValue('--pad-color'),
padHole: style.getPropertyValue('--pad-hole-color'),
outline: style.getPropertyValue('--pin1-outline-color'),
}
for (var i = 0; i < pcbdata.footprints.length; i++) {
var mod = pcbdata.footprints[i];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
var h = highlightedFootprints.includes(i);
var d = markedFootprints.has(i);
if (highlight) {
if(h && d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
} else if (h) {
colors.pad = style.getPropertyValue('--pad-color-highlight');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
} else if (d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
}
}
if( h || d || !highlight) {
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata.drawings[layername][layer]) {
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, scalefactor, d, polygonColor);
} else {
drawText(ctx, d, textColor);
}
}
}
function drawTracks(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.lineCap = "round";
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
ctx.lineWidth = track.width;
ctx.beginPath();
if ('radius' in track) {
ctx.arc(
...track.center,
track.radius,
deg2rad(track.startangle),
deg2rad(track.endangle));
} else {
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
}
ctx.stroke();
}
}
function drawZones(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineJoin = "round";
for (var zone of pcbdata.zones[layer]) {
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
if (highlight && highlightedNet != zone.net) continue;
ctx.fill(zone.path2d);
if (zone.width > 0) {
ctx.lineWidth = zone.width;
ctx.stroke(zone.path2d);
}
}
}
function clearCanvas(canvas, color = null) {
var ctx = canvas.getContext("2d");
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
if (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
} else {
if (!window.matchMedia("print").matches)
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var padHoleColor = style.getPropertyValue('--pad-hole-color');
var ctx = canvas.getContext("2d");
for (var footprint of pcbdata.footprints) {
// draw pads
var padDrawn = false;
for (var pad of footprint.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false);
padDrawn = true;
}
}
if (padDrawn) {
// redraw all pad holes because some pads may overlap
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, padHoleColor);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
drawFootprints(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawFootprints(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
function prepareCanvas(canvas, flip, transform) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
var fontsize = 1.55;
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer == "B");
for (var c of ["bg", "fab", "silk", "highlight"]) {
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
}
}
function rotateVector(v, angle) {
angle = deg2rad(angle);
return [
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
];
}
function applyRotation(bbox) {
var corners = [
[bbox.minx, bbox.miny],
[bbox.minx, bbox.maxy],
[bbox.maxx, bbox.miny],
[bbox.maxx, bbox.maxy],
];
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
return {
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
}
}
function recalcLayerScale(layerdict, width, height) {
var bbox = applyRotation(pcbdata.edges_bbox);
var scalefactor = 0.98 * Math.min(
width / (bbox.maxx - bbox.minx),
height / (bbox.maxy - bbox.miny)
);
if (scalefactor < 0.1) {
scalefactor = 1;
}
layerdict.transform.s = scalefactor;
var flip = (layerdict.layer == "B");
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function modulo(n, mod) {
return ((n % mod) + mod) % mod;
}
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
var dx = x - xc;
var dy = y - yc;
var r_sq = dx * dx + dy * dy;
var rmin = Math.max(0, radius - d);
var rmax = radius + d;
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
return false;
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
var dx1 = xc + radius * Math.cos(angle1) - x;
var dy1 = yc + radius * Math.sin(angle1) - y;
if (dx1 * dx1 + dy1 * dy1 <= d * d)
return true;
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
var dx2 = xc + radius * Math.cos(angle2) - x;
var dy2 = yc + radius * Math.sin(angle2) - y;
if (dx2 * dx2 + dy2 * dy2 <= d * d)
return true;
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
if (angle1 > angle2)
return (angle >= angle2 || angle <= angle1);
else
return (angle >= angle1 && angle <= angle2);
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, -pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for (var track of pcbdata.tracks[layer]) {
if ('radius' in track) {
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
return track.net;
}
} else {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
}
// Check pads
if (settings.renderPads) {
for (var footprint of pcbdata.footprints) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinFootprintBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.footprints.length; i++) {
var footprint = pcbdata.footprints[i];
if (footprint.layer == layer) {
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0 && e.button != 1) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
if (layerdict.layer == "B") {
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
} else {
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
}
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
var v = rotateVector([x, y], -settings.boardRotation);
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var footprints = bboxHitScan(layerdict.layer, ...v);
if (footprints.length > 0) {
footprintsClicked(footprints);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist / oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
}
function handleMouseWheel(e, layerdict) {
e.preventDefault();
e.stopPropagation();
var t = layerdict.transform;
var wheeldelta = e.deltaY;
if (e.deltaMode == 1) {
// FF only, scroll by lines
wheeldelta *= 30;
} else if (e.deltaMode == 2) {
wheeldelta *= 300;
}
var m = Math.pow(1.1, -wheeldelta / 40);
// Limit amount of zoom per tick.
if (m > 2) {
m = 2;
} else if (m < 0.5) {
m = 0.5;
}
t.zoom *= m;
var zoomd = (1 - m) / t.zoom;
t.panx += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function initRender() {
allcanvas = {
front: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("F_bg"),
fab: document.getElementById("F_fab"),
silk: document.getElementById("F_slk"),
highlight: document.getElementById("F_hl"),
layer: "F",
},
back: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("B_bg"),
fab: document.getElementById("B_fab"),
silk: document.getElementById("B_slk"),
highlight: document.getElementById("B_hl"),
layer: "B",
}
};
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/*
* Table reordering via Drag'n'Drop
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
*/
function setBomHandlers() {
const bom = document.getElementById('bomtable');
let dragName;
let placeHolderElements;
let draggingElement;
let forcePopulation;
let xOffset;
let yOffset;
let wasDragged;
const mouseUpHandler = function(e) {
// Delete dragging element
draggingElement.remove();
// Make BOM selectable again
bom.style.removeProperty("userSelect");
// Remove listeners
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
if (wasDragged) {
// Redraw whole BOM
populateBomTable();
}
}
const mouseMoveHandler = function(e) {
// Notice the dragging
wasDragged = true;
// Make the dragged element visible
draggingElement.style.removeProperty("display");
// Set elements position to mouse position
draggingElement.style.left = `${e.screenX - xOffset}px`;
draggingElement.style.top = `${e.screenY - yOffset}px`;
// Forced redrawing of BOM table
if (forcePopulation) {
forcePopulation = false;
// Copy array
phe = Array.from(placeHolderElements);
// populate BOM table again
populateBomHeader(dragName, phe);
populateBomBody(dragName, phe);
}
// Set up array of hidden columns
var hiddenColumns = Array.from(settings.hiddenColumns);
// In the ungrouped mode, quantity don't exist
if (settings.bommode === "ungrouped")
hiddenColumns.push("Quantity");
// If no checkbox fields can be found, we consider them hidden
if (settings.checkboxes.length == 0)
hiddenColumns.push("checkboxes");
// Get table headers and group them into checkboxes, extrafields and normal headers
const bh = document.getElementById("bomhead");
headers = Array.from(bh.querySelectorAll("th"))
headers.shift() // numCol is not part of the columnOrder
headerGroups = []
lastCompoundClass = null;
for (i = 0; i < settings.columnOrder.length; i++) {
cElem = settings.columnOrder[i];
if (hiddenColumns.includes(cElem)) {
// Hidden columns appear as a dummy element
headerGroups.push([]);
continue;
}
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
if (elem.classList.contains("bom-checkbox")) {
if (lastCompoundClass === "bom-checkbox") {
cbGroup = headerGroups.pop();
cbGroup.push(elem);
headerGroups.push(cbGroup);
} else {
lastCompoundClass = "bom-checkbox";
headerGroups.push([elem])
}
} else {
headerGroups.push([elem])
}
}
// Copy settings.columnOrder
var columns = Array.from(settings.columnOrder)
// Set up array with indices of hidden columns
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
var dragIndex = columns.indexOf(dragName);
var swapIndex = dragIndex;
var swapDone = false;
// Check if the current dragged element is swapable with the left or right element
if (dragIndex > 0) {
// Get left headers boundingbox
swapIndex = dragIndex - 1;
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
swapIndex--;
if (!hiddenIndices.includes(swapIndex)) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
// Get right headers boundingbox
swapIndex = dragIndex + 1;
while (hiddenIndices.includes(swapIndex))
swapIndex++;
if (swapIndex < headerGroups.length) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
// Write back change to storage
if (swapDone) {
settings.columnOrder = columns
writeStorage("columnOrder", JSON.stringify(columns));
}
}
const mouseDownHandler = function(e) {
var target = e.target;
if (target.tagName.toLowerCase() != "td")
target = target.parentElement;
// Used to check if a dragging has ever happened
wasDragged = false;
// Create new element which will be displayed as the dragged column
draggingElement = document.createElement("div")
draggingElement.classList.add("dragging");
draggingElement.style.display = "none";
draggingElement.style.position = "absolute";
draggingElement.style.overflow = "hidden";
// Get bomhead and bombody elements
const bh = document.getElementById("bomhead");
const bb = document.getElementById("bombody");
// Get all compound headers for the current column
var compoundHeaders;
if (target.classList.contains("bom-checkbox")) {
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
} else {
compoundHeaders = [target];
}
// Create new table which will display the column
var newTable = document.createElement("table");
newTable.classList.add("bom");
newTable.style.background = "white";
draggingElement.append(newTable);
// Create new header element
var newHeader = document.createElement("thead");
newTable.append(newHeader);
// Set up array for storing all placeholder elements
placeHolderElements = [];
// Add all compound headers to the new thead element and placeholders
compoundHeaders.forEach(function(h) {
clone = cloneElementWithDimensions(h);
newHeader.append(clone);
placeHolderElements.push(clone);
});
// Create new body element
var newBody = document.createElement("tbody");
newTable.append(newBody);
// Get indices for compound headers
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
// For each row in the BOM body...
var rows = bb.querySelectorAll("tr");
rows.forEach(function(row) {
// ..get the cells for the compound column
const tds = row.querySelectorAll("td");
var copytds = idxs.map(i => tds[i]);
// Add them to the new element and the placeholders
var newRow = document.createElement("tr");
copytds.forEach(function(td) {
clone = cloneElementWithDimensions(td);
newRow.append(clone);
placeHolderElements.push(clone);
});
newBody.append(newRow);
});
// Compute width for compound header
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
draggingElement.style.width = `${width}px`;
// Insert the new dragging element and disable selection on BOM
bom.insertBefore(draggingElement, null);
bom.style.userSelect = "none";
// Determine the mouse position offset
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
yOffset = e.screenY - compoundHeaders[0].offsetTop;
// Get name for the column in settings.columnOrder
dragName = getColumnOrderName(target);
// Change text and class for placeholder elements
placeHolderElements = placeHolderElements.map(function(e) {
newElem = cloneElementWithDimensions(e);
newElem.textContent = "";
newElem.classList.add("placeholder");
return newElem;
});
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
forcePopulation = true;
// Add listeners for move and up on mouse
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
// In netlist mode, there is nothing to reorder
if (settings.bommode === "netlist")
return;
// Add mouseDownHandler to every column except the numCol
bom.querySelectorAll("th")
.forEach(function(head) {
if (!head.classList.contains("numCol")) {
head.onmousedown = mouseDownHandler;
}
});
}
function getBoundingClientRectFromMultiple(elements) {
var elems = Array.from(elements);
if (elems.length == 0)
return null;
var box = elems.shift()
.getBoundingClientRect();
elems.forEach(function(elem) {
var elembox = elem.getBoundingClientRect();
box.left = Math.min(elembox.left, box.left);
box.top = Math.min(elembox.top, box.top);
box.width += elembox.width;
box.height = Math.max(elembox.height, box.height);
});
return box;
}
function cloneElementWithDimensions(elem) {
var newElem = elem.cloneNode(true);
newElem.style.height = window.getComputedStyle(elem).height;
newElem.style.width = window.getComputedStyle(elem).width;
return newElem;
}
function getBomTableHeaderIndex(elem) {
const bh = document.getElementById('bomhead');
const ths = Array.from(bh.querySelectorAll("th"));
return ths.indexOf(elem);
}
function getColumnOrderName(elem) {
var cname = elem.getAttribute("col_name");
if (cname === "bom-checkbox")
return "checkboxes";
else
return cname;
}
function resizableGrid(tablehead) {
var cols = tablehead.firstElementChild.children;
var rowWidth = tablehead.offsetWidth;
for (var i = 1; i < cols.length; i++) {
if (cols[i].classList.contains("bom-checkbox"))
continue;
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
}
for (var i = 1; i < cols.length - 1; i++) {
var div = document.createElement('div');
div.className = "column-width-handle";
cols[i].appendChild(div);
setListeners(div);
}
function setListeners(div) {
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
div.addEventListener('mousedown', function(e) {
e.preventDefault();
e.stopPropagation();
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
startX = e.pageX;
var padding = paddingDiff(curCol);
rowWidth = curCol.parentElement.offsetWidth;
curColWidth = curCol.clientWidth - padding;
nxtColWidth = nxtCol.clientWidth - padding;
});
document.addEventListener('mousemove', function(e) {
if (startX) {
var diffX = e.pageX - startX;
diffX = -Math.min(-diffX, curColWidth - 20);
diffX = Math.min(diffX, nxtColWidth - 20);
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
}
});
document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
startX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}
function paddingDiff(col) {
if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}
var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));
}
function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* DOM manipulation and misc code */
var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
var highlightedNet = null;
var lastClicked;
function dbg(html) {
dbgdiv.innerHTML = html;
}
function redrawIfInitDone() {
if (initDone) {
redrawCanvas(allcanvas.front);
redrawCanvas(allcanvas.back);
}
}
function padsVisible(value) {
writeStorage("padsVisible", value);
settings.renderPads = value;
redrawIfInitDone();
}
function referencesVisible(value) {
writeStorage("referencesVisible", value);
settings.renderReferences = value;
redrawIfInitDone();
}
function valuesVisible(value) {
writeStorage("valuesVisible", value);
settings.renderValues = value;
redrawIfInitDone();
}
function tracksVisible(value) {
writeStorage("tracksVisible", value);
settings.renderTracks = value;
redrawIfInitDone();
}
function zonesVisible(value) {
writeStorage("zonesVisible", value);
settings.renderZones = value;
redrawIfInitDone();
}
function dnpOutline(value) {
writeStorage("dnpOutline", value);
settings.renderDnpOutline = value;
redrawIfInitDone();
}
function setDarkMode(value) {
if (value) {
topmostdiv.classList.add("dark");
} else {
topmostdiv.classList.remove("dark");
}
writeStorage("darkmode", value);
settings.darkMode = value;
redrawIfInitDone();
}
function setShowBOMColumn(field, value) {
if (field === "references") {
var rl = document.getElementById("reflookup");
rl.disabled = !value;
if (!value) {
rl.value = "";
updateRefLookup("");
}
}
var n = settings.hiddenColumns.indexOf(field);
if (value) {
if (n != -1) {
settings.hiddenColumns.splice(n, 1);
}
} else {
if (n == -1) {
settings.hiddenColumns.push(field);
}
}
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
if (initDone) {
populateBomTable();
}
redrawIfInitDone();
}
function setFullscreen(value) {
if (value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
function getStoredCheckboxRefs(checkbox) {
function convert(ref) {
var intref = parseInt(ref);
if (isNaN(intref)) {
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.footprints[i].ref == ref) {
return i;
}
}
return -1;
} else {
return intref;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
function getCheckboxState(checkbox, references) {
var storedRefsSet = getStoredCheckboxRefs(checkbox);
var currentRefsSet = new Set(references.map(r => r[1]));
// Get difference of current - stored
var difference = new Set(currentRefsSet);
for (ref of storedRefsSet) {
difference.delete(ref);
}
if (difference.size == 0) {
// All the current refs are stored
return "checked";
} else if (difference.size == currentRefsSet.size) {
// None of the current refs are stored
return "unchecked";
} else {
// Some of the refs are stored
return "indeterminate";
}
}
function setBomCheckboxState(checkbox, element, references) {
var state = getCheckboxState(checkbox, references);
element.checked = (state == "checked");
element.indeterminate = (state == "indeterminate");
}
function createCheckboxChangeHandler(checkbox, references, row) {
return function () {
refsSet = getStoredCheckboxRefs(checkbox);
var markWhenChecked = settings.markWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (markWhenChecked) {
row.classList.add("checked");
for (var ref of references) {
markedFootprints.add(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (markWhenChecked) {
row.classList.remove("checked");
for (var ref of references) {
markedFootprints.delete(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'unchecked';
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
}
}
function clearHighlightedFootprints() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedFootprints = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function () {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
EventHandler.emitEvent(
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
rowid: rowid,
refs: refs,
net: net
});
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
if (!settings.hiddenColumns.includes("references")) {
for (var ref of entry) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
// check fields
for (var i in config.fields) {
var f = config.fields[i];
if (!settings.hiddenColumns.includes(f)) {
for (var ref of entry) {
if (pcbdata.bom.fields[ref[1]][i].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
}
return false;
}
function findRefInEntry(entry) {
return entry.filter(r => r[0].toLowerCase() == reflookup);
}
function highlightFilter(s) {
if (!filter) {
return s;
}
var parts = s.toLowerCase().split(filter);
if (parts.length == 1) {
return s;
}
var r = "";
var pos = 0;
for (var i in parts) {
if (i > 0) {
r += '<mark class="highlight">' +
s.substring(pos, pos + filter.length) +
'</mark>';
pos += filter.length;
}
r += s.substring(pos, pos + parts[i].length);
pos += parts[i].length;
}
return r;
}
function checkboxSetUnsetAllHandler(checkboxname) {
return function () {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (checkboxnum >= settings.checkboxes.length) {
return;
}
var allset = true;
var checkbox;
var row;
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
if (!checkbox.checked || checkbox.indeterminate) {
allset = false;
break;
}
}
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = !allset;
checkbox.indeterminate = false;
checkbox.onchange();
}
}
}
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
if (is_checkbox)
th.setAttribute("col_name", "bom-checkbox");
else
th.setAttribute("col_name", name);
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
var spacer = document.createElement("div");
spacer.className = "column-spacer";
th.appendChild(spacer);
spacer.onclick = function () {
if (currentSortColumn && th !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && th === currentSortColumn) {
// Already sorted by this column
if (currentSortOrder == "asc") {
// Sort by this column, descending order
bomSortFunction = function (a, b) {
return -comparator(a, b);
}
currentSortColumn.childNodes[1].classList.remove("asc");
currentSortColumn.childNodes[1].classList.add("desc");
currentSortOrder = "desc";
} else {
// Unsort
bomSortFunction = null;
currentSortColumn.childNodes[1].classList.remove("desc");
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
} else {
// Sort by this column, ascending order
bomSortFunction = comparator;
currentSortColumn = th;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
if (is_checkbox) {
spacer.onclick = fancyDblClickHandler(
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
}
return th;
}
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
var vismenu = document.createElement("div");
vismenu.id = "vismenu";
vismenu.classList.add("menu");
var visbutton = document.createElement("div");
visbutton.classList.add("visbtn");
visbutton.classList.add("hideonprint");
var viscontent = document.createElement("div");
viscontent.classList.add("menu-content");
viscontent.id = "vismenu-content";
settings.columnOrder.forEach(column => {
if (typeof column !== "string")
return;
// Skip empty columns
if (column === "checkboxes" && settings.checkboxes.length == 0)
return;
else if (column === "Quantity" && settings.bommode == "ungrouped")
return;
var label = document.createElement("label");
label.classList.add("menu-label");
var input = document.createElement("input");
input.classList.add("visibility_checkbox");
input.type = "checkbox";
input.onchange = function (e) {
setShowBOMColumn(column, e.target.checked)
};
input.checked = !(settings.hiddenColumns.includes(column));
label.appendChild(input);
if (column.length > 0)
label.append(column[0].toUpperCase() + column.slice(1));
viscontent.appendChild(label);
});
viscontent.childNodes[0].classList.add("menu-label-top");
vismenu.appendChild(visbutton);
if (settings.bommode != "netlist") {
vismenu.appendChild(viscontent);
th.appendChild(vismenu);
}
tr.appendChild(th);
var checkboxCompareClosure = function (checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a);
var stateB = getCheckboxState(checkbox, b);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
var stringFieldCompareClosure = function (fieldIndex) {
return (a, b) => {
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
var compareRefs = (a, b) => {
var ra = referenceRegex.exec(a);
var rb = referenceRegex.exec(b);
if (ra === null || rb === null) {
if (a != b) return a > b ? 1 : -1;
return 0;
} else {
if (ra.groups.prefix != rb.groups.prefix) {
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
}
if (ra.groups.number != rb.groups.number) {
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
}
return 0;
}
}
if (settings.bommode == "netlist") {
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
});
tr.appendChild(th);
} else {
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
var valueIndex = config.fields.indexOf("Value");
var footprintIndex = config.fields.indexOf("Footprint");
columns.forEach((column) => {
if (column === placeHolderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
tr.appendChild(th);
}
} else if (column === "References") {
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
var i = 0;
while (i < a.length && i < b.length) {
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
i++;
}
return a.length - b.length;
}));
} else if (column === "Value") {
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
var ra = a[0][1], rb = b[0][1];
return valueCompare(
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
}));
return;
} else if (column === "Footprint") {
tr.appendChild(createColumnHeader(
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
} else if (column === "Quantity" && settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
return a.length - b.length;
}));
} else {
// Other fields
var i = config.fields.indexOf(column);
if (i < 0)
return;
tr.appendChild(createColumnHeader(
column, `field${i + 1}`, stringFieldCompareClosure(i)));
}
});
}
bomhead.appendChild(tr);
}
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
footprintIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
if (settings.bommode == "netlist") {
bomtable = pcbdata.nets.slice();
} else {
switch (settings.canvaslayout) {
case 'F':
bomtable = pcbdata.bom.F.slice();
break;
case 'FB':
bomtable = pcbdata.bom.both.slice();
break;
case 'B':
bomtable = pcbdata.bom.B.slice();
break;
}
if (settings.bommode == "ungrouped") {
// expand bom table
expandedTable = []
for (var bomentry of bomtable) {
for (var ref of bomentry) {
expandedTable.push([ref]);
}
}
bomtable = expandedTable;
}
}
if (bomSortFunction) {
bomtable = bomtable.sort(bomSortFunction);
}
for (var i in bomtable) {
var bomentry = bomtable[i];
if (filter && !entryMatches(bomentry)) {
continue;
}
var references = null;
var netname = null;
var tr = document.createElement("TR");
var td = document.createElement("TD");
var rownum = +i + 1;
tr.id = "bomrow" + rownum;
td.textContent = rownum;
tr.appendChild(td);
if (settings.bommode == "netlist") {
netname = bomentry;
td = document.createElement("TD");
td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
tr.appendChild(td);
} else {
if (reflookup) {
references = findRefInEntry(bomentry);
if (references.length == 0) {
continue;
}
} else {
references = bomentry;
}
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
columns.forEach((column) => {
if (column === placeholderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
if (checkbox) {
td = document.createElement("TD");
var input = document.createElement("input");
input.type = "checkbox";
input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
setBomCheckboxState(checkbox, input, references);
if (input.checked && settings.markWhenChecked == checkbox) {
tr.classList.add("checked");
}
td.appendChild(input);
tr.appendChild(td);
}
}
} else if (column === "References") {
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
} else if (column === "Quantity" && settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = references.length;
tr.appendChild(td);
} else {
// All the other fields
var field_index = config.fields.indexOf(column)
if (field_index < 0)
return;
var valueSet = new Set();
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
td = document.createElement("TD");
td.innerHTML = highlightFilter(Array.from(valueSet).join(", "));
tr.appendChild(td);
}
});
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
footprintIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
if ((filter || reflookup) && first) {
handler();
first = false;
}
}
EventHandler.emitEvent(
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
filter: filter,
reflookup: reflookup,
checkboxes: settings.checkboxes,
bommode: settings.bommode,
});
}
function highlightPreviousRow() {
if (!currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[0].id == currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
for (var i = 0; i < highlightHandlers.length - 1; i++) {
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function highlightNextRow() {
if (!currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
for (var i = 1; i < highlightHandlers.length; i++) {
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function populateBomTable() {
populateBomHeader();
populateBomBody();
setBomHandlers();
resizableGrid(bomhead);
}
function footprintsClicked(footprintIndexes) {
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
for (var i = 1; i <= footprintIndexes.length; i++) {
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
if (refIndex in footprintIndexToHandler) {
lastClicked = refIndex;
footprintIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedFootprints();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
function changeCanvasLayout(layout) {
document.getElementById("fl-btn").classList.remove("depressed");
document.getElementById("fb-btn").classList.remove("depressed");
document.getElementById("bl-btn").classList.remove("depressed");
switch (layout) {
case 'F':
document.getElementById("fl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
function populateMetadata() {
document.getElementById("title").innerHTML = pcbdata.metadata.title;
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
document.getElementById("company").innerHTML = pcbdata.metadata.company;
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
if (pcbdata.metadata.title != "") {
document.title = pcbdata.metadata.title + " BOM";
}
// Calculate board stats
var fp_f = 0,
fp_b = 0,
pads_f = 0,
pads_b = 0,
pads_th = 0;
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.footprints[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
// Update version string
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}
function changeBomLayout(layout) {
document.getElementById("bom-btn").classList.remove("depressed");
document.getElementById("lr-btn").classList.remove("depressed");
document.getElementById("tb-btn").classList.remove("depressed");
switch (layout) {
case 'bom-only':
document.getElementById("bom-btn").classList.add("depressed");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
document.getElementById("frontcanvas").style.display = "none";
document.getElementById("backcanvas").style.display = "none";
document.getElementById("bot").style.height = "";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.remove("split-horizontal");
document.getElementById("canvasdiv").classList.remove("split-horizontal");
document.getElementById("frontcanvas").classList.add("split-horizontal");
document.getElementById("backcanvas").classList.add("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
direction: "vertical",
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
onDragEnd: resizeAll
});
break;
case 'left-right':
document.getElementById("lr-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.add("split-horizontal");
document.getElementById("canvasdiv").classList.add("split-horizontal");
document.getElementById("frontcanvas").classList.remove("split-horizontal");
document.getElementById("backcanvas").classList.remove("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeAll
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
var chkbxs = document.getElementsByClassName("visibility_checkbox");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = true;
}
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedFootprints();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
prepCheckboxes();
populateMarkWhenCheckedOptions();
setMarkWhenChecked(settings.markWhenChecked);
}
function setMarkWhenChecked(value) {
writeStorage("markWhenChecked", value);
settings.markWhenChecked = value;
markedFootprints.clear();
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
markedFootprints.add(ref);
}
populateBomTable();
drawHighlights();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function populateMarkWhenCheckedOptions() {
var container = document.getElementById("markWhenCheckedContainer");
if (settings.checkboxes.length == 0) {
container.parentElement.style.display = "none";
return;
}
container.innerHTML = '';
container.parentElement.style.display = "inline-block";
function createOption(name, displayName) {
var id = "markWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "markWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setMarkWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.markWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
document.onkeydown = function (e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
e.preventDefault();
}
}
}
function hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
window.onload = function (e) {
initUtils();
initRender();
initStorage();
initDefaults();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
// Triggers render
changeBomLayout(settings.bomlayout);
// Users may leave fullscreen without touching the checkbox. Uncheck.
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement)
document.getElementById('fullscreenCheckbox').checked = false;
});
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div style="float: right; height: 100%;">
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="menubtn"></button>
<div class="menu-content">
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label><!-- This comment eats space! All of it!
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
Full Screen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Pads
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP outlined
</label>
<label class="menu-label">
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
Highlight first pin
</label>
<label class="menu-label">
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
<span>Board rotation</span>
<span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Bom checkboxes</div>
<input id="bomCheckboxes" class="menu-textbox" type=text
oninput="setBomCheckboxes(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Mark when checked</div>
<div id="markWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
</div>
</div>
</div>
</div>
</div>
<div id="fileinfodiv" style="overflow: auto;">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="bot" class="split" style="height: calc(100% - 80px)">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="copyToClipboard()"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>