@tscircuit/eval 0.0.848 → 0.0.850
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blob-url.js +1 -1
- package/dist/webworker/entrypoint.js +2 -2
- package/package.json +3 -3
|
@@ -297,7 +297,7 @@ svg { font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif; }
|
|
|
297
297
|
L ${screenOutlinePoints[4].x},${screenOutlinePoints[4].y}
|
|
298
298
|
Z
|
|
299
299
|
`;svgObjects.push({name:"path",type:"element",attributes:{class:"net-label",d:pathD,fill:colorMap2.schematic.label_background,stroke:colorMap2.schematic.label_global,"stroke-width":`${getSchStrokeSize(realToScreenTransform)}px`},value:"",children:[]});let screenTextPos={x:screenAnchorPosition.x+screenTextGrowthVec.x*fontSizePx*.5,y:screenAnchorPosition.y+screenTextGrowthVec.y*fontSizePx*.5},textAnchor={left:"start",top:"start",bottom:"start",right:"end"}[schNetLabel.anchor_side],textTransformString={left:"",right:"",top:`rotate(90 ${screenTextPos.x} ${screenTextPos.y})`,bottom:`rotate(-90 ${screenTextPos.x} ${screenTextPos.y})`}[schNetLabel.anchor_side];return svgObjects.push({name:"text",type:"element",attributes:{class:"net-label-text",x:screenTextPos.x.toString(),y:screenTextPos.y.toString(),fill:colorMap2.schematic.label_global,"text-anchor":textAnchor,"dominant-baseline":"central","font-family":"sans-serif","font-variant-numeric":"tabular-nums","font-size":`${fontSizePx}px`,transform:textTransformString},children:[{type:"text",value:labelText||"",name:"",attributes:{},children:[]}],value:""}),svgObjects},createSvgObjectsFromSchematicBox=({schematicBox,transform:transform6,colorMap:colorMap2})=>{let topLeft=applyToPoint3(transform6,{x:schematicBox.x,y:schematicBox.y}),bottomRight=applyToPoint3(transform6,{x:schematicBox.x+schematicBox.width,y:schematicBox.y+schematicBox.height}),yTop=Math.min(topLeft.y,bottomRight.y),yBottom=Math.max(topLeft.y,bottomRight.y),xLeft=Math.min(topLeft.x,bottomRight.x),xRight=Math.max(topLeft.x,bottomRight.x),strokeWidthPx=getSchStrokeSize(transform6),attributes2={class:"schematic-box",x:xLeft.toString(),y:yTop.toString(),width:(xRight-xLeft).toString(),height:(yBottom-yTop).toString(),"stroke-width":`${strokeWidthPx}px`,stroke:colorMap2.schematic.component_outline||"black",fill:"transparent"};if(schematicBox.is_dashed){let dashLength=8*strokeWidthPx,gapLength=4*strokeWidthPx;attributes2["stroke-dasharray"]=`${dashLength} ${gapLength}`}return[{name:"rect",type:"element",value:"",attributes:attributes2,children:[]}]},createSvgObjectsFromSchematicTable=({schematicTable,transform:transform6,colorMap:colorMap2,circuitJson})=>{let{anchor_position,border_width=.05,anchor="center"}=schematicTable,{column_widths,row_heights}=getTableDimensions(schematicTable,circuitJson),totalWidth=column_widths.reduce((a3,b3)=>a3+b3,0),totalHeight=row_heights.reduce((a3,b3)=>a3+b3,0),topLeftX=anchor_position.x,topLeftY=anchor_position.y;anchor.includes("center")?topLeftX-=totalWidth/2:anchor.includes("right")&&(topLeftX-=totalWidth),anchor.includes("center")?topLeftY+=totalHeight/2:anchor.includes("bottom")&&(topLeftY+=totalHeight);let svgObjects=[],borderStrokeWidth=border_width*Math.abs(transform6.a),gridStrokeWidth=getSchStrokeSize(transform6),[screenTopLeftX,screenTopLeftY]=applyToPoint3(transform6,[topLeftX,topLeftY]),[screenBottomRightX,screenBottomRightY]=applyToPoint3(transform6,[topLeftX+totalWidth,topLeftY-totalHeight]);svgObjects.push({name:"rect",type:"element",attributes:{x:screenTopLeftX.toString(),y:screenTopLeftY.toString(),width:(screenBottomRightX-screenTopLeftX).toString(),height:(screenBottomRightY-screenTopLeftY).toString(),fill:"none",stroke:colorMap2.schematic.table,"stroke-width":borderStrokeWidth.toString()},children:[],value:""});let cells=circuitJson.filter(elm=>elm.type==="schematic_table_cell"&&elm.schematic_table_id===schematicTable.schematic_table_id),currentX=topLeftX;for(let i3=0;i3<column_widths.length-1;i3++){currentX+=column_widths[i3];let segmentStartY=topLeftY;for(let j4=0;j4<row_heights.length;j4++){let segmentEndY=segmentStartY-row_heights[j4];if(!cells.some(cell=>cell.start_column_index<=i3&&cell.end_column_index>i3&&cell.start_row_index<=j4&&cell.end_row_index>=j4)){let start=applyToPoint3(transform6,{x:currentX,y:segmentStartY}),end=applyToPoint3(transform6,{x:currentX,y:segmentEndY});svgObjects.push({name:"line",type:"element",attributes:{x1:start.x.toString(),y1:start.y.toString(),x2:end.x.toString(),y2:end.y.toString(),stroke:colorMap2.schematic.table,"stroke-width":gridStrokeWidth.toString()},children:[],value:""})}segmentStartY=segmentEndY}}let currentY=topLeftY;for(let i3=0;i3<row_heights.length-1;i3++){currentY-=row_heights[i3];let segmentStartX=topLeftX;for(let j4=0;j4<column_widths.length;j4++){let segmentEndX=segmentStartX+column_widths[j4];if(!cells.some(cell=>cell.start_row_index<=i3&&cell.end_row_index>i3&&cell.start_column_index<=j4&&cell.end_column_index>=j4)){let start=applyToPoint3(transform6,{x:segmentStartX,y:currentY}),end=applyToPoint3(transform6,{x:segmentEndX,y:currentY});svgObjects.push({name:"line",type:"element",attributes:{x1:start.x.toString(),y1:start.y.toString(),x2:end.x.toString(),y2:end.y.toString(),stroke:colorMap2.schematic.table,"stroke-width":gridStrokeWidth.toString()},children:[],value:""})}segmentStartX=segmentEndX}}for(let cell of cells)if(cell.text){let cellWidth=column_widths.slice(cell.start_column_index,cell.end_column_index+1).reduce((a3,b3)=>a3+b3,0),cellHeight=row_heights.slice(cell.start_row_index,cell.end_row_index+1).reduce((a3,b3)=>a3+b3,0),cellTopLeftX=topLeftX+column_widths.slice(0,cell.start_column_index).reduce((a3,b3)=>a3+b3,0),cellTopLeftY=topLeftY-row_heights.slice(0,cell.start_row_index).reduce((a3,b3)=>a3+b3,0),{cell_padding=.2}=schematicTable,horizontal_align=cell.horizontal_align??"center",vertical_align=cell.vertical_align??"middle",realTextAnchorPos={x:cellTopLeftX+cellWidth/2,y:cellTopLeftY-cellHeight/2};horizontal_align==="left"?realTextAnchorPos.x=cellTopLeftX+cell_padding:horizontal_align==="right"&&(realTextAnchorPos.x=cellTopLeftX+cellWidth-cell_padding),vertical_align==="top"?realTextAnchorPos.y=cellTopLeftY-cell_padding:vertical_align==="bottom"&&(realTextAnchorPos.y=cellTopLeftY-cellHeight+cell_padding);let screenTextAnchorPos=applyToPoint3(transform6,realTextAnchorPos),fontSize=getSchScreenFontSize(transform6,"reference_designator",cell.font_size),textAnchorMap={left:"start",center:"middle",right:"end"},dominantBaselineMap={top:"hanging",middle:"middle",bottom:"ideographic"};svgObjects.push({name:"text",type:"element",attributes:{x:screenTextAnchorPos.x.toString(),y:screenTextAnchorPos.y.toString(),"font-size":`${fontSize}px`,"text-anchor":textAnchorMap[horizontal_align],"dominant-baseline":dominantBaselineMap[vertical_align],fill:colorMap2.schematic.table,"font-family":"sans-serif"},children:[{type:"text",value:cell.text,name:"",attributes:{},children:[]}],value:""})}return[{name:"g",type:"element",attributes:{"data-schematic-table-id":schematicTable.schematic_table_id},children:svgObjects,value:""}]},PIN_CIRCLE_RADIUS_MM2=.02,createSvgObjectsForSchPortHover=({schPort,transform:transform6})=>{let screenSchPortPos=applyToPoint3(transform6,schPort.center),pinRadiusPx=Math.abs(transform6.a)*PIN_CIRCLE_RADIUS_MM2*2;return[{name:"g",type:"element",value:"",attributes:{class:"schematic-port-hover","data-schematic-port-id":schPort.source_port_id},children:[{name:"circle",type:"element",value:"",attributes:{cx:screenSchPortPos.x.toString(),cy:screenSchPortPos.y.toString(),r:pinRadiusPx.toString(),fill:"red",opacity:"0"},children:[]}]}]},createSvgObjectsForSchComponentPortHovers=({component,transform:transform6,circuitJson})=>{let schematicPorts=su2(circuitJson).schematic_port.list({schematic_component_id:component.schematic_component_id}),svgs=[];for(let schPort of schematicPorts)svgs.push(...createSvgObjectsForSchPortHover({schPort,transform:transform6}));return svgs},PIN_CIRCLE_RADIUS_MM3=.02,createSvgObjectsForSchPortIndicator=({schPort,transform:transform6,circuitJson,colorMap:colorMap2})=>{let svgObjects=[],radiusPx=Math.abs(transform6.a)*PIN_CIRCLE_RADIUS_MM3,strokeWidth=Math.abs(transform6.a)*PIN_CIRCLE_RADIUS_MM3,screenPos=applyToPoint3(transform6,schPort.center);svgObjects.push({name:"circle",type:"element",value:"",attributes:{class:"component-pin",cx:screenPos.x.toString(),cy:screenPos.y.toString(),r:radiusPx.toString(),fill:"none",stroke:colorMap2.schematic.component_outline,"stroke-width":strokeWidth.toString(),"data-schematic-port-id":schPort.schematic_port_id},children:[]});let sourcePort=circuitJson.find(e5=>e5.type==="source_port"&&e5.source_port_id===schPort.source_port_id),label=schPort.display_pin_label??sourcePort?.name;if(label){let labelPos={...schPort.center},distanceFromComponentEdge=schPort.distance_from_component_edge??0,labelOffset=.05,textAnchor="middle",rotation5="";switch(schPort.facing_direction){case"left":labelPos.x+=distanceFromComponentEdge/2,labelPos.y+=labelOffset,textAnchor="start";break;case"right":labelPos.x-=distanceFromComponentEdge/2,labelPos.y+=labelOffset,textAnchor="end";break;case"up":labelPos.y-=distanceFromComponentEdge/2,labelPos.x-=labelOffset,textAnchor="middle";break;case"down":labelPos.y+=distanceFromComponentEdge/2,labelPos.x-=labelOffset,textAnchor="middle";break}let screenLabelPos=applyToPoint3(transform6,labelPos),fontSizePx=getSchScreenFontSize(transform6,"pin_number");(schPort.facing_direction==="up"||schPort.facing_direction==="down")&&(rotation5=`rotate(-90 ${screenLabelPos.x} ${screenLabelPos.y})`),svgObjects.push({name:"text",type:"element",value:"",attributes:{class:"port-indicator-label",x:screenLabelPos.x.toString(),y:screenLabelPos.y.toString(),fill:colorMap2.schematic.component_outline,"font-family":"sans-serif","font-size":`${fontSizePx*.7}px`,"text-anchor":textAnchor,"dominant-baseline":"middle",...rotation5&&{transform:rotation5}},children:[{type:"text",value:label,name:"",attributes:{},children:[]}]})}return svgObjects};circuitJsonToSchematicSvg=convertCircuitJsonToSchematicSvg;DEFAULT_WIDTH=1200,DEFAULT_HEIGHT=600,MARGIN={top:64,right:100,bottom:80,left:100},FALLBACK_LINE_COLOR="#1f77b4";MAX_LEGEND_LINE_LENGTH=15,LEGEND_LINE_HEIGHT=16,LEGEND_MIN_SPACING=24;DEFAULT_WIDTH2=1200,DEFAULT_HEIGHT2=1200,DEFAULT_SCHEMATIC_RATIO=.55;OBJECT_ORDER3=["pcb_board","pcb_solder_paste"]}});var require_grid_router=__commonJS({"node_modules/@tscircuit/krt-wasm/pkg-node/grid_router.js"(exports){"use strict";function routeSimpleRouteJson2(input2,options){let ret=wasm.routeSimpleRouteJson(input2,options);if(ret[2])throw takeFromExternrefTable0(ret[1]);return takeFromExternrefTable0(ret[0])}exports.routeSimpleRouteJson=routeSimpleRouteJson2;function __wbg_get_imports(){return{__proto__:null,"./grid_router_bg.js":{__proto__:null,__wbg_Error_3639a60ed15f87e7:function(arg0,arg1){return Error(getStringFromWasm0(arg0,arg1))},__wbg_Number_a3d737fd183f7dca:function(arg0){return Number(arg0)},__wbg_String_8564e559799eccda:function(arg0,arg1){let ret=String(arg1),ptr1=passStringToWasm0(ret,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc),len1=WASM_VECTOR_LEN;getDataViewMemory0().setInt32(arg0+4,len1,!0),getDataViewMemory0().setInt32(arg0+0,ptr1,!0)},__wbg___wbindgen_bigint_get_as_i64_3af6d4ca77193a4b:function(arg0,arg1){let v4=arg1,ret=typeof v4=="bigint"?v4:void 0;getDataViewMemory0().setBigInt64(arg0+8,isLikeNone(ret)?BigInt(0):ret,!0),getDataViewMemory0().setInt32(arg0+0,!isLikeNone(ret),!0)},__wbg___wbindgen_boolean_get_c3dd5c39f1b5a12b:function(arg0){let v4=arg0,ret=typeof v4=="boolean"?v4:void 0;return isLikeNone(ret)?16777215:ret?1:0},__wbg___wbindgen_debug_string_07cb72cfcc952e2b:function(arg0,arg1){let ret=debugString(arg1),ptr1=passStringToWasm0(ret,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc),len1=WASM_VECTOR_LEN;getDataViewMemory0().setInt32(arg0+4,len1,!0),getDataViewMemory0().setInt32(arg0+0,ptr1,!0)},__wbg___wbindgen_in_2617fa76397620d3:function(arg0,arg1){return arg0 in arg1},__wbg___wbindgen_is_bigint_d6a8167cac401b95:function(arg0){return typeof arg0=="bigint"},__wbg___wbindgen_is_function_2f0fd7ceb86e64c5:function(arg0){return typeof arg0=="function"},__wbg___wbindgen_is_null_066086be3abe9bb3:function(arg0){return arg0===null},__wbg___wbindgen_is_object_5b22ff2418063a9c:function(arg0){let val=arg0;return typeof val=="object"&&val!==null},__wbg___wbindgen_is_undefined_244a92c34d3b6ec0:function(arg0){return arg0===void 0},__wbg___wbindgen_jsval_eq_403eaa3610500a25:function(arg0,arg1){return arg0===arg1},__wbg___wbindgen_jsval_loose_eq_1978f1e77b4bce62:function(arg0,arg1){return arg0==arg1},__wbg___wbindgen_number_get_dd6d69a6079f26f1:function(arg0,arg1){let obj=arg1,ret=typeof obj=="number"?obj:void 0;getDataViewMemory0().setFloat64(arg0+8,isLikeNone(ret)?0:ret,!0),getDataViewMemory0().setInt32(arg0+0,!isLikeNone(ret),!0)},__wbg___wbindgen_string_get_965592073e5d848c:function(arg0,arg1){let obj=arg1,ret=typeof obj=="string"?obj:void 0;var ptr1=isLikeNone(ret)?0:passStringToWasm0(ret,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc),len1=WASM_VECTOR_LEN;getDataViewMemory0().setInt32(arg0+4,len1,!0),getDataViewMemory0().setInt32(arg0+0,ptr1,!0)},__wbg___wbindgen_throw_9c75d47bf9e7731e:function(arg0,arg1){throw new Error(getStringFromWasm0(arg0,arg1))},__wbg_call_add9e5a76382e668:function(){return handleError(function(arg0,arg1){return arg0.call(arg1)},arguments)},__wbg_done_b1afd6201ac045e0:function(arg0){return arg0.done},__wbg_entries_bb9843ba73dc70d6:function(arg0){return Object.entries(arg0)},__wbg_get_652f640b3b0b6e3e:function(arg0,arg1){return arg0[arg1>>>0]},__wbg_get_9cfea9b7bbf12a15:function(){return handleError(function(arg0,arg1){return Reflect.get(arg0,arg1)},arguments)},__wbg_get_unchecked_be562b1421656321:function(arg0,arg1){return arg0[arg1>>>0]},__wbg_get_with_ref_key_6412cf3094599694:function(arg0,arg1){return arg0[arg1]},__wbg_instanceof_ArrayBuffer_eab9f28fbec23477:function(arg0){let result;try{result=arg0 instanceof ArrayBuffer}catch{result=!1}return result},__wbg_instanceof_Map_10d4edf60fcf9327:function(arg0){let result;try{result=arg0 instanceof Map}catch{result=!1}return result},__wbg_instanceof_Uint8Array_57d77acd50e4c44d:function(arg0){let result;try{result=arg0 instanceof Uint8Array}catch{result=!1}return result},__wbg_isArray_c6c6ef8308995bcf:function(arg0){return Array.isArray(arg0)},__wbg_isSafeInteger_3c56c421a5b4cce4:function(arg0){return Number.isSafeInteger(arg0)},__wbg_iterator_9d68985a1d096fc2:function(){return Symbol.iterator},__wbg_length_0a6ce016dc1460b0:function(arg0){return arg0.length},__wbg_length_ba3c032602efe310:function(arg0){return arg0.length},__wbg_new_2fad8ca02fd00684:function(){return new Object},__wbg_new_3baa8d9866155c79:function(){return new Array},__wbg_new_8454eee672b2ba6e:function(arg0){return new Uint8Array(arg0)},__wbg_next_261c3c48c6e309a5:function(arg0){return arg0.next},__wbg_next_aacee310bcfe6461:function(){return handleError(function(arg0){return arg0.next()},arguments)},__wbg_prototypesetcall_fd4050e806e1d519:function(arg0,arg1,arg2){Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0,arg1),arg2)},__wbg_set_6be42768c690e380:function(arg0,arg1,arg2){arg0[arg1]=arg2},__wbg_set_f614f6a0608d1d1d:function(arg0,arg1,arg2){arg0[arg1>>>0]=arg2},__wbg_value_f852716acdeb3e82:function(arg0){return arg0.value},__wbindgen_cast_0000000000000001:function(arg0){return arg0},__wbindgen_cast_0000000000000002:function(arg0){return arg0},__wbindgen_cast_0000000000000003:function(arg0,arg1){return getStringFromWasm0(arg0,arg1)},__wbindgen_cast_0000000000000004:function(arg0){return BigInt.asUintN(64,arg0)},__wbindgen_init_externref_table:function(){let table=wasm.__wbindgen_externrefs,offset=table.grow(4);table.set(0,void 0),table.set(offset+0,void 0),table.set(offset+1,null),table.set(offset+2,!0),table.set(offset+3,!1)}}}}function addToExternrefTable0(obj){let idx=wasm.__externref_table_alloc();return wasm.__wbindgen_externrefs.set(idx,obj),idx}function debugString(val){let type=typeof val;if(type=="number"||type=="boolean"||val==null)return`${val}`;if(type=="string")return`"${val}"`;if(type=="symbol"){let description=val.description;return description==null?"Symbol":`Symbol(${description})`}if(type=="function"){let name=val.name;return typeof name=="string"&&name.length>0?`Function(${name})`:"Function"}if(Array.isArray(val)){let length4=val.length,debug18="[";length4>0&&(debug18+=debugString(val[0]));for(let i3=1;i3<length4;i3++)debug18+=", "+debugString(val[i3]);return debug18+="]",debug18}let builtInMatches=/\[object ([^\]]+)\]/.exec(toString.call(val)),className;if(builtInMatches&&builtInMatches.length>1)className=builtInMatches[1];else return toString.call(val);if(className=="Object")try{return"Object("+JSON.stringify(val)+")"}catch{return"Object"}return val instanceof Error?`${val.name}: ${val.message}
|
|
300
|
-
${val.stack}`:className}function getArrayU8FromWasm0(ptr,len){return ptr=ptr>>>0,getUint8ArrayMemory0().subarray(ptr/1,ptr/1+len)}var cachedDataViewMemory0=null;function getDataViewMemory0(){return(cachedDataViewMemory0===null||cachedDataViewMemory0.buffer.detached===!0||cachedDataViewMemory0.buffer.detached===void 0&&cachedDataViewMemory0.buffer!==wasm.memory.buffer)&&(cachedDataViewMemory0=new DataView(wasm.memory.buffer)),cachedDataViewMemory0}function getStringFromWasm0(ptr,len){return decodeText(ptr>>>0,len)}var cachedUint8ArrayMemory0=null;function getUint8ArrayMemory0(){return(cachedUint8ArrayMemory0===null||cachedUint8ArrayMemory0.byteLength===0)&&(cachedUint8ArrayMemory0=new Uint8Array(wasm.memory.buffer)),cachedUint8ArrayMemory0}function handleError(f3,args){try{return f3.apply(this,args)}catch(e5){let idx=addToExternrefTable0(e5);wasm.__wbindgen_exn_store(idx)}}function isLikeNone(x4){return x4==null}function passStringToWasm0(arg,malloc,realloc){if(realloc===void 0){let buf=cachedTextEncoder.encode(arg),ptr2=malloc(buf.length,1)>>>0;return getUint8ArrayMemory0().subarray(ptr2,ptr2+buf.length).set(buf),WASM_VECTOR_LEN=buf.length,ptr2}let len=arg.length,ptr=malloc(len,1)>>>0,mem=getUint8ArrayMemory0(),offset=0;for(;offset<len;offset++){let code=arg.charCodeAt(offset);if(code>127)break;mem[ptr+offset]=code}if(offset!==len){offset!==0&&(arg=arg.slice(offset)),ptr=realloc(ptr,len,len=offset+arg.length*3,1)>>>0;let view=getUint8ArrayMemory0().subarray(ptr+offset,ptr+len),ret=cachedTextEncoder.encodeInto(arg,view);offset+=ret.written,ptr=realloc(ptr,len,offset,1)>>>0}return WASM_VECTOR_LEN=offset,ptr}function takeFromExternrefTable0(idx){let value=wasm.__wbindgen_externrefs.get(idx);return wasm.__externref_table_dealloc(idx),value}var cachedTextDecoder=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});cachedTextDecoder.decode();function decodeText(ptr,len){return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr,ptr+len))}var cachedTextEncoder=new TextEncoder;"encodeInto"in cachedTextEncoder||(cachedTextEncoder.encodeInto=function(arg,view){let buf=cachedTextEncoder.encode(arg);return view.set(buf),{read:arg.length,written:buf.length}});var WASM_VECTOR_LEN=0,wasmBase64="AGFzbQEAAAABogM+YAAAYAABf2AAAW9gAX8AYAF/AX9gAX8BfmABfwF8YAJ/fwBgAn9/AX9gAn9/AW9gA39/fwBgA39/fwF/YAN/f38BfmAEf39/fwBgBH9/f38Bf2AFf39/f38AYAV/f39/fwF/YAZ/f39/f38AYAZ/f39/f38Bf2AHf39/f39/fwBgCH9/f39/f39/AGAIf39/f39/f3wAYAl/f39/f39+fn4AYAZ/f39/f3wAYAZ/f39+f38AYAZ/f399f38AYAR/f398AGAGf39/fH9/AGAFf39+f38AYAR/f35+AGAFf399f38AYAN/f3wAYAV/f3x/fwBgA39/bwBgAn9+AGADf35/AGAEf35/fwBgA39+fgBgBX9+fn5+AGAEf31/fwBgBH98f38AYAR/fH9/AX9gAn9vAGADf29vAGABfgF/YAF+AW9gAn5/AX9gA35/fwF/YAN+fn8BfmABfAF/YAF8AXxgAXwBb2ACfHwBfGABbwF/YAFvAXxgAW8Bb2ACb38Bb2ADb39vAGACb28Bf2ACb28Df39/YAJvbwFvYANvb28AAuQULhMuL2dyaWRfcm91dGVyX2JnLmpzJV9fd2JnX2luc3RhbmNlb2ZfTWFwXzEwZDRlZGY2MGZjZjkzMjcANRMuL2dyaWRfcm91dGVyX2JnLmpzHV9fd2JnX2xlbmd0aF8wYTZjZTAxNmRjMTQ2MGIwADUTLi9ncmlkX3JvdXRlcl9iZy5qcyRfX3diZ19nZXRfdW5jaGVja2VkX2JlNTYyYjE0MjE2NTYzMjEAOBMuL2dyaWRfcm91dGVyX2JnLmpzG19fd2JnX25leHRfYWFjZWUzMTBiY2ZlNjQ2MQA3Ey4vZ3JpZF9yb3V0ZXJfYmcuanMbX193YmdfZG9uZV9iMWFmZDYyMDFhYzA0NWUwADUTLi9ncmlkX3JvdXRlcl9iZy5qcxxfX3diZ192YWx1ZV9mODUyNzE2YWNkZWIzZTgyADcTLi9ncmlkX3JvdXRlcl9iZy5qcxpfX3diZ19zZXRfZjYxNGY2YTA2MDhkMWQxZAA5Ey4vZ3JpZF9yb3V0ZXJfYmcuanMaX193YmdfZ2V0XzY1MmY2NDBiM2IwYjZlM2UAOBMuL2dyaWRfcm91dGVyX2JnLmpzJ19fd2JnX2dldF93aXRoX3JlZl9rZXlfNjQxMmNmMzA5NDU5OTY5NAA8Ey4vZ3JpZF9yb3V0ZXJfYmcuanMaX193Ymdfc2V0XzZiZTQyNzY4YzY5MGUzODAAPRMuL2dyaWRfcm91dGVyX2JnLmpzHV9fd2JnX1N0cmluZ184NTY0ZTU1OTc5OWVjY2RhACoTLi9ncmlkX3JvdXRlcl9iZy5qcxpfX3diZ19uZXdfM2JhYThkOTg2NjE1NWM3OQACEy4vZ3JpZF9yb3V0ZXJfYmcuanMaX193YmdfbmV3XzJmYWQ4Y2EwMmZkMDA2ODQAAhMuL2dyaWRfcm91dGVyX2JnLmpzGl9fd2JnX25ld184NDU0ZWVlNjcyYjJiYTZlADcTLi9ncmlkX3JvdXRlcl9iZy5qcx1fX3diZ19sZW5ndGhfYmEzYzAzMjYwMmVmZTMxMAA1Ey4vZ3JpZF9yb3V0ZXJfYmcuanMnX193YmdfcHJvdG90eXBlc2V0Y2FsbF9mZDQwNTBlODA2ZTFkNTE5ACETLi9ncmlkX3JvdXRlcl9iZy5qcyxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfNTdkNzdhY2Q1MGU0YzQ0ZAA1Ey4vZ3JpZF9yb3V0ZXJfYmcuanMtX193YmdfaW5zdGFuY2VvZl9BcnJheUJ1ZmZlcl9lYWI5ZjI4ZmJlYzIzNDc3ADUTLi9ncmlkX3JvdXRlcl9iZy5qcx5fX3diZ19pc0FycmF5X2M2YzZlZjgzMDg5OTViY2YANRMuL2dyaWRfcm91dGVyX2JnLmpzJF9fd2JnX2lzU2FmZUludGVnZXJfM2M1NmM0MjFhNWI0Y2NlNAA1Ey4vZ3JpZF9yb3V0ZXJfYmcuanMeX193YmdfZW50cmllc19iYjk4NDNiYTczZGM3MGQ2ADcTLi9ncmlkX3JvdXRlcl9iZy5qcx9fX3diZ19pdGVyYXRvcl85ZDY4OTg1YTFkMDk2ZmMyAAITLi9ncmlkX3JvdXRlcl9iZy5qcxtfX3diZ19uZXh0XzI2MWMzYzQ4YzZlMzA5YTUANxMuL2dyaWRfcm91dGVyX2JnLmpzGl9fd2JnX2dldF85Y2ZlYTliN2JiZjEyYTE1ADwTLi9ncmlkX3JvdXRlcl9iZy5qcxtfX3diZ19jYWxsX2FkZDllNWE3NjM4MmU2NjgAPBMuL2dyaWRfcm91dGVyX2JnLmpzLF9fd2JnX19fd2JpbmRnZW5fc3RyaW5nX2dldF85NjU1OTIwNzNlNWQ4NDhjACoTLi9ncmlkX3JvdXRlcl9iZy5qcyxfX3diZ19fX3diaW5kZ2VuX251bWJlcl9nZXRfZGQ2ZDY5YTYwNzlmMjZmMQAqEy4vZ3JpZF9yb3V0ZXJfYmcuanMkX193YmdfX193YmluZGdlbl9pbl8yNjE3ZmE3NjM5NzYyMGQzADoTLi9ncmlkX3JvdXRlcl9iZy5qcydfX3diZ19fX3diaW5kZ2VuX3Rocm93XzljNzVkNDdiZjllNzczMWUABxMuL2dyaWRfcm91dGVyX2JnLmpzKV9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF8wNjYwODZiZTNhYmU5YmIzADUTLi9ncmlkX3JvdXRlcl9iZy5qcypfX3diZ19fX3diaW5kZ2VuX2pzdmFsX2VxXzQwM2VhYTM2MTA1MDBhMjUAOhMuL2dyaWRfcm91dGVyX2JnLmpzHV9fd2JnX051bWJlcl9hM2Q3MzdmZDE4M2Y3ZGNhADYTLi9ncmlkX3JvdXRlcl9iZy5qcxxfX3diZ19FcnJvcl8zNjM5YTYwZWQxNWY4N2U3AAkTLi9ncmlkX3JvdXRlcl9iZy5qcytfX3diZ19fX3diaW5kZ2VuX2lzX2JpZ2ludF9kNmE4MTY3Y2FjNDAxYjk1ADUTLi9ncmlkX3JvdXRlcl9iZy5qcytfX3diZ19fX3diaW5kZ2VuX2lzX29iamVjdF81YjIyZmYyNDE4MDYzYTljADUTLi9ncmlkX3JvdXRlcl9iZy5qcy1fX3diZ19fX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0X2MzZGQ1YzM5ZjFiNWExMmIANRMuL2dyaWRfcm91dGVyX2JnLmpzLV9fd2JnX19fd2JpbmRnZW5faXNfZnVuY3Rpb25fMmYwZmQ3Y2ViODZlNjRjNQA1Ey4vZ3JpZF9yb3V0ZXJfYmcuanMuX193YmdfX193YmluZGdlbl9pc191bmRlZmluZWRfMjQ0YTkyYzM0ZDNiNmVjMAA1Ey4vZ3JpZF9yb3V0ZXJfYmcuanMwX193YmdfX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcV8xOTc4ZjFlNzdiNGJjZTYyADoTLi9ncmlkX3JvdXRlcl9iZy5qczNfX3di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QQM2AgAgBkEEakEALwCPkEA7AAAgBkEAKACLkEA2AABBAiELDAELEKADQQxBBBDnAiIKRQ0KEKADQQEhCUEDQQEQ5wIiCEUNASAKQQM2AgggCiAINgIEIApBAzYCACAIQQJqQQAtAIqQQDoAACAIQQAvAIiQQDsAAEEBIQsLIANBADYCNCADQoCAgIDAADcCLCADQQA2AkAgA0KAgICAwAA3AjggASgCXCIIRQ0GIAEoAlgiDCAIQcgAbGohDUSamZmZmZnJPyABKwMQIrUBIAEoAggiBkECRhshtgEgBUEDcSEOIAVB/AFxIQ8gBUEEdCEQIAxByABqIQggBkEBcSERIAIoAjAiEkECdCETIAEoAkwiFEHQAGohFUEHrUIghiKjASADQZgCaq2EIaQBIKMBIANBsARqrYQhpQFBBq1CIIYipgEgA0HEAGqthCGnASAUIAEoAlAiFkHQAGxqIRcgASsDQCACKwMAIrcBoxDFAfwCIhhBAWohGSABKwM4ILcBoxDFAfwCIhpBf2ohGyABKwMwILcBoxDFAfwCIhxBAWohHSABKwMoILcBoxDFAfwCIh5Bf2ohHyC1Ab0iowFCIIinISAgASsDICK4Ab0iqAFCIIinISEgA0HwA2pBGGohIiADQfADakEMaiEjIANB2AJqQQRyISQgA0HYAmpBEGohJSADQdgAakEEciEmIANBmAJqQRBqIScgA0HYAmpBCGohKCADQdgCakEEaiEpIAIoAhAhKiACKAIkISsgAigCPCEsIAIoAjghLSACKAI0IS4gAigCLCEvIAIoAighMCACKAIcITEgAioCGCGzASACKAIUITIgA0HYAGpBMGohMyADQdQDaiE0IANB2AJqQewAaiE1IANB2AJqQdwAaiE2IANBpANqITcgA0HYAmpBPGohOCACKwMIIbkBIAIoAiAhOSABKAIYITogowGnITsgqAGnITxBASEGQQAhPQNAIAwhPiA9IQcCQAJAAkADQCAGIT0gCCEMIAMgBzYCRAJAID4oAjRBAkkNACA+KAIAIghBAkcNAgwDCyAMQcgAaiEIID1BAWohBiAMIT4gPSEHIAwgDUcNAAwLCwsCQCAIQQFxRQ0AIANB2AJqID4oAgggPigCDBA7IAMtANgCDQEgAysD4AIhugEMAgsgPisDCCG6AQwBCwJAID4oAhAiCEEC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BkEYaikCADcDACADQegCakEQaiIeIAZBEGopAgA3AwAgA0HoAmpBCGoiHyAGQQhqKQIANwMAIAMgBikCADcD6AIgAykD4AIhJgJAIA0gAygCuANHDQAgA0G4A2oQrQEgAygCvAMhHQsgHSAOaiIPQbh/aiABNgIAIA9BvH9qIgEgAykD6AI3AgAgBCkDACEnIBEpAwAhKCAUKQMAISkgEykDACEqIBIpAwAhKyAeKQMAISwgHykDACEtIA8gJjcDACAPQXxqIAU2AgAgAUEIaiAtNwIAIAFBEGogLDcCACABQRhqICs3AgAgAUEgaiAqNwIAIAFBKGogKTcCACABQTBqICg3AgAgAUE4aiAnNwIAIAMgDUEBaiINNgLAAyAOQdAAaiEOIBsgDUcNAAsgAygCvAMhASADKAK4AyENIBshIAwCC0EIIA0QmwIACyADQZgCaiADQagDahB9IAMoApgCIQQCQAJAAkAgAy0AnAIiDkF+ag4CAAIBCyADQagDaiADQc8DakHInMAAEGshAUGAgICAeCENDAILQQAhDyADQQA2AsADIANCgICAgIABNwK4A0EIIQFBACENAkACQAJAIA5BAXENACAEEKECIQ1BACgC7LZBIQFBACgC6LZBIQ9BAEIANwLotkEgD0EBRg0BQQghHUEAIQ9ByAAhDgNAAkAgDRCRAyIFDQAgDRCiAiEBCwJAIA1BhAhJDQAgDRCpAQsCQAJAIAUNACADQZgCaiABEDUgAygCmAIhASADKALcAiIFQYCAgIB4Rw0BDAQLIAMoArwDIQEgAygCuAMhDQwCCyADQegCakE4aiIRIAZBOGopAgA3AwAgA0HoAmpBMGoiFCAGQTBqKQIANwMAIANB6AJqQShqIhMgBkEoaikCADcDACADQegCakEgaiISIAZBIGopAgA3AwAgA0HoAmpBGGoiHiAGQRhqKQIANwMAIANB6AJqQRBqIh8gBkEQaikCADcDACADQegCakEIaiIbIAZBCGopAgA3AwAgAyAGKQIANwPoAiADKQPgAiEmAkAgDyADKAK4A0cNACADQbgDahCtASADKAK8AyEdCyAdIA5qIg1BuH9qIAE2AgAgDUG8f2oiASADKQPoAjcCACARKQMAIScgFCkDACEoIBMpAwAhKSASKQMAISogHikDACErIB8pAwAhLCAbKQMAIS0gDSAmNwMAIA1BfGogBTYCACABQQhqIC03AgAgAUEQaiAsNwIAIAFBGGogKzcCACABQSBqICo3AgAgAUEoaiApNwIAIAFBMGogKDcCACABQThqICc3AgAgAyAPQQFqIg82AsADIAQQoQIhDUEAKALstkEhAUEAKALotkEhBUEAQgA3Aui2QSAOQdAAaiEOIAVBAUcNAAwCCwsgDyEgIARBgwhNDQMMAQsgA0G4A2oQfEGAgICAeCENIARBgwhNDQILIAQQqQEMAQtBgICAgHghDSAQQYMITQ0IIAQhAQwBCyAQQYMITQ0BCyAQEKkBCwJAIA1BgICAgHhHDQBBASENIAEhBAwHCwJAIAMoAowCQYCAgIB4Rg0AIANBjAJqEHwLIAMgIDYClAIgAyABNgKQAiADIA02AowCDAELIANBADYC+AEgAyAQNgKoAwJAAkACQCADQagDahDyAQ0AIAMgEDYCuAMCQCADQbgDahDNAg0AIANB6AJqIANBuANqEPgBAkACQAJAAkAgAygC6AJBAUcNACADKQPwAiImQn9VDQELIANBuANqIANBzwNqQciZwAAQayEEDAELICZCgICAgBBUDQEgA0EBOgCYAiADICY3A6ACIANBmAJqIANBzwNqQciZwAAQxwEhBAsgEEGDCE0NCQwICyAQQYQISQ0DIBAQqQEMAwsgAyAQNgLoAiADQZgCaiADQegCahDeAQJAIAMoApgCQQFHDQAgAyADKQOgAiImEK0CIgE2ApgCIANB6AJqIANBmAJqELACIQ0CQCABQYQISQ0AIAEQqQELIA1FDQACQCAQQYQISQ0AIBAQqQELICZCgICAgBBUDQMgA0EBOgCYAiADICY3A6ACIANBmAJqIANBzwNqQciZwAAQxwEhBEEBIQ0MCQsQoANByABBARDnAiIBRQ0BAkBByABFDQAgAUG4nsAAQcgA/AoAAAsgAUHIABCKAyEEIAFByABBARDFAiAQQYQITw0GDAcLAkAgEEGECEkNACAQEKkBC0EAIQoMAgtBAUHIABCbAgALICanISFBASEKCyADKAKAAiIBIAMoAoQCIgVHDQALCwJAAkACQAJAAkACQAJAIAMoAowCQYCAgIB4Rg0AIAMoAqwDQYCAgIB4RiINDQEgJadBAXFFDQICQCALQQNHDQBBAiELCyAKQQJGIQEgA0HoAWpBCGogA0GMAmpBCGooAgA2AgAgA0HYAWpBCGogA0GsA2pBCGooAgA2AgAgAyADKQKMAjcD6AEgAyADKQKsAzcD2AEgDEEDRiENIBatQiCGISYgF60hJwJAIAMoAogCIhBBhAhJDQAgEBCpAQtBACAKIAEbIQFBAiAMIA0bIQUgJiAnhCEmAkAgAygC+AFFDQAgAygC/AEiDUGDCE0NACANEKkBCyADQcgBaiADQegBakEIaigCADYCACADQdQBaiADQdgBakEIaigCADYCACADIAMpA+gBNwPAASADIAMpA9gBNwLMASADIDI5A7gBIAMgMTkDsAEgAyAwOQOoASADIC85A6ABIAMgJjcDmAEgAyAVNgKUASADIAU2ApABIAMgGDYCjAEgAyAZNgKIASADIBo2AoQBIAMgCzYCgAEgAyAhNgJ8IAMgATYCeCADQcwBaiEYIANBwAFqIQQCQCADQfQAahDQAg0AIANB9ABqEMwCRQ0EC0GAgICAeCEOIANBgICAgHg2AswCIANBgICAgHg2AsACIANCgICA/YP9ADcDsAIgA0Lgp5KAgOowNwOoAiADQpqz5syZs+bkPzcDoAIgA0Kas+bMmbPm3D83A5gCIANCADcDuAJBASEKQYCAgIB4IQgMBQtBASENQYqUwABBCRDYASEEDAgLQZOUwABBCxDYASEEDAILQZ6UwABBBhDYASEEIANBrANqEIoBDAELIAMgAjYCqAMCQAJAIANBqANqEM4CDQAgA0GoA2ogA0HPA2pBiJzAABBrIRAgAkGECEkNASACEKkBDAELIANBsJbAADYC9AIgAyACNgL4AiADQQA2AugCIANB+AJqIQ9BACEBQgAhJkIAISdBACERQQAhFEEAIRNBACESQQAhHkEAIR9BgYCAgHghCEGBgICAeCEGA0AgAUEIaiEBAkACQAJAA0AgAyABQeCVwABqNgLwAiADIAFB2JXAAGooAgAiCSABQdyVwABqKAIAIg4QYiIQNgK4AyADIA8gA0G4A2oQxgIiDTYC+AECQAJAIANB+AFqENACRQ0AIANBuANqIA8QrwJFDQELIAMgDTYC7AIgA0EBNgLoAgJAAkACQAJAAkACQAJAAkACQCAOQXlqDhMDAAEGBQsCCwsLCwsLCwsLCAsHCwsgCSkAAELn5KWjtordsvAAUg0DQQAhCQwLCyAJ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QQAoArC6QSICRQ0AQYS4wQAhAANAIAYgACgCACIHIAAoAgQiCGpGDQIgACgCCCIADQAMAwsLAkACQEEAKALAukEiAEUNACAGIABPDQELQQAgBjYCwLpBC0EAQf8fNgLEukFBACAFNgKQuEFBACAJNgKIuEFBACAGNgKEuEFBAEGUuMEANgKguEFBAEGcuMEANgKouEFBAEGUuMEANgKcuEFBAEGkuMEANgKwuEFBAEGcuMEANgKkuEFBAEGsuMEANgK4uEFBAEGkuMEANgKsuEFBAEG0uMEANgLAuEFBAEGsuMEANgK0uEFBAEG8uMEANgLIuEFBAEG0uMEANgK8uEFBAEHEuMEANgLQuEFBAEG8uMEANgLEuEFBAEHMuMEANgLYuEFBAEHEuMEANgLMuEFBAEHUuMEANgLguEFBAEHMuMEANgLUuEFBAEHUuMEANgLcuEFBAEHcuMEANgLouEFBAEHcuMEANgLkuEFBAEHkuMEANgLwuEFBAEHkuMEANgLsuEFBAEHsuMEANgL4uEFBAEHsuMEANgL0uEFBAEH0uMEANgKAuUFBAEH0uMEANgL8uEFBAEH8uMEANgKIuUFBAEH8uMEANgKEuUFBAEGEucEANgKQuUFBAEGEucEANgKMuUFBAEGMucEANgKYuUFBAEGMucEANgKUuUFBAEGUucEANgKguUFBAEGcucEANgKouUFBAEGUucEANgKcuUFBAEGkucEANgKwuUFBAEGcucEANgKkuUFBAEGsucEANgK4uUFBAEGkucEANgKsuUFBAEG0ucEANgLAuUFBAEGsucEANgK0uUFBAEG8ucEANgLIuUFBAEG0ucEANgK8uUFBAEHEucEANgLQuUFBAEG8ucEANgLEuUFBAEHMucEANgLYuUFBAEHEucEANgLMuUFBAEHUucEANgLguUFBAEHMucEANgLUuUFBAEHcucEANgLouUFBAEHUucEANgLcuUFBAEHkucEANgLwuUFBAEHcucEANgLkuUFBAEHsucEANgL4uUFBAEHkucEANgLsuUFBAEH0ucEANgKAukFBAEHsucEANgL0uUFBAEH8ucEANgKIukFBAEH0ucEANgL8uUFBAEGEusEANgKQukFBAEH8ucEANgKEukFBAEGMusEANgKYukFBAEGEusEANgKMukFBACAGQQ9qQXhxIgBBeGoiAjYCsLpBQQBBjLrBADYClLpBQQAgBiAAayAJQVhqIgBqQQhqIgc2Aqi6QSACIAdBAXI2AgQgBiAAakEoNgIEQQBBgICAATYCvLpBDAMLIAIgBk8NACAHIAJLDQAgACgCDCIHQQFxDQAgB0EBdiAFRg0BC0EAQQAoAsC6QSIAIAYgACAGSRs2AsC6QSAGIAlqIQdBhLjBACEAAkACQAJAA0AgACgCACIIIAdGDQEgACgCCCIADQAMAgsLIAAoAgwiB0EBcQ0AIAdBAXYgBUYNAQtBhLjBACEAAkADQAJAIAAoAgAiByACSw0AIAIgByAAKAIEaiIHSQ0CCyAAKAIIIQAMAAsLQQAgBkEPakF4cSIAQXhqIgg2ArC6QUEAIAYgAGsgCUFYaiIAakEIaiIENgKoukEgCCAEQQFyNgIEIAYgAGpBKDYCBEEAQYCAgAE2Ary6QSACIAdBYGpBeHFBeGoiACAAIAJBEGpJGyIIQRs2AgRBACkChLhBIQogCEEQakEAKQKMuEE3AgAgCEEIaiIAIAo3AgBBACAFNgKQuEFBACAJNgKIuEFBACAGNgKEuEFBACAANgKMuEEgCEEcaiEAA0AgAEEHNgIAIABBBGoiACAHSQ0ACyAIIAJGDQIgCCAIKAIEQX5xNgIEIAIgCCACayIAQQFyNgIEIAggADYCAAJAIABBgAJJDQAgAiAAEHsMAwsCQAJAQQAoApy6QSIHQQEgAEEDdnQiBnENAEEAIAcgBnI2Apy6QSAAQfgBcUGUuMEAaiIAIQcMAQsgAEH4AXEiAEGUuMEAaiEHIABBnLjBAGooAgAhAAsgByACNgIIIAAgAjYCDCACIAc2AgwgAiAANgIIDAILIAAgBjYCACAAIAAoAgQgCWo2AgQgBkEPakF4cUF4aiIHIANBA3I2AgQgCEEPakF4cUF4aiICIAcgA2oiAGshAyACQQAoArC6QUYNBCACQQAoAqy6QUYNBQJAIAIoAgQiBkEDcUEBRw0AIAIgBkF4cSIGEHYgBiADaiEDIAIgBmoiAigCBCEGCyACIAZBfnE2AgQgACADQQFyNgIEIAAgA2ogAzYCAAJAIANBgAJJDQAgACADEHsMBwsCQAJAQQAoApy6QSICQQEgA0EDdnQiBnENAEEAIAIgBnI2Apy6QSADQfgBcUGUuMEAaiIDIQIMAQsgA0H4AXEiA0GUuMEAaiECIANBnLjBAGooAgAhAwsgAiAANgIIIAMgADYCDCAAIAI2AgwgACADNgIIDAYLIAAgCCAJajYCBEEAQQAoArC6QSIAQQ9qQXhxIgJBeGoiBzYCsLpBQQAgACACa0EAKAKoukEgCWoiAmpBCGoiBjYCqLpBIAcgBkEBcjYCBCAAIAJqQSg2AgRBAEGAgIABNgK8ukELQQAhAEEAKAKoukEiAiADTQ0FQQAgAiADayICNgKoukFBAEEAKAKwukEiACADaiIHNgKwukEgByACQQFyNgIEIAAgA0EDcjYCBCAAQQhqIQAMBQtBACAAIANrIgI2Aqi6QUEAQQAoArC6QSIAIANqIgc2ArC6QSAHIAJBAXI2AgQgACADQQNyNgIEIABBCGohAAwEC0EAKAKsukEhAgJAAkAgACADayIHQQ9LDQBBAEEANgKsukFBAEEANgKkukEgAiAAQQNyNgIEIAIgAGoiACAAKAIEQQFyNgIEDAELQQAgBzYCpLpBQQAgAiADaiIGNgKsukEgBiAHQQFyNgIEIAIgAGogBzYCACACIANBA3I2AgQLIAJBCGohAAwDC0EAIAA2ArC6QUEAQQAoAqi6QSADaiIDNgKoukEgACADQQFyNgIEDAELQQAgADYCrLpBQQBBACgCpLpBIANqIgM2AqS6QSAAIANBAXI2AgQgACADaiADNgIACyAHQQhqIQALIAFBEGokACAAC8AYARx/IwBBgAFrIgUkAAJAAkACQAJAIAFBIUkNAANAAkAgAw0AIAAgASAGEIgBDAULIAAgAUEDdiIGQRxsaiEHIAAgBkEEdGohCAJAAkAgAUHAAEkNACAAIAggByAGEKEBIQYMAQsgACAHIAggACgCACIGIAgoAgAiCUkiCiAJIAcoAgAiC0lzGyAKIAYgC0lzGyEGCyADQX9qIQMgBiAAayEGAkACQAJAIAINACAAIAZqKAIAIQcgACgCACEIDAELIAAoAgAhCCACKAIAIAAgBmoiCSgCACIHSQ0AIAAgBzYCACAJIAg2AgAgAEEEaiEIIAAoAgAhCSAAKAIEIQJBACEHAkACQCAAQQhqIgYgACABQQJ0aiIMQXxqIg1JDQAgCCEKDAELQQAhBwNAIAZBfGogCCAHQQJ0aiIKKAIANgIAIAogBigCACILNgIAIAYgCCAHIAkgC09qIgdBAnRqIgooAgA2AgAgCiAGQQRqKAIAIgs2AgAgByAJIAtPaiEHIAZBCGoiBiANSQ0ACyAGQXxqIQoLAkAgBiAMRg0AA0AgCiAIIAdBAnRqIgsoAgA2AgAgCyAGIgYoAgAiCjYCACAHIAkgCk9qIQcgBiEKIAZBBGoiBiAMRw0ACyAGQXxqIQoLIAogCCAHQQJ0aiIGKAIANgIAIAYgAjYCACAHIAkgAk9qIgYgAU8NBCAAKAIAIQcgACAAIAZBAnRqIggoAgA2AgAgCCAHNgIAIAEgBkEBaiIGayEBIAAgBkECdGohAEEAIQIMAQsgACAHNgIAIAAgBmogCDYCACAAQQRqIQggACgCACEJIAAoAgQhDkEAIQcCQAJAIABBCGoiBiAAIAFBAnRqIgxBfGoiDUkNACAIIQoMAQtBACEHA0AgBkF8aiAIIAdBAnRqIgooAgA2AgAgCiAGKAIAIgs2AgAgBiAIIAcgCyAJSWoiB0ECdGoiCigCADYCACAKIAZBBGooAgAiCzYCACAHIAsgCUlqIQcgBkEIaiIGIA1JDQALIAZBfGohCgsCQCAGIAxGDQADQCAKIAggB0ECdGoiCygCADYCACALIAYiBigCACIKNgIAIAcgCiAJSWohByAGIQogBkEEaiIGIAxHDQALIAZBfGohCgsgCiAIIAdBAnRqIgYoAgA2AgAgBiAONgIAIAcgDiAJSWoiBiABTw0DIAAoAgAhCCAAIAAgBkECdGoiBygCADYCACAHIAg2AgAgACAGIAIgAyAEEDMgASAGQX9zaiEBIAdBBGohACAHIQILIAFBIU8NAAsLIAFBAkkNAiABIAFBAXYiDiABQRJJIg8bIQYgASAOayEQIAAgDkECdGohAyAAIQkDQAJAAkAgBkEMSw0AQQEhByAGQQhNDQEgCSAJKAIgIgcgCSgCECIIIAcgCEsbIgogCSgCDCILIAkoAgAiDCALIAxLGyINIAogDUsbIgIgCSgCHCIEIAkoAgQiESAEIBFLGyISIAsgDCALIAxJGyILIBIgC0sbIgwgAiAMSxsiEyAJKAIYIhQgCSgCFCIVIAkoAggiFiAVIBZLGyIXIBQgF0sbIhggCiANIAogDUkbIgogBCARIAQgEUkbIg0gCiANSxsiBCAYIARLGyIRIBMgEUsbNgIgIAkgFCAXIBQgF0kbIhQgByAIIAcgCEkbIgcgFSAWIBUgFkkbIgggByAISxsiFSAUIBVJGyIWIAogDSAKIA1JGyIKIBYgCkkbIg0gByAIIAcgCEkbIgcgEiALIBIgC0kbIgggByAISRsiCyANIAtJGzYCACAJIAIgDCACIAxJGyIMIBQgFSAUIBVLGyICIAwgAksbIhIgEyARIBMgEUkbIhEgEiARSxs2AhwgCSASIBEgEiARSRsiESAMIAIgDCACSRsiDCAYIAQgGCAESRsiAiAMIAJLGyIEIBYgCiAWIApLGyIKIAcgCCAHIAhLGyIHIAogB0sbIgggBCAISxsiEiARIBJLGzYCGCAJIBEgEiARIBJJGzYCFCAJIAQgCCAEIAhJGyIIIAwgAiAMIAJJGyIMIAogByAKIAdJGyIHIAwgB0sbIgogCCAKSxs2AhAgCSAIIAogCCAKSRs2AgwgCSAMIAcgDCAHSRsiByANIAsgDSALSxsiCCAHIAhLGzYCCCAJIAcgCCAHIAhJGzYCBEEJIQcMAQsgCSAJKAIwIgcgCSgCACIIIAcgCEsbIgogCSgCLCILIAkoAhQiDCALIAxLGyINIAkoAhAiAiANIAJLGyIEIAogBEsbIhEgCSgCKCISIAkoAgQiEyASIBNLGyIUIAkoAiAiFSAJKAIYIhYgFSAWSxsiFyAUIBdLGyIYIAkoAiQiGSAJKAIIIhogGSAaSxsiGyAJKAIcIhwgCSgCDCIdIBwgHUsbIh4gGyAeSxsiHyAYIB9LGyIgIBEgIEsbNgIwIAkgCiAEIAogBEkbIgogFCAXIBQgF0kbIgQgGyAeIBsgHkkbIhQgBCAUSxsiFyAKIBdLGyIbIBUgFiAVIBZJGyIVIBIgEyASIBNJGyISIBUgEksbIhMgHCAdIBwgHUkbIhYgGSAaIBkgGkkbIhkgFiAZSxsiGiATIBpLGyIcIA0gAiANIAJJGyINIAcgCCAHIAhJGyIHIA0gB0sbIgggHCAISxsiAiAbIAJLGyIdIBEgICARICBJGyIRIBggHyAYIB9JGyIYIAsgDCALIAxJGyILIBggC0sbIgwgESAMSxsiHiAdIB5LGzYCLCAJIBYgGSAWIBlJGyIWIBUgEiAVIBJJGyISIBYgEkkbIhUgGCALIBggC0kbIgsgDSAHIA0gB0kbIgcgCyAHSRsiDSAVIA1JGzYCACAJIB0gHiAdIB5JGyIYIBEgDCARIAxJGyIMIBsgAiAbIAJJGyICIAwgAksbIhEgGCARSxs2AiggCSAEIBQgBCAUSRsiBCAcIAggHCAISRsiCCAEIAhJGyIUIAsgByALIAdLGyIHIBYgEiAWIBJLGyILIAcgC0kbIhIgFCASSRsiFiAKIBcgCiAXSRsiCiATIBogEyAaSRsiEyAKIBNJGyIXIBUgDSAVIA1LGyINIBcgDUkbIhUgFiAVSRs2AgQgCSAYIBEgGCARSRsiESAKIBMgCiATSxsiCiAEIAggBCAISxsiCCAKIAhLGyIEIAwgAiAMIAJJGyIMIAcgCyAHIAtLGyIHIAwgB0sbIgsgBCALSxsiAiARIAJLGzYCJCAJIBEgAiARIAJJGzYCICAJIAogCCAKIAhJGyIIIAwgByAMIAdJGyIHIAggB0sbIgogBCALIAQgC0kbIgsgCiALSxs2AhwgCSAUIBIgFCASSxsiDCAXIA0gFyANSxsiDSAMIA1JGyICIBYgFSAWIBVLGyIEIAIgBEkbNgIIIAkgCiALIAogC0kbIgogCCAHIAggB0kbIgcgDCANIAwgDUsbIgggByAISxsiCyAKIAtLGzYCGCAJIAogCyAKIAtJGzYCFCAJIAcgCCAHIAhJGyIHIAIgBCACIARLGyIIIAcgCEsbNgIQIAkgByAIIAcgCEkbNgIMQQ0hBwsgByAGSw0BAkAgByAGRg0AIAkgBkECdGohDSAJIAdBAnQiDGohCwNAAkAgCygCACIKIAtBfGooAgAiB08NACAMIQYCQANAIAkgBmoiCCAHNgIAAkAgBkEERw0AIAkhBgwCCyAGQXxqIQYgCiAIQXhqKAIAIgdJDQALIAkgBmohBgsgBiAKNgIACyAMQQRqIQwgC0EEaiILIA1HDQALCyAPDQMgCSAARiEHIBAhBiADIQkgBw0ACyADQXxqIQkgACABQQJ0QXxqIgZqIQogBSAGaiEMIAUhCyAAIQgDQCALIAMoAgAiDSAIKAIAIgIgDSACSSIEGzYCACAMIAooAgAiBiAJKAIAIgcgBiAHSxs2AgAgDEF8aiEMIAtBBGohCyAJQXxBACAGIAdJG2ohCSAKQXxBACAGIAdPG2ohCiAIIA0gAk9BAnRqIQggAyAEQQJ0aiEDIA5Bf2oiDg0ACyAJQQRqIQYCQCABQQFxRQ0AIAsgCCADIAggBkkiBxsoAgA2AgAgAyAIIAZPQQJ0aiEDIAggB0ECdGohCAsgCCAGRw0BIAMgCkEEakcNASABQQJ0IgZFDQIgACAFIAb8CgAADAILAAsQ2gIACyAFQYABaiQAC7sZAiF/A34jAEGwAWsiAiQAIAIgATYCDAJAAkAgAkEMahDOAg0AIAJBDGogAkE0akHIm8AAEGshAyAAQQM2AgAgACADNgIEIAFBhAhJDQEgARCpAQwBC0GAlMAAIQQgAkGAlMAANgIcIAIgATYCICACQQA2AhAgAkGAgICAeDYCJCACQaQBaiEFIAJB+ABqQQRyIQYgAkEQakEQaiEHQdiTwAAhAUGAgICAeCEIQYCAgIB4IQlBgYCAgHghCkEDIQtBAyEMAkACQAJAAkACQAJAA0AgAiABQQhqIgM2AhggAiABKAIAIAFBBGoiDSgCABBiIg42AlAgAiAHIAJB0ABqEMYCIg82AngCQAJAAkACQCACQfgAahDQAkUNACACQdAAaiAHEK8CRQ0BCwJAIAIoAhBFDQAgAigCFCIDQYQISQ0AIAMQqQELIAIgDzYCFCACQQE2AhAgASgCACEBAkACQAJAAkACQCANKAIAQXxqDg4AAwYGBgYGBgYBBgIGBAYLIAEoAABB7sK1qwZHDQVBACEBDAYLIAFBq5PAAEENENQBDQRBASEBDAULIAFBuJPAAEEPENQBDQNBAiEBDAQLIAFB9pDAAEEFENQBDQJBAyEBDAMLIAFBx5PAAEERENQBDQFBBCEBDAILAkAgD0GECEkNACAPEKkBCwJAIA5BhAhJDQAgDhCpAQsgAyEBIAMgBEcNAgwDC0EFIQELAkAgDkGECEkNACAOEKkBCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCABDgUBAgMEBQALIAJBADYCECAPQYQISQ0KIA8QqQEMCgsgCUGAgICAeEYNCEGnk8AAQQQQ2QEhASAAQQM2AgAgACABNgIEDAULIApBgYCAgHhGDQZBq5PAAEENENkBIQEgAEEDNgIAIAAgATYCBAwECyAIQYCAgIB4Rg0EQbiTwABBDxDZASEBIABBAzYCACAAIAE2AgQMAwsCQCALQQNGDQBB9pDAAEEFENkBIQEgAEEDNgIAIAAgATYCBAwDCyACQfgAaiACQRBqEEIgAigCfCEBIAIoAngiC0EDRg0BIAIoAoQBIRAgAigCgAEhESABIRIMBgsCQCAMQQNGDQBBx5PAAEERENkBIQEgAEEDNgIAIAAgATYCBEEBIQNBASEBDAsLIAJB+ABqIAJBEGoQQiACKAJ8IRMCQCACKAJ4IgxBA0YNACACKQOAASIjQiCIpyEUICOnIRUMBgsgAEEDNgIAIAAgEzYCBEEBIQNBASEBDAsLQQMhCyAAQQM2AgAgACABNgIEC0EBIQFBASEDDAcLIAJBADYCECACIA82AjACQAJAAkACQAJAAkAgAkEwahDKAkUNAAJAIA8QkAMiFg0AQQghF0EAIRhBACEIDAILEKADAkAgFkGkkgEgFkGkkgFJGyIDQThsIgFBCBDnAiIZRQ0AQQAhASACQQA2AjwgAiAZNgI4IAIgAzYCNEEsIQ0DQCACQfgAaiAPIAEQnQIQOiACKAJ4IRcCQCACKAKgASIEQYGAgIB4Rw0AIAJBNGoQkAFBgICAgHghCAwECyACQdAAakEgaiIIIAZBIGooAgA2AgAgAkHQAGpBGGoiGiAGQRhqKQIANwMAIAJB0ABqQRBqIhsgBkEQaikCADcDACACQdAAakEIaiIcIAZBCGopAgA3AwAgAkHAAGpBCGoiHSAFQQhqKAIANgIAIAIgBikCADcDUCACIAUpAgA3A0ACQCABIAIoAjRHDQAgAkE0ahC1ASACKAI4IRkLIBkgDWoiA0FUaiAXNgIAIANBWGoiDiACKQNQNwIAIAgoAgAhFyAaKQMAISMgGykDACEkIBwpAwAhJSADQXxqIAQ2AgAgDkEIaiAlNwIAIAMgAikDQDcCACADQQhqIB0oAgA2AgAgDkEQaiAkNwIAIA5BGGogIzcCACAOQSBqIBc2AgAgAiABQQFqIgE2AjwgDUE4aiENIBYgAUcNAAsgAigCOCEXIAIoAjQhCCAWIRgMAgtBCCABEJsCAAsgAkH4AGogAkEwahB9IAIoAnghDgJAAkACQCACLQB8IgFBfmoOAgACAQsgAkEwaiACQTRqQdicwAAQayEXQYCAgIB4IQgMAgtBACENIAJBADYCPCACQoCAgICAATcCNEEIIRdBACEIAkACQAJAIAFBAXENACAOEKECIQFBACgC7LZBIRdBACgC6LZBIQNBAEIANwLotkEgA0EBRg0BQQghGUEAIQ1BLCEEA0ACQCABEJEDIhcNACABEKICIQMLAkAgAUGECEkNACABEKkBCwJAAkAgFw0AIAJB+ABqIAMQOiACKAJ4IRcgAigCoAEiCEGBgICAeEcNAQwECyACKAI4IRcgAigCNCEIDAILIAJB0ABqQSBqIhogBkEgaigCADYCACACQdAAakEYaiIbIAZBGGopAgA3AwAgAkHQAGpBEGoiHCAGQRBqKQIANwMAIAJB0ABqQQhqIh0gBkEIaikCADcDACACQcAAakEIaiIWIAVBCGooAgA2AgAgAiAGKQIANwNQIAIgBSkCADcDQAJAIA0gAigCNEcNACACQTRqELUBIAIoAjghGQsgGSAEaiIBQVRqIBc2AgAgAUFYaiIDIAIpA1A3AgAgGigCACEXIBspAwAhIyAcKQMAISQgHSkDACElIAFBfGogCDYCACADQQhqICU3AgAgASACKQNANwIAIAFBCGogFigCADYCACADQRBqICQ3AgAgA0EYaiAjNwIAIANBIGogFzYCACACIA1BAWoiDTYCPCAOEKECIQFBACgC7LZBIRdBACgC6LZBIQNBAEIANwLotkEgBEE4aiEEIANBAUcNAAwCCwsgDSEYIA5BgwhNDQMMAQsgAkE0ahCQAUGAgICAeCEIIA5BgwhNDQILIA4QqQEMAQtBgICAgHghCCAPQYMITQ0DIA4hFwwBCyAPQYMITQ0BCyAPEKkBCyAIQYCAgIB4Rw0BIBchDgsgAEEDNgIAIAAgDjYCBEEBIQFBgICAgHghCEEBIQMMBwsgAiAYNgIsIAIgFzYCKCACIAg2AiQMAgsgAkEANgIQIAIgDzYCQAJAAkAgAkHAAGoQ8gENACACIA82AlAgAkH4AGogAkHQAGoQ1QECQAJAIAIoAngiCkGAgICAeEYiAQ0AIAIoAoABIR4gAigCfCEfDAELIAJB0ABqIAJBNGpBgIDAABBrIR8LAkAgD0GECEkNACAPEKkBCyABRQ0BIABBAzYCACAAIB82AgRBASEBQYGAgIB4IQpBASEDDAcLQYCAgIB4IQogD0GECEkNACAPEKkBCyAfISAMAQsgAkEANgIQIAIgDzYCUCACQfgAaiACQdAAahDVAQJAAkAgAigCeCIJQYCAgIB4RiIBDQAgAigCgAEhISACKAJ8IQMMAQsgAkHQAGogAkE0akGAgMAAEGshAwsCQCAPQYQISQ0AIA8QqQELAkAgAQ0AIAMhIgwBCyAAQQM2AgAgACADNgIEDAMLIAIoAhgiASACKAIcIgRHDQALCwJAAkAgCUGAgICAeEYNAEGAgICAeCAKIApBgYCAgHhGIgEbIQ8gCEGAgICAeEYNAUECIQFBAiEDAkAgC0EDRg0AIAshAwsCQCAMQQNGDQAgDCEBCyAAIB42AkAgACAgNgI8IAAgDzYCOCAAIBg2AjQgACAXNgIwIAAgCDYCLCAAICE2AiggACAiNgIkIAAgCTYCICAAIBQ2AhwgACAVNgIYIAAgEzYCFCAAIAE2AhAgACAQNgIMIAAgETYCCCAAIBI2AgQgACADNgIAAkAgAigCICIBQYQISQ0AIAEQqQELIAIoAhBFDQcgAigCFCIBQYQISQ0HDAYLQaeTwABBBBDYASEBIABBAzYCACAAIAE2AgQMAQtBuJPAAEEPENgBIQMgAEEDNgIAIAAgAzYCBEGAgICAeCEIAkAgD0GAgICAeHJBgICAgHhGDQAgICAPQQEQxQILQQAhAwJAIAkNAEEAIQkMAgsgIiAJQQEQxQIMAQtBASEBQYCAgIB4IQlBASEDCyAMQQNGDQELIAxBAkYNACAMRQ0AIBNFDQAgFSATQQEQxQILAkAgC0F+cUECRg0AIAtFDQAgEkUNACARIBJBARDFAgsCQCAIQYCAgIB4Rg0AIAJBJGoQkAELAkAgCkGBgICAeEcgAXFFDQAgCkGAgICAeHJBgICAgHhGDQAgICAKQQEQxQILAkAgCUH/////B3FBAEcgA3FFDQAgIiAJQQEQxQILAkAgAigCICIBQYQISQ0AIAEQqQELIAIoAhBFDQEgAigCFCIBQYMITQ0BCyABEKkBCyACQbABaiQAC78ZAxp/BH4EfCMAQdAAayICJAAgAiABNgIEAkACQCACQQRqEM4CDQAgAkEEaiACQc8AakGIm8AAEGshAyAAQYCAgIB4NgJEIAAgAzYCACABQYQISQ0BIAEQqQEMAQtB0JHAACEEIAJB0JHAADYCFCACIAE2AhggAkEANgIIIAJBIGpBEGohBSACQQhqQRBqIQZCACEcQZiRwAAhAUIAIR1CACEeQYGAgIB4IQdBgICAgHghCEGBgICAeCEJQYCAgIB4IQoCQAJAAkACQAJAA0AgAiABQQhqIgM2AhAgAiABKAIAIAFBBGoiCygCABBiIgw2AjggAiAGIAJBOGoQxgIiDTYCIAJAAkACQAJAAkAgAkEgahDQAkUNACACQThqIAYQrwJFDQELAkAgAigCCEUNACACKAIMIgNBhAhJDQAgAxCpAQsgAiANNgIMIAJBATYCCCABKAIAIQECQAJAAkACQAJAIAsoAgBBfGoOCAACAQcHBwcEBwsgASgAAEH08sGrBkcNBkEAIQMMBwsgAUHwkMAAQQYQ1AENAUEBIQMMBgsgAUH2kMAAQQUQ1AENA0ECIQMMBQsCQCABQfuQwABBBhDUAQ0AQQMhAwwFCyABQYGRwABBBhDUAQ0DQQQhAwwECyABQYyRwABBCxDUAQ0CQQYhAwwDCwJAIA1BhAhJDQAgDRCpAQsCQCAMQYQISQ0AIAwQqQELIAMhASADIARHDQMMBAtBBSEDIAFBh5HAAEEFENQBRQ0BC0EHIQMLAkAgDEGECEkNACAMEKkBCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAw4IAQIHBgUEAwABCyACQQA2AgggDUGECEkNDCANEKkBDAwLIAdBgYCAgHhGDQpB7JDAAEEEENkBIQEgAEGAgICAeDYCRCAAIAE2AgAMCQsCQCAcQgFRDQAgAkEANgIIIAIgDTYCHAJAIAJBHGoQzgINACACQRxqIAJBzwBqQfiawAAQayEOIA1BhAhJDQkgDRCpAQwJCyACQeyQwAA2AiwgAiANNgIwQQAhASACQQA2AiBCACEcQgAhHwNAIAMhDyABQQhqIQECQAJAAkACQANAIAIgAUHckMAAajYCKCACIAFB1JDAAGooAgAiBCABQdiQwABqKAIAIgsQYiIMNgJIIAIgBSACQcgAahDGAiIDNgI4AkACQCACQThqENACRQ0AIAJByABqIAUQrwJFDQELIAIgAzYCJCACQQE2AiBBAiEPAkAgC0EBRw0AQQBBAUECIAQtAAAiC0H5AEYbIAtB+ABGGyEPCwJAIAxBhAhJDQAgDBCpAQsgDw4DAwQCAwsCQCADQYQISQ0AIAMQqQELAkAgDEGECEkNACAMEKkBCyABQQhqIgFBGEcNAAsgDyEDDAsLIAJBADYCICADQYQISQ0CIAMQqQEMAgsCQCAfQgFRDQAgAkEANgIgIAIgAzYCSCACQThqIAJByABqEN0BAkACQCACKAI4IgxBAUcNACACKwNAISAMAQsgAkHIAGogAkHPAGpBqJzAABBrIQ4LAkAgA0GECEkNACADEKkBCwJAIAxFDQBCASEfDAMLQQAhAQwLC0EBIQFB2JDAAEEBENkBIQ4MCgsCQCAcQgFRDQAgAkEANgIgIAIgAzYCSCACQThqIAJByABqEN0BAkACQCACKAI4IgxBAUcNACACKwNAISEMAQsgAkHIAGogAkHPAGpBqJzAABBrIRALAkAgA0GECEkNACADEKkBCwJAIAwNAEEAIQEgECEODAsLQgEhHAwBC0EBIQFB2ZDAAEEBENkBIQ4MCQsgAUEQRw0ADAcLC0HwkMAAQQYQ2QEhASAAQYCAgIB4NgJEIAAgATYCAAwICwJAIApBgICAgHhGDQBBjJHAAEELENkBIQEgAEGAgICAeDYCRCAAIAE2AgBBASEDDA4LIAJBIGogAkEIahBAIAIoAiQhEQJAIAIoAiAiCkGAgICAeEYNACACKAIoIRIMCgsgAEGAgICAeDYCRCAAIBE2AgBBASEDDA4LAkAgCUGBgICAeEYNAEGHkcAAQQUQ2QEhASAAQYCAgIB4NgJEIAAgATYCAAwHCyACQQA2AgggAiANNgJIAkACQCACQcgAahDyAQ0AIAIgDTYCOCACQSBqIAJBOGoQ1QECQAJAIAIoAiAiCUGAgICAeEYiAQ0AIAIoAighEyACKAIkIQMMAQsgAkE4aiACQc8AakGAgMAAEGshAwsCQCANQYQISQ0AIA0QqQELIAENASADIRQMCgtBgICAgHghCSANQYQISQ0JIA0QqQEMCQsgAEGAgICAeDYCRCAAIAM2AgBBASEDQYGAgIB4IQkMCwsCQCAIQYCAgIB4Rg0AQYGRwABBBhDZASEBIABBgICAgHg2AkQgACABNgIADAYLIAJBIGogAkEIahBAIAIoAiQhAQJAIAIoAiAiCEGAgICAeEYNACACKAIoIRUgASEWDAgLQYCAgIB4IQggAEGAgICAeDYCRCAAIAE2AgAMBQsCQAJAIB5CAVENACACQQA2AgggAiANNgI4IAJBIGogAkE4ahDdAQJAAkAgAigCICIBQQFHDQAgAisDKCEiDAELIAJBOGogAkHPAGpBqJzAABBrIRcLAkAgDUGECEkNACANEKkBCyABRQ0BQgEhHgwIC0H7kMAAQQYQ2QEhASAAQYCAgIB4NgJEIAAgATYCAAwFCyAAQYCAgIB4NgJEIAAgFzYCAAwECwJAAkAgHUIBUQ0AIAJBADYCCCACIA02AjggAkEgaiACQThqEN0BAkACQCACKAIgIgFBAUcNACACKwMoISMMAQsgAkE4aiACQc8AakGonMAAEGshGAsCQCANQYQISQ0AIA0QqQELIAFFDQFCASEdDAcLQfaQwABBBRDZASEBIABBgICAgHg2AkQgACABNgIADAQLIABBgICAgHg2AkQgACAYNgIADAMLAkACQCAfp0EBcUUNACAcp0EBcQ0BQQAhAUHZkMAAQQEQ2AEhDgwCC0EAIQFB2JDAAEEBENgBIQ4MAQsCQCANQYMISw0AQgEhHAwFCyANEKkBQgEhHAwECwJAIA1BhAhJDQAgDRCpAQsgASADQYMIS3FFDQAgAxCpAQsgAEGAgICAeDYCRCAAIA42AgALQQEhAwwECyACQQA2AgggAiANNgJIAkACQCACQcgAahDyAQ0AIAIgDTYCOCACQSBqIAJBOGoQ1QECQAJAIAIoAiAiB0GAgICAeEYiAQ0AIAIoAighGSACKAIkIRoMAQsgAkE4aiACQc8AakGAgMAAEGshGgsCQCANQYQISQ0AIA0QqQELIAFFDQEgAEGAgICAeDYCRCAAIBo2AgBBASEDQYGAgIB4IQcMBQtBgICAgHghByANQYQISQ0AIA0QqQELIBohGwsgAigCECIBIAIoAhQiBEcNAAsLQYCAgIB4IAcgB0GBgICAeEYiAxshAQJAAkAgHKdBAXENAEHwkMAAQQYQ2AEhDQwBCwJAIB2nQQFxDQBB9pDAAEEFENgBIQ0MAQsCQCAep0EBcQ0AQfuQwABBBhDYASENDAELIAAgGTYCKCAAIBs2AiQgACABNgIgIAAgIjkDGCAAICM5AxAgACAhOQMIIAAgIDkDACAAQQAgEiAKQYCAgIB4RiIBGzYCTCAAQQQgESABGzYCSCAAQQAgCiABGzYCRCAAQQAgFSAIQYCAgIB4RiIBGzYCQCAAQQQgFiABGzYCPCAAQQAgCCABGzYCOCAAQYCAgIB4IAkgCUGBgICAeEYbNgIsIAAgE61CIIYgFK2ENwMwAkAgAigCGCIBQYQISQ0AIAEQqQELIAIoAghFDQUgAigCDCIBQYMITQ0FDAQLIABBgICAgHg2AkQgACANNgIAIAFBgICAgHhyQYCAgIB4Rg0AIBsgAUEBEMUCCyAKQYCAgIB4Rg0BCwJAIBJFDQAgESEBA0ACQCABKAIAIg1FDQAgAUEEaigCACANQQEQxQILIAFBDGohASASQX9qIhINAAsLIApFDQAgESAKQQxsQQQQxQILAkAgCUGCgICAeEgNACAJRQ0AIBQgCUEBEMUCCwJAIAhBgICAgHhGDQACQCAVRQ0AIBYhAQNAAkAgASgCACINRQ0AIAFBBGooAgAgDUEBEMUCCyABQQxqIQEgFUF/aiIVDQALCyAIRQ0AIBYgCEEMbEEEEMUCCwJAIAdBgYCAgHhHIANxRQ0AIAdBgICAgHhyQYCAgIB4Rg0AIBsgB0EBEMUCCwJAIAIoAhgiAUGECEkNACABEKkBCyACKAIIRQ0BIAIoAgwiAUGDCE0NAQsgARCpAQsgAkHQAGokAAvTDQIRfwN+IwBBIGsiBSQAAkACQCABKAIMIgYgAmoiAiAGSQ0AAkACQCACIAEoAgQiByAHQQFqIghBA3YiCUEHbCAHQQhJGyIKQQF2TQ0AAkACQAJAAkACQCAKQQFqIgsgAiALIAJLGyICQQ9JDQAgAkH/////AUsNAkF/IAJBA3RBB25Bf2pndkEBaiECDAELQQQgAkEIcUEIaiACQQRJGyECCyACrUIMfiIWQiCIpw0BIBanIgtBeEsNASALQQdqQXhxIgkgAkEIaiIMaiILIAlJDQEgC0H4////B0sNARCgAyALQQgQ5wIiDQ0CIAVBEGogBEEIIAsQiAIgBSgCFCECIAUoAhAhBAwGCyAFQRhqIAQQjAIgBSgCHCECIAUoAhghBAwFCyAFQQhqIAQQjAIgBSgCDCECIAUoAgghBAwECyANIAlqIQkCQCAMRQ0AIAlB/wEgDPwLAAsgAkF/aiIMIAJBA3ZBB2wgDEEISRshDiABKAIAIQ8CQCAGRQ0AIAlBdGohECAJQQhqIREgD0F0aiESIA8pAwBCf4VCgIGChIiQoMCAf4MhFiAPIQRBACECIAYhDQNAAkAgFkIAUg0AA0AgAkEIaiECIARBCGoiBCkDAEKAgYKEiJCgwIB/gyIWQoCBgoSIkKDAgH9RDQALIBZCgIGChIiQoMCAf4UhFgsCQCAJIA9BACAWeqdBA3YgAmoiE2tBDGxqIgtBdGooAgAiFCALQXhqKAIAIBQbIhQgDHEiC2opAABCgIGChIiQoMCAf4MiF0IAUg0AQQghCgNAIAsgCmohCyAKQQhqIQogCSALIAxxIgtqKQAAQoCBgoSIkKDAgH+DIhdQDQALCyAWQn98IRgCQCAJIBd6p0EDdiALaiAMcSILaiwAAEEASA0AIAkpAwBCgIGChIiQoMCAf4N6p0EDdiELCyAYIBaDIRYgCSALaiAUQRl2IhQ6AAAgESALQXhqIAxxaiAUOgAAIBAgC0F0bGoiC0EIaiASIBNBdGxqIhNBCGooAAA2AAAgCyATKQAANwAAIA1Bf2oiDQ0ACwsgASAMNgIEIAEgCTYCACABIA4gBms2AghBgYCAgHghBCAHRQ0BIAcgCEEMbEEHakF4cSICakEJaiILRQ0BIA8gAmsgC0EIEMUCDAELAkAgCEUNACABKAIAIQtBACECIAkgCEEHcUEAR2oiBEEBcSEMAkAgBEEBRg0AIARB/v///wNxIQlBACECA0AgCyACaiIEIAQpAwAiFkJ/hUIHiEKBgoSIkKDAgAGDIBZC//79+/fv37//AIR8NwMAIARBCGoiBCAEKQMAIhZCf4VCB4hCgYKEiJCgwIABgyAWQv/+/fv379+//wCEfDcDACACQRBqIQIgCUF+aiIJDQALCwJAIAxFDQAgCyACaiICIAIpAwAiFkJ/hUIHiEKBgoSIkKDAgAGDIBZC//79+/fv37//AIR8NwMACyALQQhqIRACQAJAIAhBCEkNACALIAhqIAspAAA3AAAMAQsgCEUNACAQIAsgCPwKAAALQQEhCUEAIQIDQCACIQQgCSECAkAgCyAEaiIMLQAAQYABRw0AIAsgBEF0bGoiCUF8aiESIAlBeGohDiAJQXRqIREgC0EAIARrQQxsaiIJQXhqIRQgCUF0aiEPAkADQCAPKAIAIgkgFCgCACAJGyITIAdxIgkhDQJAIAsgCWopAABCgIGChIiQoMCAf4MiFkIAUg0AQQghFSAJIQ0DQCANIBVqIQ0gFUEIaiEVIAsgDSAHcSINaikAAEKAgYKEiJCgwIB/gyIWUA0ACwsCQCALIBZ6p0EDdiANaiAHcSINaiwAAEEASA0AIAspAwBCgIGChIiQoMCAf4N6p0EDdiENCyANIAlrIAQgCWtzIAdxQQhJDQEgCyANaiIJLQAAIRUgCSATQRl2IhM6AAAgECANQXhqIAdxaiATOgAAIAsgDUF0bGoiDUF0aiEJAkAgFUH/AUYNACARKAAAIRMgESAJKAAANgAAIAkgEzYAACAOKAAAIQkgDiANQXhqIhMoAAA2AAAgEyAJNgAAIBIoAAAhCSASIA1BfGoiDSgAADYAACANIAk2AAAMAQsLIAxB/wE6AAAgECAEQXhqIAdxakH/AToAACAJQQhqIBFBCGooAAA2AAAgCSARKQAANwAADAELIAwgE0EZdiIJOgAAIBAgBEF4aiAHcWogCToAAAsgAiACIAhJIgRqIQkgBA0ACwsgASAKIAZrNgIIQYGAgIB4IQQLDAELIAUgBBCMAiAFKAIEIQIgBSgCACEECyAAIAI2AgQgACAENgIAIAVBIGokAAuYDQIIfxJ+IwBB0ABrIgQkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKQMAIgxCAFENACABKQMIIg1CAFENASABKQMQIg5CAFENAiAOIAxCf4VWDQMgDCANVA0EIANBEE0NBSAOIAx8Ig9CgICAgICAgIAgWg0GIAQgAS8BGCIBOwFAIAQgDCANfSINNwM4IAQgDSAPeSIOhiIQIA6IIhE3A0ggESANUg0HIAQgATsBQCAEIAw3AzggBCAMIA5CP4MiDYYiESANiCINNwNIIA0gDFINCEGgfyABIA6nayIFa8FB0ABsQbCnBWpBzhBtIgFB0QBPDQkgBEEgaiABQQR0IgEpA/iQQSIMQgAgDyAOhkIAEKYBIARBEGogDEIAIBBCABCmASAEIAxCACARQgAQpgFCAUEAIAUgAS8BgJFBamtBP3GtIg6GIhJCf3whEyAEKQMQQj+HIRQgBCkDAEI/iCEVIAQpAwghFiABLwGCkUEhASAEKQMYIRcCQCAEKQMoIhggBCkDIEI/iCIZfCIaQgF8IhsgDoinIgZBkM4ASQ0AIAZBwIQ9SQ0LAkAgBkGAwtcvSQ0AQQhBCSAGQYCU69wDSSIFGyEHQYDC1y9BgJTr3AMgBRshBQwNC0EGQQcgBkGAreIESSIFGyEHQcCEPUGAreIEIAUbIQUMDAsCQCAGQeQASQ0AQQJBAyAGQegHSSIFGyEHQeQAQegHIAUbIQUMDAtBCkEBIAZBCUsiBxshBQwLC0HIm8EAQRxB6JzBABCfAgALQficwQBBHUGYncEAEJ8CAAtBqJ3BAEEcQcSdwQAQnwIAC0HUncEAQTZBjJ7BABCfAgALQZyewQBBN0HUnsEAEJ8CAAtBko/BAEEtQeSewQAQnwIAC0H0nsEAQS1BpJ/BABCfAgALQQAgBEHIAGogBEE4akEAIAFB2KPBABDoAQALQQAgBEHIAGogBEE4akEAIAFB2KPBABDoAQALIAFB0QBBiJvBABDNAQALQQRBBSAGQaCNBkkiBRshB0GQzgBBoI0GIAUbIQULIBsgE4MhDCAVIBZ8IRwgByABa0EBaiEIIBQgF30gG3xCAXwiESATgyEPQQAhAQJAAkACQAJAAkACQAJAAkACQAJAA0AgBiAFbiEJIAMgAUYNAyACIAFqIgogCUEwaiILOgAAIBEgBiAJIAVsayIGrSAOhiIQIAx8Ig1WDQICQCAHIAFHDQAgAUEBaiEBQgEhDQNAIA8hECANIREgASADTw0GIAIgAWogDEIKfiIMIA6Ip0EwaiIFOgAAIAFBAWohASARQgp+IQ0gEEIKfiIPIAwgE4MiDFgNAAsgDyAMfSIVIBJUIQYgDSAbIBx9fiIOIA18IRQgDCAOIA19IhNaDQggFSASWg0CDAgLIAFBAWohASAFQQpJIQkgBUEKbiEFIAlFDQALQbSfwQAQ2AIACyACIAFqQX9qIQkgEiAcQgp+IBpCCn59IBF+fCEcQgAgDH0hDiAQQgp+IBJ9IRsDQAJAIAwgEnwiDSATVA0AIBMgDnwgHCAMfFoNAEEAIQYMBwsgCSAFQX9qIgU6AAAgGyAOfCIQIBJUIQYgDSATWg0HIA4gEn0hDiANIQwgECASVA0HDAALCyARIA19IhMgBa0gDoYiDlQhBSAbIBx9Ig9CAXwhHSANIA9Cf3wiEloNAiATIA5UDQIgGiAcfSAQIAx8Ig99IRwgGiAUfCAXfSAPIA58fUICfCEbIAwgFXwgFnwgGX0gGH0gEHwhEEIAIQwDQAJAIA0gDnwiDyASVA0AIBwgDHwgDiAQfFoNAEEAIQUMBAsgCiALQX9qIgs6AAAgGyAMfCITIA5UIQUgDyASWg0EIBAgDnwhECAMIA59IQwgDyENIBMgDlQNBAwACwsgAyADQcSfwQAQzQEACyABIANB1J/BABDNAQALIA0hDwsCQCAdIA9YDQAgBQ0AAkAgDyAOfCIMIB1UDQAgHSAPfSAMIB19VA0BCyAAQQA2AgAMBAsCQAJAIA9CAlQNACAPIBFCfHxYDQELIABBADYCAAwECyAAIAg7AQggACABQQFqNgIEDAILIAwhDQsCQCAUIA1YDQAgBg0AAkAgDSASfCIMIBRUDQAgFCANfSAMIBR9VA0BCyAAQQA2AgAMAgsCQAJAIBFCFH4gDVYNACANIA8gEUJYfnxYDQELIABBADYCAAwCCyAAIAg7AQggACABNgIECyAAIAI2AgALIARB0ABqJAALuw0CDn8GfCMAQSBrIgYkAEEAIQcgBkEANgIcIAZCgICAgMAANwIUAkACQAJAAkACQAJAAkAgAygCHEGAgICAeEcNACADKAIoQYCAgIB4Rg0DIANBKGohCEEEIQkMAQsgBkEUahCqASAGKAIYIgkgA0EcajYCAEEBIQcgBkEBNgIcQQQhCiADKAIoQYCAgIB4Rg0BIANBKGohCAsCQCAHIAYoAhRHDQAgBkEUahCqASAGKAIYIQkLIAkgB0ECdCIHaiAINgIAIAdBBGohCiAGKAIYIQkLIAYoAhQhCyADKwMAIRQgAysDCCEVIAZBADYCECAGQoCAgIDAADcCCCAVIAWjEMUBIRYgFCAFoxDFASEXIAJFDQEgASACQdAAbGohDCAW/AIhDSAX/AIhDiABQdAAaiEDQQAhDwNAIAMhEAJAIAEoAkwiB0UNACABKAJIIgMgB0EMbGohEQNAIANBDGohEiADKAIEIRMgAygCCCECIAohByAJIQMCQANAAkAgAygCACIIQQhqKAIAIAJHDQAgCEEEaigCACATIAIQ1AFFDQILIANBBGohAyAHQXxqIgcNAAsgEiEDIBIgEUcNAQwCCwsgFCABKwMAIhYgASsDEEQAAAAAAADgP6IiF6FmRQ0AIBQgFiAXoGVFDQAgFSABKwMIIhYgASsDGEQAAAAAAADgP6IiF6FmRQ0AIBUgFiAXoGVFDQAgBkEUaiABIAQQQSAGKAIYIQMCQAJAIAYoAhwiB0EBRg0AIAdFDQEgAyAHQQJ0aiESIANBBGohByAGKAIMIQgDQCAHIQEgD0EMbCECIAMoAgAhEwJAAkAgD0UNAEEAIQMDQAJAIAggA2oiBygCACAORw0AIAdBBGooAgAgDUcNACAHQQhqLQAAIBNB/wFxRg0DCyACIANBDGoiA0cNAAsLAkAgDyAGKAIIRw0AIAZBCGoQqwEgBigCDCEICyAIIAJqIgMgEzoACCADIA02AgQgAyAONgIAIAYgD0EBaiIPNgIQCyABQQBBBCABIBJGG2ohByABIQMgASASRw0ADAILCyABKwMIIRYgASsDACEXIAMoAgAhEgJAAkAgASsDECIYIAErAxgiGWYNACAXIAWjEMUB/AIhAiAWIBlEAAAAAAAA4D+iIhehIAWhIAWjEMUB/AIhASAFIBYgF6CgIAWjEMUBIRYgBigCDCETAkACQCAPRQ0AIA9BDGwhB0EAIQMDQAJAIBMgA2oiCCgCACACRw0AIAhBBGooAgAgAUcNACAIQQhqLQAAIBJB/wFxRg0DCyAHIANBDGoiA0cNAAsLAkAgDyAGKAIIRw0AIAZBCGoQqwEgBigCDCETCyATIA9BDGwiB2oiAyASOgAIIAMgATYCBCADIAI2AgAgBiAPQQFqIg82AhAgB0EMaiEHCyAW/AIhCAJAIA9FDQAgEkH/AXEhASATIQMDQAJAIAMoAgAgAkcNACADQQRqKAIAIAhHDQAgA0EIai0AACABRg0FCyADQQxqIQMgB0F0aiIHDQALCwJAIA8gBigCCEcNACAGQQhqEKsBIAYoAgwhEwsgEyAPQQxsaiIDIAI2AgAMAQsgFiAFoxDFAfwCIQggFyAYRAAAAAAAAOA/oiIWoSAFoSAFoxDFAfwCIQEgBSAXIBagoCAFoxDFASEWIAYoAgwhEwJAAkAgD0UNACAPQQxsIQdBACEDA0ACQCATIANqIgIoAgAgAUcNACACQQRqKAIAIAhHDQAgAkEIai0AACASQf8BcUYNAwsgByADQQxqIgNHDQALCwJAIA8gBigCCEcNACAGQQhqEKsBIAYoAgwhEwsgEyAPQQxsIgdqIgMgEjoACCADIAg2AgQgAyABNgIAIAYgD0EBaiIPNgIQIAdBDGohBwsgFvwCIQICQCAPRQ0AIBMhAwNAAkAgAygCACACRw0AIANBBGooAgAgCEcNACADQQhqLQAAIBJB/wFxRg0ECyADQQxqIQMgB0F0aiIHDQALCwJAIA8gBigCCEcNACAGQQhqEKsBIAYoAgwhEwsgEyAPQQxsaiIDIAI2AgALIAMgEjoACCADIAg2AgQgBiAPQQFqIg82AhALIAYoAhQiA0UNACAGKAIYIANBAnRBBBDFAgsgECAMRiIDDQIgEEEAQdAAIAMbaiEDIBAhASAQDQAMAgsLIAYoAhQhCyAAQQA2AgggAEKAgICAwAA3AgBBBCEJIAsNAQwCCyAAIAYpAgg3AgAgAEEIaiAGQQhqQQhqKAIANgIAIAtFDQELIAkgC0ECdEEEEMUCCyAGQSBqJAALww0DB38BfgZ8IwBBwABrIgIkAAJAQQAtANi6QUEBRg0AQQAQowELIAJBCGpBACkDgJBANwMAQQBBACkDyLpBIglCAXw3A8i6QSACQQApA/iPQDcDACACQQApA9C6QTcDGCACIAk3AxAQoAMCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQ5BARDnAiIDRQ0AIANBBmpBACkAm5dANwAAIANBACkAlZdANwAAIAJBDjYCLCACIAM2AiggAkEONgIkIAJBMGogAiACQSRqIAEoAgAiBLgiChBjEKADQQxBARDnAiIDRQ0BIANBCGpBACgAq5dANgAAIANBACkAo5dANwAAIAJBDDYCLCACIAM2AiggAkEMNgIkIAJBMGogAiACQSRqIAEoAgS4EGMQoANBD0EBEOcCIgNFDQIgA0EHakEAKQC2l0A3AAAgA0EAKQCvl0A3AAAgAkEPNgIsIAIgAzYCKCACQQ82AiQgAkEwaiACIAJBJGogASgCCLgiCxBjEKADQQ9BARDnAiIDRQ0DIANBB2pBACkAxZdANwAAIANBACkAvpdANwAAIAJBDzYCLCACIAM2AiggAkEPNgIkIAJBMGogAiACQSRqIAEoAgwiBbgiDBBjEKADQQtBARDnAiIDRQ0EIANBB2pBACgA1JdANgAAIANBACkAzZdANwAAIAJBCzYCLCACIAM2AiggAkELNgIkIAJBMGogAiACQSRqIAEoAhAiBrgiDRBjEKADQQlBARDnAiIDRQ0FIANBCGpBAC0A4JdAOgAAIANBACkA2JdANwAAIAJBCTYCLCACIAM2AiggAkEJNgIkIAJBMGogAiACQSRqIAEoAhS3EGMQoANBCUEBEOcCIgNFDQYgA0EIakEALQDpl0A6AAAgA0EAKQDhl0A3AAAgAkEJNgIsIAIgAzYCKCACQQk2AiQgAkEwaiACIAJBJGogASgCGCIHtyIOEGMQoANBB0EBEOcCIgNFDQcgA0EDakEAKADtl0A2AAAgA0EAKADql0A2AAAgAkEHNgIsIAIgAzYCKCACQQc2AiQgAkEwaiACIAJBJGogASgCHCIItyIPEGMQoANBC0EBEOcCIgNFDQggA0EHakEAKAD4l0A2AAAgA0EAKQDxl0A3AAAgAkELNgIsIAIgAzYCKCACQQs2AiQgAkEwaiACIAJBJGogASgCILcQYxCgA0ENQQEQ5wIiA0UNCSADQQVqQQApAIGYQDcAACADQQApAPyXQDcAACACQQ02AiwgAiADNgIoIAJBDTYCJCACQTBqIAIgAkEkaiABKAIkuBBjEKADQQ9BARDnAiIDRQ0KIANBB2pBACkAkJhANwAAIANBACkAiZhANwAAIAJBDzYCLCACIAM2AiggAkEPNgIkIAJBMGogAiACQSRqIAEoAii4EGMQoANBCUEBEOcCIgNFDQsgA0EIakEALQCgmEA6AAAgA0EAKQCYmEA3AAAgAkEJNgIsIAIgAzYCKCACQQk2AiQgAkEwaiACIAJBJGogASgCLLgQYyAHQQFIDQ0gCEEATA0NEKADQQ9BARDnAiIBRQ0MIAFBB2pBACkAqJhANwAAIAFBACkAoZhANwAAIAJBDzYCLCACIAE2AiggAkEPNgIkIAJBMGogAiACQSRqIA4gD6MQYwwNC0EBQQ4QmwIAC0EBQQwQmwIAC0EBQQ8QmwIAC0EBQQ8QmwIAC0EBQQsQmwIAC0EBQQkQmwIAC0EBQQkQmwIAC0EBQQcQmwIAC0EBQQsQmwIAC0EBQQ0QmwIAC0EBQQ8QmwIAC0EBQQkQmwIAC0EBQQ8QmwIACwJAAkACQAJAIAZFDQAQoANBD0EBEOcCIgFFDQEgAUEHakEAKQC3mEA3AAAgAUEAKQCwmEA3AAAgAkEPNgIsIAIgATYCKCACQQ82AiQgAkEwaiACIAJBJGogCiANoxBjEKADQQ1BARDnAiIBRQ0CIAFBBWpBACkAxJhANwAAIAFBACkAv5hANwAAIAJBDTYCLCACIAE2AiggAkENNgIkIAJBMGogAiACQSRqIAsgCqMQYwsCQCAERQ0AEKADQQpBARDnAiIBRQ0DIAFBCGpBAC8A1JhAOwAAIAFBACkAzJhANwAAIAJBCjYCLCACIAE2AiggAkEKNgIkIAJBMGogAiACQSRqIAwgBSAEarijEGMLIAAgAikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEQaiACQRBqKQMANwMAIABBCGogAkEIaikDADcDACACQcAAaiQADwtBAUEPEJsCAAtBAUENEJsCAAtBAUEKEJsCAAv4DQMUfwJ+AnwjAEHAAGsiAiQAIAIgATYCCAJAAkACQCACQQhqEM4CDQAgAkEIaiACQT9qQeiawAAQayEDIABBgYCAgHg2AiggACADNgIAIAFBhAhPDQEMAgsgAkGIksAANgIYIAIgATYCHCACQQA2AgwgAkEcaiEEQgAhFkIAIRdBgYCAgHghBUGBgICAeCEGQYGAgIB4IQdBACEDAkACQANAIAkhCCADQQhqIQMCQAJAAkADQCACIANB4JHAAGo2AhQgAiADQdiRwABqKAIAIgogA0HckcAAaigCACILEGIiDDYCOCACIAQgAkE4ahDGAiIJNgIgAkACQCACQSBqENACRQ0AIAJBOGogBBCvAkUNAQsgAiAJNgIQIAJBATYCDAJAAkACQAJAIAtBf2oOCQYDAwMAAwEDAgMLIApBh5HAAEEFENQBDQJBAiELDAYLIApB0JHAAEEHENQBDQFBAyELDAULIApB15HAAEEJENQBDQBBBCELDAQLQQUhCwwDCwJAIAlBhAhJDQAgCRCpAQsCQCAMQYQISQ0AIAwQqQELIANBCGoiA0EwRw0ACyAIIQkMAgtBAEEBQQUgCi0AACILQfkARhsgC0H4AEYbIQsLAkAgDEGECEkNACAMEKkBCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCALDgUBAgMEBQALIAJBADYCDCAJQYQISQ0KIAkQqQEMCgsgFkIBUQ0FIAJBADYCDCACIAk2AjggAkEgaiACQThqEN0BAkACQCACKAIgIgxBAUcNACACKwMoIRgMAQsgAkE4aiACQT9qQaicwAAQayENCwJAIAlBhAhJDQAgCRCpAQsgDEUNBEIBIRYMCQsCQCAXQgFRDQAgAkEANgIMIAIgCTYCOCACQSBqIAJBOGoQ3QECQAJAIAIoAiAiDEEBRw0AIAIrAyghGQwBCyACQThqIAJBP2pBqJzAABBrIQ4LAkAgCUGECEkNACAJEKkBCwJAIAwNAEEAIQMgDiENDA0LQgEhFwwJC0EBIQNB2ZDAAEEBENkBIQ0MCwsgBUGBgICAeEYNBkEBIQNBh5HAAEEFENkBIQ0MCgsgBkGBgICAeEYNBEEBIQNB0JHAAEEHENkBIQ0MCQsgB0GBgICAeEYNAkEBIQNB15HAAEEJENkBIQ0MCAtBACEDDAcLQQEhA0HYkMAAQQEQ2QEhDQwGCyACQQA2AgwgAiAJNgI0AkAgAkE0ahDyAQ0AIAIgCTYCOCACQSBqIAJBOGoQ1QECQAJAIAIoAiAiB0GAgICAeEYiDA0AIAIoAighDyACKAIkIRAMAQsgAkE4aiACQT9qQYCAwAAQayEQCwJAIAlBhAhJDQAgCRCpAQsgDEUNAyAAQYGAgIB4NgIoIAAgEDYCAEEAIQMMBwtBgICAgHghByAJQYQISQ0CIAkQqQEMAgsgAkEANgIMIAIgCTYCNAJAAkAgAkE0ahDyAQ0AIAIgCTYCOCACQSBqIAJBOGoQ1QECQAJAIAIoAiAiBkGAgICAeEYiDA0AIAIoAighESACKAIkIQsMAQsgAkE4aiACQT9qQYCAwAAQayELCwJAIAlBhAhJDQAgCRCpAQsgDA0BIAshEgwDC0GAgICAeCEGIAlBhAhJDQIgCRCpAQwCC0GBgICAeCEGQQAhAyALIQ0MBAsgAkEANgIMIAIgCTYCNAJAAkAgAkE0ahDyAQ0AIAIgCTYCOCACQSBqIAJBOGoQ1QECQAJAIAIoAiAiBUGAgICAeEYiDA0AIAIoAighEyACKAIkIRQMAQsgAkE4aiACQT9qQYCAwAAQayEUCwJAIAlBhAhJDQAgCRCpAQsgDEUNAUGBgICAeCEFQQAhAyAUIQ0MBQtBgICAgHghBSAJQYQISQ0AIAkQqQELIBQhFQsgA0EoRw0BCwsCQCAWp0EBcQ0AQQAhA0HYkMAAQQEQ2AEhDQwBCwJAIBenQQFxDQBBACEDQdmQwABBARDYASENDAELIAAgGTkDCCAAIBg5AwAgAEGAgICAeCAHIAdBgYCAgHhGGzYCKCAAQYCAgIB4IAYgBkGBgICAeEYbNgIcIABBgICAgHggBSAFQYGAgIB4Rhs2AhAgACAPrUIghiAQrYQ3AiwgACARrUIghiASrYQ3AyAgACATrUIghiAVrYQ3AhQgAUGDCEsNAgwDCyAAQYGAgIB4NgIoIAAgDTYCACAHQYKAgIB4SA0AIAdFDQAgECAHQQEQxQILAkAgBkGCgICAeEgNACAGRQ0AIBIgBkEBEMUCCwJAIAVBgoCAgHhIDQAgBUUNACAVIAVBARDFAgsCQCABQYQISQ0AIAEQqQELIAlBhAhJDQEgCSEBIANFDQELIAEQqQELIAJBwABqJAALnAsDCX8DfgF8IwBBsAZrIgMkAAJAAkAgAg0AIABBATsBAAwBCwJAAkACQAJAIAEtAAAiBEFVag4DAAEAAQsgAkF/aiICRQ0BIAFBAWohAQsgA0EgaiABIAIQPAJAAkACQAJAIAMtADEiBUECRg0AIAMpAyghDCADKQMgIg1CWnxCRFQNAyAMQoCAgICAgIAQVg0DIAVBAXENAwJAIA1CFlUNACANpyECIAy6IQ8gDUIAUw0CIAJBA3QrA5i0QSAPoiEPDAMLIAMgDEIAIA2nQQN0QcCMwQBqKQMAQgAQpgEgAykDCEIAUg0DIAMpAwAiDkKAgICAgICAEFYNAyAOukSS1U0Gz/CARKIhDwwCCwJAAkACQAJAIAJBfWoOBgEDAwMDAAMLIAEpAABC37///v379+9fg0LJnJnK5KmSqtkAUg0CRAAAAAAAAPB/IQ8MAQsCQCABMwAAIAExAAJCEIaEQt+//waDIgxCyZyZAlINAEQAAAAAAADwfyEPDAELIAxCzoK5AlINAUQAAAAAAAD4fyEPCyAAIA+aIA8gBEEtRhs5AwggAEEAOgAADAYLIABBAToAASAAQQE6AAAMBQsgD0GYtMEAIAJBA3RrKwMAoyEPCyAAQQA6AAAgACAPmiAPIARBLUYbOQMIDAMLIANBEGogDSAMEHAgAygCGCEGIAVBAXFFDQEgBkF/TA0BIANBIGogDSAMQgF8EHAgBkF/IAYgAygCKEYbQX8gAykDECADKQMgURshBgwBCyAAQYECOwEADAELAkACQCAGQQBIDQAgAykDECEMDAELIANBIGogASACED5CACEMAkACQCADKAIgRQ0AIAMoAiQiAkG8fUgNAEH/DyEGIAJBtQJKDQICQCACQQFODQBBACEBDAILQQAhAQNAQTwhBQJAIAJBE08NACACLQCYvEAhBQsgA0EgaiAFEF4gAygCJCICQYBwTA0BIAUgAWohASACQQFIDQIMAAsLQQAhBgwBCyADQShqIQcCQANAAkACQCACRQ0AQTwhBUEAIAJrIgJBE08NASACLQCYvEAhBQwBCyADLQAoIgJBBEsNAkECQQEgAkECSRshBQsgA0EgaiAFEGACQCADKAIkIgJB/w9MDQBB/w8hBgwDCyABIAVrIQEgAkEBSA0ACwsCQCABQX9qIgJBgXhKDQADQCADQSBqQYJ4IAJrIgFBPCABQTxJGyIBEF4gASACaiICQYJ4SQ0ACwsgAkH/B2pB/g9KDQAgA0EgakE1EGACQAJAAkACQAJAAkAgAygCICIFRQ0AIAMoAiQiCEEASA0AIAhBEksNBAJAIAgNAEIAIQ0MBAsgCEEBcSEJAkAgCEEBRw0AQQAhAUIAIQ4MAwsgCEEecSEKQQAhC0IAIQ0DQCANQgp+IQ0CQCALIgEgBU8NACANIANBIGogAWpBCGoxAAB8IQ0LIA1CCn4hDQJAIAFBAWoiCyAFTw0AIA0gA0EgaiABakEJajEAAHwhDQsgC0EBaiILIApGDQIMAAsLIAJB/gdqIQYMBQsgAUECaiEBIA1CCn4hDgsgCUUNAAJAIAEgBUkNACAOIQ0MAQsgDiAHIAFqMQAAfCENCwJAIAggBU8NACAHIAhqIgstAAAhAQJAAkACQCAIQQFqIAVHDQAgAUH/AXFBBUYNAQsgAUH/AXFBBEsNAQwCCyADLQCoBg0AIAhFDQEgC0F/ai0AAEEBcUUNAQsgDUIBfCENCyANQoCAgICAgIAQVA0BCyADQSBqQQEQXiADQSBqEHghDSACQYAIakH+D0oNASACQQFqIQILIA1C/////////weDIQxB/gdB/wcgDUKAgICAgICACFQbIAJqIQYLIABBADoAACAAIAatQjSGIAyEvyIPmiAPIARBLUYbOQMICyADQbAGaiQAC9sKAgl/BX5CACEMIAIhAyABIQQCQAJAAkACQAJAAkACQAJAIAJBCEkNAEIAIQwgASEEIAIhAwNAIAQpAAAiDULGjJmy5MiRo8YAfCANQtCfv/78+fPnT3wiDYRCgIGChIiQoMCAf4NQRQ0CIA1CCn4gDUIIiHwiDUIQiEL/gYCA8B+DQoGAgICA4gl+IA1C/4GAgPAfg0LkgICAgMjQB358QiCIIAxCgMLXL358IQwgBEEIaiEEIANBeGoiA0EHSw0ACwsgA0UNAQtBACEFA0AgBCAFaiIGLQAAIgdBUGoiCEH/AXFBCUsNAiAMQgp+IAitQv8Bg3whDCADIAVBAWoiBUcNAAsLIAJFDQFCACEOQQEhCUEAIQogAiEFQgAhDQwDC0EBIQkgAiADayELAkAgAyAFRg0AIAMgBWshCgJAAkAgB0H/AXFBLkYNAEIAIQ1BACEIIAohBAwBCyAGQQFqIQYCQAJAAkACQCAKQX9qIgRBCEkNAANAIAYpAAAiDULGjJmy5MiRo8YAfCANQtCfv/78+fPnT3wiDYRCgIGChIiQoMCAf4NQRQ0CIA1CCn4gDUIIiHwiDUIQiEL/gYCA8B+DQoGAgICA4gl+IA1C/4GAgPAfg0LkgICAgMjQB358QiCIIAxCgMLXL358IQwgBkEIaiEGIARBeGoiBEEHSw0ACwsgBEUNAQsgBiIIIARqIQYDQAJAIAgtAABBUGoiB0H/AXFBCU0NACAIIQYMAwsgDEIKfiAHrUL/AYN8IQwgCEEBaiEIIARBf2oiBA0ACwtBACEECyAFQX9zIAMgBGtqIQggBCADayAFakEBaqwhDQtBAiEDIAggC2ogBWoiBUUNBEEBIQlCACEOIARFDQMgBi0AAEEgckHlAEYNAkEAIQkMAwsgCyAFaiIFRQ0AQgAhDkEAIQpCACENDAILIABBAjoAEQ8LIARBf2oiB0UNASAGQQFqIggtAAAiCSELAkACQCAJQVVqDgMAAQABCyAEQX5qIgdFDQIgBkECaiEIIAYtAAIhCwsgC0FQakH/AXFBCUsNAUIAIQ9CACEOAkADQCAILQAAQVBqIgRB/wFxQQlLDQEgDkIKfiAErUL/AYN8IhAgDiAOQoCABFMiBBshDiAQIA8gBBshDyAIQQFqIQggB0F/aiIHDQALQQAhBwtCACAPfSAPIAlBLUYbIg4gDXwhDSAHRSEJC0EAIQMCQCAFQRRIDQACQAJAAkACQCACRQ0AIAVBbWohAyABIQQgAiEIAkADQAJAIAQtAAAiBUFSag4DAAIAAgsgA0EAIAVBUWoiBiAGIAVLG2shAyAEQQFqIQQgCEF/aiIIDQALCyADQQFIDQNBACACayEEQgAhDAJAAkADQCAEIQUgAS0AAEFQaiIIQf8BcUEJSw0BIAFBAWohASAFQQFqIQQCQCAMQgp+IAitQv8Bg3wiDEL//4+7utat8A1WDQAgBA0BCwsgDEL//4+7utat8A1WDQMgBUF/Rg0CQQAgBGshBAwBC0EAIAVrIQQLAkAgBEF/aiIHDQBBACAHayEEDAMLIAFBAWohBCAHIQUDQAJAIAQtAABBUGoiCEH/AXFBCU0NACAFIAdrIQQMBAsgBUF/aiEGAkAgDEIKfiAIrUL/AYN8IgxC//+Pu7rWrfANVg0AIARBAWohBCAFQQFHIQggBiEFIAgNAQsLIAYgB2shBAwCC0EBQQBBAEGsvMAAEOMBAAtBACAKIARqayEECyAOIASsfCENCyADQQBKIQMLAkAgCQ0AIABBAjoAEQ8LIABBADoAECAAIAw3AwggACANNwMACyAAIAM6ABELwgsCCn8CfiMAQfAAayICJAAgAiABNgIgIAJB4ABqIAJBIGoQfSACKAJgIQMCQAJAAkACQAJAAkACQAJAAkAgAi0AZCIEQX5qDgICAAELIABBlYCAgHg2AgAgACADNgIEIAFBgwhLDQYMBwtBACEFIAJBADYCLCACQoCAgICAATcCJAJAIARBAXENACADEKECIQRBACgC7LZBIQZBACgC6LZBIQdBAEIANwLotkECQCAHQQFHDQAMAwtBACEFQRAhB0EIIQgDQAJAIAQQkQMiCQ0AIAQQogIhBgsCQCAEQYQISQ0AIAQQqQELIAkNASACQQhqIAYQ7wEgAigCDCEKIAJB4ABqIAIoAggQViACKAJkIQYCQCACKAJgIglBlYCAgHhHDQBBASELDAULIAIgAikDaCIMNwNYIAIgBjYCVCACIAk2AlAgAkHgAGogChBWAkAgAigCYEGVgICAeEcNACACKAJkIQYgAkHQAGoQhgEMBAsgAkEwakEIaiACQeAAakEIaikDACINNwMAIAJBwABqQQhqIgsgDTcDACACIAIpA2AiDTcDMCACIA03A0ACQCAFIAIoAiRHDQAgAkEkahC0ASACKAIoIQgLIAggB2oiBEF4aiAMNwIAIARBdGogBjYCACAEQXBqIAk2AgAgBCACKQNANwIAIARBCGogCykDADcCACACIAVBAWoiBTYCLEEAIQsgAxChAiEEQQAoAuy2QSEGQQAoAui2QSEJQQBCADcC6LZBIAdBIGohByAJQQFHDQAMBAsLIAAgAikCJDcCACAAQQhqIAJBJGpBCGooAgA2AgAgAyEKIANBgwhNDQQMAwsgAkEYaiACQSBqEPMBAkACQAJAAkAgAigCGEEBcUUNAAJAAkAgAigCHCIDEJADIgQNACACQQA2AiwgAkKAgICAgAE3AiQMAQsQoAMgBEGAgAIgBEGAgAJJGyIGQQV0IgVBCBDnAiIKRQ0CQQAhBSACQQA2AiwgAiAKNgIoIAIgBjYCJEEQIQcDQCACQRBqIAMgBRCdAhDvASACKAIUIQYgAkHgAGogAigCEBBWAkAgAigCYEGVgICAeEcNACACKAJkIQkgBkGECEkNBSAGEKkBDAULIAJB0ABqQQhqIAJB4ABqQQhqIgkpAwA3AwAgAiACKQNgNwNQIAJB4ABqIAYQVgJAIAIoAmBBlYCAgHhHDQAgAigCZCEJIAJB0ABqEIYBDAULIAJBMGpBCGoiBiAJKQMANwMAIAIgAikDYDcDMCACKAJUIQkCQCACKAJQIgtB6////wdqDgICBQALIAIpA1ghDCACQcAAakEIaiIIIAYpAwA3AwAgAiACKQMwNwNAAkAgBSACKAIkRw0AIAJBJGoQtAEgAigCKCEKCyAKIAdqIgZBeGogDDcCACAGQXRqIAk2AgAgBkFwaiALNgIAIAYgAikDQDcCACAGQQhqIAgpAwA3AgAgAiAFQQFqIgU2AiwgB0EgaiEHIAQgBUcNAAsLIAAgAikCJDcCACAAQQhqIAJBJGpBCGooAgA2AgAMAwsgAkEgaiACQeAAakGYnMAAEGshBSAAQZWAgIB4NgIAIAAgBTYCBAwGC0EIIAUQmwIACyAAQZWAgIB4NgIAIAAgCTYCBCACKAIoIQQCQCAFRQ0AIAQhAANAIAAQhgEgAEEQahCGASAAQSBqIQAgBUF/aiIFDQALCyACKAIkIgBFDQAgBCAAQQV0QQgQxQILIANBhAhJDQMgAxCpAQwDC0EAIQsLIABBlYCAgHg2AgAgACAGNgIEIAIoAighBAJAIAVFDQAgBCEAA0AgABCGASAAQRBqEIYBIABBIGohACAFQX9qIgUNAAsLAkAgAigCJCIARQ0AIAQgAEEFdEEIEMUCCwJAIANBhAhJDQAgAxCpAQsgCyAKQYMIS3FFDQELIAoQqQELIAFBhAhJDQELIAEQqQELIAJB8ABqJAALkAoCDH8BfiMAQZAGayIDJABBACEEAkBBiQZFDQAgA0EEakEAQYkG/AsACyACQQFqIQUgA0EMaiEGIANBBGohBwJAAkADQAJAIAIgBEcNAEEAIQgMAgsgASAEaiEJIAVBf2ohBSAEQQFqIQQgCS0AAEEwRg0ACyACIARrIQoCQAJAAkACQAJAAkACQAJAAkACQCABIARqIgtBf2oiCS0AACIMQVBqIg1B/wFxQQlLDQAgASAEaiELQQAhCAJAA0ACQCAIIgRB/wVLDQAgBiAEaiANOgAACyALIARqIQkCQCAKIARGDQAgBEEBaiEIIAktAAAiDEFQaiINQf8BcUEJSw0CDAELCyAHIARBAWoiCDYCAEEAIQtBACENDAkLIAMgCDYCBCAFIAhrIQ0gCyAIaiILQX9qIQkgDEH/AXFBLkYNASAEQQFqIQhBACELDAgLIApBAWohDUEAIQggA0EANgIEIAxB/wFxQS5GDQFBACELDAgLIAhBf3MgBWohCiAIRQ0AIAohDSALIQkMAQsgCSANaiEJQQAhCEEAIQQDQCAKIARGDQIgCyAEaiEFIARBAWohBCAFLQAAQTBGDQALIAsgBGpBf2ohCSAKIARrQQFqIQ1BACEICwJAIA1BCEkNACAIQQhqIQQCQANAIARBgAZPDQQgCSkAACIPQsaMmbLkyJGjxgB8IA9C0J+//vz58+dPfCIPhEKAgYKEiJCgwIB/g0IAUg0EAkAgBEF4akGABksNACADQQRqIARqIA83AAAgAyAENgIEIARBCGohBCAJQQhqIQkgDUF4aiINQQdNDQIMAQsLIARBeGpBgAZBgAZBuLDAABDjAQALIARBeGohCAsgDQ0CQQAhDQwDC0EAIQ0MAgsgBEF4aiEICwJAIAktAABBUGoiC0H/AXFBCUsNACAJQQFqIQcgDUF/aiEMIAggA0EEampBCGohDkEAIQUCQANAAkAgCCAFIgRqIgZB/wVLDQAgDiAEaiALOgAACwJAIAwgBEYNACANQX9qIQ0gBEEBaiEFIAcgBGotAABBUGoiC0H/AXFBCUsNAgwBCwtBACENCyAJIARqQQFqIQkgBkEBaiEICyADIAg2AgQLIAMgDSAKayILNgIICwJAIAgNAEEAIQgMAQsgAiANayEEAkAgAiANSQ0AQQAhBQJAIAIgDUYNACABQX9qIQJBACEFA0ACQAJAIAIgBGotAABBUmoOAwEDAAMLIAVBAWohBQsgBEF/aiIEDQALCyADIAsgCGoiCzYCCCADIAggBWsiBDYCBEGABiEIAkAgBEGABksNACAEIQgMAgsgA0GABjYCBCADQQE6AIwGDAELQQAgBCACQciwwAAQ4wEACwJAIA1FDQAgCUUNACAJLQAAQSByQeUARw0AAkACQCANQX9qIgINAEEAIQQMAQsCQAJAIAlBAWoiBS0AACIMQVVqDgMAAQABCyANQX5qIQIgCUECaiEFC0EAIQkCQCACRQ0AQQAhCUEAIQQDQCAFLQAAQVBqQf8BcSIBQQlLDQEgBEEKbCABaiIBIAQgBEGAgARIIgobIQQgASAJIAobIQkgBUEBaiEFIAJBf2oiAg0ACwtBACAJayAJIAxBLUYbIQQLIAMgCyAEajYCCAsgCEESSw0BC0ETIAhrIgRFDQAgA0EEaiAIakEIakEAIAT8CwALAkBBjAZFDQAgACADQQRqQYwG/AoAAAsgA0GQBmokAAuFCgIGfwN+AkACQAJAAkACQAJAIAFBCEkNACABQQdxIgJFDQUgACgCoAEiA0EpTw0BAkAgAw0AIABBADYCoAEMBgsgA0ECdCIEQXxqIgVBAnZBAWoiBkEDcSEHIAJBAnQoApSiQSACdq0hCAJAAkAgBUEMTw0AQgAhCSAAIQIMAQsgBkH8////B3EhBUIAIQkgACECA0AgAiACNQIAIAh+IAl8Igk+AgAgAkEEaiIGIAY1AgAgCH4gCUIgiHwiCT4CACACQQhqIgYgBjUCACAIfiAJQiCIfCIJPgIAIAJBDGoiBiAGNQIAIAh+IAlCIIh8Igo+AgAgCkIgiCEJIAJBEGohAiAFQXxqIgUNAAsLAkAgB0UNACAHQQJ0IQUDQCACIAI1AgAgCH4gCXwiCj4CACACQQRqIQIgCkIgiCEJIAVBfGoiBQ0ACwsCQCAKQoCAgIAQVA0AIANBKEYNAyAAIARqIAmnNgIAIANBAWohAwsgACADNgKgAQwFCyAAKAKgASIGQSlPDQICQCAGDQAgAEEANgKgASAADwsgAUECdDUClKJBIQggBkECdCIHQXxqIgJBAnZBAWoiBUEDcSEDAkACQCACQQxPDQBCACEJIAAhAgwBCyAFQfz///8HcSEFQgAhCSAAIQIDQCACIAI1AgAgCH4gCXwiCT4CACACQQRqIgEgATUCACAIfiAJQiCIfCIJPgIAIAJBCGoiASABNQIAIAh+IAlCIIh8Igk+AgAgAkEMaiIBIAE1AgAgCH4gCUIgiHwiCj4CACAKQiCIIQkgAkEQaiECIAVBfGoiBQ0ACwsCQCADRQ0AIANBAnQhBQNAIAIgAjUCACAIfiAJfCIKPgIAIAJBBGohAiAKQiCIIQkgBUF8aiIFDQALCwJAIApCgICAgBBUDQAgBkEoRg0EIAAgB2ogCac2AgAgBkEBaiEGCyAAIAY2AqABIAAPC0EAIANBKEHIr8AAEOMBAAtBKEEoQcivwAAQzQEAC0EAIAZBKEHIr8AAEOMBAAtBKEEoQcivwAAQzQEACwJAAkACQCABQQhxRQ0AIAAoAqABIgNBKU8NAQJAAkAgAw0AQQAhAwwBCyADQQJ0IgRBfGoiAkECdkEBaiIFQQNxIQcCQAJAIAJBDE8NAEIAIQggACECDAELIAVB/P///wdxIQVCACEIIAAhAgNAIAIgAjUCAELh6xd+IAh8Igg+AgAgAkEEaiIGIAY1AgBC4esXfiAIQiCIfCIIPgIAIAJBCGoiBiAGNQIAQuHrF34gCEIgiHwiCD4CACACQQxqIgYgBjUCAELh6xd+IAhCIIh8Igk+AgAgCUIgiCEIIAJBEGohAiAFQXxqIgUNAAsLAkAgB0UNACAHQQJ0IQUDQCACIAI1AgBC4esXfiAIfCIJPgIAIAJBBGohAiAJQiCIIQggBUF8aiIFDQALCyAJQoCAgIAQVA0AIANBKEYNAyAAIARqIAinNgIAIANBAWohAwsgACADNgKgAQsCQCABQRBxRQ0AIABBvKLBAEECEFEaCwJAIAFBIHFFDQAgAEHEosEAQQMQURoLAkAgAUHAAHFFDQAgAEHQosEAQQUQURoLAkAgAUGAAXFFDQAgAEHkosEAQQoQURoLAkAgAUGAAnFFDQAgAEGMo8EAQRMQURoLIAAgARBlGiAADwtBACADQShByK/AABDjAQALQShBKEHIr8AAEM0BAAuqCQIGfwJ+IwBBMGsiAiQAIAEoAgAhAyABQQA2AgACQAJAAkACQAJAAkACQAJAAkACQCADQQFHDQAgAiABKAIEIgQ2AgwCQCACQQxqEMoCRQ0AIAQQkAMiBUUNBhCgAyAFQdWqBSAFQdWqBUkbIgNBDGwiAUEEEOcCIgZFDQNBACEBIAJBADYCGCACIAY2AhQgAiADNgIQQgAhCANAIAIgBCABEJ0CIgY2AhwgAkEgaiACQRxqENUBAkACQCACKAIgIgNBgICAgHhGDQAgAjUCKEIghiEJIAIoAiQhBwwBCyACQRxqIAJBL2pBgIDAABBrIQdCACEJCwJAIAZBhAhJDQAgBhCpAQsgByAIp3IhBgJAIANBgICAgHhHDQAgAEGAgICAeDYCACAAIAY2AgQgAigCFCEHAkAgAigCGCIDRQ0AIAchAQNAAkAgASgCACIGRQ0AIAFBBGooAgAgBkEBEMUCCyABQQxqIQEgA0F/aiIDDQALCyACKAIQIgFFDQogByABQQxsQQQQxQIMCgsgCSAGrYQhCAJAIAIoAhgiBiACKAIQRw0AIAJBEGoQ4AELIAIoAhQgBkEMbGoiByAINwIEIAcgAzYCACACIAZBAWo2AhggCSEIIAUgAUEBaiIBRw0ADAgLCyACQSBqIAJBDGoQfSACKAIgIQcCQAJAIAItACQiAUF+ag4CAQMACyACQQA2AhggAkKAgICAwAA3AhACQCABQQFxDQAgBxChAiEBQQAoAuy2QSEGQQAoAui2QSEDQQBCADcC6LZBIANBAUYNBQNAAkAgARCRAyIGDQAgARCiAiEDCwJAIAFBhAhJDQAgARCpAQsgBg0BIAIgAzYCHCACQSBqIAJBHGoQ1QECQAJAIAIoAiAiAUGAgICAeEYNACACNQIoQiCGIQkgAigCJCEGDAELIAJBHGogAkEvakGAgMAAEGshBkIAIQkLAkAgA0GECEkNACADEKkBCyABQYCAgIB4Rg0GIAkgBq2EIQkCQCACKAIYIgMgAigCEEcNACACQRBqEOABCyACKAIUIANBDGxqIgYgCTcCBCAGIAE2AgAgAiADQQFqNgIYIAcQoQIhAUEAKALstkEhBkEAKALotkEhA0EAQgA3Aui2QSADQQFHDQAMBgsLIAAgAikCEDcCACAAQQhqIAJBEGpBCGooAgA2AgAgB0GDCE0NCAwFCyACQQxqIAJBL2pBuJzAABBrIQEgAEGAgICAeDYCACAAIAE2AgQMBwtBuJ3AAEExEOgCAAsgAEGAgICAeDYCACAAIAc2AgQgBEGDCEsNBgwHC0EEIAEQmwIACyAAQYCAgIB4NgIAIAAgBjYCBCACKAIUIQUCQCACKAIYIgNFDQAgBSEBA0ACQCABKAIAIgZFDQAgAUEEaigCACAGQQEQxQILIAFBDGohASADQX9qIgMNAAsLAkAgAigCECIBRQ0AIAUgAUEMbEEEEMUCCyAHQYMITQ0DCyAHEKkBDAILIAJBADYCGCACQoCAgIDAADcCEAsgACACKQIQNwIAIABBCGogAkEQakEIaigCADYCAAsgBEGDCE0NAQsgBBCpAQsgAkEwaiQAC5YIAQd/IwBBIGsiAyQAQQAhBCADQQA2AhggA0KAgICAwAA3AhACQCABKAJAIgVFDQAgBUEMbCEFIAEoAjxBCGohBANAIANBCGogBEF8aigCACAEKAIAIAIQbgJAIAMoAghBAXFFDQAgAygCDCEGAkAgAygCGCIHIAMoAhBHDQAgA0EQahDhAQsgAygCFCAHQQJ0aiAGNgIAIAMgB0EBajYCGAsgBEEMaiEEIAVBdGoiBQ0ACyADKAIYIQQLAkAgBA0AIAEoAixBgICAgHhGDQAgAyABKAIwIAEoAjQgAhBuIAMoAhghBCADKAIAQQFxRQ0AIAMoAgQhBQJAIAQgAygCEEcNACADQRBqEOEBCyADKAIUIARBAnRqIAU2AgAgAyAEQQFqIgQ2AhgLAkACQAJAAkACQCAERQ0AIARBAUYNAiADKAIUIQUgBEEVSQ0BIAUgBCADQR9qEHEMAgsgAkECdCEEQQAhBSACQf////8DSw0DIARB/P///wdLDQMCQAJAIAQNAEEEIQFBACEIDAELEKADQQQhBSACIQggBEEEEOcCIgFFDQQLAkAgAkUNACACQQdxIQdBACEEAkAgAkEISQ0AIAJB+P///wNxIQZBACEEIAEhBQNAIAUgBDYCACAFQRxqIARBB2o2AgAgBUEYaiAEQQZqNgIAIAVBFGogBEEFajYCACAFQRBqIARBBGo2AgAgBUEMaiAEQQNqNgIAIAVBCGogBEECajYCACAFQQRqIARBAWo2AgAgBUEgaiEFIARBCGoiBCAGRw0ACwsgB0UNACABIARBAnRqIQUDQCAFIAQ2AgAgBUEEaiEFIARBAWohBCAHQX9qIgcNAAsLIAAgAjYCCCAAIAE2AgQgACAINgIAIAMoAhAiBEUNAiADKAIUIARBAnRBBBDFAgwCCyAFIARBARCRAQsCQCADKAIYIgJBAkkNAEEAIQUgAygCFCIGIQQDQAJAIARBBGoiBygCACAEKAIARw0AQQEgBWshBwJAQQIgBWsiASACTw0AIAIgBWoiCEF9aiEJAkAgCEEBcUUNAAJAIARBCGooAgAiASAEKAIARg0AIARBBGogATYCAEECIAVrIQcLQQMgBWshAQsgCUUNACACIAFrIQUgBiABQQJ0aiEEA0ACQCAEKAIAIgIgBiAHQQJ0aiIBQXxqKAIARg0AIAEgAjYCACAHQQFqIQcLAkAgBEEEaigCACICIAYgB0ECdGoiAUF8aigCAEYNACABIAI2AgAgB0EBaiEHCyAEQQhqIQQgBUF+aiIFDQALCyADIAc2AhgMAgsgByEEIAIgBUF/aiIFakEBRw0ACwsgACADKQIQNwIAIABBCGogA0EQakEIaigCADYCAAsgA0EgaiQADwsgBSAEEJsCAAv8CAMEfwJ+AXwjAEHQAGsiAiQAIAEoAgAhAyABQQA2AgACQCADQQFHDQAgAiABKAIEIgE2AgwCQAJAAkACQAJAAkACQCACQQxqEPIBDQAgAkE4aiABEFYgAigCPCEDAkACQAJAAkAgAigCOCIBQZWAgIB4Rg0AIAIgAikDQCIGNwMgIAIgAzYCHCACIAE2AhhBACEEAkACQAJAAkACQAJAAkACQAJAAkAgAUGAgICAeHNBFSABQQBIGyIFQX9qDgoLAAECAwQFBgcICQsgA0H//wNxuCEIDAsLIAO4IQgMCgsgBrohCAwJCyADwLchCAwICyADwbchCAwHCyADtyEIDAYLIAa5IQgMBQsgA767RAAAAAAAAPA/RAAAAAAAAPC/IANBf0obpiEIDAQLIAa/IQgMAwsgBkIgiCEHAkAgAkEYaiACQc8AakGonMAAEPYBIgFBhAhJDQAgARCpAQsgB6chASAGpyEEAkACQAJAAkACQAJAAkACQCAFQXRqDgQAAQIDBgtBASEFAkAgBkKAgICAEFQNABCgAyABQQEQ5wIiBUUNDgsgAUUNAyAFIAQgAfwKAAAMAwsCQAJAIAQNAEEBIQUMAQsQoAMgBEEBEOcCIgVFDQ4LAkAgBEUNACAFIAMgBPwKAAALIAQhAQwDCyACQSxqIAQgARBYQQEhBQJAIAIoAixBAUcNACACIAE2AkAgAiAENgI8IAJBBjoAOCACQThqIAJBzwBqQYCAwAAQxwEhBUGAgICAeCEBDAMLIAIoAjAhAwJAIAIoAjQiAUUNABCgAyABQQEQ5wIiBUUNDgsgAUUNASAFIAMgAfwKAAAMAQsgAkEsaiADIAQQWEEBIQUCQCACKAIsQQFHDQAgAiAENgJAIAIgAzYCPCACQQY6ADggAkE4aiACQc8AakGAgMAAEMcBIQVBgICAgHghAQwBCyACKAIwIQMCQCACKAI0IgFFDQAQoAMgAUEBEOcCIgVFDQ4LIAFFDQAgBSADIAH8CgAACyABIQQLIAFBgICAgHhGDQEgAiAENgIUIAIgBTYCEEEBIQQgAisDECEIDAULIAJBGGogAkHPAGpBgIDAABD2ASEFCwJAIAVBhAhJDQAgBRCpAQsQoANBPkEBEOcCIgFFDQogAUE2akEAKQDtkkA3AAAgAUEwakEAKQDnkkA3AAAgAUEoakEAKQDfkkA3AAAgAUEgakEAKQDXkkA3AAAgAUEYakEAKQDPkkA3AAAgAUEQakEAKQDHkkA3AAAgAUEIakEAKQC/kkA3AAAgAUEAKQC3kkA3AAAgAUE+EIoDIQMgAUE+QQEQxQIgAkEYahCGAQsgAEEDNgIAIAAgAzYCBAwECyADQf8BcbghCAsLIAJBGGoQhgEgACAIOQMIIAAgATYCBCAAIAQ2AgAMAQsgAEECNgIAIAFBhAhJDQAgARCpAQsgAkHQAGokAA8LQQEgARCbAgALQQEgBBCbAgALQQEgARCbAgALQQEgARCbAgALQQFBPhCbAgALQbidwABBMRDoAgAL4wcCC38DfiMAQTBrIgUkACAFIAM2AiggASgCDCEDIAUgBUEoajYCLAJAAkAgAyACaiICIANJDQACQAJAIAIgASgCBCIDIANBAWpBA3ZBB2wgA0EISRsiA0EBdk0NAAJAAkACQAJAAkAgA0EBaiIDIAIgAyACSxsiA0EPSQ0AIANB/////wFLDQJBfyADQQN0QQduQX9qZ3ZBAWohAwwBC0EEIANBCHFBCGogA0EESRshAwsgA61CGH4iEEIgiKcNASAQpyIGIANBCGoiB2oiAiAGSQ0BIAJB+P///wdLDQEQoAMgAkEIEOcCIggNAiAFQRhqIARBCCACEIgCIAUoAhwhAyAFKAIYIQQMBgsgBUEgaiAEEIwCIAUoAiQhAyAFKAIgIQQMBQsgBUEQaiAEEIwCIAUoAhQhAyAFKAIQIQQMBAsgCCAGaiEEAkAgB0UNACAEQf8BIAf8CwALIANBf2oiByADQQN2QQdsIAdBCEkbIQkgASgCACECAkACQCABKAIMIgoNAEEAIQYMAQsgBEEIaiELIAEoAgBBaGohDCACKQMAQn+FQoCBgoSIkKDAgH+DIRAgBSgCLCENQQAhAwNAAkAgEEIAUg0AA0AgA0EIaiEDIAJBCGoiAikDAEKAgYKEiJCgwIB/gyIQQoCBgoSIkKDAgH9RDQALIBBCgIGChIiQoMCAf4UhEAsCQCAEIAcgDSgCACIGKQMAIAZBCGopAwAgDEEAIBB6p0EDdiADaiIIa0EYbGoQbKciDnEiBmopAABCgIGChIiQoMCAf4MiEUIAUg0AQQghDwNAIAYgD2ohBiAPQQhqIQ8gBCAGIAdxIgZqKQAAQoCBgoSIkKDAgH+DIhFQDQALCyAQQn98IRICQCAEIBF6p0EDdiAGaiAHcSIGaiwAAEEASA0AIAQpAwBCgIGChIiQoMCAf4N6p0EDdiEGCyASIBCDIRAgBCAGaiAOQRl2Ig46AAAgCyAGQXhqIAdxaiAOOgAAIAQgBkF/c0EYbGoiBiABKAIAIAhBf3NBGGxqIggpAAA3AAAgBkEIaiAIQQhqKQAANwAAIAZBEGogCEEQaikAADcAACAKQX9qIgoNAAsgASgCACECIAEoAgwhBgsgASAENgIAIAEoAgQhAyABIAc2AgQgASAJIAZrNgIIQYGAgIB4IQQgA0UNASADIANBGGxBH2pBeHEiBmpBCWoiA0UNASACIAZrIANBCBDFAgwBCyABIAVBLGpBC0EYEFNBgYCAgHghBAsMAQsgBUEIaiAEEIwCIAUoAgwhAyAFKAIIIQQLIAAgAzYCBCAAIAQ2AgAgBUEwaiQAC8AHAgd/AX4jAEEgayIIJAAgAygCECEJIAMrAwggB6MQxQH8AiEKIAMrAwAgB6MQxQH8AiELAkACQAJAAkACQAJAIAlBgICAgHhGDQAgAygCGCEMIAMoAhQhDQJAAkACQCAGRQ0AIAZBDGwhDiAFQQRqIQlBACEGA0ACQCAJQQRqKAIAIAxHDQAgCSgCACANIAwQ1AFFDQMLIAlBDGohCSAGQQFqIQYgDkF0aiIODQALCyAIIA0gDCAEEG4gCCgCBCEGIAgoAgAhCQwBC0EBIQkLIAlBAXENAQsgCEEUaiABIAIgAyAEIAcQOCAIKAIcRQ0BIAAgCCkCFDcCACAAQQhqIAhBFGpBCGooAgA2AgAMAgsgCEEIaiABIAIgAyAEIAcQOCAIKAIMIQQgCCgCCCECAkAgCCgCECIJRQ0AIAQgCUEMbGohDSAIQRZqIQMgBCEJIAQhDgNAIAlBCGotAAAhDCAJKQIAIQ8gAyAJQQtqLQAAOgAAIAggCUEJai8AADsBFAJAIAYgDEcNACAOIAw6AAggDiAPNwIAIA4gCC8BFDsACSAOQQtqIAMtAAA6AAAgDkEMaiEOCyAJQQxqIgkgDUcNAAsgDiAERg0AIAAgBDYCBCAAIAI2AgAgACAOIARrQQxuNgIIDAILEKADQQxBBBDnAiIJRQ0CIAkgBjoACCAJIAo2AgQgCSALNgIAIABBATYCCCAAIAk2AgQgAEEBNgIAIAJFDQEgBCACQQxsQQQQxQIMAQsCQAJAIAQNAEEAIQlBBCECDAELEKADIARBDGwiCUEEEOcCIgJFDQNBAyEGIARBA3EhDEEAIQ4CQCAEQQRJDQAgBEH8AXEhAyACIQkDQCAJIAs2AgAgCUEsaiAGOgAAIAlBKGogCjYCACAJQSRqIAs2AgAgCUEcaiAKNgIAIAlBGGogCzYCACAJQRBqIAo2AgAgCUEMaiALNgIAIAlBCGogBkF9aiIOOgAAIAlBBGogCjYCACAJQSBqIA5BAmo6AAAgCUEUaiAOQQFqOgAAIAlBMGohCSAGQQFqIQ4gBkEEaiINIQYgDiADRw0ACyANQX1qIQ4LAkAgDEUNACACIA5BDGxqIQkDQCAJIAs2AgAgCUEIaiAOOgAAIAlBBGogCjYCACAJQQxqIQkgDkEBaiEOIAxBf2oiDA0ACwsgBCEJCyAAIAQ2AgggACACNgIEIAAgCTYCACAIKAIUIglFDQAgCCgCGCAJQQxsQQQQxQILIAhBIGokAA8LQQRBDBDzAgALQQQgCRCbAgAL0gcCC38DfiMAQTBrIgUkACAFIAM2AiggASgCDCEDIAUgBUEoajYCLAJAAkACQAJAAkACQAJAIAMgAmoiAiADSQ0AAkAgAiABKAIEIgMgA0EBakEDdkEHbCADQQhJGyIDQQF2TQ0AIANBAWoiAyACIAMgAksbIgNBD0kNAgJAIANB/////wFLDQBBfyADQQN0QQduQX9qZ3YiA0H+////AEsNBSADQQFqIQMMBAsgBUEgaiAEEIwCIAUoAiQhAyAFKAIgIQQMBwsgASAFQSxqQQRBEBBTQYGAgIB4IQQMBQsgBUEIaiAEEIwCIAUoAgwhAyAFKAIIIQQMBQtBBCADQQhxQQhqIANBBEkbIQMLIANBCGoiAiADQQR0IgZqIgcgAkkNACAHQfj///8HSw0AEKADIAdBCBDnAiIIDQEgBUEYaiAEQQggBxCIAiAFKAIcIQMgBSgCGCEEDAMLIAVBEGogBBCMAiAFKAIUIQMgBSgCECEEDAILIAggBmohBAJAIAJFDQAgBEH/ASAC/AsACyADQX9qIgYgA0EDdkEHbCAGQQhJGyEJIAEoAgAhAgJAAkAgASgCDCIIDQBBACEHDAELIARBCGohCiABKAIAIgtBcGohDCACKQMAQn+FQoCBgoSIkKDAgH+DIRBBACEDA0ACQCAQQgBSDQADQCADQQhqIQMgAkEIaiICKQMAQoCBgoSIkKDAgH+DIhBCgIGChIiQoMCAf1ENAAsgEEKAgYKEiJCgwIB/hSEQCwJAIAQgDCAQeqdBA3YgA2oiDUEEdGspAwAiEadB3cvdnnlsIBFCIIinakHdy92eeWxBD3ciDiAGcSIHaikAAEKAgYKEiJCgwIB/gyIRQgBSDQBBCCEPA0AgByAPaiEHIA9BCGohDyAEIAcgBnEiB2opAABCgIGChIiQoMCAf4MiEVANAAsLIBBCf3whEgJAIAQgEXqnQQN2IAdqIAZxIgdqLAAAQQBIDQAgBCkDAEKAgYKEiJCgwIB/g3qnQQN2IQcLIBIgEIMhECAEIAdqIA5BGXYiDjoAACAKIAdBeGogBnFqIA46AAAgBCAHQX9zQQR0aiIHQQhqIAsgDUF/c0EEdGoiDUEIaikAADcAACAHIA0pAAA3AAAgCEF/aiIIDQALIAEoAgAhAiABKAIMIQcLIAEgBDYCACABKAIEIQMgASAGNgIEIAEgCSAHazYCCEGBgICAeCEEIANFDQAgAyADQQR0QRdqQXBxIgdqQQlqIgNFDQAgAiAHayADQQgQxQILCyAAIAM2AgQgACAENgIAIAVBMGokAAvSBwILfwN+IwBBMGsiBSQAIAUgAzYCKCABKAIMIQMgBSAFQShqNgIsAkACQAJAAkACQAJAAkAgAyACaiICIANJDQACQCACIAEoAgQiAyADQQFqQQN2QQdsIANBCEkbIgNBAXZNDQAgA0EBaiIDIAIgAyACSxsiA0EPSQ0CAkAgA0H/////AUsNAEF/IANBA3RBB25Bf2pndiIDQf7///8ASw0FIANBAWohAwwECyAFQSBqIAQQjAIgBSgCJCEDIAUoAiAhBAwHCyABIAVBLGpBCkEQEFNBgYCAgHghBAwFCyAFQQhqIAQQjAIgBSgCDCEDIAUoAgghBAwFC0EEIANBCHFBCGogA0EESRshAwsgA0EIaiICIANBBHQiBmoiByACSQ0AIAdB+P///wdLDQAQoAMgB0EIEOcCIggNASAFQRhqIARBCCAHEIgCIAUoAhwhAyAFKAIYIQQMAwsgBUEQaiAEEIwCIAUoAhQhAyAFKAIQIQQMAgsgCCAGaiEEAkAgAkUNACAEQf8BIAL8CwALIANBf2oiBiADQQN2QQdsIAZBCEkbIQkgASgCACECAkACQCABKAIMIggNAEEAIQcMAQsgBEEIaiEKIAEoAgAiC0FwaiEMIAIpAwBCf4VCgIGChIiQoMCAf4MhEEEAIQMDQAJAIBBCAFINAANAIANBCGohAyACQQhqIgIpAwBCgIGChIiQoMCAf4MiEEKAgYKEiJCgwIB/UQ0ACyAQQoCBgoSIkKDAgH+FIRALAkAgBCAMIBB6p0EDdiADaiINQQR0aykDACIRp0Hdy92eeWwgEUIgiKdqQd3L3Z55bEEPdyIOIAZxIgdqKQAAQoCBgoSIkKDAgH+DIhFCAFINAEEIIQ8DQCAHIA9qIQcgD0EIaiEPIAQgByAGcSIHaikAAEKAgYKEiJCgwIB/gyIRUA0ACwsgEEJ/fCESAkAgBCAReqdBA3YgB2ogBnEiB2osAABBAEgNACAEKQMAQoCBgoSIkKDAgH+DeqdBA3YhBwsgEiAQgyEQIAQgB2ogDkEZdiIOOgAAIAogB0F4aiAGcWogDjoAACAEIAdBf3NBBHRqIgdBCGogCyANQX9zQQR0aiINQQhqKQAANwAAIAcgDSkAADcAACAIQX9qIggNAAsgASgCACECIAEoAgwhBwsgASAENgIAIAEoAgQhAyABIAY2AgQgASAJIAdrNgIIQYGAgIB4IQQgA0UNACADIANBBHRBF2pBcHEiB2pBCWoiA0UNACACIAdrIANBCBDFAgsLIAAgAzYCBCAAIAQ2AgAgBUEwaiQAC9IHAgt/A34jAEEwayIFJAAgBSADNgIoIAEoAgwhAyAFIAVBKGo2AiwCQAJAAkACQAJAAkACQCADIAJqIgIgA0kNAAJAIAIgASgCBCIDIANBAWpBA3ZBB2wgA0EISRsiA0EBdk0NACADQQFqIgMgAiADIAJLGyIDQQ9JDQICQCADQf////8BSw0AQX8gA0EDdEEHbkF/amd2IgNB/v///wBLDQUgA0EBaiEDDAQLIAVBIGogBBCMAiAFKAIkIQMgBSgCICEEDAcLIAEgBUEsakEMQRAQU0GBgICAeCEEDAULIAVBCGogBBCMAiAFKAIMIQMgBSgCCCEEDAULQQQgA0EIcUEIaiADQQRJGyEDCyADQQhqIgIgA0EEdCIGaiIHIAJJDQAgB0H4////B0sNABCgAyAHQQgQ5wIiCA0BIAVBGGogBEEIIAcQiAIgBSgCHCEDIAUoAhghBAwDCyAFQRBqIAQQjAIgBSgCFCEDIAUoAhAhBAwCCyAIIAZqIQQCQCACRQ0AIARB/wEgAvwLAAsgA0F/aiIGIANBA3ZBB2wgBkEISRshCSABKAIAIQICQAJAIAEoAgwiCA0AQQAhBwwBCyAEQQhqIQogASgCACILQXBqIQwgAikDAEJ/hUKAgYKEiJCgwIB/gyEQQQAhAwNAAkAgEEIAUg0AA0AgA0EIaiEDIAJBCGoiAikDAEKAgYKEiJCgwIB/gyIQQoCBgoSIkKDAgH9RDQALIBBCgIGChIiQoMCAf4UhEAsCQCAEIAwgEHqnQQN2IANqIg1BBHRrKQMAIhGnQd3L3Z55bCARQiCIp2pB3cvdnnlsQQ93Ig4gBnEiB2opAABCgIGChIiQoMCAf4MiEUIAUg0AQQghDwNAIAcgD2ohByAPQQhqIQ8gBCAHIAZxIgdqKQAAQoCBgoSIkKDAgH+DIhFQDQALCyAQQn98IRICQCAEIBF6p0EDdiAHaiAGcSIHaiwAAEEASA0AIAQpAwBCgIGChIiQoMCAf4N6p0EDdiEHCyASIBCDIRAgBCAHaiAOQRl2Ig46AAAgCiAHQXhqIAZxaiAOOgAAIAQgB0F/c0EEdGoiB0EIaiALIA1Bf3NBBHRqIg1BCGopAAA3AAAgByANKQAANwAAIAhBf2oiCA0ACyABKAIAIQIgASgCDCEHCyABIAQ2AgAgASgCBCEDIAEgBjYCBCABIAkgB2s2AghBgYCAgHghBCADRQ0AIAMgA0EEdEEXakFwcSIHakEJaiIDRQ0AIAIgB2sgA0EIEMUCCwsgACADNgIEIAAgBDYCACAFQTBqJAAL8QYBCH8CQAJAIAEgAEEDakF8cSICIABrIgNJDQAgASADayIEQQRJDQAgBEEDcSEFQQAhBkEAIQECQCACIABGDQBBACEHQQAhAQJAIAAgAmsiCEF8Sw0AQQAhB0EAIQEDQCABIAAgB2oiAiwAAEG/f0pqIAJBAWosAABBv39KaiACQQJqLAAAQb9/SmogAkEDaiwAAEG/f0pqIQEgB0EEaiIHDQALCyAAIAdqIQIDQCABIAIsAABBv39KaiEBIAJBAWohAiAIQQFqIggNAAsLIAAgA2ohCAJAIAVFDQAgCCAEQfz///8HcWoiAiwAAEG/f0ohBiAFQQFGDQAgBiACLAABQb9/SmohBiAFQQJGDQAgBiACLAACQb9/SmohBgsgBEECdiEDIAYgAWohBwNAIAghBiADRQ0CIANBwAEgA0HAAUkbIgRBA3EhBQJAAkAgBEECdCIJQfAHcSIIDQBBACECDAELQQAhAiAGIQEDQCABQQxqKAIAIgBBf3NBB3YgAEEGdnJBgYKECHEgAUEIaigCACIAQX9zQQd2IABBBnZyQYGChAhxIAFBBGooAgAiAEF/c0EHdiAAQQZ2ckGBgoQIcSABKAIAIgBBf3NBB3YgAEEGdnJBgYKECHEgAmpqamohAiABQRBqIQEgCEFwaiIIDQALCyADIARrIQMgBiAJaiEIIAJBCHZB/4H8B3EgAkH/gfwHcWpBgYAEbEEQdiAHaiEHIAVFDQALIAYgBEH8AXFBAnRqIgIoAgAiAUF/c0EHdiABQQZ2ckGBgoQIcSEBAkAgBUEBRg0AIAIoAgQiCEF/c0EHdiAIQQZ2ckGBgoQIcSABaiEBIAVBAkYNACACKAIIIgJBf3NBB3YgAkEGdnJBgYKECHEgAWohAQsgAUEIdkH/gRxxIAFB/4H8B3FqQYGABGxBEHYgB2ohBwwBCwJAIAENAEEADwsgAUEDcSEIAkACQCABQQRPDQBBACECQQAhBwwBCyABQXxxIQNBACECQQAhBwNAIAcgACACaiIBLAAAQb9/SmogAUEBaiwAAEG/f0pqIAFBAmosAABBv39KaiABQQNqLAAAQb9/SmohByADIAJBBGoiAkcNAAsLIAhFDQAgACACaiEBA0AgByABLAAAQb9/SmohByABQQFqIQEgCEF/aiIIDQALCyAHC74HAgt/A34jAEEwayIFJAAgBSADNgIoIAEoAgwhAyAFIAVBKGo2AiwCQAJAAkACQAJAAkACQCADIAJqIgIgA0kNAAJAIAIgASgCBCIDIANBAWpBA3ZBB2wgA0EISRsiA0EBdk0NACADQQFqIgMgAiADIAJLGyIDQQ9JDQICQCADQf////8BSw0AQX8gA0EDdEEHbkF/amd2IgNB/v///wFLDQUgA0EBaiEDDAQLIAVBIGogBBCMAiAFKAIkIQMgBSgCICEEDAcLIAEgBUEsakEJQQgQU0GBgICAeCEEDAULIAVBCGogBBCMAiAFKAIMIQMgBSgCCCEEDAULQQQgA0EIcUEIaiADQQRJGyEDCyADQQhqIgIgA0EDdCIGaiIHIAJJDQAgB0H4////B0sNABCgAyAHQQgQ5wIiCA0BIAVBGGogBEEIIAcQiAIgBSgCHCEDIAUoAhghBAwDCyAFQRBqIAQQjAIgBSgCFCEDIAUoAhAhBAwCCyAIIAZqIQQCQCACRQ0AIARB/wEgAvwLAAsgA0F/aiIGIANBA3ZBB2wgBkEISRshCSABKAIAIQICQAJAIAEoAgwiCA0AQQAhBwwBCyAEQQhqIQogASgCACILQXhqIQwgAikDAEJ/hUKAgYKEiJCgwIB/gyEQQQAhAwNAAkAgEEIAUg0AA0AgA0EIaiEDIAJBCGoiAikDAEKAgYKEiJCgwIB/gyIQQoCBgoSIkKDAgH9RDQALIBBCgIGChIiQoMCAf4UhEAsCQCAEIAwgEHqnQQN2IANqIg1BA3RrKQMAIhGnQd3L3Z55bCARQiCIp2pB3cvdnnlsQQ93Ig4gBnEiB2opAABCgIGChIiQoMCAf4MiEUIAUg0AQQghDwNAIAcgD2ohByAPQQhqIQ8gBCAHIAZxIgdqKQAAQoCBgoSIkKDAgH+DIhFQDQALCyAQQn98IRICQCAEIBF6p0EDdiAHaiAGcSIHaiwAAEEASA0AIAQpAwBCgIGChIiQoMCAf4N6p0EDdiEHCyASIBCDIRAgBCAHaiAOQRl2Ig46AAAgCiAHQXhqIAZxaiAOOgAAIAQgB0F/c0EDdGogCyANQX9zQQN0aikAADcDACAIQX9qIggNAAsgASgCACECIAEoAgwhBwsgASAENgIAIAEoAgQhAyABIAY2AgQgASAJIAdrNgIIQYGAgIB4IQQgA0UNACADIANBA3RBD2pBeHEiB2pBCWoiA0UNACACIAdrIANBCBDFAgsLIAAgAzYCBCAAIAQ2AgAgBUEwaiQAC4oHAQ9/IwBBEGsiAyQAQQEhBAJAIAIoAgAiBUEiIAIoAgQiBigCECIHEQgADQACQAJAIAENAEEAIQhBACECDAELQQAhCUEAIAFrIQpBACEIIAEhCyAAIQwCQANAIAwgC2ohDUEAIQICQANAIAwgAmoiDi0AACIPQYF/akH/AXFBoQFJDQEgD0EiRg0BIA9B3ABGDQEgCyACQQFqIgJHDQALIAggC2ohCAwCCyAOQQFqIQwgCCACaiELAkACQAJAAkAgDiwAACIPQX9MDQAgD0H/AXEhDwwBCyAMLQAAQT9xIRAgD0EfcSERIA5BAmohDAJAIA9BX0sNACARQQZ0IBByIQ8MAQsgEEEGdCAMLQAAQT9xciEQIA5BA2ohDAJAIA9BcE8NACAQIBFBDHRyIQ8MAQsgDC0AACEPIA5BBGohDCAQQQZ0IA9BP3FyIBFBEnRBgIDwAHFyIg9BgIDEAEcNACALIQgMAQsgAyAPQYGABBBaAkAgAy0ADSIOIAMtAAwiEGsiEUH/AXFBAUYNAAJAAkAgCSALSw0AAkAgCUUNAAJAIAkgAUkNACAJIAFGDQEMAgsgACAJaiwAAEFASA0BCyALRQ0BAkAgCyABSQ0AIAsgCmoNAQwCCyAAIAhqIAJqLAAAQb9/Sg0BCyAAIAEgCSAIIAJqQZiswAAQsgIACyAFIAAgCWogCCAJayACaiAGKAIMIgsRCwANAgJAAkAgDkGBAUkNACAFIAMoAgAgBxEIAA0EDAELIAUgAyAQaiARIAsRCwANAwsCQAJAIA9BgAFPDQBBASEODAELAkAgD0GAEE8NAEECIQ4MAQtBA0EEIA9BgIAESRshDgsgDiAIaiACaiEJCwJAAkAgD0GAAU8NAEEBIQ8MAQsCQCAPQYAQTw0AQQIhDwwBC0EDQQQgD0GAgARJGyEPCyAPIAhqIAJqIQgLIA0gDGsiCw0BDAILC0EBIQQMAgsCQCAJIAhLDQBBACECAkAgCUUNAAJAIAkgAUkNACAJIQIgCSABRg0BDAILIAkhAiAAIAlqLAAAQUBIDQELAkAgCA0AQQAhCAwCCwJAIAggAUkNACAIIAFGDQIgAiEJDAELIAAgCGosAABBv39KDQEgAiEJCyAAIAEgCSAIQaiswAAQsgIACyAFIAAgAmogCCACayAGKAIMEQsADQAgBUEiIAcRCAAhBAsgA0EQaiQAIAQL9AYCA38BfiMAQdAAayIFJAAgBSADNgIEIAUgAjYCAAJAAkACQAJAIAFBgQJJDQBB/QEhBgNAAkACQCAAIAZqIgdBA2osAABBv39KDQAgB0ECaiwAAEG/f0wNASAGQQJqIQYMBQsgBkEDaiEGDAQLIAdBAWosAABBv39KDQIgBywAAEG/f0oNAyAGQXxqIgZBfUcNAAtBACEGDAILIAUgATYCDCAFIAA2AghBACEHQQEhBgwCCyAGQQFqIQYLIAUgADYCCCAFIAY2AgxBBUEAIAYgAUkiBhshB0HopcEAQQEgBhshBgsgBSAHNgIUIAUgBjYCEAJAAkAgAiABSw0AIAMgAU0NASADIQILIAUgAjYCICAFQd4ArUIghiIIIAVBEGqthDcDOCAFIAggBUEIaq2ENwMwIAVBBq1CIIYgBUEgaq2ENwMoQcSAwAAgBUEoaiAEEOQBAAsCQAJAAkACQAJAIAIgA0sNAAJAAkAgAkUNACACIAFPDQAgACACaiwAAEFASA0BCyADIQILIAUgAjYCGCACIAFPDQJBACEHIAJFDQEDQAJAIAAgAmosAABBv39MDQAgAiEHDAMLIAJBf2oiAg0ADAILCyAFQd4ArUIghiIIIAVBEGqthDcDQCAFIAggBUEIaq2ENwM4IAVBBq1CIIYiCCAFQQRqrYQ3AzAgBSAIIAWthDcDKEGYgMAAIAVBKGogBBDkAQALIAcgAUYNAAJAAkAgACAHaiIALAAAIgZBf0oNACAALQABQT9xIQIgBkEfcSEBIAZBX0sNASABQQZ0IAJyIQYMAwsgBSAGQf8BcTYCHEEBIQYMAwsgAkEGdCAALQACQT9xciECAkAgBkFwTw0AIAIgAUEMdHIhBgwCCyACQQZ0IAAtAANBP3FyIAFBEnRBgIDwAHFyIgZBgIDEAEcNAQsgBBDZAgALIAUgBjYCHAJAIAZBgAFPDQBBASEGDAELAkAgBkGAEE8NAEECIQYMAQtBA0EEIAZBgIAESRshBgsgBSAHNgIgIAUgBiAHajYCJCAFQd4ArUIghiIIIAVBEGqthDcDSCAFIAggBUEIaq2ENwNAIAVB3wCtQiCGIAVBIGqthDcDOCAFQeAArUIghiAFQRxqrYQ3AzAgBUEGrUIghiAFQRhqrYQ3AyhB7YDAACAFQShqIAQQ5AEAC4EIAgd/BX4jAEHwCGsiBCQAIAG9IgtC/////////weDIgxCgICAgICAgAiEIAtCAYZC/v///////w+DIAtCNIinQf8PcSIFGyINQgGDIQ5BAiEGAkACQAJAAkACQCAMUCIHQQJBAyAHG0EEIAtCgICAgICAgPj/AIMiDFAbIAxCgICAgICAgPj/AFEbDgUEAAECAwQLQQMhBgwDC0EEIQYMAgsgBUHNd2ohCCAOp0EBcyEGQgEhDwwBC0KAgICAgICAICANQgGGIA1CgICAgICAgAhRIggbIQ1CAkIBIAgbIQ8gDqdBAXMhBkHLd0HMdyAIGyAFaiEICyADQf//A3EhBSAEIAg7AegIIAQgDzcD4AggBEIBNwPYCCAEIA03A9AIIAQgBjoA6ggCQAJAAkAgBkH/AXEiB0EBSw0AQXRBBSAIwSIGQQBIGyAGbCIGQcD9AEkNAUG8kMEAQSVB5JDBABCfAgALAkACQAJAIAdBAkYNAEEBIQhBia7AAEGdrsAAIAtCAFMiBxtBia7AAEEBIAcbIAIbIQdBASALQj+IpyACGyECIAZB/wFxQQRHDQFBAiEIIARBAjsBkAggA0H//wNxDQJBASEIIARBATYCmAggBEGKrsAANgKUCCAEQZAIaiEGDAQLIARBAzYCmAggBEG/j8EANgKUCCAEQQI7AZAIQQEhByAEQZAIaiEGQQAhAkEBIQgMAwsgBEEDNgKYCCAEQcKPwQA2ApQIIARBAjsBkAggBEGQCGohBgwCCyAEIAU2AqAIIARBADsBnAggBEECNgKYCCAEQcWPwQA2ApQIIARBkAhqIQYMAQtBia7AAEEBIAtCAFMiCBshB0GJrsAAQZ2uwAAgCBshCCALQj+IpyEJIARBkAhqIARB0AhqIARBEGogBkEEdkEVaiIKQQAgA2tBgIB+IAPBQX9KGyIGEE8gBsEhBgJAAkAgBCgCkAhFDQAgBEHACGpBCGogBEGQCGpBCGooAgA2AgAgBCAEKQKQCDcDwAgMAQsgBEHACGogBEHQCGogBEEQaiAKIAYQMQsgCCAHIAIbIQdBASAJIAIbIQICQCAELgHICCIIIAZMDQAgBEEIaiAEKALACCAEKALECCAIIAUgBEGQCGpBBBB5IAQoAgwhCCAEKAIIIQYMAQtBAiEIIARBAjsBkAgCQCADQf//A3ENAEEBIQggBEEBNgKYCCAEQYquwAA2ApQIIARBkAhqIQYMAQsgBCAFNgKgCCAEQQA7AZwIIARBAjYCmAggBEHFj8EANgKUCCAEQZAIaiEGCyAEIAg2AswIIAQgBjYCyAggBCACNgLECCAEIAc2AsAIIAAgBEHACGoQYSEGIARB8AhqJAAgBgv6BgEGfwJAAkACQAJAAkACQAJAAkAgAEF8aiIEKAIAIgVBeHEiBkEEQQggBUEDcSIHGyABakkNACABQSdqIQgCQCAHRQ0AIAYgCEsNAgsCQAJAIAJBCUkNACACIAMQdCICDQFBAA8LQQAhAiADQcz/e0sNCEEQIANBC2pBeHEgA0ELSRshASAAQXhqIQgCQAJAAkACQAJAIAdFDQAgCCAGaiEHIAYgAU8NAyAHQQAoArC6QUYNBCAHQQAoAqy6QUYNAiAHKAIEIgVBAnENCyAFQXhxIgkgBmoiBSABSQ0LIAcgCRB2IAUgAWsiB0EQSQ0BIAQgASAEKAIAQQFxckECcjYCACAIIAFqIgEgB0EDcjYCBCAIIAVqIgUgBSgCBEEBcjYCBCABIAcQbQwKCyABQYACSQ0KIAhFDQogBiABTQ0KIAYgAWtBgIAISw0KIAAPCyAEIAUgBCgCAEEBcXJBAnI2AgAgCCAFaiIBIAEoAgRBAXI2AgQMCAtBACgCpLpBIAZqIgcgAUkNCAJAAkAgByABayIGQQ9LDQAgBCAFQQFxIAdyQQJyNgIAIAggB2oiASABKAIEQQFyNgIEQQAhBkEAIQEMAQsgBCABIAVBAXFyQQJyNgIAIAggAWoiASAGQQFyNgIEIAggB2oiByAGNgIAIAcgBygCBEF+cTYCBAtBACABNgKsukFBACAGNgKkukEMBwsgBiABayIGQQ9NDQYgBCABIAVBAXFyQQJyNgIAIAggAWoiASAGQQNyNgIEIAcgBygCBEEBcjYCBCABIAYQbQwGC0EAKAKoukEgBmoiByABSw0EDAYLAkAgAyABIAMgAUkbIgNFDQAgAiAAIAP8CgAACyAEKAIAIgNBeHEiB0EEQQggA0EDcSIDGyABakkNAiADRQ0GIAcgCE0NBkHgo8AAQS5BkKTAABCfAgALQaCjwABBLkHQo8AAEJ8CAAtB4KPAAEEuQZCkwAAQnwIAC0Ggo8AAQS5B0KPAABCfAgALIAQgASAFQQFxckECcjYCACAIIAFqIgUgByABayIBQQFyNgIEQQAgATYCqLpBQQAgBTYCsLpBCyAIRQ0AIAAPCyADEDIiAUUNAQJAIANBfEF4IAQoAgAiAkEDcRsgAkF4cWoiAiADIAJJGyIDRQ0AIAEgACAD/AoAAAsgASECCyAAEFcLIAIL0wcCCH8BfiMAQSBrIgIkACACIAE2AgACQAJAAkACQCACEMoCRQ0AAkACQAJAIAEQkAMiAw0AIAJBADYCDCACQoCAgICAATcCBAwBCxCgA0EIIQQgA0GAgAQgA0GAgARJGyIFQQR0IgZBCBDnAiIHRQ0BQQAhBiACQQA2AgwgAiAHNgIIIAIgBTYCBANAIAJBEGogASAGEJ0CEFYgAigCFCEIAkAgAigCECIJQZWAgIB4Rw0AIABBlYCAgHg2AgAgACAINgIEIAIoAgghBQJAIAZFDQAgBSEEA0AgBBCGASAEQRBqIQQgBkF/aiIGDQALCyACKAIEIgZFDQUgBSAGQQR0QQgQxQIMBQsgAikDGCEKAkAgBiACKAIERw0AIAJBBGoQswEgAigCCCEHCyAHIARqIgUgCjcCACAFQXxqIAg2AgAgBUF4aiAJNgIAIAIgBkEBaiIGNgIMIARBEGohBCADIAZHDQALCyAAIAIpAgQ3AgQgAEGUgICAeDYCACAAQQxqIAJBDGooAgA2AgAMAgtBCCAGEJsCAAsgAkEQaiACEH0gAigCECEFAkACQAJAIAItABQiBEF+ag4CAQACCyAAQZWAgIB4NgIAIAAgBTYCBCABQYMITQ0EDAMLIAIgAkEQakGYnMAAEGshBiAAQZWAgIB4NgIAIAAgBjYCBAwBC0EAIQYgAkEANgIMIAJCgICAgIABNwIEAkACQCAEQQFxDQAgBRChAiEEQQAoAuy2QSEIQQAoAui2QSEJQQBCADcC6LZBIAlBAUYNAUEIIQlBACEGQQghBwNAAkAgBBCRAyIDDQAgBBCiAiEICwJAIARBhAhJDQAgBBCpAQsgAw0BIAJBEGogCBBWIAIoAhQhCCACKAIQIgNBlYCAgHhGDQIgAikDGCEKAkAgBiACKAIERw0AIAJBBGoQswEgAigCCCEHCyAHIAlqIgQgCjcCACAEQXxqIAg2AgAgBEF4aiADNgIAIAIgBkEBaiIGNgIMIAUQoQIhBEEAKALstkEhCEEAKALotkEhA0EAQgA3Aui2QSAJQRBqIQkgA0EBRw0ADAILCyAAIAIpAgQ3AgQgAEGUgICAeDYCACAAQQxqIAJBDGooAgA2AgAgBUGECEkNASAFEKkBDAELIABBlYCAgHg2AgAgACAINgIEIAIoAgghCAJAIAZFDQAgCCEEA0AgBBCGASAEQRBqIQQgBkF/aiIGDQALCwJAIAIoAgQiBkUNACAIIAZBBHRBCBDFAgsgBUGECEkNACAFEKkBCyABQYMITQ0BCyABEKkBCyACQSBqJAAL6gYCCX8GfiMAQRBrIgUkAAJAAkACQAJAAkACQAJAIAEpAwAiDkIAUQ0AIA5CgICAgICAgIAgWg0BIANFDQNBoH8gAS8BGCAOeSIPp2siBmvBQdAAbEGwpwVqQc4QbSIBQdEATw0CIAUgAUEEdCIBKQP4kEFCACAOIA+GQgAQpgEgBSkDAEI/iCAFKQMIfCIOQUAgBiABLwGAkUFqayIHQT9xrSIQiKchCCABLwGCkUEhAUIBIBCGIhFCf3wiEiAOgyIPUEUNBSADQQtPDQQgA0ECdEGQosEAaigCACAITQ0FDAQLQcibwQBBHEHkm8EAEJ8CAAtB9JvBAEEkQZicwQAQnwIACyABQdEAQYibwQAQzQEAC0GIkMEAQSFB2JzBABCfAgALIABBADYCAAwBCwJAAkACQCAIQZDOAEkNACAIQcCEPUkNAQJAIAhBgMLXL0kNAEEIQQkgCEGAlOvcA0kiBhshCUGAwtcvQYCU69wDIAYbIQYMAwtBBkEHIAhBgK3iBEkiBhshCUHAhD1BgK3iBCAGGyEGDAILAkAgCEHkAEkNAEECQQMgCEHoB0kiBhshCUHkAEHoByAGGyEGDAILQQpBASAIQQlLIgkbIQYMAQtBBEEFIAhBoI0GSSIGGyEJQZDOAEGgjQYgBhshBgsCQAJAAkACQAJAIAkgAWtBAWrBIgogBMEiAUwNACAHQf//A3EhCyAKIARrwSADIAogAWsgA0kbIgxBf2ohDUEAIQEDQCAIIAZuIQcgAyABRg0DIAggByAGbGshCCACIAFqIAdBMGo6AAAgDSABRg0EIAkgAUYNAiABQQFqIQEgBkEKSSEHIAZBCm4hBiAHRQ0AC0GonMEAENgCAAsgACACIANBACAKIAQgDkIKgCAGrSAQhiAREHUMBAsgAUEBaiEBIAtBf2pBP3GtIRNCASEOA0ACQCAOIBOIUA0AIABBADYCAAwFCyABIANPDQMgAiABaiAPQgp+Ig8gEIinQTBqOgAAIA5CCn4hDiAPIBKDIQ8gDCABQQFqIgFHDQALIAAgAiADIAwgCiAEIA8gESAOEHUMAwsgAyADQbicwQAQzQEACyAAIAIgAyAMIAogBCAIrSAQhiAPfCAGrSAQhiAREHUMAQsgASADQcicwQAQzQEACyAFQRBqJAAL0QYCCH8EfkEBIQQCQCADIAAoAowBTw0AQQAhBQJAIAAoAiAiBkUNACAAKAIcIgcgBkEEdGohBgNAAkAgASAHKAIASA0AIAEgB0EIaigCAEoNACACIAdBBGooAgBIDQAgAiAHQQxqKAIASg0AQQEhBQwCCyAHQRBqIgcgBkcNAAsLAkACQAJAAkAgAyAAKAIIIgdPDQAgAa1CIIYgAq2EIQwgACgCBCADQQR0aiIHKAIMRQ0BIAcoAgAiCEFwaiEJIAcoAgQiCiACQd3L3Z55bCABakHdy92eeWxBD3ciBnEhByAGQRl2rUKBgoSIkKDAgAF+IQ1BACELA0ACQCAIIAdqKQAAIg4gDYUiD0J/hSAPQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIg9QDQADQCAMIAkgD3qnQQN2IAdqIApxQQR0aykDAFENBSAPQn98IA+DIg9QRQ0ACwsgDiAOQgGGg0KAgYKEiJCgwIB/g1BFDQIgByALQQhqIgtqIApxIQcMAAsLIAMgB0Ggj8AAEM0BAAsgBUUNASAAKAJoRQ0CIAAoAlwiBkF4aiEDIAAoAmAiACACQd3L3Z55bCABakHdy92eeWxBD3ciAXEhByABQRl2rUKBgoSIkKDAgAF+IQ9BACEBA0ACQCAGIAdqKQAAIg4gD4UiDUJ/hSANQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIg1QDQADQCAMIAMgDXqnQQN2IAdqIABxQQN0aykDAFENBCANQn98IA2DIg1QRQ0ACwsgDiAOQgGGg0KAgYKEiJCgwIB/g1BFDQMgByABQQhqIgFqIABxIQcMAAsLAkAgAyAAKAIsIgdJDQAgAyAHQbCPwAAQzQEACyAAKAIoIANBBHRqIgcoAgxFDQEgBygCACIBQXhqIQAgBygCBCICIAZxIQdBACEGA0ACQCABIAdqKQAAIg4gDYUiD0J/hSAPQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIg9QDQADQCAMIAAgD3qnQQN2IAdqIAJxQQN0aykDAFENAyAPQn98IA+DIg9QRQ0ACwsgDiAOQgGGg0KAgYKEiJCgwIB/g1BFDQIgByAGQQhqIgZqIAJxIQcMAAsLQQAhBAsgBAupBgIMfwN+IwBBoAFrIgMkAAJAQaABRQ0AIANBAEGgAfwLAAsCQAJAAkACQCAAKAKgASIEIAJJDQAgBEEpTw0BIAEgAkECdGohBQJAAkACQCAERQ0AIARBAWohBiAEQQJ0IQJBACEHQQAhCANAIAMgB0ECdGohCQNAIAchCiAJIQsgASAFRg0IIAtBBGohCSAKQQFqIQcgASgCACEMIAFBBGoiDSEBIAxFDQALIAytIQ9CACEQIAIhDCAKIQEgACEJA0AgAUEoTw0EIAsgECALNQIAfCAJNQIAIA9+fCIRPgIAIBFCIIghECALQQRqIQsgAUEBaiEBIAlBBGohCSAMQXxqIgwNAAsgBCELAkAgEUKAgICAEFQNACAKIARqIgtBKE8NAyADIAtBAnRqIBCnNgIAIAYhCwsgCCALIApqIgsgCCALSxshCCANIQEMAAsLQQAhCEEAIQsDQCABIAVGDQYgC0EBaiELIAEoAgAhCSABQQRqIgchASAJRQ0AIAggC0F/aiIBIAggAUsbIQggByEBDAALCyALQShByK/AABDNAQALIAFBKEHIr8AAEM0BAAsgBEEpTw0BIAJBAWohDiACQQJ0IQYgACAEQQJ0aiENQQAhCiAAIQlBACEIAkADQCADIApBAnRqIQcDQCAKIQwgByELIAkgDUYNBSALQQRqIQcgDEEBaiEKIAkoAgAhBSAJQQRqIgQhCSAFRQ0ACyAFrSEPQgAhECAGIQUgDCEJIAEhBwNAIAlBKE8NAiALIBAgCzUCAHwgBzUCACAPfnwiET4CACARQiCIIRAgC0EEaiELIAlBAWohCSAHQQRqIQcgBUF8aiIFDQALIAIhCwJAAkAgEUKAgICAEFQNACAMIAJqIgtBKE8NASADIAtBAnRqIBCnNgIAIA4hCwsgCCALIAxqIgsgCCALSxshCCAEIQkMAQsLIAtBKEHIr8AAEM0BAAsgCUEoQcivwAAQzQEAC0EAIARBKEHIr8AAEOMBAAtBACAEQShByK/AABDjAQALAkBBoAFFDQAgACADQaAB/AoAAAsgACAINgKgASADQaABaiQAIAALwQYBB38CQAJAAkAgAEEgSQ0AAkAgAEH/AE8NAEEBIQEMAwsCQAJAIABBgIAESQ0AIABBgIAISQ0BIABB/v//AHEiAUGunQtHIABB4P//AHFB4M0KRyABQZ7wCkdxcSAAQZCodGpBcUlxIABBgJB0akHebElxIABBgIB0akGedElxIABBsNlzakF7SXEgAEGA/kdqQfrmVElxIABB8IM4SXEhAQwEC0GkrsEAIQJBpq7BACEBIABBCHZB/wFxIQNBACEEAkADQCABIQUgBCACLQABIgFqIQYCQAJAIAItAAAiAiADRg0AIAIgA0sNAwwBCwJAIAYgBEkNACAGQZwCSw0AIARB8K7BAGohAgNAIAFFDQIgAUF/aiEBIAItAAAhBCACQQFqIQIgBCAAQf8BcUcNAAwGCwsgBCAGQZwCQcCzwQAQ4wEACyAFQQBBAiAFQfCuwQBGG2ohASAGIQQgBSECIAVB8K7BAEcNAAsLQQEhAUEAIQIDQCACQQFqIQUCQAJAIAIsAIyxQSIEQQBIDQAgBSECDAELAkAgBUGkAkYNACAEQf8AcUEIdCACQY2xwQBqLQAAciEEIAJBAmohAgwBC0Gws8EAENkCAAsgACAEayIAQQBIDQQgAUEBcyEBIAJBpAJHDQAMBAsLQfynwQAhAkH+p8EAIQEgAEEIdkH/AXEhA0EAIQQDQCABIQUgBCACLQABIgFqIQYCQAJAIAItAAAiAiADRg0AIAIgA00NAQwECwJAIAYgBEkNACAGQdQBSw0AIARB2KjBAGohAgNAIAFFDQIgAUF/aiEBIAItAAAhBCACQQFqIQIgBCAAQf8BcUcNAAwECwsgBCAGQdQBQcCzwQAQ4wEACyAFQQBBAiAFQdiowQBGIgcbaiEBIAYhBCAFIQIgB0UNAAwCCwtBACEBDAELIABB//8DcSEEQQEhAUEAIQIDQCACQQFqIQUCQAJAIAIsAKyqQSIAQQBIDQAgBSECDAELAkAgBUH4A0YNACAAQf8AcUEIdCACQa2qwQBqLQAAciEAIAJBAmohAgwBC0Gws8EAENkCAAsgBCAAayIEQQBIDQEgAUEBcyEBIAJB+ANHDQALCyABQQFxC7IGAgp/AX4gACgCACEEAkACQCAAKAIEQQFqIgUNAAJAIAVFDQAgBEEIaiAEIAX8CgAAC0F/IQZBACEHDAELQQAhBiAFQQN2IAVBB3FBAEdqIgdBAXEhCAJAIAdBAUYNACAHQf7///8DcSEJQQAhBgNAIAQgBmoiByAHKQMAIg5Cf4VCB4hCgYKEiJCgwIABgyAOQv/+/fv379+//wCEfDcDACAHQQhqIgcgBykDACIOQn+FQgeIQoGChIiQoMCAAYMgDkL//v379+/fv/8AhHw3AwAgBkEQaiEGIAlBfmoiCQ0ACwsCQCAIRQ0AIAQgBmoiBiAGKQMAIg5Cf4VCB4hCgYKEiJCgwIABgyAOQv/+/fv379+//wCEfDcDAAsCQAJAIAVBCEkNACAEIAVqIAQpAAA3AAAMAQsgBUUNACAEQQhqIAQgBfwKAAALQQEhCUEAIQcDQCAHIQYgCSEHAkAgBiAAKAIAIglqLQAAQYABRw0AIAkgAyAGQX9zbGohCgJAA0AgASAAIAYgAhEMACEOIAAoAgQiCSAOpyILcSIEIQwCQCAAKAIAIgggBGopAABCgIGChIiQoMCAf4MiDkIAUg0AQQghDSAEIQwDQCAMIA1qIQwgDUEIaiENIAggDCAJcSIMaikAAEKAgYKEiJCgwIB/gyIOUA0ACwsCQCAIIA56p0EDdiAMaiAJcSIMaiwAAEEASA0AIAgpAwBCgIGChIiQoMCAf4N6p0EDdiEMCyAMIARrIAYgBGtzIAlxQQhJDQEgCCAMaiIELQAAIQ0gBCALQRl2Igs6AAAgACgCACAMQXhqIAlxakEIaiALOgAAIAggAyAMQX9zbGohCQJAIA1B/wFGDQAgCiAJIAMQgAEMAQsLIAAoAgQhBCAAKAIAIAZqQf8BOgAAIAAoAgAgBCAGQXhqcWpBCGpB/wE6AAAgA0UNASAJIAogA/wKAAAMAQsgCCAGaiALQRl2IgQ6AAAgACgCACAJIAZBeGpxakEIaiAEOgAACyAHIAcgBUkiBmohCSAGDQALIAAoAgQiBkEBakEDdkEHbCEHCyAAIAYgByAGQQhJGyAAKAIMazYCCAv0BQIIfwF+AkACQCABDQAgBUEBaiEGIAAoAgghB0EtIQgMAQtBK0GAgMQAIAAoAggiB0GAgIABcSIBGyEIIAFBFXYgBWohBgsCQAJAIAdBgICABHENAEEAIQIMAQsCQAJAIANBEEkNACACIAMQSCEBDAELAkAgAw0AQQAhAQwBCyADQQNxIQkCQAJAIANBBE8NAEEAIQpBACEBDAELIANBDHEhC0EAIQpBACEBA0AgASACIApqIgwsAABBv39KaiAMQQFqLAAAQb9/SmogDEECaiwAAEG/f0pqIAxBA2osAABBv39KaiEBIAsgCkEEaiIKRw0ACwsgCUUNACACIApqIQwDQCABIAwsAABBv39KaiEBIAxBAWohDCAJQX9qIgkNAAsLIAEgBmohBgsCQAJAIAYgAC8BDCILTw0AAkACQAJAIAdBgICACHENACALIAZrIQ1BACEBQQAhCwJAAkACQCAHQR12QQNxDgQCAAEAAgsgDSELDAELIA1B/v8DcUEBdiELCyAHQf///wBxIQYgACgCBCEJIAAoAgAhCgNAIAFB//8DcSALQf//A3FPDQJBASEMIAFBAWohASAKIAYgCSgCEBEIAEUNAAwFCwsgACAAKQIIIg6nQYCAgP95cUGwgICAAnI2AghBASEMIAAoAgAiCiAAKAIEIgkgCCACIAMQ5gENA0EAIQEgCyAGa0H//wNxIQIDQCABQf//A3EgAk8NAkEBIQwgAUEBaiEBIApBMCAJKAIQEQgARQ0ADAQLC0EBIQwgCiAJIAggAiADEOYBDQIgCiAEIAUgCSgCDBELAA0CQQAhASANIAtrQf//A3EhAANAIAFB//8DcSICIABJIQwgAiAATw0DIAFBAWohASAKIAYgCSgCEBEIAEUNAAwDCwtBASEMIAogBCAFIAkoAgwRCwANASAAIA43AghBAA8LQQEhDCAAKAIAIgEgACgCBCIKIAggAiADEOYBDQAgASAEIAUgCigCDBELACEMCyAMC5wGAgV/BX4jAEGAAWsiBCQAIAG9IglC/////////weDIgpCgICAgICAgAiEIAlCAYZC/v///////w+DIAlCNIinQf8PcSIFGyILQgGDIQxBAiEGAkACQAJAAkACQCAKUCIHQQJBAyAHG0EEIAlCgICAgICAgPj/AIMiClAbIApCgICAgICAgPj/AFEbDgUEAAECAwQLQQMhBgwDC0EEIQYMAgsgBUHNd2ohCCAMp0EBcyEGQgEhDQwBC0KAgICAgICAICALQgGGIAtCgICAgICAgAhRIggbIQtCAkIBIAgbIQ0gDKdBAXMhBkHLd0HMdyAIGyAFaiEICyAEIAg7AXggBCANNwNwIARCATcDaCAEIAs3A2AgBCAGOgB6AkACQAJAAkACQAJAAkAgBkH/AXEiCEEBSw0AIANB//8DcSEGIARBIGogBEHgAGogBEEPakEREDdBia7AAEEBIAlCAFMi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IAMmASACCxwCAX8BbyAAJQEgASUBEBghAxB+IgIgAyYBIAILHQAgAEEIakEAKQKYokA3AgAgAEEAKQKQokA3AgALHQAgAEEIakEAKQKookA3AgAgAEEAKQKgokA3AgALFgACQCAARQ0AIAAgARDzAgALENYCAAsVACABaUEBRiAAQYCAgIB4IAFrTXELGgIBfwFvIAAlASABEAIhAxB+IgIgAyYBIAILGgIBfwFvIAAlASABEAchAxB+IgIgAyYBIAILEgAgACABQQF0QQFyIAIQ5AEACxgAIAEoAgAgASgCBCAAKAIAIAAoAgQQZAsYAgF/AW8gACUBEAMhAhB+IgEgAiYBIAELGAIBfwFvIAAlARAFIQIQfiIBIAImASABCxgCAX8BbyAAJQEQDSECEH4iASACJgEgAQsYAgF/AW8gACUBEBQhAhB+IgEgAiYBIAELGAIBfwFvIAAlARAWIQIQfiIBIAImASABCxgCAX8BbyAAIAEQICEDEH4iAiADJgEgAgsYAgF/AW8gACABECwhAxB+IgIgAyYBIAILFQAgACACIAMQpwI2AgQgAEEANgIACxYAIAAoAgAgASACIAAoAgQoAgwRCwALEwAgACUBIAEgAiUBIAIQqQEQBgsWAgF/AW8gABAqIQIQfiIBIAImASABCxYCAX8BbyAAECshAhB+IgEgAiYBIAELFgIBfwFvIAAQLSECEH4iASACJgEgAQsTACAAIAIQqwI2AgQgAEEANgIACxIAIAAoAgAgASgCABDcAkEARwsSACAAKAIAIAEoAgAQ3QJBAEcLEgAgACgCACABKAIAEN4CQQBHCw8AIAAgASACIAMgBBBLAAsUACAAKAIAIAEgACgCBCgCDBEIAAsUACAAKAIAIAEgACgCBCgCEBEIAAsUAgF/AW8QCyEBEH4iACABJgEgAAsUAgF/AW8QDCEBEH4iACABJgEgAAsUAgF/AW8QFSEBEH4iACABJgEgAAsRACAAKAIAIAAoAgQgARDSAgsRACAAKAIAIAAoAgQgARD2AgsRACAAKAIEIAAoAgggARD2AgsNACAAIAEgAiADEE0PCxEAIAAoAgAgACgCBCABENICCxEAIAAQogM2AgQgACABNgIACxEAIAAoAgQgACgCCCABEPYCCxQAQQAgADYC7LZBQQBBATYC6LZBCxAAIAAoAgAgACgC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IHJpZ2h0YCBmYWlsZWQKICBsZWZ0OiDACQogcmlnaHQ6IMAAEGFzc2VydGlvbiBgbGVmdCDAECByaWdodGAgZmFpbGVkOiDACQogIGxlZnQ6IMAJCiByaWdodDogwAAYSW52YWxpZCByb3V0ZXIgb3B0aW9uczogwAAcQ291bGQgbm90IHNlcmlhbGl6ZSByb3V0ZXM6IMAAGUludmFsaWQgU2ltcGxlUm91dGVKc29uOiDAAMACOiDAAGxpYnJhcnkvY29yZS9zcmMvbnVtL2ZsdDJkZWMvc3RyYXRlZ3kvZ3Jpc3UucnMAbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3NoYXJlZC9zbWFsbHNvcnQucnMAbGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAGxpYnJhcnkvY29yZS9zcmMvbnVtL2RpeV9mbG9hdC5ycwAvVXNlcnMvc2V2ZS8ucnVzdHVwL3Rvb2xjaGFpbnMvc3RhYmxlLWFhcmNoNjQtYXBwbGUtZGFyd2luL2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvc3RkL3NyYy9zeXMvdGhyZWFkX2xvY2FsL25vX3RocmVhZHMucnMAbGlicmFyeS9jb3JlL3NyYy9udW0vZGVjMmZsdC9kZWNpbWFsX3NlcS5ycwBzcmMvb2JzdGFjbGVfbWFwLnJzAGxpYnJhcnkvY29yZS9zcmMvbnVtL2ZsdDJkZWMvc3RyYXRlZ3kvZHJhZ29uLnJzAGxpYnJhcnkvY29yZS9zcmMvbnVtL2JpZ251bS5ycwBsaWJyYXJ5L2NvcmUvc3JjL2ZtdC9udW0ucnMAc3JjL3dhc20ucnMAL1VzZXJzL3NldmUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEyMC9zcmMvZXh0ZXJucmVmLnJzAGxpYnJhcnkvY29yZS9zcmMvbnVtL2RlYzJmbHQvcGFyc2UucnMAbGlicmFyeS9jb3JlL3NyYy91bmljb2RlL3ByaW50YWJsZS5ycwAvcnVzdC9kZXBzL2hhc2hicm93bi0wLjE2LjEvc3JjL3Jhdy9tb2QucnMAbGlicmFyeS9jb3JlL3NyYy9mbXQvbW9kLnJzAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzAGxpYnJhcnkvY29yZS9zcmMvbnVtL2ZsdDJkZWMvbW9kLnJzAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjExL3NyYy9kbG1hbGxvYy5ycwBsaWJyYXJ5L3N0ZC9zcmMvYWxsb2MucnMAL1VzZXJzL3NldmUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9qcy1zeXMtMC4zLjk3L3NyYy9saWIucnMAL1VzZXJzL3NldmUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZS13YXNtLWJpbmRnZW4tMC42LjUvc3JjL2xpYi5ycwAVbWVtb3J5IGFsbG9jYXRpb24gb2YgwA0gYnl0ZXMgZmFpbGVkABBmbG9hdGluZyBwb2ludCBgwAFgAAtjaGFyYWN0ZXIgYMABYAAJaW50ZWdlciBgwAFgAAlib29sZWFuIGDAAWAAD21pc3NpbmcgZmllbGQgYMABYAARZHVwbGljYXRlIGZpZWxkIGDAAWAACEpzVmFsdWUowAEpADUEEAATAAAAbgEAADIAAAA1BBAAEwAAAHMBAAAoAAAANQQQABMAAADPAAAAIAAAADUEEAATAAAAWQAAACUAAAA1BBAAEwAAAA0CAAAjAAAA///////////wBxAAAAAAAAAAAAAAAAAAdG9wYm90dG9taW5uZXIAALQEEAALAAAAfgMAADEAAABtaW5YbWF4WG1pblltYXhZKAgQAAQAAAAsCBAABAAAADAIEAAEAAAANAgQAAQAAAB4eQAAWAgQAAEAAABZCBAAAQAAAHR5cGVjZW50ZXJ3aWR0aGhlaWdodGxheWVyc2xheWVyY29ubmVjdGVkVG8AbAgQAAQAAABwCBAABgAAAHYIEAAFAAAAewgQAAYAAACBCBAABgAAAIcIEAAFAAAAjAgQAAsAAABwb2ludElkcGNiUG9ydElkWAgQAAEAAABZCBAAAQAAAIcIEAAFAAAA0AgQAAcAAADXCBAACQAAAFJvdXRlU2VnbWVudHJvdXRlX3R5cGV3aXJldmlhZnJvbV9sYXllcnRvX2xheWVyZGF0YSBkaWQgbm90IG1hdGNoIGFueSB2YXJpYW50IG9mIHVudGFnZ2VkIGVudW0gTnVtYmVyT3JTdHJpbmdTaW1wbGlmaWVkUGNiVHJhY2VwY2JfdHJhY2VfaWRjb25uZWN0aW9uX25hbWVyb3V0ZW5hbWVzb3VyY2VUcmFjZUlkcG9pbnRzVG9Db25uZWN0bm9taW5hbFRyYWNlV2lkdGinCRAABAAAAKsJEAANAAAAuAkQAA8AAAB2CBAABQAAAMcJEAARAAAAbGF5ZXJDb3VudG9ic3RhY2xlc2Nvbm5lY3Rpb25zYm91bmRzbWluVHJhY2VXaWR0aAAAAAAKEAAKAAAACgoQAAkAAAATChAACwAAAB4KEAAGAAAAJAoQAA0AAADHCRAAEQAAAGdyaWRTdGVwY2xlYXJhbmNlbWF4SXRlcmF0aW9uc3ZpYUNvc3RoV2VpZ2h0dHVybkNvc3R0cmFja01hcmdpbmxheWVyQ29zdHNsYXllckRpcmVjdGlvblByZWZlcmVuY2VzZGlyZWN0aW9uUHJlZmVyZW5jZUNvc3QAAABkChAACAAAAGwKEAAJAAAAdQoQAA0AAACCChAABwAAAIkKEAAHAAAAkAoQAAgAAACYChAACwAAAKMKEAAKAAAArQoQABkAAADGChAAFwAAAGdyaWRTdGVwIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm9wY2JfdHJhY2UAtAQQAAsAAADmAAAANgAAALQEEAALAAAA5wAAADQAAABsYXllckNvdW50IG11c3QgZml0IGluIHU4Y2VsbHNfZXhwYW5kZWRjZWxsc19wdXNoZWRjZWxsc19yZXZpc2l0ZWRkdXBsaWNhdGVfc2tpcHNwYXRoX2xlbmd0aHBhdGhfY29zdGluaXRpYWxfaGZpbmFsX2dtYXhfZl9zY29yZW9wZW5fc2V0X3NpemVjbG9zZWRfc2V0X3NpemV2aWFfY291bnRoZXVyaXN0aWNfcmF0aW9leHBhbnNpb25fcmF0aW9yZXZpc2l0X3JhdGlvc2tpcF9yYXRpbwAAAQAAAAAAAAABAAAA/////wAAAAD/////////////////////AAAAAP////8BAAAAAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAQAAAA4AAAAAAAAAAAAAAAEAAAAPAAAAAAAAAAAAAAAB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AAAAAADwPwAAAAAAACRAAAAAAAAAWUAAAAAAAECPQAAAAAAAiMNAAAAAAABq+EAAAAAAgIQuQQAAAADQEmNBAAAAAITXl0EAAAAAZc3NQQAAACBfoAJCAAAA6HZIN0IAAACilBptQgAAQOWcMKJCAACQHsS81kIAADQm9WsMQwCA4Dd5w0FDAKDYhVc0dkMAyE5nbcGrQwA9kWDkWOFDQIy1eB2vFURQ7+LW5BpLRJLVTQbP8IBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi5SZWZDZWxsIGFscmVhZHkgYm9ycm93ZWQAAAxaEAAOWhAAEFoQAAIAAAACAAAABwAAAABBzLbBAAsEBAAAAACg7gEEbmFtZQAREGdyaWRfcm91dGVyLndhc20Bw+0BpAMAhwFqc19zeXM6Ol86OjxpbXBsIHdhc21fYmluZGdlbjo6Y2FzdDo6SnNDYXN0IGZvciBqc19zeXM6Ok1hcDxLLFY+Pjo6aW5zdGFuY2VvZjo6X193YmdfaW5zdGFuY2VvZl9NYXBfMTBkNGVkZjYwZmNmOTMyNzo6aDBhZTIyMjA4MDE3MWUxMTkBSmpzX3N5czo6QXJyYXk8VD46Omxlbmd0aDo6X193YmdfbGVuZ3RoXzBhNmNlMDE2ZGMxNDYwYjA6OmhlM2VmZWZjNDBmZGZkODU4Alhqc19zeXM6OkFycmF5PFQ+OjpnZXRfdW5jaGVja2VkOjpfX3diZ19nZXRfdW5jaGVja2VkX2JlNTYyYjE0MjE2NTYzMjE6OmgzY2U1NzU4YjA2ZDBlM2JjA0lqc19zeXM6Okl0ZXJhdG9yPFQ+OjpuZXh0OjpfX3diZ19uZXh0X2FhY2VlMzEwYmNmZTY0NjE6OmhmYjBkZTNmZmUwMjEwNzhjBE1qc19zeXM6Okl0ZXJhdG9yTmV4dDxUPjo6ZG9uZTo6X193YmdfZG9uZV9iMWFmZDYyMDFhYzA0NWUwOjpoNmQ4ODYxNmVjYTVjYzJkMQVPanNfc3lzOjpJdGVyYXRvck5leHQ8VD46OnZhbHVlOjpfX3diZ192YWx1ZV9mODUyNzE2YWNkZWIzZTgyOjpoNDE2OGNjODZhN2ZkN2UwYgZEanNfc3lzOjpBcnJheTxUPjo6c2V0OjpfX3diZ19zZXRfZjYxNGY2YTA2MDhkMWQxZDo6aDg1ZDgxYmNhMTE1YjYzYTUHRGpzX3N5czo6QXJyYXk8VD46OmdldDo6X193YmdfZ2V0XzY1MmY2NDBiM2IwYjZlM2U6Omg4MWU3YzQ4MDgyMDM2MWI3CGtzZXJkZV93YXNtX2JpbmRnZW46Ok9iamVjdEV4dDo6Z2V0X3dpdGhfcmVmX2tleTo6X193YmdfZ2V0X3dpdGhfcmVmX2tleV82NDEyY2YzMDk0NTk5Njk0OjpoZWFjMTdkODY0MzVhZGM5YwlRc2VyZGVfd2FzbV9iaW5kZ2VuOjpPYmplY3RFeHQ6OnNldDo6X193Ymdfc2V0XzZiZTQyNzY4YzY5MGUzODA6OmhmYzcwYzEwNDU4NDU4NTQ2Cno8c2VyZGVfd2FzbV9iaW5kZ2VuOjplcnJvcjo6RXJyb3IgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10Ojp0b19zdHJpbmc6Ol9fd2JnX1N0cmluZ184NTY0ZTU1OTc5OWVjY2RhOjpoOWI3MTZmY2Y0YTE2NjQ0ZgtBanNfc3lzOjpBcnJheTo6bmV3OjpfX3diZ19uZXdfM2JhYThkOTg2NjE1NWM3OTo6aDQzYzA0ODI2NDY4MzZiMWUMQmpzX3N5czo6T2JqZWN0OjpuZXc6Ol9fd2JnX25ld18yZmFkOGNhMDJmZDAwNjg0OjpoM2E2ZmJiM2Y4MDkxZmE3Ng1GanNfc3lzOjpVaW50OEFycmF5OjpuZXc6Ol9fd2JnX25ld184NDU0ZWVlNjcyYjJiYTZlOjpoMjcwZjExNWUyYzY2OTdiYw5ManNfc3lzOjpVaW50OEFycmF5OjpsZW5ndGg6Ol9fd2JnX2xlbmd0aF9iYTNjMDMyNjAyZWZlMzEwOjpoNDRkOGMxMDUzN2NmZmFmOQ9danNfc3lzOjpVaW50OEFycmF5Ojpjb3B5X3RvX3NsaWNlOjpfX3diZ19wcm90b3R5cGVzZXRjYWxsX2ZkNDA1MGU4MDZlMWQ1MTk6OmgyYWMzODAxOWZhNDU5MTU4EJABanNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpVaW50OEFycmF5Pjo6aW5zdGFuY2VvZjo6X193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzU3ZDc3YWNkNTBlNGM0NGQ6OmgzNGEzMDM0ZjMwNTk3YjE0EZIBanNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpBcnJheUJ1ZmZlcj46Omluc3RhbmNlb2Y6Ol9fd2JnX2luc3RhbmNlb2ZfQXJyYXlCdWZmZXJfZWFiOWYyOGZiZWMyMzQ3Nzo6aGZmNzJhZjNjZDZmMTlkZmQSSmpzX3N5czo6QXJyYXk6OmlzX2FycmF5OjpfX3diZ19pc0FycmF5X2M2YzZlZjgzMDg5OTViY2Y6OmhkZGZmMjNlOTllZDQ5NDY4E1hqc19zeXM6Ok51bWJlcjo6aXNfc2FmZV9pbnRlZ2VyOjpfX3diZ19pc1NhZmVJbnRlZ2VyXzNjNTZjNDIxYTViNGNjZTQ6OmhiOTk2YjYzNzIzNDJmOTYwFEpqc19zeXM6Ok9iamVjdDo6ZW50cmllczo6X193YmdfZW50cmllc19iYjk4NDNiYTczZGM3MGQ2OjpoMTBjMGU3ZGI5ZTdiOTIyMhVManNfc3lzOjpTeW1ib2w6Oml0ZXJhdG9yOjpfX3diZ19pdGVyYXRvcl85ZDY4OTg1YTFkMDk2ZmMyOjpoZGFkZGFhNzc0MmZiZmYwNRZqanNfc3lzOjpJdGVyYXRvcjo6bG9va3NfbGlrZV9pdGVyYXRvcjo6TWF5YmVJdGVyYXRvcjo6bmV4dDo6X193YmdfbmV4dF8yNjFjM2M0OGM2ZTMwOWE1OjpoM2VlMjU5Mjk1YWUxZjk4OBdKanNfc3lzOjpSZWZsZWN0OjpnZXRfc3ltYm9sOjpfX3diZ19nZXRfOWNmZWE5YjdiYmYxMmExNTo6aGI4YzE0NWVmMTgzZjUwZDEYSmpzX3N5czo6RnVuY3Rpb248Rj46OmNhbGwwOjpfX3diZ19jYWxsX2FkZDllNWE3NjM4MmU2Njg6OmgzYjA2NjdlMzY4YjMxYjNiGWR3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fc3RyaW5nX2dldDo6X193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0Xzk2NTU5MjA3M2U1ZDg0OGM6Omg5MjMyMmE1NTk5NzI4MTgyGmR3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fbnVtYmVyX2dldDo6X193YmdfX193YmluZGdlbl9udW1iZXJfZ2V0X2RkNmQ2OWE2MDc5ZjI2ZjE6OmhkN2QyYmJjOTM2Zjk4YmNmG1R3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faW46Ol9fd2JnX19fd2JpbmRnZW5faW5fMjYxN2ZhNzYzOTc2MjBkMzo6aDE5NTU5MDkwMGUzNzM5YzQcWndhc21fYmluZGdlbjo6X193YmluZGdlbl90aHJvdzo6X193YmdfX193YmluZGdlbl90aHJvd185Yzc1ZDQ3YmY5ZTc3MzFlOjpoMDQ5ZTlkOWYyYmZiNzYzZh1ed2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX251bGw6Ol9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF8wNjYwODZiZTNhYmU5YmIzOjpoOGNiYmE5OGIyNGU2ZjI2OB5gd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2pzdmFsX2VxOjpfX3diZ19fX3diaW5kZ2VuX2pzdmFsX2VxXzQwM2VhYTM2MTA1MDBhMjU6OmgyNDBiZmE1NjI5MGQwNTE5H1R3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fYXNfbnVtYmVyOjpfX3diZ19OdW1iZXJfYTNkNzM3ZmQxODNmN2RjYTo6aGY1YjM5MzVlOTEzNDE5ZDYgU3dhc21fYmluZGdlbjo6X193YmluZGdlbl9lcnJvcl9uZXc6Ol9fd2JnX0Vycm9yXzM2MzlhNjBlZDE1Zjg3ZTc6OmgxMjlkM2VjOTgzODA0YjVjIWJ3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfYmlnaW50OjpfX3diZ19fX3diaW5kZ2VuX2lzX2JpZ2ludF9kNmE4MTY3Y2FjNDAxYjk1OjpoZjMwMDFjMmE5ZjdhMmUzYyJid2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX29iamVjdDo6X193YmdfX193YmluZGdlbl9pc19vYmplY3RfNWIyMmZmMjQxODA2M2E5Yzo6aGVlMmYwM2Q2MjU3YjhjMDYjZndhc21fYmluZGdlbjo6X193YmluZGdlbl9ib29sZWFuX2dldDo6X193YmdfX193YmluZGdlbl9ib29sZWFuX2dldF9jM2RkNWMzOWYxYjVhMTJiOjpoNDYzZWUzNWMxNWMwZGNkYSRmd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX2Z1bmN0aW9uOjpfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzJmMGZkN2NlYjg2ZTY0YzU6Omg4ZjkxMDY3ODAxZDFlNGNmJWh3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfdW5kZWZpbmVkOjpfX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF8yNDRhOTJjMzRkM2I2ZWMwOjpoNjgzODUyZjg5ZjUwY2EwZSZsd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2pzdmFsX2xvb3NlX2VxOjpfX3diZ19fX3diaW5kZ2VuX2pzdmFsX2xvb3NlX2VxXzE5NzhmMWU3N2I0YmNlNjI6OmhkYmE4YWI4OTc2NzIzNmY0J3J3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjQ6Ol9fd2JnX19fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjRfM2FmNmQ0Y2E3NzE5M2E0Yjo6aDE2ZDM2ZjJlY2RjYjgxYjgoaHdhc21fYmluZGdlbjo6X193YmluZGdlbl9kZWJ1Z19zdHJpbmc6Ol9fd2JnX19fd2JpbmRnZW5fZGVidWdfc3RyaW5nXzA3Y2I3MmNmY2M5NTJlMmI6OmgyNGIwYmE3NTljOTdlZmVhKhBGNjQgLT4gRXh0ZXJucmVmKxBJNjQgLT4gRXh0ZXJucmVmLBhSZWYoU3RyaW5nKSAtPiBFeHRlcm5yZWYtEFU2NCAtPiBFeHRlcm5yZWYuQ2dyaWRfcm91dGVyOjp3YXNtOjpyb3V0ZV9zaW1wbGVfcm91dGVfanNvbl9pbm5lcjo6aGRkNjZiMjg2OTcyZmRiNTEvPWdyaWRfcm91dGVyOjp3YXNtOjpyb3V0ZV9zaW1wbGVfcm91dGVfanNvbjo6aDA2MDJhYzczMjZiYzBiM2MwSGNvcmU6Om51bTo6Zmx0MmRlYzo6c3RyYXRlZ3k6OmRyYWdvbjo6Zm9ybWF0X3Nob3J0ZXN0OjpoMTllYTcwOTkxYTQ0MTI4MTFFY29yZTo6bnVtOjpmbHQyZGVjOjpzdHJhdGVneTo6ZHJhZ29uOjpmb3JtYXRfZXhhY3Q6OmgxNDEyNTY4YThmYmEyNjc1MjpkbG1hbGxvYzo6ZGxtYWxsb2M6OkRsbWFsbG9jPEE+OjptYWxsb2M6Omg2MTkxMDY3YjdjZjI5MGE3M0Rjb3JlOjpzbGljZTo6c29ydDo6dW5zdGFibGU6OnF1aWNrc29ydDo6cXVpY2tzb3J0OjpoYjI4ODY1NjliMzQwNzJlODRhPGNvcmU6Om1hcmtlcjo6UGhhbnRvbURhdGE8VD4gYXMgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplU2VlZD46OmRlc2VyaWFsaXplOjpoZGQ2MWU0ZTAzNGEwMzVmZTVhPGNvcmU6Om1hcmtlcjo6UGhhbnRvbURhdGE8VD4gYXMgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplU2VlZD46OmRlc2VyaWFsaXplOjpoYjJjMDI2MDk5NjllY2QxMzZAaGFzaGJyb3duOjpyYXc6OlJhd1RhYmxlPFQsQT46OnJlc2VydmVfcmVoYXNoOjpoMDI0NDQ5ODQ3OGNkMjY4ZTdLY29yZTo6bnVtOjpmbHQyZGVjOjpzdHJhdGVneTo6Z3Jpc3U6OmZvcm1hdF9zaG9ydGVzdF9vcHQ6Omg2NWE5MzhmNDBmZTY5ZjgzODhncmlkX3JvdXRlcjo6d2FzbTo6aW5mZXJfcG9pbnRfc3RhdGVzOjpoYWFmZTI5MmE3MjJiOGMxNzlBZ3JpZF9yb3V0ZXI6OnJvdXRlcjo6R3JpZFJvdXRlcjo6c3RhdHNfdG9fZGljdDo6aDQ4ODkwYzBkN2VjNzhhMDE6YTxjb3JlOjptYXJrZXI6OlBoYW50b21EYXRhPFQ+IGFzIHNlcmRlX2NvcmU6OmRlOjpEZXNlcmlhbGl6ZVNlZWQ+OjpkZXNlcmlhbGl6ZTo6aDEyNDFmNzIxYWRlZjZmNjM7WmNvcmU6Om51bTo6ZGVjMmZsdDo6PGltcGwgY29yZTo6c3RyOjp0cmFpdHM6OkZyb21TdHIgZm9yIGY2ND46OmZyb21fc3RyOjpoNmU5ZjM3ZTFmYTk2MzcyMjw6Y29yZTo6bnVtOjpkZWMyZmx0OjpwYXJzZTo6cGFyc2VfbnVtYmVyOjpoOTI2YzA4MDYzYTY5YzA0MD1qPHNlcmRlX3dhc21fYmluZGdlbjo6ZGU6OkRlc2VyaWFsaXplciBhcyBzZXJkZV9jb3JlOjpkZTo6RGVzZXJpYWxpemVyPjo6ZGVzZXJpYWxpemVfbWFwOjpoODRiYzZhMzE4NmRhOTI5MD5FY29yZTo6bnVtOjpkZWMyZmx0OjpkZWNpbWFsX3NlcTo6cGFyc2VfZGVjaW1hbF9zZXE6OmhiNjliZTMwN2YzOGIxZDc2P0Jjb3JlOjpudW06OmZsdDJkZWM6OnN0cmF0ZWd5OjpkcmFnb246Om11bF9wb3cxMDo6aGM0NWJmNjIwYWU4YWIzODlAOHNlcmRlX2NvcmU6OmRlOjpNYXBBY2Nlc3M6Om5leHRfdmFsdWU6Omg1Y2E3MzI0YjUzY2RiZjUwQTVncmlkX3JvdXRlcjo6d2FzbTo6b2JzdGFjbGVfbGF5ZXJzOjpoMTFhMjI1MmIxNDJkZGFhNUI4c2VyZGVfY29yZTo6ZGU6Ok1hcEFjY2Vzczo6bmV4dF92YWx1ZTo6aDA3YTMyYmQ5NWNiMzk3Y2ZDQGhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6aGYwMDM2NjZjZjUwM2Q2NDVEMmdyaWRfcm91dGVyOjp3YXNtOjpwb2ludF9zdGF0ZXM6Omg0NDAzYTQyYzQ5ZmRiNDQ1RUBoYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6OmgyMzBmOTJjM2IxODQ5MzNlRkBoYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6OmhjMTdhZGJkZDkyYTVlODNjR0BoYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6Omg2MWEyNWM1YzlhMDUzZjg0SDNjb3JlOjpzdHI6OmNvdW50Ojpkb19jb3VudF9jaGFyczo6aDQ2M2VmOWRlNjg5YzU0NDRJQGhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6aGNmZTEwNjJlZGFlMTE3NzRKMTxzdHIgYXMgY29yZTo6Zm10OjpEZWJ1Zz46OmZtdDo6aGQ5YzkyN2RiYmE2NDYzNTJLMWNvcmU6OnN0cjo6c2xpY2VfZXJyb3JfZmFpbF9ydDo6aGNlZWNhN2E3ZDAzMGUzNmRMQmNvcmU6OmZtdDo6ZmxvYXQ6OmZsb2F0X3RvX2RlY2ltYWxfY29tbW9uX2V4YWN0OjpoNWE3YzJiMTViZDRkMGJhN00oX19ydXN0Y1s5ZTZhMDhlODllNGI5MTExXTo6X19yZGxfcmVhbGxvY05qPHNlcmRlX3dhc21fYmluZGdlbjo6ZGU6OkRlc2VyaWFsaXplciBhcyBzZXJkZV9jb3JlOjpkZTo6RGVzZXJpYWxpemVyPjo6ZGVzZXJpYWxpemVfc2VxOjpoZjhhYmE0MmJjMGMzMGYyOE9IY29yZTo6bnVtOjpmbHQyZGVjOjpzdHJhdGVneTo6Z3Jpc3U6OmZvcm1hdF9leGFjdF9vcHQ6OmgyOWU4ZjgyOTMzN2RlYzZlUElncmlkX3JvdXRlcjo6b2JzdGFjbGVfbWFwOjpHcmlkT2JzdGFjbGVNYXA6OmlzX2Jsb2NrZWQ6OmhhMDAxNjY3MWI0ODUyMzMyUTpjb3JlOjpudW06OmJpZ251bTo6QmlnMzJ4NDA6Om11bF9kaWdpdHM6OmgwZjI3MzA5NDg1YjIyYzRmUjljb3JlOjp1bmljb2RlOjpwcmludGFibGU6OmlzX3ByaW50YWJsZTo6aGQ3N2JjYTlhMDczYTdmNWZTQWhhc2hicm93bjo6cmF3OjpSYXdUYWJsZUlubmVyOjpyZWhhc2hfaW5fcGxhY2U6OmhlMDg1NzUwNjczYjM4YWQ5VDVjb3JlOjpmbXQ6OkZvcm1hdHRlcjo6cGFkX2ludGVncmFsOjpoYTI1ZjlhOTdkMjZmMGNkMlVFY29yZTo6Zm10OjpmbG9hdDo6ZmxvYXRfdG9fZGVjaW1hbF9jb21tb25fc2hvcnRlc3Q6OmhkOWE4YmNhY2M3YmYzNzQ0VklzZXJkZV9jb3JlOjpkZTo6RGVzZXJpYWxpemVyOjpfX2Rlc2VyaWFsaXplX2NvbnRlbnRfdjE6OmhiZjBiN2YwYzNhNjVmYzU2VzhkbG1hbGxvYzo6ZGxtYWxsb2M6OkRsbWFsbG9jPEE+OjpmcmVlOjpoMjU3YjRiZDA3NTliNGJmYlgxY29yZTo6c3RyOjpjb252ZXJ0czo6ZnJvbV91dGY4OjpoYWM2ZDZmZmM0MjY2YWFhYllXY29yZTo6cHRyOjpkcm9wX2luX3BsYWNlPGdyaWRfcm91dGVyOjpvYnN0YWNsZV9tYXA6OkdyaWRPYnN0YWNsZU1hcD46OmgzZWY3NmI0ZjExN2QwOWYyWkVjb3JlOjpjaGFyOjptZXRob2RzOjo8aW1wbCBjaGFyPjo6ZXNjYXBlX2RlYnVnX2V4dDo6aDE3Nzc2MjE3MDUxNWJjYzVbTDxjb3JlOjpoYXNoOjpzaXA6Okhhc2hlcjxTPiBhcyBjb3JlOjpoYXNoOjpIYXNoZXI+Ojp3cml0ZTo6aDllMWE1MGRlYmY3MDM1MjFcLGNvcmU6OmZtdDo6Rm9ybWF0dGVyOjpwYWQ6Omg0NjI5Yzg2ODNlYjQ1NjE5XT5jb3JlOjpmbXQ6OkZvcm1hdHRlcjo6d3JpdGVfZm9ybWF0dGVkX3BhcnRzOjpoZDk4OGZjZDcwMjBmMzgyOV5LY29yZTo6bnVtOjpkZWMyZmx0OjpkZWNpbWFsX3NlcTo6RGVjaW1hbFNlcTo6cmlnaHRfc2hpZnQ6OmhlNDU0MmNlZmE4MTc4OGZmX09ncmlkX3JvdXRlcjo6b2JzdGFjbGVfbWFwOjpHcmlkT2JzdGFjbGVNYXA6OmFkZF9ibG9ja2VkX2NlbGw6OmhlZDllNzVjZjk1ZGY0ODlmYEpjb3JlOjpudW06OmRlYzJmbHQ6OmRlY2ltYWxfc2VxOjpEZWNpbWFsU2VxOjpsZWZ0X3NoaWZ0OjpoOWVhZjgyMWVkODRkOWM2MWE8Y29yZTo6Zm10OjpGb3JtYXR0ZXI6OnBhZF9mb3JtYXR0ZWRfcGFydHM6OmhiNTJhZWYyNzg5MDM1NTMyYjdzZXJkZV93YXNtX2JpbmRnZW46OnN0YXRpY19zdHJfdG9fanM6OmgwNzU0MjEzOTAyZTdjZmUxYztoYXNoYnJvd246Om1hcDo6SGFzaE1hcDxLLFYsUyxBPjo6aW5zZXJ0OjpoODYzMDQ5NDQ2ZjEyODY2M2QjY29yZTo6Zm10Ojp3cml0ZTo6aDU3ZDI4ODM0MzA4ZGRhYjdlOGNvcmU6Om51bTo6YmlnbnVtOjpCaWczMng0MDo6bXVsX3BvdzI6Omg4ZmZkNjBjOWVkZmMzZjMxZj5jb3JlOjpmbXQ6Om51bTo6aW1wOjo8aW1wbCB1NjQ+OjpfZm10X2lubmVyOjpoZTAxMDNiMWZhYTVjNGM0N2c+Y29yZTo6Zm10OjpudW06OmltcDo6PGltcGwgdTMyPjo6X2ZtdF9pbm5lcjo6aDdkYjZhZDI0NmJmNGI2ZThoSjxzZXJkZV9jb3JlOjpkZTo6VW5leHBlY3RlZCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6Omg0MzQyZWU3NzA5YzA1YjE1aTtoYXNoYnJvd246Om1hcDo6SGFzaE1hcDxLLFYsUyxBPjo6aW5zZXJ0OjpoZWE1NTdiNGE1OTU5YTY1N2o7aGFzaGJyb3duOjptYXA6Okhhc2hNYXA8SyxWLFMsQT46Omluc2VydDo6aGUyMmU0ZGYxYTRhODQwZWZrRnNlcmRlX3dhc21fYmluZGdlbjo6ZGU6OkRlc2VyaWFsaXplcjo6aW52YWxpZF90eXBlXzo6aDU0Njg4NjA1N2JmM2Y5YzBsNGNvcmU6Omhhc2g6OkJ1aWxkSGFzaGVyOjpoYXNoX29uZTo6aDU0ZmMwMGVhYjNjOGUxN2JtQWRsbWFsbG9jOjpkbG1hbGxvYzo6RGxtYWxsb2M8QT46OmRpc3Bvc2VfY2h1bms6OmhhMzdmOTZkMTU3MjMxMmI5bjRncmlkX3JvdXRlcjo6d2FzbTo6bGF5ZXJfdG9faW5kZXg6OmhkZmMzNTk4YmRjNzllZjBjbztoYXNoYnJvd246Om1hcDo6SGFzaE1hcDxLLFYsUyxBPjo6aW5zZXJ0OjpoZWVlNDk4NzJmZTk0OTllZHA8Y29yZTo6bnVtOjpkZWMyZmx0OjpsZW1pcmU6OmNvbXB1dGVfZmxvYXQ6Omg1ZDE4OTAyYjNkMmZlOTU1cTdjb3JlOjpzbGljZTo6c29ydDo6dW5zdGFibGU6OmlwbnNvcnQ6OmgzY2IxNTJmNzBkOGRhNTZmcjNhbGxvYzo6Zm10Ojpmb3JtYXQ6OmZvcm1hdF9pbm5lcjo6aGZhMjY4YjM3ZjJiZmFlOTVzUXN0ZDo6c3lzOjp0aHJlYWRfbG9jYWw6Om5vX3RocmVhZHM6OkxhenlTdG9yYWdlPFQ+Ojppbml0aWFsaXplOjpoM2Q3MDg4MGU1MDk4ODZhM3Q8ZGxtYWxsb2M6OmRsbWFsbG9jOjpEbG1hbGxvYzxBPjo6bWVtYWxpZ246OmhlMTk4Mzc4MGM3YjYzOWM2dVhjb3JlOjpudW06OmZsdDJkZWM6OnN0cmF0ZWd5OjpncmlzdTo6Zm9ybWF0X2V4YWN0X29wdDo6cG9zc2libHlfcm91bmQ6OmhlZmYzNWVlZDU1OGUwMWFidkBkbG1hbGxvYzo6ZGxtYWxsb2M6OkRsbWFsbG9jPEE+Ojp1bmxpbmtfY2h1bms6Omg4ODM5M2NmM2ZkOTJjNWQ2d0JzZXJkZTo6cHJpdmF0ZTo6ZGU6OmNvbnRlbnQ6OmNvbnRlbnRfdW5leHBlY3RlZDo6aDliZDkyOWQ2Yzk5ZDliMjh4RWNvcmU6Om51bTo6ZGVjMmZsdDo6ZGVjaW1hbF9zZXE6OkRlY2ltYWxTZXE6OnJvdW5kOjpoZmMwNzQzOWQ3NGY2NDQ5ZHk4Y29yZTo6bnVtOjpmbHQyZGVjOjpkaWdpdHNfdG9fZGVjX3N0cjo6aGIxZmU0MDRhYTIyZTQ0N2F6TGNvcmU6OnVuaWNvZGU6OnVuaWNvZGVfZGF0YTo6Z3JhcGhlbWVfZXh0ZW5kOjpsb29rdXBfc2xvdzo6aGFkNDZhNjdlZWQxNDdkYTN7RmRsbWFsbG9jOjpkbG1hbGxvYzo6RGxtYWxsb2M8QT46Omluc2VydF9sYXJnZV9jaHVuazo6aDc4OGRlNjRjNjIwMDc2Mzh8WWNvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxhbGxvYzo6dmVjOjpWZWM8Z3JpZF9yb3V0ZXI6Ondhc206Ok9ic3RhY2xlPj46OmgyMjZlZGY4YTA3MWE0MGQyfSNqc19zeXM6OnRyeV9pdGVyOjpoZjhhNWY2ZjNmMWNhNThkYn4XX19leHRlcm5yZWZfdGFibGVfYWxsb2N/NmNvcmU6OnNsaWNlOjptZW1jaHI6Om1lbWNocl9hbGlnbmVkOjpoYjk5YjA5OGI2OWE0NDU1OIABMWNvcmU6OnB0cjo6c3dhcF9ub25vdmVybGFwcGluZzo6aDZlYmI5ZGM1ZGNjMjMyODGBAUdjb3JlOjpmbXQ6Om51bTo6PGltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgdTMyPjo6Zm10OjpoZDE1ODQ0YmM1MTQ4OGY4NIIBSjxhbGxvYzo6c3RyaW5nOjpTdHJpbmcgYXMgY29yZTo6Zm10OjpXcml0ZT46OndyaXRlX2NoYXI6OmhmMzVlYjBkYzQ5MjkwYzBmgwFHY29yZTo6Zm10OjpudW06OjxpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIHU2ND46OmZtdDo6aDFlZDM0M2VlZWQwNzVlMjOEAU08YWxsb2M6OnN0cmluZzo6U3RyaW5nIGFzIGNvcmU6OmZtdDo6V3JpdGU+Ojp3cml0ZV9jaGFyOjpoZjM1ZWIwZGM0OTI5MGMwZlsxXYUBY2NvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxhbGxvYzo6dmVjOjpWZWM8Z3JpZF9yb3V0ZXI6Ondhc206OlNpbXBsaWZpZWRQY2JUcmFjZT4+OjpoMGY1MzMyMTYxNmM3ODI5OIYBUmNvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxzZXJkZV9jb3JlOjpwcml2YXRlOjpjb250ZW50OjpDb250ZW50Pjo6aDkzYTUzODY5ZWM3N2VlYTWHATQ8Y2hhciBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmhiZDRkYWJhOTIwOGJkNGI3iAFCY29yZTo6c2xpY2U6OnNvcnQ6OnVuc3RhYmxlOjpoZWFwc29ydDo6aGVhcHNvcnQ6OmhhODRmNGIxZWI2YjUwM2Q2iQE3Y29yZTo6cGFuaWNraW5nOjphc3NlcnRfZmFpbGVkX2lubmVyOjpoMDkyODY5MzRhMzEyZWNkZooBZmNvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxhbGxvYzo6dmVjOjpWZWM8Z3JpZF9yb3V0ZXI6Ondhc206OlNpbXBsZVJvdXRlQ29ubmVjdGlvbj4+OjpoN2JmMjI4MTlmOWU4MjY0MIsBbjxzdGQ6OnBhbmlja2luZzo6cGFuaWNfaGFuZGxlcjo6Rm9ybWF0U3RyaW5nUGF5bG9hZCBhcyBjb3JlOjpwYW5pYzo6UGFuaWNQYXlsb2FkPjo6dGFrZV9ib3g6Omg0NmY4ZjcyZmEyNWViZjEzjAGGATw8c2VyZGVfY29yZTo6ZGU6OldpdGhEZWNpbWFsUG9pbnQgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpMb29rRm9yRGVjaW1hbFBvaW50IGFzIGNvcmU6OmZtdDo6V3JpdGU+Ojp3cml0ZV9zdHI6OmhjYjZkMTgzOTljODE1NWJhjQEyc3RkOjpwYW5pY2tpbmc6OnBhbmljX3dpdGhfaG9vazo6aDUxYzVlZGVlYjQ4ZTY5ZDOOAT5hbGxvYzo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI8QT46OmZpbmlzaF9ncm93OjpoOTcwOTJmMTczNzYxMTk5NI8BPmFsbG9jOjpyYXdfdmVjOjpSYXdWZWNJbm5lcjxBPjo6ZmluaXNoX2dyb3c6Omg0ZDQzYjA5ZDUyMGY2NjQxkAFbY29yZTo6cHRyOjpkcm9wX2luX3BsYWNlPGFsbG9jOjp2ZWM6OlZlYzxncmlkX3JvdXRlcjo6d2FzbTo6Um91dGVQb2ludD4+OjpoZjYzYjYwZTgyMTJjNTVkZJEBUmNvcmU6OnNsaWNlOjpzb3J0OjpzaGFyZWQ6OnNtYWxsc29ydDo6aW5zZXJ0aW9uX3NvcnRfc2hpZnRfbGVmdDo6aDE0MTE1ZjEzMzAzNTAwZGWSAS1qc19zeXM6OlVpbnQ4QXJyYXk6OnRvX3ZlYzo6aDhjZmE3OTkwZmFlYzY0NWSTAT5hbGxvYzo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI8QT46OmZpbmlzaF9ncm93OjpoNGJiOTU5NmYxNTFhZDRlMZQBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDllMDhhZmE0YzM5YTAyZDWVAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgyYTI2MTdmZjFhMDY3ODU1lgFWPHNlcmRlX3dhc21fYmluZGdlbjo6ZXJyb3I6OkVycm9yIGFzIHNlcmRlX2NvcmU6OmRlOjpFcnJvcj46OmN1c3RvbTo6aGExNjAyZDMyNzE4Nzk4MWSXAThzZXJkZV93YXNtX2JpbmRnZW46OmVycm9yOjpFcnJvcjo6bmV3OjpoYjFiMDZjZGU2ZjVmZGI0OJgBUDxzZXJkZV9jb3JlOjpkZTo6V2l0aERlY2ltYWxQb2ludCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmgyMDMyZTJjY2UzZDJhMTk4mQFRYWxsb2M6OnJhd192ZWM6OlJhd1ZlY0lubmVyPEE+OjpyZXNlcnZlOjpkb19yZXNlcnZlX2FuZF9oYW5kbGU6Omg2ZmY1Yjc3ZmM4NmZmMjk4mgFBc2VyZGVfd2FzbV9iaW5kZ2VuOjpkZTo6RGVzZXJpYWxpemVyOjphc19ieXRlczo6aGVjNTc0Y2UyODg1YjY5ZDWbAU1jb3JlOjpmbXQ6Om51bTo6aW1wOjo8aW1wbCBjb3JlOjpmbXQ6OkRpc3BsYXkgZm9yIHU4Pjo6Zm10OjpoYWIyYTgxYjVhNjdiNjk5MJwBFl9fZXh0ZXJucmVmX2Ryb3Bfc2xpY2WdAVFhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI8QT46OnJlc2VydmU6OmRvX3Jlc2VydmVfYW5kX2hhbmRsZTo6aDUxMGFhNDljYmI1MzExOGSeAUFhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI8QT46Omdyb3dfYW1vcnRpemVkOjpoYjlmYTEwMWQ3NGM1NDExYp8BaTxzdGQ6OnBhbmlja2luZzo6cGFuaWNfaGFuZGxlcjo6Rm9ybWF0U3RyaW5nUGF5bG9hZCBhcyBjb3JlOjpwYW5pYzo6UGFuaWNQYXlsb2FkPjo6Z2V0OjpoZDU1MTcwNTJmMzZjYzM4MaABMjxjaGFyIGFzIGNvcmU6OmZtdDo6RGVidWc+OjpmbXQ6OmhhMGMyMGI0ODlmNmZlMGE1oQFAY29yZTo6c2xpY2U6OnNvcnQ6OnNoYXJlZDo6cGl2b3Q6Om1lZGlhbjNfcmVjOjpoODM5ZjgzMDI3OTRhNmYxY6IBUWFsbG9jOjpyYXdfdmVjOjpSYXdWZWNJbm5lcjxBPjo6cmVzZXJ2ZTo6ZG9fcmVzZXJ2ZV9hbmRfaGFuZGxlOjpoY2EzZWViMWYzYzc2YTMxOKMBUXN0ZDo6c3lzOjp0aHJlYWRfbG9jYWw6Om5vX3RocmVhZHM6OkxhenlTdG9yYWdlPFQ+Ojppbml0aWFsaXplOjpoYTY2N2FlMTRkZDkyNDk0MaQBPmFsbG9jOjpyYXdfdmVjOjpSYXdWZWNJbm5lcjxBPjo6ZmluaXNoX2dyb3c6Omg1MTVlMTBkNzFjNzVhZTBhpQFDPHdhc21fYmluZGdlbjo6SnNWYWx1ZSBhcyBjb3JlOjpmbXQ6OkRlYnVnPjo6Zm10OjpoZDIwZTA5OGU3Zjk3OTYxY6YBCF9fbXVsdGkzpwE9c3RkOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6Ont7Y2xvc3VyZX19OjpoZGY4ZDY1ODc5MGNjZWU0Y6gBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aGY0NTc3ODlmNWZkZDgzMjepARlfX2V4dGVybnJlZl90YWJsZV9kZWFsbG9jqgE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aGE0YmUwZjc2OTg0ZWZlMWarAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoMGZmYzM4MjdhMGE3MjZiZawBOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6OmhlNWEwNjY1MjFmYTRlMmQwrQE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aDQyZDAyZGVkZGI0ODg2MTWuAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoNmU1NzE3ODE3OGE0ZmI0Nq8BOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6Omg3YWI3MTFlODcyN2Q0ZmQ3sAE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aDBkMGE1MzFjY2Y0OTdkYzGxAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoMTMxZjdiZmY4ODUwYzU4NbIBOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6OmhiOTZmZTJmYmM3NjQxYTUxswE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aDA2YTYyMGVhZjIwZmMwZGK0AThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoODM1NGQyZTg0N2Y0Nzg2YrUBOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6OmhjNThlMGUyMGIwMjY1NmIxtgE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoOGU0ZDg0MzM4OWZkZWU1YbcBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDg3NjYyNTc4MzY5MDUxMTe4AThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoNWViNjNiNWY1ZGI0ZmUxZLkBSDxkbG1hbGxvYzo6c3lzOjpTeXN0ZW0gYXMgZGxtYWxsb2M6OkFsbG9jYXRvcj46OmFsbG9jOjpoYTUwNDZjMDE3ODU4NDA5NLoBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDFkYjZhYmNiYjQ4ZjMxMGW7AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgwZjcwZWNlOGQ1MzQ5YzlkvAE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoMTA3NjI4OWQzOTY1ZDBlNL0BPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDFmYjA5ODQ2M2JjM2QzNWW+AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgzYzEyNDUxMTRjNGFiNWZhvwE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoNDYwMDE5ZjA0MWVlMmZmY8ABPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aGE5NTcyYjQ4MDgxNTZlYmPBAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmhjNDhjMmYxNDA1MWVmNzg3wgEoX19ydXN0Y1s5ZTZhMDhlODllNGI5MTExXTo6X19yZGxfZGVhbGxvY8MBLmNvcmU6OnJlc3VsdDo6dW53cmFwX2ZhaWxlZDo6aDI4YmI5YWUzN2FjYTIyODfEAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6Omg2MzZlZGVmZjdmZmQ1MTk2xQEFcm91bmTGATZzZXJkZV9jb3JlOjpkZTo6RXJyb3I6OmludmFsaWRfdHlwZTo6aDdiMWU4MzBmMzNhNDAyNjbHATdzZXJkZV9jb3JlOjpkZTo6RXJyb3I6OmludmFsaWRfdmFsdWU6Omg3YWY0ZDBiY2ZiNzFjY2M3yAE2c2VyZGVfY29yZTo6ZGU6OkVycm9yOjppbnZhbGlkX3R5cGU6OmhmYjE0MDlhOGQ1ZmQ0YTM0yQE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoYmJhNDVlZjRkYzJjNjk0N8oBRzxhbGxvYzo6c3RyaW5nOjpTdHJpbmcgYXMgY29yZTo6Y2xvbmU6OkNsb25lPjo6Y2xvbmU6OmgxZjNkOWRhZDBhMzNjYzk5ywFOY29yZTo6Zm10OjpudW06OmltcDo6PGltcGwgY29yZTo6Zm10OjpEaXNwbGF5IGZvciBpNjQ+OjpmbXQ6OmhlNjg2YzJiODUxNjRlMmY5zAE3c3RkOjphbGxvYzo6ZGVmYXVsdF9hbGxvY19lcnJvcl9ob29rOjpoYmNlYzY1ZGJjYTNkNGNiNM0BNmNvcmU6OnBhbmlja2luZzo6cGFuaWNfYm91bmRzX2NoZWNrOjpoMmU0ZTBiZjE1ZmUyMGVkNs4BSmNvcmU6OnNsaWNlOjppbmRleDo6c2xpY2VfaW5kZXhfZmFpbDo6ZG9fcGFuaWM6OnJ1bnRpbWU6OmgxYWI4NWQzNWYxMDE0NDgyzwFKY29yZTo6c2xpY2U6OmluZGV4OjpzbGljZV9pbmRleF9mYWlsOjpkb19wYW5pYzo6cnVudGltZTo6aDhkMjI3Y2E4ZjU0YjU3OTPQAUpjb3JlOjpzbGljZTo6aW5kZXg6OnNsaWNlX2luZGV4X2ZhaWw6OmRvX3BhbmljOjpydW50aW1lOjpoMDY1YmE0OGY1OWRmYTM0ZNEBFHJvdXRlU2ltcGxlUm91dGVKc29u0gFFc3RkOjpzeXM6OnJhbmRvbTo6dW5zdXBwb3J0ZWQ6Omhhc2htYXBfcmFuZG9tX2tleXM6OmhjZjcxNTFiM2RkY2Q1ZjA40wFJPGFsbG9jOjpzdHJpbmc6OlN0cmluZyBhcyBjb3JlOjpmbXQ6OldyaXRlPjo6d3JpdGVfc3RyOjpoNWUyMTQ2YzU5ODY3MDA4MNQBBm1lbWNtcNUBNndhc21fYmluZGdlbjo6X193YmluZGdlbl9zdHJpbmdfZ2V0OjpoOWFmNTUzNjk2YmE2Zjk4ONYBTDxhbGxvYzo6c3RyaW5nOjpTdHJpbmcgYXMgY29yZTo6Zm10OjpXcml0ZT46OndyaXRlX3N0cjo6aDVlMjE0NmM1OTg2NzAwODBbMV3XAVA8c2VyZGVfd2FzbV9iaW5kZ2VuOjplcnJvcjo6RXJyb3IgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoZjU2ZmRmMmNlYjQzNGZmOdgBN3NlcmRlX2NvcmU6OmRlOjpFcnJvcjo6bWlzc2luZ19maWVsZDo6aGQzMTgxY2YwYWNjZWU1NmTZATlzZXJkZV9jb3JlOjpkZTo6RXJyb3I6OmR1cGxpY2F0ZV9maWVsZDo6aDVjMTc4ODc0YWMyYmEzZGHaAThzdGQ6OnBhbmlja2luZzo6cGFuaWNfY291bnQ6OmluY3JlYXNlOjpoNGU3MmQ4OGQxZWQ5ZjYyNdsBTmNvcmU6OmZtdDo6bnVtOjppbXA6OjxpbXBsIGNvcmU6OmZtdDo6RGlzcGxheSBmb3IgdTMyPjo6Zm10OjpoNjVkZTY2NTg2Y2RiZThiNtwBTmNvcmU6OmZtdDo6bnVtOjppbXA6OjxpbXBsIGNvcmU6OmZtdDo6RGlzcGxheSBmb3IgdTY0Pjo6Zm10OjpoYjJmZDg2M2Q2NWU5MTA0Md0BNndhc21fYmluZGdlbjo6X193YmluZGdlbl9udW1iZXJfZ2V0OjpoNGY1ZWQxN2U0ZGY1NTkxNN4BPXdhc21fYmluZGdlbjo6X193YmluZGdlbl9iaWdpbnRfZ2V0X2FzX2k2NDo6aGY5ODFlNDQxZjEyOGFlNDjfAUtjb3JlOjpmbXQ6OmZsb2F0Ojo8aW1wbCBjb3JlOjpmbXQ6OkRpc3BsYXkgZm9yIGY2ND46OmZtdDo6aGM4MzRlMmRiYjlkMWFkYzbgAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoNGRmZmY0MjJlNzZhN2QxM+EBOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6Omg3NWEwZTNhYjExN2YzNzM04gFrPHN0ZDo6cGFuaWNraW5nOjpwYW5pY19oYW5kbGVyOjpTdGF0aWNTdHJQYXlsb2FkIGFzIGNvcmU6OnBhbmljOjpQYW5pY1BheWxvYWQ+Ojp0YWtlX2JveDo6aDNiNTJkMTdjMzk4NmJjZjLjATdjb3JlOjpzbGljZTo6aW5kZXg6OnNsaWNlX2luZGV4X2ZhaWw6Omg5YjcyMmVjMjIwZDllYjcx5AEtY29yZTo6cGFuaWNraW5nOjpwYW5pY19mbXQ6Omg4MDZlNjQ3NzE1OTkwMTM45QFiPHN0ZDo6cGFuaWNraW5nOjpwYW5pY19oYW5kbGVyOjpGb3JtYXRTdHJpbmdQYXlsb2FkIGFzIGNvcmU6OmZtdDo6RGlzcGxheT46OmZtdDo6aDg1ZTUwMDQ3MTU2NThmNzLmAUNjb3JlOjpmbXQ6OkZvcm1hdHRlcjo6cGFkX2ludGVncmFsOjp3cml0ZV9wcmVmaXg6Omg4MmQyMDgzY2M4MTUzZjVm5wExY29yZTo6cGFuaWNraW5nOjphc3NlcnRfZmFpbGVkOjpoZjExYTFkOGUzN2IwN2Q1MegBMWNvcmU6OnBhbmlja2luZzo6YXNzZXJ0X2ZhaWxlZDo6aDU5NGM2M2VmYTVhMTZjOGbpAU1oYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6Ont7Y2xvc3VyZX19OjpoZTliYzgxMWQ1NzkzYTdkNuoBTWhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6e3tjbG9zdXJlfX06OmgwOGFkM2NmZDNlN2QzNTU46wFNaGFzaGJyb3duOjpyYXc6OlJhd1RhYmxlPFQsQT46OnJlc2VydmVfcmVoYXNoOjp7e2Nsb3N1cmV9fTo6aDNmM2UyN2IxNTNhZjhjZmXsAU1oYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6Ont7Y2xvc3VyZX19OjpoNGFkMGU2ZjE2N2ZmNTFhZe0BGl9fd2JpbmRnZW5fZGVzdHJveV9jbG9zdXJl7gFKPGNvcmU6Om9wczo6cmFuZ2U6OlJhbmdlPElkeD4gYXMgY29yZTo6Zm10OjpEZWJ1Zz46OmZtdDo6aDdmNWIyYWY2ZThlMmNiZWHvATdzZXJkZV93YXNtX2JpbmRnZW46OmRlOjpjb252ZXJ0X3BhaXI6Omg2MTRiMzRhYjFkNzE5OTA18AFIY29yZTo6Y2VsbDo6cGFuaWNfYWxyZWFkeV9ib3Jyb3dlZDo6ZG9fcGFuaWM6OnJ1bnRpbWU6Omg0MTBkNDA4M2IxMGU3MGZi8QFNaGFzaGJyb3duOjpyYXc6OlJhd1RhYmxlPFQsQT46OnJlc2VydmVfcmVoYXNoOjp7e2Nsb3N1cmV9fTo6aDA5ZjAwZjc2ZjNkMTM1YmPyAUNzZXJkZV93YXNtX2JpbmRnZW46OmRlOjpEZXNlcmlhbGl6ZXI6OmlzX251bGxpc2g6Omg3ZjYzZDVkMWY4NzRkZTBh8wFKc2VyZGVfd2FzbV9iaW5kZ2VuOjpkZTo6RGVzZXJpYWxpemVyOjphc19vYmplY3RfZW50cmllczo6aGY1ODc2NWI0NTlhNDc2YTf0ASxfX3J1c3RjWzllNmEwOGU4OWU0YjkxMTFdOjpydXN0X2JlZ2luX3Vud2luZPUBM3JvdXRlU2ltcGxlUm91dGVKc29uIGV4dGVybnJlZiBzaGltIG11bHRpdmFsdWUgc2hpbfYBV3NlcmRlOjpwcml2YXRlOjpkZTo6Y29udGVudDo6Q29udGVudFJlZkRlc2VyaWFsaXplcjxFPjo6aW52YWxpZF90eXBlOjpoNGU4OWU2NjEyYzA5ZTY4ZfcBEV9fd2JpbmRnZW5fbWFsbG9j+AFIc2VyZGVfd2FzbV9iaW5kZ2VuOjpkZTo6RGVzZXJpYWxpemVyOjphc19zYWZlX2ludGVnZXI6OmgxMGI1ZDBjMmMyY2YyYTMw+QE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoYTE3NzdhYWQwN2RkNGExY/oBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDI1MjgyYmZhYmM1NzgxNGP7AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgyZDgyNGYwNjczMTIwYTFl/AE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoMzc5N2FlNDUyZmJiNTZhY/0BPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDQ0ZmU5YmE2ZWYyODVhYzj+AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6Omg1Y2MzMjU2YTE1YjZmMTNh/wE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoNjRhNWY4OTE1MDE5NDU5ZIACPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDY3MTMxMWUxMmVkMjcwZjCBAj13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmhhYTE2YzExZDVmYWRlMjU2ggISX193YmluZGdlbl9yZWFsbG9jgwInc3RkOjphbGxvYzo6cnVzdF9vb206OmgyZDcwODY3YTAxMmNhOGI4hAI9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoNjMwMDA4NTIxNjYzYmE5ZYUCPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDc0NWI1MWZiY2M3Y2JmZjKGAj13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgwNzRmNTljZmIyZWE1NjI5hwJfY29yZTo6cHRyOjpkcm9wX2luX3BsYWNlPHN0ZDo6cGFuaWNraW5nOjpwYW5pY19oYW5kbGVyOjpGb3JtYXRTdHJpbmdQYXlsb2FkPjo6aDk2OWM4OWE3ZWQ0NTliNTSIAjloYXNoYnJvd246OnJhdzo6RmFsbGliaWxpdHk6OmFsbG9jX2Vycjo6aGJhMjdkZmNhMmJiZTIxYjiJAjQ8Ym9vbCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmgwZDExZDk3Nzk5ZDVjZjIzigKHATw8c2VyZGVfY29yZTo6ZGU6OldpdGhEZWNpbWFsUG9pbnQgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpMb29rRm9yRGVjaW1hbFBvaW50IGFzIGNvcmU6OmZtdDo6V3JpdGU+Ojp3cml0ZV9jaGFyOjpoN2ViOTE1NDE3MGIyOGFlMYsCNHN0ZDo6YWxsb2M6OnJ1c3Rfb29tOjp7e2Nsb3N1cmV9fTo6aDY3ODE5MWE4ZTA5YzI1ZTKMAkFoYXNoYnJvd246OnJhdzo6RmFsbGliaWxpdHk6OmNhcGFjaXR5X292ZXJmbG93OjpoOWMwZjkzMDJiZDM5YWZmYY0CI3JvdXRlU2ltcGxlUm91dGVKc29uIGV4dGVybnJlZiBzaGltjgJnPCZzZXJkZV93YXNtX2JpbmRnZW46OnNlcjo6U2VyaWFsaXplciBhcyBzZXJkZV9jb3JlOjpzZXI6OlNlcmlhbGl6ZXI+OjpzZXJpYWxpemVfc2VxOjpoMzk3M2Y0YTE3YjMyMDQxNY8CN3dhc21fYmluZGdlbjo6X193YmluZGdlbl9ib29sZWFuX2dldDo6aDdjYjk0MWZmNTRjOTE1NjSQAiZfX3J1c3RjWzllNmEwOGU4OWU0YjkxMTFdOjpfX3JkbF9hbGxvY5ECVmNvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxjb3JlOjpvcHRpb246Ok9wdGlvbjxhbGxvYzo6dmVjOjpWZWM8dTg+Pj46OmhiYmI0YTRjZTVhYTA5Y2ExkgJCY29yZTo6cHRyOjpkcm9wX2luX3BsYWNlPGFsbG9jOjpzdHJpbmc6OlN0cmluZz46OmhiMTU2ODc5OTQ2MzU0MDllkwJCY29yZTo6cHRyOjpkcm9wX2luX3BsYWNlPGFsbG9jOjpzdHJpbmc6OlN0cmluZz46Omg0MzMzMWIzODI0MGY5NDI5lAIEZm1heJUCenNlcmRlX3dhc21fYmluZGdlbjo6T2JqZWN0RXh0OjpnZXRfd2l0aF9yZWZfa2V5OjpfX3diZ19nZXRfd2l0aF9yZWZfa2V5XzY0MTJjZjMwOTQ1OTk2OTQ6OmhlYWMxN2Q4NjQzNWFkYzljIGV4dGVybnJlZiBzaGltlgJgc2VyZGVfd2FzbV9iaW5kZ2VuOjpPYmplY3RFeHQ6OnNldDo6X193Ymdfc2V0XzZiZTQyNzY4YzY5MGUzODA6OmhmYzcwYzEwNDU4NDU4NTQ2IGV4dGVybnJlZiBzaGltlwJZanNfc3lzOjpSZWZsZWN0OjpnZXRfc3ltYm9sOjpfX3diZ19nZXRfOWNmZWE5YjdiYmYxMmExNTo6aGI4YzE0NWVmMTgzZjUwZDEgZXh0ZXJucmVmIHNoaW2YAllqc19zeXM6OkZ1bmN0aW9uPEY+OjpjYWxsMDo6X193YmdfY2FsbF9hZGQ5ZTVhNzYzODJlNjY4OjpoM2IwNjY3ZTM2OGIzMWIzYiBleHRlcm5yZWYgc2hpbZkCMTxUIGFzIGNvcmU6OmFueTo6QW55Pjo6dHlwZV9pZDo6aDdmMzBmYjc3YmMwNWU5MjeaAjE8VCBhcyBjb3JlOjphbnk6OkFueT46OnR5cGVfaWQ6OmhhNjZmMmZmNWM4OThhOTk2mwIvYWxsb2M6OnJhd192ZWM6OmhhbmRsZV9lcnJvcjo6aDFlMTI5ZWE1OTMyZDhhYTicAkNjb3JlOjphbGxvYzo6bGF5b3V0OjpMYXlvdXQ6OmlzX3NpemVfYWxpZ25fdmFsaWQ6OmhkNzRlMzJhMjgxNGEyZDI2nQJnanNfc3lzOjpBcnJheTxUPjo6Z2V0X3VuY2hlY2tlZDo6X193YmdfZ2V0X3VuY2hlY2tlZF9iZTU2MmIxNDIxNjU2MzIxOjpoM2NlNTc1OGIwNmQwZTNiYyBleHRlcm5yZWYgc2hpbZ4CU2pzX3N5czo6QXJyYXk8VD46OmdldDo6X193YmdfZ2V0XzY1MmY2NDBiM2IwYjZlM2U6Omg4MWU3YzQ4MDgyMDM2MWI3IGV4dGVybnJlZiBzaGltnwIpY29yZTo6cGFuaWNraW5nOjpwYW5pYzo6aDRiMzQyOTg2NTA4MDRmM2agAkQ8Y29yZTo6Zm10OjpBcmd1bWVudHMgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoMTIwMDFkNDVmMmM0Njg0OKECWGpzX3N5czo6SXRlcmF0b3I8VD46Om5leHQ6Ol9fd2JnX25leHRfYWFjZWUzMTBiY2ZlNjQ2MTo6aGZiMGRlM2ZmZTAyMTA3OGMgZXh0ZXJucmVmIHNoaW2iAl5qc19zeXM6Okl0ZXJhdG9yTmV4dDxUPjo6dmFsdWU6Ol9fd2JnX3ZhbHVlX2Y4NTI3MTZhY2RlYjNlODI6Omg0MTY4Y2M4NmE3ZmQ3ZTBiIGV4dGVybnJlZiBzaGltowJVanNfc3lzOjpVaW50OEFycmF5OjpuZXc6Ol9fd2JnX25ld184NDU0ZWVlNjcyYjJiYTZlOjpoMjcwZjExNWUyYzY2OTdiYyBleHRlcm5yZWYgc2hpbaQCWWpzX3N5czo6T2JqZWN0OjplbnRyaWVzOjpfX3diZ19lbnRyaWVzX2JiOTg0M2JhNzNkYzcwZDY6OmgxMGMwZTdkYjllN2I5MjIyIGV4dGVybnJlZiBzaGltpQJ5anNfc3lzOjpJdGVyYXRvcjo6bG9va3NfbGlrZV9pdGVyYXRvcjo6TWF5YmVJdGVyYXRvcjo6bmV4dDo6X193YmdfbmV4dF8yNjFjM2M0OGM2ZTMwOWE1OjpoM2VlMjU5Mjk1YWUxZjk4OCBleHRlcm5yZWYgc2hpbaYCYndhc21fYmluZGdlbjo6X193YmluZGdlbl9lcnJvcl9uZXc6Ol9fd2JnX0Vycm9yXzM2MzlhNjBlZDE1Zjg3ZTc6OmgxMjlkM2VjOTgzODA0YjVjIGV4dGVybnJlZiBzaGltpwInUmVmKFN0cmluZykgLT4gRXh0ZXJucmVmIGV4dGVybnJlZiBzaGltqAJnPCZzZXJkZV93YXNtX2JpbmRnZW46OnNlcjo6U2VyaWFsaXplciBhcyBzZXJkZV9jb3JlOjpzZXI6OlNlcmlhbGl6ZXI+OjpzZXJpYWxpemVfc3RyOjpoMWUwZDZiMjczMzlhOWNjZakCMmNvcmU6OmZtdDo6Rm9ybWF0dGVyOjp3cml0ZV9zdHI6Omg2MTcxZThiYThmYTIxMzY2qgJTanNfc3lzOjpBcnJheTxUPjo6c2V0OjpfX3diZ19zZXRfZjYxNGY2YTA2MDhkMWQxZDo6aDg1ZDgxYmNhMTE1YjYzYTUgZXh0ZXJucmVmIHNoaW2rAh9GNjQgLT4gRXh0ZXJucmVmIGV4dGVybnJlZiBzaGltrAIfSTY0IC0+IEV4dGVybnJlZiBleHRlcm5yZWYgc2hpba0CH1U2NCAtPiBFeHRlcm5yZWYgZXh0ZXJucmVmIHNoaW2uAmc8JnNlcmRlX3dhc21fYmluZGdlbjo6c2VyOjpTZXJpYWxpemVyIGFzIHNlcmRlX2NvcmU6OnNlcjo6U2VyaWFsaXplcj46OnNlcmlhbGl6ZV9mNjQ6OmhjOTY0YTJmYWE2ZDRmOWE1rwIud2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2luOjpoNzcyMGRmNDM5ZDE4NThkMbACNHdhc21fYmluZGdlbjo6X193YmluZGdlbl9qc3ZhbF9lcTo6aDY1NzA1ZmMzMjVmM2VlMjOxAjp3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fanN2YWxfbG9vc2VfZXE6Omg5ODdmMWI0Y2FmMWU2ZGQxsgIuY29yZTo6c3RyOjpzbGljZV9lcnJvcl9mYWlsOjpoMjFiMDJjZTM3NDViNWMyYrMCMDwmVCBhcyBjb3JlOjpmbXQ6OkRlYnVnPjo6Zm10OjpoMWY4YzQ0N2NjNWZkZGJkMrQCSTxjb3JlOjpmbXQ6OkZvcm1hdHRlciBhcyBjb3JlOjpmbXQ6OldyaXRlPjo6d3JpdGVfY2hhcjo6aDYxYzI1YzU2M2U4NmI1MDG1AlBqc19zeXM6OkFycmF5OjpuZXc6Ol9fd2JnX25ld18zYmFhOGQ5ODY2MTU1Yzc5OjpoNDNjMDQ4MjY0NjgzNmIxZSBleHRlcm5yZWYgc2hpbbYCUWpzX3N5czo6T2JqZWN0OjpuZXc6Ol9fd2JnX25ld18yZmFkOGNhMDJmZDAwNjg0OjpoM2E2ZmJiM2Y4MDkxZmE3NiBleHRlcm5yZWYgc2hpbbcCW2pzX3N5czo6U3ltYm9sOjppdGVyYXRvcjo6X193YmdfaXRlcmF0b3JfOWQ2ODk4NWExZDA5NmZjMjo6aGRhZGRhYTc3NDJmYmZmMDUgZXh0ZXJucmVmIHNoaW24AjI8JlQgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoODg5ZDg1OGE0ODE4ZjZlMrkCMjwmVCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmhhOTMzODg5NzNkOWFjYjU2ugJFPGFsbG9jOjpzdHJpbmc6OlN0cmluZyBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmhiNzU4OTMzYzczZDY5OGQ5uwIpX19ydXN0Y1s5ZTZhMDhlODllNGI5MTExXTo6X19ydXN0X3JlYWxsb2O8AjI8JlQgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoYTM0MzQxMTJlMzUwNWM2Nr0Cajwmc2VyZGVfd2FzbV9iaW5kZ2VuOjpzZXI6OlNlcmlhbGl6ZXIgYXMgc2VyZGVfY29yZTo6c2VyOjpTZXJpYWxpemVyPjo6c2VyaWFsaXplX3N0cnVjdDo6aDRmMTQ4OWZhOGZjZWI0ZGS+Akg8YWxsb2M6OnN0cmluZzo6U3RyaW5nIGFzIGNvcmU6OmZtdDo6RGlzcGxheT46OmZtdDo6aGI3NTg5MzNjNzNkNjk4ZDlbMV2/AhRfX3diaW5kZ2VuX2V4bl9zdG9yZcACMDwmVCBhcyBjb3JlOjpmbXQ6OkRlYnVnPjo6Zm10OjpoY2NmYjYxMjcyZDg1MzQ4NcECXzxzdGQ6OnBhbmlja2luZzo6cGFuaWNfaGFuZGxlcjo6U3RhdGljU3RyUGF5bG9hZCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmgzOGIzMDViYWU1ZDVhZmI3wgJmPHN0ZDo6cGFuaWNraW5nOjpwYW5pY19oYW5kbGVyOjpTdGF0aWNTdHJQYXlsb2FkIGFzIGNvcmU6OnBhbmljOjpQYW5pY1BheWxvYWQ+OjpnZXQ6OmhhYjUzNDY3NzFhMTgyZjhhwwIyPCZUIGFzIGNvcmU6OmZtdDo6RGlzcGxheT46OmZtdDo6aGIyNDJiYThlMGE5OWU3ZWLEAhtfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWbFAilfX3J1c3RjWzllNmEwOGU4OWU0YjkxMTFdOjpfX3J1c3RfZGVhbGxvY8YCQnNlcmRlX3dhc21fYmluZGdlbjo6T2JqZWN0RXh0OjpnZXRfd2l0aF9yZWZfa2V5OjpoZjVlMGQ5ZDlhMjE1NDg5MccCNXNlcmRlX3dhc21fYmluZGdlbjo6T2JqZWN0RXh0OjpzZXQ6OmhjOTZhYjYyMGFiZjJkOGNhyAJianNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpVaW50OEFycmF5Pjo6aW5zdGFuY2VvZjo6aGJmMjMzNzBlZGRkZGM5MWHJAmNqc19zeXM6Ol86OjxpbXBsIHdhc21fYmluZGdlbjo6Y2FzdDo6SnNDYXN0IGZvciBqc19zeXM6OkFycmF5QnVmZmVyPjo6aW5zdGFuY2VvZjo6aGQ5ZWJiNGQzNDkyYzA2Y2PKAipqc19zeXM6OkFycmF5Ojppc19hcnJheTo6aGQ3Y2MxZTE3YTZiM2JhNmLLAjJqc19zeXM6Ok51bWJlcjo6aXNfc2FmZV9pbnRlZ2VyOjpoYjFhOTgxYWYxMjlmYjFjMMwCM3dhc21fYmluZGdlbjo6X193YmluZGdlbl9pc19udWxsOjpoOWVjZjE4N2RmMmU3NGE4Yc0CNXdhc21fYmluZGdlbjo6X193YmluZGdlbl9pc19iaWdpbnQ6OmgyZGI4OTU2ZWI3ZWEyMDQwzgI1d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX29iamVjdDo6aDk1OWY0MTA0NGUyMzJiZjDPAjd3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfZnVuY3Rpb246Omg2MzdhMjlhN2I3NzhlMjgw0AI4d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX3VuZGVmaW5lZDo6aDU5NjFiMGQ3ZWFlOGViNWXRAi5jb3JlOjpmbXQ6OldyaXRlOjp3cml0ZV9mbXQ6OmhkYmE2NDY4NTlkYmE5M2M30gJMPGR5biBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoMTc1ODdjZmNlN2E4YTg1Y9MCJV9fcnVzdGNbOWU2YTA4ZTg5ZTRiOTExMV06OnJ1c3RfcGFuaWPUAi5jb3JlOjpmbXQ6OldyaXRlOjp3cml0ZV9mbXQ6OmgyNzJmMTY5MTVjMDc4MGIw1QIuY29yZTo6Zm10OjpXcml0ZTo6d3JpdGVfZm10OjpoMTVlMjQyNDUxYjFhYTVkNtYCNGFsbG9jOjpyYXdfdmVjOjpjYXBhY2l0eV9vdmVyZmxvdzo6aGRkZTZjZGE1NzgzMmZmYzLXAjA8JlQgYXMgY29yZTo6Zm10OjpEZWJ1Zz46OmZtdDo6aDJjOTYzYzQyNWMwZDc0NTDYAkhjb3JlOjpwYW5pY2tpbmc6OnBhbmljX2NvbnN0OjpwYW5pY19jb25zdF9kaXZfYnlfemVybzo6aDU0YTU4ZGFhMWI4NWZjOGTZAi5jb3JlOjpvcHRpb246OnVud3JhcF9mYWlsZWQ6Omg4Y2JiNmFkYmFiOTliNWQz2gJPY29yZTo6c2xpY2U6OnNvcnQ6OnNoYXJlZDo6c21hbGxzb3J0OjpwYW5pY19vbl9vcmRfdmlvbGF0aW9uOjpoNGNkMmY0NWM5ZDAxZmFkYdsCbGpzX3N5czo6VWludDhBcnJheTo6Y29weV90b19zbGljZTo6X193YmdfcHJvdG90eXBlc2V0Y2FsbF9mZDQwNTBlODA2ZTFkNTE5OjpoMmFjMzgwMTlmYTQ1OTE1OCBleHRlcm5yZWYgc2hpbdwCY3dhc21fYmluZGdlbjo6X193YmluZGdlbl9pbjo6X193YmdfX193YmluZGdlbl9pbl8yNjE3ZmE3NjM5NzYyMGQzOjpoMTk1NTkwOTAwZTM3MzljNCBleHRlcm5yZWYgc2hpbd0Cb3dhc21fYmluZGdlbjo6X193YmluZGdlbl9qc3ZhbF9lcTo6X193YmdfX193YmluZGdlbl9qc3ZhbF9lcV80MDNlYWEzNjEwNTAwYTI1OjpoMjQwYmZhNTYyOTBkMDUxOSBleHRlcm5yZWYgc2hpbd4Ce3dhc21fYmluZGdlbjo6X193YmluZGdlbl9qc3ZhbF9sb29zZV9lcTo6X193YmdfX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcV8xOTc4ZjFlNzdiNGJjZTYyOjpoZGJhOGFiODk3NjcyMzZmNCBleHRlcm5yZWYgc2hpbd8CNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDE4YjQwYTY2YWQ4YjA3NmHgAjc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmgyOTdmZDY1YWEzNDE5YjQy4QI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoNTViMWMzOTg3Yjc4NTlhZuICNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDU4MDVhM2I3NWYxNjQ4YjPjAjc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6Omg2YmFkODBkM2ZiMzVjNWFm5AI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoNzQxNGYwM2UwNTU0OGQ2OOUCNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDdjODVhZTczOGNlZDRiMTbmAjc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmhiMWI0MTFhY2Q4NTFiMjU35wInX19ydXN0Y1s5ZTZhMDhlODllNGI5MTExXTo6X19ydXN0X2FsbG9j6AIqd2FzbV9iaW5kZ2VuOjp0aHJvd19zdHI6Omg4ZTY2YmRhMjM1NzBkZDM56QJmPHNlcmRlOjpwcml2YXRlOjpkZTo6Y29udGVudDo6Q29udGVudFZpc2l0b3IgYXMgc2VyZGVfY29yZTo6ZGU6OlZpc2l0b3I+OjpleHBlY3Rpbmc6OmhhN2M5MjM1MmUzOWUwMDNj6gKaATxzZXJkZV9jb3JlOjpkZTo6aW1wbHM6OjxpbXBsIHNlcmRlX2NvcmU6OmRlOjpEZXNlcmlhbGl6ZSBmb3IgdTg+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aDhmNTFhMTlkMDI0ZmQyZDnrApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciBmMzI+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aGIxOWRlN2ZmODI4MGUxZmLsApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciBmNjQ+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aDY1YWM2MmRiYjRlZTk5YjftApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciBpMzI+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aDE1MjlkN2Y5OTM3YmQ0ODDuApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciB1MzI+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aGY0Zjg3NjE3Mjg2NjYxMjDvAp0BPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciB1c2l6ZT46OmRlc2VyaWFsaXplOjpQcmltaXRpdmVWaXNpdG9yIGFzIHNlcmRlX2NvcmU6OmRlOjpWaXNpdG9yPjo6ZXhwZWN0aW5nOjpoZmQ5MjRiMWQ2Nzc1Zjk0M/ACXzxzZXJkZV9jb3JlOjpkZTo6aW1wbHM6OlN0cmluZ1Zpc2l0b3IgYXMgc2VyZGVfY29yZTo6ZGU6OlZpc2l0b3I+OjpleHBlY3Rpbmc6OmgwMTMyMWMwMzE2OTVjNmJl8QI1X19ydXN0Y1s5ZTZhMDhlODllNGI5MTExXTo6X19ydXN0X2FsbG9jX2Vycm9yX2hhbmRsZXLyAmk8c3RkOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6OlN0YXRpY1N0clBheWxvYWQgYXMgY29yZTo6cGFuaWM6OlBhbmljUGF5bG9hZD46OmFzX3N0cjo6aGNhOWQ3Y2U4MThjY2JlZjnzAjNhbGxvYzo6YWxsb2M6OmhhbmRsZV9hbGxvY19lcnJvcjo6aDdhYjFhM2RlZDA1ZWM3NzH0Aj48Y29yZTo6Zm10OjpFcnJvciBhcyBjb3JlOjpmbXQ6OkRlYnVnPjo6Zm10OjpoYTQzZjQzYjIzZDk4MGZmMvUCMDwmVCBhcyBjb3JlOjpmbXQ6OkRlYnVnPjo6Zm10OjpoZTYxMDA1ODgyZjFiYzZkY/YCMzxzdHIgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoMWFjYmM1ZGJmNmYyMWZiNfcCSjxjb3JlOjpjZWxsOjpCb3Jyb3dNdXRFcnJvciBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmhlYWNmOTFiMTQxOWIzNjZh+AKJATxzZXJkZV93YXNtX2JpbmRnZW46OmVycm9yOjpFcnJvciBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OnRvX3N0cmluZzo6X193YmdfU3RyaW5nXzg1NjRlNTU5Nzk5ZWNjZGE6Omg5YjcxNmZjZjRhMTY2NDRmIGV4dGVybnJlZiBzaGlt+QJzd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX3N0cmluZ19nZXQ6Ol9fd2JnX19fd2JpbmRnZW5fc3RyaW5nX2dldF85NjU1OTIwNzNlNWQ4NDhjOjpoOTIzMjJhNTU5OTcyODE4MiBleHRlcm5yZWYgc2hpbfoCc3dhc21fYmluZGdlbjo6X193YmluZGdlbl9udW1iZXJfZ2V0OjpfX3diZ19fX3diaW5kZ2VuX251bWJlcl9nZXRfZGQ2ZDY5YTYwNzlmMjZmMTo6aGQ3ZDJiYmM5MzZmOThiY2YgZXh0ZXJucmVmIHNoaW37AoEBd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2JpZ2ludF9nZXRfYXNfaTY0OjpfX3diZ19fX3diaW5kZ2VuX2JpZ2ludF9nZXRfYXNfaTY0XzNhZjZkNGNhNzcxOTNhNGI6OmgxNmQzNmYyZWNkY2I4MWI4IGV4dGVybnJlZiBzaGlt/AJ3d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2RlYnVnX3N0cmluZzo6X193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfMDdjYjcyY2ZjYzk1MmUyYjo6aDI0YjBiYTc1OWM5N2VmZWEgZXh0ZXJucmVmIHNoaW39Ajc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmgxMGZkMjM2NDY4ZjcwODg2/gI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoMTM2Zjg3YjI1OGRlZjExMP8CNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDcwZGE0MDcxMjcyMmY0ZGOAAzc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6Omg3MmQyNGE5ODQyOTYyNTg5gQM3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoYWFiNjdhOTBkMTlmMDFjY4IDNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aGViMDdhYzU0ZTY2MmYzNTODAzc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmhmOWI4NWNjNTViNmI0N2JihAM3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoZmFhMjEyMTA0NTFkNDRkZIUDTTxqc19zeXM6OkpzU3RyaW5nIGFzIGNvcmU6OnN0cjo6dHJhaXRzOjpGcm9tU3RyPjo6ZnJvbV9zdHI6Omg4MGJiMjI5MzMzOTQ4NTZjhgMqanNfc3lzOjpVaW50OEFycmF5OjpuZXc6OmhjYmRhNGYyNjdmY2M3Y2RjhwMqanNfc3lzOjpPYmplY3Q6OmVudHJpZXM6OmhjZjBjNmMyOTljYTAxODA3iAMxd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX3Rocm93OjpoNzAwNGNkNDE4OTFlODdlNokDNXdhc21fYmluZGdlbjo6X193YmluZGdlbl9hc19udW1iZXI6OmhkYjc0YTRkZDc2MTBmOTJhigM1d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2Vycm9yX25ldzo6aDhmOTcwNjU4NTMzNTZmZTSLA0JzdGQ6OnN5czo6YmFja3RyYWNlOjpfX3J1c3RfZW5kX3Nob3J0X2JhY2t0cmFjZTo6aDg4MDIwY2NmNzZkMmQ2NjGMA0JzdGQ6OnN5czo6YmFja3RyYWNlOjpfX3J1c3RfZW5kX3Nob3J0X2JhY2t0cmFjZTo6aDhmYTY5MWUyM2JlOWExYWSNAzRjb3JlOjpwYW5pYzo6UGFuaWNQYXlsb2FkOjphc19zdHI6OmgwM2FkZmQ2NTg0YTY4ZGY4jgM1Y29yZTo6Y2VsbDo6cGFuaWNfYWxyZWFkeV9ib3Jyb3dlZDo6aGM4ODlhZmI1YjRlMGM4OTiPA5YBanNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpNYXA8SyxWPj46Omluc3RhbmNlb2Y6Ol9fd2JnX2luc3RhbmNlb2ZfTWFwXzEwZDRlZGY2MGZjZjkzMjc6OmgwYWUyMjIwODAxNzFlMTE5IGV4dGVybnJlZiBzaGltkANZanNfc3lzOjpBcnJheTxUPjo6bGVuZ3RoOjpfX3diZ19sZW5ndGhfMGE2Y2UwMTZkYzE0NjBiMDo6aGUzZWZlZmM0MGZkZmQ4NTggZXh0ZXJucmVmIHNoaW2RA1xqc19zeXM6Okl0ZXJhdG9yTmV4dDxUPjo6ZG9uZTo6X193YmdfZG9uZV9iMWFmZDYyMDFhYzA0NWUwOjpoNmQ4ODYxNmVjYTVjYzJkMSBleHRlcm5yZWYgc2hpbZIDW2pzX3N5czo6VWludDhBcnJheTo6bGVuZ3RoOjpfX3diZ19sZW5ndGhfYmEzYzAzMjYwMmVmZTMxMDo6aDQ0ZDhjMTA1MzdjZmZhZjkgZXh0ZXJucmVmIHNoaW2TA58BanNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpVaW50OEFycmF5Pjo6aW5zdGFuY2VvZjo6X193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzU3ZDc3YWNkNTBlNGM0NGQ6OmgzNGEzMDM0ZjMwNTk3YjE0IGV4dGVybnJlZiBzaGltlAOhAWpzX3N5czo6Xzo6PGltcGwgd2FzbV9iaW5kZ2VuOjpjYXN0OjpKc0Nhc3QgZm9yIGpzX3N5czo6QXJyYXlCdWZmZXI+OjppbnN0YW5jZW9mOjpfX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyX2VhYjlmMjhmYmVjMjM0Nzc6OmhmZjcyYWYzY2Q2ZjE5ZGZkIGV4dGVybnJlZiBzaGltlQNZanNfc3lzOjpBcnJheTo6aXNfYXJyYXk6Ol9fd2JnX2lzQXJyYXlfYzZjNmVmODMwODk5NWJjZjo6aGRkZmYyM2U5OWVkNDk0NjggZXh0ZXJucmVmIHNoaW2WA2dqc19zeXM6Ok51bWJlcjo6aXNfc2FmZV9pbnRlZ2VyOjpfX3diZ19pc1NhZmVJbnRlZ2VyXzNjNTZjNDIxYTViNGNjZTQ6OmhiOTk2YjYzNzIzNDJmOTYwIGV4dGVybnJlZiBzaGltlwNtd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX251bGw6Ol9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF8wNjYwODZiZTNhYmU5YmIzOjpoOGNiYmE5OGIyNGU2ZjI2OCBleHRlcm5yZWYgc2hpbZgDY3dhc21fYmluZGdlbjo6X193YmluZGdlbl9hc19udW1iZXI6Ol9fd2JnX051bWJlcl9hM2Q3MzdmZDE4M2Y3ZGNhOjpoZjViMzkzNWU5MTM0MTlkNiBleHRlcm5yZWYgc2hpbZkDcXdhc21fYmluZGdlbjo6X193YmluZGdlbl9pc19iaWdpbnQ6Ol9fd2JnX19fd2JpbmRnZW5faXNfYmlnaW50X2Q2YTgxNjdjYWM0MDFiOTU6OmhmMzAwMWMyYTlmN2EyZTNjIGV4dGVybnJlZiBzaGltmgNxd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX29iamVjdDo6X193YmdfX193YmluZGdlbl9pc19vYmplY3RfNWIyMmZmMjQxODA2M2E5Yzo6aGVlMmYwM2Q2MjU3YjhjMDYgZXh0ZXJucmVmIHNoaW2bA3V3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fYm9vbGVhbl9nZXQ6Ol9fd2JnX19fd2JpbmRnZW5fYm9vbGVhbl9nZXRfYzNkZDVjMzlmMWI1YTEyYjo6aDQ2M2VlMzVjMTVjMGRjZGEgZXh0ZXJucmVmIHNoaW2cA3V3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfZnVuY3Rpb246Ol9fd2JnX19fd2JpbmRnZW5faXNfZnVuY3Rpb25fMmYwZmQ3Y2ViODZlNjRjNTo6aDhmOTEwNjc4MDFkMWU0Y2YgZXh0ZXJucmVmIHNoaW2dA3d3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfdW5kZWZpbmVkOjpfX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF8yNDRhOTJjMzRkM2I2ZWMwOjpoNjgzODUyZjg5ZjUwY2EwZSBleHRlcm5yZWYgc2hpbZ4DRV9fcnVzdGNbOWU2YTA4ZTg5ZTRiOTExMV06Ol9fcnVzdF9hbGxvY19lcnJvcl9oYW5kbGVyX3Nob3VsZF9wYW5pY192Mp8DLV9fcnVzdGNbOWU2YTA4ZTg5ZTRiOTExMV06Ol9fcnVzdF9zdGFydF9wYW5pY6ADPl9fcnVzdGNbOWU2YTA4ZTg5ZTRiOTExMV06Ol9fcnVzdF9ub19hbGxvY19zaGltX2lzX3Vuc3RhYmxlX3YyoQMlanNfc3lzOjpBcnJheTo6bmV3OjpoZWE2NjhkZjZjYzE1ZDE2MqIDJmpzX3N5czo6T2JqZWN0OjpuZXc6Omg0YjRhYjBhOGI2MjRhNGQ2owMranNfc3lzOjpTeW1ib2w6Oml0ZXJhdG9yOjpoM2IzNTc4ZjZmMzAyMWYwMqQDJ19fcnVzdGNbOWU2YTA4ZTg5ZTRiOTExMV06Ol9fcnVzdF9hYm9ydAUYAQEVX193YmluZGdlbl9leHRlcm5yZWZzBxIBAA9fX3N0YWNrX3BvaW50ZXIJEQIABy5yb2RhdGEBBS5kYXRhAHAJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkzLjEgKDAxZjZkZGY3NSAyMDI2LTAyLTExKQZ3YWxydXMGMC4yNi4xDHdhc20tYmluZGdlbgcwLjIuMTIwAJQBD3RhcmdldF9mZWF0dXJlcwgrC2J1bGstbWVtb3J5Kw9idWxrLW1lbW9yeS1vcHQrFmNhbGwtaW5kaXJlY3Qtb3ZlcmxvbmcrCm11bHRpdmFsdWUrD211dGFibGUtZ2xvYmFscysTbm9udHJhcHBpbmctZnB0b2ludCsPcmVmZXJlbmNlLXR5cGVzKwhzaWduLWV4dA==";function decodeWasmBase64(base64){if(typeof Buffer<"u")return new Uint8Array(Buffer.from(base64,"base64"));let binary=atob(base64),bytes=new Uint8Array(binary.length);for(let i3=0;i3<binary.length;i3+=1)bytes[i3]=binary.charCodeAt(i3);return bytes}var wasmModule=new WebAssembly.Module(decodeWasmBase64(wasmBase64)),wasmInstance=new WebAssembly.Instance(wasmModule,__wbg_get_imports()),wasm=wasmInstance.exports;wasm.__wbindgen_start()}});var require_s_expression=__commonJS({"node_modules/s-expression/index.js"(exports,module){"use strict";function SParser(stream){this._line=this._col=this._pos=0,this._stream=stream}SParser.not_whitespace_or_end=/^(\S|$)/;SParser.space_quote_paren_escaped_or_end=/^(\s|\\|"|'|`|,|\(|\)|$)/;SParser.string_or_escaped_or_end=/^(\\|"|$)/;SParser.string_delimiters=/["]/;SParser.quotes=/['`,]/;SParser.quotes_map={"'":"quote","`":"quasiquote",",":"unquote"};SParser.prototype={peek,consume,until,error:error2,string,atom,quoted,expr,list};module.exports=function SParse(stream){var parser=new SParse.Parser(stream),expression=parser.expr();return expression instanceof Error?expression:parser.peek()!=""?parser.error("Superfluous characters after expression: `"+parser.peek()+"`"):expression};module.exports.Parser=SParser;module.exports.SyntaxError=Error;function error2(msg){var e5=new Error("Syntax error: "+msg);return e5.line=this._line+1,e5.col=this._col+1,e5}function peek(){return this._stream.length==this._pos?"":this._stream[this._pos]}function consume(){if(this._stream.length==this._pos)return"";var c4=this._stream[this._pos];return this._pos+=1,c4=="\r"?(this.peek()==`
|
|
300
|
+
${val.stack}`:className}function getArrayU8FromWasm0(ptr,len){return ptr=ptr>>>0,getUint8ArrayMemory0().subarray(ptr/1,ptr/1+len)}var cachedDataViewMemory0=null;function getDataViewMemory0(){return(cachedDataViewMemory0===null||cachedDataViewMemory0.buffer.detached===!0||cachedDataViewMemory0.buffer.detached===void 0&&cachedDataViewMemory0.buffer!==wasm.memory.buffer)&&(cachedDataViewMemory0=new DataView(wasm.memory.buffer)),cachedDataViewMemory0}function getStringFromWasm0(ptr,len){return decodeText(ptr>>>0,len)}var cachedUint8ArrayMemory0=null;function getUint8ArrayMemory0(){return(cachedUint8ArrayMemory0===null||cachedUint8ArrayMemory0.byteLength===0)&&(cachedUint8ArrayMemory0=new Uint8Array(wasm.memory.buffer)),cachedUint8ArrayMemory0}function handleError(f3,args){try{return f3.apply(this,args)}catch(e5){let idx=addToExternrefTable0(e5);wasm.__wbindgen_exn_store(idx)}}function isLikeNone(x4){return x4==null}function passStringToWasm0(arg,malloc,realloc){if(realloc===void 0){let buf=cachedTextEncoder.encode(arg),ptr2=malloc(buf.length,1)>>>0;return getUint8ArrayMemory0().subarray(ptr2,ptr2+buf.length).set(buf),WASM_VECTOR_LEN=buf.length,ptr2}let len=arg.length,ptr=malloc(len,1)>>>0,mem=getUint8ArrayMemory0(),offset=0;for(;offset<len;offset++){let code=arg.charCodeAt(offset);if(code>127)break;mem[ptr+offset]=code}if(offset!==len){offset!==0&&(arg=arg.slice(offset)),ptr=realloc(ptr,len,len=offset+arg.length*3,1)>>>0;let view=getUint8ArrayMemory0().subarray(ptr+offset,ptr+len),ret=cachedTextEncoder.encodeInto(arg,view);offset+=ret.written,ptr=realloc(ptr,len,offset,1)>>>0}return WASM_VECTOR_LEN=offset,ptr}function takeFromExternrefTable0(idx){let value=wasm.__wbindgen_externrefs.get(idx);return wasm.__externref_table_dealloc(idx),value}var cachedTextDecoder=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});cachedTextDecoder.decode();function decodeText(ptr,len){return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr,ptr+len))}var cachedTextEncoder=new TextEncoder;"encodeInto"in cachedTextEncoder||(cachedTextEncoder.encodeInto=function(arg,view){let buf=cachedTextEncoder.encode(arg);return view.set(buf),{read:arg.length,written:buf.length}});var WASM_VECTOR_LEN=0,wasmBase64="AGFzbQEAAAABlQM8YAAAYAABf2AAAW9gAX8AYAF/AX9gAX8BfmABfwF8YAJ/fwBgAn9/AX9gAn9/AW9gA39/fwBgA39/fwF/YAN/f38BfmAEf39/fwBgBH9/f38Bf2AFf39/f38AYAV/f39/fwF/YAZ/f39/f38AYAZ/f39/f38Bf2AHf39/f39/fwBgCH9/f39/f39/AGAIf39/f39/f3wAYAl/f39/f39+fn4AYAZ/f39/f3wAYAZ/f39+f38AYAZ/f399f38AYAR/f398AGAGf39/fH9/AGAFf39+f38AYAR/f35+AGAFf399f38AYAN/f3wAYAV/f3x/fwBgA39/bwBgAn9+AGADf35/AGAEf35/fwBgA39+fgBgBX9+fn5+AGAEf31/fwBgBH98f38AYAR/fH9/AX9gAn9vAGADf29vAGABfgF/YAF+AW9gA35+fwF+YAF8AX9gAXwBfGABfAFvYAJ8fAF8YAFvAX9gAW8BfGABbwFvYAJvfwFvYANvf28AYAJvbwF/YAJvbwN/f39gAm9vAW9gA29vbwAC5BQuEy4vZ3JpZF9yb3V0ZXJfYmcuanMlX193YmdfaW5zdGFuY2VvZl9NYXBfMTBkNGVkZjYwZmNmOTMyNwAzEy4vZ3JpZF9yb3V0ZXJfYmcuanMdX193YmdfbGVuZ3RoXzBhNmNlMDE2ZGMxNDYwYjAAMxMuL2dyaWRfcm91dGVyX2JnLmpzJF9fd2JnX2dldF91bmNoZWNrZWRfYmU1NjJiMTQyMTY1NjMyMQA2Ey4vZ3JpZF9yb3V0ZXJfYmcuanMbX193YmdfbmV4dF9hYWNlZTMxMGJjZmU2NDYxADUTLi9ncmlkX3JvdXRlcl9iZy5qcxtfX3diZ19kb25lX2IxYWZkNjIwMWFjMDQ1ZTAAMxMuL2dyaWRfcm91dGVyX2JnLmpzHF9fd2JnX3ZhbHVlX2Y4NTI3MTZhY2RlYjNlODIANRMuL2dyaWRfcm91dGVyX2JnLmpzGl9fd2JnX3NldF9mNjE0ZjZhMDYwOGQxZDFkADcTLi9ncmlkX3JvdXRlcl9iZy5qcxpfX3diZ19nZXRfNjUyZjY0MGIzYjBiNmUzZQA2Ey4vZ3JpZF9yb3V0ZXJfYmcuanMnX193YmdfZ2V0X3dpdGhfcmVmX2tleV82NDEyY2YzMDk0NTk5Njk0ADoTLi9ncmlkX3JvdXRlcl9iZy5qcxpfX3diZ19zZXRfNmJlNDI3NjhjNjkwZTM4MAA7Ey4vZ3JpZF9yb3V0ZXJfYmcuanMdX193YmdfU3RyaW5nXzg1NjRlNTU5Nzk5ZWNjZGEAKhMuL2dyaWRfcm91dGVyX2JnLmpzGl9fd2JnX25ld18zYmFhOGQ5ODY2MTU1Yzc5AAITLi9ncmlkX3JvdXRlcl9iZy5qcxpfX3diZ19uZXdfMmZhZDhjYTAyZmQwMDY4NAACEy4vZ3JpZF9yb3V0ZXJfYmcuanMaX193YmdfbmV3Xzg0NTRlZWU2NzJiMmJhNmUANRMuL2dyaWRfcm91dGVyX2JnLmpzHV9fd2JnX2xlbmd0aF9iYTNjMDMyNjAyZWZlMzEwADMTLi9ncmlkX3JvdXRlcl9iZy5qcydfX3diZ19wcm90b3R5cGVzZXRjYWxsX2ZkNDA1MGU4MDZlMWQ1MTkAIRMuL2dyaWRfcm91dGVyX2JnLmpzLF9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV81N2Q3N2FjZDUwZTRjNDRkADMTLi9ncmlkX3JvdXRlcl9iZy5qcy1fX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyX2VhYjlmMjhmYmVjMjM0NzcAMxMuL2dyaWRfcm91dGVyX2JnLmpzHl9fd2JnX2lzQXJyYXlfYzZjNmVmODMwODk5NWJjZgAzEy4vZ3JpZF9yb3V0ZXJfYmcuanMkX193YmdfaXNTYWZlSW50ZWdlcl8zYzU2YzQyMWE1YjRjY2U0ADMTLi9ncmlkX3JvdXRlcl9iZy5qcx5fX3diZ19lbnRyaWVzX2JiOTg0M2JhNzNkYzcwZDYANRMuL2dyaWRfcm91dGVyX2JnLmpzH19fd2JnX2l0ZXJhdG9yXzlkNjg5ODVhMWQwOTZmYzIAAhMuL2dyaWRfcm91dGVyX2JnLmpzG19fd2JnX25leHRfMjYxYzNjNDhjNmUzMDlhNQA1Ey4vZ3JpZF9yb3V0ZXJfYmcuanMaX193YmdfZ2V0XzljZmVhOWI3YmJmMTJhMTUAOhMuL2dyaWRfcm91dGVyX2JnLmpzG19fd2JnX2NhbGxfYWRkOWU1YTc2MzgyZTY2OAA6Ey4vZ3JpZF9yb3V0ZXJfYmcuanMsX193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0Xzk2NTU5MjA3M2U1ZDg0OGMAKhMuL2dyaWRfcm91dGVyX2JnLmpzLF9fd2JnX19fd2JpbmRnZW5fbnVtYmVyX2dldF9kZDZkNjlhNjA3OWYyNmYxACoTLi9ncmlkX3JvdXRlcl9iZy5qcyRfX3diZ19fX3diaW5kZ2VuX2luXzI2MTdmYTc2Mzk3NjIwZDMAOBMuL2dyaWRfcm91dGVyX2JnLmpzJ19fd2JnX19fd2JpbmRnZW5fdGhyb3dfOWM3NWQ0N2JmOWU3NzMxZQAHEy4vZ3JpZF9yb3V0ZXJfYmcuanMpX193YmdfX193YmluZGdlbl9pc19udWxsXzA2NjA4NmJlM2FiZTliYjMAMxMuL2dyaWRfcm91dGVyX2JnLmpzKl9fd2JnX19fd2JpbmRnZW5fanN2YWxfZXFfNDAzZWFhMzYxMDUwMGEyNQA4Ey4vZ3JpZF9yb3V0ZXJfYmcuanMdX193YmdfTnVtYmVyX2EzZDczN2ZkMTgzZjdkY2EANBMuL2dyaWRfcm91dGVyX2JnLmpzHF9fd2JnX0Vycm9yXzM2MzlhNjBlZDE1Zjg3ZTcACRMuL2dyaWRfcm91dGVyX2JnLmpzK19fd2JnX19fd2JpbmRnZW5faXNfYmlnaW50X2Q2YTgxNjdjYWM0MDFiOTUAMxMuL2dyaWRfcm91dGVyX2JnLmpzK19fd2JnX19fd2JpbmRnZW5faXNfb2JqZWN0XzViMjJmZjI0MTgwNjNhOWMAMxMuL2dyaWRfcm91dGVyX2JnLmpzLV9fd2JnX19fd2JpbmRnZW5fYm9vbGVhbl9nZXRfYzNkZDVjMzlmMWI1YTEyYgAzEy4vZ3JpZF9yb3V0ZXJfYmcuanMtX193YmdfX193YmluZGdlbl9pc19mdW5jdGlvbl8yZjBmZDdjZWI4NmU2NGM1ADMTLi9ncmlkX3JvdXRlcl9iZy5qcy5fX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF8yNDRhOTJjMzRkM2I2ZWMwADMTLi9ncmlkX3JvdXRlcl9iZy5qczBfX3diZ19fX3diaW5kZ2VuX2pzdmFsX2xvb3NlX2VxXzE5NzhmMWU3N2I0YmNlNjIAOBMuL2dyaWRfcm91dGVyX2JnLmpzM19fd2JnX19fd2JpbmRnZW5f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ATYCGCACQShqIAJBGGoQ2gEgAikDKEIBUg0DIAIgAikDMCIFEKUCIgM2AiggAkEYaiACQShqEKkCIQQCQCADQYQISQ0AIAMQqwELIARFDQMCQCABQYQISQ0AIAEQqwELIAAgBTcDCCAAQYiAgIB4NgIADAkLIABBiICAgHg2AgAgACAG/AY3AwgMBgsgAkEMaiACQQhqENQBAkAgAigCDEGAgICAeEYNACAAIAIoAhQ2AgwgACACKQIMNwIEIABBjICAgHg2AgAMBgsgAkEIahDDAg0CIAJBGGogAkEIahCkAQJAIAIoAhhBgICAgHhGDQAgACACKAIgNgIMIAAgAikCGDcCBCAAQY6AgIB4NgIADAYLIAJBCGoQxwJFDQMgAhCZAyIDNgIkAkACQCACQSRqIAJBCGoQqAINACADQYQISQ0BIAMQqwEgACABEEAMCQsCQCADQYQISQ0AIAMQqwELIAEQhgNFDQQLIAAgARBADAcLIABBkoCAgHg2AgAMBAsgAiABNgIYIAJBKGogAkEYahDaAQJAIAIpAyhCAVINACACIAIpAzAiBRCmAiIDNgIoIAJBGGogAkEoahCpAiEEAkAgA0GECEkNACADEKsBCyAERQ0AAkAgAUGECEkNACABEKsBCyAAIAU3AwggAEGEgICAeDYCAAwGCxCWA0HPAEEBEN8CIgNFDQIgA0GtosAAQc8A/AoAACADQc8AEIEDIQQgA0HPAEEBEL4CIABBlYCAgHg2AgAgACAENgIEIAFBhAhJDQUMBAsgACABEE4MBAsgACACQQhqIAJBP2pBzKDAABBrNgIEIABBlYCAgHg2AgAMAQtBAUHPABCTAgALIAFBhAhJDQELIAEQqwELIAJBwABqJAALoAYBBH8gAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkACQCACQQFxDQAgAkECcUUNASABKAIAIgIgAGohAAJAIAEgAmsiAUEAKALkvkFHDQAgAygCBEEDcUEDRw0BQQAgADYC3L5BIAMgAygCBEF+cTYCBCABIABBAXI2AgQgAyAANgIADwsgASACEHULAkACQAJAAkACQAJAAkACQCADKAIEIgJBAnENACADQQAoAui+QUYNAiADQQAoAuS+QUYNAyADIAJBeHEiAhB1IAEgAiAAaiIAQQFyNgIEIAEgAGogADYCACABQQAo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IANBgAggBEEBcRsgARs2AgAgBUEQaiQAC20BA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBCACQQF0IgJBBCACQQRLGyICQQRBBBCWAQJAIAEoAgRBAUcNACABKAIIIAEoAgwQkwIACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALbQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEIAJBAXQiAkEEIAJBBEsbIgJBBEEMEJYBAkAgASgCBEEBRw0AIAEoAgggASgCDBCTAgALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtuAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgQgAkEBdCICQQQgAkEESxsiAkEIQdAAEJYBAkAgASgCBEEBRw0AIAEoAgggASgCDBCTAgALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtuAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgQgAkEBdCICQQQgAkEESxsiAkEIQcgAEJYBAkAgASgCBEEBRw0AIAEoAgggASgCDBCTAgALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAttAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgQgAkEBdCICQQQgAkEESxsiAkEEQRAQlgECQCABKAIEQQFHDQAgASgCCCABKAIMEJMCAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQAC20BA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBCACQQF0IgJBBCACQQRLGyICQQRBCBCWAQJAIAEoAgRBAUcNACABKAIIIAEoAgwQkwIACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALbQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEIAJBAXQiAkEEIAJBBEsbIgJBBEEYEJYBAkAgASgCBEEBRw0AIAEoAgggASgCDBCTAgALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAttAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgQgAkEBdCICQQQgAkEESxsiAkEIQTAQlgECQCABKAIEQQFHDQAgASgCCCABKAIMEJMCAAsgASgCCCEDIAAgAjYCACAAIAM2AgQg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AwBB9IbAACABIAAQ3wEACyoAIAAoAgAoAgAiACkDACAAQQhqKQMAIAEoAgBBACACa0EYbGpBaGoQbQsqAQF/IwBBEGsiASQAIAFBgQg2AgwgACABQQxqEKoCIQAgAUEQaiQAIAALMAEBfwJAAkAgARDHAg0AQQAhAgwBC0EBIQIgARD+AiEBCyAAIAE2AgQgACACNgIACy0CAX8BfiMAQRBrIgEkACAAKQIAIQIgASAANgIMIAEgAjcCBCABQQRqEIMDAAssAQF/IwBBEGsiAiQAIAIgACABEIcCIAIoAgAgAigCBCACKAIIIAJBEGokAAsnAQF/IwBBEGsiAyQAIAMgABB2IAMgASACEMIBIQAgA0EQaiQAIAALKgEBfkIAIQICQCABEMQCRQ0AIAAgARCAA/wGNwMIQgEhAgsgACACNwMACyQBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQQhqEIIDAAsmAAJAIAANAEHApMAAQTIQ4AIACyAAIAIgAyAEIAUgASgCEBEQAAskAAJAIAANAEHApMAAQTIQ4AIACyAAIAIgAyAEIAEoAhARJwALJAACQCAADQBBwKTAAEEyEOACAAsgACACIAMgBCABKAIQESQACyQAAkAgAA0AQcCkwABBMhDgAgALIAAgAiADIAQgASgCEBENAAskAAJAIAANAEHApMAAQTIQ4AIACyAAIAIgAyAEIAEoAhARDQALJAACQCAADQBBwKTAAEEyEOACAAsgACACIAMgBCABKAIQEQ0ACyQAAkAgAA0AQcCkwABBMhDgAgALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEHApMAAQTIQ4AIACyAAIAIgAyAEIAEoAhARKAALJAACQCAADQBBwKTAAEEyEOACAAsgACACIAMgBCABKAIQEQ4ACyAAAkAgAUUNACACIAMQ6wIACyAAIAM2AgQgACACNgIACyIAAkAgAA0AQcCkwABBMhDgAgALIAAgAiADIAEoAhARCwALIgACQCAADQBBwKTAAEEyEOACAAsgACACIAMgASgCEBEKAAsjAAJAIAAtAAANACABQfK5wQBBBRBcDwsgAUH3ucEAQQQQXAsgAAJAIAANAEHApMAAQTIQ4AIACyAAIAIgASgCEBEIAAscACAAIAFBLkYgAC0ABHI6AAQgACgCACABEK0CCx8BAX8CQCAAKAIAIgFBAUgNACAAKAIEIAFBARC+AgsLHwAgACgCACAAKAIEQQAoAqi7QSIAQckAIAAbEQcAAAshAAJAIAFFDQBB6KjAAEE5QYSpwAAQ3wEACyAAQQA2AgALHQEBfyAAEH4iAyABJgEgAxB+IgMgAiYBIAMQ0QELHgEBfxCXAyEEIABBADYCCCAAIAQ2AgQgACABNgIACxoAQQIgACgCABCSAyIAQQBHIABB////B0YbCyAAAkAgAEGAgICAeHJBgICAgHhGDQAgASAAQQEQvgILCx0BAX8CQCAAKAIAIgFFDQAgACgCBCABQQEQvgILCxcAAkAgAUEJSQ0AIAEgABBxDwsgABAyCx0BAX8CQCAAKAIAIgFFDQAgACgCBCABQQEQvgILCxQAIAEgASAAIAAgAWMbIAAgAGIbCxwCAX8BbyAAJQEgASUBEAghAxB+IgIgAyYBIAILGgAgACUBIAElASABEKsBIAIlASACEKsBEAkLHAIBfwFvIAAlASABJQEQFyEDEH4iAiADJgEgAgscAgF/AW8gACUBIAElARAYIQMQfiICIAMmASACCxYAAkAgAEUNACAAIAEQ6wIACxDOAgALGgIBfwFvIAAlASABEAIhAxB+IgIgAyYBIAILGgIBfwFvIAAlASABEAchAxB+IgIgAyYBIAILEgAgACABQQF0QQFyIAIQ3wEACxgAIAEoAgAgASgCBCAAKAIAIAAoAgQQZAsYAgF/AW8gACUBEAMhAhB+IgEgAiYBIAELGAIBfwFvIAAlARAFIQIQfiIBIAImASABCxgCAX8BbyAAJQEQDSECEH4iASACJgEgAQsYAgF/AW8gACUBEBQhAhB+IgEgAiYBIAELGAIBfwFvIAAlARAWIQIQfiIBIAImASABCxgCAX8BbyAAIAEQICEDEH4iAiADJgEgAgsYAgF/AW8gACABECwhAxB+IgIgAyYBIAILFQAgACACIAMQngI2AgQgAEEANgIACxoAIABBACkCwKdANwIIIABBACkCuKdANwIACxoAIABBACkCsKdANwIIIABBACkCqKdANwIACxYAIAAoAgAgASACIAAoAgQoAgwRCwALEwAgACUBIAEgAiUBIAIQqwEQBgsWAgF/AW8gABAqIQIQfiIBIAImASABCxYCAX8BbyAAECshAhB+IgEgAiYBIAELFgIBfwFvIAAQLSECEH4iASACJgEgAQsTACAAIAIQpAI2AgQgAEEANgIACxIAIAAoAgAgASgCABDUAkEARwsSACAAKAIAIAEoAgAQ1QJBAEcLEgAgACgCACABKAIAENYCQQBHCw8AIAAgASACIAMgBBA6AAsUACAAKAIAIAEgACgCBCgCDBEIAAsUACAAKAIAIAEgACgCBCgCEBEIAAsUAgF/AW8QCyEBEH4iACABJgEgAAsUAgF/AW8QDCEBEH4iACABJgEgAAsUAgF/AW8QFSEBEH4iACABJgEgAAsRACAAKAIEIAAoAgggARDuAgsRACAAKAIAIAAoAgQgARDLAgsRACAAKAIAIAAoAgQgARDuAgsNACAAIAEgAiADEEwPCxEAIAAoAgAgACgCBCABEMsCCxEAIAAQmAM2AgQgACABNgIACxEAIAAoAgQgACgCCCABEO4CCxQAQQAgADYC7LpBQQBBATYC6LpBCxAAIAAoAgAgACgCBCABEEsLEwAgAEHIqMAANgIEIAAgATYCAAsRACABIAAoAgAgACgCBBCiAgsQACABIAAoAgAgACgCBBBcCxABAX8QfiIBIAAlASYBIAELDAAgACABIAIQvgEPCw8AIAAoAgAgASgCABCPAgsOACAAKAIAIAEgAhCQAgsNACAAKAIAEIoDQQBHCw0AIAAoAgAQiwNBAEcLDQAgACgCABCMA0EARwsNACAAKAIAEI0DQQBHCw0AIAAoAgAQjgNBAEcLDQAgACgCABCQA0EARwsNACAAKAIAEJEDQQBHCw0AIAAoAgAQkwNBAEcLDQAgACgCABCUA0EARwsPACAAQbSmwAAgASACEGQLDgAgACACIAEoAgwRCAALCwAgACABEJUDGgALDwAgAEHYpsAAIAEgAhBkCxIAQZSpwABBI0GoqcAAEN8BAAsPACAAQbipwAAgASACEGQLDwBBobXAAEErIAAQlgIACw8AQejFwABBMyAAEN8BAAsTAEHQtsEAQZkBQZy3wQAQ3wEACwwAIAAgASACJQEQDwsMACAAJQEgASUBEBsLDAAgACUBIAElARAeCwwAIAAlASABJQEQJgsOACABQcWewABBERCiAgsOACABQZyewABBDRCiAgsOACABQdaewABBFhCiAgsOACABQfaewABBGBCiAgsOACABQeyewABBChCiAgsOACABQamewABBDRCiAgsOACABQbaewABBDxCiAgsOACABQY6fwABBHBCiAgsKACAAIAEQjAIPCwoAIAAgARD/AgALDgAgAUGkpcAAQQkQogILDgAgAUGtpcAAQQIQogILDgAgAUGvpcAAQQMQogILDgAgAUGypcAAQQMQogILDgAgAUG1pcAAQQMQogILDgAgAUG4pcAAQQMQogILDgAgAUG7pcAAQQUQogILDgAgAUHOpsAAQQgQogILCgAgASAAEPQBAAsMACAAIAEpAgA3AwALCgAgASAAEOkCAAsOACABQciqwABBBRCiAgsNACABQZy6wQBBGBBcCwoAIAIgACABEFwLCgAgACABJQEQCgsKACAAIAElARAZCwoAIAAgASUBEBoLCgAgACABJQEQJwsKACAAIAElARAoCwkAIAAgARDjAgsJACAAIAEQ4QILCQAgACABEOICCwkAIAAgARDoAgsJACAAIAEQ5gILCQAgACABEOcCCwkAIAAgARDkAgsJACAAIAEQ5QILCQAgACABEJ4CCwoAIAAoAgAQmgILCgAgACgCABCbAgsIACAAIAEQHAsKACAAKAIAEI8DCwkAIAAgARCdAgsIACAAEIUCAAsIACAAEKoBAAsLAEEAQQE6AIC/QQsJACAAQQA2AgALCAAgACUBEAALCAAgACUBEAELCAAgACUBEAQLCAAgACUBEA4LCAAgACUBEBALCAAgACUBEBELCAAgACUBEBILCAAgACUBEBMLCAAgACUBEB0LCAAgACUBEB8LCAAgACUBECELCAAgACUBECILCAAgACUBECMLCAAgACUBECQLCAAgACUBECULBgAQmgMACwMADwsFABCuAgsFABCvAgsFABCwAgsDAAALC+O6AQIAQYCAwAALzLoBAAAAAAAAAAABAAAADQAAAAVpbm5lcsAADWJlZ2luID4gZW5kICjAAyA+IMAQKSB3aGVuIHNsaWNpbmcgYMABYMAAEXN0YXJ0IGJ5dGUgaW5kZXggwBYgaXMgb3V0IG9mIGJvdW5kcyBvZiBgwAFgwAAPZW5kIGJ5dGUgaW5kZXggwBYgaXMgb3V0IG9mIGJvdW5kcyBvZiBgwAFgwAARc3RhcnQgYnl0ZSBpbmRleCDAJiBpcyBub3QgYSBjaGFyIGJvdW5kYXJ5OyBpdCBpcyBpbnNpZGUgwAggKGJ5dGVzIMAGKSBvZiBgwAFgwAAPZW5kIGJ5dGUgaW5kZXggwCYgaXMgbm90IGEgY2hhciBib3VuZGFyeTsgaXQgaXMgaW5zaWRlIMAIIChieXRlcyDABikgb2YgYMABYMAAFmtpY2FkX3J1c3Rfd2FzbV90cmFjZV/AAC1LUlQgR3JpZFJvdXRlciBmb3VuZCBubyByb3V0ZSBmb3IgY29ubmVjdGlvbiDACSBzZWdtZW50IMAAFnNsaWNlIGluZGV4IHN0YXJ0cyBhdCDADSBidXQgZW5kcyBhdCDAACBpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzIMASIGJ1dCB0aGUgaW5kZXggaXMgwAAScmFuZ2Ugc3RhcnQgaW5kZXggwCIgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggwAAQcmFuZ2UgZW5kIGluZGV4IMAiIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIMAAB3N0cmluZyDAAA9pbnZhbGlkIHZhbHVlOiDACywgZXhwZWN0ZWQgwAAOaW52YWxpZCB0eXBlOiDACywgZXhwZWN0ZWQgwAAQYXNzZXJ0aW9uIGBsZWZ0IMAXIHJpZ2h0YCBmYWlsZWQKICBsZWZ0OiDACQogcmlnaHQ6IMAAEGFzc2VydGlvbiBgbGVmdCDAECByaWdodGAgZmFpbGVkOiDACQogIGxlZnQ6IMAJCiByaWdodDogwAAYSW52YWxpZCByb3V0ZXIgb3B0aW9uczogwAAcQ291bGQgbm90IHNlcmlhbGl6ZSByb3V0ZXM6IMAAGUludmFsaWQgU2ltcGxlUm91dGVKc29uOiDAAMACOiDAAC9ydXN0Yy81OTgwNzYxNmUxZmEyNTQwNzI0YmZiYWMxNGQ3OTc2ZDdlNGEzODYwL2xpYnJhcnkvY29yZS9zcmMvbnVtL2ZsdDJkZWMvc3RyYXRlZ3kvZ3Jpc3UucnMAL3J1c3RjLzU5ODA3NjE2ZTFmYTI1NDA3MjRiZmJhYzE0ZDc5NzZkN2U0YTM4NjAvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3NoYXJlZC9zbWFsbHNvcnQucnMAL3J1c3RjLzU5ODA3NjE2ZTFmYTI1NDA3MjRiZmJhYzE0ZDc5NzZkN2U0YTM4NjAvbGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAC9ydXN0Yy81OTgwNzYxNmUxZmEyNTQwNzI0YmZiYWMxNGQ3OTc2ZDdlNGEzODYwL2xpYnJhcnkvY29yZS9zcmMvbnVtL2RpeV9mbG9hdC5ycwAvcnVzdGMvNTk4MDc2MTZlMWZhMjU0MDcyNGJmYmFjMTRkNzk3NmQ3ZTRhMzg2MC9saWJyYXJ5L3N0ZC9zcmMvc3lzL3RocmVhZF9sb2NhbC9ub190aHJlYWRzLnJzAC9ydXN0Yy81OTgwNzYxNmUxZmEyNTQwNzI0YmZiYWMxNGQ3OTc2ZDdlNGEzODYwL2xpYnJhcnkvY29yZS9zcmMvbnVtL2RlYzJmbHQvZGVjaW1hbF9zZXEucnMAc3JjL29ic3RhY2xlX21hcC5ycwAvcnVzdGMvNTk4MDc2MTZlMWZhMjU0MDcyNGJmYmFjMTRkNzk3NmQ3ZTRhMzg2MC9saWJyYXJ5L2NvcmUvc3JjL251bS9mbHQyZGVjL3N0cmF0ZWd5L2RyYWdvbi5ycwAvcnVzdGMvNTk4MDc2MTZlMWZhMjU0MDcyNGJmYmFjMTRkNzk3NmQ3ZTRhMzg2MC9saWJyYXJ5L2NvcmUvc3JjL251bS9iaWdudW0ucnMAc3JjL3dhc20ucnMAL1VzZXJzL211c3RhZmFtdWxsYS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTIwL3NyYy9leHRlcm5yZWYucnMAL3J1c3RjLzU5ODA3NjE2ZTFmYTI1NDA3MjRiZmJhYzE0ZDc5NzZkN2U0YTM4NjAvbGlicmFyeS9jb3JlL3NyYy9udW0vZGVjMmZsdC9wYXJzZS5ycwAvcnVzdGMvNTk4MDc2MTZlMWZhMjU0MDcyNGJmYmFjMTRkNzk3NmQ3ZTRhMzg2MC9saWJyYXJ5L2NvcmUvc3JjL3VuaWNvZGUvcHJpbnRhYmxlLnJzAC9ydXN0L2RlcHMvaGFzaGJyb3duLTAuMTYuMS9zcmMvcmF3L21vZC5ycwAvcnVzdGMvNTk4MDc2MTZlMWZhMjU0MDcyNGJmYmFjMTRkNzk3NmQ3ZTRhMzg2MC9saWJyYXJ5L2NvcmUvc3JjL2ZtdC9tb2QucnMAL3J1c3RjLzU5ODA3NjE2ZTFmYTI1NDA3MjRiZmJhYzE0ZDc5NzZkN2U0YTM4NjAvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAL3J1c3RjLzU5ODA3NjE2ZTFmYTI1NDA3MjRiZmJhYzE0ZDc5NzZkN2U0YTM4NjAvbGlicmFyeS9jb3JlL3NyYy9udW0vZmx0MmRlYy9tb2QucnMAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuMTEvc3JjL2RsbWFsbG9jLnJzAC9Vc2Vycy9tdXN0YWZhbXVsbGEvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9qcy1zeXMtMC4zLjk3L3NyYy9saWIucnMAL1VzZXJzL211c3RhZmFtdWxsYS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NlcmRlLXdhc20tYmluZGdlbi0wLjYuNS9zcmMvbGliLnJzABBmbG9hdGluZyBwb2ludCBgwAFgAAtjaGFyYWN0ZXIgYMABYAAJaW50ZWdlciBgwAFgAAlib29sZWFuIGDAAWAAD21pc3NpbmcgZmllbGQgYMABYAARZHVwbGljYXRlIGZpZWxkIGDAAWAACEpzVmFsdWUowAEpAACLBRAAEwAAAH0BAAAyAAAAiwUQABMAAACCAQAAKAAAAIsFEAATAAAA3gAAACAAAACLBRAAEwAAAGgAAAAlAAAAiwUQABMAAAAgAgAAIwAAAAAAAAD//////////1gKEAAAAAAAAAAAAAAAAAB0b3Bib3R0b20AAABOBhAACwAAAH4DAAAxAAAAbWluWG1heFhtaW5ZbWF4WYwKEAAEAAAAkAoQAAQAAACUChAABAAAAJgKEAAEAAAAeHkAALwKEAABAAAAvQoQAAEAAAB0eXBlY2VudGVyd2lkdGhoZWlnaHRsYXllcnNsYXllcmNvbm5lY3RlZFRvANAKEAAEAAAA1AoQAAYAAADaChAABQAAAN8KEAAGAAAA5QoQAAYAAADrChAABQAAAPAKEAALAAAAcG9pbnRJZHBjYlBvcnRJZLwKEAABAAAAvQoQAAEAAADrChAABQAAADQLEAAHAAAAOwsQAAkAAABSb3V0ZVNlZ21lbnRyb3V0ZV90eXBld2lyZXZpYWZyb21fbGF5ZXJ0b19sYXllcmRhdGEgZGlkIG5vdCBtYXRjaCBhbnkgdmFyaWFudCBvZiB1bnRhZ2dlZCBlbnVtIE51bWJlck9yU3RyaW5nbGF5ZXJDb3VudG9ic3RhY2xlc2Nvbm5lY3Rpb25zYm91bmRzbWluVHJhY2VXaWR0aG5vbWluYWxUcmFjZVdpZHRoANkLEAAKAAAA4wsQAAkAAADsCxAACwAAAPcLEAAGAAAA/QsQAA0AAAAKDBAAEQAAAGdyaWRTdGVwY2xlYXJhbmNlbWF4SXRlcmF0aW9uc3ZpYUNvc3RoV2VpZ2h0dHVybkNvc3R0cmFja01hcmdpbmxheWVyQ29zdHNsYXllckRpcmVjdGlvblByZWZlcmVuY2VzZGlyZWN0aW9uUHJlZmVyZW5jZUNvc3QAAABMDBAACAAAAFQMEAAJAAAAXQwQAA0AAABqDBAABwAAAHEMEAAHAAAAeAwQAAgAAACADBAACwAAAIsMEAAKAAAAlQwQABkAAACuDBAAFwAAAFNpbXBsaWZpZWRQY2JUcmFjZXBjYl90cmFjZV9pZGNvbm5lY3Rpb25fbmFtZXJvdXRlbmFtZXNvdXJjZVRyYWNlSWRwb2ludHNUb0Nvbm5lY3QAAEoNEAAEAAAATg0QAA0AAABbDRAADwAAANoKEAAFAAAACgwQABEAAABncmlkU3RlcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvcGNiX3RyYWNlbGF5ZXJDb3VudCBtdXN0IGZpdCBpbiB1OGNlbGxzX2V4cGFuZGVkY2VsbHNfcHVzaGVkY2VsbHNfcmV2aXNpdGVkZHVwbGljYXRlX3NraXBzcGF0aF9sZW5ndGhwYXRoX2Nvc3Rpbml0aWFsX2hmaW5hbF9nbWF4X2Zfc2NvcmVvcGVuX3NldF9zaXplY2xvc2VkX3NldF9zaXpldmlhX2NvdW50aGV1cmlzdGljX3JhdGlvZXhwYW5zaW9uX3JhdGlvcmV2aXNpdF9yYXRpb3NraXBfcmF0aW8AAAABAAAAAAAAAAEAAAD/////AAAAAP////////////////////8AAAAA/////wEAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAAAAAABAAAADgAAAAAAAAAA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AAYCBQcGAgkDCQQFAwECBQMIAQQGCQcCBgUGAgUBCQAHAwQIBgMCCAECBQkFAwYHBAMBBgQABgIFBAcGCAMHAQUIAgADAQIFAgMIBAEIBQcJAQABBQYCBQEBCQIACQIICQUFAAcIAQIFBQkGAAQGBAQHBwUDCQAGAgUCCQgAAgMCAgMIBwYJBQMBAgUBBAkAAQEGAQEJAwgEBwYFBgIFBwQFAAUIAAUJBgkCAwgCCAECBQMHAgUCCQACCQgEBgEJAQQABgIFAQgGAgYEBQEECQIDAAkFBwADAQIFCQMBAwICBQcEBgEFBAcIBQEFBgIFBAYFBgYBAggHAwAHBwMJAgUHCAECBQIDAggDAAYEAwYFAwgGCQYCCAkABgIFAQEGBAEFAwIBCAIGCQMECAEEBAUDAQIFBQgCAAcGBgAJAQMEBgcEAAcCAgYFBgIFAgkBAAMIAwAEBQYHAwMHAAMGAQMCCAECBQEEBQUBCQEFAgIIAwYGCAUBCAAGBgQABgIFBwIHBQkFBwYBBAEIAwQCBQkAAwMCAAMBAgUDBgMHCQcICAAHAAkBBwECCQUBBgYAAQUGAgUBCAEICQgJBAADBQQFCAUGBAcFCAMAAAcIAQIFCQAJBAkEBwABBwcCCQIIAgMHCQEFAAMJAAYCBQQFBAcEBwMFAAgIBgQGBAEBCAkFBwUBCQUDAQIFAgIHAwcDBgcFBAQDAgMCAAUJBAcIBwUJBwYFBgIFAQEDBggGCAMHBwIBBgEGAAIJBwMJAwcJCAgCCAECBQUGCAQDBAEICAYACAAIAAEECAYJBggJCQQBBAAGAgUCCAQCAQcACQQDAAQABAAABwQDBAgEBAkHAAcAAwECBQEEAgEACAUEBwEFAgACAAADBwEHBAICBAgFAwUBBQYCBQcBAAUEAgcDBQcGAAEAAAEIBQgHAQECBAIGBwUHCAECBQMFBQIHAQMGBwgIAAAFAAAJAgkDBQUGAgEDAwcICQAGAgUBBwcGAwUGCAMJBAAAAgUABAYEBgcHCAEABgYICQQFAwECBQgICAEHCAQBCQcAAAECBQIDAgMDCAkABQMDBAQHAgYFBgIFBAQEAAgJAgAJCAUAAAYCBgEGAQYJBAUCBgYHAgMGAwIIAQIFAgICAAQEBgAECQIFAAMBAwAIAAgEBwIGAwMDBgEIAQYEAAYCBQEBAQACAgMAAgQG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AEDlnDCiQgAAkB7EvNZCAAA0JvVrDEMAgOA3ecNBQwCg2IVXNHZDAMhOZ23Bq0MAPZFg5FjhQ0CMtXgdrxVEUO/i1uQaS0SS1U0Gz/CARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADB4MDEyMzQ1Njc4OUFCQ0RFRmZhbHNldHJ1ZQCgBxAASwAAAH4LAAAmAAAAoAcQAEsAAACHCwAAGgAAAFJlZkNlbGwgYWxyZWFkeSBib3Jyb3dlZMwaEADOGhAA0BoQAAIAAAACAAAABwAAAABBzLrBAAsEBAAAAADu7wEEbmFtZQAREGdyaWRfcm91dGVyLndhc20Bke8BmgMAhwFqc19zeXM6Ol86OjxpbXBsIHdhc21fYmluZGdlbjo6Y2FzdDo6SnNDYXN0IGZvciBqc19zeXM6Ok1hcDxLLFY+Pjo6aW5zdGFuY2VvZjo6X193YmdfaW5zdGFuY2VvZl9NYXBfMTBkNGVkZjYwZmNmOTMyNzo6aGFmZmEzZjNlMjM2YzI0MDMBSmpzX3N5czo6QXJyYXk8VD46Omxlbmd0aDo6X193YmdfbGVuZ3RoXzBhNmNlMDE2ZGMxNDYwYjA6Omg4ZDkzNTQ0MWE5ZmJmOWIxAlhqc19zeXM6OkFycmF5PFQ+OjpnZXRfdW5jaGVja2VkOjpfX3diZ19nZXRfdW5jaGVja2VkX2JlNTYyYjE0MjE2NTYzMjE6OmgzZDAzYmQxNTVjNTI1NjNiA0lqc19zeXM6Okl0ZXJhdG9yPFQ+OjpuZXh0OjpfX3diZ19uZXh0X2FhY2VlMzEwYmNmZTY0NjE6OmhlOTdjYzRlMjE0MzU0ZGI1BE1qc19zeXM6Okl0ZXJhdG9yTmV4dDxUPjo6ZG9uZTo6X193YmdfZG9uZV9iMWFmZDYyMDFhYzA0NWUwOjpoYTBkMGRjZjEwYmZiMGIyMAVPanNfc3lzOjpJdGVyYXRvck5leHQ8VD46OnZhbHVlOjpfX3diZ192YWx1ZV9mODUyNzE2YWNkZWIzZTgyOjpoYTk4NjBlYWRjZGI2NjZjYgZEanNfc3lzOjpBcnJheTxUPjo6c2V0OjpfX3diZ19zZXRfZjYxNGY2YTA2MDhkMWQxZDo6aGZkNDAxZTFhN2FhOTA5OWQHRGpzX3N5czo6QXJyYXk8VD46OmdldDo6X193YmdfZ2V0XzY1MmY2NDBiM2IwYjZlM2U6Omg3ZTVmMzUxODZkNWU2NTM1CGtzZXJkZV93YXNtX2JpbmRnZW46Ok9iamVjdEV4dDo6Z2V0X3dpdGhfcmVmX2tleTo6X193YmdfZ2V0X3dpdGhfcmVmX2tleV82NDEyY2YzMDk0NTk5Njk0OjpoNWEyY2FiMWU4NWFhNDFjOQlRc2VyZGVfd2FzbV9iaW5kZ2VuOjpPYmplY3RFeHQ6OnNldDo6X193Ymdfc2V0XzZiZTQyNzY4YzY5MGUzODA6OmgxMjlhMDE5NGIyNDJiZWZjCno8c2VyZGVfd2FzbV9iaW5kZ2VuOjplcnJvcjo6RXJyb3IgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10Ojp0b19zdHJpbmc6Ol9fd2JnX1N0cmluZ184NTY0ZTU1OTc5OWVjY2RhOjpoNjJmMGM3ODI0M2IxYjFjNQtBanNfc3lzOjpBcnJheTo6bmV3OjpfX3diZ19uZXdfM2JhYThkOTg2NjE1NWM3OTo6aGRlYWNjZDM4MTY1MTg5NTAMQmpzX3N5czo6T2JqZWN0OjpuZXc6Ol9fd2JnX25ld18yZmFkOGNhMDJmZDAwNjg0OjpoMTg2ZDRiMTk2NGFlZGNlMA1GanNfc3lzOjpVaW50OEFycmF5OjpuZXc6Ol9fd2JnX25ld184NDU0ZWVlNjcyYjJiYTZlOjpoYzdlNzdlNmQ4ZWU1YzU4OQ5ManNfc3lzOjpVaW50OEFycmF5OjpsZW5ndGg6Ol9fd2JnX2xlbmd0aF9iYTNjMDMyNjAyZWZlMzEwOjpoNTllMTE4NmJhODIzYjlmNg9danNfc3lzOjpVaW50OEFycmF5Ojpjb3B5X3RvX3NsaWNlOjpfX3diZ19wcm90b3R5cGVzZXRjYWxsX2ZkNDA1MGU4MDZlMWQ1MTk6Omg4YmUzNDAyZGZjYzcwMGIwEJABanNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpVaW50OEFycmF5Pjo6aW5zdGFuY2VvZjo6X193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzU3ZDc3YWNkNTBlNGM0NGQ6OmgyOGY5Y2ZiZTI4MjI1MTk4EZIBanNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpBcnJheUJ1ZmZlcj46Omluc3RhbmNlb2Y6Ol9fd2JnX2luc3RhbmNlb2ZfQXJyYXlCdWZmZXJfZWFiOWYyOGZiZWMyMzQ3Nzo6aGUzZDZiMDBlZTdkNTNiNmMSSmpzX3N5czo6QXJyYXk6OmlzX2FycmF5OjpfX3diZ19pc0FycmF5X2M2YzZlZjgzMDg5OTViY2Y6Omg2NzQ5NmZjZmNjMjhhZjJjE1hqc19zeXM6Ok51bWJlcjo6aXNfc2FmZV9pbnRlZ2VyOjpfX3diZ19pc1NhZmVJbnRlZ2VyXzNjNTZjNDIxYTViNGNjZTQ6Omg1NGM4M2M5ZTEzYmFkNzY3FEpqc19zeXM6Ok9iamVjdDo6ZW50cmllczo6X193YmdfZW50cmllc19iYjk4NDNiYTczZGM3MGQ2OjpoMjQxNzJkM2MzMTg0MjM4MhVManNfc3lzOjpTeW1ib2w6Oml0ZXJhdG9yOjpfX3diZ19pdGVyYXRvcl85ZDY4OTg1YTFkMDk2ZmMyOjpoMWNmZWQyYmY0Y2MxNWI5MBZqanNfc3lzOjpJdGVyYXRvcjo6bG9va3NfbGlrZV9pdGVyYXRvcjo6TWF5YmVJdGVyYXRvcjo6bmV4dDo6X193YmdfbmV4dF8yNjFjM2M0OGM2ZTMwOWE1OjpoNmNjYTI1Yjc0MjFkMjNiOBdKanNfc3lzOjpSZWZsZWN0OjpnZXRfc3ltYm9sOjpfX3diZ19nZXRfOWNmZWE5YjdiYmYxMmExNTo6aDgwMmQyZjVmZGE5NjkzZmQYSmpzX3N5czo6RnVuY3Rpb248Rj46OmNhbGwwOjpfX3diZ19jYWxsX2FkZDllNWE3NjM4MmU2Njg6OmhiZWM2OTk3MTg2NjI3YmQwGWR3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fc3RyaW5nX2dldDo6X193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0Xzk2NTU5MjA3M2U1ZDg0OGM6OmhkNDIyNjczMjEzODg2NjBlGmR3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fbnVtYmVyX2dldDo6X193YmdfX193YmluZGdlbl9udW1iZXJfZ2V0X2RkNmQ2OWE2MDc5ZjI2ZjE6Omg1MWJjZjhiNzRkZDM2MTUxG1R3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faW46Ol9fd2JnX19fd2JpbmRnZW5faW5fMjYxN2ZhNzYzOTc2MjBkMzo6aDY2ZDA2MDk3YjExYTZmNDkcWndhc21fYmluZGdlbjo6X193YmluZGdlbl90aHJvdzo6X193YmdfX193YmluZGdlbl90aHJvd185Yzc1ZDQ3YmY5ZTc3MzFlOjpoNDk4MDA4NzdjNWEzNGQ4Nx1ed2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX251bGw6Ol9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF8wNjYwODZiZTNhYmU5YmIzOjpoNzI0YWVkMDY3MmM5Nzg2Nx5gd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2pzdmFsX2VxOjpfX3diZ19fX3diaW5kZ2VuX2pzdmFsX2VxXzQwM2VhYTM2MTA1MDBhMjU6OmhjY2RiMjQ4YjE1N2ZmMzM1H1R3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fYXNfbnVtYmVyOjpfX3diZ19OdW1iZXJfYTNkNzM3ZmQxODNmN2RjYTo6aDY2OTgxZjljMmU2YWY1Y2IgU3dhc21fYmluZGdlbjo6X193YmluZGdlbl9lcnJvcl9uZXc6Ol9fd2JnX0Vycm9yXzM2MzlhNjBlZDE1Zjg3ZTc6Omg0ODFjNzA5MTRmNWM5NzJkIWJ3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfYmlnaW50OjpfX3diZ19fX3diaW5kZ2VuX2lzX2JpZ2ludF9kNmE4MTY3Y2FjNDAxYjk1OjpoYTBhNjdhMDczMWZjNzNlMyJid2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX29iamVjdDo6X193YmdfX193YmluZGdlbl9pc19vYmplY3RfNWIyMmZmMjQxODA2M2E5Yzo6aDdjMzk4NzE0YmY0N2FhNGEjZndhc21fYmluZGdlbjo6X193YmluZGdlbl9ib29sZWFuX2dldDo6X193YmdfX193YmluZGdlbl9ib29sZWFuX2dldF9jM2RkNWMzOWYxYjVhMTJiOjpoM2JkM2IyZWQyMmJiNzhkMCRmd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX2Z1bmN0aW9uOjpfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzJmMGZkN2NlYjg2ZTY0YzU6OmgzNmU4MjIxZGM3M2NiM2EwJWh3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfdW5kZWZpbmVkOjpfX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF8yNDRhOTJjMzRkM2I2ZWMwOjpoYmY4YmI0ZGU4MmE5NDNhZSZsd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2pzdmFsX2xvb3NlX2VxOjpfX3diZ19fX3diaW5kZ2VuX2pzdmFsX2xvb3NlX2VxXzE5NzhmMWU3N2I0YmNlNjI6OmhlYTY3NWNhNWRjODQwNzMyJ3J3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjQ6Ol9fd2JnX19fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjRfM2FmNmQ0Y2E3NzE5M2E0Yjo6aDQ0ZGQwNzE4MjNhNjFlODMoaHdhc21fYmluZGdlbjo6X193YmluZGdlbl9kZWJ1Z19zdHJpbmc6Ol9fd2JnX19fd2JpbmRnZW5fZGVidWdfc3RyaW5nXzA3Y2I3MmNmY2M5NTJlMmI6Omg0Y2YxMGUxYTFmNDQ2OGUyKhBGNjQgLT4gRXh0ZXJucmVmKxBJNjQgLT4gRXh0ZXJucmVmLBhSZWYoU3RyaW5nKSAtPiBFeHRlcm5yZWYtEFU2NCAtPiBFeHRlcm5yZWYuQ2dyaWRfcm91dGVyOjp3YXNtOjpyb3V0ZV9zaW1wbGVfcm91dGVfanNvbl9pbm5lcjo6aDFiNjk2MzE4NzJmZmI0OWIvPWdyaWRfcm91dGVyOjp3YXNtOjpyb3V0ZV9zaW1wbGVfcm91dGVfanNvbjo6aGE0OWJiMWI1ZDNkODIxZGQwR2NvcmVbYzU5MzBjODVhMTJkZTgyMl06Om51bTo6Zmx0MmRlYzo6c3RyYXRlZ3k6OmRyYWdvbjo6Zm9ybWF0X3Nob3J0ZXN0MURjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpudW06OmZsdDJkZWM6OnN0cmF0ZWd5OjpkcmFnb246OmZvcm1hdF9leGFjdDJhPGRsbWFsbG9jW2UyNGEyNzcwMDYzNGQ2MDldOjpkbG1hbGxvYzo6RGxtYWxsb2M8ZGxtYWxsb2NbZTI0YTI3NzAwNjM0ZDYwOV06OnN5czo6U3lzdGVtPj46Om1hbGxvYzNEY29yZTo6c2xpY2U6OnNvcnQ6OnVuc3RhYmxlOjpxdWlja3NvcnQ6OnF1aWNrc29ydDo6aDQzNzQ2YzI3NDU3NmJjNjA0YTxjb3JlOjptYXJrZXI6OlBoYW50b21EYXRhPFQ+IGFzIHNlcmRlX2NvcmU6OmRlOjpEZXNlcmlhbGl6ZVNlZWQ+OjpkZXNlcmlhbGl6ZTo6aDJkYzg4ZTQxOWJlMWJlMmI1YTxjb3JlOjptYXJrZXI6OlBoYW50b21EYXRhPFQ+IGFzIHNlcmRlX2NvcmU6OmRlOjpEZXNlcmlhbGl6ZVNlZWQ+OjpkZXNlcmlhbGl6ZTo6aGYxMjQ3N2VjZWY1ZDIyNmE2SmNvcmVbYzU5MzBjODVhMTJkZTgyMl06Om51bTo6Zmx0MmRlYzo6c3RyYXRlZ3k6OmdyaXN1Ojpmb3JtYXRfc2hvcnRlc3Rfb3B0N0BoYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6Omg1MjU2ZDRlMDcwYWVkMzFjODhncmlkX3JvdXRlcjo6d2FzbTo6aW5mZXJfcG9pbnRfc3RhdGVzOjpoMzllYmI5ZjZhNTA0ZjZkMDlhPGNvcmU6Om1hcmtlcjo6UGhhbnRvbURhdGE8VD4gYXMgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplU2VlZD46OmRlc2VyaWFsaXplOjpoOGQxMjAwNDZjMTYwMjE4MjowY29yZVtjNTkzMGM4NWExMmRlODIyXTo6c3RyOjpzbGljZV9lcnJvcl9mYWlsX3J0O0FncmlkX3JvdXRlcjo6cm91dGVyOjpHcmlkUm91dGVyOjpzdGF0c190b19kaWN0OjpoNmFiZWQ1NDJlZWI3NGM3Yjw/PGY2NCBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpzdHI6OnRyYWl0czo6RnJvbVN0cj46OmZyb21fc3RyPURjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpudW06OmRlYzJmbHQ6OmRlY2ltYWxfc2VxOjpwYXJzZV9kZWNpbWFsX3NlcT45Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6bnVtOjpkZWMyZmx0OjpwYXJzZTo6cGFyc2VfbnVtYmVyP0Fjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpudW06OmZsdDJkZWM6OnN0cmF0ZWd5OjpkcmFnb246Om11bF9wb3cxMEBqPHNlcmRlX3dhc21fYmluZGdlbjo6ZGU6OkRlc2VyaWFsaXplciBhcyBzZXJkZV9jb3JlOjpkZTo6RGVzZXJpYWxpemVyPjo6ZGVzZXJpYWxpemVfbWFwOjpoOTNiMDk0ZTIzNWY5MzU1OEE4c2VyZGVfY29yZTo6ZGU6Ok1hcEFjY2Vzczo6bmV4dF92YWx1ZTo6aDVhMTlkMWFiZGY0MjI1ZGNCOHNlcmRlX2NvcmU6OmRlOjpNYXBBY2Nlc3M6Om5leHRfdmFsdWU6Omg0Zjg3OWRjMjRhZWE1MjQyQzVncmlkX3JvdXRlcjo6d2FzbTo6b2JzdGFjbGVfbGF5ZXJzOjpoZTk1YjE0MDRiNTc3YWUwYkRAaGFzaGJyb3duOjpyYXc6OlJhd1RhYmxlPFQsQT46OnJlc2VydmVfcmVoYXNoOjpoMGUxM2ZkODNhNDBjNTYzMEUyZ3JpZF9yb3V0ZXI6Ondhc206OnBvaW50X3N0YXRlczo6aDk3MDc1NDhhMzM1MzBiMzlGQGhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6aDkyY2U0NWU5OTcyMmM4ZDlHQGhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6aDZkZjY5ZjgyYWM3ZTVkYTFIQGhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6aDNhYTU1MmY5NTUzNjliMGZJMmNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnN0cjo6Y291bnQ6OmRvX2NvdW50X2NoYXJzSkBoYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6OmgzZDVmOWJiNGE5YWEzNjc2SzA8c3RyIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGVidWc+OjpmbXRMKF9fcnVzdGNbYjc5NzRlODY5MDQzMGRkOV06Ol9fcmRsX3JlYWxsb2NNSGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6ZmxvYXQ6OmZsb2F0X3RvX2RlY2ltYWxfY29tbW9uX2V4YWN0Ojo8ZjY0Pk5qPHNlcmRlX3dhc21fYmluZGdlbjo6ZGU6OkRlc2VyaWFsaXplciBhcyBzZXJkZV9jb3JlOjpkZTo6RGVzZXJpYWxpemVyPjo6ZGVzZXJpYWxpemVfc2VxOjpoMjRiZDFlOTVlNmIzZTkzZE9HY29yZVtjNTkzMGM4NWExMmRlODIyXTo6bnVtOjpmbHQyZGVjOjpzdHJhdGVneTo6Z3Jpc3U6OmZvcm1hdF9leGFjdF9vcHRQSWdyaWRfcm91dGVyOjpvYnN0YWNsZV9tYXA6OkdyaWRPYnN0YWNsZU1hcDo6aXNfYmxvY2tlZDo6aGNiMjkxMTdjYmQwNzNiNjhROGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnVuaWNvZGU6OnByaW50YWJsZTo6aXNfcHJpbnRhYmxlUjs8Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6bnVtOjpiaWdudW06OkJpZzMyeDQwPjo6bXVsX2RpZ2l0c1NCPGhhc2hicm93bls1ZTYxOWQ3ZDExMjljNTlmXTo6cmF3OjpSYXdUYWJsZUlubmVyPjo6cmVoYXNoX2luX3BsYWNlVElzZXJkZV9jb3JlOjpkZTo6RGVzZXJpYWxpemVyOjpfX2Rlc2VyaWFsaXplX2NvbnRlbnRfdjE6Omg2MWM5OWI3OTcwZTRhYTBmVV88ZGxtYWxsb2NbZTI0YTI3NzAwNjM0ZDYwOV06OmRsbWFsbG9jOjpEbG1hbGxvYzxkbG1hbGxvY1tlMjRhMjc3MDA2MzRkNjA5XTo6c3lzOjpTeXN0ZW0+Pjo6ZnJlZVZLY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpmbG9hdDo6ZmxvYXRfdG9fZGVjaW1hbF9jb21tb25fc2hvcnRlc3Q6OjxmNjQ+VzY8Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpGb3JtYXR0ZXI+OjpwYWRfaW50ZWdyYWxYV2NvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxncmlkX3JvdXRlcjo6b2JzdGFjbGVfbWFwOjpHcmlkT2JzdGFjbGVNYXA+OjpoZGI4Y2NmYWIwODdlMTJhNllMPGNvcmU6Omhhc2g6OnNpcDo6SGFzaGVyPFM+IGFzIGNvcmU6Omhhc2g6Okhhc2hlcj46OndyaXRlOjpoOGZhMWRhNjFjZDNkNWVmYVowY29yZVtjNTkzMGM4NWExMmRlODIyXTo6c3RyOjpjb252ZXJ0czo6ZnJvbV91dGY4Wxg8Y2hhcj46OmVzY2FwZV9kZWJ1Z19leHRcLTxjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpmbXQ6OkZvcm1hdHRlcj46OnBhZF1MPGNvcmVbYzU5MzBjODVhMTJkZTgyMl06Om51bTo6ZGVjMmZsdDo6ZGVjaW1hbF9zZXE6OkRlY2ltYWxTZXE+OjpyaWdodF9zaGlmdF5PZ3JpZF9yb3V0ZXI6Om9ic3RhY2xlX21hcDo6R3JpZE9ic3RhY2xlTWFwOjphZGRfYmxvY2tlZF9jZWxsOjpoNjZlNzFiODAyMjYxMTJmY183c2VyZGVfd2FzbV9iaW5kZ2VuOjpzdGF0aWNfc3RyX3RvX2pzOjpoNWRmNjg2NDExZjg4YzE0MmA9PGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6Rm9ybWF0dGVyPjo6cGFkX2Zvcm1hdHRlZF9wYXJ0c2FLPGNvcmVbYzU5MzBjODVhMTJkZTgyMl06Om51bTo6ZGVjMmZsdDo6ZGVjaW1hbF9zZXE6OkRlY2ltYWxTZXE+OjpsZWZ0X3NoaWZ0Yjk8Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6bnVtOjpiaWdudW06OkJpZzMyeDQwPjo6bXVsX3BvdzJjO2hhc2hicm93bjo6bWFwOjpIYXNoTWFwPEssVixTLEE+OjppbnNlcnQ6OmgzMThhNzgxZTk3ODdlOTlhZCJjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpmbXQ6OndyaXRlZT88Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpGb3JtYXR0ZXI+Ojp3cml0ZV9mb3JtYXR0ZWRfcGFydHNmNGdyaWRfcm91dGVyOjp3YXNtOjpsYXllcl90b19pbmRleDo6aDFlYTBjMTljNjRjNmE4NDJnSjxzZXJkZV9jb3JlOjpkZTo6VW5leHBlY3RlZCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6Omg2ODk3Y2RlMzg2NmU3YjRlaF08Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6b3BzOjpyYW5nZTo6UmFuZ2U8dXNpemU+IGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGVidWc+OjpmbXRpO2hhc2hicm93bjo6bWFwOjpIYXNoTWFwPEssVixTLEE+OjppbnNlcnQ6Omg1NjA0NTdhMzcxZDUyYjVlajtoYXNoYnJvd246Om1hcDo6SGFzaE1hcDxLLFYsUyxBPjo6aW5zZXJ0OjpoZWIwMDU5NzExNjQ5ZDFjOGtGc2VyZGVfd2FzbV9iaW5kZ2VuOjpkZTo6RGVzZXJpYWxpemVyOjppbnZhbGlkX3R5cGVfOjpoYTViMzMyMTIzMTNkN2UxZGxoPGRsbWFsbG9jW2UyNGEyNzcwMDYzNGQ2MDldOjpkbG1hbGxvYzo6RGxtYWxsb2M8ZGxtYWxsb2NbZTI0YTI3NzAwNjM0ZDYwOV06OnN5czo6U3lzdGVtPj46OmRpc3Bvc2VfY2h1bmttNGNvcmU6Omhhc2g6OkJ1aWxkSGFzaGVyOjpoYXNoX29uZTo6aDQ0NDk0YTk1OTI1M2RlOGRuO2hhc2hicm93bjo6bWFwOjpIYXNoTWFwPEssVixTLEE+OjppbnNlcnQ6Omg1Njk1M2UzYWU5Nzk1ODA3b0Jjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpudW06OmRlYzJmbHQ6OmxlbWlyZTo6Y29tcHV0ZV9mbG9hdDo6PGY2ND5wN2NvcmU6OnNsaWNlOjpzb3J0Ojp1bnN0YWJsZTo6aXBuc29ydDo6aDFiMzRmNzg0YzAyODQ1M2VxYzxkbG1hbGxvY1tlMjRhMjc3MDA2MzRkNjA5XTo6ZGxtYWxsb2M6OkRsbWFsbG9jPGRsbWFsbG9jW2UyNGEyNzcwMDYzNGQ2MDldOjpzeXM6OlN5c3RlbT4+OjptZW1hbGlnbnJXY29yZVtjNTkzMGM4NWExMmRlODIyXTo6bnVtOjpmbHQyZGVjOjpzdHJhdGVneTo6Z3Jpc3U6OmZvcm1hdF9leGFjdF9vcHQ6OnBvc3NpYmx5X3JvdW5kczJhbGxvY1szY2E1MDFlZGZmM2YwYzdjXTo6Zm10Ojpmb3JtYXQ6OmZvcm1hdF9pbm5lcnRRc3RkOjpzeXM6OnRocmVhZF9sb2NhbDo6bm9fdGhyZWFkczo6TGF6eVN0b3JhZ2U8VD46OmluaXRpYWxpemU6OmgxZTA1MGVkNTQzNWQyNDlkdWc8ZGxtYWxsb2NbZTI0YTI3NzAwNjM0ZDYwOV06OmRsbWFsbG9jOjpEbG1hbGxvYzxkbG1hbGxvY1tlMjRhMjc3MDA2MzRkNjA5XTo6c3lzOjpTeXN0ZW0+Pjo6dW5saW5rX2NodW5rdkJzZXJkZTo6cHJpdmF0ZTo6ZGU6OmNvbnRlbnQ6OmNvbnRlbnRfdW5leHBlY3RlZDo6aGNlZWE5ZDA2ZDdmMDFjOTV3N2NvcmVbYzU5MzBjODVhMTJkZTgyMl06Om51bTo6Zmx0MmRlYzo6ZGlnaXRzX3RvX2RlY19zdHJ4Rjxjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpudW06OmRlYzJmbHQ6OmRlY2ltYWxfc2VxOjpEZWNpbWFsU2VxPjo6cm91bmR5S2NvcmVbYzU5MzBjODVhMTJkZTgyMl06OnVuaWNvZGU6OnVuaWNvZGVfZGF0YTo6Z3JhcGhlbWVfZXh0ZW5kOjpsb29rdXBfc2xvd3ptPGRsbWFsbG9jW2UyNGEyNzcwMDYzNGQ2MDldOjpkbG1hbGxvYzo6RGxtYWxsb2M8ZGxtYWxsb2NbZTI0YTI3NzAwNjM0ZDYwOV06OnN5czo6U3lzdGVtPj46Omluc2VydF9sYXJnZV9jaHVua3sjanNfc3lzOjp0cnlfaXRlcjo6aDlhNDZmZmNiOGE2MDFmMTJ8WWNvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxhbGxvYzo6dmVjOjpWZWM8Z3JpZF9yb3V0ZXI6Ondhc206Ok9ic3RhY2xlPj46OmhkNmEzOWU3MjQwYThkZGE2fTI8aTY0IGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGlzcGxheT46OmZtdH4XX19leHRlcm5yZWZfdGFibGVfYWxsb2N/NmNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnNsaWNlOjppbmRleDo6c2xpY2VfaW5kZXhfZmFpbIABMjx1NjQgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEaXNwbGF5Pjo6Zm10gQE1Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6c2xpY2U6Om1lbWNocjo6bWVtY2hyX2FsaWduZWSCATZjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpwdHI6OnN3YXBfbm9ub3ZlcmxhcHBpbmdfYnl0ZXODATI8dTMyIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGlzcGxheT46OmZtdIQBWzxhbGxvY1szY2E1MDFlZGZmM2YwYzdjXTo6c3RyaW5nOjpTdHJpbmcgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpXcml0ZT46OndyaXRlX2NoYXKFAV48YWxsb2NbM2NhNTAxZWRmZjNmMGM3Y106OnN0cmluZzo6U3RyaW5nIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6V3JpdGU+Ojp3cml0ZV9jaGFyWzFdhgFjY29yZTo6cHRyOjpkcm9wX2luX3BsYWNlPGFsbG9jOjp2ZWM6OlZlYzxncmlkX3JvdXRlcjo6d2FzbTo6U2ltcGxpZmllZFBjYlRyYWNlPj46OmhlNjJkNWQ0OGFkM2UzNGExhwFSY29yZTo6cHRyOjpkcm9wX2luX3BsYWNlPHNlcmRlX2NvcmU6OnByaXZhdGU6OmNvbnRlbnQ6OkNvbnRlbnQ+OjpoZDlhMDM0ZDgxODk3MzkwZogBMzxjaGFyIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGlzcGxheT46OmZtdIkBQmNvcmU6OnNsaWNlOjpzb3J0Ojp1bnN0YWJsZTo6aGVhcHNvcnQ6OmhlYXBzb3J0OjpoMTE2NzYzMWRlMjk5YmNhNooBNmNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnBhbmlja2luZzo6YXNzZXJ0X2ZhaWxlZF9pbm5lcosBZmNvcmU6OnB0cjo6ZHJvcF9pbl9wbGFjZTxhbGxvYzo6dmVjOjpWZWM8Z3JpZF9yb3V0ZXI6Ondhc206OlNpbXBsZVJvdXRlQ29ubmVjdGlvbj4+OjpoMzNhZTk1NmIwY2JlOWM0MowBMzwmdXNpemUgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEZWJ1Zz46OmZtdI0BMTwmdTY0IGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGVidWc+OjpmbXSOAYYBPDxzZXJkZV9jb3JlOjpkZTo6V2l0aERlY2ltYWxQb2ludCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6Okxvb2tGb3JEZWNpbWFsUG9pbnQgYXMgY29yZTo6Zm10OjpXcml0ZT46OndyaXRlX3N0cjo6aGQyZmFhZjBhM2NlMDM1YjmPAX88c3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6OkZvcm1hdFN0cmluZ1BheWxvYWQgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6cGFuaWM6OlBhbmljUGF5bG9hZD46OnRha2VfYm94kAExc3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpwYW5pY2tpbmc6OnBhbmljX3dpdGhfaG9va5EBUmNvcmU6OnNsaWNlOjpzb3J0OjpzaGFyZWQ6OnNtYWxsc29ydDo6aW5zZXJ0aW9uX3NvcnRfc2hpZnRfbGVmdDo6aGUzMzcyYjMxMTlkMDUzYzSSAS1qc19zeXM6OlVpbnQ4QXJyYXk6OnRvX3ZlYzo6aDdhODVmZTg2ZmY0MDQ1ODSTAVtjb3JlOjpwdHI6OmRyb3BfaW5fcGxhY2U8YWxsb2M6OnZlYzo6VmVjPGdyaWRfcm91dGVyOjp3YXNtOjpSb3V0ZVBvaW50Pj46Omg4ZjJjNmVkZjRhMDg5YmM1lAE4c2VyZGVfd2FzbV9iaW5kZ2VuOjplcnJvcjo6RXJyb3I6Om5ldzo6aDY2OWI4MjRlZmNlZWQwMTCVAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgxNTZjNThhZWYwODA2NzMwlgE+YWxsb2M6OnJhd192ZWM6OlJhd1ZlY0lubmVyPEE+OjpmaW5pc2hfZ3Jvdzo6aGU0ZThkYjcyNzU4Zjg5NTGXAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6Omg5ZDIxZmE4ZTY5N2Q5ZWU4mAE8PGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpyYXdfdmVjOjpSYXdWZWNJbm5lcj46OmZpbmlzaF9ncm93mQFWPHNlcmRlX3dhc21fYmluZGdlbjo6ZXJyb3I6OkVycm9yIGFzIHNlcmRlX2NvcmU6OmRlOjpFcnJvcj46OmN1c3RvbTo6aDNjN2M4NzhjOTAzYmJlOTiaAT5hbGxvYzo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI8QT46OmZpbmlzaF9ncm93OjpoNzEwMTdkYzNiMjUwNzZkZJsBUDxzZXJkZV9jb3JlOjpkZTo6V2l0aERlY2ltYWxQb2ludCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmhmNGZmZmI1OTBhNTRlNWFinAF8PGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpyYXdfdmVjOjpSYXdWZWNJbm5lcjxfPj46OnJlc2VydmU6OmRvX3Jlc2VydmVfYW5kX2hhbmRsZTo6PGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjphbGxvYzo6R2xvYmFsPp0BFl9fZXh0ZXJucmVmX2Ryb3Bfc2xpY2WeATE8dTggYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEaXNwbGF5Pjo6Zm10nwFRYWxsb2M6OnJhd192ZWM6OlJhd1ZlY0lubmVyPEE+OjpyZXNlcnZlOjpkb19yZXNlcnZlX2FuZF9oYW5kbGU6Omg2NDQwYTE3YmQ5NTY5NjlloAExPGNoYXIgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEZWJ1Zz46OmZtdKEBQGNvcmU6OnNsaWNlOjpzb3J0OjpzaGFyZWQ6OnBpdm90OjptZWRpYW4zX3JlYzo6aGU0YWZlZDNjYjI4YzUxZWOiAUFhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI8QT46Omdyb3dfYW1vcnRpemVkOjpoNmY5ODlhYzhjNzhjZWViMKMBfzxhbGxvY1szY2E1MDFlZGZmM2YwYzdjXTo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI8Xz4+OjpyZXNlcnZlOjpkb19yZXNlcnZlX2FuZF9oYW5kbGU6OjxhbGxvY1szY2E1MDFlZGZmM2YwYzdjXTo6YWxsb2M6Okdsb2JhbD5bMV2kAUFzZXJkZV93YXNtX2JpbmRnZW46OmRlOjpEZXNlcmlhbGl6ZXI6OmFzX2J5dGVzOjpoYWE3ZmNmZjU1NDgxYjcwYqUBPzxhbGxvY1szY2E1MDFlZGZmM2YwYzdjXTo6cmF3X3ZlYzo6UmF3VmVjSW5uZXI+OjpmaW5pc2hfZ3Jvd1sxXaYBUXN0ZDo6c3lzOjp0aHJlYWRfbG9jYWw6Om5vX3RocmVhZHM6OkxhenlTdG9yYWdlPFQ+Ojppbml0aWFsaXplOjpoNjFjZjYxNjcyZjA4NDcwY6cBQzx3YXNtX2JpbmRnZW46OkpzVmFsdWUgYXMgY29yZTo6Zm10OjpEZWJ1Zz46OmZtdDo6aDMxZmMwMjgzNjE0NzJhY2OoAQhfX211bHRpM6kBejxzdGRbYTU0Mzk5NmU2ZTdkYmYxZV06OnBhbmlja2luZzo6cGFuaWNfaGFuZGxlcjo6Rm9ybWF0U3RyaW5nUGF5bG9hZCBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpwYW5pYzo6UGFuaWNQYXlsb2FkPjo6Z2V0qgE8c3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6OntjbG9zdXJlIzB9qwEZX19leHRlcm5yZWZfdGFibGVfZGVhbGxvY6wBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDU4NDk0ZDk1ZmJmY2VlMmKtAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoODI0ZjQ0ODBjZjhhOWZkMa4BOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6Omg4MWM0YTM4ODg0OGQzMzUwrwE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aGFmZjc0YjNlMGIyM2Y4OTawAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoNDU5ZGE0MzY3ZWY3OTJhNLEBOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6OmgyNjk4MGIyMTM1NzY3MDc2sgE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aDAzYjA3NTRhYzRlZDQ1N2WzAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoMGJmMzQ0OWE2NzhiYTU3ZLQBOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6OmhmNTQ0Mjc3YWEyOTQ3YjdktQE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aDExY2JhMmViNjAxMmY5YWS2AThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoMmY2MTllNzA4MWNlODE0NLcBOGFsbG9jOjpyYXdfdmVjOjpSYXdWZWM8VCxBPjo6Z3Jvd19vbmU6OmgzN2U5NGVjNWU5M2NiYTMyuAE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aGQzNTljNmE5ZGQ1ZDNiYje5AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmhmNWE4NzU2NDMxNWYxNmU0ugE4PGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpyYXdfdmVjOjpSYXdWZWM8dTg+Pjo6Z3Jvd19vbmW7AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgzMzZhYTczMzc5NmQ4NWJlvAFZPGRsbWFsbG9jW2UyNGEyNzcwMDYzNGQ2MDldOjpzeXM6OlN5c3RlbSBhcyBkbG1hbGxvY1tlMjRhMjc3MDA2MzRkNjA5XTo6QWxsb2NhdG9yPjo6YWxsb2O9AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6Omg2ODUxOWZkZDI0YmFmYjYwvgEoX19ydXN0Y1tiNzk3NGU4NjkwNDMwZGQ5XTo6X19yZGxfZGVhbGxvY78BLWNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnJlc3VsdDo6dW53cmFwX2ZhaWxlZMABPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDI5OTc0ODc2MTkxYjgxNjPBAQVyb3VuZMIBNnNlcmRlX2NvcmU6OmRlOjpFcnJvcjo6aW52YWxpZF90eXBlOjpoOTAwYmYzZTE0NjNmZWVkOcMBN3NlcmRlX2NvcmU6OmRlOjpFcnJvcjo6aW52YWxpZF92YWx1ZTo6aDNjZDkyNmIyODRhMmFkNWLEATZzZXJkZV9jb3JlOjpkZTo6RXJyb3I6OmludmFsaWRfdHlwZTo6aDY4NWE2MjQ4MGY2NDU3NTXFAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgwNjg4MmU2YzkxNjUyOWY4xgE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoMTIyZmY5MzUzMTZhYmM2MMcBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDI3MDBkZTkzMDNmYTU5ZGPIAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6Omg1ODgzODFkZjA1OGVjNTQwyQE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoYWY4ZWJkNTAzMWNjZjUwOcoBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aGIyMDJkZjczYzM5MTRkYWTLAT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmhiMTA5YjllNGI4MjU1NjdkzAFaPGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpzdHJpbmc6OlN0cmluZyBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpmbXQ6OldyaXRlPjo6d3JpdGVfc3RyzQFYPGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpzdHJpbmc6OlN0cmluZyBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpjbG9uZTo6Q2xvbmU+OjpjbG9uZc4BPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDhmMmEwNmY0MDY4YTQyNDfPAV08YWxsb2NbM2NhNTAxZWRmZjNmMGM3Y106OnN0cmluZzo6U3RyaW5nIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6V3JpdGU+Ojp3cml0ZV9zdHJbMV3QATVjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpwYW5pY2tpbmc6OnBhbmljX2JvdW5kc19jaGVja9EBFHJvdXRlU2ltcGxlUm91dGVKc29u0gFEc3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpzeXM6OnJhbmRvbTo6dW5zdXBwb3J0ZWQ6Omhhc2htYXBfcmFuZG9tX2tleXPTAQZtZW1jbXDUATZ3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fc3RyaW5nX2dldDo6aGZiNzQ5YTRiY2M3OWY0ZGPVAVA8c2VyZGVfd2FzbV9iaW5kZ2VuOjplcnJvcjo6RXJyb3IgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoYTNlNGZmMTcxODdmNGIxMNYBN3NlcmRlX2NvcmU6OmRlOjpFcnJvcjo6bWlzc2luZ19maWVsZDo6aGU2NmMxOGNmM2I0MGM1ZTnXATlzZXJkZV9jb3JlOjpkZTo6RXJyb3I6OmR1cGxpY2F0ZV9maWVsZDo6aGQ4ZjkwZTk2MTMyZWQ2ZjTYATdzdGRbYTU0Mzk5NmU2ZTdkYmYxZV06OnBhbmlja2luZzo6cGFuaWNfY291bnQ6OmluY3JlYXNl2QE2d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX251bWJlcl9nZXQ6Omg1NmNiOTI4N2QxNzU5OGY32gE9d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2JpZ2ludF9nZXRfYXNfaTY0OjpoZjNhNGEzZmYyZDAzMjQ3NtsBMjxmNjQgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEaXNwbGF5Pjo6Zm103AE4YWxsb2M6OnJhd192ZWM6OlJhd1ZlYzxULEE+Ojpncm93X29uZTo6aGJjNzFhYWNkY2NjMGEwOTbdAThhbGxvYzo6cmF3X3ZlYzo6UmF3VmVjPFQsQT46Omdyb3dfb25lOjpoNTgwZjZjMzUzN2NiMDZjZd4BfDxzdGRbYTU0Mzk5NmU2ZTdkYmYxZV06OnBhbmlja2luZzo6cGFuaWNfaGFuZGxlcjo6U3RhdGljU3RyUGF5bG9hZCBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpwYW5pYzo6UGFuaWNQYXlsb2FkPjo6dGFrZV9ib3jfASxjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpwYW5pY2tpbmc6OnBhbmljX2ZtdOABEV9fd2JpbmRnZW5fbWFsbG9j4QFzPHN0ZFthNTQzOTk2ZTZlN2RiZjFlXTo6cGFuaWNraW5nOjpwYW5pY19oYW5kbGVyOjpGb3JtYXRTdHJpbmdQYXlsb2FkIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGlzcGxheT46OmZtdOIBQGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnBhbmlja2luZzo6YXNzZXJ0X2ZhaWxlZDo6PHVzaXplLCB1c2l6ZT7jATxjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpwYW5pY2tpbmc6OmFzc2VydF9mYWlsZWQ6Ojx1NjQsIHU2ND7kAUQ8Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpGb3JtYXR0ZXI+OjpwYWRfaW50ZWdyYWw6OndyaXRlX3ByZWZpeOUBTWhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6e3tjbG9zdXJlfX06Omg4ZjExZDk5MTE2MTNjZmI55gFNaGFzaGJyb3duOjpyYXc6OlJhd1RhYmxlPFQsQT46OnJlc2VydmVfcmVoYXNoOjp7e2Nsb3N1cmV9fTo6aDI4NDM2MmVhMzQzNzY5ZjjnAU1oYXNoYnJvd246OnJhdzo6UmF3VGFibGU8VCxBPjo6cmVzZXJ2ZV9yZWhhc2g6Ont7Y2xvc3VyZX19OjpoNDI3NGQ1NDU5NTYwZDA5MugBTWhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6e3tjbG9zdXJlfX06Omg3ZDllYzk2YWE2NmZkNDE16QEaX193YmluZGdlbl9kZXN0cm95X2Nsb3N1cmXqARJfX3diaW5kZ2VuX3JlYWxsb2PrATdzZXJkZV93YXNtX2JpbmRnZW46OmRlOjpjb252ZXJ0X3BhaXI6OmhhZDk1N2UxODAzNDJlNjlm7AE0Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6Y2VsbDo6cGFuaWNfYWxyZWFkeV9ib3Jyb3dlZO0BTWhhc2hicm93bjo6cmF3OjpSYXdUYWJsZTxULEE+OjpyZXNlcnZlX3JlaGFzaDo6e3tjbG9zdXJlfX06OmhkYzdlZTUwM2JiMzFkNzg27gFDc2VyZGVfd2FzbV9iaW5kZ2VuOjpkZTo6RGVzZXJpYWxpemVyOjppc19udWxsaXNoOjpoYmRkOTBmMzhkYmE4MTQ3Ye8BSnNlcmRlX3dhc21fYmluZGdlbjo6ZGU6OkRlc2VyaWFsaXplcjo6YXNfb2JqZWN0X2VudHJpZXM6Omg5ZGUwMzZkOWIzNzllMzY18AEsX19ydXN0Y1tiNzk3NGU4NjkwNDMwZGQ5XTo6cnVzdF9iZWdpbl91bndpbmTxATNyb3V0ZVNpbXBsZVJvdXRlSnNvbiBleHRlcm5yZWYgc2hpbSBtdWx0aXZhbHVlIHNoaW3yAVdzZXJkZTo6cHJpdmF0ZTo6ZGU6OmNvbnRlbnQ6OkNvbnRlbnRSZWZEZXNlcmlhbGl6ZXI8RT46OmludmFsaWRfdHlwZTo6aGIwNWZmMjE0MDg4MzBkMTfzAUhzZXJkZV93YXNtX2JpbmRnZW46OmRlOjpEZXNlcmlhbGl6ZXI6OmFzX3NhZmVfaW50ZWdlcjo6aDFjNzFiMjYwZmJlMzhlZTj0ASZzdGRbYTU0Mzk5NmU2ZTdkYmYxZV06OmFsbG9jOjpydXN0X29vbfUBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aGMyYTU3NmQ1YWY4M2E4ZTb2AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgxNzQxMmE0N2FmZDY3M2Q59wE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoMmRhNjg3NDIyYzdmMDZmMfgBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDJmOWUxYzQ2MDMyOTRmNzD5AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgzNTBiNDlkMmM4YTFlNWY3+gE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoNzA1MjA3NTRhOGIzMjY2Y/sBPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDgzNmViNmQ3OWJhN2FjYWL8AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmhjMzlmYmJjZDlkMTA0NmEy/QE9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoZTZjZjExYThiZmVhNDMzOf4BOjxoYXNoYnJvd25bNWU2MTlkN2QxMTI5YzU5Zl06OnJhdzo6RmFsbGliaWxpdHk+OjphbGxvY19lcnL/AT13YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjpfOjppbnZva2U6OmgzZjZkYTA3MGI4NWY3YjA1gAI9d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6Xzo6aW52b2tlOjpoNjYzNzkyMTg0ZjMwYmMzNYECMzxib29sIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGlzcGxheT46OmZtdIICPXdhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Ol86Omludm9rZTo6aDI3OGI3NTEyZWI0NWE2ZmWDAocBPDxzZXJkZV9jb3JlOjpkZTo6V2l0aERlY2ltYWxQb2ludCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6Okxvb2tGb3JEZWNpbWFsUG9pbnQgYXMgY29yZTo6Zm10OjpXcml0ZT46OndyaXRlX2NoYXI6Omg3N2QzOGFjODdlMTRjODRjhAJyY29yZVtjNTkzMGM4NWExMmRlODIyXTo6cHRyOjpkcm9wX2luX3BsYWNlOjo8c3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6OkZvcm1hdFN0cmluZ1BheWxvYWQ+hQIzc3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjphbGxvYzo6cnVzdF9vb206OntjbG9zdXJlIzB9hgJCPGhhc2hicm93bls1ZTYxOWQ3ZDExMjljNTlmXTo6cmF3OjpGYWxsaWJpbGl0eT46OmNhcGFjaXR5X292ZXJmbG93hwIjcm91dGVTaW1wbGVSb3V0ZUpzb24gZXh0ZXJucmVmIHNoaW2IAmc8JnNlcmRlX3dhc21fYmluZGdlbjo6c2VyOjpTZXJpYWxpemVyIGFzIHNlcmRlX2NvcmU6OnNlcjo6U2VyaWFsaXplcj46OnNlcmlhbGl6ZV9zZXE6Omg2NDQxZWZkMmFiMDhmMzk4iQI3d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0OjpoZjg3MTg1ODIzNDUxZjc5ZIoCe2NvcmVbYzU5MzBjODVhMTJkZTgyMl06OnB0cjo6ZHJvcF9pbl9wbGFjZTo6PGNvcmVbYzU5MzBjODVhMTJkZTgyMl06Om9wdGlvbjo6T3B0aW9uPGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjp2ZWM6OlZlYzx1OD4+PosCVWNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnB0cjo6ZHJvcF9pbl9wbGFjZTo6PGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpzdHJpbmc6OlN0cmluZz6MAiZfX3J1c3RjW2I3OTc0ZTg2OTA0MzBkZDldOjpfX3JkbF9hbGxvY40CWGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnB0cjo6ZHJvcF9pbl9wbGFjZTo6PGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpzdHJpbmc6OlN0cmluZz5bMV2OAgRmbWF4jwJ6c2VyZGVfd2FzbV9iaW5kZ2VuOjpPYmplY3RFeHQ6OmdldF93aXRoX3JlZl9rZXk6Ol9fd2JnX2dldF93aXRoX3JlZl9rZXlfNjQxMmNmMzA5NDU5OTY5NDo6aDVhMmNhYjFlODVhYTQxYzkgZXh0ZXJucmVmIHNoaW2QAmBzZXJkZV93YXNtX2JpbmRnZW46Ok9iamVjdEV4dDo6c2V0OjpfX3diZ19zZXRfNmJlNDI3NjhjNjkwZTM4MDo6aDEyOWEwMTk0YjI0MmJlZmMgZXh0ZXJucmVmIHNoaW2RAllqc19zeXM6OlJlZmxlY3Q6OmdldF9zeW1ib2w6Ol9fd2JnX2dldF85Y2ZlYTliN2JiZjEyYTE1OjpoODAyZDJmNWZkYTk2OTNmZCBleHRlcm5yZWYgc2hpbZICWWpzX3N5czo6RnVuY3Rpb248Rj46OmNhbGwwOjpfX3diZ19jYWxsX2FkZDllNWE3NjM4MmU2Njg6OmhiZWM2OTk3MTg2NjI3YmQwIGV4dGVybnJlZiBzaGltkwIuYWxsb2NbM2NhNTAxZWRmZjNmMGM3Y106OnJhd192ZWM6OmhhbmRsZV9lcnJvcpQCZ2pzX3N5czo6QXJyYXk8VD46OmdldF91bmNoZWNrZWQ6Ol9fd2JnX2dldF91bmNoZWNrZWRfYmU1NjJiMTQyMTY1NjMyMTo6aDNkMDNiZDE1NWM1MjU2M2IgZXh0ZXJucmVmIHNoaW2VAlNqc19zeXM6OkFycmF5PFQ+OjpnZXQ6Ol9fd2JnX2dldF82NTJmNjQwYjNiMGI2ZTNlOjpoN2U1ZjM1MTg2ZDVlNjUzNSBleHRlcm5yZWYgc2hpbZYCKGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnBhbmlja2luZzo6cGFuaWOXAlU8Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpBcmd1bWVudHMgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEaXNwbGF5Pjo6Zm10mAJYanNfc3lzOjpJdGVyYXRvcjxUPjo6bmV4dDo6X193YmdfbmV4dF9hYWNlZTMxMGJjZmU2NDYxOjpoZTk3Y2M0ZTIxNDM1NGRiNSBleHRlcm5yZWYgc2hpbZkCXmpzX3N5czo6SXRlcmF0b3JOZXh0PFQ+Ojp2YWx1ZTo6X193YmdfdmFsdWVfZjg1MjcxNmFjZGViM2U4Mjo6aGE5ODYwZWFkY2RiNjY2Y2IgZXh0ZXJucmVmIHNoaW2aAlVqc19zeXM6OlVpbnQ4QXJyYXk6Om5ldzo6X193YmdfbmV3Xzg0NTRlZWU2NzJiMmJhNmU6OmhjN2U3N2U2ZDhlZTVjNTg5IGV4dGVybnJlZiBzaGltmwJZanNfc3lzOjpPYmplY3Q6OmVudHJpZXM6Ol9fd2JnX2VudHJpZXNfYmI5ODQzYmE3M2RjNzBkNjo6aDI0MTcyZDNjMzE4NDIzODIgZXh0ZXJucmVmIHNoaW2cAnlqc19zeXM6Okl0ZXJhdG9yOjpsb29rc19saWtlX2l0ZXJhdG9yOjpNYXliZUl0ZXJhdG9yOjpuZXh0OjpfX3diZ19uZXh0XzI2MWMzYzQ4YzZlMzA5YTU6Omg2Y2NhMjViNzQyMWQyM2I4IGV4dGVybnJlZiBzaGltnQJid2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2Vycm9yX25ldzo6X193YmdfRXJyb3JfMzYzOWE2MGVkMTVmODdlNzo6aDQ4MWM3MDkxNGY1Yzk3MmQgZXh0ZXJucmVmIHNoaW2eAidSZWYoU3RyaW5nKSAtPiBFeHRlcm5yZWYgZXh0ZXJucmVmIHNoaW2fAmc8JnNlcmRlX3dhc21fYmluZGdlbjo6c2VyOjpTZXJpYWxpemVyIGFzIHNlcmRlX2NvcmU6OnNlcjo6U2VyaWFsaXplcj46OnNlcmlhbGl6ZV9zdHI6OmgwMDdkNzUyYTM1ZTFhYjFkoAJWPGFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjpzdHJpbmc6OlN0cmluZyBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjphbnk6OkFueT46OnR5cGVfaWShAjM8JnN0ciBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjphbnk6OkFueT46OnR5cGVfaWSiAjM8Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpGb3JtYXR0ZXI+Ojp3cml0ZV9zdHKjAlNqc19zeXM6OkFycmF5PFQ+OjpzZXQ6Ol9fd2JnX3NldF9mNjE0ZjZhMDYwOGQxZDFkOjpoZmQ0MDFlMWE3YWE5MDk5ZCBleHRlcm5yZWYgc2hpbaQCH0Y2NCAtPiBFeHRlcm5yZWYgZXh0ZXJucmVmIHNoaW2lAh9JNjQgLT4gRXh0ZXJucmVmIGV4dGVybnJlZiBzaGltpgIfVTY0IC0+IEV4dGVybnJlZiBleHRlcm5yZWYgc2hpbacCZzwmc2VyZGVfd2FzbV9iaW5kZ2VuOjpzZXI6OlNlcmlhbGl6ZXIgYXMgc2VyZGVfY29yZTo6c2VyOjpTZXJpYWxpemVyPjo6c2VyaWFsaXplX2Y2NDo6aGFjYmQ3YWY0MDYwNjhjYzOoAi53YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faW46Omg0MjRlMThiYTg4NTdhNmEyqQI0d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2pzdmFsX2VxOjpoYTA3ZGNiMjZlMTZmNTViNaoCOndhc21fYmluZGdlbjo6X193YmluZGdlbl9qc3ZhbF9sb29zZV9lcTo6aDQ2YWQ3MDgyNjk0MWM0NjarAi1jb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpzdHI6OnNsaWNlX2Vycm9yX2ZhaWysAlQ8JmR5biBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpmbXQ6OkRlYnVnIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGVidWc+OjpmbXStAlo8Y29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpGb3JtYXR0ZXIgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpXcml0ZT46OndyaXRlX2NoYXKuAlBqc19zeXM6OkFycmF5OjpuZXc6Ol9fd2JnX25ld18zYmFhOGQ5ODY2MTU1Yzc5OjpoZGVhY2NkMzgxNjUxODk1MCBleHRlcm5yZWYgc2hpba8CUWpzX3N5czo6T2JqZWN0OjpuZXc6Ol9fd2JnX25ld18yZmFkOGNhMDJmZDAwNjg0OjpoMTg2ZDRiMTk2NGFlZGNlMCBleHRlcm5yZWYgc2hpbbACW2pzX3N5czo6U3ltYm9sOjppdGVyYXRvcjo6X193YmdfaXRlcmF0b3JfOWQ2ODk4NWExZDA5NmZjMjo6aDFjZmVkMmJmNGNjMTViOTAgZXh0ZXJucmVmIHNoaW2xAlY8YWxsb2NbM2NhNTAxZWRmZjNmMGM3Y106OnN0cmluZzo6U3RyaW5nIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGlzcGxheT46OmZtdLICMjwmVCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmhkZDM1ZGFmNmRkZTZlMjVmswIyPCZUIGFzIGNvcmU6OmZtdDo6RGlzcGxheT46OmZtdDo6aGMxZDA5ZTMzNThhY2QwMjC0AilfX3J1c3RjW2I3OTc0ZTg2OTA0MzBkZDldOjpfX3J1c3RfcmVhbGxvY7UCMjwmVCBhcyBjb3JlOjpmbXQ6OkRpc3BsYXk+OjpmbXQ6OmhiYzA1YzQ5ZjA0MGUyZDI5tgJqPCZzZXJkZV93YXNtX2JpbmRnZW46OnNlcjo6U2VyaWFsaXplciBhcyBzZXJkZV9jb3JlOjpzZXI6OlNlcmlhbGl6ZXI+OjpzZXJpYWxpemVfc3RydWN0OjpoYjcyY2FiZTY3YzcxOWU4Y7cCWTxhbGxvY1szY2E1MDFlZGZmM2YwYzdjXTo6c3RyaW5nOjpTdHJpbmcgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEaXNwbGF5Pjo6Zm10WzFduAIUX193YmluZGdlbl9leG5fc3RvcmW5AjA8JlQgYXMgY29yZTo6Zm10OjpEZWJ1Zz46OmZtdDo6aDdhMDQyNzQ2MWZlZWIwZmS6Anc8c3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6OlN0YXRpY1N0clBheWxvYWQgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6cGFuaWM6OlBhbmljUGF5bG9hZD46OmdldLsCcDxzdGRbYTU0Mzk5NmU2ZTdkYmYxZV06OnBhbmlja2luZzo6cGFuaWNfaGFuZGxlcjo6U3RhdGljU3RyUGF5bG9hZCBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpmbXQ6OkRpc3BsYXk+OjpmbXS8AjM8JnN0ciBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpmbXQ6OkRpc3BsYXk+OjpmbXS9AhtfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWa+AilfX3J1c3RjW2I3OTc0ZTg2OTA0MzBkZDldOjpfX3J1c3RfZGVhbGxvY78CQnNlcmRlX3dhc21fYmluZGdlbjo6T2JqZWN0RXh0OjpnZXRfd2l0aF9yZWZfa2V5OjpoNzM1MWY2OWFmMjM4NWFlZMACNXNlcmRlX3dhc21fYmluZGdlbjo6T2JqZWN0RXh0OjpzZXQ6OmhmMjYwZWUwOWQ4MmQxZTgxwQJianNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpVaW50OEFycmF5Pjo6aW5zdGFuY2VvZjo6aDQ3OTc1NWJmZmY4MDY2NTXCAmNqc19zeXM6Ol86OjxpbXBsIHdhc21fYmluZGdlbjo6Y2FzdDo6SnNDYXN0IGZvciBqc19zeXM6OkFycmF5QnVmZmVyPjo6aW5zdGFuY2VvZjo6aDA1NzhhMjQ2MjRlMGU1NzLDAipqc19zeXM6OkFycmF5Ojppc19hcnJheTo6aDViYTdlNmNjNzBhOTMzYjjEAjJqc19zeXM6Ok51bWJlcjo6aXNfc2FmZV9pbnRlZ2VyOjpoNzg4ZGM4YTU2OTU2MzM1ZsUCM3dhc21fYmluZGdlbjo6X193YmluZGdlbl9pc19udWxsOjpoMmY4ODhmOGM1ZjMyNDU5NsYCNXdhc21fYmluZGdlbjo6X193YmluZGdlbl9pc19iaWdpbnQ6OmgwNWNkYTk3NjFjYjFlYjJlxwI1d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX29iamVjdDo6aDdlNjJjOWUwYmEwNTkwZGPIAjd3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfZnVuY3Rpb246Omg2OWEyZGY0MGY4ZjE4YzY1yQI4d2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX3VuZGVmaW5lZDo6aGQ2ZDBhM2UwZTE3OGQ3YjbKAi5jb3JlOjpmbXQ6OldyaXRlOjp3cml0ZV9mbXQ6OmhmNTFmYzYyZjQ4MjU4Y2VjywJMPGR5biBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoNWU4MGJjZjViNzRhY2Y4YswCJV9fcnVzdGNbYjc5NzRlODY5MDQzMGRkOV06OnJ1c3RfcGFuaWPNAlo8YWxsb2NbM2NhNTAxZWRmZjNmMGM3Y106OnN0cmluZzo6U3RyaW5nIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6V3JpdGU+Ojp3cml0ZV9mbXTOAjNhbGxvY1szY2E1MDFlZGZmM2YwYzdjXTo6cmF3X3ZlYzo6Y2FwYWNpdHlfb3ZlcmZsb3fPAl08YWxsb2NbM2NhNTAxZWRmZjNmMGM3Y106OnN0cmluZzo6U3RyaW5nIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6V3JpdGU+Ojp3cml0ZV9mbXRbMV3QAi1jb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpvcHRpb246OnVud3JhcF9mYWlsZWTRAkdjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpwYW5pY2tpbmc6OnBhbmljX2NvbnN0OjpwYW5pY19jb25zdF9kaXZfYnlfemVyb9ICTmNvcmVbYzU5MzBjODVhMTJkZTgyMl06OnNsaWNlOjpzb3J0OjpzaGFyZWQ6OnNtYWxsc29ydDo6cGFuaWNfb25fb3JkX3Zpb2xhdGlvbtMCbGpzX3N5czo6VWludDhBcnJheTo6Y29weV90b19zbGljZTo6X193YmdfcHJvdG90eXBlc2V0Y2FsbF9mZDQwNTBlODA2ZTFkNTE5OjpoOGJlMzQwMmRmY2M3MDBiMCBleHRlcm5yZWYgc2hpbdQCY3dhc21fYmluZGdlbjo6X193YmluZGdlbl9pbjo6X193YmdfX193YmluZGdlbl9pbl8yNjE3ZmE3NjM5NzYyMGQzOjpoNjZkMDYwOTdiMTFhNmY0OSBleHRlcm5yZWYgc2hpbdUCb3dhc21fYmluZGdlbjo6X193YmluZGdlbl9qc3ZhbF9lcTo6X193YmdfX193YmluZGdlbl9qc3ZhbF9lcV80MDNlYWEzNjEwNTAwYTI1OjpoY2NkYjI0OGIxNTdmZjMzNSBleHRlcm5yZWYgc2hpbdYCe3dhc21fYmluZGdlbjo6X193YmluZGdlbl9qc3ZhbF9sb29zZV9lcTo6X193YmdfX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcV8xOTc4ZjFlNzdiNGJjZTYyOjpoZWE2NzVjYTVkYzg0MDczMiBleHRlcm5yZWYgc2hpbdcCNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDExZjRjNWU5OWI1MTk4ZTnYAjc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmgxNjFlNDczNTA2NmE0YzEx2QI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoMmJhNzJjOGU2ODEwMGJhNdoCNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDJmY2I4YTgwNDAzYzg1MGPbAjc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmgzM2IwNmQyMTQ0NDY2MTNl3AI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoNDUyMzU0OTFhZWY0ZDhiNN0CNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDU4NzUxY2Y5ODczN2U1YzjeAjc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmhkMjY3Y2U1Y2FkODA3Y2E33wInX19ydXN0Y1tiNzk3NGU4NjkwNDMwZGQ5XTo6X19ydXN0X2FsbG9j4AIqd2FzbV9iaW5kZ2VuOjp0aHJvd19zdHI6OmhiMWYzMTkxZDFlMWU0NTkz4QJmPHNlcmRlOjpwcml2YXRlOjpkZTo6Y29udGVudDo6Q29udGVudFZpc2l0b3IgYXMgc2VyZGVfY29yZTo6ZGU6OlZpc2l0b3I+OjpleHBlY3Rpbmc6OmgzYzNjNTk3YmFkZDk2ZDg24gKaATxzZXJkZV9jb3JlOjpkZTo6aW1wbHM6OjxpbXBsIHNlcmRlX2NvcmU6OmRlOjpEZXNlcmlhbGl6ZSBmb3IgdTg+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aGI3MDRhMDQ0NDlkYTNlYzjjApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciBmMzI+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aGVlY2JkNGRmZTU4NWQxYznkApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciBmNjQ+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aDE5MGM0NWQxNTIyZmI5N2blApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciBpMzI+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aGJmMWE2NGUzMTI3YTRkNDjmApsBPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciB1MzI+OjpkZXNlcmlhbGl6ZTo6UHJpbWl0aXZlVmlzaXRvciBhcyBzZXJkZV9jb3JlOjpkZTo6VmlzaXRvcj46OmV4cGVjdGluZzo6aDA4NTE0MTQ4NTQxZjY1M2PnAp0BPHNlcmRlX2NvcmU6OmRlOjppbXBsczo6PGltcGwgc2VyZGVfY29yZTo6ZGU6OkRlc2VyaWFsaXplIGZvciB1c2l6ZT46OmRlc2VyaWFsaXplOjpQcmltaXRpdmVWaXNpdG9yIGFzIHNlcmRlX2NvcmU6OmRlOjpWaXNpdG9yPjo6ZXhwZWN0aW5nOjpoODY1NThkMDdmMzRmNzI3YugCXzxzZXJkZV9jb3JlOjpkZTo6aW1wbHM6OlN0cmluZ1Zpc2l0b3IgYXMgc2VyZGVfY29yZTo6ZGU6OlZpc2l0b3I+OjpleHBlY3Rpbmc6OmhiNGUxNTIzM2MxNzJiYjg56QI1X19ydXN0Y1tiNzk3NGU4NjkwNDMwZGQ5XTo6X19ydXN0X2FsbG9jX2Vycm9yX2hhbmRsZXLqAno8c3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6OlN0YXRpY1N0clBheWxvYWQgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6cGFuaWM6OlBhbmljUGF5bG9hZD46OmFzX3N0cusCMmFsbG9jWzNjYTUwMWVkZmYzZjBjN2NdOjphbGxvYzo6aGFuZGxlX2FsbG9jX2Vycm9y7AJPPGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RXJyb3IgYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6Zm10OjpEZWJ1Zz46OmZtdO0CWzxjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpjZWxsOjpCb3Jyb3dNdXRFcnJvciBhcyBjb3JlW2M1OTMwYzg1YTEyZGU4MjJdOjpmbXQ6OkRpc3BsYXk+OjpmbXTuAjI8c3RyIGFzIGNvcmVbYzU5MzBjODVhMTJkZTgyMl06OmZtdDo6RGlzcGxheT46OmZtdO8CiQE8c2VyZGVfd2FzbV9iaW5kZ2VuOjplcnJvcjo6RXJyb3IgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10Ojp0b19zdHJpbmc6Ol9fd2JnX1N0cmluZ184NTY0ZTU1OTc5OWVjY2RhOjpoNjJmMGM3ODI0M2IxYjFjNSBleHRlcm5yZWYgc2hpbfACc3dhc21fYmluZGdlbjo6X193YmluZGdlbl9zdHJpbmdfZ2V0OjpfX3diZ19fX3diaW5kZ2VuX3N0cmluZ19nZXRfOTY1NTkyMDczZTVkODQ4Yzo6aGQ0MjI2NzMyMTM4ODY2MGUgZXh0ZXJucmVmIHNoaW3xAnN3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fbnVtYmVyX2dldDo6X193YmdfX193YmluZGdlbl9udW1iZXJfZ2V0X2RkNmQ2OWE2MDc5ZjI2ZjE6Omg1MWJjZjhiNzRkZDM2MTUxIGV4dGVybnJlZiBzaGlt8gKBAXdhc21fYmluZGdlbjo6X193YmluZGdlbl9iaWdpbnRfZ2V0X2FzX2k2NDo6X193YmdfX193YmluZGdlbl9iaWdpbnRfZ2V0X2FzX2k2NF8zYWY2ZDRjYTc3MTkzYTRiOjpoNDRkZDA3MTgyM2E2MWU4MyBleHRlcm5yZWYgc2hpbfMCd3dhc21fYmluZGdlbjo6X193YmluZGdlbl9kZWJ1Z19zdHJpbmc6Ol9fd2JnX19fd2JpbmRnZW5fZGVidWdfc3RyaW5nXzA3Y2I3MmNmY2M5NTJlMmI6Omg0Y2YxMGUxYTFmNDQ2OGUyIGV4dGVybnJlZiBzaGlt9AI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoMDhkMDM1MjA3YzVkN2NjZfUCNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDBmYjNkMzVkYmFjYTNhMTn2Ajc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmgyNDY2MjZjZDJkZjM1ZDE39wI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoNDA3YzRkOWU1ZTc5NjljZfgCNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aDQ4ZmZkNDU2YmI5NjExZTL5Ajc8VCBhcyBzZXJkZV9jb3JlOjpkZTo6RXhwZWN0ZWQ+OjpmbXQ6OmhjY2VkM2FlZjZjMWViMTE2+gI3PFQgYXMgc2VyZGVfY29yZTo6ZGU6OkV4cGVjdGVkPjo6Zm10OjpoY2U0MjM2MGNlMTI3MTFiMfsCNzxUIGFzIHNlcmRlX2NvcmU6OmRlOjpFeHBlY3RlZD46OmZtdDo6aGU5ODUwNzViZGJlMDE2MjP8Ak08anNfc3lzOjpKc1N0cmluZyBhcyBjb3JlOjpzdHI6OnRyYWl0czo6RnJvbVN0cj46OmZyb21fc3RyOjpoN2QyOGY1MGQwODRkOWI1M/0CKmpzX3N5czo6VWludDhBcnJheTo6bmV3OjpoYjE3MjVmNWQ3NDNhZTczZf4CKmpzX3N5czo6T2JqZWN0OjplbnRyaWVzOjpoY2EzYTA3ZGY4YzA2M2RiYv8CMXdhc21fYmluZGdlbjo6X193YmluZGdlbl90aHJvdzo6aDhjMjkyZjQ0MzhmNDE4NjeAAzV3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fYXNfbnVtYmVyOjpoNTViOWEwZmQ2NGY3N2FkN4EDNXdhc21fYmluZGdlbjo6X193YmluZGdlbl9lcnJvcl9uZXc6OmhhYzVlNGI1ZjJhOWM5OTMxggN7c3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpzeXM6OmJhY2t0cmFjZTo6X19ydXN0X2VuZF9zaG9ydF9iYWNrdHJhY2U6OjxzdGRbYTU0Mzk5NmU2ZTdkYmYxZV06OmFsbG9jOjpydXN0X29vbTo6e2Nsb3N1cmUjMH0sICE+gwOEAXN0ZFthNTQzOTk2ZTZlN2RiZjFlXTo6c3lzOjpiYWNrdHJhY2U6Ol9fcnVzdF9lbmRfc2hvcnRfYmFja3RyYWNlOjo8c3RkW2E1NDM5OTZlNmU3ZGJmMWVdOjpwYW5pY2tpbmc6OnBhbmljX2hhbmRsZXI6OntjbG9zdXJlIzB9LCAhPoQDNnN0ZFthNTQzOTk2ZTZlN2RiZjFlXTo6YWxsb2M6OmRlZmF1bHRfYWxsb2NfZXJyb3JfaG9va4UDdTxzdGRbYTU0Mzk5NmU2ZTdkYmYxZV06OnBhbmlja2luZzo6YmVnaW5fcGFuaWM6OlBheWxvYWQ8JnN0cj4gYXMgY29yZVtjNTkzMGM4NWExMmRlODIyXTo6cGFuaWM6OlBhbmljUGF5bG9hZD46OmFzX3N0coYDlgFqc19zeXM6Ol86OjxpbXBsIHdhc21fYmluZGdlbjo6Y2FzdDo6SnNDYXN0IGZvciBqc19zeXM6Ok1hcDxLLFY+Pjo6aW5zdGFuY2VvZjo6X193YmdfaW5zdGFuY2VvZl9NYXBfMTBkNGVkZjYwZmNmOTMyNzo6aGFmZmEzZjNlMjM2YzI0MDMgZXh0ZXJucmVmIHNoaW2HA1lqc19zeXM6OkFycmF5PFQ+OjpsZW5ndGg6Ol9fd2JnX2xlbmd0aF8wYTZjZTAxNmRjMTQ2MGIwOjpoOGQ5MzU0NDFhOWZiZjliMSBleHRlcm5yZWYgc2hpbYgDXGpzX3N5czo6SXRlcmF0b3JOZXh0PFQ+Ojpkb25lOjpfX3diZ19kb25lX2IxYWZkNjIwMWFjMDQ1ZTA6OmhhMGQwZGNmMTBiZmIwYjIwIGV4dGVybnJlZiBzaGltiQNbanNfc3lzOjpVaW50OEFycmF5OjpsZW5ndGg6Ol9fd2JnX2xlbmd0aF9iYTNjMDMyNjAyZWZlMzEwOjpoNTllMTE4NmJhODIzYjlmNiBleHRlcm5yZWYgc2hpbYoDnwFqc19zeXM6Ol86OjxpbXBsIHdhc21fYmluZGdlbjo6Y2FzdDo6SnNDYXN0IGZvciBqc19zeXM6OlVpbnQ4QXJyYXk+OjppbnN0YW5jZW9mOjpfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfNTdkNzdhY2Q1MGU0YzQ0ZDo6aDI4ZjljZmJlMjgyMjUxOTggZXh0ZXJucmVmIHNoaW2LA6EBanNfc3lzOjpfOjo8aW1wbCB3YXNtX2JpbmRnZW46OmNhc3Q6OkpzQ2FzdCBmb3IganNfc3lzOjpBcnJheUJ1ZmZlcj46Omluc3RhbmNlb2Y6Ol9fd2JnX2luc3RhbmNlb2ZfQXJyYXlCdWZmZXJfZWFiOWYyOGZiZWMyMzQ3Nzo6aGUzZDZiMDBlZTdkNTNiNmMgZXh0ZXJucmVmIHNoaW2MA1lqc19zeXM6OkFycmF5Ojppc19hcnJheTo6X193YmdfaXNBcnJheV9jNmM2ZWY4MzA4OTk1YmNmOjpoNjc0OTZmY2ZjYzI4YWYyYyBleHRlcm5yZWYgc2hpbY0DZ2pzX3N5czo6TnVtYmVyOjppc19zYWZlX2ludGVnZXI6Ol9fd2JnX2lzU2FmZUludGVnZXJfM2M1NmM0MjFhNWI0Y2NlNDo6aDU0YzgzYzllMTNiYWQ3NjcgZXh0ZXJucmVmIHNoaW2OA213YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfbnVsbDo6X193YmdfX193YmluZGdlbl9pc19udWxsXzA2NjA4NmJlM2FiZTliYjM6Omg3MjRhZWQwNjcyYzk3ODY3IGV4dGVybnJlZiBzaGltjwNjd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2FzX251bWJlcjo6X193YmdfTnVtYmVyX2EzZDczN2ZkMTgzZjdkY2E6Omg2Njk4MWY5YzJlNmFmNWNiIGV4dGVybnJlZiBzaGltkANxd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX2lzX2JpZ2ludDo6X193YmdfX193YmluZGdlbl9pc19iaWdpbnRfZDZhODE2N2NhYzQwMWI5NTo6aGEwYTY3YTA3MzFmYzczZTMgZXh0ZXJucmVmIHNoaW2RA3F3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5faXNfb2JqZWN0OjpfX3diZ19fX3diaW5kZ2VuX2lzX29iamVjdF81YjIyZmYyNDE4MDYzYTljOjpoN2MzOTg3MTRiZjQ3YWE0YSBleHRlcm5yZWYgc2hpbZIDdXdhc21fYmluZGdlbjo6X193YmluZGdlbl9ib29sZWFuX2dldDo6X193YmdfX193YmluZGdlbl9ib29sZWFuX2dldF9jM2RkNWMzOWYxYjVhMTJiOjpoM2JkM2IyZWQyMmJiNzhkMCBleHRlcm5yZWYgc2hpbZMDdXdhc21fYmluZGdlbjo6X193YmluZGdlbl9pc19mdW5jdGlvbjo6X193YmdfX193YmluZGdlbl9pc19mdW5jdGlvbl8yZjBmZDdjZWI4NmU2NGM1OjpoMzZlODIyMWRjNzNjYjNhMCBleHRlcm5yZWYgc2hpbZQDd3dhc21fYmluZGdlbjo6X193YmluZGdlbl9pc191bmRlZmluZWQ6Ol9fd2JnX19fd2JpbmRnZW5faXNfdW5kZWZpbmVkXzI0NGE5MmMzNGQzYjZlYzA6OmhiZjhiYjRkZTgyYTk0M2FlIGV4dGVybnJlZiBzaGltlQMtX19ydXN0Y1tiNzk3NGU4NjkwNDMwZGQ5XTo6X19ydXN0X3N0YXJ0X3BhbmljlgM+X19ydXN0Y1tiNzk3NGU4NjkwNDMwZGQ5XTo6X19ydXN0X25vX2FsbG9jX3NoaW1faXNfdW5zdGFibGVfdjKXAyVqc19zeXM6OkFycmF5OjpuZXc6OmhiODQ2MzY5MDU0MTVmMTg4mAMmanNfc3lzOjpPYmplY3Q6Om5ldzo6aGJiZGUyMTdiYjZhOTFmOWGZAytqc19zeXM6OlN5bWJvbDo6aXRlcmF0b3I6Omg2YjA1OGJiYzI2MzcwZWMwmgMnX19ydXN0Y1tiNzk3NGU4NjkwNDMwZGQ5XTo6X19ydXN0X2Fib3J0BRgBARVfX3diaW5kZ2VuX2V4dGVybnJlZnMHEgEAD19fc3RhY2tfcG9pbnRlcgkRAgAHLnJvZGF0YQEFLmRhdGEAcAlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuOTUuMCAoNTk4MDc2MTZlIDIwMjYtMDQtMTQpBndhbHJ1cwYwLjI2LjEMd2FzbS1iaW5kZ2VuBzAuMi4xMjAAlAEPdGFyZ2V0X2ZlYXR1cmVzCCsLYnVsay1tZW1vcnkrD2J1bGstbWVtb3J5LW9wdCsWY2FsbC1pbmRpcmVjdC1vdmVybG9uZysKbXVsdGl2YWx1ZSsPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50Kw9yZWZlcmVuY2UtdHlwZXMrCHNpZ24tZXh0";function decodeWasmBase64(base64){if(typeof Buffer<"u")return new Uint8Array(Buffer.from(base64,"base64"));let binary=atob(base64),bytes=new Uint8Array(binary.length);for(let i3=0;i3<binary.length;i3+=1)bytes[i3]=binary.charCodeAt(i3);return bytes}var wasmModule=new WebAssembly.Module(decodeWasmBase64(wasmBase64)),wasmInstance=new WebAssembly.Instance(wasmModule,__wbg_get_imports()),wasm=wasmInstance.exports;wasm.__wbindgen_start()}});var require_s_expression=__commonJS({"node_modules/s-expression/index.js"(exports,module){"use strict";function SParser(stream){this._line=this._col=this._pos=0,this._stream=stream}SParser.not_whitespace_or_end=/^(\S|$)/;SParser.space_quote_paren_escaped_or_end=/^(\s|\\|"|'|`|,|\(|\)|$)/;SParser.string_or_escaped_or_end=/^(\\|"|$)/;SParser.string_delimiters=/["]/;SParser.quotes=/['`,]/;SParser.quotes_map={"'":"quote","`":"quasiquote",",":"unquote"};SParser.prototype={peek,consume,until,error:error2,string,atom,quoted,expr,list};module.exports=function SParse(stream){var parser=new SParse.Parser(stream),expression=parser.expr();return expression instanceof Error?expression:parser.peek()!=""?parser.error("Superfluous characters after expression: `"+parser.peek()+"`"):expression};module.exports.Parser=SParser;module.exports.SyntaxError=Error;function error2(msg){var e5=new Error("Syntax error: "+msg);return e5.line=this._line+1,e5.col=this._col+1,e5}function peek(){return this._stream.length==this._pos?"":this._stream[this._pos]}function consume(){if(this._stream.length==this._pos)return"";var c4=this._stream[this._pos];return this._pos+=1,c4=="\r"?(this.peek()==`
|
|
301
301
|
`&&(this._pos+=1,c4+=`
|
|
302
302
|
`),this._line++,this._col=0):c4==`
|
|
303
303
|
`?(this._line++,this._col=0):this._col++,c4}function until(regex){for(var s3="";!regex.test(this.peek());)s3+=this.consume();return s3}function string(){for(var delimiter=this.consume(),str="";;){str+=this.until(SParser.string_or_escaped_or_end);var next2=this.peek();if(next2=="")return this.error("Unterminated string literal");if(next2==delimiter){this.consume();break}if(next2=="\\"){this.consume(),next2=this.peek(),next2=="r"?(this.consume(),str+="\r"):next2=="t"?(this.consume(),str+=" "):next2=="n"?(this.consume(),str+=`
|
|
@@ -699,7 +699,7 @@ ${err.message}`):err}}let nNodes=ckt.nodes.count()-1;for(let i3=0;i3<ckt.V.lengt
|
|
|
699
699
|
${error2.stack}`),asyncEffect.complete=!0;let root2=this._getRootCircuit();root2&&root2.emit("asyncEffect:end",{asyncEffectId,effectName,componentDisplayName:this.getString(),phase:asyncEffect.phase,error:error2.toString()})})}_emitRenderLifecycleEvent(phase,startOrEnd){debug6(`${phase}:${startOrEnd} ${this.getString()}`);let granular_event_type=`renderable:renderLifecycle:${phase}:${startOrEnd}`,eventPayload={renderId:this._renderId,componentDisplayName:this.getString(),type:granular_event_type},root=this._getRootCircuit();root&&(root.emit(granular_event_type,eventPayload),root.emit("renderable:renderLifecycle:anyEvent",{...eventPayload,type:granular_event_type}))}getString(){return this.constructor.name}_hasIncompleteAsyncEffects(){return this._asyncEffects.some(effect=>!effect.complete)?!0:this.children.some(child=>typeof child._hasIncompleteAsyncEffects=="function"?child._hasIncompleteAsyncEffects():!1)}_hasIncompleteAsyncEffectsInSubtreeForPhase(phase){for(let e5 of this._asyncEffects)if(!e5.complete&&e5.phase===phase)return!0;for(let child of this.children)if(child._hasIncompleteAsyncEffectsInSubtreeForPhase(phase))return!0;return!1}_hasIncompleteAsyncEffectsForPhase(phase){let root=this._getRootCircuit();return root?._hasIncompleteAsyncEffectsForPhase?root._hasIncompleteAsyncEffectsForPhase(phase):this._hasIncompleteAsyncEffectsInSubtreeForPhase(phase)}getCurrentRenderPhase(){return this._currentRenderPhase}getRenderGraph(){return{id:this._renderId,currentPhase:this._currentRenderPhase,renderPhaseStates:this.renderPhaseStates,shouldBeRemoved:this.shouldBeRemoved,children:this.children.map(child=>child.getRenderGraph())}}getTopLevelRenderable(){let current3=this;for(;current3.parent&¤t3.parent instanceof _Renderable;)current3=current3.parent;return current3}runRenderCycle(){for(let renderPhase of orderedRenderPhases)this.runRenderPhaseForChildren(renderPhase),this.runRenderPhase(renderPhase)}runRenderPhase(phase){this._currentRenderPhase=phase;let phaseState=this.renderPhaseStates[phase],isInitialized=phaseState.initialized,isDirty3=phaseState.dirty;if(!isInitialized&&this.shouldBeRemoved)return;if(this.shouldBeRemoved&&isInitialized){this._emitRenderLifecycleEvent(phase,"start"),this?.[`remove${phase}`]?.(),phaseState.initialized=!1,phaseState.dirty=!1,this._emitRenderLifecycleEvent(phase,"end");return}let prevPhaseIndex=renderPhaseIndexMap.get(phase)-1;if(prevPhaseIndex>=0){let prevPhase=orderedRenderPhases[prevPhaseIndex];if(this._asyncEffects.filter(e5=>e5.phase===prevPhase).some(e5=>!e5.complete))return}let deps=asyncPhaseDependencies[phase]||[];if(deps.length>0){for(let depPhase of deps)if(this._hasIncompleteAsyncEffectsForPhase(depPhase))return}if(this._emitRenderLifecycleEvent(phase,"start"),isInitialized){isDirty3&&(this?.[`update${phase}`]?.(),phaseState.dirty=!1),this._emitRenderLifecycleEvent(phase,"end");return}phaseState.dirty=!1,this?.[`doInitial${phase}`]?.(),phaseState.initialized=!0,this._emitRenderLifecycleEvent(phase,"end")}runRenderPhaseForChildren(phase){for(let child of this.children)"_isIsolatedSubcircuit"in this&&this._isIsolatedSubcircuit&&"doInitialRenderIsolatedSubcircuits"in this&&phase==="RenderIsolatedSubcircuits"||(child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase))}_getRootCircuit(){return"root"in this?this.root??null:null}renderError(message){throw typeof message=="string"?new Error(message):new Error(JSON.stringify(message,null,2))}},InvalidProps=class extends Error{constructor(componentName,originalProps,formattedError){let message,propsWithError=Object.keys(formattedError).filter(k4=>k4!=="_errors"),invalidPinLabelMessages=[],pinLabels=originalProps.pinLabels;if(pinLabels)for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels:[labelOrLabels];for(let label of labels)typeof label=="string"&&(label.startsWith(" ")||label.endsWith(" "))&&invalidPinLabelMessages.push(`pinLabels.${pin} ("${label}" has leading or trailing spaces)`)}let propMessage=propsWithError.map(k4=>k4==="pinLabels"&&invalidPinLabelMessages.length>0?invalidPinLabelMessages.join(", "):formattedError[k4]._errors[0]?`${k4} (${formattedError[k4]._errors[0]})`:`${k4} (${JSON.stringify(formattedError[k4])})`).join(", ");"name"in originalProps?message=`Invalid props for ${componentName} "${originalProps.name}": ${propMessage}`:"footprint"in originalProps&&typeof originalProps.footprint=="string"?message=`Invalid props for ${componentName} (unnamed ${originalProps.footprint} component): ${propMessage}`:message=`Invalid props for ${componentName} (unnamed): ${propMessage}`;super(message);__publicField(this,"componentName");__publicField(this,"originalProps");__publicField(this,"formattedError");this.componentName=componentName,this.originalProps=originalProps,this.formattedError=formattedError}},defaultUnits={mm:1};function evaluateCalcString(input2,options){let{knownVariables,units:userUnits}=options,units={...defaultUnits,...userUnits??{}},expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2)),tokens=tokenize2(expr,units);return parseExpression(tokens,knownVariables)}function extractCalcIdentifiers(input2){let expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2));return tokenize2(expr,defaultUnits).filter(token=>token.type==="identifier").map(token=>token.value)}function normalizeLegacyBoundsIdentifierCase(expr){let legacyBoundNameToCamelCase={minx:"minX",maxx:"maxX",miny:"minY",maxy:"maxY"};return expr.replace(/\.(minx|maxx|miny|maxy)\b/gi,(match2,boundName)=>`.${legacyBoundNameToCamelCase[String(boundName).toLowerCase()]??match2.slice(1)}`)}function extractExpression(raw){let trimmed=raw.trim();if(!trimmed.toLowerCase().startsWith("calc"))return trimmed;let match2=trimmed.match(/^calc\s*\((.*)\)$/is);if(!match2)throw new Error(`Invalid calc() expression: "${raw}"`);return match2[1].trim()}function tokenize2(expr,units){let tokens=[],i3=0,isDigit2=ch3=>ch3>="0"&&ch3<="9",isIdentStart=ch3=>ch3>="A"&&ch3<="Z"||ch3>="a"&&ch3<="z"||ch3==="_",isIdentChar=ch3=>isIdentStart(ch3)||isDigit2(ch3)||ch3===".";for(;i3<expr.length;){let ch3=expr[i3];if(ch3===" "||ch3===" "||ch3===`
|
|
700
700
|
`||ch3==="\r"){i3++;continue}if(isDigit2(ch3)||ch3==="."&&i3+1<expr.length&&isDigit2(expr[i3+1])){let start=i3;for(i3++;i3<expr.length;){let c4=expr[i3];if(isDigit2(c4)||c4===".")i3++;else break}let numberText=expr.slice(start,i3),num=Number(numberText);if(Number.isNaN(num))throw new Error(`Invalid number: "${numberText}"`);let unitStart=i3;for(;i3<expr.length&&/[A-Za-z]/.test(expr[i3]);)i3++;if(i3>unitStart){let unitText=expr.slice(unitStart,i3),factor=units[unitText];if(factor==null)throw new Error(`Unknown unit: "${unitText}"`);num*=factor}tokens.push({type:"number",value:num});continue}if(isIdentStart(ch3)){let start=i3;for(i3++;i3<expr.length&&isIdentChar(expr[i3]);)i3++;let ident=expr.slice(start,i3);tokens.push({type:"identifier",value:ident});continue}if(ch3==="("||ch3===")"){tokens.push({type:"paren",value:ch3}),i3++;continue}if(ch3==="+"||ch3==="-"||ch3==="*"||ch3==="/"){tokens.push({type:"operator",value:ch3}),i3++;continue}throw new Error(`Unexpected character "${ch3}" in expression "${expr}"`)}return tokens}function parseExpression(tokens,vars){let index=0,peek=()=>tokens[index],consume=()=>tokens[index++],parsePrimary=()=>{let token=peek();if(!token)throw new Error("Unexpected end of expression");if(token.type==="number")return consume(),token.value;if(token.type==="identifier"){consume();let value=vars[token.value];if(value==null)throw new Error(`Unknown variable: "${token.value}"`);return value}if(token.type==="paren"&&token.value==="("){consume();let value=parseExpr(),next2=peek();if(!next2||next2.type!=="paren"||next2.value!==")")throw new Error('Expected ")"');return consume(),value}throw new Error(`Unexpected token "${token.value}"`)},parseFactor=()=>{let token=peek();if(token&&token.type==="operator"&&(token.value==="+"||token.value==="-")){consume();let value=parseFactor();return token.value==="+"?value:-value}return parsePrimary()},parseTerm=()=>{let value=parseFactor();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="*"&&token.value!=="/")break;consume();let rhs=parseFactor();token.value==="*"?value*=rhs:value/=rhs}return value},parseExpr=()=>{let value=parseTerm();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="+"&&token.value!=="-")break;consume();let rhs=parseTerm();token.value==="+"?value+=rhs:value-=rhs}return value},result=parseExpr();if(index<tokens.length){let leftover=tokens.slice(index).map(t52=>"value"in t52?t52.value:"?").join(" ");throw new Error(`Unexpected tokens at end of expression: ${leftover}`)}return result}function setSubcircuitPcbComponentCalcVariables(params){let{vars,componentName,position:position4,size:size3}=params;vars[`${componentName}.x`]=position4.x,vars[`${componentName}.y`]=position4.y,vars[`${componentName}.width`]=size3.width,vars[`${componentName}.height`]=size3.height,vars[`${componentName}.minX`]=position4.x-size3.width/2,vars[`${componentName}.maxX`]=position4.x+size3.width/2,vars[`${componentName}.minY`]=position4.y-size3.height/2,vars[`${componentName}.maxY`]=position4.y+size3.height/2}function getSubcircuitPcbCalcVariables(db2){let vars={};for(let sourceComponent of db2.source_component.list()){if(!sourceComponent.name)continue;let pcbComponent=db2.pcb_component.getWhere({source_component_id:sourceComponent.source_component_id});pcbComponent&&setSubcircuitPcbComponentCalcVariables({vars,componentName:sourceComponent.name,position:{x:pcbComponent.center.x,y:pcbComponent.center.y},size:{width:pcbComponent.width??0,height:pcbComponent.height??0}})}return vars}var directionToVector={from_left:{x:-1,y:0},from_right:{x:1,y:0},from_front:{x:0,y:1},from_back:{x:0,y:-1}},isFootprintFlipped=params=>{let{componentLayer,originalLayer}=params;return componentLayer==="bottom"!=(originalLayer==="bottom")},transformFootprintInsertionDirection=params=>{let{insertionDirection,rotationDegrees=0,isFlipped=!1}=params;if(!insertionDirection)return;if(insertionDirection==="from_above")return insertionDirection;let baseVector=directionToVector[insertionDirection],angleRadians=normalizeDegrees(rotationDegrees)*Math.PI/180,rotatedVector={x:baseVector.x*Math.cos(angleRadians)-baseVector.y*Math.sin(angleRadians),y:baseVector.x*Math.sin(angleRadians)+baseVector.y*Math.cos(angleRadians)},finalVector=isFlipped?{x:rotatedVector.x,y:-rotatedVector.y}:rotatedVector;return Math.abs(finalVector.x)>=Math.abs(finalVector.y)?finalVector.x>=0?"from_right":"from_left":finalVector.y>=0?"from_front":"from_back"};function convertPcbStyleToPcbSx(pcbStyle2){if(!pcbStyle2)return;let sx3={};if(pcbStyle2.silkscreenFontSize!==void 0&&(sx3["& silkscreentext"]={fontSize:pcbStyle2.silkscreenFontSize}),Object.keys(sx3).length!==0)return sx3}function getResolvedPcbSx({parentResolvedPcbSx,pcbStyle:pcbStyle2,ownPcbSx}){let styleSx=convertPcbStyleToPcbSx(pcbStyle2),result={},allKeys=new Set;if(parentResolvedPcbSx)for(let k4 of Object.keys(parentResolvedPcbSx))allKeys.add(k4);if(styleSx)for(let k4 of Object.keys(styleSx))allKeys.add(k4);if(ownPcbSx)for(let k4 of Object.keys(ownPcbSx))allKeys.add(k4);for(let key of allKeys)result[key]={...parentResolvedPcbSx?.[key],...styleSx?.[key],...ownPcbSx?.[key]};return result}function isMatchingSelector(component,selector){let idMatch=selector.match(/^#(\w+)/);if(idMatch)return component.props.id===idMatch[1];let classMatch=selector.match(/^\.(\w+)/);if(classMatch)return component.isMatchingNameOrAlias(classMatch[1]);let[type,...conditions]=selector.split(/(?=[#.[])/);return type==="pin"&&(type="port"),type&&type!=="*"&&component.lowercaseComponentName!==type.toLowerCase()?!1:conditions.every(condition=>{if(condition.startsWith("#"))return component.props.id===condition.slice(1);if(condition.startsWith("."))return component.isMatchingNameOrAlias(condition.slice(1));let match2=condition.match(/\[(\w+)=['"]?(.+?)['"]?\]/);if(!match2)return!0;let[,prop,value]=match2;return component.props[prop].toString()===value})}var cssSelectPrimitiveComponentAdapter={isTag:node=>!0,getParent:node=>node.parent,getChildren:node=>node.children,getName:node=>node.lowercaseComponentName,getAttributeValue:(node,name)=>{if(name==="class"&&"getNameAndAliases"in node)return node.getNameAndAliases().join(" ");if(name==="name"&&node._parsedProps?.name)return node._parsedProps.name;if(node._parsedProps&&name in node._parsedProps){let value=node._parsedProps[name];return typeof value=="string"?value:value!=null?String(value):null}if(name in node){let value=node[name];return typeof value=="string"?value:value!=null?String(value):null}let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node){let value=node[camelCaseName];return typeof value=="string"?value:value!=null?String(value):null}}return null},hasAttrib:(node,name)=>{if(name==="class")return!!node._parsedProps?.name;if(node._parsedProps&&name in node._parsedProps||name in node)return!0;let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node)return!0}return!1},getSiblings:node=>node.parent?node.parent.children:[],prevElementSibling:node=>{if(!node.parent)return null;let siblings=node.parent.children,idx=siblings.indexOf(node);return idx>0?siblings[idx-1]:null},getText:()=>"",removeSubsets:nodes=>nodes.filter((node,i3)=>!nodes.some((other,j4)=>i3!==j4&&other!==node&&other.getDescendants().includes(node))),existsOne:(test,nodes)=>nodes.some(test),findAll:(test,nodes)=>{let result=[],recurse=node=>{test(node)&&result.push(node);for(let child of node.children)recurse(child)};for(let node of nodes)recurse(node);return result},findOne:(test,nodes)=>{for(let node of nodes){if(test(node))return node;let children=node.children;if(children.length>0){let result=cssSelectPrimitiveComponentAdapter.findOne(test,children);if(result)return result}}return null},equals:(a3,b3)=>a3._renderId===b3._renderId,isHovered:elem=>!1,isVisited:elem=>!1,isActive:elem=>!1},cssSelectPrimitiveComponentAdapterWithoutSubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c4=>!c4.isSubcircuit)},cssSelectPrimitiveComponentAdapterOnlySubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c4=>c4.isSubcircuit)},buildPlusMinusNetErrorMessage=(selector,component)=>{let netName=selector.split("net.")[1]?.split(/[ >]/)[0]??selector;return`Net names cannot contain "+" or "-" (component "${component?.componentName??"Unknown component"}" received "${netName}" via "${selector}"). Try using underscores instead, e.g. VCC_P`},preprocessSelector=(selector,component)=>{if(/net\.[^\s>]*\./.test(selector))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(selector))throw new Error(buildPlusMinusNetErrorMessage(selector,component));if(/net\.[0-9]/.test(selector)){let match2=selector.match(/net\.([^ >]+)/),netName=match2?match2[1]:"";throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}return selector.replace(/ pin(?=[\d.])/g," port").replace(/ subcircuit\./g," group[isSubcircuit=true]").replace(/([^ ])\>([^ ])/g,"$1 > $2").replace(/(^|[ >])(?!pin\.)(?!port\.)(?!net\.)([A-Z][A-Za-z0-9_-]*)\.([A-Za-z0-9_-]+)/g,(_4,sep,name,pin)=>{let pinPart=/^\d+$/.test(pin)?`pin${pin}`:pin;return`${sep}.${name} > .${pinPart}`}).trim()},cssSelectOptionsInsideSubcircuit={adapter:cssSelectPrimitiveComponentAdapterWithoutSubcircuits,cacheResults:!0},PrimitiveComponent2=class extends Renderable{constructor(props){super(props);__publicField(this,"parent",null);__publicField(this,"children");__publicField(this,"childrenPendingRemoval");__publicField(this,"props");__publicField(this,"_parsedProps");__publicField(this,"externallyAddedAliases");__publicField(this,"isPrimitiveContainer",!1);__publicField(this,"canHaveTextChildren",!1);__publicField(this,"source_group_id",null);__publicField(this,"source_component_id",null);__publicField(this,"schematic_component_id",null);__publicField(this,"pcb_component_id",null);__publicField(this,"cad_component_id",null);__publicField(this,"_reportedInvalidPcbCalcWarnings",new Set);__publicField(this,"fallbackUnassignedName");__publicField(this,"_cachedSelectAllQueries",new Map);__publicField(this,"_cachedSelectOneQueries",new Map);this.children=[],this.childrenPendingRemoval=[],this.props=props??{},this.externallyAddedAliases=[];let parsePropsResult=("partial"in this.config.zodProps?this.config.zodProps.partial({name:!0}):this.config.zodProps).safeParse(props??{});if(parsePropsResult.success)this._parsedProps=parsePropsResult.data;else throw new InvalidProps(this.lowercaseComponentName,this.props,parsePropsResult.error.format())}get config(){return{componentName:"",zodProps:external_exports.object({}).passthrough()}}get componentName(){return this.config.componentName}getInheritedProperty(propertyName){let current3=this;for(;current3;){if(current3._parsedProps&&propertyName in current3._parsedProps)return current3._parsedProps[propertyName];current3=current3.parent}if(this.root?.platform&&propertyName in this.root.platform)return this.root.platform[propertyName]}getInheritedMergedProperty(propertyName){let parentPropertyObject=this.parent?.getInheritedMergedProperty?.(propertyName),myPropertyObject=this._parsedProps?.[propertyName];return{...parentPropertyObject,...myPropertyObject}}getResolvedPcbSx(){return getResolvedPcbSx({parentResolvedPcbSx:this.parent?.getResolvedPcbSx?.(),pcbStyle:this._parsedProps?.pcbStyle,ownPcbSx:this._parsedProps?.pcbSx})}get lowercaseComponentName(){return this.componentName.toLowerCase()}get isSubcircuit(){return!!this.props.subcircuit||this.lowercaseComponentName==="group"&&this?.parent?.isRootCircuit}get isGroup(){return this.lowercaseComponentName==="group"}get name(){return this._parsedProps.name??this.fallbackUnassignedName}_reportInvalidComponentPropertyError(propertyName,message){!this.root||this._reportedInvalidPcbCalcWarnings.has(propertyName)||(this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:propertyName,message,error_type:"source_invalid_component_property_error"}),this._reportedInvalidPcbCalcWarnings.add(propertyName))}setProps(props){let newProps=this.config.zodProps.parse({...this.props,...props}),oldProps=this.props;this.props=newProps,this._parsedProps=this.config.zodProps.parse(props),this.onPropsChange({oldProps,newProps,changedProps:Object.keys(props)}),this.parent?.onChildChanged?.(this)}_getPcbRotationBeforeLayout(){let{pcbRotation}=this.props;return typeof pcbRotation=="string"?parseFloat(pcbRotation):pcbRotation??null}getResolvedPcbPositionProp(){return{pcbX:this._resolvePcbCoordinate(this._parsedProps.pcbX,"pcbX"),pcbY:this._resolvePcbCoordinate(this._parsedProps.pcbY,"pcbY")}}doInitialValidatePcbCoordinates(){if(this.root?.pcbDisabled)return;let rawProps=this.props,rawPcbX=rawProps.pcbX,rawPcbY=rawProps.pcbY;this._validatePcbCoordinateReferences({rawValue:rawPcbX,axis:"pcbX",propertyName:"pcbX"}),this._validatePcbCoordinateReferences({rawValue:rawPcbY,axis:"pcbY",propertyName:"pcbY"})}_validatePcbCoordinateReferences(params){let{rawValue,axis,propertyName=axis}=params;if(typeof rawValue!="string")return;let allowComponentVariables=!(this._isNormalComponent===!0)&&!this._isInsideFootprint(),calcIdentifiers=[];try{calcIdentifiers=extractCalcIdentifiers(rawValue)}catch{this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: Invalid calc() expression. expression="${rawValue}"`);return}calcIdentifiers.some(identifier=>!identifier.startsWith("board."))&&!allowComponentVariables&&this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: component-relative calc references are not supported for footprint elements (${this.componentName}); ${propertyName} will be ignored. expression="${rawValue}"`)}_resolvePcbCoordinate(rawValue,axis,options={}){if(rawValue==null)return 0;let propertyName=options.propertyName??axis;if(typeof rawValue=="number")return Number.isFinite(rawValue)?rawValue:0;if(typeof rawValue!="string")throw new Error(`Invalid ${axis} value for ${this.componentName}: ${String(rawValue)}`);let allowBoardVariables=options.allowBoardVariables??this._shouldAllowBoardVariablesByDefault(),isNormalComponent=this._isNormalComponent===!0,allowComponentVariables=options.allowComponentVariables??(!isNormalComponent&&!this._isInsideFootprint()),includesBoardVariable=rawValue.includes("board."),knownVariables={};if(allowBoardVariables){let board=this._getBoard(),boardVariables=board?._getBoardCalcVariables()??{};if(includesBoardVariable&&!board)return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: no board found for board.* variables. expression="${rawValue}"`),0;if(includesBoardVariable&&board&&Object.keys(boardVariables).length===0)return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: Cannot do calculations based on board size when the board is auto-sized. expression="${rawValue}"`),0;Object.assign(knownVariables,boardVariables)}if(allowComponentVariables){let db2=this.root?.db;db2&&Object.assign(knownVariables,getSubcircuitPcbCalcVariables(db2)),Object.assign(knownVariables,options.componentVariables??{})}try{return extractCalcIdentifiers(rawValue).some(identifier=>!identifier.startsWith("board."))&&!allowComponentVariables?(this._isInsideFootprint()&&this.root&&!this._reportedInvalidPcbCalcWarnings.has(axis)&&(this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:axis,message:`component-relative calc references are not supported for footprint elements (${this.componentName}); ${axis} will be ignored. expression="${rawValue}"`,error_type:"source_invalid_component_property_error"}),this._reportedInvalidPcbCalcWarnings.add(axis)),0):evaluateCalcString(rawValue,{knownVariables})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: ${message}. expression="${rawValue}"`),0}}_shouldAllowBoardVariablesByDefault(){return this._isNormalComponent===!0?!0:!this._isInsideFootprint()&&!this._isInsideNonBoardSubcircuit()}_isInsideFootprint(){let current3=this.parent;for(;current3;){if(current3.componentName==="Footprint")return!0;current3=current3.parent}return!1}_isInsideNonBoardSubcircuit(){let current3=this.parent;for(;current3;){let componentName=current3.componentName;if(componentName==="Board"||componentName==="MountedBoard")return!1;if(current3.isSubcircuit)return!0;current3=current3.parent}return!1}_hasUserDefinedPcbPosition(){let props=this._parsedProps;return props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0}resolvePcbCoordinate(params){let{rawValue,axis,allowBoardVariables,allowComponentVariables,componentVariables,propertyName}=params;return this._resolvePcbCoordinate(rawValue,axis,{allowBoardVariables,allowComponentVariables,componentVariables,propertyName})}computePcbPropsTransform(){let rotation42=this._getPcbRotationBeforeLayout()??0,{pcbX,pcbY}=this.getResolvedPcbPositionProp();return compose2(translate2(pcbX,pcbY),rotate2(rotation42*Math.PI/180))}_computePcbGlobalTransformBeforeLayout(){let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if(manualPlacement&&this.props.pcbX===void 0&&this.props.pcbY===void 0){let rotation42=this._getPcbRotationBeforeLayout()??0;return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),compose2(translate2(manualPlacement.x,manualPlacement.y),rotate2(rotation42*Math.PI/180)))}if(this.isPcbPrimitive){let{isFlipped}=this._getPcbPrimitiveFlippedHelpers();if(isFlipped)return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),flipY(),this.computePcbPropsTransform())}return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),this.computePcbPropsTransform())}_getEnclosingFootprint(){let current3=this.parent;for(;current3;){if(current3.componentName==="Footprint")return current3;current3=current3.parent}return null}getPrimitiveContainer(){return this.isPrimitiveContainer?this:this.parent?.getPrimitiveContainer?.()??null}_getSymbolAncestor(){let container=this.getPrimitiveContainer();return container?.componentName==="Symbol"?container:null}getParentNormalComponent(){let current3=this.parent;for(;current3;){if(current3.isPrimitiveContainer&¤t3.doInitialPcbComponentRender)return current3;current3=current3.parent}return null}getCollapsedSchematicBoxAncestor(){let current3=this.parent;for(;current3;){if(current3.componentName==="Group"&¤t3._parsedProps?.showAsSchematicBox)return current3;current3=current3.parent}return null}_resolveText(){let text=this._parsedProps.text;if(!text)return"";if(!text.includes("{NAME}")&&!text.includes("{REF}")&&!text.includes("{REFERENCE}"))return text;let refdes=this.getParentNormalComponent()?.name;return refdes?text.replace(/\{NAME\}/g,refdes).replace(/\{REF\}/g,refdes).replace(/\{REFERENCE\}/g,refdes):text}emitSolderMaskMarginWarning(isCoveredWithSolderMask,solderMaskMargin){if(isCoveredWithSolderMask&&solderMaskMargin!==void 0){let parentNormalComponent=this.getParentNormalComponent();parentNormalComponent?.source_component_id&&this.root.db.source_property_ignored_warning.insert({source_component_id:parentNormalComponent.source_component_id,property_name:"solderMaskMargin",message:"solderMaskMargin is set but coveredWithSolderMask is true. When a component is fully covered with solder mask, a margin doesn't apply.",error_type:"source_property_ignored_warning"})}}_getPcbCircuitJsonBounds(){return{center:{x:0,y:0},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getPcbPrimitiveFlippedHelpers(){let container=this.getPrimitiveContainer(),footprint=this.componentName==="Footprint"?this:this._getEnclosingFootprint(),isFlipped=container?isFootprintFlipped({componentLayer:container._parsedProps.layer,originalLayer:footprint?._parsedProps.originalLayer}):!1;return{isFlipped,maybeFlipLayer:layer=>isFlipped?layer==="top"?"bottom":"top":layer}}_setPositionFromLayout(newCenter){throw new Error(`_setPositionFromLayout not implemented for ${this.componentName}`)}computeSchematicPropsTransform(){let{_parsedProps:props}=this;return compose2(translate2(props.schX??0,props.schY??0))}computeSchematicGlobalTransform(){let manualPlacementTransform=this._getSchematicGlobalManualPlacementTransform(this);return manualPlacementTransform||compose2(this.parent?.computeSchematicGlobalTransform?.()??identity(),this.computeSchematicPropsTransform())}_getSchematicSymbolName(){let{_parsedProps:props}=this,base_symbol_name=this.config.schematicSymbolName,orientationRotationMap={horizontal:0,pos_left:0,neg_right:0,pos_right:180,neg_left:180,pos_top:270,neg_bottom:90,vertical:270,pos_bottom:90,neg_top:90},normalizedRotation=props.schOrientation!==void 0?orientationRotationMap[props.schOrientation]:props.schRotation;if(normalizedRotation===void 0&&(normalizedRotation=0),normalizedRotation=normalizedRotation%360,normalizedRotation<0&&(normalizedRotation+=360),props.schRotation!==void 0&&normalizedRotation%90!==0)throw new Error(`Schematic rotation ${props.schRotation} is not supported for ${this.componentName}`);let symbol_name_horz=`${base_symbol_name}_horz`,symbol_name_vert=`${base_symbol_name}_vert`,symbol_name_up=`${base_symbol_name}_up`,symbol_name_down=`${base_symbol_name}_down`,symbol_name_left=`${base_symbol_name}_left`,symbol_name_right=`${base_symbol_name}_right`;if(symbol_name_right in Vf&&normalizedRotation===0)return symbol_name_right;if(symbol_name_up in Vf&&normalizedRotation===90)return symbol_name_up;if(symbol_name_left in Vf&&normalizedRotation===180)return symbol_name_left;if(symbol_name_down in Vf&&normalizedRotation===270)return symbol_name_down;if(symbol_name_horz in Vf&&(normalizedRotation===0||normalizedRotation===180))return symbol_name_horz;if(symbol_name_vert in Vf&&(normalizedRotation===90||normalizedRotation===270))return symbol_name_vert;if(base_symbol_name in Vf)return base_symbol_name}_getSchematicSymbolNameOrThrow(){let symbol_name=this._getSchematicSymbolName();if(!symbol_name)throw new Error(`No schematic symbol found (given: "${this.config.schematicSymbolName}")`);return symbol_name}getSchematicSymbol(){let symbol_name=this._getSchematicSymbolName();return symbol_name?Vf[symbol_name]??null:null}_getPcbManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits?.pcb_placements;if(!placementConfigPositions)return null;for(let position4 of placementConfigPositions)if(isMatchingSelector(component,position4.selector)||component.props.name===position4.selector)return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),position4.center);return null}_getSchematicManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits.schematic_placements;if(!placementConfigPositions)return null;for(let position4 of placementConfigPositions)if(isMatchingSelector(component,position4.selector)||component.props.name===position4.selector)return applyToPoint2(this.computeSchematicGlobalTransform(),position4.center);return null}_getSchematicGlobalManualPlacementTransform(component){let manualEdits=this.getSubcircuit()?._parsedProps.manualEdits;if(!manualEdits)return null;for(let position4 of manualEdits.schematic_placements??[])if((isMatchingSelector(component,position4.selector)||component.props.name===position4.selector)&&position4.relative_to==="group_center")return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),translate2(position4.center.x,position4.center.y));return null}_getGlobalPcbPositionBeforeLayout(){return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),{x:0,y:0})}_getGlobalSchematicPositionBeforeLayout(){return applyToPoint2(this.computeSchematicGlobalTransform(),{x:0,y:0})}_getBoard(){let current3=this;for(;current3;){let maybePrimitive=current3,componentName=maybePrimitive.componentName;if(componentName==="Board"||componentName==="MountedBoard")return maybePrimitive;current3=current3.parent??null}return this.root?._getBoard()}get root(){return this.parent?.root??null}onAddToParent(parent){this.parent=parent}onPropsChange(params){}onChildChanged(child){this.parent?.onChildChanged?.(child)}add(component){let textContent2=component.__text;if(typeof textContent2=="string"){if(this.canHaveTextChildren||textContent2.trim()==="")return;throw new Error(`Invalid JSX Element: Expected a React component but received text "${textContent2}"`)}if(Object.keys(component).length!==0){if(component.lowercaseComponentName==="panel")throw new Error("<panel> must be a root-level element");if(!component.onAddToParent)throw new Error(`Invalid JSX Element: Expected a React component but received "${JSON.stringify(component)}"`);component.onAddToParent(this),component.parent=this,this.children.push(component)}}addAll(components){for(let component of components)this.add(component)}remove(component){this.children=this.children.filter(c4=>c4!==component),this.childrenPendingRemoval.push(component),component.shouldBeRemoved=!0}getSubcircuitSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName;return!this.parent||this.parent.isSubcircuit?endPart:`${this.parent.getSubcircuitSelector()} > ${endPart}`}getFullPathSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName,parentSelector=this.parent?.getFullPathSelector?.();return parentSelector?`${parentSelector} > ${endPart}`:endPart}getNameAndAliases(){return[this.name,...this._parsedProps.portHints??[]].filter(Boolean)}isMatchingNameOrAlias(name){return this.getNameAndAliases().includes(name)}isMatchingAnyOf(aliases2){return this.getNameAndAliases().some(a3=>aliases2.map(a22=>a22.toString()).includes(a3))}getPcbSize(){throw new Error(`getPcbSize not implemented for ${this.componentName}`)}doesSelectorMatch(selector){let myTypeNames=[this.componentName,this.lowercaseComponentName],myClassNames=[this.name].filter(Boolean),parts=selector.trim().split(/\> /)[0],firstPart=parts[0];return parts.length>1?!1:!!(selector==="*"||selector[0]==="#"&&selector.slice(1)===this.props.id||selector[0]==="."&&myClassNames.includes(selector.slice(1))||/^[a-zA-Z0-9_]/.test(firstPart)&&myTypeNames.includes(firstPart))}getSubcircuit(){if(this.isSubcircuit)return this;let group=this.parent?.getSubcircuit?.();if(!group)throw new Error("Component is not inside an opaque group (no board?)");return group}getGroup(){return this.isGroup?this:this.parent?.getGroup?.()??null}doInitialAssignNameToUnnamedComponents(){this._parsedProps.name||(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialOptimizeSelectorCache(){if(!this.isSubcircuit)return;let ports=this.selectAll("port"),isValidShorthandName=name=>/^[A-Za-z_][A-Za-z0-9_-]*$/.test(name);for(let port of ports){let parentAliases=(port.getParentNormalComponent?.()??port.parent)?.getNameAndAliases(),portAliases=port.getNameAndAliases();if(parentAliases)for(let parentAlias of parentAliases)for(let portAlias of portAliases){let selectors=[`.${parentAlias} > .${portAlias}`,`.${parentAlias} .${portAlias}`];isValidShorthandName(parentAlias)&&isValidShorthandName(portAlias)&&selectors.push(`${parentAlias}.${portAlias}`);for(let selector of selectors){let ar3=this._cachedSelectAllQueries.get(selector);ar3?ar3.push(port):this._cachedSelectAllQueries.set(selector,[port])}}}for(let[selector,ports2]of this._cachedSelectAllQueries.entries())ports2.length===1&&this._cachedSelectOneQueries.set(selector,ports2[0])}selectAll(selectorRaw){if(this._cachedSelectAllQueries.has(selectorRaw))return this._cachedSelectAllQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this),result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit);if(result.length>0)return this._cachedSelectAllQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});if(!subcircuit)return[];let result2=subcircuit.selectAll(rest.join(" "));return this._cachedSelectAllQueries.set(selectorRaw,result2),result2}selectOne(selectorRaw,options){if(this._cachedSelectOneQueries.has(selectorRaw))return this._cachedSelectOneQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this);options?.port&&(options.type="port");let result=null;if(options?.type&&(result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit).find(n4=>n4.lowercaseComponentName===options.type)),options?.type||(result??(result=selectOne(selector,this,cssSelectOptionsInsideSubcircuit))),result)return this._cachedSelectOneQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});return subcircuit?(result=subcircuit.selectOne(rest.join(" "),options),this._cachedSelectOneQueries.set(selectorRaw,result),result):null}getAvailablePcbLayers(){if(this.isPcbPrimitive){let{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers();return"layer"in this._parsedProps||this.componentName==="SmtPad"?[maybeFlipLayer(this._parsedProps.layer??"top")]:"layers"in this._parsedProps?this._parsedProps.layers:this.componentName==="PlatedHole"?[...this.root?._getBoard()?.allLayers??["top","bottom"]]:[]}return[]}getDescendants(){let descendants=[];for(let child of this.children)descendants.push(child),descendants.push(...child.getDescendants());return descendants}getSelectableDescendants(){let descendants=[];for(let child of this.children)child.isSubcircuit?descendants.push(child):(descendants.push(child),descendants.push(...child.getSelectableDescendants()));return descendants}_getPrimaryPinCount(){return 0}_getSchematicBoxDimensions(){return null}_getSchematicBoxComponentDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this;return{schWidth:props.schWidth,schHeight:props.schHeight}}renderError(message){if(typeof message=="string")return super.renderError(message);switch(message.type){case"pcb_placement_error":this.root?.db.pcb_placement_error.insert(message);break;case"pcb_via_clearance_error":this.root?.db.pcb_via_clearance_error.insert(message);break;case"pcb_trace_error":this.root?.db.pcb_trace_error.insert(message);break;case"pcb_manual_edit_conflict_warning":this.root?.db.pcb_manual_edit_conflict_warning.insert(message);break;default:this.root?.db.pcb_placement_error.insert(message)}}getString(){let{lowercaseComponentName:cname,_parsedProps:props,parent}=this;return props?.pinNumber!==void 0&&parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(pin:${props.pinNumber} .${parent?.props.name}>.${props.name}) />`:parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(.${parent?.props.name}>.${props?.name}) />`:props?.from&&props?.to?`<${cname}#${this._renderId}(from:${props.from} to:${props?.to}) />`:props?.name?`<${cname}#${this._renderId} name=".${props?.name}" />`:props?.portHints?`<${cname}#${this._renderId}(${props.portHints.map(ph3=>`.${ph3}`).join(", ")}) />`:`<${cname}#${this._renderId} />`}getDisplayName(){return this.name?`${this.lowercaseComponentName} "${this.name}"`:`${this.lowercaseComponentName} (unnamed)`}get[Symbol.toStringTag](){return this.getString()}[Symbol.for("nodejs.util.inspect.custom")](){return this.getString()}};function pairs2(arr){let result=[];for(let i3=0;i3<arr.length-1;i3++)result.push([arr[i3],arr[i3+1]]);return result}var Net=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_id");__publicField(this,"subcircuit_connectivity_map_key",null)}get config(){return{componentName:"Net",zodProps:netProps}}getPortSelector(){return`net.${this.props.name}`}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,isGround=props.isGroundNet??props.name.startsWith("GND"),isPositiveVoltageSource=props.isPowerNet??props.name.startsWith("V"),net=db2.source_net.insert({name:props.name,member_source_group_ids:[],is_ground:isGround,is_power:isPositiveVoltageSource,is_positive_voltage_source:isPositiveVoltageSource});this.source_net_id=net.source_net_id}doInitialSourceParentAttachment(){let subcircuit=this.getSubcircuit();if(!subcircuit)return;let{db:db2}=this.root;db2.source_net.update(this.source_net_id,{subcircuit_id:subcircuit.subcircuit_id})}getAllConnectedPorts(){let allPorts=this.getSubcircuit().selectAll("port"),connectedPorts=[];for(let port of allPorts){let traces=port._getDirectlyConnectedTraces();for(let trace of traces)if(trace._isExplicitlyConnectedToNet(this)){connectedPorts.push(port);break}}return connectedPorts}_getAllDirectlyConnectedTraces(){let allTraces=this.getSubcircuit().selectAll("trace"),connectedTraces=[];for(let trace of allTraces)trace._isExplicitlyConnectedToNet(this)&&connectedTraces.push(trace);return connectedTraces}doInitialPcbRouteNetIslands(){if(this.root?.pcbDisabled||this.getSubcircuit()._parsedProps.routingDisabled||this.getSubcircuit()._isInflatedFromCircuitJson||this.getSubcircuit()._getAutorouterConfig().groupMode!=="sequential-trace")return;let{db:db2}=this.root,{_parsedProps:props}=this,traces=this._getAllDirectlyConnectedTraces().filter(trace=>(trace._portsRoutedOnPcb?.length??0)>0),islands=[];for(let trace of traces){let tracePorts=trace._portsRoutedOnPcb,traceIsland=islands.find(island=>tracePorts.some(port=>island.ports.includes(port)));if(!traceIsland){islands.push({ports:[...tracePorts],traces:[trace]});continue}traceIsland.traces.push(trace),traceIsland.ports.push(...tracePorts)}if(islands.length===0)return;let islandPairs=pairs2(islands);for(let[A4,B4]of islandPairs){let Apositions=A4.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),Bpositions=B4.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),closestDist=1/0,closestPair=[-1,-1];for(let i3=0;i3<Apositions.length;i3++){let Apos=Apositions[i3];for(let j4=0;j4<Bpositions.length;j4++){let Bpos=Bpositions[j4],dist=Math.sqrt((Apos.x-Bpos.x)**2+(Apos.y-Bpos.y)**2);dist<closestDist&&(closestDist=dist,closestPair=[i3,j4])}}let Aport=A4.ports[closestPair[0]],Bport=B4.ports[closestPair[1]],pcbElements=db2.toArray().filter(elm=>elm.type==="pcb_smtpad"||elm.type==="pcb_trace"||elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="source_port"||elm.type==="pcb_port"),{solution}=autoroute2(pcbElements.concat([{type:"source_trace",source_trace_id:"__net_trace_tmp",connected_source_port_ids:[Aport.source_port_id,Bport.source_port_id]}])),trace=solution[0];if(!trace){this.renderError({pcb_trace_error_id:"",pcb_trace_id:"__net_trace_tmp",pcb_component_ids:[Aport.pcb_component_id,Bport.pcb_component_id].filter(Boolean),pcb_port_ids:[Aport.pcb_port_id,Bport.pcb_port_id].filter(Boolean),type:"pcb_trace_error",error_type:"pcb_trace_error",message:`Failed to route net islands for "${this.getString()}"`,source_trace_id:"__net_trace_tmp"});return}db2.pcb_trace.insert(trace)}}renderError(message){if(typeof message=="string")return super.renderError(message);this.root?.db.pcb_trace_error.insert(message)}},createNetsFromProps=(component,props)=>{for(let prop of props)if(typeof prop=="string"&&prop.startsWith("net.")){if(/net\.[^\s>]*\./.test(prop))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(prop)){let netName=prop.split("net.")[1],message=`Net names cannot contain "+" or "-" (component "${component.componentName}" received "${netName}" via "${prop}"). Try using underscores instead, e.g. VCC_P`;throw new Error(message)}if(/net\.[0-9]/.test(prop)){let netName=prop.split("net.")[1];throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}let subcircuit=component.getSubcircuit();if(!subcircuit.selectOne(prop)){let net=new Net({name:prop.split("net.")[1]});subcircuit.add(net)}}},getDistance3=(a3,b3)=>{let aPos="_getGlobalPcbPositionBeforeLayout"in a3?a3._getGlobalPcbPositionBeforeLayout():a3,bPos="_getGlobalPcbPositionBeforeLayout"in b3?b3._getGlobalPcbPositionBeforeLayout():b3;return Math.sqrt((aPos.x-bPos.x)**2+(aPos.y-bPos.y)**2)};function getClosest(point62,candidates){if(candidates.length===0)throw new Error("No candidates given to getClosest method");let closest=candidates[0],closestDist=1/0;for(let candidate of candidates){let dist=getDistance3(point62,candidate);dist<closestDist&&(closest=candidate,closestDist=dist)}return closest}var countComplexElements=(junctions,edges)=>{let count=0;count+=junctions.length??0,count+=edges.filter(edge=>edge.is_crossing).length;for(let i3=1;i3<edges.length;i3++){let prev=edges[i3-1],curr=edges[i3],prevVertical=Math.abs(prev.from.x-prev.to.x)<.01,currVertical=Math.abs(curr.from.x-curr.to.x)<.01;prevVertical!==currVertical&&count++}return count},getEnteringEdgeFromDirection=direction2=>({up:"bottom",down:"top",left:"right",right:"left"})[direction2]??null,getStubEdges=({firstEdge,firstEdgePort,firstDominantDirection,lastEdge,lastEdgePort,lastDominantDirection})=>{if(firstEdge&&firstEdgePort)return getStubEdges({lastEdge:{from:firstEdge.to,to:firstEdge.from},lastEdgePort:firstEdgePort,lastDominantDirection:firstDominantDirection}).reverse().map(e5=>({from:e5.to,to:e5.from}));let edges=[];if(lastEdge&&lastEdgePort){let intermediatePoint={x:lastEdge.to.x,y:lastEdge.to.y};lastDominantDirection==="left"||lastDominantDirection==="right"?(intermediatePoint.x=lastEdgePort.position.x,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}})):(intermediatePoint.y=lastEdgePort.position.y,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}}))}return edges=edges.filter(e5=>distance2(e5.from,e5.to)>.01),edges};function tryNow(fn3){try{return[fn3(),null]}catch(e5){return[null,e5]}}var getMaxLengthFromConnectedCapacitors=(ports,{db:db2})=>{let capacitorMaxLengths=ports.map(port=>{let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort?.source_component_id)return null;let sourceComponent=db2.source_component.get(sourcePort.source_component_id);return sourceComponent?.ftype==="simple_capacitor"?sourceComponent.max_decoupling_trace_length:null}).filter(length7=>length7!==null);if(capacitorMaxLengths.length!==0)return Math.min(...capacitorMaxLengths)};function getTraceDisplayName({ports,nets}){if(ports.length>=2)return`${ports[0]?.selector} to ${ports[1]?.selector}`;if(ports.length===1&&nets.length===1)return`${ports[0]?.selector} to net.${nets[0]._parsedProps.name}`}var getPcbBoardOutlinePolygon=pcbBoard=>pcbBoard.outline&&pcbBoard.outline.length>0?new Polygon$1(pcbBoard.outline.map(p4=>point4(p4.x,p4.y))):new Polygon$1(new Box(pcbBoard.center.x-pcbBoard.width/2,pcbBoard.center.y-pcbBoard.height/2,pcbBoard.center.x+pcbBoard.width/2,pcbBoard.center.y+pcbBoard.height/2).toPoints()),isRouteOutsideBoard=({mergedRoute,db:db2,pcbBoardId})=>{let pcbBoard=db2.pcb_board.get(pcbBoardId);if(!pcbBoard)return!1;let boardOutlinePolygon=getPcbBoardOutlinePolygon(pcbBoard);return!mergedRoute.flatMap(getRoutePointPositions).every(routePointPosition=>boardOutlinePolygon.contains(point4(routePointPosition.x,routePointPosition.y)))},isCloseTo2=(a3,b3)=>Math.abs(a3-b3)<1e-4,getObstaclesFromRoute2=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i3=0;i3<route.length-1;i3++){let[start,end]=[route[i3],route[i3+1]],prev=i3-1>=0?route[i3-1]:null,isHorz=isCloseTo2(start.y,end.y),isVert=isCloseTo2(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles};function fillPolygonWithRects(polygon2,options={}){if(polygon2.length<3)return[];let{rectHeight=.1}=options,rects=[],yCoords=polygon2.map(p4=>p4.y),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);for(let y4=minY;y4<maxY;y4+=rectHeight){let scanlineY=y4+rectHeight/2,intersections=[];for(let i3=0;i3<polygon2.length;i3++){let p12=polygon2[i3],p22=polygon2[(i3+1)%polygon2.length];if(p12.y<=scanlineY&&p22.y>scanlineY||p22.y<=scanlineY&&p12.y>scanlineY){let x4=(scanlineY-p12.y)*(p22.x-p12.x)/(p22.y-p12.y)+p12.x;intersections.push(x4)}}intersections.sort((a3,b3)=>a3-b3);for(let i3=0;i3<intersections.length;i3+=2)if(i3+1<intersections.length){let x12=intersections[i3],width=intersections[i3+1]-x12;width>1e-6&&rects.push({center:{x:x12+width/2,y:scanlineY},width,height:rectHeight})}}return rects}function fillCircleWithRects(circle2,options={}){let{center:center2,radius}=circle2,{rectHeight=.1}=options,rects=[],numSlices=Math.ceil(radius*2/rectHeight);for(let i3=0;i3<numSlices;i3++){let y4=center2.y-radius+(i3+.5)*rectHeight,dy3=y4-center2.y,halfWidth=Math.sqrt(radius*radius-dy3*dy3);halfWidth>0&&rects.push({center:{x:center2.x,y:y4},width:halfWidth*2,height:rectHeight})}return rects}var EVERY_LAYER2=["top","inner1","inner2","bottom"],QUARTER_TURN_TOLERANCE_DEGREES=.01,getAxisAlignedRectFromRotatedRect=rotatedRect=>{let normalizedRotation=(rotatedRect.rotation%360+360)%360,axisAlignedAngles=[0,90,180,270];for(let angle of axisAlignedAngles){if(Math.min(Math.abs(normalizedRotation-angle),360-Math.abs(normalizedRotation-angle))>QUARTER_TURN_TOLERANCE_DEGREES)continue;let isVertical4=angle===90||angle===270;return{center:rotatedRect.center,width:isVertical4?rotatedRect.height:rotatedRect.width,height:isVertical4?rotatedRect.width:rotatedRect.height}}return null},getObstaclesFromCircuitJson2=(circuitJson,connMap)=>{let withNetId=idList=>connMap?idList.concat(idList.map(id2=>connMap?.getNetConnectedToId(id2)).filter(Boolean)):idList,obstacles=[];for(let element of circuitJson){let pcbComponentId=element.pcb_component_id??void 0;if(element.type==="pcb_smtpad"){if(element.shape==="circle")obstacles.push({componentId:pcbComponentId,type:"oval",layers:[element.layer],center:{x:element.x,y:element.y},width:element.radius*2,height:element.radius*2,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rect")obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rotated_rect"){let rotatedRect={center:{x:element.x,y:element.y},width:element.width,height:element.height,rotation:element.ccw_rotation},rect=getAxisAlignedRectFromRotatedRect(rotatedRect)??rotatedRect;obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:rect.center,width:rect.width,height:rect.height,ccwRotationDegrees:element.ccw_rotation,connectedTo:withNetId([element.pcb_smtpad_id])})}else if(element.shape==="pill"||element.shape==="rotated_pill")obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,...element.shape==="rotated_pill"?{ccwRotationDegrees:element.ccw_rotation}:{},connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="polygon"){let xs3=element.points.map(point62=>point62.x),ys3=element.points.map(point62=>point62.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:{x:(minX+maxX)/2,y:(minY+maxY)/2},width:maxX-minX,height:maxY-minY,connectedTo:withNetId([element.pcb_smtpad_id])})}}else if(element.type==="pcb_keepout")element.shape==="circle"?obstacles.push({componentId:pcbComponentId,type:"oval",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.radius*2,height:element.radius*2,connectedTo:[]}):element.shape==="rect"&&obstacles.push({componentId:pcbComponentId,type:"rect",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.type==="pcb_cutout"){if(element.shape==="rect")obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.shape==="circle"){let approximatingRects=fillCircleWithRects({center:element.center,radius:element.radius},{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}else if(element.shape==="polygon"){let approximatingRects=fillPolygonWithRects(element.points,{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}}else if(element.type==="pcb_hole")element.hole_shape==="oval"?obstacles.push({componentId:pcbComponentId,type:"oval",center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="pill"||element.hole_shape==="rotated_pill"?obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,...element.hole_shape==="rotated_pill"?{ccwRotationDegrees:element.ccw_rotation}:{},connectedTo:[]}):element.hole_shape==="rect"?obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="square"?obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]}):(element.hole_shape==="round"||element.hole_shape==="circle")&&obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]});else if(element.type==="pcb_plated_hole"){if(element.shape==="circle")obstacles.push({componentId:pcbComponentId,type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_diameter,height:element.outer_diameter,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="circular_hole_with_rect_pad")obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.rect_pad_width,height:element.rect_pad_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="oval")obstacles.push({componentId:pcbComponentId,type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="pill")obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,ccwRotationDegrees:element.ccw_rotation,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="hole_with_polygon_pad"&&"pad_outline"in element&&element.pad_outline&&element.pad_outline.length>0){let xs3=element.pad_outline.map(p4=>element.x+p4.x),ys3=element.pad_outline.map(p4=>element.y+p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),centerX=(minX+maxX)/2,centerY=(minY+maxY)/2;obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:centerX,y:centerY},width:maxX-minX,height:maxY-minY,connectedTo:withNetId([element.pcb_plated_hole_id])})}}else if(element.type==="pcb_trace"){let traceObstacles=getObstaclesFromRoute2(element.route.flatMap(rp3=>rp3.route_type==="through_pad"?[{x:rp3.start.x,y:rp3.start.y,layer:rp3.start_layer},{x:rp3.end.x,y:rp3.end.y,layer:rp3.end_layer}]:[{x:rp3.x,y:rp3.y,layer:rp3.route_type==="wire"?rp3.layer:rp3.from_layer}]),element.source_trace_id);obstacles.push(...traceObstacles.map(obstacle=>({...obstacle,componentId:pcbComponentId})))}else if(element.type==="pcb_via"){let netIsAssignable=!!(element.net_is_assignable??element.netIsAssignable);obstacles.push({componentId:pcbComponentId,type:"rect",layers:element.layers,center:{x:element.x,y:element.y},connectedTo:withNetId([element.pcb_via_id]),width:element.outer_diameter,height:element.outer_diameter,netIsAssignable:netIsAssignable||void 0})}}return obstacles},getSchematicNetLabelTextWidth=({text,font_size=.18})=>{let fontScale=font_size/.18,charWidth=.12*fontScale,horizontalPadding=.12*fontScale;return text.length*charWidth+horizontalPadding},computeSchematicNetLabelCenter=({anchor_position,anchor_side,text,font_size=.18})=>{let width=getSchematicNetLabelTextWidth({text,font_size}),height=font_size,center2={...anchor_position};switch(anchor_side){case"right":center2.x-=width/2;break;case"left":center2.x+=width/2;break;case"top":center2.y-=height/2;break;case"bottom":center2.y+=height/2;break}return center2},getOtherSchematicTraces=({db:db2,source_trace_id,sameNetOnly,differentNetOnly})=>{!sameNetOnly&&!differentNetOnly&&(differentNetOnly=!0);let mySourceTrace=db2.source_trace.get(source_trace_id),traces=[];for(let otherSchematicTrace of db2.schematic_trace.list()){if(otherSchematicTrace.source_trace_id===source_trace_id)continue;let isSameNet=db2.source_trace.get(otherSchematicTrace.source_trace_id)?.subcircuit_connectivity_map_key===mySourceTrace.subcircuit_connectivity_map_key;differentNetOnly&&isSameNet||sameNetOnly&&!isSameNet||traces.push(otherSchematicTrace)}return traces},createSchematicTraceCrossingSegments=({edges:inputEdges,otherEdges})=>{let edges=[...inputEdges];for(let i3=0;i3<edges.length;i3++){if(i3>2e3)throw new Error("Over 2000 iterations spent inside createSchematicTraceCrossingSegments, you have triggered an infinite loop, please report this!");let edge=edges[i3],edgeOrientation=Math.abs(edge.from.x-edge.to.x)<.01?"vertical":edge.from.y===edge.to.y?"horizontal":"not-orthogonal";if(edgeOrientation==="not-orthogonal")continue;let otherEdgesIntersections=[];for(let otherEdge of otherEdges){let otherOrientation=otherEdge.from.x===otherEdge.to.x?"vertical":otherEdge.from.y===otherEdge.to.y?"horizontal":"not-orthogonal";if(otherOrientation==="not-orthogonal"||edgeOrientation===otherOrientation)continue;if(doesLineIntersectLine([edge.from,edge.to],[otherEdge.from,otherEdge.to],{lineThickness:.01})){let intersectX=edgeOrientation==="vertical"?edge.from.x:otherEdge.from.x,intersectY=edgeOrientation==="vertical"?otherEdge.from.y:edge.from.y,crossingPoint2={x:intersectX,y:intersectY};otherEdgesIntersections.push({otherEdge,crossingPoint:crossingPoint2,distanceFromEdgeFrom:distance2(edge.from,crossingPoint2)})}}if(otherEdgesIntersections.length===0)continue;let closestIntersection=otherEdgesIntersections[0];for(let intersection of otherEdgesIntersections)intersection.distanceFromEdgeFrom<closestIntersection.distanceFromEdgeFrom&&(closestIntersection=intersection);let crossingPoint=closestIntersection.crossingPoint,crossingSegmentLength=.075;if(crossingPoint.x===edge.from.x&&crossingPoint.y===edge.from.y)continue;let crossingUnitVec=getUnitVectorFromPointAToB(edge.from,crossingPoint),beforeCrossing={x:crossingPoint.x-crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y-crossingUnitVec.y*crossingSegmentLength/2},afterCrossing={x:crossingPoint.x+crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y+crossingUnitVec.y*crossingSegmentLength/2},overshot=distance2(afterCrossing,edge.to)<crossingSegmentLength,newEdges=[{from:edge.from,to:beforeCrossing},{from:beforeCrossing,to:afterCrossing,is_crossing:!0},{from:afterCrossing,to:edge.to}];edges.splice(i3,1,...newEdges),i3+=newEdges.length-2,overshot&&i3++}return edges},TOLERANCE=.001,isPointWithinEdge=(point62,edge)=>{let minX=Math.min(edge.from.x,edge.to.x),maxX=Math.max(edge.from.x,edge.to.x),minY=Math.min(edge.from.y,edge.to.y),maxY=Math.max(edge.from.y,edge.to.y);return point62.x>=minX&&point62.x<=maxX&&point62.y>=minY&&point62.y<=maxY},getEdgeOrientation=edge=>{let isVertical4=Math.abs(edge.from.x-edge.to.x)<TOLERANCE,isHorizontal3=Math.abs(edge.from.y-edge.to.y)<TOLERANCE;return isVertical4?"vertical":isHorizontal3?"horizontal":"diagonal"},getIntersectionPoint=(edge1,edge2)=>{let orientation1=getEdgeOrientation(edge1),orientation22=getEdgeOrientation(edge2);if(orientation1===orientation22)return null;if(orientation1==="vertical"&&orientation22==="horizontal"||orientation1==="horizontal"&&orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,horizontalEdge=orientation1==="horizontal"?edge1:edge2,x22=verticalEdge.from.x,y22=horizontalEdge.from.y,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}if(orientation1==="vertical"||orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,diagonalEdge=orientation1==="vertical"?edge2:edge1,x22=verticalEdge.from.x,m4=(diagonalEdge.to.y-diagonalEdge.from.y)/(diagonalEdge.to.x-diagonalEdge.from.x),b3=diagonalEdge.from.y-m4*diagonalEdge.from.x,y22=m4*x22+b3,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}let m12=(edge1.to.y-edge1.from.y)/(edge1.to.x-edge1.from.x),b12=edge1.from.y-m12*edge1.from.x,m22=(edge2.to.y-edge2.from.y)/(edge2.to.x-edge2.from.x),b22=edge2.from.y-m22*edge2.from.x;if(Math.abs(m12-m22)<TOLERANCE)return null;let x4=(b22-b12)/(m12-m22),y4=m12*x4+b12,intersection={x:x4,y:y4};return isPointWithinEdge(intersection,edge1)&&isPointWithinEdge(intersection,edge2)?intersection:null},createSchematicTraceJunctions=({edges:myEdges,db:db2,source_trace_id})=>{let otherEdges=getOtherSchematicTraces({db:db2,source_trace_id,sameNetOnly:!0}).flatMap(t52=>t52.edges),junctions=new Map;for(let myEdge of myEdges)for(let otherEdge of otherEdges){let intersection=getIntersectionPoint(myEdge,otherEdge);if(intersection){let key=`${intersection.x.toFixed(6)},${intersection.y.toFixed(6)}`;junctions.has(key)||junctions.set(key,intersection)}}return Array.from(junctions.values())};function normalizeAngle(angle){let normalized=angle%360;return normalized<0?normalized+360:normalized}function isAngleBetween(angle,start,end,direction2){return direction2==="counterclockwise"?end>=start?angle>=start&&angle<=end:angle>=start||angle<=end:end<=start?angle<=start&&angle>=end:angle<=start||angle>=end}function getArcBounds(elm){let center2=elm.center,radius=elm.radius,startAngle=elm.start_angle_degrees,endAngle=elm.end_angle_degrees,direction2=elm.direction??"counterclockwise";if(!center2||typeof center2.x!="number"||typeof center2.y!="number"||typeof radius!="number"||typeof startAngle!="number"||typeof endAngle!="number")return null;let start=normalizeAngle(startAngle),end=normalizeAngle(endAngle),consideredAngles=new Set([start,end]),cardinalAngles=[0,90,180,270];for(let cardinal of cardinalAngles)isAngleBetween(cardinal,start,end,direction2)&&consideredAngles.add(cardinal);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let angle of consideredAngles){let radians=angle*Math.PI/180,x4=center2.x+radius*Math.cos(radians),y4=center2.y+radius*Math.sin(radians);minX=Math.min(minX,x4),maxX=Math.max(maxX,x4),minY=Math.min(minY,y4),maxY=Math.max(maxY,y4)}return!Number.isFinite(minX)||!Number.isFinite(minY)?null:{minX,maxX,minY,maxY}}function getBoundsForSchematic(db2){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let elm of db2){let cx3,cy3,w4,h6;if(elm.type==="schematic_component")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.size?.width,h6=elm.size?.height;else if(elm.type==="schematic_box")cx3=elm.x,cy3=elm.y,w4=elm.width,h6=elm.height;else if(elm.type==="schematic_port")cx3=elm.center?.x,cy3=elm.center?.y,w4=.2,h6=.2;else if(elm.type==="schematic_text")cx3=elm.position?.x,cy3=elm.position?.y,w4=(elm.text?.length??0)*.1,h6=.2;else if(elm.type==="schematic_line"){let x12=elm.x1??0,y12=elm.y1??0,x22=elm.x2??0,y22=elm.y2??0;cx3=(x12+x22)/2,cy3=(y12+y22)/2,w4=Math.abs(x22-x12),h6=Math.abs(y22-y12)}else if(elm.type==="schematic_rect")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.width,h6=elm.height;else if(elm.type==="schematic_circle"){cx3=elm.center?.x,cy3=elm.center?.y;let radius=elm.radius;typeof radius=="number"&&(w4=radius*2,h6=radius*2)}else if(elm.type==="schematic_arc"){let bounds=getArcBounds(elm);bounds&&(minX=Math.min(minX,bounds.minX),maxX=Math.max(maxX,bounds.maxX),minY=Math.min(minY,bounds.minY),maxY=Math.max(maxY,bounds.maxY));continue}else if(elm.type==="schematic_path"){let points=elm.points;if(Array.isArray(points))for(let point62 of points)typeof point62.x=="number"&&typeof point62.y=="number"&&(minX=Math.min(minX,point62.x),maxX=Math.max(maxX,point62.x),minY=Math.min(minY,point62.y),maxY=Math.max(maxY,point62.y));continue}typeof cx3=="number"&&typeof cy3=="number"&&typeof w4=="number"&&typeof h6=="number"&&(minX=Math.min(minX,cx3-w4/2),maxX=Math.max(maxX,cx3+w4/2),minY=Math.min(minY,cy3-h6/2),maxY=Math.max(maxY,cy3+h6/2))}return{minX,maxX,minY,maxY}}function getObstaclesFromBounds(bounds,opts={}){let{minX,maxX,minY,maxY}=bounds,PADDING=opts.padding??1;if(!isFinite(minX)||!isFinite(maxX)||!isFinite(minY)||!isFinite(maxY))return[];let left=minX-PADDING,right=maxX+PADDING,top=maxY+PADDING,bottom=minY-PADDING,thickness=.01;return[{type:"rect",layers:["top"],center:{x:(left+right)/2,y:top},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:(left+right)/2,y:bottom},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:left,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]},{type:"rect",layers:["top"],center:{x:right,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]}]}var getSchematicObstaclesForTrace=trace=>{let db2=trace.root.db,connectedPorts=trace._findConnectedPorts().ports??[],connectedPortIds=new Set(connectedPorts.map(p4=>p4.schematic_port_id)),obstacles=[];for(let elm of db2.toArray()){if(elm.type==="schematic_component"){let isSymbol5=!!elm.symbol_name,dominateAxis=elm.size.width>elm.size.height?"horz":"vert";obstacles.push({type:"rect",layers:["top"],center:elm.center,width:elm.size.width+(isSymbol5&&dominateAxis==="horz"?-.5:0),height:elm.size.height+(isSymbol5&&dominateAxis==="vert"?-.5:0),connectedTo:[]})}if(elm.type==="schematic_port"){if(connectedPortIds.has(elm.schematic_port_id))continue;let dirVec=elm.facing_direction?getUnitVectorFromDirection(elm.facing_direction):{x:0,y:0};obstacles.push({type:"rect",layers:["top"],center:{x:elm.center.x-dirVec.x*.1,y:elm.center.y-dirVec.y*.1},width:.1+Math.abs(dirVec.x)*.3,height:.1+Math.abs(dirVec.y)*.3,connectedTo:[]})}elm.type==="schematic_text"&&obstacles.push({type:"rect",layers:["top"],center:elm.position,width:(elm.text?.length??0)*.1,height:.2,connectedTo:[]}),elm.type==="schematic_box"&&obstacles.push({type:"rect",layers:["top"],center:{x:elm.x,y:elm.y},width:elm.width,height:elm.height,connectedTo:[]})}let bounds=getBoundsForSchematic(db2.toArray());return obstacles.push(...getObstaclesFromBounds(bounds,{padding:1})),obstacles},pushEdgesOfSchematicTraceToPreventOverlap=({edges,db:db2,source_trace_id})=>{let mySourceTrace=db2.source_trace.get(source_trace_id),otherEdges=getOtherSchematicTraces({db:db2,source_trace_id,differentNetOnly:!0}).flatMap(t52=>t52.edges),edgeOrientation=edge=>{let{from,to:to3}=edge;return from.x===to3.x?"vertical":"horizontal"};for(let mySegment of edges){let mySegmentOrientation=edgeOrientation(mySegment),findOverlappingParallelSegment=()=>otherEdges.find(otherEdge=>edgeOrientation(otherEdge)===mySegmentOrientation&&doesLineIntersectLine([mySegment.from,mySegment.to],[otherEdge.from,otherEdge.to],{lineThickness:.05})),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment();for(;overlappingParallelSegmentFromOtherTrace;)mySegmentOrientation==="horizontal"?(mySegment.from.y+=.1,mySegment.to.y+=.1):(mySegment.from.x+=.1,mySegment.to.x+=.1),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment()}},convertFacingDirectionToElbowDirection=facingDirection=>{switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:}},autorouterVersion=package_default.version??"unknown",AutorouterError=class extends Error{constructor(message){super(`${message} (capacity-autorouter@${autorouterVersion})`),this.name="AutorouterError"}},TraceConnectionError=class extends Error{constructor(errorData){super(errorData.message);__publicField(this,"errorData");this.errorData=errorData,this.name="TraceConnectionError"}},Trace_doInitialSchematicTraceRender=trace=>{if(trace.root?._featureMspSchematicTraceRouting||trace._couldNotFindPort||trace.root?.schematicDisabled||trace.getCollapsedSchematicBoxAncestor())return;let{db:db2}=trace.root,{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let allPortsFound,connectedPorts;try{let result=trace._findConnectedPorts();allPortsFound=result.allPortsFound,connectedPorts=result.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"});return}throw error2}let{netsWithSelectors}=trace._findConnectedNets();if(!allPortsFound)return;let portPairKey=connectedPorts.map(p4=>p4.port.schematic_port_id).sort().join(","),board=trace.root?._getBoard();if(board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.has(portPairKey))return;let connection={name:trace.source_trace_id,pointsToConnect:[]},obstacles=getSchematicObstaclesForTrace(trace),portsWithPosition=connectedPorts.filter(({port})=>port.schematic_port_id!==null).map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id??void 0,facingDirection:port.facingDirection}));if(portsWithPosition.length===1&&netsWithSelectors.length===1){let net=netsWithSelectors[0].net,{port,position:anchorPos}=portsWithPosition[0],connectedNetLabel=trace.getSubcircuit().selectAll("netlabel").find(nl3=>{let conn=nl3._parsedProps.connection??nl3._parsedProps.connectsTo;return conn?Array.isArray(conn)?conn.some(selector=>trace.getSubcircuit().selectOne(selector,{port:!0})===port):trace.getSubcircuit().selectOne(conn,{port:!0})===port:!1});if(!connectedNetLabel){let dbNetLabel=db2.schematic_net_label.getWhere({source_trace_id:trace.source_trace_id});dbNetLabel&&(connectedNetLabel=dbNetLabel)}if(connectedNetLabel){let labelPos="_getGlobalSchematicPositionBeforeLayout"in connectedNetLabel?connectedNetLabel._getGlobalSchematicPositionBeforeLayout():connectedNetLabel.anchor_position,edges2=[];anchorPos.x===labelPos.x||anchorPos.y===labelPos.y?edges2.push({from:anchorPos,to:labelPos}):(edges2.push({from:anchorPos,to:{x:labelPos.x,y:anchorPos.y}}),edges2.push({from:{x:labelPos.x,y:anchorPos.y},to:labelPos}));let dbTrace2=db2.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges:edges2,junctions:[],subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0});trace.schematic_trace_id=dbTrace2.schematic_trace_id;return}if(trace.props.schDisplayLabel){let side2=getEnteringEdgeFromDirection(port.facingDirection)??"bottom";db2.schematic_net_label.insert({text:trace.props.schDisplayLabel,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side2,text:trace.props.schDisplayLabel}),anchor_side:side2});return}let side=getEnteringEdgeFromDirection(port.facingDirection)??"bottom",netLabel=db2.schematic_net_label.insert({text:net._parsedProps.name,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side,text:net._parsedProps.name}),anchor_side:side});return}if(trace.props.schDisplayLabel&&("from"in trace.props&&"to"in trace.props||"path"in trace.props)){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}if(portsWithPosition.length<2)return;let edges=(()=>{let elbowEdges=[];for(let i3=0;i3<portsWithPosition.length-1;i3++){let start=portsWithPosition[i3],end=portsWithPosition[i3+1],path=calculateElbow({x:start.position.x,y:start.position.y,facingDirection:convertFacingDirectionToElbowDirection(start.facingDirection)},{x:end.position.x,y:end.position.y,facingDirection:convertFacingDirectionToElbowDirection(end.facingDirection)});for(let j4=0;j4<path.length-1;j4++)elbowEdges.push({from:path[j4],to:path[j4+1]})}let doesSegmentIntersectRect2=(edge,rect)=>{let halfW=rect.width/2,halfH=rect.height/2,left=rect.center.x-halfW,right=rect.center.x+halfW,top=rect.center.y-halfH,bottom=rect.center.y+halfH,inRect=p4=>p4.x>=left&&p4.x<=right&&p4.y>=top&&p4.y<=bottom;return inRect(edge.from)||inRect(edge.to)?!0:[[{x:left,y:top},{x:right,y:top}],[{x:right,y:top},{x:right,y:bottom}],[{x:right,y:bottom},{x:left,y:bottom}],[{x:left,y:bottom},{x:left,y:top}]].some(r5=>doesLineIntersectLine([edge.from,edge.to],r5,{lineThickness:0}))};for(let edge of elbowEdges)for(let obstacle of obstacles)if(doesSegmentIntersectRect2(edge,obstacle))return null;return elbowEdges})();edges&&edges.length===0&&(edges=null),connection.pointsToConnect=portsWithPosition.map(({position:position4})=>({...position4,layer:"top"}));let bounds=computeObstacleBounds(obstacles),BOUNDS_MARGIN=2,simpleRouteJsonInput={minTraceWidth:.1,obstacles,connections:[connection],bounds:{minX:bounds.minX-BOUNDS_MARGIN,maxX:bounds.maxX+BOUNDS_MARGIN,minY:bounds.minY-BOUNDS_MARGIN,maxY:bounds.maxY+BOUNDS_MARGIN},layerCount:1},Autorouter=MultilayerIjump,skipOtherTraceInteraction=!1;if(trace.getSubcircuit().props._schDirectLineRoutingEnabled&&(Autorouter=DirectLineRouter,skipOtherTraceInteraction=!0),!edges){let results=new Autorouter({input:simpleRouteJsonInput,MAX_ITERATIONS:100,OBSTACLE_MARGIN:.1,isRemovePathLoopsEnabled:!0,isShortenPathWithShortcutsEnabled:!0,marginsWithCosts:[{margin:1,enterCost:0,travelCostFactor:1},{margin:.3,enterCost:0,travelCostFactor:1},{margin:.2,enterCost:0,travelCostFactor:2},{margin:.1,enterCost:0,travelCostFactor:3}]}).solveAndMapToTraces();if(results.length===0){if(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection()){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}results=new DirectLineRouter({input:simpleRouteJsonInput}).solveAndMapToTraces(),skipOtherTraceInteraction=!0}let[{route}]=results;edges=[];let wireAndViaRoutes=route.filter(r5=>r5.route_type==="wire"||r5.route_type==="via");for(let i3=0;i3<wireAndViaRoutes.length-1;i3++)edges.push({from:wireAndViaRoutes[i3],to:wireAndViaRoutes[i3+1]})}let source_trace_id=trace.source_trace_id,junctions=[];if(!skipOtherTraceInteraction){pushEdgesOfSchematicTraceToPreventOverlap({edges,db:db2,source_trace_id});let otherEdges=getOtherSchematicTraces({db:db2,source_trace_id,differentNetOnly:!0}).flatMap(t52=>t52.edges);edges=createSchematicTraceCrossingSegments({edges,otherEdges}),junctions=createSchematicTraceJunctions({edges,db:db2,source_trace_id:trace.source_trace_id})}if(!edges||edges.length===0)return;let lastEdge=edges[edges.length-1],lastEdgePort=portsWithPosition[portsWithPosition.length-1],lastDominantDirection=getDominantDirection(lastEdge);edges.push(...getStubEdges({lastEdge,lastEdgePort,lastDominantDirection}));let firstEdge=edges[0],firstEdgePort=portsWithPosition[0],firstDominantDirection=getDominantDirection(firstEdge);if(edges.unshift(...getStubEdges({firstEdge,firstEdgePort,firstDominantDirection})),!trace.source_trace_id)throw new Error("Missing source_trace_id for schematic trace insertion.");if(trace.getSubcircuit()._parsedProps.schTraceAutoLabelEnabled&&countComplexElements(junctions,edges)>=5&&(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection())){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}let dbTrace=db2.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges,junctions,subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0});trace.schematic_trace_id=dbTrace.schematic_trace_id;for(let{port}of connectedPorts)port.schematic_port_id&&db2.schematic_port.update(port.schematic_port_id,{is_connected:!0});board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.add(portPairKey)};function getTraceLength2(route){let totalLength=0;for(let i3=0;i3<route.length;i3++){let point62=route[i3];if(point62.route_type==="wire"){let nextPoint=route[i3+1];if(nextPoint){let nextPosition=getRoutePointPosition(nextPoint),position4=getRoutePointPosition(point62),dx3=nextPosition.x-position4.x,dy3=nextPosition.y-position4.y;totalLength+=Math.sqrt(dx3*dx3+dy3*dy3)}}else point62.route_type==="via"&&(totalLength+=1.6)}return totalLength}var DEFAULT_VIA_HOLE_DIAMETER=.2,DEFAULT_VIA_PAD_DIAMETER=.3,parseDistance=(value,fallback)=>{if(value===void 0)return fallback;if(typeof value=="number")return value;let parsed=parseFloat(value);return Number.isFinite(parsed)?parsed:fallback},getViaDiameterDefaults=pcbStyle2=>({holeDiameter:parseDistance(pcbStyle2?.viaHoleDiameter,DEFAULT_VIA_HOLE_DIAMETER),padDiameter:parseDistance(pcbStyle2?.viaPadDiameter,DEFAULT_VIA_PAD_DIAMETER)}),getViaDiameterDefaultsWithOverrides=(overrides,pcbStyle2)=>{let defaults=getViaDiameterDefaults(pcbStyle2);return{holeDiameter:overrides.holeDiameter??defaults.holeDiameter,padDiameter:overrides.padDiameter??defaults.padDiameter}},areAllPcbPrimitivesOverlapping=pcbPrimitives=>{if(pcbPrimitives.length<=1)return!0;let bounds=pcbPrimitives.map(p4=>{let circuitBounds=p4._getPcbCircuitJsonBounds();return{left:circuitBounds.bounds.left,right:circuitBounds.bounds.right,top:circuitBounds.bounds.top,bottom:circuitBounds.bounds.bottom}}),overlaps=Array(bounds.length).fill(!1).map(()=>Array(bounds.length).fill(!1));for(let i3=0;i3<bounds.length;i3++)for(let j4=i3+1;j4<bounds.length;j4++){let a3=bounds[i3],b3=bounds[j4];overlaps[i3][j4]=overlaps[j4][i3]=!(a3.right<b3.left||a3.left>b3.right||a3.bottom>b3.top||a3.top<b3.bottom)}let visited=new Set,dfs=node=>{visited.add(node);for(let i3=0;i3<bounds.length;i3++)overlaps[node][i3]&&!visited.has(i3)&&dfs(i3)};return dfs(0),visited.size===bounds.length};function formatPcbPrimitiveForError(component){let aliases2=(component._parsedProps?.portHints??[]).filter(Boolean);return aliases2.length>0?`<${component.lowercaseComponentName}(${aliases2.map(alias=>`.${alias}`).join(", ")}) />`:`<${component.lowercaseComponentName} />`}function getPcbSelectorErrorForTracePort(selector,port){let pcbMatches=port.matchedComponents.filter(c4=>c4.isPcbPrimitive),parentName=port.getParentNormalComponent()?.props.name??port.parent?.props.name??"unknown",parentNormalComponent=port.getParentNormalComponent(),selectorToken=selector.trim().split(/\s+|>/).filter(Boolean).at(-1)?.replace(/^port\./,"").replace(/^\./,"");if(selectorToken&&!/^(pin)?\d+$/.test(selectorToken)){let siblingPorts=(parentNormalComponent?.children??[]).filter(child=>child.componentName==="Port"&&child.isMatchingAnyOf([selectorToken])),matchingPortsAreInternallyConnected=(parentNormalComponent?._getInternallyConnectedPins?.()??[]).some(group=>siblingPorts.every(siblingPort=>group.includes(siblingPort)));if(siblingPorts.length>1&&!matchingPortsAreInternallyConnected){let rawPinSelectors2=Array.from(new Set(siblingPorts.flatMap(siblingPort=>siblingPort.getNameAndAliases().filter(alias=>/^pin\d+$/.test(alias)).map(alias=>`${parentName}.${alias}`)))),suggestion=rawPinSelectors2.length>0?` Use a raw pin selector like ${rawPinSelectors2.map(s3=>`"${s3}"`).join(" or ")}.`:"",siblingPcbMatches=siblingPorts.flatMap(siblingPort=>siblingPort.matchedComponents.filter(component=>component.isPcbPrimitive));return`Trace selector "${selector}" resolved to "${parentName}.${port.props.name}", but alias "${selectorToken}" matches multiple PCB pads: ${siblingPcbMatches.map(component=>formatPcbPrimitiveForError(component)).join(", ")}.${suggestion}`}}if(port.pcb_port_id)return null;let rawPinSelectors=Array.from(new Set(port.getNameAndAliases().filter(alias=>/^pin\d+$/.test(alias)).map(alias=>`${parentName}.${alias}`)));if(pcbMatches.length>1&&!areAllPcbPrimitivesOverlapping(pcbMatches)){let suggestion=rawPinSelectors.length>0?` Use a raw pin selector like ${rawPinSelectors.map(s3=>`"${s3}"`).join(" or ")}.`:"";return`Trace selector "${selector}" resolved to "${parentName}.${port.props.name}", but that target maps to multiple non-overlapping PCB pads: ${pcbMatches.map(c4=>formatPcbPrimitiveForError(c4)).join(", ")}.${suggestion}`}return null}var jlcMinTolerances2={min_trace_width:.1,min_via_hole_edge_to_via_hole_edge_clearance:.1,min_plated_hole_drill_edge_to_drill_edge_clearance:.15,min_trace_to_pad_edge_clearance:.1,min_pad_edge_to_pad_edge_clearance:.1,min_board_edge_clearance:.2,min_via_hole_diameter:.2,min_via_pad_diameter:.3},portToObjective=port=>({...port._getGlobalPcbPositionAfterLayout(),layers:port.getAvailablePcbLayers()}),SHOULD_USE_SINGLE_LAYER_ROUTING=!1;function Trace_doInitialPcbTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db:db2}=trace.root,{_parsedProps:props,parent}=trace,subcircuit=trace.getSubcircuit();if(!parent)throw new Error("Trace has no parent");if(subcircuit._parsedProps.routingDisabled||subcircuit._isInflatedFromCircuitJson)return;let cachedRoute=subcircuit._parsedProps.pcbRouteCache?.pcbTraces;if(cachedRoute){let pcb_trace22=db2.pcb_trace.insert({route:cachedRoute.flatMap(trace2=>trace2.route),source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0});trace.pcb_trace_id=pcb_trace22.pcb_trace_id;return}if(props.pcbPath&&props.pcbPath.length>0||props.pcbStraightLine||!subcircuit._shouldUseTraceByTraceRouting())return;let allPortsFound,ports,portsWithSelectors;try{let connectedPorts=trace._findConnectedPorts();allPortsFound=connectedPorts.allPortsFound,ports=connectedPorts.ports??[],portsWithSelectors=connectedPorts.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"}),trace._couldNotFindPort=!0;return}throw error2}let portsConnectedOnPcbViaNet=[];if(!allPortsFound)return;let pcbSelectorError=portsWithSelectors.map(({selector,port})=>getPcbSelectorErrorForTracePort(selector,port)).find(Boolean);if(pcbSelectorError){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:pcbSelectorError,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p4=>p4.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let nets=trace._findConnectedNets().netsWithSelectors;if(ports.length===0&&nets.length===2){trace.renderError("Trace connects two nets, we haven't implemented a way to route this yet");return}else if(ports.length===1&&nets.length===1){let port=ports[0],otherPortsInNet=nets[0].net.getAllConnectedPorts().filter(p4=>p4!==port);if(otherPortsInNet.length===0){console.log("Nothing to connect this port to, the net is empty. TODO should emit a warning!");return}let closestPortInNet=getClosest(port,otherPortsInNet);portsConnectedOnPcbViaNet.push(closestPortInNet),ports.push(closestPortInNet)}else if(ports.length>1&&nets.length>=1){trace.renderError("Trace has more than one port and one or more nets, we don't currently support this type of complex trace routing");return}let hints=ports.flatMap(port=>port.matchedComponents.filter(c4=>c4.componentName==="TraceHint")),pcbRouteHints=(trace._parsedProps.pcbRouteHints??[]).concat(hints.flatMap(h6=>h6.getPcbRouteHints()));if(ports.length>2){trace.renderError(`Trace has more than two ports (${ports.map(p4=>p4.getString()).join(", ")}), routing between more than two ports for a single trace is not implemented`);return}if(trace.getSubcircuit().selectAll("trace").filter(trace2=>trace2.renderPhaseStates.PcbTraceRender.initialized).some(trace2=>trace2._portsRoutedOnPcb.length===ports.length&&trace2._portsRoutedOnPcb.every(portRoutedByOtherTrace=>ports.includes(portRoutedByOtherTrace))))return;let orderedRouteObjectives=[];pcbRouteHints.length===0?orderedRouteObjectives=[portToObjective(ports[0]),portToObjective(ports[1])]:orderedRouteObjectives=[portToObjective(ports[0]),...pcbRouteHints,portToObjective(ports[1])];let candidateLayerCombinations=findPossibleTraceLayerCombinations(orderedRouteObjectives);if(SHOULD_USE_SINGLE_LAYER_ROUTING&&candidateLayerCombinations.length===0){trace.renderError(`Could not find a common layer (using hints) for trace ${trace.getString()}`);return}let connMap=getFullConnectivityMapFromCircuitJson(trace.root.db.toArray()),[obstacles,errGettingObstacles]=tryNow(()=>getObstaclesFromCircuitJson2(trace.root.db.toArray()));if(errGettingObstacles){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Error getting obstacles for autorouting: ${errGettingObstacles.message}`,source_trace_id:trace.source_trace_id,center:{x:0,y:0},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[]});return}for(let obstacle of obstacles)if(obstacle.connectedTo.length>0){let netId=connMap.getNetConnectedToId(obstacle.connectedTo[0]);netId&&obstacle.connectedTo.push(netId)}let orderedRoutePoints=[];if(candidateLayerCombinations.length===0)orderedRoutePoints=orderedRouteObjectives;else{let candidateLayerSelections=candidateLayerCombinations[0].layer_path;orderedRoutePoints=orderedRouteObjectives.map((t52,idx)=>t52.via?{...t52,via_to_layer:candidateLayerSelections[idx]}:{...t52,layers:[candidateLayerSelections[idx]]})}orderedRoutePoints[0].pcb_port_id=ports[0].pcb_port_id,orderedRoutePoints[orderedRoutePoints.length-1].pcb_port_id=ports[1].pcb_port_id;let routes=[];for(let[a3,b3]of pairs2(orderedRoutePoints)){let dominantLayer="via_to_layer"in a3?a3.via_to_layer:null,BOUNDS_MARGIN=2,aLayer="layers"in a3&&a3.layers.length===1?a3.layers[0]:dominantLayer??"top",bLayer="layers"in b3&&b3.layers.length===1?b3.layers[0]:dominantLayer??"top",pcbPortA="pcb_port_id"in a3?a3.pcb_port_id:null,pcbPortB="pcb_port_id"in b3?b3.pcb_port_id:null,minTraceWidth=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??jlcMinTolerances2.min_trace_width,ijump=new MultilayerIjump({OBSTACLE_MARGIN:minTraceWidth*2,isRemovePathLoopsEnabled:!0,optimizeWithGoalBoxes:!!(pcbPortA&&pcbPortB),connMap,input:{obstacles,minTraceWidth,connections:[{name:trace.source_trace_id,pointsToConnect:[{...a3,layer:aLayer,pcb_port_id:pcbPortA},{...b3,layer:bLayer,pcb_port_id:pcbPortB}]}],layerCount:trace.getSubcircuit()._getSubcircuitLayerCount(),bounds:{minX:Math.min(a3.x,b3.x)-BOUNDS_MARGIN,maxX:Math.max(a3.x,b3.x)+BOUNDS_MARGIN,minY:Math.min(a3.y,b3.y)-BOUNDS_MARGIN,maxY:Math.max(a3.y,b3.y)+BOUNDS_MARGIN}}}),traces=null;try{traces=ijump.solveAndMapToTraces()}catch(e5){trace.renderError({type:"pcb_trace_error",pcb_trace_error_id:trace.source_trace_id,error_type:"pcb_trace_error",message:`error solving route: ${e5.message}`,source_trace_id:trace.pcb_trace_id,center:{x:(a3.x+b3.x)/2,y:(a3.y+b3.y)/2},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p4=>p4.pcb_component_id)})}if(!traces)return;if(traces.length===0){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Could not find a route for ${trace}`,source_trace_id:trace.source_trace_id,center:{x:(a3.x+b3.x)/2,y:(a3.y+b3.y)/2},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p4=>p4.pcb_component_id)});return}let[autoroutedTrace]=traces;dominantLayer&&(autoroutedTrace.route=autoroutedTrace.route.map(p4=>(p4.route_type==="wire"&&!p4.layer&&(p4.layer=dominantLayer),p4))),pcbPortA&&autoroutedTrace.route[0].route_type==="wire"&&(autoroutedTrace.route[0].start_pcb_port_id=pcbPortA);let lastRoutePoint=autoroutedTrace.route[autoroutedTrace.route.length-1];pcbPortB&&lastRoutePoint.route_type==="wire"&&(lastRoutePoint.end_pcb_port_id=pcbPortB),routes.push(autoroutedTrace.route)}let mergedRoute=mergeRoutes(routes),traceLength=getTraceLength2(mergedRoute),pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),pcb_trace3=db2.pcb_trace.insert({route:mergedRoute,source_trace_id:trace.source_trace_id,subcircuit_id:trace.getSubcircuit()?.subcircuit_id,trace_length:traceLength});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace3.pcb_trace_id;for(let point62 of mergedRoute)point62.route_type==="via"&&db2.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point62.x,y:point62.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point62.from_layer,point62.to_layer],from_layer:point62.from_layer,to_layer:point62.to_layer});trace._insertErrorIfTraceIsOutsideBoard(mergedRoute,ports)}function computeLineRectIntersection(params){let{lineStart,lineEnd,rectCenter,rectWidth,rectHeight}=params,left=rectCenter.x-rectWidth/2,right=rectCenter.x+rectWidth/2,top=rectCenter.y+rectHeight/2,bottom=rectCenter.y-rectHeight/2,dx3=lineEnd.x-lineStart.x,dy3=lineEnd.y-lineStart.y,intersections=[];if(dx3!==0){let t52=(left-lineStart.x)/dx3;if(t52>=0&&t52<=1){let y4=lineStart.y+t52*dy3;y4>=bottom&&y4<=top&&intersections.push({x:left,y:y4,t:t52})}}if(dx3!==0){let t52=(right-lineStart.x)/dx3;if(t52>=0&&t52<=1){let y4=lineStart.y+t52*dy3;y4>=bottom&&y4<=top&&intersections.push({x:right,y:y4,t:t52})}}if(dy3!==0){let t52=(bottom-lineStart.y)/dy3;if(t52>=0&&t52<=1){let x4=lineStart.x+t52*dx3;x4>=left&&x4<=right&&intersections.push({x:x4,y:bottom,t:t52})}}if(dy3!==0){let t52=(top-lineStart.y)/dy3;if(t52>=0&&t52<=1){let x4=lineStart.x+t52*dx3;x4>=left&&x4<=right&&intersections.push({x:x4,y:top,t:t52})}}return intersections.length===0?null:(intersections.sort((a3,b3)=>a3.t-b3.t),{x:intersections[0].x,y:intersections[0].y})}function computeLineCircleIntersection(params){let{lineStart,lineEnd,circleCenter,circleRadius}=params,x12=lineStart.x-circleCenter.x,y12=lineStart.y-circleCenter.y,x22=lineEnd.x-circleCenter.x,y22=lineEnd.y-circleCenter.y,dx3=x22-x12,dy3=y22-y12,a3=dx3*dx3+dy3*dy3,b3=2*(x12*dx3+y12*dy3),c4=x12*x12+y12*y12-circleRadius*circleRadius,discriminant=b3*b3-4*a3*c4;if(discriminant<0)return null;let sqrtDisc=Math.sqrt(discriminant),t110=(-b3-sqrtDisc)/(2*a3),t210=(-b3+sqrtDisc)/(2*a3),t52=null;return t110>=0&&t110<=1?t52=t110:t210>=0&&t210<=1&&(t52=t210),t52===null?null:{x:lineStart.x+t52*dx3,y:lineStart.y+t52*dy3}}function clipTraceEndAtPad(params){let{traceStart,traceEnd,traceWidth,port}=params,pcbPrimitive=port.matchedComponents.find(c4=>c4.isPcbPrimitive);if(!pcbPrimitive)return traceEnd;let padBounds=pcbPrimitive._getPcbCircuitJsonBounds(),padWidth=padBounds.width,padHeight=padBounds.height,padCenter=padBounds.center,smallestPadDimension=Math.min(padWidth,padHeight);if(traceWidth<=smallestPadDimension/2)return traceEnd;let clippedPoint=null;if(pcbPrimitive.componentName==="SmtPad"){let smtPad=pcbPrimitive,padShape=smtPad._parsedProps.shape;if(padShape==="circle"){let radius=smtPad._parsedProps.radius;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:radius})}else(padShape==="rect"||padShape==="rotated_rect"||padShape==="pill"||padShape==="polygon")&&(clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight}))}else if(pcbPrimitive.componentName==="PlatedHole"){let platedHole=pcbPrimitive;if(platedHole._parsedProps.shape==="circle"){let outerDiameter=platedHole._parsedProps.outerDiameter;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:outerDiameter/2})}else clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight})}return clippedPoint??traceEnd}var findInflatedPcbViaForPoint=(vias,point62)=>{if(point62.route_type==="via")return vias?.find(via=>Math.abs(via.x-point62.x)<1e-4&&Math.abs(via.y-point62.y)<1e-4&&(!via.from_layer||via.from_layer===point62.from_layer)&&(!via.to_layer||via.to_layer===point62.to_layer))},getViaDiameterFromRoutePoint=point62=>{let viaPoint=point62;return{holeDiameter:viaPoint.hole_diameter??viaPoint.via_hole_diameter,outerDiameter:viaPoint.outer_diameter??viaPoint.via_diameter}};function Trace_doInitialPcbManualTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db:db2}=trace.root,{_parsedProps:props}=trace,subcircuit=trace.getSubcircuit(),hasPcbPath=props.pcbPath!==void 0,wantsStraightLine=!!props.pcbStraightLine,inflatedPcbTrace=trace._inflatedPcbTrace;if(!hasPcbPath&&!wantsStraightLine&&!inflatedPcbTrace)return;let allPortsFound,ports,portsWithSelectors;try{let connectedPorts=trace._findConnectedPorts();allPortsFound=connectedPorts.allPortsFound,ports=connectedPorts.ports??[],portsWithSelectors=connectedPorts.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"}),trace._couldNotFindPort=!0;return}throw error2}if(!allPortsFound)return;let pcbSelectorError=portsWithSelectors.map(({selector,port})=>getPcbSelectorErrorForTracePort(selector,port)).find(Boolean);if(pcbSelectorError){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:pcbSelectorError,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p4=>p4.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let width=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??jlcMinTolerances2.min_trace_width;if(inflatedPcbTrace){let{maybeFlipLayer}=trace._getPcbPrimitiveFlippedHelpers(),transform22=trace._computePcbGlobalTransformBeforeLayout(),transformedRoute=inflatedPcbTrace.route.map(point62=>{if(point62.route_type==="wire"){let{x:x4,y:y4,...restOfPoint}=point62,transformedPoint=applyToPoint2(transform22,{x:x4,y:y4});return{...restOfPoint,...transformedPoint,layer:maybeFlipLayer(point62.layer)}}if(point62.route_type==="via"){let{x:x4,y:y4,...restOfPoint}=point62,transformedPoint=applyToPoint2(transform22,{x:x4,y:y4});return{...restOfPoint,...transformedPoint,from_layer:maybeFlipLayer(point62.from_layer),to_layer:maybeFlipLayer(point62.to_layer)}}return{...point62,start:applyToPoint2(transform22,point62.start),end:applyToPoint2(transform22,point62.end),start_layer:maybeFlipLayer(point62.start_layer),end_layer:maybeFlipLayer(point62.end_layer)}}),pcb_trace22=db2.pcb_trace.insert({...inflatedPcbTrace,route:transformedRoute,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0}),pcbStyle22=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter:holeDiameter2,padDiameter:padDiameter2}=getViaDiameterDefaults(pcbStyle22);for(let index=0;index<transformedRoute.length;index++){let point62=transformedRoute[index];if(point62.route_type==="via"){let originalPoint=inflatedPcbTrace.route[index],inflatedPcbVia=findInflatedPcbViaForPoint(trace._inflatedPcbVias,originalPoint),routePointViaDiameter=getViaDiameterFromRoutePoint(point62),fromLayer=maybeFlipLayer(inflatedPcbVia?.from_layer??point62.from_layer),toLayer=maybeFlipLayer(inflatedPcbVia?.to_layer??point62.to_layer),layers=(inflatedPcbVia?.layers??[point62.from_layer,point62.to_layer]).map(layer2=>maybeFlipLayer(layer2));db2.pcb_via.insert({pcb_trace_id:pcb_trace22.pcb_trace_id,x:point62.x,y:point62.y,hole_diameter:inflatedPcbVia?.hole_diameter??routePointViaDiameter.holeDiameter??holeDiameter2,outer_diameter:inflatedPcbVia?.outer_diameter??routePointViaDiameter.outerDiameter??padDiameter2,layers,from_layer:fromLayer,to_layer:toLayer,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,subcircuit_connectivity_map_key:inflatedPcbVia?.subcircuit_connectivity_map_key,net_is_assignable:inflatedPcbVia?.net_is_assignable,net_assigned:inflatedPcbVia?.net_assigned,is_tented:inflatedPcbVia?.is_tented})}}trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace22.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(pcb_trace22.route,ports);return}if(wantsStraightLine&&!hasPcbPath){if(!ports||ports.length<2){trace.renderError("pcbStraightLine requires exactly two connected ports");return}let[startPort,endPort]=ports,startLayers=startPort.getAvailablePcbLayers(),endLayers=endPort.getAvailablePcbLayers(),layer2=startLayers.find(layer3=>endLayers.includes(layer3))??startLayers[0]??endLayers[0]??"top",startPos=startPort._getGlobalPcbPositionAfterLayout(),endPos=endPort._getGlobalPcbPositionAfterLayout(),clippedStartPos=clipTraceEndAtPad({traceStart:endPos,traceEnd:startPos,traceWidth:width,port:startPort}),clippedEndPos=clipTraceEndAtPad({traceStart:startPos,traceEnd:endPos,traceWidth:width,port:endPort}),route2=[{route_type:"wire",x:clippedStartPos.x,y:clippedStartPos.y,width,layer:layer2,start_pcb_port_id:startPort.pcb_port_id},{route_type:"wire",x:clippedEndPos.x,y:clippedEndPos.y,width,layer:layer2,end_pcb_port_id:endPort.pcb_port_id}],traceLength2=getTraceLength2(route2),pcb_trace22=db2.pcb_trace.insert({route:route2,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength2});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace22.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route2,ports);return}if(!props.pcbPath)return;let anchorPort;props.pcbPathRelativeTo&&(anchorPort=portsWithSelectors.find(p4=>p4.selector===props.pcbPathRelativeTo)?.port,anchorPort||(anchorPort=trace.getSubcircuit().selectOne(props.pcbPathRelativeTo))),anchorPort||(anchorPort=ports[0]);let otherPort=ports.find(p4=>p4!==anchorPort)??ports[1],currentLayer=anchorPort.getAvailablePcbLayers()[0]||"top",anchorPos=anchorPort._getGlobalPcbPositionAfterLayout(),otherPos=otherPort._getGlobalPcbPositionAfterLayout(),route=[];route.push({route_type:"wire",x:anchorPos.x,y:anchorPos.y,width,layer:currentLayer,start_pcb_port_id:anchorPort.pcb_port_id});let transform6=subcircuit._isInflatedFromCircuitJson?trace._computePcbGlobalTransformBeforeLayout():anchorPort?._computePcbGlobalTransformBeforeLayout?.()||identity(),pcbPath2=props.pcbPath;for(let pt3 of pcbPath2){let coordinates,isGlobalPosition=!1,isViaPoint2=typeof pt3!="string"&&pt3.via,viaFromLayer,viaToLayer;if(typeof pt3=="string"){let resolvedPort=trace.getSubcircuit().selectOne(pt3,{type:"port"});if(!resolvedPort){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Could not resolve pcbPath selector "${pt3}" for ${trace}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:[]});continue}let pcbTargetError=getPcbSelectorErrorForTracePort(pt3,resolvedPort);if(pcbTargetError){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:pcbTargetError,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:[]});return}let portPos=resolvedPort._getGlobalPcbPositionAfterLayout();coordinates={x:portPos.x,y:portPos.y},isGlobalPosition=!0}else coordinates={x:pt3.x,y:pt3.y},isGlobalPosition=!1,pt3.via&&(viaFromLayer=pt3.fromLayer??currentLayer,viaToLayer=pt3.toLayer);let finalCoordinates=isGlobalPosition?coordinates:applyToPoint2(transform6,coordinates);isViaPoint2?(route.push({route_type:"via",x:finalCoordinates.x,y:finalCoordinates.y,from_layer:viaFromLayer??currentLayer,to_layer:viaToLayer??currentLayer}),currentLayer=viaToLayer??currentLayer):route.push({route_type:"wire",x:finalCoordinates.x,y:finalCoordinates.y,width,layer:currentLayer})}route.push({route_type:"wire",x:otherPos.x,y:otherPos.y,width,layer:currentLayer,end_pcb_port_id:otherPort.pcb_port_id});let traceLength=getTraceLength2(route),pcb_trace3=db2.pcb_trace.insert({route,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength}),pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);for(let point62 of route)point62.route_type==="via"&&db2.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point62.x,y:point62.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point62.from_layer,point62.to_layer],from_layer:point62.from_layer,to_layer:point62.to_layer});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace3.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route,ports)}function Trace__doInitialSchematicTraceRenderWithDisplayLabel(trace){if(trace.root?.schematicDisabled)return;let{db:db2}=trace.root,{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let{allPortsFound,portsWithSelectors:connectedPorts}=trace._findConnectedPorts();if(!allPortsFound)return;let portsWithPosition=connectedPorts.map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id,facingDirection:port.facingDirection}));if(portsWithPosition.length<2)throw new Error("Expected at least two ports in portsWithPosition.");let fromPortName,toPortName,fromAnchorPos=portsWithPosition[0].position,fromPort=portsWithPosition[0].port;if("path"in trace.props){if(trace.props.path.length!==2)throw new Error("Invalid 'path': Must contain exactly two elements.");[fromPortName,toPortName]=trace.props.path}else{if(!("from"in trace.props&&"to"in trace.props))throw new Error("Missing 'from' or 'to' properties in props.");fromPortName=trace.props.from,toPortName=trace.props.to}if(!fromPort.source_port_id)throw new Error(`Missing source_port_id for the 'from' port (${fromPortName}).`);let toAnchorPos=portsWithPosition[1].position,toPort=portsWithPosition[1].port;if(!toPort.source_port_id)throw new Error(`Missing source_port_id for the 'to' port (${toPortName}).`);let existingFromNetLabel=db2.schematic_net_label.list().find(label=>label.source_net_id===fromPort.source_port_id),existingToNetLabel=db2.schematic_net_label.list().find(label=>label.source_net_id===toPort.source_port_id),[firstPort,secondPort]=connectedPorts.map(({port})=>port),pinFullName=firstPort.parent?.config.shouldRenderAsSchematicBox?`${firstPort?.parent?.props.name}_${firstPort?.props.name}`:`${secondPort?.parent?.props.name}_${secondPort?.props.name}`,netLabelText=trace.props.schDisplayLabel??pinFullName;if(existingFromNetLabel&&existingFromNetLabel.text!==netLabelText&&(existingFromNetLabel.text=`${netLabelText} / ${existingFromNetLabel.text}`),existingToNetLabel&&existingToNetLabel?.text!==netLabelText&&(existingToNetLabel.text=`${netLabelText} / ${existingToNetLabel.text}`),!existingToNetLabel){let toSide=getEnteringEdgeFromDirection(toPort.facingDirection)??"bottom";db2.schematic_net_label.insert({text:trace.props.schDisplayLabel??pinFullName,source_net_id:toPort.source_port_id,anchor_position:toAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:toAnchorPos,anchor_side:toSide,text:trace.props.schDisplayLabel??pinFullName}),anchor_side:toSide})}if(!existingFromNetLabel){let fromSide=getEnteringEdgeFromDirection(fromPort.facingDirection)??"bottom";db2.schematic_net_label.insert({text:trace.props.schDisplayLabel??pinFullName,source_net_id:fromPort.source_port_id,anchor_position:fromAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:fromAnchorPos,anchor_side:fromSide,text:trace.props.schDisplayLabel??pinFullName}),anchor_side:fromSide})}}function Trace__findConnectedPorts(trace){let{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let portSelectors=trace.getTracePortPathSelectors(),resolveImplicitSinglePort=selector=>{if(selector.lastIndexOf(".")>selector.lastIndexOf(" "))return null;let targetComponent=trace.getSubcircuit().selectOne(selector);if(!targetComponent&&!/[.#\[]/.test(selector)&&(targetComponent=trace.getSubcircuit().selectOne(`.${selector}`)),!targetComponent)return null;let ports=targetComponent.children.filter(c4=>c4.componentName==="Port");return ports.length===1?ports[0]:null},portsWithSelectors=portSelectors.map(selector=>({selector,port:trace.getSubcircuit().selectOne(selector,{type:"port"})??resolveImplicitSinglePort(selector)}));for(let{selector,port}of portsWithSelectors)if(!port){let parentSelector,portToken,dotIndex=selector.lastIndexOf(".");if(dotIndex!==-1&&dotIndex>selector.lastIndexOf(" "))parentSelector=selector.slice(0,dotIndex),portToken=selector.slice(dotIndex+1);else{let match2=selector.match(/^(.*[ >])?([^ >]+)$/);parentSelector=match2?.[1]?.trim()??"",portToken=match2?.[2]??selector}let targetComponent=parentSelector?trace.getSubcircuit().selectOne(parentSelector):null;if(!targetComponent&&parentSelector&&!/[.#\[]/.test(parentSelector)&&(targetComponent=trace.getSubcircuit().selectOne(`.${parentSelector}`)),!targetComponent){let errorMessage2=parentSelector?`Could not find port for selector "${selector}". Component "${parentSelector}" not found`:`Could not find port for selector "${selector}"`,subcircuit2=trace.getSubcircuit(),sourceGroup2=subcircuit2.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage2,subcircuit_id:subcircuit2.subcircuit_id??void 0,source_group_id:sourceGroup2?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}let ports=targetComponent.children.filter(c4=>c4.componentName==="Port"),portLabel=portToken.includes(".")?portToken.split(".").pop()??"":portToken,portNames=ports.flatMap(c4=>c4.getNameAndAliases()),hasCustomLabels=portNames.some(n4=>!/^(pin\d+|\d+)$/.test(n4)),labelList=Array.from(new Set(portNames)).join(", "),detail;ports.length===0?detail="It has no ports":hasCustomLabels?detail=`It has [${labelList}]`:detail=`It has ${ports.length} pins and no pinLabels (consider adding pinLabels)`;let errorMessage=`Could not find port for selector "${selector}". Component "${targetComponent.props.name??parentSelector}" found, but does not have pin "${portLabel}". ${detail}`,subcircuit=trace.getSubcircuit(),sourceGroup=subcircuit.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage,subcircuit_id:subcircuit.subcircuit_id??void 0,source_group_id:sourceGroup?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}return portsWithSelectors.some(p4=>!p4.port)?{allPortsFound:!1}:{allPortsFound:!0,portsWithSelectors,ports:portsWithSelectors.map(({port})=>port)}}var Trace3=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"source_trace_id",null);__publicField(this,"pcb_trace_id",null);__publicField(this,"schematic_trace_id",null);__publicField(this,"_inflatedPcbTrace");__publicField(this,"_inflatedPcbVias");__publicField(this,"_portsRoutedOnPcb");__publicField(this,"subcircuit_connectivity_map_key",null);__publicField(this,"_traceConnectionHash",null);__publicField(this,"_couldNotFindPort");this._portsRoutedOnPcb=[]}_getExplicitTraceThickness(){return this._parsedProps.thickness??this._parsedProps.width}get config(){return{zodProps:traceProps,componentName:"Trace"}}_getTracePortOrNetSelectorListFromProps(){return"from"in this.props&&"to"in this.props?[typeof this.props.from=="string"?this.props.from:this.props.from.getPortSelector(),typeof this.props.to=="string"?this.props.to:this.props.to.getPortSelector()]:"path"in this.props?this.props.path.map(p4=>typeof p4=="string"?p4:p4.getPortSelector()):[]}getTracePortPathSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>!selector.includes("net."))}getTracePathNetSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>selector.includes("net."))}_findConnectedPorts(){return Trace__findConnectedPorts(this)}_resolveNet(selector){let direct=this.getSubcircuit().selectOne(selector,{type:"net"});if(direct)return direct;let match2=selector.match(/^net\.(.+)$/),netName=match2?match2[1]:null;if(!netName)return null;let board=this.root?._getBoard();return board?board.getDescendants().find(d4=>d4.componentName==="Net"&&d4._parsedProps.name===netName)||null:(this.renderError(`Could not find a <board> ancestor for ${this}, so net "${selector}" cannot be resolved`),null)}_findConnectedNets(){let netsWithSelectors=this.getTracePathNetSelectors().map(selector=>({selector,net:this._resolveNet(selector)})),undefinedNets=netsWithSelectors.filter(n4=>!n4.net);return undefinedNets.length>0&&this.renderError(`Could not find net for selector "${undefinedNets[0].selector}" inside ${this}`),{netsWithSelectors,nets:netsWithSelectors.map(n4=>n4.net)}}_getAllTracesConnectedToSameNet(){let traces=this.getSubcircuit().selectAll("trace"),myNets=this._findConnectedNets().nets,myPorts=this._findConnectedPorts().ports??[];return traces.filter(t52=>{if(t52===this)return!1;let tNets=t52._findConnectedNets().nets,tPorts=t52._findConnectedPorts().ports??[];return tNets.some(n4=>myNets.includes(n4))||tPorts.some(p4=>myPorts.includes(p4))})}_isExplicitlyConnectedToPort(port){let{allPortsFound,portsWithSelectors:portsWithMetadata}=this._findConnectedPorts();return allPortsFound?portsWithMetadata.map(p4=>p4.port).includes(port):!1}_isExplicitlyConnectedToNet(net){return this._findConnectedNets().nets.includes(net)}doInitialCreateNetsFromProps(){createNetsFromProps(this,this.getTracePathNetSelectors())}_computeTraceConnectionHash(){let{allPortsFound,ports}=this._findConnectedPorts();return!allPortsFound||!ports?null:[...ports].sort((a3,b3)=>(a3.pcb_port_id||"").localeCompare(b3.pcb_port_id||"")).map(p4=>p4.pcb_port_id).join(",")}doInitialSourceTraceRender(){let{db:db2}=this.root,{_parsedProps:props,parent}=this;if(!parent){this.renderError("Trace has no parent");return}let allPortsFound,ports;try{let result=this._findConnectedPorts();allPortsFound=result.allPortsFound,ports=result.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"}),this._couldNotFindPort=!0;return}throw error2}if(!allPortsFound)return;this._traceConnectionHash=this._computeTraceConnectionHash();let existingTrace=db2.source_trace.list().find(t52=>t52.subcircuit_connectivity_map_key===this.subcircuit_connectivity_map_key&&t52.connected_source_port_ids.sort().join(",")===this._traceConnectionHash);if(existingTrace){this.source_trace_id=existingTrace.source_trace_id;return}let nets=this._findConnectedNets().nets,displayName=getTraceDisplayName({ports,nets}),trace=db2.source_trace.insert({connected_source_port_ids:ports.map(p4=>p4.port.source_port_id),connected_source_net_ids:nets.map(n4=>n4.source_net_id),subcircuit_id:this.getSubcircuit()?.subcircuit_id,max_length:getMaxLengthFromConnectedCapacitors(ports.map(p4=>p4.port),{db:db2})??props.maxLength,display_name:displayName,min_trace_thickness:this._getExplicitTraceThickness()});this.source_trace_id=trace.source_trace_id}_insertErrorIfTraceIsOutsideBoard(mergedRoute,ports){let{db:db2}=this.root,board=this._getBoard();if(!board)return;let pcbBoardId=board.pcb_board_id;if(!pcbBoardId)return;isRouteOutsideBoard({mergedRoute,db:db2,pcbBoardId})&&db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:this.source_trace_id,message:`Trace ${this.getString()} routed outside the board boundaries.`,pcb_trace_id:this.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p4=>p4.pcb_port_id)})}doInitialPcbManualTraceRender(){Trace_doInitialPcbManualTraceRender(this)}doInitialPcbTraceRender(){Trace_doInitialPcbTraceRender(this)}_doInitialSchematicTraceRenderWithDisplayLabel(){Trace__doInitialSchematicTraceRenderWithDisplayLabel(this)}_isSymbolToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&!isPort2Chip||!isPort1Chip&&isPort2Chip}_isSymbolToSymbolConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Symbol=!port1.parent.config.shouldRenderAsSchematicBox,isPort2Symbol=!port2.parent.config.shouldRenderAsSchematicBox;return isPort1Symbol&&isPort2Symbol}_isChipToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&isPort2Chip}doInitialSchematicTraceRender(){Trace_doInitialSchematicTraceRender(this)}},catalogue={},extendCatalogue=objects=>{let altKeys=Object.fromEntries(Object.entries(objects).map(([key,v4])=>[key.toLowerCase(),v4]));Object.assign(catalogue,objects),Object.assign(catalogue,altKeys)},ErrorPlaceholderComponent=class extends PrimitiveComponent2{constructor(props,error2){super(props);let resolveCoordinate=(value,axis)=>{if(typeof value=="number")return value;if(typeof value=="string")try{return this._resolvePcbCoordinate(value,axis,{allowBoardVariables:!1})}catch{return 0}return 0};this._parsedProps={...props,error:error2,type:props.type||"unknown",component_name:props.name,error_type:"source_failed_to_create_component_error",message:error2 instanceof Error?error2.message:String(error2),pcbX:resolveCoordinate(props.pcbX,"pcbX"),pcbY:resolveCoordinate(props.pcbY,"pcbY"),schX:props.schX,schY:props.schY}}formatErrorDetails(){let selectorValue=this._parsedProps.selector??this._parsedProps.selectors??this._parsedProps.in??this._parsedProps.within,selectorText=selectorValue===void 0?void 0:typeof selectorValue=="string"?selectorValue:this.safeStringify(selectorValue),propsText=this.safeStringify(this._parsedProps);return{selectorText,propsText}}safeStringify(value){let seen=new WeakSet,json=JSON.stringify(value,(_key,item)=>{if(typeof item=="bigint")return item.toString();if(typeof item=="function")return`[Function ${item.name||"anonymous"}]`;if(typeof item=="symbol")return item.toString();if(typeof item=="object"&&item!==null){if(seen.has(item))return"[Circular]";seen.add(item)}return item},2);return json?json.length>2e3?`${json.slice(0,2e3)}\u2026`:json:"undefined"}get config(){return{componentName:"ErrorPlaceholder",zodProps:external_exports.object({}).passthrough()}}doInitialSourceRender(){if(this.root?.db){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout(),{selectorText,propsText}=this.formatErrorDetails(),messageDetails=[selectorText?`Within selector: ${selectorText}`:null,`Props: ${propsText}`].filter(Boolean).join(" "),baseMessage=`Could not create ${this._parsedProps.componentType??"component"}${this._parsedProps.name?` "${this._parsedProps.name}"`:""}. ${this._parsedProps.error?.formattedError?._errors?.join("; ")||this._parsedProps.message}`;this.root.db.source_failed_to_create_component_error.insert({component_name:this._parsedProps.component_name,error_type:"source_failed_to_create_component_error",message:`${baseMessage}${messageDetails?` Details: ${messageDetails}`:""}`,pcb_center:pcbPosition2,schematic_center:schematicPosition})}}};function createErrorPlaceholderComponent(props,error2){return new ErrorPlaceholderComponent(props,error2)}function prepare(object,state2){let instance=object;return instance.__tsci={...state2},object}var hostConfig={supportsMutation:!0,createInstance(type,props){let target=catalogue[type];if(!target)throw Object.keys(catalogue).length===0?new Error("No components registered in catalogue, did you forget to import lib/register-catalogue in your test file?"):new Error(`Unsupported component type "${type}". No element with this name is registered in the @tscircuit/core catalogue. Check for typos or see https://docs.tscircuit.com/category/built-in-elements for a list of valid components. To add your own component, see docs/CREATING_NEW_COMPONENTS.md`);try{return prepare(new target(props),{})}catch(error2){return createErrorPlaceholderComponent({...props,componentType:type},error2)}},createTextInstance(text){return{__text:text}},appendInitialChild(parentInstance,child){parentInstance.add(child)},appendChild(parentInstance,child){parentInstance.add(child)},appendChildToContainer(container,child){container.add(child)},finalizeInitialChildren(){return!1},prepareUpdate(){return null},shouldSetTextContent(){return!1},getRootHostContext(){return{}},getChildHostContext(){return{}},prepareForCommit(){return null},resetAfterCommit(){},commitMount(){},commitUpdate(){},removeChild(){},clearContainer(){},supportsPersistence:!1,getPublicInstance(instance){return instance},preparePortalMount(containerInfo){throw new Error("Function not implemented.")},scheduleTimeout(fn3,delay){throw new Error("Function not implemented.")},cancelTimeout(id2){throw new Error("Function not implemented.")},noTimeout:void 0,isPrimaryRenderer:!1,getInstanceFromNode(node){throw new Error("Function not implemented.")},beforeActiveInstanceBlur(){throw new Error("Function not implemented.")},afterActiveInstanceBlur(){throw new Error("Function not implemented.")},prepareScopeUpdate:(scopeInstance,instance)=>{throw new Error("Function not implemented.")},getInstanceFromScope:scopeInstance=>{throw new Error("Function not implemented.")},detachDeletedInstance:node=>{throw new Error("Function not implemented.")},getCurrentEventPriority:()=>import_constants.DefaultEventPriority,getCurrentUpdatePriority:()=>import_constants.DefaultEventPriority,resolveUpdatePriority:()=>import_constants.DefaultEventPriority,setCurrentUpdatePriority:()=>{},maySuspendCommit:()=>!1,supportsHydration:!1},reconciler=(0,import_react_reconciler.default)(hostConfig),createInstanceFromReactElement=reactElm=>{let rootContainer={children:[],props:{name:"$root"},add(instance){instance.parent=this,this.children.push(instance)},computePcbGlobalTransform(){return identity()}},containerErrors=[],container=reconciler.createContainer(rootContainer,0,null,!1,null,"tsci",error2=>{console.log("Error in createContainer"),console.error(error2),containerErrors.push(error2)},null);if(reconciler.updateContainerSync(reactElm,container,null,()=>{}),reconciler.flushSyncWork(),containerErrors.length>0)throw containerErrors[0];let rootInstance=reconciler.getPublicRootInstance(container);return rootInstance||rootContainer.children[0]},PIN_LABELS_KEY_RE=/^(?:pin)?(\d+)$/,getPinNumberFromPinLabelsKey=pinKey=>{let match2=pinKey.match(PIN_LABELS_KEY_RE);return match2?Number.parseInt(match2[1],10):null},parsePinNumberFromLabelsOrThrow=(pinNumberOrLabel,pinLabels)=>{if(typeof pinNumberOrLabel=="number")return pinNumberOrLabel;let directPinNumber=getPinNumberFromPinLabelsKey(pinNumberOrLabel);if(directPinNumber!==null)return directPinNumber;if(pinNumberOrLabel.startsWith("pin"))throw new Error(`Invalid pinLabels key "${pinNumberOrLabel}". Expected "pin\${number}" (e.g. pin1, pin2).`);if(!pinLabels)throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`);for(let pinNumberKey in pinLabels)if((Array.isArray(pinLabels[pinNumberKey])?pinLabels[pinNumberKey]:[pinLabels[pinNumberKey]]).includes(pinNumberOrLabel)){let pinNumber=getPinNumberFromPinLabelsKey(pinNumberKey);if(pinNumber===null)throw new Error(`Invalid pinLabels key "${pinNumberKey}". Expected "pin\${number}" (e.g. pin1, pin2).`);return pinNumber}throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`)},underscorifyPinStyles=(pinStyles,pinLabels)=>{if(!pinStyles)return;let underscorePinStyles={},mergedStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels);mergedStyles[pinNumber]={...mergedStyles[pinNumber],...pinStyle}}for(let[pinNumber,pinStyle]of Object.entries(mergedStyles)){let pinKey=`pin${pinNumber}`;underscorePinStyles[pinKey]={bottom_margin:pinStyle.bottomMargin,left_margin:pinStyle.leftMargin,right_margin:pinStyle.rightMargin,top_margin:pinStyle.topMargin}}return underscorePinStyles},underscorifyPortArrangement=portArrangement=>{if(portArrangement){if("leftSide"in portArrangement||"rightSide"in portArrangement||"topSide"in portArrangement||"bottomSide"in portArrangement)return{left_side:portArrangement.leftSide,right_side:portArrangement.rightSide,top_side:portArrangement.topSide,bottom_side:portArrangement.bottomSide};if("leftPinCount"in portArrangement||"rightPinCount"in portArrangement||"topPinCount"in portArrangement||"bottomPinCount"in portArrangement)return{left_size:portArrangement.leftPinCount,right_size:portArrangement.rightPinCount,top_size:portArrangement.topPinCount,bottom_size:portArrangement.bottomPinCount};if("leftSize"in portArrangement||"rightSize"in portArrangement||"topSize"in portArrangement||"bottomSize"in portArrangement)return{left_size:portArrangement.leftSize,right_size:portArrangement.rightSize,top_size:portArrangement.topSize,bottom_size:portArrangement.bottomSize}}},CourtyardCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardCircle",zodProps:courtyardCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_circle3=db2.pcb_courtyard_circle.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_circle_id=pcb_courtyard_circle3.pcb_courtyard_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_courtyard_circle_id)return;let circle2=db2.pcb_courtyard_circle.get(this.pcb_courtyard_circle_id);circle2&&db2.pcb_courtyard_circle.update(this.pcb_courtyard_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},CourtyardOutline=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_outline_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardOutline",zodProps:courtyardOutlineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardOutline. Must be "top" or "bottom".`);let transform6=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_outline3=db2.pcb_courtyard_outline.insert({pcb_component_id,layer,outline:props.outline.map(p4=>{let transformedPosition=applyToPoint2(transform6,{x:p4.x,y:p4.y});return{x:transformedPosition.x,y:transformedPosition.y}}),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_outline_id=pcb_courtyard_outline3.pcb_courtyard_outline_id}_setPositionFromLayout(newCenter){let{db:db2}=this.root,currentOutline=db2.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);if(!currentOutline)return;let currentCenterX=0,currentCenterY=0;for(let point62 of currentOutline.outline)currentCenterX+=point62.x,currentCenterY+=point62.y;currentCenterX/=currentOutline.outline.length,currentCenterY/=currentOutline.outline.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newOutline=currentOutline.outline.map(point62=>({x:point62.x+offsetX,y:point62.y+offsetY}));db2.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:newOutline})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_courtyard_outline_id)return;let outline=db2.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);outline&&db2.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:outline.outline.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.outline||props.outline.length===0)return{width:0,height:0};let bounds=getBoundsFromPoints(props.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:{width:0,height:0}}},CourtyardRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardRect",zodProps:courtyardRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,ccw_rotation=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360;isFlipped&&(ccw_rotation=(180-ccw_rotation+360)%360);let pcb_courtyard_rect3=db2.pcb_courtyard_rect.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},width:props.width,height:props.height,ccw_rotation:ccw_rotation||void 0,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_rect_id=pcb_courtyard_rect3.pcb_courtyard_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_courtyard_rect_id)return;let rect=db2.pcb_courtyard_rect.get(this.pcb_courtyard_rect_id);rect&&db2.pcb_courtyard_rect.update(this.pcb_courtyard_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},Cutout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_cutout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Cutout",zodProps:cutoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),pcb_group_id=this.getGroup()?.pcb_group_id??void 0,globalPosition=this._getGlobalPcbPositionBeforeLayout(),parentRotation=this.getPrimitiveContainer()?._parsedProps.pcbRotation??0,inserted_pcb_cutout;if(props.shape==="rect"){let rotationDeg=typeof parentRotation=="string"?parseInt(parentRotation.replace("deg",""),10):parentRotation,isRotated90=Math.abs(rotationDeg%180)===90,rectData={shape:"rect",center:globalPosition,width:isRotated90?props.height:props.width,height:isRotated90?props.width:props.height,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db2.pcb_cutout.insert(rectData)}else if(props.shape==="circle"){let circleData={shape:"circle",center:globalPosition,radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db2.pcb_cutout.insert(circleData)}else if(props.shape==="polygon"){let transform6=this._computePcbGlobalTransformBeforeLayout(),polygonData={shape:"polygon",points:props.points.map(p4=>applyToPoint2(transform6,p4)),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db2.pcb_cutout.insert(polygonData)}inserted_pcb_cutout&&(this.pcb_cutout_id=inserted_pcb_cutout.pcb_cutout_id)}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="polygon"){if(props.points.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point62 of props.points)minX=Math.min(minX,point62.x),maxX=Math.max(maxX,point62.x),minY=Math.min(minY,point62.y),maxY=Math.max(maxY,point62.y);return{width:maxX-minX,height:maxY-minY}}return{width:0,height:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_cutout_id)return super._getPcbCircuitJsonBounds();let{db:db2}=this.root,cutout=db2.pcb_cutout.get(this.pcb_cutout_id);if(!cutout)return super._getPcbCircuitJsonBounds();if(cutout.shape==="rect")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.width/2,top:cutout.center.y+cutout.height/2,right:cutout.center.x+cutout.width/2,bottom:cutout.center.y-cutout.height/2},width:cutout.width,height:cutout.height};if(cutout.shape==="circle")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.radius,top:cutout.center.y+cutout.radius,right:cutout.center.x+cutout.radius,bottom:cutout.center.y-cutout.radius},width:cutout.radius*2,height:cutout.radius*2};if(cutout.shape==="polygon"){if(cutout.points.length===0)return super._getPcbCircuitJsonBounds();let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point62 of cutout.points)minX=Math.min(minX,point62.x),maxX=Math.max(maxX,point62.x),minY=Math.min(minY,point62.y),maxY=Math.max(maxY,point62.y);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}return super._getPcbCircuitJsonBounds()}_setPositionFromLayout(newCenter){if(!this.pcb_cutout_id)return;let{db:db2}=this.root,cutout=db2.pcb_cutout.get(this.pcb_cutout_id);if(cutout){if(cutout.shape==="rect"||cutout.shape==="circle")db2.pcb_cutout.update(this.pcb_cutout_id,{...cutout,center:newCenter});else if(cutout.shape==="polygon"){let oldCenter=this._getPcbCircuitJsonBounds().center,dx3=newCenter.x-oldCenter.x,dy3=newCenter.y-oldCenter.y,newPoints=cutout.points.map(p4=>({x:p4.x+dx3,y:p4.y+dy3}));db2.pcb_cutout.update(this.pcb_cutout_id,{...cutout,points:newPoints})}}}_moveCircuitJsonElements({deltaX,deltaY}){if(!this.pcb_cutout_id)return;let{db:db2}=this.root,cutout=db2.pcb_cutout.get(this.pcb_cutout_id);cutout&&(cutout.shape==="rect"||cutout.shape==="circle"?db2.pcb_cutout.update(this.pcb_cutout_id,{center:{x:cutout.center.x+deltaX,y:cutout.center.y+deltaY}}):cutout.shape==="polygon"&&db2.pcb_cutout.update(this.pcb_cutout_id,{points:cutout.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))}))}},FabricationNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNotePath",zodProps:fabricationNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,subcircuit=this.getSubcircuit(),{_parsedProps:props}=this,layer=props.layer??"top";if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform6=this._computePcbGlobalTransformBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,fabrication_note_path=db2.pcb_fabrication_note_path.insert({pcb_component_id,layer,color:props.color,route:props.route.map(p4=>{let transformedPosition=applyToPoint2(transform6,{x:p4.x,y:p4.y});return{...p4,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0});this.fabrication_note_path_id=fabrication_note_path.pcb_fabrication_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point62=>typeof point62.x=="string"?parseFloat(point62.x):point62.x),ys3=props.route.map(point62=>typeof point62.y=="string"?parseFloat(point62.y):point62.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.fabrication_note_path_id)return;let path=db2.pcb_fabrication_note_path.get(this.fabrication_note_path_id);path&&db2.pcb_fabrication_note_path.update(this.fabrication_note_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}},FabricationNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteRect",zodProps:fabricationNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteRect. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),hasStroke=props.hasStroke??(props.strokeWidth!==void 0&&props.strokeWidth!==null),fabrication_note_rect=db2.pcb_fabrication_note_rect.insert({pcb_component_id,layer,color:props.color,center:{x:position4.x,y:position4.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??1,is_filled:props.isFilled??!1,has_stroke:hasStroke,is_stroke_dashed:props.isStrokeDashed??!1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,corner_radius:props.cornerRadius??void 0});this.fabrication_note_rect_id=fabrication_note_rect.pcb_fabrication_note_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.fabrication_note_rect_id)return;let rect=db2.pcb_fabrication_note_rect.get(this.fabrication_note_rect_id);rect&&db2.pcb_fabrication_note_rect.update(this.fabrication_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}};function normalizeTextForCircuitJson(text){return text.replace(/\\n/g,`
|
|
701
701
|
`)}function parseSegment(seg){let bracketIdx=seg.indexOf("[");if(bracketIdx===-1)return{tag:seg};let tag=seg.slice(0,bracketIdx),m4=seg.slice(bracketIdx+1,seg.lastIndexOf("]")).match(/^(\w+)(\^=|\$=|=)['"]?(.*?)['"]?$/);return m4?{tag,attrName:m4[1],attrOp:m4[2],attrValue:m4[3]}:{tag}}function componentMatchesSegment(component,seg){if(component.lowercaseComponentName!==seg.tag)return!1;if(!seg.attrName)return!0;let attrVal=component.props?.[seg.attrName];if(attrVal===void 0)return!1;let valStr=String(attrVal);switch(seg.attrOp){case"^=":return valStr.startsWith(seg.attrValue);case"$=":return valStr.endsWith(seg.attrValue);case"=":return valStr===seg.attrValue;default:return!1}}function matchesCompoundSelector(component,segments){if(!componentMatchesSegment(component,segments[segments.length-1]))return!1;let segIdx=segments.length-2,current3=component.parent;for(;segIdx>=0&¤t3;)componentMatchesSegment(current3,segments[segIdx])&&segIdx--,current3=current3.parent;return segIdx<0}function resolvePcbProperty({propertyName,resolvedPcbSx,pathFromAmpersand,component}){if(!resolvedPcbSx)return;let result,bestSpecificity=0;for(let[key,entry]of Object.entries(resolvedPcbSx)){if(!entry||!(propertyName in entry))continue;let selectorBody=key.startsWith("& ")?key.slice(2):key;if(selectorBody===pathFromAmpersand){1>bestSpecificity&&(bestSpecificity=1,result=entry[propertyName]);continue}if(!component)continue;let segments=selectorBody.split(/\s+/).map(parseSegment);if(!(segments.length<2)&&matchesCompoundSelector(component,segments)){let specificity=segments.length;specificity>bestSpecificity&&(bestSpecificity=specificity,result=entry[propertyName])}}return result}var FabricationNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_fabrication_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteText",zodProps:fabricationNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit();if(resolvePcbProperty({propertyName:"visibility",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"fabricationnotetext",component:this})==="hidden")return;let pcb_fabrication_note_text3=db2.pcb_fabrication_note_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position4.x,y:position4.y},font:props.font??"tscircuit2024",font_size:props.fontSize??1,layer:"top",color:props.color,text:normalizeTextForCircuitJson(props.text??""),pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_fabrication_note_text_id=pcb_fabrication_note_text3.pcb_fabrication_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:(props.text??"").length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(this.pcb_fabrication_note_text_id){let text=db2.pcb_fabrication_note_text.get(this.pcb_fabrication_note_text_id);text&&db2.pcb_fabrication_note_text.update(this.pcb_fabrication_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},Hole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_hole_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Hole",zodProps:holeProps}}getPcbSize(){let{_parsedProps:props}=this,isPill=props.shape==="pill",isRect=props.shape==="rect";return isPill?{width:props.width,height:props.height}:isRect?{width:props.width,height:props.height}:{width:props.diameter,height:props.diameter}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin),props.shape==="pill")if(props.pcbRotation&&props.pcbRotation!==0){let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rotated_pill",hole_width:props.width,hole_height:props.height,x:position4.x,y:position4.y,ccw_rotation:props.pcbRotation,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"pill",hole_width:props.width,hole_height:props.height,x:position4.x,y:position4.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else if(props.shape==="rect"){let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rect",hole_width:props.width,hole_height:props.height,x:position4.x,y:position4.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"circle",hole_diameter:props.diameter,x:position4.x,y:position4.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,hole=db2.pcb_hole.get(this.pcb_hole_id),size3=this.getPcbSize();return{center:{x:hole.x,y:hole.y},bounds:{left:hole.x-size3.width/2,top:hole.y-size3.height/2,right:hole.x+size3.width/2,bottom:hole.y+size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_hole.update(this.pcb_hole_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_hole_id)return;let hole=db2.pcb_hole.get(this.pcb_hole_id);hole&&db2.pcb_hole.update(this.pcb_hole_id,{x:hole.x+deltaX,y:hole.y+deltaY})}},Keepout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_keepout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Keepout",zodProps:pcbKeepoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let subcircuit=this.getSubcircuit(),{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),decomposedMat=decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()),isRotated90=Math.abs(decomposedMat.rotation.angle*(180/Math.PI)-90)%180<.01,layers=props.layers;!layers&&props.layer&&(layers=[props.layer]),layers||(layers=["top"]);let pcb_keepout3=null;props.shape==="circle"?pcb_keepout3=db2.pcb_keepout.insert({layers,shape:"circle",radius:props.radius,center:{x:position4.x,y:position4.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0}):props.shape==="rect"&&(pcb_keepout3=db2.pcb_keepout.insert({layers,shape:"rect",...isRotated90?{width:props.height,height:props.width}:{width:props.width,height:props.height},center:{x:position4.x,y:position4.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0})),pcb_keepout3&&(this.pcb_keepout_id=pcb_keepout3.pcb_keepout_id)}getPcbSize(){let{_parsedProps:props}=this;return props.shape==="circle"?{width:props.radius*2,height:props.radius*2}:props.shape==="rect"?{width:props.width,height:props.height}:{width:0,height:0}}},PcbNoteLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteLine",zodProps:pcbNoteLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),group=this.getGroup(),transform6=this._computePcbGlobalTransformBeforeLayout(),start=applyToPoint2(transform6,{x:props.x1,y:props.y1}),end=applyToPoint2(transform6,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_line3=db2.pcb_note_line.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,x1:start.x,y1:start.y,x2:end.x,y2:end.y,layer:props.layer==="bottom"?"bottom":"top",stroke_width:props.strokeWidth??.1,color:props.color,is_dashed:props.isDashed});this.pcb_note_line_id=pcb_note_line3.pcb_note_line_id}getPcbSize(){let{_parsedProps:props}=this;return{width:Math.abs(props.x2-props.x1),height:Math.abs(props.y2-props.y1)}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_line_id)return;let line2=db2.pcb_note_line.get(this.pcb_note_line_id);line2&&db2.pcb_note_line.update(this.pcb_note_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},PcbNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNotePath",zodProps:pcbNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform6=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,transformedRoute=props.route.map(point62=>{let{x:x4,y:y4,...rest}=point62,numericX=typeof x4=="string"?parseFloat(x4):x4,numericY=typeof y4=="string"?parseFloat(y4):y4,transformed=applyToPoint2(transform6,{x:numericX,y:numericY});return{...rest,x:transformed.x,y:transformed.y}}),pcb_note_path3=db2.pcb_note_path.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,route:transformedRoute,layer:props.layer==="bottom"?"bottom":"top",stroke_width:props.strokeWidth??.1,color:props.color});this.pcb_note_path_id=pcb_note_path3.pcb_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point62=>typeof point62.x=="string"?parseFloat(point62.x):point62.x),ys3=props.route.map(point62=>typeof point62.y=="string"?parseFloat(point62.y):point62.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_path_id)return;let path=db2.pcb_note_path.get(this.pcb_note_path_id);path&&db2.pcb_note_path.update(this.pcb_note_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}},PcbNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteRect",zodProps:pcbNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform6=this._computePcbGlobalTransformBeforeLayout(),center2=applyToPoint2(transform6,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_rect3=db2.pcb_note_rect.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,center:center2,width:props.width,height:props.height,layer:props.layer==="bottom"?"bottom":"top",stroke_width:props.strokeWidth??.1,is_filled:props.isFilled??!1,has_stroke:props.hasStroke??!0,is_stroke_dashed:props.isStrokeDashed??!1,color:props.color,corner_radius:props.cornerRadius??void 0});this.pcb_note_rect_id=pcb_note_rect3.pcb_note_rect_id}getPcbSize(){let{_parsedProps:props}=this,width=typeof props.width=="string"?parseFloat(props.width):props.width,height=typeof props.height=="string"?parseFloat(props.height):props.height;return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_rect_id)return;let rect=db2.pcb_note_rect.get(this.pcb_note_rect_id);rect&&db2.pcb_note_rect.update(this.pcb_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},PcbNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteText",zodProps:pcbNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform6=this._computePcbGlobalTransformBeforeLayout(),anchorPosition=applyToPoint2(transform6,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_text3=db2.pcb_note_text.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,font:props.font??"tscircuit2024",font_size:props.fontSize??1,text:normalizeTextForCircuitJson(props.text),anchor_position:anchorPosition,anchor_alignment:props.anchorAlignment??"center",layer:props.layer==="bottom"?"bottom":"top",color:props.color});this.pcb_note_text_id=pcb_note_text3.pcb_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:props.text.length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_text_id)return;let text=db2.pcb_note_text.get(this.pcb_note_text_id);text&&db2.pcb_note_text.update(this.pcb_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},pcbTraceProps2=external_exports.object({route:external_exports.array(pcb_trace_route_point),source_trace_id:external_exports.string().optional()}),PcbTrace=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_trace_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbTrace",zodProps:pcbTraceProps2}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),parentTransform=this._computePcbGlobalTransformBeforeLayout(),transformedRoute=props.route.map(point62=>{if(point62.route_type==="wire"){let{x:x4,y:y4,...restOfPoint}=point62,transformedPoint=applyToPoint2(parentTransform,{x:x4,y:y4});return{...restOfPoint,...transformedPoint,layer:maybeFlipLayer(point62.layer)}}if(point62.route_type==="via"){let{x:x4,y:y4,...restOfPoint}=point62,transformedPoint=applyToPoint2(parentTransform,{x:x4,y:y4});return{...restOfPoint,...transformedPoint,from_layer:maybeFlipLayer(point62.from_layer),to_layer:maybeFlipLayer(point62.to_layer)}}return{...point62,start:applyToPoint2(parentTransform,point62.start),end:applyToPoint2(parentTransform,point62.end),start_layer:maybeFlipLayer(point62.start_layer),end_layer:maybeFlipLayer(point62.end_layer)}}),pcb_trace3=db2.pcb_trace.insert({pcb_component_id:container.pcb_component_id,source_trace_id:props.source_trace_id,route:transformedRoute,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_trace_id=pcb_trace3.pcb_trace_id}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point62 of props.route)point62.route_type==="through_pad"?(minX=Math.min(minX,point62.start.x,point62.end.x),maxX=Math.max(maxX,point62.start.x,point62.end.x),minY=Math.min(minY,point62.start.y,point62.end.y),maxY=Math.max(maxY,point62.start.y,point62.end.y)):(minX=Math.min(minX,point62.x),maxX=Math.max(maxX,point62.x),minY=Math.min(minY,point62.y),maxY=Math.max(maxY,point62.y)),point62.route_type==="wire"?(minX=Math.min(minX,point62.x-point62.width/2),maxX=Math.max(maxX,point62.x+point62.width/2),minY=Math.min(minY,point62.y-point62.width/2),maxY=Math.max(maxY,point62.y+point62.width/2)):point62.route_type==="through_pad"&&(minX=Math.min(minX,point62.start.x-point62.width/2,point62.end.x-point62.width/2),maxX=Math.max(maxX,point62.start.x+point62.width/2,point62.end.x+point62.width/2),minY=Math.min(minY,point62.start.y-point62.width/2,point62.end.y-point62.width/2),maxY=Math.max(maxY,point62.start.y+point62.width/2,point62.end.y+point62.width/2));return minX===1/0||maxX===-1/0||minY===1/0||maxY===-1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}},pcbViaProps=viaProps.extend({layers:external_exports.array(layer_ref).optional(),isTented:external_exports.boolean().optional()}).partial({fromLayer:!0,toLayer:!0}),PcbVia=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_via_id",null);__publicField(this,"_importedPcbTraceId");__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbVia",zodProps:pcbViaProps}}_getLayers(){let{layers,fromLayer="top",toLayer="bottom"}=this._parsedProps;return layers&&layers.length>0?layers:fromLayer===toLayer?[fromLayer]:[fromLayer,toLayer]}getAvailablePcbLayers(){return this._getLayers()}getPcbSize(){let outerDiameter=this._parsedProps.outerDiameter??.6;return{width:outerDiameter,height:outerDiameter}}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,via=db2.pcb_via.get(this.pcb_via_id),size3=this.getPcbSize();return{center:{x:via.x,y:via.y},bounds:{left:via.x-size3.width/2,top:via.y-size3.height/2,right:via.x+size3.width/2,bottom:via.y+size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_via.update(this.pcb_via_id,{x:newCenter.x,y:newCenter.y})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{holeDiameter,outerDiameter,netIsAssignable,isTented}=this._parsedProps,subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layers=this._getLayers().map(layer=>maybeFlipLayer(layer)),fromLayer=this._parsedProps.fromLayer?maybeFlipLayer(this._parsedProps.fromLayer):layers[0],toLayer=this._parsedProps.toLayer?maybeFlipLayer(this._parsedProps.toLayer):layers[layers.length-1]??fromLayer,pcbVia=db2.pcb_via.insert({x:position4.x,y:position4.y,...holeDiameter!==void 0?{hole_diameter:holeDiameter}:{},...outerDiameter!==void 0?{outer_diameter:outerDiameter}:{},layers,from_layer:fromLayer,to_layer:toLayer,pcb_trace_id:this._importedPcbTraceId,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:netIsAssignable,is_tented:isTented});this.pcb_via_id=pcbVia.pcb_via_id}};function getPcbPrimitiveBoundsBeforeRender(primitive){try{let center2=primitive._getGlobalPcbPositionBeforeLayout(),size3=primitive.getPcbSize();return{left:center2.x-size3.width/2,right:center2.x+size3.width/2,top:center2.y+size3.height/2,bottom:center2.y-size3.height/2}}catch{return null}}function doPcbPrimitivesOverlapBeforeRender(a3,b3){let aBounds=getPcbPrimitiveBoundsBeforeRender(a3),bBounds=getPcbPrimitiveBoundsBeforeRender(b3);return!aBounds||!bBounds?!1:!(aBounds.right<bBounds.left||aBounds.left>bBounds.right||aBounds.bottom>bBounds.top||aBounds.top<bBounds.bottom)}function getConnectedPcbPrimitiveClustersBeforeRender(primitives){let clusters=[],visited=new Set;for(let primitive of primitives){if(visited.has(primitive))continue;let cluster=[],stack=[primitive];for(visited.add(primitive);stack.length>0;){let current3=stack.pop();cluster.push(current3);for(let candidate of primitives)visited.has(candidate)||doPcbPrimitivesOverlapBeforeRender(current3,candidate)&&(visited.add(candidate),stack.push(candidate))}clusters.push(cluster)}return clusters}var getPinNumberFromHints=hints=>{for(let hint of hints){let normalizedHint=hint.toString();if(/^(pin)?\d+$/.test(normalizedHint))return Number.parseInt(normalizedHint.replace(/^pin/,""))}return null};function selectPortForPcbPrimitive(ports,primitive,hints){let pinNumber=getPinNumberFromHints(hints),matchingPorts=ports.filter(port=>port.isMatchingAnyOf(hints));if(matchingPorts.length===0)return null;let pinMatchedPorts=pinNumber===null?matchingPorts:matchingPorts.filter(port=>port._parsedProps.pinNumber===pinNumber||port._primaryPinNumber===pinNumber),candidates=pinMatchedPorts.length>0?pinMatchedPorts:matchingPorts,overlappingPort=candidates.find(port=>port.matchedComponents.some(component=>component.isPcbPrimitive&&doPcbPrimitivesOverlapBeforeRender(component,primitive)));return overlappingPort||(candidates.find(port=>!port.matchedComponents.some(component=>component.isPcbPrimitive))??candidates[0])}var PlatedHole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_plated_hole_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PlatedHole",zodProps:platedHoleProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.outerDiameter,height:props.outerDiameter};if(props.shape==="oval"||props.shape==="pill")return{width:props.outerWidth,height:props.outerHeight};if(props.shape==="circular_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="pill_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="hole_with_polygon_pad"){if(!props.padOutline||props.padOutline.length===0)throw new Error("padOutline is required for hole_with_polygon_pad shape");let xs3=props.padOutline.map(p4=>typeof p4.x=="number"?p4.x:parseFloat(String(p4.x))),ys3=props.padOutline.map(p4=>typeof p4.y=="number"?p4.y:parseFloat(String(p4.y))),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,platedHole=db2.pcb_plated_hole.get(this.pcb_plated_hole_id),size3=this.getPcbSize();return{center:{x:platedHole.x,y:platedHole.y},bounds:{left:platedHole.x-size3.width/2,top:platedHole.y+size3.height/2,right:platedHole.x+size3.width/2,bottom:platedHole.y-size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_plated_hole.update(this.pcb_plated_hole_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(!this._parsedProps.portHints)return;let port=selectPortForPcbPrimitive(parentPorts,this,this._parsedProps.portHints);port&&(this.matchedPort=port,port.registerMatch(this))}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let finalRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360;if(props.shape==="circle"){let pcb_plated_hole3=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_diameter:props.outerDiameter,hole_diameter:props.holeDiameter,shape:"circle",port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id,db2.pcb_solder_paste.insert({layer:"top",shape:"circle",radius:props.outerDiameter/2,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db2.pcb_solder_paste.insert({layer:"bottom",shape:"circle",radius:props.outerDiameter/2,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="pill"&&props.rectPad){let pcb_plated_hole3=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",port_hints:this.getNameAndAliases(),pcb_plated_hole_id:this.pcb_plated_hole_id,x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:finalRotationDegrees,rect_ccw_rotation:finalRotationDegrees,rect_pad_width:props.outerWidth,rect_pad_height:props.outerHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else if(props.shape==="pill"||props.shape==="oval"){let pcb_plated_hole3=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:props.shape,port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,ccw_rotation:finalRotationDegrees});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id,db2.pcb_solder_paste.insert({layer:"top",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db2.pcb_solder_paste.insert({layer:"bottom",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="circular_hole_with_rect_pad"){let pcb_plated_hole3=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_diameter:props.holeDiameter,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,shape:"circular_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,rect_border_radius:props.rectBorderRadius??0,rect_ccw_rotation:finalRotationDegrees});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else if(props.shape==="pill_hole_with_rect_pad")if(finalRotationDegrees!==0){let pcb_plated_hole3=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:props.holeWidth,hole_height:props.holeHeight,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:finalRotationDegrees,rect_ccw_rotation:finalRotationDegrees,rect_border_radius:props.rectBorderRadius,port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else{let pcb_plated_hole3=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:props.holeWidth,hole_height:props.holeHeight,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,shape:"pill_hole_with_rect_pad",rect_border_radius:props.rectBorderRadius,port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else if(props.shape==="hole_with_polygon_pad"){let padOutline=(props.padOutline||[]).map(point62=>{let x4=typeof point62.x=="number"?point62.x:parseFloat(String(point62.x)),y4=typeof point62.y=="number"?point62.y:parseFloat(String(point62.y));return{x:x4,y:y4}}),pcb_plated_hole3=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,shape:"hole_with_polygon_pad",hole_shape:props.holeShape||"circle",hole_diameter:props.holeDiameter,hole_width:props.holeWidth,hole_height:props.holeHeight,pad_outline:padOutline,hole_offset_x:typeof props.holeOffsetX=="number"?props.holeOffsetX:parseFloat(String(props.holeOffsetX||0)),hole_offset_y:typeof props.holeOffsetY=="number"?props.holeOffsetY:parseFloat(String(props.holeOffsetY||0)),port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;db2.pcb_plated_hole.update(this.pcb_plated_hole_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_plated_hole_id)return;let hole=db2.pcb_plated_hole.get(this.pcb_plated_hole_id);if(hole){let newCenter={x:hole.x+deltaX,y:hole.y+deltaY};this._setPositionFromLayout(newCenter)}}},SilkscreenCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenCircle",zodProps:silkscreenCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_circle3=db2.pcb_silkscreen_circle.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1});this.pcb_silkscreen_circle_id=pcb_silkscreen_circle3.pcb_silkscreen_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_circle_id)return;let circle2=db2.pcb_silkscreen_circle.get(this.pcb_silkscreen_circle_id);circle2&&db2.pcb_silkscreen_circle.update(this.pcb_silkscreen_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},SilkscreenLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenLine",zodProps:silkscreenLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenLine. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),transform6=this._computePcbGlobalTransformBeforeLayout(),p12=applyToPoint2(transform6,{x:props.x1,y:props.y1}),p22=applyToPoint2(transform6,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_line3=db2.pcb_silkscreen_line.insert({pcb_component_id,layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y,stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_line_id=pcb_silkscreen_line3.pcb_silkscreen_line_id}getPcbSize(){let{_parsedProps:props}=this,width=Math.abs(props.x2-props.x1),height=Math.abs(props.y2-props.y1);return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_line_id)return;let line2=db2.pcb_silkscreen_line.get(this.pcb_silkscreen_line_id);line2&&db2.pcb_silkscreen_line.update(this.pcb_silkscreen_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},SilkscreenPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenPath",zodProps:silkscreenPathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform6=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_path3=db2.pcb_silkscreen_path.insert({pcb_component_id,layer,route:props.route.map(p4=>{let transformedPosition=applyToPoint2(transform6,{x:p4.x,y:p4.y});return{...p4,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_id=pcb_silkscreen_path3.pcb_silkscreen_path_id}_setPositionFromLayout(newCenter){let{db:db2}=this.root,{_parsedProps:props}=this,currentPath=db2.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);if(!currentPath)return;let currentCenterX=0,currentCenterY=0;for(let point62 of currentPath.route)currentCenterX+=point62.x,currentCenterY+=point62.y;currentCenterX/=currentPath.route.length,currentCenterY/=currentPath.route.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newRoute=currentPath.route.map(point62=>({...point62,x:point62.x+offsetX,y:point62.y+offsetY}));db2.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:newRoute})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_path_id)return;let path=db2.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);path&&db2.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point62 of props.route)minX=Math.min(minX,point62.x),maxX=Math.max(maxX,point62.x),minY=Math.min(minY,point62.y),maxY=Math.max(maxY,point62.y);return{width:maxX-minX,height:maxY-minY}}},SilkscreenRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenRect",zodProps:silkscreenRectProps}}_isRotated90Degrees(){let globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(globalTransform).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01;return Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),isRotated90Degrees=this._isRotated90Degrees(),finalWidth=isRotated90Degrees?props.height:props.width,finalHeight=isRotated90Degrees?props.width:props.height,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_rect3=db2.pcb_silkscreen_rect.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},width:finalWidth,height:finalHeight,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this?.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1,is_filled:props.filled??!1,corner_radius:props.cornerRadius??void 0});this.pcb_silkscreen_rect_id=pcb_silkscreen_rect3.pcb_silkscreen_rect_id}getPcbSize(){let{_parsedProps:props}=this;return this._isRotated90Degrees()?{width:props.height,height:props.width}:{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_rect_id)return;let rect=db2.pcb_silkscreen_rect.get(this.pcb_silkscreen_rect_id);rect&&db2.pcb_silkscreen_rect.update(this.pcb_silkscreen_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},SilkscreenText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_text_ids",[]);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"_footprinterFontSize")}get config(){return{componentName:"SilkscreenText",zodProps:silkscreenTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),subcircuit=this.getSubcircuit(),rotation42=0;if(props.pcbRotation!==void 0&&props.pcbRotation!==0)rotation42=props.pcbRotation;else{let globalTransform=this._computePcbGlobalTransformBeforeLayout();rotation42=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI}isFlipped&&(rotation42=(rotation42+180)%360);let uniqueLayers=new Set(props.layers);props.layer&&uniqueLayers.add(props.layer);let targetLayers=uniqueLayers.size>0?Array.from(uniqueLayers):["top"],resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbX=resolvePcbProperty({propertyName:"pcbX",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbY=resolvePcbProperty({propertyName:"pcbY",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,position4=(resolvedPcbSxPcbX!==void 0||resolvedPcbSxPcbY!==void 0)&&this._footprinterFontSize!==void 0?applyToPoint2(compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),isFlipped?flipY():identity()),{x:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbX??props.pcbX??0,axis:"pcbX"}),y:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbY??props.pcbY??0,axis:"pcbY"})}):this._getGlobalPcbPositionBeforeLayout(),uniformPadding=props.knockoutPadding??0,knockoutPadding=props.knockoutPadding!==void 0||props.knockoutPaddingLeft!==void 0||props.knockoutPaddingRight!==void 0||props.knockoutPaddingTop!==void 0||props.knockoutPaddingBottom!==void 0?{left:props.knockoutPaddingLeft??uniformPadding,right:props.knockoutPaddingRight??uniformPadding,top:props.knockoutPaddingTop??uniformPadding,bottom:props.knockoutPaddingBottom??uniformPadding}:void 0,text=this._resolveText();for(let layer of targetLayers){let pcb_silkscreen_text3=db2.pcb_silkscreen_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position4.x,y:position4.y},font:props.font??"tscircuit2024",font_size:fontSize,layer:maybeFlipLayer(layer),text:normalizeTextForCircuitJson(text),ccw_rotation:rotation42,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,is_knockout:props.isKnockout,knockout_padding:knockoutPadding});this.pcb_silkscreen_text_ids.push(pcb_silkscreen_text3.pcb_silkscreen_text_id)}}getPcbSize(){let{_parsedProps:props}=this,resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,textWidth=this._resolveText().length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;for(let id2 of this.pcb_silkscreen_text_ids){let text=db2.pcb_silkscreen_text.get(id2);text&&db2.pcb_silkscreen_text.update(id2,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}};function getAxisAlignedSizeFromRotatedRect({width,height,ccwRotationDegrees}){let angleRad=ccwRotationDegrees*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),w22=width/2,h22=height/2,xExtent=Math.abs(w22*cosAngle)+Math.abs(h22*sinAngle),yExtent=Math.abs(w22*sinAngle)+Math.abs(h22*cosAngle);return{width:xExtent*2,height:yExtent*2,xExtent,yExtent}}var SmtPad=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SmtPad",zodProps:smtPadProps}}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="rotated_rect"){let{width,height}=getAxisAlignedSizeFromRotatedRect({width:props.width,height:props.height,ccwRotationDegrees:props.ccwRotation??0});return{width,height}}if(props.shape==="polygon"){let points=props.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}if(props.shape==="pill")return{width:props.width,height:props.height};throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(!this.props.portHints)return;let port=selectPortForPcbPrimitive(parentPorts,this,this.props.portHints);port&&(this.matchedPort=port,port.registerMatch(this))}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,shouldCreateSolderPaste=!isCoveredWithSolderMask,soldermaskMargin=props.solderMaskMargin;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01,isAxisAligned=Math.abs(normalizedRotationDegrees)<rotationTolerance||Math.abs(normalizedRotationDegrees-180)<rotationTolerance||Math.abs(normalizedRotationDegrees-360)<rotationTolerance,isRotated90Degrees=Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance,finalRotationDegrees=Math.abs(normalizedRotationDegrees-360)<rotationTolerance?0:normalizedRotationDegrees,transformRotationBeforeFlip=finalRotationDegrees,{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers();isFlipped&&(finalRotationDegrees=(360-finalRotationDegrees+360)%360);let portHints2=props.portHints?.map(ph3=>ph3.toString())??[],pcb_smtpad3=null,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(props.shape==="circle")pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"circle",radius:props.radius,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0}),shouldCreateSolderPaste&&db2.pcb_solder_paste.insert({layer:pcb_smtpad3.layer,shape:"circle",radius:pcb_smtpad3.radius*.7,x:pcb_smtpad3.x,y:pcb_smtpad3.y,pcb_component_id:pcb_smtpad3.pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});else if(props.shape==="rect")!isAxisAligned&&!isRotated90Degrees?pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position4.x,y:position4.y,ccw_rotation:finalRotationDegrees,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:isRotated90Degrees?props.height:props.width,height:isRotated90Degrees?props.width:props.height,corner_radius:props.cornerRadius??void 0,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&(pcb_smtpad3.shape==="rect"?db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:pcb_smtpad3.width*.7,height:pcb_smtpad3.height*.7,x:pcb_smtpad3.x,y:pcb_smtpad3.y,pcb_component_id:pcb_smtpad3.pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad3.shape==="rotated_rect"&&db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad3.width*.7,height:pcb_smtpad3.height*.7,x:pcb_smtpad3.x,y:pcb_smtpad3.y,ccw_rotation:pcb_smtpad3.ccw_rotation,pcb_component_id:pcb_smtpad3.pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));else if(props.shape==="rotated_rect"){let baseRotation=props.ccwRotation??0,combinedRotationBeforeFlip=(transformRotationBeforeFlip+baseRotation+360)%360,padRotation=isFlipped?(360-combinedRotationBeforeFlip+360)%360:combinedRotationBeforeFlip;pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position4.x,y:position4.y,ccw_rotation:padRotation,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad3.width*.7,height:pcb_smtpad3.height*.7,x:position4.x,y:position4.y,ccw_rotation:padRotation,pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="polygon"){let transformedPoints=props.points.map(point62=>{let transformed=applyToPoint2(globalTransform,{x:distance.parse(point62.x),y:distance.parse(point62.y)});return{x:transformed.x,y:transformed.y}});pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"polygon",points:transformedPoints,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else props.shape==="pill"&&(finalRotationDegrees!==0?pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_pill",x:position4.x,y:position4.y,radius:props.radius,height:props.height,width:props.width,ccw_rotation:finalRotationDegrees,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"pill",x:position4.x,y:position4.y,radius:props.radius,height:props.height,width:props.width,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));pcb_smtpad3&&(this.pcb_smtpad_id=pcb_smtpad3.pcb_smtpad_id)}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,smtpad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);if(smtpad2.shape==="rect")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.width/2,top:smtpad2.y+smtpad2.height/2,right:smtpad2.x+smtpad2.width/2,bottom:smtpad2.y-smtpad2.height/2},width:smtpad2.width,height:smtpad2.height};if(smtpad2.shape==="rotated_rect"){let{width,height,xExtent,yExtent}=getAxisAlignedSizeFromRotatedRect({width:smtpad2.width,height:smtpad2.height,ccwRotationDegrees:smtpad2.ccw_rotation});return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-xExtent,right:smtpad2.x+xExtent,top:smtpad2.y-yExtent,bottom:smtpad2.y+yExtent},width,height}}if(smtpad2.shape==="circle")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.radius,top:smtpad2.y-smtpad2.radius,right:smtpad2.x+smtpad2.radius,bottom:smtpad2.y+smtpad2.radius},width:smtpad2.radius*2,height:smtpad2.radius*2};if(smtpad2.shape==="polygon"){let points=smtpad2.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}if(smtpad2.shape==="pill"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-halfWidth,top:smtpad2.y-halfHeight,right:smtpad2.x+halfWidth,bottom:smtpad2.y+halfHeight},width:smtpad2.width,height:smtpad2.height}}if(smtpad2.shape==="rotated_pill"){let{width,height,xExtent,yExtent}=getAxisAlignedSizeFromRotatedRect({width:smtpad2.width,height:smtpad2.height,ccwRotationDegrees:smtpad2.ccw_rotation});return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-xExtent,right:smtpad2.x+xExtent,top:smtpad2.y-yExtent,bottom:smtpad2.y+yExtent},width,height}}throw new Error(`circuitJson bounds calculation not implemented for shape "${smtpad2.shape}"`)}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y});let solderPaste=db2.pcb_solder_paste.list().find(elm=>elm.pcb_smtpad_id===this.pcb_smtpad_id);solderPaste&&db2.pcb_solder_paste.update(solderPaste.pcb_solder_paste_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);if(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill"||pad2.shape==="rotated_pill")this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY});else if(pad2.shape==="polygon"){db2.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))});let newCenter={x:this._getPcbCircuitJsonBounds().center.x+deltaX/2,y:this._getPcbCircuitJsonBounds().center.y+deltaY/2};this.matchedPort?._setPositionFromLayout(newCenter)}}},createPinrowSilkscreenText=({elm,pinLabels,layer,readableRotation,anchorAlignment})=>{let pinNum=elm.text.replace(/[{}]/g,"").toLowerCase(),label=pinNum;if(Array.isArray(pinLabels)){let index=parseInt(pinNum.replace(/[^\d]/g,""),10)-1;label=String(pinLabels[index]??pinNum)}else typeof pinLabels=="object"&&(label=String(pinLabels[pinNum]??pinNum));let silkscreenText=new SilkscreenText({anchorAlignment:anchorAlignment||"center",text:label??pinNum,layer:layer||"top",pcbX:isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:readableRotation??0});return silkscreenText._footprinterFontSize=elm.font_size+.2,silkscreenText},calculateCcwRotation=(componentRotationStr,elementCcwRotation)=>{let componentAngle=parseInt(componentRotationStr||"0",10),totalRotation;return elementCcwRotation!=null?totalRotation=elementCcwRotation-componentAngle:totalRotation=componentAngle,(totalRotation%360+360)%360},createComponentsFromCircuitJson=({componentName,componentRotation,footprinterString,pinLabels,pcbPinLabels},circuitJson)=>{let components=[];for(let elm of circuitJson)if(elm.type==="pcb_smtpad"&&elm.shape==="rect")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"rect",height:elm.height,width:elm.width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius}));else if(elm.type==="pcb_smtpad"&&elm.shape==="circle")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"circle",radius:elm.radius,portHints:elm.port_hints}));else if(elm.type==="pcb_smtpad"&&elm.shape==="pill")components.push(new SmtPad({shape:"pill",height:elm.height,width:elm.width,radius:elm.radius,portHints:elm.port_hints,pcbX:elm.x,pcbY:elm.y,layer:elm.layer}));else if(elm.type==="pcb_smtpad"&&elm.shape==="polygon")components.push(new SmtPad({shape:"polygon",points:elm.points,portHints:elm.port_hints,layer:elm.layer}));else if(elm.type==="pcb_silkscreen_path")components.push(new SilkscreenPath({layer:elm.layer,route:elm.route,strokeWidth:elm.stroke_width}));else if(elm.type==="pcb_plated_hole")elm.shape==="circle"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circle",holeDiameter:elm.hole_diameter,outerDiameter:elm.outer_diameter,portHints:elm.port_hints})):elm.shape==="circular_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circular_hole_with_rect_pad",holeDiameter:elm.hole_diameter,rectPadHeight:elm.rect_pad_height,rectPadWidth:elm.rect_pad_width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="pill"||elm.shape==="oval"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:elm.shape,holeWidth:elm.hole_width,holeHeight:elm.hole_height,outerWidth:elm.outer_width,outerHeight:elm.outer_height,portHints:elm.port_hints})):elm.shape==="pill_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:elm.hole_width,holeHeight:elm.hole_height,rectPadWidth:elm.rect_pad_width,rectPadHeight:elm.rect_pad_height,rectBorderRadius:elm.rect_border_radius,portHints:elm.port_hints,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="rotated_pill_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:elm.hole_width,holeHeight:elm.hole_height,rectPadWidth:elm.rect_pad_width,rectPadHeight:elm.rect_pad_height,rectBorderRadius:elm.rect_border_radius,portHints:elm.port_hints,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y,pcbRotation:elm.hole_ccw_rotation})):elm.shape==="hole_with_polygon_pad"&&components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"hole_with_polygon_pad",holeShape:elm.hole_shape||"circle",holeDiameter:elm.hole_diameter,holeWidth:elm.hole_width,holeHeight:elm.hole_height,padOutline:elm.pad_outline||[],holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y,portHints:elm.port_hints}));else if(elm.type==="pcb_keepout"&&elm.shape==="circle")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius}));else if(elm.type==="pcb_keepout"&&elm.shape==="rect")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="circle")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,diameter:elm.hole_diameter}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rect")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"rect",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rotated_pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height,pcbRotation:elm.ccw_rotation}));else if(elm.type==="pcb_cutout")elm.shape==="rect"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height})):elm.shape==="circle"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius})):elm.shape==="polygon"&&components.push(new Cutout({shape:"polygon",points:elm.points}));else if(elm.type==="pcb_silkscreen_text"){let ccwRotation=calculateCcwRotation(componentRotation,elm.ccw_rotation);if(footprinterString?.includes("pinrow")&&elm.text.includes("PIN"))components.push(createPinrowSilkscreenText({elm,pinLabels:pcbPinLabels??pinLabels??{},layer:elm.layer,readableRotation:ccwRotation,anchorAlignment:elm.anchor_alignment}));else{let silkscreenText=new SilkscreenText({anchorAlignment:elm.anchor_alignment||"center",text:componentName||elm.text,pcbX:Number.isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:ccwRotation??0});silkscreenText._footprinterFontSize=elm.font_size+.2,components.push(silkscreenText)}}else if(elm.type==="pcb_trace")components.push(new PcbTrace({route:elm.route}));else if(elm.type==="pcb_via"){let layers=elm.layers??[],pcbVia=new PcbVia({pcbX:elm.x,pcbY:elm.y,holeDiameter:elm.hole_diameter,outerDiameter:elm.outer_diameter,fromLayer:elm.from_layer??layers[0],toLayer:elm.to_layer??layers[layers.length-1],layers,netIsAssignable:elm.net_is_assignable,isTented:elm.is_tented});pcbVia._importedPcbTraceId=elm.pcb_trace_id,components.push(pcbVia)}else elm.type==="pcb_silkscreen_rect"?components.push(new SilkscreenRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer,strokeWidth:elm.stroke_width,filled:elm.is_filled,cornerRadius:elm.corner_radius})):elm.type==="pcb_silkscreen_circle"?components.push(new SilkscreenCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_silkscreen_line"?components.push(new SilkscreenLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_fabrication_note_text"?components.push(new FabricationNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text,fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_fabrication_note_path"?components.push(new FabricationNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color,layer:elm.layer})):elm.type==="pcb_fabrication_note_rect"?components.push(new FabricationNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,layer:elm.layer,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_text"?components.push(new PcbNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text??"",fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_note_rect"?components.push(new PcbNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_path"?components.push(new PcbNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color})):elm.type==="pcb_note_line"?components.push(new PcbNoteLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,strokeWidth:elm.stroke_width,color:elm.color,isDashed:elm.is_dashed})):elm.type==="pcb_courtyard_rect"?components.push(new CourtyardRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer})):elm.type==="pcb_courtyard_circle"?components.push(new CourtyardCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer})):elm.type==="pcb_courtyard_outline"&&components.push(new CourtyardOutline({outline:elm.outline,layer:elm.layer}));return components};function filterPinLabels(pinLabels){if(!pinLabels)return{validPinLabels:pinLabels,invalidPinLabelsMessages:[]};let validPinLabels={},invalidPinLabelsMessages=[];for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels.slice():[labelOrLabels],validLabels=[];for(let label of labels)isValidPinLabel(pin,label)?validLabels.push(label):invalidPinLabelsMessages.push(`Invalid pin label: ${pin} = '${label}' - excluding from component. Pin labels can only contain letters, numbers and underscores.`);validLabels.length>0&&(validPinLabels[pin]=Array.isArray(labelOrLabels)?validLabels:validLabels[0])}return{validPinLabels:Object.keys(validPinLabels).length>0?validPinLabels:void 0,invalidPinLabelsMessages}}function isValidPinLabel(pin,label){try{let testProps={name:"test",footprint:"test",pinLabels:{[pin]:label}};return chipProps.safeParse(testProps).success}catch{return!1}}var NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES=["Silkscreen","PcbNote","Courtyard","FabricationNote"];function getBoundsOfPcbComponents(components){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,hasValidComponents=!1;for(let child of components)if(child.isPcbPrimitive&&!NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES.some(prefix=>child.componentName.startsWith(prefix))){let{x:x4,y:y4}=child._getGlobalPcbPositionBeforeLayout(),{width:width2,height:height2}=child.getPcbSize();minX=Math.min(minX,x4-width2/2),minY=Math.min(minY,y4-height2/2),maxX=Math.max(maxX,x4+width2/2),maxY=Math.max(maxY,y4+height2/2),hasValidComponents=!0}else if(child.children.length>0){let childBounds=getBoundsOfPcbComponents(child.children);(childBounds.width>0||childBounds.height>0)&&(minX=Math.min(minX,childBounds.minX),minY=Math.min(minY,childBounds.minY),maxX=Math.max(maxX,childBounds.maxX),maxY=Math.max(maxY,childBounds.maxY),hasValidComponents=!0)}if(!hasValidComponents)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};let width=maxX-minX,height=maxY-minY;return width<0&&(width=0),height<0&&(height=0),{minX,minY,maxX,maxY,width,height}}function getRelativeDirection(pointA,pointB){let dx3=pointB.x-pointA.x,dy3=pointB.y-pointA.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}var stringProxy=new Proxy({},{get:(target,prop)=>prop}),FTYPE=stringProxy,SCHEMATIC_COMPONENT_OUTLINE_COLOR="rgba(132, 0, 0)",SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH=.12,getCenterOfPcbPrimitives=pcbPrimitives=>{if(pcbPrimitives.length===0)throw new Error("Cannot get center of empty PCB primitives array");let positions=pcbPrimitives.map(p4=>p4._getPcbCircuitJsonBounds().center).filter(Boolean),sumX=positions.reduce((sum,pos)=>sum+pos.x,0),sumY=positions.reduce((sum,pos)=>sum+pos.y,0);return{x:sumX/positions.length,y:sumY/positions.length}},applyPinAttributesToSourcePort=(sourcePortProps,attributes2)=>{attributes2.mustBeConnected!==void 0&&(sourcePortProps.must_be_connected=attributes2.mustBeConnected),attributes2.providesPower!==void 0&&(sourcePortProps.provides_power=attributes2.providesPower),attributes2.requiresPower!==void 0&&(sourcePortProps.requires_power=attributes2.requiresPower),attributes2.providesGround!==void 0&&(sourcePortProps.provides_ground=attributes2.providesGround),attributes2.requiresGround!==void 0&&(sourcePortProps.requires_ground=attributes2.requiresGround),attributes2.providesVoltage!==void 0&&(sourcePortProps.provides_voltage=attributes2.providesVoltage),attributes2.requiresVoltage!==void 0&&(sourcePortProps.requires_voltage=attributes2.requiresVoltage),attributes2.doNotConnect!==void 0&&(sourcePortProps.do_not_connect=attributes2.doNotConnect),attributes2.includeInBoardPinout!==void 0&&(sourcePortProps.include_in_board_pinout=attributes2.includeInBoardPinout),attributes2.canUseInternalPullup!==void 0&&(sourcePortProps.can_use_internal_pullup=attributes2.canUseInternalPullup),attributes2.isUsingInternalPullup!==void 0&&(sourcePortProps.is_using_internal_pullup=attributes2.isUsingInternalPullup),attributes2.needsExternalPullup!==void 0&&(sourcePortProps.needs_external_pullup=attributes2.needsExternalPullup),attributes2.canUseInternalPulldown!==void 0&&(sourcePortProps.can_use_internal_pulldown=attributes2.canUseInternalPulldown),attributes2.isUsingInternalPulldown!==void 0&&(sourcePortProps.is_using_internal_pulldown=attributes2.isUsingInternalPulldown),attributes2.needsExternalPulldown!==void 0&&(sourcePortProps.needs_external_pulldown=attributes2.needsExternalPulldown),attributes2.canUseOpenDrain!==void 0&&(sourcePortProps.can_use_open_drain=attributes2.canUseOpenDrain),attributes2.isUsingOpenDrain!==void 0&&(sourcePortProps.is_using_open_drain=attributes2.isUsingOpenDrain),attributes2.canUsePushPull!==void 0&&(sourcePortProps.can_use_push_pull=attributes2.canUsePushPull),attributes2.isUsingPushPull!==void 0&&(sourcePortProps.is_using_push_pull=attributes2.isUsingPushPull),attributes2.shouldHaveDecouplingCapacitor!==void 0&&(sourcePortProps.should_have_decoupling_capacitor=attributes2.shouldHaveDecouplingCapacitor),attributes2.recommendedDecouplingCapacitorCapacitance!==void 0&&(sourcePortProps.recommended_decoupling_capacitor_capacitance=attributes2.recommendedDecouplingCapacitorCapacitance)},Port=class extends PrimitiveComponent2{constructor(props,opts={}){if(!props.name&&props.pinNumber!==void 0&&(props.name=`pin${props.pinNumber}`),!props.name)throw new Error("Port must have a name or a pinNumber");super(props);__publicField(this,"source_port_id",null);__publicField(this,"pcb_port_id",null);__publicField(this,"schematic_port_id",null);__publicField(this,"schematic_stem_line_id",null);__publicField(this,"schematicSymbolPortDef",null);__publicField(this,"matchedComponents");__publicField(this,"_isPrimaryPort",!0);__publicField(this,"_primaryPinNumber",null);__publicField(this,"facingDirection",null);__publicField(this,"originDescription",null);opts.originDescription&&(this.originDescription=opts.originDescription),this.matchedComponents=[]}get config(){return{componentName:"Port",zodProps:portProps}}isGroupPort(){return this.parent?.componentName==="Group"}isComponentPort(){return!this.isGroupPort()}_getConnectedPortsFromConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo;if(!connectsTo)return[];let connectedPorts=[],connectsToArray=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let connection of connectsToArray){let port=this.getSubcircuit().selectOne(connection,{type:"port"});port&&connectedPorts.push(port)}return connectedPorts}_isBoardPinoutFromAttributes(){let parent=this.parent;if(parent?._parsedProps?.pinAttributes){let pinAttributes=parent._parsedProps.pinAttributes;for(let alias of this.getNameAndAliases())if(pinAttributes[alias]?.includeInBoardPinout)return!0}}_getGlobalPcbPositionBeforeLayout(){let matchedPcbElm=this.matchedComponents.find(c4=>c4.isPcbPrimitive),parentComponent=this.parent;if(parentComponent&&!parentComponent.props.footprint)throw new Error(`${parentComponent.componentName} "${parentComponent.props.name}" does not have a footprint. Add a footprint prop, e.g. <${parentComponent.componentName.toLowerCase()} footprint="..." />`);if(!matchedPcbElm)throw new Error(`Port ${this} has no matching PCB primitives. This often means the footprint's pads lack matching port hints.`);return matchedPcbElm?._getGlobalPcbPositionBeforeLayout()??{x:0,y:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_port_id)return super._getPcbCircuitJsonBounds();let{db:db2}=this.root,pcb_port3=db2.pcb_port.get(this.pcb_port_id);return{center:{x:pcb_port3.x,y:pcb_port3.y},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getGlobalPcbPositionAfterLayout(){return this._getPcbCircuitJsonBounds().center}_getPortsInternallyConnectedToThisPort(){let parent=this.parent;if(!parent||!parent._getInternallyConnectedPins)return[];let internallyConnectedPorts=parent._getInternallyConnectedPins();for(let ports of internallyConnectedPorts)if(ports.some(port=>port===this))return ports;return[]}_hasSchematicPort(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return!0;let parentNormalComponent=this.getParentNormalComponent();if(parentNormalComponent?.getSchematicSymbol())return!!(this.schematicSymbolPortDef||this._getPortsInternallyConnectedToThisPort().some(p4=>p4.schematicSymbolPortDef));let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();return!!(parentBoxDim&&this._parsedProps.pinNumber!==void 0&&parentBoxDim.getPortPositionByPinNumber(this._parsedProps.pinNumber))}_getGlobalSchematicPositionBeforeLayout(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return{x:schX,y:schY};let parentNormalComponent=this.getParentNormalComponent(),symbol=parentNormalComponent?.getSchematicSymbol();if(symbol){let schematicSymbolPortDef=this.schematicSymbolPortDef;if(!schematicSymbolPortDef&&(schematicSymbolPortDef=this._getPortsInternallyConnectedToThisPort().find(p4=>p4.schematicSymbolPortDef)?.schematicSymbolPortDef??null,!schematicSymbolPortDef))throw new Error(`Couldn't find schematicSymbolPortDef for port ${this.getString()}, searched internally connected ports and none had a schematicSymbolPortDef. Why are we trying to get the schematic position of this port?`);let transform6=compose2(parentNormalComponent.computeSchematicGlobalTransform(),translate2(-symbol.center.x,-symbol.center.y));return applyToPoint2(transform6,schematicSymbolPortDef)}let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();if(parentBoxDim&&this._parsedProps.pinNumber!==void 0){let localPortPosition=parentBoxDim.getPortPositionByPinNumber(this._parsedProps.pinNumber);if(!localPortPosition)throw new Error(`Couldn't find position for schematic_port for port ${this.getString()} inside of the schematic box`);return applyToPoint2(parentNormalComponent.computeSchematicGlobalTransform(),localPortPosition)}throw new Error(`Couldn't find position for schematic_port for port ${this.getString()}`)}_getGlobalSchematicPositionAfterLayout(){let{db:db2}=this.root;if(!this.schematic_port_id)throw new Error(`Can't get schematic port position after layout for "${this.getString()}", no schematic_port_id`);let schematic_port3=db2.schematic_port.get(this.schematic_port_id);if(!schematic_port3)throw new Error(`Schematic port not found when trying to get post-layout position: ${this.schematic_port_id}`);return schematic_port3.center}registerMatch(component){this.matchedComponents.push(component)}getNameAndAliases(){let{_parsedProps:props}=this;return Array.from(new Set([...props.name?[props.name]:[],...props.aliases??[],...typeof props.pinNumber=="number"?[`pin${props.pinNumber}`,props.pinNumber.toString()]:[],...this.externallyAddedAliases??[]]))}_getMatchingPinAttributes(){let parentProps=this.parent?._parsedProps,pinAttributes=parentProps?.pinAttributes,noConnect=parentProps?.noConnect,matches=[];for(let alias of this.getNameAndAliases()){if(pinAttributes){let attributes2=pinAttributes[alias];attributes2&&matches.push(attributes2)}noConnect?.includes(alias)&&matches.push({doNotConnect:!0})}return matches.length===0?[]:matches}_shouldIncludeInBoardPinout(){return this._getMatchingPinAttributes().some(attributes2=>attributes2.includeInBoardPinout===!0)}isMatchingPort(port){return this.isMatchingAnyOf(port.getNameAndAliases())}getPortSelector(){return`.${(this.getParentNormalComponent()??this.parent)?.props.name} > port.${this.props.name}`}getAvailablePcbLayers(){let{layer,layers}=this._parsedProps;return layers||(layer?[layer]:Array.from(new Set(this.matchedComponents.flatMap(c4=>c4.getAvailablePcbLayers()))))}_getDirectlyConnectedTraces(){return this.getSubcircuit().selectAll("trace").filter(trace=>!trace._couldNotFindPort).filter(trace=>trace._isExplicitlyConnectedToPort(this))}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,port_hints=this.getNameAndAliases(),parentNormalComponent=this.getParentNormalComponent(),source_component_id=(this.parent?.source_component_id?this.parent:parentNormalComponent)?.source_component_id??null,pinAttributes=this._getMatchingPinAttributes(),portAttributesFromParent={};for(let attributes2 of pinAttributes)applyPinAttributesToSourcePort(portAttributesFromParent,attributes2);let source_port3=db2.source_port.insert({name:props.name,pin_number:props.pinNumber,port_hints,source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,...portAttributesFromParent});this.source_port_id=source_port3.source_port_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,parentNormalComponent=this.getParentNormalComponent(),parentWithSourceId=this.parent?.source_component_id?this.parent:parentNormalComponent;if(this.isGroupPort()){db2.source_port.update(this.source_port_id,{source_component_id:null,subcircuit_id:this.getSubcircuit()?.subcircuit_id});return}if(!parentWithSourceId?.source_component_id)throw new Error(`${this.getString()} has no parent source component (parent: ${this.parent?.getString()})`);db2.source_port.update(this.source_port_id,{source_component_id:parentWithSourceId.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id}),this.source_component_id=parentWithSourceId.source_component_id}doInitialPcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{matchedComponents}=this;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db2.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit=this.getSubcircuit(),pcb_port3=db2.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port3.pcb_port_id;return}let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent;if(!parentWithPcbComponentId?.pcb_component_id)throw new Error(`${this.getString()} has no parent pcb component, cannot render pcb_port (parent: ${this.parent?.getString()}, parentNormalComponent: ${parentNormalComponent?.getString()})`);let pcbMatches=matchedComponents.filter(c4=>c4.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1){if(!areAllPcbPrimitivesOverlapping(pcbMatches)){let portName=this.props.name,componentName=this.getParentNormalComponent()?.props.name??"unknown",altAliases=this.getNameAndAliases().filter(h6=>h6!==portName),altMsg=altAliases.length>0?` (consider using alternate aliases: ${altAliases.join(", ")})`:"";db2.source_ambiguous_port_reference.insert({error_type:"source_ambiguous_port_reference",message:`${componentName}.${portName} is ambiguous: ${componentName}.${portName} references multiple non-overlapping pads: ${pcbMatches.map(c4=>c4.getString()).join(", ")}${altMsg}`,source_port_id:this.source_port_id??void 0,source_component_id:this.getParentNormalComponent()?.source_component_id??void 0});return}matchCenter=getCenterOfPcbPrimitives(pcbMatches)}if(matchCenter){let subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port3=db2.pcb_port.insert({pcb_component_id:parentWithPcbComponentId.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port3.pcb_port_id}else{let pcbMatch=pcbMatches[0];throw new Error(`${pcbMatch.getString()} does not have a center or _getGlobalPcbPositionBeforeLayout method (needed for pcb_port placement)`)}}updatePcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(this.pcb_port_id)return;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db2.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit2=this.getSubcircuit(),pcb_port22=db2.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit2?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port22.pcb_port_id;return}let pcbMatches=this.matchedComponents.filter(c4=>c4.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1)try{areAllPcbPrimitivesOverlapping(pcbMatches)&&(matchCenter=getCenterOfPcbPrimitives(pcbMatches))}catch{}if(!matchCenter)return;let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent,subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port3=db2.pcb_port.insert({pcb_component_id:parentWithPcbComponentId?.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port3.pcb_port_id}_getBestDisplayPinLabel(){let{db:db2}=this.root,sourcePort=db2.source_port.get(this.source_port_id),labelHints=[];for(let portHint of sourcePort?.port_hints??[])portHint.match(/^(pin)?\d+$/)||portHint.match(/^(left|right)/)&&!sourcePort?.name.match(/^(left|right)/)||labelHints.push(portHint);if(this.getParentNormalComponent()?.props?.showPinAliases&&labelHints.length>0)return labelHints.join("/");if(labelHints.length>0)return labelHints[0]}doInitialSchematicPortRender(){let collapsedAncestor=this.getCollapsedSchematicBoxAncestor();if(collapsedAncestor&&this.parent!==collapsedAncestor)return;let{db:db2}=this.root,{_parsedProps:props}=this,{schX,schY}=props,container=schX!==void 0&&schY!==void 0?this.getParentNormalComponent():this.getPrimitiveContainer();if(!container||!this._hasSchematicPort())return;let containerCenter=container._getGlobalSchematicPositionBeforeLayout(),portCenter=this._getGlobalSchematicPositionBeforeLayout(),localPortInfo=null,containerDims=container._getSchematicBoxDimensions();containerDims&&props.pinNumber!==void 0&&(localPortInfo=containerDims.getPortPositionByPinNumber(props.pinNumber)),this.getSubcircuit().props._schDebugObjectsEnabled&&db2.schematic_debug_object.insert({shape:"rect",center:portCenter,size:{width:.1,height:.1},label:"obstacle"}),localPortInfo?.side?this.facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[localPortInfo.side]:this.facingDirection=getRelativeDirection(containerCenter,portCenter);let bestDisplayPinLabel=this._getBestDisplayPinLabel(),parentNormalComponent=this.getParentNormalComponent(),sideOfComponent=localPortInfo?.side??(props.direction==="up"?"top":props.direction==="down"?"bottom":props.direction),schematicPortInsertProps={type:"schematic_port",schematic_component_id:parentNormalComponent?.schematic_component_id,center:portCenter,source_port_id:this.source_port_id,facing_direction:this.facingDirection,distance_from_component_edge:props.schStemLength??.4,side_of_component:sideOfComponent,pin_number:props.pinNumber,true_ccw_index:localPortInfo?.trueIndex,display_pin_label:bestDisplayPinLabel,is_connected:!1};for(let attributes2 of this._getMatchingPinAttributes())attributes2.requiresPower&&(schematicPortInsertProps.has_input_arrow=!0),attributes2.providesPower&&(schematicPortInsertProps.has_output_arrow=!0);let schematic_port3=db2.schematic_port.insert(schematicPortInsertProps);if(this.schematic_port_id=schematic_port3.schematic_port_id,props.schStemLength!==void 0&&props.schStemLength!==0){let{schStemLength,direction:direction2}=props,x22=portCenter.x,y22=portCenter.y;direction2==="right"?x22-=schStemLength:direction2==="left"?x22+=schStemLength:direction2==="up"?y22-=schStemLength:direction2==="down"&&(y22+=schStemLength);let stemLine=db2.schematic_line.insert({schematic_component_id:parentNormalComponent?.schematic_component_id,x1:portCenter.x,y1:portCenter.y,x2:x22,y2:y22,stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1});this.schematic_stem_line_id=stemLine.schematic_line_id}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_port_id)return;let transform6=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform6)return;let{db:db2}=this.root,schPort=db2.schematic_port.get(this.schematic_port_id);if(schPort){let newCenter=applyToPoint2(transform6,schPort.center);if(db2.schematic_port.update(this.schematic_port_id,{center:newCenter}),this.schematic_stem_line_id){let line2=db2.schematic_line.get(this.schematic_stem_line_id);if(line2){let p12=applyToPoint2(transform6,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform6,{x:line2.x2,y:line2.y2});db2.schematic_line.update(this.schematic_stem_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y});let scaledStemLength=Math.sqrt((p12.x-p22.x)**2+(p12.y-p22.y)**2);db2.schematic_port.update(this.schematic_port_id,{distance_from_component_edge:scaledStemLength})}}}}_getSubcircuitConnectivityKey(){return this.root?.db.source_port.get(this.source_port_id)?.subcircuit_connectivity_map_key}_setPositionFromLayout(newCenter){let{db:db2}=this.root;this.pcb_port_id&&db2.pcb_port.update(this.pcb_port_id,{x:newCenter.x,y:newCenter.y})}_hasMatchedPcbPrimitive(){return this.matchedComponents.some(c4=>c4.isPcbPrimitive)}_getNetLabelText(){return`${this.parent?.props.name}_${this.props.name}`}},getPinNumberFromLabels=labels=>{let pinNumber=labels.find(p4=>/^(pin)?\d+$/.test(p4));return pinNumber?Number.parseInt(pinNumber.replace(/^pin/,"")):null};function getPortFromHints(hints,opts){let pinNumber=getPinNumberFromLabels(hints);if(!pinNumber)return null;let aliases2=[...hints.filter(p4=>p4.toString()!==pinNumber.toString()&&p4!==`pin${pinNumber}`&&p4.trim()!==""),...opts?.additionalAliases?.[`pin${pinNumber}`]??[]];return new Port({pinNumber,aliases:aliases2})}function getPinsFromSideDefinition(sideDefinition){return sideDefinition?Array.isArray(sideDefinition)?sideDefinition:sideDefinition.pins??[]:[]}var hasExplicitPinMapping=pa3=>{for(let side of["leftSide","rightSide","topSide","bottomSide"])if(side in pa3&&typeof pa3[side]=="number")throw new Error(`A number was specified for "${side}", you probably meant to use "size" not "side"`);return"leftSide"in pa3||"rightSide"in pa3||"topSide"in pa3||"bottomSide"in pa3},getPinsFromPortArrangement=pa3=>!pa3||!hasExplicitPinMapping(pa3)?[]:[...getPinsFromSideDefinition(pa3.leftSide),...getPinsFromSideDefinition(pa3.rightSide),...getPinsFromSideDefinition(pa3.topSide),...getPinsFromSideDefinition(pa3.bottomSide)],getSizeOfSidesFromPortArrangement=pa3=>{if(hasExplicitPinMapping(pa3))return{leftSize:getPinsFromSideDefinition(pa3.leftSide).length,rightSize:getPinsFromSideDefinition(pa3.rightSide).length,topSize:getPinsFromSideDefinition(pa3.topSide).length,bottomSize:getPinsFromSideDefinition(pa3.bottomSide).length};let{leftSize=0,rightSize=0,topSize=0,bottomSize=0}=pa3;return{leftSize,rightSize,topSize,bottomSize}},DEFAULT_SCHEMATIC_BOX_PADDING_MM=.4;function isExplicitPinMappingArrangement(arrangement){let a3=arrangement;return a3.leftSide!==void 0||a3.rightSide!==void 0||a3.topSide!==void 0||a3.bottomSide!==void 0}var getAllDimensionsForSchematicBox=params=>{let portDistanceFromEdge=params.portDistanceFromEdge??.4,sidePinCounts=params.schPortArrangement?getSizeOfSidesFromPortArrangement(params.schPortArrangement):null,sideLengths={left:0,right:0,top:0,bottom:0},pinCount=params.pinCount??null;if(pinCount===null)if(sidePinCounts)pinCount=sidePinCounts.leftSize+sidePinCounts.rightSize+sidePinCounts.topSize;else throw new Error("Could not determine pin count for the schematic box");if(pinCount&&!sidePinCounts){let rightSize=Math.floor(pinCount/2);sidePinCounts={leftSize:pinCount-rightSize,rightSize,topSize:0,bottomSize:0}}sidePinCounts||(sidePinCounts={leftSize:0,rightSize:0,topSize:0,bottomSize:0});let getPinNumberUsingSideIndex=({side,sideIndex,truePinIndex:truePinIndex2})=>{if(!params.schPortArrangement||!isExplicitPinMappingArrangement(params.schPortArrangement))return truePinIndex2+1;let normalCcwDirection={left:"top-to-bottom",bottom:"left-to-right",right:"bottom-to-top",top:"right-to-left"}[side],directionAlongSide=params.schPortArrangement?.[`${side}Side`]?.direction??normalCcwDirection,pinsDefinitionForSide=params.schPortArrangement?.[`${side}Side`]?.pins,sideIndexWithDirectionCorrection=sideIndex;return directionAlongSide!==normalCcwDirection&&(sideIndexWithDirectionCorrection=pinsDefinitionForSide.length-sideIndex-1),parsePinNumberFromLabelsOrThrow(pinsDefinitionForSide[sideIndexWithDirectionCorrection],params.pinLabels)},orderedTruePorts=[],currentDistanceFromEdge=0,truePinIndex=0;for(let sideIndex=0;sideIndex<sidePinCounts.leftSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"left",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"left",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),sideIndex===sidePinCounts.leftSize-1?sideLengths.left=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.bottomSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"bottom",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"bottom",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),sideIndex===sidePinCounts.bottomSize-1?sideLengths.bottom=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.rightSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"right",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"right",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),sideIndex===sidePinCounts.rightSize-1?sideLengths.right=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.topSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"top",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"top",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),sideIndex===sidePinCounts.topSize-1?sideLengths.top=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}let resolvedSchWidth=params.schWidth;if(resolvedSchWidth===void 0){resolvedSchWidth=Math.max(sideLengths.top+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.bottom+DEFAULT_SCHEMATIC_BOX_PADDING_MM),params.pinLabels&&orderedTruePorts.filter(p4=>p4.side==="left"||p4.side==="right").some(p4=>params.pinLabels?.[`pin${p4.pinNumber}`]||params.pinLabels?.[p4.pinNumber])&&(resolvedSchWidth=Math.max(resolvedSchWidth,.5));let labelWidth=params.pinLabels?Math.max(...Object.values(params.pinLabels).map(label=>label.length*.1)):0,LABEL_PADDING=labelWidth>0?1.1:0;resolvedSchWidth=Math.max(resolvedSchWidth,labelWidth+LABEL_PADDING)}let schHeight=params.schHeight;schHeight||(schHeight=Math.max(sideLengths.left+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.right+DEFAULT_SCHEMATIC_BOX_PADDING_MM));let trueEdgePositions={left:{x:-resolvedSchWidth/2-portDistanceFromEdge,y:sideLengths.left/2},bottom:{x:-sideLengths.bottom/2,y:-schHeight/2-portDistanceFromEdge},right:{x:resolvedSchWidth/2+portDistanceFromEdge,y:-sideLengths.right/2},top:{x:sideLengths.top/2,y:schHeight/2+portDistanceFromEdge}},trueEdgeTraversalDirections={left:{x:0,y:-1},right:{x:0,y:1},top:{x:-1,y:0},bottom:{x:1,y:0}},truePortsWithPositions=orderedTruePorts.map(p4=>{let{distanceFromOrthogonalEdge,side}=p4,edgePos=trueEdgePositions[side],edgeDir=trueEdgeTraversalDirections[side];return{x:edgePos.x+distanceFromOrthogonalEdge*edgeDir.x,y:edgePos.y+distanceFromOrthogonalEdge*edgeDir.y,...p4}});return{getPortPositionByPinNumber(pinNumber){let port=truePortsWithPositions.find(p4=>p4.pinNumber.toString()===pinNumber.toString());return port||null},getSize(){return{width:resolvedSchWidth,height:schHeight}},getSizeIncludingPins(){return{width:resolvedSchWidth+(sidePinCounts.leftSize||sidePinCounts.rightSize?.4:0),height:schHeight+(sidePinCounts.topSize||sidePinCounts.bottomSize?.4:0)}},pinCount}},getNumericSchPinStyle=(pinStyles,pinLabels)=>{if(!pinStyles)return;let numericPinStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels),leftMargin=pinStyle.marginLeft??pinStyle.leftMargin,rightMargin=pinStyle.marginRight??pinStyle.rightMargin,topMargin=pinStyle.marginTop??pinStyle.topMargin,bottomMargin=pinStyle.marginBottom??pinStyle.bottomMargin,nextStyle={...numericPinStyles[`pin${pinNumber}`]??{}};leftMargin!==void 0&&(nextStyle.leftMargin=distance.parse(leftMargin)),rightMargin!==void 0&&(nextStyle.rightMargin=distance.parse(rightMargin)),topMargin!==void 0&&(nextStyle.topMargin=distance.parse(topMargin)),bottomMargin!==void 0&&(nextStyle.bottomMargin=distance.parse(bottomMargin)),numericPinStyles[`pin${pinNumber}`]=nextStyle}return numericPinStyles},CadAssembly=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"CadAssembly",zodProps:cadassemblyProps}}},getFileExtension=filename=>{if(!filename)return null;let fragmentMatch=filename.match(/#ext=(\w+)$/);if(fragmentMatch)return fragmentMatch[1].toLowerCase();let sanitized=filename.split("?")[0].split("#")[0],lastSegment=sanitized.split("/").pop()??sanitized;return lastSegment.includes(".")?lastSegment.split(".").pop()?.toLowerCase()??null:null},joinUrlPath=(base,path)=>{let trimmedBase=base.replace(/\/+$/,""),trimmedPath=path.replace(/^\/+/,"");return`${trimmedBase}/${trimmedPath}`},constructAssetUrl=(targetUrl,baseUrl)=>{if(!baseUrl||!targetUrl.startsWith("/"))return targetUrl;try{let baseUrlObj=new URL(baseUrl);return baseUrlObj.pathname!=="/"&&targetUrl.startsWith(baseUrlObj.pathname)?new URL(targetUrl,baseUrlObj.origin).toString():joinUrlPath(baseUrl,targetUrl)}catch{return targetUrl}},rotation2=external_exports.union([external_exports.number(),external_exports.string()]),rotation3=external_exports.object({x:rotation2,y:rotation2,z:rotation2}),CadModel=class extends PrimitiveComponent2{get config(){return{componentName:"CadModel",zodProps:cadmodelProps}}doInitialCadModelRender(){let parent=this._findParentWithPcbComponent();if(!parent||!parent.pcb_component_id)return;let{db:db2}=this.root,{boardThickness=0}=parent._getBoard()??{},bounds=parent._getPcbCircuitJsonBounds(),pcb_component3=db2.pcb_component.get(parent.pcb_component_id),props=this._parsedProps;if(!props||typeof props.modelUrl!="string"&&typeof props.stepUrl!="string")return;let parentTransform=parent._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(parentTransform).rotation.angle*180/Math.PI,sourceRotationOffset=props.pcbRotationOffset??props.rotationOffset,rotationOffset=rotation3.parse({x:0,y:0,z:0});if(typeof sourceRotationOffset=="number")rotationOffset.z=Number(sourceRotationOffset);else if(typeof sourceRotationOffset=="object"){let parsed=rotation3.parse(sourceRotationOffset);rotationOffset.x=Number(parsed.x),rotationOffset.y=Number(parsed.y),rotationOffset.z=Number(parsed.z)}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),positionOffset=point32.parse({x:pcbX,y:pcbY,z:props.pcbZ??0,...typeof props.positionOffset=="object"?props.positionOffset:{}}),zOffsetFromSurface=props.zOffsetFromSurface!==void 0?distance.parse(props.zOffsetFromSurface):0,layer=parent.props.layer==="bottom"?"bottom":"top",ext=props.modelUrl?getFileExtension(props.modelUrl):void 0,modelUrlWithoutExtFragment=props.modelUrl?.replace(/#ext=\w+$/,""),urlProps={};if(ext==="stl"?urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="obj"?urlProps.model_obj_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="gltf"?urlProps.model_gltf_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="glb"?urlProps.model_glb_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="step"||ext==="stp"?urlProps.model_step_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="wrl"||ext==="vrml"?urlProps.model_wrl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment),props.stepUrl){let transformed=this._addCachebustToModelUrl(props.stepUrl);transformed&&(urlProps.model_step_url=transformed)}let cad=db2.cad_component.insert({position:{x:bounds.center.x+Number(positionOffset.x),y:bounds.center.y+Number(positionOffset.y),z:(layer==="bottom"?-boardThickness/2:boardThickness/2)+(layer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+Number(positionOffset.z)},rotation:{x:Number(rotationOffset.x),y:(layer==="top"?0:180)+Number(rotationOffset.y),z:layer==="bottom"?-(accumulatedRotation+Number(rotationOffset.z))+180:accumulatedRotation+Number(rotationOffset.z)},pcb_component_id:parent.pcb_component_id,model_board_normal_direction:props.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:props.modelOriginPosition,source_component_id:parent.source_component_id,model_unit_to_mm_scale_factor:typeof props.modelUnitToMmScale=="number"?props.modelUnitToMmScale:void 0,show_as_translucent_model:props.showAsTranslucentModel??parent._parsedProps.showAsTranslucentModel,...urlProps});this.cad_component_id=cad.cad_component_id}_findParentWithPcbComponent(){let p4=this.parent;for(;p4&&!p4.pcb_component_id;)p4=p4.parent;return p4}_addCachebustToModelUrl(url2){if(!url2)return url2;let baseUrl=this.root?.platform?.projectBaseUrl,transformedUrl=constructAssetUrl(url2,baseUrl);if(!transformedUrl.includes("modelcdn.tscircuit.com"))return transformedUrl;let origin=this.root?.getClientOrigin()??"";return`${transformedUrl}${transformedUrl.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}},debug22=(0,import_debug9.default)("tscircuit:core:footprint"),Footprint=class extends PrimitiveComponent2{get config(){return{componentName:"Footprint",zodProps:footprintProps}}doInitialPcbFootprintLayout(){if(this.root?.pcbDisabled)return;let constraints=this.children.filter(child=>child.componentName==="Constraint");if(constraints.length===0)return;let{isFlipped}=this._getPcbPrimitiveFlippedHelpers(),maybeFlipLeftRight=props=>isFlipped&&"left"in props&&"right"in props?{...props,left:props.right,right:props.left}:props,involvedComponents=constraints.flatMap(constraint=>constraint._getAllReferencedComponents().componentsWithSelectors).map(({component,selector,componentSelector,edge})=>({component,selector,componentSelector,edge,bounds:component._getPcbCircuitJsonBounds()}));if(involvedComponents.some(c4=>c4.edge))throw new Error("edge constraints not implemented yet for footprint layout, contributions welcome!");function getComponentDetails(selector){return involvedComponents.find(({selector:s3})=>s3===selector)}let solver=new Solver,kVars={};function getKVar(name){return name in kVars||(kVars[name]=new Variable(name),solver.addEditVariable(kVars[name],Strength.weak)),kVars[name]}for(let{selector,bounds:bounds2}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);solver.suggestValue(kvx,bounds2.center.x),solver.suggestValue(kvy,bounds2.center.y)}for(let constraint of constraints){let props=constraint._parsedProps;if("xDist"in props){let{xDist,left,right,edgeToEdge,centerToCenter}=maybeFlipLeftRight(props),leftVar=getKVar(`${left}_x`),rightVar=getKVar(`${right}_x`),leftBounds=getComponentDetails(left)?.bounds,rightBounds=getComponentDetails(right)?.bounds;if(centerToCenter){let expr=new Expression(rightVar,[-1,leftVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(rightVar,-rightBounds.width/2,[-1,leftVar],-leftBounds.width/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}}else if("yDist"in props){let{yDist,top,bottom,edgeToEdge,centerToCenter}=props,topVar=getKVar(`${top}_y`),bottomVar=getKVar(`${bottom}_y`),topBounds=getComponentDetails(top)?.bounds,bottomBounds=getComponentDetails(bottom)?.bounds;if(centerToCenter){let expr=new Expression(topVar,[-1,bottomVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(topVar,topBounds.height/2,[-1,bottomVar],-bottomBounds.height/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}}else if("sameY"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_y`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}else if("sameX"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_x`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}}solver.updateVariables(),debug22.enabled&&(console.log("Solution to layout constraints:"),console.table(Object.entries(kVars).map(([key,kvar])=>({var:key,val:kvar.value()}))));let bounds={left:1/0,right:-1/0,top:-1/0,bottom:1/0};for(let{selector,bounds:{width,height}}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`),newLeft=kvx.value()-width/2,newRight=kvx.value()+width/2,newTop=kvy.value()+height/2,newBottom=kvy.value()-height/2;bounds.left=Math.min(bounds.left,newLeft),bounds.right=Math.max(bounds.right,newRight),bounds.top=Math.max(bounds.top,newTop),bounds.bottom=Math.min(bounds.bottom,newBottom)}let globalOffset={x:-(bounds.right+bounds.left)/2,y:-(bounds.top+bounds.bottom)/2},containerPos=this.getPrimitiveContainer()._getGlobalPcbPositionBeforeLayout();globalOffset.x+=containerPos.x,globalOffset.y+=containerPos.y;for(let{component,selector}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);component._setPositionFromLayout({x:kvx.value()+globalOffset.x,y:kvy.value()+globalOffset.y})}}},NormalComponent__getMinimumFlexContainerSize=component=>{let{db:db2}=component.root;if(component.pcb_component_id){let pcbComponent=db2.pcb_component.get(component.pcb_component_id);return pcbComponent?{width:pcbComponent.width,height:pcbComponent.height}:null}if(component.pcb_group_id){let pcbGroup=db2.pcb_group.get(component.pcb_group_id);if(!pcbGroup)return null;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:null}return{width:pcbGroup.width??0,height:pcbGroup.height??0}}return null},NormalComponent__repositionOnPcb=(component,position4)=>{let{db:db2}=component.root,allCircuitJson=db2.toArray();if(component.pcb_component_id){repositionPcbComponentTo(allCircuitJson,component.pcb_component_id,position4);return}if(component.source_group_id){repositionPcbGroupTo(allCircuitJson,component.source_group_id,position4);return}throw new Error(`Cannot reposition component ${component.getString()}: no pcb_component_id or source_group_id`)};function NormalComponent_doInitialPcbComponentAnchorAlignment(component){if(component.root?.pcbDisabled||!component.pcb_component_id)return;let{pcbX,pcbY}=component._parsedProps,pcbPositionAnchor=component.props?.pcbPositionAnchor;if(!pcbPositionAnchor||pcbX===void 0&&pcbY===void 0)return;let bounds=getBoundsOfPcbComponents(component.children);if(bounds.width===0||bounds.height===0)return;let currentCenter={...{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor)){let b3={left:bounds.minX,right:bounds.maxX,top:bounds.minY,bottom:bounds.maxY};switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:b3.left,y:b3.top};break;case"top_center":anchorPos={x:currentCenter.x,y:b3.top};break;case"top_right":anchorPos={x:b3.right,y:b3.top};break;case"center_left":anchorPos={x:b3.left,y:currentCenter.y};break;case"center_right":anchorPos={x:b3.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:b3.left,y:b3.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:b3.bottom};break;case"bottom_right":anchorPos={x:b3.right,y:b3.bottom};break}}else try{let port=component.portMap[pcbPositionAnchor];port&&(anchorPos=port._getGlobalPcbPositionBeforeLayout())}catch{}if(!anchorPos)return;let newCenter={...currentCenter};pcbX!==void 0&&(newCenter.x+=pcbX-anchorPos.x),pcbY!==void 0&&(newCenter.y+=pcbY-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&component._repositionOnPcb(newCenter)}var isHttpUrl=s3=>s3.startsWith("http://")||s3.startsWith("https://"),parseLibraryFootprintRef=s3=>{if(isHttpUrl(s3))return null;let idx=s3.indexOf(":");if(idx<=0)return null;let footprintLib=s3.slice(0,idx),footprintName=s3.slice(idx+1);return!footprintLib||!footprintName?null:{footprintLib,footprintName}},isStaticAssetPath=s3=>s3.startsWith("/")||s3.startsWith("./"),resolveStaticFileImportDebug=(0,import_debug10.default)("tscircuit:core:resolveStaticFileImport");async function resolveStaticFileImport(path,platform){if(!path)return path;let normalizedPath=path.startsWith("./")?path.slice(1):path,resolver=platform?.resolveProjectStaticFileImportUrl;if(resolver&&(path.startsWith("/")||path.startsWith("./")))try{let resolved=await resolver(normalizedPath);if(resolved)return resolved}catch(error2){resolveStaticFileImportDebug("failed to resolve static file via platform resolver",error2)}return constructAssetUrl(normalizedPath,platform?.projectBaseUrl)}function NormalComponent_doInitialPcbFootprintStringRender(component,queueAsyncEffect){let{footprint}=component.props;if(footprint??(footprint=component._getImpliedFootprintString?.()),!footprint)return;let{pcbRotation,pinLabels,pcbPinLabels}=component.props,fileExtension=getFileExtension(String(footprint)),footprintParser=fileExtension?component.root?.platform?.footprintFileParserMap?.[fileExtension]:null;if(typeof footprint=="string"&&(isHttpUrl(footprint)||isStaticAssetPath(footprint))&&footprintParser){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0,queueAsyncEffect("load-footprint-from-platform-file-parser",async()=>{let footprintUrl=isHttpUrl(footprint)?footprint:await resolveStaticFileImport(footprint,component.root?.platform);try{let result=await footprintParser.loadFromUrl(footprintUrl),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprintUrl,pinLabels,pcbPinLabels},result.footprintCircuitJson);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load footprint "${footprintUrl}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprintUrl});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"&&isHttpUrl(footprint)){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let url2=footprint;queueAsyncEffect("load-footprint-url",async()=>{try{let res2=await fetch(url2);if(!res2.ok)throw new Error(`Failed to fetch footprint: ${res2.status}`);let soup=await res2.json(),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:url2,pinLabels,pcbPinLabels},soup);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${url2}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:url2});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"){let libRef=parseLibraryFootprintRef(footprint);if(!libRef||component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let libMap=component.root?.platform?.footprintLibraryMap?.[libRef.footprintLib],resolverFn;if(typeof libMap=="function"&&(resolverFn=libMap),!resolverFn)return;queueAsyncEffect("load-lib-footprint",async()=>{try{let result=await resolverFn(libRef.footprintName),circuitJson=null;if(Array.isArray(result)?circuitJson=result:Array.isArray(result.footprintCircuitJson)&&(circuitJson=result.footprintCircuitJson),!circuitJson)return;let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},circuitJson),fpWrapper=new Footprint({src:footprint});for(let c4 of fpComponents)fpWrapper.add(c4);component.add(fpWrapper),!Array.isArray(result)&&result.cadModel&&(component._asyncFootprintCadModel=result.cadModel);for(let child of component.children)child.componentName==="Port"&&child._markDirty?.("PcbPortRender");component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${footprint}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprint});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(!(0,import_react3.isValidElement)(footprint)&&footprint.componentName==="Footprint"&&component.add(footprint),Array.isArray(footprint)&&!(0,import_react3.isValidElement)(footprint)&&footprint.length>0){try{let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:"",pinLabels,pcbPinLabels},footprint);component.addAll(fpComponents)}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load json footprint: `+(err instanceof Error?err.message:String(err)),errorObj=circuit_json_footprint_load_error.parse({type:"circuit_json_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0});db2.circuit_json_footprint_load_error.insert(errorObj)}throw err}return}}function getPcbTextBounds(text){let fontSize=text.font_size,textWidth=text.text.length*fontSize*.6,textHeight=fontSize,anchorAlignment=text.anchor_alignment||"center",centerX=text.anchor_position.x,centerY=text.anchor_position.y;switch(anchorAlignment){case"top_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"top_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y+textHeight/2;break;case"top_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"center_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y;break;case"center":centerX=text.anchor_position.x,centerY=text.anchor_position.y;break;case"center_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y;break;case"bottom_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;default:centerX=text.anchor_position.x,centerY=text.anchor_position.y;break}return{x:centerX-textWidth/2,y:centerY-textHeight/2,width:textWidth,height:textHeight}}function NormalComponent_doInitialSilkscreenOverlapAdjustment(component){if(!component._adjustSilkscreenTextAutomatically||component.root?.pcbDisabled||!component.pcb_component_id)return;let{db:db2}=component.root,componentCenter=component._getPcbCircuitJsonBounds().center,silkscreenTexts=db2.pcb_silkscreen_text.list({pcb_component_id:component.pcb_component_id}).filter(text=>text.text===component.name);if(silkscreenTexts.length===0)return;let obstacleBounds=component.getSubcircuit().selectAll("[_isNormalComponent=true]").filter(comp=>comp!==component&&comp.pcb_component_id).map(comp=>{let bounds=comp._getPcbCircuitJsonBounds(),box2={center:bounds.center,width:bounds.width,height:bounds.height};return getBoundingBox(box2)});for(let silkscreenText of silkscreenTexts){let currentPosition=silkscreenText.anchor_position,textBounds=getPcbTextBounds(silkscreenText),textBox={center:{x:textBounds.x+textBounds.width/2,y:textBounds.y+textBounds.height/2},width:textBounds.width,height:textBounds.height},textBoundsBox=getBoundingBox(textBox);if(!obstacleBounds.some(obstacle=>doBoundsOverlap(textBoundsBox,obstacle)))continue;let flippedX=2*componentCenter.x-currentPosition.x,flippedY=2*componentCenter.y-currentPosition.y,flippedTextBox={center:{x:flippedX,y:flippedY},width:textBounds.width,height:textBounds.height},flippedTextBounds=getBoundingBox(flippedTextBox);obstacleBounds.some(obstacle=>doBoundsOverlap(flippedTextBounds,obstacle))||db2.pcb_silkscreen_text.update(silkscreenText.pcb_silkscreen_text_id,{anchor_position:{x:flippedX,y:flippedY}})}}var NormalComponent_doInitialSourceDesignRuleChecks=component=>{let{db:db2}=component.root;if(!component.source_component_id)return;let ports=component.selectAll("port"),traces=db2.source_trace.list(),connected=new Set;for(let trace of traces)for(let id2 of trace.connected_source_port_ids)connected.add(id2);let internalGroups=component._getInternallyConnectedPins();for(let group of internalGroups)if(group.some(p4=>p4.source_port_id&&connected.has(p4.source_port_id)))for(let p4 of group)p4.source_port_id&&connected.add(p4.source_port_id);for(let port of ports)!port.source_port_id||!shouldCheckPortForMissingTrace(component,port)||db2.source_port.get(port.source_port_id)?.do_not_connect||connected.has(port.source_port_id)||db2.source_pin_missing_trace_warning.insert({message:`Port ${port.getNameAndAliases()[0]} on ${component.props.name} is missing a trace`,source_component_id:component.source_component_id,source_port_id:port.source_port_id,subcircuit_id:component.getSubcircuit().subcircuit_id??void 0,warning_type:"source_pin_missing_trace_warning"})},shouldCheckPortForMissingTrace=(component,port)=>{if(component.config.componentName==="Interconnect")return!1;if(component.config.componentName==="Chip"){let pinAttributes=component.props.pinAttributes;if(!pinAttributes)return!1;for(let alias of port.getNameAndAliases()){let attrs=pinAttributes[alias];if(attrs?.requiresPower||attrs?.requiresGround||attrs?.requiresVoltage!==void 0)return!0}return!1}return!0},SUPPLIER_FOOTPRINT_IOU_WARNING_THRESHOLD=.8,supplierNames=supplierProps.shape.supplierPartNumbers.unwrap().keySchema.options,isCopperElement=elm=>elm.type==="pcb_smtpad"||elm.type==="pcb_plated_hole",isValidBounds=bounds=>Number.isFinite(bounds.minX)&&Number.isFinite(bounds.minY)&&Number.isFinite(bounds.maxX)&&Number.isFinite(bounds.maxY)&&bounds.maxX>bounds.minX&&bounds.maxY>bounds.minY,getCopperBounds=elements=>{let copperElements=elements.filter(isCopperElement);if(copperElements.length===0)return null;let bounds=getBoundsOfPcbElements(copperElements);return isValidBounds(bounds)?bounds:null},getBoundsSize=bounds=>({width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}),getCenteredBoundsIou=(boundsA,boundsB,opts)=>{let sizeA=getBoundsSize(boundsA),sizeB=getBoundsSize(boundsB),bWidth=opts?.rotateB?sizeB.height:sizeB.width,bHeight=opts?.rotateB?sizeB.width:sizeB.height,intersectionWidth=Math.min(sizeA.width,bWidth),intersectionHeight=Math.min(sizeA.height,bHeight),intersectionArea=intersectionWidth*intersectionHeight,unionArea=sizeA.width*sizeA.height+bWidth*bHeight-intersectionArea;return unionArea<=0?0:intersectionArea/unionArea},getBestBoundsIou=(localBounds,supplierBounds)=>Math.max(getCenteredBoundsIou(localBounds,supplierBounds),getCenteredBoundsIou(localBounds,supplierBounds,{rotateB:!0})),getSupplierPartCandidates=supplierPartNumbers=>{if(!supplierPartNumbers)return[];let candidates=[];for(let supplierName of supplierNames){let partNumbers=supplierPartNumbers[supplierName];if(Array.isArray(partNumbers))for(let supplierPartNumber of partNumbers)supplierPartNumber&&candidates.push({supplierName,supplierPartNumber})}return candidates};function NormalComponent_doInitialSupplierFootprintMismatchWarning(component){if(component.root?.pcbDisabled||component.props.doNotPlace||component.props.footprint===void 0||component.getInheritedProperty("bomDisabled")||component.getInheritedProperty("partsEngineDisabled"))return;let partsEngine2=component.getInheritedProperty("partsEngine");if(!partsEngine2?.fetchPartCircuitJson)return;let{db:db2}=component.root,sourceComponent=db2.source_component.get(component.source_component_id);if(!sourceComponent?.supplier_part_numbers||!component.pcb_component_id||component._hasStartedSupplierFootprintMismatchWarningCheck)return;let supplierPartCandidates=getSupplierPartCandidates(sourceComponent.supplier_part_numbers);if(supplierPartCandidates.length===0)return;let localCopperElements=[...db2.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db2.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})],localBounds=getCopperBounds(localCopperElements);localBounds&&(component._hasStartedSupplierFootprintMismatchWarningCheck=!0,component._queueAsyncEffect("check-supplier-footprint-mismatch",async()=>{let{db:db22}=component.root,fetchPartCircuitJson=partsEngine2.fetchPartCircuitJson;for(let supplierPartCandidate of supplierPartCandidates){let{supplierName,supplierPartNumber}=supplierPartCandidate;try{let supplierCircuitJson=await Promise.resolve(fetchPartCircuitJson({supplierPartNumber}))??null;if(!supplierCircuitJson?.length)continue;let supplierBounds=getCopperBounds(supplierCircuitJson);if(!supplierBounds)continue;let footprintCopperIou=getBestBoundsIou(localBounds,supplierBounds);if(footprintCopperIou>=SUPPLIER_FOOTPRINT_IOU_WARNING_THRESHOLD)return;let footprintLabel=typeof component.props.footprint=="string"?`"${component.props.footprint}"`:"the provided footprint",roundedIou=Number(footprintCopperIou.toFixed(4)),warning=supplier_footprint_mismatch_warning.parse({type:"supplier_footprint_mismatch_warning",message:`${component.getString()} footprint ${footprintLabel} does not match supplier footprint ${supplierName}:${supplierPartNumber} (copper IoU ${roundedIou}).`,source_component_id:component.source_component_id,pcb_component_id:component.pcb_component_id,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,subcircuit_id:component.getSubcircuit()?.subcircuit_id??void 0,supplier_name:supplierName,supplier_part_number:supplierPartNumber,footprint_copper_intersection_over_union:roundedIou});db22.supplier_footprint_mismatch_warning.insert(warning);return}catch(error2){let errorMessage=error2 instanceof Error?error2.message:String(error2),errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier footprint for ${component.getString()} (${supplierName}:${supplierPartNumber}): ${errorMessage}`,source_component_id:component.source_component_id,subcircuit_id:component.getSubcircuit()?.subcircuit_id});db22.unknown_error_finding_part.insert(errorObj);return}}}))}var canMergePortDefinitions=(a3,b3)=>{let aPinNumber=a3._parsedProps.pinNumber,bPinNumber=b3._parsedProps.pinNumber;return aPinNumber!==void 0&&bPinNumber!==void 0&&aPinNumber!==bPinNumber?!1:a3.isMatchingAnyOf(b3.getNameAndAliases())},hasExactSameMembers=(a3,b3)=>{let sortedA=a3.toSorted(),sortedB=b3.toSorted();return sortedA.length===sortedB.length&&sortedA.every((name,index)=>name===sortedB[index])},getPinNumberedName=port=>port.getNameAndAliases().find(alias=>/^pin\d+$/.test(alias))??null,getPortReferenceName=(port,portNameCounts)=>{if(!port._isPrimaryPort&&port.props.name||port.props.name&&(portNameCounts.get(port.props.name)??0)<=1)return port.props.name;let pinNumberedName=getPinNumberedName(port);return pinNumberedName||(port.props.name??null)};function inferInternallyConnectedPinNamesFromPorts(ports,inferredInternallyConnectedPinNames){let portsByAlias=new Map;for(let port of ports)for(let alias of new Set(port.getNameAndAliases()))/^(pin)?\d+$/.test(alias)||!port._isPrimaryPort&&alias===port.props.name||(portsByAlias.has(alias)||portsByAlias.set(alias,[]),portsByAlias.get(alias).push(port));for(let aliasPorts of portsByAlias.values()){let uniquePorts=Array.from(new Set(aliasPorts));if(uniquePorts.length<2)continue;let portNameCounts=new Map;for(let port of uniquePorts)port.props.name&&portNameCounts.set(port.props.name,(portNameCounts.get(port.props.name)??0)+1);let portNames=uniquePorts.map(port=>getPortReferenceName(port,portNameCounts)).filter(portName=>!!portName),uniquePortNames=Array.from(new Set(portNames));uniquePortNames.length<2||inferredInternallyConnectedPinNames.some(group=>hasExactSameMembers(group,uniquePortNames))||inferredInternallyConnectedPinNames.push(uniquePortNames)}}function getPrimaryPortsFromPortHintGroups(portHintGroups,opts){let implicitPinNumber=1,entriesByPinNumber=new Map;for(let portHintGroup of portHintGroups){let filteredPortHints=portHintGroup.hints.filter(hint=>hint&&hint.trim()!=="");if(filteredPortHints.length===0)continue;let portHintsList=filteredPortHints;portHintsList.some(hint=>hint.startsWith("pin")||/^(?:pin)?\d+$/.test(hint))||(portHintsList=[...portHintsList,`pin${implicitPinNumber}`]),implicitPinNumber++;let newPort=getPortFromHints(portHintsList,opts);if(!newPort)continue;newPort.originDescription=portHintGroup.originDescription;let pinNumber=newPort._parsedProps.pinNumber;pinNumber!==void 0&&(entriesByPinNumber.has(pinNumber)||entriesByPinNumber.set(pinNumber,[]),entriesByPinNumber.get(pinNumber).push({port:newPort,component:portHintGroup.component}))}let ports=[];for(let[pinNumber,entries]of entriesByPinNumber){let mergeAliases=(target,source)=>{let mergedAliases=source.getNameAndAliases().filter(alias=>!target.getNameAndAliases().includes(alias));target.externallyAddedAliases.push(...mergedAliases)},primaryPort=entries[0].port,componentEntries=entries.filter(entry=>!!entry.component);if(componentEntries.length!==entries.length){for(let entry of entries.slice(1))mergeAliases(primaryPort,entry.port);ports.push(primaryPort);continue}let clusters=getConnectedPcbPrimitiveClustersBeforeRender(componentEntries.map(entry=>entry.component));if(clusters.length<=1){for(let entry of entries.slice(1))mergeAliases(primaryPort,entry.port);ports.push(primaryPort);continue}let internallyConnectedPinNames=[primaryPort.props.name];for(let[clusterIndex,cluster]of clusters.entries()){let clusterEntries=componentEntries.filter(entry=>cluster.includes(entry.component));if(clusterIndex===0){for(let entry of clusterEntries.slice(1))mergeAliases(primaryPort,entry.port);ports.push(primaryPort);continue}let internalPort=new Port({name:`pin${pinNumber}_internal_${clusterIndex}`,aliases:primaryPort.getNameAndAliases()});internalPort._isPrimaryPort=!1,internalPort._primaryPinNumber=pinNumber,internalPort.originDescription=`implicitInternalPhysicalPort:pin${pinNumber}:${clusterIndex}`;for(let entry of clusterEntries)mergeAliases(internalPort,entry.port);internallyConnectedPinNames.push(internalPort.props.name),ports.push(internalPort)}opts?.inferredInternallyConnectedPinNames?.push(internallyConnectedPinNames)}return opts?.inferredInternallyConnectedPinNames&&inferInternallyConnectedPinNamesFromPorts(ports,opts.inferredInternallyConnectedPinNames),ports}var debug32=(0,import_debug6.default)("tscircuit:core"),rotation32=external_exports.object({x:rotation,y:rotation,z:rotation}),NormalComponent3=class extends PrimitiveComponent2{constructor(props){let filteredProps={...props},invalidPinLabelsMessages=[];if(filteredProps.pinLabels&&!Array.isArray(filteredProps.pinLabels)){let{validPinLabels,invalidPinLabelsMessages:messages}=filterPinLabels(filteredProps.pinLabels);filteredProps.pinLabels=validPinLabels,invalidPinLabelsMessages=messages}super(filteredProps);__publicField(this,"reactSubtrees",[]);__publicField(this,"_impliedFootprint");__publicField(this,"_resolvedPcbCalcOffsetX");__publicField(this,"_resolvedPcbCalcOffsetY");__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"_isNormalComponent",!0);__publicField(this,"_attributeLowerToCamelNameMap",{_isnormalcomponent:"_isNormalComponent"});__publicField(this,"_asyncSupplierPartNumbers");__publicField(this,"_asyncFootprintCadModel");__publicField(this,"_isCadModelChild");__publicField(this,"_inferredInternallyConnectedPinNames",[]);__publicField(this,"pcb_missing_footprint_error_id");__publicField(this,"_hasStartedFootprintUrlLoad",!1);__publicField(this,"_hasStartedSupplierFootprintMismatchWarningCheck",!1);__publicField(this,"_invalidFootprintPropMessages",[]);__publicField(this,"_invalidPinLabelMessages",[]);__publicField(this,"_adjustSilkscreenTextAutomatically",!1);if(filteredProps.pinLabels&&!Array.isArray(filteredProps.pinLabels)){let invalidPinKey=Object.keys(filteredProps.pinLabels).find(pinKey=>getPinNumberFromPinLabelsKey(pinKey)===null);if(invalidPinKey)throw new InvalidProps(this.lowercaseComponentName,this.props,{_errors:[],pinLabels:{_errors:[`Invalid pinLabels key "${invalidPinKey}". Expected "pin\${number}" (e.g. pin1, pin2).`]}})}this._invalidPinLabelMessages=invalidPinLabelsMessages,this._addChildrenFromStringFootprint(),this.initPorts()}get defaultInternallyConnectedPinNames(){return[]}get internallyConnectedPinNames(){return[...this._parsedProps.internallyConnectedPins??this.defaultInternallyConnectedPinNames,...this._inferredInternallyConnectedPinNames].map(pinGroup=>pinGroup.map(pin=>typeof pin=="number"?`pin${pin}`:pin))}doInitialSourceNameDuplicateComponentRemoval(){if(!this.name)return;let root=this.root;if((this.getSubcircuit().getNormalComponentNameMap?.()?.get(this.props.name)??[]).filter(component=>component!==this&&component.renderPhaseStates.SourceNameDuplicateComponentRemoval.initialized).length>0){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout();root.db.source_failed_to_create_component_error.insert({component_name:this.name,error_type:"source_failed_to_create_component_error",message:`Cannot create component "${this.name}": A component with the same name already exists`,pcb_center:pcbPosition2,schematic_center:schematicPosition}),this.shouldBeRemoved=!0;let childrenToRemove=[...this.children];for(let child of childrenToRemove)this.remove(child)}}initPorts(opts={}){this._inferredInternallyConnectedPinNames=[];let{config}=this,portsToCreate=[],schPortArrangement=this._getSchematicPortArrangement();if(schPortArrangement&&!this._parsedProps.pinLabels){for(let side in schPortArrangement){let pins=schPortArrangement[side].pins;if(Array.isArray(pins))for(let pinNumberOrLabel of pins){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNumberOrLabel,this._parsedProps.pinLabels);portsToCreate.push(new Port({pinNumber,aliases:opts.additionalAliases?.[`pin${pinNumber}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let sides=["left","right","top","bottom"],pinNum=1;for(let side of sides){let size3=schPortArrangement[`${side}Size`];for(let i3=0;i3<size3;i3++)portsToCreate.push(new Port({pinNumber:pinNum++,aliases:opts.additionalAliases?.[`pin${pinNum}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let pinLabels=this._parsedProps.pinLabels;if(pinLabels)for(let[pinKey,label]of Object.entries(pinLabels)){let pinNumber=getPinNumberFromPinLabelsKey(pinKey);if(pinNumber===null)throw new Error(`Invalid pinLabels key "${pinKey}". Expected "pin\${number}" (e.g. pin1, pin2).`);let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===pinNumber),primaryLabel=Array.isArray(label)?label[0]:label,otherLabels=Array.isArray(label)?label.slice(1):[];existingPort?(existingPort.externallyAddedAliases.push(primaryLabel,...otherLabels),existingPort.props.name=primaryLabel):(existingPort=new Port({pinNumber,name:primaryLabel,aliases:[...otherLabels,...opts.additionalAliases?.[`pin${pinNumber}`]??[]]},{originDescription:`pinLabels:pin${pinNumber}`}),portsToCreate.push(existingPort))}if(config.schematicSymbolName&&!opts.ignoreSymbolPorts){let sym=Vf[this._getSchematicSymbolNameOrThrow()];if(!sym)return;for(let symPort of sym.ports){let pinNumber=getPinNumberFromLabels(symPort.labels);if(!pinNumber)continue;let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===Number(pinNumber));if(existingPort)existingPort.schematicSymbolPortDef=symPort;else{let port=getPortFromHints(symPort.labels.concat(opts.additionalAliases?.[`pin${pinNumber}`]??[]));port&&(port.originDescription=`schematicSymbol:labels[0]:${symPort.labels[0]}`,port.schematicSymbolPortDef=symPort,portsToCreate.push(port))}}this.addAll(portsToCreate)}if(!this._getSchematicPortArrangement()){let hasReactSymbol=(0,import_react2.isValidElement)(this.props.symbol),symbolAlreadyAdded=this.children.some(c4=>c4.componentName==="Symbol");if(!(hasReactSymbol&&!symbolAlreadyAdded)){let portsFromFootprint=this.getPortsFromFootprint({...opts,collectInferredInternallyConnectedPins:!0}),existingPorts=this._getAllPortsFromChildren();for(let port of portsFromFootprint){if(!port._isPrimaryPort){portsToCreate.push(port);continue}let matchingPort=existingPorts.find(p4=>canMergePortDefinitions(p4,port))??portsToCreate.find(p4=>canMergePortDefinitions(p4,port));if(matchingPort){let mergedAliases=port.getNameAndAliases().filter(alias=>!matchingPort.getNameAndAliases().includes(alias));matchingPort.externallyAddedAliases.push(...mergedAliases)}else portsToCreate.push(port)}}}let requiredPinCount=opts.pinCount??this._getPrimaryPinCount()??0;for(let pn3=1;pn3<=requiredPinCount;pn3++){if(portsToCreate.find(p4=>p4._parsedProps.pinNumber===pn3))continue;if(!schPortArrangement){portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]}));continue}let explicitlyListedPinNumbersInSchPortArrangement=getPinsFromPortArrangement(schPortArrangement).map(pn22=>parsePinNumberFromLabelsOrThrow(pn22,this._parsedProps.pinLabels));["leftSize","rightSize","topSize","bottomSize","leftPinCount","rightPinCount","topPinCount","bottomPinCount"].some(key=>key in schPortArrangement)&&(explicitlyListedPinNumbersInSchPortArrangement=Array.from({length:this._getPrimaryPinCount()},(_4,i3)=>i3+1)),explicitlyListedPinNumbersInSchPortArrangement.includes(pn3)&&portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]},{originDescription:`notOtherwiseAddedButDeducedFromPinCount:${pn3}`}))}inferInternallyConnectedPinNamesFromPorts(Array.from(new Set([...this._getAllPortsFromChildren(),...portsToCreate])),this._inferredInternallyConnectedPinNames),portsToCreate.length>0&&this.addAll(portsToCreate)}_getImpliedFootprintString(){return null}_addChildrenFromStringFootprint(){let{pcbRotation,pinLabels,pcbPinLabels}=this.props,footprint=this._parsedProps.footprint??this.props.footprint;if(footprint??(footprint=this._getImpliedFootprintString?.()),!!footprint&&typeof footprint=="string"){if(isHttpUrl(footprint)||isStaticAssetPath(footprint)||parseLibraryFootprintRef(footprint))return;let fpCircuitJson;try{fpCircuitJson=fp.string(footprint).soup()}catch(error2){this._queueInvalidFootprintPropMessage(footprint,error2);return}let fpComponents=createComponentsFromCircuitJson({componentName:this.name??this.componentName,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},fpCircuitJson);this.addAll(fpComponents)}}get portMap(){return new Proxy({},{get:(target,prop)=>{let port=this.children.find(c4=>c4.componentName==="Port"&&c4.isMatchingNameOrAlias(prop));if(!port)throw new Error(`There was an issue finding the port "${prop.toString()}" inside of a ${this.componentName} component with name: "${this.props.name}". This is a bug in @tscircuit/core`);return port}})}getInstanceForReactElement(element){for(let subtree of this.reactSubtrees)if(subtree.element===element)return subtree.component;return null}doInitialSourceRender(){let ftype=this.config.sourceFtype;if(!ftype)return;let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype,name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,internallyConnectedSourcePortIds=this._getInternallyConnectedPins().map(ports=>ports.map(port=>port.source_port_id).filter(id2=>id2!==null)).filter(sourcePortIds=>sourcePortIds.length>=2);this.source_component_id&&internallyConnectedSourcePortIds.length>0&&db2.source_component.update(this.source_component_id,{internally_connected_source_port_ids:internallyConnectedSourcePortIds});for(let sourcePortIds of internallyConnectedSourcePortIds)db2.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root;if(this._invalidPinLabelMessages?.length&&this.root?.db)for(let message of this._invalidPinLabelMessages){let property_name="pinLabels",match2=message.match(/^Invalid pin label:\s*([^=]+)=\s*'([^']+)'/);match2&&(property_name=`pinLabels['${match2[2]}']`),this.root.db.source_property_ignored_warning.insert({source_component_id:this.source_component_id,property_name,message,error_type:"source_property_ignored_warning"})}this._parsedProps.schPinSpacing!==void 0&&this.root?.db&&this.root.db.source_property_ignored_warning.insert({source_component_id:this.source_component_id,property_name:"schPinSpacing",error_type:"source_property_ignored_warning",message:"schPinSpacing is deprecated and will be ignored. Pin spacing is always 0.2."});let{schematicSymbolName}=this.config,{_parsedProps:props}=this;props.symbol&&(0,import_react2.isValidElement)(props.symbol)?this._doInitialSchematicComponentRenderWithReactSymbol(props.symbol):schematicSymbolName?this._doInitialSchematicComponentRenderWithSymbol():this._getSchematicBoxDimensions()&&this._doInitialSchematicComponentRenderWithSchematicBoxDimensions();let manualPlacement=this.getSubcircuit()?._getSchematicManualPlacementForComponent(this);if(this.schematic_component_id&&(this.props.schX!==void 0||this.props.schY!==void 0)&&manualPlacement){if(!this.schematic_component_id)return;let warning=schematic_manual_edit_conflict_warning.parse({type:"schematic_manual_edit_conflict_warning",schematic_manual_edit_conflict_warning_id:`schematic_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. schX and schY will be used. Remove schX/schY or clear the manual placement.`,schematic_component_id:this.schematic_component_id,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db2.schematic_manual_edit_conflict_warning.insert(warning)}}_getSchematicSymbolDisplayValue(){}_getInternallyConnectedPins(){if(this.internallyConnectedPinNames.length===0)return[];let internallyConnectedPorts=[];for(let netPortNames of this.internallyConnectedPinNames){let ports=[];for(let portName of netPortNames)ports.push(this.portMap[portName]);internallyConnectedPorts.push(ports)}return internallyConnectedPorts}_doInitialSchematicComponentRenderWithSymbol(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,symbol_name=this._getSchematicSymbolNameOrThrow(),symbol=Vf[symbol_name],center2=this._getGlobalSchematicPositionBeforeLayout();if(symbol){let schematic_component22=db2.schematic_component.insert({center:center2,size:{...symbol.size},source_component_id:this.source_component_id,is_box_with_pins:!0,symbol_name,symbol_display_value:this._getSchematicSymbolDisplayValue()});this.schematic_component_id=schematic_component22.schematic_component_id}}_doInitialSchematicComponentRenderWithReactSymbol(symbolElement){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,center2=this._getGlobalSchematicPositionBeforeLayout(),schematic_component22=db2.schematic_component.insert({center:center2,size:{width:0,height:0},source_component_id:this.source_component_id,symbol_display_value:this._getSchematicSymbolDisplayValue(),is_box_with_pins:!1});this.schematic_component_id=schematic_component22.schematic_component_id}_doInitialSchematicComponentRenderWithSchematicBoxDimensions(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,dimensions=this._getSchematicBoxDimensions(),primaryPortLabels={};if(Array.isArray(props.pinLabels))props.pinLabels.forEach((label,index)=>{primaryPortLabels[String(index+1)]=label});else for(let[port,label]of Object.entries(props.pinLabels??{}))primaryPortLabels[port]=Array.isArray(label)?label[0]:label;let center2=this._getGlobalSchematicPositionBeforeLayout(),schPortArrangement=this._getSchematicPortArrangement(),schematic_component22=db2.schematic_component.insert({center:center2,rotation:props.schRotation??0,size:dimensions.getSize(),port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:.2,pin_styles:underscorifyPinStyles(props.schPinStyle,props.pinLabels),port_labels:primaryPortLabels,source_component_id:this.source_component_id}),hasTopOrBottomPins=schPortArrangement?.topSide!==void 0||schPortArrangement?.bottomSide!==void 0,schematic_box_width=dimensions?.getSize().width,schematic_box_height=dimensions?.getSize().height,manufacturer_part_number_schematic_text=db2.schematic_text.insert({text:props.manufacturerPartNumber??"",schematic_component_id:schematic_component22.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.35:center2.y-(schematic_box_height??0)/2-.13},color:"#006464",font_size:.18}),component_name_text=db2.schematic_text.insert({text:props.displayName??props.name??"",schematic_component_id:schematic_component22.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.55:center2.y+(schematic_box_height??0)/2+.13},color:"#006464",font_size:.18});this.schematic_component_id=schematic_component22.schematic_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let error2=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_component_invalid_layer_error.insert(error2)}let globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db2.pcb_component.insert({center:this._getGlobalPcbPositionBeforeLayout(),width:0,height:0,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(componentLayer,globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0}),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c4=>c4.componentName==="Footprint");if(!footprint&&!hasFootprintChild&&!this.isGroup){let footprint_error=db2.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}this.pcb_component_id=pcb_component3.pcb_component_id;let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if((this.props.pcbX!==void 0||this.props.pcbY!==void 0)&&manualPlacement){let warning=pcb_manual_edit_conflict_warning.parse({type:"pcb_manual_edit_conflict_warning",pcb_manual_edit_conflict_warning_id:`pcb_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. pcbX and pcbY will be used. Remove pcbX/pcbY or clear the manual placement.`,pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_manual_edit_conflict_warning.insert(warning)}}doInitialPcbComponentSizeCalculation(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db2}=this.root,bounds=getBoundsOfPcbComponents(this.children);if(bounds.width===0||bounds.height===0)return;let center2={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2};db2.pcb_component.update(this.pcb_component_id,{center:center2,width:bounds.width,height:bounds.height})}updatePcbComponentSizeCalculation(){this.doInitialPcbComponentSizeCalculation()}doInitialSchematicComponentSizeCalculation(){if(this.root?.schematicDisabled||!this.schematic_component_id)return;let{db:db2}=this.root;if(!db2.schematic_component.get(this.schematic_component_id))return;let schematicElements=[],collectSchematicPrimitives=children=>{for(let child of children){if(child.isSchematicPrimitive&&child.componentName==="SchematicLine"){let line2=db2.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicRect"){let rect=db2.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}if(child.isSchematicPrimitive&&child.componentName==="SchematicCircle"){let circle2=db2.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicArc"){let arc2=db2.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicText"){let text=db2.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}if(child.isSchematicPrimitive&&child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db2.schematic_path.get(pathId);path&&schematicElements.push(path)}}child.children&&child.children.length>0&&collectSchematicPrimitives(child.children)}};if(collectSchematicPrimitives(this.children),schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements),width=Math.abs(bounds.maxX-bounds.minX),height=Math.abs(bounds.maxY-bounds.minY);if(width===0&&height===0)return;let centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;db2.schematic_component.update(this.schematic_component_id,{center:{x:centerX,y:centerY},size:{width,height}})}updateSchematicComponentSizeCalculation(){this.doInitialSchematicComponentSizeCalculation()}doInitialPcbComponentAnchorAlignment(){NormalComponent_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}_renderReactSubtree(element){let component=createInstanceFromReactElement(element);return{element,component}}doInitialInitializePortsFromChildren(){this.initPorts()}updateInitializePortsFromChildren(){this.initPorts()}getGlobalTransformRotation(){let globalTransform=this._computePcbGlobalTransformBeforeLayout();return decomposeTSR2(globalTransform).rotation.angle*180/Math.PI}_getFootprintMetadataForPcbComponent(){let footprintChild=this.children.find(c4=>c4.componentName==="Footprint");if(footprintChild)return{insertionDirection:footprintChild._parsedProps.insertionDirection,originalLayer:footprintChild._parsedProps.originalLayer};let footprint=this.props.footprint;if((0,import_react2.isValidElement)(footprint)){let footprintProps2=footprint.props;return{insertionDirection:footprintProps2.insertionDirection,originalLayer:footprintProps2.originalLayer}}if(footprint?.componentName==="Footprint")return{insertionDirection:footprint._parsedProps?.insertionDirection??footprint.props?.insertionDirection,originalLayer:footprint._parsedProps?.originalLayer??footprint.props?.originalLayer}}_getPcbComponentInsertionDirection(componentLayer,rotationDegrees=this.getGlobalTransformRotation()){let footprintMetadata=this._getFootprintMetadataForPcbComponent();if(footprintMetadata?.insertionDirection)return transformFootprintInsertionDirection({insertionDirection:footprintMetadata.insertionDirection,rotationDegrees,isFlipped:isFootprintFlipped({componentLayer,originalLayer:footprintMetadata.originalLayer})})}doInitialReactSubtreesRender(){let fpElm=this.props.footprint;(0,import_react2.isValidElement)(fpElm)&&(this.children.some(c4=>c4.componentName==="Footprint")||this.add(fpElm));let symElm=this.props.symbol;(0,import_react2.isValidElement)(symElm)&&(this.children.some(c4=>c4.componentName==="Symbol")||this.add(symElm));let cmElm=this.props.cadModel;if((0,import_react2.isValidElement)(cmElm)){this._isCadModelChild=!0;let hasCadAssemblyChild=this.children.some(c4=>c4.componentName==="CadAssembly"),hasCadModelChild=this.children.some(c4=>c4.componentName==="CadModel");!hasCadAssemblyChild&&!hasCadModelChild&&this.add(cmElm)}}doInitialPcbFootprintStringRender(){NormalComponent_doInitialPcbFootprintStringRender(this,(name,effect)=>this._queueAsyncEffect(name,effect))}_getAllPortsFromChildren(){let ports=[],collectPorts=component=>{component.componentName==="Port"&&ports.push(component);for(let child of component.children)collectPorts(child)};for(let child of this.children)collectPorts(child);return ports}_hasExistingPortExactly(port1){return this._getAllPortsFromChildren().some(port2=>{let aliases1=port1.getNameAndAliases(),aliases2=port2.getNameAndAliases();return aliases1.length===aliases2.length&&aliases1.every(alias=>aliases2.includes(alias))})}_hasMatchingPort(port1){let existingPorts=this._getAllPortsFromChildren(),pinNumber1=port1._parsedProps.pinNumber;return pinNumber1===void 0?!1:existingPorts.some(port2=>port2._parsedProps.pinNumber===pinNumber1)}add(componentOrElm){let component;if((0,import_react2.isValidElement)(componentOrElm)){let subtree=this._renderReactSubtree(componentOrElm);this.reactSubtrees.push(subtree),component=subtree.component}else component=componentOrElm;if(component.componentName==="Port"){if(this._hasExistingPortExactly(component))return;if(this._hasMatchingPort(component)){debug32(`Skipping port ${component} because a matching port already exists`);return}}super.add(component)}getPortsFromFootprint(opts){let inferredInternallyConnectedPinNames;opts?.collectInferredInternallyConnectedPins&&(inferredInternallyConnectedPinNames=this._inferredInternallyConnectedPinNames);let primaryPortOpts={...opts,inferredInternallyConnectedPinNames},{footprint}=this.props;if(typeof footprint=="string"&&parseLibraryFootprintRef(footprint)&&this.children.some(c4=>c4.componentName==="Footprint")?footprint=this.children.find(c4=>c4.componentName==="Footprint"):(!footprint||(0,import_react2.isValidElement)(footprint))&&(footprint=this.children.find(c4=>c4.componentName==="Footprint")),typeof footprint=="string"){if(isHttpUrl(footprint))return[];if(isStaticAssetPath(footprint))return[];if(parseLibraryFootprintRef(footprint))return[];let fpCircuitJson;try{fpCircuitJson=fp.string(footprint).soup()}catch(error2){return this._queueInvalidFootprintPropMessage(footprint,error2),[]}return getPrimaryPortsFromPortHintGroups(fpCircuitJson.flatMap(elm=>"port_hints"in elm&&elm.port_hints?[{hints:elm.port_hints,originDescription:`footprint:string:${footprint}:port_hints[0]:${elm.port_hints[0]}`}]:[]),primaryPortOpts)}if(!(0,import_react2.isValidElement)(footprint)&&footprint&&footprint.componentName==="Footprint")return getPrimaryPortsFromPortHintGroups(footprint.children.flatMap(fpChild=>fpChild.props.portHints?[{hints:fpChild.props.portHints,originDescription:`footprint:${footprint}`,component:fpChild}]:[]),primaryPortOpts);let newPorts=[];if(!footprint){for(let child of this.children)if(child.props.portHints&&child.isPcbPrimitive){let port=getPortFromHints(child.props.portHints);port&&newPorts.push(port)}}return newPorts}_queueInvalidFootprintPropMessage(footprint,error2){let rawErrorMessage=error2 instanceof Error?error2.message:String(error2),isLikelyMissingLibraryPrefix=footprint.includes("/")&&!footprint.includes(":"),resolvedJlcpcbPartNumber=/^c\d+$/i.test(footprint)?`C${footprint.replace(/^c/i,"")}`:null,helpfulHint=isLikelyMissingLibraryPrefix?` If this is a KiCad footprint, use "kicad:${footprint}".`:resolvedJlcpcbPartNumber?` If this is a JLCPCB part number, use "jlcpcb:${resolvedJlcpcbPartNumber}".`:"",message=`Invalid footprint prop on ${this.getDisplayName()}: "${footprint}".${helpfulHint} Parser details: ${rawErrorMessage}`;this._invalidFootprintPropMessages.includes(message)||this._invalidFootprintPropMessages.push(message)}_insertInvalidFootprintPropErrors(){for(let message of this._invalidFootprintPropMessages)this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:"footprint",message,error_type:"source_invalid_component_property_error"});this._invalidFootprintPropMessages=[]}getPortsFromSchematicSymbol(){if(this.root?.schematicDisabled)return[];let{config}=this;if(!config.schematicSymbolName)return[];let symbol=Vf[config.schematicSymbolName];if(!symbol)return[];let newPorts=[];for(let symbolPort of symbol.ports){let port=getPortFromHints(symbolPort.labels);port&&(port.schematicSymbolPortDef=symbolPort,newPorts.push(port))}return newPorts}doInitialCreateNetsFromProps(){this._createNetsFromProps(this._getNetsFromConnectionsProp())}_getNetsFromConnectionsProp(){let{_parsedProps:props}=this,propsWithConnections=[];if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)propsWithConnections.push(String(targetPath))}return propsWithConnections}_createNetsFromProps(propsWithConnections){createNetsFromProps(this,propsWithConnections)}_getPcbCircuitJsonBounds(){let{db:db2}=this.root;if(!this.pcb_component_id)return super._getPcbCircuitJsonBounds();let pcb_component3=db2.pcb_component.get(this.pcb_component_id);return{center:{x:pcb_component3.center.x,y:pcb_component3.center.y},bounds:{left:pcb_component3.center.x-pcb_component3.width/2,top:pcb_component3.center.y-pcb_component3.height/2,right:pcb_component3.center.x+pcb_component3.width/2,bottom:pcb_component3.center.y+pcb_component3.height/2},width:pcb_component3.width,height:pcb_component3.height}}_getPinCountFromSchematicPortArrangement(){let schPortArrangement=this._getSchematicPortArrangement();if(!schPortArrangement)return 0;if(!isExplicitPinMappingArrangement(schPortArrangement))return(schPortArrangement.leftSize??schPortArrangement.leftPinCount??0)+(schPortArrangement.rightSize??schPortArrangement.rightPinCount??0)+(schPortArrangement.topSize??schPortArrangement.topPinCount??0)+(schPortArrangement.bottomSize??schPortArrangement.bottomPinCount??0);let pins=getPinsFromPortArrangement(schPortArrangement),maxPinNumber=0;for(let pin of pins){if(typeof pin=="number"){maxPinNumber=Math.max(maxPinNumber,pin);continue}let directPinNumber=getPinNumberFromPinLabelsKey(pin);if(directPinNumber!==null){maxPinNumber=Math.max(maxPinNumber,directPinNumber);continue}let pinLabels=this._parsedProps.pinLabels;pinLabels&&(maxPinNumber=Math.max(maxPinNumber,parsePinNumberFromLabelsOrThrow(pin,pinLabels)))}return Math.max(maxPinNumber,pins.length)}_getPrimaryPinCount(){if(this._getSchematicPortArrangement())return this._getPinCountFromSchematicPortArrangement();let portsFromFootprint=this.getPortsFromFootprint();if(portsFromFootprint.length>0)return portsFromFootprint.filter(port=>port._isPrimaryPort).length;let{pinLabels}=this._parsedProps;if(pinLabels){if(Array.isArray(pinLabels))return pinLabels.length;let pinNumbers=Object.keys(pinLabels).map(k4=>getPinNumberFromPinLabelsKey(k4)).filter(n4=>n4!==null&&!Number.isNaN(n4));return pinNumbers.length>0?Math.max(...pinNumbers):Object.keys(pinLabels).length}return 0}_getSchematicPortArrangement(){return this._parsedProps.schPinArrangement??this._parsedProps.schPortArrangement}_getPinLabelsFromPorts(){let ports=this.selectAll("port"),pinLabels={};for(let port of ports){let pinNumber=port.props.pinNumber;if(pinNumber!==void 0){let bestLabel=port._getBestDisplayPinLabel();bestLabel&&(pinLabels[`pin${pinNumber}`]=bestLabel)}}return pinLabels}_getSchematicBoxDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox&&!this._parsedProps?.showAsSchematicBox)return null;let{_parsedProps:props}=this,pinCount=this._getPrimaryPinCount(),pinSpacing=.2,allPinLabels={...this._getPinLabelsFromPorts(),...props.pinLabels};return getAllDimensionsForSchematicBox({schWidth:props.schWidth,schHeight:props.schHeight,schPinSpacing:pinSpacing,numericSchPinStyle:getNumericSchPinStyle(props.schPinStyle,allPinLabels),pinCount,schPortArrangement:this._getSchematicPortArrangement(),pinLabels:allPinLabels})}getFootprinterString(){return typeof this._parsedProps.footprint=="string"?this._parsedProps.footprint:null}doInitialCadModelRender(){if(this._isCadModelChild||this.props.doNotPlace)return;let{db:db2}=this.root,{boardThickness=0}=this._getBoard()??{},cadModelProp2=this._parsedProps.cadModel,cadModel=cadModelProp2===void 0?this._asyncFootprintCadModel:cadModelProp2,footprint=this.getFootprinterString()??this._getImpliedFootprintString();if(!this.pcb_component_id||cadModel===null)return;let bounds=this._getPcbCircuitJsonBounds();if(typeof cadModel=="string")throw new Error("String cadModel not yet implemented");let sourceRotationOffset=cadModel?.pcbRotationOffset??cadModel?.rotationOffset,rotationOffset=rotation32.parse({x:0,y:0,z:typeof sourceRotationOffset=="number"?sourceRotationOffset:0,...typeof sourceRotationOffset=="object"?sourceRotationOffset:{}}),positionOffset=point3.parse({x:0,y:0,z:0,...typeof cadModel?.positionOffset=="object"?cadModel.positionOffset:{}}),zOffsetFromSurface=cadModel&&typeof cadModel=="object"&&"zOffsetFromSurface"in cadModel&&cadModel.zOffsetFromSurface!==void 0?distance.parse(cadModel.zOffsetFromSurface):0,computedLayer=this.props.layer==="bottom"?"bottom":"top",pcbComponent=db2.pcb_component.get(this.pcb_component_id),globalTransform=this._computePcbGlobalTransformBeforeLayout(),preLayoutRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,totalRotation=pcbComponent?.position_mode==="packed"?pcbComponent.rotation??preLayoutRotation:preLayoutRotation,isBottomLayer=computedLayer==="bottom";if(!cadModel&&!footprint){let cad_component3=db2.cad_component.insert({position:{x:bounds.center.x,y:bounds.center.y,z:computedLayer==="bottom"?-boardThickness/2:boardThickness/2},rotation:{x:0,y:isBottomLayer?180:0,z:normalizeDegrees(isBottomLayer?-totalRotation:totalRotation)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",show_as_bounding_box:!0,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=cad_component3.cad_component_id;return}let rotationWithOffset=totalRotation+(rotationOffset.z??0),cadRotationZ=normalizeDegrees(rotationWithOffset),cad_model=db2.cad_component.insert({position:{x:bounds.center.x+positionOffset.x,y:bounds.center.y+positionOffset.y,z:(computedLayer==="bottom"?-boardThickness/2:boardThickness/2)+(computedLayer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+positionOffset.z},rotation:{x:rotationOffset.x,y:rotationOffset.y+(isBottomLayer?180:0),z:normalizeDegrees(isBottomLayer?-cadRotationZ:cadRotationZ)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_stl_url:"stlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stlUrl):void 0,model_obj_url:"objUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.objUrl):void 0,model_mtl_url:"mtlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.mtlUrl):void 0,model_gltf_url:"gltfUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.gltfUrl):void 0,model_glb_url:"glbUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.glbUrl):void 0,model_step_url:"stepUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stepUrl):void 0,model_wrl_url:"wrlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.wrlUrl):void 0,model_jscad:"jscad"in(cadModel??{})?cadModel.jscad:void 0,model_unit_to_mm_scale_factor:typeof cadModel?.modelUnitToMmScale=="number"?cadModel.modelUnitToMmScale:void 0,model_board_normal_direction:cadModel?.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:cadModel?.modelOriginPosition,footprinter_string:typeof footprint=="string"&&!cadModel?footprint:void 0,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=cad_model.cad_component_id}_addCachebustToModelUrl(url2){if(!url2||!url2.includes("modelcdn.tscircuit.com"))return url2;let origin=this.root?.getClientOrigin()??"";return`${url2}${url2.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}_getPartsEngineCacheKey(source_component,footprinterString){return JSON.stringify({ftype:source_component.ftype,name:source_component.name,manufacturer_part_number:source_component.manufacturer_part_number,footprinterString})}async _getSupplierPartNumbers(partsEngine2,source_component,footprinterString){if(this.props.doNotPlace)return{};let cacheEngine=this.root?.platform?.localCacheEngine,cacheKey=this._getPartsEngineCacheKey(source_component,footprinterString);if(cacheEngine){let cached=await cacheEngine.getItem(cacheKey);if(cached)try{return JSON.parse(cached)}catch{}}let result=await Promise.resolve(partsEngine2.findPart({sourceComponent:source_component,footprinterString}));if(typeof result=="string"){if(result.includes("<!DOCTYPE")||result.includes("<html"))throw new Error(`Failed to fetch supplier part numbers: Received HTML response instead of JSON. Response starts with: ${result.substring(0,100)}`);if(result==="Not found")return{};throw new Error(`Invalid supplier part numbers format: Expected object but got string: "${result}"`)}if(!result||Array.isArray(result)||typeof result!="object"){let actualType=result===null?"null":Array.isArray(result)?"array":typeof result;throw new Error(`Invalid supplier part numbers format: Expected object but got ${actualType}`)}let supplierPartNumbers=result;if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(supplierPartNumbers))}catch{}return supplierPartNumbers}doInitialPartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let partsEngine2=this.getInheritedProperty("partsEngine");if(!partsEngine2)return;let{db:db2}=this.root,source_component=db2.source_component.get(this.source_component_id);if(!source_component||source_component.supplier_part_numbers)return;let footprinterString;this.props.footprint&&typeof this.props.footprint=="string"&&(footprinterString=this.props.footprint);let supplierPartNumbersMaybePromise=this._getSupplierPartNumbers(partsEngine2,source_component,footprinterString);if(!(supplierPartNumbersMaybePromise instanceof Promise)){db2.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbersMaybePromise});return}this._queueAsyncEffect("get-supplier-part-numbers",async()=>{await supplierPartNumbersMaybePromise.then(supplierPartNumbers=>{this._asyncSupplierPartNumbers=supplierPartNumbers,this._markDirty("PartsEngineRender")}).catch(error2=>{this._asyncSupplierPartNumbers={};let errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier part numbers for ${this.getString()}: ${error2.message}`,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db2.unknown_error_finding_part.insert(errorObj),this._markDirty("PartsEngineRender")})})}updatePartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let{db:db2}=this.root,source_component=db2.source_component.get(this.source_component_id);if(source_component&&!source_component.supplier_part_numbers&&this._asyncSupplierPartNumbers){db2.source_component.update(this.source_component_id,{supplier_part_numbers:this._asyncSupplierPartNumbers});return}}doInitialSupplierFootprintMismatchWarning(){NormalComponent_doInitialSupplierFootprintMismatchWarning(this)}updateSupplierFootprintMismatchWarning(){this.doInitialSupplierFootprintMismatchWarning()}doInitialAssignFallbackProps(){let{_parsedProps:props}=this;props.connections&&!this.name&&(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}_createTracesFromConnectionsProp(){let{_parsedProps:props}=this;if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)this.add(new Trace3({from:`.${this.name} > .${pinName}`,to:String(targetPath)}))}}doInitialSourceDesignRuleChecks(){NormalComponent_doInitialSourceDesignRuleChecks(this)}doInitialSourceComponentPropertyValidation(){this._insertInvalidFootprintPropErrors()}doInitialValidatePcbCoordinates(){if(super.doInitialValidatePcbCoordinates(),this.root?.pcbDisabled)return;let props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=typeof rawProps.pcbLeftEdgeX=="string"?rawProps.pcbLeftEdgeX:props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=typeof rawProps.pcbRightEdgeX=="string"?rawProps.pcbRightEdgeX:props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=typeof rawProps.pcbTopEdgeY=="string"?rawProps.pcbTopEdgeY:props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=typeof rawProps.pcbBottomEdgeY=="string"?rawProps.pcbBottomEdgeY:props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0)&&(pcbLeftEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbLeftEdgeX,axis:"pcbX",propertyName:"pcbLeftEdgeX"}),pcbRightEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbRightEdgeX,axis:"pcbX",propertyName:"pcbRightEdgeX"}),pcbTopEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbTopEdgeY,axis:"pcbY",propertyName:"pcbTopEdgeY"}),pcbBottomEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbBottomEdgeY,axis:"pcbY",propertyName:"pcbBottomEdgeY"}))}doInitialPcbLayout(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db2}=this.root,props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;if(!(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0))return;if(pcbLeftEdgeX!==void 0&&pcbRightEdgeX!==void 0)throw new Error(`${this.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(pcbTopEdgeY!==void 0&&pcbBottomEdgeY!==void 0)throw new Error(`${this.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let pcbComponent=db2.pcb_component.get(this.pcb_component_id),componentWidth=pcbComponent?.width??0,componentHeight=pcbComponent?.height??0,positionedRelativeToGroupId=this.getGroup()?.pcb_group_id??void 0,positionedRelativeToBoardId=positionedRelativeToGroupId?void 0:this._getBoard()?.pcb_board_id??void 0,resolvedPcbX=this._resolvedPcbCalcOffsetX??(props.pcbX!==void 0?this._resolvePcbCoordinate(props.pcbX,"pcbX"):pcbLeftEdgeX!==void 0?this._resolvePcbCoordinate(pcbLeftEdgeX,"pcbX",{propertyName:"pcbLeftEdgeX"})+componentWidth/2:pcbRightEdgeX!==void 0?this._resolvePcbCoordinate(pcbRightEdgeX,"pcbX",{propertyName:"pcbRightEdgeX"})-componentWidth/2:void 0),resolvedPcbY=this._resolvedPcbCalcOffsetY??(props.pcbY!==void 0?this._resolvePcbCoordinate(props.pcbY,"pcbY"):pcbTopEdgeY!==void 0?this._resolvePcbCoordinate(pcbTopEdgeY,"pcbY",{propertyName:"pcbTopEdgeY"})-componentHeight/2:pcbBottomEdgeY!==void 0?this._resolvePcbCoordinate(pcbBottomEdgeY,"pcbY",{propertyName:"pcbBottomEdgeY"})+componentHeight/2:void 0);db2.pcb_component.update(this.pcb_component_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:positionedRelativeToGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:resolvedPcbX,display_offset_y:resolvedPcbY})}_getMinimumFlexContainerSize(){return NormalComponent__getMinimumFlexContainerSize(this)}_repositionOnPcb(position4){return NormalComponent__repositionOnPcb(this,position4)}doInitialSilkscreenOverlapAdjustment(){return NormalComponent_doInitialSilkscreenOverlapAdjustment(this)}isRelativelyPositioned(){let rawProps=this.props;return this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0||this._parsedProps.pcbLeftEdgeX!==void 0||this._parsedProps.pcbRightEdgeX!==void 0||this._parsedProps.pcbTopEdgeY!==void 0||this._parsedProps.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0}},getDescendantSubcircuitIds=(db2,root_subcircuit_id)=>{let groups=db2.source_group.list(),result=[],findDescendants=parentId=>{let children=groups.filter(group=>group.parent_subcircuit_id===parentId);for(let child of children)child.subcircuit_id&&(result.push(child.subcircuit_id),findDescendants(child.subcircuit_id))};return findDescendants(root_subcircuit_id),result},getBoardCenterFromAnchor=({boardAnchorPosition,boardAnchorAlignment,width,height})=>{let{x:ax3,y:ay3}=boardAnchorPosition,cx3=ax3,cy3=ay3;switch(boardAnchorAlignment){case"top_left":cx3=ax3+width/2,cy3=ay3-height/2;break;case"top_right":cx3=ax3-width/2,cy3=ay3-height/2;break;case"bottom_left":cx3=ax3+width/2,cy3=ay3+height/2;break;case"bottom_right":cx3=ax3-width/2,cy3=ay3+height/2;break;case"top":cx3=ax3,cy3=ay3-height/2;break;case"bottom":cx3=ax3,cy3=ay3+height/2;break;case"left":cx3=ax3+width/2,cy3=ay3;break;case"right":cx3=ax3-width/2,cy3=ay3;break;default:break}return{x:cx3,y:cy3}};function inflatePcbBoard(pcbBoard,inflatorContext){let{subcircuit}=inflatorContext;if(subcircuit.lowercaseComponentName==="board"||subcircuit.lowercaseComponentName==="mountedboard"||subcircuit.parent?.lowercaseComponentName==="board")return;let boardProps2={name:"inflated_board"};pcbBoard.width&&(boardProps2.width=pcbBoard.width),pcbBoard.height&&(boardProps2.height=pcbBoard.height),pcbBoard.center&&(boardProps2.pcbX=pcbBoard.center.x,boardProps2.pcbY=pcbBoard.center.y),pcbBoard.outline&&(boardProps2.outline=pcbBoard.outline),pcbBoard.thickness&&(boardProps2.thickness=pcbBoard.thickness),pcbBoard.material&&(boardProps2.material=pcbBoard.material);let board=new Board(boardProps2);return board.pcb_board_id=pcbBoard.pcb_board_id,subcircuit.add(board),board}var Capacitor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Capacitor",schematicSymbolName:this.props.polarized?"capacitor_polarized":this.props.symbolName??"capacitor",zodProps:capacitorProps,sourceFtype:FTYPE.simple_capacitor}}initPorts(){typeof this.props.footprint=="string"?super.initPorts({additionalAliases:{pin1:["anode","pos"],pin2:["cathode","neg"]}}):super.initPorts()}_getSchematicSymbolDisplayValue(){let inputCapacitance=this.props.capacitance,capacitanceDisplay=typeof inputCapacitance=="string"?inputCapacitance:`${formatSiUnit(this._parsedProps.capacitance)}F`;return this._parsedProps.schShowRatings&&this._parsedProps.maxVoltageRating?`${capacitanceDisplay}/${formatSiUnit(this._parsedProps.maxVoltageRating)}V`:capacitanceDisplay}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.decouplingFor,this.props.decouplingTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.decouplingFor&&this.props.decouplingTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.decouplingFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.decouplingTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_capacitor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,capacitance:props.capacitance,max_voltage_rating:props.maxVoltageRating,max_decoupling_trace_length:props.maxDecouplingTraceLength,display_capacitance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!props.polarized,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},extractPcbPrimitivesFromCircuitJson=({pcbComponent,db:db2,componentName})=>{let componentCenter=pcbComponent.center||{x:0,y:0},componentRotation=pcbComponent.rotation||0,absoluteToComponentRelativeTransform=inverse2(compose2(translate2(componentCenter.x,componentCenter.y),rotate2(componentRotation*Math.PI/180))),relativeElements=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===pcbComponent.pcb_component_id),clonedRelativeElements=structuredClone(relativeElements);return transformPCBElements(clonedRelativeElements,absoluteToComponentRelativeTransform),createComponentsFromCircuitJson({componentName,componentRotation:"0deg"},clonedRelativeElements)},inflateFootprintComponent=(pcbElm,inflatorContext)=>{let{injectionDb,normalComponent}=inflatorContext;if(!normalComponent)return null;let primitives=extractPcbPrimitivesFromCircuitJson({pcbComponent:pcbElm,db:injectionDb,componentName:normalComponent.name});if(primitives.length===0)return null;let footprint=new Footprint({originalLayer:pcbElm.layer});return footprint.addAll(primitives),footprint},getInflatedPcbPlacement=({pcbComponent,sourceGroupId,inflatorContext})=>{if(!pcbComponent?.center)return{pcbX:void 0,pcbY:void 0};if(sourceGroupId){let parentPcbGroup=inflatorContext.injectionDb.pcb_group.getWhere({source_group_id:sourceGroupId});if(parentPcbGroup?.anchor_position)return{pcbX:pcbComponent.center.x-parentPcbGroup.anchor_position.x,pcbY:pcbComponent.center.y-parentPcbGroup.anchor_position.y}}return{pcbX:pcbComponent.center.x,pcbY:pcbComponent.center.y}};function inflateSourceCapacitor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),capacitor=new Capacitor({name:sourceElm.name,capacitance:sourceElm.capacitance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:capacitor});footprint&&capacitor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(capacitor):subcircuit.add(capacitor)}var Chip=class extends NormalComponent3{constructor(props){super(props);__publicField(this,"schematicBoxDimensions",null)}get config(){return{componentName:"Chip",zodProps:chipProps,shouldRenderAsSchematicBox:!0}}initPorts(opts={}){super.initPorts(opts);let{_parsedProps:props}=this;if(props.externallyConnectedPins){let requiredPorts=new Set;for(let[pin1,pin2]of props.externallyConnectedPins)requiredPorts.add(pin1),requiredPorts.add(pin2);for(let pinIdentifier of requiredPorts)if(!this.children.find(child=>child instanceof Port&&child.isMatchingAnyOf([pinIdentifier]))){let pinMatch=pinIdentifier.match(/^pin(\d+)$/);if(pinMatch){let pinNumber=parseInt(pinMatch[1]);this.add(new Port({pinNumber,aliases:[pinIdentifier]}))}else this.add(new Port({name:pinIdentifier,aliases:[pinIdentifier]}))}}}doInitialSchematicComponentRender(){let{_parsedProps:props}=this;props?.noSchematicRepresentation!==!0&&super.doInitialSchematicComponentRender()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c4=>c4.componentName==="Footprint");if(!footprint&&!hasFootprintChild&&!this._hasStartedFootprintUrlLoad){let footprint_error=db2.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}let componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let subcircuit=this.getSubcircuit(),error2=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_component_invalid_layer_error.insert(error2)}let globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(componentLayer,globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,is_allowed_to_be_off_board:props.allowOffBoard??!1,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialCreateTracesFromProps(){let{_parsedProps:props}=this;if(props.externallyConnectedPins)for(let[pin1,pin2]of props.externallyConnectedPins)this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.${pin1}`,to:`${this.getSubcircuitSelector()} > port.${pin2}`}));this._createTracesFromConnectionsProp()}doInitialSimulationRender(){let{db:db2}=this.root,{pinAttributes}=this.props;if(!pinAttributes)return;let powerPort=null,groundPort=null,voltage3,ports=this.selectAll("port");for(let port of ports)for(let alias of port.getNameAndAliases())if(pinAttributes[alias]){let attributes2=pinAttributes[alias];attributes2.providesPower&&(powerPort=port,voltage3=attributes2.providesVoltage),attributes2.providesGround&&(groundPort=port)}if(!powerPort||!groundPort||voltage3===void 0)return;let powerSourcePort=db2.source_port.get(powerPort.source_port_id);if(!powerSourcePort?.subcircuit_connectivity_map_key)return;let groundSourcePort=db2.source_port.get(groundPort.source_port_id);if(!groundSourcePort?.subcircuit_connectivity_map_key)return;let powerNet=db2.source_net.getWhere({subcircuit_connectivity_map_key:powerSourcePort.subcircuit_connectivity_map_key}),groundNet=db2.source_net.getWhere({subcircuit_connectivity_map_key:groundSourcePort.subcircuit_connectivity_map_key});!powerNet||!groundNet||db2.simulation_voltage_source.insert({type:"simulation_voltage_source",positive_source_port_id:powerPort.source_port_id,positive_source_net_id:powerNet.source_net_id,negative_source_port_id:groundPort.source_port_id,negative_source_net_id:groundNet.source_net_id,voltage:voltage3})}},mapInternallyConnectedSourcePortIdsToPinLabels=(sourcePortIds,inflatorContext)=>{if(!sourcePortIds||sourcePortIds.length===0)return;let{injectionDb}=inflatorContext,mapped=sourcePortIds.map(group=>group.map(sourcePortId=>{let port=injectionDb.source_port.get(sourcePortId);return port?port.pin_number!==void 0&&port.pin_number!==null?`pin${port.pin_number}`:port.name:null}).filter(value=>value!==null)).filter(group=>group.length>0);return mapped.length>0?mapped:void 0},inflateSourceChip=(sourceElm,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),schematicElm=injectionDb.schematic_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),internallyConnectedPins=mapInternallyConnectedSourcePortIdsToPinLabels(sourceElm.internally_connected_source_port_ids,inflatorContext),footprinterString=cadElm?.footprinter_string??null,{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),chip=new Chip({name:sourceElm.name,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,pinLabels:schematicElm?.port_labels??void 0,schWidth:schematicElm?.size?.width,schHeight:schematicElm?.size?.height,schPinSpacing:schematicElm?.pin_spacing,schX:schematicElm?.center?.x,schY:schematicElm?.center?.y,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds,internallyConnectedPins});if(footprinterString&&(Object.assign(chip.props,{footprint:footprinterString}),Object.assign(chip._parsedProps,{footprint:footprinterString})),pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:chip});footprint&&chip.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(chip):subcircuit.add(chip)},Diode=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={schottky:"schottky_diode",avalanche:"avalanche_diode",zener:"zener_diode",photodiode:"photodiode"},variantSymbol=this.props.schottky?"schottky":this.props.avalanche?"avalanche":this.props.zener?"zener":this.props.photo?"photodiode":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"diode",componentName:"Diode",zodProps:diodeProps,sourceFtype:"simple_diode"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_diode",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceDiode(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),diode2=new Diode({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:diode2});footprint&&diode2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(diode2):subcircuit.add(diode2)}var SOLVERS={PackSolver2,AutoroutingPipelineSolver:Hz,AssignableAutoroutingPipeline2:ac2,AssignableAutoroutingPipeline3:_m2,AutoroutingPipeline1_OriginalUnravel:Oa2,AutoroutingPipelineSolver3_HgPortPointPathing:Am2,AutoroutingPipelineSolver4:Hz,AutoroutingPipelineSolver5:tj,CopperPourPipelineSolver},TscircuitAutorouter=class{constructor(input2,options={}){__publicField(this,"input");__publicField(this,"isRouting",!1);__publicField(this,"solver");__publicField(this,"eventHandlers",{complete:[],error:[],progress:[]});__publicField(this,"cycleCount",0);__publicField(this,"stepDelay");__publicField(this,"timeoutId");this.input=input2;let{capacityDepth,targetMinCapacity,stepDelay=0,useAssignableSolver=!1,useAutoJumperSolver=!1,autorouterVersion:autorouterVersion2,effort,onSolverStarted}=options,solverName;autorouterVersion2==="v1"?solverName="AutoroutingPipeline1_OriginalUnravel":autorouterVersion2==="v3"?solverName="AutoroutingPipelineSolver3_HgPortPointPathing":autorouterVersion2==="v4"||autorouterVersion2==="latest"?solverName="AutoroutingPipelineSolver4":autorouterVersion2==="v5"?solverName="AutoroutingPipelineSolver5":useAutoJumperSolver?solverName="AssignableAutoroutingPipeline3":useAssignableSolver?solverName="AssignableAutoroutingPipeline2":solverName="AutoroutingPipelineSolver4";let SolverClass=SOLVERS[solverName];this.solver=new SolverClass(input2,{capacityDepth,targetMinCapacity,cacheProvider:null,effort}),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:null,effort}}}),this.stepDelay=stepDelay}start(){this.isRouting||(this.isRouting=!0,this.cycleCount=0,this.runCycleAndQueueNextCycle())}async stepSolver(){if("stepAsync"in this.solver&&typeof this.solver.stepAsync=="function"){await this.solver.stepAsync();return}this.solver.step()}async runCycleAndQueueNextCycle(){if(this.isRouting)try{if(this.solver.solved||this.solver.failed){this.solver.failed?this.emitEvent({type:"error",error:new AutorouterError(this.solver.error||"Routing failed")}):this.emitEvent({type:"complete",traces:this.solver.getOutputSimpleRouteJson().traces||[]}),this.isRouting=!1;return}let startTime=Date.now(),startIterations=this.solver.iterations;for(;Date.now()-startTime<250&&!this.solver.failed&&!this.solver.solved;)await this.stepSolver();let iterationsPerSecond=(this.solver.iterations-startIterations)/(Date.now()-startTime)*1e3;this.cycleCount++;let debugGraphics=this.solver?.preview()||void 0,progress=this.solver.progress;this.emitEvent({type:"progress",steps:this.cycleCount,iterationsPerSecond,progress,phase:this.solver.getCurrentPhase(),debugGraphics}),this.stepDelay>0?this.timeoutId=setTimeout(()=>{this.runCycleAndQueueNextCycle()},this.stepDelay):this.timeoutId=setTimeout(()=>{this.runCycleAndQueueNextCycle()},0)}catch(error2){this.emitEvent({type:"error",error:error2 instanceof Error?new AutorouterError(error2.message):new AutorouterError(String(error2))}),this.isRouting=!1}}stop(){this.isRouting&&(this.isRouting=!1,this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0))}on(event,callback){event==="complete"?this.eventHandlers.complete.push(callback):event==="error"?this.eventHandlers.error.push(callback):event==="progress"&&this.eventHandlers.progress.push(callback)}emitEvent(event){if(event.type==="complete")for(let handler of this.eventHandlers.complete)handler(event);else if(event.type==="error")for(let handler of this.eventHandlers.error)handler(event);else if(event.type==="progress")for(let handler of this.eventHandlers.progress)handler(event)}solveSync(){if(this.solver.solve(),this.solver.failed)throw new AutorouterError(this.solver.error||"Routing failed");return this.solver.getOutputSimpleRouteJson().traces||[]}getConnectedOffboardObstacles(){return"getConnectedOffboardObstacles"in this.solver?this.solver.getConnectedOffboardObstacles():{}}},createSourceTracesFromOffboardConnections=({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id})=>{if(Object.keys(connectedOffboardObstacles).length===0)return;let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db2.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db2.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db2.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}let obstacleById=new Map;for(let obstacle of simpleRouteJson.obstacles)obstacle.obstacleId&&obstacleById.set(obstacle.obstacleId,obstacle);let connectionGroups=new Map;for(let[obstacleId,rootConnectionName]of Object.entries(connectedOffboardObstacles))connectionGroups.has(rootConnectionName)||connectionGroups.set(rootConnectionName,[]),connectionGroups.get(rootConnectionName).push(obstacleId);for(let[rootConnectionName,obstacleIds]of connectionGroups){let sourcePortIds=new Set;for(let obstacleId of obstacleIds){let obstacle=obstacleById.get(obstacleId);if(obstacle)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);sourcePortId&&sourcePortIds.add(sourcePortId)}}if(sourcePortIds.size<2)continue;let sourcePortIdArray=Array.from(sourcePortIds);db2.source_trace.list().some(trace=>{let tracePortIds=new Set(trace.connected_source_port_ids);return sourcePortIdArray.every(id2=>tracePortIds.has(id2))})||db2.source_trace.insert({connected_source_port_ids:sourcePortIdArray,connected_source_net_ids:[],subcircuit_id:subcircuit_id??void 0,display_name:`offboard_${rootConnectionName}`})}};function getPresetAutoroutingConfig(autorouterConfig2,platformConfig2){let defaults={serverUrl:"https://registry-api.tscircuit.com",serverMode:"job",serverCacheEnabled:!0};if(typeof autorouterConfig2=="object"&&!autorouterConfig2.preset)return{local:!(autorouterConfig2.serverUrl||autorouterConfig2.serverMode||autorouterConfig2.serverCacheEnabled),...defaults,...autorouterConfig2};let preset=typeof autorouterConfig2=="object"?autorouterConfig2.preset:autorouterConfig2,providedConfig=typeof autorouterConfig2=="object"?autorouterConfig2:{},normalizedPreset=typeof preset=="string"?preset.replace(/_/g,"-"):preset,platformAutorouter=normalizedPreset&&typeof normalizedPreset=="string"?platformConfig2?.autorouterMap?.[normalizedPreset]:void 0;if(platformAutorouter)return{local:!0,groupMode:"subcircuit",algorithmFn:async simpleRouteJson=>platformAutorouter.createAutorouter(simpleRouteJson)};switch(normalizedPreset){case"auto-local":return{local:!0,groupMode:"subcircuit"};case"sequential-trace":return{local:!0,groupMode:"sequential-trace"};case"subcircuit":return{local:!0,groupMode:"subcircuit"};case"auto-cloud":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!1,groupMode:"subcircuit",...defaults,...rest}}case"laser-prefab":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"laser_prefab",...rest}}case"auto-jumper":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"auto_jumper",...rest}}default:return{local:!0,groupMode:"subcircuit"}}}var applyPcbEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,pcb_placements:[...manualEditsFile.pcb_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let{pcb_component_id,new_center}=editEvent,pcb_component3=su2(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component3)continue;let source_component=su2(circuitJson).source_component.get(pcb_component3.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.pcb_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.pcb_placements.push(newPlacement)}return updatedManualEditsFile},applySchematicEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,schematic_placements:[...manualEditsFile.schematic_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_schematic_component_location"){let{schematic_component_id,new_center}=editEvent,schematic_component22=su2(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component22||!schematic_component22.source_component_id)continue;let source_component=su2(circuitJson).source_component.get(schematic_component22.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.schematic_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.schematic_placements.push(newPlacement)}return updatedManualEditsFile},applyEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let schematicEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_schematic_component_location"),pcbEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_pcb_component_location"),updatedManualEditsFile=manualEditsFile;return schematicEditEvents.length>0&&(updatedManualEditsFile=applySchematicEditEventsToManualEditsFile({circuitJson,editEvents:schematicEditEvents,manualEditsFile:updatedManualEditsFile})),pcbEditEvents.length>0&&(updatedManualEditsFile=applyPcbEditEventsToManualEditsFile({circuitJson,editEvents:pcbEditEvents,manualEditsFile:updatedManualEditsFile})),updatedManualEditsFile},applyTraceHintEditEvent=(circuitJson,edit_event)=>{if(su2(circuitJson).pcb_trace_hint.get(edit_event.pcb_trace_hint_id))circuitJson=circuitJson.map(e5=>e5.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e5,route:edit_event.route}:e5);else{let pcbPort=su2(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e5=>!(e5.type==="pcb_trace_hint"&&e5.pcb_port_id===edit_event.pcb_port_id)).concat([{type:"pcb_trace_hint",pcb_trace_hint_id:edit_event.pcb_trace_hint_id,route:edit_event.route,pcb_port_id:edit_event.pcb_port_id,pcb_component_id:pcbPort?.pcb_component_id}])}return circuitJson},applyEditEvents=({circuitJson,editEvents})=>{circuitJson=JSON.parse(JSON.stringify(circuitJson));for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let component=circuitJson.find(e5=>e5.type==="pcb_component"&&e5.pcb_component_id===editEvent.pcb_component_id);if((!component||component.center.x!==editEvent.new_center.x||component.center.y!==editEvent.new_center.y)&&editEvent.original_center){let mat=translate2(editEvent.new_center.x-editEvent.original_center.x,editEvent.new_center.y-editEvent.original_center.y);circuitJson=circuitJson.map(e5=>e5.pcb_component_id!==editEvent.pcb_component_id?e5:transformPCBElement(e5,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e5=>e5.type==="schematic_component"&&e5.schematic_component_id===editEvent.schematic_component_id?{...e5,center:editEvent.new_center}:e5):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},COPPER_POUR_RECT_HEIGHT=.5,dedupeStrings2=values=>Array.from(new Set(values.filter(value=>!!value))),getLayerName=layer=>typeof layer=="string"?layer:layer.name,createCopperPourObstacle=({layer,connectedTo,center:center2,width,height})=>({type:"rect",layers:[layer],center:center2,width,height,connectedTo,isCopperPour:!0}),getCopperPourBoundary=({outline,group,board})=>outline&&outline.length>=3?outline:group?.outline&&group.outline.length>=3?group.outline:board?.outline&&board.outline.length>=3?board.outline:null,getCopperPourBoundsRect=({group,board})=>group?.width&&group.height?{center:group.center,width:group.width,height:group.height}:board?.width&&board.height?{center:board.center,width:board.width,height:board.height}:null,getCopperPourConnectedTo=(net,connMap)=>dedupeStrings2([net.source_net_id,net.subcircuit_connectivity_map_key,net.source_net_id?connMap.getNetConnectedToId(net.source_net_id):null]),getUnbrokenCopperPourObstacles=({connMap,subcircuitComponent,board,group})=>{if(!subcircuitComponent)return[];let obstacles=[],copperPours=subcircuitComponent.selectAll("copperpour");for(let copperPour of copperPours){let props=copperPour._parsedProps;if(!props.unbroken)continue;let net=copperPour.getSubcircuit().selectOne(props.connectsTo);if(!net?.source_net_id)continue;let layer=getLayerName(props.layer),connectedTo=getCopperPourConnectedTo(net,connMap);if(connectedTo.length===0)continue;let boundary=getCopperPourBoundary({outline:props.outline,group,board});if(boundary){let rects=fillPolygonWithRects(boundary,{rectHeight:COPPER_POUR_RECT_HEIGHT});if(rects.length>0){obstacles.push(...rects.map(rect=>createCopperPourObstacle({layer,connectedTo,center:rect.center,width:rect.width,height:rect.height})));continue}}let boundsRect=getCopperPourBoundsRect({group,board});boundsRect&&obstacles.push(createCopperPourObstacle({layer,connectedTo,center:boundsRect.center,width:boundsRect.width,height:boundsRect.height}))}return obstacles},getSimpleRouteJsonFromCircuitJson=({db:db2,circuitJson,subcircuit_id,minTraceWidth,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaHoleDiameter,minViaPadDiameter,nominalTraceWidth,subcircuitComponent})=>{if(!db2&&circuitJson&&(db2=su2(circuitJson)),!db2)throw new Error("db or circuitJson is required");let traceHints=db2.pcb_trace_hint.list(),relevantSubcircuitIds=subcircuit_id?new Set([subcircuit_id]):null;if(subcircuit_id){let descendantSubcircuitIds=getDescendantSubcircuitIds(db2,subcircuit_id);for(let id2 of descendantSubcircuitIds)relevantSubcircuitIds.add(id2)}let subcircuitElements=(circuitJson??db2.toArray()).filter(e5=>!subcircuit_id||"subcircuit_id"in e5&&relevantSubcircuitIds.has(e5.subcircuit_id)),board=null;if(subcircuit_id){let source_group_id=subcircuit_id.replace(/^subcircuit_/,""),source_board3=db2.source_board.getWhere({source_group_id});source_board3&&(board=db2.pcb_board.getWhere({source_board_id:source_board3.source_board_id}))}board||(board=db2.pcb_board.list()[0]),db2=su2(subcircuitElements);let pcbGroup=subcircuit_id?db2.pcb_group.getWhere({subcircuit_id}):void 0,connMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),obstacles=getObstaclesFromCircuitJson2([...db2.pcb_component.list(),...db2.pcb_smtpad.list(),...db2.pcb_plated_hole.list(),...db2.pcb_hole.list(),...db2.pcb_via.list(),...db2.pcb_keepout.list(),...db2.pcb_cutout.list()].filter(e5=>!subcircuit_id||relevantSubcircuitIds?.has(e5.subcircuit_id)),connMap);obstacles.push(...getUnbrokenCopperPourObstacles({connMap,subcircuitComponent,board,group:pcbGroup}));for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id2=>connMap.getIdsConnectedToNet(id2));obstacle.connectedTo.push(...additionalIds)}let internalConnections=db2.source_component_internal_connection.list(),sourcePortIdToInternalConnectionId=new Map;for(let ic3 of internalConnections)for(let sourcePortId of ic3.source_port_ids)sourcePortIdToInternalConnectionId.set(sourcePortId,ic3.source_component_internal_connection_id);let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db2.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db2.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db2.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}for(let obstacle of obstacles)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);if(sourcePortId){let internalConnectionId=sourcePortIdToInternalConnectionId.get(sourcePortId);if(internalConnectionId){obstacle.offBoardConnectsTo=[internalConnectionId],obstacle.netIsAssignable=!0;break}}}let allPoints=obstacles.flatMap(o4=>[{x:o4.center.x-o4.width/2,y:o4.center.y-o4.height/2},{x:o4.center.x+o4.width/2,y:o4.center.y+o4.height/2}]).concat(board?.outline??[]),bounds;if(board&&!board.outline?bounds={minX:board.center.x-board.width/2,maxX:board.center.x+board.width/2,minY:board.center.y-board.height/2,maxY:board.center.y+board.height/2}:bounds={minX:Math.min(...allPoints.map(p4=>p4.x))-1,maxX:Math.max(...allPoints.map(p4=>p4.x))+1,minY:Math.min(...allPoints.map(p4=>p4.y))-1,maxY:Math.max(...allPoints.map(p4=>p4.y))+1},pcbGroup?.width&&pcbGroup.height){let groupBounds={minX:pcbGroup.center.x-pcbGroup.width/2,maxX:pcbGroup.center.x+pcbGroup.width/2,minY:pcbGroup.center.y-pcbGroup.height/2,maxY:pcbGroup.center.y+pcbGroup.height/2};bounds={minX:Math.min(bounds.minX,groupBounds.minX),maxX:Math.max(bounds.maxX,groupBounds.maxX),minY:Math.min(bounds.minY,groupBounds.minY),maxY:Math.max(bounds.maxY,groupBounds.maxY)}}let routedTraceIds=new Set(db2.pcb_trace.list().map(t52=>t52.source_trace_id).filter(id2=>!!id2)),directTraceConnections=db2.source_trace.list().filter(trace=>!routedTraceIds.has(trace.source_trace_id)).map(trace=>{let connectedPorts=trace.connected_source_port_ids.map(id2=>{let source_port3=db2.source_port.get(id2),pcb_port3=db2.pcb_port.getWhere({source_port_id:id2});return{...source_port3,...pcb_port3}});if(connectedPorts.length<2)return null;let[portA,portB]=connectedPorts;if(portA.x===void 0||portA.y===void 0)return console.error(`(source_port_id: ${portA.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;if(portB.x===void 0||portB.y===void 0)return console.error(`(source_port_id: ${portB.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let layerA=portA.layers?.[0]??"top",layerB=portB.layers?.[0]??"top",matchingHints=traceHints.filter(hint=>hint.pcb_port_id===portA.pcb_port_id||hint.pcb_port_id===portB.pcb_port_id),hintPoints=[];for(let hint of matchingHints){let layer=db2.pcb_port.get(hint.pcb_port_id)?.layers?.[0]??"top";for(let pt3 of hint.route)hintPoints.push({x:pt3.x,y:pt3.y,layer})}return{name:trace.source_trace_id??connMap.getNetConnectedToId(trace.source_trace_id)??"",source_trace_id:trace.source_trace_id,nominalTraceWidth:trace.min_trace_thickness,width:trace.min_trace_thickness,pointsToConnect:[{x:portA.x,y:portA.y,layer:layerA,pointId:portA.pcb_port_id,pcb_port_id:portA.pcb_port_id},...hintPoints,{x:portB.x,y:portB.y,layer:layerB,pointId:portB.pcb_port_id,pcb_port_id:portB.pcb_port_id}]}}).filter(c4=>c4!==null),directTraceConnectionsById=new Map(directTraceConnections.map(c4=>[c4.source_trace_id,c4])),source_nets=db2.source_net.list().filter(e5=>!subcircuit_id||relevantSubcircuitIds?.has(e5.subcircuit_id)),connectionsFromNets=[];for(let net of source_nets){let connectedSourceTraces=db2.source_trace.list().filter(st3=>st3.connected_source_net_ids?.includes(net.source_net_id)),nominalTraceWidthFromConnectedTraces;for(let sourceTrace of connectedSourceTraces)sourceTrace.min_trace_thickness!==void 0&&(nominalTraceWidthFromConnectedTraces=Math.max(nominalTraceWidthFromConnectedTraces??0,sourceTrace.min_trace_thickness));connectionsFromNets.push({name:net.source_net_id??connMap.getNetConnectedToId(net.source_net_id),nominalTraceWidth:nominalTraceWidthFromConnectedTraces,width:nominalTraceWidthFromConnectedTraces,pointsToConnect:connectedSourceTraces.flatMap(st3=>db2.pcb_port.list().filter(p4=>st3.connected_source_port_ids.includes(p4.source_port_id)).map(p4=>({x:p4.x,y:p4.y,layer:p4.layers?.[0]??"top",pointId:p4.pcb_port_id,pcb_port_id:p4.pcb_port_id})))})}let breakoutPoints=db2.pcb_breakout_point.list().filter(bp3=>!subcircuit_id||relevantSubcircuitIds?.has(bp3.subcircuit_id)),connectionsFromBreakoutPoints=[],breakoutTraceConnectionsById=new Map;for(let bp3 of breakoutPoints){let pt3={x:bp3.x,y:bp3.y,layer:"top"};if(bp3.source_trace_id){let conn=directTraceConnectionsById.get(bp3.source_trace_id)??breakoutTraceConnectionsById.get(bp3.source_trace_id);if(conn)conn.pointsToConnect.push(pt3);else{let newConn={name:bp3.source_trace_id,source_trace_id:bp3.source_trace_id,pointsToConnect:[pt3]};connectionsFromBreakoutPoints.push(newConn),breakoutTraceConnectionsById.set(bp3.source_trace_id,newConn)}}else if(bp3.source_net_id){let conn=connectionsFromNets.find(c4=>c4.name===bp3.source_net_id);conn?conn.pointsToConnect.push(pt3):connectionsFromBreakoutPoints.push({name:bp3.source_net_id,pointsToConnect:[pt3]})}else if(bp3.source_port_id){let pcb_port3=db2.pcb_port.getWhere({source_port_id:bp3.source_port_id});pcb_port3&&connectionsFromBreakoutPoints.push({name:bp3.source_port_id,source_trace_id:void 0,pointsToConnect:[{x:pcb_port3.x,y:pcb_port3.y,layer:pcb_port3.layers?.[0]??"top",pointId:pcb_port3.pcb_port_id,pcb_port_id:pcb_port3.pcb_port_id},pt3]})}}let allConns=[...directTraceConnections,...connectionsFromNets,...connectionsFromBreakoutPoints],pointIdToConn=new Map;for(let conn of allConns)for(let pt3 of conn.pointsToConnect)pt3.pointId&&pointIdToConn.set(pt3.pointId,conn);let existingTraces=db2.pcb_trace.list().filter(t52=>!subcircuit_id||relevantSubcircuitIds?.has(t52.subcircuit_id));for(let tr3 of existingTraces){let tracePortIds=new Set;for(let seg of tr3.route)seg.start_pcb_port_id&&tracePortIds.add(seg.start_pcb_port_id),seg.end_pcb_port_id&&tracePortIds.add(seg.end_pcb_port_id);if(tracePortIds.size<2)continue;let firstId=tracePortIds.values().next().value;if(!firstId)continue;let conn=pointIdToConn.get(firstId);conn&&[...tracePortIds].every(pid=>pointIdToConn.get(pid)===conn)&&(conn.externallyConnectedPointIds??(conn.externallyConnectedPointIds=[]),conn.externallyConnectedPointIds.push([...tracePortIds]))}let resolvedMinViaHoleDiameter=minViaHoleDiameter??board?.min_via_hole_diameter,resolvedMinViaPadDiameter=minViaPadDiameter??board?.min_via_pad_diameter,resolvedMinTraceToPadEdgeClearance=minTraceToPadEdgeClearance??board?.min_trace_to_pad_edge_clearance,resolvedMinViaEdgeToPadEdgeClearance=minViaEdgeToPadEdgeClearance??board?.min_via_edge_to_pad_edge_clearance,resolvedMinViaHoleEdgeToViaHoleEdgeClearance=minViaHoleEdgeToViaHoleEdgeClearance??board?.min_via_hole_edge_to_via_hole_edge_clearance,resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance=minPlatedHoleDrillEdgeToDrillEdgeClearance??board?.min_plated_hole_drill_edge_to_drill_edge_clearance,resolvedMinPadEdgeToPadEdgeClearance=minPadEdgeToPadEdgeClearance??board?.min_pad_edge_to_pad_edge_clearance,resolvedMinBoardEdgeClearance=minBoardEdgeClearance??board?.min_board_edge_clearance;return{simpleRouteJson:{bounds,obstacles,connections:allConns,layerCount:board?.num_layers??2,minTraceWidth:minTraceWidth??board?.min_trace_width??.1,minViaDiameter:resolvedMinViaPadDiameter,minViaHoleDiameter:resolvedMinViaHoleDiameter,minViaPadDiameter:resolvedMinViaPadDiameter,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,minTraceToPadEdgeClearance:resolvedMinTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance:resolvedMinViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance:resolvedMinViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance:resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance:resolvedMinPadEdgeToPadEdgeClearance,minBoardEdgeClearance:resolvedMinBoardEdgeClearance,nominalTraceWidth,outline:board?.outline?.map(point62=>({...point62}))},connMap}},unroutedElementTypes=new Set(["pcb_trace","pcb_trace_error"]),unrouteCircuitJson=circuitJson=>circuitJson.filter(element=>!unroutedElementTypes.has(element.type)),getPhaseTimingsFromRenderEvents=renderEvents=>{let phaseTimings={};if(!renderEvents)return phaseTimings;for(let renderPhase of orderedRenderPhases)phaseTimings[renderPhase]=0;let startEvents=new Map;for(let event of renderEvents){let[,,phase,eventType]=event.type.split(":");if(eventType==="start"){startEvents.set(`${phase}:${event.renderId}`,event);continue}if(eventType==="end"){let startEvent=startEvents.get(`${phase}:${event.renderId}`);if(startEvent){let duration=event.createdAt-startEvent.createdAt;phaseTimings[phase]=(phaseTimings[phase]||0)+duration}}}return phaseTimings},normalizePinLabels=inputPinLabels=>{let unqInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=unqInputPinLabels.map(()=>[]),desiredNumbers=unqInputPinLabels.map(()=>null);for(let i3=0;i3<unqInputPinLabels.length;i3++)for(let label of unqInputPinLabels[i3])if(/^\d+$/.test(label)){desiredNumbers[i3]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i3=0;i3<desiredNumbers.length;i3++){let desiredNumber=desiredNumbers[i3];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i3].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i3])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i3].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i3=0;i3<result.length;i3++)result[i3][0]?.includes("_alt")&&(highestPinNumber++,result[i3].unshift(`pin${highestPinNumber}`));for(let i3=0;i3<result.length;i3++)result[i3].length===0&&(highestPinNumber++,result[i3].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of unqInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i3=0;i3<unqInputPinLabels.length;i3++){let inputLabels=unqInputPinLabels[i3];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i3].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i3].push(`${label}${incrementalLabelCounts[label]}`)))}return result},TraceHint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"matchedPort",null)}get config(){return{componentName:"TraceHint",zodProps:traceHintProps}}doInitialPortMatching(){let{db:db2}=this.root,{_parsedProps:props,parent}=this;if(!parent)return;if(parent.componentName==="Trace"){this.renderError(`Port inference inside trace is not yet supported (${this})`);return}if(!parent)throw new Error("TraceHint has no parent");if(!props.for){this.renderError(`TraceHint has no for property (${this})`);return}let port=parent.selectOne(props.for,{type:"port"});port||this.renderError(`${this} could not find port for selector "${props.for}"`),this.matchedPort=port,port.registerMatch(this)}getPcbRouteHints(){let{_parsedProps:props}=this,offsets=props.offset?[props.offset]:props.offsets;if(!offsets)return[];let globalTransform=this._computePcbGlobalTransformBeforeLayout();return offsets.map(offset=>({...applyToPoint2(globalTransform,offset),via:offset.via,to_layer:offset.to_layer,trace_width:offset.trace_width}))}doInitialPcbTraceHintRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this;db2.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}},SUPPORTED_COMPONENT_FIELDS=new Set(["x","y","minx","maxx","miny","maxy","width","height"]);function Group_doInitialPcbCalcPlacementResolution(group){if(group.root?.pcbDisabled||!group.isSubcircuit)return;let{db:db2}=group.root,normalComponentNameMap=group.getNormalComponentNameMap?.()??new Map,allNormalComponents=collectNormalComponentsInSubcircuit(group),namedComponentVars={};for(let component of allNormalComponents)updateVarsForNamedComponent(component,namedComponentVars);let candidatesByName=new Map,inDegree=new Map,dependents=new Map;for(let component of allNormalComponents){if(!shouldResolvePlacementInCalcPhase(component))continue;let refs=getComponentRefsForCalcPlacement(component);if(!component.name)throw new Error(`Invalid pcb position expression for ${component.getString()}: component-relative calc requires the component to have a name`);candidatesByName.set(component.name,{component,refs}),inDegree.set(component.name,0)}for(let[candidateName,candidate]of candidatesByName.entries()){let referencedCandidateNames=new Set;for(let token of candidate.refs){let{referencePath,field}=parseComponentReferenceToken(token);if(!SUPPORTED_COMPONENT_FIELDS.has(field))throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unsupported component field "${field}" in "${token}"`);let referencedComponentName=resolveReferencedComponentName({token,referencePath,candidate,normalComponentNameMap});candidatesByName.has(referencedComponentName)&&referencedComponentName!==candidateName&&referencedCandidateNames.add(referencedComponentName)}for(let referencedComponentName of referencedCandidateNames)inDegree.set(candidateName,(inDegree.get(candidateName)??0)+1),dependents.has(referencedComponentName)||dependents.set(referencedComponentName,new Set),dependents.get(referencedComponentName).add(candidateName)}let queue=[...inDegree.entries()].filter(([,degree])=>degree===0).map(([name])=>name),resolvedCount=0;for(;queue.length>0;){let name=queue.shift(),candidate=candidatesByName.get(name);if(candidate){resolveCandidatePlacement(candidate.component,namedComponentVars),resolvedCount++;for(let dependentName of dependents.get(name)??[]){let nextDegree=(inDegree.get(dependentName)??0)-1;inDegree.set(dependentName,nextDegree),nextDegree===0&&queue.push(dependentName)}}}if(resolvedCount<candidatesByName.size){let unresolvedNames=[...candidatesByName.keys()].filter(name=>(inDegree.get(name)??0)>0);throw new Error(`Circular pcb position calc references detected among: ${unresolvedNames.join(", ")}`)}function resolveCandidatePlacement(component,componentVars){if(!component.pcb_component_id)return;let pcbComponent=db2.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY;if(rawPcbLeftEdgeX!==void 0&&rawPcbRightEdgeX!==void 0)throw new Error(`${component.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(rawPcbTopEdgeY!==void 0&&rawPcbBottomEdgeY!==void 0)throw new Error(`${component.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let componentWidth=pcbComponent.width??0,componentHeight=pcbComponent.height??0,nextCenter={x:pcbComponent.center.x,y:pcbComponent.center.y};if(rawPcbX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbLeftEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbLeftEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbLeftEdgeX"})+componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbRightEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbRightEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbRightEdgeX"})-componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}if(rawPcbY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbTopEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbTopEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbTopEdgeY"})-componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbBottomEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbBottomEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbBottomEdgeY"})+componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}component._repositionOnPcb(nextCenter),updateVarsForNamedComponent(component,componentVars)}}function shouldResolvePlacementInCalcPhase(component){let parsedProps=component._parsedProps,rawProps=component.props,pcbX=parsedProps.pcbX,pcbY=parsedProps.pcbY,pcbLeftEdgeX=parsedProps.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=parsedProps.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=parsedProps.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=parsedProps.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;return pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0?!0:typeof pcbX=="string"||typeof pcbY=="string"}function collectNormalComponentsInSubcircuit(group){let components=[],walk=node=>{node._isNormalComponent&&components.push(node);for(let child of node.children)child.isSubcircuit||walk(child)};for(let child of group.children)child.isSubcircuit||walk(child);return components}function getComponentRefsForCalcPlacement(component){let refs=new Set,rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY,addRefs=rawValue=>{if(typeof rawValue!="string")return;let identifiers=extractCalcIdentifiers(rawValue);for(let identifier of identifiers)identifier.startsWith("board.")||refs.add(identifier)};return addRefs(rawPcbX),addRefs(rawPcbY),addRefs(rawPcbLeftEdgeX),addRefs(rawPcbRightEdgeX),addRefs(rawPcbTopEdgeY),addRefs(rawPcbBottomEdgeY),refs}function parseComponentReferenceToken(token){let dotIndex=token.lastIndexOf(".");if(dotIndex<=0||dotIndex===token.length-1)throw new Error(`Invalid component reference token: "${token}"`);return{referencePath:token.slice(0,dotIndex),field:token.slice(dotIndex+1).toLowerCase()}}function resolveReferencedComponentName(params){let{token,referencePath,candidate,normalComponentNameMap}=params,directComponents=normalComponentNameMap.get(referencePath);if(directComponents&&directComponents.length>0){if(directComponents.length>1)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: ambiguous component reference "${referencePath}" in "${token}"`);return referencePath}let bestMatch=null;for(let componentName of normalComponentNameMap.keys())referencePath.startsWith(`${componentName}.`)&&(!bestMatch||componentName.length>bestMatch.length)&&(bestMatch=componentName);if(!bestMatch)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unknown component reference "${referencePath}" in "${token}"`);return bestMatch}function updateVarsForNamedComponent(component,vars){if(!component.name||!component.pcb_component_id||!component.root)return;let pcbComponent=component.root.db.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let width=pcbComponent.width??0,height=pcbComponent.height??0,x4=pcbComponent.center.x,y4=pcbComponent.center.y;setSubcircuitPcbComponentCalcVariables({vars,componentName:component.name,position:{x:x4,y:y4},size:{width,height}});let padElementsByReference=collectPadElementsByReference(component);for(let[referencePath,elements]of padElementsByReference.entries()){let bounds=getBoundsOfPcbElements(elements),minX=bounds.minX,maxX=bounds.maxX,minY=bounds.minY,maxY=bounds.maxY;vars[`${referencePath}.x`]=(minX+maxX)/2,vars[`${referencePath}.y`]=(minY+maxY)/2,vars[`${referencePath}.width`]=maxX-minX,vars[`${referencePath}.height`]=maxY-minY,vars[`${referencePath}.minX`]=minX,vars[`${referencePath}.maxX`]=maxX,vars[`${referencePath}.minY`]=minY,vars[`${referencePath}.maxY`]=maxY}}function collectPadElementsByReference(component){let refsToElements=new Map;if(!component.name||!component.pcb_component_id||!component.root)return refsToElements;let{db:db2}=component.root,padElements=[...db2.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db2.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})];for(let pad2 of padElements){let aliases2=new Set;for(let hint of pad2.port_hints??[])typeof hint=="string"&&hint.length>0&&aliases2.add(hint);let pcbPortId=pad2.pcb_port_id;if(pcbPortId){let pcbPort=db2.pcb_port.get(pcbPortId),sourcePort=pcbPort?.source_port_id?db2.source_port.get(pcbPort.source_port_id):null;sourcePort?.name&&aliases2.add(sourcePort.name),sourcePort?.pin_number!=null&&aliases2.add(`pin${sourcePort.pin_number}`)}for(let alias of aliases2){let referencePath=`${component.name}.${alias}`;refsToElements.has(referencePath)||refsToElements.set(referencePath,[]),refsToElements.get(referencePath).push(pad2)}}return refsToElements}function Group_doInitialPcbComponentAnchorAlignment(group){if(group.root?.pcbDisabled||!group.pcb_group_id)return;let pcbPositionAnchor=group._parsedProps?.pcbPositionAnchor;if(!pcbPositionAnchor)return;let targetPosition=group._getGlobalPcbPositionBeforeLayout(),{pcbX,pcbY}=group._parsedProps;if(pcbX===void 0&&pcbY===void 0)return;let{db:db2}=group.root,pcbGroup=db2.pcb_group.get(group.pcb_group_id);if(!pcbGroup)return;let width=pcbGroup.width,height=pcbGroup.height,{center:center2}=pcbGroup;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds2=getBoundsFromPoints(pcbGroup.outline);bounds2&&(width=bounds2.maxX-bounds2.minX,height=bounds2.maxY-bounds2.minY)}if(!width||!height)return;let bounds={left:center2.x-width/2,right:center2.x+width/2,top:center2.y+height/2,bottom:center2.y-height/2},currentCenter={...center2},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor))switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:bounds.left,y:bounds.top};break;case"top_center":anchorPos={x:currentCenter.x,y:bounds.top};break;case"top_right":anchorPos={x:bounds.right,y:bounds.top};break;case"center_left":anchorPos={x:bounds.left,y:currentCenter.y};break;case"center_right":anchorPos={x:bounds.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:bounds.left,y:bounds.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:bounds.bottom};break;case"bottom_right":anchorPos={x:bounds.right,y:bounds.bottom};break}if(!anchorPos)return;let newCenter={...currentCenter};targetPosition.x!==void 0&&(newCenter.x+=targetPosition.x-anchorPos.x),targetPosition.y!==void 0&&(newCenter.y+=targetPosition.y-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&(group._repositionOnPcb(newCenter),db2.pcb_group.update(group.pcb_group_id,{center:newCenter})),db2.pcb_group.update(group.pcb_group_id,{anchor_position:targetPosition,anchor_alignment:pcbPositionAnchor,display_offset_x:pcbX,display_offset_y:pcbY})}var Group_doInitialPcbLayoutFlex=group=>{let{db:db2}=group.root,{_parsedProps:props}=group,pcbChildren=group.children.filter(c4=>c4.pcb_component_id||c4.pcb_group_id);if(pcbChildren.some(child=>{let childProps=child._parsedProps;return childProps?.pcbX!==void 0||childProps?.pcbY!==void 0}))return;let rawJustify=props.pcbJustifyContent??props.justifyContent,rawAlign=props.pcbAlignItems??props.alignItems,rawGap=props.pcbFlexGap??props.pcbGap??props.gap,direction2=props.pcbFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.pcbWidth??void 0,height=props.height??props.pcbHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(pcbChildren.map(child=>child._getMinimumFlexContainerSize()).filter(size3=>size3!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of pcbChildren){let size3=child._getMinimumFlexContainerSize();flexBox.addChild({metadata:child,width:size3?.width??0,height:size3?.height??0,flexBasis:size3?direction2==="row"?size3.width:size3.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let groupCenter=group._getGlobalPcbPositionBeforeLayout(),offset={x:groupCenter.x-(bounds.maxX+bounds.minX)/2,y:groupCenter.y-(bounds.maxY+bounds.minY)/2};for(let child of flexBox.children)child.metadata._repositionOnPcb({x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y});db2.pcb_group.update(group.pcb_group_id,{width:bounds.width,height:bounds.height,center:groupCenter})},MIN_GAP=1;function Group_doInitialPcbLayoutGrid(group){let{db:db2}=group.root,props=group._parsedProps,pcbChildren=getPcbChildren(group);if(pcbChildren.length===0)return;let childDimensions=calculateChildDimensions({db:db2,pcbChildren}),gridConfig=parseGridConfiguration(props),gridLayout=createGridLayout({props,pcbChildren,childDimensions,gridConfig}),cssGrid=createCssGrid({pcbChildren,childDimensions,gridLayout,gridConfig}),{itemCoordinates}=cssGrid.layout();positionChildren({db:db2,group,pcbChildren,itemCoordinates,gridLayout}),updateGroupDimensions({db:db2,group,props,gridLayout})}function getPcbChildren(group){return group.children.filter(child=>child.pcb_component_id||child.pcb_group_id)}function calculateChildDimensions(params){let{db:db2,pcbChildren}=params,maxWidth=0,maxHeight=0;for(let child of pcbChildren){let width=0,height=0;if(child.pcb_group_id){let pcbGroup=db2.pcb_group.get(child.pcb_group_id);width=pcbGroup?.width??0,height=pcbGroup?.height??0}else if(child.pcb_component_id){let pcbComp=db2.pcb_component.get(child.pcb_component_id);width=pcbComp?.width??0,height=pcbComp?.height??0}maxWidth=Math.max(maxWidth,width),maxHeight=Math.max(maxHeight,height)}return{width:maxWidth,height:maxHeight}}function parseGridConfiguration(props){let cols=props.pcbGridCols??props.gridCols??props.pcbLayout?.grid?.cols,rows=props.pcbGridRows??props.pcbLayout?.grid?.rows,templateColumns=props.pcbGridTemplateColumns,templateRows=props.pcbGridTemplateRows,parseGap=gapValue=>gapValue===void 0?MIN_GAP:typeof gapValue=="number"?gapValue:length.parse(gapValue),gridGapOption=props.pcbGridGap??props.gridGap??props.pcbLayout?.gridGap,rowGapOption=props.pcbGridRowGap??props.gridRowGap??props.pcbLayout?.gridRowGap,colGapOption=props.pcbGridColumnGap??props.gridColumnGap??props.pcbLayout?.gridColumnGap,gapX=MIN_GAP,gapY=MIN_GAP;if(rowGapOption!==void 0||colGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"?gridGapOption?.x:gridGapOption,fallbackY=typeof gridGapOption=="object"?gridGapOption?.y:gridGapOption;gapX=parseGap(colGapOption??fallbackX),gapY=parseGap(rowGapOption??fallbackY)}else if(typeof gridGapOption=="object"&&gridGapOption!==null)gapX=parseGap(gridGapOption.x),gapY=parseGap(gridGapOption.y);else{let gap=parseGap(gridGapOption);gapX=gap,gapY=gap}return{cols,rows,gapX,gapY,templateColumns,templateRows}}function createGridLayout(params){let{props,pcbChildren,childDimensions,gridConfig}=params;return props.pcbGridTemplateColumns||props.pcbGridTemplateRows?createTemplateBasedLayout({props,gridConfig,pcbChildren,childDimensions}):createDefaultLayout({gridConfig,pcbChildren,childDimensions})}function createTemplateBasedLayout(params){let{props,gridConfig,pcbChildren,childDimensions}=params,gridTemplateColumns=props.pcbGridTemplateColumns??"",gridTemplateRows=props.pcbGridTemplateRows??"",extractRepeatCount=template=>{let match2=template.match(/repeat\((\d+),/);return match2?parseInt(match2[1]):Math.ceil(Math.sqrt(pcbChildren.length))},numCols=props.pcbGridTemplateColumns?extractRepeatCount(gridTemplateColumns):Math.ceil(Math.sqrt(pcbChildren.length)),numRows=props.pcbGridTemplateRows?extractRepeatCount(gridTemplateRows):Math.ceil(pcbChildren.length/numCols),containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createDefaultLayout(params){let{gridConfig,pcbChildren,childDimensions}=params,numCols,numRows;gridConfig.cols!==void 0&&gridConfig.rows!==void 0?(numCols=gridConfig.cols,numRows=gridConfig.rows):gridConfig.cols!==void 0?(numCols=gridConfig.cols,numRows=Math.ceil(pcbChildren.length/numCols)):gridConfig.rows!==void 0?(numRows=gridConfig.rows,numCols=Math.ceil(pcbChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(pcbChildren.length)),numRows=Math.ceil(pcbChildren.length/numCols)),numCols=Math.max(1,numCols),numRows=Math.max(1,numRows);let containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY,gridTemplateColumns=`repeat(${numCols}, ${childDimensions.width}px)`,gridTemplateRows=`repeat(${numRows}, ${childDimensions.height}px)`;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createCssGrid(params){let{pcbChildren,childDimensions,gridLayout,gridConfig}=params,gridChildren=pcbChildren.map((child,index)=>({key:child.getString()||`child-${index}`,contentWidth:childDimensions.width,contentHeight:childDimensions.height}));return new CssGrid({containerWidth:gridLayout.containerWidth,containerHeight:gridLayout.containerHeight,gridTemplateColumns:gridLayout.gridTemplateColumns,gridTemplateRows:gridLayout.gridTemplateRows,gap:[gridConfig.gapY,gridConfig.gapX],children:gridChildren})}function positionChildren(params){let{db:db2,group,pcbChildren,itemCoordinates,gridLayout}=params,groupCenter=group._getGlobalPcbPositionBeforeLayout(),allCircuitJson=db2.toArray();for(let i3=0;i3<pcbChildren.length;i3++){let child=pcbChildren[i3],childKey=child.getString()||`child-${i3}`,coordinates=itemCoordinates[childKey];if(!coordinates){console.warn(`PCB grid layout: No coordinates found for child ${childKey}`);continue}let targetX=groupCenter.x-gridLayout.containerWidth/2+coordinates.x+coordinates.width/2,targetY=groupCenter.y+gridLayout.containerHeight/2-coordinates.y-coordinates.height/2;if(child.pcb_component_id)repositionPcbComponentTo(allCircuitJson,child.pcb_component_id,{x:targetX,y:targetY});else{let groupChild=child;groupChild.pcb_group_id&&groupChild.source_group_id&&repositionPcbGroupTo(allCircuitJson,groupChild.source_group_id,{x:targetX,y:targetY})}}}function updateGroupDimensions(params){let{db:db2,group,props,gridLayout}=params;if(group.pcb_group_id){let groupCenter=group._getGlobalPcbPositionBeforeLayout();db2.pcb_group.update(group.pcb_group_id,{width:props.width??gridLayout.containerWidth,height:props.height??gridLayout.containerHeight,center:groupCenter})}}var applyComponentConstraintClusters=(group,packInput)=>{let constraints=group.children.filter(c4=>c4.componentName==="Constraint"&&c4._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x4=>(parent[x4]!==x4&&(parent[x4]=find2(parent[x4])),parent[x4]),union2=(a3,b3)=>{let ra3=find2(a3),rb2=find2(b3);ra3!==rb2&&(parent[rb2]=ra3)},makeSet=x4=>{x4 in parent||(parent[x4]=x4)},getIdFromSelector=sel2=>{let name=sel2.startsWith(".")?sel2.slice(1):sel2;return group.children.find(c4=>c4.name===name)?.pcb_component_id??void 0};for(let constraint of constraints){let props=constraint._parsedProps;if("left"in props&&"right"in props){let a3=getIdFromSelector(props.left),b3=getIdFromSelector(props.right);a3&&b3&&(makeSet(a3),makeSet(b3),union2(a3,b3))}else if("top"in props&&"bottom"in props){let a3=getIdFromSelector(props.top),b3=getIdFromSelector(props.bottom);a3&&b3&&(makeSet(a3),makeSet(b3),union2(a3,b3))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s3=>getIdFromSelector(s3)).filter(s3=>!!s3);for(let id2 of ids)makeSet(id2);for(let i3=1;i3<ids.length;i3++)union2(ids[0],ids[i3])}}for(let id2 of Object.keys(parent)){let rootId=find2(id2);clusterByRoot.has(rootId)||clusterByRoot.set(rootId,{componentIds:[],constraints:[]}),clusterByRoot.get(rootId).componentIds.push(id2)}for(let constraint of constraints){let props=constraint._parsedProps,compId;if("left"in props?compId=getIdFromSelector(props.left):"top"in props?compId=getIdFromSelector(props.top):"for"in props&&(compId=getIdFromSelector(props.for[0])),!compId)continue;let root=find2(compId);clusterByRoot.get(root)?.constraints.push(constraint)}let clusterMap={},packCompById=Object.fromEntries(packInput.components.map(c4=>[c4.componentId,c4]));for(let[rootId,info]of clusterByRoot.entries()){if(info.componentIds.length<=1)continue;let solver=new Solver,kVars={},getVar=(id2,axis)=>{let key=`${id2}_${axis}`;return kVars[key]||(kVars[key]=new Variable(key)),kVars[key]},anchor=info.componentIds[0];solver.addConstraint(new Constraint(getVar(anchor,"x"),Operator.Eq,0,Strength.required)),solver.addConstraint(new Constraint(getVar(anchor,"y"),Operator.Eq,0,Strength.required));for(let constraint of info.constraints){let props=constraint._parsedProps;if("xDist"in props){let left=getIdFromSelector(props.left),right=getIdFromSelector(props.right);left&&right&&solver.addConstraint(new Constraint(new Expression(getVar(right,"x"),[-1,getVar(left,"x")]),Operator.Eq,props.xDist,Strength.required))}else if("yDist"in props){let top=getIdFromSelector(props.top),bottom=getIdFromSelector(props.bottom);top&&bottom&&solver.addConstraint(new Constraint(new Expression(getVar(top,"y"),[-1,getVar(bottom,"y")]),Operator.Eq,props.yDist,Strength.required))}else if("sameX"in props&&Array.isArray(props.for)){let ids=props.for.map(s3=>getIdFromSelector(s3)).filter(s3=>!!s3);if(ids.length>1){let base=getVar(ids[0],"x");for(let i3=1;i3<ids.length;i3++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i3],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s3=>getIdFromSelector(s3)).filter(s3=>!!s3);if(ids.length>1){let base=getVar(ids[0],"y");for(let i3=1;i3<ids.length;i3++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i3],"y"),[-1,base]),Operator.Eq,0,Strength.required))}}}solver.updateVariables();let positions={};for(let id2 of info.componentIds)positions[id2]={x:getVar(id2,"x").value(),y:getVar(id2,"y").value()};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp)for(let pad2 of comp.pads){let ax3=pos.x+pad2.offset.x,ay3=pos.y+pad2.offset.y;minX=Math.min(minX,ax3-pad2.size.x/2),maxX=Math.max(maxX,ax3+pad2.size.x/2),minY=Math.min(minY,ay3-pad2.size.y/2),maxY=Math.max(maxY,ay3+pad2.size.y/2)}}let clusterCenter={x:(minX+maxX)/2,y:(minY+maxY)/2},mergedPads=[],relCenters={};for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp){relCenters[id2]={x:pos.x-clusterCenter.x,y:pos.y-clusterCenter.y};for(let pad2 of comp.pads)mergedPads.push({padId:pad2.padId,networkId:pad2.networkId,type:pad2.type,size:pad2.size,offset:{x:pos.x+pad2.offset.x-clusterCenter.x,y:pos.y+pad2.offset.y-clusterCenter.y}})}}packInput.components=packInput.components.filter(c4=>!info.componentIds.includes(c4.componentId)),packInput.components.push({componentId:info.componentIds[0],pads:mergedPads,availableRotationDegrees:[0]}),info.relativeCenters=relCenters,clusterMap[info.componentIds[0]]=info}return clusterMap},updateCadRotation=({db:db2,pcbComponentId,rotationDegrees,layer})=>{if(rotationDegrees==null||!db2?.cad_component?.list)return;let cadComponent=db2.cad_component.getWhere({pcb_component_id:pcbComponentId});if(!cadComponent)return;let delta=layer?.toLowerCase?.()==="bottom"?-rotationDegrees:rotationDegrees,currentRotationZ=cadComponent.rotation?.z??0,nextRotation={...cadComponent.rotation??{x:0,y:0,z:0},z:normalizeDegrees(currentRotationZ+delta)};db2.cad_component.update(cadComponent.cad_component_id,{rotation:nextRotation}),cadComponent.rotation=nextRotation},isDescendantGroup=(db2,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group=db2.source_group.get(groupId);return!group||!group.parent_source_group_id?!1:isDescendantGroup(db2,group.parent_source_group_id,ancestorId)},applyPackOutput=(group,packOutput,clusterMap)=>{let{db:db2}=group.root;for(let packedComponent of packOutput.components){let{center:center2,componentId,ccwRotationOffset,ccwRotationDegrees}=packedComponent,cluster=clusterMap[componentId];if(cluster){let rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,angleRad=rotationDegrees2*Math.PI/180;for(let memberId of cluster.componentIds){let rel=cluster.relativeCenters[memberId];if(!rel)continue;db2.pcb_component.update(memberId,{position_mode:"packed"});let rotatedRel={x:rel.x*Math.cos(angleRad)-rel.y*Math.sin(angleRad),y:rel.x*Math.sin(angleRad)+rel.y*Math.cos(angleRad)},member=db2.pcb_component.get(memberId);if(!member)continue;let originalCenter2=member.center,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x+rotatedRel.x,center2.y+rotatedRel.y),rotate2(angleRad),translate2(-originalCenter2.x,-originalCenter2.y)),related=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===memberId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db2,pcbComponentId:memberId,rotationDegrees:rotationDegrees2,layer:member.layer})}continue}let pcbComponent=db2.pcb_component.get(componentId);if(pcbComponent){db2.pcb_component.update(componentId,{position_mode:"packed"});let currentGroupId=group.source_group_id,componentGroupId=db2.source_component.get(pcbComponent.source_component_id)?.source_group_id;if(componentGroupId!==void 0&&!isDescendantGroup(db2,componentGroupId,currentGroupId))continue;let originalCenter2=pcbComponent.center,rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees2*Math.PI/180),translate2(-originalCenter2.x,-originalCenter2.y)),related=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===componentId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db2,pcbComponentId:componentId,rotationDegrees:rotationDegrees2,layer:pcbComponent.layer});continue}let pcbGroup=db2.pcb_group.list().find(g6=>g6.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=pcbGroup.center,rotationDegrees=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees*Math.PI/180),translate2(-originalCenter.x,-originalCenter.y)),relatedElements=db2.toArray().filter(elm=>{if("source_group_id"in elm&&elm.source_group_id&&(elm.source_group_id===componentId||isDescendantGroup(db2,elm.source_group_id,componentId)))return!0;if("source_component_id"in elm&&elm.source_component_id){let sourceComponent=db2.source_component.get(elm.source_component_id);if(sourceComponent?.source_group_id&&(sourceComponent.source_group_id===componentId||isDescendantGroup(db2,sourceComponent.source_group_id,componentId)))return!0}if("pcb_component_id"in elm&&elm.pcb_component_id){let pcbComp=db2.pcb_component.get(elm.pcb_component_id);if(pcbComp?.source_component_id){let sourceComp=db2.source_component.get(pcbComp.source_component_id);if(sourceComp?.source_group_id&&(sourceComp.source_group_id===componentId||isDescendantGroup(db2,sourceComp.source_group_id,componentId)))return!0}}return!1});for(let elm of relatedElements)elm.type==="pcb_component"&&db2.pcb_component.update(elm.pcb_component_id,{position_mode:"packed"});transformPCBElements(relatedElements,transformMatrix),db2.pcb_group.update(pcbGroup.pcb_group_id,{center:center2})}},DEFAULT_MIN_GAP="1mm",debug42=(0,import_debug12.default)("Group_doInitialPcbLayoutPack"),Group_doInitialPcbLayoutPack=group=>{let{db:db2}=group.root,{_parsedProps:props}=group;group.root?.emit("packing:start",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()});let{packOrderStrategy,packPlacementStrategy,gap:gapProp,pcbGap,pcbPackGap}=props,gap=pcbPackGap??pcbGap??gapProp,gapMm=length.parse(gap??DEFAULT_MIN_GAP),chipMarginsMap={},staticPcbComponentIds=new Set,collectMargins=comp=>{if(comp?.pcb_component_id&&comp?._parsedProps){let props2=comp._parsedProps,left=length.parse(props2.pcbMarginLeft??props2.pcbMarginX??0),right=length.parse(props2.pcbMarginRight??props2.pcbMarginX??0),top=length.parse(props2.pcbMarginTop??props2.pcbMarginY??0),bottom=length.parse(props2.pcbMarginBottom??props2.pcbMarginY??0);(left||right||top||bottom)&&(chipMarginsMap[comp.pcb_component_id]={left,right,top,bottom})}comp?.children&&comp.children.forEach(collectMargins)};collectMargins(group);let excludedPcbGroupIds=new Set;for(let child of group.children){let childIsGroupOrNormalComponent=child;childIsGroupOrNormalComponent._isNormalComponent&&childIsGroupOrNormalComponent.isRelativelyPositioned?.()&&(childIsGroupOrNormalComponent.pcb_component_id&&staticPcbComponentIds.add(childIsGroupOrNormalComponent.pcb_component_id),childIsGroupOrNormalComponent.pcb_group_id&&excludedPcbGroupIds.add(childIsGroupOrNormalComponent.pcb_group_id))}let isDescendantGroup2=(db22,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group2=db22.source_group.get(groupId);return!group2||!group2.parent_source_group_id?!1:isDescendantGroup2(db22,group2.parent_source_group_id,ancestorId)};if(excludedPcbGroupIds.size>0)for(let element of db2.toArray()){if(element.type!=="pcb_component")continue;let sourceComponent=db2.source_component.get(element.source_component_id);if(sourceComponent?.source_group_id)for(let groupId of excludedPcbGroupIds)isDescendantGroup2(db2,sourceComponent.source_group_id,groupId)&&staticPcbComponentIds.add(element.pcb_component_id)}let filteredCircuitJson=db2.toArray(),bounds;if(props.width!==void 0&&props.height!==void 0){let widthMm=length.parse(props.width),heightMm=length.parse(props.height);bounds={minX:-widthMm/2,maxX:widthMm/2,minY:-heightMm/2,maxY:heightMm/2}}let packInput={...convertPackOutputToPackInput(convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)})),orderStrategy:packOrderStrategy??"largest_to_smallest",placementStrategy:packPlacementStrategy??"minimum_sum_squared_distance_to_network",minGap:gapMm,bounds},clusterMap=applyComponentConstraintClusters(group,packInput);debug42.enabled&&(group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${group.name}`,content:JSON.stringify(db2.toArray())}),group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${group.name}`,content:packInput}));let packOutput;try{let solver=new PackSolver2(packInput);group.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams:solver.getConstructorParams(),componentName:group.getString()}),solver.solve(),packOutput={...packInput,components:solver.packedComponents}}catch(error2){throw group.root?.emit("packing:error",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString(),error:{message:error2 instanceof Error?error2.message:String(error2)}}),error2}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group,packOutput,clusterMap),group.root?.emit("packing:end",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()})},getSizeOfTreeNodeChild=(db2,child)=>{let{sourceComponent,sourceGroup}=child;if(child.nodeType==="component"){let schComponent=db2.schematic_component.getWhere({source_component_id:sourceComponent?.source_component_id});return schComponent?.size?{width:schComponent.size.width,height:schComponent.size.height}:null}if(child.nodeType==="group"){let schGroup=db2.schematic_group.getWhere({source_group_id:sourceGroup?.source_group_id});if(schGroup?.width&&schGroup?.height)return{width:schGroup.width,height:schGroup.height};let groupComponents=db2.schematic_component.list({schematic_group_id:schGroup?.schematic_group_id}),minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let comp of groupComponents)if(comp.center&&comp.size){let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let groupWidth=maxX-minX,groupHeight=maxY-minY;return{width:groupWidth,height:groupHeight}}return null},Group_doInitialSchematicLayoutFlex=group=>{let{db:db2}=group.root,props=group._parsedProps,tree=getCircuitJsonTree(db2.toArray(),{source_group_id:group.source_group_id}),rawJustify=props.schJustifyContent??props.justifyContent,rawAlign=props.schAlignItems??props.alignItems,rawGap=props.schFlexGap??props.schGap??props.gap,direction2=props.schFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.schWidth??void 0,height=props.height??props.schHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(tree.childNodes.map(child=>getSizeOfTreeNodeChild(db2,child)).filter(size3=>size3!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of tree.childNodes){let size3=getSizeOfTreeNodeChild(db2,child);flexBox.addChild({metadata:child,width:size3?.width??0,height:size3?.height??0,flexBasis:size3?direction2==="row"?size3.width:size3.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let offset={x:-(bounds.maxX+bounds.minX)/2,y:-(bounds.maxY+bounds.minY)/2},allCircuitJson=db2.toArray();for(let child of flexBox.children){let{sourceComponent,sourceGroup}=child.metadata;if(sourceComponent){let schComponent=db2.schematic_component.getWhere({source_component_id:sourceComponent.source_component_id});if(!schComponent)continue;repositionSchematicComponentTo(allCircuitJson,schComponent.schematic_component_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}if(sourceGroup){if(!db2.schematic_group.getWhere({source_group_id:sourceGroup.source_group_id}))continue;repositionSchematicGroupTo(allCircuitJson,sourceGroup.source_group_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}}group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{width:bounds.width,height:bounds.height})};function updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId,deltaX,deltaY}){let rects=db2.schematic_rect.list({schematic_component_id:schematicComponentId});for(let rect of rects)rect.center.x+=deltaX,rect.center.y+=deltaY;let lines=db2.schematic_line.list({schematic_component_id:schematicComponentId});for(let line2 of lines)line2.x1+=deltaX,line2.y1+=deltaY,line2.x2+=deltaX,line2.y2+=deltaY;let circles=db2.schematic_circle.list({schematic_component_id:schematicComponentId});for(let circle2 of circles)circle2.center.x+=deltaX,circle2.center.y+=deltaY;let arcs=db2.schematic_arc.list({schematic_component_id:schematicComponentId});for(let arc2 of arcs)arc2.center.x+=deltaX,arc2.center.y+=deltaY;let paths=db2.schematic_path.list({schematic_component_id:schematicComponentId});for(let path of paths)for(let point62 of path.points)point62.x+=deltaX,point62.y+=deltaY}function Group_doInitialSchematicLayoutGrid(group){let{db:db2}=group.root,props=group._parsedProps,schematicChildren=group.children.filter(child=>{let isExplicitlyPositioned=child._parsedProps?.schX!==void 0||child._parsedProps?.schY!==void 0;return child.schematic_component_id&&!isExplicitlyPositioned});if(schematicChildren.length===0)return;let maxCellWidth=0,maxCellHeight=0;for(let child of schematicChildren){let schComp=db2.schematic_component.get(child.schematic_component_id);schComp?.size&&(maxCellWidth=Math.max(maxCellWidth,schComp.size.width),maxCellHeight=Math.max(maxCellHeight,schComp.size.height))}maxCellWidth===0&&schematicChildren.length>0&&(maxCellWidth=1),maxCellHeight===0&&schematicChildren.length>0&&(maxCellHeight=1);let gridColsOption=props.gridCols,gridRowsOption,gridGapOption=props.gridGap,gridRowGapOption=props.gridRowGap,gridColumnGapOption=props.gridColumnGap;props.schLayout?.grid&&(gridColsOption=props.schLayout.grid.cols??gridColsOption,gridRowsOption=props.schLayout.grid.rows,gridGapOption=props.schLayout.gridGap??gridGapOption,gridRowGapOption=props.schLayout.gridRowGap??gridRowGapOption,gridColumnGapOption=props.schLayout.gridColumnGap??gridColumnGapOption);let numCols,numRows;gridColsOption!==void 0&&gridRowsOption!==void 0?(numCols=gridColsOption,numRows=gridRowsOption):gridColsOption!==void 0?(numCols=gridColsOption,numRows=Math.ceil(schematicChildren.length/numCols)):gridRowsOption!==void 0?(numRows=gridRowsOption,numCols=Math.ceil(schematicChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(schematicChildren.length)),numRows=Math.ceil(schematicChildren.length/numCols)),numCols===0&&schematicChildren.length>0&&(numCols=1),numRows===0&&schematicChildren.length>0&&(numRows=schematicChildren.length);let gridGapX,gridGapY,parseGap=val=>{if(val!==void 0)return typeof val=="number"?val:length.parse(val)};if(gridRowGapOption!==void 0||gridColumnGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.x:gridGapOption,fallbackY=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.y:gridGapOption;gridGapX=parseGap(gridColumnGapOption??fallbackX)??1,gridGapY=parseGap(gridRowGapOption??fallbackY)??1}else if(typeof gridGapOption=="number")gridGapX=gridGapOption,gridGapY=gridGapOption;else if(typeof gridGapOption=="string"){let parsed=length.parse(gridGapOption);gridGapX=parsed,gridGapY=parsed}else if(typeof gridGapOption=="object"&&gridGapOption!==null){let xRaw=gridGapOption.x,yRaw=gridGapOption.y;gridGapX=typeof xRaw=="number"?xRaw:length.parse(xRaw??"0mm"),gridGapY=typeof yRaw=="number"?yRaw:length.parse(yRaw??"0mm")}else gridGapX=1,gridGapY=1;let totalGridWidth=numCols*maxCellWidth+Math.max(0,numCols-1)*gridGapX,totalGridHeight=numRows*maxCellHeight+Math.max(0,numRows-1)*gridGapY,groupCenter=group._getGlobalSchematicPositionBeforeLayout(),firstCellCenterX=groupCenter.x-totalGridWidth/2+maxCellWidth/2,firstCellCenterY=groupCenter.y+totalGridHeight/2-maxCellHeight/2;for(let i3=0;i3<schematicChildren.length;i3++){let child=schematicChildren[i3];if(!child.schematic_component_id)continue;let row=Math.floor(i3/numCols),col=i3%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i3} (row ${row}, col ${col}) exceeds specified grid dimensions (${numRows}x${numCols}). Skipping placement.`);continue}let targetCellCenterX=firstCellCenterX+col*(maxCellWidth+gridGapX),targetCellCenterY=firstCellCenterY-row*(maxCellHeight+gridGapY),schComp=db2.schematic_component.get(child.schematic_component_id);if(schComp){let oldChildCenter=schComp.center,newChildCenter={x:targetCellCenterX,y:targetCellCenterY};db2.schematic_component.update(child.schematic_component_id,{center:newChildCenter});let deltaX=newChildCenter.x-oldChildCenter.x,deltaY=newChildCenter.y-oldChildCenter.y,schPorts=db2.schematic_port.list({schematic_component_id:child.schematic_component_id});for(let port of schPorts)db2.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});let schTexts=db2.schematic_text.list({schematic_component_id:child.schematic_component_id});for(let text of schTexts)db2.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:child.schematic_component_id,deltaX,deltaY})}}group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{width:totalGridWidth,height:totalGridHeight,center:groupCenter})}var debug52=(0,import_debug13.default)("Group_doInitialSchematicLayoutMatchAdapt");function Group_doInitialSchematicLayoutMatchAdapt(group){let{db:db2}=group.root,subtreeCircuitJson=buildSubtree(db2.toArray(),{source_group_id:group.source_group_id}),bpcGraphBeforeGeneratedNetLabels=convertCircuitJsonToBpc(subtreeCircuitJson);debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(bpcGraphBeforeGeneratedNetLabels,{title:`floatingBpcGraph-${group.name}`}));let floatingGraph=convertCircuitJsonToBpc(subtreeCircuitJson),floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p4=>({...p4,color:p4.color.replace("not_connected","normal")}))},{result:laidOutBpcGraph}=layoutSchematicGraphVariants([{variantName:"default",floatingGraph},{variantName:"noNotConnected",floatingGraph:floatingGraphNoNotConnected}],{singletonKeys:["vcc/2","gnd/2"],centerPinColors:["netlabel_center","component_center"],floatingBoxIdsWithMutablePinOffsets:new Set(floatingGraph.boxes.filter(box2=>floatingGraph.pins.filter(p4=>p4.boxId===box2.boxId).filter(bp3=>!bp3.color.includes("center")).length<=2).map(b3=>b3.boxId)),corpus:{}});debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(laidOutBpcGraph,{title:`laidOutBpcGraph-${group.name}`}));let groupOffset=group._getGlobalSchematicPositionBeforeLayout();for(let box2 of laidOutBpcGraph.boxes){if(!box2.center)continue;let schematic_component22=db2.schematic_component.get(box2.boxId);if(schematic_component22){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db2.schematic_port.list({schematic_component_id:schematic_component22.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schematic_component22.schematic_component_id}),positionDelta={x:newCenter.x-schematic_component22.center.x,y:newCenter.y-schematic_component22.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:schematic_component22.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component22.center=newCenter;continue}let schematic_net_label3=db2.schematic_net_label.get(box2.boxId);if(schematic_net_label3){let pin=laidOutBpcGraph.pins.find(p4=>p4.boxId===box2.boxId&&p4.color==="netlabel_center");if(!pin)throw new Error(`No pin found for net label: ${box2.boxId}`);let finalCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y};schematic_net_label3.center=finalCenter,schematic_net_label3.anchor_position={x:finalCenter.x+pin.offset.x,y:finalCenter.y+pin.offset.y};continue}console.error(`No schematic element found for box: ${box2.boxId}. This is a bug in the matchAdapt binding with @tscircuit/core`)}}var debug62=(0,import_debug14.default)("Group_doInitialSchematicLayoutMatchpack");function facingDirectionToSide(facingDirection){switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:return"y+"}}function rotateDirection2(direction2,degrees){let directions=["right","up","left","down"],currentIndex=directions.indexOf(direction2);if(currentIndex===-1)return direction2;let steps=Math.round(degrees/90),newIndex=(currentIndex+steps)%4;return directions[newIndex<0?newIndex+4:newIndex]}function isTreeChildExplicitlyPositioned(treeChild,group){if(treeChild.nodeType==="component"&&treeChild.sourceComponent){let component=group.children.find(groupChild=>groupChild.source_component_id===treeChild.sourceComponent?.source_component_id);return component?._parsedProps?.schX!==void 0||component?._parsedProps?.schY!==void 0}if(treeChild.nodeType==="group"&&treeChild.sourceGroup){let nestedGroup=group.children.find(groupChild=>groupChild.source_group_id===treeChild.sourceGroup?.source_group_id);return nestedGroup?._parsedProps?.schX!==void 0||nestedGroup?._parsedProps?.schY!==void 0}return!1}function getTreeChildChipId(child,index){return child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name||`chip_${index}`:child.nodeType==="group"&&child.sourceGroup?child.sourceGroup.name||`group_${index}`:null}function convertTreeToInputProblem(tree,db2,group){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2};debug62(`[${group.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index)=>{if(isTreeChildExplicitlyPositioned(child,group)){debug62(`[${group.name}] Skipping explicitly positioned child ${index} from matchpack`);return}if(debug62(`[${group.name}] Processing child ${index}: nodeType=${child.nodeType}`),child.nodeType==="component"?debug62(`[${group.name}] - Component: ${child.sourceComponent?.name}`):child.nodeType==="group"&&debug62(`[${group.name}] - Group: ${child.sourceGroup?.name}`),child.nodeType==="component"&&child.sourceComponent){let chipId=getTreeChildChipId(child,index),schematicComponent=db2.schematic_component.getWhere({source_component_id:child.sourceComponent.source_component_id});if(!schematicComponent)return;let component=group.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),availableRotations=[0,90,180,270];component?._parsedProps?.schOrientation&&(availableRotations=[0]),component?._parsedProps?.schRotation!==void 0&&(availableRotations=[0]),component?._parsedProps?.facingDirection&&(availableRotations=[0]),component?._parsedProps?.schFacingDirection&&(availableRotations=[0]),component?.componentName==="Chip"&&(availableRotations=[0]);let marginLeft=component?._parsedProps?.schMarginLeft??component?._parsedProps?.schMarginX??0,marginRight=component?._parsedProps?.schMarginRight??component?._parsedProps?.schMarginX??0,marginTop=component?._parsedProps?.schMarginTop??component?._parsedProps?.schMarginY??0,marginBottom=component?._parsedProps?.schMarginBottom??component?._parsedProps?.schMarginY??0;component?.config.shouldRenderAsSchematicBox&&(marginTop+=.4,marginBottom+=.4);let marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2;problem.chipMap[chipId]={chipId,pins:[],size:{x:(schematicComponent.size?.width||1)+marginLeft+marginRight,y:(schematicComponent.size?.height||1)+marginTop+marginBottom},availableRotations};let ports=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let port of ports){let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${chipId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;problem.chipMap[chipId].pins.push(pinId);let side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-(schematicComponent.center.x||0)+marginXShift,y:(port.center?.y||0)-(schematicComponent.center.y||0)+marginYShift},side}}}else if(child.nodeType==="group"&&child.sourceGroup){let groupId=getTreeChildChipId(child,index);debug62(`[${group.name}] Processing nested group: ${groupId}`);let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:child.sourceGroup.source_group_id}),groupInstance=group.children.find(groupChild=>groupChild.source_group_id===child.sourceGroup?.source_group_id);if(debug62(`[${group.name}] Found schematic_group for ${groupId}:`,schematicGroup),schematicGroup){debug62(`[${group.name}] Treating group ${groupId} as composite chip`);let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`[${group.name}] Group ${groupId} has ${groupComponents.length} components:`,groupComponents.map(c4=>c4.source_component_id));let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let comp of groupComponents)if(comp.center&&comp.size){hasValidBounds=!0;let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let marginLeft=groupInstance?._parsedProps?.schMarginLeft??groupInstance?._parsedProps?.schMarginX??0,marginRight=groupInstance?._parsedProps?.schMarginRight??groupInstance?._parsedProps?.schMarginX??0,marginTop=groupInstance?._parsedProps?.schMarginTop??groupInstance?._parsedProps?.schMarginY??0,marginBottom=groupInstance?._parsedProps?.schMarginBottom??groupInstance?._parsedProps?.schMarginY??0,marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2,groupWidth=(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,groupHeight=(hasValidBounds?maxY-minY:2)+marginTop+marginBottom;debug62(`[${group.name}] Group ${groupId} computed size: ${groupWidth} x ${groupHeight}`);let groupPins=[];for(let comp of groupComponents){let ports=db2.schematic_port.list({schematic_component_id:comp.schematic_component_id});for(let port of ports){let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${groupId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;groupPins.push(pinId);let groupCenter=schematicGroup.center||{x:0,y:0},side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-groupCenter.x+marginXShift,y:(port.center?.y||0)-groupCenter.y+marginYShift},side}}}debug62(`[${group.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:{x:groupWidth,y:groupHeight}},debug62(`[${group.name}] Added group ${groupId} to chipMap`)}else debug62(`[${group.name}] Warning: No schematic_group found for group ${groupId}`)}}),debug62(`[${group.name}] Creating connections using connectivity keys`);let connectivityGroups=new Map;for(let[chipId,chip]of Object.entries(problem.chipMap))for(let pinId of chip.pins){let pinNumber=pinId.split(".").pop(),treeNode=tree.childNodes.find(child=>getTreeChildChipId(child,tree.childNodes.indexOf(child))===chipId);if(treeNode?.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});for(let comp of groupComponents){let sourcePorts=db2.source_port.list({source_component_id:comp.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber))if(sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] \u2713 Pin ${pinId} has connectivity key: ${connectivityKey}`)}else debug62(`[${group.name}] Pin ${pinId} has no connectivity key`)}}}}else if(treeNode?.nodeType==="component"&&treeNode.sourceComponent){let sourcePorts=db2.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber)&&sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] Pin ${pinId} has connectivity key: ${connectivityKey}`)}}}}debug62(`[${group.name}] Found ${connectivityGroups.size} connectivity groups:`,Array.from(connectivityGroups.entries()).map(([key,pins])=>({key,pins})));for(let[connectivityKey,pins]of connectivityGroups)if(pins.length>=2){let tracesWithThisKey=db2.source_trace.list().filter(trace=>trace.subcircuit_connectivity_map_key===connectivityKey),hasNetConnections=tracesWithThisKey.some(trace=>trace.connected_source_net_ids&&trace.connected_source_net_ids.length>0),hasDirectConnections=tracesWithThisKey.some(trace=>trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2);if(debug62(`[${group.name}] Connectivity ${connectivityKey}: hasNetConnections=${hasNetConnections}, hasDirectConnections=${hasDirectConnections}`),hasDirectConnections){for(let trace of tracesWithThisKey)if(trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2){let directlyConnectedPins=[];for(let portId of trace.connected_source_port_ids)for(let pinId of pins){let pinNumber=pinId.split(".").pop(),sourcePort=db2.source_port.get(portId);if(sourcePort&&String(sourcePort.pin_number||sourcePort.name)===String(pinNumber)){let chipId=pinId.split(".")[0],treeNode=tree.childNodes.find(child=>getTreeChildChipId(child,tree.childNodes.indexOf(child))===chipId);treeNode?.nodeType==="component"&&treeNode.sourceComponent&&db2.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p4=>p4.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i3=0;i3<directlyConnectedPins.length;i3++)for(let j4=i3+1;j4<directlyConnectedPins.length;j4++){let pin1=directlyConnectedPins[i3],pin2=directlyConnectedPins[j4];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net3=db2.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey}),isGround=source_net3?.is_ground??!1,isPositiveVoltageSource=source_net3?.is_power??!1;problem.netMap[connectivityKey]={netId:connectivityKey,isGround,isPositiveVoltageSource};for(let pinId of pins)problem.netConnMap[`${pinId}-${connectivityKey}`]=!0;debug62(`[${group.name}] Created net ${connectivityKey} with ${pins.length} pins:`,pins)}}return problem}function Group_doInitialSchematicLayoutMatchPack(group){let{db:db2}=group.root,tree=getCircuitJsonTree(db2.toArray(),{source_group_id:group.source_group_id});if(debug62(`[${group.name}] Starting matchpack layout with ${tree.childNodes.length} children`),debug62(`[${group.name}] Tree structure:`,JSON.stringify(tree,null,2)),tree.childNodes.length<=1){debug62(`[${group.name}] Only ${tree.childNodes.length} children, skipping layout`);return}debug62("Converting circuit tree to InputProblem...");let inputProblem=convertTreeToInputProblem(tree,db2,group);debug62.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${group.name}`,content:JSON.stringify(inputProblem,null,2)});let solver=new LayoutPipelineSolver(inputProblem);if(debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group.name}`})}if(solver.solve(),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed)throw debug62(`Solver failed with error: ${solver.error}`),new Error(`Matchpack layout solver failed: ${solver.error}`);let outputLayout=solver.getOutputLayout();if(debug62("OutputLayout:",JSON.stringify(outputLayout,null,2)),debug62("Solver completed successfully:",!solver.failed),debug62.enabled&&global?.debugGraphics){let finalViz=solver.visualize();global.debugGraphics.push({...finalViz,title:`matchpack-final-${group.name}`})}let overlaps=solver.checkForOverlaps(outputLayout);if(overlaps.length>0){debug62(`Warning: Found ${overlaps.length} overlapping components:`);for(let overlap of overlaps)debug62(` ${overlap.chip1} overlaps ${overlap.chip2} (area: ${overlap.overlapArea})`)}let groupOffset=group._getGlobalSchematicPositionBeforeLayout();debug62(`Group offset: x=${groupOffset.x}, y=${groupOffset.y}`),debug62(`Applying layout results for ${Object.keys(outputLayout.chipPlacements).length} chip placements`);for(let[chipId,placement]of Object.entries(outputLayout.chipPlacements)){debug62(`Processing placement for chip: ${chipId} at (${placement.x}, ${placement.y})`);let treeNode=tree.childNodes.find(child=>{let expectedChipId=getTreeChildChipId(child,tree.childNodes.indexOf(child)),matches=expectedChipId===chipId;return debug62(` Checking child ${expectedChipId}: matches=${matches}`),matches});if(!treeNode){debug62(`Warning: No tree node found for chip: ${chipId}`),debug62("Available tree nodes:",tree.childNodes.map((child,idx)=>({type:child.nodeType,name:child.nodeType==="component"?child.sourceComponent?.name:child.sourceGroup?.name,expectedChipId:getTreeChildChipId(child,idx)})));continue}let newCenter={x:placement.x+groupOffset.x,y:placement.y+groupOffset.y};if(treeNode.nodeType==="component"&&treeNode.sourceComponent){let schematicComponent=db2.schematic_component.getWhere({source_component_id:treeNode.sourceComponent.source_component_id});if(schematicComponent){debug62(`Moving component ${chipId} to (${newCenter.x}, ${newCenter.y})`);let ports=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schematicComponent.schematic_component_id}),positionDelta={x:newCenter.x-schematicComponent.center.x,y:newCenter.y-schematicComponent.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;if(updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:schematicComponent.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematicComponent.center=newCenter,placement.ccwRotationDegrees!==0){debug62(`Component ${chipId} has rotation: ${placement.ccwRotationDegrees}\xB0`);let normalizedRotation=(Math.round(placement.ccwRotationDegrees)%360+360)%360;if((normalizedRotation===90||normalizedRotation===270)&&schematicComponent.size){let prevWidth=schematicComponent.size.width;schematicComponent.size.width=schematicComponent.size.height,schematicComponent.size.height=prevWidth}let angleRad=placement.ccwRotationDegrees*Math.PI/180,cos6=Math.cos(angleRad),sin6=Math.sin(angleRad);for(let port of ports){let dx3=port.center.x-newCenter.x,dy3=port.center.y-newCenter.y,rotatedDx=dx3*cos6-dy3*sin6,rotatedDy=dx3*sin6+dy3*cos6;port.center.x=newCenter.x+rotatedDx,port.center.y=newCenter.y+rotatedDy;let originalDirection=port.facing_direction||"right";port.facing_direction=rotateDirection2(originalDirection,placement.ccwRotationDegrees),port.side_of_component=(port.facing_direction==="up"?"top":port.facing_direction==="down"?"bottom":port.facing_direction)||port.side_of_component}for(let text of texts){let dx3=text.position.x-newCenter.x,dy3=text.position.y-newCenter.y,rotatedDx=dx3*cos6-dy3*sin6,rotatedDy=dx3*sin6+dy3*cos6;text.position.x=newCenter.x+rotatedDx,text.position.y=newCenter.y+rotatedDy}if(schematicComponent.symbol_name){let schematicSymbolDirection=schematicComponent.symbol_name.match(/_(right|left|up|down)$/);schematicSymbolDirection&&(schematicComponent.symbol_name=schematicComponent.symbol_name.replace(schematicSymbolDirection[0],`_${rotateDirection2(schematicSymbolDirection[1],placement.ccwRotationDegrees)}`));let schematicSymbolOrientation=schematicComponent.symbol_name.match(/_(horz|vert)$/);if(schematicSymbolOrientation){let normalizedRotation2=(placement.ccwRotationDegrees%360+360)%360;(normalizedRotation2===90||normalizedRotation2===270)&&(schematicComponent.symbol_name=schematicComponent.symbol_name.replace(schematicSymbolOrientation[0],schematicSymbolOrientation[1]==="horz"?"_vert":"_horz"))}}}}}else if(treeNode.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){debug62(`Moving group ${chipId} to (${newCenter.x}, ${newCenter.y}) from (${schematicGroup.center?.x}, ${schematicGroup.center?.y})`);let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`Group ${chipId} has ${groupComponents.length} components to move`);let oldCenter=schematicGroup.center||{x:0,y:0},positionDelta={x:newCenter.x-oldCenter.x,y:newCenter.y-oldCenter.y};debug62(`Position delta for group ${chipId}: (${positionDelta.x}, ${positionDelta.y})`);for(let component of groupComponents)if(component.center){let oldComponentCenter={...component.center};component.center.x+=positionDelta.x,component.center.y+=positionDelta.y,debug62(`Moved component ${component.source_component_id} from (${oldComponentCenter.x}, ${oldComponentCenter.y}) to (${component.center.x}, ${component.center.y})`);let ports=db2.schematic_port.list({schematic_component_id:component.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:component.schematic_component_id});for(let port of ports)port.center&&(port.center.x+=positionDelta.x,port.center.y+=positionDelta.y);for(let text of texts)text.position&&(text.position.x+=positionDelta.x,text.position.y+=positionDelta.y)}schematicGroup.center=newCenter,debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}var parsePinNumberFromPortName=name=>{if(!name)return null;let match2=name.match(/^pin(\d+)$/i)??name.match(/^(\d+)$/);if(!match2)return null;let pinNumber=Number(match2[1]);return Number.isFinite(pinNumber)&&pinNumber>0?pinNumber:null},getDirectGroupPorts=group=>group.children.filter(child=>child.componentName==="Port"),normalizeGroupSchematicBoxPorts=group=>{let{db:db2}=group.root,ports=getDirectGroupPorts(group);for(let port of ports){if(port._parsedProps.pinNumber!==void 0)continue;let pinNumber=parsePinNumberFromPortName(port._parsedProps.name);pinNumber!==null&&(port._parsedProps.pinNumber=pinNumber)}let usedPinNumbers=new Set(ports.map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0)),nextPinNumber=1;for(let port of ports){if(port._parsedProps.pinNumber===void 0){for(;usedPinNumbers.has(nextPinNumber);)nextPinNumber++;port._parsedProps.pinNumber=nextPinNumber,usedPinNumbers.add(nextPinNumber)}port.source_port_id&&db2.source_port.update(port.source_port_id,{pin_number:port._parsedProps.pinNumber,port_hints:port.getNameAndAliases()})}},getGroupSchematicBoxPinLabels=group=>{let pinLabels={};for(let port of getDirectGroupPorts(group)){let pinNumber=port._parsedProps.pinNumber,name=port._parsedProps.name;pinNumber===void 0||!name||name===`pin${pinNumber}`||name===String(pinNumber)||(pinLabels[`pin${pinNumber}`]=name)}return pinLabels},Group_doInitialSchematicBoxComponentRender=group=>{if(group.root?.schematicDisabled)return;let{db:db2}=group.root,props=group._parsedProps;props.schPinSpacing!==void 0&&db2.source_property_ignored_warning.insert({source_component_id:group.source_group_id??"",property_name:"schPinSpacing",error_type:"source_property_ignored_warning",message:"schPinSpacing is deprecated and will be ignored. Pin spacing is always 0.2."}),normalizeGroupSchematicBoxPorts(group);let dimensions=group._getSchematicBoxDimensions();if(!dimensions)return;let center2=group._getGlobalSchematicPositionBeforeLayout(),size3=dimensions.getSize(),portLabels=group._getPinLabelsFromPorts(),schPortArrangement=group._getSchematicPortArrangement(),schematicComponent=db2.schematic_component.insert({center:center2,size:size3,source_group_id:group.source_group_id,schematic_group_id:group.schematic_group_id??void 0,subcircuit_id:group.subcircuit_id??group.getSubcircuit()?.subcircuit_id??void 0,is_schematic_group:!0,is_box_with_pins:!0,port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:.2,pin_styles:underscorifyPinStyles(props.schPinStyle,portLabels),port_labels:portLabels});group.schematic_component_id=schematicComponent.schematic_component_id,group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{center:center2,width:size3.width,height:size3.height,schematic_component_ids:[schematicComponent.schematic_component_id]});let title=props.schTitle??props.name;title&&db2.schematic_text.insert({text:title,schematic_component_id:schematicComponent.schematic_component_id,anchor:"left",rotation:0,position:{x:center2.x-size3.width/2,y:center2.y+size3.height/2+.13},color:"#006464",font_size:.18})};function createSchematicTraceSolverInputProblem(group){let{db:db2}=group.root,connKeyToSourceNet=new Map,traces=group.selectAll("trace"),childGroups=group.selectAll("group"),allSchematicGroupIds=[group.schematic_group_id,...childGroups.map(a3=>a3.schematic_group_id)],schematicComponents=db2.schematic_component.list().filter(a3=>allSchematicGroupIds.includes(a3.schematic_group_id)),componentNameToSectionId=new Map;for(let component of group.getDescendants())component.name&&component._parsedProps?.schSectionName&&componentNameToSectionId.set(component.name,component._parsedProps.schSectionName);let chips=[],pinIdToSchematicPortId=new Map,schematicPortIdToPinId=new Map;for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,pins=[],sourceComponent=db2.source_component.getWhere({source_component_id:schematicComponent.source_component_id}),schematicPorts=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let schematicPort of schematicPorts){let pinId=`${sourceComponent?.name??schematicComponent.schematic_component_id}.${schematicPort.pin_number}`;pinIdToSchematicPortId.set(pinId,schematicPort.schematic_port_id),schematicPortIdToPinId.set(schematicPort.schematic_port_id,pinId)}for(let schematicPort of schematicPorts){let pinId=schematicPortIdToPinId.get(schematicPort.schematic_port_id);pins.push({pinId,x:schematicPort.center.x,y:schematicPort.center.y})}let sectionId;sourceComponent?.name&&(sectionId=componentNameToSectionId.get(sourceComponent.name)),chips.push({chipId,center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height,pins,sectionId})}let allSourceAndSchematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToConnKey=new Map;for(let sc2 of schematicComponents){let ports=db2.schematic_port.list({schematic_component_id:sc2.schematic_component_id});for(let sp3 of ports)allSourceAndSchematicPortIdsInScope.add(sp3.schematic_port_id),sp3.source_port_id&&(schPortIdToSourcePortId.set(sp3.schematic_port_id,sp3.source_port_id),sourcePortIdToSchPortId.set(sp3.source_port_id,sp3.schematic_port_id))}let allowedSubcircuitIds=new Set;group.subcircuit_id&&allowedSubcircuitIds.add(group.subcircuit_id);for(let cg3 of childGroups)cg3.subcircuit_id&&allowedSubcircuitIds.add(cg3.subcircuit_id);let externalNetIds=db2.source_trace.list().filter(st3=>{if(st3.subcircuit_id===group.subcircuit_id)return!0;for(let source_port_id of st3.connected_source_port_ids)if(sourcePortIdToSchPortId.has(source_port_id))return!0;return!1}).flatMap(st3=>st3.connected_source_net_ids);for(let netId of externalNetIds){let net=db2.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}let directConnections=[],connectedPairKeys=new Set,connKeysWithExplicitPortNetTraces=new Set;for(let trace of traces){if(trace.parent!==group)continue;let sourceTraceId=trace.source_trace_id;if(!sourceTraceId)continue;let sourceTrace=db2.source_trace.get(sourceTraceId);sourceTrace?.subcircuit_connectivity_map_key&&(sourceTrace.connected_source_port_ids?.length??0)>0&&(sourceTrace.connected_source_net_ids?.length??0)>0&&connKeysWithExplicitPortNetTraces.add(sourceTrace.subcircuit_connectivity_map_key)}for(let st3 of db2.source_trace.list()){if(st3.subcircuit_id&&!allowedSubcircuitIds.has(st3.subcircuit_id))continue;let connected=(st3.connected_source_port_ids??[]).map(srcId=>sourcePortIdToSchPortId.get(srcId)).filter(sourcePortId=>!!sourcePortId&&allSourceAndSchematicPortIdsInScope.has(sourcePortId));if(connected.length>=2){let[a3,b3]=connected.slice(0,2),pairKey=[a3,b3].sort().join("::");if(!connectedPairKeys.has(pairKey)){connectedPairKeys.add(pairKey);let userNetId=st3.display_name??st3.source_trace_id;st3.subcircuit_connectivity_map_key&&userNetIdToConnKey.set(userNetId,st3.subcircuit_connectivity_map_key),directConnections.push({pinIds:[a3,b3].map(id2=>schematicPortIdToPinId.get(id2)),netId:userNetId})}}}let netConnections=[];for(let net of db2.source_net.list().filter(n4=>!n4.subcircuit_id||allowedSubcircuitIds.has(n4.subcircuit_id)))net.subcircuit_connectivity_map_key&&connKeyToSourceNet.set(net.subcircuit_connectivity_map_key,net);let connKeyToPinIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){let sp3=db2.source_port.get(srcPortId);if(!sp3?.subcircuit_connectivity_map_key)continue;let connKey=sp3.subcircuit_connectivity_map_key;connKeyToPinIds.has(connKey)||connKeyToPinIds.set(connKey,[]),connKeyToPinIds.get(connKey).push(schId)}for(let[connKey,schematicPortIds]of connKeyToPinIds){let sourceNet=connKeyToSourceNet.get(connKey);if(sourceNet&&schematicPortIds.length>=1){let userNetId=String(sourceNet.name||sourceNet.source_net_id||connKey);userNetIdToConnKey.set(userNetId,connKey);let netLabelWidth=Number(getSchematicNetLabelTextWidth({text:String(userNetId)}).toFixed(2));netConnections.push({netId:userNetId,pinIds:schematicPortIds.map(portId=>schematicPortIdToPinId.get(portId)),netLabelWidth})}}let availableNetLabelOrientations=(()=>{let netToAllowedOrientations={},presentNetIds=new Set(netConnections.map(nc3=>nc3.netId));for(let net of db2.source_net.list().filter(n4=>!n4.subcircuit_id||allowedSubcircuitIds.has(n4.subcircuit_id)))net.name&&presentNetIds.has(net.name)&&(net.is_ground?netToAllowedOrientations[net.name]=["y-"]:net.is_power?netToAllowedOrientations[net.name]=["y+"]:netToAllowedOrientations[net.name]=["x-","x+"]);return netToAllowedOrientations})();return{inputProblem:{chips,directConnections,netConnections,availableNetLabelOrientations,maxMspPairDistance:group._parsedProps.schMaxTraceDistance??2.4},pinIdToSchematicPortId,connKeyToSourceNet,userNetIdToConnKey,connKeysWithExplicitPortNetTraces,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId}}var TOL=1e-6;function isHorizontalEdge(edge){let dx3=Math.abs(edge.to.x-edge.from.x),dy3=Math.abs(edge.to.y-edge.from.y);return dx3>=dy3}function length6(a3,b3){return Math.hypot(b3.x-a3.x,b3.y-a3.y)}function pointAt(a3,b3,t52){return{x:a3.x+(b3.x-a3.x)*t52,y:a3.y+(b3.y-a3.y)*t52}}function paramAlong(a3,b3,p4){let L3=length6(a3,b3);if(L3<TOL)return 0;let t52=((p4.x-a3.x)*(b3.x-a3.x)+(p4.y-a3.y)*(b3.y-a3.y))/((b3.x-a3.x)*(b3.x-a3.x)+(b3.y-a3.y)*(b3.y-a3.y));return Math.max(0,Math.min(1,t52))*L3}function cross3(ax3,ay3,bx3,by3){return ax3*by3-ay3*bx3}function segmentIntersection(p12,p22,q12,q22){let r5={x:p22.x-p12.x,y:p22.y-p12.y},s3={x:q22.x-q12.x,y:q22.y-q12.y},rxs=cross3(r5.x,r5.y,s3.x,s3.y),q_p={x:q12.x-p12.x,y:q12.y-p12.y},q_pxr=cross3(q_p.x,q_p.y,r5.x,r5.y);if(Math.abs(rxs)<TOL&&Math.abs(q_pxr)<TOL||Math.abs(rxs)<TOL&&Math.abs(q_pxr)>=TOL)return null;let t52=cross3(q_p.x,q_p.y,s3.x,s3.y)/rxs,u5=cross3(q_p.x,q_p.y,r5.x,r5.y)/rxs;return t52<-TOL||t52>1+TOL||u5<-TOL||u5>1+TOL?null:{x:p12.x+t52*r5.x,y:p12.y+t52*r5.y}}function mergeIntervals(intervals,tol=TOL){if(intervals.length===0)return intervals;intervals.sort((a3,b3)=>a3.start-b3.start);let merged=[],cur={...intervals[0]};for(let i3=1;i3<intervals.length;i3++){let nxt=intervals[i3];nxt.start<=cur.end+tol?cur.end=Math.max(cur.end,nxt.end):(merged.push(cur),cur={...nxt})}return merged.push(cur),merged}function splitEdgeByCrossings(edge,crossingDistances,crossLen){let L3=length6(edge.from,edge.to);if(L3<TOL||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d4=>({start:Math.max(0,d4-half),end:Math.min(L3,d4+half)})).filter(iv2=>iv2.end-iv2.start>TOL),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir2={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d02,d12,isCrossing)=>{if(d12-d02<=TOL)return;let t02=d02/L3,t110=d12/L3;result.push({from:pointAt(edge.from,edge.to,t02),to:pointAt(edge.from,edge.to,t110),...isCrossing?{is_crossing:!0}:{}})};for(let iv2 of intervals)iv2.start-cursor>TOL&&addSeg(cursor,iv2.start,!1),addSeg(iv2.start,iv2.end,!0),cursor=iv2.end;return L3-cursor>TOL&&addSeg(cursor,L3,!1),result.length>0?result:[edge]}function computeCrossings(traces,opts={}){let crossLen=opts.crossSegmentLength??.075,tol=opts.tolerance??TOL,crossingsByEdge=new Map,keyOf=ref=>`${ref.traceIdx}:${ref.edgeIdx}`,getEdge=ref=>traces[ref.traceIdx].edges[ref.edgeIdx];for(let ti3=0;ti3<traces.length;ti3++){let A4=traces[ti3];for(let ei3=0;ei3<A4.edges.length;ei3++){let eA2=A4.edges[ei3];for(let tj2=ti3;tj2<traces.length;tj2++){let B4=traces[tj2];for(let ej=tj2===ti3?ei3+1:0;ej<B4.edges.length;ej++){let eB=B4.edges[ej],P4=segmentIntersection(eA2.from,eA2.to,eB.from,eB.to);if(!P4)continue;let LA2=length6(eA2.from,eA2.to),LB=length6(eB.from,eB.to);if(LA2<tol||LB<tol)continue;let dA2=paramAlong(eA2.from,eA2.to,P4),dB2=paramAlong(eB.from,eB.to,P4),nearEndpointA=dA2<=tol||Math.abs(LA2-dA2)<=tol||Number.isNaN(dA2),nearEndpointB=dB2<=tol||Math.abs(LB-dB2)<=tol||Number.isNaN(dB2);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA2),bIsHorizontal=isHorizontalEdge(eB),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax3=Math.abs(eA2.to.x-eA2.from.x),ay3=Math.abs(eA2.to.y-eA2.from.y),bx3=Math.abs(eB.to.x-eB.from.x),by3=Math.abs(eB.to.y-eB.from.y),aScore=ax3-ay3,bScore=bx3-by3;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj2,edgeIdx:assignToA?ei3:ej}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA2:dB2),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t52=>({source_trace_id:t52.source_trace_id,edges:[]}));for(let ti3=0;ti3<traces.length;ti3++){let trace=traces[ti3];for(let ei3=0;ei3<trace.edges.length;ei3++){let eRefKey=keyOf({traceIdx:ti3,edgeIdx:ei3}),splittingDistances=crossingsByEdge.get(eRefKey)??[];if(splittingDistances.length===0){out[ti3].edges.push(trace.edges[ei3]);continue}let uniqueSorted=Array.from(new Set(splittingDistances.map(d4=>Number(d4.toFixed(6))))).sort((a3,b3)=>a3-b3),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted,crossLen);out[ti3].edges.push(...split)}}return out}var TOL2=1e-6;function nearlyEqual(a3,b3,tol=TOL2){return Math.abs(a3-b3)<=tol}function pointEq(a3,b3,tol=TOL2){return nearlyEqual(a3.x,b3.x,tol)&&nearlyEqual(a3.y,b3.y,tol)}function onSegment4(p4,a3,b3,tol=TOL2){let minX=Math.min(a3.x,b3.x)-tol,maxX=Math.max(a3.x,b3.x)+tol,minY=Math.min(a3.y,b3.y)-tol,maxY=Math.max(a3.y,b3.y)+tol;return p4.x<minX||p4.x>maxX||p4.y<minY||p4.y>maxY?!1:Math.abs((b3.x-a3.x)*(p4.y-a3.y)-(b3.y-a3.y)*(p4.x-a3.x))<=tol}function dedupePoints(points,tol=TOL2){let map=new Map;for(let p4 of points){let key=`${p4.x.toFixed(6)},${p4.y.toFixed(6)}`;map.has(key)||map.set(key,p4)}return Array.from(map.values())}function edgeVec(e5){return{x:e5.to.x-e5.from.x,y:e5.to.y-e5.from.y}}function isParallel(e12,e22,tol=TOL2){let v12=edgeVec(e12),v22=edgeVec(e22),L12=Math.hypot(v12.x,v12.y),L22=Math.hypot(v22.x,v22.y);if(L12<tol||L22<tol)return!0;let cross22=v12.x*v22.y-v12.y*v22.x;return Math.abs(cross22)<=tol*L12*L22}function incidentEdgesAtPoint(trace,p4,tol=TOL2){return trace.edges.filter(e5=>pointEq(e5.from,p4,tol)||pointEq(e5.to,p4,tol))}function nearestEndpointOnTrace(trace,p4,tol=TOL2){for(let e5 of trace.edges){if(pointEq(e5.from,p4,tol))return e5.from;if(pointEq(e5.to,p4,tol))return e5.to}return null}function edgeDirectionFromPoint(e5,p4,tol=TOL2){let other=pointEq(e5.from,p4,tol)||nearlyEqual(e5.from.x,p4.x,tol)&&nearlyEqual(e5.from.y,p4.y,tol)?e5.to:e5.from,dx3=other.x-p4.x,dy3=other.y-p4.y;return Math.abs(dx3)<tol&&Math.abs(dy3)<tol?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}function getCornerOrientationAtPoint(trace,p4,tol=TOL2){let incident=incidentEdgesAtPoint(trace,p4,tol);if(incident.length<2)return null;let dirs=incident.map(e5=>edgeDirectionFromPoint(e5,p4,tol)),hasUp=dirs.includes("up"),hasDown=dirs.includes("down"),hasLeft=dirs.includes("left"),hasRight=dirs.includes("right"),vertical=hasUp?"up":hasDown?"down":null,horizontal=hasRight?"right":hasLeft?"left":null;return vertical&&horizontal?`${vertical}-${horizontal}`:null}function computeJunctions(traces,opts={}){let tol=opts.tolerance??TOL2,result={};for(let t52 of traces)result[t52.source_trace_id]=[];let endpointsByTrace=traces.map(t52=>{let pts=[];for(let e5 of t52.edges)pts.push(e5.from,e5.to);return dedupePoints(pts,tol)});for(let i3=0;i3<traces.length;i3++){let A4=traces[i3],AEnds=endpointsByTrace[i3];for(let j4=i3+1;j4<traces.length;j4++){let B4=traces[j4],BEnds=endpointsByTrace[j4];for(let pa3 of AEnds)for(let pb2 of BEnds)if(pointEq(pa3,pb2,tol)){let aEdgesAtP=incidentEdgesAtPoint(A4,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B4,pb2,tol),hasCorner=aEdgesAtP.some(eA2=>bEdgesAtP.some(eB=>!isParallel(eA2,eB,tol))),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bCorner=getCornerOrientationAtPoint(B4,pb2,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B4.source_trace_id&&result[B4.source_trace_id].push(pb2))}for(let pa3 of AEnds)for(let eB of B4.edges)if(onSegment4(pa3,eB.from,eB.to,tol)){let hasCorner=incidentEdgesAtPoint(A4,pa3,tol).some(eA2=>!isParallel(eA2,eB,tol)),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B4,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B4,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B4.source_trace_id&&result[B4.source_trace_id].push(pa3))}for(let pb2 of BEnds)for(let eA2 of A4.edges)if(onSegment4(pb2,eA2.from,eA2.to,tol)){let hasCorner=incidentEdgesAtPoint(B4,pb2,tol).some(eB=>!isParallel(eA2,eB,tol)),bCorner=getCornerOrientationAtPoint(B4,pb2,tol),aEndpointNearPb=nearestEndpointOnTrace(A4,pb2,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A4,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B4.source_trace_id].push(pb2),A4.source_trace_id!==B4.source_trace_id&&result[A4.source_trace_id].push(pb2))}}}for(let id2 of Object.keys(result))result[id2]=dedupePoints(result[id2],tol);return result}var debug7=(0,import_debug16.default)("Group_doInitialSchematicTraceRender");function applyTracesFromSolverOutput(args){let{group,solver,pinIdToSchematicPortId,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}=args,{db:db2}=group.root,traces=solver.netLabelTraceCollisionSolver?.getOutput().traces??solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug7(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let uniquePinIds=Array.from(new Set(solvedTracePath.pinIds??[])),solvedTraceSchematicPortIds=uniquePinIds.map(pinId=>pinIdToSchematicPortId.get(pinId)).filter(id2=>!!id2);if(uniquePinIds.length<=1&&solvedTraceSchematicPortIds.length>0&&solvedTraceSchematicPortIds.every(id2=>schematicPortIdsWithPreExistingNetLabels.has(id2))){debug7(`Skipping solver netlabel stub trace ${solvedTracePath?.mspPairId} because schematic port already has a netlabel`);continue}let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug7(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let edges=[];for(let i3=0;i3<points.length-1;i3++)edges.push({from:{x:points[i3].x,y:points[i3].y},to:{x:points[i3+1].x,y:points[i3+1].y}});let source_trace_id=String(solvedTracePath?.mspPairId),subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let pA2=pinIdToSchematicPortId.get(solvedTracePath.pins[0]?.pinId),pB=pinIdToSchematicPortId.get(solvedTracePath.pins[1]?.pinId);if(pA2&&pB){for(let schPid of[pA2,pB])db2.schematic_port.get(schPid)&&db2.schematic_port.update(schPid,{is_connected:!0});subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))}}subcircuit_connectivity_map_key||(subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))),pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key})}debug7(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t52=>({source_trace_id:t52.source_trace_id,edges:t52.edges}))),junctionsById=computeJunctions(withCrossings);for(let t52 of withCrossings)db2.schematic_trace.insert({source_trace_id:t52.source_trace_id,edges:t52.edges,junctions:junctionsById[t52.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTraces.find(p4=>p4.source_trace_id===t52.source_trace_id)?.subcircuit_connectivity_map_key})}var oppositeSide2=input2=>{switch(input2){case"x+":return"left";case"x-":return"right";case"y+":return"bottom";case"y-":return"top";case"left":return"right";case"top":return"bottom";case"right":return"left";case"bottom":return"top"}},getNetNameFromPorts=ports=>{for(let port of ports){let traces=port._getDirectlyConnectedTraces();for(let trace of traces){let displayLabel=trace._parsedProps.schDisplayLabel;if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0}}}return{name:ports.map(p4=>p4._getNetLabelText()).join("/"),wasAssignedDisplayLabel:!1}},debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender");function applyNetLabelPlacements(args){let{group,solver,connKeyToSourceNet,userNetIdToConnKey,pinIdToSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}=args,{db:db2}=group.root,netLabelPlacements=solver.netLabelTraceCollisionSolver?.getOutput().netLabelPlacements??solver.netLabelPlacementSolver?.netLabelPlacements??solver.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],netLabelPlacementCountByGlobalNetId=new Map;for(let placement of netLabelPlacements)netLabelPlacementCountByGlobalNetId.set(placement.globalConnNetId,(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)+1);let globalConnMap=solver.mspConnectionPairSolver.globalConnMap;for(let placement of netLabelPlacements){debug8(`processing placement: ${placement.netId}`);let placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id2=>userNetIdToConnKey.get(id2)),placementConnKey=userNetIdToConnKey.get(placementUserNetId),anchor_position=placement.anchorPoint,orientation4=placement.orientation,anchor_side=oppositeSide2(orientation4),sourceNet;placementConnKey&&(sourceNet=connKeyToSourceNet.get(placementConnKey));let schPortIds=placement.pinIds.map(pinId=>pinIdToSchematicPortId.get(pinId));if(schPortIds.some(schPortId=>schematicPortIdsWithPreExistingNetLabels.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has pre-existing net label`);continue}if(sourceNet){let isPowerOrGroundNet=sourceNet.is_ground||sourceNet.is_power,hasExplicitPortNetTrace=connKeysWithExplicitPortNetTraces.has(placementConnKey),hasRoutedTraceForPlacementPort=schPortIds.some(id2=>schematicPortIdsWithRoutedTraces.has(id2)),hasSingleLabelPlacement=(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)<=1;if(!hasExplicitPortNetTrace&&!isPowerOrGroundNet&&hasRoutedTraceForPlacementPort&&hasSingleLabelPlacement){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed trace`);continue}let text2=sourceNet.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text2}),netLabel2={text:text2,source_net_id:sourceNet.source_net_id,anchor_position,center:center22,anchor_side};db2.schematic_net_label.insert(netLabel2);continue}let ports=group.selectAll("port").filter(p4=>p4._getSubcircuitConnectivityKey()===placementConnKey),{name:text,wasAssignedDisplayLabel}=getNetNameFromPorts(ports);if(!wasAssignedDisplayLabel&&(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)<=1&&schPortIds.some(schPortId=>schematicPortIdsWithRoutedTraces.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed traces and no display label`);continue}let center2=computeSchematicNetLabelCenter({anchor_position,anchor_side,text}),netLabel={text,source_net_id:placementConnKey??placement.netId??placement.globalConnNetId,anchor_position,center:center2,anchor_side};db2.schematic_net_label.insert(netLabel)}}var NEAR_EXISTING_NET_LABEL_DISTANCE=.5,SAME_ANCHOR_POSITION_DISTANCE=.1,insertNetLabelsForPortsMissingTrace=({allSourceAndSchematicPortIdsInScope,group,schPortIdToSourcePortId,connKeyToSourceNet})=>{let{db:db2}=group.root;for(let schOrSrcPortId of Array.from(allSourceAndSchematicPortIdsInScope)){let schPort=db2.schematic_port.get(schOrSrcPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schOrSrcPortId);if(!srcPortId)continue;let connKey=db2.source_port.get(srcPortId)?.subcircuit_connectivity_map_key;if(!connKey)continue;let sourceNet=connKeyToSourceNet.get(connKey);if(!sourceNet)continue;let text=sourceNet.name||sourceNet.source_net_id||connKey,connectedPortCountForKey=Array.from(allSourceAndSchematicPortIdsInScope).filter(portId=>{let sourcePortId=schPortIdToSourcePortId.get(portId);return sourcePortId?db2.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1}).length,isGndNet=sourceNet.is_ground,isPowerNet=!isGndNet&&sourceNet.is_power,usePowerSymbolSide=connectedPortCountForKey>1,side;usePowerSymbolSide&&isGndNet?side="top":usePowerSymbolSide&&isPowerNet?side="bottom":side=getEnteringEdgeFromDirection(schPort.facing_direction||"right")||"right";let center2=computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side:side,text}),sameNetLabel=db2.schematic_net_label.list().find(nl3=>sourceNet.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.text===(sourceNet.name||connKey));if(sameNetLabel&&connectedPortCountForKey<=1){db2.schematic_net_label.update(sameNetLabel.schematic_net_label_id,{text,anchor_position:schPort.center,center:center2,anchor_side:side});continue}if(sameNetLabel){let dx3=sameNetLabel.anchor_position.x-schPort.center.x,dy3=sameNetLabel.anchor_position.y-schPort.center.y;if(dx3*dx3+dy3*dy3<NEAR_EXISTING_NET_LABEL_DISTANCE*NEAR_EXISTING_NET_LABEL_DISTANCE&&sourceNet.is_ground){db2.schematic_net_label.update(sameNetLabel.schematic_net_label_id,{text,anchor_position:schPort.center,center:center2,anchor_side:side});continue}if(db2.schematic_net_label.list().some(nl3=>{let dx22=nl3.anchor_position.x-schPort.center.x,dy22=nl3.anchor_position.y-schPort.center.y;return dx22*dx22+dy22*dy22>=SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE?!1:sourceNet.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.text===(sourceNet.name||connKey)}))continue}let netLabel={text,source_net_id:sourceNet.source_net_id,anchor_position:schPort.center,center:center2,anchor_side:side};db2.schematic_net_label.insert(netLabel)}},getSchematicPortIdsWithAssignedNetLabels=group=>{let schematicPortIdsWithNetLabels=new Set,netLabels=group.selectAll("netlabel");for(let netLabel of netLabels){let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(port.schematic_port_id)}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver,pinIdToSchematicPortId})=>{let solvedTraces=solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths??[],schematicPortIdsWithRoutedTraces=new Set;for(let solvedTrace of solvedTraces){let points=solvedTrace?.tracePath;if(!Array.isArray(points)||points.length<2)continue;let pinIds=Array.isArray(solvedTrace.pins)?solvedTrace.pins.map(pin=>pin.pinId):solvedTrace.pinIds;for(let pinId of pinIds){let schPortId=pinIdToSchematicPortId.get(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}}return schematicPortIdsWithRoutedTraces},debug9=(0,import_debug15.default)("Group_doInitialSchematicTraceRender"),Group_doInitialSchematicTraceRender=group=>{if(!group.root?._featureMspSchematicTraceRouting||!group.isSubcircuit||group.root?.schematicDisabled)return;let{inputProblem,pinIdToSchematicPortId,connKeyToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,userNetIdToConnKey,connKeysWithExplicitPortNetTraces}=createSchematicTraceSolverInputProblem(group);if(inputProblem.chips.length===0)return;let schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(group);if(!(inputProblem.directConnections.length>0||inputProblem.netConnections.length>0)){insertNetLabelsForPortsMissingTrace({group,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,connKeyToSourceNet});return}debug9.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(inputProblem,null,2)});let solver=new SchematicTracePipelineSolver(inputProblem);solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver,pinIdToSchematicPortId});applyTracesFromSolverOutput({group,solver,pinIdToSchematicPortId,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}),applyNetLabelPlacements({group,solver,connKeyToSourceNet,pinIdToSchematicPortId,userNetIdToConnKey,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}),insertNetLabelsForPortsMissingTrace({group,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,connKeyToSourceNet})},getSpiceyEngine=()=>({async simulate(spiceString){let simulation_experiment_id="spice-experiment-1",{circuit:parsedCircuit,tran}=simulate(spiceString);return{simulationResultCircuitJson:spiceyTranToVGraphs(tran,parsedCircuit,simulation_experiment_id)}}}),SIMULATION_COLOR_PALETTE=["rgb(0, 150, 0)","rgb(0, 0, 220)","rgb(220, 0, 0)","rgb(0, 160, 160)","rgb(180, 0, 180)","rgb(170, 140, 0)","rgb(220, 120, 0)","rgb(128, 128, 128)","rgb(100, 0, 180)","rgb(140, 70, 0)","rgb(220, 80, 120)","rgb(0, 120, 220)","rgb(0, 120, 120)","rgb(120, 0, 0)","rgb(0, 0, 132)","rgb(80, 80, 80)"],idToColorMap=new Map,colorIndex=0;function getSimulationColorForId(id2){if(idToColorMap.has(id2))return idToColorMap.get(id2);let color=SIMULATION_COLOR_PALETTE[colorIndex];return colorIndex=(colorIndex+1)%SIMULATION_COLOR_PALETTE.length,idToColorMap.set(id2,color),color}function resetSimulationColorState(){idToColorMap.clear(),colorIndex=0}function getTransientVoltageGraphNamesFromSpiceNetlist(spiceNetlist){let graphNames=[];for(let printStatement of spiceNetlist.printStatements){let match2=printStatement.match(/^\.PRINT\s+TRAN\s+(.+)$/i);if(match2)for(let voltageExpression of match2[1].match(/V\(([^)]+)\)/g)??[]){let nodeList=voltageExpression.slice(2,-1);graphNames.push(nodeList.replace(",","-"))}}return graphNames}var debug10=(0,import_debug18.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender");function Group_doInitialSimulationSpiceEngineRender(group){if(!group.isSubcircuit)return;let{root}=group;if(!root)return;let analogSims=group.selectAll("analogsimulation");if(analogSims.length===0)return;let voltageProbes=group.selectAll("voltageprobe");resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());let circuitJson=root.db.toArray(),spiceString,spiceNetlist;try{spiceNetlist=circuitJsonToSpice(circuitJson),spiceString=spiceNetlist.toSpiceString(),debug10(`Generated SPICE string:
|
|
702
|
-
${spiceString}`)}catch(error2){debug10(`Failed to convert circuit JSON to SPICE: ${error2}`);return}let graphNameToProbe=new Map;for(let probe of voltageProbes)probe.finalProbeName&&graphNameToProbe.set(probe.finalProbeName,probe);let voltageProbesById=new Map(voltageProbes.filter(probe=>probe.simulation_voltage_probe_id).map(probe=>[probe.simulation_voltage_probe_id,probe])),orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbesById.has(probe.simulation_voltage_probe_id)),graphNamesFromNetlist=getTransientVoltageGraphNamesFromSpiceNetlist(spiceNetlist);if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[index,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbesById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[index];probe&&graphName&&graphNameToProbe.set(graphName,probe)}else debug10(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k4=>k4!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug10(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug10(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug10(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug10("No simulation experiment found, skipping result insertion");return}for(let element of result.simulationResultCircuitJson){if(element.type==="simulation_transient_voltage_graph"){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=element.name?graphNameToProbe.get(element.name):void 0;probeMatch&&(element.color=probeMatch.color)}let elementType=element.type;elementType&&root.db[elementType]?(root.db[elementType].insert(element),debug10(`Inserted ${elementType} into database`)):(debug10(`Warning: Unknown element type ${elementType}, adding to raw db`),root.db._addElement(element))}group._markDirty("SimulationSpiceEngineRender")}catch(error2){debug10(`Simulation failed for engine ${engineName}: ${error2}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db:db2}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t52=>{let source_trace3=db2.source_trace.get(t52.source_trace_id);return source_trace3?[source_trace3.source_trace_id,...source_trace3.connected_source_port_ids,...source_trace3.connected_source_net_ids]:null}).filter(c4=>c4!==null));let sourceNets=db2.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`,db2.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id2 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id2)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let source_net_id of source_trace3.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n4=>n4.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a3,b3){return getPhaseSortValue(a3.routingPhaseIndex)-getPhaseSortValue(b3.routingPhaseIndex)}function getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex){let plan=plansByPhaseIndex.get(routingPhaseIndex);return plan||(plan={routingPhaseIndex,nets:[],traces:[]},plansByPhaseIndex.set(routingPhaseIndex,plan)),plan}function getNetRoutingPhaseIndex(net){return net.props.routingPhaseIndex??null}function getTraceRoutingPhaseIndex(trace){let traceRoutingPhaseIndex=trace.props.routingPhaseIndex;if(traceRoutingPhaseIndex!==void 0)return traceRoutingPhaseIndex;let routingPhaseIndex=null,connectedNets=trace._findConnectedNets().nets;for(let net of connectedNets){let netRoutingPhaseIndex=getNetRoutingPhaseIndex(net);typeof netRoutingPhaseIndex=="number"&&(routingPhaseIndex===null||netRoutingPhaseIndex<routingPhaseIndex)&&(routingPhaseIndex=netRoutingPhaseIndex)}return routingPhaseIndex}function getAutoroutersByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),autoroutersByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let{phaseIndex,autorouter}=autoroutingPhase._parsedProps;autorouter!==void 0&&autoroutersByPhaseIndex.set(phaseIndex??null,autorouter)}return autoroutersByPhaseIndex}function getAutoroutingPhasePropsByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),propsByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let props=autoroutingPhase._parsedProps;propsByPhaseIndex.set(props.phaseIndex??null,props)}return propsByPhaseIndex}function toParsedDistance(value){if(value!==void 0)return Number(value)}function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps){let{minTraceWidth,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minTraceToPadEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minPadEdgeToPadEdgeClearance===void 0&&minBoardEdgeClearance===void 0&&minViaEdgeToPadEdgeClearance===void 0&&minViaHoleDiameter===void 0&&minViaPadDiameter===void 0))return{minTraceWidth:toParsedDistance(minTraceWidth),minViaHoleEdgeToViaHoleEdgeClearance:toParsedDistance(minViaHoleEdgeToViaHoleEdgeClearance),minPlatedHoleDrillEdgeToDrillEdgeClearance:toParsedDistance(minPlatedHoleDrillEdgeToDrillEdgeClearance),minTraceToPadEdgeClearance:toParsedDistance(minTraceToPadEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group){let traces=group.selectAll("trace"),nets=group.selectAll("net"),plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group),hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute);if(!hasDirectRoutingTargets&&!hasReroutePhase)return[];for(let net of nets){let routingPhaseIndex=getNetRoutingPhaseIndex(net);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){let routingPhaseIndex=getTraceRoutingPhaseIndex(trace);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex)phaseProps.reroute&&getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex);let plans=Array.from(plansByPhaseIndex.values()).sort(compareRoutingPhasePlans);for(let plan of plans){plan.autorouter=autoroutersByPhaseIndex.get(plan.routingPhaseIndex);let phaseProps=phasePropsByPhaseIndex.get(plan.routingPhaseIndex);plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}let defaultPhaseProps=phasePropsByPhaseIndex.get(null);if(hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[{routingPhaseIndex:null,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return plans}function isWirePoint(point62){return point62.route_type==="wire"}function isViaPoint(point62){return point62.route_type==="via"}function isJumperPoint(point62){return point62.route_type==="jumper"}function getTraceConnectionName(trace){return trace.connection_name??trace.pcb_trace_id}function getWireWidth(start,end){return isWirePoint(start)?start.width:isWirePoint(end)?end.width:.1}function getSegmentLayer(start,end){return isWirePoint(start)?start.layer:isWirePoint(end)?end.layer:isJumperPoint(start)?start.layer:isJumperPoint(end)?end.layer:null}function getRoutePointX(point62){return isJumperPoint(point62)||point62.route_type==="through_obstacle"?null:point62.x}function getRoutePointY(point62){return isJumperPoint(point62)||point62.route_type==="through_obstacle"?null:point62.y}function createWireObstacle(start,end,connectedTo,obstacleIndex){let startX=getRoutePointX(start),startY=getRoutePointY(start),endX=getRoutePointX(end),endY=getRoutePointY(end),layer=getSegmentLayer(start,end);if(startX===null||startY===null||endX===null||endY===null||!layer)return null;let width=getWireWidth(start,end),dx3=Math.abs(startX-endX),dy3=Math.abs(startY-endY);return{obstacleId:`${connectedTo}_phase_obstacle_${obstacleIndex}`,type:"rect",layers:[layer],center:{x:(startX+endX)/2,y:(startY+endY)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createJumperObstacle(point62,connectedTo,obstacleIndex){let dx3=Math.abs(point62.start.x-point62.end.x),dy3=Math.abs(point62.start.y-point62.end.y),width=.6;return{obstacleId:`${connectedTo}_phase_jumper_obstacle_${obstacleIndex}`,type:"rect",layers:[point62.layer],center:{x:(point62.start.x+point62.end.x)/2,y:(point62.start.y+point62.end.y)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createViaObstacle(point62,connectedTo,obstacleIndex){return{obstacleId:`${connectedTo}_phase_via_obstacle_${obstacleIndex}`,type:"rect",layers:[point62.from_layer,point62.to_layer],center:{x:point62.x,y:point62.y},width:.6,height:.6,connectedTo:[connectedTo]}}function addTraceObstacles(obstacles,trace){let connectedTo=getTraceConnectionName(trace);for(let routeIndex=0;routeIndex<trace.route.length;routeIndex++){let routePoint=trace.route[routeIndex];if(isViaPoint(routePoint)?obstacles.push(createViaObstacle(routePoint,connectedTo,routeIndex)):isJumperPoint(routePoint)&&obstacles.push(createJumperObstacle(routePoint,connectedTo,routeIndex)),routeIndex===trace.route.length-1)continue;let nextPoint=trace.route[routeIndex+1],obstacle=createWireObstacle(routePoint,nextPoint,connectedTo,routeIndex);obstacle&&obstacles.push(obstacle)}}function connectionIsInRoutingPhase(connection,phasePlan){for(let trace of phasePlan.traces)if(trace.source_trace_id&&(connection.source_trace_id===trace.source_trace_id||connection.name===trace.source_trace_id))return!0;for(let net of phasePlan.nets)if(net.source_net_id&&connection.name===net.source_net_id)return!0;return!1}function Group_hasPhasedAutorouting(routingPhasePlans){for(let plan of routingPhasePlans)if(plan.routingPhaseIndex!==null)return!0;return!1}function Group_filterSimpleRouteJsonForPhase(simpleRouteJson,phasePlan){let connections=[];for(let connection of simpleRouteJson.connections)connectionIsInRoutingPhase(connection,phasePlan)&&connections.push(connection);return{...simpleRouteJson,connections}}function hasDrcTolerances(drcTolerances){return drcTolerances?Object.values(drcTolerances).some(value=>value!==void 0):!1}function applyMinTraceWidthToConnections(connections,minTraceWidth){return minTraceWidth===void 0?connections:connections.map(connection=>({...connection,nominalTraceWidth:Math.max(connection.nominalTraceWidth??minTraceWidth,minTraceWidth),width:Math.max(connection.width??minTraceWidth,minTraceWidth)}))}function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,drcTolerances){if(!hasDrcTolerances(drcTolerances))return simpleRouteJson;let minTraceWidth=drcTolerances.minTraceWidth??simpleRouteJson.minTraceWidth,minViaHoleDiameter=drcTolerances.minViaHoleDiameter??simpleRouteJson.minViaHoleDiameter,minViaPadDiameter=drcTolerances.minViaPadDiameter??simpleRouteJson.minViaPadDiameter,minTraceToPadEdgeClearance=drcTolerances.minTraceToPadEdgeClearance??simpleRouteJson.minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance=drcTolerances.minViaEdgeToPadEdgeClearance??simpleRouteJson.minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance=drcTolerances.minViaHoleEdgeToViaHoleEdgeClearance??simpleRouteJson.minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance=drcTolerances.minPlatedHoleDrillEdgeToDrillEdgeClearance??simpleRouteJson.minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance=drcTolerances.minPadEdgeToPadEdgeClearance??simpleRouteJson.minPadEdgeToPadEdgeClearance,minBoardEdgeClearance=drcTolerances.minBoardEdgeClearance??simpleRouteJson.minBoardEdgeClearance;return{...simpleRouteJson,connections:applyMinTraceWidthToConnections(simpleRouteJson.connections,drcTolerances.minTraceWidth),minTraceWidth,minViaDiameter:minViaPadDiameter,minViaHoleDiameter,minViaPadDiameter,min_via_hole_diameter:minViaHoleDiameter,min_via_pad_diameter:minViaPadDiameter,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}function Group_getObstaclesFromRoutedTraces(traces){let obstacles=[];for(let trace of traces)addTraceObstacles(obstacles,trace);return obstacles}function getJumperPadInfos(db2){let padInfos=[],jumperSmtpads=db2.pcb_smtpad.list().filter(pad2=>{let component=db2.pcb_component.get(pad2.pcb_component_id);return component?db2.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x4,y4,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x4)<tolerance&&Math.abs(pad2.y-y4)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x4,y4){for(let pad2 of padInfos)if(x4>=pad2.minX&&x4<=pad2.maxX&&y4>=pad2.minY&&y4<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i3=0;i3<route.length;i3++){let point62=route[i3];if(currentSegment.push(point62),point62.route_type==="wire"&&i3>0&&i3<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point62.x,point62.y);if(padInfo){point62.end_pcb_port_id||(point62.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point62};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db2){let padInfos=getJumperPadInfos(db2);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g6=>g6.length>=2)}function insertAutoplacedJumpers(params){let{db:db2,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db2.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation42=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db2.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation42,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db2.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db2.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db2.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p4=>Math.abs(p4.pad.center.x-groupPad.center.x)<.01&&Math.abs(p4.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db2.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function convertPcbTraceToSimplifiedPcbTrace(trace){return{...trace,type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,connection_name:trace.connection_name??trace.source_trace_id??trace.pcb_trace_id,route:trace.route.map(point62=>({...point62}))}}function getRelevantSubcircuitIdsForReroute(group){let relevantSubcircuitIds=new Set;if(!group.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group.subcircuit_id);let db2=group.root?.db;if(!db2)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds(db2,group.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group){let db2=group.root?.db;if(!db2)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group);return db2.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group.subcircuit_id?!!(trace.subcircuit_id&&relevantSubcircuitIds.has(trace.subcircuit_id)):!0)}function getSourceTraceIdsFromRerouteName(value){return typeof value!="string"||value.length===0?[]:value.split("__").flatMap(connectionNamePart=>{if(connectionNamePart.length===0)return[];let sourceTraceIds=[connectionNamePart],rerouteSuffixIndex=connectionNamePart.indexOf("_reroute_");return rerouteSuffixIndex>0&&sourceTraceIds.push(connectionNamePart.slice(0,rerouteSuffixIndex)),sourceTraceIds})}function addPossibleReplacementSourceTraceId(sourceTraceIds,value){if(!(typeof value!="string"||value.length===0)){sourceTraceIds.add(value);for(let sourceTraceId of getSourceTraceIdsFromRerouteName(value))sourceTraceIds.add(sourceTraceId)}}function deleteExistingPcbTracesReplacedBy({group,outputPcbTraces}){let db2=group.root?.db;if(!db2)return;let replacementPcbTraceIds=new Set,replacementSourceTraceIds=new Set;for(let trace of outputPcbTraces){if(trace.type!=="pcb_trace")continue;let replacementTrace=trace;replacementPcbTraceIds.add(replacementTrace.pcb_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.source_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.connection_name),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.rootConnectionName)}if(replacementPcbTraceIds.size===0&&replacementSourceTraceIds.size===0)return;let tracesToDelete=getExistingPcbTracesForReroute(group).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&replacementSourceTraceIds.has(trace.source_trace_id)));if(tracesToDelete.length===0)return;let deletedPcbTraceIds=new Set(tracesToDelete.map(trace=>trace.pcb_trace_id));for(let via of db2.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db2.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db2.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group){return getExistingPcbTracesForReroute(group).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p4=>p4.route_type==="jumper"),wireAndViaRoutes=route.filter(p4=>p4.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i3=0;i3<wireAndViaRoutes.length;i3++){let p4=wireAndViaRoutes[i3];if(p4.route_type!=="wire")continue;let distToStart=Math.hypot(p4.x-jumperStart.x,p4.y-jumperStart.y),distToEnd=Math.hypot(p4.x-jumperEnd.x,p4.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i3),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i3)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a3,b3)=>a3.startIdx-b3.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return anchorPosition;let ax3=anchorPosition.x,ay3=anchorPosition.y;switch(alignment){case"top_left":return{x:ax3+width/2,y:ay3-height/2};case"top_center":return{x:ax3,y:ay3-height/2};case"top_right":return{x:ax3-width/2,y:ay3-height/2};case"center_left":return{x:ax3+width/2,y:ay3};case"center_right":return{x:ax3-width/2,y:ay3};case"bottom_left":return{x:ax3+width/2,y:ay3+height/2};case"bottom_center":return{x:ax3,y:ay3+height/2};case"bottom_right":return{x:ax3-width/2,y:ay3+height/2};default:return anchorPosition}}var Group5=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}initPorts(opts={}){let schPinArrangement=this._getSchematicPortArrangement();this._parsedProps?.showAsSchematicBox&&!this._parsedProps.pinLabels&&schPinArrangement&&getPinsFromPortArrangement(schPinArrangement).some(pin=>typeof pin=="string")||super.initPorts(opts)}_getSchematicPortArrangementFromPortDirections(){if(!this._parsedProps?.showAsSchematicBox)return null;let sidePins={leftSide:[],rightSide:[],topSide:[],bottomSide:[]};for(let port of this.children){if(port.componentName!=="Port")continue;let direction2=port._parsedProps.direction;if(!direction2)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction2==="left"?"leftSide":direction2==="right"?"rightSide":direction2==="up"?"topSide":"bottomSide"].push(pin)}if(sidePins.leftSide.length===0&&sidePins.rightSide.length===0&&sidePins.topSide.length===0&&sidePins.bottomSide.length===0)return null;let arrangement={};return sidePins.leftSide.length>0&&(arrangement.leftSide={pins:sidePins.leftSide,direction:"top-to-bottom"}),sidePins.rightSide.length>0&&(arrangement.rightSide={pins:sidePins.rightSide,direction:"top-to-bottom"}),sidePins.topSide.length>0&&(arrangement.topSide={pins:sidePins.topSide,direction:"left-to-right"}),sidePins.bottomSide.length>0&&(arrangement.bottomSide={pins:sidePins.bottomSide,direction:"left-to-right"}),arrangement}_getSchematicPortArrangement(){return super._getSchematicPortArrangement()??this._getSchematicPortArrangementFromPortDirections()}_ensureSchematicBoxPortsFromConnections(){if(this._parsedProps?.showAsSchematicBox&&this._parsedProps?.connections)for(let[pinName,target]of Object.entries(this._parsedProps.connections)){if(this.children.find(child=>child.componentName==="Port"&&child.isMatchingAnyOf([pinName])))continue;let pinNumberMatch=pinName.match(/^pin(\d+)$/i)??pinName.match(/^(\d+)$/),pinNumber=pinNumberMatch?Number(pinNumberMatch[1]):void 0;this.add(new Port({name:pinName,pinNumber,connectsTo:target}))}}doInitialInitializePortsFromChildren(){super.doInitialInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}updateInitializePortsFromChildren(){super.updateInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}_getPrimaryPinCount(){let superPinCount=super._getPrimaryPinCount();if(!this._parsedProps?.showAsSchematicBox)return superPinCount;let directPortPinNumbers=this.children.filter(child=>child.componentName==="Port").map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0);return directPortPinNumbers.length===0?superPinCount:Math.max(superPinCount,...directPortPinNumbers)}_getPinLabelsFromPorts(){return this._parsedProps?.showAsSchematicBox?getGroupSchematicBoxPinLabels(this):super._getPinLabelsFromPorts()}doInitialSourceGroupRender(){let{db:db2}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db2.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group3.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group3.source_group_id}`,db2.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db2}=this.root;for(let child of this.children)db2.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db:db2}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db2.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db2.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group3=db2.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group3.pcb_group_id;for(let child of this.children)db2.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db2}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db2.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let resolvedWidth=Number(props.width??width),resolvedHeight=Number(props.height??height),existingPcbGroup=db2.pcb_group.get(this.pcb_group_id),center2=hasExplicitPositioning?existingPcbGroup?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};if(hasExplicitPositioning&&props.pcbAnchorAlignment){let anchorPosition=this._getGlobalPcbPositionBeforeLayout(),anchorAlignedCenter=computeCenterFromAnchorPosition(anchorPosition,{...this.props,width:resolvedWidth,height:resolvedHeight});(Math.abs(anchorAlignedCenter.x-center2.x)>1e-6||Math.abs(anchorAlignedCenter.y-center2.y)>1e-6)&&this._repositionOnPcb(anchorAlignedCenter),center2=anchorAlignedCenter}db2.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a463,_b3;return(_a463=this.unnamedElementCounter)[_b3=elm.lowercaseComponentName]??(_a463[_b3]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db:db2}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this.selectAll("group").filter(g6=>g6.isSubcircuit);for(let subcircuitChild of subcircuitChildren)if(subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug112=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithRegion=!1;for(let routingPhasePlan of routingPhasePlans)traceCount+=routingPhasePlan.traces.length,hasReroutePhaseWithRegion||(hasReroutePhaseWithRegion=!!(routingPhasePlan.reroute&&routingPhasePlan.region));if(debug112(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithRegion){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug112(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db2}=this.root,debug112=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug112("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db2.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err.message}),err}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db2}=this.root,props=this._parsedProps,debug112=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug112(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.nominalTraceWidth??.15),{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=Group_hasPhasedAutorouting(routingPhasePlans),outputTraces=[],outputJumpers=[],existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this);for(let routingPhasePlan of routingPhasePlans){let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,simpleRouteJson=baseSimpleRouteJson,isReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region),rerouteOriginalSrj=isReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(isReroutePhase&&rerouteOriginalSrj?simpleRouteJson=KB(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region}):hasPhasedAutorouting&&(simpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),simpleRouteJson.obstacles=[...simpleRouteJson.obstacles,...Group_getObstaclesFromRoutedTraces(outputTraces)]),simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),(hasPhasedAutorouting||isReroutePhase)&&simpleRouteJson.connections.length===0)continue;let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;if(phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes)),debug112.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug112.enabled){let graphicsObject=Co2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(phaseAutorouterConfig.algorithmFn)autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug112(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug112(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise;if(autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isReroutePhase&&rerouteOriginalSrj){let reconnectedSrj=QB(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else outputTraces.push(...traces)}catch(error2){let{db:db22}=this.root;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error2 instanceof Error?error2.message:String(error2)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!(this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug112(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug112(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug112(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug112(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db2}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug112(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug112(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db2}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let pcb_trace3=db2.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:routedTrace.route})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),board=db2.pcb_board.list()[0],routedViaHoleDiameter=board?.min_via_hole_diameter??holeDiameter,routedViaPadDiameter=board?.min_via_pad_diameter??padDiameter;output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db2,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces});for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;let possibleSourceTraceIds=[...getSourceTraceIdsFromRerouteName(pcb_trace3.source_trace_id),...getSourceTraceIdsFromRerouteName(pcb_trace3.connection_name),...getSourceTraceIdsFromRerouteName(pcb_trace3.rootConnectionName)],validSourceTraceIds=Array.from(new Set(possibleSourceTraceIds)).filter(possibleSourceTraceId=>!!(db2.source_trace.get(possibleSourceTraceId)??db2.source_net.get(possibleSourceTraceId))),sourceTraceId=validSourceTraceIds.length===1?validSourceTraceIds[0]:void 0;sourceTraceId?pcb_trace3.source_trace_id=sourceTraceId:delete pcb_trace3.source_trace_id,pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=(sourceTraceId?db2.source_trace.get(sourceTraceId)?.subcircuit_id??db2.source_net.get(sourceTraceId)?.subcircuit_id:void 0)??this.subcircuit_id);let segments=splitPcbTracesOnJumperSegments(pcb_trace3.route);segments===null&&(segments=[pcb_trace3.route]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db2);for(let segment2 of processedSegments)segment2.length>0&&db2.pcb_trace.insert({...pcb_trace3,route:segment2})}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){for(let point62 of pcb_trace3.route)if(point62.route_type==="via"){let routedViaPoint=point62;db2.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point62.x,y:point62.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:[point62.from_layer,point62.to_layer],from_layer:point62.from_layer,to_layer:point62.to_layer})}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,schematic_group3=db2.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id,show_as_schematic_box:props.showAsSchematicBox??!1});this.schematic_group_id=schematic_group3.schematic_group_id,props.showAsSchematicBox&&Group_doInitialSchematicBoxComponentRender(this);for(let child of this.children)child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db2.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group3.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){if(this._parsedProps.showAsSchematicBox){this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db:db2}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db2.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db2.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db2.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db2.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx3=port.center.x-component.center.x,dy3=port.center.y-component.center.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>0?"right":"left":dy3>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter,this.root?.platform)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db2}=this.root;if(this.isSubcircuit){let subcircuitComponentsByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=subcircuitComponentsByName.get(child._parsedProps.name)||[];components.push(child),subcircuitComponentsByName.set(child._parsedProps.name,components)}for(let[name,components]of subcircuitComponentsByName.entries())components.length>1&&db2.pcb_trace_error.insert({error_type:"pcb_trace_error",message:`Multiple components found with name "${name}" in subcircuit "${this.name||"unnamed"}". Component names must be unique within a subcircuit.`,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c4=>c4.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db2}=this.root,subtree=db2;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&/^gnd/i.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&/^v/i.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position4){return super._repositionOnPcb(position4)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.source_group_id}),groupProps2={name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`};if(pcbGroup?.position_mode==="relative_to_group_anchor"&&pcbGroup.anchor_position){let baseAnchor={x:0,y:0};if(sourceGroup.parent_source_group_id){let parentPcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.parent_source_group_id});parentPcbGroup?.anchor_position&&(baseAnchor=parentPcbGroup.anchor_position)}groupProps2.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps2.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps2.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group=new Group5(groupProps2);return group._isInflatedFromCircuitJson=!0,group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),inductor=new Inductor({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db:db2}=root,pcb_port3=db2.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port3.pcb_port_id}}var PushButton=class extends NormalComponent3{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:pushButtonProps,sourceFtype:FTYPE.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let symbol=Vf[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p4=>p4.labels.includes("1")),symPort2=symbol.ports.find(p4=>p4.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p4=>p4.props.pinNumber===1),pin2Port=ports.find(p4=>p4.props.pinNumber===2),pin3Port=ports.find(p4=>p4.props.pinNumber===3),pin4Port=ports.find(p4=>p4.props.pinNumber===4),{internallyConnectedPins}=this._parsedProps;pin1Port.schematicSymbolPortDef=symPort1,(!internallyConnectedPins||internallyConnectedPins.length===0)&&(pin2Port.schematicSymbolPortDef=symPort2);for(let[pn3,port]of[[2,pin2Port],[3,pin3Port],[4,pin4Port]]){let internallyConnectedRow=internallyConnectedPins?.find(([pin1,pin2])=>pin1===`pin${pn3}`||pin2===`pin${pn3}`);if(!internallyConnectedRow){port.schematicSymbolPortDef=symPort2;break}(internallyConnectedRow?.[0]===`pin${pn3}`?internallyConnectedRow[1]:internallyConnectedRow?.[0])!=="pin1"&&(port.schematicSymbolPortDef=symPort2)}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourcePushButton(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),pushButton=new PushButton({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:pushButton});footprint&&pushButton.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(pushButton):subcircuit.add(pushButton)}var Resistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),resistor=new Resistor({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point62=>{let position4=getRoutePointPosition(point62),firstPosition=getRoutePointPosition(firstPoint),lastPosition=getRoutePointPosition(lastPoint),isSameAsFirst=position4.x===firstPosition.x&&position4.y===firstPosition.y,isSameAsLast=position4.x===lastPosition.x&&position4.y===lastPosition.y;return!isSameAsFirst&&!isSameAsLast}).map(point62=>{if(point62.route_type==="via")return{x:point62.x,y:point62.y,via:!0,fromLayer:point62.from_layer,toLayer:point62.to_layer};let position4=getRoutePointPosition(point62);return{x:position4.x,y:position4.y}})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&¤tGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTrace=injectionDb.pcb_trace.getWhere({source_trace_id:sourceTrace.source_trace_id}),pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt3=>pt3.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:!pcbTrace&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);trace._inflatedPcbTrace=pcbTrace??void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>via.pcb_trace_id===pcbTrace.pcb_trace_id):void 0,subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line","pcb_via"],standalonePrimitives=injectionDb.toArray().filter(elm=>{if(!standalonePrimitiveTypes.includes(elm.type))return!1;if(elm.type==="pcb_via"){if(!elm.pcb_trace_id)return!0;let pcbTrace=injectionDb.pcb_trace.get(elm.pcb_trace_id),sourceTraceId=pcbTrace?.source_trace_id;return!(sourceTraceId&&injectionDb.source_trace.get(sourceTraceId)&&pcbTrace?.route.some(point62=>point62.route_type==="via"&&Math.abs(point62.x-elm.x)<1e-4&&Math.abs(point62.y-elm.y)<1e-4))}return"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0)});if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g6=>!g6.parent_source_group_id||renderedGroupIds.has(g6.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g6=>g6.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1252",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.25","@tscircuit/capacity-autorouter":"^0.0.505","@tscircuit/checks":"0.0.129","@tscircuit/circuit-json-util":"^0.0.94","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.29","@tscircuit/footprinter":"^0.0.357","@tscircuit/infer-cable-insertion-point":"^0.0.2","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5","@tscircuit/krt-wasm":"^0.1.0","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.8","@tscircuit/props":"^0.0.531","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^0.0.57","@tscircuit/solver-utils":"^0.0.3","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.425","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.96","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.34","circuit-to-svg":"^0.0.345",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.89",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.60",kicadts:"^0.0.35","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.208",spicey:"^0.0.14","stack-svgs":"^0.0.1","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.1","calculate-packing":"0.0.73","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.pcbRoutingDisabled=platform?.routingDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react4.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform},platform.pcbDisabled!==void 0&&(this.pcbDisabled=platform.pcbDisabled),platform.routingDisabled!==void 0&&(this.pcbRoutingDisabled=platform.routingDisabled)}_getBoard(){let directBoard=this.children.find(c4=>c4.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group5({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db2}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getRunningAsyncEffects(){return Array.from(this._runningAsyncEffectsById.values())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist8(),dist_exports3)).catch(e5=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
702
|
+
${spiceString}`)}catch(error2){debug10(`Failed to convert circuit JSON to SPICE: ${error2}`);return}let graphNameToProbe=new Map;for(let probe of voltageProbes)probe.finalProbeName&&graphNameToProbe.set(probe.finalProbeName,probe);let voltageProbesById=new Map(voltageProbes.filter(probe=>probe.simulation_voltage_probe_id).map(probe=>[probe.simulation_voltage_probe_id,probe])),orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbesById.has(probe.simulation_voltage_probe_id)),graphNamesFromNetlist=getTransientVoltageGraphNamesFromSpiceNetlist(spiceNetlist);if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[index,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbesById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[index];probe&&graphName&&graphNameToProbe.set(graphName,probe)}else debug10(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k4=>k4!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug10(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug10(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug10(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug10("No simulation experiment found, skipping result insertion");return}for(let element of result.simulationResultCircuitJson){if(element.type==="simulation_transient_voltage_graph"){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=element.name?graphNameToProbe.get(element.name):void 0;probeMatch&&(element.color=probeMatch.color)}let elementType=element.type;elementType&&root.db[elementType]?(root.db[elementType].insert(element),debug10(`Inserted ${elementType} into database`)):(debug10(`Warning: Unknown element type ${elementType}, adding to raw db`),root.db._addElement(element))}group._markDirty("SimulationSpiceEngineRender")}catch(error2){debug10(`Simulation failed for engine ${engineName}: ${error2}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db:db2}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t52=>{let source_trace3=db2.source_trace.get(t52.source_trace_id);return source_trace3?[source_trace3.source_trace_id,...source_trace3.connected_source_port_ids,...source_trace3.connected_source_net_ids]:null}).filter(c4=>c4!==null));let sourceNets=db2.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`,db2.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id2 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id2)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let source_net_id of source_trace3.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n4=>n4.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a3,b3){return getPhaseSortValue(a3.routingPhaseIndex)-getPhaseSortValue(b3.routingPhaseIndex)}function getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex){let plan=plansByPhaseIndex.get(routingPhaseIndex);return plan||(plan={routingPhaseIndex,nets:[],traces:[]},plansByPhaseIndex.set(routingPhaseIndex,plan)),plan}function getNetRoutingPhaseIndex(net){return net.props.routingPhaseIndex??null}function getTraceRoutingPhaseIndex(trace){let traceRoutingPhaseIndex=trace.props.routingPhaseIndex;if(traceRoutingPhaseIndex!==void 0)return traceRoutingPhaseIndex;let routingPhaseIndex=null,connectedNets=trace._findConnectedNets().nets;for(let net of connectedNets){let netRoutingPhaseIndex=getNetRoutingPhaseIndex(net);typeof netRoutingPhaseIndex=="number"&&(routingPhaseIndex===null||netRoutingPhaseIndex<routingPhaseIndex)&&(routingPhaseIndex=netRoutingPhaseIndex)}return routingPhaseIndex}function getAutoroutersByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),autoroutersByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let{phaseIndex,autorouter}=autoroutingPhase._parsedProps;autorouter!==void 0&&autoroutersByPhaseIndex.set(phaseIndex??null,autorouter)}return autoroutersByPhaseIndex}function getAutoroutingPhasePropsByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),propsByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let props=autoroutingPhase._parsedProps;propsByPhaseIndex.set(props.phaseIndex??null,props)}return propsByPhaseIndex}function toParsedDistance(value){if(value!==void 0)return Number(value)}function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps){let{minTraceWidth,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minTraceToPadEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minPadEdgeToPadEdgeClearance===void 0&&minBoardEdgeClearance===void 0&&minViaEdgeToPadEdgeClearance===void 0&&minViaHoleDiameter===void 0&&minViaPadDiameter===void 0))return{minTraceWidth:toParsedDistance(minTraceWidth),minViaHoleEdgeToViaHoleEdgeClearance:toParsedDistance(minViaHoleEdgeToViaHoleEdgeClearance),minPlatedHoleDrillEdgeToDrillEdgeClearance:toParsedDistance(minPlatedHoleDrillEdgeToDrillEdgeClearance),minTraceToPadEdgeClearance:toParsedDistance(minTraceToPadEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group){let traces=group.selectAll("trace"),nets=group.selectAll("net"),plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group),hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute);if(!hasDirectRoutingTargets&&!hasReroutePhase)return[];for(let net of nets){let routingPhaseIndex=getNetRoutingPhaseIndex(net);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){let routingPhaseIndex=getTraceRoutingPhaseIndex(trace);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex)phaseProps.reroute&&getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex);let plans=Array.from(plansByPhaseIndex.values()).sort(compareRoutingPhasePlans);for(let plan of plans){plan.autorouter=autoroutersByPhaseIndex.get(plan.routingPhaseIndex);let phaseProps=phasePropsByPhaseIndex.get(plan.routingPhaseIndex);plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}let defaultPhaseProps=phasePropsByPhaseIndex.get(null);if(hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[{routingPhaseIndex:null,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return plans}function isWirePoint(point62){return point62.route_type==="wire"}function isViaPoint(point62){return point62.route_type==="via"}function isJumperPoint(point62){return point62.route_type==="jumper"}function getTraceConnectionName(trace){return trace.connection_name??trace.pcb_trace_id}function getWireWidth(start,end){return isWirePoint(start)?start.width:isWirePoint(end)?end.width:.1}function getSegmentLayer(start,end){return isWirePoint(start)?start.layer:isWirePoint(end)?end.layer:isJumperPoint(start)?start.layer:isJumperPoint(end)?end.layer:null}function getRoutePointX(point62){return isJumperPoint(point62)||point62.route_type==="through_obstacle"?null:point62.x}function getRoutePointY(point62){return isJumperPoint(point62)||point62.route_type==="through_obstacle"?null:point62.y}function createWireObstacle(start,end,connectedTo,obstacleIndex){let startX=getRoutePointX(start),startY=getRoutePointY(start),endX=getRoutePointX(end),endY=getRoutePointY(end),layer=getSegmentLayer(start,end);if(startX===null||startY===null||endX===null||endY===null||!layer)return null;let width=getWireWidth(start,end),dx3=Math.abs(startX-endX),dy3=Math.abs(startY-endY);return{obstacleId:`${connectedTo}_phase_obstacle_${obstacleIndex}`,type:"rect",layers:[layer],center:{x:(startX+endX)/2,y:(startY+endY)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createJumperObstacle(point62,connectedTo,obstacleIndex){let dx3=Math.abs(point62.start.x-point62.end.x),dy3=Math.abs(point62.start.y-point62.end.y),width=.6;return{obstacleId:`${connectedTo}_phase_jumper_obstacle_${obstacleIndex}`,type:"rect",layers:[point62.layer],center:{x:(point62.start.x+point62.end.x)/2,y:(point62.start.y+point62.end.y)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createViaObstacle(point62,connectedTo,obstacleIndex){return{obstacleId:`${connectedTo}_phase_via_obstacle_${obstacleIndex}`,type:"rect",layers:[point62.from_layer,point62.to_layer],center:{x:point62.x,y:point62.y},width:.6,height:.6,connectedTo:[connectedTo]}}function addTraceObstacles(obstacles,trace){let connectedTo=getTraceConnectionName(trace);for(let routeIndex=0;routeIndex<trace.route.length;routeIndex++){let routePoint=trace.route[routeIndex];if(isViaPoint(routePoint)?obstacles.push(createViaObstacle(routePoint,connectedTo,routeIndex)):isJumperPoint(routePoint)&&obstacles.push(createJumperObstacle(routePoint,connectedTo,routeIndex)),routeIndex===trace.route.length-1)continue;let nextPoint=trace.route[routeIndex+1],obstacle=createWireObstacle(routePoint,nextPoint,connectedTo,routeIndex);obstacle&&obstacles.push(obstacle)}}function connectionIsInRoutingPhase(connection,phasePlan){for(let trace of phasePlan.traces)if(trace.source_trace_id&&(connection.source_trace_id===trace.source_trace_id||connection.name===trace.source_trace_id))return!0;for(let net of phasePlan.nets)if(net.source_net_id&&connection.name===net.source_net_id)return!0;return!1}function Group_hasPhasedAutorouting(routingPhasePlans){for(let plan of routingPhasePlans)if(plan.routingPhaseIndex!==null)return!0;return!1}function Group_filterSimpleRouteJsonForPhase(simpleRouteJson,phasePlan){let connections=[];for(let connection of simpleRouteJson.connections)connectionIsInRoutingPhase(connection,phasePlan)&&connections.push(connection);return{...simpleRouteJson,connections}}function hasDrcTolerances(drcTolerances){return drcTolerances?Object.values(drcTolerances).some(value=>value!==void 0):!1}function applyMinTraceWidthToConnections(connections,minTraceWidth){return minTraceWidth===void 0?connections:connections.map(connection=>({...connection,nominalTraceWidth:Math.max(connection.nominalTraceWidth??minTraceWidth,minTraceWidth),width:Math.max(connection.width??minTraceWidth,minTraceWidth)}))}function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,drcTolerances){if(!hasDrcTolerances(drcTolerances))return simpleRouteJson;let minTraceWidth=drcTolerances.minTraceWidth??simpleRouteJson.minTraceWidth,minViaHoleDiameter=drcTolerances.minViaHoleDiameter??simpleRouteJson.minViaHoleDiameter,minViaPadDiameter=drcTolerances.minViaPadDiameter??simpleRouteJson.minViaPadDiameter,minTraceToPadEdgeClearance=drcTolerances.minTraceToPadEdgeClearance??simpleRouteJson.minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance=drcTolerances.minViaEdgeToPadEdgeClearance??simpleRouteJson.minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance=drcTolerances.minViaHoleEdgeToViaHoleEdgeClearance??simpleRouteJson.minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance=drcTolerances.minPlatedHoleDrillEdgeToDrillEdgeClearance??simpleRouteJson.minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance=drcTolerances.minPadEdgeToPadEdgeClearance??simpleRouteJson.minPadEdgeToPadEdgeClearance,minBoardEdgeClearance=drcTolerances.minBoardEdgeClearance??simpleRouteJson.minBoardEdgeClearance;return{...simpleRouteJson,connections:applyMinTraceWidthToConnections(simpleRouteJson.connections,drcTolerances.minTraceWidth),minTraceWidth,minViaDiameter:minViaPadDiameter,minViaHoleDiameter,minViaPadDiameter,min_via_hole_diameter:minViaHoleDiameter,min_via_pad_diameter:minViaPadDiameter,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}function Group_getObstaclesFromRoutedTraces(traces){let obstacles=[];for(let trace of traces)addTraceObstacles(obstacles,trace);return obstacles}function getJumperPadInfos(db2){let padInfos=[],jumperSmtpads=db2.pcb_smtpad.list().filter(pad2=>{let component=db2.pcb_component.get(pad2.pcb_component_id);return component?db2.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x4,y4,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x4)<tolerance&&Math.abs(pad2.y-y4)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x4,y4){for(let pad2 of padInfos)if(x4>=pad2.minX&&x4<=pad2.maxX&&y4>=pad2.minY&&y4<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i3=0;i3<route.length;i3++){let point62=route[i3];if(currentSegment.push(point62),point62.route_type==="wire"&&i3>0&&i3<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point62.x,point62.y);if(padInfo){point62.end_pcb_port_id||(point62.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point62};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db2){let padInfos=getJumperPadInfos(db2);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g6=>g6.length>=2)}function insertAutoplacedJumpers(params){let{db:db2,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db2.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation42=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db2.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation42,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db2.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db2.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db2.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p4=>Math.abs(p4.pad.center.x-groupPad.center.x)<.01&&Math.abs(p4.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db2.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function convertPcbTraceToSimplifiedPcbTrace(trace){return{...trace,type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,connection_name:trace.connection_name??trace.source_trace_id??trace.pcb_trace_id,route:trace.route.map(point62=>({...point62}))}}function getRelevantSubcircuitIdsForReroute(group){let relevantSubcircuitIds=new Set;if(!group.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group.subcircuit_id);let db2=group.root?.db;if(!db2)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds(db2,group.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group){let db2=group.root?.db;if(!db2)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group);return db2.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group.subcircuit_id?!!(trace.subcircuit_id&&relevantSubcircuitIds.has(trace.subcircuit_id)):!0)}function getSourceTraceIdsFromRerouteName(value){return typeof value!="string"||value.length===0?[]:value.split("__").flatMap(connectionNamePart=>{if(connectionNamePart.length===0)return[];let sourceTraceIds=[connectionNamePart],rerouteSuffixIndex=connectionNamePart.indexOf("_reroute_");return rerouteSuffixIndex>0&&sourceTraceIds.push(connectionNamePart.slice(0,rerouteSuffixIndex)),sourceTraceIds})}function addPossibleReplacementSourceTraceId(sourceTraceIds,value){if(!(typeof value!="string"||value.length===0)){sourceTraceIds.add(value);for(let sourceTraceId of getSourceTraceIdsFromRerouteName(value))sourceTraceIds.add(sourceTraceId)}}function deleteExistingPcbTracesReplacedBy({group,outputPcbTraces}){let db2=group.root?.db;if(!db2)return;let replacementPcbTraceIds=new Set,replacementSourceTraceIds=new Set;for(let trace of outputPcbTraces){if(trace.type!=="pcb_trace")continue;let replacementTrace=trace;replacementPcbTraceIds.add(replacementTrace.pcb_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.source_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.connection_name),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.rootConnectionName)}if(replacementPcbTraceIds.size===0&&replacementSourceTraceIds.size===0)return;let tracesToDelete=getExistingPcbTracesForReroute(group).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&replacementSourceTraceIds.has(trace.source_trace_id)));if(tracesToDelete.length===0)return;let deletedPcbTraceIds=new Set(tracesToDelete.map(trace=>trace.pcb_trace_id));for(let via of db2.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db2.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db2.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group){return getExistingPcbTracesForReroute(group).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p4=>p4.route_type==="jumper"),wireAndViaRoutes=route.filter(p4=>p4.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i3=0;i3<wireAndViaRoutes.length;i3++){let p4=wireAndViaRoutes[i3];if(p4.route_type!=="wire")continue;let distToStart=Math.hypot(p4.x-jumperStart.x,p4.y-jumperStart.y),distToEnd=Math.hypot(p4.x-jumperEnd.x,p4.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i3),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i3)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a3,b3)=>a3.startIdx-b3.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return anchorPosition;let ax3=anchorPosition.x,ay3=anchorPosition.y;switch(alignment){case"top_left":return{x:ax3+width/2,y:ay3-height/2};case"top_center":return{x:ax3,y:ay3-height/2};case"top_right":return{x:ax3-width/2,y:ay3-height/2};case"center_left":return{x:ax3+width/2,y:ay3};case"center_right":return{x:ax3-width/2,y:ay3};case"bottom_left":return{x:ax3+width/2,y:ay3+height/2};case"bottom_center":return{x:ax3,y:ay3+height/2};case"bottom_right":return{x:ax3-width/2,y:ay3+height/2};default:return anchorPosition}}var Group5=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}initPorts(opts={}){let schPinArrangement=this._getSchematicPortArrangement();this._parsedProps?.showAsSchematicBox&&!this._parsedProps.pinLabels&&schPinArrangement&&getPinsFromPortArrangement(schPinArrangement).some(pin=>typeof pin=="string")||super.initPorts(opts)}_getSchematicPortArrangementFromPortDirections(){if(!this._parsedProps?.showAsSchematicBox)return null;let sidePins={leftSide:[],rightSide:[],topSide:[],bottomSide:[]};for(let port of this.children){if(port.componentName!=="Port")continue;let direction2=port._parsedProps.direction;if(!direction2)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction2==="left"?"leftSide":direction2==="right"?"rightSide":direction2==="up"?"topSide":"bottomSide"].push(pin)}if(sidePins.leftSide.length===0&&sidePins.rightSide.length===0&&sidePins.topSide.length===0&&sidePins.bottomSide.length===0)return null;let arrangement={};return sidePins.leftSide.length>0&&(arrangement.leftSide={pins:sidePins.leftSide,direction:"top-to-bottom"}),sidePins.rightSide.length>0&&(arrangement.rightSide={pins:sidePins.rightSide,direction:"top-to-bottom"}),sidePins.topSide.length>0&&(arrangement.topSide={pins:sidePins.topSide,direction:"left-to-right"}),sidePins.bottomSide.length>0&&(arrangement.bottomSide={pins:sidePins.bottomSide,direction:"left-to-right"}),arrangement}_getSchematicPortArrangement(){return super._getSchematicPortArrangement()??this._getSchematicPortArrangementFromPortDirections()}_ensureSchematicBoxPortsFromConnections(){if(this._parsedProps?.showAsSchematicBox&&this._parsedProps?.connections)for(let[pinName,target]of Object.entries(this._parsedProps.connections)){if(this.children.find(child=>child.componentName==="Port"&&child.isMatchingAnyOf([pinName])))continue;let pinNumberMatch=pinName.match(/^pin(\d+)$/i)??pinName.match(/^(\d+)$/),pinNumber=pinNumberMatch?Number(pinNumberMatch[1]):void 0;this.add(new Port({name:pinName,pinNumber,connectsTo:target}))}}doInitialInitializePortsFromChildren(){super.doInitialInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}updateInitializePortsFromChildren(){super.updateInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}_getPrimaryPinCount(){let superPinCount=super._getPrimaryPinCount();if(!this._parsedProps?.showAsSchematicBox)return superPinCount;let directPortPinNumbers=this.children.filter(child=>child.componentName==="Port").map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0);return directPortPinNumbers.length===0?superPinCount:Math.max(superPinCount,...directPortPinNumbers)}_getPinLabelsFromPorts(){return this._parsedProps?.showAsSchematicBox?getGroupSchematicBoxPinLabels(this):super._getPinLabelsFromPorts()}doInitialSourceGroupRender(){let{db:db2}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db2.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group3.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group3.source_group_id}`,db2.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db2}=this.root;for(let child of this.children)db2.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db:db2}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db2.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db2.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group3=db2.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group3.pcb_group_id;for(let child of this.children)db2.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db2}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db2.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let resolvedWidth=Number(props.width??width),resolvedHeight=Number(props.height??height),existingPcbGroup=db2.pcb_group.get(this.pcb_group_id),center2=hasExplicitPositioning?existingPcbGroup?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};if(hasExplicitPositioning&&props.pcbAnchorAlignment){let anchorPosition=this._getGlobalPcbPositionBeforeLayout(),anchorAlignedCenter=computeCenterFromAnchorPosition(anchorPosition,{...this.props,width:resolvedWidth,height:resolvedHeight});(Math.abs(anchorAlignedCenter.x-center2.x)>1e-6||Math.abs(anchorAlignedCenter.y-center2.y)>1e-6)&&this._repositionOnPcb(anchorAlignedCenter),center2=anchorAlignedCenter}db2.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a463,_b3;return(_a463=this.unnamedElementCounter)[_b3=elm.lowercaseComponentName]??(_a463[_b3]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db:db2}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this.selectAll("group").filter(g6=>g6.isSubcircuit);for(let subcircuitChild of subcircuitChildren)if(subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug112=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithRegion=!1;for(let routingPhasePlan of routingPhasePlans)traceCount+=routingPhasePlan.traces.length,hasReroutePhaseWithRegion||(hasReroutePhaseWithRegion=!!(routingPhasePlan.reroute&&routingPhasePlan.region));if(debug112(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithRegion){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug112(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db2}=this.root,debug112=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug112("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r5=>r5.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db2.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err.message}),err}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db2}=this.root,props=this._parsedProps,debug112=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug112(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.nominalTraceWidth??.15),{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=Group_hasPhasedAutorouting(routingPhasePlans),outputTraces=[],outputJumpers=[],existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this);for(let routingPhasePlan of routingPhasePlans){let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,simpleRouteJson=baseSimpleRouteJson,isReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region),rerouteOriginalSrj=isReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(isReroutePhase&&rerouteOriginalSrj?simpleRouteJson=KB(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region}):hasPhasedAutorouting&&(simpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),simpleRouteJson.obstacles=[...simpleRouteJson.obstacles,...Group_getObstaclesFromRoutedTraces(outputTraces)]),simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),(hasPhasedAutorouting||isReroutePhase)&&simpleRouteJson.connections.length===0)continue;let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;if(phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes)),debug112.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug112.enabled){let graphicsObject=Co2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(phaseAutorouterConfig.algorithmFn)autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug112(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug112(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise;if(autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isReroutePhase&&rerouteOriginalSrj){let reconnectedSrj=QB(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else outputTraces.push(...traces)}catch(error2){let{db:db22}=this.root;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error2 instanceof Error?error2.message:String(error2)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!(this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug112(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug112(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug112(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug112(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db2}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug112(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug112(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db2}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let pcb_trace3=db2.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:routedTrace.route})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),board=db2.pcb_board.list()[0],routedViaHoleDiameter=board?.min_via_hole_diameter??holeDiameter,routedViaPadDiameter=board?.min_via_pad_diameter??padDiameter;output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db2,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces});for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;let possibleSourceTraceIds=[...getSourceTraceIdsFromRerouteName(pcb_trace3.source_trace_id),...getSourceTraceIdsFromRerouteName(pcb_trace3.connection_name),...getSourceTraceIdsFromRerouteName(pcb_trace3.rootConnectionName)],validSourceTraceIds=Array.from(new Set(possibleSourceTraceIds)).filter(possibleSourceTraceId=>!!(db2.source_trace.get(possibleSourceTraceId)??db2.source_net.get(possibleSourceTraceId))),sourceTraceId=validSourceTraceIds.length===1?validSourceTraceIds[0]:void 0;sourceTraceId?pcb_trace3.source_trace_id=sourceTraceId:delete pcb_trace3.source_trace_id,pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=(sourceTraceId?db2.source_trace.get(sourceTraceId)?.subcircuit_id??db2.source_net.get(sourceTraceId)?.subcircuit_id:void 0)??this.subcircuit_id);let segments=splitPcbTracesOnJumperSegments(pcb_trace3.route);segments===null&&(segments=[pcb_trace3.route]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db2);for(let segment2 of processedSegments)segment2.length>0&&db2.pcb_trace.insert({...pcb_trace3,route:segment2})}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){for(let point62 of pcb_trace3.route)if(point62.route_type==="via"){let routedViaPoint=point62;db2.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point62.x,y:point62.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:[point62.from_layer,point62.to_layer],from_layer:point62.from_layer,to_layer:point62.to_layer})}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,schematic_group3=db2.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id,show_as_schematic_box:props.showAsSchematicBox??!1});this.schematic_group_id=schematic_group3.schematic_group_id,props.showAsSchematicBox&&Group_doInitialSchematicBoxComponentRender(this);for(let child of this.children)child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db2.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group3.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){if(this._parsedProps.showAsSchematicBox){this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db:db2}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db2.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db2.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db2.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db2.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx3=port.center.x-component.center.x,dy3=port.center.y-component.center.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>0?"right":"left":dy3>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter,this.root?.platform)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db2}=this.root;if(this.isSubcircuit){let subcircuitComponentsByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=subcircuitComponentsByName.get(child._parsedProps.name)||[];components.push(child),subcircuitComponentsByName.set(child._parsedProps.name,components)}for(let[name,components]of subcircuitComponentsByName.entries())components.length>1&&db2.pcb_trace_error.insert({error_type:"pcb_trace_error",message:`Multiple components found with name "${name}" in subcircuit "${this.name||"unnamed"}". Component names must be unique within a subcircuit.`,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c4=>c4.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db2}=this.root,subtree=db2;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&/^gnd/i.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&/^v/i.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position4){return super._repositionOnPcb(position4)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.source_group_id}),groupProps2={name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`};if(pcbGroup?.position_mode==="relative_to_group_anchor"&&pcbGroup.anchor_position){let baseAnchor={x:0,y:0};if(sourceGroup.parent_source_group_id){let parentPcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.parent_source_group_id});parentPcbGroup?.anchor_position&&(baseAnchor=parentPcbGroup.anchor_position)}groupProps2.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps2.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps2.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group=new Group5(groupProps2);return group._isInflatedFromCircuitJson=!0,group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),inductor=new Inductor({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db:db2}=root,pcb_port3=db2.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port3.pcb_port_id}}var PushButton=class extends NormalComponent3{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:pushButtonProps,sourceFtype:FTYPE.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let symbol=Vf[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p4=>p4.labels.includes("1")),symPort2=symbol.ports.find(p4=>p4.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p4=>p4.props.pinNumber===1),pin2Port=ports.find(p4=>p4.props.pinNumber===2),pin3Port=ports.find(p4=>p4.props.pinNumber===3),pin4Port=ports.find(p4=>p4.props.pinNumber===4),{internallyConnectedPins}=this._parsedProps;pin1Port.schematicSymbolPortDef=symPort1,(!internallyConnectedPins||internallyConnectedPins.length===0)&&(pin2Port.schematicSymbolPortDef=symPort2);for(let[pn3,port]of[[2,pin2Port],[3,pin3Port],[4,pin4Port]]){let internallyConnectedRow=internallyConnectedPins?.find(([pin1,pin2])=>pin1===`pin${pn3}`||pin2===`pin${pn3}`);if(!internallyConnectedRow){port.schematicSymbolPortDef=symPort2;break}(internallyConnectedRow?.[0]===`pin${pn3}`?internallyConnectedRow[1]:internallyConnectedRow?.[0])!=="pin1"&&(port.schematicSymbolPortDef=symPort2)}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourcePushButton(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),pushButton=new PushButton({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:pushButton});footprint&&pushButton.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(pushButton):subcircuit.add(pushButton)}var Resistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),resistor=new Resistor({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point62=>{let position4=getRoutePointPosition(point62),firstPosition=getRoutePointPosition(firstPoint),lastPosition=getRoutePointPosition(lastPoint),isSameAsFirst=position4.x===firstPosition.x&&position4.y===firstPosition.y,isSameAsLast=position4.x===lastPosition.x&&position4.y===lastPosition.y;return!isSameAsFirst&&!isSameAsLast}).map(point62=>{if(point62.route_type==="via")return{x:point62.x,y:point62.y,via:!0,fromLayer:point62.from_layer,toLayer:point62.to_layer};let position4=getRoutePointPosition(point62);return{x:position4.x,y:position4.y}})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&¤tGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTrace=injectionDb.pcb_trace.getWhere({source_trace_id:sourceTrace.source_trace_id}),pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt3=>pt3.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:!pcbTrace&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);trace._inflatedPcbTrace=pcbTrace??void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>via.pcb_trace_id===pcbTrace.pcb_trace_id):void 0,subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line","pcb_via"],standalonePrimitives=injectionDb.toArray().filter(elm=>{if(!standalonePrimitiveTypes.includes(elm.type))return!1;if(elm.type==="pcb_via"){if(!elm.pcb_trace_id)return!0;let pcbTrace=injectionDb.pcb_trace.get(elm.pcb_trace_id),sourceTraceId=pcbTrace?.source_trace_id;return!(sourceTraceId&&injectionDb.source_trace.get(sourceTraceId)&&pcbTrace?.route.some(point62=>point62.route_type==="via"&&Math.abs(point62.x-elm.x)<1e-4&&Math.abs(point62.y-elm.y)<1e-4))}return"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0)});if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g6=>!g6.parent_source_group_id||renderedGroupIds.has(g6.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g6=>g6.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1253",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.25","@tscircuit/capacity-autorouter":"^0.0.505","@tscircuit/checks":"0.0.129","@tscircuit/circuit-json-util":"^0.0.94","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.29","@tscircuit/footprinter":"^0.0.357","@tscircuit/infer-cable-insertion-point":"^0.0.2","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.8","@tscircuit/props":"^0.0.531","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^0.0.57","@tscircuit/solver-utils":"^0.0.3","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.425","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.96","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.34","circuit-to-svg":"^0.0.345",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.89",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.60",kicadts:"^0.0.35","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.208",spicey:"^0.0.14","stack-svgs":"^0.0.1","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.1","calculate-packing":"0.0.73","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.pcbRoutingDisabled=platform?.routingDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react4.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform},platform.pcbDisabled!==void 0&&(this.pcbDisabled=platform.pcbDisabled),platform.routingDisabled!==void 0&&(this.pcbRoutingDisabled=platform.routingDisabled)}_getBoard(){let directBoard=this.children.find(c4=>c4.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group5({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db2}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getRunningAsyncEffects(){return Array.from(this._runningAsyncEffectsById.values())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist8(),dist_exports3)).catch(e5=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
703
703
|
|
|
704
704
|
"${e5.message}"`)});if(options.view==="pcb")return circuitToSvg.convertCircuitJsonToPcbSvg(this.getCircuitJson());if(options.view==="schematic")return circuitToSvg.convertCircuitJsonToSchematicSvg(this.getCircuitJson());throw new Error(`Invalid view: ${options.view}`)}getCoreVersion(){let[major,minor,patch]=package_default3.version.split(".").map(Number);return`${major}.${minor}.${patch+1}`}async preview(previewNameOrOpts){let previewOpts=typeof previewNameOrOpts=="object"?previewNameOrOpts:{previewName:previewNameOrOpts};throw new Error("project.preview is not yet implemented")}computeSchematicGlobalTransform(){return identity()}_computePcbGlobalTransformBeforeLayout(){return identity()}selectAll(selector){return this._guessRootComponent(),this.firstChild?.selectAll(selector)??[]}selectOne(selector,opts){return this._guessRootComponent(),this.firstChild?.selectOne(selector,opts)??null}emit(event,...args){if(event==="asyncEffect:start"?this._registerAsyncEffectStart(args[0]):event==="asyncEffect:end"&&this._registerAsyncEffectEnd(args[0]),!!this._eventListeners[event])for(let listener of this._eventListeners[event])listener(...args)}on(event,listener){this._eventListeners[event]||(this._eventListeners[event]=[]),this._eventListeners[event].push(listener)}removeListener(event,listener){this._eventListeners[event]&&(this._eventListeners[event]=this._eventListeners[event].filter(l4=>l4!==listener))}enableDebug(debug112){typeof debug112=="string"?import_debug19.default.enable(debug112):(debug112===null||debug112===!1)&&import_debug19.default.disable()}getClientOrigin(){return typeof window<"u"&&window.location?window.location.origin:typeof self<"u"&&self.location?self.location.origin:""}_registerAsyncEffectStart(payload){if(!payload?.asyncEffectId||!payload.phase)return;let{asyncEffectId,phase}=payload,existingPhase=this._asyncEffectPhaseById.get(asyncEffectId);existingPhase&&existingPhase!==phase&&this._asyncEffectIdsByPhase.get(existingPhase)?.delete(asyncEffectId),this._asyncEffectIdsByPhase.has(phase)||this._asyncEffectIdsByPhase.set(phase,new Set),this._asyncEffectIdsByPhase.get(phase).add(asyncEffectId),this._asyncEffectPhaseById.set(asyncEffectId,phase),this._runningAsyncEffectsById.set(asyncEffectId,{asyncEffectId,effectName:payload.effectName,componentDisplayName:payload.componentDisplayName,phase,error:payload.error})}_registerAsyncEffectEnd(payload){if(!payload?.asyncEffectId)return;let{asyncEffectId}=payload,phase=this._asyncEffectPhaseById.get(asyncEffectId)??payload.phase;if(phase){let phaseSet=this._asyncEffectIdsByPhase.get(phase);phaseSet?.delete(asyncEffectId),phaseSet&&phaseSet.size===0&&this._asyncEffectIdsByPhase.delete(phase)}this._asyncEffectPhaseById.delete(asyncEffectId),this._runningAsyncEffectsById.delete(asyncEffectId)}};function Subcircuit_doInitialRenderIsolatedSubcircuits(subcircuit){if(!subcircuit._isIsolatedSubcircuit||subcircuit._isolatedCircuitJson||!subcircuit.getSubcircuitPropHash)return;let propHash=subcircuit.getSubcircuitPropHash(),cachedSubcircuits=subcircuit.root?.cachedSubcircuits,pendingSubcircuitRenders=subcircuit.root?.pendingSubcircuitRenders,cached=cachedSubcircuits?.get(propHash);if(cached){subcircuit._isolatedCircuitJson=cached,subcircuit.children=[],subcircuit._normalComponentNameMap=null;return}let childrenToRender=[...subcircuit.children];subcircuit.children=[],subcircuit._normalComponentNameMap=null;let parentRoot=subcircuit.root;subcircuit._queueAsyncEffect("render-isolated-subcircuit",async()=>{let cachedResult=cachedSubcircuits?.get(propHash);if(cachedResult){subcircuit._isolatedCircuitJson=cachedResult;return}let pendingRenderPromise=pendingSubcircuitRenders?.get(propHash);if(pendingRenderPromise){subcircuit._isolatedCircuitJson=await pendingRenderPromise;return}let resolveRender,rejectRender,renderPromise=new Promise((resolve,reject)=>{resolveRender=resolve,rejectRender=reject});pendingSubcircuitRenders?.set(propHash,renderPromise);try{let isolatedCircuit=new IsolatedCircuit({platform:{...parentRoot.platform,pcbDisabled:parentRoot.pcbDisabled,schematicDisabled:parentRoot.schematicDisabled},cachedSubcircuits,pendingSubcircuitRenders});for(let child of childrenToRender)isolatedCircuit.add(child);await isolatedCircuit.renderUntilSettled();let circuitJson=isolatedCircuit.getCircuitJson();cachedSubcircuits?.set(propHash,circuitJson),subcircuit._isolatedCircuitJson=circuitJson,resolveRender(circuitJson)}catch(error2){throw rejectRender(error2 instanceof Error?error2:new Error(String(error2))),error2}finally{pendingSubcircuitRenders?.delete(propHash)}})}var EXCLUDED_PROPS=new Set(["name","key","pcbX","pcbY","schX","schY","pcbLeftEdgeX","pcbRightEdgeX","pcbTopEdgeY","pcbBottomEdgeY","pcbRotation","schRotation"]);function safeSerialize(value,seen=new WeakSet){if(value===null)return"null";if(value===void 0)return"undefined";let type=typeof value;if(type==="string")return`"${value}"`;if(type==="number"||type==="boolean")return String(value);if(type==="function")return"[function]";if(type==="symbol")return"[symbol]";if(type==="object"){if(seen.has(value))return"[circular]";if(seen.add(value),value.$$typeof!==void 0){let elementType=typeof value.type=="string"?value.type:value.type?.name||"[component]",propsStr=value.props?safeSerialize(value.props,seen):"{}";return`ReactElement(${elementType},${propsStr})`}return Array.isArray(value)?`[${value.map(v4=>safeSerialize(v4,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k4=>`${k4}:${safeSerialize(value[k4],seen)}`).join(",")}}`}return String(value)}function getHashableProps(props){let result={},keys=Object.keys(props).sort();for(let key of keys)!EXCLUDED_PROPS.has(key)&&props[key]!==void 0&&(result[key]=props[key]);return result}function getChildrenHashData(children){return children.map(child=>({componentName:child.componentName,props:getHashableProps(child.props??{}),children:getChildrenHashData(child.children)}))}function fnv1aHash(str){let hash=2166136261;for(let i3=0;i3<str.length;i3++)hash^=str.charCodeAt(i3),hash=Math.imul(hash,16777619);return hash>>>0}function computeHash(data){let serialized=safeSerialize(data),hash1=fnv1aHash(serialized),hash2=fnv1aHash(serialized+hash1.toString());return hash1.toString(16).padStart(8,"0")+hash2.toString(16).padStart(8,"0")}function Subcircuit_getSubcircuitPropHash(subcircuit){let hashableData={props:getHashableProps(subcircuit.props??{}),children:getChildrenHashData(subcircuit.children)};return computeHash(hashableData)}var MIN_EFFECTIVE_BORDER_RADIUS_MM=.01,getRoundedRectOutline=(width,height,radius)=>{let w22=width/2,h22=height/2,r5=Math.min(radius,w22,h22);if(r5<MIN_EFFECTIVE_BORDER_RADIUS_MM)return[{x:-w22,y:-h22},{x:w22,y:-h22},{x:w22,y:h22},{x:-w22,y:h22}];let segments=Math.max(1,Math.ceil(Math.PI/2*r5/.1)),step=Math.PI/2/segments,outline=[];outline.push({x:-w22+r5,y:-h22}),outline.push({x:w22-r5,y:-h22});for(let i3=1;i3<=segments;i3++){let theta=-Math.PI/2+i3*step;outline.push({x:w22-r5+r5*Math.cos(theta),y:-h22+r5+r5*Math.sin(theta)})}outline.push({x:w22,y:h22-r5});for(let i3=1;i3<=segments;i3++){let theta=0+i3*step;outline.push({x:w22-r5+r5*Math.cos(theta),y:h22-r5+r5*Math.sin(theta)})}outline.push({x:-w22+r5,y:h22});for(let i3=1;i3<=segments;i3++){let theta=Math.PI/2+i3*step;outline.push({x:-w22+r5+r5*Math.cos(theta),y:h22-r5+r5*Math.sin(theta)})}outline.push({x:-w22,y:-h22+r5});for(let i3=1;i3<=segments;i3++){let theta=Math.PI+i3*step;outline.push({x:-w22+r5+r5*Math.cos(theta),y:-h22+r5+r5*Math.sin(theta)})}return outline},Board=class extends Group5{constructor(){super(...arguments);__publicField(this,"pcb_board_id",null);__publicField(this,"source_board_id",null);__publicField(this,"_drcChecksComplete",!1);__publicField(this,"_drcChecksInProgress",!1);__publicField(this,"_connectedSchematicPortPairs",new Set);__publicField(this,"_panelPositionOffset",null)}get isSubcircuit(){return!0}get isGroup(){return!0}get config(){return{componentName:"Board",zodProps:boardProps}}get boardThickness(){return this._parsedProps.thickness??1.4}get allLayers(){let layerCount=this._parsedProps.layers??2;return layerCount===1?["top"]:layerCount===4?["top","bottom","inner1","inner2"]:["top","bottom"]}_getSubcircuitLayerCount(){return this._parsedProps.layers??2}_computePcbGlobalTransformBeforeLayout(){if(this._panelPositionOffset){let parentTransform=this.parent?._computePcbGlobalTransformBeforeLayout?.()??{a:1,b:0,c:0,d:1,e:0,f:0};return compose2(parentTransform,translate2(this._panelPositionOffset.x,this._panelPositionOffset.y))}return super._computePcbGlobalTransformBeforeLayout()}_getBoardCalcVariables(){let{_parsedProps:props}=this;if((props.width==null||props.height==null)&&!props.outline)return{};let dbBoard=this.pcb_board_id?this.root?.db.pcb_board.get(this.pcb_board_id):null,width=dbBoard?.width??props.width,height=dbBoard?.height??props.height;if((width==null||height==null)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),center2=dbBoard?.center??{x:pcbX+(props.outlineOffsetX??0),y:pcbY+(props.outlineOffsetY??0)},resolvedWidth=width??0,resolvedHeight=height??0;return{"board.minX":center2.x-resolvedWidth/2,"board.maxX":center2.x+resolvedWidth/2,"board.minY":center2.y-resolvedHeight/2,"board.maxY":center2.y+resolvedHeight/2}}doInitialPcbBoardAutoSize(){if(this.root?.pcbDisabled||!this.pcb_board_id)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcbBoard=db2.pcb_board.get(this.pcb_board_id);if(pcbBoard?.width&&pcbBoard?.height||pcbBoard?.outline&&pcbBoard.outline.length>0)return;let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,descendantIds=getDescendantSubcircuitIds(db2,this.subcircuit_id),allowedSubcircuitIds=new Set([this.subcircuit_id,...descendantIds]),allPcbComponents=db2.pcb_component.list().filter(c4=>c4.subcircuit_id&&allowedSubcircuitIds.has(c4.subcircuit_id)),allPcbGroups=db2.pcb_group.list().filter(g6=>g6.subcircuit_id&&allowedSubcircuitIds.has(g6.subcircuit_id)),hasComponents=!1,updateBounds=(center22,width,height)=>{width===0||height===0||(hasComponents=!0,minX=Math.min(minX,center22.x-width/2),minY=Math.min(minY,center22.y-height/2),maxX=Math.max(maxX,center22.x+width/2),maxY=Math.max(maxY,center22.y+height/2))};for(let pcbComponent of allPcbComponents)updateBounds(pcbComponent.center,pcbComponent.width,pcbComponent.height);for(let pcbGroup of allPcbGroups){let width=pcbGroup.width??0,height=pcbGroup.height??0;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);bounds&&(width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY)}updateBounds(pcbGroup.center,width,height)}if(props.boardAnchorPosition){let{x:x4,y:y4}=props.boardAnchorPosition;minX=Math.min(minX,x4),minY=Math.min(minY,y4),maxX=Math.max(maxX,x4),maxY=Math.max(maxY,y4)}let padding=2,computedWidth=hasComponents?maxX-minX+padding*2:0,computedHeight=hasComponents?maxY-minY+padding*2:0,center2={x:hasComponents?(minX+maxX)/2+(props.outlineOffsetX??0):(props.outlineOffsetX??0)+globalPos.x,y:hasComponents?(minY+maxY)/2+(props.outlineOffsetY??0):(props.outlineOffsetY??0)+globalPos.y},finalWidth=props.width??computedWidth,finalHeight=props.height??computedHeight,outline=props.outline;!outline&&props.borderRadius!=null&&finalWidth>0&&finalHeight>0&&(outline=getRoundedRectOutline(finalWidth,finalHeight,props.borderRadius));let update={width:finalWidth,height:finalHeight,center:center2};outline&&(update.outline=outline.map(point62=>({x:point62.x+(props.outlineOffsetX??0),y:point62.y+(props.outlineOffsetY??0)}))),db2.pcb_board.update(this.pcb_board_id,update)}updatePcbBoardAutoSize(){this.doInitialPcbBoardAutoSize()}_addBoardInformationToSilkscreen(){let platform=this.root?.platform;if(!platform?.printBoardInformationToSilkscreen)return;let pcbBoard=this.root.db.pcb_board.get(this.pcb_board_id);if(!pcbBoard)return;let boardInformation=[];if(platform.projectName&&boardInformation.push(platform.projectName),platform.version&&boardInformation.push(`v${platform.version}`),platform.url&&boardInformation.push(platform.url),boardInformation.length===0)return;let text=boardInformation.join(`
|
|
705
705
|
`),position4={x:pcbBoard.center.x+pcbBoard.width/2-.25,y:pcbBoard.center.y-pcbBoard.height/2+1};this.root.db.pcb_silkscreen_text.insert({pcb_component_id:this.pcb_board_id,layer:"top",font:"tscircuit2024",font_size:.45,text,ccw_rotation:0,anchor_alignment:"bottom_right",anchor_position:position4})}doInitialSourceRender(){let nestedBoard=this.getDescendants().find(d4=>d4.lowercaseComponentName==="board");if(nestedBoard)throw new Error(`Nested boards are not supported: found board "${nestedBoard.name}" inside board "${this.name}"`);super.doInitialSourceRender();let{db:db2}=this.root,source_board3=db2.source_board.insert({source_group_id:this.source_group_id,title:this.props.title||this.props.name});this.source_board_id=source_board3.source_board_id}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,pcbBoardFromCircuitJson=props.circuitJson?.find(elm=>elm.type==="pcb_board"),computedWidth=props.width??pcbBoardFromCircuitJson?.width??0,computedHeight=props.height??pcbBoardFromCircuitJson?.height??0,globalPos=this._getGlobalPcbPositionBeforeLayout(),center2={x:globalPos.x+(props.outlineOffsetX??0),y:globalPos.y+(props.outlineOffsetY??0)},{boardAnchorPosition,boardAnchorAlignment}=props;if(boardAnchorPosition&&(center2=getBoardCenterFromAnchor({boardAnchorPosition,boardAnchorAlignment:boardAnchorAlignment??"center",width:computedWidth,height:computedHeight})),props.outline){let xValues=props.outline.map(point62=>point62.x),yValues=props.outline.map(point62=>point62.y),minX=Math.min(...xValues),maxX=Math.max(...xValues),minY=Math.min(...yValues),maxY=Math.max(...yValues);computedWidth=maxX-minX,computedHeight=maxY-minY}let outline=props.outline;!outline&&props.borderRadius!=null&&computedWidth>0&&computedHeight>0&&(outline=getRoundedRectOutline(computedWidth,computedHeight,props.borderRadius));let outlineTranslation={x:0,y:0};if(outline&&outline.length>0&&(this.parent?.lowercaseComponentName==="panel"||this.parent?.lowercaseComponentName==="subpanel")){let outlineBounds=getBoundsFromPoints(outline);if(outlineBounds){let outlineCenterX=(outlineBounds.minX+outlineBounds.maxX)/2,outlineCenterY=(outlineBounds.minY+outlineBounds.maxY)/2;outlineTranslation={x:center2.x-outlineCenterX,y:center2.y-outlineCenterY}}}let subcircuitProps2=this.getSubcircuit()._parsedProps,pcb_board3=db2.pcb_board.insert({source_board_id:this.source_board_id,center:center2,thickness:this.boardThickness,num_layers:this.allLayers.length,width:computedWidth,height:computedHeight,outline:outline?.map(point62=>({x:point62.x+(props.outlineOffsetX??0)+outlineTranslation.x,y:point62.y+(props.outlineOffsetY??0)+outlineTranslation.y})),material:props.material,min_trace_width:subcircuitProps2.minTraceWidth??jlcMinTolerances2.min_trace_width,min_via_hole_diameter:subcircuitProps2.minViaHoleDiameter??jlcMinTolerances2.min_via_hole_diameter,min_via_pad_diameter:subcircuitProps2.minViaPadDiameter??jlcMinTolerances2.min_via_pad_diameter,min_via_hole_edge_to_via_hole_edge_clearance:subcircuitProps2.minViaHoleEdgeToViaHoleEdgeClearance??jlcMinTolerances2.min_via_hole_edge_to_via_hole_edge_clearance,min_via_edge_to_pad_edge_clearance:subcircuitProps2.minViaEdgeToPadEdgeClearance??jlcMinTolerances2.min_via_edge_to_pad_edge_clearance,min_trace_to_pad_edge_clearance:subcircuitProps2.minTraceToPadEdgeClearance??jlcMinTolerances2.min_trace_to_pad_edge_clearance,min_pad_edge_to_pad_edge_clearance:subcircuitProps2.minPadEdgeToPadEdgeClearance??jlcMinTolerances2.min_pad_edge_to_pad_edge_clearance,min_plated_hole_drill_edge_to_drill_edge_clearance:subcircuitProps2.minPlatedHoleDrillEdgeToDrillEdgeClearance??jlcMinTolerances2.min_plated_hole_drill_edge_to_drill_edge_clearance,min_board_edge_clearance:subcircuitProps2.minBoardEdgeClearance??jlcMinTolerances2.min_board_edge_clearance});this.pcb_board_id=pcb_board3.pcb_board_id,this._addBoardInformationToSilkscreen()}removePcbComponentRender(){let{db:db2}=this.root;this.pcb_board_id&&(db2.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){this.root?.pcbDisabled||(super.doInitialPcbDesignRuleChecks(),this.updatePcbDesignRuleChecks())}updatePcbDesignRuleChecks(){let{db:db2}=this.root,routingDisabled=this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"),pcbDisabled=this.root?.pcbDisabled,drcChecksDisabled=this.root?.platform?.drcChecksDisabled??this.getInheritedProperty("drcChecksDisabled"),netlistDrcChecksDisabled=this.root?.platform?.netlistDrcChecksDisabled??this.getInheritedProperty("netlistDrcChecksDisabled"),pinSpecificationDrcChecksDisabled=this.getInheritedProperty("pinSpecificationDrcChecksDisabled"),placementDrcChecksDisabled=this.root?.platform?.placementDrcChecksDisabled??this.getInheritedProperty("placementDrcChecksDisabled"),routingDrcChecksDisabled=this.root?.platform?.routingDrcChecksDisabled??this.getInheritedProperty("routingDrcChecksDisabled"),shouldRunNetlistChecks=!drcChecksDisabled&&!netlistDrcChecksDisabled,shouldRunPinSpecificationChecks=!drcChecksDisabled&&!pinSpecificationDrcChecksDisabled,shouldRunPlacementChecks=!drcChecksDisabled&&!pcbDisabled&&!placementDrcChecksDisabled,shouldRunRoutingChecks=!drcChecksDisabled&&!pcbDisabled&&!routingDisabled&&!routingDrcChecksDisabled;if(shouldRunRoutingChecks&&this._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender"))return;let hasTracesToRoute=this._hasTracesToRoute();if(shouldRunRoutingChecks&&hasTracesToRoute&&!this._areChildSubcircuitsRouted()||this._drcChecksComplete||this._drcChecksInProgress)return;let runDrcChecks=async circuitJson=>{let checksToRun=[];shouldRunRoutingChecks&&checksToRun.push(runAllRoutingChecks(circuitJson)),shouldRunPlacementChecks&&checksToRun.push(runAllPlacementChecks(circuitJson)),shouldRunNetlistChecks&&checksToRun.push(runAllNetlistChecks(circuitJson)),shouldRunPinSpecificationChecks&&checksToRun.push(runAllPinSpecificationChecks(circuitJson));let checkResults=await Promise.all(checksToRun);db2.insertAll(checkResults.flat())},subcircuitCircuitJson=db2.subtree({subcircuit_id:this.subcircuit_id}).toArray();this._drcChecksInProgress=!0,this._queueAsyncEffect("board:drc-checks",async()=>{try{await runDrcChecks(subcircuitCircuitJson),this._drcChecksComplete=!0}finally{this._drcChecksInProgress=!1}})}_emitRenderLifecycleEvent(phase,startOrEnd){super._emitRenderLifecycleEvent(phase,startOrEnd),startOrEnd==="start"&&this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase})}_repositionOnPcb(position4){let{db:db2}=this.root,pcbBoard=this.pcb_board_id?db2.pcb_board.get(this.pcb_board_id):null,oldPos=pcbBoard?.center;if(!oldPos){this.pcb_board_id&&db2.pcb_board.update(this.pcb_board_id,{center:position4});return}let deltaX=position4.x-oldPos.x,deltaY=position4.y-oldPos.y;if(!(Math.abs(deltaX)<1e-6&&Math.abs(deltaY)<1e-6)&&this.pcb_board_id&&(db2.pcb_board.update(this.pcb_board_id,{center:position4}),pcbBoard?.outline)){let outlineBounds=getBoundsFromPoints(pcbBoard.outline);if(outlineBounds){let oldOutlineCenter={x:(outlineBounds.minX+outlineBounds.maxX)/2,y:(outlineBounds.minY+outlineBounds.maxY)/2},outlineDeltaX=position4.x-oldOutlineCenter.x,outlineDeltaY=position4.y-oldOutlineCenter.y,newOutline=pcbBoard.outline.map(p4=>({x:p4.x+outlineDeltaX,y:p4.y+outlineDeltaY}));db2.pcb_board.update(this.pcb_board_id,{outline:newOutline})}}}},Subcircuit=class extends Group5{constructor(props){super({...props,subcircuit:!0})}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}},MountedBoard=class extends Subcircuit{constructor(){super(...arguments);__publicField(this,"pcb_board_id",null);__publicField(this,"_connectedSchematicPortPairs",new Set)}get config(){return{componentName:"MountedBoard",zodProps:mountedboardProps}}get boardThickness(){return 1.4}get allLayers(){return["top","bottom"]}_getBoardCalcVariables(){return this._findCarrierBoard()?._getBoardCalcVariables()??{}}_findCarrierBoard(){let current3=this.parent;for(;current3;){if(current3 instanceof Board)return current3;current3=current3.parent}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcb_board3=db2.pcb_board.insert({center:{x:globalPos.x,y:globalPos.y},width:props.width??0,height:props.height??0,is_mounted_to_carrier_board:!0});this.pcb_board_id=pcb_board3.pcb_board_id}doInitialPcbBoardAutoSize(){if(!this.pcb_board_id||!this.root)return;let carrierBoard=this._findCarrierBoard();carrierBoard?.pcb_board_id&&this.root.db.pcb_board.update(this.pcb_board_id,{carrier_pcb_board_id:carrierBoard.pcb_board_id})}},DEFAULT_TAB_LENGTH=5,DEFAULT_TAB_WIDTH=2,generateCutoutsAndMousebitesForOutline=(outline,options)=>{let{gapLength,cutoutWidth,mouseBites,mouseBiteHoleDiameter,mouseBiteHoleSpacing}=options,tabCutouts=[],mouseBiteHoles=[];if(outline.length<2)return{tabCutouts,mouseBiteHoles};let outlinePolygon=new Polygon$1(outline.map(p4=>point4(p4.x,p4.y))),is_ccw;if(outline.length>2){let p02=point4(outline[0].x,outline[0].y),p12=point4(outline[1].x,outline[1].y),segmentDir=vector$1(p02,p12).normalize(),normalToLeft=segmentDir.rotate(Math.PI/2),testPoint=p02.translate(segmentDir.multiply(segment(p02,p12).length/2)).translate(normalToLeft.multiply(.01));is_ccw=outlinePolygon.contains(testPoint)}else is_ccw=outlinePolygon.area()>0;for(let i3=0;i3<outline.length;i3++){let p1_=outline[i3],p2_=outline[(i3+1)%outline.length];if(!p1_||!p2_)continue;let p12=point4(p1_.x,p1_.y),p22=point4(p2_.x,p2_.y),segment2=segment(p12,p22),segmentLength=segment2.length;if(segmentLength<1e-6)continue;let segmentVec=vector$1(p12,p22),segmentDir=segmentVec.normalize(),normalVec=segmentDir.rotate(Math.PI/2),testPoint=segment2.middle().translate(normalVec.multiply(.01));outlinePolygon.contains(testPoint)&&(normalVec=normalVec.multiply(-1));let numBitesInGap=2,totalBitesLength=numBitesInGap*mouseBiteHoleDiameter+(numBitesInGap-1)*mouseBiteHoleSpacing,effectiveGapLength;mouseBites?effectiveGapLength=totalBitesLength:effectiveGapLength=gapLength,effectiveGapLength=Math.min(effectiveGapLength,segmentLength*.9);let gapStartDist=(segmentLength-effectiveGapLength)/2,gapEndDist=gapStartDist+effectiveGapLength;if(mouseBites){let holeAndSpacing=mouseBiteHoleDiameter+mouseBiteHoleSpacing;if(effectiveGapLength>=totalBitesLength&&holeAndSpacing>0){let firstBiteCenterOffsetInGap=(effectiveGapLength-totalBitesLength)/2+mouseBiteHoleDiameter/2,firstBiteDistFromP1=gapStartDist+firstBiteCenterOffsetInGap;for(let k4=0;k4<numBitesInGap;k4++){let biteDist=firstBiteDistFromP1+k4*holeAndSpacing,pos=p12.translate(segmentDir.multiply(biteDist));mouseBiteHoles.push({x:pos.x,y:pos.y})}}}let p_prev_=outline[(i3-1+outline.length)%outline.length],p_next_=outline[(i3+2)%outline.length],start_ext=0,end_ext=0;if(p_prev_&&p_next_){let vec_in_p1=vector$1(point4(p_prev_.x,p_prev_.y),p12),p1_cross=vec_in_p1.cross(segmentVec),is_p1_convex=is_ccw?p1_cross>1e-9:p1_cross<-1e-9,vec_out_p2=vector$1(p22,point4(p_next_.x,p_next_.y)),p2_cross=segmentVec.cross(vec_out_p2),is_p2_convex=is_ccw?p2_cross>1e-9:p2_cross<-1e-9;if(is_p1_convex){let angle=vec_in_p1.angleTo(segmentVec);angle>Math.PI&&(angle=2*Math.PI-angle),start_ext=cutoutWidth*Math.tan(angle/2)}else start_ext=0;if(is_p2_convex){let angle=segmentVec.angleTo(vec_out_p2);angle>Math.PI&&(angle=2*Math.PI-angle),end_ext=cutoutWidth*Math.tan(angle/2)}else end_ext=0}let cutoutParts=[{start:0-start_ext,end:gapStartDist},{start:gapEndDist,end:segmentLength+end_ext}],extrusion=normalVec.multiply(cutoutWidth);for(let part of cutoutParts){let partLength=part.end-part.start;if(partLength<1e-6)continue;let center2=p12.translate(segmentDir.multiply(part.start+partLength/2)).translate(extrusion.multiply(.5)),width=partLength,height=cutoutWidth,rotationDeg=segmentDir.slope*180/Math.PI;tabCutouts.push({type:"pcb_cutout",shape:"rect",center:{x:center2.x,y:center2.y},width,height,rotation:rotationDeg,corner_radius:cutoutWidth/2})}}return{tabCutouts,mouseBiteHoles}};function generatePanelTabsAndMouseBites(boards,options){let finalTabCutouts=[],allMouseBites=[],{tabWidth,tabLength,mouseBites:useMouseBites}=options,boardDimensions=[];for(let board of boards)if(board.width&&board.height)boardDimensions.push(Math.min(board.width,board.height));else if(board.outline&&board.outline.length>0){let outlinePolygon=new Polygon$1(board.outline.map(p4=>point4(p4.x,p4.y))),area=Math.abs(outlinePolygon.area());area>0&&boardDimensions.push(Math.sqrt(area))}if(boardDimensions.length>0){let scaleFactor=Math.min(...boardDimensions)/20;tabWidth=Math.min(tabWidth,DEFAULT_TAB_WIDTH*Math.max(scaleFactor,.3)),tabLength=Math.min(tabLength,DEFAULT_TAB_LENGTH*Math.max(scaleFactor,.3))}let processedBoards=boards.map(board=>{if((!board.outline||board.outline.length===0)&&board.width&&board.height){let w22=board.width/2,h22=board.height/2;return{...board,outline:[{x:board.center.x-w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y+h22},{x:board.center.x-w22,y:board.center.y+h22}]}}return board});for(let board of processedBoards)if(board.outline&&board.outline.length>0){let mouseBiteDiameter2=tabWidth*.45,mouseBiteSpacing=mouseBiteDiameter2*.1,generated=generateCutoutsAndMousebitesForOutline(board.outline,{gapLength:tabLength,cutoutWidth:tabWidth,mouseBites:useMouseBites,mouseBiteHoleDiameter:mouseBiteDiameter2,mouseBiteHoleSpacing:mouseBiteSpacing});finalTabCutouts.push(...generated.tabCutouts),allMouseBites.push(...generated.mouseBiteHoles)}let tabCutouts=finalTabCutouts.map((tab,index)=>({...tab,pcb_cutout_id:`panel_tab_${index}`})),mouseBiteDiameter=tabWidth*.45,mouseBiteHoles=allMouseBites.map((bite,index)=>({type:"pcb_hole",pcb_hole_id:`panel_mouse_bite_${index}`,hole_shape:"circle",hole_diameter:mouseBiteDiameter,x:bite.x,y:bite.y}));return{tabCutouts,mouseBiteHoles}}var getBoardDimensionsFromProps=board=>{let props=board._parsedProps,width=props.width!=null?distance.parse(props.width):void 0,height=props.height!=null?distance.parse(props.height):void 0;if((width===void 0||height===void 0)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}if((width===void 0||height===void 0)&&props.circuitJson?.length){let pcbBoardFromJson=props.circuitJson.find(elm=>elm.type==="pcb_board");pcbBoardFromJson&&(width??(width=pcbBoardFromJson.width),height??(height=pcbBoardFromJson.height))}return{width:width??0,height:height??0}};function packIntoGrid({items,db:db2,row,col,cellWidth,cellHeight,boardGap,availablePanelWidth,availablePanelHeight}){let itemsWithDims=items.map(item=>{let dims=getItemDimensions(item,db2);return{item,width:dims.width,height:dims.height}}).filter(item=>!(item.width===0&&item.height===0));if(itemsWithDims.length===0)return{positions:[],gridWidth:0,gridHeight:0};let cols,rows,minCellWidth=cellWidth?distance.parse(cellWidth):0,minCellHeight=cellHeight?distance.parse(cellHeight):0;if(col!==void 0)cols=col,rows=row??Math.ceil(itemsWithDims.length/cols);else if(row!==void 0)rows=row,cols=Math.ceil(itemsWithDims.length/rows);else if(availablePanelWidth!==void 0&&availablePanelHeight!==void 0){let maxItemWidth=Math.max(...itemsWithDims.map(b3=>b3.width),minCellWidth),maxItemHeight=Math.max(...itemsWithDims.map(b3=>b3.height),minCellHeight),maxCols=Math.max(1,Math.floor((availablePanelWidth+boardGap)/(maxItemWidth+boardGap))),maxRows=Math.max(1,Math.floor((availablePanelHeight+boardGap)/(maxItemHeight+boardGap)));cols=maxCols,rows=Math.ceil(itemsWithDims.length/cols),rows>maxRows&&(rows=maxRows,cols=Math.ceil(itemsWithDims.length/rows),cols>maxCols&&(cols=maxCols,rows=Math.ceil(itemsWithDims.length/cols))),cols=Math.max(1,cols),rows=Math.max(1,rows)}else cols=Math.ceil(Math.sqrt(itemsWithDims.length)),rows=Math.ceil(itemsWithDims.length/cols);let colWidths=Array(cols).fill(0),rowHeights=Array(rows).fill(0);itemsWithDims.forEach((item,i3)=>{let colIdx=i3%cols,rowIdx=Math.floor(i3/cols);rowIdx<rowHeights.length&&item.height>rowHeights[rowIdx]&&(rowHeights[rowIdx]=item.height),colIdx<colWidths.length&&item.width>colWidths[colIdx]&&(colWidths[colIdx]=item.width)});for(let i3=0;i3<colWidths.length;i3++)colWidths[i3]=Math.max(colWidths[i3],minCellWidth);for(let i3=0;i3<rowHeights.length;i3++)rowHeights[i3]=Math.max(rowHeights[i3],minCellHeight);let gridWidth=colWidths.reduce((a3,b3)=>a3+b3,0)+(cols>1?(cols-1)*boardGap:0),gridHeight=rowHeights.reduce((a3,b3)=>a3+b3,0)+(rows>1?(rows-1)*boardGap:0),startX=-gridWidth/2,startY=-gridHeight/2,colXOffsets=[startX];for(let i3=1;i3<cols;i3++)colXOffsets.push(colXOffsets[i3-1]+colWidths[i3-1]+boardGap);let rowYOffsets=[startY];for(let i3=1;i3<rows;i3++)rowYOffsets.push(rowYOffsets[i3-1]+rowHeights[i3-1]+boardGap);let positions=[];return itemsWithDims.forEach((itemWithDims,i3)=>{let colIdx=i3%cols,rowIdx=Math.floor(i3/cols);if(rowIdx>=rowYOffsets.length||colIdx>=colXOffsets.length)return;let x4=colXOffsets[colIdx]+colWidths[colIdx]/2,y4=rowYOffsets[rowIdx]+rowHeights[rowIdx]/2;positions.push({item:itemWithDims.item,pos:{x:x4,y:y4}})}),{positions,gridWidth,gridHeight}}function getItemDimensions(item,db2){if(item.componentName==="Board"){let board=item;if(db2&&board.pcb_board_id){let pcbBoard=db2.pcb_board.get(board.pcb_board_id);if(pcbBoard?.width!==void 0&&pcbBoard?.height!==void 0)return{width:pcbBoard.width,height:pcbBoard.height}}return getBoardDimensionsFromProps(board)}if(item.componentName==="Subpanel"){let subpanel=item,props=subpanel._parsedProps;if(props.width!==void 0&&props.height!==void 0)return{width:distance.parse(props.width),height:distance.parse(props.height)};let directBoards=subpanel._getDirectBoardChildren();if(directBoards.length===0){let allBoards=subpanel._getAllBoardInstances();if(allBoards.length===0)return{width:0,height:0};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let board of allBoards){let dims=getBoardDimensionsFromProps(board);if(dims.width===0||dims.height===0)continue;let offset=board._panelPositionOffset??{x:0,y:0};minX=Math.min(minX,offset.x-dims.width/2),maxX=Math.max(maxX,offset.x+dims.width/2),minY=Math.min(minY,offset.y-dims.height/2),maxY=Math.max(maxY,offset.y+dims.height/2)}return minX===1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}if(directBoards.length===1)return getBoardDimensionsFromProps(directBoards[0]);if(subpanel._cachedGridWidth>0&&subpanel._cachedGridHeight>0){let edgePadding=distance.parse(props.edgePadding??5);return{width:subpanel._cachedGridWidth+edgePadding*2,height:subpanel._cachedGridHeight+edgePadding*2}}let totalWidth=0,totalHeight=0;for(let board of directBoards){let dims=getBoardDimensionsFromProps(board);totalWidth=Math.max(totalWidth,dims.width),totalHeight=Math.max(totalHeight,dims.height)}return{width:totalWidth,height:totalHeight}}return{width:0,height:0}}var Subpanel=class _Subpanel extends Group5{constructor(){super(...arguments);__publicField(this,"pcb_panel_id",null);__publicField(this,"_tabsAndMouseBitesGenerated",!1);__publicField(this,"_cachedGridWidth",0);__publicField(this,"_cachedGridHeight",0);__publicField(this,"_panelPositionOffset",null)}get config(){return{componentName:"Subpanel",zodProps:subpanelProps}}get _errorComponentName(){return this.componentName.toLowerCase()}get isGroup(){return!0}get isSubcircuit(){return!0}_getPcbLayoutMode(){return"none"}doInitialSchematicComponentRender(){}doInitialSchematicLayout(){}doInitialSchematicTraceRender(){}add(component){if(component.lowercaseComponentName!=="board"&&component.lowercaseComponentName!=="subpanel")throw new Error(`<${this._errorComponentName}> can only contain <board> or <subpanel> elements`);super.add(component)}_computePcbGlobalTransformBeforeLayout(){if(this._panelPositionOffset){let parentTransform=this.parent?._computePcbGlobalTransformBeforeLayout?.()??identity();return compose2(parentTransform,translate2(this._panelPositionOffset.x,this._panelPositionOffset.y))}return super._computePcbGlobalTransformBeforeLayout()}_getAllBoardInstances(){let boards=[];for(let child of this.children)child instanceof Board?boards.push(child):child instanceof _Subpanel&&boards.push(...child._getAllBoardInstances());return boards}_containsBoards(){for(let child of this.children)if(child.componentName==="Board"||child.componentName==="Subpanel"&&"_containsBoards"in child&&child._containsBoards())return!0;return!1}_getDirectBoardChildren(){return this.children.filter(c4=>c4 instanceof Board)}doInitialPanelBoardLayout(){if(this.root?.pcbDisabled)return;let layoutMode=this._parsedProps.layoutMode??"none",gridItems=this.children.filter(c4=>c4 instanceof Board||c4 instanceof _Subpanel);if(layoutMode!=="none")for(let child of gridItems)child instanceof Board&&child._hasUserDefinedPcbPosition()&&this.root.db.source_property_ignored_warning.insert({source_component_id:child.source_component_id,property_name:"pcbX/pcbY",message:`Board has manual positioning but ${this._errorComponentName} layout mode is "${layoutMode}". Manual positioning will be ignored.`,error_type:"source_property_ignored_warning"});if(layoutMode==="none"&&gridItems.length>1&&gridItems.filter(c4=>!c4._hasUserDefinedPcbPosition()).length>1&&this.root.db.pcb_placement_error.insert({error_type:"pcb_placement_error",message:`Multiple boards/subpanels in ${this._errorComponentName} without positions. When layoutMode="none", each item must have explicit positioning. Use layoutMode="grid" for automatic positioning.`}),layoutMode!=="grid")return;let tabWidth=this._parsedProps.tabWidth??DEFAULT_TAB_WIDTH,boardGap=this._parsedProps.boardGap??tabWidth,availablePanelWidth,availablePanelHeight,hasExplicitRowOrCol=this._parsedProps.row!==void 0||this._parsedProps.col!==void 0,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0;if(!hasExplicitRowOrCol&&hasExplicitWidth&&hasExplicitHeight){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding),panelWidth=distance.parse(this._parsedProps.width),panelHeight=distance.parse(this._parsedProps.height);availablePanelWidth=panelWidth-edgePaddingLeft-edgePaddingRight,availablePanelHeight=panelHeight-edgePaddingTop-edgePaddingBottom}let{positions,gridWidth,gridHeight}=packIntoGrid({items:gridItems,row:this._parsedProps.row,col:this._parsedProps.col,cellWidth:this._parsedProps.cellWidth,cellHeight:this._parsedProps.cellHeight,boardGap,availablePanelHeight,availablePanelWidth});this._cachedGridWidth=gridWidth,this._cachedGridHeight=gridHeight;for(let{item,pos}of positions)item._panelPositionOffset=pos}doInitialPanelLayout(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if((this._parsedProps.layoutMode??"none")==="grid"){for(let child of this.children)if(child instanceof Board){if(!child.pcb_board_id||!child._panelPositionOffset)continue;db2.pcb_board.update(child.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${child._panelPositionOffset.x}mm`,display_offset_y:`${child._panelPositionOffset.y}mm`})}else if(child instanceof _Subpanel&&child._panelPositionOffset)for(let board of child._getAllBoardInstances()){if(!board.pcb_board_id)continue;let boardOffset=board._panelPositionOffset??{x:0,y:0};db2.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${child._panelPositionOffset.x+boardOffset.x}mm`,display_offset_y:`${child._panelPositionOffset.y+boardOffset.y}mm`})}this._updatePanelDimensions()}else{let panelGlobalPos=this._getGlobalPcbPositionBeforeLayout();for(let board of this._getDirectBoardChildren()){if(!board.pcb_board_id)continue;let boardDb=db2.pcb_board.get(board.pcb_board_id);if(!boardDb)continue;let relativeX=boardDb.center.x-panelGlobalPos.x,relativeY=boardDb.center.y-panelGlobalPos.y;db2.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${relativeX}mm`,display_offset_y:`${relativeY}mm`})}}this._generateTabsAndMouseBites()}_updatePanelDimensions(){let{db:db2}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_group_id){if(hasExplicitWidth&&hasExplicitHeight)db2.pcb_group.update(this.pcb_group_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db2.pcb_group.update(this.pcb_group_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}_generateTabsAndMouseBites(){if(this._tabsAndMouseBitesGenerated)return;let{db:db2}=this.root,props=this._parsedProps,panelizationMethod=props.panelizationMethod??"none",childBoardInstances=this._getAllBoardInstances();if(panelizationMethod!=="none"){let childBoardIds=childBoardInstances.map(c4=>c4.pcb_board_id).filter(id2=>!!id2),boardsInPanel=db2.pcb_board.list().filter(b3=>childBoardIds.includes(b3.pcb_board_id));if(boardsInPanel.length===0)return;let tabWidth=props.tabWidth??DEFAULT_TAB_WIDTH,boardGap=props.boardGap??tabWidth,{tabCutouts,mouseBiteHoles}=generatePanelTabsAndMouseBites(boardsInPanel,{boardGap,tabWidth,tabLength:props.tabLength??DEFAULT_TAB_LENGTH,mouseBites:props.mouseBites??!0});for(let tabCutout of tabCutouts)db2.pcb_cutout.insert(tabCutout);for(let mouseBiteHole of mouseBiteHoles)db2.pcb_hole.insert(mouseBiteHole)}this._tabsAndMouseBitesGenerated=!0}doInitialPcbComponentRender(){if(!this.root?.pcbDisabled){if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);super.doInitialPcbComponentRender()}}},Panel=class extends Subpanel{get config(){return{componentName:"Panel",zodProps:panelProps}}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);let{db:db2}=this.root,props=this._parsedProps,inserted=db2.pcb_panel.insert({width:props.width!==void 0?distance.parse(props.width):0,height:props.height!==void 0?distance.parse(props.height):0,thickness:1.6,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)});this.pcb_panel_id=inserted.pcb_panel_id}_updatePanelDimensions(){let{db:db2}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_panel_id){if(hasExplicitWidth&&hasExplicitHeight)db2.pcb_panel.update(this.pcb_panel_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db2.pcb_panel.update(this.pcb_panel_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}updatePcbComponentRender(){if(this.root?.pcbDisabled||!this.pcb_panel_id)return;let{db:db2}=this.root,props=this._parsedProps,currentPanel=db2.pcb_panel.get(this.pcb_panel_id);db2.pcb_panel.update(this.pcb_panel_id,{width:props.width!==void 0?distance.parse(props.width):currentPanel?.width,height:props.height!==void 0?distance.parse(props.height):currentPanel?.height,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)})}removePcbComponentRender(){this.pcb_panel_id&&(this.root?.db.pcb_panel.delete(this.pcb_panel_id),this.pcb_panel_id=null)}},Pinout=class extends Chip{constructor(props){super(props)}get config(){return{...super.config,componentName:"Pinout",zodProps:pinoutProps}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_pinout",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Fuse=class extends NormalComponent3{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:fuseProps,sourceFtype:FTYPE.simple_fuse}}_getSchematicSymbolDisplayValue(){let rawCurrent=this._parsedProps.currentRating,rawVoltage=this._parsedProps.voltageRating,current3=typeof rawCurrent=="string"?parseFloat(rawCurrent):rawCurrent,voltage3=typeof rawVoltage=="string"?parseFloat(rawVoltage):rawVoltage;return`${formatSiUnit(current3)}A / ${formatSiUnit(voltage3)}V`}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,currentRating=typeof props.currentRating=="string"?parseFloat(props.currentRating):props.currentRating,voltageRating=typeof props.voltageRating=="string"?parseFloat(props.voltageRating):props.voltageRating,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_fuse,current_rating_amps:currentRating,voltage_rating_volts:voltageRating,display_current_rating:`${formatSiUnit(currentRating)}A`,display_voltage_rating:`${formatSiUnit(voltageRating)}V`,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Jumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}get config(){return{schematicSymbolName:void 0,componentName:"Jumper",zodProps:jumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length),direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db2.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(props.layer??"top",globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialPcbTraceRender(){let{db:db2}=this.root,pcb_ports=db2.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i3=0;i3<pcb_ports.length;i3++){let port=pcb_ports[i3],sourcePort=db2.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h6=>/^(pin)?\d+$/.test(h6));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db2.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},INTERCONNECT_STANDARD_FOOTPRINTS={"0402":"0402","0603":"0603","0805":"0805",1206:"1206"},Interconnect=class extends NormalComponent3{get config(){return{componentName:"Interconnect",zodProps:interconnectProps,shouldRenderAsSchematicBox:!0,sourceFtype:"interconnect"}}get defaultInternallyConnectedPinNames(){let{standard}=this._parsedProps;return standard&&INTERCONNECT_STANDARD_FOOTPRINTS[standard]?[["pin1","pin2"]]:[]}_getImpliedFootprintString(){let{standard}=this._parsedProps;return standard?INTERCONNECT_STANDARD_FOOTPRINTS[standard]??null:null}doInitialSourceRender(){let{db:db2}=this.root,source_component=db2.source_component.insert({ftype:"interconnect",name:this.name,are_pins_interchangeable:!0,display_name:this._parsedProps.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,internallyConnectedPorts=this._getInternallyConnectedPins();for(let ports of internallyConnectedPorts){let sourcePortIds=ports.map(port=>port.source_port_id).filter(id2=>id2!==null);sourcePortIds.length>=2&&db2.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}}},SolderJumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}_getPinNumberFromBridgedPinName(pinName){return this.selectOne(`port.${pinName}`,{type:"port"})?._parsedProps.pinNumber??null}get defaultInternallyConnectedPinNames(){if(this._parsedProps.bridged){let pins=this.children.filter(c4=>c4.componentName==="Port").map(p4=>p4.name);return pins.length>0?[pins]:[]}return this._parsedProps.bridgedPins??[]}get config(){let props=this._parsedProps??this.props,resolvedPinCount=props.pinCount;if(props.pinCount==null&&!props.footprint&&(resolvedPinCount=2),props.pinCount==null){let nums=(props.bridgedPins??[]).flat().map(p_str=>this._getPinNumberFromBridgedPinName(p_str)).filter(n4=>n4!==null),maxPinFromBridged=nums.length>0?Math.max(...nums):0,pinCountFromLabels=props.pinLabels?Object.keys(props.pinLabels).length:0,finalPinCount=Math.max(maxPinFromBridged,pinCountFromLabels);(finalPinCount===2||finalPinCount===3)&&(resolvedPinCount=finalPinCount),resolvedPinCount==null&&props.footprint&&[2,3].includes(this.getPortsFromFootprint().length)&&(resolvedPinCount=this.getPortsFromFootprint().length)}let symbolName="";resolvedPinCount?symbolName+=`solderjumper${resolvedPinCount}`:symbolName="solderjumper";let bridgedPinNumbers=[];return Array.isArray(props.bridgedPins)&&props.bridgedPins.length>0?bridgedPinNumbers=Array.from(new Set(props.bridgedPins.flat().map(pinName=>this._getPinNumberFromBridgedPinName(pinName)).filter(n4=>n4!==null))).sort((a3,b3)=>a3-b3):props.bridged&&resolvedPinCount&&(bridgedPinNumbers=Array.from({length:resolvedPinCount},(_4,i3)=>i3+1)),bridgedPinNumbers.length>0&&(symbolName+=`_bridged${bridgedPinNumbers.join("")}`),{schematicSymbolName:props.symbolName??symbolName,componentName:"SolderJumper",zodProps:solderjumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length);pinCount==null&&!this._parsedProps.footprint&&(pinCount=2);let direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db2.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(props.layer??"top",globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialPcbTraceRender(){let{db:db2}=this.root,pcb_ports=db2.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i3=0;i3<pcb_ports.length;i3++){let port=pcb_ports[i3],sourcePort=db2.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h6=>/^(pin)?\d+$/.test(h6));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db2.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},Led=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return this._parsedProps.schDisplayValue||this._parsedProps.color||void 0}getFootprinterString(){let baseFootprint=super.getFootprinterString();return baseFootprint&&this.props.color?`${baseFootprint}_color(${this.props.color})`:baseFootprint}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_led",name:this.name,wave_length:props.wavelength,color:props.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},PowerSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"positive",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"negative",this.portMap.pin2)}get config(){return{schematicSymbolName:this.props.symbolName??"power_factor_meter_horz",componentName:"PowerSource",zodProps:powerSourceProps,sourceFtype:"simple_power_source"}}initPorts(){this.add(new Port({name:"pin1",pinNumber:1,aliases:["positive","pos"]})),this.add(new Port({name:"pin2",pinNumber:2,aliases:["negative","neg"]}))}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:props.voltage,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},VoltageSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"terminal1",this.portMap.terminal1);__publicField(this,"terminal2",this.portMap.terminal2)}get config(){return{componentName:"VoltageSource",schematicSymbolName:this.props.waveShape==="square"?"square_wave":"ac_voltmeter",zodProps:voltageSourceProps,sourceFtype:"simple_voltage_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){let hasExplicitPcbPosition=this._hasUserDefinedPcbPosition();if(!this._parsedProps.footprint){if(!hasExplicitPcbPosition)return;throw new Error("VoltageSource requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({additionalAliases:{pin1:["terminal1"],pin2:["terminal2"]}})}_getSchematicSymbolDisplayValue(){let{voltage:voltage3,frequency:frequency22}=this._parsedProps,parts=[];return voltage3!==void 0&&parts.push(`${formatSiUnit(voltage3)}V`),frequency22!==void 0&&parts.push(`${formatSiUnit(frequency22)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_voltage_source",name:this.name,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db2}=this.root,{_parsedProps:props}=this,terminal1Port=this.portMap.terminal1,terminal2Port=this.portMap.terminal2;db2.simulation_voltage_source.insert({type:"simulation_voltage_source",is_dc_source:!1,terminal1_source_port_id:terminal1Port.source_port_id,terminal2_source_port_id:terminal2Port.source_port_id,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle})}},CurrentSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pos);__publicField(this,"neg",this.portMap.neg)}get config(){return{componentName:"CurrentSource",schematicSymbolName:"current_source",zodProps:currentSourceProps,sourceFtype:"simple_current_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){let hasExplicitPcbPosition=this._hasUserDefinedPcbPosition();if(!this._parsedProps.footprint){if(!hasExplicitPcbPosition)return;throw new Error("CurrentSource requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({additionalAliases:{pin1:["pos"],pin2:["neg"]}})}_getSchematicSymbolDisplayValue(){let{current:current3,frequency:frequency22,peakToPeakCurrent}=this._parsedProps,parts=[];return current3!==void 0&&parts.push(`${formatSiUnit(current3)}A`),peakToPeakCurrent!==void 0&&parts.push(`${formatSiUnit(peakToPeakCurrent)}A p-p`),frequency22!==void 0&&parts.push(`${formatSiUnit(frequency22)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_current_source",name:this.name,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db2}=this.root,{_parsedProps:props}=this,isAc=props.frequency!==void 0||props.peakToPeakCurrent!==void 0||props.waveShape!==void 0,posPort=this.portMap.pos,negPort=this.portMap.neg;if(isAc)db2.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!1,terminal1_source_port_id:posPort.source_port_id,terminal2_source_port_id:negPort.source_port_id,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle});else{if(props.current===void 0)return;db2.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!0,positive_source_port_id:posPort.source_port_id,negative_source_port_id:negPort.source_port_id,current:props.current})}}},edgeSpecifiers=["leftedge","rightedge","topedge","bottomedge","center"],Constraint3=class extends PrimitiveComponent2{get config(){return{componentName:"Constraint",zodProps:constraintProps}}constructor(props){if(super(props),("xdist"in props||"ydist"in props)&&!("edgeToEdge"in props)&&!("centerToCenter"in props))throw new Error(`edgeToEdge, centerToCenter must be set for xDist or yDist for ${this}`);if("for"in props&&props.for.length<2)throw new Error(`"for" must have at least two selectors for ${this}`)}_getAllReferencedComponents(){let componentsWithSelectors=[],container=this.getPrimitiveContainer();function addComponentFromSelector(selector){let maybeEdge=selector.split(" ").pop(),edge=edgeSpecifiers.includes(maybeEdge)?maybeEdge:void 0,componentSelector=edge?selector.replace(` ${edge}`,""):selector,component=container.selectOne(componentSelector,{pcbPrimitive:!0});component&&componentsWithSelectors.push({selector,component,componentSelector,edge})}for(let key of["left","right","top","bottom"])key in this._parsedProps&&addComponentFromSelector(this._parsedProps[key]);if("for"in this._parsedProps)for(let selector of this._parsedProps.for)addComponentFromSelector(selector);return{componentsWithSelectors}}},AutoroutingPhase=class extends PrimitiveComponent2{get config(){return{componentName:"AutoroutingPhase",zodProps:autoroutingPhaseProps}}add(_component){throw new Error("<autoroutingphase> cannot contain children")}},FabricationNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteDimension",zodProps:fabricationNoteDimensionProps}}_resolvePoint(input2,transform6){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(input2);return target?target._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${input2}"`),applyToPoint2(transform6,{x:0,y:0}))}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform6,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform6=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform6),to3=this._resolvePoint(props.to,transform6),subcircuit=this.getSubcircuit(),group=this.getGroup(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteDimension. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),fabrication_note_dimension=db2.pcb_fabrication_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,layer,from,to:to3,text,offset:props.offset,font:props.font??"tscircuit2024",font_size:props.fontSize??1,color:props.color,arrow_size:props.arrowSize??1});this.fabrication_note_dimension_id=fabrication_note_dimension.pcb_fabrication_note_dimension_id}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.fabrication_note_dimension_id)return;let dimension=db2.pcb_fabrication_note_dimension.get(this.fabrication_note_dimension_id);dimension&&db2.pcb_fabrication_note_dimension.update(this.fabrication_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}getPcbSize(){let transform6=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform6),to3=this._resolvePoint(this._parsedProps.to,transform6);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx3=to3.x-from.x,dy3=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx3*dx3+dy3*dy3),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}},PcbNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteDimension",zodProps:pcbNoteDimensionProps}}_resolvePoint(input2,transform6){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(`.${input2}`);if(!target)return this.renderError(`PcbNoteDimension could not find selector "${input2}"`),applyToPoint2(transform6,{x:0,y:0});let targetPcbComponentId=target.pcb_component_id,root=this.root;if(targetPcbComponentId&&root){let pcbComponent=root.db.pcb_component.get(targetPcbComponentId);if(pcbComponent?.center)return{x:pcbComponent.center.x,y:pcbComponent.center.y}}return target._getGlobalPcbPositionBeforeLayout()}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform6,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform6=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform6),to3=this._resolvePoint(props.to,transform6),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),pcb_note_dimension3=db2.pcb_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,from,to:to3,text,font:props.font??"tscircuit2024",font_size:props.fontSize??1,layer:props.layer==="bottom"?"bottom":"top",color:props.color,arrow_size:props.arrowSize??1});this.pcb_note_dimension_id=pcb_note_dimension3.pcb_note_dimension_id}doInitialPcbLayout(){let root=this.root;if(!root||root.pcbDisabled||!this.pcb_note_dimension_id)return;let{db:db2}=root,transform6=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform6),to3=this._resolvePoint(this._parsedProps.to,transform6);db2.pcb_note_dimension.update(this.pcb_note_dimension_id,{from,to:to3})}getPcbSize(){let transform6=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform6),to3=this._resolvePoint(this._parsedProps.to,transform6);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx3=to3.x-from.x,dy3=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx3*dx3+dy3*dy3),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_dimension_id)return;let dimension=db2.pcb_note_dimension.get(this.pcb_note_dimension_id);dimension&&db2.pcb_note_dimension.update(this.pcb_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}},Breakout=class extends Group5{constructor(props){super({...props,subcircuit:!0})}doInitialPcbPrimitiveRender(){if(super.doInitialPcbPrimitiveRender(),this.root?.pcbDisabled)return;let{db:db2}=this.root,props=this._parsedProps;if(!this.pcb_group_id)return;let pcb_group3=db2.pcb_group.get(this.pcb_group_id),padLeft=props.paddingLeft??props.padding??0,padRight=props.paddingRight??props.padding??0,padTop=props.paddingTop??props.padding??0,padBottom=props.paddingBottom??props.padding??0;db2.pcb_group.update(this.pcb_group_id,{width:(pcb_group3.width??0)+padLeft+padRight,height:(pcb_group3.height??0)+padTop+padBottom,center:{x:pcb_group3.center.x+(padRight-padLeft)/2,y:pcb_group3.center.y+(padTop-padBottom)/2}})}},BreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){let{connection}=this._parsedProps,subcircuit=this.getSubcircuit();subcircuit&&(this.matchedPort=subcircuit.selectOne(connection,{type:"port"}),this.matchedPort||(this.matchedNet=subcircuit.selectOne(connection,{type:"net"})),!this.matchedPort&&!this.matchedNet&&this.renderError(`Could not find connection target "${connection}"`))}_getSourceTraceIdForPort(port){let{db:db2}=this.root;return db2.source_trace.list().find(st3=>st3.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db:db2}=this.root;return db2.source_trace.list().find(st3=>st3.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;this._matchConnection();let position4=this._getGlobalPcbPositionBeforeLayout(),group=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group||!group.pcb_group_id)return;let pcb_breakout_point3=db2.pcb_breakout_point.insert({pcb_group_id:group.pcb_group_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,source_port_id:this.matchedPort?.source_port_id??void 0,source_trace_id:this.matchedPort?this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,x:position4.x,y:position4.y});this.pcb_breakout_point_id=pcb_breakout_point3.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let position4=this._getGlobalPcbPositionBeforeLayout();return{center:{x:position4.x,y:position4.y},bounds:{left:position4.x,top:position4.y,right:position4.x,bottom:position4.y},width:0,height:0}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;this.pcb_breakout_point_id&&db2.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_breakout_point_id)return;let point62=db2.pcb_breakout_point.get(this.pcb_breakout_point_id);point62&&db2.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point62.x+deltaX,y:point62.y+deltaY})}getPcbSize(){return{width:0,height:0}}},NetLabel=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_label_id")}get config(){return{componentName:"NetLabel",zodProps:netLabelProps}}_getAnchorSide(){let{_parsedProps:props}=this;if(props.anchorSide)return props.anchorSide;if(!this._resolveConnectsTo())return"right";let net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),sourceNet;if(net?.source_net_id&&(sourceNet=this.root?.db.source_net.get(net.source_net_id)),sourceNet?.is_ground)return"top";if(sourceNet?.is_power)return"bottom";let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),connectedPorts=this._getConnectedPorts();if(connectedPorts.length===0)return"right";let port=connectedPorts[0];if(port.facingDirection)return getEnteringEdgeFromDirection(port.facingDirection);let connectedPortPosition=port._getGlobalSchematicPositionBeforeLayout(),dx3=connectedPortPosition.x-anchorPos.x,dy3=connectedPortPosition.y-anchorPos.y;if(Math.abs(dx3)>Math.abs(dy3)){if(dx3>0)return"right";if(dx3<0)return"left"}else{if(dy3>0)return"top";if(dy3<0)return"bottom"}return"right"}_getConnectedPorts(){let connectsTo=this._resolveConnectsTo();if(!connectsTo)return[];let connectedPorts=[];for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection);port&&connectedPorts.push(port)}return connectedPorts}computeSchematicPropsTransform(){let{_parsedProps:props}=this;if(props.schX===void 0&&props.schY===void 0){let connectedPorts=this._getConnectedPorts();if(connectedPorts.length>0){let portPos=connectedPorts[0]._getGlobalSchematicPositionBeforeLayout(),parentCenter=applyToPoint2(this.parent?.computeSchematicGlobalTransform?.()??identity(),{x:0,y:0});return translate2(portPos.x-parentCenter.x,portPos.y-parentCenter.y)}}return super.computeSchematicPropsTransform()}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,anchorPos=this._getGlobalSchematicPositionBeforeLayout(),net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),anchorSide=this._getAnchorSide(),center2=computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:anchorSide,text:props.net}),netLabel=db2.schematic_net_label.insert({text:props.net,source_net_id:net.source_net_id,anchor_position:anchorPos,center:center2,anchor_side:anchorSide});this.source_net_label_id=netLabel.source_net_id}_resolveConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo??props.connection;if(Array.isArray(connectsTo))return connectsTo;if(typeof connectsTo=="string")return[connectsTo]}_getNetName(){let{_parsedProps:props}=this;return props.net}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;props.net&&createNetsFromProps(this,[`net.${props.net}`])}doInitialCreateTracesFromNetLabels(){if(this.root?.schematicDisabled)return;let connectsTo=this._resolveConnectsTo();if(connectsTo)for(let connection of connectsTo)this.add(new Trace3({from:connection,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,connectsTo=this._resolveConnectsTo();if(!connectsTo||connectsTo.length===0)return;let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),anchorSide=this._getAnchorSide(),anchorFacing={left:"x-",right:"x+",top:"y+",bottom:"y-"}[anchorSide],net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`);for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection,{type:"port"});if(!port||!port.schematic_port_id)continue;let existingTraceForThisConnection=!1;if(net?.source_net_id){let candidateSourceTrace=db2.source_trace.list().find(st3=>st3.connected_source_net_ids?.includes(net.source_net_id)&&st3.connected_source_port_ids?.includes(port.source_port_id??""));if(candidateSourceTrace&&(existingTraceForThisConnection=db2.schematic_trace.list().some(t52=>t52.source_trace_id===candidateSourceTrace.source_trace_id)),existingTraceForThisConnection)continue}let portPos=port._getGlobalSchematicPositionAfterLayout(),portFacing=convertFacingDirectionToElbowDirection(port.facingDirection??"right")??"x+",path=calculateElbow({x:portPos.x,y:portPos.y,facingDirection:portFacing},{x:anchorPos.x,y:anchorPos.y,facingDirection:anchorFacing});if(!Array.isArray(path)||path.length<2)continue;let edges=[];for(let i3=0;i3<path.length-1;i3++)edges.push({from:{x:path[i3].x,y:path[i3].y},to:{x:path[i3+1].x,y:path[i3+1].y}});let source_trace_id,subcircuit_connectivity_map_key;if(net?.source_net_id&&port.source_port_id){let st3=db2.source_trace.list().find(s3=>s3.connected_source_net_ids?.includes(net.source_net_id)&&s3.connected_source_port_ids?.includes(port.source_port_id));source_trace_id=st3?.source_trace_id,subcircuit_connectivity_map_key=st3?.subcircuit_connectivity_map_key||db2.source_net.get(net.source_net_id)?.subcircuit_connectivity_map_key}db2.schematic_trace.insert({source_trace_id,edges,junctions:[],subcircuit_connectivity_map_key}),db2.schematic_port.update(port.schematic_port_id,{is_connected:!0})}}},Fiducial=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Fiducial",zodProps:fiducialProps,sourceFtype:"simple_fiducial"}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,layer:maybeFlipLayer(props.layer||"top"),shape:"circle",x:position4.x,y:position4.y,radius:distance.parse(props.padDiameter)/2,soldermask_margin:props.soldermaskPullback?distance.parse(props.soldermaskPullback):distance.parse(props.padDiameter)/2,is_covered_with_solder_mask:!0});this.pcb_smtpad_id=pcb_smtpad3.pcb_smtpad_id}getPcbSize(){let{_parsedProps:props}=this,d4=distance.parse(props.padDiameter);return{width:d4,height:d4}}_setPositionFromLayout(newCenter){if(!this.pcb_smtpad_id)return;let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);pad2&&(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill"?this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY}):pad2.shape==="polygon"&&db2.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))}))}},Via=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"pcb_via_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"source_manually_placed_via_id",null);__publicField(this,"subcircuit_connectivity_map_key",null);let layers=this._getLayers();this._parsedProps.layers=layers,this.initPorts()}get config(){return{componentName:"Via",zodProps:viaProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}_getResolvedViaDiameters(pcbStyle2){return getViaDiameterDefaultsWithOverrides({holeDiameter:this._parsedProps.holeDiameter,padDiameter:this._parsedProps.outerDiameter},pcbStyle2)}getPcbSize(){let pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2);return{width:padDiameter,height:padDiameter}}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,via=db2.pcb_via.get(this.pcb_via_id),size3=this.getPcbSize();return{center:{x:via.x,y:via.y},bounds:{left:via.x-size3.width/2,top:via.y-size3.height/2,right:via.x+size3.width/2,bottom:via.y+size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_via.update(this.pcb_via_id,{x:newCenter.x,y:newCenter.y})}_getLayers(){let{fromLayer="top",toLayer="bottom"}=this._parsedProps;return fromLayer===toLayer?[fromLayer]:[fromLayer,toLayer]}initPorts(){let layers=this._parsedProps.layers;for(let layer of layers){let port2=new Port({name:layer,layer});port2.registerMatch(this),this.add(port2)}let port=new Port({name:"pin1"});port.registerMatch(this),this.add(port)}_getConnectedNetOrTrace(){let connectsTo=this._parsedProps.connectsTo;if(!connectsTo)return null;let subcircuit=this.getSubcircuit(),selectors=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let selector of selectors)if(selector.startsWith("net.")){let net=subcircuit.selectOne(selector,{type:"net"});if(net)return net}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position4=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component3=db2.pcb_component.insert({center:position4,width:padDiameter,height:padDiameter,layer:this._parsedProps.fromLayer??"top",rotation:0,source_component_id:this.source_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,obstructs_within_bounds:!0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,group=this.getGroup(),subcircuit=this.getSubcircuit(),source_via=db2.source_manually_placed_via.insert({source_group_id:group?.source_group_id,source_net_id:props.net??"",subcircuit_id:subcircuit?.subcircuit_id??void 0});this.source_component_id=source_via.source_manually_placed_via_id}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position4=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_via3=db2.pcb_via.insert({x:position4.x,y:position4.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:this._getLayers(),from_layer:this._parsedProps.fromLayer||"bottom",to_layer:this._parsedProps.toLayer||"top",subcircuit_id:subcircuit?.subcircuit_id??void 0,subcircuit_connectivity_map_key:this.subcircuit_connectivity_map_key??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:this._parsedProps.netIsAssignable??void 0});this.pcb_via_id=pcb_via3.pcb_via_id;let connected=this._getConnectedNetOrTrace();connected&&"source_net_id"in connected&&connected.source_net_id&&db2.pcb_via.update(this.pcb_via_id,{pcb_trace_id:connected.source_net_id})}},EPSILON3=1e-9,isWireRoutePoint=routePoint=>routePoint.route_type==="wire",isPointOnSegment5=(p4,a3,b3)=>{let cross22=(p4.y-a3.y)*(b3.x-a3.x)-(p4.x-a3.x)*(b3.y-a3.y);if(Math.abs(cross22)>EPSILON3)return!1;let dot=(p4.x-a3.x)*(b3.x-a3.x)+(p4.y-a3.y)*(b3.y-a3.y);if(dot<-EPSILON3)return!1;let squaredLength=(b3.x-a3.x)**2+(b3.y-a3.y)**2;return!(dot-squaredLength>EPSILON3)},isPointInRing=(point62,ring3)=>{if(ring3.length<3)return!1;let inside2=!1,previous=ring3[ring3.length-1];for(let current3 of ring3){if(isPointOnSegment5(point62,previous,current3))return!0;current3.y>point62.y!=previous.y>point62.y&&point62.x<(previous.x-current3.x)*(point62.y-current3.y)/(previous.y-current3.y)+current3.x&&(inside2=!inside2),previous=current3}return inside2},isPointInRectPour=(p4,pour)=>{let{center:center2,width,height}=pour,rotationRad=(pour.rotation??0)*Math.PI/180,cosR=Math.cos(-rotationRad),sinR=Math.sin(-rotationRad),dx3=p4.x-center2.x,dy3=p4.y-center2.y,localX=dx3*cosR-dy3*sinR,localY=dx3*sinR+dy3*cosR;return Math.abs(localX)<=width/2+EPSILON3&&Math.abs(localY)<=height/2+EPSILON3},isPointInBrepPour=(p4,pour)=>{let outerRing=pour.brep_shape.outer_ring.vertices.map(v4=>({x:v4.x,y:v4.y}));if(!isPointInRing(p4,outerRing))return!1;for(let innerRing of pour.brep_shape.inner_rings){let points=innerRing.vertices.map(v4=>({x:v4.x,y:v4.y}));if(isPointInRing(p4,points))return!1}return!0},isPointInCopperPour=(point62,pour)=>pour.shape==="rect"?isPointInRectPour(point62,pour):pour.shape==="brep"?isPointInBrepPour(point62,pour):!1,isTraceConnectedToSourceNet=(trace,sourceNetId,sourceTraceById)=>{if(trace.source_trace_id===sourceNetId)return!0;if(!trace.source_trace_id)return!1;let sourceTrace=sourceTraceById.get(trace.source_trace_id);return sourceTrace?sourceTrace.connected_source_net_ids.includes(sourceNetId):!1},isSegmentFullyInsideCopperPour=(start,end,pour)=>{let dx3=end.x-start.x,dy3=end.y-start.y;return Math.hypot(dx3,dy3)<=EPSILON3?!1:[0,.25,.5,.75,1].every(t52=>isPointInCopperPour({x:start.x+dx3*t52,y:start.y+dy3*t52},pour))},markTraceSegmentsInsideCopperPour=({db:db2,copperPour})=>{if(!copperPour.source_net_id)return;let sourceTraceById=new Map(db2.source_trace.list().map(sourceTrace=>[sourceTrace.source_trace_id,sourceTrace]));for(let trace of db2.pcb_trace.list()){if(!isTraceConnectedToSourceNet(trace,copperPour.source_net_id,sourceTraceById))continue;let routeChanged=!1,nextRoute=trace.route.map(routePoint=>({...routePoint}));for(let i3=0;i3<nextRoute.length-1;i3++){let fromRoutePoint=nextRoute[i3],toRoutePoint=nextRoute[i3+1];!fromRoutePoint||!toRoutePoint||!isWireRoutePoint(fromRoutePoint)||!isWireRoutePoint(toRoutePoint)||fromRoutePoint.layer!==copperPour.layer||toRoutePoint.layer!==copperPour.layer||isSegmentFullyInsideCopperPour({x:fromRoutePoint.x,y:fromRoutePoint.y},{x:toRoutePoint.x,y:toRoutePoint.y},copperPour)&&(fromRoutePoint.is_inside_copper_pour=!0,fromRoutePoint.copper_pour_id=copperPour.pcb_copper_pour_id,toRoutePoint.is_inside_copper_pour=!0,toRoutePoint.copper_pour_id=copperPour.pcb_copper_pour_id,routeChanged=!0)}routeChanged&&db2.pcb_trace.update(trace.pcb_trace_id,{route:nextRoute})}},CopperPour=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CopperPour",zodProps:copperPourProps}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;createNetsFromProps(this,[props.connectsTo])}doInitialPcbCopperPourRender(){this.root?.pcbDisabled||this._queueAsyncEffect("PcbCopperPourRender",async()=>{let{db:db2}=this.root,{_parsedProps:props}=this,net=this.getSubcircuit().selectOne(props.connectsTo);if(!net||!net.source_net_id){this.renderError(`Net "${props.connectsTo}" not found for copper pour`);return}let subcircuit=this.getSubcircuit(),circuitJson=db2.toArray(),sourceNet=circuitJson.find(elm=>elm.type==="source_net"&&elm.name===net.name),connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson),connectedNetId=sourceNet?.source_net_id??net.source_net_id,pourConnectivityKey=(connectedNetId?connectivityMap.getNetConnectedToId(connectedNetId):void 0)||sourceNet?.subcircuit_connectivity_map_key||"",clearance=props.clearance??.2,inputProblem=convertCircuitJsonToInputProblem(circuitJson,{layer:props.layer,pour_connectivity_key:pourConnectivityKey,pad_margin:props.padMargin??clearance,trace_margin:props.traceMargin??clearance,board_edge_margin:props.boardEdgeMargin??clearance,cutout_margin:props.cutoutMargin??clearance,outline:props.outline});await initializeManifoldGeometry();let solver=new CopperPourPipelineSolver(inputProblem);this.root.emit("solver:started",{solverName:"CopperPourPipelineSolver",solverParams:inputProblem,componentName:this.props.name});let{brep_shapes}=solver.getOutput(),coveredWithSolderMask=props.coveredWithSolderMask??!1;for(let brep_shape3 of brep_shapes){let insertedPour=db2.pcb_copper_pour.insert({shape:"brep",layer:props.layer,brep_shape:brep_shape3,source_net_id:net.source_net_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,covered_with_solder_mask:coveredWithSolderMask});markTraceSegmentsInsideCopperPour({db:db2,copperPour:insertedPour})}})}},CopperText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"pcb_copper_text_id",null)}get config(){return{componentName:"CopperText",zodProps:copperTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),position4=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_copper_text3=db2.pcb_copper_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position4.x,y:position4.y},font:"tscircuit2024",font_size:props.fontSize,layer:props.layer??"top",text:normalizeTextForCircuitJson(props.text),ccw_rotation:props.pcbRotation,is_mirrored:props.mirrored,is_knockout:props.knockout,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_copper_text_id=pcb_copper_text3.pcb_copper_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=props.fontSize??1,textWidth=(props.text??"").length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_copper_text_id)return;let text=db2.pcb_copper_text.get(this.pcb_copper_text_id);text&&db2.pcb_copper_text.update(this.pcb_copper_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},Battery=class extends NormalComponent3{get config(){return{componentName:"Battery",schematicSymbolName:this.props.symbolName??"battery",zodProps:batteryProps,sourceFtype:"simple_power_source"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:props.capacity,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},STANDARD_USB_C_PIN_LABELS=[{label:"GND1",aliases:[]},{label:"VBUS1",aliases:[]},{label:"CC1",aliases:[]},{label:"DP1",aliases:[]},{label:"DM1",aliases:["DN1"]},{label:"SBU1",aliases:[]},{label:"SBU2",aliases:[]},{label:"DM2",aliases:["DN2"]},{label:"DP2",aliases:[]},{label:"CC2",aliases:[]},{label:"VBUS2",aliases:[]},{label:"GND2",aliases:[]},{label:"SHELL1",aliases:["MH1","EH1","MOUNT1"]},{label:"SHELL2",aliases:["MH2","EH2","MOUNT2"]},{label:"SHELL3",aliases:["MH3","EH3","MOUNT3"]},{label:"SHELL4",aliases:["MH4","EH4","MOUNT4"]}],PIN_NUMBER_HINT_PATTERN=/^(?:pin)?(\d+)$/i,dedupeHintsPreservingOrder=hints=>Array.from(new Set(hints)),convertCircuitJsonToUsbCStandardCircuitJson=partCircuitJson=>{let unassignedPorts=[];for(let elm of partCircuitJson){if(elm.type!=="source_port")continue;let pinNumber=elm.pin_number;if(typeof pinNumber!="number")continue;let upperCaseHints=new Set;for(let hint of elm.port_hints??[])upperCaseHints.add(hint.trim().toUpperCase());unassignedPorts.push({pinKey:`pin${pinNumber}`,upperCaseHints})}let canonicalHintsByPin={};for(let{label,aliases:aliases2}of STANDARD_USB_C_PIN_LABELS){let canonicalAndAliasHintsUpper=[label,...aliases2].map(s3=>s3.toUpperCase()),matchIndex=unassignedPorts.findIndex(port=>canonicalAndAliasHintsUpper.some(hint=>port.upperCaseHints.has(hint)));if(matchIndex===-1)continue;let{pinKey}=unassignedPorts[matchIndex];canonicalHintsByPin[pinKey]=[label],unassignedPorts.splice(matchIndex,1)}return Object.keys(canonicalHintsByPin).length===0?partCircuitJson:partCircuitJson.map(elm=>{if(!("port_hints"in elm)||!Array.isArray(elm.port_hints))return elm;let originalHints=elm.port_hints.filter(h6=>typeof h6=="string").map(h6=>h6.trim()).filter(h6=>h6.length>0);if(originalHints.length===0)return elm;let pinKeys=new Set;elm.type==="source_port"&&typeof elm.pin_number=="number"&&pinKeys.add(`pin${elm.pin_number}`);for(let hint of originalHints){let matchedPin=hint.match(PIN_NUMBER_HINT_PATTERN);matchedPin&&pinKeys.add(`pin${Number.parseInt(matchedPin[1],10)}`)}let canonicalHintsToAdd=[];for(let pinKey of pinKeys)canonicalHintsToAdd.push(...canonicalHintsByPin[pinKey]??[]);return canonicalHintsToAdd.length===0?elm:{...elm,port_hints:dedupeHintsPreservingOrder([...originalHints,...canonicalHintsToAdd])}})},extractCadModelFromCircuitJson=circuitJson=>{let cadComponent=circuitJson.find(elm=>elm.type==="cad_component");if(!cadComponent)return;let cadModelCandidate={stlUrl:cadComponent.model_stl_url,objUrl:cadComponent.model_obj_url,gltfUrl:cadComponent.model_gltf_url,glbUrl:cadComponent.model_glb_url,stepUrl:cadComponent.model_step_url,wrlUrl:cadComponent.model_wrl_url,modelOriginPosition:cadComponent.model_origin_position??void 0,modelUnitToMmScale:cadComponent.model_unit_to_mm_scale_factor,modelBoardNormalDirection:cadComponent.model_board_normal_direction,size:cadComponent.size??void 0,rotationOffset:cadComponent.rotation??void 0,positionOffset:cadComponent.position??void 0,showAsTranslucentModel:cadComponent.show_as_translucent_model};if(!cadModelCandidate.stlUrl&&!cadModelCandidate.objUrl&&!cadModelCandidate.gltfUrl&&!cadModelCandidate.glbUrl&&!cadModelCandidate.stepUrl&&!cadModelCandidate.wrlUrl&&!cadComponent.model_jscad)return;cadComponent.model_jscad&&typeof cadComponent.model_jscad=="object"&&(cadModelCandidate.jscad=cadComponent.model_jscad);let parsedCadModel=cadModelProp.safeParse(cadModelCandidate);return parsedCadModel.success?parsedCadModel.data:void 0},INNER_SYMBOL_SCALE_FACTOR=.5,INNER_SYMBOL_LEFT_SHIFT_FACTOR=.15;function insertInnerSymbolInSchematicBox(connector,symbol){if(!connector.schematic_component_id||!connector.root)return;let{db:db2}=connector.root,schematicComponent=db2.schematic_component.get(connector.schematic_component_id);if(!schematicComponent||schematicComponent.symbol_name)return;let targetWidth=schematicComponent.size.width*INNER_SYMBOL_SCALE_FACTOR,targetHeight=schematicComponent.size.height*INNER_SYMBOL_SCALE_FACTOR,scaleFactor=Math.min(targetWidth/symbol.size.width,targetHeight/symbol.size.height);if(!Number.isFinite(scaleFactor)||scaleFactor<=0)return;let subcircuit_id=connector.getSubcircuit()?.subcircuit_id??void 0,center2=schematicComponent.center,symbolCenter=symbol.center,centerOffsetX=-schematicComponent.size.width*INNER_SYMBOL_LEFT_SHIFT_FACTOR,transformPoint=point62=>({x:center2.x+centerOffsetX+(point62.x-symbolCenter.x)*scaleFactor,y:center2.y+(point62.y-symbolCenter.y)*scaleFactor});for(let primitive of symbol.primitives)if(primitive.type==="path"){let points=primitive.points.map(transformPoint);if(primitive.closed&&points.length>1){let first=points[0],last=points[points.length-1];(first.x!==last.x||first.y!==last.y)&&points.push(first)}db2.schematic_path.insert({schematic_component_id:connector.schematic_component_id,points,is_filled:primitive.fill??!1,fill_color:primitive.fill?SCHEMATIC_COMPONENT_OUTLINE_COLOR:void 0,stroke_width:.02,subcircuit_id})}else if(primitive.type==="circle")db2.schematic_circle.insert({schematic_component_id:connector.schematic_component_id,center:transformPoint({x:primitive.x,y:primitive.y}),radius:primitive.radius*scaleFactor,stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:primitive.fill,fill_color:primitive.fill?SCHEMATIC_COMPONENT_OUTLINE_COLOR:void 0,is_dashed:!1,subcircuit_id});else if(primitive.type==="box"){let topLeft=transformPoint({x:primitive.x,y:primitive.y}),bottomRight=transformPoint({x:primitive.x+primitive.width,y:primitive.y+primitive.height});db2.schematic_rect.insert({schematic_component_id:connector.schematic_component_id,center:{x:(topLeft.x+bottomRight.x)/2,y:(topLeft.y+bottomRight.y)/2},width:Math.abs(bottomRight.x-topLeft.x),height:Math.abs(bottomRight.y-topLeft.y),stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:!1,is_dashed:!1,rotation:0,subcircuit_id})}}var USB_C_SIGNAL_LABELS_IN_ORDER=["VBUS1","VBUS2","CC1","CC2","DP1","DP2","DM1","DM2","SBU1","SBU2","GND1","GND2"],USB_C_SHELL_LABELS_IN_ORDER=["SHELL1","SHELL2","SHELL3","SHELL4"],USB_C_CANONICAL_LABELS_IN_ORDER=[...USB_C_SIGNAL_LABELS_IN_ORDER,...USB_C_SHELL_LABELS_IN_ORDER],USB_C_CANONICAL_LABELS=new Set([...USB_C_CANONICAL_LABELS_IN_ORDER]),USB_C_DEFAULT_SCH_PIN_STYLE_BY_LABEL=[["CC1",{marginTop:.15}],["DP1",{marginTop:.15}],["SBU1",{marginTop:.15}],["GND1",{marginTop:.15}],["SHELL4",{marginRight:.15}]],Connector=class extends Chip{_getConnectorProps(){return this._parsedProps}_hasExplicitFootprint(){return this._getConnectorProps().footprint!==void 0||this.children.some(child=>child.componentName==="Footprint")}_shouldUseStandardPartsEngineCircuitJsonFlow(){return!(!this._getConnectorProps().standard||this._hasExplicitFootprint()||this.getInheritedProperty("partsEngineDisabled"))}_insertStandardConnectorCircuitJsonError(standard,message){let{db:db2}=this.root,errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch circuit JSON for ${this.getString()} (standard="${standard}"): ${message}`,source_component_id:this.source_component_id??void 0,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0});db2.unknown_error_finding_part.insert(errorObj)}_getSupplierPartNumbersToTry(supplierPartNumbers){let partNumbers=[];for(let supplier of Object.keys(supplierPartNumbers??{})){let nums=supplierPartNumbers?.[supplier];Array.isArray(nums)&&nums.length>0&&partNumbers.push(nums[0])}return partNumbers}async _tryFetchPartCircuitJson(fetchPartCircuitJson,params){let maybeCircuitJson=await Promise.resolve(fetchPartCircuitJson(params))??null;return Array.isArray(maybeCircuitJson)&&maybeCircuitJson.length>0?maybeCircuitJson:null}async _fetchStandardConnectorCircuitJson(fetchPartCircuitJson,supplierPartNumbers,manufacturerPartNumber){for(let supplierPartNumber of this._getSupplierPartNumbersToTry(supplierPartNumbers)){let circuitJson=await this._tryFetchPartCircuitJson(fetchPartCircuitJson,{supplierPartNumber});if(circuitJson)return circuitJson}return manufacturerPartNumber?this._tryFetchPartCircuitJson(fetchPartCircuitJson,{manufacturerPartNumber}):null}_addConnectorFootprintFromCircuitJson(standard,circuitJson){let props=this._getConnectorProps(),standardizedCircuitJson=standard==="usb_c"?convertCircuitJsonToUsbCStandardCircuitJson(circuitJson):circuitJson,fpComponents=createComponentsFromCircuitJson({componentName:this.name,componentRotation:String(props.pcbRotation??0),footprinterString:`standard:${standard}`,pinLabels:props.pinLabels,pcbPinLabels:props.pcbPinLabels},standardizedCircuitJson),fetchedCadModel=extractCadModelFromCircuitJson(standardizedCircuitJson);fetchedCadModel&&(this._asyncFootprintCadModel=fetchedCadModel),this.addAll(fpComponents),this._markDirty("InitializePortsFromChildren")}_getUsbCCanonicalLabelToPinNumberMap(){let labelToPinNumber=new Map,ports=this.selectAll("port");for(let port of ports){let pinNumber=port.props.pinNumber;if(typeof pinNumber=="number")for(let alias of port.getNameAndAliases()){let normalizedAlias=alias.trim().toUpperCase();if(!USB_C_CANONICAL_LABELS.has(normalizedAlias))continue;let label=normalizedAlias;labelToPinNumber.has(label)||labelToPinNumber.set(label,pinNumber)}}return labelToPinNumber}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0||this._getConnectorProps().standard!=="usb_c")return arrangement;let labelToPinNumber=this._getUsbCCanonicalLabelToPinNumberMap(),rightPins=USB_C_SIGNAL_LABELS_IN_ORDER.map(label=>labelToPinNumber.get(label)).filter(pin=>typeof pin=="number"),bottomPins=USB_C_SHELL_LABELS_IN_ORDER.map(label=>labelToPinNumber.get(label)).filter(pin=>typeof pin=="number");if(rightPins.length===0&&bottomPins.length===0)return arrangement;let canonicalArrangement={};return rightPins.length>0&&(canonicalArrangement.rightSide={pins:rightPins,direction:"top-to-bottom"}),bottomPins.length>0&&(canonicalArrangement.bottomSide={pins:bottomPins,direction:"left-to-right"}),canonicalArrangement}_getSchematicBoxDimensions(){if(this._getConnectorProps().standard!=="usb_c")return super._getSchematicBoxDimensions();if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this,pinCount=this._getPrimaryPinCount(),pinSpacing=.2,allPinLabels={...this._getPinLabelsFromPorts()};if(props.pinLabels)for(let[k4,v4]of Object.entries(props.pinLabels))typeof v4=="string"&&(allPinLabels[k4]=v4);let labelToPinNumber=this._getUsbCCanonicalLabelToPinNumberMap(),resolvedDefaultSchPinStyle={};for(let[label,style]of USB_C_DEFAULT_SCH_PIN_STYLE_BY_LABEL){let pinNumber=labelToPinNumber.get(label);typeof pinNumber=="number"&&(resolvedDefaultSchPinStyle[`pin${pinNumber}`]=style)}let mergedSchPinStyle={...resolvedDefaultSchPinStyle,...props.schPinStyle??{}},schPortArrangement=this._getSchematicPortArrangement();return getAllDimensionsForSchematicBox({schWidth:props.schWidth,schHeight:props.schHeight,schPinSpacing:pinSpacing,numericSchPinStyle:getNumericSchPinStyle(mergedSchPinStyle,allPinLabels),pinCount,schPortArrangement:schPortArrangement??void 0,pinLabels:allPinLabels})}get config(){return{componentName:"Connector",zodProps:connectorProps,shouldRenderAsSchematicBox:!0}}doInitialSourceRender(){let{db:db2}=this.root,props=this._getConnectorProps(),manufacturerPartNumber=props.manufacturerPartNumber??props.mfn,source_component=db2.source_component.insert({ftype:"simple_connector",name:this.name,manufacturer_part_number:manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName,standard:props.standard});this.source_component_id=source_component.source_component_id,props.standard&&!manufacturerPartNumber&&db2.source_missing_manufacturer_part_number_warning.insert({source_component_id:this.source_component_id,standard:props.standard,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,warning_type:"source_missing_manufacturer_part_number_warning",message:`${this.getString()} has standard="${props.standard}" but no manufacturerPartNumber (mfn). Add mfn if you do not want the USB-C part to change in future.`})}_isUsingStandardPartsEngineCircuitJsonFlow(){return this._shouldUseStandardPartsEngineCircuitJsonFlow()?!!this.getInheritedProperty("partsEngine")?.fetchPartCircuitJson:!1}doInitialFetchPartFootprint(){let props=this._getConnectorProps(),standard=props.standard;if(!standard||!this._shouldUseStandardPartsEngineCircuitJsonFlow()||this._hasStartedFootprintUrlLoad)return;let partsEngine2=this.getInheritedProperty("partsEngine");if(partsEngine2&&!partsEngine2.fetchPartCircuitJson){this._insertStandardConnectorCircuitJsonError(standard,"partsEngine.fetchPartCircuitJson is not configured");return}let fetchPartCircuitJson=partsEngine2?.fetchPartCircuitJson;if(!fetchPartCircuitJson)return;this._hasStartedFootprintUrlLoad=!0;let sourceComponentForQuery={type:"source_component",ftype:"simple_connector",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,standard};this._queueAsyncEffect("load-standard-connector-circuit-json",async()=>{let{db:db2}=this.root;try{let supplierPartNumbers=await this._getSupplierPartNumbers(partsEngine2,sourceComponentForQuery,`standard:${standard}`);this.source_component_id&&db2.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbers});let circuitJson=await this._fetchStandardConnectorCircuitJson(fetchPartCircuitJson,supplierPartNumbers,sourceComponentForQuery.manufacturer_part_number);if(!circuitJson)return;this._addConnectorFootprintFromCircuitJson(standard,circuitJson)}catch(error2){this._insertStandardConnectorCircuitJsonError(standard,error2.message)}})}doInitialPartsEngineRender(){this._isUsingStandardPartsEngineCircuitJsonFlow()||super.doInitialPartsEngineRender()}updatePartsEngineRender(){this._isUsingStandardPartsEngineCircuitJsonFlow()||super.updatePartsEngineRender()}doInitialSchematicComponentRender(){if(super.doInitialSchematicComponentRender(),!this.root?.schematicDisabled&&this.schematic_component_id&&this._getConnectorProps().standard==="usb_c"){let usbcSymbol=Vf.usbc;usbcSymbol&&insertInnerSymbolInSchematicBox(this,usbcSymbol)}}doInitialPcbComponentSizeCalculation(){if(super.doInitialPcbComponentSizeCalculation(),this.root?.pcbDisabled||!this.pcb_component_id||!this.source_component_id)return;let{db:db2}=this.root,connectorCircuitJson=db2.toArray().filter(elm=>elm.type==="pcb_component"?elm.pcb_component_id===this.pcb_component_id:elm.type==="source_component"?elm.source_component_id===this.source_component_id:"pcb_component_id"in elm&&elm.pcb_component_id===this.pcb_component_id||"source_component_id"in elm&&elm.source_component_id===this.source_component_id);if(connectorCircuitJson.length===0)return;let inferredInsertionCenter=guessCableInsertCenter(connectorCircuitJson);db2.pcb_component.update(this.pcb_component_id,{cable_insertion_center:{x:inferredInsertionCenter.x,y:inferredInsertionCenter.y}})}},PinHeader=class extends NormalComponent3{_getPcbRotationBeforeLayout(){let orientationRotation=this.props.pcbOrientation==="vertical"?-90:0;return(super._getPcbRotationBeforeLayout()??0)+orientationRotation}get config(){return{componentName:"PinHeader",zodProps:pinHeaderProps,shouldRenderAsSchematicBox:!0}}_getImpliedFootprintString(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:0),holeDiameter=this._parsedProps.holeDiameter,platedDiameter=this._parsedProps.platedDiameter,pitch=this._parsedProps.pitch,showSilkscreenPinLabels=this._parsedProps.showSilkscreenPinLabels,rows=this._parsedProps.doubleRow?2:1;if(pinCount>0){let footprintString;if(pitch)!holeDiameter&&!platedDiameter?footprintString=`pinrow${pinCount}_p${pitch}`:footprintString=`pinrow${pinCount}_p${pitch}_id${holeDiameter}_od${platedDiameter}`;else if(!holeDiameter&&!platedDiameter)footprintString=`pinrow${pinCount}`;else return null;return showSilkscreenPinLabels!==!0&&(footprintString+="_nopinlabels"),rows>1&&(footprintString+=`_rows${rows}`),footprintString}return null}initPorts(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:1);for(let i3=1;i3<=pinCount;i3++){let rawLabel=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[i3-1]:this._parsedProps.pinLabels?.[`pin${i3}`];if(rawLabel){let primaryLabel=Array.isArray(rawLabel)?rawLabel[0]:rawLabel,otherLabels=Array.isArray(rawLabel)?rawLabel.slice(1):[];this.add(new Port({pinNumber:i3,name:primaryLabel,aliases:[`pin${i3}`,...otherLabels]}))}else this.add(new Port({pinNumber:i3,name:`pin${i3}`}))}}_getSchematicPortArrangement(){let pinCount=this._parsedProps.pinCount??1,facingDirection=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",schPinArrangement=this._parsedProps.schPinArrangement;return facingDirection==="left"?{leftSide:{direction:schPinArrangement?.leftSide?.direction??"top-to-bottom",pins:schPinArrangement?.leftSide?.pins??Array.from({length:pinCount},(_4,i3)=>`pin${i3+1}`)}}:{rightSide:{direction:schPinArrangement?.rightSide?.direction??"top-to-bottom",pins:schPinArrangement?.rightSide?.pins??Array.from({length:pinCount},(_4,i3)=>`pin${i3+1}`)}}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:props.supplierPartNumbers,pin_count:props.pinCount,gender:props.gender,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function getResonatorSymbolName(variant){switch(variant){case"two_ground_pins":return"crystal_4pin";case"ground_pin":return"resonator";case"no_ground":return"crystal";default:return"crystal"}}var Resonator=class extends NormalComponent3{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??getResonatorSymbolName(this.props.pinVariant),zodProps:resonatorProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"no_ground",source_component=db2.source_component.insert({ftype:"simple_resonator",name:this.name,frequency:props.frequency,load_capacitance:props.loadCapacitance,supplier_part_numbers:props.supplierPartNumbers,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="no_ground"||pinVariant==="ground_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}};function getPotentiometerSymbolName(variant){switch(variant){case"three_pin":return"potentiometer3";case"two_pin":return"potentiometer2";default:return"potentiometer2"}}var Potentiometer=class extends NormalComponent3{get config(){return{componentName:"Potentiometer",schematicSymbolName:this.props.symbolName??getPotentiometerSymbolName(this.props.pinVariant),zodProps:potentiometerProps,shouldRenderAsSchematicBox:!1}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.maxResistance)}\u03A9`}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"two_pin",source_component=db2.source_component.insert({ftype:"simple_potentiometer",name:this.name,max_resistance:props.maxResistance,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="two_pin",display_name:props.displayName,display_max_resistance:this._getSchematicSymbolDisplayValue()});this.source_component_id=source_component.source_component_id}},Crystal=class extends NormalComponent3{get config(){return{schematicSymbolName:this.props.symbolName??(this.props.pinVariant==="four_pin"?"crystal_4pin":"crystal"),componentName:"Crystal",zodProps:crystalProps,sourceFtype:"simple_crystal"}}initPorts(){let additionalAliases=this.props.pinVariant==="four_pin"?{pin1:["left1","1"],pin2:["top1","2","gnd1"],pin3:["right1","3"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left"],pin2:["neg","right"]};super.initPorts({additionalAliases})}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:"simple_crystal",frequency:props.frequency,load_capacitance:props.loadCapacitance,pin_variant:props.pinVariant||"two_pin",are_pins_interchangeable:(props.pinVariant||"two_pin")==="two_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Mosfet=class extends NormalComponent3{get config(){let mosfetMode=this.props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${this.props.channelType}_channel_${mosfetMode}_mosfet_transistor`;return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_mosfet",name:this.name,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},OpAmp=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"inverting_input",this.portMap.inverting_input);__publicField(this,"non_inverting_input",this.portMap.non_inverting_input);__publicField(this,"output",this.portMap.output);__publicField(this,"positive_supply",this.portMap.positive_supply);__publicField(this,"negative_supply",this.portMap.negative_supply)}getSchematicSymbolName(){return this.props.symbolName?this.props.symbolName:this.props.connections?.positive_supply||this.props.connections?.negative_supply?"opamp_with_power":"opamp_no_power"}get config(){return{componentName:"OpAmp",schematicSymbolName:this.getSchematicSymbolName(),zodProps:opampProps,sourceFtype:"simple_op_amp"}}initPorts(){let additionalAliases={pin1:["non_inverting_input"],pin2:["inverting_input"]};this.getSchematicSymbolName()==="opamp_with_power"?Object.assign(additionalAliases,{pin4:["output"],pin5:["positive_supply","vcc","vdd"],pin3:["negative_supply","vee","vss","gnd"]}):Object.assign(additionalAliases,{pin3:["output"],pin4:["positive_supply","vcc","vdd"],pin5:["negative_supply","vee","vss","gnd"]}),super.initPorts({pinCount:5,additionalAliases})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_op_amp",name:this.name,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db2}=this.root,invertingInputPort=this.portMap.inverting_input,nonInvertingInputPort=this.portMap.non_inverting_input,outputPort=this.portMap.output,positiveSupplyPort=this.portMap.positive_supply,negativeSupplyPort=this.portMap.negative_supply;!invertingInputPort?.source_port_id||!nonInvertingInputPort?.source_port_id||!outputPort?.source_port_id||!positiveSupplyPort?.source_port_id||!negativeSupplyPort?.source_port_id||db2.simulation_op_amp.insert({type:"simulation_op_amp",source_component_id:this.source_component_id,inverting_input_source_port_id:invertingInputPort.source_port_id,non_inverting_input_source_port_id:nonInvertingInputPort.source_port_id,output_source_port_id:outputPort.source_port_id,positive_supply_source_port_id:positiveSupplyPort.source_port_id,negative_supply_source_port_id:negativeSupplyPort.source_port_id})}};function hasSimProps(props){return props.simSwitchFrequency!==void 0||props.simCloseAt!==void 0||props.simOpenAt!==void 0||props.simStartClosed!==void 0||props.simStartOpen!==void 0}var Switch=class extends NormalComponent3{_getSwitchType(){let props=this._parsedProps;return props?props.dpdt?"dpdt":props.spst?"spst":props.spdt?"spdt":props.dpst?"dpst":props.type??"spst":"spst"}get config(){let switchType=this._getSwitchType(),isNormallyClosed=this._parsedProps?.isNormallyClosed??!1,symbolMap={spst:isNormallyClosed?"spst_normally_closed_switch":"spst_switch",spdt:isNormallyClosed?"spdt_normally_closed_switch":"spdt_switch",dpst:isNormallyClosed?"dpst_normally_closed_switch":"dpst_switch",dpdt:isNormallyClosed?"dpdt_normally_closed_switch":"dpdt_switch"};return{componentName:"Switch",schematicSymbolName:this.props.symbolName??symbolMap[switchType],zodProps:switchProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db2}=this.root,props=this._parsedProps??{},source_component=db2.source_component.insert({ftype:"simple_switch",name:this.name,are_pins_interchangeable:this._getSwitchType()==="spst",display_name:props?.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{_parsedProps:props}=this;if(!hasSimProps(props))return;let{db:db2}=this.root,simulationSwitch={type:"simulation_switch",source_component_id:this.source_component_id||""};props.simSwitchFrequency!==void 0&&(simulationSwitch.switching_frequency=frequency.parse(props.simSwitchFrequency)),props.simCloseAt!==void 0&&(simulationSwitch.closes_at=ms.parse(props.simCloseAt)),props.simOpenAt!==void 0&&(simulationSwitch.opens_at=ms.parse(props.simOpenAt)),props.simStartOpen!==void 0&&(simulationSwitch.starts_closed=!props.simStartOpen),props.simStartClosed!==void 0&&(simulationSwitch.starts_closed=props.simStartClosed),db2.simulation_switch.insert(simulationSwitch)}},TESTPOINT_DEFAULTS={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},TestPoint=class extends NormalComponent3{get config(){return{componentName:"TestPoint",schematicSymbolName:this.props.symbolName??"testpoint",zodProps:testpointProps,sourceFtype:FTYPE.simple_test_point}}_getPropsWithDefaults(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._parsedProps;return!footprintVariant&&holeDiameter&&(footprintVariant="through_hole"),footprintVariant??(footprintVariant="through_hole"),padShape??(padShape="circle"),footprintVariant==="pad"?padShape==="circle"?padDiameter??(padDiameter=TESTPOINT_DEFAULTS.SMT_CIRCLE_DIAMETER):padShape==="rect"&&(width??(width=TESTPOINT_DEFAULTS.SMT_RECT_SIZE),height??(height=width)):footprintVariant==="through_hole"&&(holeDiameter??(holeDiameter=TESTPOINT_DEFAULTS.HOLE_DIAMETER)),{padShape,holeDiameter,footprintVariant,padDiameter,width,height}}_getImpliedFootprintString(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults();if(footprintVariant==="through_hole")return`platedhole_d${holeDiameter}`;if(footprintVariant==="pad"){if(padShape==="circle")return`smtpad_circle_d${padDiameter}`;if(padShape==="rect")return`smtpad_rect_w${width}_h${height}`}throw new Error(`Footprint variant "${footprintVariant}" with pad shape "${padShape}" not implemented`)}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults(),source_component=db2.source_component.insert({ftype:FTYPE.simple_test_point,name:this.name,supplier_part_numbers:props.supplierPartNumbers,footprint_variant:footprintVariant,pad_shape:padShape,pad_diameter:padDiameter,hole_diameter:holeDiameter,width,height,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},SchematicText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_text_id")}get config(){return{componentName:"SchematicText",zodProps:schematicTextProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,text=this._resolveText(),schematic_text3=db2.schematic_text.insert({schematic_symbol_id,anchor:props.anchor??"center",text:normalizeTextForCircuitJson(text),font_size:props.fontSize,color:props.color||"#000000",position:{x:globalPos.x,y:globalPos.y},rotation:props.schRotation??0});this.schematic_text_id=schematic_text3.schematic_text_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_text_id)return;let transform6=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform6)return;let{db:db2}=this.root,text=db2.schematic_text.get(this.schematic_text_id);if(!text)return;let newPosition=applyToPoint2(transform6,text.position);db2.schematic_text.update(this.schematic_text_id,{position:{x:newPosition.x,y:newPosition.y}})}},SchematicLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_line_id")}get config(){return{componentName:"SchematicLine",zodProps:schematicLineProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_line3=db2.schematic_line.insert({schematic_component_id,schematic_symbol_id,x1:props.x1+globalPos.x,y1:props.y1+globalPos.y,x2:props.x2+globalPos.x,y2:props.y2+globalPos.y,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_line_id=schematic_line3.schematic_line_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_line_id)return;let transform6=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform6)return;let{db:db2}=this.root,line2=db2.schematic_line.get(this.schematic_line_id);if(!line2)return;let p12=applyToPoint2(transform6,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform6,{x:line2.x2,y:line2.y2});db2.schematic_line.update(this.schematic_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}},SchematicRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_rect_id")}get config(){return{componentName:"SchematicRect",zodProps:schematicRectProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_rect3=db2.schematic_rect.insert({schematic_symbol_id,center:{x:globalPos.x,y:globalPos.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,schematic_component_id,is_dashed:props.isDashed,rotation:props.rotation??0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_rect_id=schematic_rect3.schematic_rect_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_rect_id)return;let transform6=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform6)return;let{db:db2}=this.root,rect=db2.schematic_rect.get(this.schematic_rect_id);if(!rect)return;let topLeft=applyToPoint2(transform6,{x:rect.center.x-rect.width/2,y:rect.center.y+rect.height/2}),bottomRight=applyToPoint2(transform6,{x:rect.center.x+rect.width/2,y:rect.center.y-rect.height/2}),newWidth=Math.abs(bottomRight.x-topLeft.x),newHeight=Math.abs(topLeft.y-bottomRight.y),newCenter={x:(topLeft.x+bottomRight.x)/2,y:(topLeft.y+bottomRight.y)/2};db2.schematic_rect.update(this.schematic_rect_id,{center:newCenter,width:newWidth,height:newHeight})}},SchematicArc=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_arc_id")}get config(){return{componentName:"SchematicArc",zodProps:schematicArcProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_arc3=db2.schematic_arc.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,start_angle_degrees:props.startAngleDegrees,end_angle_degrees:props.endAngleDegrees,direction:props.direction,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_arc_id=schematic_arc3.schematic_arc_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_arc_id)return;let transform6=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform6)return;let{db:db2}=this.root,arc2=db2.schematic_arc.get(this.schematic_arc_id);if(!arc2)return;let newCenter=applyToPoint2(transform6,arc2.center),edgePoint=applyToPoint2(transform6,{x:arc2.center.x+arc2.radius,y:arc2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db2.schematic_arc.update(this.schematic_arc_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}},SchematicCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_circle_id")}get config(){return{componentName:"SchematicCircle",zodProps:schematicCircleProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_circle3=db2.schematic_circle.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,fill_color:props.fillColor,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_circle_id=schematic_circle3.schematic_circle_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_circle_id)return;let transform6=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform6)return;let{db:db2}=this.root,circle2=db2.schematic_circle.get(this.schematic_circle_id);if(!circle2)return;let newCenter=applyToPoint2(transform6,circle2.center),edgePoint=applyToPoint2(transform6,{x:circle2.center.x+circle2.radius,y:circle2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db2.schematic_circle.update(this.schematic_circle_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}};function sampleCurveSegment(segmentPath,samplesPerUnit){let commander=new src_default(segmentPath),length7=commander.getTotalLength(),numSamples=Math.max(2,Math.ceil(length7*samplesPerUnit)),points=[];for(let i3=1;i3<=numSamples;i3++){let t52=i3/numSamples*length7,point62=commander.getPointAtLength(t52);points.push({x:point62.x,y:point62.y})}return points}function svgPathToPoints(svgPath,samplesPerUnit=10){let pathCommander=new src_default(svgPath);pathCommander.toAbsolute();let segments=pathCommander.segments,result=[],currentPoints=[],currentX=0,currentY=0,subpathStartX=0,subpathStartY=0;for(let segment2 of segments)switch(segment2[0]){case"M":{currentPoints.length>0&&result.push(currentPoints),currentX=segment2[1],currentY=segment2[2],subpathStartX=currentX,subpathStartY=currentY,currentPoints=[{x:currentX,y:currentY}];break}case"L":{currentX=segment2[1],currentY=segment2[2],currentPoints.push({x:currentX,y:currentY});break}case"H":{currentX=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"V":{currentY=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"Z":{(currentX!==subpathStartX||currentY!==subpathStartY)&¤tPoints.push({x:subpathStartX,y:subpathStartY}),currentX=subpathStartX,currentY=subpathStartY;break}case"C":{let endX=segment2[5],endY=segment2[6],segmentPath=`M ${currentX} ${currentY} C ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"S":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} S ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"Q":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} Q ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"T":{let endX=segment2[1],endY=segment2[2],segmentPath=`M ${currentX} ${currentY} T ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"A":{let endX=segment2[6],endY=segment2[7],segmentPath=`M ${currentX} ${currentY} A ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${segment2[5]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}}return currentPoints.length>0&&result.push(currentPoints),result.map(points=>{let deduped=[];for(let point62 of points)(deduped.length===0||Math.abs(deduped[deduped.length-1].x-point62.x)>1e-9||Math.abs(deduped[deduped.length-1].y-point62.y)>1e-9)&&deduped.push(point62);return deduped})}var SchematicPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_path_ids",[])}get config(){return{componentName:"SchematicPath",zodProps:schematicPathProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,subcircuit_id=this.getSubcircuit().subcircuit_id??void 0;if(this.schematic_path_ids=[],props.svgPath){let subpaths=svgPathToPoints(props.svgPath);for(let subpathPoints of subpaths){let schematic_path3=db2.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:subpathPoints.map(point62=>({x:point62.x+globalPos.x,y:point62.y+globalPos.y})),is_filled:props.isFilled,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,subcircuit_id});this.schematic_path_ids.push(schematic_path3.schematic_path_id)}}else if(props.points&&props.points.length>0){let schematic_path3=db2.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:props.points.map(point62=>({x:point62.x+globalPos.x,y:point62.y+globalPos.y})),is_filled:props.isFilled,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,subcircuit_id});this.schematic_path_ids.push(schematic_path3.schematic_path_id)}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||this.schematic_path_ids.length===0)return;let transform6=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform6)return;let{db:db2}=this.root;for(let pathId of this.schematic_path_ids){let path=db2.schematic_path.get(pathId);if(!path)continue;let newPoints=path.points.map(point62=>{let transformed=applyToPoint2(transform6,point62);return{x:transformed.x,y:transformed.y}});db2.schematic_path.update(pathId,{points:newPoints})}}};function getTitleAnchorAndPosition({anchor,x:x4,y:y4,width,height,isInside}){switch(anchor){case"top_left":return{x:x4,y:y4+height,textAnchor:isInside?"top_left":"bottom_left"};case"top_center":return{x:x4+width/2,y:y4+height,textAnchor:isInside?"top_center":"bottom_center"};case"top_right":return{x:x4+width,y:y4+height,textAnchor:isInside?"top_right":"bottom_right"};case"center_left":return{x:x4,y:y4+height/2,textAnchor:isInside?"center_left":"center_right"};case"center":return{x:x4+width/2,y:y4+height/2,textAnchor:"center"};case"center_right":return{x:x4+width,y:y4+height/2,textAnchor:isInside?"center_right":"center_left"};case"bottom_left":return{x:x4,y:y4,textAnchor:isInside?"bottom_left":"top_left"};case"bottom_center":return{x:x4+width/2,y:y4,textAnchor:isInside?"bottom_center":"top_center"};case"bottom_right":return{x:x4+width,y:y4,textAnchor:isInside?"bottom_right":"top_right"};default:return{x:x4+width/2,y:y4+height,textAnchor:"center"}}}var SchematicBox=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:schematicBoxProps,shouldRenderAsSchematicBox:!0}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,basePadding=.6,generalPadding=typeof props.padding=="number"?props.padding:0,paddingTop=typeof props.paddingTop=="number"?props.paddingTop:generalPadding,paddingBottom=typeof props.paddingBottom=="number"?props.paddingBottom:generalPadding,paddingLeft=typeof props.paddingLeft=="number"?props.paddingLeft:generalPadding,paddingRight=typeof props.paddingRight=="number"?props.paddingRight:generalPadding,hasOverlay=props.overlay&&props.overlay.length>0,hasFixedSize=typeof props.width=="number"&&typeof props.height=="number",width,height,x4,y4,centerX,centerY;if(hasOverlay){let portsWithPosition=props.overlay.map(selector=>({selector,port:this.getSubcircuit().selectOne(selector,{type:"port"})})).filter(({port})=>port!=null).map(({port})=>({position:port._getGlobalSchematicPositionAfterLayout()}));if(portsWithPosition.length===0)return;let xs3=portsWithPosition.map(p4=>p4.position.x),ys3=portsWithPosition.map(p4=>p4.position.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),rawWidth=maxX-minX,rawHeight=maxY-minY,defaultHorizontalPadding=rawWidth===0?basePadding:0,defaultVerticalPadding=rawHeight===0?basePadding:0,finalPaddingLeft=paddingLeft+defaultHorizontalPadding/2,finalPaddingRight=paddingRight+defaultHorizontalPadding/2,finalPaddingTop=paddingTop+defaultVerticalPadding/2,finalPaddingBottom=paddingBottom+defaultVerticalPadding/2,left=minX-finalPaddingLeft,right=maxX+finalPaddingRight,top=minY-finalPaddingBottom,bottom=maxY+finalPaddingTop;width=right-left,height=bottom-top,x4=left+(props.schX??0),y4=top+(props.schY??0),centerX=x4+width/2,centerY=y4+height/2}else if(hasFixedSize){width=props.width,height=props.height;let center2=this._getGlobalSchematicPositionBeforeLayout();centerX=center2.x,centerY=center2.y,x4=centerX-width/2,y4=centerY-height/2}else return;if(db2.schematic_box.insert({height,width,x:x4,y:y4,is_dashed:props.strokeStyle==="dashed"}),props.title){let isInside=props.titleInside,TITLE_PADDING=.1,anchor=props.titleAlignment,anchorPos=getTitleAnchorAndPosition({anchor,x:x4,y:y4,width,height,isInside}),titleOffsetY,titleOffsetX,textAnchor=anchorPos.textAnchor;isInside?(titleOffsetY=anchor.includes("top")?-TITLE_PADDING:anchor.includes("bottom")?TITLE_PADDING:0,titleOffsetX=anchor.includes("left")?TITLE_PADDING:anchor.includes("right")?-TITLE_PADDING:0):(titleOffsetY=anchor.includes("top")?TITLE_PADDING:anchor.includes("bottom")?-TITLE_PADDING:0,titleOffsetX=anchor.includes("center_left")?-TITLE_PADDING:anchor.includes("center_right")?TITLE_PADDING:0);let titleX=anchorPos.x+titleOffsetX,titleY=anchorPos.y+titleOffsetY;db2.schematic_text.insert({anchor:textAnchor,text:props.title,font_size:props.titleFontSize??.18,color:props.titleColor??"#000000",position:{x:titleX,y:titleY},rotation:0})}}},SchematicSection=class _SchematicSection extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicSection",zodProps:schematicSectionProps}}_computeSectionBounds(board){let{db:db2}=this.root,{name}=this._parsedProps,members=board.getDescendants().filter(c4=>c4.props?.schSectionName===name);if(members.length===0)return null;let positions=[];for(let member of members){let schematicComponentId=member.schematic_component_id;if(!schematicComponentId)continue;let schComp=db2.schematic_component.get(schematicComponentId);if(!schComp)continue;let hw3=schComp.size.width/2,hh3=schComp.size.height/2;positions.push({minX:schComp.center.x-hw3,maxX:schComp.center.x+hw3,minY:schComp.center.y-hh3,maxY:schComp.center.y+hh3})}return positions.length===0?null:computeBoundsFromCellContents(positions)}doInitialSchematicSectionRender(){if(this.root?.schematicDisabled)return;let board=this.root?._getBoard();if(!board)return;let allSections=board.getDescendants().filter(c4=>c4 instanceof _SchematicSection);if(allSections[0]!==this)return;let{db:db2}=this.root,PADDING=.5,LABEL_PADDING=.2,STROKE_WIDTH=.02,TOL3=.001,sectionData=allSections.map(section=>{let bounds=section._computeSectionBounds(board);return bounds?{section,rawBounds:bounds,cell:{minX:bounds.minX-PADDING,maxX:bounds.maxX+PADDING,minY:bounds.minY-PADDING,maxY:bounds.maxY+PADDING}}:null}).filter(s3=>s3!==null);if(sectionData.length===0)return;let allCells=sectionData.map(s3=>s3.cell),outer=computeBoundsFromCellContents(allCells),dividers=calculateCellBoundaries(sectionData.map(s3=>s3.rawBounds));for(let line2 of dividers)db2.schematic_line.insert({x1:line2.start.x,y1:line2.start.y,x2:line2.end.x,y2:line2.end.y,stroke_width:STROKE_WIDTH,color:"#000000",is_dashed:!1});let hDividers=dividers.filter(l4=>Math.abs(l4.start.y-l4.end.y)<TOL3),vDividers=dividers.filter(l4=>Math.abs(l4.start.x-l4.end.x)<TOL3);for(let{section,cell,rawBounds}of sectionData){let{displayName}=section._parsedProps;if(!displayName)continue;let dividersAbove=hDividers.map(l4=>l4.start.y).filter(y4=>y4>cell.minY),topBoundary=dividersAbove.length>0?Math.min(...dividersAbove):outer.maxY,dividersToLeft=vDividers.map(l4=>l4.start.x).filter(x4=>x4<rawBounds.minX),leftBoundary=dividersToLeft.length>0?Math.max(...dividersToLeft):outer.minX;db2.schematic_text.insert({anchor:"top_left",text:displayName,font_size:.18,color:"#000000",position:{x:leftBoundary+LABEL_PADDING,y:topBoundary-LABEL_PADDING},rotation:0})}}},SchematicTable=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_table_id",null)}get config(){return{componentName:"SchematicTable",zodProps:schematicTableProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,rows=this.children.filter(c4=>c4.componentName==="SchematicRow");if(rows.length===0)return;let grid4=[],maxCols=0;for(let row of rows){let cells=row.children.filter(c4=>c4.componentName==="SchematicCell");maxCols=Math.max(maxCols,cells.length)}for(let i3=0;i3<rows.length;i3++)grid4[i3]=[];for(let i3=0;i3<rows.length;i3++){let cells=rows[i3].children.filter(c4=>c4.componentName==="SchematicCell"),k4=0;for(let j4=0;j4<cells.length;j4++){for(;grid4[i3][k4];)k4++;let cell=cells[j4],colSpan=cell._parsedProps.colSpan??1,rowSpan=cell._parsedProps.rowSpan??1;for(let r5=0;r5<rowSpan;r5++)for(let c4=0;c4<colSpan;c4++)grid4[i3+r5]||(grid4[i3+r5]=[]),grid4[i3+r5][k4+c4]=cell;k4+=colSpan}}maxCols=Math.max(0,...grid4.map(r5=>r5.length));let rowHeights=rows.map((row,i3)=>row._parsedProps.height??1),colWidths=Array.from({length:maxCols},(_4,j4)=>{let maxWidth=0;for(let i3=0;i3<rows.length;i3++){let cell=grid4[i3]?.[j4];if(cell){let text=cell._parsedProps.text??cell._parsedProps.children,cellWidth=cell._parsedProps.width??(text?.length??2)*.5;cellWidth>maxWidth&&(maxWidth=cellWidth)}}return maxWidth||10}),anchorPos=this._getGlobalSchematicPositionBeforeLayout(),table=db2.schematic_table.insert({anchor_position:anchorPos,column_widths:colWidths,row_heights:rowHeights,cell_padding:props.cellPadding,border_width:props.borderWidth,anchor:props.anchor,subcircuit_id:this.getSubcircuit()?.subcircuit_id||"",schematic_component_id:this.parent?.schematic_component_id||""});this.schematic_table_id=table.schematic_table_id;let processedCells=new Set,yOffset=0;for(let i3=0;i3<rows.length;i3++){let xOffset=0;for(let j4=0;j4<maxCols;j4++){let cell=grid4[i3]?.[j4];if(cell&&!processedCells.has(cell)){processedCells.add(cell);let cellProps=cell._parsedProps,rowSpan=cellProps.rowSpan??1,colSpan=cellProps.colSpan??1,cellWidth=0;for(let c4=0;c4<colSpan;c4++)cellWidth+=colWidths[j4+c4];let cellHeight=0;for(let r5=0;r5<rowSpan;r5++)cellHeight+=rowHeights[i3+r5];db2.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:i3,end_row_index:i3+rowSpan-1,start_column_index:j4,end_column_index:j4+colSpan-1,text:cellProps.text??cellProps.children,center:{x:anchorPos.x+xOffset+cellWidth/2,y:anchorPos.y-yOffset-cellHeight/2},width:cellWidth,height:cellHeight,horizontal_align:cellProps.horizontalAlign,vertical_align:cellProps.verticalAlign,font_size:cellProps.fontSize??props.fontSize,subcircuit_id:this.getSubcircuit()?.subcircuit_id||""})}colWidths[j4]&&(xOffset+=colWidths[j4])}yOffset+=rowHeights[i3]}}},SchematicRow=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicRow",zodProps:schematicRowProps}}},SchematicCell=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"canHaveTextChildren",!0)}get config(){return{componentName:"SchematicCell",zodProps:schematicCellProps}}},SymbolComponent=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"schematic_symbol_id");__publicField(this,"userCoordinateToResizedSymbolTransformMat");__publicField(this,"schematicSymbolBoundsInUserCoordinates")}get config(){return{componentName:"Symbol",zodProps:symbolProps}}hasExplicitSize(){let{_parsedProps:props}=this;return props.width!==void 0||props.height!==void 0}doInitialSymbolContainerRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,kicadSymbolMetadata4=this.getParentNormalComponent()?._parsedProps?.kicadSymbolMetadata,schematic_symbol3=db2.schematic_symbol.insert({name:props.name,metadata:kicadSymbolMetadata4?{kicad_symbol:kicadSymbolMetadata4}:void 0});this.schematic_symbol_id=schematic_symbol3.schematic_symbol_id}getSchematicSymbolBounds(){return this.schematicSymbolBoundsInUserCoordinates?this.schematicSymbolBoundsInUserCoordinates:(this._computeSchematicSymbolBounds(),this.schematicSymbolBoundsInUserCoordinates??null)}getUserCoordinateToResizedSymbolTransform(){return this.hasExplicitSize()?this.userCoordinateToResizedSymbolTransformMat?this.userCoordinateToResizedSymbolTransformMat:(this._computeUserCoordinateToResizedSymbolTransform(),this.userCoordinateToResizedSymbolTransformMat??null):null}_computeSchematicSymbolBounds(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,schematicElements=[];for(let child of this.children){if(child.componentName==="Port"){let portId=child.schematic_port_id;if(portId){let port=db2.schematic_port.get(portId);port&&schematicElements.push(port)}continue}if(child.isSchematicPrimitive){if(child.componentName==="SchematicLine"){let line2=db2.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}else if(child.componentName==="SchematicRect"){let rect=db2.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}else if(child.componentName==="SchematicCircle"){let circle2=db2.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}else if(child.componentName==="SchematicArc"){let arc2=db2.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}else if(child.componentName==="SchematicText"){let text=db2.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}else if(child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db2.schematic_path.get(pathId);path&&schematicElements.push(path)}}}}if(schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements);this.schematicSymbolBoundsInUserCoordinates=bounds}_computeUserCoordinateToResizedSymbolTransform(){let bounds=this.getSchematicSymbolBounds();if(!bounds)return;let{_parsedProps:props}=this,targetWidth=props.width,targetHeight=props.height;if(targetWidth===void 0&&targetHeight===void 0)return;let currentWidth=bounds.maxX-bounds.minX,currentHeight=bounds.maxY-bounds.minY;if(currentWidth===0&¤tHeight===0)return;let currentCenterX=(bounds.minX+bounds.maxX)/2,currentCenterY=(bounds.minY+bounds.maxY)/2,scaleX=targetWidth!==void 0&¤tWidth>0?targetWidth/currentWidth:1,scaleY=targetHeight!==void 0&¤tHeight>0?targetHeight/currentHeight:1,globalPos=this._getGlobalSchematicPositionBeforeLayout();this.userCoordinateToResizedSymbolTransformMat=compose2(translate2(globalPos.x,globalPos.y),scale2(scaleX,scaleY),translate2(-currentCenterX,-currentCenterY))}},AnalogSimulation=class extends PrimitiveComponent2{get config(){return{componentName:"AnalogSimulation",zodProps:analogSimulationProps}}doInitialSimulationRender(){let{db:db2}=this.root,{duration,timePerStep}=this._parsedProps,durationMs=duration||10,timePerStepMs=timePerStep||.01;db2.simulation_experiment.insert({name:"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:durationMs,time_per_step:timePerStepMs})}};function getLabelBounds2(probePosition,labelText,alignment,labelOffset=.3){let labelWidth=Math.max(labelText.length*.1,.3),labelHeightWithPadding=.25+.2,anchorX=probePosition.x,anchorY=probePosition.y,offsetMultiplier=labelOffset+labelWidth/2;alignment.includes("top")?anchorY+=offsetMultiplier:alignment.includes("bottom")&&(anchorY-=offsetMultiplier),alignment.includes("right")?anchorX+=offsetMultiplier:alignment.includes("left")&&(anchorX-=offsetMultiplier);let minX,maxX,minY,maxY;return alignment.includes("left")?(minX=anchorX,maxX=anchorX+labelWidth):alignment.includes("right")?(minX=anchorX-labelWidth,maxX=anchorX):(minX=anchorX-labelWidth/2,maxX=anchorX+labelWidth/2),alignment.includes("top")?(minY=anchorY-labelHeightWithPadding,maxY=anchorY):alignment.includes("bottom")?(minY=anchorY,maxY=anchorY+labelHeightWithPadding):(minY=anchorY-labelHeightWithPadding/2,maxY=anchorY+labelHeightWithPadding/2),{minX,maxX,minY,maxY}}function getElementBounds(elm){let cx3,cy3,w4,h6;if(elm.type==="schematic_component")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.size?.width,h6=elm.size?.height;else if(elm.type==="schematic_text")cx3=elm.position?.x,cy3=elm.position?.y,w4=(elm.text?.length??0)*.1,h6=.2;else return null;return typeof cx3=="number"&&typeof cy3=="number"&&typeof w4=="number"&&typeof h6=="number"?{minX:cx3-w4/2,maxX:cx3+w4/2,minY:cy3-h6/2,maxY:cy3+h6/2}:null}function getOverlapArea(a3,b3){if(!doBoundsOverlap(a3,b3))return 0;let overlapWidth=Math.min(a3.maxX,b3.maxX)-Math.max(a3.minX,b3.minX),overlapHeight=Math.min(a3.maxY,b3.maxY)-Math.max(a3.minY,b3.minY);return overlapWidth*overlapHeight}function selectBestLabelAlignment({probePosition,labelText,schematicElements,defaultAlignment="top_right"}){let orderedAlignments=[defaultAlignment,...["top_right","top_left","bottom_right","bottom_left","top_center","bottom_center","center_right","center_left"].filter(a3=>a3!==defaultAlignment)],bestAlignment=defaultAlignment,minOverlapArea=1/0;for(let alignment of orderedAlignments){let labelBounds=getLabelBounds2(probePosition,labelText,alignment),totalOverlapArea=0;for(let element of schematicElements){let elementBounds=getElementBounds(element);elementBounds&&(totalOverlapArea+=getOverlapArea(labelBounds,elementBounds))}if(totalOverlapArea===0)return alignment;totalOverlapArea<minOverlapArea&&(minOverlapArea=totalOverlapArea,bestAlignment=alignment)}return bestAlignment}var VoltageProbe=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_voltage_probe_id",null);__publicField(this,"schematic_voltage_probe_id",null);__publicField(this,"finalProbeName",null);__publicField(this,"color",null)}get config(){return{componentName:"VoltageProbe",zodProps:voltageProbeProps}}doInitialSimulationRender(){let{db:db2}=this.root,{connectsTo,name,referenceTo,color}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit){this.renderError("VoltageProbe must be inside a subcircuit");return}let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1){this.renderError("VoltageProbe must connect to exactly one port or net");return}let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"}),net=port?null:subcircuit.selectOne(targetSelector,{type:"net"});if(net&&net.componentName!=="Net"){this.renderError(`VoltageProbe connection target "${targetSelector}" resolved to a non-net component "${net.componentName}".`);return}if(!port&&!net){this.renderError(`VoltageProbe could not find connection target "${targetSelector}"`);return}let connectedId=port?.source_port_id??net?.source_net_id;if(!connectedId){this.renderError("Could not identify connected source for VoltageProbe");return}let referencePort=null,referenceNet=null;if(referenceTo){let referenceTargets=Array.isArray(referenceTo)?referenceTo:[referenceTo];if(referenceTargets.length!==1){this.renderError("VoltageProbe must reference exactly one port or net");return}let referenceSelector=referenceTargets[0];if(referencePort=subcircuit.selectOne(referenceSelector,{type:"port"}),referenceNet=referencePort?null:subcircuit.selectOne(referenceSelector,{type:"net"}),referenceNet&&referenceNet.componentName!=="Net"){this.renderError(`VoltageProbe reference target "${referenceSelector}" resolved to a non-net component "${referenceNet.componentName}".`);return}if(!referencePort&&!referenceNet){this.renderError(`VoltageProbe could not find reference target "${referenceSelector}"`);return}}this.color=color??getSimulationColorForId(connectedId);let finalName=name;finalName||(finalName=targets[0].split(" > ").map(s3=>s3.replace(/^\./,"")).join(".")),this.finalProbeName=finalName??null;let{simulation_voltage_probe_id}=db2.simulation_voltage_probe.insert({name:finalName,signal_input_source_port_id:port?.source_port_id??void 0,signal_input_source_net_id:net?.source_net_id??void 0,reference_input_source_port_id:referencePort?.source_port_id??void 0,reference_input_source_net_id:referenceNet?.source_net_id??void 0,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color});this.simulation_voltage_probe_id=simulation_voltage_probe_id}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{connectsTo,name}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit)return;let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1)return;let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"});if(!port||!port.schematic_port_id)return;let position4=port._getGlobalSchematicPositionAfterLayout(),targetTraceId=null;for(let trace of db2.schematic_trace.list()){for(let edge of trace.edges)if(Math.abs(edge.from.x-position4.x)<1e-6&&Math.abs(edge.from.y-position4.y)<1e-6||Math.abs(edge.to.x-position4.x)<1e-6&&Math.abs(edge.to.y-position4.y)<1e-6){targetTraceId=trace.schematic_trace_id;break}if(targetTraceId)break}if(!targetTraceId)return;let probeName=this.finalProbeName,labelAlignment=selectBestLabelAlignment({probePosition:position4,labelText:probeName,schematicElements:[...db2.schematic_component.list(),...db2.schematic_text.list()],defaultAlignment:"top_right"}),schematic_voltage_probe3=db2.schematic_voltage_probe.insert({name:probeName,position:position4,schematic_trace_id:targetTraceId,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color??void 0,label_alignment:labelAlignment});this.schematic_voltage_probe_id=schematic_voltage_probe3.schematic_voltage_probe_id}},RootCircuit=class extends IsolatedCircuit{constructor({platform,projectUrl}={}){super({platform,projectUrl,cachedSubcircuits:new Map,pendingSubcircuitRenders:new Map});__publicField(this,"isRootCircuit",!0);this.root=this}},Project=RootCircuit,Circuit=RootCircuit,useRenderedCircuit=reactElements=>{let[isLoading,setIsLoading]=import_react5.default.useState(!0),[error2,setError]=import_react5.default.useState(null),[circuit,setCircuit]=import_react5.default.useState(),[circuitJson,setCircuitJson]=import_react5.default.useState();return import_react5.default.useEffect(()=>{setIsLoading(!0),setError(null),reactElements&&setTimeout(()=>{try{let circuit2=new RootCircuit;circuit2.add(reactElements),setCircuit(circuit2),setCircuitJson(circuit2.toJson())}catch(error22){setError(error22)}setIsLoading(!1)},1)},[reactElements]),{isLoading,error:error2,circuit,circuitJson}},createUseComponent=(Component2,pins)=>(name,props)=>{let pinLabelsFlatArray=[];Array.isArray(pins)?pinLabelsFlatArray.push(...pins.flat()):typeof pins=="object"&&pinLabelsFlatArray.push(...Object.values(pins).flat(),...Object.keys(pins));let R3=props2=>{if(props2?.name&&props2.name!==name)throw new Error(`Component name mismatch. Hook name: ${name}, Component prop name: ${props2.name}`);let combinedProps={...props,...props2,name},tracesToCreate=[];for(let portLabel of pinLabelsFlatArray)if(combinedProps[portLabel]){let from=`.${name} > .${portLabel}`,to3=combinedProps[portLabel];tracesToCreate.push({from,to:to3}),delete combinedProps[portLabel]}return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Component2,{...combinedProps}),tracesToCreate.map((trace,i3)=>(0,import_jsx_runtime.jsx)("trace",{...trace},i3))]})};for(let port of pinLabelsFlatArray)R3[port]=`.${name} > .${port}`;return R3},useCapacitor=createUseComponent(props=>(0,import_jsx_runtime2.jsx)("capacitor",{...props}),capacitorPins),useChip=pinLabels=>createUseComponent(props=>(0,import_jsx_runtime3.jsx)("chip",{pinLabels,...props}),pinLabels),useDiode=createUseComponent(props=>(0,import_jsx_runtime4.jsx)("diode",{...props}),diodePins),useLed=createUseComponent(props=>(0,import_jsx_runtime5.jsx)("led",{...props}),ledPins),useResistor=createUseComponent(props=>(0,import_jsx_runtime6.jsx)("resistor",{...props}),resistorPins),sel=new Proxy(refdes=>new Proxy({},{get:(_4,pin)=>`.${refdes} > .${pin}`}),{get:(_4,prop1)=>{let fn3=(...args)=>{let chipFnOrPinType=args[0];return new Proxy({},{get:(_22,pinName)=>`.${prop1} > .${pinName}`})};return new Proxy(fn3,{get:(_22,prop2)=>prop1==="net"?`net.${prop2}`:prop1==="subcircuit"?new Proxy({},{get:(_32,prop3)=>new Proxy({},{get:(_42,prop4)=>`subcircuit.${prop2} > .${prop3} > .${prop4}`})}):`.${prop1} > .${prop2}`,apply:(target,_22,args)=>prop1==="net"?new Proxy({},{get:(_32,netName)=>`net.${netName}`}):new Proxy({},{get:(_32,pinOrSubComponentName)=>{let pinResult=`.${prop1} > .${pinOrSubComponentName}`;return["U","J","CN"].some(p4=>prop1.startsWith(p4))?pinResult:new Proxy(new String(pinResult),{get:(_42,nestedProp)=>typeof nestedProp=="symbol"||nestedProp==="toString"?()=>pinResult:`.${prop1} > .${pinOrSubComponentName} > .${nestedProp}`})}})})}});extendCatalogue(components_exports);extendCatalogue({Bug:Chip});var React3=__toESM(require_react(),1),ReactJsxRuntime=__toESM(require_jsx_runtime(),1);var dist_exports5={};__export(dist_exports5,{default:()=>mm_default2,mil2mm:()=>mil2mm,mm:()=>mm4,mmStr:()=>mmStr});var unitToMm2={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mmNumberFormatter=new Intl.NumberFormat("en-US",{useGrouping:!1,notation:"standard",maximumFractionDigits:12}),mm4=n4=>{let unit=typeof n4=="number"?"mm":n4.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n4=="number"?n4:Number.parseFloat(n4.split(unit)[0]);if(unit in unitToMm2)return val*unitToMm2[unit];throw new Error(`Unsupported unit: ${unit}`)},mmStr=n4=>`${mmNumberFormatter.format(mm4(n4))}mm`,mil2mm=mil=>typeof mil=="number"?mm4(`${mil}mil`):mil.match(/^\d+$/)?mm4(`${mil}mil`):mm4(mil),mm_default2=mm4;var __defProp6=Object.defineProperty,__export4=(target,all)=>{for(var name in all)__defProp6(target,name,{get:all[name],enumerable:!0})},dist_exports6={};__export4(dist_exports6,{all_layers:()=>all_layers2,any_circuit_element:()=>any_circuit_element2,any_soup_element:()=>any_soup_element2,any_source_component:()=>any_source_component2,asset:()=>asset2,base_circuit_json_error:()=>base_circuit_json_error2,battery_capacity:()=>battery_capacity2,brep_shape:()=>brep_shape2,cadModelDefaultDirectionMap:()=>cadModelDefaultDirectionMap2,cad_component:()=>cad_component2,cad_model_axis_directions:()=>cad_model_axis_directions2,cad_model_formats:()=>cad_model_formats2,capacitance:()=>capacitance2,circuit_json_footprint_load_error:()=>circuit_json_footprint_load_error2,current:()=>current2,distance:()=>distance7,duration_ms:()=>duration_ms2,experiment_type:()=>experiment_type2,external_footprint_load_error:()=>external_footprint_load_error2,frequency:()=>frequency2,getZodPrefixedIdWithDefault:()=>getZodPrefixedIdWithDefault2,inductance:()=>inductance2,kicadAt:()=>kicadAt3,kicadEffects:()=>kicadEffects3,kicadFont:()=>kicadFont3,kicadFootprintAttributes:()=>kicadFootprintAttributes3,kicadFootprintMetadata:()=>kicadFootprintMetadata3,kicadFootprintModel:()=>kicadFootprintModel3,kicadFootprintPad:()=>kicadFootprintPad3,kicadFootprintProperties:()=>kicadFootprintProperties3,kicadProperty:()=>kicadProperty3,kicadSymbolEffects:()=>kicadSymbolEffects3,kicadSymbolMetadata:()=>kicadSymbolMetadata3,kicadSymbolPinNames:()=>kicadSymbolPinNames3,kicadSymbolPinNumbers:()=>kicadSymbolPinNumbers3,kicadSymbolProperties:()=>kicadSymbolProperties3,kicadSymbolProperty:()=>kicadSymbolProperty3,layer_ref:()=>layer_ref2,layer_string:()=>layer_string2,length:()=>length3,ms:()=>ms4,ninePointAnchor:()=>ninePointAnchor3,pcbRenderLayer:()=>pcbRenderLayer2,pcb_autorouting_error:()=>pcb_autorouting_error2,pcb_board:()=>pcb_board2,pcb_breakout_point:()=>pcb_breakout_point2,pcb_component:()=>pcb_component2,pcb_component_invalid_layer_error:()=>pcb_component_invalid_layer_error2,pcb_component_not_on_board_edge_error:()=>pcb_component_not_on_board_edge_error2,pcb_component_outside_board_error:()=>pcb_component_outside_board_error2,pcb_connector_not_in_accessible_orientation_warning:()=>pcb_connector_not_in_accessible_orientation_warning2,pcb_copper_pour:()=>pcb_copper_pour2,pcb_copper_pour_brep:()=>pcb_copper_pour_brep2,pcb_copper_pour_polygon:()=>pcb_copper_pour_polygon2,pcb_copper_pour_rect:()=>pcb_copper_pour_rect2,pcb_copper_text:()=>pcb_copper_text2,pcb_courtyard_circle:()=>pcb_courtyard_circle2,pcb_courtyard_outline:()=>pcb_courtyard_outline2,pcb_courtyard_overlap_error:()=>pcb_courtyard_overlap_error2,pcb_courtyard_polygon:()=>pcb_courtyard_polygon2,pcb_courtyard_rect:()=>pcb_courtyard_rect2,pcb_cutout:()=>pcb_cutout2,pcb_cutout_circle:()=>pcb_cutout_circle2,pcb_cutout_path:()=>pcb_cutout_path2,pcb_cutout_polygon:()=>pcb_cutout_polygon2,pcb_cutout_rect:()=>pcb_cutout_rect2,pcb_fabrication_note_dimension:()=>pcb_fabrication_note_dimension2,pcb_fabrication_note_path:()=>pcb_fabrication_note_path2,pcb_fabrication_note_rect:()=>pcb_fabrication_note_rect2,pcb_fabrication_note_text:()=>pcb_fabrication_note_text2,pcb_footprint_overlap_error:()=>pcb_footprint_overlap_error2,pcb_ground_plane:()=>pcb_ground_plane2,pcb_ground_plane_region:()=>pcb_ground_plane_region2,pcb_group:()=>pcb_group2,pcb_hole:()=>pcb_hole2,pcb_hole_circle_or_square_shape:()=>pcb_hole_circle_or_square_shape2,pcb_hole_circle_shape:()=>pcb_hole_circle_shape2,pcb_hole_oval_shape:()=>pcb_hole_oval_shape2,pcb_hole_pill_shape:()=>pcb_hole_pill_shape2,pcb_hole_rect_shape:()=>pcb_hole_rect_shape2,pcb_hole_rotated_pill_shape:()=>pcb_hole_rotated_pill_shape2,pcb_keepout:()=>pcb_keepout2,pcb_manual_edit_conflict_warning:()=>pcb_manual_edit_conflict_warning2,pcb_missing_footprint_error:()=>pcb_missing_footprint_error2,pcb_net:()=>pcb_net2,pcb_note_dimension:()=>pcb_note_dimension2,pcb_note_line:()=>pcb_note_line2,pcb_note_path:()=>pcb_note_path2,pcb_note_rect:()=>pcb_note_rect2,pcb_note_text:()=>pcb_note_text2,pcb_panel:()=>pcb_panel2,pcb_panelization_placement_error:()=>pcb_panelization_placement_error2,pcb_placement_error:()=>pcb_placement_error2,pcb_plated_hole:()=>pcb_plated_hole2,pcb_port:()=>pcb_port2,pcb_port_not_connected_error:()=>pcb_port_not_connected_error2,pcb_port_not_matched_error:()=>pcb_port_not_matched_error2,pcb_route_hint:()=>pcb_route_hint2,pcb_route_hints:()=>pcb_route_hints2,pcb_silkscreen_circle:()=>pcb_silkscreen_circle2,pcb_silkscreen_line:()=>pcb_silkscreen_line2,pcb_silkscreen_oval:()=>pcb_silkscreen_oval2,pcb_silkscreen_path:()=>pcb_silkscreen_path2,pcb_silkscreen_pill:()=>pcb_silkscreen_pill2,pcb_silkscreen_rect:()=>pcb_silkscreen_rect2,pcb_silkscreen_text:()=>pcb_silkscreen_text2,pcb_smtpad:()=>pcb_smtpad2,pcb_smtpad_pill:()=>pcb_smtpad_pill2,pcb_solder_paste:()=>pcb_solder_paste2,pcb_text:()=>pcb_text2,pcb_thermal_spoke:()=>pcb_thermal_spoke2,pcb_trace:()=>pcb_trace2,pcb_trace_error:()=>pcb_trace_error2,pcb_trace_hint:()=>pcb_trace_hint2,pcb_trace_missing_error:()=>pcb_trace_missing_error2,pcb_trace_route_point:()=>pcb_trace_route_point2,pcb_trace_route_point_via:()=>pcb_trace_route_point_via2,pcb_trace_route_point_wire:()=>pcb_trace_route_point_wire2,pcb_via:()=>pcb_via2,pcb_via_clearance_error:()=>pcb_via_clearance_error2,point:()=>point5,point3:()=>point33,point_with_bulge:()=>point_with_bulge2,port_arrangement:()=>port_arrangement2,position:()=>position2,position3:()=>position32,resistance:()=>resistance2,ring:()=>ring2,rotation:()=>rotation4,route_hint_point:()=>route_hint_point2,schematic_arc:()=>schematic_arc2,schematic_box:()=>schematic_box2,schematic_circle:()=>schematic_circle2,schematic_component:()=>schematic_component2,schematic_component_port_arrangement_by_sides:()=>schematic_component_port_arrangement_by_sides2,schematic_component_port_arrangement_by_size:()=>schematic_component_port_arrangement_by_size2,schematic_debug_line:()=>schematic_debug_line2,schematic_debug_object:()=>schematic_debug_object2,schematic_debug_object_base:()=>schematic_debug_object_base2,schematic_debug_point:()=>schematic_debug_point2,schematic_debug_rect:()=>schematic_debug_rect2,schematic_error:()=>schematic_error2,schematic_group:()=>schematic_group2,schematic_layout_error:()=>schematic_layout_error2,schematic_line:()=>schematic_line2,schematic_manual_edit_conflict_warning:()=>schematic_manual_edit_conflict_warning2,schematic_net_label:()=>schematic_net_label2,schematic_path:()=>schematic_path2,schematic_pin_styles:()=>schematic_pin_styles2,schematic_port:()=>schematic_port2,schematic_rect:()=>schematic_rect2,schematic_sheet:()=>schematic_sheet2,schematic_symbol:()=>schematic_symbol2,schematic_table:()=>schematic_table2,schematic_table_cell:()=>schematic_table_cell2,schematic_text:()=>schematic_text2,schematic_trace:()=>schematic_trace2,schematic_voltage_probe:()=>schematic_voltage_probe2,simulation_ac_current_source:()=>simulation_ac_current_source2,simulation_ac_voltage_source:()=>simulation_ac_voltage_source2,simulation_current_source:()=>simulation_current_source2,simulation_dc_current_source:()=>simulation_dc_current_source2,simulation_dc_voltage_source:()=>simulation_dc_voltage_source2,simulation_experiment:()=>simulation_experiment2,simulation_op_amp:()=>simulation_op_amp2,simulation_switch:()=>simulation_switch2,simulation_transient_voltage_graph:()=>simulation_transient_voltage_graph2,simulation_unknown_experiment_error:()=>simulation_unknown_experiment_error2,simulation_voltage_probe:()=>simulation_voltage_probe2,simulation_voltage_source:()=>simulation_voltage_source2,size:()=>size2,source_ambiguous_port_reference:()=>source_ambiguous_port_reference2,source_board:()=>source_board2,source_component_base:()=>source_component_base2,source_component_internal_connection:()=>source_component_internal_connection2,source_component_pins_underspecified_warning:()=>source_component_pins_underspecified_warning2,source_failed_to_create_component_error:()=>source_failed_to_create_component_error2,source_group:()=>source_group2,source_i2c_misconfigured_error:()=>source_i2c_misconfigured_error2,source_interconnect:()=>source_interconnect2,source_invalid_component_property_error:()=>source_invalid_component_property_error2,source_manually_placed_via:()=>source_manually_placed_via2,source_missing_property_error:()=>source_missing_property_error2,source_net:()=>source_net2,source_no_ground_pin_defined_warning:()=>source_no_ground_pin_defined_warning2,source_no_power_pin_defined_warning:()=>source_no_power_pin_defined_warning2,source_pcb_ground_plane:()=>source_pcb_ground_plane2,source_pin_attributes:()=>source_pin_attributes2,source_pin_missing_trace_warning:()=>source_pin_missing_trace_warning2,source_pin_must_be_connected_error:()=>source_pin_must_be_connected_error2,source_port:()=>source_port2,source_project_metadata:()=>source_project_metadata2,source_property_ignored_warning:()=>source_property_ignored_warning2,source_simple_battery:()=>source_simple_battery2,source_simple_capacitor:()=>source_simple_capacitor2,source_simple_chip:()=>source_simple_chip2,source_simple_connector:()=>source_simple_connector2,source_simple_crystal:()=>source_simple_crystal2,source_simple_current_source:()=>source_simple_current_source2,source_simple_diode:()=>source_simple_diode2,source_simple_fiducial:()=>source_simple_fiducial2,source_simple_ground:()=>source_simple_ground2,source_simple_inductor:()=>source_simple_inductor2,source_simple_led:()=>source_simple_led2,source_simple_mosfet:()=>source_simple_mosfet2,source_simple_op_amp:()=>source_simple_op_amp2,source_simple_pin_header:()=>source_simple_pin_header2,source_simple_pinout:()=>source_simple_pinout2,source_simple_potentiometer:()=>source_simple_potentiometer2,source_simple_power_source:()=>source_simple_power_source2,source_simple_push_button:()=>source_simple_push_button2,source_simple_resistor:()=>source_simple_resistor2,source_simple_resonator:()=>source_simple_resonator2,source_simple_switch:()=>source_simple_switch2,source_simple_test_point:()=>source_simple_test_point2,source_simple_transistor:()=>source_simple_transistor2,source_simple_voltage_probe:()=>source_simple_voltage_probe2,source_simple_voltage_source:()=>source_simple_voltage_source2,source_trace:()=>source_trace2,source_trace_not_connected_error:()=>source_trace_not_connected_error2,supplier_name:()=>supplier_name2,time:()=>time2,timestamp:()=>timestamp2,unknown_error_finding_part:()=>unknown_error_finding_part2,visible_layer:()=>visible_layer2,voltage:()=>voltage2,wave_shape:()=>wave_shape2});var external_exports2={};__export4(external_exports2,{BRAND:()=>BRAND2,DIRTY:()=>DIRTY2,EMPTY_PATH:()=>EMPTY_PATH2,INVALID:()=>INVALID2,NEVER:()=>NEVER2,OK:()=>OK2,ParseStatus:()=>ParseStatus2,Schema:()=>ZodType2,ZodAny:()=>ZodAny2,ZodArray:()=>ZodArray2,ZodBigInt:()=>ZodBigInt2,ZodBoolean:()=>ZodBoolean2,ZodBranded:()=>ZodBranded2,ZodCatch:()=>ZodCatch2,ZodDate:()=>ZodDate2,ZodDefault:()=>ZodDefault2,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion2,ZodEffects:()=>ZodEffects2,ZodEnum:()=>ZodEnum2,ZodError:()=>ZodError2,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind2,ZodFunction:()=>ZodFunction2,ZodIntersection:()=>ZodIntersection2,ZodIssueCode:()=>ZodIssueCode2,ZodLazy:()=>ZodLazy2,ZodLiteral:()=>ZodLiteral2,ZodMap:()=>ZodMap2,ZodNaN:()=>ZodNaN2,ZodNativeEnum:()=>ZodNativeEnum2,ZodNever:()=>ZodNever2,ZodNull:()=>ZodNull2,ZodNullable:()=>ZodNullable2,ZodNumber:()=>ZodNumber2,ZodObject:()=>ZodObject2,ZodOptional:()=>ZodOptional2,ZodParsedType:()=>ZodParsedType2,ZodPipeline:()=>ZodPipeline2,ZodPromise:()=>ZodPromise2,ZodReadonly:()=>ZodReadonly2,ZodRecord:()=>ZodRecord2,ZodSchema:()=>ZodType2,ZodSet:()=>ZodSet2,ZodString:()=>ZodString2,ZodSymbol:()=>ZodSymbol2,ZodTransformer:()=>ZodEffects2,ZodTuple:()=>ZodTuple2,ZodType:()=>ZodType2,ZodUndefined:()=>ZodUndefined2,ZodUnion:()=>ZodUnion2,ZodUnknown:()=>ZodUnknown2,ZodVoid:()=>ZodVoid2,addIssueToContext:()=>addIssueToContext2,any:()=>anyType2,array:()=>arrayType2,bigint:()=>bigIntType2,boolean:()=>booleanType2,coerce:()=>coerce2,custom:()=>custom2,date:()=>dateType2,datetimeRegex:()=>datetimeRegex2,defaultErrorMap:()=>en_default2,discriminatedUnion:()=>discriminatedUnionType2,effect:()=>effectsType2,enum:()=>enumType2,function:()=>functionType2,getErrorMap:()=>getErrorMap2,getParsedType:()=>getParsedType2,instanceof:()=>instanceOfType2,intersection:()=>intersectionType2,isAborted:()=>isAborted2,isAsync:()=>isAsync2,isDirty:()=>isDirty2,isValid:()=>isValid2,late:()=>late2,lazy:()=>lazyType2,literal:()=>literalType2,makeIssue:()=>makeIssue2,map:()=>mapType2,nan:()=>nanType2,nativeEnum:()=>nativeEnumType2,never:()=>neverType2,null:()=>nullType2,nullable:()=>nullableType2,number:()=>numberType2,object:()=>objectType2,objectUtil:()=>objectUtil2,oboolean:()=>oboolean2,onumber:()=>onumber2,optional:()=>optionalType2,ostring:()=>ostring2,pipeline:()=>pipelineType2,preprocess:()=>preprocessType2,promise:()=>promiseType2,quotelessJson:()=>quotelessJson2,record:()=>recordType2,set:()=>setType2,setErrorMap:()=>setErrorMap2,strictObject:()=>strictObjectType2,string:()=>stringType2,symbol:()=>symbolType2,transformer:()=>effectsType2,tuple:()=>tupleType2,undefined:()=>undefinedType2,union:()=>unionType2,unknown:()=>unknownType2,util:()=>util2,void:()=>voidType2});var util2;(function(util22){util22.assertEqual=_4=>{};function assertIs(_arg){}util22.assertIs=assertIs;function assertNever(_x3){throw new Error}util22.assertNever=assertNever,util22.arrayToEnum=items=>{let obj={};for(let item of items)obj[item]=item;return obj},util22.getValidEnumValues=obj=>{let validKeys=util22.objectKeys(obj).filter(k4=>typeof obj[obj[k4]]!="number"),filtered={};for(let k4 of validKeys)filtered[k4]=obj[k4];return util22.objectValues(filtered)},util22.objectValues=obj=>util22.objectKeys(obj).map(function(e5){return obj[e5]}),util22.objectKeys=typeof Object.keys=="function"?obj=>Object.keys(obj):object=>{let keys=[];for(let key in object)Object.prototype.hasOwnProperty.call(object,key)&&keys.push(key);return keys},util22.find=(arr,checker)=>{for(let item of arr)if(checker(item))return item},util22.isInteger=typeof Number.isInteger=="function"?val=>Number.isInteger(val):val=>typeof val=="number"&&Number.isFinite(val)&&Math.floor(val)===val;function joinValues(array2,separator=" | "){return array2.map(val=>typeof val=="string"?`'${val}'`:val).join(separator)}util22.joinValues=joinValues,util22.jsonStringifyReplacer=(_4,value)=>typeof value=="bigint"?value.toString():value})(util2||(util2={}));var objectUtil2;(function(objectUtil22){objectUtil22.mergeShapes=(first,second)=>({...first,...second})})(objectUtil2||(objectUtil2={}));var ZodParsedType2=util2.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),getParsedType2=data=>{switch(typeof data){case"undefined":return ZodParsedType2.undefined;case"string":return ZodParsedType2.string;case"number":return Number.isNaN(data)?ZodParsedType2.nan:ZodParsedType2.number;case"boolean":return ZodParsedType2.boolean;case"function":return ZodParsedType2.function;case"bigint":return ZodParsedType2.bigint;case"symbol":return ZodParsedType2.symbol;case"object":return Array.isArray(data)?ZodParsedType2.array:data===null?ZodParsedType2.null:data.then&&typeof data.then=="function"&&data.catch&&typeof data.catch=="function"?ZodParsedType2.promise:typeof Map<"u"&&data instanceof Map?ZodParsedType2.map:typeof Set<"u"&&data instanceof Set?ZodParsedType2.set:typeof Date<"u"&&data instanceof Date?ZodParsedType2.date:ZodParsedType2.object;default:return ZodParsedType2.unknown}},ZodIssueCode2=util2.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),quotelessJson2=obj=>JSON.stringify(obj,null,2).replace(/"([^"]+)":/g,"$1:"),ZodError2=class _ZodError extends Error{get errors(){return this.issues}constructor(issues){super(),this.issues=[],this.addIssue=sub=>{this.issues=[...this.issues,sub]},this.addIssues=(subs=[])=>{this.issues=[...this.issues,...subs]};let actualProto=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,actualProto):this.__proto__=actualProto,this.name="ZodError",this.issues=issues}format(_mapper){let mapper=_mapper||function(issue){return issue.message},fieldErrors={_errors:[]},processError=error2=>{for(let issue of error2.issues)if(issue.code==="invalid_union")issue.unionErrors.map(processError);else if(issue.code==="invalid_return_type")processError(issue.returnTypeError);else if(issue.code==="invalid_arguments")processError(issue.argumentsError);else if(issue.path.length===0)fieldErrors._errors.push(mapper(issue));else{let curr=fieldErrors,i3=0;for(;i3<issue.path.length;){let el3=issue.path[i3];i3===issue.path.length-1?(curr[el3]=curr[el3]||{_errors:[]},curr[el3]._errors.push(mapper(issue))):curr[el3]=curr[el3]||{_errors:[]},curr=curr[el3],i3++}}};return processError(this),fieldErrors}static assert(value){if(!(value instanceof _ZodError))throw new Error(`Not a ZodError: ${value}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,util2.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(mapper=issue=>issue.message){let fieldErrors={},formErrors=[];for(let sub of this.issues)if(sub.path.length>0){let firstEl=sub.path[0];fieldErrors[firstEl]=fieldErrors[firstEl]||[],fieldErrors[firstEl].push(mapper(sub))}else formErrors.push(mapper(sub));return{formErrors,fieldErrors}}get formErrors(){return this.flatten()}};ZodError2.create=issues=>new ZodError2(issues);var errorMap2=(issue,_ctx)=>{let message;switch(issue.code){case ZodIssueCode2.invalid_type:issue.received===ZodParsedType2.undefined?message="Required":message=`Expected ${issue.expected}, received ${issue.received}`;break;case ZodIssueCode2.invalid_literal:message=`Invalid literal value, expected ${JSON.stringify(issue.expected,util2.jsonStringifyReplacer)}`;break;case ZodIssueCode2.unrecognized_keys:message=`Unrecognized key(s) in object: ${util2.joinValues(issue.keys,", ")}`;break;case ZodIssueCode2.invalid_union:message="Invalid input";break;case ZodIssueCode2.invalid_union_discriminator:message=`Invalid discriminator value. Expected ${util2.joinValues(issue.options)}`;break;case ZodIssueCode2.invalid_enum_value:message=`Invalid enum value. Expected ${util2.joinValues(issue.options)}, received '${issue.received}'`;break;case ZodIssueCode2.invalid_arguments:message="Invalid function arguments";break;case ZodIssueCode2.invalid_return_type:message="Invalid function return type";break;case ZodIssueCode2.invalid_date:message="Invalid date";break;case ZodIssueCode2.invalid_string:typeof issue.validation=="object"?"includes"in issue.validation?(message=`Invalid input: must include "${issue.validation.includes}"`,typeof issue.validation.position=="number"&&(message=`${message} at one or more positions greater than or equal to ${issue.validation.position}`)):"startsWith"in issue.validation?message=`Invalid input: must start with "${issue.validation.startsWith}"`:"endsWith"in issue.validation?message=`Invalid input: must end with "${issue.validation.endsWith}"`:util2.assertNever(issue.validation):issue.validation!=="regex"?message=`Invalid ${issue.validation}`:message="Invalid";break;case ZodIssueCode2.too_small:issue.type==="array"?message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at least":"more than"} ${issue.minimum} element(s)`:issue.type==="string"?message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at least":"over"} ${issue.minimum} character(s)`:issue.type==="number"?message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`:issue.type==="bigint"?message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`:issue.type==="date"?message=`Date must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(issue.minimum))}`:message="Invalid input";break;case ZodIssueCode2.too_big:issue.type==="array"?message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at most":"less than"} ${issue.maximum} element(s)`:issue.type==="string"?message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at most":"under"} ${issue.maximum} character(s)`:issue.type==="number"?message=`Number must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`:issue.type==="bigint"?message=`BigInt must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`:issue.type==="date"?message=`Date must be ${issue.exact?"exactly":issue.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(issue.maximum))}`:message="Invalid input";break;case ZodIssueCode2.custom:message="Invalid input";break;case ZodIssueCode2.invalid_intersection_types:message="Intersection results could not be merged";break;case ZodIssueCode2.not_multiple_of:message=`Number must be a multiple of ${issue.multipleOf}`;break;case ZodIssueCode2.not_finite:message="Number must be finite";break;default:message=_ctx.defaultError,util2.assertNever(issue)}return{message}},en_default2=errorMap2,overrideErrorMap2=en_default2;function setErrorMap2(map){overrideErrorMap2=map}function getErrorMap2(){return overrideErrorMap2}var makeIssue2=params=>{let{data,path,errorMaps,issueData}=params,fullPath=[...path,...issueData.path||[]],fullIssue={...issueData,path:fullPath};if(issueData.message!==void 0)return{...issueData,path:fullPath,message:issueData.message};let errorMessage="",maps=errorMaps.filter(m4=>!!m4).slice().reverse();for(let map of maps)errorMessage=map(fullIssue,{data,defaultError:errorMessage}).message;return{...issueData,path:fullPath,message:errorMessage}},EMPTY_PATH2=[];function addIssueToContext2(ctx,issueData){let overrideMap=getErrorMap2(),issue=makeIssue2({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default2?void 0:en_default2].filter(x4=>!!x4)});ctx.common.issues.push(issue)}var ParseStatus2=class _ParseStatus{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(status,results){let arrayValue=[];for(let s3 of results){if(s3.status==="aborted")return INVALID2;s3.status==="dirty"&&status.dirty(),arrayValue.push(s3.value)}return{status:status.value,value:arrayValue}}static async mergeObjectAsync(status,pairs22){let syncPairs=[];for(let pair of pairs22){let key=await pair.key,value=await pair.value;syncPairs.push({key,value})}return _ParseStatus.mergeObjectSync(status,syncPairs)}static mergeObjectSync(status,pairs22){let finalObject={};for(let pair of pairs22){let{key,value}=pair;if(key.status==="aborted"||value.status==="aborted")return INVALID2;key.status==="dirty"&&status.dirty(),value.status==="dirty"&&status.dirty(),key.value!=="__proto__"&&(typeof value.value<"u"||pair.alwaysSet)&&(finalObject[key.value]=value.value)}return{status:status.value,value:finalObject}}},INVALID2=Object.freeze({status:"aborted"}),DIRTY2=value=>({status:"dirty",value}),OK2=value=>({status:"valid",value}),isAborted2=x4=>x4.status==="aborted",isDirty2=x4=>x4.status==="dirty",isValid2=x4=>x4.status==="valid",isAsync2=x4=>typeof Promise<"u"&&x4 instanceof Promise,errorUtil2;(function(errorUtil22){errorUtil22.errToObj=message=>typeof message=="string"?{message}:message||{},errorUtil22.toString=message=>typeof message=="string"?message:message?.message})(errorUtil2||(errorUtil2={}));var ParseInputLazyPath2=class{constructor(parent,value,path,key){this._cachedPath=[],this.parent=parent,this.data=value,this._path=path,this._key=key}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},handleResult2=(ctx,result)=>{if(isValid2(result))return{success:!0,data:result.value};if(!ctx.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let error2=new ZodError2(ctx.common.issues);return this._error=error2,this._error}}};function processCreateParams2(params){if(!params)return{};let{errorMap:errorMap22,invalid_type_error,required_error,description}=params;if(errorMap22&&(invalid_type_error||required_error))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return errorMap22?{errorMap:errorMap22,description}:{errorMap:(iss,ctx)=>{let{message}=params;return iss.code==="invalid_enum_value"?{message:message??ctx.defaultError}:typeof ctx.data>"u"?{message:message??required_error??ctx.defaultError}:iss.code!=="invalid_type"?{message:ctx.defaultError}:{message:message??invalid_type_error??ctx.defaultError}},description}}var ZodType2=class{get description(){return this._def.description}_getType(input2){return getParsedType2(input2.data)}_getOrReturnCtx(input2,ctx){return ctx||{common:input2.parent.common,data:input2.data,parsedType:getParsedType2(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}_processInputParams(input2){return{status:new ParseStatus2,ctx:{common:input2.parent.common,data:input2.data,parsedType:getParsedType2(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}}_parseSync(input2){let result=this._parse(input2);if(isAsync2(result))throw new Error("Synchronous parse encountered promise.");return result}_parseAsync(input2){let result=this._parse(input2);return Promise.resolve(result)}parse(data,params){let result=this.safeParse(data,params);if(result.success)return result.data;throw result.error}safeParse(data,params){let ctx={common:{issues:[],async:params?.async??!1,contextualErrorMap:params?.errorMap},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)},result=this._parseSync({data,path:ctx.path,parent:ctx});return handleResult2(ctx,result)}"~validate"(data){let ctx={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)};if(!this["~standard"].async)try{let result=this._parseSync({data,path:[],parent:ctx});return isValid2(result)?{value:result.value}:{issues:ctx.common.issues}}catch(err){err?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),ctx.common={issues:[],async:!0}}return this._parseAsync({data,path:[],parent:ctx}).then(result=>isValid2(result)?{value:result.value}:{issues:ctx.common.issues})}async parseAsync(data,params){let result=await this.safeParseAsync(data,params);if(result.success)return result.data;throw result.error}async safeParseAsync(data,params){let ctx={common:{issues:[],contextualErrorMap:params?.errorMap,async:!0},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)},maybeAsyncResult=this._parse({data,path:ctx.path,parent:ctx}),result=await(isAsync2(maybeAsyncResult)?maybeAsyncResult:Promise.resolve(maybeAsyncResult));return handleResult2(ctx,result)}refine(check,message){let getIssueProperties=val=>typeof message=="string"||typeof message>"u"?{message}:typeof message=="function"?message(val):message;return this._refinement((val,ctx)=>{let result=check(val),setError=()=>ctx.addIssue({code:ZodIssueCode2.custom,...getIssueProperties(val)});return typeof Promise<"u"&&result instanceof Promise?result.then(data=>data?!0:(setError(),!1)):result?!0:(setError(),!1)})}refinement(check,refinementData){return this._refinement((val,ctx)=>check(val)?!0:(ctx.addIssue(typeof refinementData=="function"?refinementData(val,ctx):refinementData),!1))}_refinement(refinement){return new ZodEffects2({schema:this,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect:{type:"refinement",refinement}})}superRefine(refinement){return this._refinement(refinement)}constructor(def){this.spa=this.safeParseAsync,this._def=def,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:data=>this["~validate"](data)}}optional(){return ZodOptional2.create(this,this._def)}nullable(){return ZodNullable2.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray2.create(this)}promise(){return ZodPromise2.create(this,this._def)}or(option){return ZodUnion2.create([this,option],this._def)}and(incoming){return ZodIntersection2.create(this,incoming,this._def)}transform(transform22){return new ZodEffects2({...processCreateParams2(this._def),schema:this,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect:{type:"transform",transform:transform22}})}default(def){let defaultValueFunc=typeof def=="function"?def:()=>def;return new ZodDefault2({...processCreateParams2(this._def),innerType:this,defaultValue:defaultValueFunc,typeName:ZodFirstPartyTypeKind2.ZodDefault})}brand(){return new ZodBranded2({typeName:ZodFirstPartyTypeKind2.ZodBranded,type:this,...processCreateParams2(this._def)})}catch(def){let catchValueFunc=typeof def=="function"?def:()=>def;return new ZodCatch2({...processCreateParams2(this._def),innerType:this,catchValue:catchValueFunc,typeName:ZodFirstPartyTypeKind2.ZodCatch})}describe(description){let This=this.constructor;return new This({...this._def,description})}pipe(target){return ZodPipeline2.create(this,target)}readonly(){return ZodReadonly2.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},cuidRegex2=/^c[^\s-]{8,}$/i,cuid2Regex2=/^[0-9a-z]+$/,ulidRegex2=/^[0-9A-HJKMNP-TV-Z]{26}$/i,uuidRegex2=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,nanoidRegex2=/^[a-z0-9_-]{21}$/i,jwtRegex2=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,durationRegex2=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,emailRegex2=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,_emojiRegex2="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",emojiRegex2,ipv4Regex2=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4CidrRegex2=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6Regex2=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,ipv6CidrRegex2=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64Regex2=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64urlRegex2=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,dateRegexSource2="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",dateRegex2=new RegExp(`^${dateRegexSource2}$`);function timeRegexSource2(args){let secondsRegexSource="[0-5]\\d";args.precision?secondsRegexSource=`${secondsRegexSource}\\.\\d{${args.precision}}`:args.precision==null&&(secondsRegexSource=`${secondsRegexSource}(\\.\\d+)?`);let secondsQuantifier=args.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`}function timeRegex2(args){return new RegExp(`^${timeRegexSource2(args)}$`)}function datetimeRegex2(args){let regex=`${dateRegexSource2}T${timeRegexSource2(args)}`,opts=[];return opts.push(args.local?"Z?":"Z"),args.offset&&opts.push("([+-]\\d{2}:?\\d{2})"),regex=`${regex}(${opts.join("|")})`,new RegExp(`^${regex}$`)}function isValidIP2(ip3,version2){return!!((version2==="v4"||!version2)&&ipv4Regex2.test(ip3)||(version2==="v6"||!version2)&&ipv6Regex2.test(ip3))}function isValidJWT2(jwt,alg){if(!jwtRegex2.test(jwt))return!1;try{let[header]=jwt.split(".");if(!header)return!1;let base64=header.replace(/-/g,"+").replace(/_/g,"/").padEnd(header.length+(4-header.length%4)%4,"="),decoded=JSON.parse(atob(base64));return!(typeof decoded!="object"||decoded===null||"typ"in decoded&&decoded?.typ!=="JWT"||!decoded.alg||alg&&decoded.alg!==alg)}catch{return!1}}function isValidCidr2(ip3,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex2.test(ip3)||(version2==="v6"||!version2)&&ipv6CidrRegex2.test(ip3))}var ZodString2=class _ZodString extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=String(input2.data)),this._getType(input2)!==ZodParsedType2.string){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.string,received:ctx2.parsedType}),INVALID2}let status=new ParseStatus2,ctx;for(let check of this._def.checks)if(check.kind==="min")input2.data.length<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty());else if(check.kind==="max")input2.data.length>check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty());else if(check.kind==="length"){let tooBig=input2.data.length>check.value,tooSmall=input2.data.length<check.value;(tooBig||tooSmall)&&(ctx=this._getOrReturnCtx(input2,ctx),tooBig?addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}):tooSmall&&addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}),status.dirty())}else if(check.kind==="email")emailRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"email",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="emoji")emojiRegex2||(emojiRegex2=new RegExp(_emojiRegex2,"u")),emojiRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"emoji",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="uuid")uuidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"uuid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="nanoid")nanoidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"nanoid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid")cuidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cuid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid2")cuid2Regex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cuid2",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="ulid")ulidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"ulid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="url")try{new URL(input2.data)}catch{ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"url",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()}else check.kind==="regex"?(check.regex.lastIndex=0,check.regex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"regex",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty())):check.kind==="trim"?input2.data=input2.data.trim():check.kind==="includes"?input2.data.includes(check.value,check.position)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{includes:check.value,position:check.position},message:check.message}),status.dirty()):check.kind==="toLowerCase"?input2.data=input2.data.toLowerCase():check.kind==="toUpperCase"?input2.data=input2.data.toUpperCase():check.kind==="startsWith"?input2.data.startsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{startsWith:check.value},message:check.message}),status.dirty()):check.kind==="endsWith"?input2.data.endsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{endsWith:check.value},message:check.message}),status.dirty()):check.kind==="datetime"?datetimeRegex2(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"datetime",message:check.message}),status.dirty()):check.kind==="date"?dateRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"date",message:check.message}),status.dirty()):check.kind==="time"?timeRegex2(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"time",message:check.message}),status.dirty()):check.kind==="duration"?durationRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"duration",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="ip"?isValidIP2(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"ip",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="jwt"?isValidJWT2(input2.data,check.alg)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"jwt",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="cidr"?isValidCidr2(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cidr",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="base64"?base64Regex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"base64",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="base64url"?base64urlRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"base64url",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}_regex(regex,validation,message){return this.refinement(data=>regex.test(data),{validation,code:ZodIssueCode2.invalid_string,...errorUtil2.errToObj(message)})}_addCheck(check){return new _ZodString({...this._def,checks:[...this._def.checks,check]})}email(message){return this._addCheck({kind:"email",...errorUtil2.errToObj(message)})}url(message){return this._addCheck({kind:"url",...errorUtil2.errToObj(message)})}emoji(message){return this._addCheck({kind:"emoji",...errorUtil2.errToObj(message)})}uuid(message){return this._addCheck({kind:"uuid",...errorUtil2.errToObj(message)})}nanoid(message){return this._addCheck({kind:"nanoid",...errorUtil2.errToObj(message)})}cuid(message){return this._addCheck({kind:"cuid",...errorUtil2.errToObj(message)})}cuid2(message){return this._addCheck({kind:"cuid2",...errorUtil2.errToObj(message)})}ulid(message){return this._addCheck({kind:"ulid",...errorUtil2.errToObj(message)})}base64(message){return this._addCheck({kind:"base64",...errorUtil2.errToObj(message)})}base64url(message){return this._addCheck({kind:"base64url",...errorUtil2.errToObj(message)})}jwt(options){return this._addCheck({kind:"jwt",...errorUtil2.errToObj(options)})}ip(options){return this._addCheck({kind:"ip",...errorUtil2.errToObj(options)})}cidr(options){return this._addCheck({kind:"cidr",...errorUtil2.errToObj(options)})}datetime(options){return typeof options=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:options}):this._addCheck({kind:"datetime",precision:typeof options?.precision>"u"?null:options?.precision,offset:options?.offset??!1,local:options?.local??!1,...errorUtil2.errToObj(options?.message)})}date(message){return this._addCheck({kind:"date",message})}time(options){return typeof options=="string"?this._addCheck({kind:"time",precision:null,message:options}):this._addCheck({kind:"time",precision:typeof options?.precision>"u"?null:options?.precision,...errorUtil2.errToObj(options?.message)})}duration(message){return this._addCheck({kind:"duration",...errorUtil2.errToObj(message)})}regex(regex,message){return this._addCheck({kind:"regex",regex,...errorUtil2.errToObj(message)})}includes(value,options){return this._addCheck({kind:"includes",value,position:options?.position,...errorUtil2.errToObj(options?.message)})}startsWith(value,message){return this._addCheck({kind:"startsWith",value,...errorUtil2.errToObj(message)})}endsWith(value,message){return this._addCheck({kind:"endsWith",value,...errorUtil2.errToObj(message)})}min(minLength,message){return this._addCheck({kind:"min",value:minLength,...errorUtil2.errToObj(message)})}max(maxLength,message){return this._addCheck({kind:"max",value:maxLength,...errorUtil2.errToObj(message)})}length(len,message){return this._addCheck({kind:"length",value:len,...errorUtil2.errToObj(message)})}nonempty(message){return this.min(1,errorUtil2.errToObj(message))}trim(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(ch3=>ch3.kind==="datetime")}get isDate(){return!!this._def.checks.find(ch3=>ch3.kind==="date")}get isTime(){return!!this._def.checks.find(ch3=>ch3.kind==="time")}get isDuration(){return!!this._def.checks.find(ch3=>ch3.kind==="duration")}get isEmail(){return!!this._def.checks.find(ch3=>ch3.kind==="email")}get isURL(){return!!this._def.checks.find(ch3=>ch3.kind==="url")}get isEmoji(){return!!this._def.checks.find(ch3=>ch3.kind==="emoji")}get isUUID(){return!!this._def.checks.find(ch3=>ch3.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(ch3=>ch3.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(ch3=>ch3.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(ch3=>ch3.kind==="cuid2")}get isULID(){return!!this._def.checks.find(ch3=>ch3.kind==="ulid")}get isIP(){return!!this._def.checks.find(ch3=>ch3.kind==="ip")}get isCIDR(){return!!this._def.checks.find(ch3=>ch3.kind==="cidr")}get isBase64(){return!!this._def.checks.find(ch3=>ch3.kind==="base64")}get isBase64url(){return!!this._def.checks.find(ch3=>ch3.kind==="base64url")}get minLength(){let min=null;for(let ch3 of this._def.checks)ch3.kind==="min"&&(min===null||ch3.value>min)&&(min=ch3.value);return min}get maxLength(){let max=null;for(let ch3 of this._def.checks)ch3.kind==="max"&&(max===null||ch3.value<max)&&(max=ch3.value);return max}};ZodString2.create=params=>new ZodString2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodString,coerce:params?.coerce??!1,...processCreateParams2(params)});function floatSafeRemainder2(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepDecCount=(step.toString().split(".")[1]||"").length,decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}var ZodNumber2=class _ZodNumber extends ZodType2{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(input2){if(this._def.coerce&&(input2.data=Number(input2.data)),this._getType(input2)!==ZodParsedType2.number){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.number,received:ctx2.parsedType}),INVALID2}let ctx,status=new ParseStatus2;for(let check of this._def.checks)check.kind==="int"?util2.isInteger(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:"integer",received:"float",message:check.message}),status.dirty()):check.kind==="min"?(check.inclusive?input2.data<check.value:input2.data<=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="max"?(check.inclusive?input2.data>check.value:input2.data>=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="multipleOf"?floatSafeRemainder2(input2.data,check.value)!==0&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):check.kind==="finite"?Number.isFinite(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_finite,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}gte(value,message){return this.setLimit("min",value,!0,errorUtil2.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil2.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil2.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil2.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodNumber({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil2.toString(message)}]})}_addCheck(check){return new _ZodNumber({...this._def,checks:[...this._def.checks,check]})}int(message){return this._addCheck({kind:"int",message:errorUtil2.toString(message)})}positive(message){return this._addCheck({kind:"min",value:0,inclusive:!1,message:errorUtil2.toString(message)})}negative(message){return this._addCheck({kind:"max",value:0,inclusive:!1,message:errorUtil2.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:0,inclusive:!0,message:errorUtil2.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:0,inclusive:!0,message:errorUtil2.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil2.toString(message)})}finite(message){return this._addCheck({kind:"finite",message:errorUtil2.toString(message)})}safe(message){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:errorUtil2.toString(message)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:errorUtil2.toString(message)})}get minValue(){let min=null;for(let ch3 of this._def.checks)ch3.kind==="min"&&(min===null||ch3.value>min)&&(min=ch3.value);return min}get maxValue(){let max=null;for(let ch3 of this._def.checks)ch3.kind==="max"&&(max===null||ch3.value<max)&&(max=ch3.value);return max}get isInt(){return!!this._def.checks.find(ch3=>ch3.kind==="int"||ch3.kind==="multipleOf"&&util2.isInteger(ch3.value))}get isFinite(){let max=null,min=null;for(let ch3 of this._def.checks){if(ch3.kind==="finite"||ch3.kind==="int"||ch3.kind==="multipleOf")return!0;ch3.kind==="min"?(min===null||ch3.value>min)&&(min=ch3.value):ch3.kind==="max"&&(max===null||ch3.value<max)&&(max=ch3.value)}return Number.isFinite(min)&&Number.isFinite(max)}};ZodNumber2.create=params=>new ZodNumber2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodNumber,coerce:params?.coerce||!1,...processCreateParams2(params)});var ZodBigInt2=class _ZodBigInt extends ZodType2{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(input2){if(this._def.coerce)try{input2.data=BigInt(input2.data)}catch{return this._getInvalidInput(input2)}if(this._getType(input2)!==ZodParsedType2.bigint)return this._getInvalidInput(input2);let ctx,status=new ParseStatus2;for(let check of this._def.checks)check.kind==="min"?(check.inclusive?input2.data<check.value:input2.data<=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,type:"bigint",minimum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()):check.kind==="max"?(check.inclusive?input2.data>check.value:input2.data>=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,type:"bigint",maximum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()):check.kind==="multipleOf"?input2.data%check.value!==BigInt(0)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}_getInvalidInput(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.bigint,received:ctx.parsedType}),INVALID2}gte(value,message){return this.setLimit("min",value,!0,errorUtil2.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil2.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil2.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil2.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodBigInt({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil2.toString(message)}]})}_addCheck(check){return new _ZodBigInt({...this._def,checks:[...this._def.checks,check]})}positive(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:errorUtil2.toString(message)})}negative(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:errorUtil2.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:errorUtil2.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:errorUtil2.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil2.toString(message)})}get minValue(){let min=null;for(let ch3 of this._def.checks)ch3.kind==="min"&&(min===null||ch3.value>min)&&(min=ch3.value);return min}get maxValue(){let max=null;for(let ch3 of this._def.checks)ch3.kind==="max"&&(max===null||ch3.value<max)&&(max=ch3.value);return max}};ZodBigInt2.create=params=>new ZodBigInt2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodBigInt,coerce:params?.coerce??!1,...processCreateParams2(params)});var ZodBoolean2=class extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=!!input2.data),this._getType(input2)!==ZodParsedType2.boolean){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.boolean,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodBoolean2.create=params=>new ZodBoolean2({typeName:ZodFirstPartyTypeKind2.ZodBoolean,coerce:params?.coerce||!1,...processCreateParams2(params)});var ZodDate2=class _ZodDate extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=new Date(input2.data)),this._getType(input2)!==ZodParsedType2.date){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.date,received:ctx2.parsedType}),INVALID2}if(Number.isNaN(input2.data.getTime())){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_date}),INVALID2}let status=new ParseStatus2,ctx;for(let check of this._def.checks)check.kind==="min"?input2.data.getTime()<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,message:check.message,inclusive:!0,exact:!1,minimum:check.value,type:"date"}),status.dirty()):check.kind==="max"?input2.data.getTime()>check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,message:check.message,inclusive:!0,exact:!1,maximum:check.value,type:"date"}),status.dirty()):util2.assertNever(check);return{status:status.value,value:new Date(input2.data.getTime())}}_addCheck(check){return new _ZodDate({...this._def,checks:[...this._def.checks,check]})}min(minDate,message){return this._addCheck({kind:"min",value:minDate.getTime(),message:errorUtil2.toString(message)})}max(maxDate,message){return this._addCheck({kind:"max",value:maxDate.getTime(),message:errorUtil2.toString(message)})}get minDate(){let min=null;for(let ch3 of this._def.checks)ch3.kind==="min"&&(min===null||ch3.value>min)&&(min=ch3.value);return min!=null?new Date(min):null}get maxDate(){let max=null;for(let ch3 of this._def.checks)ch3.kind==="max"&&(max===null||ch3.value<max)&&(max=ch3.value);return max!=null?new Date(max):null}};ZodDate2.create=params=>new ZodDate2({checks:[],coerce:params?.coerce||!1,typeName:ZodFirstPartyTypeKind2.ZodDate,...processCreateParams2(params)});var ZodSymbol2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.symbol){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.symbol,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodSymbol2.create=params=>new ZodSymbol2({typeName:ZodFirstPartyTypeKind2.ZodSymbol,...processCreateParams2(params)});var ZodUndefined2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.undefined,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodUndefined2.create=params=>new ZodUndefined2({typeName:ZodFirstPartyTypeKind2.ZodUndefined,...processCreateParams2(params)});var ZodNull2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.null){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.null,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodNull2.create=params=>new ZodNull2({typeName:ZodFirstPartyTypeKind2.ZodNull,...processCreateParams2(params)});var ZodAny2=class extends ZodType2{constructor(){super(...arguments),this._any=!0}_parse(input2){return OK2(input2.data)}};ZodAny2.create=params=>new ZodAny2({typeName:ZodFirstPartyTypeKind2.ZodAny,...processCreateParams2(params)});var ZodUnknown2=class extends ZodType2{constructor(){super(...arguments),this._unknown=!0}_parse(input2){return OK2(input2.data)}};ZodUnknown2.create=params=>new ZodUnknown2({typeName:ZodFirstPartyTypeKind2.ZodUnknown,...processCreateParams2(params)});var ZodNever2=class extends ZodType2{_parse(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.never,received:ctx.parsedType}),INVALID2}};ZodNever2.create=params=>new ZodNever2({typeName:ZodFirstPartyTypeKind2.ZodNever,...processCreateParams2(params)});var ZodVoid2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.void,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodVoid2.create=params=>new ZodVoid2({typeName:ZodFirstPartyTypeKind2.ZodVoid,...processCreateParams2(params)});var ZodArray2=class _ZodArray extends ZodType2{_parse(input2){let{ctx,status}=this._processInputParams(input2),def=this._def;if(ctx.parsedType!==ZodParsedType2.array)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.array,received:ctx.parsedType}),INVALID2;if(def.exactLength!==null){let tooBig=ctx.data.length>def.exactLength.value,tooSmall=ctx.data.length<def.exactLength.value;(tooBig||tooSmall)&&(addIssueToContext2(ctx,{code:tooBig?ZodIssueCode2.too_big:ZodIssueCode2.too_small,minimum:tooSmall?def.exactLength.value:void 0,maximum:tooBig?def.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:def.exactLength.message}),status.dirty())}if(def.minLength!==null&&ctx.data.length<def.minLength.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:def.minLength.value,type:"array",inclusive:!0,exact:!1,message:def.minLength.message}),status.dirty()),def.maxLength!==null&&ctx.data.length>def.maxLength.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:def.maxLength.value,type:"array",inclusive:!0,exact:!1,message:def.maxLength.message}),status.dirty()),ctx.common.async)return Promise.all([...ctx.data].map((item,i3)=>def.type._parseAsync(new ParseInputLazyPath2(ctx,item,ctx.path,i3)))).then(result2=>ParseStatus2.mergeArray(status,result2));let result=[...ctx.data].map((item,i3)=>def.type._parseSync(new ParseInputLazyPath2(ctx,item,ctx.path,i3)));return ParseStatus2.mergeArray(status,result)}get element(){return this._def.type}min(minLength,message){return new _ZodArray({...this._def,minLength:{value:minLength,message:errorUtil2.toString(message)}})}max(maxLength,message){return new _ZodArray({...this._def,maxLength:{value:maxLength,message:errorUtil2.toString(message)}})}length(len,message){return new _ZodArray({...this._def,exactLength:{value:len,message:errorUtil2.toString(message)}})}nonempty(message){return this.min(1,message)}};ZodArray2.create=(schema,params)=>new ZodArray2({type:schema,minLength:null,maxLength:null,exactLength:null,typeName:ZodFirstPartyTypeKind2.ZodArray,...processCreateParams2(params)});function deepPartialify2(schema){if(schema instanceof ZodObject2){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional2.create(deepPartialify2(fieldSchema))}return new ZodObject2({...schema._def,shape:()=>newShape})}else return schema instanceof ZodArray2?new ZodArray2({...schema._def,type:deepPartialify2(schema.element)}):schema instanceof ZodOptional2?ZodOptional2.create(deepPartialify2(schema.unwrap())):schema instanceof ZodNullable2?ZodNullable2.create(deepPartialify2(schema.unwrap())):schema instanceof ZodTuple2?ZodTuple2.create(schema.items.map(item=>deepPartialify2(item))):schema}var ZodObject2=class _ZodObject extends ZodType2{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let shape=this._def.shape(),keys=util2.objectKeys(shape);return this._cached={shape,keys},this._cached}_parse(input2){if(this._getType(input2)!==ZodParsedType2.object){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx2.parsedType}),INVALID2}let{status,ctx}=this._processInputParams(input2),{shape,keys:shapeKeys}=this._getCached(),extraKeys=[];if(!(this._def.catchall instanceof ZodNever2&&this._def.unknownKeys==="strip"))for(let key in ctx.data)shapeKeys.includes(key)||extraKeys.push(key);let pairs22=[];for(let key of shapeKeys){let keyValidator=shape[key],value=ctx.data[key];pairs22.push({key:{status:"valid",value:key},value:keyValidator._parse(new ParseInputLazyPath2(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}if(this._def.catchall instanceof ZodNever2){let unknownKeys=this._def.unknownKeys;if(unknownKeys==="passthrough")for(let key of extraKeys)pairs22.push({key:{status:"valid",value:key},value:{status:"valid",value:ctx.data[key]}});else if(unknownKeys==="strict")extraKeys.length>0&&(addIssueToContext2(ctx,{code:ZodIssueCode2.unrecognized_keys,keys:extraKeys}),status.dirty());else if(unknownKeys!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let catchall=this._def.catchall;for(let key of extraKeys){let value=ctx.data[key];pairs22.push({key:{status:"valid",value:key},value:catchall._parse(new ParseInputLazyPath2(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}}return ctx.common.async?Promise.resolve().then(async()=>{let syncPairs=[];for(let pair of pairs22){let key=await pair.key,value=await pair.value;syncPairs.push({key,value,alwaysSet:pair.alwaysSet})}return syncPairs}).then(syncPairs=>ParseStatus2.mergeObjectSync(status,syncPairs)):ParseStatus2.mergeObjectSync(status,pairs22)}get shape(){return this._def.shape()}strict(message){return errorUtil2.errToObj,new _ZodObject({...this._def,unknownKeys:"strict",...message!==void 0?{errorMap:(issue,ctx)=>{let defaultError=this._def.errorMap?.(issue,ctx).message??ctx.defaultError;return issue.code==="unrecognized_keys"?{message:errorUtil2.errToObj(message).message??defaultError}:{message:defaultError}}}:{}})}strip(){return new _ZodObject({...this._def,unknownKeys:"strip"})}passthrough(){return new _ZodObject({...this._def,unknownKeys:"passthrough"})}extend(augmentation){return new _ZodObject({...this._def,shape:()=>({...this._def.shape(),...augmentation})})}merge(merging){return new _ZodObject({unknownKeys:merging._def.unknownKeys,catchall:merging._def.catchall,shape:()=>({...this._def.shape(),...merging._def.shape()}),typeName:ZodFirstPartyTypeKind2.ZodObject})}setKey(key,schema){return this.augment({[key]:schema})}catchall(index){return new _ZodObject({...this._def,catchall:index})}pick(mask){let shape={};for(let key of util2.objectKeys(mask))mask[key]&&this.shape[key]&&(shape[key]=this.shape[key]);return new _ZodObject({...this._def,shape:()=>shape})}omit(mask){let shape={};for(let key of util2.objectKeys(this.shape))mask[key]||(shape[key]=this.shape[key]);return new _ZodObject({...this._def,shape:()=>shape})}deepPartial(){return deepPartialify2(this)}partial(mask){let newShape={};for(let key of util2.objectKeys(this.shape)){let fieldSchema=this.shape[key];mask&&!mask[key]?newShape[key]=fieldSchema:newShape[key]=fieldSchema.optional()}return new _ZodObject({...this._def,shape:()=>newShape})}required(mask){let newShape={};for(let key of util2.objectKeys(this.shape))if(mask&&!mask[key])newShape[key]=this.shape[key];else{let newField=this.shape[key];for(;newField instanceof ZodOptional2;)newField=newField._def.innerType;newShape[key]=newField}return new _ZodObject({...this._def,shape:()=>newShape})}keyof(){return createZodEnum2(util2.objectKeys(this.shape))}};ZodObject2.create=(shape,params)=>new ZodObject2({shape:()=>shape,unknownKeys:"strip",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});ZodObject2.strictCreate=(shape,params)=>new ZodObject2({shape:()=>shape,unknownKeys:"strict",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});ZodObject2.lazycreate=(shape,params)=>new ZodObject2({shape,unknownKeys:"strip",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});var ZodUnion2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),options=this._def.options;function handleResults(results){for(let result of results)if(result.result.status==="valid")return result.result;for(let result of results)if(result.result.status==="dirty")return ctx.common.issues.push(...result.ctx.common.issues),result.result;let unionErrors=results.map(result=>new ZodError2(result.ctx.common.issues));return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union,unionErrors}),INVALID2}if(ctx.common.async)return Promise.all(options.map(async option=>{let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null};return{result:await option._parseAsync({data:ctx.data,path:ctx.path,parent:childCtx}),ctx:childCtx}})).then(handleResults);{let dirty,issues=[];for(let option of options){let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null},result=option._parseSync({data:ctx.data,path:ctx.path,parent:childCtx});if(result.status==="valid")return result;result.status==="dirty"&&!dirty&&(dirty={result,ctx:childCtx}),childCtx.common.issues.length&&issues.push(childCtx.common.issues)}if(dirty)return ctx.common.issues.push(...dirty.ctx.common.issues),dirty.result;let unionErrors=issues.map(issues2=>new ZodError2(issues2));return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union,unionErrors}),INVALID2}}get options(){return this._def.options}};ZodUnion2.create=(types,params)=>new ZodUnion2({options:types,typeName:ZodFirstPartyTypeKind2.ZodUnion,...processCreateParams2(params)});var getDiscriminator2=type=>type instanceof ZodLazy2?getDiscriminator2(type.schema):type instanceof ZodEffects2?getDiscriminator2(type.innerType()):type instanceof ZodLiteral2?[type.value]:type instanceof ZodEnum2?type.options:type instanceof ZodNativeEnum2?util2.objectValues(type.enum):type instanceof ZodDefault2?getDiscriminator2(type._def.innerType):type instanceof ZodUndefined2?[void 0]:type instanceof ZodNull2?[null]:type instanceof ZodOptional2?[void 0,...getDiscriminator2(type.unwrap())]:type instanceof ZodNullable2?[null,...getDiscriminator2(type.unwrap())]:type instanceof ZodBranded2||type instanceof ZodReadonly2?getDiscriminator2(type.unwrap()):type instanceof ZodCatch2?getDiscriminator2(type._def.innerType):[],ZodDiscriminatedUnion2=class _ZodDiscriminatedUnion extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.object)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx.parsedType}),INVALID2;let discriminator=this.discriminator,discriminatorValue=ctx.data[discriminator],option=this.optionsMap.get(discriminatorValue);return option?ctx.common.async?option._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}):option._parseSync({data:ctx.data,path:ctx.path,parent:ctx}):(addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[discriminator]}),INVALID2)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(discriminator,options,params){let optionsMap=new Map;for(let type of options){let discriminatorValues=getDiscriminator2(type.shape[discriminator]);if(!discriminatorValues.length)throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`);for(let value of discriminatorValues){if(optionsMap.has(value))throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);optionsMap.set(value,type)}}return new _ZodDiscriminatedUnion({typeName:ZodFirstPartyTypeKind2.ZodDiscriminatedUnion,discriminator,options,optionsMap,...processCreateParams2(params)})}};function mergeValues2(a3,b3){let aType=getParsedType2(a3),bType=getParsedType2(b3);if(a3===b3)return{valid:!0,data:a3};if(aType===ZodParsedType2.object&&bType===ZodParsedType2.object){let bKeys=util2.objectKeys(b3),sharedKeys=util2.objectKeys(a3).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a3,...b3};for(let key of sharedKeys){let sharedValue=mergeValues2(a3[key],b3[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType2.array&&bType===ZodParsedType2.array){if(a3.length!==b3.length)return{valid:!1};let newArray=[];for(let index=0;index<a3.length;index++){let itemA=a3[index],itemB=b3[index],sharedValue=mergeValues2(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else return aType===ZodParsedType2.date&&bType===ZodParsedType2.date&&+a3==+b3?{valid:!0,data:a3}:{valid:!1}}var ZodIntersection2=class extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2),handleParsed=(parsedLeft,parsedRight)=>{if(isAborted2(parsedLeft)||isAborted2(parsedRight))return INVALID2;let merged=mergeValues2(parsedLeft.value,parsedRight.value);return merged.valid?((isDirty2(parsedLeft)||isDirty2(parsedRight))&&status.dirty(),{status:status.value,value:merged.data}):(addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_intersection_types}),INVALID2)};return ctx.common.async?Promise.all([this._def.left._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseAsync({data:ctx.data,path:ctx.path,parent:ctx})]).then(([left,right])=>handleParsed(left,right)):handleParsed(this._def.left._parseSync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseSync({data:ctx.data,path:ctx.path,parent:ctx}))}};ZodIntersection2.create=(left,right,params)=>new ZodIntersection2({left,right,typeName:ZodFirstPartyTypeKind2.ZodIntersection,...processCreateParams2(params)});var ZodTuple2=class _ZodTuple extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.array)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.array,received:ctx.parsedType}),INVALID2;if(ctx.data.length<this._def.items.length)return addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),INVALID2;!this._def.rest&&ctx.data.length>this._def.items.length&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),status.dirty());let items=[...ctx.data].map((item,itemIndex)=>{let schema=this._def.items[itemIndex]||this._def.rest;return schema?schema._parse(new ParseInputLazyPath2(ctx,item,ctx.path,itemIndex)):null}).filter(x4=>!!x4);return ctx.common.async?Promise.all(items).then(results=>ParseStatus2.mergeArray(status,results)):ParseStatus2.mergeArray(status,items)}get items(){return this._def.items}rest(rest){return new _ZodTuple({...this._def,rest})}};ZodTuple2.create=(schemas,params)=>{if(!Array.isArray(schemas))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ZodTuple2({items:schemas,typeName:ZodFirstPartyTypeKind2.ZodTuple,rest:null,...processCreateParams2(params)})};var ZodRecord2=class _ZodRecord extends ZodType2{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.object)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx.parsedType}),INVALID2;let pairs22=[],keyType=this._def.keyType,valueType=this._def.valueType;for(let key in ctx.data)pairs22.push({key:keyType._parse(new ParseInputLazyPath2(ctx,key,ctx.path,key)),value:valueType._parse(new ParseInputLazyPath2(ctx,ctx.data[key],ctx.path,key)),alwaysSet:key in ctx.data});return ctx.common.async?ParseStatus2.mergeObjectAsync(status,pairs22):ParseStatus2.mergeObjectSync(status,pairs22)}get element(){return this._def.valueType}static create(first,second,third){return second instanceof ZodType2?new _ZodRecord({keyType:first,valueType:second,typeName:ZodFirstPartyTypeKind2.ZodRecord,...processCreateParams2(third)}):new _ZodRecord({keyType:ZodString2.create(),valueType:first,typeName:ZodFirstPartyTypeKind2.ZodRecord,...processCreateParams2(second)})}},ZodMap2=class extends ZodType2{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.map)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.map,received:ctx.parsedType}),INVALID2;let keyType=this._def.keyType,valueType=this._def.valueType,pairs22=[...ctx.data.entries()].map(([key,value],index)=>({key:keyType._parse(new ParseInputLazyPath2(ctx,key,ctx.path,[index,"key"])),value:valueType._parse(new ParseInputLazyPath2(ctx,value,ctx.path,[index,"value"]))}));if(ctx.common.async){let finalMap=new Map;return Promise.resolve().then(async()=>{for(let pair of pairs22){let key=await pair.key,value=await pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID2;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}})}else{let finalMap=new Map;for(let pair of pairs22){let key=pair.key,value=pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID2;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}}}};ZodMap2.create=(keyType,valueType,params)=>new ZodMap2({valueType,keyType,typeName:ZodFirstPartyTypeKind2.ZodMap,...processCreateParams2(params)});var ZodSet2=class _ZodSet extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.set)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.set,received:ctx.parsedType}),INVALID2;let def=this._def;def.minSize!==null&&ctx.data.size<def.minSize.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:def.minSize.value,type:"set",inclusive:!0,exact:!1,message:def.minSize.message}),status.dirty()),def.maxSize!==null&&ctx.data.size>def.maxSize.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:def.maxSize.value,type:"set",inclusive:!0,exact:!1,message:def.maxSize.message}),status.dirty());let valueType=this._def.valueType;function finalizeSet(elements2){let parsedSet=new Set;for(let element of elements2){if(element.status==="aborted")return INVALID2;element.status==="dirty"&&status.dirty(),parsedSet.add(element.value)}return{status:status.value,value:parsedSet}}let elements=[...ctx.data.values()].map((item,i3)=>valueType._parse(new ParseInputLazyPath2(ctx,item,ctx.path,i3)));return ctx.common.async?Promise.all(elements).then(elements2=>finalizeSet(elements2)):finalizeSet(elements)}min(minSize,message){return new _ZodSet({...this._def,minSize:{value:minSize,message:errorUtil2.toString(message)}})}max(maxSize,message){return new _ZodSet({...this._def,maxSize:{value:maxSize,message:errorUtil2.toString(message)}})}size(size22,message){return this.min(size22,message).max(size22,message)}nonempty(message){return this.min(1,message)}};ZodSet2.create=(valueType,params)=>new ZodSet2({valueType,minSize:null,maxSize:null,typeName:ZodFirstPartyTypeKind2.ZodSet,...processCreateParams2(params)});var ZodFunction2=class _ZodFunction extends ZodType2{constructor(){super(...arguments),this.validate=this.implement}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.function)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.function,received:ctx.parsedType}),INVALID2;function makeArgsIssue(args,error2){return makeIssue2({data:args,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap2(),en_default2].filter(x4=>!!x4),issueData:{code:ZodIssueCode2.invalid_arguments,argumentsError:error2}})}function makeReturnsIssue(returns,error2){return makeIssue2({data:returns,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap2(),en_default2].filter(x4=>!!x4),issueData:{code:ZodIssueCode2.invalid_return_type,returnTypeError:error2}})}let params={errorMap:ctx.common.contextualErrorMap},fn3=ctx.data;if(this._def.returns instanceof ZodPromise2){let me3=this;return OK2(async function(...args){let error2=new ZodError2([]),parsedArgs=await me3._def.args.parseAsync(args,params).catch(e5=>{throw error2.addIssue(makeArgsIssue(args,e5)),error2}),result=await Reflect.apply(fn3,this,parsedArgs);return await me3._def.returns._def.type.parseAsync(result,params).catch(e5=>{throw error2.addIssue(makeReturnsIssue(result,e5)),error2})})}else{let me3=this;return OK2(function(...args){let parsedArgs=me3._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError2([makeArgsIssue(args,parsedArgs.error)]);let result=Reflect.apply(fn3,this,parsedArgs.data),parsedReturns=me3._def.returns.safeParse(result,params);if(!parsedReturns.success)throw new ZodError2([makeReturnsIssue(result,parsedReturns.error)]);return parsedReturns.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...items){return new _ZodFunction({...this._def,args:ZodTuple2.create(items).rest(ZodUnknown2.create())})}returns(returnType){return new _ZodFunction({...this._def,returns:returnType})}implement(func){return this.parse(func)}strictImplement(func){return this.parse(func)}static create(args,returns,params){return new _ZodFunction({args:args||ZodTuple2.create([]).rest(ZodUnknown2.create()),returns:returns||ZodUnknown2.create(),typeName:ZodFirstPartyTypeKind2.ZodFunction,...processCreateParams2(params)})}},ZodLazy2=class extends ZodType2{get schema(){return this._def.getter()}_parse(input2){let{ctx}=this._processInputParams(input2);return this._def.getter()._parse({data:ctx.data,path:ctx.path,parent:ctx})}};ZodLazy2.create=(getter,params)=>new ZodLazy2({getter,typeName:ZodFirstPartyTypeKind2.ZodLazy,...processCreateParams2(params)});var ZodLiteral2=class extends ZodType2{_parse(input2){if(input2.data!==this._def.value){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_literal,expected:this._def.value}),INVALID2}return{status:"valid",value:input2.data}}get value(){return this._def.value}};ZodLiteral2.create=(value,params)=>new ZodLiteral2({value,typeName:ZodFirstPartyTypeKind2.ZodLiteral,...processCreateParams2(params)});function createZodEnum2(values,params){return new ZodEnum2({values,typeName:ZodFirstPartyTypeKind2.ZodEnum,...processCreateParams2(params)})}var ZodEnum2=class _ZodEnum extends ZodType2{_parse(input2){if(typeof input2.data!="string"){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext2(ctx,{expected:util2.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode2.invalid_type}),INVALID2}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(input2.data)){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_enum_value,options:expectedValues}),INVALID2}return OK2(input2.data)}get options(){return this._def.values}get enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Values(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}extract(values,newDef=this._def){return _ZodEnum.create(values,{...this._def,...newDef})}exclude(values,newDef=this._def){return _ZodEnum.create(this.options.filter(opt2=>!values.includes(opt2)),{...this._def,...newDef})}};ZodEnum2.create=createZodEnum2;var ZodNativeEnum2=class extends ZodType2{_parse(input2){let nativeEnumValues=util2.getValidEnumValues(this._def.values),ctx=this._getOrReturnCtx(input2);if(ctx.parsedType!==ZodParsedType2.string&&ctx.parsedType!==ZodParsedType2.number){let expectedValues=util2.objectValues(nativeEnumValues);return addIssueToContext2(ctx,{expected:util2.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode2.invalid_type}),INVALID2}if(this._cache||(this._cache=new Set(util2.getValidEnumValues(this._def.values))),!this._cache.has(input2.data)){let expectedValues=util2.objectValues(nativeEnumValues);return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_enum_value,options:expectedValues}),INVALID2}return OK2(input2.data)}get enum(){return this._def.values}};ZodNativeEnum2.create=(values,params)=>new ZodNativeEnum2({values,typeName:ZodFirstPartyTypeKind2.ZodNativeEnum,...processCreateParams2(params)});var ZodPromise2=class extends ZodType2{unwrap(){return this._def.type}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.promise&&ctx.common.async===!1)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.promise,received:ctx.parsedType}),INVALID2;let promisified=ctx.parsedType===ZodParsedType2.promise?ctx.data:Promise.resolve(ctx.data);return OK2(promisified.then(data=>this._def.type.parseAsync(data,{path:ctx.path,errorMap:ctx.common.contextualErrorMap})))}};ZodPromise2.create=(schema,params)=>new ZodPromise2({type:schema,typeName:ZodFirstPartyTypeKind2.ZodPromise,...processCreateParams2(params)});var ZodEffects2=class extends ZodType2{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ZodFirstPartyTypeKind2.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(input2){let{status,ctx}=this._processInputParams(input2),effect=this._def.effect||null,checkCtx={addIssue:arg=>{addIssueToContext2(ctx,arg),arg.fatal?status.abort():status.dirty()},get path(){return ctx.path}};if(checkCtx.addIssue=checkCtx.addIssue.bind(checkCtx),effect.type==="preprocess"){let processed=effect.transform(ctx.data,checkCtx);if(ctx.common.async)return Promise.resolve(processed).then(async processed2=>{if(status.value==="aborted")return INVALID2;let result=await this._def.schema._parseAsync({data:processed2,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID2:result.status==="dirty"||status.value==="dirty"?DIRTY2(result.value):result});{if(status.value==="aborted")return INVALID2;let result=this._def.schema._parseSync({data:processed,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID2:result.status==="dirty"||status.value==="dirty"?DIRTY2(result.value):result}}if(effect.type==="refinement"){let executeRefinement=acc=>{let result=effect.refinement(acc,checkCtx);if(ctx.common.async)return Promise.resolve(result);if(result instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return acc};if(ctx.common.async===!1){let inner=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});return inner.status==="aborted"?INVALID2:(inner.status==="dirty"&&status.dirty(),executeRefinement(inner.value),{status:status.value,value:inner.value})}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then(inner=>inner.status==="aborted"?INVALID2:(inner.status==="dirty"&&status.dirty(),executeRefinement(inner.value).then(()=>({status:status.value,value:inner.value}))))}if(effect.type==="transform")if(ctx.common.async===!1){let base=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(!isValid2(base))return INVALID2;let result=effect.transform(base.value,checkCtx);if(result instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:status.value,value:result}}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then(base=>isValid2(base)?Promise.resolve(effect.transform(base.value,checkCtx)).then(result=>({status:status.value,value:result})):INVALID2);util2.assertNever(effect)}};ZodEffects2.create=(schema,effect,params)=>new ZodEffects2({schema,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect,...processCreateParams2(params)});ZodEffects2.createWithPreprocess=(preprocess,schema,params)=>new ZodEffects2({schema,effect:{type:"preprocess",transform:preprocess},typeName:ZodFirstPartyTypeKind2.ZodEffects,...processCreateParams2(params)});var ZodOptional2=class extends ZodType2{_parse(input2){return this._getType(input2)===ZodParsedType2.undefined?OK2(void 0):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodOptional2.create=(type,params)=>new ZodOptional2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodOptional,...processCreateParams2(params)});var ZodNullable2=class extends ZodType2{_parse(input2){return this._getType(input2)===ZodParsedType2.null?OK2(null):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodNullable2.create=(type,params)=>new ZodNullable2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodNullable,...processCreateParams2(params)});var ZodDefault2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return ctx.parsedType===ZodParsedType2.undefined&&(data=this._def.defaultValue()),this._def.innerType._parse({data,path:ctx.path,parent:ctx})}removeDefault(){return this._def.innerType}};ZodDefault2.create=(type,params)=>new ZodDefault2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodDefault,defaultValue:typeof params.default=="function"?params.default:()=>params.default,...processCreateParams2(params)});var ZodCatch2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),newCtx={...ctx,common:{...ctx.common,issues:[]}},result=this._def.innerType._parse({data:newCtx.data,path:newCtx.path,parent:{...newCtx}});return isAsync2(result)?result.then(result2=>({status:"valid",value:result2.status==="valid"?result2.value:this._def.catchValue({get error(){return new ZodError2(newCtx.common.issues)},input:newCtx.data})})):{status:"valid",value:result.status==="valid"?result.value:this._def.catchValue({get error(){return new ZodError2(newCtx.common.issues)},input:newCtx.data})}}removeCatch(){return this._def.innerType}};ZodCatch2.create=(type,params)=>new ZodCatch2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodCatch,catchValue:typeof params.catch=="function"?params.catch:()=>params.catch,...processCreateParams2(params)});var ZodNaN2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.nan){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.nan,received:ctx.parsedType}),INVALID2}return{status:"valid",value:input2.data}}};ZodNaN2.create=params=>new ZodNaN2({typeName:ZodFirstPartyTypeKind2.ZodNaN,...processCreateParams2(params)});var BRAND2=Symbol("zod_brand"),ZodBranded2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return this._def.type._parse({data,path:ctx.path,parent:ctx})}unwrap(){return this._def.type}},ZodPipeline2=class _ZodPipeline extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.common.async)return(async()=>{let inResult=await this._def.in._parseAsync({data:ctx.data,path:ctx.path,parent:ctx});return inResult.status==="aborted"?INVALID2:inResult.status==="dirty"?(status.dirty(),DIRTY2(inResult.value)):this._def.out._parseAsync({data:inResult.value,path:ctx.path,parent:ctx})})();{let inResult=this._def.in._parseSync({data:ctx.data,path:ctx.path,parent:ctx});return inResult.status==="aborted"?INVALID2:inResult.status==="dirty"?(status.dirty(),{status:"dirty",value:inResult.value}):this._def.out._parseSync({data:inResult.value,path:ctx.path,parent:ctx})}}static create(a3,b3){return new _ZodPipeline({in:a3,out:b3,typeName:ZodFirstPartyTypeKind2.ZodPipeline})}},ZodReadonly2=class extends ZodType2{_parse(input2){let result=this._def.innerType._parse(input2),freeze=data=>(isValid2(data)&&(data.value=Object.freeze(data.value)),data);return isAsync2(result)?result.then(data=>freeze(data)):freeze(result)}unwrap(){return this._def.innerType}};ZodReadonly2.create=(type,params)=>new ZodReadonly2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodReadonly,...processCreateParams2(params)});function cleanParams2(params,data){let p4=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p4=="string"?{message:p4}:p4}function custom2(check,_params={},fatal){return check?ZodAny2.create().superRefine((data,ctx)=>{let r5=check(data);if(r5 instanceof Promise)return r5.then(r22=>{if(!r22){let params=cleanParams2(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r5){let params=cleanParams2(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}}):ZodAny2.create()}var late2={object:ZodObject2.lazycreate},ZodFirstPartyTypeKind2;(function(ZodFirstPartyTypeKind22){ZodFirstPartyTypeKind22.ZodString="ZodString",ZodFirstPartyTypeKind22.ZodNumber="ZodNumber",ZodFirstPartyTypeKind22.ZodNaN="ZodNaN",ZodFirstPartyTypeKind22.ZodBigInt="ZodBigInt",ZodFirstPartyTypeKind22.ZodBoolean="ZodBoolean",ZodFirstPartyTypeKind22.ZodDate="ZodDate",ZodFirstPartyTypeKind22.ZodSymbol="ZodSymbol",ZodFirstPartyTypeKind22.ZodUndefined="ZodUndefined",ZodFirstPartyTypeKind22.ZodNull="ZodNull",ZodFirstPartyTypeKind22.ZodAny="ZodAny",ZodFirstPartyTypeKind22.ZodUnknown="ZodUnknown",ZodFirstPartyTypeKind22.ZodNever="ZodNever",ZodFirstPartyTypeKind22.ZodVoid="ZodVoid",ZodFirstPartyTypeKind22.ZodArray="ZodArray",ZodFirstPartyTypeKind22.ZodObject="ZodObject",ZodFirstPartyTypeKind22.ZodUnion="ZodUnion",ZodFirstPartyTypeKind22.ZodDiscriminatedUnion="ZodDiscriminatedUnion",ZodFirstPartyTypeKind22.ZodIntersection="ZodIntersection",ZodFirstPartyTypeKind22.ZodTuple="ZodTuple",ZodFirstPartyTypeKind22.ZodRecord="ZodRecord",ZodFirstPartyTypeKind22.ZodMap="ZodMap",ZodFirstPartyTypeKind22.ZodSet="ZodSet",ZodFirstPartyTypeKind22.ZodFunction="ZodFunction",ZodFirstPartyTypeKind22.ZodLazy="ZodLazy",ZodFirstPartyTypeKind22.ZodLiteral="ZodLiteral",ZodFirstPartyTypeKind22.ZodEnum="ZodEnum",ZodFirstPartyTypeKind22.ZodEffects="ZodEffects",ZodFirstPartyTypeKind22.ZodNativeEnum="ZodNativeEnum",ZodFirstPartyTypeKind22.ZodOptional="ZodOptional",ZodFirstPartyTypeKind22.ZodNullable="ZodNullable",ZodFirstPartyTypeKind22.ZodDefault="ZodDefault",ZodFirstPartyTypeKind22.ZodCatch="ZodCatch",ZodFirstPartyTypeKind22.ZodPromise="ZodPromise",ZodFirstPartyTypeKind22.ZodBranded="ZodBranded",ZodFirstPartyTypeKind22.ZodPipeline="ZodPipeline",ZodFirstPartyTypeKind22.ZodReadonly="ZodReadonly"})(ZodFirstPartyTypeKind2||(ZodFirstPartyTypeKind2={}));var instanceOfType2=(cls,params={message:`Input not instance of ${cls.name}`})=>custom2(data=>data instanceof cls,params),stringType2=ZodString2.create,numberType2=ZodNumber2.create,nanType2=ZodNaN2.create,bigIntType2=ZodBigInt2.create,booleanType2=ZodBoolean2.create,dateType2=ZodDate2.create,symbolType2=ZodSymbol2.create,undefinedType2=ZodUndefined2.create,nullType2=ZodNull2.create,anyType2=ZodAny2.create,unknownType2=ZodUnknown2.create,neverType2=ZodNever2.create,voidType2=ZodVoid2.create,arrayType2=ZodArray2.create,objectType2=ZodObject2.create,strictObjectType2=ZodObject2.strictCreate,unionType2=ZodUnion2.create,discriminatedUnionType2=ZodDiscriminatedUnion2.create,intersectionType2=ZodIntersection2.create,tupleType2=ZodTuple2.create,recordType2=ZodRecord2.create,mapType2=ZodMap2.create,setType2=ZodSet2.create,functionType2=ZodFunction2.create,lazyType2=ZodLazy2.create,literalType2=ZodLiteral2.create,enumType2=ZodEnum2.create,nativeEnumType2=ZodNativeEnum2.create,promiseType2=ZodPromise2.create,effectsType2=ZodEffects2.create,optionalType2=ZodOptional2.create,nullableType2=ZodNullable2.create,preprocessType2=ZodEffects2.createWithPreprocess,pipelineType2=ZodPipeline2.create,ostring2=()=>stringType2().optional(),onumber2=()=>numberType2().optional(),oboolean2=()=>booleanType2().optional(),coerce2={string:arg=>ZodString2.create({...arg,coerce:!0}),number:arg=>ZodNumber2.create({...arg,coerce:!0}),boolean:arg=>ZodBoolean2.create({...arg,coerce:!0}),bigint:arg=>ZodBigInt2.create({...arg,coerce:!0}),date:arg=>ZodDate2.create({...arg,coerce:!0})},NEVER2=INVALID2,unitMappings2={Hz:{baseUnit:"Hz",variants:{MHz:1e6,kHz:1e3,Hz:1}},g:{baseUnit:"g",variants:{kg:1e3,g:1}},\u03A9:{baseUnit:"\u03A9",variants:{m\u03A9:.001,\u03A9:1,k\u03A9:1e3,K\u03A9:1e3,kohm:1e3,M\u03A9:1e6,G\u03A9:1e9,T\u03A9:1e12}},V:{baseUnit:"V",variants:{mV:.001,V:1,kV:1e3,KV:1e3,MV:1e6,GV:1e9,TV:1e12}},A:{baseUnit:"A",variants:{\u00B5A:1e-6,mA:.001,ma:.001,A:1,kA:1e3,MA:1e6}},F:{baseUnit:"F",variants:{pF:1e-12,nF:1e-9,\u00B5F:1e-6,uF:1e-6,mF:.001,F:1}},ml:{baseUnit:"ml",variants:{ml:1,mL:1,l:1e3,L:1e3}},deg:{baseUnit:"deg",variants:{rad:180/Math.PI}},ms:{baseUnit:"ms",variants:{fs:1e-12,ps:1e-9,ns:1e-6,us:.001,\u00B5s:.001,ms:1,s:1e3}},mm:{baseUnit:"mm",variants:{nm:1e-6,\u00B5m:.001,um:.001,mm:1,cm:10,dm:100,m:1e3,km:1e6,in:25.4,ft:304.8,IN:25.4,FT:304.8,yd:914.4,mi:1609344,mil:.0254}}},unitMappingAndVariantSuffixes2=new Set;for(let[baseUnit,info]of Object.entries(unitMappings2)){unitMappingAndVariantSuffixes2.add(baseUnit);for(let variant of Object.keys(info.variants))unitMappingAndVariantSuffixes2.add(variant)}function getBaseTscircuitUnit2(unit){for(let[baseUnit,info]of Object.entries(unitMappings2))if(unit in info.variants)return{baseUnit:info.baseUnit,conversionFactor:info.variants[unit]};return{baseUnit:unit,conversionFactor:1}}var si_prefix_multiplier2={tera:1e12,T:1e12,giga:1e9,G:1e9,mega:1e6,M:1e6,kilo:1e3,k:1e3,deci:.1,d:.1,centi:.01,c:.01,milli:.001,m:.001,micro:1e-6,u:1e-6,\u00B5:1e-6,nano:1e-9,n:1e-9,pico:1e-12,p:1e-12};function parseAndConvertSiUnit2(v4){if(v4==null)return{parsedUnit:null,unitOfValue:null,value:null};if(typeof v4=="string"&&v4.match(/^-?[\d\.]+$/))return{value:Number.parseFloat(v4),parsedUnit:null,unitOfValue:null};if(typeof v4=="number")return{value:v4,parsedUnit:null,unitOfValue:null};if(typeof v4=="object"&&"x"in v4&&"y"in v4){let{parsedUnit,unitOfValue}=parseAndConvertSiUnit2(v4.x),xResult=parseAndConvertSiUnit2(v4.x),yResult=parseAndConvertSiUnit2(v4.y);return xResult.value===null||yResult.value===null?{parsedUnit:null,unitOfValue:null,value:null}:{parsedUnit,unitOfValue,value:{x:xResult.value,y:yResult.value}}}let unit_reversed=v4.toString().split("").reverse().join("").match(/[^\d\s]+/)?.[0];if(!unit_reversed)throw new Error(`Could not determine unit: "${v4}"`);let unit=unit_reversed.split("").reverse().join(""),numberPart=v4.slice(0,-unit.length);if(unit in si_prefix_multiplier2&&!unitMappingAndVariantSuffixes2.has(unit)){let siMultiplier=si_prefix_multiplier2[unit];return{parsedUnit:null,unitOfValue:null,value:Number.parseFloat(numberPart)*siMultiplier}}let{baseUnit,conversionFactor}=getBaseTscircuitUnit2(unit);return{parsedUnit:unit,unitOfValue:baseUnit,value:conversionFactor*Number.parseFloat(numberPart)}}var resistance2=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value),capacitance2=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value).transform(value=>Number.parseFloat(value.toPrecision(12))),inductance2=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value),voltage2=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value),length3=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value),frequency2=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value),distance7=length3,current2=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value),duration_ms2=external_exports2.string().or(external_exports2.number()).transform(v4=>parseAndConvertSiUnit2(v4).value),time2=duration_ms2,ms4=duration_ms2,timestamp2=external_exports2.string().datetime(),rotation4=external_exports2.string().or(external_exports2.number()).transform(arg=>typeof arg=="number"?arg:arg.endsWith("deg")?Number.parseFloat(arg.split("deg")[0]):arg.endsWith("rad")?Number.parseFloat(arg.split("rad")[0])*180/Math.PI:Number.parseFloat(arg)),battery_capacity2=external_exports2.number().or(external_exports2.string().endsWith("mAh")).transform(v4=>{if(typeof v4=="string"){let valString=v4.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v4}).describe("Battery capacity in mAh"),expectTypesMatch3=shouldBe=>{};expectTypesMatch3("extra props b");expectTypesMatch3("missing props b");expectTypesMatch3(!0);expectTypesMatch3("mismatched prop types: a");var expectStringUnionsMatch2=shouldBe=>{};expectStringUnionsMatch2(!0);expectStringUnionsMatch2('T1 has extra: "c", T2 has extra: "d"');expectStringUnionsMatch2('T1 has extra: "c"');expectStringUnionsMatch2('T2 has extra: "c"');expectStringUnionsMatch2('T1 has extra: "d", T2 has extra: "c"');expectStringUnionsMatch2(!0);var point5=external_exports2.object({x:distance7,y:distance7}),position2=point5;expectTypesMatch3(!0);expectTypesMatch3(!0);var point33=external_exports2.object({x:distance7,y:distance7,z:distance7}),position32=point33;expectTypesMatch3(!0);var size2=external_exports2.object({width:external_exports2.number(),height:external_exports2.number()});expectTypesMatch3(!0);var randomId2=length4=>{let chars2="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";return Array.from({length:length4},()=>chars2[Math.floor(Math.random()*chars2.length)]).join("")},getZodPrefixedIdWithDefault2=prefix=>external_exports2.string().optional().default(()=>`${prefix}_${randomId2(10)}`),ninePointAnchor3=external_exports2.enum(["top_left","top_center","top_right","center_left","center","center_right","bottom_left","bottom_center","bottom_right"]);expectTypesMatch3(!0);var pcbRenderLayer2=external_exports2.enum(["top_silkscreen","bottom_silkscreen","top_copper","bottom_copper","top_soldermask","bottom_soldermask","top_fabrication_note","bottom_fabrication_note","top_user_note","bottom_user_note","top_courtyard","bottom_courtyard","inner1_copper","inner2_copper","inner3_copper","inner4_copper","inner5_copper","inner6_copper","edge_cuts","drill"]);expectTypesMatch3(!0);var asset2=external_exports2.object({project_relative_path:external_exports2.string(),url:external_exports2.string(),mimetype:external_exports2.string()});expectTypesMatch3(!0);var kicadAt3=point5.extend({rotation:rotation4.optional()});expectTypesMatch3(!0);var kicadFont3=external_exports2.object({size:point5.optional(),thickness:distance7.optional()});expectTypesMatch3(!0);var kicadEffects3=external_exports2.object({font:kicadFont3.optional()});expectTypesMatch3(!0);var kicadProperty3=external_exports2.object({value:external_exports2.string(),at:kicadAt3.optional(),layer:external_exports2.string().optional(),uuid:external_exports2.string().optional(),hide:external_exports2.boolean().optional(),effects:kicadEffects3.optional()});expectTypesMatch3(!0);var kicadFootprintProperties3=external_exports2.object({Reference:kicadProperty3.optional(),Value:kicadProperty3.optional(),Datasheet:kicadProperty3.optional(),Description:kicadProperty3.optional()});expectTypesMatch3(!0);var kicadFootprintAttributes3=external_exports2.object({through_hole:external_exports2.boolean().optional(),smd:external_exports2.boolean().optional(),exclude_from_pos_files:external_exports2.boolean().optional(),exclude_from_bom:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadFootprintPad3=external_exports2.object({name:external_exports2.string(),type:external_exports2.string(),shape:external_exports2.string().optional(),at:kicadAt3.optional(),size:point5.optional(),drill:distance7.optional(),layers:external_exports2.array(external_exports2.string()).optional(),removeUnusedLayers:external_exports2.boolean().optional(),uuid:external_exports2.string().optional()});expectTypesMatch3(!0);var kicadFootprintModel3=external_exports2.object({path:external_exports2.string(),offset:point33.optional(),scale:point33.optional(),rotate:point33.optional()});expectTypesMatch3(!0);var kicadFootprintMetadata3=external_exports2.object({footprintName:external_exports2.string().optional(),version:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),generator:external_exports2.string().optional(),generatorVersion:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),layer:external_exports2.string().optional(),properties:kicadFootprintProperties3.optional(),attributes:kicadFootprintAttributes3.optional(),pads:external_exports2.array(kicadFootprintPad3).optional(),embeddedFonts:external_exports2.boolean().optional(),model:kicadFootprintModel3.optional()});expectTypesMatch3(!0);var kicadSymbolPinNumbers3=external_exports2.object({hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolPinNames3=external_exports2.object({offset:distance7.optional(),hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolEffects3=external_exports2.object({font:kicadFont3.optional(),justify:external_exports2.union([external_exports2.string(),external_exports2.array(external_exports2.string())]).optional(),hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolProperty3=external_exports2.object({value:external_exports2.string(),id:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),at:kicadAt3.optional(),effects:kicadSymbolEffects3.optional()});expectTypesMatch3(!0);var kicadSymbolProperties3=external_exports2.object({Reference:kicadSymbolProperty3.optional(),Value:kicadSymbolProperty3.optional(),Footprint:kicadSymbolProperty3.optional(),Datasheet:kicadSymbolProperty3.optional(),Description:kicadSymbolProperty3.optional(),ki_keywords:kicadSymbolProperty3.optional(),ki_fp_filters:kicadSymbolProperty3.optional()});expectTypesMatch3(!0);var kicadSymbolMetadata3=external_exports2.object({symbolName:external_exports2.string().optional(),extends:external_exports2.string().optional(),pinNumbers:kicadSymbolPinNumbers3.optional(),pinNames:kicadSymbolPinNames3.optional(),excludeFromSim:external_exports2.boolean().optional(),inBom:external_exports2.boolean().optional(),onBoard:external_exports2.boolean().optional(),properties:kicadSymbolProperties3.optional(),embeddedFonts:external_exports2.boolean().optional()});expectTypesMatch3(!0);var base_circuit_json_error2=external_exports2.object({error_type:external_exports2.string(),message:external_exports2.string(),is_fatal:external_exports2.boolean().optional()});expectTypesMatch3(!0);var supplier_name2=external_exports2.enum(["jlcpcb","macrofab","pcbway","digikey","mouser","lcsc"]);expectTypesMatch3(!0);var source_component_base2=external_exports2.object({type:external_exports2.literal("source_component"),ftype:external_exports2.string().optional(),source_component_id:external_exports2.string(),name:external_exports2.string(),manufacturer_part_number:external_exports2.string().optional(),supplier_part_numbers:external_exports2.record(supplier_name2,external_exports2.array(external_exports2.string())).optional(),display_value:external_exports2.string().optional(),display_name:external_exports2.string().optional(),are_pins_interchangeable:external_exports2.boolean().optional(),internally_connected_source_port_ids:external_exports2.array(external_exports2.array(external_exports2.string())).optional(),source_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_capacitor2=source_component_base2.extend({ftype:external_exports2.literal("simple_capacitor"),capacitance:capacitance2,max_voltage_rating:voltage2.optional(),display_capacitance:external_exports2.string().optional(),max_decoupling_trace_length:distance7.optional()});expectTypesMatch3(!0);var source_simple_resistor2=source_component_base2.extend({ftype:external_exports2.literal("simple_resistor"),resistance:resistance2,display_resistance:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_diode2=source_component_base2.extend({ftype:external_exports2.literal("simple_diode")});expectTypesMatch3(!0);var source_simple_fiducial2=source_component_base2.extend({ftype:external_exports2.literal("simple_fiducial")});expectTypesMatch3(!0);var source_simple_led2=source_simple_diode2.extend({ftype:external_exports2.literal("simple_led"),color:external_exports2.string().optional(),wavelength:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_ground2=source_component_base2.extend({ftype:external_exports2.literal("simple_ground")});expectTypesMatch3(!0);var source_simple_chip2=source_component_base2.extend({ftype:external_exports2.literal("simple_chip")});expectTypesMatch3(!0);var source_simple_power_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_power_source"),voltage:voltage2});expectTypesMatch3(!0);var source_simple_current_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_current_source"),current:current2,frequency:frequency2.optional(),peak_to_peak_current:current2.optional(),wave_shape:external_exports2.enum(["sine","square","triangle","sawtooth","dc"]).optional().default("dc"),phase:external_exports2.number().optional(),duty_cycle:external_exports2.number().min(0).max(1).optional()});expectTypesMatch3(!0);var source_pin_attributes2=external_exports2.object({must_be_connected:external_exports2.boolean().optional(),provides_power:external_exports2.boolean().optional(),requires_power:external_exports2.boolean().optional(),provides_ground:external_exports2.boolean().optional(),requires_ground:external_exports2.boolean().optional(),provides_voltage:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),requires_voltage:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),do_not_connect:external_exports2.boolean().optional(),include_in_board_pinout:external_exports2.boolean().optional(),can_use_internal_pullup:external_exports2.boolean().optional(),is_using_internal_pullup:external_exports2.boolean().optional(),needs_external_pullup:external_exports2.boolean().optional(),can_use_internal_pulldown:external_exports2.boolean().optional(),is_using_internal_pulldown:external_exports2.boolean().optional(),needs_external_pulldown:external_exports2.boolean().optional(),can_use_open_drain:external_exports2.boolean().optional(),is_using_open_drain:external_exports2.boolean().optional(),can_use_push_pull:external_exports2.boolean().optional(),is_using_push_pull:external_exports2.boolean().optional(),should_have_decoupling_capacitor:external_exports2.boolean().optional(),recommended_decoupling_capacitor_capacitance:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),is_configured_for_i2c_sda:external_exports2.boolean().optional(),is_configured_for_i2c_scl:external_exports2.boolean().optional(),is_configured_for_spi_mosi:external_exports2.boolean().optional(),is_configured_for_spi_miso:external_exports2.boolean().optional(),is_configured_for_spi_sck:external_exports2.boolean().optional(),is_configured_for_spi_cs:external_exports2.boolean().optional(),is_configured_for_uart_tx:external_exports2.boolean().optional(),is_configured_for_uart_rx:external_exports2.boolean().optional(),supports_i2c_sda:external_exports2.boolean().optional(),supports_i2c_scl:external_exports2.boolean().optional(),supports_spi_mosi:external_exports2.boolean().optional(),supports_spi_miso:external_exports2.boolean().optional(),supports_spi_sck:external_exports2.boolean().optional(),supports_spi_cs:external_exports2.boolean().optional(),supports_uart_tx:external_exports2.boolean().optional(),supports_uart_rx:external_exports2.boolean().optional()});expectTypesMatch3(!0);var source_simple_fuse2=source_component_base2.extend({ftype:external_exports2.literal("simple_fuse"),current_rating_amps:external_exports2.number().describe("Nominal current in amps the fuse is rated for"),voltage_rating_volts:external_exports2.number().describe("Voltage rating in volts, e.g. \xB15V would be 5")});expectTypesMatch3(!0);var source_simple_battery2=source_component_base2.extend({ftype:external_exports2.literal("simple_battery"),capacity:battery_capacity2});expectTypesMatch3(!0);var source_simple_inductor2=source_component_base2.extend({ftype:external_exports2.literal("simple_inductor"),inductance:inductance2,max_current_rating:external_exports2.number().optional()});expectTypesMatch3(!0);var source_simple_push_button2=source_component_base2.extend({ftype:external_exports2.literal("simple_push_button")});expectTypesMatch3(!0);var source_simple_potentiometer2=source_component_base2.extend({ftype:external_exports2.literal("simple_potentiometer"),max_resistance:resistance2,display_max_resistance:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_crystal2=source_component_base2.extend({ftype:external_exports2.literal("simple_crystal"),frequency:external_exports2.number().describe("Frequency in Hz"),load_capacitance:external_exports2.number().optional().describe("Load capacitance in pF"),pin_variant:external_exports2.enum(["two_pin","four_pin"]).optional()});expectTypesMatch3(!0);var source_simple_pin_header2=source_component_base2.extend({ftype:external_exports2.literal("simple_pin_header"),pin_count:external_exports2.number(),gender:external_exports2.enum(["male","female"]).optional().default("male")});expectTypesMatch3(!0);var source_simple_connector2=source_component_base2.extend({ftype:external_exports2.literal("simple_connector"),standard:external_exports2.enum(["usb_c","m2"]).optional()});expectTypesMatch3(!0);var source_simple_pinout2=source_component_base2.extend({ftype:external_exports2.literal("simple_pinout")});expectTypesMatch3(!0);var source_simple_resonator2=source_component_base2.extend({ftype:external_exports2.literal("simple_resonator"),load_capacitance:capacitance2,equivalent_series_resistance:resistance2.optional(),frequency:frequency2});expectTypesMatch3(!0);var source_simple_transistor2=source_component_base2.extend({ftype:external_exports2.literal("simple_transistor"),transistor_type:external_exports2.enum(["npn","pnp"])});expectTypesMatch3(!0);var source_simple_test_point2=source_component_base2.extend({ftype:external_exports2.literal("simple_test_point"),footprint_variant:external_exports2.enum(["pad","through_hole"]).optional(),pad_shape:external_exports2.enum(["rect","circle"]).optional(),pad_diameter:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),hole_diameter:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),width:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),height:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional()});expectTypesMatch3(!0);var source_simple_mosfet2=source_component_base2.extend({ftype:external_exports2.literal("simple_mosfet"),channel_type:external_exports2.enum(["n","p"]),mosfet_mode:external_exports2.enum(["enhancement","depletion"])});expectTypesMatch3(!0);var source_simple_op_amp2=source_component_base2.extend({ftype:external_exports2.literal("simple_op_amp")});expectTypesMatch3(!0);var source_simple_switch2=source_component_base2.extend({ftype:external_exports2.literal("simple_switch")});expectTypesMatch3(!0);var source_project_metadata2=external_exports2.object({type:external_exports2.literal("source_project_metadata"),name:external_exports2.string().optional(),software_used_string:external_exports2.string().optional(),project_url:external_exports2.string().optional(),created_at:timestamp2.optional()});expectTypesMatch3(!0);var source_missing_property_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_missing_property_error"),source_missing_property_error_id:getZodPrefixedIdWithDefault2("source_missing_property_error"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_missing_property_error").default("source_missing_property_error")}).describe("The source code is missing a property");expectTypesMatch3(!0);var source_failed_to_create_component_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_failed_to_create_component_error"),source_failed_to_create_component_error_id:getZodPrefixedIdWithDefault2("source_failed_to_create_component_error"),error_type:external_exports2.literal("source_failed_to_create_component_error").default("source_failed_to_create_component_error"),component_name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),parent_source_component_id:external_exports2.string().optional(),pcb_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),schematic_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional()}).describe("Error emitted when a component fails to be constructed");expectTypesMatch3(!0);var source_invalid_component_property_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_invalid_component_property_error"),source_invalid_component_property_error_id:getZodPrefixedIdWithDefault2("source_invalid_component_property_error"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),property_value:external_exports2.unknown().optional(),expected_format:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_invalid_component_property_error").default("source_invalid_component_property_error")}).describe("The source component property is invalid");expectTypesMatch3(!0);var source_trace_not_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_trace_not_connected_error"),source_trace_not_connected_error_id:getZodPrefixedIdWithDefault2("source_trace_not_connected_error"),error_type:external_exports2.literal("source_trace_not_connected_error").default("source_trace_not_connected_error"),subcircuit_id:external_exports2.string().optional(),source_group_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),connected_source_port_ids:external_exports2.array(external_exports2.string()).optional(),selectors_not_found:external_exports2.array(external_exports2.string()).optional()}).describe("Occurs when a source trace selector does not match any ports");expectTypesMatch3(!0);var source_property_ignored_warning2=external_exports2.object({type:external_exports2.literal("source_property_ignored_warning"),source_property_ignored_warning_id:getZodPrefixedIdWithDefault2("source_property_ignored_warning"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_property_ignored_warning").default("source_property_ignored_warning"),message:external_exports2.string()}).describe("The source property was ignored");expectTypesMatch3(!0);var source_pin_missing_trace_warning2=external_exports2.object({type:external_exports2.literal("source_pin_missing_trace_warning"),source_pin_missing_trace_warning_id:getZodPrefixedIdWithDefault2("source_pin_missing_trace_warning"),warning_type:external_exports2.literal("source_pin_missing_trace_warning").default("source_pin_missing_trace_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a source component pin is missing a trace connection");expectTypesMatch3(!0);var source_simple_voltage_probe2=source_component_base2.extend({ftype:external_exports2.literal("simple_voltage_probe")});expectTypesMatch3(!0);var source_interconnect2=source_component_base2.extend({ftype:external_exports2.literal("interconnect")});expectTypesMatch3(!0);var source_i2c_misconfigured_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_i2c_misconfigured_error"),source_i2c_misconfigured_error_id:getZodPrefixedIdWithDefault2("source_i2c_misconfigured_error"),error_type:external_exports2.literal("source_i2c_misconfigured_error").default("source_i2c_misconfigured_error"),source_port_ids:external_exports2.array(external_exports2.string())}).describe("Error emitted when incompatible I2C pins (e.g. SDA and SCL) are connected to the same net");expectTypesMatch3(!0);var source_simple_voltage_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_voltage_source"),voltage:voltage2,frequency:frequency2.optional(),peak_to_peak_voltage:voltage2.optional(),wave_shape:external_exports2.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation4.optional(),duty_cycle:external_exports2.number().optional().describe("Duty cycle as a fraction (0 to 1)")});expectTypesMatch3(!0);var any_source_component2=external_exports2.union([source_simple_resistor2,source_simple_capacitor2,source_simple_diode2,source_simple_fiducial2,source_simple_led2,source_simple_ground2,source_simple_chip2,source_simple_power_source2,source_simple_current_source2,source_simple_battery2,source_simple_inductor2,source_simple_push_button2,source_simple_potentiometer2,source_simple_crystal2,source_simple_pin_header2,source_simple_connector2,source_simple_pinout2,source_simple_resonator2,source_simple_switch2,source_simple_transistor2,source_simple_test_point2,source_simple_mosfet2,source_simple_op_amp2,source_simple_fuse2,source_simple_voltage_probe2,source_interconnect2,source_simple_voltage_source2,source_project_metadata2,source_missing_property_error2,source_invalid_component_property_error2,source_failed_to_create_component_error2,source_trace_not_connected_error2,source_property_ignored_warning2,source_pin_missing_trace_warning2,source_i2c_misconfigured_error2]);expectTypesMatch3(!0);var source_port2=external_exports2.object({type:external_exports2.literal("source_port"),pin_number:external_exports2.number().optional(),port_hints:external_exports2.array(external_exports2.string()).optional(),name:external_exports2.string(),source_port_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),source_group_id:external_exports2.string().optional(),most_frequently_referenced_by_name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()}).merge(source_pin_attributes2);expectTypesMatch3(!0);var source_component_internal_connection2=external_exports2.object({type:external_exports2.literal("source_component_internal_connection"),source_component_internal_connection_id:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var source_trace2=external_exports2.object({type:external_exports2.literal("source_trace"),source_trace_id:external_exports2.string(),connected_source_port_ids:external_exports2.array(external_exports2.string()),connected_source_net_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),max_length:external_exports2.number().optional(),min_trace_thickness:external_exports2.number().optional(),display_name:external_exports2.string().optional()});expectTypesMatch3(!0);var source_group2=external_exports2.object({type:external_exports2.literal("source_group"),source_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),parent_subcircuit_id:external_exports2.string().optional(),parent_source_group_id:external_exports2.string().optional(),is_subcircuit:external_exports2.boolean().optional(),show_as_schematic_box:external_exports2.boolean().optional(),name:external_exports2.string().optional(),was_automatically_named:external_exports2.boolean().optional()});expectTypesMatch3(!0);var source_net2=external_exports2.object({type:external_exports2.literal("source_net"),source_net_id:external_exports2.string(),name:external_exports2.string(),member_source_group_ids:external_exports2.array(external_exports2.string()),is_power:external_exports2.boolean().optional(),is_ground:external_exports2.boolean().optional(),is_digital_signal:external_exports2.boolean().optional(),is_analog_signal:external_exports2.boolean().optional(),is_positive_voltage_source:external_exports2.boolean().optional(),trace_width:external_exports2.number().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()});expectTypesMatch3(!0);var source_board2=external_exports2.object({type:external_exports2.literal("source_board"),source_board_id:external_exports2.string(),source_group_id:external_exports2.string(),title:external_exports2.string().optional()}).describe("Defines a board in the source domain");expectTypesMatch3(!0);var source_ambiguous_port_reference2=base_circuit_json_error2.extend({type:external_exports2.literal("source_ambiguous_port_reference"),source_ambiguous_port_reference_id:getZodPrefixedIdWithDefault2("source_ambiguous_port_reference"),error_type:external_exports2.literal("source_ambiguous_port_reference").default("source_ambiguous_port_reference"),source_port_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional()}).describe("Error emitted when a port hint matches multiple non-overlapping pads, making the port reference ambiguous");expectTypesMatch3(!0);var source_pcb_ground_plane2=external_exports2.object({type:external_exports2.literal("source_pcb_ground_plane"),source_pcb_ground_plane_id:external_exports2.string(),source_group_id:external_exports2.string(),source_net_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a ground plane in the source domain");expectTypesMatch3(!0);var all_layers2=["top","bottom","inner1","inner2","inner3","inner4","inner5","inner6"],layer_string2=external_exports2.enum(all_layers2),layer_ref2=layer_string2.or(external_exports2.object({name:layer_string2})).transform(layer=>typeof layer=="string"?layer:layer.name);expectTypesMatch3(!0);var visible_layer2=external_exports2.enum(["top","bottom"]),source_manually_placed_via2=external_exports2.object({type:external_exports2.literal("source_manually_placed_via"),source_manually_placed_via_id:external_exports2.string(),source_group_id:external_exports2.string(),source_net_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional()}).describe("Defines a via that is manually placed in the source domain");expectTypesMatch3(!0);var source_no_power_pin_defined_warning2=external_exports2.object({type:external_exports2.literal("source_no_power_pin_defined_warning"),source_no_power_pin_defined_warning_id:getZodPrefixedIdWithDefault2("source_no_power_pin_defined_warning"),warning_type:external_exports2.literal("source_no_power_pin_defined_warning").default("source_no_power_pin_defined_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a chip has no source ports with requires_power=true");expectTypesMatch3(!0);var source_no_ground_pin_defined_warning2=external_exports2.object({type:external_exports2.literal("source_no_ground_pin_defined_warning"),source_no_ground_pin_defined_warning_id:getZodPrefixedIdWithDefault2("source_no_ground_pin_defined_warning"),warning_type:external_exports2.literal("source_no_ground_pin_defined_warning").default("source_no_ground_pin_defined_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a chip has no source ports marked as ground pins");expectTypesMatch3(!0);var source_component_pins_underspecified_warning2=external_exports2.object({type:external_exports2.literal("source_component_pins_underspecified_warning"),source_component_pins_underspecified_warning_id:getZodPrefixedIdWithDefault2("source_component_pins_underspecified_warning"),warning_type:external_exports2.literal("source_component_pins_underspecified_warning").default("source_component_pins_underspecified_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when all ports on a source component are underspecified");expectTypesMatch3(!0);var source_pin_must_be_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_pin_must_be_connected_error"),source_pin_must_be_connected_error_id:getZodPrefixedIdWithDefault2("source_pin_must_be_connected_error"),error_type:external_exports2.literal("source_pin_must_be_connected_error").default("source_pin_must_be_connected_error"),source_component_id:external_exports2.string(),source_port_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a pin with mustBeConnected attribute is not connected to any trace");expectTypesMatch3(!0);var unknown_error_finding_part2=base_circuit_json_error2.extend({type:external_exports2.literal("unknown_error_finding_part"),unknown_error_finding_part_id:getZodPrefixedIdWithDefault2("unknown_error_finding_part"),error_type:external_exports2.literal("unknown_error_finding_part").default("unknown_error_finding_part"),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when an unexpected error occurs while finding a part");expectTypesMatch3(!0);var schematic_box2=external_exports2.object({type:external_exports2.literal("schematic_box"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),width:distance7,height:distance7,is_dashed:external_exports2.boolean().default(!1),x:distance7,y:distance7,subcircuit_id:external_exports2.string().optional()}).describe("Draws a box on the schematic");expectTypesMatch3(!0);var schematic_path2=external_exports2.object({type:external_exports2.literal("schematic_path"),schematic_path_id:getZodPrefixedIdWithDefault2("schematic_path"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),fill_color:external_exports2.string().optional(),is_filled:external_exports2.boolean().optional(),stroke_width:distance7.nullable().optional(),stroke_color:external_exports2.string().optional(),points:external_exports2.array(point5),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_pin_styles2=external_exports2.record(external_exports2.object({left_margin:length3.optional(),right_margin:length3.optional(),top_margin:length3.optional(),bottom_margin:length3.optional()})),schematic_component_port_arrangement_by_size2=external_exports2.object({left_size:external_exports2.number(),right_size:external_exports2.number(),top_size:external_exports2.number().optional(),bottom_size:external_exports2.number().optional()});expectTypesMatch3(!0);var schematic_component_port_arrangement_by_sides2=external_exports2.object({left_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),right_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),top_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["left-to-right","right-to-left"]).optional()}).optional(),bottom_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["left-to-right","right-to-left"]).optional()}).optional()});expectTypesMatch3(!0);var port_arrangement2=external_exports2.union([schematic_component_port_arrangement_by_size2,schematic_component_port_arrangement_by_sides2]),schematic_component2=external_exports2.object({type:external_exports2.literal("schematic_component"),size:size2,center:point5,source_component_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string(),schematic_symbol_id:external_exports2.string().optional(),pin_spacing:length3.optional(),pin_styles:schematic_pin_styles2.optional(),box_width:length3.optional(),symbol_name:external_exports2.string().optional(),port_arrangement:port_arrangement2.optional(),port_labels:external_exports2.record(external_exports2.string()).optional(),symbol_display_value:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),schematic_group_id:external_exports2.string().optional(),is_schematic_group:external_exports2.boolean().optional(),source_group_id:external_exports2.string().optional(),is_box_with_pins:external_exports2.boolean().optional().default(!0)});expectTypesMatch3(!0);var schematicSymbolMetadata2=external_exports2.object({kicad_symbol:kicadSymbolMetadata3.optional()}).catchall(external_exports2.unknown()),schematic_symbol2=external_exports2.object({type:external_exports2.literal("schematic_symbol"),schematic_symbol_id:external_exports2.string(),name:external_exports2.string().optional(),metadata:schematicSymbolMetadata2.optional()}).describe("Defines a named schematic symbol that can be referenced by components.");expectTypesMatch3(!0);var schematic_line2=external_exports2.object({type:external_exports2.literal("schematic_line"),schematic_line_id:getZodPrefixedIdWithDefault2("schematic_line"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),x1:distance7,y1:distance7,x2:distance7,y2:distance7,stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled line on the schematic");expectTypesMatch3(!0);var schematic_rect2=external_exports2.object({type:external_exports2.literal("schematic_rect"),schematic_rect_id:getZodPrefixedIdWithDefault2("schematic_rect"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,rotation:rotation4.default(0),stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_filled:external_exports2.boolean().default(!1),fill_color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled rectangle on the schematic");expectTypesMatch3(!0);var schematic_circle2=external_exports2.object({type:external_exports2.literal("schematic_circle"),schematic_circle_id:getZodPrefixedIdWithDefault2("schematic_circle"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,radius:distance7,stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_filled:external_exports2.boolean().default(!1),fill_color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled circle on the schematic");expectTypesMatch3(!0);var schematic_arc2=external_exports2.object({type:external_exports2.literal("schematic_arc"),schematic_arc_id:getZodPrefixedIdWithDefault2("schematic_arc"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,radius:distance7,start_angle_degrees:rotation4,end_angle_degrees:rotation4,direction:external_exports2.enum(["clockwise","counterclockwise"]).default("counterclockwise"),stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled arc on the schematic");expectTypesMatch3(!0);var schematic_trace2=external_exports2.object({type:external_exports2.literal("schematic_trace"),schematic_trace_id:external_exports2.string(),source_trace_id:external_exports2.string().optional(),junctions:external_exports2.array(external_exports2.object({x:external_exports2.number(),y:external_exports2.number()})),edges:external_exports2.array(external_exports2.object({from:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),to:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),is_crossing:external_exports2.boolean().optional(),from_schematic_port_id:external_exports2.string().optional(),to_schematic_port_id:external_exports2.string().optional()})),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()});expectTypesMatch3(!0);var fivePointAnchor3=external_exports2.enum(["center","left","right","top","bottom"]);expectTypesMatch3(!0);var schematic_text2=external_exports2.object({type:external_exports2.literal("schematic_text"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),schematic_text_id:external_exports2.string(),text:external_exports2.string(),font_size:external_exports2.number().default(.18),position:external_exports2.object({x:distance7,y:distance7}),rotation:external_exports2.number().default(0),anchor:external_exports2.union([fivePointAnchor3.describe("legacy"),ninePointAnchor3]).default("center"),color:external_exports2.string().default("#000000"),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_port2=external_exports2.object({type:external_exports2.literal("schematic_port"),schematic_port_id:external_exports2.string(),source_port_id:external_exports2.string(),schematic_component_id:external_exports2.string().optional(),center:point5,facing_direction:external_exports2.enum(["up","down","left","right"]).optional(),distance_from_component_edge:external_exports2.number().optional(),side_of_component:external_exports2.enum(["top","bottom","left","right"]).optional(),true_ccw_index:external_exports2.number().optional(),pin_number:external_exports2.number().optional(),display_pin_label:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),is_connected:external_exports2.boolean().optional(),has_input_arrow:external_exports2.boolean().optional(),has_output_arrow:external_exports2.boolean().optional(),is_drawn_with_inversion_circle:external_exports2.boolean().optional()}).describe("Defines a port on a schematic component");expectTypesMatch3(!0);var schematic_net_label2=external_exports2.object({type:external_exports2.literal("schematic_net_label"),schematic_net_label_id:getZodPrefixedIdWithDefault2("schematic_net_label"),schematic_trace_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),source_net_id:external_exports2.string(),center:point5,anchor_position:point5.optional(),anchor_side:external_exports2.enum(["top","bottom","left","right"]),text:external_exports2.string(),symbol_name:external_exports2.string().optional(),is_movable:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_error2=base_circuit_json_error2.extend({type:external_exports2.literal("schematic_error"),schematic_error_id:external_exports2.string(),error_type:external_exports2.literal("schematic_port_not_found").default("schematic_port_not_found"),subcircuit_id:external_exports2.string().optional()}).describe("Defines a schematic error on the schematic");expectTypesMatch3(!0);var schematic_layout_error2=base_circuit_json_error2.extend({type:external_exports2.literal("schematic_layout_error"),schematic_layout_error_id:getZodPrefixedIdWithDefault2("schematic_layout_error"),error_type:external_exports2.literal("schematic_layout_error").default("schematic_layout_error"),source_group_id:external_exports2.string(),schematic_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when schematic layout fails for a group");expectTypesMatch3(!0);var schematic_debug_object_base2=external_exports2.object({type:external_exports2.literal("schematic_debug_object"),label:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}),schematic_debug_rect2=schematic_debug_object_base2.extend({shape:external_exports2.literal("rect"),center:point5,size:size2}),schematic_debug_line2=schematic_debug_object_base2.extend({shape:external_exports2.literal("line"),start:point5,end:point5}),schematic_debug_point2=schematic_debug_object_base2.extend({shape:external_exports2.literal("point"),center:point5}),schematic_debug_object2=external_exports2.discriminatedUnion("shape",[schematic_debug_rect2,schematic_debug_line2,schematic_debug_point2]);expectTypesMatch3(!0);var schematic_voltage_probe2=external_exports2.object({type:external_exports2.literal("schematic_voltage_probe"),schematic_voltage_probe_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),position:point5,schematic_trace_id:external_exports2.string(),voltage:voltage2.optional(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional(),label_alignment:ninePointAnchor3.optional()}).describe("Defines a voltage probe measurement point on a schematic trace");expectTypesMatch3(!0);var schematic_manual_edit_conflict_warning2=external_exports2.object({type:external_exports2.literal("schematic_manual_edit_conflict_warning"),schematic_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault2("schematic_manual_edit_conflict_warning"),warning_type:external_exports2.literal("schematic_manual_edit_conflict_warning").default("schematic_manual_edit_conflict_warning"),message:external_exports2.string(),schematic_component_id:external_exports2.string(),schematic_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string()}).describe("Warning emitted when a component has both manual placement and explicit schX/schY coordinates");expectTypesMatch3(!0);var schematic_group2=external_exports2.object({type:external_exports2.literal("schematic_group"),schematic_group_id:getZodPrefixedIdWithDefault2("schematic_group"),source_group_id:external_exports2.string(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),width:length3,height:length3,center:point5,schematic_component_ids:external_exports2.array(external_exports2.string()),show_as_schematic_box:external_exports2.boolean().optional(),name:external_exports2.string().optional(),description:external_exports2.string().optional()}).describe("Defines a group of components on the schematic");expectTypesMatch3(!0);var schematic_table2=external_exports2.object({type:external_exports2.literal("schematic_table"),schematic_table_id:getZodPrefixedIdWithDefault2("schematic_table"),anchor_position:point5,column_widths:external_exports2.array(distance7),row_heights:external_exports2.array(distance7),cell_padding:distance7.optional(),border_width:distance7.optional(),subcircuit_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),anchor:ninePointAnchor3.optional()}).describe("Defines a table on the schematic");expectTypesMatch3(!0);var schematic_table_cell2=external_exports2.object({type:external_exports2.literal("schematic_table_cell"),schematic_table_cell_id:getZodPrefixedIdWithDefault2("schematic_table_cell"),schematic_table_id:external_exports2.string(),start_row_index:external_exports2.number(),end_row_index:external_exports2.number(),start_column_index:external_exports2.number(),end_column_index:external_exports2.number(),text:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,horizontal_align:external_exports2.enum(["left","center","right"]).optional(),vertical_align:external_exports2.enum(["top","middle","bottom"]).optional(),font_size:distance7.optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a cell within a schematic_table");expectTypesMatch3(!0);var schematic_sheet2=external_exports2.object({type:external_exports2.literal("schematic_sheet"),schematic_sheet_id:getZodPrefixedIdWithDefault2("schematic_sheet"),name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a schematic sheet or page that components can be placed on");expectTypesMatch3(!0);var point_with_bulge2=external_exports2.object({x:distance7,y:distance7,bulge:external_exports2.number().optional()});expectTypesMatch3(!0);var ring2=external_exports2.object({vertices:external_exports2.array(point_with_bulge2)});expectTypesMatch3(!0);var brep_shape2=external_exports2.object({outer_ring:ring2,inner_rings:external_exports2.array(ring2).default([])});expectTypesMatch3(!0);var pcb_route_hint2=external_exports2.object({x:distance7,y:distance7,via:external_exports2.boolean().optional(),via_to_layer:layer_ref2.optional()}),pcb_route_hints2=external_exports2.array(pcb_route_hint2);expectTypesMatch3(!0);expectTypesMatch3(!0);var route_hint_point2=external_exports2.object({x:distance7,y:distance7,via:external_exports2.boolean().optional(),to_layer:layer_ref2.optional(),trace_width:distance7.optional()});expectTypesMatch3(!0);var pcb_component2=external_exports2.object({type:external_exports2.literal("pcb_component"),pcb_component_id:getZodPrefixedIdWithDefault2("pcb_component"),source_component_id:external_exports2.string(),center:point5,layer:layer_ref2,rotation:rotation4,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this part, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this part, usually corresponding with how the user specified it"),width:length3,height:length3,do_not_place:external_exports2.boolean().optional(),is_allowed_to_be_off_board:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),position_mode:external_exports2.enum(["packed","relative_to_group_anchor","relative_to_another_component","none"]).optional(),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.optional(),positioned_relative_to_pcb_group_id:external_exports2.string().optional(),positioned_relative_to_pcb_board_id:external_exports2.string().optional(),cable_insertion_center:point5.optional(),metadata:external_exports2.object({kicad_footprint:kicadFootprintMetadata3.optional()}).optional(),obstructs_within_bounds:external_exports2.boolean().default(!0).describe("Does this component take up all the space within its bounds on a layer. This is generally true except for when separated pin headers are being represented by a single component (in which case, chips can be placed between the pin headers) or for tall modules where chips fit underneath")}).describe("Defines a component on the PCB");expectTypesMatch3(!0);var pcb_hole_circle2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("circle"),hole_diameter:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_circle_shape2=pcb_hole_circle2.describe("Defines a circular hole on the PCB");expectTypesMatch3(!0);var pcb_hole_rect2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_rect_shape2=pcb_hole_rect2.describe("Defines a rectangular (square-capable) hole on the PCB. Use equal width/height for square.");expectTypesMatch3(!0);var pcb_hole_circle_or_square2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.enum(["circle","square"]),hole_diameter:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_circle_or_square_shape2=pcb_hole_circle_or_square2.describe("Defines a circular or square hole on the PCB");expectTypesMatch3(!0);var pcb_hole_oval2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("oval"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_oval_shape2=pcb_hole_oval2.describe("Defines an oval hole on the PCB");expectTypesMatch3(!0);var pcb_hole_pill2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("pill"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_pill_shape2=pcb_hole_pill2.describe("Defines a pill-shaped hole on the PCB");expectTypesMatch3(!0);var pcb_hole_rotated_pill2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rotated_pill"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,ccw_rotation:rotation4,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_rotated_pill_shape2=pcb_hole_rotated_pill2.describe("Defines a rotated pill-shaped hole on the PCB");expectTypesMatch3(!0);var pcb_hole2=pcb_hole_circle_or_square2.or(pcb_hole_oval2).or(pcb_hole_pill2).or(pcb_hole_rotated_pill2).or(pcb_hole_circle2).or(pcb_hole_rect2),pcb_plated_hole_circle2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("circle"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),outer_diameter:external_exports2.number(),hole_diameter:external_exports2.number(),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_plated_hole_oval2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.enum(["oval","pill"]),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),outer_width:external_exports2.number(),outer_height:external_exports2.number(),hole_width:external_exports2.number(),hole_height:external_exports2.number(),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,ccw_rotation:rotation4,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_circular_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("circular_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("circle"),pad_shape:external_exports2.literal("rect"),hole_diameter:external_exports2.number(),rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional(),rect_ccw_rotation:rotation4.optional()}),pcb_pill_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("pill_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("pill"),pad_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_rotated_pill_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("rotated_pill_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rotated_pill"),pad_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),hole_ccw_rotation:rotation4,rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),rect_ccw_rotation:rotation4,hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_hole_with_polygon_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("hole_with_polygon_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.enum(["circle","oval","pill","rotated_pill"]),hole_diameter:external_exports2.number().optional(),hole_width:external_exports2.number().optional(),hole_height:external_exports2.number().optional(),pad_outline:external_exports2.array(external_exports2.object({x:distance7,y:distance7})).min(3),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional(),ccw_rotation:rotation4.optional()}),pcb_plated_hole2=external_exports2.union([pcb_plated_hole_circle2,pcb_plated_hole_oval2,pcb_circular_hole_with_rect_pad2,pcb_pill_hole_with_rect_pad2,pcb_rotated_pill_hole_with_rect_pad2,pcb_hole_with_polygon_pad2]);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_port2=external_exports2.object({type:external_exports2.literal("pcb_port"),pcb_port_id:getZodPrefixedIdWithDefault2("pcb_port"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_port_id:external_exports2.string(),pcb_component_id:external_exports2.string().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),is_board_pinout:external_exports2.boolean().optional()}).describe("Defines a port on the PCB");expectTypesMatch3(!0);var pcb_smtpad_circle2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("circle"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,radius:external_exports2.number(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_rect2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),corner_radius:external_exports2.number().optional(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional(),soldermask_margin_left:external_exports2.number().optional(),soldermask_margin_top:external_exports2.number().optional(),soldermask_margin_right:external_exports2.number().optional(),soldermask_margin_bottom:external_exports2.number().optional()}),pcb_smtpad_rotated_rect2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rotated_rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),corner_radius:external_exports2.number().optional(),ccw_rotation:rotation4,layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional(),soldermask_margin_left:external_exports2.number().optional(),soldermask_margin_top:external_exports2.number().optional(),soldermask_margin_right:external_exports2.number().optional(),soldermask_margin_bottom:external_exports2.number().optional()}),pcb_smtpad_pill2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_rotated_pill2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rotated_pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),ccw_rotation:rotation4,layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_polygon2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("polygon"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),points:external_exports2.array(point5),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad2=external_exports2.discriminatedUnion("shape",[pcb_smtpad_circle2,pcb_smtpad_rect2,pcb_smtpad_rotated_rect2,pcb_smtpad_rotated_pill2,pcb_smtpad_pill2,pcb_smtpad_polygon2]).describe("Defines an SMT pad on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_solder_paste_circle2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("circle"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,radius:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_rect2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_pill2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("pill"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_rotated_rect2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("rotated_rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),ccw_rotation:distance7,layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_oval2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("oval"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste2=external_exports2.union([pcb_solder_paste_circle2,pcb_solder_paste_rect2,pcb_solder_paste_pill2,pcb_solder_paste_rotated_rect2,pcb_solder_paste_oval2]).describe("Defines solderpaste on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_text2=external_exports2.object({type:external_exports2.literal("pcb_text"),pcb_text_id:getZodPrefixedIdWithDefault2("pcb_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),text:external_exports2.string(),center:point5,layer:layer_ref2,width:length3,height:length3,lines:external_exports2.number(),align:external_exports2.enum(["bottom-left"])}).describe("Defines text on the PCB");expectTypesMatch3(!0);var pcb_trace_route_point_wire2=external_exports2.object({route_type:external_exports2.literal("wire"),x:distance7,y:distance7,width:distance7,copper_pour_id:external_exports2.string().optional(),is_inside_copper_pour:external_exports2.boolean().optional(),start_pcb_port_id:external_exports2.string().optional(),end_pcb_port_id:external_exports2.string().optional(),layer:layer_ref2}),pcb_trace_route_point_via2=external_exports2.object({route_type:external_exports2.literal("via"),x:distance7,y:distance7,copper_pour_id:external_exports2.string().optional(),is_inside_copper_pour:external_exports2.boolean().optional(),hole_diameter:distance7.optional(),outer_diameter:distance7.optional(),from_layer:external_exports2.string(),to_layer:external_exports2.string()}),pcb_trace_route_point2=external_exports2.union([pcb_trace_route_point_wire2,pcb_trace_route_point_via2]),pcb_trace2=external_exports2.object({type:external_exports2.literal("pcb_trace"),source_trace_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),pcb_trace_id:getZodPrefixedIdWithDefault2("pcb_trace"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),route_thickness_mode:external_exports2.enum(["constant","interpolated"]).default("constant").optional(),route_order_index:external_exports2.number().optional(),should_round_corners:external_exports2.boolean().optional(),trace_length:external_exports2.number().optional(),highlight_color:external_exports2.string().optional(),route:external_exports2.array(pcb_trace_route_point2)}).describe("Defines a trace on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_trace_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_trace_error"),pcb_trace_error_id:getZodPrefixedIdWithDefault2("pcb_trace_error"),error_type:external_exports2.literal("pcb_trace_error").default("pcb_trace_error"),center:point5.optional(),pcb_trace_id:external_exports2.string(),source_trace_id:external_exports2.string(),pcb_component_ids:external_exports2.array(external_exports2.string()),pcb_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines a trace error on the PCB");expectTypesMatch3(!0);var pcb_trace_missing_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_trace_missing_error"),pcb_trace_missing_error_id:getZodPrefixedIdWithDefault2("pcb_trace_missing_error"),error_type:external_exports2.literal("pcb_trace_missing_error").default("pcb_trace_missing_error"),center:point5.optional(),source_trace_id:external_exports2.string(),pcb_component_ids:external_exports2.array(external_exports2.string()),pcb_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines an error when a source trace has no corresponding PCB trace");expectTypesMatch3(!0);var pcb_port_not_matched_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_port_not_matched_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_port_not_matched_error").default("pcb_port_not_matched_error"),pcb_component_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines a trace error on the PCB where a port is not matched");expectTypesMatch3(!0);var pcb_port_not_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_port_not_connected_error"),pcb_port_not_connected_error_id:getZodPrefixedIdWithDefault2("pcb_port_not_connected_error"),error_type:external_exports2.literal("pcb_port_not_connected_error").default("pcb_port_not_connected_error"),pcb_port_ids:external_exports2.array(external_exports2.string()),pcb_component_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines an error when a pcb port is not connected to any trace");expectTypesMatch3(!0);var pcb_net2=external_exports2.object({type:external_exports2.literal("pcb_net"),pcb_net_id:getZodPrefixedIdWithDefault2("pcb_net"),source_net_id:external_exports2.string().optional(),highlight_color:external_exports2.string().optional()}).describe("Defines a net on the PCB");expectTypesMatch3(!0);var pcb_via2=external_exports2.object({type:external_exports2.literal("pcb_via"),pcb_via_id:getZodPrefixedIdWithDefault2("pcb_via"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),x:distance7,y:distance7,outer_diameter:distance7.default("0.6mm"),hole_diameter:distance7.default("0.25mm"),from_layer:layer_ref2.optional(),to_layer:layer_ref2.optional(),layers:external_exports2.array(layer_ref2),pcb_trace_id:external_exports2.string().optional(),net_is_assignable:external_exports2.boolean().optional(),net_assigned:external_exports2.boolean().optional(),is_tented:external_exports2.boolean().optional()}).describe("Defines a via on the PCB");expectTypesMatch3(!0);var pcb_board2=external_exports2.object({type:external_exports2.literal("pcb_board"),pcb_board_id:getZodPrefixedIdWithDefault2("pcb_board"),pcb_panel_id:external_exports2.string().optional(),carrier_pcb_board_id:external_exports2.string().optional(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),is_mounted_to_carrier_board:external_exports2.boolean().optional(),width:length3.optional(),height:length3.optional(),center:point5,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this board, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this board, usually corresponding with how the user specified it"),thickness:length3.optional().default(1.4),num_layers:external_exports2.number().optional().default(4),outline:external_exports2.array(point5).optional(),shape:external_exports2.enum(["rect","polygon"]).optional(),material:external_exports2.enum(["fr4","fr1"]).default("fr4"),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.optional(),position_mode:external_exports2.enum(["relative_to_panel_anchor","none"]).optional()}).describe("Defines the board outline of the PCB");expectTypesMatch3(!0);var pcb_panel2=external_exports2.object({type:external_exports2.literal("pcb_panel"),pcb_panel_id:getZodPrefixedIdWithDefault2("pcb_panel"),width:length3,height:length3,center:point5,covered_with_solder_mask:external_exports2.boolean().optional().default(!0)}).describe("Defines a PCB panel that can contain multiple boards");expectTypesMatch3(!0);var pcb_placement_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_placement_error"),pcb_placement_error_id:getZodPrefixedIdWithDefault2("pcb_placement_error"),error_type:external_exports2.literal("pcb_placement_error").default("pcb_placement_error"),subcircuit_id:external_exports2.string().optional()}).describe("Defines a placement error on the PCB");expectTypesMatch3(!0);var pcb_panelization_placement_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_panelization_placement_error"),pcb_panelization_placement_error_id:getZodPrefixedIdWithDefault2("pcb_panelization_placement_error"),error_type:external_exports2.literal("pcb_panelization_placement_error").default("pcb_panelization_placement_error"),pcb_panel_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a panelization placement error on the PCB");expectTypesMatch3(!0);var pcb_trace_hint2=external_exports2.object({type:external_exports2.literal("pcb_trace_hint"),pcb_trace_hint_id:getZodPrefixedIdWithDefault2("pcb_trace_hint"),pcb_port_id:external_exports2.string(),pcb_component_id:external_exports2.string(),route:external_exports2.array(route_hint_point2),subcircuit_id:external_exports2.string().optional()}).describe("A hint that can be used during generation of a PCB trace");expectTypesMatch3(!0);var pcb_silkscreen_line2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_line"),pcb_silkscreen_line_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_line"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),stroke_width:distance7.default("0.1mm"),x1:distance7,y1:distance7,x2:distance7,y2:distance7,layer:visible_layer2}).describe("Defines a silkscreen line on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_path2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_path"),pcb_silkscreen_path_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_path"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,route:external_exports2.array(point5),stroke_width:length3}).describe("Defines a silkscreen path on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_text2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_text"),pcb_silkscreen_text_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("0.2mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),is_knockout:external_exports2.boolean().default(!1).optional(),knockout_padding:external_exports2.object({left:length3,top:length3,bottom:length3,right:length3}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports2.number().optional(),layer:layer_ref2,is_mirrored:external_exports2.boolean().default(!1).optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:ninePointAnchor3.default("center")}).describe("Defines silkscreen text on the PCB");expectTypesMatch3(!0);var pcb_copper_text2=external_exports2.object({type:external_exports2.literal("pcb_copper_text"),pcb_copper_text_id:getZodPrefixedIdWithDefault2("pcb_copper_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("0.2mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),is_knockout:external_exports2.boolean().default(!1).optional(),knockout_padding:external_exports2.object({left:length3,top:length3,bottom:length3,right:length3}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports2.number().optional(),layer:layer_ref2,is_mirrored:external_exports2.boolean().default(!1).optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:ninePointAnchor3.default("center")}).describe("Defines copper text on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_rect2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_rect"),pcb_silkscreen_rect_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:layer_ref2,stroke_width:length3.default("1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().default(!0).optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),ccw_rotation:external_exports2.number().optional()}).describe("Defines a silkscreen rect on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_circle2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_circle"),pcb_silkscreen_circle_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_circle"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:length3,layer:visible_layer2,stroke_width:length3.default("1mm")}).describe("Defines a silkscreen circle on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_oval2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_oval"),pcb_silkscreen_oval_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_oval"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius_x:distance7,radius_y:distance7,layer:visible_layer2,ccw_rotation:rotation4.optional()}).describe("Defines a silkscreen oval on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_pill2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_pill"),pcb_silkscreen_pill_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_pill"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:layer_ref2,ccw_rotation:external_exports2.number().optional()}).describe("Defines a silkscreen pill on the PCB");expectTypesMatch3(!0);var pcb_fabrication_note_text2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_text"),pcb_fabrication_note_text_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_text"),subcircuit_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("1mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),layer:visible_layer2,anchor_position:point5.default({x:0,y:0}),anchor_alignment:external_exports2.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),color:external_exports2.string().optional()}).describe("Defines a fabrication note in text on the PCB, useful for leaving notes for assemblers or fabricators");expectTypesMatch3(!0);var pcb_fabrication_note_path2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_path"),pcb_fabrication_note_path_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_path"),pcb_component_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,route:external_exports2.array(point5),stroke_width:length3,color:external_exports2.string().optional()}).describe("Defines a fabrication path on the PCB for fabricators or assemblers");expectTypesMatch3(!0);var pcb_fabrication_note_rect2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_rect"),pcb_fabrication_note_rect_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:visible_layer2,stroke_width:length3.default("0.1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),color:external_exports2.string().optional()}).describe("Defines a fabrication note rectangle on the PCB");expectTypesMatch3(!0);var pcb_fabrication_note_dimension2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_dimension"),pcb_fabrication_note_dimension_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_dimension"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,from:point5,to:point5,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset:length3.optional(),offset_distance:length3.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length3.default("1mm"),color:external_exports2.string().optional(),arrow_size:length3.default("1mm")}).describe("Defines a measurement annotation within PCB fabrication notes");expectTypesMatch3(!0);var pcb_note_text2=external_exports2.object({type:external_exports2.literal("pcb_note_text"),pcb_note_text_id:getZodPrefixedIdWithDefault2("pcb_note_text"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("1mm"),text:external_exports2.string().optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:external_exports2.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),color:external_exports2.string().optional()}).describe("Defines a documentation note in text on the PCB");expectTypesMatch3(!0);var pcb_note_rect2=external_exports2.object({type:external_exports2.literal("pcb_note_rect"),pcb_note_rect_id:getZodPrefixedIdWithDefault2("pcb_note_rect"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),center:point5,width:length3,height:length3,stroke_width:length3.default("0.1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),color:external_exports2.string().optional()}).describe("Defines a rectangular documentation note on the PCB");expectTypesMatch3(!0);var pcb_note_path2=external_exports2.object({type:external_exports2.literal("pcb_note_path"),pcb_note_path_id:getZodPrefixedIdWithDefault2("pcb_note_path"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),route:external_exports2.array(point5),stroke_width:length3.default("0.1mm"),color:external_exports2.string().optional()}).describe("Defines a polyline documentation note on the PCB");expectTypesMatch3(!0);var pcb_note_line2=external_exports2.object({type:external_exports2.literal("pcb_note_line"),pcb_note_line_id:getZodPrefixedIdWithDefault2("pcb_note_line"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),x1:distance7,y1:distance7,x2:distance7,y2:distance7,stroke_width:distance7.default("0.1mm"),color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().optional()}).describe("Defines a straight documentation note line on the PCB");expectTypesMatch3(!0);var pcb_note_dimension2=external_exports2.object({type:external_exports2.literal("pcb_note_dimension"),pcb_note_dimension_id:getZodPrefixedIdWithDefault2("pcb_note_dimension"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),from:point5,to:point5,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset_distance:length3.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length3.default("1mm"),color:external_exports2.string().optional(),arrow_size:length3.default("1mm")}).describe("Defines a measurement annotation within PCB documentation notes");expectTypesMatch3(!0);var pcb_footprint_overlap_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_footprint_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_footprint_overlap_error").default("pcb_footprint_overlap_error"),pcb_smtpad_ids:external_exports2.array(external_exports2.string()).optional(),pcb_plated_hole_ids:external_exports2.array(external_exports2.string()).optional(),pcb_hole_ids:external_exports2.array(external_exports2.string()).optional(),pcb_keepout_ids:external_exports2.array(external_exports2.string()).optional()}).describe("Error emitted when a pcb footprint overlaps with another element");expectTypesMatch3(!0);var pcb_courtyard_overlap_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_courtyard_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_courtyard_overlap_error").default("pcb_courtyard_overlap_error"),pcb_component_ids:external_exports2.tuple([external_exports2.string(),external_exports2.string()])}).describe("Error emitted when the courtyard (CrtYd) of one PCB component overlaps with the courtyard of another");expectTypesMatch3(!0);var pcb_keepout2=external_exports2.object({type:external_exports2.literal("pcb_keepout"),shape:external_exports2.literal("rect"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional()}).or(external_exports2.object({type:external_exports2.literal("pcb_keepout"),shape:external_exports2.literal("circle"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional()}));expectTypesMatch3(!0);var pcb_cutout_base2=external_exports2.object({type:external_exports2.literal("pcb_cutout"),pcb_cutout_id:getZodPrefixedIdWithDefault2("pcb_cutout"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),pcb_panel_id:external_exports2.string().optional()}),pcb_cutout_rect2=pcb_cutout_base2.extend({shape:external_exports2.literal("rect"),center:point5,width:length3,height:length3,rotation:rotation4.optional(),corner_radius:length3.optional()});expectTypesMatch3(!0);var pcb_cutout_circle2=pcb_cutout_base2.extend({shape:external_exports2.literal("circle"),center:point5,radius:length3});expectTypesMatch3(!0);var pcb_cutout_polygon2=pcb_cutout_base2.extend({shape:external_exports2.literal("polygon"),points:external_exports2.array(point5)});expectTypesMatch3(!0);var pcb_cutout_path2=pcb_cutout_base2.extend({shape:external_exports2.literal("path"),route:external_exports2.array(point5),slot_width:length3,slot_length:length3.optional(),space_between_slots:length3.optional(),slot_corner_radius:length3.optional()});expectTypesMatch3(!0);var pcb_cutout2=external_exports2.discriminatedUnion("shape",[pcb_cutout_rect2,pcb_cutout_circle2,pcb_cutout_polygon2,pcb_cutout_path2]).describe("Defines a cutout on the PCB, removing board material.");expectTypesMatch3(!0);var pcb_missing_footprint_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_missing_footprint_error"),pcb_missing_footprint_error_id:getZodPrefixedIdWithDefault2("pcb_missing_footprint_error"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("pcb_missing_footprint_error").default("pcb_missing_footprint_error"),source_component_id:external_exports2.string()}).describe("Defines a missing footprint error on the PCB");expectTypesMatch3(!0);var external_footprint_load_error2=base_circuit_json_error2.extend({type:external_exports2.literal("external_footprint_load_error"),external_footprint_load_error_id:getZodPrefixedIdWithDefault2("external_footprint_load_error"),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),footprinter_string:external_exports2.string().optional(),error_type:external_exports2.literal("external_footprint_load_error").default("external_footprint_load_error")}).describe("Defines an error when an external footprint fails to load");expectTypesMatch3(!0);var circuit_json_footprint_load_error2=base_circuit_json_error2.extend({type:external_exports2.literal("circuit_json_footprint_load_error"),circuit_json_footprint_load_error_id:getZodPrefixedIdWithDefault2("circuit_json_footprint_load_error"),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("circuit_json_footprint_load_error").default("circuit_json_footprint_load_error"),circuit_json:external_exports2.array(external_exports2.any()).optional()}).describe("Defines an error when a circuit JSON footprint fails to load");expectTypesMatch3(!0);var pcb_group2=external_exports2.object({type:external_exports2.literal("pcb_group"),pcb_group_id:getZodPrefixedIdWithDefault2("pcb_group"),source_group_id:external_exports2.string(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),width:length3.optional(),height:length3.optional(),center:point5,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this group, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this group, usually corresponding with how the user specified it"),outline:external_exports2.array(point5).optional(),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.default("center"),position_mode:external_exports2.enum(["packed","relative_to_group_anchor","none"]).optional(),positioned_relative_to_pcb_group_id:external_exports2.string().optional(),positioned_relative_to_pcb_board_id:external_exports2.string().optional(),pcb_component_ids:external_exports2.array(external_exports2.string()),child_layout_mode:external_exports2.enum(["packed","none"]).optional(),name:external_exports2.string().optional(),description:external_exports2.string().optional(),layout_mode:external_exports2.string().optional(),autorouter_configuration:external_exports2.object({trace_clearance:length3}).optional(),autorouter_used_string:external_exports2.string().optional()}).describe("Defines a group of components on the PCB");expectTypesMatch3(!0);var pcb_autorouting_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_autorouting_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_autorouting_error"),error_type:external_exports2.literal("pcb_autorouting_error").default("pcb_autorouting_error"),subcircuit_id:external_exports2.string().optional()}).describe("The autorouting has failed to route a portion of the board");expectTypesMatch3(!0);var pcb_manual_edit_conflict_warning2=external_exports2.object({type:external_exports2.literal("pcb_manual_edit_conflict_warning"),pcb_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault2("pcb_manual_edit_conflict_warning"),warning_type:external_exports2.literal("pcb_manual_edit_conflict_warning").default("pcb_manual_edit_conflict_warning"),message:external_exports2.string(),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string()}).describe("Warning emitted when a component has both manual placement and explicit pcbX/pcbY coordinates");expectTypesMatch3(!0);var connectorOrientationDirection2=external_exports2.enum(["x-","x+","y+","y-"]),pcb_connector_not_in_accessible_orientation_warning2=external_exports2.object({type:external_exports2.literal("pcb_connector_not_in_accessible_orientation_warning"),pcb_connector_not_in_accessible_orientation_warning_id:getZodPrefixedIdWithDefault2("pcb_connector_not_in_accessible_orientation_warning"),warning_type:external_exports2.literal("pcb_connector_not_in_accessible_orientation_warning").default("pcb_connector_not_in_accessible_orientation_warning"),message:external_exports2.string(),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),facing_direction:connectorOrientationDirection2,recommended_facing_direction:connectorOrientationDirection2,subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a connector PCB component is facing inward toward the board and should be reoriented to an outward-facing direction");expectTypesMatch3(!0);var pcb_breakout_point2=external_exports2.object({type:external_exports2.literal("pcb_breakout_point"),pcb_breakout_point_id:getZodPrefixedIdWithDefault2("pcb_breakout_point"),pcb_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),source_port_id:external_exports2.string().optional(),source_net_id:external_exports2.string().optional(),x:distance7,y:distance7}).describe("Defines a routing target within a pcb_group for a source_trace or source_net");expectTypesMatch3(!0);var pcb_ground_plane2=external_exports2.object({type:external_exports2.literal("pcb_ground_plane"),pcb_ground_plane_id:getZodPrefixedIdWithDefault2("pcb_ground_plane"),source_pcb_ground_plane_id:external_exports2.string(),source_net_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a ground plane on the PCB");expectTypesMatch3(!0);var pcb_ground_plane_region2=external_exports2.object({type:external_exports2.literal("pcb_ground_plane_region"),pcb_ground_plane_region_id:getZodPrefixedIdWithDefault2("pcb_ground_plane_region"),pcb_ground_plane_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,points:external_exports2.array(point5)}).describe("Defines a polygon region of a ground plane");expectTypesMatch3(!0);var pcb_thermal_spoke2=external_exports2.object({type:external_exports2.literal("pcb_thermal_spoke"),pcb_thermal_spoke_id:getZodPrefixedIdWithDefault2("pcb_thermal_spoke"),pcb_ground_plane_id:external_exports2.string(),shape:external_exports2.string(),spoke_count:external_exports2.number(),spoke_thickness:distance7,spoke_inner_diameter:distance7,spoke_outer_diameter:distance7,pcb_plated_hole_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Pattern for connecting a ground plane to a plated hole");expectTypesMatch3(!0);var pcb_copper_pour_base2=external_exports2.object({type:external_exports2.literal("pcb_copper_pour"),pcb_copper_pour_id:getZodPrefixedIdWithDefault2("pcb_copper_pour"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,source_net_id:external_exports2.string().optional(),covered_with_solder_mask:external_exports2.boolean().optional().default(!0)}),pcb_copper_pour_rect2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("rect"),center:point5,width:length3,height:length3,rotation:rotation4.optional()});expectTypesMatch3(!0);var pcb_copper_pour_brep2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("brep"),brep_shape:brep_shape2});expectTypesMatch3(!0);var pcb_copper_pour_polygon2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("polygon"),points:external_exports2.array(point5)});expectTypesMatch3(!0);var pcb_copper_pour2=external_exports2.discriminatedUnion("shape",[pcb_copper_pour_rect2,pcb_copper_pour_brep2,pcb_copper_pour_polygon2]).describe("Defines a copper pour on the PCB.");expectTypesMatch3(!0);var pcb_component_outside_board_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_outside_board_error"),pcb_component_outside_board_error_id:getZodPrefixedIdWithDefault2("pcb_component_outside_board_error"),error_type:external_exports2.literal("pcb_component_outside_board_error").default("pcb_component_outside_board_error"),pcb_component_id:external_exports2.string(),pcb_board_id:external_exports2.string(),component_center:point5,component_bounds:external_exports2.object({min_x:external_exports2.number(),max_x:external_exports2.number(),min_y:external_exports2.number(),max_y:external_exports2.number()}),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional()}).describe("Error emitted when a PCB component is placed outside the board boundaries");expectTypesMatch3(!0);var pcb_component_not_on_board_edge_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_not_on_board_edge_error"),pcb_component_not_on_board_edge_error_id:getZodPrefixedIdWithDefault2("pcb_component_not_on_board_edge_error"),error_type:external_exports2.literal("pcb_component_not_on_board_edge_error").default("pcb_component_not_on_board_edge_error"),pcb_component_id:external_exports2.string(),pcb_board_id:external_exports2.string(),component_center:point5,pad_to_nearest_board_edge_distance:external_exports2.number(),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a component that must be placed on the board edge is centered away from the edge");expectTypesMatch3(!0);var pcb_component_invalid_layer_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_invalid_layer_error"),pcb_component_invalid_layer_error_id:getZodPrefixedIdWithDefault2("pcb_component_invalid_layer_error"),error_type:external_exports2.literal("pcb_component_invalid_layer_error").default("pcb_component_invalid_layer_error"),pcb_component_id:external_exports2.string().optional(),source_component_id:external_exports2.string(),layer:layer_ref2,subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a component is placed on an invalid layer (components can only be on 'top' or 'bottom' layers)");expectTypesMatch3(!0);var pcb_via_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_via_clearance_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_via_clearance_error").default("pcb_via_clearance_error"),pcb_via_ids:external_exports2.array(external_exports2.string()).min(2),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),pcb_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when vias are closer than the allowed clearance");expectTypesMatch3(!0);var pcb_courtyard_rect2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_rect"),pcb_courtyard_rect_id:getZodPrefixedIdWithDefault2("pcb_courtyard_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:visible_layer2,ccw_rotation:rotation4.optional(),color:external_exports2.string().optional()}).describe("Defines a courtyard rectangle on the PCB");expectTypesMatch3(!0);var pcb_courtyard_outline2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_outline"),pcb_courtyard_outline_id:getZodPrefixedIdWithDefault2("pcb_courtyard_outline"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,outline:external_exports2.array(point5).min(2)}).describe("Defines a courtyard outline on the PCB");expectTypesMatch3(!0);var pcb_courtyard_polygon2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_polygon"),pcb_courtyard_polygon_id:getZodPrefixedIdWithDefault2("pcb_courtyard_polygon"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,points:external_exports2.array(point5).min(3),color:external_exports2.string().optional()}).describe("Defines a courtyard polygon on the PCB");expectTypesMatch3(!0);var pcb_courtyard_circle2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_circle"),pcb_courtyard_circle_id:getZodPrefixedIdWithDefault2("pcb_courtyard_circle"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:length3,layer:visible_layer2,color:external_exports2.string().optional()}).describe("Defines a courtyard circle on the PCB");expectTypesMatch3(!0);var cad_model_formats2=["obj","stl","3mf","gltf","glb","step","wrl"],cad_model_axis_directions2=["x+","x-","y+","y-","z+","z-"],cadModelDefaultDirectionMap2={obj:"z+",stl:"z+","3mf":"z+",gltf:"y+",glb:"y+",step:"z+",wrl:"y+"},cad_component2=external_exports2.object({type:external_exports2.literal("cad_component"),cad_component_id:external_exports2.string(),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),position:point33,rotation:point33.optional(),size:point33.optional(),layer:layer_ref2.optional(),subcircuit_id:external_exports2.string().optional(),footprinter_string:external_exports2.string().optional(),model_obj_url:external_exports2.string().optional(),model_stl_url:external_exports2.string().optional(),model_3mf_url:external_exports2.string().optional(),model_gltf_url:external_exports2.string().optional(),model_glb_url:external_exports2.string().optional(),model_step_url:external_exports2.string().optional(),model_wrl_url:external_exports2.string().optional(),model_asset:asset2.optional(),model_unit_to_mm_scale_factor:external_exports2.number().optional(),model_board_normal_direction:external_exports2.enum(cad_model_axis_directions2).optional().describe(`The direction in the model's coordinate space that is considered "up" or "coming out of the board surface"`),model_origin_position:point33.optional(),model_origin_alignment:external_exports2.enum(["unknown","center","center_of_component_on_board_surface","bottom_center_of_component"]).optional(),model_object_fit:external_exports2.enum(["contain_within_bounds","fill_bounds"]).optional().default("contain_within_bounds"),model_jscad:external_exports2.any().optional(),show_as_translucent_model:external_exports2.boolean().optional(),anchor_alignment:external_exports2.enum(["center","center_of_component_on_board_surface"]).optional().default("center")}).describe("Defines a component on the PCB");expectTypesMatch3(!0);var wave_shape2=external_exports2.enum(["sinewave","square","triangle","sawtooth"]),percentage4=external_exports2.union([external_exports2.string(),external_exports2.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports2.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_voltage_source2=external_exports2.object({type:external_exports2.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault2("simulation_voltage_source"),is_dc_source:external_exports2.literal(!0).optional().default(!0),positive_source_port_id:external_exports2.string().optional(),negative_source_port_id:external_exports2.string().optional(),positive_source_net_id:external_exports2.string().optional(),negative_source_net_id:external_exports2.string().optional(),voltage:voltage2}).describe("Defines a DC voltage source for simulation"),simulation_ac_voltage_source2=external_exports2.object({type:external_exports2.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault2("simulation_voltage_source"),is_dc_source:external_exports2.literal(!1),terminal1_source_port_id:external_exports2.string().optional(),terminal2_source_port_id:external_exports2.string().optional(),terminal1_source_net_id:external_exports2.string().optional(),terminal2_source_net_id:external_exports2.string().optional(),voltage:voltage2.optional(),frequency:frequency2.optional(),peak_to_peak_voltage:voltage2.optional(),wave_shape:wave_shape2.optional(),phase:rotation4.optional(),duty_cycle:percentage4.optional()}).describe("Defines an AC voltage source for simulation"),simulation_voltage_source2=external_exports2.union([simulation_dc_voltage_source2,simulation_ac_voltage_source2]).describe("Defines a voltage source for simulation");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var percentage23=external_exports2.union([external_exports2.string(),external_exports2.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports2.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_current_source2=external_exports2.object({type:external_exports2.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault2("simulation_current_source"),is_dc_source:external_exports2.literal(!0).optional().default(!0),positive_source_port_id:external_exports2.string().optional(),negative_source_port_id:external_exports2.string().optional(),positive_source_net_id:external_exports2.string().optional(),negative_source_net_id:external_exports2.string().optional(),current:current2}).describe("Defines a DC current source for simulation"),simulation_ac_current_source2=external_exports2.object({type:external_exports2.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault2("simulation_current_source"),is_dc_source:external_exports2.literal(!1),terminal1_source_port_id:external_exports2.string().optional(),terminal2_source_port_id:external_exports2.string().optional(),terminal1_source_net_id:external_exports2.string().optional(),terminal2_source_net_id:external_exports2.string().optional(),current:current2.optional(),frequency:frequency2.optional(),peak_to_peak_current:current2.optional(),wave_shape:wave_shape2.optional(),phase:rotation4.optional(),duty_cycle:percentage23.optional()}).describe("Defines an AC current source for simulation"),simulation_current_source2=external_exports2.union([simulation_dc_current_source2,simulation_ac_current_source2]).describe("Defines a current source for simulation");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var experiment_type2=external_exports2.union([external_exports2.literal("spice_dc_sweep"),external_exports2.literal("spice_dc_operating_point"),external_exports2.literal("spice_transient_analysis"),external_exports2.literal("spice_ac_analysis")]),simulation_experiment2=external_exports2.object({type:external_exports2.literal("simulation_experiment"),simulation_experiment_id:getZodPrefixedIdWithDefault2("simulation_experiment"),name:external_exports2.string(),experiment_type:experiment_type2,time_per_step:duration_ms2.optional(),start_time_ms:ms4.optional(),end_time_ms:ms4.optional()}).describe("Defines a simulation experiment configuration");expectTypesMatch3(!0);var simulation_transient_voltage_graph2=external_exports2.object({type:external_exports2.literal("simulation_transient_voltage_graph"),simulation_transient_voltage_graph_id:getZodPrefixedIdWithDefault2("simulation_transient_voltage_graph"),simulation_experiment_id:external_exports2.string(),timestamps_ms:external_exports2.array(external_exports2.number()).optional(),voltage_levels:external_exports2.array(external_exports2.number()),source_component_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),time_per_step:duration_ms2,start_time_ms:ms4,end_time_ms:ms4,name:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Stores voltage measurements over time for a simulation");expectTypesMatch3(!0);var simulation_switch2=external_exports2.object({type:external_exports2.literal("simulation_switch"),simulation_switch_id:getZodPrefixedIdWithDefault2("simulation_switch"),source_component_id:external_exports2.string().optional(),closes_at:ms4.optional(),opens_at:ms4.optional(),starts_closed:external_exports2.boolean().optional(),switching_frequency:frequency2.optional()}).describe("Defines a switch for simulation timing control");expectTypesMatch3(!0);var simulation_voltage_probe2=external_exports2.object({type:external_exports2.literal("simulation_voltage_probe"),simulation_voltage_probe_id:getZodPrefixedIdWithDefault2("simulation_voltage_probe"),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),signal_input_source_port_id:external_exports2.string().optional(),signal_input_source_net_id:external_exports2.string().optional(),reference_input_source_port_id:external_exports2.string().optional(),reference_input_source_net_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Defines a voltage probe for simulation. If a reference input is not provided, it measures against ground. If a reference input is provided, it measures the differential voltage between two points.").superRefine((data,ctx)=>{if(data.reference_input_source_port_id||data.reference_input_source_net_id){let has_ports=!!data.signal_input_source_port_id||!!data.reference_input_source_port_id,has_nets=!!data.signal_input_source_net_id||!!data.reference_input_source_net_id;has_ports&&has_nets?ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Cannot mix port and net connections in a differential probe."}):has_ports?(!data.signal_input_source_port_id||!data.reference_input_source_port_id)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Differential port probe requires both signal_input_source_port_id and reference_input_source_port_id."}):has_nets&&(!data.signal_input_source_net_id||!data.reference_input_source_net_id)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Differential net probe requires both signal_input_source_net_id and reference_input_source_net_id."})}else!!data.signal_input_source_port_id==!!data.signal_input_source_net_id&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"A voltage probe must have exactly one of signal_input_source_port_id or signal_input_source_net_id."})});expectTypesMatch3(!0);var simulation_unknown_experiment_error2=base_circuit_json_error2.extend({type:external_exports2.literal("simulation_unknown_experiment_error"),simulation_unknown_experiment_error_id:getZodPrefixedIdWithDefault2("simulation_unknown_experiment_error"),error_type:external_exports2.literal("simulation_unknown_experiment_error").default("simulation_unknown_experiment_error"),simulation_experiment_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("An unknown error occurred during the simulation experiment.");expectTypesMatch3(!0);var simulation_op_amp2=external_exports2.object({type:external_exports2.literal("simulation_op_amp"),simulation_op_amp_id:getZodPrefixedIdWithDefault2("simulation_op_amp"),source_component_id:external_exports2.string().optional(),inverting_input_source_port_id:external_exports2.string(),non_inverting_input_source_port_id:external_exports2.string(),output_source_port_id:external_exports2.string(),positive_supply_source_port_id:external_exports2.string(),negative_supply_source_port_id:external_exports2.string()}).describe("Defines a simple ideal operational amplifier for simulation");expectTypesMatch3(!0);var any_circuit_element2=external_exports2.union([source_trace2,source_port2,source_component_internal_connection2,any_source_component2,source_net2,source_group2,source_simple_chip2,source_simple_capacitor2,source_simple_diode2,source_simple_led2,source_simple_resistor2,source_simple_power_source2,source_simple_battery2,source_simple_inductor2,source_simple_pin_header2,source_simple_pinout2,source_simple_resonator2,source_simple_switch2,source_simple_transistor2,source_simple_test_point2,source_simple_mosfet2,source_simple_op_amp2,source_simple_potentiometer2,source_simple_push_button2,source_pcb_ground_plane2,source_manually_placed_via2,source_board2,source_project_metadata2,source_invalid_component_property_error2,source_trace_not_connected_error2,source_pin_missing_trace_warning2,source_no_power_pin_defined_warning2,source_no_ground_pin_defined_warning2,source_component_pins_underspecified_warning2,source_pin_must_be_connected_error2,unknown_error_finding_part2,source_i2c_misconfigured_error2,source_ambiguous_port_reference2,pcb_component2,pcb_hole2,pcb_missing_footprint_error2,external_footprint_load_error2,circuit_json_footprint_load_error2,pcb_manual_edit_conflict_warning2,pcb_connector_not_in_accessible_orientation_warning2,pcb_plated_hole2,pcb_keepout2,pcb_port2,pcb_net2,pcb_text2,pcb_trace2,pcb_via2,pcb_smtpad2,pcb_solder_paste2,pcb_board2,pcb_panel2,pcb_group2,pcb_trace_hint2,pcb_silkscreen_line2,pcb_silkscreen_path2,pcb_silkscreen_text2,pcb_silkscreen_pill2,pcb_copper_text2,pcb_silkscreen_rect2,pcb_silkscreen_circle2,pcb_silkscreen_oval2,pcb_trace_error2,pcb_trace_missing_error2,pcb_placement_error2,pcb_panelization_placement_error2,pcb_port_not_matched_error2,pcb_port_not_connected_error2,pcb_via_clearance_error2,pcb_fabrication_note_path2,pcb_fabrication_note_text2,pcb_fabrication_note_rect2,pcb_fabrication_note_dimension2,pcb_note_text2,pcb_note_rect2,pcb_note_path2,pcb_note_line2,pcb_note_dimension2,pcb_autorouting_error2,pcb_footprint_overlap_error2,pcb_courtyard_overlap_error2,pcb_breakout_point2,pcb_cutout2,pcb_ground_plane2,pcb_ground_plane_region2,pcb_thermal_spoke2,pcb_copper_pour2,pcb_component_outside_board_error2,pcb_component_not_on_board_edge_error2,pcb_component_invalid_layer_error2,pcb_courtyard_rect2,pcb_courtyard_outline2,pcb_courtyard_polygon2,pcb_courtyard_circle2,schematic_box2,schematic_text2,schematic_line2,schematic_rect2,schematic_circle2,schematic_arc2,schematic_component2,schematic_symbol2,schematic_port2,schematic_trace2,schematic_path2,schematic_error2,schematic_layout_error2,schematic_net_label2,schematic_debug_object2,schematic_voltage_probe2,schematic_manual_edit_conflict_warning2,schematic_group2,schematic_sheet2,schematic_table2,schematic_table_cell2,cad_component2,simulation_voltage_source2,simulation_current_source2,simulation_experiment2,simulation_transient_voltage_graph2,simulation_switch2,simulation_voltage_probe2,simulation_unknown_experiment_error2,simulation_op_amp2]),any_soup_element2=any_circuit_element2;expectTypesMatch3(!0);expectStringUnionsMatch2(!0);function applyToPoint4(matrix2,point23){return Array.isArray(point23)?[matrix2.a*point23[0]+matrix2.c*point23[1]+matrix2.e,matrix2.b*point23[0]+matrix2.d*point23[1]+matrix2.f]:{x:matrix2.a*point23.x+matrix2.c*point23.y+matrix2.e,y:matrix2.b*point23.x+matrix2.d*point23.y+matrix2.f}}function isUndefined4(val){return typeof val>"u"}function translate4(tx3,ty3=0){return{a:1,c:0,e:tx3,b:0,d:1,f:ty3}}function transform4(...matrices){matrices=Array.isArray(matrices[0])?matrices[0]:matrices;let multiply=(m12,m22)=>({a:m12.a*m22.a+m12.c*m22.b,c:m12.a*m22.c+m12.c*m22.d,e:m12.a*m22.e+m12.c*m22.f+m12.e,b:m12.b*m22.a+m12.d*m22.b,d:m12.b*m22.c+m12.d*m22.d,f:m12.b*m22.e+m12.d*m22.f+m12.f});switch(matrices.length){case 0:throw new Error("no matrices provided");case 1:return matrices[0];case 2:return multiply(matrices[0],matrices[1]);default:{let[m12,m22,...rest]=matrices,m4=multiply(m12,m22);return transform4(m4,...rest)}}}function compose4(...matrices){return transform4(...matrices)}var{cos:cos5,sin:sin5,PI:PI6}=Math;function scale4(sx3,sy3=void 0,cx3=void 0,cy3=void 0){isUndefined4(sy3)&&(sy3=sx3);let scaleMatrix={a:sx3,c:0,e:0,b:0,d:sy3,f:0};return isUndefined4(cx3)||isUndefined4(cy3)?scaleMatrix:transform4([translate4(cx3,cy3),scaleMatrix,translate4(-cx3,-cy3)])}var{tan:tan5}=Math;function peg$subclass3(child,parent){function C4(){this.constructor=child}C4.prototype=parent.prototype,child.prototype=new C4}function peg$SyntaxError3(message,expected,found,location){var self2=Error.call(this,message);return Object.setPrototypeOf&&Object.setPrototypeOf(self2,peg$SyntaxError3.prototype),self2.expected=expected,self2.found=found,self2.location=location,self2.name="SyntaxError",self2}peg$subclass3(peg$SyntaxError3,Error);function peg$padEnd3(str,targetLength,padString){return padString=padString||" ",str.length>targetLength?str:(targetLength-=str.length,padString+=padString.repeat(targetLength),str+padString.slice(0,targetLength))}peg$SyntaxError3.prototype.format=function(sources){var str="Error: "+this.message;if(this.location){var src=null,k4;for(k4=0;k4<sources.length;k4++)if(sources[k4].source===this.location.source){src=sources[k4].text.split(/\r\n|\n|\r/g);break}var s3=this.location.start,offset_s=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(s3):s3,loc=this.location.source+":"+offset_s.line+":"+offset_s.column;if(src){var e5=this.location.end,filler=peg$padEnd3("",offset_s.line.toString().length," "),line2=src[s3.line-1],last=s3.line===e5.line?e5.column:line2.length+1,hatLen=last-s3.column||1;str+=`
|