tscircuit 0.0.2888 → 0.0.2889-libonly

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.
@@ -10,7 +10,7 @@ Your code should look like:
10
10
  1. You might have mismatching versions of React and the renderer (such as React DOM)
11
11
  2. You might be breaking the Rules of Hooks
12
12
  3. You might have more than one copy of React in the same app
13
- See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),dispatcher}function releaseAsyncTransition(){ReactSharedInternals.asyncTransitions--}function startTransition(scope){var prevTransition=ReactSharedInternals.T,currentTransition={};currentTransition.types=prevTransition!==null?prevTransition.types:null,currentTransition._updatedFibers=new Set,ReactSharedInternals.T=currentTransition;try{var returnValue=scope(),onStartTransitionFinish=ReactSharedInternals.S;onStartTransitionFinish!==null&&onStartTransitionFinish(currentTransition,returnValue),typeof returnValue=="object"&&returnValue!==null&&typeof returnValue.then=="function"&&(ReactSharedInternals.asyncTransitions++,returnValue.then(releaseAsyncTransition,releaseAsyncTransition),returnValue.then(noop,reportGlobalError))}catch(error2){reportGlobalError(error2)}finally{prevTransition===null&&currentTransition._updatedFibers&&(scope=currentTransition._updatedFibers.size,currentTransition._updatedFibers.clear(),10<scope&&console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.")),prevTransition!==null&&currentTransition.types!==null&&(prevTransition.types!==null&&prevTransition.types!==currentTransition.types&&console.error("We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React."),prevTransition.types=currentTransition.types),ReactSharedInternals.T=prevTransition}}function addTransitionType(type){var transition=ReactSharedInternals.T;if(transition!==null){var transitionTypes=transition.types;transitionTypes===null?transition.types=[type]:transitionTypes.indexOf(type)===-1&&transitionTypes.push(type)}else ReactSharedInternals.asyncTransitions===0&&console.error("addTransitionType can only be called inside a `startTransition()` callback. It must be associated with a specific Transition."),startTransition(addTransitionType.bind(null,type))}function enqueueTask(task){if(enqueueTaskImpl===null)try{var requireString=("require"+Math.random()).slice(0,7);enqueueTaskImpl=(module&&module[requireString]).call(module,"timers").setImmediate}catch{enqueueTaskImpl=function(callback){didWarnAboutMessageChannel===!1&&(didWarnAboutMessageChannel=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var channel2=new MessageChannel;channel2.port1.onmessage=callback,channel2.port2.postMessage(void 0)}}return enqueueTaskImpl(task)}function aggregateErrors(errors){return 1<errors.length&&typeof AggregateError=="function"?new AggregateError(errors):errors[0]}function popActScope(prevActQueue,prevActScopeDepth){prevActScopeDepth!==actScopeDepth-1&&console.error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "),actScopeDepth=prevActScopeDepth}function recursivelyFlushAsyncActWork(returnValue,resolve7,reject){var queue=ReactSharedInternals.actQueue;if(queue!==null)if(queue.length!==0)try{flushActQueue(queue),enqueueTask(function(){return recursivelyFlushAsyncActWork(returnValue,resolve7,reject)});return}catch(error2){ReactSharedInternals.thrownErrors.push(error2)}else ReactSharedInternals.actQueue=null;0<ReactSharedInternals.thrownErrors.length?(queue=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0,reject(queue)):resolve7(returnValue)}function flushActQueue(queue){if(!isFlushing){isFlushing=!0;var i10=0;try{for(;i10<queue.length;i10++){var callback=queue[i10];do{ReactSharedInternals.didUsePromise=!1;var continuation=callback(!1);if(continuation!==null){if(ReactSharedInternals.didUsePromise){queue[i10]=callback,queue.splice(0,i10);return}callback=continuation}else break}while(!0)}queue.length=0}catch(error2){queue.splice(0,i10+1),ReactSharedInternals.thrownErrors.push(error2)}finally{isFlushing=!1}}}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_CONSUMER_TYPE=Symbol.for("react.consumer"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_SUSPENSE_LIST_TYPE=Symbol.for("react.suspense_list"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),REACT_ACTIVITY_TYPE=Symbol.for("react.activity"),REACT_VIEW_TRANSITION_TYPE=Symbol.for("react.view_transition"),MAYBE_ITERATOR_SYMBOL=Symbol.iterator,didWarnStateUpdateForUnmountedComponent={},ReactNoopUpdateQueue={isMounted:function(){return!1},enqueueForceUpdate:function(publicInstance){warnNoop(publicInstance,"forceUpdate")},enqueueReplaceState:function(publicInstance){warnNoop(publicInstance,"replaceState")},enqueueSetState:function(publicInstance){warnNoop(publicInstance,"setState")}},assign=Object.assign,emptyObject={};Object.freeze(emptyObject),Component.prototype.isReactComponent={},Component.prototype.setState=function(partialState,callback){if(typeof partialState!="object"&&typeof partialState!="function"&&partialState!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,partialState,callback,"setState")},Component.prototype.forceUpdate=function(callback){this.updater.enqueueForceUpdate(this,callback,"forceUpdate")};var deprecatedAPIs={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]};for(fnName in deprecatedAPIs)deprecatedAPIs.hasOwnProperty(fnName)&&defineDeprecationWarning(fnName,deprecatedAPIs[fnName]);ComponentDummy.prototype=Component.prototype,deprecatedAPIs=PureComponent.prototype=new ComponentDummy,deprecatedAPIs.constructor=PureComponent,assign(deprecatedAPIs,Component.prototype),deprecatedAPIs.isPureReactComponent=!0;var isArrayImpl=Array.isArray,REACT_CLIENT_REFERENCE=Symbol.for("react.client.reference"),ReactSharedInternals={H:null,A:null,T:null,S:null,actQueue:null,asyncTransitions:0,isBatchingLegacy:!1,didScheduleLegacyUpdate:!1,didUsePromise:!1,thrownErrors:[],getCurrentStack:null,recentlyCreatedOwnerStacks:0},hasOwnProperty=Object.prototype.hasOwnProperty,createTask=console.createTask?console.createTask:function(){return null};deprecatedAPIs={react_stack_bottom_frame:function(callStackForError){return callStackForError()}};var specialPropKeyWarningShown,didWarnAboutOldJSXRuntime,didWarnAboutElementRef={},unknownOwnerDebugStack=deprecatedAPIs.react_stack_bottom_frame.bind(deprecatedAPIs,UnknownOwner)(),unknownOwnerDebugTask=createTask(getTaskName(UnknownOwner)),didWarnAboutMaps=!1,userProvidedKeyEscapeRegex=/\/+/g,reportGlobalError=typeof reportError=="function"?reportError:function(error2){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var event=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof error2=="object"&&error2!==null&&typeof error2.message=="string"?String(error2.message):String(error2),error:error2});if(!window.dispatchEvent(event))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",error2);return}console.error(error2)},didWarnAboutMessageChannel=!1,enqueueTaskImpl=null,actScopeDepth=0,didWarnNoAwaitAct=!1,isFlushing=!1,queueSeveralMicrotasks=typeof queueMicrotask=="function"?function(callback){queueMicrotask(function(){return queueMicrotask(callback)})}:enqueueTask;deprecatedAPIs=Object.freeze({__proto__:null,c:function(size3){return resolveDispatcher().useMemoCache(size3)}});var fnName={map:mapChildren,forEach:function(children,forEachFunc,forEachContext){mapChildren(children,function(){forEachFunc.apply(this,arguments)},forEachContext)},count:function(children){var n10=0;return mapChildren(children,function(){n10++}),n10},toArray:function(children){return mapChildren(children,function(child){return child})||[]},only:function(children){if(!isValidElement7(children))throw Error("React.Children.only expected to receive a single React element child.");return children}};exports.Activity=REACT_ACTIVITY_TYPE,exports.Children=fnName,exports.Component=Component,exports.Fragment=REACT_FRAGMENT_TYPE,exports.Profiler=REACT_PROFILER_TYPE,exports.PureComponent=PureComponent,exports.StrictMode=REACT_STRICT_MODE_TYPE,exports.Suspense=REACT_SUSPENSE_TYPE,exports.ViewTransition=REACT_VIEW_TRANSITION_TYPE,exports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=ReactSharedInternals,exports.__COMPILER_RUNTIME=deprecatedAPIs,exports.act=function(callback){var prevActQueue=ReactSharedInternals.actQueue,prevActScopeDepth=actScopeDepth;actScopeDepth++;var queue=ReactSharedInternals.actQueue=prevActQueue!==null?prevActQueue:[],didAwaitActCall=!1;try{var result=callback()}catch(error2){ReactSharedInternals.thrownErrors.push(error2)}if(0<ReactSharedInternals.thrownErrors.length)throw popActScope(prevActQueue,prevActScopeDepth),callback=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0,callback;if(result!==null&&typeof result=="object"&&typeof result.then=="function"){var thenable=result;return queueSeveralMicrotasks(function(){didAwaitActCall||didWarnNoAwaitAct||(didWarnNoAwaitAct=!0,console.error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(resolve7,reject){didAwaitActCall=!0,thenable.then(function(returnValue){if(popActScope(prevActQueue,prevActScopeDepth),prevActScopeDepth===0){try{flushActQueue(queue),enqueueTask(function(){return recursivelyFlushAsyncActWork(returnValue,resolve7,reject)})}catch(error$0){ReactSharedInternals.thrownErrors.push(error$0)}if(0<ReactSharedInternals.thrownErrors.length){var _thrownError=aggregateErrors(ReactSharedInternals.thrownErrors);ReactSharedInternals.thrownErrors.length=0,reject(_thrownError)}}else resolve7(returnValue)},function(error2){popActScope(prevActQueue,prevActScopeDepth),0<ReactSharedInternals.thrownErrors.length&&(error2=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0),reject(error2)})}}}var returnValue$jscomp$0=result;if(popActScope(prevActQueue,prevActScopeDepth),prevActScopeDepth===0&&(flushActQueue(queue),queue.length!==0&&queueSeveralMicrotasks(function(){didAwaitActCall||didWarnNoAwaitAct||(didWarnNoAwaitAct=!0,console.error("A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\n\nawait act(() => ...)"))}),ReactSharedInternals.actQueue=null),0<ReactSharedInternals.thrownErrors.length)throw callback=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0,callback;return{then:function(resolve7,reject){didAwaitActCall=!0,prevActScopeDepth===0?(ReactSharedInternals.actQueue=queue,enqueueTask(function(){return recursivelyFlushAsyncActWork(returnValue$jscomp$0,resolve7,reject)})):resolve7(returnValue$jscomp$0)}}},exports.addTransitionType=addTransitionType,exports.cache=function(fn3){return function(){return fn3.apply(null,arguments)}},exports.cacheSignal=function(){return null},exports.captureOwnerStack=function(){var getCurrentStack=ReactSharedInternals.getCurrentStack;return getCurrentStack===null?null:getCurrentStack()},exports.cloneElement=function(element,config,children){if(element==null)throw Error("The argument must be a React element, but you passed "+element+".");var props=assign({},element.props),key=element.key,owner=element._owner;if(config!=null){var JSCompiler_inline_result;a:{if(hasOwnProperty.call(config,"ref")&&(JSCompiler_inline_result=Object.getOwnPropertyDescriptor(config,"ref").get)&&JSCompiler_inline_result.isReactWarning){JSCompiler_inline_result=!1;break a}JSCompiler_inline_result=config.ref!==void 0}JSCompiler_inline_result&&(owner=getOwner()),hasValidKey(config)&&(checkKeyStringCoercion(config.key),key=""+config.key);for(propName in config)!hasOwnProperty.call(config,propName)||propName==="key"||propName==="__self"||propName==="__source"||propName==="ref"&&config.ref===void 0||(props[propName]=config[propName])}var propName=arguments.length-2;if(propName===1)props.children=children;else if(1<propName){JSCompiler_inline_result=Array(propName);for(var i10=0;i10<propName;i10++)JSCompiler_inline_result[i10]=arguments[i10+2];props.children=JSCompiler_inline_result}for(props=ReactElement(element.type,key,props,owner,element._debugStack,element._debugTask),key=2;key<arguments.length;key++)validateChildKeys(arguments[key]);return props},exports.createContext=function(defaultValue){return defaultValue={$$typeof:REACT_CONTEXT_TYPE,_currentValue:defaultValue,_currentValue2:defaultValue,_threadCount:0,Provider:null,Consumer:null},defaultValue.Provider=defaultValue,defaultValue.Consumer={$$typeof:REACT_CONSUMER_TYPE,_context:defaultValue},defaultValue._currentRenderer=null,defaultValue._currentRenderer2=null,defaultValue},exports.createElement=function(type,config,children){for(var i10=2;i10<arguments.length;i10++)validateChildKeys(arguments[i10]);var propName;i10={};var key=null;if(config!=null)for(propName in didWarnAboutOldJSXRuntime||!("__self"in config)||"key"in config||(didWarnAboutOldJSXRuntime=!0,console.warn("Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: https://react.dev/link/new-jsx-transform")),hasValidKey(config)&&(checkKeyStringCoercion(config.key),key=""+config.key),config)hasOwnProperty.call(config,propName)&&propName!=="key"&&propName!=="__self"&&propName!=="__source"&&(i10[propName]=config[propName]);var childrenLength=arguments.length-2;if(childrenLength===1)i10.children=children;else if(1<childrenLength){for(var childArray=Array(childrenLength),_i3=0;_i3<childrenLength;_i3++)childArray[_i3]=arguments[_i3+2];Object.freeze&&Object.freeze(childArray),i10.children=childArray}if(type&&type.defaultProps)for(propName in childrenLength=type.defaultProps,childrenLength)i10[propName]===void 0&&(i10[propName]=childrenLength[propName]);return key&&defineKeyPropWarningGetter(i10,typeof type=="function"?type.displayName||type.name||"Unknown":type),(propName=1e4>ReactSharedInternals.recentlyCreatedOwnerStacks++)?(childArray=Error.stackTraceLimit,Error.stackTraceLimit=10,childrenLength=Error("react-stack-top-frame"),Error.stackTraceLimit=childArray):childrenLength=unknownOwnerDebugStack,ReactElement(type,key,i10,getOwner(),childrenLength,propName?createTask(getTaskName(type)):unknownOwnerDebugTask)},exports.createRef=function(){var refObject={current:null};return Object.seal(refObject),refObject},exports.forwardRef=function(render2){render2!=null&&render2.$$typeof===REACT_MEMO_TYPE?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof render2!="function"?console.error("forwardRef requires a render function but was given %s.",render2===null?"null":typeof render2):render2.length!==0&&render2.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",render2.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),render2!=null&&render2.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var elementType={$$typeof:REACT_FORWARD_REF_TYPE,render:render2},ownName;return Object.defineProperty(elementType,"displayName",{enumerable:!1,configurable:!0,get:function(){return ownName},set:function(name){ownName=name,render2.name||render2.displayName||(Object.defineProperty(render2,"name",{value:name}),render2.displayName=name)}}),elementType},exports.isValidElement=isValidElement7,exports.lazy=function(ctor){ctor={_status:-1,_result:ctor};var lazyType3={$$typeof:REACT_LAZY_TYPE,_payload:ctor,_init:lazyInitializer},ioInfo={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return ctor._ioInfo=ioInfo,lazyType3._debugInfo=[{awaited:ioInfo}],lazyType3},exports.memo=function(type,compare2){type==null&&console.error("memo: The first argument must be a component. Instead received: %s",type===null?"null":typeof type),compare2={$$typeof:REACT_MEMO_TYPE,type,compare:compare2===void 0?null:compare2};var ownName;return Object.defineProperty(compare2,"displayName",{enumerable:!1,configurable:!0,get:function(){return ownName},set:function(name){ownName=name,type.name||type.displayName||(Object.defineProperty(type,"name",{value:name}),type.displayName=name)}}),compare2},exports.startTransition=startTransition,exports.unstable_useCacheRefresh=function(){return resolveDispatcher().useCacheRefresh()},exports.use=function(usable){return resolveDispatcher().use(usable)},exports.useActionState=function(action,initialState,permalink){return resolveDispatcher().useActionState(action,initialState,permalink)},exports.useCallback=function(callback,deps){return resolveDispatcher().useCallback(callback,deps)},exports.useContext=function(Context){var dispatcher=resolveDispatcher();return Context.$$typeof===REACT_CONSUMER_TYPE&&console.error("Calling useContext(Context.Consumer) is not supported and will cause bugs. Did you mean to call useContext(Context) instead?"),dispatcher.useContext(Context)},exports.useDebugValue=function(value,formatterFn){return resolveDispatcher().useDebugValue(value,formatterFn)},exports.useDeferredValue=function(value,initialValue){return resolveDispatcher().useDeferredValue(value,initialValue)},exports.useEffect=function(create10,deps){return create10==null&&console.warn("React Hook useEffect requires an effect callback. Did you forget to pass a callback to the hook?"),resolveDispatcher().useEffect(create10,deps)},exports.useEffectEvent=function(callback){return resolveDispatcher().useEffectEvent(callback)},exports.useId=function(){return resolveDispatcher().useId()},exports.useImperativeHandle=function(ref,create10,deps){return resolveDispatcher().useImperativeHandle(ref,create10,deps)},exports.useInsertionEffect=function(create10,deps){return create10==null&&console.warn("React Hook useInsertionEffect requires an effect callback. Did you forget to pass a callback to the hook?"),resolveDispatcher().useInsertionEffect(create10,deps)},exports.useLayoutEffect=function(create10,deps){return create10==null&&console.warn("React Hook useLayoutEffect requires an effect callback. Did you forget to pass a callback to the hook?"),resolveDispatcher().useLayoutEffect(create10,deps)},exports.useMemo=function(create10,deps){return resolveDispatcher().useMemo(create10,deps)},exports.useOptimistic=function(passthrough,reducer){return resolveDispatcher().useOptimistic(passthrough,reducer)},exports.useReducer=function(reducer,initialArg,init){return resolveDispatcher().useReducer(reducer,initialArg,init)},exports.useRef=function(initialValue){return resolveDispatcher().useRef(initialValue)},exports.useState=function(initialState){return resolveDispatcher().useState(initialState)},exports.useSyncExternalStore=function(subscribe,getSnapshot,getServerSnapshot){return resolveDispatcher().useSyncExternalStore(subscribe,getSnapshot,getServerSnapshot)},exports.useTransition=function(){return resolveDispatcher().useTransition()},exports.version="19.3.0",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()}});var require_react=__commonJS({"node_modules/react/index.js"(exports,module){"use strict";module.exports=require_react_development()}});var util,objectUtil,ZodParsedType,getParsedType,init_util=__esm({"node_modules/zod/v3/helpers/util.js"(){"use strict";(function(util3){util3.assertEqual=_11=>{};function assertIs(_arg){}util3.assertIs=assertIs;function assertNever(_x4){throw new Error}util3.assertNever=assertNever,util3.arrayToEnum=items=>{let obj={};for(let item of items)obj[item]=item;return obj},util3.getValidEnumValues=obj=>{let validKeys=util3.objectKeys(obj).filter(k11=>typeof obj[obj[k11]]!="number"),filtered={};for(let k11 of validKeys)filtered[k11]=obj[k11];return util3.objectValues(filtered)},util3.objectValues=obj=>util3.objectKeys(obj).map(function(e55){return obj[e55]}),util3.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},util3.find=(arr,checker)=>{for(let item of arr)if(checker(item))return item},util3.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)}util3.joinValues=joinValues,util3.jsonStringifyReplacer=(_11,value)=>typeof value=="bigint"?value.toString():value})(util||(util={}));(function(objectUtil3){objectUtil3.mergeShapes=(first,second)=>({...first,...second})})(objectUtil||(objectUtil={}));ZodParsedType=util.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),getParsedType=data=>{switch(typeof data){case"undefined":return ZodParsedType.undefined;case"string":return ZodParsedType.string;case"number":return Number.isNaN(data)?ZodParsedType.nan:ZodParsedType.number;case"boolean":return ZodParsedType.boolean;case"function":return ZodParsedType.function;case"bigint":return ZodParsedType.bigint;case"symbol":return ZodParsedType.symbol;case"object":return Array.isArray(data)?ZodParsedType.array:data===null?ZodParsedType.null:data.then&&typeof data.then=="function"&&data.catch&&typeof data.catch=="function"?ZodParsedType.promise:typeof Map<"u"&&data instanceof Map?ZodParsedType.map:typeof Set<"u"&&data instanceof Set?ZodParsedType.set:typeof Date<"u"&&data instanceof Date?ZodParsedType.date:ZodParsedType.object;default:return ZodParsedType.unknown}}}});var ZodIssueCode,quotelessJson,ZodError,init_ZodError=__esm({"node_modules/zod/v3/ZodError.js"(){"use strict";init_util();ZodIssueCode=util.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"]),quotelessJson=obj=>JSON.stringify(obj,null,2).replace(/"([^"]+)":/g,"$1:"),ZodError=class _ZodError3 extends Error{get errors(){return this.issues}constructor(issues){super(),this.issues=[],this.addIssue=sub8=>{this.issues=[...this.issues,sub8]},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,i10=0;for(;i10<issue.path.length;){let el3=issue.path[i10];i10===issue.path.length-1?(curr[el3]=curr[el3]||{_errors:[]},curr[el3]._errors.push(mapper(issue))):curr[el3]=curr[el3]||{_errors:[]},curr=curr[el3],i10++}}};return processError(this),fieldErrors}static assert(value){if(!(value instanceof _ZodError3))throw new Error(`Not a ZodError: ${value}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,util.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(mapper=issue=>issue.message){let fieldErrors={},formErrors=[];for(let sub8 of this.issues)if(sub8.path.length>0){let firstEl=sub8.path[0];fieldErrors[firstEl]=fieldErrors[firstEl]||[],fieldErrors[firstEl].push(mapper(sub8))}else formErrors.push(mapper(sub8));return{formErrors,fieldErrors}}get formErrors(){return this.flatten()}};ZodError.create=issues=>new ZodError(issues)}});var errorMap,en_default,init_en=__esm({"node_modules/zod/v3/locales/en.js"(){"use strict";init_ZodError();init_util();errorMap=(issue,_ctx)=>{let message;switch(issue.code){case ZodIssueCode.invalid_type:issue.received===ZodParsedType.undefined?message="Required":message=`Expected ${issue.expected}, received ${issue.received}`;break;case ZodIssueCode.invalid_literal:message=`Invalid literal value, expected ${JSON.stringify(issue.expected,util.jsonStringifyReplacer)}`;break;case ZodIssueCode.unrecognized_keys:message=`Unrecognized key(s) in object: ${util.joinValues(issue.keys,", ")}`;break;case ZodIssueCode.invalid_union:message="Invalid input";break;case ZodIssueCode.invalid_union_discriminator:message=`Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;break;case ZodIssueCode.invalid_enum_value:message=`Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;break;case ZodIssueCode.invalid_arguments:message="Invalid function arguments";break;case ZodIssueCode.invalid_return_type:message="Invalid function return type";break;case ZodIssueCode.invalid_date:message="Invalid date";break;case ZodIssueCode.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}"`:util.assertNever(issue.validation):issue.validation!=="regex"?message=`Invalid ${issue.validation}`:message="Invalid";break;case ZodIssueCode.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 ZodIssueCode.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 ZodIssueCode.custom:message="Invalid input";break;case ZodIssueCode.invalid_intersection_types:message="Intersection results could not be merged";break;case ZodIssueCode.not_multiple_of:message=`Number must be a multiple of ${issue.multipleOf}`;break;case ZodIssueCode.not_finite:message="Number must be finite";break;default:message=_ctx.defaultError,util.assertNever(issue)}return{message}},en_default=errorMap}});function setErrorMap(map){overrideErrorMap=map}function getErrorMap(){return overrideErrorMap}var overrideErrorMap,init_errors=__esm({"node_modules/zod/v3/errors.js"(){"use strict";init_en();overrideErrorMap=en_default}});function addIssueToContext(ctx,issueData){let overrideMap=getErrorMap(),issue=makeIssue({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default?void 0:en_default].filter(x11=>!!x11)});ctx.common.issues.push(issue)}var makeIssue,EMPTY_PATH,ParseStatus,INVALID,DIRTY,OK,isAborted,isDirty,isValid,isAsync,init_parseUtil=__esm({"node_modules/zod/v3/helpers/parseUtil.js"(){"use strict";init_errors();init_en();makeIssue=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_PATH=[];ParseStatus=class _ParseStatus3{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 s11 of results){if(s11.status==="aborted")return INVALID;s11.status==="dirty"&&status.dirty(),arrayValue.push(s11.value)}return{status:status.value,value:arrayValue}}static async mergeObjectAsync(status,pairs5){let syncPairs=[];for(let pair of pairs5){let key=await pair.key,value=await pair.value;syncPairs.push({key,value})}return _ParseStatus3.mergeObjectSync(status,syncPairs)}static mergeObjectSync(status,pairs5){let finalObject={};for(let pair of pairs5){let{key,value}=pair;if(key.status==="aborted"||value.status==="aborted")return INVALID;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}}},INVALID=Object.freeze({status:"aborted"}),DIRTY=value=>({status:"dirty",value}),OK=value=>({status:"valid",value}),isAborted=x11=>x11.status==="aborted",isDirty=x11=>x11.status==="dirty",isValid=x11=>x11.status==="valid",isAsync=x11=>typeof Promise<"u"&&x11 instanceof Promise}});var init_typeAliases=__esm({"node_modules/zod/v3/helpers/typeAliases.js"(){"use strict"}});var errorUtil,init_errorUtil=__esm({"node_modules/zod/v3/helpers/errorUtil.js"(){"use strict";(function(errorUtil3){errorUtil3.errToObj=message=>typeof message=="string"?{message}:message||{},errorUtil3.toString=message=>typeof message=="string"?message:message?.message})(errorUtil||(errorUtil={}))}});function processCreateParams(params){if(!params)return{};let{errorMap:errorMap3,invalid_type_error,required_error,description}=params;if(errorMap3&&(invalid_type_error||required_error))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return errorMap3?{errorMap:errorMap3,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}}function timeRegexSource(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 timeRegex(args){return new RegExp(`^${timeRegexSource(args)}$`)}function datetimeRegex(args){let regex=`${dateRegexSource}T${timeRegexSource(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 isValidIP(ip4,version2){return!!((version2==="v4"||!version2)&&ipv4Regex.test(ip4)||(version2==="v6"||!version2)&&ipv6Regex.test(ip4))}function isValidJWT(jwt,alg){if(!jwtRegex.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 isValidCidr(ip4,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex.test(ip4)||(version2==="v6"||!version2)&&ipv6CidrRegex.test(ip4))}function floatSafeRemainder(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}function deepPartialify(schema){if(schema instanceof ZodObject){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional.create(deepPartialify(fieldSchema))}return new ZodObject({...schema._def,shape:()=>newShape})}else return schema instanceof ZodArray?new ZodArray({...schema._def,type:deepPartialify(schema.element)}):schema instanceof ZodOptional?ZodOptional.create(deepPartialify(schema.unwrap())):schema instanceof ZodNullable?ZodNullable.create(deepPartialify(schema.unwrap())):schema instanceof ZodTuple?ZodTuple.create(schema.items.map(item=>deepPartialify(item))):schema}function mergeValues(a10,b11){let aType=getParsedType(a10),bType=getParsedType(b11);if(a10===b11)return{valid:!0,data:a10};if(aType===ZodParsedType.object&&bType===ZodParsedType.object){let bKeys=util.objectKeys(b11),sharedKeys=util.objectKeys(a10).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a10,...b11};for(let key of sharedKeys){let sharedValue=mergeValues(a10[key],b11[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType.array&&bType===ZodParsedType.array){if(a10.length!==b11.length)return{valid:!1};let newArray=[];for(let index2=0;index2<a10.length;index2++){let itemA=a10[index2],itemB=b11[index2],sharedValue=mergeValues(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else return aType===ZodParsedType.date&&bType===ZodParsedType.date&&+a10==+b11?{valid:!0,data:a10}:{valid:!1}}function createZodEnum(values2,params){return new ZodEnum({values:values2,typeName:ZodFirstPartyTypeKind.ZodEnum,...processCreateParams(params)})}function cleanParams(params,data){let p11=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p11=="string"?{message:p11}:p11}function custom(check,_params={},fatal){return check?ZodAny.create().superRefine((data,ctx)=>{let r10=check(data);if(r10 instanceof Promise)return r10.then(r11=>{if(!r11){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r10){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}}):ZodAny.create()}var ParseInputLazyPath,handleResult,ZodType,cuidRegex,cuid2Regex,ulidRegex,uuidRegex,nanoidRegex,jwtRegex,durationRegex,emailRegex,_emojiRegex,emojiRegex,ipv4Regex,ipv4CidrRegex,ipv6Regex,ipv6CidrRegex,base64Regex,base64urlRegex,dateRegexSource,dateRegex,ZodString,ZodNumber,ZodBigInt,ZodBoolean,ZodDate,ZodSymbol,ZodUndefined,ZodNull,ZodAny,ZodUnknown,ZodNever,ZodVoid,ZodArray,ZodObject,ZodUnion,getDiscriminator,ZodDiscriminatedUnion,ZodIntersection,ZodTuple,ZodRecord,ZodMap,ZodSet,ZodFunction,ZodLazy,ZodLiteral,ZodEnum,ZodNativeEnum,ZodPromise,ZodEffects,ZodOptional,ZodNullable,ZodDefault,ZodCatch,ZodNaN,BRAND,ZodBranded,ZodPipeline,ZodReadonly,late,ZodFirstPartyTypeKind,instanceOfType,stringType,numberType,nanType,bigIntType,booleanType,dateType,symbolType,undefinedType,nullType,anyType,unknownType,neverType,voidType,arrayType,objectType,strictObjectType,unionType,discriminatedUnionType,intersectionType,tupleType,recordType,mapType,setType,functionType,lazyType,literalType,enumType,nativeEnumType,promiseType,effectsType,optionalType,nullableType,preprocessType,pipelineType,ostring,onumber,oboolean,coerce,NEVER,init_types=__esm({"node_modules/zod/v3/types.js"(){"use strict";init_ZodError();init_errors();init_errorUtil();init_parseUtil();init_util();ParseInputLazyPath=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}},handleResult=(ctx,result)=>{if(isValid(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 ZodError(ctx.common.issues);return this._error=error2,this._error}}};ZodType=class{get description(){return this._def.description}_getType(input2){return getParsedType(input2.data)}_getOrReturnCtx(input2,ctx){return ctx||{common:input2.parent.common,data:input2.data,parsedType:getParsedType(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}_processInputParams(input2){return{status:new ParseStatus,ctx:{common:input2.parent.common,data:input2.data,parsedType:getParsedType(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}}_parseSync(input2){let result=this._parse(input2);if(isAsync(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:getParsedType(data)},result=this._parseSync({data,path:ctx.path,parent:ctx});return handleResult(ctx,result)}"~validate"(data){let ctx={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)};if(!this["~standard"].async)try{let result=this._parseSync({data,path:[],parent:ctx});return isValid(result)?{value:result.value}:{issues:ctx.common.issues}}catch(err2){err2?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),ctx.common={issues:[],async:!0}}return this._parseAsync({data,path:[],parent:ctx}).then(result=>isValid(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:getParsedType(data)},maybeAsyncResult=this._parse({data,path:ctx.path,parent:ctx}),result=await(isAsync(maybeAsyncResult)?maybeAsyncResult:Promise.resolve(maybeAsyncResult));return handleResult(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:ZodIssueCode.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 ZodEffects({schema:this,typeName:ZodFirstPartyTypeKind.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 ZodOptional.create(this,this._def)}nullable(){return ZodNullable.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray.create(this)}promise(){return ZodPromise.create(this,this._def)}or(option){return ZodUnion.create([this,option],this._def)}and(incoming){return ZodIntersection.create(this,incoming,this._def)}transform(transform7){return new ZodEffects({...processCreateParams(this._def),schema:this,typeName:ZodFirstPartyTypeKind.ZodEffects,effect:{type:"transform",transform:transform7}})}default(def){let defaultValueFunc=typeof def=="function"?def:()=>def;return new ZodDefault({...processCreateParams(this._def),innerType:this,defaultValue:defaultValueFunc,typeName:ZodFirstPartyTypeKind.ZodDefault})}brand(){return new ZodBranded({typeName:ZodFirstPartyTypeKind.ZodBranded,type:this,...processCreateParams(this._def)})}catch(def){let catchValueFunc=typeof def=="function"?def:()=>def;return new ZodCatch({...processCreateParams(this._def),innerType:this,catchValue:catchValueFunc,typeName:ZodFirstPartyTypeKind.ZodCatch})}describe(description){let This=this.constructor;return new This({...this._def,description})}pipe(target){return ZodPipeline.create(this,target)}readonly(){return ZodReadonly.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},cuidRegex=/^c[^\s-]{8,}$/i,cuid2Regex=/^[0-9a-z]+$/,ulidRegex=/^[0-9A-HJKMNP-TV-Z]{26}$/i,uuidRegex=/^[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,nanoidRegex=/^[a-z0-9_-]{21}$/i,jwtRegex=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,durationRegex=/^[-+]?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)?)??$/,emailRegex=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,_emojiRegex="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",ipv4Regex=/^(?:(?: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])$/,ipv4CidrRegex=/^(?:(?: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])$/,ipv6Regex=/^(([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]))$/,ipv6CidrRegex=/^(([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])$/,base64Regex=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64urlRegex=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,dateRegexSource="((\\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])))",dateRegex=new RegExp(`^${dateRegexSource}$`);ZodString=class _ZodString3 extends ZodType{_parse(input2){if(this._def.coerce&&(input2.data=String(input2.data)),this._getType(input2)!==ZodParsedType.string){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.string,received:ctx2.parsedType}),INVALID}let status=new ParseStatus,ctx;for(let check of this._def.checks)if(check.kind==="min")input2.data.length<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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?addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}):tooSmall&&addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}),status.dirty())}else if(check.kind==="email")emailRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"email",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="emoji")emojiRegex||(emojiRegex=new RegExp(_emojiRegex,"u")),emojiRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"emoji",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="uuid")uuidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"uuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="nanoid")nanoidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"nanoid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid")cuidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"cuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid2")cuid2Regex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"cuid2",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="ulid")ulidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"ulid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="url")try{new URL(input2.data)}catch{ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"url",code:ZodIssueCode.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),addIssueToContext(ctx,{validation:"regex",code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{startsWith:check.value},message:check.message}),status.dirty()):check.kind==="endsWith"?input2.data.endsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{endsWith:check.value},message:check.message}),status.dirty()):check.kind==="datetime"?datetimeRegex(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"datetime",message:check.message}),status.dirty()):check.kind==="date"?dateRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"date",message:check.message}),status.dirty()):check.kind==="time"?timeRegex(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"time",message:check.message}),status.dirty()):check.kind==="duration"?durationRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"duration",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="ip"?isValidIP(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"ip",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="jwt"?isValidJWT(input2.data,check.alg)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"jwt",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="cidr"?isValidCidr(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"cidr",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="base64"?base64Regex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"base64",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="base64url"?base64urlRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"base64url",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):util.assertNever(check);return{status:status.value,value:input2.data}}_regex(regex,validation,message){return this.refinement(data=>regex.test(data),{validation,code:ZodIssueCode.invalid_string,...errorUtil.errToObj(message)})}_addCheck(check){return new _ZodString3({...this._def,checks:[...this._def.checks,check]})}email(message){return this._addCheck({kind:"email",...errorUtil.errToObj(message)})}url(message){return this._addCheck({kind:"url",...errorUtil.errToObj(message)})}emoji(message){return this._addCheck({kind:"emoji",...errorUtil.errToObj(message)})}uuid(message){return this._addCheck({kind:"uuid",...errorUtil.errToObj(message)})}nanoid(message){return this._addCheck({kind:"nanoid",...errorUtil.errToObj(message)})}cuid(message){return this._addCheck({kind:"cuid",...errorUtil.errToObj(message)})}cuid2(message){return this._addCheck({kind:"cuid2",...errorUtil.errToObj(message)})}ulid(message){return this._addCheck({kind:"ulid",...errorUtil.errToObj(message)})}base64(message){return this._addCheck({kind:"base64",...errorUtil.errToObj(message)})}base64url(message){return this._addCheck({kind:"base64url",...errorUtil.errToObj(message)})}jwt(options){return this._addCheck({kind:"jwt",...errorUtil.errToObj(options)})}ip(options){return this._addCheck({kind:"ip",...errorUtil.errToObj(options)})}cidr(options){return this._addCheck({kind:"cidr",...errorUtil.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,...errorUtil.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,...errorUtil.errToObj(options?.message)})}duration(message){return this._addCheck({kind:"duration",...errorUtil.errToObj(message)})}regex(regex,message){return this._addCheck({kind:"regex",regex,...errorUtil.errToObj(message)})}includes(value,options){return this._addCheck({kind:"includes",value,position:options?.position,...errorUtil.errToObj(options?.message)})}startsWith(value,message){return this._addCheck({kind:"startsWith",value,...errorUtil.errToObj(message)})}endsWith(value,message){return this._addCheck({kind:"endsWith",value,...errorUtil.errToObj(message)})}min(minLength,message){return this._addCheck({kind:"min",value:minLength,...errorUtil.errToObj(message)})}max(maxLength,message){return this._addCheck({kind:"max",value:maxLength,...errorUtil.errToObj(message)})}length(len6,message){return this._addCheck({kind:"length",value:len6,...errorUtil.errToObj(message)})}nonempty(message){return this.min(1,errorUtil.errToObj(message))}trim(){return new _ZodString3({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new _ZodString3({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new _ZodString3({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(ch4=>ch4.kind==="datetime")}get isDate(){return!!this._def.checks.find(ch4=>ch4.kind==="date")}get isTime(){return!!this._def.checks.find(ch4=>ch4.kind==="time")}get isDuration(){return!!this._def.checks.find(ch4=>ch4.kind==="duration")}get isEmail(){return!!this._def.checks.find(ch4=>ch4.kind==="email")}get isURL(){return!!this._def.checks.find(ch4=>ch4.kind==="url")}get isEmoji(){return!!this._def.checks.find(ch4=>ch4.kind==="emoji")}get isUUID(){return!!this._def.checks.find(ch4=>ch4.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(ch4=>ch4.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(ch4=>ch4.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(ch4=>ch4.kind==="cuid2")}get isULID(){return!!this._def.checks.find(ch4=>ch4.kind==="ulid")}get isIP(){return!!this._def.checks.find(ch4=>ch4.kind==="ip")}get isCIDR(){return!!this._def.checks.find(ch4=>ch4.kind==="cidr")}get isBase64(){return!!this._def.checks.find(ch4=>ch4.kind==="base64")}get isBase64url(){return!!this._def.checks.find(ch4=>ch4.kind==="base64url")}get minLength(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4}get maxLength(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5}};ZodString.create=params=>new ZodString({checks:[],typeName:ZodFirstPartyTypeKind.ZodString,coerce:params?.coerce??!1,...processCreateParams(params)});ZodNumber=class _ZodNumber3 extends ZodType{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)!==ZodParsedType.number){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.number,received:ctx2.parsedType}),INVALID}let ctx,status=new ParseStatus;for(let check of this._def.checks)check.kind==="int"?util.isInteger(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="multipleOf"?floatSafeRemainder(input2.data,check.value)!==0&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):check.kind==="finite"?Number.isFinite(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_finite,message:check.message}),status.dirty()):util.assertNever(check);return{status:status.value,value:input2.data}}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodNumber3({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new _ZodNumber3({...this._def,checks:[...this._def.checks,check]})}int(message){return this._addCheck({kind:"int",message:errorUtil.toString(message)})}positive(message){return this._addCheck({kind:"min",value:0,inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:0,inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:0,inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:0,inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}finite(message){return this._addCheck({kind:"finite",message:errorUtil.toString(message)})}safe(message){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:errorUtil.toString(message)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:errorUtil.toString(message)})}get minValue(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4}get maxValue(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5}get isInt(){return!!this._def.checks.find(ch4=>ch4.kind==="int"||ch4.kind==="multipleOf"&&util.isInteger(ch4.value))}get isFinite(){let max5=null,min4=null;for(let ch4 of this._def.checks){if(ch4.kind==="finite"||ch4.kind==="int"||ch4.kind==="multipleOf")return!0;ch4.kind==="min"?(min4===null||ch4.value>min4)&&(min4=ch4.value):ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value)}return Number.isFinite(min4)&&Number.isFinite(max5)}};ZodNumber.create=params=>new ZodNumber({checks:[],typeName:ZodFirstPartyTypeKind.ZodNumber,coerce:params?.coerce||!1,...processCreateParams(params)});ZodBigInt=class _ZodBigInt3 extends ZodType{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)!==ZodParsedType.bigint)return this._getInvalidInput(input2);let ctx,status=new ParseStatus;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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):util.assertNever(check);return{status:status.value,value:input2.data}}_getInvalidInput(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.bigint,received:ctx.parsedType}),INVALID}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodBigInt3({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new _ZodBigInt3({...this._def,checks:[...this._def.checks,check]})}positive(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}get minValue(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4}get maxValue(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5}};ZodBigInt.create=params=>new ZodBigInt({checks:[],typeName:ZodFirstPartyTypeKind.ZodBigInt,coerce:params?.coerce??!1,...processCreateParams(params)});ZodBoolean=class extends ZodType{_parse(input2){if(this._def.coerce&&(input2.data=!!input2.data),this._getType(input2)!==ZodParsedType.boolean){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.boolean,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodBoolean.create=params=>new ZodBoolean({typeName:ZodFirstPartyTypeKind.ZodBoolean,coerce:params?.coerce||!1,...processCreateParams(params)});ZodDate=class _ZodDate3 extends ZodType{_parse(input2){if(this._def.coerce&&(input2.data=new Date(input2.data)),this._getType(input2)!==ZodParsedType.date){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.date,received:ctx2.parsedType}),INVALID}if(Number.isNaN(input2.data.getTime())){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_date}),INVALID}let status=new ParseStatus,ctx;for(let check of this._def.checks)check.kind==="min"?input2.data.getTime()<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.too_big,message:check.message,inclusive:!0,exact:!1,maximum:check.value,type:"date"}),status.dirty()):util.assertNever(check);return{status:status.value,value:new Date(input2.data.getTime())}}_addCheck(check){return new _ZodDate3({...this._def,checks:[...this._def.checks,check]})}min(minDate,message){return this._addCheck({kind:"min",value:minDate.getTime(),message:errorUtil.toString(message)})}max(maxDate,message){return this._addCheck({kind:"max",value:maxDate.getTime(),message:errorUtil.toString(message)})}get minDate(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4!=null?new Date(min4):null}get maxDate(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5!=null?new Date(max5):null}};ZodDate.create=params=>new ZodDate({checks:[],coerce:params?.coerce||!1,typeName:ZodFirstPartyTypeKind.ZodDate,...processCreateParams(params)});ZodSymbol=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.symbol){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.symbol,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodSymbol.create=params=>new ZodSymbol({typeName:ZodFirstPartyTypeKind.ZodSymbol,...processCreateParams(params)});ZodUndefined=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.undefined,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodUndefined.create=params=>new ZodUndefined({typeName:ZodFirstPartyTypeKind.ZodUndefined,...processCreateParams(params)});ZodNull=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.null){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.null,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodNull.create=params=>new ZodNull({typeName:ZodFirstPartyTypeKind.ZodNull,...processCreateParams(params)});ZodAny=class extends ZodType{constructor(){super(...arguments),this._any=!0}_parse(input2){return OK(input2.data)}};ZodAny.create=params=>new ZodAny({typeName:ZodFirstPartyTypeKind.ZodAny,...processCreateParams(params)});ZodUnknown=class extends ZodType{constructor(){super(...arguments),this._unknown=!0}_parse(input2){return OK(input2.data)}};ZodUnknown.create=params=>new ZodUnknown({typeName:ZodFirstPartyTypeKind.ZodUnknown,...processCreateParams(params)});ZodNever=class extends ZodType{_parse(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.never,received:ctx.parsedType}),INVALID}};ZodNever.create=params=>new ZodNever({typeName:ZodFirstPartyTypeKind.ZodNever,...processCreateParams(params)});ZodVoid=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.void,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodVoid.create=params=>new ZodVoid({typeName:ZodFirstPartyTypeKind.ZodVoid,...processCreateParams(params)});ZodArray=class _ZodArray3 extends ZodType{_parse(input2){let{ctx,status}=this._processInputParams(input2),def=this._def;if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(def.exactLength!==null){let tooBig=ctx.data.length>def.exactLength.value,tooSmall=ctx.data.length<def.exactLength.value;(tooBig||tooSmall)&&(addIssueToContext(ctx,{code:tooBig?ZodIssueCode.too_big:ZodIssueCode.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&&(addIssueToContext(ctx,{code:ZodIssueCode.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&&(addIssueToContext(ctx,{code:ZodIssueCode.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,i10)=>def.type._parseAsync(new ParseInputLazyPath(ctx,item,ctx.path,i10)))).then(result2=>ParseStatus.mergeArray(status,result2));let result=[...ctx.data].map((item,i10)=>def.type._parseSync(new ParseInputLazyPath(ctx,item,ctx.path,i10)));return ParseStatus.mergeArray(status,result)}get element(){return this._def.type}min(minLength,message){return new _ZodArray3({...this._def,minLength:{value:minLength,message:errorUtil.toString(message)}})}max(maxLength,message){return new _ZodArray3({...this._def,maxLength:{value:maxLength,message:errorUtil.toString(message)}})}length(len6,message){return new _ZodArray3({...this._def,exactLength:{value:len6,message:errorUtil.toString(message)}})}nonempty(message){return this.min(1,message)}};ZodArray.create=(schema,params)=>new ZodArray({type:schema,minLength:null,maxLength:null,exactLength:null,typeName:ZodFirstPartyTypeKind.ZodArray,...processCreateParams(params)});ZodObject=class _ZodObject3 extends ZodType{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let shape21=this._def.shape(),keys=util.objectKeys(shape21);return this._cached={shape:shape21,keys},this._cached}_parse(input2){if(this._getType(input2)!==ZodParsedType.object){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx2.parsedType}),INVALID}let{status,ctx}=this._processInputParams(input2),{shape:shape21,keys:shapeKeys}=this._getCached(),extraKeys=[];if(!(this._def.catchall instanceof ZodNever&&this._def.unknownKeys==="strip"))for(let key in ctx.data)shapeKeys.includes(key)||extraKeys.push(key);let pairs5=[];for(let key of shapeKeys){let keyValidator=shape21[key],value=ctx.data[key];pairs5.push({key:{status:"valid",value:key},value:keyValidator._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}if(this._def.catchall instanceof ZodNever){let unknownKeys=this._def.unknownKeys;if(unknownKeys==="passthrough")for(let key of extraKeys)pairs5.push({key:{status:"valid",value:key},value:{status:"valid",value:ctx.data[key]}});else if(unknownKeys==="strict")extraKeys.length>0&&(addIssueToContext(ctx,{code:ZodIssueCode.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];pairs5.push({key:{status:"valid",value:key},value:catchall._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}}return ctx.common.async?Promise.resolve().then(async()=>{let syncPairs=[];for(let pair of pairs5){let key=await pair.key,value=await pair.value;syncPairs.push({key,value,alwaysSet:pair.alwaysSet})}return syncPairs}).then(syncPairs=>ParseStatus.mergeObjectSync(status,syncPairs)):ParseStatus.mergeObjectSync(status,pairs5)}get shape(){return this._def.shape()}strict(message){return errorUtil.errToObj,new _ZodObject3({...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:errorUtil.errToObj(message).message??defaultError}:{message:defaultError}}}:{}})}strip(){return new _ZodObject3({...this._def,unknownKeys:"strip"})}passthrough(){return new _ZodObject3({...this._def,unknownKeys:"passthrough"})}extend(augmentation){return new _ZodObject3({...this._def,shape:()=>({...this._def.shape(),...augmentation})})}merge(merging){return new _ZodObject3({unknownKeys:merging._def.unknownKeys,catchall:merging._def.catchall,shape:()=>({...this._def.shape(),...merging._def.shape()}),typeName:ZodFirstPartyTypeKind.ZodObject})}setKey(key,schema){return this.augment({[key]:schema})}catchall(index2){return new _ZodObject3({...this._def,catchall:index2})}pick(mask){let shape21={};for(let key of util.objectKeys(mask))mask[key]&&this.shape[key]&&(shape21[key]=this.shape[key]);return new _ZodObject3({...this._def,shape:()=>shape21})}omit(mask){let shape21={};for(let key of util.objectKeys(this.shape))mask[key]||(shape21[key]=this.shape[key]);return new _ZodObject3({...this._def,shape:()=>shape21})}deepPartial(){return deepPartialify(this)}partial(mask){let newShape={};for(let key of util.objectKeys(this.shape)){let fieldSchema=this.shape[key];mask&&!mask[key]?newShape[key]=fieldSchema:newShape[key]=fieldSchema.optional()}return new _ZodObject3({...this._def,shape:()=>newShape})}required(mask){let newShape={};for(let key of util.objectKeys(this.shape))if(mask&&!mask[key])newShape[key]=this.shape[key];else{let newField=this.shape[key];for(;newField instanceof ZodOptional;)newField=newField._def.innerType;newShape[key]=newField}return new _ZodObject3({...this._def,shape:()=>newShape})}keyof(){return createZodEnum(util.objectKeys(this.shape))}};ZodObject.create=(shape21,params)=>new ZodObject({shape:()=>shape21,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)});ZodObject.strictCreate=(shape21,params)=>new ZodObject({shape:()=>shape21,unknownKeys:"strict",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)});ZodObject.lazycreate=(shape21,params)=>new ZodObject({shape:shape21,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)});ZodUnion=class extends ZodType{_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 ZodError(result.ctx.common.issues));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}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 ZodError(issues2));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}}get options(){return this._def.options}};ZodUnion.create=(types,params)=>new ZodUnion({options:types,typeName:ZodFirstPartyTypeKind.ZodUnion,...processCreateParams(params)});getDiscriminator=type=>type instanceof ZodLazy?getDiscriminator(type.schema):type instanceof ZodEffects?getDiscriminator(type.innerType()):type instanceof ZodLiteral?[type.value]:type instanceof ZodEnum?type.options:type instanceof ZodNativeEnum?util.objectValues(type.enum):type instanceof ZodDefault?getDiscriminator(type._def.innerType):type instanceof ZodUndefined?[void 0]:type instanceof ZodNull?[null]:type instanceof ZodOptional?[void 0,...getDiscriminator(type.unwrap())]:type instanceof ZodNullable?[null,...getDiscriminator(type.unwrap())]:type instanceof ZodBranded||type instanceof ZodReadonly?getDiscriminator(type.unwrap()):type instanceof ZodCatch?getDiscriminator(type._def.innerType):[],ZodDiscriminatedUnion=class _ZodDiscriminatedUnion3 extends ZodType{_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;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}):(addIssueToContext(ctx,{code:ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[discriminator]}),INVALID)}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=getDiscriminator(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 _ZodDiscriminatedUnion3({typeName:ZodFirstPartyTypeKind.ZodDiscriminatedUnion,discriminator,options,optionsMap,...processCreateParams(params)})}};ZodIntersection=class extends ZodType{_parse(input2){let{status,ctx}=this._processInputParams(input2),handleParsed=(parsedLeft,parsedRight)=>{if(isAborted(parsedLeft)||isAborted(parsedRight))return INVALID;let merged=mergeValues(parsedLeft.value,parsedRight.value);return merged.valid?((isDirty(parsedLeft)||isDirty(parsedRight))&&status.dirty(),{status:status.value,value:merged.data}):(addIssueToContext(ctx,{code:ZodIssueCode.invalid_intersection_types}),INVALID)};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}))}};ZodIntersection.create=(left,right,params)=>new ZodIntersection({left,right,typeName:ZodFirstPartyTypeKind.ZodIntersection,...processCreateParams(params)});ZodTuple=class _ZodTuple3 extends ZodType{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(ctx.data.length<this._def.items.length)return addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),INVALID;!this._def.rest&&ctx.data.length>this._def.items.length&&(addIssueToContext(ctx,{code:ZodIssueCode.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 ParseInputLazyPath(ctx,item,ctx.path,itemIndex)):null}).filter(x11=>!!x11);return ctx.common.async?Promise.all(items).then(results=>ParseStatus.mergeArray(status,results)):ParseStatus.mergeArray(status,items)}get items(){return this._def.items}rest(rest){return new _ZodTuple3({...this._def,rest})}};ZodTuple.create=(schemas,params)=>{if(!Array.isArray(schemas))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ZodTuple({items:schemas,typeName:ZodFirstPartyTypeKind.ZodTuple,rest:null,...processCreateParams(params)})};ZodRecord=class _ZodRecord3 extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;let pairs5=[],keyType=this._def.keyType,valueType=this._def.valueType;for(let key in ctx.data)pairs5.push({key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,key)),value:valueType._parse(new ParseInputLazyPath(ctx,ctx.data[key],ctx.path,key)),alwaysSet:key in ctx.data});return ctx.common.async?ParseStatus.mergeObjectAsync(status,pairs5):ParseStatus.mergeObjectSync(status,pairs5)}get element(){return this._def.valueType}static create(first,second,third){return second instanceof ZodType?new _ZodRecord3({keyType:first,valueType:second,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(third)}):new _ZodRecord3({keyType:ZodString.create(),valueType:first,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(second)})}},ZodMap=class extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.map)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.map,received:ctx.parsedType}),INVALID;let keyType=this._def.keyType,valueType=this._def.valueType,pairs5=[...ctx.data.entries()].map(([key,value],index2)=>({key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,[index2,"key"])),value:valueType._parse(new ParseInputLazyPath(ctx,value,ctx.path,[index2,"value"]))}));if(ctx.common.async){let finalMap=new Map;return Promise.resolve().then(async()=>{for(let pair of pairs5){let key=await pair.key,value=await pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID;(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 pairs5){let key=pair.key,value=pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}}}};ZodMap.create=(keyType,valueType,params)=>new ZodMap({valueType,keyType,typeName:ZodFirstPartyTypeKind.ZodMap,...processCreateParams(params)});ZodSet=class _ZodSet3 extends ZodType{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.set)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.set,received:ctx.parsedType}),INVALID;let def=this._def;def.minSize!==null&&ctx.data.size<def.minSize.value&&(addIssueToContext(ctx,{code:ZodIssueCode.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&&(addIssueToContext(ctx,{code:ZodIssueCode.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 INVALID;element.status==="dirty"&&status.dirty(),parsedSet.add(element.value)}return{status:status.value,value:parsedSet}}let elements=[...ctx.data.values()].map((item,i10)=>valueType._parse(new ParseInputLazyPath(ctx,item,ctx.path,i10)));return ctx.common.async?Promise.all(elements).then(elements2=>finalizeSet(elements2)):finalizeSet(elements)}min(minSize,message){return new _ZodSet3({...this._def,minSize:{value:minSize,message:errorUtil.toString(message)}})}max(maxSize,message){return new _ZodSet3({...this._def,maxSize:{value:maxSize,message:errorUtil.toString(message)}})}size(size3,message){return this.min(size3,message).max(size3,message)}nonempty(message){return this.min(1,message)}};ZodSet.create=(valueType,params)=>new ZodSet({valueType,minSize:null,maxSize:null,typeName:ZodFirstPartyTypeKind.ZodSet,...processCreateParams(params)});ZodFunction=class _ZodFunction3 extends ZodType{constructor(){super(...arguments),this.validate=this.implement}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.function)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.function,received:ctx.parsedType}),INVALID;function makeArgsIssue(args,error2){return makeIssue({data:args,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter(x11=>!!x11),issueData:{code:ZodIssueCode.invalid_arguments,argumentsError:error2}})}function makeReturnsIssue(returns,error2){return makeIssue({data:returns,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter(x11=>!!x11),issueData:{code:ZodIssueCode.invalid_return_type,returnTypeError:error2}})}let params={errorMap:ctx.common.contextualErrorMap},fn3=ctx.data;if(this._def.returns instanceof ZodPromise){let me4=this;return OK(async function(...args){let error2=new ZodError([]),parsedArgs=await me4._def.args.parseAsync(args,params).catch(e55=>{throw error2.addIssue(makeArgsIssue(args,e55)),error2}),result=await Reflect.apply(fn3,this,parsedArgs);return await me4._def.returns._def.type.parseAsync(result,params).catch(e55=>{throw error2.addIssue(makeReturnsIssue(result,e55)),error2})})}else{let me4=this;return OK(function(...args){let parsedArgs=me4._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError([makeArgsIssue(args,parsedArgs.error)]);let result=Reflect.apply(fn3,this,parsedArgs.data),parsedReturns=me4._def.returns.safeParse(result,params);if(!parsedReturns.success)throw new ZodError([makeReturnsIssue(result,parsedReturns.error)]);return parsedReturns.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...items){return new _ZodFunction3({...this._def,args:ZodTuple.create(items).rest(ZodUnknown.create())})}returns(returnType){return new _ZodFunction3({...this._def,returns:returnType})}implement(func){return this.parse(func)}strictImplement(func){return this.parse(func)}static create(args,returns,params){return new _ZodFunction3({args:args||ZodTuple.create([]).rest(ZodUnknown.create()),returns:returns||ZodUnknown.create(),typeName:ZodFirstPartyTypeKind.ZodFunction,...processCreateParams(params)})}},ZodLazy=class extends ZodType{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})}};ZodLazy.create=(getter,params)=>new ZodLazy({getter,typeName:ZodFirstPartyTypeKind.ZodLazy,...processCreateParams(params)});ZodLiteral=class extends ZodType{_parse(input2){if(input2.data!==this._def.value){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_literal,expected:this._def.value}),INVALID}return{status:"valid",value:input2.data}}get value(){return this._def.value}};ZodLiteral.create=(value,params)=>new ZodLiteral({value,typeName:ZodFirstPartyTypeKind.ZodLiteral,...processCreateParams(params)});ZodEnum=class _ZodEnum3 extends ZodType{_parse(input2){if(typeof input2.data!="string"){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}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 addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(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(values2,newDef=this._def){return _ZodEnum3.create(values2,{...this._def,...newDef})}exclude(values2,newDef=this._def){return _ZodEnum3.create(this.options.filter(opt2=>!values2.includes(opt2)),{...this._def,...newDef})}};ZodEnum.create=createZodEnum;ZodNativeEnum=class extends ZodType{_parse(input2){let nativeEnumValues=util.getValidEnumValues(this._def.values),ctx=this._getOrReturnCtx(input2);if(ctx.parsedType!==ZodParsedType.string&&ctx.parsedType!==ZodParsedType.number){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}if(this._cache||(this._cache=new Set(util.getValidEnumValues(this._def.values))),!this._cache.has(input2.data)){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(input2.data)}get enum(){return this._def.values}};ZodNativeEnum.create=(values2,params)=>new ZodNativeEnum({values:values2,typeName:ZodFirstPartyTypeKind.ZodNativeEnum,...processCreateParams(params)});ZodPromise=class extends ZodType{unwrap(){return this._def.type}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.promise&&ctx.common.async===!1)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.promise,received:ctx.parsedType}),INVALID;let promisified=ctx.parsedType===ZodParsedType.promise?ctx.data:Promise.resolve(ctx.data);return OK(promisified.then(data=>this._def.type.parseAsync(data,{path:ctx.path,errorMap:ctx.common.contextualErrorMap})))}};ZodPromise.create=(schema,params)=>new ZodPromise({type:schema,typeName:ZodFirstPartyTypeKind.ZodPromise,...processCreateParams(params)});ZodEffects=class extends ZodType{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ZodFirstPartyTypeKind.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(input2){let{status,ctx}=this._processInputParams(input2),effect=this._def.effect||null,checkCtx={addIssue:arg=>{addIssueToContext(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 INVALID;let result=await this._def.schema._parseAsync({data:processed2,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID:result.status==="dirty"?DIRTY(result.value):status.value==="dirty"?DIRTY(result.value):result});{if(status.value==="aborted")return INVALID;let result=this._def.schema._parseSync({data:processed,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID:result.status==="dirty"?DIRTY(result.value):status.value==="dirty"?DIRTY(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"?INVALID:(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"?INVALID:(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(!isValid(base))return INVALID;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=>isValid(base)?Promise.resolve(effect.transform(base.value,checkCtx)).then(result=>({status:status.value,value:result})):INVALID);util.assertNever(effect)}};ZodEffects.create=(schema,effect,params)=>new ZodEffects({schema,typeName:ZodFirstPartyTypeKind.ZodEffects,effect,...processCreateParams(params)});ZodEffects.createWithPreprocess=(preprocess,schema,params)=>new ZodEffects({schema,effect:{type:"preprocess",transform:preprocess},typeName:ZodFirstPartyTypeKind.ZodEffects,...processCreateParams(params)});ZodOptional=class extends ZodType{_parse(input2){return this._getType(input2)===ZodParsedType.undefined?OK(void 0):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodOptional.create=(type,params)=>new ZodOptional({innerType:type,typeName:ZodFirstPartyTypeKind.ZodOptional,...processCreateParams(params)});ZodNullable=class extends ZodType{_parse(input2){return this._getType(input2)===ZodParsedType.null?OK(null):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodNullable.create=(type,params)=>new ZodNullable({innerType:type,typeName:ZodFirstPartyTypeKind.ZodNullable,...processCreateParams(params)});ZodDefault=class extends ZodType{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return ctx.parsedType===ZodParsedType.undefined&&(data=this._def.defaultValue()),this._def.innerType._parse({data,path:ctx.path,parent:ctx})}removeDefault(){return this._def.innerType}};ZodDefault.create=(type,params)=>new ZodDefault({innerType:type,typeName:ZodFirstPartyTypeKind.ZodDefault,defaultValue:typeof params.default=="function"?params.default:()=>params.default,...processCreateParams(params)});ZodCatch=class extends ZodType{_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 isAsync(result)?result.then(result2=>({status:"valid",value:result2.status==="valid"?result2.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})})):{status:"valid",value:result.status==="valid"?result.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})}}removeCatch(){return this._def.innerType}};ZodCatch.create=(type,params)=>new ZodCatch({innerType:type,typeName:ZodFirstPartyTypeKind.ZodCatch,catchValue:typeof params.catch=="function"?params.catch:()=>params.catch,...processCreateParams(params)});ZodNaN=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.nan){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.nan,received:ctx.parsedType}),INVALID}return{status:"valid",value:input2.data}}};ZodNaN.create=params=>new ZodNaN({typeName:ZodFirstPartyTypeKind.ZodNaN,...processCreateParams(params)});BRAND=Symbol("zod_brand"),ZodBranded=class extends ZodType{_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}},ZodPipeline=class _ZodPipeline3 extends ZodType{_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"?INVALID:inResult.status==="dirty"?(status.dirty(),DIRTY(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"?INVALID:inResult.status==="dirty"?(status.dirty(),{status:"dirty",value:inResult.value}):this._def.out._parseSync({data:inResult.value,path:ctx.path,parent:ctx})}}static create(a10,b11){return new _ZodPipeline3({in:a10,out:b11,typeName:ZodFirstPartyTypeKind.ZodPipeline})}},ZodReadonly=class extends ZodType{_parse(input2){let result=this._def.innerType._parse(input2),freeze=data=>(isValid(data)&&(data.value=Object.freeze(data.value)),data);return isAsync(result)?result.then(data=>freeze(data)):freeze(result)}unwrap(){return this._def.innerType}};ZodReadonly.create=(type,params)=>new ZodReadonly({innerType:type,typeName:ZodFirstPartyTypeKind.ZodReadonly,...processCreateParams(params)});late={object:ZodObject.lazycreate};(function(ZodFirstPartyTypeKind3){ZodFirstPartyTypeKind3.ZodString="ZodString",ZodFirstPartyTypeKind3.ZodNumber="ZodNumber",ZodFirstPartyTypeKind3.ZodNaN="ZodNaN",ZodFirstPartyTypeKind3.ZodBigInt="ZodBigInt",ZodFirstPartyTypeKind3.ZodBoolean="ZodBoolean",ZodFirstPartyTypeKind3.ZodDate="ZodDate",ZodFirstPartyTypeKind3.ZodSymbol="ZodSymbol",ZodFirstPartyTypeKind3.ZodUndefined="ZodUndefined",ZodFirstPartyTypeKind3.ZodNull="ZodNull",ZodFirstPartyTypeKind3.ZodAny="ZodAny",ZodFirstPartyTypeKind3.ZodUnknown="ZodUnknown",ZodFirstPartyTypeKind3.ZodNever="ZodNever",ZodFirstPartyTypeKind3.ZodVoid="ZodVoid",ZodFirstPartyTypeKind3.ZodArray="ZodArray",ZodFirstPartyTypeKind3.ZodObject="ZodObject",ZodFirstPartyTypeKind3.ZodUnion="ZodUnion",ZodFirstPartyTypeKind3.ZodDiscriminatedUnion="ZodDiscriminatedUnion",ZodFirstPartyTypeKind3.ZodIntersection="ZodIntersection",ZodFirstPartyTypeKind3.ZodTuple="ZodTuple",ZodFirstPartyTypeKind3.ZodRecord="ZodRecord",ZodFirstPartyTypeKind3.ZodMap="ZodMap",ZodFirstPartyTypeKind3.ZodSet="ZodSet",ZodFirstPartyTypeKind3.ZodFunction="ZodFunction",ZodFirstPartyTypeKind3.ZodLazy="ZodLazy",ZodFirstPartyTypeKind3.ZodLiteral="ZodLiteral",ZodFirstPartyTypeKind3.ZodEnum="ZodEnum",ZodFirstPartyTypeKind3.ZodEffects="ZodEffects",ZodFirstPartyTypeKind3.ZodNativeEnum="ZodNativeEnum",ZodFirstPartyTypeKind3.ZodOptional="ZodOptional",ZodFirstPartyTypeKind3.ZodNullable="ZodNullable",ZodFirstPartyTypeKind3.ZodDefault="ZodDefault",ZodFirstPartyTypeKind3.ZodCatch="ZodCatch",ZodFirstPartyTypeKind3.ZodPromise="ZodPromise",ZodFirstPartyTypeKind3.ZodBranded="ZodBranded",ZodFirstPartyTypeKind3.ZodPipeline="ZodPipeline",ZodFirstPartyTypeKind3.ZodReadonly="ZodReadonly"})(ZodFirstPartyTypeKind||(ZodFirstPartyTypeKind={}));instanceOfType=(cls,params={message:`Input not instance of ${cls.name}`})=>custom(data=>data instanceof cls,params),stringType=ZodString.create,numberType=ZodNumber.create,nanType=ZodNaN.create,bigIntType=ZodBigInt.create,booleanType=ZodBoolean.create,dateType=ZodDate.create,symbolType=ZodSymbol.create,undefinedType=ZodUndefined.create,nullType=ZodNull.create,anyType=ZodAny.create,unknownType=ZodUnknown.create,neverType=ZodNever.create,voidType=ZodVoid.create,arrayType=ZodArray.create,objectType=ZodObject.create,strictObjectType=ZodObject.strictCreate,unionType=ZodUnion.create,discriminatedUnionType=ZodDiscriminatedUnion.create,intersectionType=ZodIntersection.create,tupleType=ZodTuple.create,recordType=ZodRecord.create,mapType=ZodMap.create,setType=ZodSet.create,functionType=ZodFunction.create,lazyType=ZodLazy.create,literalType=ZodLiteral.create,enumType=ZodEnum.create,nativeEnumType=ZodNativeEnum.create,promiseType=ZodPromise.create,effectsType=ZodEffects.create,optionalType=ZodOptional.create,nullableType=ZodNullable.create,preprocessType=ZodEffects.createWithPreprocess,pipelineType=ZodPipeline.create,ostring=()=>stringType().optional(),onumber=()=>numberType().optional(),oboolean=()=>booleanType().optional(),coerce={string:(arg=>ZodString.create({...arg,coerce:!0})),number:(arg=>ZodNumber.create({...arg,coerce:!0})),boolean:(arg=>ZodBoolean.create({...arg,coerce:!0})),bigint:(arg=>ZodBigInt.create({...arg,coerce:!0})),date:(arg=>ZodDate.create({...arg,coerce:!0}))},NEVER=INVALID}});var external_exports={};__export(external_exports,{BRAND:()=>BRAND,DIRTY:()=>DIRTY,EMPTY_PATH:()=>EMPTY_PATH,INVALID:()=>INVALID,NEVER:()=>NEVER,OK:()=>OK,ParseStatus:()=>ParseStatus,Schema:()=>ZodType,ZodAny:()=>ZodAny,ZodArray:()=>ZodArray,ZodBigInt:()=>ZodBigInt,ZodBoolean:()=>ZodBoolean,ZodBranded:()=>ZodBranded,ZodCatch:()=>ZodCatch,ZodDate:()=>ZodDate,ZodDefault:()=>ZodDefault,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion,ZodEffects:()=>ZodEffects,ZodEnum:()=>ZodEnum,ZodError:()=>ZodError,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind,ZodFunction:()=>ZodFunction,ZodIntersection:()=>ZodIntersection,ZodIssueCode:()=>ZodIssueCode,ZodLazy:()=>ZodLazy,ZodLiteral:()=>ZodLiteral,ZodMap:()=>ZodMap,ZodNaN:()=>ZodNaN,ZodNativeEnum:()=>ZodNativeEnum,ZodNever:()=>ZodNever,ZodNull:()=>ZodNull,ZodNullable:()=>ZodNullable,ZodNumber:()=>ZodNumber,ZodObject:()=>ZodObject,ZodOptional:()=>ZodOptional,ZodParsedType:()=>ZodParsedType,ZodPipeline:()=>ZodPipeline,ZodPromise:()=>ZodPromise,ZodReadonly:()=>ZodReadonly,ZodRecord:()=>ZodRecord,ZodSchema:()=>ZodType,ZodSet:()=>ZodSet,ZodString:()=>ZodString,ZodSymbol:()=>ZodSymbol,ZodTransformer:()=>ZodEffects,ZodTuple:()=>ZodTuple,ZodType:()=>ZodType,ZodUndefined:()=>ZodUndefined,ZodUnion:()=>ZodUnion,ZodUnknown:()=>ZodUnknown,ZodVoid:()=>ZodVoid,addIssueToContext:()=>addIssueToContext,any:()=>anyType,array:()=>arrayType,bigint:()=>bigIntType,boolean:()=>booleanType,coerce:()=>coerce,custom:()=>custom,date:()=>dateType,datetimeRegex:()=>datetimeRegex,defaultErrorMap:()=>en_default,discriminatedUnion:()=>discriminatedUnionType,effect:()=>effectsType,enum:()=>enumType,function:()=>functionType,getErrorMap:()=>getErrorMap,getParsedType:()=>getParsedType,instanceof:()=>instanceOfType,intersection:()=>intersectionType,isAborted:()=>isAborted,isAsync:()=>isAsync,isDirty:()=>isDirty,isValid:()=>isValid,late:()=>late,lazy:()=>lazyType,literal:()=>literalType,makeIssue:()=>makeIssue,map:()=>mapType,nan:()=>nanType,nativeEnum:()=>nativeEnumType,never:()=>neverType,null:()=>nullType,nullable:()=>nullableType,number:()=>numberType,object:()=>objectType,objectUtil:()=>objectUtil,oboolean:()=>oboolean,onumber:()=>onumber,optional:()=>optionalType,ostring:()=>ostring,pipeline:()=>pipelineType,preprocess:()=>preprocessType,promise:()=>promiseType,quotelessJson:()=>quotelessJson,record:()=>recordType,set:()=>setType,setErrorMap:()=>setErrorMap,strictObject:()=>strictObjectType,string:()=>stringType,symbol:()=>symbolType,transformer:()=>effectsType,tuple:()=>tupleType,undefined:()=>undefinedType,union:()=>unionType,unknown:()=>unknownType,util:()=>util,void:()=>voidType});var init_external=__esm({"node_modules/zod/v3/external.js"(){"use strict";init_errors();init_parseUtil();init_typeAliases();init_util();init_types();init_ZodError()}});var init_zod=__esm({"node_modules/zod/index.js"(){"use strict";init_external();init_external()}});function getSiPrefixMultiplier(prefix){return SI_PREFIX_VALUES.get(prefix)}function getBaseTscircuitUnit(unit2){for(let info of Object.values(unitMappings)){if(unit2 in info.variants)return{baseUnit:info.baseUnit,conversionFactor:info.variants[unit2]};for(let[variant,conversionFactor]of Object.entries(info.variants)){if(!unit2.endsWith(variant))continue;let prefix=unit2.slice(0,-variant.length),prefixMultiplier=getSiPrefixMultiplier(prefix);if(prefixMultiplier!=null)return{baseUnit:info.baseUnit,conversionFactor:prefixMultiplier*conversionFactor}}}return{baseUnit:unit2,conversionFactor:1}}function parseAndConvertSiUnit(v11,unitOfValue){if(v11==null)return{parsedUnit:null,unitOfValue:null,value:null};if(typeof v11=="string"&&v11.match(/^-?[\d.]+$/))return{value:Number.parseFloat(v11),parsedUnit:null,unitOfValue:null};if(typeof v11=="number")return{value:v11,parsedUnit:null,unitOfValue:null};if(typeof v11=="object"&&"x"in v11&&"y"in v11){let firstResult=parseAndConvertSiUnit(v11.x,unitOfValue),xResult=parseAndConvertSiUnit(v11.x,unitOfValue),yResult=parseAndConvertSiUnit(v11.y,unitOfValue);return xResult.value===null||yResult.value===null?{parsedUnit:null,unitOfValue:null,value:null}:{parsedUnit:firstResult.parsedUnit,unitOfValue:firstResult.unitOfValue,value:{x:xResult.value,y:yResult.value}}}let unitReversed=v11.toString().split("").reverse().join("").match(/[^\d\s]+/)?.[0];if(!unitReversed)throw new Error(`Could not determine unit: "${v11}"`);let unit2=unitReversed.split("").reverse().join(""),numberPart=v11.slice(0,-unit2.length),bareSiPrefixMultiplier=getSiPrefixMultiplier(unit2);if(unitOfValue&&bareSiPrefixMultiplier!=null)return{parsedUnit:null,unitOfValue,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};if(bareSiPrefixMultiplier!=null&&!unitMappingAndVariantSuffixes.has(unit2))return{parsedUnit:null,unitOfValue:null,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};let{baseUnit,conversionFactor}=getBaseTscircuitUnit(unit2);return{parsedUnit:unit2,unitOfValue:baseUnit,value:conversionFactor*Number.parseFloat(numberPart)}}function formatSiUnit(value){if(value==null)return"";if(value===0)return"0";let absValue=Math.abs(value),prefixIndex=SI_PREFIXES2.findIndex(p11=>{let scaled2=absValue/p11.value;return scaled2>=1&&scaled2<1e3});prefixIndex===-1&&(prefixIndex=SI_PREFIXES2.indexOf(FALLBACK_PREFIX));let prefix=SI_PREFIXES2[prefixIndex],scaled=value/prefix.value;for(;prefixIndex>0&&Math.abs(Number(scaled.toPrecision(3)))>=1e3;)prefixIndex-=1,prefix=SI_PREFIXES2[prefixIndex],scaled=value/prefix.value;let formatted=scaled.toPrecision(3);return formatted.includes(".")&&!/\.0+$/.test(formatted)&&(formatted=formatted.replace(/0+$/,"")),formatted=formatted.replace(/\.0+$/,""),`${formatted}${prefix.symbol}`}var formatMm,SI_PREFIX_VALUES,SI_PREFIXES,unitMappings,unitMappingAndVariantSuffixes,SI_PREFIX_PATTERN,SI_UNIT_PATTERN,SI_PREFIXES2,FALLBACK_PREFIX,init_dist=__esm({"node_modules/format-si-unit/dist/index.js"(){"use strict";formatMm=value=>{let rounded=Math.round(value*1e3)/1e3;return`${Number(rounded.toFixed(3))}mm`},SI_PREFIX_VALUES=new Map([["T",1e12],["G",1e9],["M",1e6],["K",1e3],["k",1e3],["",1],["m",.001],["\xB5",1e-6],["\u03BC",1e-6],["u",1e-6],["n",1e-9],["p",1e-12],["f",1e-15]]),SI_PREFIXES=[...SI_PREFIX_VALUES.keys()];unitMappings={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,mohm:.001,mOhm:.001,milliohm:.001,\u03A9:1,ohm:1,Ohm:1,k\u03A9:1e3,K\u03A9:1e3,kohm:1e3,kOhm:1e3,KOhm:1e3,Kohm:1e3,M\u03A9:1e6,Mohm:1e6,MOhm:1e6,megohm:1e6,Megohm:1e6,G\u03A9:1e9,Gohm:1e9,GOhm:1e9,T\u03A9:1e12,Tohm:1e12,TOhm: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,\u03BCA: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,\u03BCF:1e-6,uF:1e-6,mF:.001,F:1,kF:1e3,KF:1e3,MF:1e6}},H:{baseUnit:"H",variants:{pH:1e-12,nH:1e-9,\u00B5H:1e-6,\u03BCH:1e-6,uH:1e-6,mH:.001,H:1,kH:1e3,KH:1e3,MH:1e6}},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,\u03BCs:.001,ms:1,s:1e3}},mm:{baseUnit:"mm",variants:{nm:1e-6,\u00B5m:.001,\u03BCm:.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}}},unitMappingAndVariantSuffixes=new Set;for(let[baseUnit,info]of Object.entries(unitMappings)){unitMappingAndVariantSuffixes.add(baseUnit);for(let variant of Object.keys(info.variants))unitMappingAndVariantSuffixes.add(variant)}SI_PREFIX_PATTERN=SI_PREFIXES.filter(prefix=>prefix!=="").sort((a10,b11)=>b11.length-a10.length).map(prefix=>prefix.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),SI_UNIT_PATTERN=new RegExp(`^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)(?:(${SI_PREFIX_PATTERN}))?$`),SI_PREFIXES2=[{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"},{value:1,symbol:""},{value:.001,symbol:"m"},{value:1e-6,symbol:"\xB5"},{value:1e-9,symbol:"n"},{value:1e-12,symbol:"p"}],FALLBACK_PREFIX=SI_PREFIXES2[SI_PREFIXES2.length-1]}});var dist_exports={};__export(dist_exports,{all_layers:()=>all_layers,any_circuit_element:()=>any_circuit_element,any_soup_element:()=>any_soup_element,any_source_component:()=>any_source_component,asset:()=>asset,base_circuit_json_error:()=>base_circuit_json_error,battery_capacity:()=>battery_capacity,brep_shape:()=>brep_shape,cadModelDefaultDirectionMap:()=>cadModelDefaultDirectionMap,cad_cable:()=>cad_cable,cad_collision_error:()=>cad_collision_error,cad_component:()=>cad_component,cad_model_axis_directions:()=>cad_model_axis_directions,cad_model_formats:()=>cad_model_formats,cad_reference_surface:()=>cad_reference_surface,capacitance:()=>capacitance,circle_shape:()=>circle_shape,circuit_json_footprint_load_error:()=>circuit_json_footprint_load_error,current:()=>current,distance:()=>distance,duration_ms:()=>duration_ms,experiment_type:()=>experiment_type,external_footprint_load_error:()=>external_footprint_load_error,frequency:()=>frequency,getRotationBetweenPcbPin1Locations:()=>getRotationBetweenPcbPin1Locations,getSimulationReturnCurrentGridJsonSchema:()=>getSimulationReturnCurrentGridJsonSchema,getZodPrefixedIdWithDefault:()=>getZodPrefixedIdWithDefault,inductance:()=>inductance,insertionDirectionToCanonical:()=>insertionDirectionToCanonical,insertionDirectionToVector:()=>insertionDirectionToVector,insertion_direction:()=>insertion_direction,kicadAt:()=>kicadAt,kicadEffects:()=>kicadEffects,kicadFont:()=>kicadFont,kicadFootprintAttributes:()=>kicadFootprintAttributes,kicadFootprintMetadata:()=>kicadFootprintMetadata,kicadFootprintModel:()=>kicadFootprintModel,kicadFootprintPad:()=>kicadFootprintPad,kicadFootprintProperties:()=>kicadFootprintProperties,kicadProperty:()=>kicadProperty,kicadSymbolEffects:()=>kicadSymbolEffects,kicadSymbolMetadata:()=>kicadSymbolMetadata,kicadSymbolPinNames:()=>kicadSymbolPinNames,kicadSymbolPinNumbers:()=>kicadSymbolPinNumbers,kicadSymbolProperties:()=>kicadSymbolProperties,kicadSymbolProperty:()=>kicadSymbolProperty,layer_ref:()=>layer_ref,layer_string:()=>layer_string,length:()=>length,manufacturing_drc_properties:()=>manufacturing_drc_properties,ms:()=>ms,ninePointAnchor:()=>ninePointAnchor,parseAndConvertSiUnit:()=>parseAndConvertSiUnit,pcbRenderLayer:()=>pcbRenderLayer,pcb_autorouting_error:()=>pcb_autorouting_error,pcb_bend:()=>pcb_bend,pcb_board:()=>pcb_board,pcb_breakout_point:()=>pcb_breakout_point,pcb_bus_length_skew_error:()=>pcb_bus_length_skew_error,pcb_bus_routing_constraint_error:()=>pcb_bus_routing_constraint_error,pcb_bus_routing_constraint_warning:()=>pcb_bus_routing_constraint_warning,pcb_component:()=>pcb_component,pcb_component_invalid_layer_error:()=>pcb_component_invalid_layer_error,pcb_component_missing_courtyard_warning:()=>pcb_component_missing_courtyard_warning,pcb_component_not_on_board_edge_error:()=>pcb_component_not_on_board_edge_error,pcb_component_outside_board_error:()=>pcb_component_outside_board_error,pcb_connector_not_in_accessible_orientation_warning:()=>pcb_connector_not_in_accessible_orientation_warning,pcb_copper_pour:()=>pcb_copper_pour,pcb_copper_pour_brep:()=>pcb_copper_pour_brep,pcb_copper_pour_polygon:()=>pcb_copper_pour_polygon,pcb_copper_pour_rect:()=>pcb_copper_pour_rect,pcb_copper_text:()=>pcb_copper_text,pcb_courtyard_circle:()=>pcb_courtyard_circle,pcb_courtyard_outline:()=>pcb_courtyard_outline,pcb_courtyard_overlap_error:()=>pcb_courtyard_overlap_error,pcb_courtyard_pill:()=>pcb_courtyard_pill,pcb_courtyard_polygon:()=>pcb_courtyard_polygon,pcb_courtyard_rect:()=>pcb_courtyard_rect,pcb_cutout:()=>pcb_cutout,pcb_cutout_circle:()=>pcb_cutout_circle,pcb_cutout_path:()=>pcb_cutout_path,pcb_cutout_polygon:()=>pcb_cutout_polygon,pcb_cutout_rect:()=>pcb_cutout_rect,pcb_debug_line:()=>pcb_debug_line,pcb_debug_object:()=>pcb_debug_object,pcb_debug_object_base:()=>pcb_debug_object_base,pcb_debug_point:()=>pcb_debug_point,pcb_debug_rect:()=>pcb_debug_rect,pcb_fabrication_note_dimension:()=>pcb_fabrication_note_dimension,pcb_fabrication_note_path:()=>pcb_fabrication_note_path,pcb_fabrication_note_rect:()=>pcb_fabrication_note_rect,pcb_fabrication_note_text:()=>pcb_fabrication_note_text,pcb_fabricator_extra_charge_warning:()=>pcb_fabricator_extra_charge_warning,pcb_footprint_overlap_error:()=>pcb_footprint_overlap_error,pcb_ground_plane:()=>pcb_ground_plane,pcb_ground_plane_region:()=>pcb_ground_plane_region,pcb_group:()=>pcb_group,pcb_hole:()=>pcb_hole,pcb_hole_circle_or_square_shape:()=>pcb_hole_circle_or_square_shape,pcb_hole_circle_shape:()=>pcb_hole_circle_shape,pcb_hole_oval_shape:()=>pcb_hole_oval_shape,pcb_hole_pill_shape:()=>pcb_hole_pill_shape,pcb_hole_rect_shape:()=>pcb_hole_rect_shape,pcb_hole_rotated_pill_shape:()=>pcb_hole_rotated_pill_shape,pcb_keepout:()=>pcb_keepout,pcb_keepout_outline:()=>pcb_keepout_outline,pcb_keepout_overlap_warning:()=>pcb_keepout_overlap_warning,pcb_manual_edit_conflict_warning:()=>pcb_manual_edit_conflict_warning,pcb_missing_footprint_error:()=>pcb_missing_footprint_error,pcb_net:()=>pcb_net,pcb_note_dimension:()=>pcb_note_dimension,pcb_note_line:()=>pcb_note_line,pcb_note_path:()=>pcb_note_path,pcb_note_rect:()=>pcb_note_rect,pcb_note_text:()=>pcb_note_text,pcb_packing_error:()=>pcb_packing_error,pcb_pad_pad_clearance_error:()=>pcb_pad_pad_clearance_error,pcb_pad_trace_clearance_error:()=>pcb_pad_trace_clearance_error,pcb_panel:()=>pcb_panel,pcb_panelization_placement_error:()=>pcb_panelization_placement_error,pcb_pin1_location:()=>pcb_pin1_location,pcb_placement_error:()=>pcb_placement_error,pcb_plated_hole:()=>pcb_plated_hole,pcb_port:()=>pcb_port,pcb_port_not_connected_error:()=>pcb_port_not_connected_error,pcb_port_not_matched_error:()=>pcb_port_not_matched_error,pcb_preflight_routing_error:()=>pcb_preflight_routing_error,pcb_route_hint:()=>pcb_route_hint,pcb_route_hints:()=>pcb_route_hints,pcb_silkscreen_circle:()=>pcb_silkscreen_circle,pcb_silkscreen_graphic:()=>pcb_silkscreen_graphic,pcb_silkscreen_graphic_brep:()=>pcb_silkscreen_graphic_brep,pcb_silkscreen_line:()=>pcb_silkscreen_line,pcb_silkscreen_oval:()=>pcb_silkscreen_oval,pcb_silkscreen_path:()=>pcb_silkscreen_path,pcb_silkscreen_pill:()=>pcb_silkscreen_pill,pcb_silkscreen_rect:()=>pcb_silkscreen_rect,pcb_silkscreen_text:()=>pcb_silkscreen_text,pcb_smtpad:()=>pcb_smtpad,pcb_smtpad_pill:()=>pcb_smtpad_pill,pcb_solder_paste:()=>pcb_solder_paste,pcb_soldermask_opening:()=>pcb_soldermask_opening,pcb_stiffener:()=>pcb_stiffener,pcb_stiffener_polygon:()=>pcb_stiffener_polygon,pcb_stiffener_rect:()=>pcb_stiffener_rect,pcb_text:()=>pcb_text,pcb_thermal_spoke:()=>pcb_thermal_spoke,pcb_trace:()=>pcb_trace,pcb_trace_error:()=>pcb_trace_error,pcb_trace_hint:()=>pcb_trace_hint,pcb_trace_missing_error:()=>pcb_trace_missing_error,pcb_trace_route_point:()=>pcb_trace_route_point,pcb_trace_route_point_through_pad:()=>pcb_trace_route_point_through_pad,pcb_trace_route_point_via:()=>pcb_trace_route_point_via,pcb_trace_route_point_wire:()=>pcb_trace_route_point_wire,pcb_trace_style_warning:()=>pcb_trace_style_warning,pcb_trace_too_long_error:()=>pcb_trace_too_long_error,pcb_trace_too_long_warning:()=>pcb_trace_too_long_warning,pcb_trace_too_many_vias_warning:()=>pcb_trace_too_many_vias_warning,pcb_trace_warning:()=>pcb_trace_warning,pcb_via:()=>pcb_via,pcb_via_clearance_error:()=>pcb_via_clearance_error,pcb_via_trace_clearance_error:()=>pcb_via_trace_clearance_error,point:()=>point,point3:()=>point3,point_with_bulge:()=>point_with_bulge,polygon_shape:()=>polygon_shape,port_arrangement:()=>port_arrangement,position:()=>position,position3:()=>position3,rect_shape:()=>rect_shape,resistance:()=>resistance,ring:()=>ring,rotated_rect_shape:()=>rotated_rect_shape,rotation:()=>rotation,route_hint_point:()=>route_hint_point,schematic_arc:()=>schematic_arc,schematic_box:()=>schematic_box,schematic_circle:()=>schematic_circle,schematic_component:()=>schematic_component,schematic_component_overlap_warning:()=>schematic_component_overlap_warning,schematic_component_port_arrangement_by_sides:()=>schematic_component_port_arrangement_by_sides,schematic_component_port_arrangement_by_size:()=>schematic_component_port_arrangement_by_size,schematic_component_styling_warning:()=>schematic_component_styling_warning,schematic_debug_line:()=>schematic_debug_line,schematic_debug_object:()=>schematic_debug_object,schematic_debug_object_base:()=>schematic_debug_object_base,schematic_debug_point:()=>schematic_debug_point,schematic_debug_rect:()=>schematic_debug_rect,schematic_element_outside_sheet_warning:()=>schematic_element_outside_sheet_warning,schematic_error:()=>schematic_error,schematic_graphic:()=>schematic_graphic,schematic_group:()=>schematic_group,schematic_layout_error:()=>schematic_layout_error,schematic_line:()=>schematic_line,schematic_manual_edit_conflict_warning:()=>schematic_manual_edit_conflict_warning,schematic_missing_sheet_warning:()=>schematic_missing_sheet_warning,schematic_net_label:()=>schematic_net_label,schematic_path:()=>schematic_path,schematic_pin_styles:()=>schematic_pin_styles,schematic_port:()=>schematic_port,schematic_rect:()=>schematic_rect,schematic_sheet:()=>schematic_sheet,schematic_sheet_size:()=>schematic_sheet_size,schematic_sheet_styling_warning:()=>schematic_sheet_styling_warning,schematic_symbol:()=>schematic_symbol,schematic_table:()=>schematic_table,schematic_table_cell:()=>schematic_table_cell,schematic_text:()=>schematic_text,schematic_text_part:()=>schematic_text_part,schematic_trace:()=>schematic_trace,schematic_voltage_probe:()=>schematic_voltage_probe,simulation_ac_current_source:()=>simulation_ac_current_source,simulation_ac_sweep_current_graph:()=>simulation_ac_sweep_current_graph,simulation_ac_sweep_voltage_graph:()=>simulation_ac_sweep_voltage_graph,simulation_ac_voltage_source:()=>simulation_ac_voltage_source,simulation_complex_sample:()=>simulation_complex_sample,simulation_current_probe:()=>simulation_current_probe,simulation_current_source:()=>simulation_current_source,simulation_dc_current_source:()=>simulation_dc_current_source,simulation_dc_operating_point_current:()=>simulation_dc_operating_point_current,simulation_dc_operating_point_voltage:()=>simulation_dc_operating_point_voltage,simulation_dc_sweep_current_graph:()=>simulation_dc_sweep_current_graph,simulation_dc_sweep_unit:()=>simulation_dc_sweep_unit,simulation_dc_sweep_voltage_graph:()=>simulation_dc_sweep_voltage_graph,simulation_dc_voltage_source:()=>simulation_dc_voltage_source,simulation_experiment:()=>simulation_experiment,simulation_op_amp:()=>simulation_op_amp,simulation_oscilloscope_trace:()=>simulation_oscilloscope_trace,simulation_parameter_sweep:()=>simulation_parameter_sweep,simulation_parameter_sweep_coordinate:()=>simulation_parameter_sweep_coordinate,simulation_parameter_type:()=>simulation_parameter_type,simulation_parameter_unit:()=>simulation_parameter_unit,simulation_pcb_return_current_field:()=>simulation_pcb_return_current_field,simulation_pcb_return_current_heatmap:()=>simulation_pcb_return_current_heatmap,simulation_pcb_return_current_marker:()=>simulation_pcb_return_current_marker,simulation_pcb_return_current_result:()=>simulation_pcb_return_current_result,simulation_return_current_contact:()=>simulation_return_current_contact,simulation_return_current_excitation:()=>simulation_return_current_excitation,simulation_return_current_field_asset:()=>simulation_return_current_field_asset,simulation_return_current_grid_json:()=>simulation_return_current_grid_json,simulation_return_current_image_asset:()=>simulation_return_current_image_asset,simulation_spice_subcircuit:()=>simulation_spice_subcircuit,simulation_switch:()=>simulation_switch,simulation_terminal_port:()=>simulation_terminal_port,simulation_transient_current_graph:()=>simulation_transient_current_graph,simulation_transient_voltage_graph:()=>simulation_transient_voltage_graph,simulation_unknown_experiment_error:()=>simulation_unknown_experiment_error,simulation_voltage_probe:()=>simulation_voltage_probe,simulation_voltage_source:()=>simulation_voltage_source,size:()=>size,source_ambiguous_port_reference:()=>source_ambiguous_port_reference,source_board:()=>source_board,source_bus:()=>source_bus,source_component_availability_warning:()=>source_component_availability_warning,source_component_base:()=>source_component_base,source_component_internal_connection:()=>source_component_internal_connection,source_component_misconfigured_error:()=>source_component_misconfigured_error,source_component_pins_underspecified_warning:()=>source_component_pins_underspecified_warning,source_confusing_net_name_warning:()=>source_confusing_net_name_warning,source_failed_to_create_component_error:()=>source_failed_to_create_component_error,source_group:()=>source_group,source_i2c_misconfigured_error:()=>source_i2c_misconfigured_error,source_interconnect:()=>source_interconnect,source_invalid_component_property_error:()=>source_invalid_component_property_error,source_manually_placed_via:()=>source_manually_placed_via,source_missing_manufacturer_part_number_warning:()=>source_missing_manufacturer_part_number_warning,source_missing_property_error:()=>source_missing_property_error,source_motor:()=>source_motor,source_net:()=>source_net,source_no_ground_pin_defined_warning:()=>source_no_ground_pin_defined_warning,source_no_power_pin_defined_warning:()=>source_no_power_pin_defined_warning,source_part_not_found_warning:()=>source_part_not_found_warning,source_pcb_ground_plane:()=>source_pcb_ground_plane,source_pin_attributes:()=>source_pin_attributes,source_pin_missing_trace_warning:()=>source_pin_missing_trace_warning,source_pin_must_be_connected_error:()=>source_pin_must_be_connected_error,source_port:()=>source_port,source_printed_part:()=>source_printed_part,source_project_metadata:()=>source_project_metadata,source_property_ignored_warning:()=>source_property_ignored_warning,source_refdes_convention_warning:()=>source_refdes_convention_warning,source_runtime_error:()=>source_runtime_error,source_simple_ammeter:()=>source_simple_ammeter,source_simple_battery:()=>source_simple_battery,source_simple_capacitor:()=>source_simple_capacitor,source_simple_chip:()=>source_simple_chip,source_simple_connector:()=>source_simple_connector,source_simple_connector_standards:()=>source_simple_connector_standards,source_simple_crystal:()=>source_simple_crystal,source_simple_current_source:()=>source_simple_current_source,source_simple_diode:()=>source_simple_diode,source_simple_fiducial:()=>source_simple_fiducial,source_simple_fuse:()=>source_simple_fuse,source_simple_ground:()=>source_simple_ground,source_simple_inductor:()=>source_simple_inductor,source_simple_led:()=>source_simple_led,source_simple_mosfet:()=>source_simple_mosfet,source_simple_op_amp:()=>source_simple_op_amp,source_simple_pin_header:()=>source_simple_pin_header,source_simple_pinout:()=>source_simple_pinout,source_simple_potentiometer:()=>source_simple_potentiometer,source_simple_power_source:()=>source_simple_power_source,source_simple_push_button:()=>source_simple_push_button,source_simple_resistor:()=>source_simple_resistor,source_simple_resonator:()=>source_simple_resonator,source_simple_switch:()=>source_simple_switch,source_simple_test_point:()=>source_simple_test_point,source_simple_transistor:()=>source_simple_transistor,source_simple_voltage_probe:()=>source_simple_voltage_probe,source_simple_voltage_source:()=>source_simple_voltage_source,source_subassembly:()=>source_subassembly,source_trace:()=>source_trace,source_trace_not_connected_error:()=>source_trace_not_connected_error,source_unnamed_trace_warning:()=>source_unnamed_trace_warning,spice_simulation_options:()=>spice_simulation_options,standard_shape:()=>standard_shape,supplier_footprint_mismatch_warning:()=>supplier_footprint_mismatch_warning,supplier_name:()=>supplier_name,time:()=>time,timestamp:()=>timestamp,unknown_error_finding_part:()=>unknown_error_finding_part,visible_layer:()=>visible_layer,voltage:()=>voltage,wave_shape:()=>wave_shape});function createSimulationReturnCurrentAssetSchema(mimetypes){return asset.extend({project_relative_path:external_exports.string().min(1),url:external_exports.string().url()}).superRefine((value,context)=>{mimetypes.includes(value.mimetype)||context.addIssue({code:external_exports.ZodIssueCode.custom,path:["mimetype"],message:`Expected one of: ${mimetypes.join(", ")}`}),value.url.startsWith("data:")&&/^data:([^;,]*)(?:;[^,]*)?,/i.exec(value.url)?.[1]?.toLowerCase()!==value.mimetype&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["url"],message:"Data URL media type must match asset.mimetype"})})}function getSimulationReturnCurrentGridJsonSchema(field){let count=field.columns*field.rows;if(!Number.isSafeInteger(field.columns)||field.columns<=0||!Number.isSafeInteger(field.rows)||field.rows<=0||!Number.isSafeInteger(count))throw new Error("Grid dimensions must be positive safe integers");return simulation_return_current_grid_json.superRefine((grid4,context)=>{grid4.field_type!==field.field_type&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["field_type"],message:"Decoded field_type must match the parent field"}),(grid4.field_type==="real"?grid4.sheet_current_x:grid4.sheet_current_x_real).length!==count&&context.addIssue({code:external_exports.ZodIssueCode.custom,message:`Each current channel must have ${count} entries (columns * rows)`})})}var resistance,capacitance,inductance,voltage,length,frequency,distance,current,duration_ms,time,ms,timestamp,rotation,battery_capacity,expectTypesMatch,expectStringUnionsMatch,point,position,point3,position3,size,finite_distance,positive_distance,circle_shape,rect_shape,rotated_rect_shape,polygon_shape,standard_shape,randomId,getZodPrefixedIdWithDefault,ninePointAnchor,pcbRenderLayer,asset,kicadAt,kicadFont,kicadEffects,kicadProperty,kicadFootprintProperties,kicadFootprintAttributes,kicadFootprintPad,kicadFootprintModel,kicadFootprintMetadata,kicadSymbolPinNumbers,kicadSymbolPinNames,kicadSymbolEffects,kicadSymbolProperty,kicadSymbolProperties,kicadSymbolMetadata,base_circuit_json_error,supplier_name,source_component_base,source_simple_capacitor,source_simple_resistor,source_simple_diode,source_simple_fiducial,source_simple_led,source_simple_ground,source_simple_chip,source_printed_part,source_subassembly,source_motor,source_simple_power_source,source_simple_current_source,source_simple_fuse,source_simple_ammeter,pin_voltage,source_pin_attributes,source_simple_battery,source_simple_inductor,source_simple_push_button,source_simple_potentiometer,source_simple_crystal,source_simple_pin_header,source_simple_connector_standards,source_simple_connector,source_simple_pinout,source_simple_resonator,source_simple_transistor,source_simple_test_point,source_simple_mosfet,source_simple_op_amp,source_simple_switch,source_project_metadata,source_missing_property_error,source_failed_to_create_component_error,source_invalid_component_property_error,source_trace_not_connected_error,source_property_ignored_warning,source_pin_missing_trace_warning,source_missing_manufacturer_part_number_warning,source_refdes_convention_warning,source_component_availability_warning,source_simple_voltage_probe,source_interconnect,source_i2c_misconfigured_error,source_component_misconfigured_error,source_simple_voltage_source,any_source_component,source_port,source_component_internal_connection,source_trace,source_group,source_net,source_board,source_ambiguous_port_reference,source_pcb_ground_plane,all_layers,layer_string,layer_ref,visible_layer,source_manually_placed_via,source_unnamed_trace_warning,source_no_power_pin_defined_warning,source_no_ground_pin_defined_warning,source_component_pins_underspecified_warning,source_pin_must_be_connected_error,unknown_error_finding_part,source_part_not_found_warning,source_confusing_net_name_warning,route_length,trace_spacing,source_bus,source_runtime_error,schematic_box,schematic_path,schematic_pin_styles,schematic_component_port_arrangement_by_size,schematic_component_port_arrangement_by_sides,port_arrangement,schematic_component,schematicSymbolMetadata,schematic_symbol,schematic_line,schematic_rect,schematic_circle,schematic_arc,schematic_trace,fivePointAnchor,schematic_text_part,schematic_text,schematic_port,schematic_net_label,schematic_error,schematic_layout_error,schematic_debug_object_base,schematic_debug_rect,schematic_debug_line,schematic_debug_point,schematic_debug_object,schematic_voltage_probe,schematic_manual_edit_conflict_warning,schematic_component_overlap_warning,schematic_component_styling_warning,schematic_sheet_styling_warning,schematic_element_outside_sheet_warning,positiveFiniteDistance,schematic_graphic,schematic_group,schematic_table,schematic_table_cell,schematic_sheet_size,schematic_sheet,schematic_missing_sheet_warning,point_with_bulge,ring,brep_shape,insertionDirectionToCanonical,insertionDirectionToVector,insertion_direction,pcb_pin1_location,pin1LocationRotationCycles,getRotationBetweenPcbPin1Locations,pcb_route_hint,pcb_route_hints,route_hint_point,manufacturing_drc_properties,pcb_component,pcb_debug_object_base,pcb_debug_rect,pcb_debug_line,pcb_debug_point,pcb_debug_object,pcb_hole_circle,pcb_hole_circle_shape,pcb_hole_rect,pcb_hole_rect_shape,pcb_hole_circle_or_square,pcb_hole_circle_or_square_shape,pcb_hole_oval,pcb_hole_oval_shape,pcb_hole_pill,pcb_hole_pill_shape,pcb_hole_rotated_pill,pcb_hole_rotated_pill_shape,pcb_hole,pcb_plated_hole_circle,pcb_plated_hole_oval,pcb_circular_hole_with_rect_pad,pcb_pill_hole_with_rect_pad,pcb_rotated_pill_hole_with_rect_pad,pcb_hole_with_polygon_pad,pcb_plated_hole,pcb_port,pcb_smtpad_circle,pcb_smtpad_rect,pcb_smtpad_rotated_rect,pcb_smtpad_pill,pcb_smtpad_rotated_pill,pcb_smtpad_polygon,pcb_smtpad,pcb_solder_paste_circle,pcb_solder_paste_rect,pcb_solder_paste_pill,pcb_solder_paste_rotated_rect,pcb_solder_paste_rotated_pill,pcb_solder_paste_oval,pcb_solder_paste_polygon,pcb_solder_paste,opening_base,pcb_soldermask_opening,pcb_text,positive_width,pcb_trace_route_point_wire,pcb_trace_route_point_via,pcb_trace_route_point_through_pad,pcb_trace_route_point,pcb_trace,pcb_trace_warning,pcb_trace_style_warning,pcb_trace_too_long_error,pcb_bus_length_skew_error,pcb_trace_too_long_warning,pcb_trace_too_many_vias_warning,error_base,pcb_bus_routing_constraint_error,warning_base,pcb_bus_routing_constraint_warning,pcb_trace_error,pcb_trace_missing_error,pcb_port_not_matched_error,pcb_port_not_connected_error,pcb_net,pcb_via,pcb_board,finite_point,pcb_bend,positive_length,finite_point2,pcb_stiffener_base,pcb_stiffener_rect,pcb_stiffener_polygon,pcb_stiffener,pcb_panel,pcb_placement_error,pcb_packing_error,pcb_panelization_placement_error,pcb_trace_hint,pcb_silkscreen_line,pcb_silkscreen_path,pcb_silkscreen_text,pcb_copper_text,pcb_silkscreen_rect,pcb_silkscreen_circle,pcb_silkscreen_oval,pcb_silkscreen_graphic_base,pcb_silkscreen_graphic_brep,pcb_silkscreen_graphic,pcb_silkscreen_pill,pcb_fabrication_note_text,pcb_fabrication_note_path,pcb_fabrication_note_rect,pcb_fabrication_note_dimension,pcb_note_text,pcb_note_rect,pcb_note_path,pcb_note_line,pcb_note_dimension,pcb_footprint_overlap_error,pcb_courtyard_overlap_error,pcb_keepout_outline,pcb_keepout,pcb_keepout_overlap_warning,pcb_cutout_base,pcb_cutout_rect,pcb_cutout_circle,pcb_cutout_polygon,pcb_cutout_path,pcb_cutout,pcb_missing_footprint_error,external_footprint_load_error,circuit_json_footprint_load_error,pcb_group,pcb_autorouting_error,pcb_preflight_routing_error,pcb_manual_edit_conflict_warning,connectorOrientationDirection,pcb_connector_not_in_accessible_orientation_warning,pcb_component_missing_courtyard_warning,supplier_footprint_mismatch_warning,pcb_fabricator_extra_charge_warning,pcb_breakout_point,pcb_ground_plane,pcb_ground_plane_region,pcb_thermal_spoke,pcb_copper_pour_base,pcb_copper_pour_rect,pcb_copper_pour_brep,pcb_copper_pour_polygon,pcb_copper_pour,pcb_component_outside_board_error,pcb_component_not_on_board_edge_error,pcb_component_invalid_layer_error,pcb_via_clearance_error,pcb_via_trace_clearance_error,pcb_pad_pad_clearance_error,pcb_pad_trace_clearance_error,pcb_courtyard_rect,pcb_courtyard_outline,pcb_courtyard_polygon,pcb_courtyard_circle,pcb_courtyard_pill,cad_model_formats,cad_model_axis_directions,cadModelDefaultDirectionMap,cad_component,cad_collision_error,connectorPin1Position,cad_cable,FRAME_TOLERANCE,unitDirection,extent,cad_reference_surface,wave_shape,percentage,simulation_dc_voltage_source,simulation_ac_voltage_source,simulation_voltage_source,percentage2,simulation_dc_current_source,simulation_ac_current_source,simulation_current_source,simulation_dc_sweep_unit,simulation_parameter_unit,experiment_type,spice_simulation_options,simulation_experiment,simulation_parameter_sweep_coordinate,simulation_transient_voltage_graph,simulation_transient_current_graph,simulation_switch,simulation_voltage_probe,simulation_current_probe,simulation_unknown_experiment_error,simulation_parameter_type,simulation_parameter_sweep_base,simulation_parameter_sweep,simulation_dc_operating_point_voltage,simulation_dc_operating_point_current,simulation_dc_sweep_voltage_graph,simulation_dc_sweep_current_graph,simulation_complex_sample,simulation_ac_sweep_voltage_graph,simulation_ac_sweep_current_graph,simulation_op_amp,simulation_spice_subcircuit,hasValue,simulation_oscilloscope_trace,contact_position,simulation_return_current_contact,simulation_terminal_port,simulation_return_current_excitation,simulation_pcb_return_current_result,simulation_return_current_field_asset,simulation_return_current_image_asset,simulation_pcb_return_current_field,channel,simulation_return_current_grid_json,simulation_pcb_return_current_heatmap,marker_base,simulation_pcb_return_current_marker,any_circuit_element,any_soup_element,init_dist2=__esm({"node_modules/circuit-json/dist/index.mjs"(){"use strict";init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();resistance=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"\u03A9").value),capacitance=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"F").value).transform(value=>Number.parseFloat(value.toPrecision(12))),inductance=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"H").value),voltage=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"V").value),length=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11).value),frequency=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"Hz").value),distance=length,current=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"A").value),duration_ms=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11).value),time=duration_ms,ms=duration_ms,timestamp=external_exports.string().datetime(),rotation=external_exports.string().or(external_exports.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_capacity=external_exports.number().or(external_exports.string().endsWith("mAh")).transform(v11=>{if(typeof v11=="string"){let valString=v11.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v11}).describe("Battery capacity in mAh"),expectTypesMatch=shouldBe=>{};expectTypesMatch("extra props b");expectTypesMatch("missing props b");expectTypesMatch(!0);expectTypesMatch("mismatched prop types: a");expectStringUnionsMatch=shouldBe=>{};expectStringUnionsMatch(!0);expectStringUnionsMatch('T1 has extra: "c", T2 has extra: "d"');expectStringUnionsMatch('T1 has extra: "c"');expectStringUnionsMatch('T2 has extra: "c"');expectStringUnionsMatch('T1 has extra: "d", T2 has extra: "c"');expectStringUnionsMatch(!0);point=external_exports.object({x:distance,y:distance}),position=point;expectTypesMatch(!0);expectTypesMatch(!0);point3=external_exports.object({x:distance,y:distance,z:distance}),position3=point3;expectTypesMatch(!0);size=external_exports.object({width:external_exports.number(),height:external_exports.number()});expectTypesMatch(!0);finite_distance=distance.pipe(external_exports.number().finite()),positive_distance=distance.pipe(external_exports.number().finite().positive()),circle_shape=external_exports.object({shape:external_exports.literal("circle"),x:finite_distance,y:finite_distance,radius:positive_distance}).strict(),rect_shape=external_exports.object({shape:external_exports.literal("rect"),x:finite_distance,y:finite_distance,width:positive_distance,height:positive_distance}).strict(),rotated_rect_shape=rect_shape.extend({shape:external_exports.literal("rotated_rect"),ccw_rotation:rotation.pipe(external_exports.number().finite())}),polygon_shape=external_exports.object({shape:external_exports.literal("polygon"),points:external_exports.array(point.extend({x:finite_distance,y:finite_distance})).min(3).refine(points=>{let twice_area=points.reduce((sum,point23,index2)=>{let next2=points[(index2+1)%points.length];return sum+point23.x*next2.y-next2.x*point23.y},0);return Number.isFinite(twice_area)&&twice_area!==0},"Polygon boundary must enclose a nonzero area")}).strict();expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);standard_shape=external_exports.discriminatedUnion("shape",[circle_shape,rect_shape,rotated_rect_shape,polygon_shape]);expectTypesMatch(!0);randomId=length43=>{let chars2="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";return Array.from({length:length43},()=>chars2[Math.floor(Math.random()*chars2.length)]).join("")},getZodPrefixedIdWithDefault=prefix=>external_exports.string().optional().default(()=>`${prefix}_${randomId(10)}`),ninePointAnchor=external_exports.enum(["top_left","top_center","top_right","center_left","center","center_right","bottom_left","bottom_center","bottom_right"]);expectTypesMatch(!0);pcbRenderLayer=external_exports.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","inner7_copper","inner8_copper","edge_cuts","drill"]);expectTypesMatch(!0);asset=external_exports.object({project_relative_path:external_exports.string(),url:external_exports.string(),mimetype:external_exports.string()});expectTypesMatch(!0);kicadAt=point.extend({rotation:rotation.optional()});expectTypesMatch(!0);kicadFont=external_exports.object({size:point.optional(),thickness:distance.optional()});expectTypesMatch(!0);kicadEffects=external_exports.object({font:kicadFont.optional()});expectTypesMatch(!0);kicadProperty=external_exports.object({value:external_exports.string(),at:kicadAt.optional(),layer:external_exports.string().optional(),uuid:external_exports.string().optional(),hide:external_exports.boolean().optional(),effects:kicadEffects.optional()});expectTypesMatch(!0);kicadFootprintProperties=external_exports.object({Reference:kicadProperty.optional(),Value:kicadProperty.optional(),Datasheet:kicadProperty.optional(),Description:kicadProperty.optional()});expectTypesMatch(!0);kicadFootprintAttributes=external_exports.object({through_hole:external_exports.boolean().optional(),smd:external_exports.boolean().optional(),exclude_from_pos_files:external_exports.boolean().optional(),exclude_from_bom:external_exports.boolean().optional()});expectTypesMatch(!0);kicadFootprintPad=external_exports.object({name:external_exports.string(),type:external_exports.string(),shape:external_exports.string().optional(),at:kicadAt.optional(),size:point.optional(),drill:distance.optional(),layers:external_exports.array(external_exports.string()).optional(),removeUnusedLayers:external_exports.boolean().optional(),uuid:external_exports.string().optional()});expectTypesMatch(!0);kicadFootprintModel=external_exports.object({path:external_exports.string(),offset:point3.optional(),scale:point3.optional(),rotate:point3.optional()});expectTypesMatch(!0);kicadFootprintMetadata=external_exports.object({footprintName:external_exports.string().optional(),version:external_exports.union([external_exports.number(),external_exports.string()]).optional(),generator:external_exports.string().optional(),generatorVersion:external_exports.union([external_exports.number(),external_exports.string()]).optional(),layer:external_exports.string().optional(),properties:kicadFootprintProperties.optional(),attributes:kicadFootprintAttributes.optional(),pads:external_exports.array(kicadFootprintPad).optional(),embeddedFonts:external_exports.boolean().optional(),model:kicadFootprintModel.optional()});expectTypesMatch(!0);kicadSymbolPinNumbers=external_exports.object({hide:external_exports.boolean().optional()});expectTypesMatch(!0);kicadSymbolPinNames=external_exports.object({offset:distance.optional(),hide:external_exports.boolean().optional()});expectTypesMatch(!0);kicadSymbolEffects=external_exports.object({font:kicadFont.optional(),justify:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())]).optional(),hide:external_exports.boolean().optional()});expectTypesMatch(!0);kicadSymbolProperty=external_exports.object({value:external_exports.string(),id:external_exports.union([external_exports.number(),external_exports.string()]).optional(),at:kicadAt.optional(),effects:kicadSymbolEffects.optional()});expectTypesMatch(!0);kicadSymbolProperties=external_exports.object({Reference:kicadSymbolProperty.optional(),Value:kicadSymbolProperty.optional(),Footprint:kicadSymbolProperty.optional(),Datasheet:kicadSymbolProperty.optional(),Description:kicadSymbolProperty.optional(),ki_keywords:kicadSymbolProperty.optional(),ki_fp_filters:kicadSymbolProperty.optional()});expectTypesMatch(!0);kicadSymbolMetadata=external_exports.object({symbolName:external_exports.string().optional(),extends:external_exports.string().optional(),pinNumbers:kicadSymbolPinNumbers.optional(),pinNames:kicadSymbolPinNames.optional(),excludeFromSim:external_exports.boolean().optional(),inBom:external_exports.boolean().optional(),onBoard:external_exports.boolean().optional(),properties:kicadSymbolProperties.optional(),embeddedFonts:external_exports.boolean().optional()});expectTypesMatch(!0);base_circuit_json_error=external_exports.object({error_type:external_exports.string(),message:external_exports.string(),is_fatal:external_exports.boolean().optional()});expectTypesMatch(!0);supplier_name=external_exports.enum(["jlcpcb","macrofab","pcbway","digikey","mouser","lcsc"]);expectTypesMatch(!0);source_component_base=external_exports.object({type:external_exports.literal("source_component"),ftype:external_exports.string().optional(),source_component_id:external_exports.string(),name:external_exports.string(),manufacturer_part_number:external_exports.string().optional(),supplier_part_numbers:external_exports.record(supplier_name,external_exports.array(external_exports.string())).optional(),display_value:external_exports.string().optional(),display_name:external_exports.string().optional(),are_pins_interchangeable:external_exports.boolean().optional(),internally_connected_source_port_ids:external_exports.array(external_exports.array(external_exports.string())).optional(),source_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);source_simple_capacitor=source_component_base.extend({ftype:external_exports.literal("simple_capacitor"),capacitance,max_voltage_rating:voltage.optional(),display_capacitance:external_exports.string().optional(),max_decoupling_trace_length:distance.optional()});expectTypesMatch(!0);source_simple_resistor=source_component_base.extend({ftype:external_exports.literal("simple_resistor"),resistance,display_resistance:external_exports.string().optional()});expectTypesMatch(!0);source_simple_diode=source_component_base.extend({ftype:external_exports.literal("simple_diode")});expectTypesMatch(!0);source_simple_fiducial=source_component_base.extend({ftype:external_exports.literal("simple_fiducial")});expectTypesMatch(!0);source_simple_led=source_simple_diode.extend({ftype:external_exports.literal("simple_led"),color:external_exports.string().optional(),wavelength:external_exports.string().optional()});expectTypesMatch(!0);source_simple_ground=source_component_base.extend({ftype:external_exports.literal("simple_ground")});expectTypesMatch(!0);source_simple_chip=source_component_base.extend({ftype:external_exports.literal("simple_chip")});expectTypesMatch(!0);source_printed_part=source_component_base.extend({ftype:external_exports.literal("printedpart"),material:external_exports.enum(["pla","petg","nylon"]).optional(),color:external_exports.string().trim().min(1).optional()});expectTypesMatch(!0);source_subassembly=source_component_base.extend({ftype:external_exports.literal("subassembly")});expectTypesMatch(!0);source_motor=source_component_base.extend({ftype:external_exports.literal("motor")});expectTypesMatch(!0);source_simple_power_source=source_component_base.extend({ftype:external_exports.literal("simple_power_source"),voltage});expectTypesMatch(!0);source_simple_current_source=source_component_base.extend({ftype:external_exports.literal("simple_current_source"),current,frequency:frequency.optional(),peak_to_peak_current:current.optional(),wave_shape:external_exports.enum(["sine","square","triangle","sawtooth","dc"]).optional().default("dc"),phase:external_exports.number().optional(),duty_cycle:external_exports.number().min(0).max(1).optional()});expectTypesMatch(!0);source_simple_fuse=source_component_base.extend({ftype:external_exports.literal("simple_fuse"),current_rating_amps:external_exports.number().describe("Nominal current in amps the fuse is rated for"),voltage_rating_volts:external_exports.number().describe("Voltage rating in volts, e.g. \xB15V would be 5")});expectTypesMatch(!0);source_simple_ammeter=source_component_base.extend({ftype:external_exports.literal("simple_ammeter")});expectTypesMatch(!0);pin_voltage=external_exports.union([external_exports.number(),external_exports.string().trim().regex(/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?\s*(?:[fpnumkKMGTµμ]?V?|V)?$/,"Expected a scalar voltage, optionally with SI units")]).pipe(voltage).pipe(external_exports.number().finite()),source_pin_attributes=external_exports.object({is_input:external_exports.boolean().optional(),is_output:external_exports.boolean().optional(),is_bidirectional:external_exports.boolean().optional(),is_passive:external_exports.boolean().optional(),can_use_tri_state:external_exports.boolean().optional(),is_using_tri_state:external_exports.boolean().optional(),can_use_open_collector:external_exports.boolean().optional(),is_using_open_collector:external_exports.boolean().optional(),can_use_open_emitter:external_exports.boolean().optional(),is_using_open_emitter:external_exports.boolean().optional(),is_gpio:external_exports.boolean().optional(),highlight_color:external_exports.string().optional(),must_be_connected:external_exports.boolean().optional(),provides_power:external_exports.boolean().optional(),requires_power:external_exports.boolean().optional(),provides_ground:external_exports.boolean().optional(),requires_ground:external_exports.boolean().optional(),provides_voltage:pin_voltage.optional(),requires_voltage:pin_voltage.optional(),required_voltage_tolerance:external_exports.number().finite().min(0).max(1).optional(),do_not_connect:external_exports.boolean().optional(),include_in_board_pinout:external_exports.boolean().optional(),can_use_internal_pullup:external_exports.boolean().optional(),is_using_internal_pullup:external_exports.boolean().optional(),needs_external_pullup:external_exports.boolean().optional(),can_use_internal_pulldown:external_exports.boolean().optional(),is_using_internal_pulldown:external_exports.boolean().optional(),needs_external_pulldown:external_exports.boolean().optional(),can_use_open_drain:external_exports.boolean().optional(),is_using_open_drain:external_exports.boolean().optional(),can_use_push_pull:external_exports.boolean().optional(),is_using_push_pull:external_exports.boolean().optional(),should_have_decoupling_capacitor:external_exports.boolean().optional(),recommended_decoupling_capacitor_capacitance:external_exports.union([external_exports.string(),external_exports.number()]).optional(),is_configured_for_i2c_sda:external_exports.boolean().optional(),is_configured_for_i2c_scl:external_exports.boolean().optional(),is_configured_for_spi_mosi:external_exports.boolean().optional(),is_configured_for_spi_miso:external_exports.boolean().optional(),is_configured_for_spi_sck:external_exports.boolean().optional(),is_configured_for_spi_cs:external_exports.boolean().optional(),is_configured_for_uart_tx:external_exports.boolean().optional(),is_configured_for_uart_rx:external_exports.boolean().optional(),supports_i2c_sda:external_exports.boolean().optional(),supports_i2c_scl:external_exports.boolean().optional(),supports_spi_mosi:external_exports.boolean().optional(),supports_spi_miso:external_exports.boolean().optional(),supports_spi_sck:external_exports.boolean().optional(),supports_spi_cs:external_exports.boolean().optional(),supports_uart_tx:external_exports.boolean().optional(),supports_uart_rx:external_exports.boolean().optional()});expectTypesMatch(!0);source_simple_battery=source_component_base.extend({ftype:external_exports.literal("simple_battery"),capacity:battery_capacity});expectTypesMatch(!0);source_simple_inductor=source_component_base.extend({ftype:external_exports.literal("simple_inductor"),inductance,display_inductance:external_exports.string().optional(),max_current_rating:external_exports.number().optional()});expectTypesMatch(!0);source_simple_push_button=source_component_base.extend({ftype:external_exports.literal("simple_push_button")});expectTypesMatch(!0);source_simple_potentiometer=source_component_base.extend({ftype:external_exports.literal("simple_potentiometer"),max_resistance:resistance,display_max_resistance:external_exports.string().optional()});expectTypesMatch(!0);source_simple_crystal=source_component_base.extend({ftype:external_exports.literal("simple_crystal"),frequency:external_exports.number().describe("Frequency in Hz"),load_capacitance:external_exports.number().optional().describe("Load capacitance in pF"),pin_variant:external_exports.enum(["two_pin","four_pin"]).optional()});expectTypesMatch(!0);source_simple_pin_header=source_component_base.extend({ftype:external_exports.literal("simple_pin_header"),pin_count:external_exports.number(),gender:external_exports.enum(["male","female"]).optional().default("male")});expectTypesMatch(!0);source_simple_connector_standards=["usb_c","m2","jst_sh","jst_gh","jst_zh","jst_ph","jst_xh","jst_vh"],source_simple_connector=source_component_base.extend({ftype:external_exports.literal("simple_connector"),standard:external_exports.enum(source_simple_connector_standards).optional(),pin_count:external_exports.number().int().positive().optional()});expectTypesMatch(!0);source_simple_pinout=source_component_base.extend({ftype:external_exports.literal("simple_pinout")});expectTypesMatch(!0);source_simple_resonator=source_component_base.extend({ftype:external_exports.literal("simple_resonator"),load_capacitance:capacitance,equivalent_series_resistance:resistance.optional(),frequency});expectTypesMatch(!0);source_simple_transistor=source_component_base.extend({ftype:external_exports.literal("simple_transistor"),transistor_type:external_exports.enum(["npn","pnp"])});expectTypesMatch(!0);source_simple_test_point=source_component_base.extend({ftype:external_exports.literal("simple_test_point"),footprint_variant:external_exports.enum(["pad","through_hole"]).optional(),pad_shape:external_exports.enum(["rect","circle"]).optional(),pad_diameter:external_exports.union([external_exports.number(),external_exports.string()]).optional(),hole_diameter:external_exports.union([external_exports.number(),external_exports.string()]).optional(),width:external_exports.union([external_exports.number(),external_exports.string()]).optional(),height:external_exports.union([external_exports.number(),external_exports.string()]).optional()});expectTypesMatch(!0);source_simple_mosfet=source_component_base.extend({ftype:external_exports.literal("simple_mosfet"),channel_type:external_exports.enum(["n","p"]),mosfet_mode:external_exports.enum(["enhancement","depletion"])});expectTypesMatch(!0);source_simple_op_amp=source_component_base.extend({ftype:external_exports.literal("simple_op_amp")});expectTypesMatch(!0);source_simple_switch=source_component_base.extend({ftype:external_exports.literal("simple_switch")});expectTypesMatch(!0);source_project_metadata=external_exports.object({type:external_exports.literal("source_project_metadata"),name:external_exports.string().optional(),software_used_string:external_exports.string().optional(),project_url:external_exports.string().optional(),source_filesystem_md5_hash:external_exports.string().optional(),created_at:timestamp.optional()});expectTypesMatch(!0);source_missing_property_error=base_circuit_json_error.extend({type:external_exports.literal("source_missing_property_error"),source_missing_property_error_id:getZodPrefixedIdWithDefault("source_missing_property_error"),source_component_id:external_exports.string(),property_name:external_exports.string(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("source_missing_property_error").default("source_missing_property_error")}).describe("The source code is missing a property");expectTypesMatch(!0);source_failed_to_create_component_error=base_circuit_json_error.extend({type:external_exports.literal("source_failed_to_create_component_error"),source_failed_to_create_component_error_id:getZodPrefixedIdWithDefault("source_failed_to_create_component_error"),error_type:external_exports.literal("source_failed_to_create_component_error").default("source_failed_to_create_component_error"),component_name:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),parent_source_component_id:external_exports.string().optional(),pcb_center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),schematic_center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional()}).describe("Error emitted when a component fails to be constructed");expectTypesMatch(!0);source_invalid_component_property_error=base_circuit_json_error.extend({type:external_exports.literal("source_invalid_component_property_error"),source_invalid_component_property_error_id:getZodPrefixedIdWithDefault("source_invalid_component_property_error"),source_component_id:external_exports.string(),property_name:external_exports.string(),property_value:external_exports.unknown().optional(),expected_format:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("source_invalid_component_property_error").default("source_invalid_component_property_error")}).describe("The source component property is invalid");expectTypesMatch(!0);source_trace_not_connected_error=base_circuit_json_error.extend({type:external_exports.literal("source_trace_not_connected_error"),source_trace_not_connected_error_id:getZodPrefixedIdWithDefault("source_trace_not_connected_error"),error_type:external_exports.literal("source_trace_not_connected_error").default("source_trace_not_connected_error"),subcircuit_id:external_exports.string().optional(),source_group_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),connected_source_port_ids:external_exports.array(external_exports.string()).optional(),selectors_not_found:external_exports.array(external_exports.string()).optional()}).describe("Occurs when a source trace selector does not match any ports");expectTypesMatch(!0);source_property_ignored_warning=external_exports.object({type:external_exports.literal("source_property_ignored_warning"),source_property_ignored_warning_id:getZodPrefixedIdWithDefault("source_property_ignored_warning"),source_component_id:external_exports.string(),property_name:external_exports.string(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("source_property_ignored_warning").default("source_property_ignored_warning"),message:external_exports.string()}).describe("The source property was ignored");expectTypesMatch(!0);source_pin_missing_trace_warning=external_exports.object({type:external_exports.literal("source_pin_missing_trace_warning"),source_pin_missing_trace_warning_id:getZodPrefixedIdWithDefault("source_pin_missing_trace_warning"),warning_type:external_exports.literal("source_pin_missing_trace_warning").default("source_pin_missing_trace_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source component pin is missing a trace connection");expectTypesMatch(!0);source_missing_manufacturer_part_number_warning=external_exports.object({type:external_exports.literal("source_missing_manufacturer_part_number_warning"),source_missing_manufacturer_part_number_warning_id:getZodPrefixedIdWithDefault("source_missing_manufacturer_part_number_warning"),warning_type:external_exports.literal("source_missing_manufacturer_part_number_warning").default("source_missing_manufacturer_part_number_warning"),message:external_exports.string(),source_component_id:external_exports.string(),standard:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source component is missing its manufacturer part number");expectTypesMatch(!0);source_refdes_convention_warning=external_exports.object({type:external_exports.literal("source_refdes_convention_warning"),source_refdes_convention_warning_id:getZodPrefixedIdWithDefault("source_refdes_convention_warning"),warning_type:external_exports.literal("source_refdes_convention_warning").default("source_refdes_convention_warning"),message:external_exports.string(),source_component_id:external_exports.string(),refdes:external_exports.string(),source_component_ftype:external_exports.string(),expected_prefixes:external_exports.array(external_exports.string()),actual_prefix:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source component reference designator does not match the component type convention");expectTypesMatch(!0);source_component_availability_warning=external_exports.object({type:external_exports.literal("source_component_availability_warning"),source_component_availability_warning_id:getZodPrefixedIdWithDefault("source_component_availability_warning"),warning_type:external_exports.literal("source_component_availability_warning").default("source_component_availability_warning"),message:external_exports.string(),source_component_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),supplier_name,supplier_part_numbers:external_exports.array(external_exports.string()).nonempty()}).describe("Warning emitted when no supplier alternative can be confirmed in stock. Availability may be unknown or change over time.");expectTypesMatch(!0);source_simple_voltage_probe=source_component_base.extend({ftype:external_exports.literal("simple_voltage_probe")});expectTypesMatch(!0);source_interconnect=source_component_base.extend({ftype:external_exports.literal("interconnect")});expectTypesMatch(!0);source_i2c_misconfigured_error=base_circuit_json_error.extend({type:external_exports.literal("source_i2c_misconfigured_error"),source_i2c_misconfigured_error_id:getZodPrefixedIdWithDefault("source_i2c_misconfigured_error"),error_type:external_exports.literal("source_i2c_misconfigured_error").default("source_i2c_misconfigured_error"),source_port_ids:external_exports.array(external_exports.string())}).describe("Error emitted when incompatible I2C pins (e.g. SDA and SCL) are connected to the same net");expectTypesMatch(!0);source_component_misconfigured_error=base_circuit_json_error.extend({type:external_exports.literal("source_component_misconfigured_error"),source_component_misconfigured_error_id:getZodPrefixedIdWithDefault("source_component_misconfigured_error"),error_type:external_exports.literal("source_component_misconfigured_error").default("source_component_misconfigured_error"),source_component_ids:external_exports.array(external_exports.string()),source_port_ids:external_exports.array(external_exports.string()).optional()}).describe("Error emitted when one or more source components have an invalid or conflicting configuration");expectTypesMatch(!0);source_simple_voltage_source=source_component_base.extend({ftype:external_exports.literal("simple_voltage_source"),voltage,frequency:frequency.optional(),peak_to_peak_voltage:voltage.optional(),wave_shape:external_exports.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation.optional(),duty_cycle:external_exports.number().optional().describe("Duty cycle as a fraction (0 to 1)"),pulse_delay:ms.optional(),rise_time:ms.optional(),fall_time:ms.optional(),pulse_width:ms.optional(),period:ms.optional()});expectTypesMatch(!0);any_source_component=external_exports.union([source_simple_resistor,source_simple_capacitor,source_simple_diode,source_simple_fiducial,source_simple_led,source_simple_ground,source_simple_chip,source_printed_part,source_subassembly,source_motor,source_simple_power_source,source_simple_current_source,source_simple_ammeter,source_simple_battery,source_simple_inductor,source_simple_push_button,source_simple_potentiometer,source_simple_crystal,source_simple_pin_header,source_simple_connector,source_simple_pinout,source_simple_resonator,source_simple_switch,source_simple_transistor,source_simple_test_point,source_simple_mosfet,source_simple_op_amp,source_simple_fuse,source_simple_voltage_probe,source_interconnect,source_simple_voltage_source,source_project_metadata,source_missing_property_error,source_invalid_component_property_error,source_failed_to_create_component_error,source_trace_not_connected_error,source_property_ignored_warning,source_pin_missing_trace_warning,source_missing_manufacturer_part_number_warning,source_refdes_convention_warning,source_component_availability_warning,source_i2c_misconfigured_error,source_component_misconfigured_error]);expectTypesMatch(!0);source_port=external_exports.object({type:external_exports.literal("source_port"),pin_number:external_exports.number().optional(),port_hints:external_exports.array(external_exports.string()).optional(),name:external_exports.string(),source_port_id:external_exports.string(),source_component_id:external_exports.string().optional(),source_group_id:external_exports.string().optional(),most_frequently_referenced_by_name:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional()}).merge(source_pin_attributes);expectTypesMatch(!0);source_component_internal_connection=external_exports.object({type:external_exports.literal("source_component_internal_connection"),source_component_internal_connection_id:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);source_trace=external_exports.object({type:external_exports.literal("source_trace"),source_trace_id:external_exports.string(),connected_source_port_ids:external_exports.array(external_exports.string()),connected_source_net_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),max_length:external_exports.number().optional(),max_via_count:external_exports.number().int().nonnegative().optional(),name:external_exports.string().optional(),min_trace_thickness:external_exports.number().optional(),display_name:external_exports.string().optional()});expectTypesMatch(!0);source_group=external_exports.object({type:external_exports.literal("source_group"),source_group_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),parent_subcircuit_id:external_exports.string().optional(),parent_source_group_id:external_exports.string().optional(),is_subcircuit:external_exports.boolean().optional(),show_as_schematic_box:external_exports.boolean().optional(),name:external_exports.string().optional(),was_automatically_named:external_exports.boolean().optional()});expectTypesMatch(!0);source_net=external_exports.object({type:external_exports.literal("source_net"),source_net_id:external_exports.string(),name:external_exports.string(),member_source_group_ids:external_exports.array(external_exports.string()),is_power:external_exports.boolean().optional(),is_ground:external_exports.boolean().optional(),is_digital_signal:external_exports.boolean().optional(),is_analog_signal:external_exports.boolean().optional(),is_positive_voltage_source:external_exports.boolean().optional(),trace_width:external_exports.number().optional(),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional()});expectTypesMatch(!0);source_board=external_exports.object({type:external_exports.literal("source_board"),source_board_id:external_exports.string(),source_group_id:external_exports.string(),title:external_exports.string().optional()}).describe("Defines a board in the source domain");expectTypesMatch(!0);source_ambiguous_port_reference=base_circuit_json_error.extend({type:external_exports.literal("source_ambiguous_port_reference"),source_ambiguous_port_reference_id:getZodPrefixedIdWithDefault("source_ambiguous_port_reference"),error_type:external_exports.literal("source_ambiguous_port_reference").default("source_ambiguous_port_reference"),source_port_id:external_exports.string().optional(),source_component_id:external_exports.string().optional()}).describe("Error emitted when a port hint matches multiple non-overlapping pads, making the port reference ambiguous");expectTypesMatch(!0);source_pcb_ground_plane=external_exports.object({type:external_exports.literal("source_pcb_ground_plane"),source_pcb_ground_plane_id:external_exports.string(),source_group_id:external_exports.string(),source_net_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Defines a ground plane in the source domain");expectTypesMatch(!0);all_layers=["top","bottom","inner1","inner2","inner3","inner4","inner5","inner6","inner7","inner8"],layer_string=external_exports.enum(all_layers),layer_ref=layer_string.or(external_exports.object({name:layer_string})).transform(layer=>typeof layer=="string"?layer:layer.name);expectTypesMatch(!0);visible_layer=external_exports.enum(["top","bottom"]),source_manually_placed_via=external_exports.object({type:external_exports.literal("source_manually_placed_via"),source_manually_placed_via_id:external_exports.string(),source_group_id:external_exports.string(),source_net_id:external_exports.string().min(1).optional(),subcircuit_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional()}).describe("Defines a via that is manually placed in the source domain");expectTypesMatch(!0);source_unnamed_trace_warning=external_exports.object({type:external_exports.literal("source_unnamed_trace_warning"),source_unnamed_trace_warning_id:getZodPrefixedIdWithDefault("source_unnamed_trace_warning"),warning_type:external_exports.literal("source_unnamed_trace_warning").default("source_unnamed_trace_warning"),message:external_exports.string(),source_trace_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source trace is missing a name");expectTypesMatch(!0);source_no_power_pin_defined_warning=external_exports.object({type:external_exports.literal("source_no_power_pin_defined_warning"),source_no_power_pin_defined_warning_id:getZodPrefixedIdWithDefault("source_no_power_pin_defined_warning"),warning_type:external_exports.literal("source_no_power_pin_defined_warning").default("source_no_power_pin_defined_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a chip has no source ports with requires_power=true");expectTypesMatch(!0);source_no_ground_pin_defined_warning=external_exports.object({type:external_exports.literal("source_no_ground_pin_defined_warning"),source_no_ground_pin_defined_warning_id:getZodPrefixedIdWithDefault("source_no_ground_pin_defined_warning"),warning_type:external_exports.literal("source_no_ground_pin_defined_warning").default("source_no_ground_pin_defined_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a chip has no source ports marked as ground pins");expectTypesMatch(!0);source_component_pins_underspecified_warning=external_exports.object({type:external_exports.literal("source_component_pins_underspecified_warning"),source_component_pins_underspecified_warning_id:getZodPrefixedIdWithDefault("source_component_pins_underspecified_warning"),warning_type:external_exports.literal("source_component_pins_underspecified_warning").default("source_component_pins_underspecified_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when all ports on a source component are underspecified");expectTypesMatch(!0);source_pin_must_be_connected_error=base_circuit_json_error.extend({type:external_exports.literal("source_pin_must_be_connected_error"),source_pin_must_be_connected_error_id:getZodPrefixedIdWithDefault("source_pin_must_be_connected_error"),error_type:external_exports.literal("source_pin_must_be_connected_error").default("source_pin_must_be_connected_error"),source_component_id:external_exports.string(),source_port_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a pin with mustBeConnected attribute is not connected to any trace");expectTypesMatch(!0);unknown_error_finding_part=base_circuit_json_error.extend({type:external_exports.literal("unknown_error_finding_part"),unknown_error_finding_part_id:getZodPrefixedIdWithDefault("unknown_error_finding_part"),error_type:external_exports.literal("unknown_error_finding_part").default("unknown_error_finding_part"),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when an unexpected error occurs while finding a part");expectTypesMatch(!0);source_part_not_found_warning=external_exports.object({type:external_exports.literal("source_part_not_found_warning"),source_part_not_found_warning_id:getZodPrefixedIdWithDefault("source_part_not_found_warning"),warning_type:external_exports.literal("source_part_not_found_warning").default("source_part_not_found_warning"),message:external_exports.string(),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),supplier_name:supplier_name.optional(),manufacturer_part_number:external_exports.string().optional(),supplier_part_number:external_exports.string().optional(),part_name:external_exports.string().optional()}).describe("Warning emitted when a requested part can not be found");expectTypesMatch(!0);source_confusing_net_name_warning=external_exports.object({type:external_exports.literal("source_confusing_net_name_warning"),source_confusing_net_name_warning_id:getZodPrefixedIdWithDefault("source_confusing_net_name_warning"),warning_type:external_exports.literal("source_confusing_net_name_warning").default("source_confusing_net_name_warning"),message:external_exports.string(),source_net_ids:external_exports.array(external_exports.string()).min(2),net_name:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when electrically disconnected source nets share a name");expectTypesMatch(!0);route_length=external_exports.union([external_exports.number().nonnegative().finite(),external_exports.object({reference:external_exports.literal("longest_manhattan"),source_trace_ids:external_exports.array(external_exports.string()).min(1).optional(),offset:external_exports.number().finite().optional()})]),trace_spacing=external_exports.union([external_exports.number().positive().finite(),external_exports.object({width_multiplier:external_exports.number().positive().finite()})]),source_bus=external_exports.object({type:external_exports.literal("source_bus"),source_bus_id:external_exports.string(),name:external_exports.string().optional(),source_trace_ids:external_exports.array(external_exports.string()).min(1),max_length_skew:external_exports.number().nonnegative().finite().optional(),target_impedance:external_exports.number().positive().finite().optional(),target_differential_impedance:external_exports.number().positive().finite().optional(),differential_pair:external_exports.object({positive_source_trace_id:external_exports.string(),negative_source_trace_id:external_exports.string(),trace_gap:external_exports.number().positive().finite().optional(),max_uncoupled_length:external_exports.number().nonnegative().finite().optional()}).optional(),length_match_source_trace_ids:external_exports.array(external_exports.string()).min(1).optional(),min_length:route_length.optional(),max_length:route_length.optional(),target_length:route_length.optional(),length_tolerance:external_exports.number().nonnegative().finite().optional(),pcb_trace_spacing:trace_spacing.optional(),pcb_spacing_to_other_signals:trace_spacing.optional(),target_impedance_min:external_exports.number().positive().finite().optional(),target_impedance_max:external_exports.number().positive().finite().optional(),target_differential_impedance_min:external_exports.number().positive().finite().optional(),target_differential_impedance_max:external_exports.number().positive().finite().optional(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);source_runtime_error=base_circuit_json_error.pick({message:!0,error_type:!0}).extend({type:external_exports.literal("source_runtime_error"),source_runtime_error_id:getZodPrefixedIdWithDefault("source_runtime_error"),error_type:external_exports.literal("source_runtime_error").default("source_runtime_error"),phase_name:external_exports.string().optional()}).describe("An unexpected runtime failure while generating or validating a circuit");expectTypesMatch(!0);schematic_box=external_exports.object({type:external_exports.literal("schematic_box"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),width:distance,height:distance,is_dashed:external_exports.boolean().default(!1),x:distance,y:distance,subcircuit_id:external_exports.string().optional()}).describe("Draws a box on the schematic");expectTypesMatch(!0);schematic_path=external_exports.object({type:external_exports.literal("schematic_path"),schematic_path_id:getZodPrefixedIdWithDefault("schematic_path"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),fill_color:external_exports.string().optional(),is_filled:external_exports.boolean().optional(),is_dashed:external_exports.boolean().default(!1),stroke_width:distance.nullable().optional(),stroke_color:external_exports.string().optional(),dash_length:distance.optional(),dash_gap:distance.optional(),points:external_exports.array(point),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);schematic_pin_styles=external_exports.record(external_exports.object({left_margin:length.optional(),right_margin:length.optional(),top_margin:length.optional(),bottom_margin:length.optional()})),schematic_component_port_arrangement_by_size=external_exports.object({left_size:external_exports.number(),right_size:external_exports.number(),top_size:external_exports.number().optional(),bottom_size:external_exports.number().optional()});expectTypesMatch(!0);schematic_component_port_arrangement_by_sides=external_exports.object({left_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),right_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),top_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["left-to-right","right-to-left"]).optional()}).optional(),bottom_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["left-to-right","right-to-left"]).optional()}).optional()});expectTypesMatch(!0);port_arrangement=external_exports.union([schematic_component_port_arrangement_by_size,schematic_component_port_arrangement_by_sides]),schematic_component=external_exports.object({type:external_exports.literal("schematic_component"),size,center:point,source_component_id:external_exports.string().optional(),schematic_component_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),pin_spacing:length.optional(),pin_styles:schematic_pin_styles.optional(),box_width:length.optional(),symbol_name:external_exports.string().optional(),port_arrangement:port_arrangement.optional(),port_labels:external_exports.record(external_exports.string()).optional(),symbol_display_value:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),schematic_group_id:external_exports.string().optional(),is_schematic_group:external_exports.boolean().optional(),source_group_id:external_exports.string().optional(),is_box_with_pins:external_exports.boolean().optional().default(!0)});expectTypesMatch(!0);schematicSymbolMetadata=external_exports.object({kicad_symbol:kicadSymbolMetadata.optional()}).catchall(external_exports.unknown()),schematic_symbol=external_exports.object({type:external_exports.literal("schematic_symbol"),schematic_symbol_id:external_exports.string(),name:external_exports.string().optional(),metadata:schematicSymbolMetadata.optional()}).describe("Defines a named schematic symbol that can be referenced by components.");expectTypesMatch(!0);schematic_line=external_exports.object({type:external_exports.literal("schematic_line"),schematic_line_id:getZodPrefixedIdWithDefault("schematic_line"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),x1:distance,y1:distance,x2:distance,y2:distance,stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_dashed:external_exports.boolean().default(!1),dash_length:distance.optional(),dash_gap:distance.optional(),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled line on the schematic");expectTypesMatch(!0);schematic_rect=external_exports.object({type:external_exports.literal("schematic_rect"),schematic_rect_id:getZodPrefixedIdWithDefault("schematic_rect"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),center:point,width:distance,height:distance,rotation:rotation.default(0),stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_filled:external_exports.boolean().default(!1),fill_color:external_exports.string().optional(),is_dashed:external_exports.boolean().default(!1),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled rectangle on the schematic");expectTypesMatch(!0);schematic_circle=external_exports.object({type:external_exports.literal("schematic_circle"),schematic_circle_id:getZodPrefixedIdWithDefault("schematic_circle"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),center:point,radius:distance,stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_filled:external_exports.boolean().default(!1),fill_color:external_exports.string().optional(),is_dashed:external_exports.boolean().default(!1),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled circle on the schematic");expectTypesMatch(!0);schematic_arc=external_exports.object({type:external_exports.literal("schematic_arc"),schematic_arc_id:getZodPrefixedIdWithDefault("schematic_arc"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),center:point,radius:distance,start_angle_degrees:rotation,end_angle_degrees:rotation,direction:external_exports.enum(["clockwise","counterclockwise"]).default("counterclockwise"),stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_dashed:external_exports.boolean().default(!1),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled arc on the schematic");expectTypesMatch(!0);schematic_trace=external_exports.object({type:external_exports.literal("schematic_trace"),schematic_trace_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),junctions:external_exports.array(external_exports.object({x:external_exports.number(),y:external_exports.number()})),edges:external_exports.array(external_exports.object({from:external_exports.object({x:external_exports.number(),y:external_exports.number()}),to:external_exports.object({x:external_exports.number(),y:external_exports.number()}),is_crossing:external_exports.boolean().optional(),from_schematic_port_id:external_exports.string().optional(),to_schematic_port_id:external_exports.string().optional()})),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional()});expectTypesMatch(!0);fivePointAnchor=external_exports.enum(["center","left","right","top","bottom"]);expectTypesMatch(!0);schematic_text_part=external_exports.object({text:external_exports.string(),is_overlined:external_exports.boolean().optional()}),schematic_text=external_exports.object({type:external_exports.literal("schematic_text"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),schematic_text_id:external_exports.string(),source_trace_id:external_exports.string().optional(),text:external_exports.string(),text_parts:external_exports.array(schematic_text_part).min(1).optional(),display_superscript:external_exports.string().optional(),font_size:external_exports.number().default(.18),position:external_exports.object({x:distance,y:distance}),rotation:external_exports.number().default(0),anchor:external_exports.union([fivePointAnchor.describe("legacy"),ninePointAnchor]).default("center"),color:external_exports.string().default("#000000"),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);schematic_port=external_exports.object({type:external_exports.literal("schematic_port"),schematic_port_id:external_exports.string(),source_port_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),center:point,facing_direction:external_exports.enum(["up","down","left","right"]).optional(),distance_from_component_edge:external_exports.number().optional(),side_of_component:external_exports.enum(["top","bottom","left","right"]).optional(),true_ccw_index:external_exports.number().optional(),pin_number:external_exports.number().optional(),display_pin_label:external_exports.string().optional(),display_pin_label_text_parts:external_exports.array(schematic_text_part).min(1).optional(),display_pin_label_font_size:external_exports.number().positive().finite().optional(),subcircuit_id:external_exports.string().optional(),is_connected:external_exports.boolean().optional(),is_internal_circuit_port:external_exports.boolean().optional(),is_overlapping_internal_circuit_port:external_exports.boolean().optional(),has_input_arrow:external_exports.boolean().optional(),has_output_arrow:external_exports.boolean().optional(),is_drawn_with_inversion_circle:external_exports.boolean().optional()}).describe("Defines a port on a schematic component");expectTypesMatch(!0);schematic_net_label=external_exports.object({type:external_exports.literal("schematic_net_label"),schematic_net_label_id:getZodPrefixedIdWithDefault("schematic_net_label"),schematic_sheet_id:external_exports.string().optional(),schematic_trace_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),source_net_id:external_exports.string(),center:point,anchor_position:point.optional(),anchor_side:external_exports.enum(["top","bottom","left","right"]),text:external_exports.string(),display_superscript:external_exports.string().optional(),symbol_name:external_exports.string().optional(),is_movable:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);schematic_error=base_circuit_json_error.extend({type:external_exports.literal("schematic_error"),schematic_error_id:external_exports.string(),error_type:external_exports.literal("schematic_port_not_found").default("schematic_port_not_found"),subcircuit_id:external_exports.string().optional()}).describe("Defines a schematic error on the schematic");expectTypesMatch(!0);schematic_layout_error=base_circuit_json_error.extend({type:external_exports.literal("schematic_layout_error"),schematic_layout_error_id:getZodPrefixedIdWithDefault("schematic_layout_error"),error_type:external_exports.literal("schematic_layout_error").default("schematic_layout_error"),source_group_id:external_exports.string(),schematic_group_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when schematic layout fails for a group");expectTypesMatch(!0);schematic_debug_object_base=external_exports.object({type:external_exports.literal("schematic_debug_object"),label:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}),schematic_debug_rect=schematic_debug_object_base.extend({shape:external_exports.literal("rect"),center:point,size}),schematic_debug_line=schematic_debug_object_base.extend({shape:external_exports.literal("line"),start:point,end:point}),schematic_debug_point=schematic_debug_object_base.extend({shape:external_exports.literal("point"),center:point}),schematic_debug_object=external_exports.discriminatedUnion("shape",[schematic_debug_rect,schematic_debug_line,schematic_debug_point]);expectTypesMatch(!0);schematic_voltage_probe=external_exports.object({type:external_exports.literal("schematic_voltage_probe"),schematic_voltage_probe_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),source_component_id:external_exports.string().optional(),name:external_exports.string().optional(),position:point,schematic_trace_id:external_exports.string(),voltage:voltage.optional(),subcircuit_id:external_exports.string().optional(),color:external_exports.string().optional(),label_alignment:ninePointAnchor.optional()}).describe("Defines a voltage probe measurement point on a schematic trace");expectTypesMatch(!0);schematic_manual_edit_conflict_warning=external_exports.object({type:external_exports.literal("schematic_manual_edit_conflict_warning"),schematic_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault("schematic_manual_edit_conflict_warning"),warning_type:external_exports.literal("schematic_manual_edit_conflict_warning").default("schematic_manual_edit_conflict_warning"),message:external_exports.string(),schematic_component_id:external_exports.string(),schematic_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),source_component_id:external_exports.string()}).describe("Warning emitted when a component has both manual placement and explicit schX/schY coordinates");expectTypesMatch(!0);schematic_component_overlap_warning=external_exports.object({type:external_exports.literal("schematic_component_overlap_warning"),schematic_component_overlap_warning_id:getZodPrefixedIdWithDefault("schematic_component_overlap_warning"),warning_type:external_exports.literal("schematic_component_overlap_warning").default("schematic_component_overlap_warning"),message:external_exports.string(),schematic_component_ids:external_exports.tuple([external_exports.string(),external_exports.string()]),schematic_sheet_id:external_exports.string().optional()}).describe("Warning emitted when the rendered bounds of two schematic components overlap");expectTypesMatch(!0);schematic_component_styling_warning=external_exports.object({type:external_exports.literal("schematic_component_styling_warning"),schematic_component_styling_warning_id:getZodPrefixedIdWithDefault("schematic_component_styling_warning"),warning_type:external_exports.literal("schematic_component_styling_warning").default("schematic_component_styling_warning"),message:external_exports.string(),schematic_component_id:external_exports.string(),styling_issue_type:external_exports.string(),schematic_port_ids:external_exports.array(external_exports.string()).optional(),source_component_id:external_exports.string().optional(),schematic_sheet_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a schematic component has a visual styling issue");expectTypesMatch(!0);schematic_sheet_styling_warning=external_exports.object({type:external_exports.literal("schematic_sheet_styling_warning"),schematic_sheet_styling_warning_id:getZodPrefixedIdWithDefault("schematic_sheet_styling_warning"),warning_type:external_exports.literal("schematic_sheet_styling_warning").default("schematic_sheet_styling_warning"),message:external_exports.string(),schematic_sheet_id:external_exports.string(),styling_issue_type:external_exports.literal("non_default_sheet_size"),subcircuit_id:external_exports.string().optional()}).describe("Style warning emitted when a schematic sheet uses a non-default size");expectTypesMatch(!0);schematic_element_outside_sheet_warning=external_exports.object({type:external_exports.literal("schematic_element_outside_sheet_warning"),schematic_element_outside_sheet_warning_id:getZodPrefixedIdWithDefault("schematic_element_outside_sheet_warning"),warning_type:external_exports.literal("schematic_element_outside_sheet_warning").default("schematic_element_outside_sheet_warning"),message:external_exports.string(),schematic_sheet_id:external_exports.string(),schematic_element_type:external_exports.enum(["schematic_component","schematic_net_label","schematic_trace"]),schematic_element_id:external_exports.string()}).describe("Warning emitted when a schematic component, net label, or trace extends outside its schematic sheet");expectTypesMatch(!0);positiveFiniteDistance=distance.pipe(external_exports.number().positive().finite()),schematic_graphic=external_exports.object({type:external_exports.literal("schematic_graphic"),schematic_graphic_id:getZodPrefixedIdWithDefault("schematic_graphic"),schematic_sheet_id:external_exports.string().optional(),asset:asset.optional(),svg_content:external_exports.string().optional(),width:positiveFiniteDistance.optional(),height:positiveFiniteDistance.optional()}).describe("References a graphic asset or inline SVG content with optional centered layout bounds on a schematic sheet").superRefine(({asset:asset23,svg_content},ctx)=>{asset23===void 0&&svg_content===void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"At least one of asset or svg_content is required"})});expectTypesMatch(!0);schematic_group=external_exports.object({type:external_exports.literal("schematic_group"),schematic_group_id:getZodPrefixedIdWithDefault("schematic_group"),schematic_sheet_id:external_exports.string().optional(),source_group_id:external_exports.string(),is_subcircuit:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),width:length,height:length,center:point,schematic_component_ids:external_exports.array(external_exports.string()),show_as_schematic_box:external_exports.boolean().optional(),name:external_exports.string().optional(),description:external_exports.string().optional()}).describe("Defines a group of components on the schematic");expectTypesMatch(!0);schematic_table=external_exports.object({type:external_exports.literal("schematic_table"),schematic_table_id:getZodPrefixedIdWithDefault("schematic_table"),schematic_sheet_id:external_exports.string().optional(),anchor_position:point,column_widths:external_exports.array(distance),row_heights:external_exports.array(distance),cell_padding:distance.optional(),border_width:distance.optional(),subcircuit_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),anchor:ninePointAnchor.optional()}).describe("Defines a table on the schematic");expectTypesMatch(!0);schematic_table_cell=external_exports.object({type:external_exports.literal("schematic_table_cell"),schematic_table_cell_id:getZodPrefixedIdWithDefault("schematic_table_cell"),schematic_sheet_id:external_exports.string().optional(),schematic_table_id:external_exports.string(),start_row_index:external_exports.number(),end_row_index:external_exports.number(),start_column_index:external_exports.number(),end_column_index:external_exports.number(),text:external_exports.string().optional(),center:point,width:distance,height:distance,horizontal_align:external_exports.enum(["left","center","right"]).optional(),vertical_align:external_exports.enum(["top","middle","bottom"]).optional(),font_size:distance.optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a cell within a schematic_table");expectTypesMatch(!0);schematic_sheet_size=external_exports.enum(["a4","ansi_b"]),schematic_sheet=external_exports.object({type:external_exports.literal("schematic_sheet"),schematic_sheet_id:getZodPrefixedIdWithDefault("schematic_sheet"),name:external_exports.string().optional(),sheet_index:external_exports.number().optional(),sheet_size:schematic_sheet_size.optional(),sheet_width:external_exports.number().positive().optional(),sheet_height:external_exports.number().positive().optional(),subcircuit_id:external_exports.string().optional(),outline_color:external_exports.string().optional()}).describe("Defines a schematic sheet or page that components can be placed on");expectTypesMatch(!0);schematic_missing_sheet_warning=external_exports.object({type:external_exports.literal("schematic_missing_sheet_warning"),schematic_missing_sheet_warning_id:getZodPrefixedIdWithDefault("schematic_missing_sheet_warning"),warning_type:external_exports.literal("schematic_missing_sheet_warning").default("schematic_missing_sheet_warning"),message:external_exports.string()}).describe("Circuit-wide warning emitted when a schematic has no schematic sheet. Display as a banner without attaching it to a component or drawing a target outline or leader line.");expectTypesMatch(!0);point_with_bulge=external_exports.object({x:distance,y:distance,bulge:external_exports.number().optional()});expectTypesMatch(!0);ring=external_exports.object({vertices:external_exports.array(point_with_bulge)});expectTypesMatch(!0);brep_shape=external_exports.object({outer_ring:ring,inner_rings:external_exports.array(ring).default([])});expectTypesMatch(!0);insertionDirectionToCanonical={from_left:"from_left",from_right:"from_right",from_top:"from_top",from_bottom:"from_bottom",from_above:"from_above",from_below:"from_below",from_x_neg:"from_left",from_x_pos:"from_right",from_y_pos:"from_top",from_y_neg:"from_bottom",from_z_pos:"from_above",from_z_neg:"from_below",from_front:"from_top",from_back:"from_bottom"},insertionDirectionToVector={from_left:{x:-1,y:0,z:0},from_right:{x:1,y:0,z:0},from_top:{x:0,y:1,z:0},from_bottom:{x:0,y:-1,z:0},from_above:{x:0,y:0,z:1},from_below:{x:0,y:0,z:-1}},insertion_direction=external_exports.enum(["from_left","from_right","from_top","from_bottom","from_above","from_below","from_x_neg","from_x_pos","from_y_pos","from_y_neg","from_z_pos","from_z_neg","from_front","from_back"]).transform(value=>insertionDirectionToCanonical[value]).describe('The side exposing the receptacle where the cable or mating part is attached, following the 2D PCB diagram convention, not a 3D viewport frame. In project coordinate space, "from_top" is +Y, "from_bottom" -Y, "from_left" -X, "from_right" +X, "from_above" +Z and "from_below" -Z. A receptacle on the +Y edge is "from_top" even though the plug moves in -Y as it seats. Cartesian spellings such as "from_y_pos" are accepted and normalized to the named values, as are the deprecated "from_front" (now "from_top") and "from_back" (now "from_bottom").');expectTypesMatch(!0);expectTypesMatch(!0);pcb_pin1_location=external_exports.enum(["leftside_top","leftside_bottom","rightside_top","rightside_bottom","topside_left","topside_right","bottomside_left","bottomside_right"]);expectTypesMatch(!0);pin1LocationRotationCycles=[["leftside_top","bottomside_left","rightside_bottom","topside_right"],["leftside_bottom","bottomside_right","rightside_top","topside_left"]],getRotationBetweenPcbPin1Locations=(from,to3)=>{for(let cycle of pin1LocationRotationCycles){let fromIndex=cycle.indexOf(from),toIndex=cycle.indexOf(to3);if(fromIndex!==-1&&toIndex!==-1)return(toIndex-fromIndex+cycle.length)%cycle.length*90}return null},pcb_route_hint=external_exports.object({x:distance,y:distance,via:external_exports.boolean().optional(),via_to_layer:layer_ref.optional()}),pcb_route_hints=external_exports.array(pcb_route_hint);expectTypesMatch(!0);expectTypesMatch(!0);route_hint_point=external_exports.object({x:distance,y:distance,via:external_exports.boolean().optional(),to_layer:layer_ref.optional(),trace_width:distance.optional()});expectTypesMatch(!0);manufacturing_drc_properties=external_exports.object({min_trace_width:length.optional(),min_board_edge_clearance:length.optional(),min_via_hole_edge_to_via_hole_edge_clearance:length.optional(),min_plated_hole_drill_edge_to_drill_edge_clearance:length.optional(),min_trace_to_pad_edge_clearance:length.optional(),min_trace_to_hole_edge_clearance:length.optional().describe("Minimum distance from a trace copper edge to a non-plated hole edge, in mm. No default is applied when omitted."),min_pad_edge_to_pad_edge_clearance:length.optional(),min_same_net_trace_edge_to_trace_edge_clearance:length.optional(),min_different_net_trace_edge_to_trace_edge_clearance:length.optional(),min_via_edge_to_pad_edge_clearance:length.optional(),min_via_hole_diameter:length.optional(),min_via_pad_diameter:length.optional()}),pcb_component=external_exports.object({type:external_exports.literal("pcb_component"),pcb_component_id:getZodPrefixedIdWithDefault("pcb_component"),source_component_id:external_exports.string(),center:point,layer:layer_ref,rotation,display_offset_x:external_exports.string().optional().describe("How to display the x offset for this part, usually corresponding with how the user specified it"),display_offset_y:external_exports.string().optional().describe("How to display the y offset for this part, usually corresponding with how the user specified it"),width:length,height:length,do_not_place:external_exports.boolean().optional(),is_allowed_to_be_off_board:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),position_mode:external_exports.enum(["packed","relative_to_group_anchor","relative_to_another_component","none"]).optional(),anchor_position:point.optional(),anchor_alignment:ninePointAnchor.optional(),positioned_relative_to_pcb_group_id:external_exports.string().optional(),positioned_relative_to_pcb_board_id:external_exports.string().optional(),cable_insertion_center:point.optional(),insertion_direction:insertion_direction.optional(),pin1_location:pcb_pin1_location.optional().describe("Location of pin 1 on the unrotated, top-view component footprint"),supplier_pin1_location_map:external_exports.record(supplier_name,pcb_pin1_location).optional().describe("Pin 1 location for each supplier's unrotated, top-view footprint"),metadata:external_exports.object({kicad_footprint:kicadFootprintMetadata.optional()}).optional(),obstructs_within_bounds:external_exports.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");expectTypesMatch(!0);pcb_debug_object_base=external_exports.object({type:external_exports.literal("pcb_debug_object"),pcb_debug_object_id:getZodPrefixedIdWithDefault("pcb_debug_object"),label:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}),pcb_debug_rect=pcb_debug_object_base.extend({shape:external_exports.literal("rect"),center:point,size}),pcb_debug_line=pcb_debug_object_base.extend({shape:external_exports.literal("line"),start:point,end:point}),pcb_debug_point=pcb_debug_object_base.extend({shape:external_exports.literal("point"),center:point}),pcb_debug_object=external_exports.discriminatedUnion("shape",[pcb_debug_rect,pcb_debug_line,pcb_debug_point]);expectTypesMatch(!0);pcb_hole_circle=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("circle"),hole_diameter:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_circle_shape=pcb_hole_circle.describe("Defines a circular hole on the PCB");expectTypesMatch(!0);pcb_hole_rect=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("rect"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_rect_shape=pcb_hole_rect.describe("Defines a rectangular (square-capable) hole on the PCB. Use equal width/height for square.");expectTypesMatch(!0);pcb_hole_circle_or_square=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.enum(["circle","square"]),hole_diameter:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_circle_or_square_shape=pcb_hole_circle_or_square.describe("Defines a circular or square hole on the PCB");expectTypesMatch(!0);pcb_hole_oval=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("oval"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_oval_shape=pcb_hole_oval.describe("Defines an oval hole on the PCB");expectTypesMatch(!0);pcb_hole_pill=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("pill"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_pill_shape=pcb_hole_pill.describe("Defines a pill-shaped hole on the PCB");expectTypesMatch(!0);pcb_hole_rotated_pill=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("rotated_pill"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,ccw_rotation:rotation,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_rotated_pill_shape=pcb_hole_rotated_pill.describe("Defines a rotated pill-shaped hole on the PCB");expectTypesMatch(!0);pcb_hole=pcb_hole_circle_or_square.or(pcb_hole_oval).or(pcb_hole_pill).or(pcb_hole_rotated_pill).or(pcb_hole_circle).or(pcb_hole_rect),pcb_plated_hole_circle=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("circle"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),outer_diameter:external_exports.number(),hole_diameter:external_exports.number(),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_plated_hole_oval=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.enum(["oval","pill"]),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),outer_width:external_exports.number(),outer_height:external_exports.number(),hole_width:external_exports.number(),hole_height:external_exports.number(),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,ccw_rotation:rotation,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_circular_hole_with_rect_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("circular_hole_with_rect_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.literal("circle"),pad_shape:external_exports.literal("rect"),hole_diameter:external_exports.number(),rect_pad_width:external_exports.number(),rect_pad_height:external_exports.number(),rect_border_radius:external_exports.number().optional(),hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional(),rect_ccw_rotation:rotation.optional()}),pcb_pill_hole_with_rect_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("pill_hole_with_rect_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.literal("pill"),pad_shape:external_exports.literal("rect"),hole_width:external_exports.number(),hole_height:external_exports.number(),rect_pad_width:external_exports.number(),rect_pad_height:external_exports.number(),rect_border_radius:external_exports.number().optional(),hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_rotated_pill_hole_with_rect_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("rotated_pill_hole_with_rect_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.literal("rotated_pill"),pad_shape:external_exports.literal("rect"),hole_width:external_exports.number(),hole_height:external_exports.number(),hole_ccw_rotation:rotation,rect_pad_width:external_exports.number(),rect_pad_height:external_exports.number(),rect_border_radius:external_exports.number().optional(),rect_ccw_rotation:rotation,hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_hole_with_polygon_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("hole_with_polygon_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.enum(["circle","oval","pill","rotated_pill"]),hole_diameter:external_exports.number().optional(),hole_width:external_exports.number().optional(),hole_height:external_exports.number().optional(),pad_outline:external_exports.array(external_exports.object({x:distance,y:distance})).min(3),hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional(),ccw_rotation:rotation.optional()}),pcb_plated_hole=external_exports.union([pcb_plated_hole_circle,pcb_plated_hole_oval,pcb_circular_hole_with_rect_pad,pcb_pill_hole_with_rect_pad,pcb_rotated_pill_hole_with_rect_pad,pcb_hole_with_polygon_pad]);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);pcb_port=external_exports.object({type:external_exports.literal("pcb_port"),pcb_port_id:getZodPrefixedIdWithDefault("pcb_port"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),source_port_id:external_exports.string(),pcb_component_id:external_exports.string().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),is_board_pinout:external_exports.boolean().optional()}).describe("Defines a port on the PCB");expectTypesMatch(!0);pcb_smtpad_circle=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("circle"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,radius:external_exports.number(),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_rect=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),rect_border_radius:external_exports.number().optional(),corner_radius:external_exports.number().optional(),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),soldermask_margin_left:external_exports.number().optional(),soldermask_margin_top:external_exports.number().optional(),soldermask_margin_right:external_exports.number().optional(),soldermask_margin_bottom:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_rotated_rect=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("rotated_rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),rect_border_radius:external_exports.number().optional(),corner_radius:external_exports.number().optional(),ccw_rotation:rotation,layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),soldermask_margin_left:external_exports.number().optional(),soldermask_margin_top:external_exports.number().optional(),soldermask_margin_right:external_exports.number().optional(),soldermask_margin_bottom:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_pill=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_rotated_pill=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("rotated_pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),ccw_rotation:rotation,layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_polygon=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("polygon"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),points:external_exports.array(point),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad=external_exports.discriminatedUnion("shape",[pcb_smtpad_circle,pcb_smtpad_rect,pcb_smtpad_rotated_rect,pcb_smtpad_rotated_pill,pcb_smtpad_pill,pcb_smtpad_polygon]).describe("Defines an SMT pad on the PCB");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);pcb_solder_paste_circle=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("circle"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,radius:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_rect=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_pill=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("pill"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_rotated_rect=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("rotated_rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),ccw_rotation:distance,layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_rotated_pill=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("rotated_pill"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),ccw_rotation:rotation,layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_oval=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("oval"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_polygon=polygon_shape.extend({type:external_exports.literal("pcb_solder_paste"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),holes:external_exports.array(polygon_shape.shape.points).optional(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste=external_exports.union([pcb_solder_paste_circle,pcb_solder_paste_rect,pcb_solder_paste_pill,pcb_solder_paste_rotated_rect,pcb_solder_paste_rotated_pill,pcb_solder_paste_oval,pcb_solder_paste_polygon]).describe("Defines solderpaste on the PCB");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);opening_base=external_exports.object({type:external_exports.literal("pcb_soldermask_opening"),pcb_soldermask_opening_id:getZodPrefixedIdWithDefault("pcb_soldermask_opening"),layer:layer_ref.pipe(visible_layer),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}),pcb_soldermask_opening=external_exports.discriminatedUnion("shape",[circle_shape.extend(opening_base.shape),rect_shape.extend(opening_base.shape),rotated_rect_shape.extend(opening_base.shape),polygon_shape.extend(opening_base.shape)]).describe("An explicit opening in top or bottom solder mask or flex coverlay, independent of pads. Removes mask without adding copper or solder paste.");expectTypesMatch(!0);pcb_text=external_exports.object({type:external_exports.literal("pcb_text"),pcb_text_id:getZodPrefixedIdWithDefault("pcb_text"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),text:external_exports.string(),center:point,layer:layer_ref,width:length,height:length,lines:external_exports.number(),align:external_exports.enum(["bottom-left"])}).describe("Defines text on the PCB");expectTypesMatch(!0);positive_width=distance.pipe(external_exports.number().finite().positive()),pcb_trace_route_point_wire=external_exports.object({route_type:external_exports.literal("wire"),x:distance,y:distance,width:distance,start_width:positive_width.optional(),end_width:positive_width.optional(),width_interpolation_mode:external_exports.enum(["linear","quadratic"]).optional(),copper_pour_id:external_exports.string().optional(),is_inside_copper_pour:external_exports.boolean().optional(),start_pcb_port_id:external_exports.string().optional(),end_pcb_port_id:external_exports.string().optional(),layer:layer_ref}).superRefine((wire,ctx)=>{let present=[wire.start_width,wire.end_width,wire.width_interpolation_mode].filter(v11=>v11!==void 0).length;present!==0&&(present!==3&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Wire taper requires start_width, end_width and width_interpolation_mode together"}),wire.width!==wire.start_width&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["start_width"],message:"start_width must equal width"}),(!Number.isFinite(wire.x)||!Number.isFinite(wire.y))&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Tapered wire coordinates must be finite"}))}),pcb_trace_route_point_via=external_exports.object({route_type:external_exports.literal("via"),x:distance,y:distance,copper_pour_id:external_exports.string().optional(),is_inside_copper_pour:external_exports.boolean().optional(),hole_diameter:distance.optional(),outer_diameter:distance.optional(),tented_on_top:external_exports.boolean().optional(),tented_on_bottom:external_exports.boolean().optional(),from_layer:layer_ref,to_layer:layer_ref}),pcb_trace_route_point_through_pad=external_exports.object({route_type:external_exports.literal("through_pad"),start:point,end:point,width:distance,start_layer:layer_ref,end_layer:layer_ref,pcb_smtpad_id:external_exports.string().optional(),pcb_plated_hole_id:external_exports.string().optional()}),pcb_trace_route_point=external_exports.union([pcb_trace_route_point_wire,pcb_trace_route_point_via,pcb_trace_route_point_through_pad]),pcb_trace=external_exports.object({type:external_exports.literal("pcb_trace"),source_trace_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),pcb_trace_id:getZodPrefixedIdWithDefault("pcb_trace"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),route_thickness_mode:external_exports.enum(["constant","interpolated"]).default("constant").optional(),route_order_index:external_exports.number().optional(),should_round_corners:external_exports.boolean().optional(),trace_length:external_exports.number().optional(),is_antenna_trace:external_exports.boolean().optional(),highlight_color:external_exports.string().optional(),route:external_exports.array(pcb_trace_route_point).superRefine((route2,ctx)=>{for(let[i10,wire]of route2.entries()){if(wire.route_type!=="wire"||wire.width_interpolation_mode===void 0)continue;let next2=route2[i10+1],end=next2?.route_type==="through_pad"?next2.start:next2,layer=next2?.route_type==="wire"?next2.layer:next2?.route_type==="via"?next2.from_layer:next2?.start_layer,length43=end?Math.hypot(end.x-wire.x,end.y-wire.y):NaN;(!Number.isFinite(length43)||length43<=0||layer!==wire.layer)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:[i10],message:"Tapered wire must lead to a distinct finite next point on the same layer"})}})}).describe("Defines a trace on the PCB");expectTypesMatch(!0);expectTypesMatch(!0);pcb_trace_warning=external_exports.object({type:external_exports.literal("pcb_trace_warning"),pcb_trace_warning_id:getZodPrefixedIdWithDefault("pcb_trace_warning"),warning_type:external_exports.literal("pcb_trace_warning").default("pcb_trace_warning"),message:external_exports.string(),center:point.optional(),pcb_trace_id:external_exports.string(),source_trace_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()),pcb_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines a trace warning on the PCB");expectTypesMatch(!0);pcb_trace_style_warning=external_exports.object({type:external_exports.literal("pcb_trace_style_warning"),pcb_trace_style_warning_id:getZodPrefixedIdWithDefault("pcb_trace_style_warning"),warning_type:external_exports.literal("pcb_trace_style_warning").default("pcb_trace_style_warning"),message:external_exports.string(),styling_issue_type:external_exports.literal("long_segment_at_odd_angle"),pcb_trace_id:external_exports.string(),source_trace_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,start_route_index:external_exports.number().int().nonnegative(),end_route_index:external_exports.number().int().nonnegative(),segment_start:point,segment_end:point,center:point,segment_length:distance,minimum_segment_length:distance,angle_degrees:external_exports.number().min(0).lt(360),nearest_allowed_angle_degrees:external_exports.number().min(0).lt(360).multipleOf(45),angle_deviation_degrees:external_exports.number().min(0).max(22.5),angle_tolerance_degrees:external_exports.number().min(0).lt(22.5)}).describe("Warning for a long PCB trace segment whose direction deviates from a multiple of 45 degrees");expectTypesMatch(!0);pcb_trace_too_long_error=external_exports.object({type:external_exports.literal("pcb_trace_too_long_error"),pcb_trace_too_long_error_id:getZodPrefixedIdWithDefault("pcb_trace_too_long_error"),error_type:external_exports.literal("pcb_trace_too_long_error").default("pcb_trace_too_long_error"),message:external_exports.string(),pcb_trace_id:external_exports.string(),source_net_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),actual_trace_length:distance,maximum_trace_length:distance,subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a PCB trace is longer than its maximum allowed length");expectTypesMatch(!0);pcb_bus_length_skew_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_bus_length_skew_error"),pcb_bus_length_skew_error_id:getZodPrefixedIdWithDefault("pcb_bus_length_skew_error"),error_type:external_exports.literal("pcb_bus_length_skew_error").default("pcb_bus_length_skew_error"),source_bus_id:external_exports.string(),source_trace_ids:external_exports.array(external_exports.string()),pcb_trace_ids:external_exports.array(external_exports.string()),actual_length_skew:external_exports.number().nonnegative().finite(),maximum_length_skew:external_exports.number().nonnegative().finite(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);pcb_trace_too_long_warning=external_exports.object({type:external_exports.literal("pcb_trace_too_long_warning"),pcb_trace_too_long_warning_id:getZodPrefixedIdWithDefault("pcb_trace_too_long_warning"),warning_type:external_exports.literal("pcb_trace_too_long_warning").default("pcb_trace_too_long_warning"),message:external_exports.string(),pcb_trace_id:external_exports.string(),source_net_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),actual_trace_length:distance,maximum_trace_length:distance,subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a PCB trace is longer than its maximum allowed length");expectTypesMatch(!0);pcb_trace_too_many_vias_warning=external_exports.object({type:external_exports.literal("pcb_trace_too_many_vias_warning"),pcb_trace_too_many_vias_warning_id:getZodPrefixedIdWithDefault("pcb_trace_too_many_vias_warning"),warning_type:external_exports.literal("pcb_trace_too_many_vias_warning").default("pcb_trace_too_many_vias_warning"),message:external_exports.string(),pcb_trace_id:external_exports.string(),source_net_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),actual_via_count:external_exports.number().int().nonnegative(),maximum_via_count:external_exports.number().int().nonnegative(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a PCB trace has more vias than its maximum allowed count");expectTypesMatch(!0);error_base=base_circuit_json_error.extend({type:external_exports.literal("pcb_bus_routing_constraint_error"),pcb_bus_routing_constraint_error_id:getZodPrefixedIdWithDefault("pcb_bus_routing_constraint_error"),error_type:external_exports.literal("pcb_bus_routing_constraint_error").default("pcb_bus_routing_constraint_error"),source_bus_id:external_exports.string(),source_trace_ids:external_exports.array(external_exports.string()).min(1),pcb_trace_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}),pcb_bus_routing_constraint_error=external_exports.discriminatedUnion("routing_rule",[error_base.extend({routing_rule:external_exports.literal("length_skew"),actual_length_skew:external_exports.number().nonnegative().finite(),maximum_length_skew:external_exports.number().nonnegative().finite()}),error_base.extend({routing_rule:external_exports.literal("min_length"),actual_trace_length:external_exports.number().nonnegative().finite(),minimum_trace_length:external_exports.number().finite()}),error_base.extend({routing_rule:external_exports.literal("max_length"),actual_trace_length:external_exports.number().nonnegative().finite(),maximum_trace_length:external_exports.number().finite()}),error_base.extend({routing_rule:external_exports.literal("target_length"),actual_trace_length:external_exports.number().nonnegative().finite(),target_trace_length:external_exports.number().finite(),length_tolerance:external_exports.number().nonnegative().finite()}),error_base.extend({routing_rule:external_exports.literal("pcb_trace_spacing"),other_pcb_trace_id:external_exports.string(),other_source_trace_id:external_exports.string().optional(),actual_centerline_spacing:external_exports.number().nonnegative().finite(),minimum_centerline_spacing:external_exports.number().positive().finite()}),error_base.extend({routing_rule:external_exports.literal("pcb_spacing_to_other_signals"),other_pcb_trace_id:external_exports.string(),other_source_trace_id:external_exports.string().optional(),actual_centerline_spacing:external_exports.number().nonnegative().finite(),minimum_centerline_spacing:external_exports.number().positive().finite()}),error_base.extend({routing_rule:external_exports.literal("impedance_target"),target_impedance:external_exports.number().positive().finite(),minimum_impedance:external_exports.number().positive().finite().optional(),maximum_impedance:external_exports.number().positive().finite().optional()})]).superRefine((error2,ctx)=>{error2.routing_rule==="impedance_target"&&(error2.minimum_impedance===void 0&&error2.maximum_impedance===void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["minimum_impedance"],message:"Provide an impedance bound"}),error2.minimum_impedance!==void 0&&error2.maximum_impedance!==void 0&&error2.minimum_impedance>error2.maximum_impedance&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["maximum_impedance"],message:"Impedance bounds must be ordered"}))}).describe("A declared bus or differential-pair routing constraint is violated.");expectTypesMatch(!0);warning_base=external_exports.object({type:external_exports.literal("pcb_bus_routing_constraint_warning"),pcb_bus_routing_constraint_warning_id:getZodPrefixedIdWithDefault("pcb_bus_routing_constraint_warning"),warning_type:external_exports.literal("pcb_bus_routing_constraint_warning").default("pcb_bus_routing_constraint_warning"),source_bus_id:external_exports.string(),source_trace_ids:external_exports.array(external_exports.string()).min(1),pcb_trace_ids:external_exports.array(external_exports.string()),message:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("A declared bus or pair constraint could not be verified; this is not a pass."),pcb_bus_routing_constraint_warning=external_exports.discriminatedUnion("routing_rule",[warning_base.extend({routing_rule:external_exports.literal("route_geometry")}),warning_base.extend({routing_rule:external_exports.literal("reference_geometry")}),warning_base.extend({routing_rule:external_exports.literal("spacing_geometry")}),warning_base.extend({routing_rule:external_exports.literal("target_length")}),warning_base.extend({routing_rule:external_exports.literal("physical_impedance")})]);expectTypesMatch(!0);pcb_trace_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_trace_error"),pcb_trace_error_id:getZodPrefixedIdWithDefault("pcb_trace_error"),error_type:external_exports.literal("pcb_trace_error").default("pcb_trace_error"),center:point.optional(),pcb_trace_id:external_exports.string(),source_trace_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()),pcb_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines a trace error on the PCB");expectTypesMatch(!0);pcb_trace_missing_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_trace_missing_error"),pcb_trace_missing_error_id:getZodPrefixedIdWithDefault("pcb_trace_missing_error"),error_type:external_exports.literal("pcb_trace_missing_error").default("pcb_trace_missing_error"),center:point.optional(),source_trace_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()),pcb_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines an error when a source trace has no corresponding PCB trace");expectTypesMatch(!0);pcb_port_not_matched_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_port_not_matched_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_port_not_matched_error").default("pcb_port_not_matched_error"),pcb_component_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines a trace error on the PCB where a port is not matched");expectTypesMatch(!0);pcb_port_not_connected_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_port_not_connected_error"),pcb_port_not_connected_error_id:getZodPrefixedIdWithDefault("pcb_port_not_connected_error"),error_type:external_exports.literal("pcb_port_not_connected_error").default("pcb_port_not_connected_error"),pcb_port_ids:external_exports.array(external_exports.string()),pcb_component_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines an error when a pcb port is not connected to any trace");expectTypesMatch(!0);pcb_net=external_exports.object({type:external_exports.literal("pcb_net"),pcb_net_id:getZodPrefixedIdWithDefault("pcb_net"),source_net_id:external_exports.string().optional(),highlight_color:external_exports.string().optional()}).describe("Defines a net on the PCB");expectTypesMatch(!0);pcb_via=external_exports.object({type:external_exports.literal("pcb_via"),pcb_via_id:getZodPrefixedIdWithDefault("pcb_via"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),x:distance,y:distance,outer_diameter:distance.default("0.6mm"),hole_diameter:distance.default("0.25mm"),topmost_drill_layer:layer_ref.optional(),bottommost_drill_layer:layer_ref.optional(),through_hole:external_exports.boolean().optional(),from_layer:layer_ref.optional(),to_layer:layer_ref.optional(),layers:external_exports.array(layer_ref),pcb_port_ids:external_exports.array(external_exports.string()).optional(),pcb_trace_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),source_net_id:external_exports.string().min(1).optional(),net_is_assignable:external_exports.boolean().optional(),net_assigned:external_exports.boolean().optional(),is_tented:external_exports.boolean().optional(),tented_on_top:external_exports.boolean().optional(),tented_on_bottom:external_exports.boolean().optional()}).transform(({is_tented,...via})=>(is_tented!==void 0&&(via.tented_on_top??(via.tented_on_top=is_tented),via.tented_on_bottom??(via.tented_on_bottom=is_tented)),via)).describe("Defines a via on the PCB");expectTypesMatch(!0);pcb_board=external_exports.object({type:external_exports.literal("pcb_board"),pcb_board_id:getZodPrefixedIdWithDefault("pcb_board"),pcb_panel_id:external_exports.string().optional(),carrier_pcb_board_id:external_exports.string().optional(),is_subcircuit:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),is_mounted_to_carrier_board:external_exports.boolean().optional(),is_via_in_pad_allowed:external_exports.boolean().optional(),default_via_tented_on_top:external_exports.boolean().optional(),default_via_tented_on_bottom:external_exports.boolean().optional(),default_via_plugged:external_exports.boolean().optional(),width:length.optional(),height:length.optional(),center:point,display_offset_x:external_exports.string().optional().describe("How to display the x offset for this board, usually corresponding with how the user specified it"),display_offset_y:external_exports.string().optional().describe("How to display the y offset for this board, usually corresponding with how the user specified it"),thickness:length.optional().default(1.4),num_layers:external_exports.number().optional().default(4),allow_blind_and_buried_vias:external_exports.boolean().optional().describe("Whether autorouters may generate blind and buried vias. False restricts newly generated vias to the full board stack."),outline:external_exports.array(point).optional(),shape:external_exports.enum(["rect","polygon"]).optional(),material:external_exports.enum(["fr4","fr1","flex"]).default("fr4"),solder_mask_color:external_exports.string().optional(),silkscreen_color:external_exports.string().optional(),anchor_position:point.optional(),anchor_alignment:ninePointAnchor.optional(),position_mode:external_exports.enum(["relative_to_panel_anchor","none"]).optional()}).merge(manufacturing_drc_properties).describe("Defines the board outline of the PCB");expectTypesMatch(!0);finite_point=point.extend({x:length.pipe(external_exports.number().finite()),y:length.pipe(external_exports.number().finite())}),pcb_bend=external_exports.object({type:external_exports.literal("pcb_bend"),pcb_bend_id:getZodPrefixedIdWithDefault("pcb_bend"),pcb_board_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),start:finite_point,end:finite_point,bend_angle:rotation.pipe(external_exports.number().finite()),bend_radius:length.pipe(external_exports.number().finite().positive()),bend_side:external_exports.enum(["left","right"])}).refine(({start,end})=>start.x!==end.x||start.y!==end.y,{message:"Bend centerline endpoints must be distinct",path:["end"]}).describe("Defines a finite-radius bend on a flat PCB for runtime CAD folding");expectTypesMatch(!0);positive_length=length.pipe(external_exports.number().finite().positive()),finite_point2=point.extend({x:length.pipe(external_exports.number().finite()),y:length.pipe(external_exports.number().finite())}),pcb_stiffener_base=external_exports.object({type:external_exports.literal("pcb_stiffener"),pcb_stiffener_id:getZodPrefixedIdWithDefault("pcb_stiffener"),pcb_board_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),layer:external_exports.enum(["top","bottom"]),material:external_exports.enum(["fr4","polyimide","stainless_steel","aluminum"]),thickness:positive_length,adhesive_thickness:length.pipe(external_exports.number().finite().nonnegative()).optional()}),pcb_stiffener_rect=pcb_stiffener_base.extend({shape:external_exports.literal("rect"),center:finite_point2,rotation:rotation.pipe(external_exports.number().finite()).optional(),width:positive_length,height:positive_length,outline:external_exports.never().optional()});expectTypesMatch(!0);pcb_stiffener_polygon=pcb_stiffener_base.extend({shape:external_exports.literal("polygon"),outline:external_exports.array(finite_point2).min(3).refine(points=>{let twice_area=points.reduce((sum,p11,i10)=>{let next2=points[(i10+1)%points.length];return sum+p11.x*next2.y-next2.x*p11.y},0);return Number.isFinite(twice_area)&&twice_area!==0},"Stiffener outline must enclose a nonzero area"),center:external_exports.never().optional(),rotation:external_exports.never().optional(),width:external_exports.never().optional(),height:external_exports.never().optional()});expectTypesMatch(!0);pcb_stiffener=external_exports.discriminatedUnion("shape",[pcb_stiffener_rect,pcb_stiffener_polygon]).describe("Defines bonded mechanical PCB reinforcement without adding copper layers");expectTypesMatch(!0);pcb_panel=external_exports.object({type:external_exports.literal("pcb_panel"),pcb_panel_id:getZodPrefixedIdWithDefault("pcb_panel"),width:length,height:length,center:point,thickness:length.optional().default(1.4),covered_with_solder_mask:external_exports.boolean().optional().default(!0)}).describe("Defines a PCB panel that can contain multiple boards");expectTypesMatch(!0);pcb_placement_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_placement_error"),pcb_placement_error_id:getZodPrefixedIdWithDefault("pcb_placement_error"),error_type:external_exports.literal("pcb_placement_error").default("pcb_placement_error"),subcircuit_id:external_exports.string().optional()}).describe("Defines a placement error on the PCB");expectTypesMatch(!0);pcb_packing_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_packing_error"),pcb_packing_error_id:getZodPrefixedIdWithDefault("pcb_packing_error"),error_type:external_exports.literal("pcb_packing_error").default("pcb_packing_error"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a failure to pack PCB components within layout bounds");expectTypesMatch(!0);pcb_panelization_placement_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_panelization_placement_error"),pcb_panelization_placement_error_id:getZodPrefixedIdWithDefault("pcb_panelization_placement_error"),error_type:external_exports.literal("pcb_panelization_placement_error").default("pcb_panelization_placement_error"),pcb_panel_id:external_exports.string().optional(),pcb_board_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a panelization placement error on the PCB");expectTypesMatch(!0);pcb_trace_hint=external_exports.object({type:external_exports.literal("pcb_trace_hint"),pcb_trace_hint_id:getZodPrefixedIdWithDefault("pcb_trace_hint"),pcb_port_id:external_exports.string(),pcb_component_id:external_exports.string(),route:external_exports.array(route_hint_point),subcircuit_id:external_exports.string().optional()}).describe("A hint that can be used during generation of a PCB trace");expectTypesMatch(!0);pcb_silkscreen_line=external_exports.object({type:external_exports.literal("pcb_silkscreen_line"),pcb_silkscreen_line_id:getZodPrefixedIdWithDefault("pcb_silkscreen_line"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),stroke_width:distance.default("0.1mm"),x1:distance,y1:distance,x2:distance,y2:distance,layer:visible_layer}).describe("Defines a silkscreen line on the PCB");expectTypesMatch(!0);pcb_silkscreen_path=external_exports.object({type:external_exports.literal("pcb_silkscreen_path"),pcb_silkscreen_path_id:getZodPrefixedIdWithDefault("pcb_silkscreen_path"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,route:external_exports.array(point),stroke_width:length}).describe("Defines a silkscreen path on the PCB");expectTypesMatch(!0);pcb_silkscreen_text=external_exports.object({type:external_exports.literal("pcb_silkscreen_text"),pcb_silkscreen_text_id:getZodPrefixedIdWithDefault("pcb_silkscreen_text"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("0.2mm"),pcb_component_id:external_exports.string(),text:external_exports.string(),is_knockout:external_exports.boolean().default(!1).optional(),knockout_padding:external_exports.object({left:length,top:length,bottom:length,right:length}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports.number().optional(),layer:layer_ref,is_mirrored:external_exports.boolean().default(!1).optional(),anchor_position:point.default({x:0,y:0}),anchor_alignment:ninePointAnchor.default("center")}).describe("Defines silkscreen text on the PCB");expectTypesMatch(!0);pcb_copper_text=external_exports.object({type:external_exports.literal("pcb_copper_text"),pcb_copper_text_id:getZodPrefixedIdWithDefault("pcb_copper_text"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("0.2mm"),pcb_component_id:external_exports.string(),text:external_exports.string(),is_knockout:external_exports.boolean().default(!1).optional(),knockout_padding:external_exports.object({left:length,top:length,bottom:length,right:length}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports.number().optional(),layer:layer_ref,is_mirrored:external_exports.boolean().default(!1).optional(),anchor_position:point.default({x:0,y:0}),anchor_alignment:ninePointAnchor.default("center")}).describe("Defines copper text on the PCB");expectTypesMatch(!0);pcb_silkscreen_rect=external_exports.object({type:external_exports.literal("pcb_silkscreen_rect"),pcb_silkscreen_rect_id:getZodPrefixedIdWithDefault("pcb_silkscreen_rect"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:layer_ref,stroke_width:length.default("1mm"),corner_radius:length.optional(),is_filled:external_exports.boolean().default(!0).optional(),has_stroke:external_exports.boolean().optional(),is_stroke_dashed:external_exports.boolean().optional(),ccw_rotation:external_exports.number().optional()}).describe("Defines a silkscreen rect on the PCB");expectTypesMatch(!0);pcb_silkscreen_circle=external_exports.object({type:external_exports.literal("pcb_silkscreen_circle"),pcb_silkscreen_circle_id:getZodPrefixedIdWithDefault("pcb_silkscreen_circle"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius:length,layer:visible_layer,stroke_width:length.default("1mm"),is_filled:external_exports.boolean().optional()}).describe("Defines a silkscreen circle on the PCB");expectTypesMatch(!0);pcb_silkscreen_oval=external_exports.object({type:external_exports.literal("pcb_silkscreen_oval"),pcb_silkscreen_oval_id:getZodPrefixedIdWithDefault("pcb_silkscreen_oval"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius_x:distance,radius_y:distance,layer:visible_layer,ccw_rotation:rotation.optional()}).describe("Defines a silkscreen oval on the PCB");expectTypesMatch(!0);pcb_silkscreen_graphic_base=external_exports.object({type:external_exports.literal("pcb_silkscreen_graphic"),pcb_silkscreen_graphic_id:getZodPrefixedIdWithDefault("pcb_silkscreen_graphic"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,image_asset:asset.optional()}),pcb_silkscreen_graphic_brep=pcb_silkscreen_graphic_base.extend({shape:external_exports.literal("brep"),brep_shape}).describe("Defines a BRep silkscreen graphic on the PCB");expectTypesMatch(!0);pcb_silkscreen_graphic=external_exports.discriminatedUnion("shape",[pcb_silkscreen_graphic_brep]).describe("Defines a silkscreen graphic on the PCB");expectTypesMatch(!0);pcb_silkscreen_pill=external_exports.object({type:external_exports.literal("pcb_silkscreen_pill"),pcb_silkscreen_pill_id:getZodPrefixedIdWithDefault("pcb_silkscreen_pill"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:layer_ref,ccw_rotation:external_exports.number().optional()}).describe("Defines a silkscreen pill on the PCB");expectTypesMatch(!0);pcb_fabrication_note_text=external_exports.object({type:external_exports.literal("pcb_fabrication_note_text"),pcb_fabrication_note_text_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_text"),subcircuit_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("1mm"),pcb_component_id:external_exports.string(),text:external_exports.string(),ccw_rotation:external_exports.number().optional(),layer:visible_layer,anchor_position:point.default({x:0,y:0}),anchor_alignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),color:external_exports.string().optional()}).describe("Defines a fabrication note in text on the PCB, useful for leaving notes for assemblers or fabricators");expectTypesMatch(!0);pcb_fabrication_note_path=external_exports.object({type:external_exports.literal("pcb_fabrication_note_path"),pcb_fabrication_note_path_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_path"),pcb_component_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,route:external_exports.array(point),stroke_width:length,color:external_exports.string().optional(),is_filled:external_exports.boolean().optional(),has_stroke:external_exports.boolean().optional()}).describe("Defines a fabrication path on the PCB for fabricators or assemblers");expectTypesMatch(!0);pcb_fabrication_note_rect=external_exports.object({type:external_exports.literal("pcb_fabrication_note_rect"),pcb_fabrication_note_rect_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_rect"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:visible_layer,stroke_width:length.default("0.1mm"),corner_radius:length.optional(),is_filled:external_exports.boolean().optional(),has_stroke:external_exports.boolean().optional(),is_stroke_dashed:external_exports.boolean().optional(),color:external_exports.string().optional()}).describe("Defines a fabrication note rectangle on the PCB");expectTypesMatch(!0);pcb_fabrication_note_dimension=external_exports.object({type:external_exports.literal("pcb_fabrication_note_dimension"),pcb_fabrication_note_dimension_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_dimension"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,from:point,to:point,text:external_exports.string().optional(),text_ccw_rotation:external_exports.number().optional(),offset:length.optional(),offset_distance:length.optional(),offset_direction:external_exports.object({x:external_exports.number(),y:external_exports.number()}).optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:length.default("1mm"),color:external_exports.string().optional(),arrow_size:length.default("1mm")}).describe("Defines a measurement annotation within PCB fabrication notes");expectTypesMatch(!0);pcb_note_text=external_exports.object({type:external_exports.literal("pcb_note_text"),pcb_note_text_id:getZodPrefixedIdWithDefault("pcb_note_text"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("1mm"),text:external_exports.string().optional(),anchor_position:point.default({x:0,y:0}),anchor_alignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),layer:visible_layer.default("top"),is_mirrored_from_top_view:external_exports.boolean().optional(),color:external_exports.string().optional()}).describe("Defines a documentation note in text on the PCB");expectTypesMatch(!0);pcb_note_rect=external_exports.object({type:external_exports.literal("pcb_note_rect"),pcb_note_rect_id:getZodPrefixedIdWithDefault("pcb_note_rect"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),text:external_exports.string().optional(),center:point,width:length,height:length,layer:visible_layer.default("top"),stroke_width:length.default("0.1mm"),corner_radius:length.optional(),is_filled:external_exports.boolean().optional(),has_stroke:external_exports.boolean().optional(),is_stroke_dashed:external_exports.boolean().optional(),color:external_exports.string().optional()}).describe("Defines a rectangular documentation note on the PCB");expectTypesMatch(!0);pcb_note_path=external_exports.object({type:external_exports.literal("pcb_note_path"),pcb_note_path_id:getZodPrefixedIdWithDefault("pcb_note_path"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),text:external_exports.string().optional(),route:external_exports.array(point),layer:visible_layer.default("top"),stroke_width:length.default("0.1mm"),color:external_exports.string().optional()}).describe("Defines a polyline documentation note on the PCB");expectTypesMatch(!0);pcb_note_line=external_exports.object({type:external_exports.literal("pcb_note_line"),pcb_note_line_id:getZodPrefixedIdWithDefault("pcb_note_line"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),text:external_exports.string().optional(),x1:distance,y1:distance,x2:distance,y2:distance,layer:visible_layer.default("top"),stroke_width:distance.default("0.1mm"),color:external_exports.string().optional(),is_dashed:external_exports.boolean().optional()}).describe("Defines a straight documentation note line on the PCB");expectTypesMatch(!0);pcb_note_dimension=external_exports.object({type:external_exports.literal("pcb_note_dimension"),pcb_note_dimension_id:getZodPrefixedIdWithDefault("pcb_note_dimension"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),from:point,to:point,text:external_exports.string().optional(),text_ccw_rotation:external_exports.number().optional(),offset_distance:length.optional(),offset_direction:external_exports.object({x:external_exports.number(),y:external_exports.number()}).optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:length.default("1mm"),layer:visible_layer.default("top"),color:external_exports.string().optional(),arrow_size:length.default("1mm")}).describe("Defines a measurement annotation within PCB documentation notes");expectTypesMatch(!0);pcb_footprint_overlap_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_footprint_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_footprint_overlap_error").default("pcb_footprint_overlap_error"),pcb_smtpad_ids:external_exports.array(external_exports.string()).optional(),pcb_plated_hole_ids:external_exports.array(external_exports.string()).optional(),pcb_hole_ids:external_exports.array(external_exports.string()).optional(),pcb_keepout_ids:external_exports.array(external_exports.string()).optional()}).describe("Error emitted when a pcb footprint overlaps with another element");expectTypesMatch(!0);pcb_courtyard_overlap_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_courtyard_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_courtyard_overlap_error").default("pcb_courtyard_overlap_error"),pcb_component_ids:external_exports.tuple([external_exports.string(),external_exports.string()])}).describe("Error emitted when the courtyard (CrtYd) of one PCB component overlaps with the courtyard of another");expectTypesMatch(!0);pcb_keepout_outline=external_exports.object({type:external_exports.literal("pcb_keepout"),shape:external_exports.literal("outline"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),outline:external_exports.array(point).min(2),stroke_width:length,pcb_keepout_id:external_exports.string(),layers:external_exports.array(external_exports.string()),description:external_exports.string().optional(),excluded_pcb_component_ids:external_exports.array(external_exports.string()).optional(),warning_only:external_exports.boolean().optional(),allow_traces:external_exports.boolean().optional(),allow_placements:external_exports.boolean().optional()}),pcb_keepout=external_exports.object({type:external_exports.literal("pcb_keepout"),shape:external_exports.literal("rect"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:distance,height:distance,pcb_keepout_id:external_exports.string(),layers:external_exports.array(external_exports.string()),description:external_exports.string().optional(),excluded_pcb_component_ids:external_exports.array(external_exports.string()).optional(),warning_only:external_exports.boolean().optional(),allow_traces:external_exports.boolean().optional(),allow_placements:external_exports.boolean().optional()}).or(external_exports.object({type:external_exports.literal("pcb_keepout"),shape:external_exports.literal("circle"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius:distance,pcb_keepout_id:external_exports.string(),layers:external_exports.array(external_exports.string()),description:external_exports.string().optional(),excluded_pcb_component_ids:external_exports.array(external_exports.string()).optional(),warning_only:external_exports.boolean().optional(),allow_traces:external_exports.boolean().optional(),allow_placements:external_exports.boolean().optional()})).or(pcb_keepout_outline);expectTypesMatch(!0);expectTypesMatch(!0);pcb_keepout_overlap_warning=external_exports.object({type:external_exports.literal("pcb_keepout_overlap_warning"),pcb_keepout_overlap_warning_id:getZodPrefixedIdWithDefault("pcb_keepout_overlap_warning"),warning_type:external_exports.literal("pcb_keepout_overlap_warning").default("pcb_keepout_overlap_warning"),message:external_exports.string(),pcb_keepout_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()).optional(),pcb_trace_ids:external_exports.array(external_exports.string()).optional(),pcb_smtpad_ids:external_exports.array(external_exports.string()).optional(),pcb_plated_hole_ids:external_exports.array(external_exports.string()).optional(),pcb_via_ids:external_exports.array(external_exports.string()).optional(),center:point.optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when copper overlaps a PCB keepout with warning_only enabled");expectTypesMatch(!0);pcb_cutout_base=external_exports.object({type:external_exports.literal("pcb_cutout"),pcb_cutout_id:getZodPrefixedIdWithDefault("pcb_cutout"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_board_id:external_exports.string().optional(),pcb_panel_id:external_exports.string().optional()}),pcb_cutout_rect=pcb_cutout_base.extend({shape:external_exports.literal("rect"),center:point,width:length,height:length,rotation:rotation.optional(),corner_radius:length.optional()});expectTypesMatch(!0);pcb_cutout_circle=pcb_cutout_base.extend({shape:external_exports.literal("circle"),center:point,radius:length});expectTypesMatch(!0);pcb_cutout_polygon=pcb_cutout_base.extend({shape:external_exports.literal("polygon"),points:external_exports.array(point)});expectTypesMatch(!0);pcb_cutout_path=pcb_cutout_base.extend({shape:external_exports.literal("path"),route:external_exports.array(point),slot_width:length,slot_length:length.optional(),space_between_slots:length.optional(),slot_corner_radius:length.optional()});expectTypesMatch(!0);pcb_cutout=external_exports.discriminatedUnion("shape",[pcb_cutout_rect,pcb_cutout_circle,pcb_cutout_polygon,pcb_cutout_path]).describe("Defines a cutout on the PCB, removing board material.");expectTypesMatch(!0);pcb_missing_footprint_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_missing_footprint_error"),pcb_missing_footprint_error_id:getZodPrefixedIdWithDefault("pcb_missing_footprint_error"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("pcb_missing_footprint_error").default("pcb_missing_footprint_error"),source_component_id:external_exports.string()}).describe("Defines a missing footprint error on the PCB");expectTypesMatch(!0);external_footprint_load_error=base_circuit_json_error.extend({type:external_exports.literal("external_footprint_load_error"),external_footprint_load_error_id:getZodPrefixedIdWithDefault("external_footprint_load_error"),pcb_component_id:external_exports.string(),source_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),footprinter_string:external_exports.string().optional(),error_type:external_exports.literal("external_footprint_load_error").default("external_footprint_load_error")}).describe("Defines an error when an external footprint fails to load");expectTypesMatch(!0);circuit_json_footprint_load_error=base_circuit_json_error.extend({type:external_exports.literal("circuit_json_footprint_load_error"),circuit_json_footprint_load_error_id:getZodPrefixedIdWithDefault("circuit_json_footprint_load_error"),pcb_component_id:external_exports.string(),source_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("circuit_json_footprint_load_error").default("circuit_json_footprint_load_error"),circuit_json:external_exports.array(external_exports.any()).optional()}).describe("Defines an error when a circuit JSON footprint fails to load");expectTypesMatch(!0);pcb_group=external_exports.object({type:external_exports.literal("pcb_group"),pcb_group_id:getZodPrefixedIdWithDefault("pcb_group"),source_group_id:external_exports.string(),is_subcircuit:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),width:length.optional(),height:length.optional(),center:point,display_offset_x:external_exports.string().optional().describe("How to display the x offset for this group, usually corresponding with how the user specified it"),display_offset_y:external_exports.string().optional().describe("How to display the y offset for this group, usually corresponding with how the user specified it"),outline:external_exports.array(point).optional(),anchor_position:point.optional(),anchor_alignment:ninePointAnchor.default("center"),position_mode:external_exports.enum(["packed","relative_to_group_anchor","none"]).optional(),positioned_relative_to_pcb_group_id:external_exports.string().optional(),positioned_relative_to_pcb_board_id:external_exports.string().optional(),pcb_component_ids:external_exports.array(external_exports.string()),child_layout_mode:external_exports.enum(["packed","none"]).optional(),name:external_exports.string().optional(),description:external_exports.string().optional(),layout_mode:external_exports.string().optional(),autorouter_configuration:external_exports.object({trace_clearance:length}).optional(),autorouter_used_string:external_exports.string().optional()}).describe("Defines a group of components on the PCB");expectTypesMatch(!0);pcb_autorouting_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_autorouting_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_autorouting_error"),error_type:external_exports.literal("pcb_autorouting_error").default("pcb_autorouting_error"),subcircuit_id:external_exports.string().optional()}).describe("The autorouting has failed to route a portion of the board");expectTypesMatch(!0);pcb_preflight_routing_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_preflight_routing_error"),pcb_preflight_routing_error_id:getZodPrefixedIdWithDefault("pcb_preflight_routing_error"),error_type:external_exports.literal("pcb_preflight_routing_error").default("pcb_preflight_routing_error"),error_code:external_exports.string(),subcircuit_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),routing_phase_index:external_exports.number().int().optional(),phase_name:external_exports.string().optional(),source_trace_ids:external_exports.array(external_exports.string()).optional(),pcb_component_ids:external_exports.array(external_exports.string()).optional(),pcb_port_ids:external_exports.array(external_exports.string()).optional(),related_error_ids:external_exports.array(external_exports.string()).optional(),measurements:external_exports.record(external_exports.number().finite()).optional()});expectTypesMatch(!0);pcb_manual_edit_conflict_warning=external_exports.object({type:external_exports.literal("pcb_manual_edit_conflict_warning"),pcb_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault("pcb_manual_edit_conflict_warning"),warning_type:external_exports.literal("pcb_manual_edit_conflict_warning").default("pcb_manual_edit_conflict_warning"),message:external_exports.string(),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),source_component_id:external_exports.string()}).describe("Warning emitted when a component has both manual placement and explicit pcbX/pcbY coordinates");expectTypesMatch(!0);connectorOrientationDirection=external_exports.enum(["x-","x+","y+","y-"]),pcb_connector_not_in_accessible_orientation_warning=external_exports.object({type:external_exports.literal("pcb_connector_not_in_accessible_orientation_warning"),pcb_connector_not_in_accessible_orientation_warning_id:getZodPrefixedIdWithDefault("pcb_connector_not_in_accessible_orientation_warning"),warning_type:external_exports.literal("pcb_connector_not_in_accessible_orientation_warning").default("pcb_connector_not_in_accessible_orientation_warning"),message:external_exports.string(),pcb_component_id:external_exports.string(),source_component_id:external_exports.string().optional(),pcb_board_id:external_exports.string().optional(),facing_direction:connectorOrientationDirection,recommended_facing_direction:connectorOrientationDirection,subcircuit_id:external_exports.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");expectTypesMatch(!0);pcb_component_missing_courtyard_warning=external_exports.object({type:external_exports.literal("pcb_component_missing_courtyard_warning"),pcb_component_missing_courtyard_warning_id:getZodPrefixedIdWithDefault("pcb_component_missing_courtyard_warning"),warning_type:external_exports.literal("pcb_component_missing_courtyard_warning").default("pcb_component_missing_courtyard_warning"),message:external_exports.string(),pcb_component_id:external_exports.string(),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a PCB component has no courtyard geometry");expectTypesMatch(!0);supplier_footprint_mismatch_warning=external_exports.object({type:external_exports.literal("supplier_footprint_mismatch_warning"),supplier_footprint_mismatch_warning_id:getZodPrefixedIdWithDefault("supplier_footprint_mismatch_warning"),warning_type:external_exports.literal("supplier_footprint_mismatch_warning").default("supplier_footprint_mismatch_warning"),message:external_exports.string(),source_component_id:external_exports.string(),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),supplier_name:supplier_name.optional(),supplier_part_number:external_exports.string().optional(),supplier_footprint_url:external_exports.string().optional(),footprint_copper_intersection_over_union:external_exports.number()}).describe("Warning emitted when a supplier part footprint does not match the expected footprint");expectTypesMatch(!0);pcb_fabricator_extra_charge_warning=external_exports.object({type:external_exports.literal("pcb_fabricator_extra_charge_warning"),pcb_fabricator_extra_charge_warning_id:getZodPrefixedIdWithDefault("pcb_fabricator_extra_charge_warning"),warning_type:external_exports.literal("pcb_fabricator_extra_charge_warning").default("pcb_fabricator_extra_charge_warning"),message:external_exports.string(),fabricator_preset:external_exports.string(),pcb_board_id:external_exports.string().optional(),pcb_via_ids:external_exports.array(external_exports.string()).optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning that a design feature incurs an extra charge for the selected fabricator preset, such as via hole diameters below 0.3 mm with JLCPCB economy or standard presets.");expectTypesMatch(!0);pcb_breakout_point=external_exports.object({type:external_exports.literal("pcb_breakout_point"),pcb_breakout_point_id:getZodPrefixedIdWithDefault("pcb_breakout_point"),pcb_group_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),source_port_id:external_exports.string().optional(),source_net_id:external_exports.string().optional(),layer:layer_ref.optional(),x:distance,y:distance}).describe("Defines a routing target within a pcb_group for a source_trace or source_net");expectTypesMatch(!0);pcb_ground_plane=external_exports.object({type:external_exports.literal("pcb_ground_plane"),pcb_ground_plane_id:getZodPrefixedIdWithDefault("pcb_ground_plane"),source_pcb_ground_plane_id:external_exports.string(),source_net_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a ground plane on the PCB");expectTypesMatch(!0);pcb_ground_plane_region=external_exports.object({type:external_exports.literal("pcb_ground_plane_region"),pcb_ground_plane_region_id:getZodPrefixedIdWithDefault("pcb_ground_plane_region"),pcb_ground_plane_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,points:external_exports.array(point)}).describe("Defines a polygon region of a ground plane");expectTypesMatch(!0);pcb_thermal_spoke=external_exports.object({type:external_exports.literal("pcb_thermal_spoke"),pcb_thermal_spoke_id:getZodPrefixedIdWithDefault("pcb_thermal_spoke"),pcb_ground_plane_id:external_exports.string(),shape:external_exports.string(),spoke_count:external_exports.number(),spoke_thickness:distance,spoke_inner_diameter:distance,spoke_outer_diameter:distance,pcb_plated_hole_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Pattern for connecting a ground plane to a plated hole");expectTypesMatch(!0);pcb_copper_pour_base=external_exports.object({type:external_exports.literal("pcb_copper_pour"),pcb_copper_pour_id:getZodPrefixedIdWithDefault("pcb_copper_pour"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,source_net_id:external_exports.string().optional(),covered_with_solder_mask:external_exports.boolean().optional().default(!0)}),pcb_copper_pour_rect=pcb_copper_pour_base.extend({shape:external_exports.literal("rect"),center:point,width:length,height:length,rotation:rotation.optional()});expectTypesMatch(!0);pcb_copper_pour_brep=pcb_copper_pour_base.extend({shape:external_exports.literal("brep"),brep_shape});expectTypesMatch(!0);pcb_copper_pour_polygon=pcb_copper_pour_base.extend({shape:external_exports.literal("polygon"),points:external_exports.array(point)});expectTypesMatch(!0);pcb_copper_pour=external_exports.discriminatedUnion("shape",[pcb_copper_pour_rect,pcb_copper_pour_brep,pcb_copper_pour_polygon]).describe("Defines a copper pour on the PCB.");expectTypesMatch(!0);pcb_component_outside_board_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_component_outside_board_error"),pcb_component_outside_board_error_id:getZodPrefixedIdWithDefault("pcb_component_outside_board_error"),error_type:external_exports.literal("pcb_component_outside_board_error").default("pcb_component_outside_board_error"),pcb_component_id:external_exports.string(),pcb_board_id:external_exports.string(),component_center:point,component_bounds:external_exports.object({min_x:external_exports.number(),max_x:external_exports.number(),min_y:external_exports.number(),max_y:external_exports.number()}),subcircuit_id:external_exports.string().optional(),source_component_id:external_exports.string().optional()}).describe("Error emitted when a PCB component is placed outside the board boundaries");expectTypesMatch(!0);pcb_component_not_on_board_edge_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_component_not_on_board_edge_error"),pcb_component_not_on_board_edge_error_id:getZodPrefixedIdWithDefault("pcb_component_not_on_board_edge_error"),error_type:external_exports.literal("pcb_component_not_on_board_edge_error").default("pcb_component_not_on_board_edge_error"),pcb_component_id:external_exports.string(),pcb_board_id:external_exports.string(),component_center:point,pad_to_nearest_board_edge_distance:external_exports.number(),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a component that must be placed on the board edge is centered away from the edge");expectTypesMatch(!0);pcb_component_invalid_layer_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_component_invalid_layer_error"),pcb_component_invalid_layer_error_id:getZodPrefixedIdWithDefault("pcb_component_invalid_layer_error"),error_type:external_exports.literal("pcb_component_invalid_layer_error").default("pcb_component_invalid_layer_error"),pcb_component_id:external_exports.string().optional(),source_component_id:external_exports.string(),layer:layer_ref,subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a component is placed on an invalid layer (components can only be on 'top' or 'bottom' layers)");expectTypesMatch(!0);pcb_via_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_via_clearance_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_via_clearance_error").default("pcb_via_clearance_error"),pcb_via_ids:external_exports.array(external_exports.string()).min(2),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),pcb_center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when vias are closer than the allowed clearance");expectTypesMatch(!0);pcb_via_trace_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_via_trace_clearance_error"),pcb_via_trace_clearance_error_id:getZodPrefixedIdWithDefault("pcb_via_trace_clearance_error"),error_type:external_exports.literal("pcb_via_trace_clearance_error").default("pcb_via_trace_clearance_error"),pcb_via_id:external_exports.string(),pcb_trace_id:external_exports.string(),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a via and trace are closer than the allowed clearance");expectTypesMatch(!0);pcb_pad_pad_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_pad_pad_clearance_error"),pcb_pad_pad_clearance_error_id:getZodPrefixedIdWithDefault("pcb_pad_pad_clearance_error"),error_type:external_exports.literal("pcb_pad_pad_clearance_error").default("pcb_pad_pad_clearance_error"),pcb_pad_ids:external_exports.array(external_exports.string()).min(2),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when pads are closer than the allowed clearance");expectTypesMatch(!0);pcb_pad_trace_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_pad_trace_clearance_error"),pcb_pad_trace_clearance_error_id:getZodPrefixedIdWithDefault("pcb_pad_trace_clearance_error"),error_type:external_exports.literal("pcb_pad_trace_clearance_error").default("pcb_pad_trace_clearance_error"),pcb_pad_id:external_exports.string(),pcb_trace_id:external_exports.string(),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a pad and trace are closer than allowed clearance");expectTypesMatch(!0);pcb_courtyard_rect=external_exports.object({type:external_exports.literal("pcb_courtyard_rect"),pcb_courtyard_rect_id:getZodPrefixedIdWithDefault("pcb_courtyard_rect"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:visible_layer,ccw_rotation:rotation.optional(),color:external_exports.string().optional()}).describe("Defines a courtyard rectangle on the PCB");expectTypesMatch(!0);pcb_courtyard_outline=external_exports.object({type:external_exports.literal("pcb_courtyard_outline"),pcb_courtyard_outline_id:getZodPrefixedIdWithDefault("pcb_courtyard_outline"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,outline:external_exports.array(point).min(2)}).describe("Defines a courtyard outline on the PCB");expectTypesMatch(!0);pcb_courtyard_polygon=external_exports.object({type:external_exports.literal("pcb_courtyard_polygon"),pcb_courtyard_polygon_id:getZodPrefixedIdWithDefault("pcb_courtyard_polygon"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,points:external_exports.array(point).min(3),color:external_exports.string().optional()}).describe("Defines a courtyard polygon on the PCB");expectTypesMatch(!0);pcb_courtyard_circle=external_exports.object({type:external_exports.literal("pcb_courtyard_circle"),pcb_courtyard_circle_id:getZodPrefixedIdWithDefault("pcb_courtyard_circle"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius:length,layer:visible_layer,color:external_exports.string().optional()}).describe("Defines a courtyard circle on the PCB");expectTypesMatch(!0);pcb_courtyard_pill=external_exports.object({type:external_exports.literal("pcb_courtyard_pill"),pcb_courtyard_pill_id:getZodPrefixedIdWithDefault("pcb_courtyard_pill"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,radius:length,layer:visible_layer,color:external_exports.string().optional()}).describe("Defines a courtyard pill on the PCB");expectTypesMatch(!0);cad_model_formats=["obj","stl","3mf","gltf","glb","step","wrl"],cad_model_axis_directions=["x+","x-","y+","y-","z+","z-"],cadModelDefaultDirectionMap={obj:"z+",stl:"z+","3mf":"z+",gltf:"y+",glb:"y+",step:"z+",wrl:"y+"},cad_component=external_exports.object({type:external_exports.literal("cad_component"),cad_component_id:external_exports.string(),pcb_component_id:external_exports.string().optional().describe("Optional PCB component reference; omit for CAD geometry without a PCB component"),source_component_id:external_exports.string(),position:point3,rotation:point3.optional(),is_on_folded_board:external_exports.boolean().optional().describe("True when position and rotation describe the assembled folded board pose. False or omitted means the flat board pose. PCB records remain flat; pcb_component_id identifies the flat mount and owning board for reversible transforms."),size:point3.optional(),layer:layer_ref.optional(),subcircuit_id:external_exports.string().optional(),footprinter_string:external_exports.string().optional(),model_obj_url:external_exports.string().optional(),model_stl_url:external_exports.string().optional(),model_3mf_url:external_exports.string().optional(),model_gltf_url:external_exports.string().optional(),model_glb_url:external_exports.string().optional(),model_step_url:external_exports.string().optional(),model_wrl_url:external_exports.string().optional(),model_asset:asset.optional(),model_unit_to_mm_scale_factor:external_exports.number().optional(),model_board_normal_direction:external_exports.enum(cad_model_axis_directions).optional().describe(`The direction in the model's coordinate space that is considered "up" or "coming out of the board surface"`),model_origin_position:point3.optional(),model_origin_alignment:external_exports.enum(["unknown","center","center_of_component_on_board_surface","bottom_center_of_component"]).optional(),model_object_fit:external_exports.enum(["contain_within_bounds","fill_bounds"]).optional().default("contain_within_bounds"),model_jscad:external_exports.any().optional(),color:external_exports.string().trim().min(1).optional().describe("Explicit color override for CAD geometry, including authored JSCAD material colors. Omit to preserve model materials."),show_as_translucent_model:external_exports.boolean().optional(),show_as_bounding_box:external_exports.boolean().optional(),show_hidden_edges:external_exports.boolean().optional(),anchor_alignment:external_exports.enum(["center","center_of_component_on_board_surface"]).optional().default("center")}).describe("Defines CAD geometry, optionally associated with a PCB component");expectTypesMatch(!0);cad_collision_error=base_circuit_json_error.extend({type:external_exports.literal("cad_collision_error"),cad_collision_error_id:getZodPrefixedIdWithDefault("cad_collision_error"),error_type:external_exports.literal("cad_collision_error").default("cad_collision_error"),cad_component_ids:external_exports.array(external_exports.string()).min(1),pcb_component_ids:external_exports.array(external_exports.string()).optional(),source_component_ids:external_exports.array(external_exports.string()).min(1),intersection_area_mm2:external_exports.number().finite().nonnegative(),threshold_area_mm2:external_exports.number().finite().nonnegative()}).describe("An aperture-bearing part intersects the finished enclosure. The intersection_area_mm2 is the union silhouette area of the solid intersection projected along the aperture face normal, in the right-handed Circuit JSON world frame (+X right, +Y top, +Z above). It is an area in square millimetres, not intersection volume or surface area. This indicates possible aperture misplacement, insufficient size/depth, or body clearance problems; it does not prove which cause applies.");expectTypesMatch(!0);connectorPin1Position=point3.refine(point23=>[point23.x,point23.y,point23.z].every(Number.isFinite),"Connector pin 1 positions must be finite").describe("Resolved pin 1 position at the connector mating face, in right-handed circuit world, millimeters: +X right, +Y top, +Z above. An absolute point, not a direction. Computed by the circuit producer from endpoint geometry. Together with the endpoint path tangent, fixes connector roll and identifies its pin 1 side; renderers must not infer it from footprints."),cad_cable=external_exports.object({type:external_exports.literal("cad_cable"),cad_cable_id:external_exports.string(),name:external_exports.string().min(1),from_source_component_id:external_exports.string(),to_source_component_id:external_exports.string(),from_connector_pin1_position:connectorPin1Position.optional(),to_connector_pin1_position:connectorPin1Position.optional(),cableprinter_string:external_exports.string().min(1).describe('Physical cable definition, e.g. "usb_c" or "jst_ph_pins6". Independent of the route.'),path:external_exports.array(point3).min(2).refine(path=>path.every((point23,i10)=>[point23.x,point23.y,point23.z].every(Number.isFinite)&&(i10===0||Math.hypot(point23.x-path[i10-1].x,point23.y-path[i10-1].y,point23.z-path[i10-1].z)>1e-8)),"Cable paths require finite, distinct consecutive points").describe("Resolved cable centerline points in right-handed circuit world, millimeters: +X right, +Y top, +Z above. First/last samples are connector wire exits; their tangents point into/out of the cable. Includes routing/slack; renderers must not recompute the path.")}).describe("A physical assembly cable with a resolved 3D route. Several cables are independent cad_cable records, each with its own endpoints, definition and path. Does not imply electrical pin mapping.");expectTypesMatch(!0);FRAME_TOLERANCE=1e-6,unitDirection=external_exports.object({x:external_exports.number().finite(),y:external_exports.number().finite(),z:external_exports.number().finite()}).refine(v11=>Math.abs(Math.hypot(v11.x,v11.y,v11.z)-1)<=FRAME_TOLERANCE,"Reference surface directions must be unit vectors"),extent=distance.pipe(external_exports.number().finite().positive()),cad_reference_surface=external_exports.object({type:external_exports.literal("cad_reference_surface"),cad_reference_surface_id:external_exports.string().min(1),source_component_id:external_exports.string().min(1).describe("Owning assembly part's source component ID. The part may have no CAD geometry."),name:external_exports.string().trim().min(1).describe("Reference name, unique within the owning part, e.g. shade in STEM.shade."),shape:external_exports.literal("rect"),center:point3.refine(p11=>[p11.x,p11.y,p11.z].every(Number.isFinite),"Reference surface centers must be finite").describe("Resolved surface center in right-handed circuit-world XYZ, millimeters: +X right, +Y top, +Z above. An absolute point after assembly placement."),normal:unitDirection.describe("Outward unit normal in circuit-world XYZ. Dimensionless direction; transform with the part's rotation, without translation."),x_axis:unitDirection.describe("In-plane unit X direction in circuit-world XYZ, perpendicular to normal. The second tangent is normal cross x_axis, giving a right-handed frame."),width:extent.optional().describe("Rectangular extent along x_axis in millimeters. Supply together with height. Omission leaves the surface's display size unspecified."),height:extent.optional().describe("Rectangular extent along normal cross x_axis in millimeters. Supply together with width."),subcircuit_id:external_exports.string().optional()}).superRefine((surface,ctx)=>{surface.width===void 0!=(surface.height===void 0)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["width"],message:"Provide width and height together"});let{normal:n10,x_axis:x11}=surface;Math.abs(n10.x*x11.x+n10.y*x11.y+n10.z*x11.z)>FRAME_TOLERANCE&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["x_axis"],message:"x_axis must be perpendicular to normal"})}).describe("A named assembly mounting surface with a resolved world-space frame. Reference geometry for optional visualization; does not add solid material or electrical connectivity. The producer resolves part placement independently of CAD-model offsets; renderers consume the world frame without reapplying the owning model's transform.");expectTypesMatch(!0);wave_shape=external_exports.enum(["sinewave","square","triangle","sawtooth"]),percentage=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_voltage_source=external_exports.object({type:external_exports.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault("simulation_voltage_source"),is_dc_source:external_exports.literal(!0).optional().default(!0),positive_source_port_id:external_exports.string().optional(),negative_source_port_id:external_exports.string().optional(),positive_source_net_id:external_exports.string().optional(),negative_source_net_id:external_exports.string().optional(),voltage,ac_magnitude:voltage.optional(),ac_phase:rotation.optional()}).describe("Defines a DC voltage source for simulation"),simulation_ac_voltage_source=external_exports.object({type:external_exports.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault("simulation_voltage_source"),is_dc_source:external_exports.literal(!1),terminal1_source_port_id:external_exports.string().optional(),terminal2_source_port_id:external_exports.string().optional(),terminal1_source_net_id:external_exports.string().optional(),terminal2_source_net_id:external_exports.string().optional(),voltage:voltage.optional(),frequency:frequency.optional(),peak_to_peak_voltage:voltage.optional(),wave_shape:wave_shape.optional(),phase:rotation.optional(),duty_cycle:percentage.optional(),pulse_delay:ms.optional(),rise_time:ms.optional(),fall_time:ms.optional(),pulse_width:ms.optional(),period:ms.optional(),ac_magnitude:voltage.optional(),ac_phase:rotation.optional()}).describe("Defines an AC voltage source for simulation"),simulation_voltage_source=external_exports.union([simulation_dc_voltage_source,simulation_ac_voltage_source]).describe("Defines a voltage source for simulation");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);percentage2=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_current_source=external_exports.object({type:external_exports.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault("simulation_current_source"),is_dc_source:external_exports.literal(!0).optional().default(!0),positive_source_port_id:external_exports.string().optional(),negative_source_port_id:external_exports.string().optional(),positive_source_net_id:external_exports.string().optional(),negative_source_net_id:external_exports.string().optional(),current,ac_magnitude:current.optional(),ac_phase:rotation.optional()}).describe("Defines a DC current source for simulation"),simulation_ac_current_source=external_exports.object({type:external_exports.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault("simulation_current_source"),is_dc_source:external_exports.literal(!1),terminal1_source_port_id:external_exports.string().optional(),terminal2_source_port_id:external_exports.string().optional(),terminal1_source_net_id:external_exports.string().optional(),terminal2_source_net_id:external_exports.string().optional(),current:current.optional(),frequency:frequency.optional(),peak_to_peak_current:current.optional(),wave_shape:wave_shape.optional(),phase:rotation.optional(),duty_cycle:percentage2.optional(),ac_magnitude:current.optional(),ac_phase:rotation.optional()}).describe("Defines an AC current source for simulation"),simulation_current_source=external_exports.union([simulation_dc_current_source,simulation_ac_current_source]).describe("Defines a current source for simulation");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);simulation_dc_sweep_unit=external_exports.custom(dcSweepUnit=>dcSweepUnit==="V"||dcSweepUnit==="A"),simulation_parameter_unit=external_exports.custom(parameterUnit=>parameterUnit==="\u03A9"||parameterUnit==="F"||parameterUnit==="H"||parameterUnit==="V"||parameterUnit==="A"),experiment_type=external_exports.union([external_exports.literal("spice_dc_sweep"),external_exports.literal("spice_dc_operating_point"),external_exports.literal("spice_transient_analysis"),external_exports.literal("spice_ac_analysis"),external_exports.literal("pcb_return_current")]),spice_simulation_options=external_exports.object({method:external_exports.enum(["trap","gear"]).optional(),reltol:external_exports.union([external_exports.number(),external_exports.string()]).optional(),abstol:external_exports.union([external_exports.number(),external_exports.string()]).optional(),vntol:external_exports.union([external_exports.number(),external_exports.string()]).optional()}).describe("SPICE solver options for a simulation experiment"),simulation_experiment=external_exports.object({type:external_exports.literal("simulation_experiment"),simulation_experiment_id:getZodPrefixedIdWithDefault("simulation_experiment"),name:external_exports.string(),experiment_type,time_per_step:duration_ms.optional(),start_time_ms:ms.optional(),end_time_ms:ms.optional(),spice_options:spice_simulation_options.optional(),dc_sweep_voltage_source_id:external_exports.string().optional(),dc_sweep_current_source_id:external_exports.string().optional(),dc_sweep_start:external_exports.number().optional(),dc_sweep_stop:external_exports.number().optional(),dc_sweep_step:external_exports.number().refine(dcSweepStep=>dcSweepStep!==0).optional(),dc_sweep_unit:simulation_dc_sweep_unit.optional(),ac_sweep_type:external_exports.enum(["linear","decade","octave"]).optional(),ac_samples_per_interval:external_exports.number().int().positive().optional(),ac_sample_count:external_exports.number().int().positive().optional(),ac_start_frequency_hz:external_exports.number().positive().optional(),ac_stop_frequency_hz:external_exports.number().positive().optional()}).superRefine((experiment,context)=>{if(experiment.experiment_type==="spice_dc_sweep"){let requiredFields=["dc_sweep_start","dc_sweep_stop","dc_sweep_step","dc_sweep_unit"];for(let field of requiredFields)experiment[field]===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:[field],message:`${field} is required for a DC sweep`});let hasVoltageSource=experiment.dc_sweep_voltage_source_id!==void 0,hasCurrentSource=experiment.dc_sweep_current_source_id!==void 0;hasVoltageSource===hasCurrentSource&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["dc_sweep_voltage_source_id"],message:"Exactly one DC sweep voltage or current source ID is required"})}experiment.experiment_type==="spice_ac_analysis"&&(experiment.ac_sweep_type===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_sweep_type"],message:"ac_sweep_type is required for an AC analysis"}),experiment.ac_start_frequency_hz===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_start_frequency_hz"],message:"ac_start_frequency_hz is required for an AC analysis"}),experiment.ac_stop_frequency_hz===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_stop_frequency_hz"],message:"ac_stop_frequency_hz is required for an AC analysis"}),experiment.ac_sweep_type==="linear"&&experiment.ac_sample_count===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_sample_count"],message:"ac_sample_count is required for a linear AC analysis"}),(experiment.ac_sweep_type==="decade"||experiment.ac_sweep_type==="octave")&&experiment.ac_samples_per_interval===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_samples_per_interval"],message:"ac_samples_per_interval is required for decade and octave AC analyses"}))}).describe("Defines a simulation experiment configuration");expectTypesMatch(!0);simulation_parameter_sweep_coordinate=external_exports.object({simulation_parameter_sweep_id:external_exports.string(),sweep_index:external_exports.number().int().nonnegative(),parameter_value:external_exports.number(),parameter_unit:simulation_parameter_unit});expectTypesMatch(!0);simulation_transient_voltage_graph=external_exports.object({type:external_exports.literal("simulation_transient_voltage_graph"),simulation_transient_voltage_graph_id:getZodPrefixedIdWithDefault("simulation_transient_voltage_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),timestamps_ms:external_exports.array(external_exports.number()).optional(),voltage_levels:external_exports.array(external_exports.number()),source_component_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),time_per_step:duration_ms,start_time_ms:ms,end_time_ms:ms,name:external_exports.string().optional(),color:external_exports.string().optional()}).describe("Stores voltage measurements over time for a simulation");expectTypesMatch(!0);simulation_transient_current_graph=external_exports.object({type:external_exports.literal("simulation_transient_current_graph"),simulation_transient_current_graph_id:getZodPrefixedIdWithDefault("simulation_transient_current_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),timestamps_ms:external_exports.array(external_exports.number()).optional(),current_levels:external_exports.array(external_exports.number()),source_component_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),time_per_step:duration_ms,start_time_ms:ms,end_time_ms:ms,name:external_exports.string().optional(),color:external_exports.string().optional()}).describe("Stores current measurements over time for a simulation");expectTypesMatch(!0);simulation_switch=external_exports.object({type:external_exports.literal("simulation_switch"),simulation_switch_id:getZodPrefixedIdWithDefault("simulation_switch"),source_component_id:external_exports.string().optional(),closes_at:ms.optional(),opens_at:ms.optional(),starts_closed:external_exports.boolean().optional(),switching_frequency:frequency.optional()}).describe("Defines a switch for simulation timing control");expectTypesMatch(!0);simulation_voltage_probe=external_exports.object({type:external_exports.literal("simulation_voltage_probe"),simulation_voltage_probe_id:getZodPrefixedIdWithDefault("simulation_voltage_probe"),source_component_id:external_exports.string().optional(),name:external_exports.string().optional(),signal_input_source_port_id:external_exports.string().optional(),signal_input_source_net_id:external_exports.string().optional(),reference_input_source_port_id:external_exports.string().optional(),reference_input_source_net_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),color:external_exports.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_exports.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_exports.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_exports.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_exports.ZodIssueCode.custom,message:"A voltage probe must have exactly one of signal_input_source_port_id or signal_input_source_net_id."})});expectTypesMatch(!0);simulation_current_probe=external_exports.object({type:external_exports.literal("simulation_current_probe"),simulation_current_probe_id:getZodPrefixedIdWithDefault("simulation_current_probe"),source_component_id:external_exports.string().optional(),name:external_exports.string().optional(),positive_source_port_id:external_exports.string().optional(),negative_source_port_id:external_exports.string().optional(),positive_source_net_id:external_exports.string().optional(),negative_source_net_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),color:external_exports.string().optional()}).describe("Defines a current probe for simulation. It measures current flowing from the positive endpoint to the negative endpoint.").superRefine((data,ctx)=>{let hasPositivePort=!!data.positive_source_port_id,hasNegativePort=!!data.negative_source_port_id,hasPositiveNet=!!data.positive_source_net_id,hasNegativeNet=!!data.negative_source_net_id,hasPorts=hasPositivePort||hasNegativePort,hasNets=hasPositiveNet||hasNegativeNet;if(hasPorts&&hasNets){ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Cannot mix port and net connections in a current probe."});return}if(hasPorts){(!hasPositivePort||!hasNegativePort)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current probe using source ports requires both positive_source_port_id and negative_source_port_id."});return}if(hasNets){(!hasPositiveNet||!hasNegativeNet)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current probe using source nets requires both positive_source_net_id and negative_source_net_id."});return}ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"A current probe must have either positive/negative source port ids or positive/negative source net ids."})});expectTypesMatch(!0);simulation_unknown_experiment_error=base_circuit_json_error.extend({type:external_exports.literal("simulation_unknown_experiment_error"),simulation_unknown_experiment_error_id:getZodPrefixedIdWithDefault("simulation_unknown_experiment_error"),error_type:external_exports.literal("simulation_unknown_experiment_error").default("simulation_unknown_experiment_error"),simulation_experiment_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("An unknown error occurred during the simulation experiment.");expectTypesMatch(!0);simulation_parameter_type=external_exports.enum(["resistance","capacitance","inductance","voltage","current"]),simulation_parameter_sweep_base=external_exports.object({type:external_exports.literal("simulation_parameter_sweep"),simulation_parameter_sweep_id:getZodPrefixedIdWithDefault("simulation_parameter_sweep"),simulation_experiment_id:external_exports.string(),name:external_exports.string().optional(),parameter_values:external_exports.array(external_exports.number()).min(1),parameter_unit:simulation_parameter_unit}),simulation_parameter_sweep=external_exports.discriminatedUnion("parameter_type",[simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("resistance"),resistor_source_component_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("capacitance"),capacitor_source_component_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("inductance"),inductor_source_component_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("voltage"),source_net_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("current"),current_source_component_id:external_exports.string()})]).describe("Repeats a simulation experiment over component parameter values");expectTypesMatch(!0);simulation_dc_operating_point_voltage=external_exports.object({type:external_exports.literal("simulation_dc_operating_point_voltage"),simulation_dc_operating_point_voltage_id:getZodPrefixedIdWithDefault("simulation_dc_operating_point_voltage"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_voltage_probe_id:external_exports.string(),voltage:external_exports.number(),name:external_exports.string().optional(),color:external_exports.string().optional()});expectTypesMatch(!0);simulation_dc_operating_point_current=external_exports.object({type:external_exports.literal("simulation_dc_operating_point_current"),simulation_dc_operating_point_current_id:getZodPrefixedIdWithDefault("simulation_dc_operating_point_current"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_current_probe_id:external_exports.string(),current:external_exports.number(),name:external_exports.string().optional(),color:external_exports.string().optional()});expectTypesMatch(!0);simulation_dc_sweep_voltage_graph=external_exports.object({type:external_exports.literal("simulation_dc_sweep_voltage_graph"),simulation_dc_sweep_voltage_graph_id:getZodPrefixedIdWithDefault("simulation_dc_sweep_voltage_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_voltage_probe_id:external_exports.string(),sweep_values:external_exports.array(external_exports.number()),sweep_unit:simulation_dc_sweep_unit,voltage_levels:external_exports.array(external_exports.number()),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.sweep_values.length===graph.voltage_levels.length,{message:"sweep_values and voltage_levels must have the same length"});expectTypesMatch(!0);simulation_dc_sweep_current_graph=external_exports.object({type:external_exports.literal("simulation_dc_sweep_current_graph"),simulation_dc_sweep_current_graph_id:getZodPrefixedIdWithDefault("simulation_dc_sweep_current_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_current_probe_id:external_exports.string(),sweep_values:external_exports.array(external_exports.number()),sweep_unit:simulation_dc_sweep_unit,current_levels:external_exports.array(external_exports.number()),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.sweep_values.length===graph.current_levels.length,{message:"sweep_values and current_levels must have the same length"});expectTypesMatch(!0);simulation_complex_sample=external_exports.object({re:external_exports.number(),im:external_exports.number()});expectTypesMatch(!0);simulation_ac_sweep_voltage_graph=external_exports.object({type:external_exports.literal("simulation_ac_sweep_voltage_graph"),simulation_ac_sweep_voltage_graph_id:getZodPrefixedIdWithDefault("simulation_ac_sweep_voltage_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_voltage_probe_id:external_exports.string(),frequencies_hz:external_exports.array(external_exports.number()),complex_voltages:external_exports.array(simulation_complex_sample),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.frequencies_hz.length===graph.complex_voltages.length,{message:"frequencies_hz and complex_voltages must have the same length"});expectTypesMatch(!0);simulation_ac_sweep_current_graph=external_exports.object({type:external_exports.literal("simulation_ac_sweep_current_graph"),simulation_ac_sweep_current_graph_id:getZodPrefixedIdWithDefault("simulation_ac_sweep_current_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_current_probe_id:external_exports.string(),frequencies_hz:external_exports.array(external_exports.number()),complex_currents:external_exports.array(simulation_complex_sample),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.frequencies_hz.length===graph.complex_currents.length,{message:"frequencies_hz and complex_currents must have the same length"});expectTypesMatch(!0);simulation_op_amp=external_exports.object({type:external_exports.literal("simulation_op_amp"),simulation_op_amp_id:getZodPrefixedIdWithDefault("simulation_op_amp"),source_component_id:external_exports.string().optional(),inverting_input_source_port_id:external_exports.string(),non_inverting_input_source_port_id:external_exports.string(),output_source_port_id:external_exports.string(),positive_supply_source_port_id:external_exports.string(),negative_supply_source_port_id:external_exports.string()}).describe("Defines a simple ideal operational amplifier for simulation");expectTypesMatch(!0);simulation_spice_subcircuit=external_exports.object({type:external_exports.literal("simulation_spice_subcircuit"),simulation_spice_subcircuit_id:getZodPrefixedIdWithDefault("simulation_spice_subcircuit"),source_component_id:external_exports.string(),spice_pin_to_source_port_map:external_exports.record(external_exports.string(),external_exports.string()),subcircuit_source:external_exports.string()}).describe("Defines a custom SPICE subcircuit model for simulation");expectTypesMatch(!0);hasValue=value=>value!==void 0,simulation_oscilloscope_trace=external_exports.object({type:external_exports.literal("simulation_oscilloscope_trace"),simulation_oscilloscope_trace_id:getZodPrefixedIdWithDefault("simulation_oscilloscope_trace"),simulation_transient_voltage_graph_id:external_exports.string().optional(),simulation_transient_current_graph_id:external_exports.string().optional(),simulation_voltage_probe_id:external_exports.string().optional(),simulation_current_probe_id:external_exports.string().optional(),display_name:external_exports.string().optional(),color:external_exports.string().optional(),display_center_value:external_exports.number().optional(),display_center_offset_divs:external_exports.number().optional(),volts_per_div:external_exports.number().positive().optional(),amps_per_div:external_exports.number().positive().optional()}).describe("Defines how a simulation measurement is rendered as an oscilloscope-style trace.").superRefine((data,ctx)=>{let voltageReferences=[data.simulation_transient_voltage_graph_id,data.simulation_voltage_probe_id].filter(hasValue).length,currentReferences=[data.simulation_transient_current_graph_id,data.simulation_current_probe_id].filter(hasValue).length;voltageReferences+currentReferences!==1&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"An oscilloscope trace must reference exactly one voltage graph, current graph, voltage probe, or current probe."}),voltageReferences>0&&data.amps_per_div!==void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Voltage oscilloscope traces must use volts_per_div, not amps_per_div."}),currentReferences>0&&data.volts_per_div!==void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current oscilloscope traces must use amps_per_div, not volts_per_div."})});expectTypesMatch(!0);contact_position=external_exports.object({x:external_exports.number().finite(),y:external_exports.number().finite(),layer:layer_ref}),simulation_return_current_contact=external_exports.discriminatedUnion("contact_type",[contact_position.extend({contact_type:external_exports.literal("pcb_port"),pcb_port_id:external_exports.string().min(1)}),contact_position.extend({contact_type:external_exports.literal("pcb_via"),pcb_via_id:external_exports.string().min(1)}),contact_position.extend({contact_type:external_exports.literal("pcb_copper_pour"),pcb_copper_pour_id:external_exports.string().min(1)})]).describe("Identifies the reference conductor at a return-current contact");expectTypesMatch(!0);simulation_terminal_port=external_exports.object({signal_pcb_port_id:external_exports.string().min(1),reference_pcb_port_id:external_exports.string().min(1).optional(),reference_layer:layer_ref,resistance:external_exports.number().finite().positive()}).describe("A two-terminal return-current excitation port with resistance in ohms");expectTypesMatch(!0);simulation_return_current_excitation=external_exports.object({type:external_exports.literal("simulation_return_current_excitation"),simulation_return_current_excitation_id:getZodPrefixedIdWithDefault("simulation_return_current_excitation"),simulation_experiment_id:external_exports.string().min(1),pcb_trace_id:external_exports.string().min(1),ground_source_net_id:external_exports.string().min(1),current:external_exports.number().finite(),return_source:simulation_return_current_contact,return_sink:simulation_return_current_contact,source_port:simulation_terminal_port.optional(),load_port:simulation_terminal_port.optional()}).describe("Excites a signal trace with signed current in amperes, peak for AC; return_source is near the load and return_sink near the driver for positive current");expectTypesMatch(!0);simulation_pcb_return_current_result=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_result"),simulation_pcb_return_current_result_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_result"),simulation_experiment_id:external_exports.string().min(1),pcb_board_id:external_exports.string().min(1),simulation_return_current_excitation_ids:external_exports.array(external_exports.string().min(1)).min(1).refine(ids=>new Set(ids).size===ids.length,"Excitation IDs must be unique"),frequency_hz:external_exports.number().finite().positive().optional()}).describe("A PCB return-current result at one frequency, or a frequency-independent result when frequency_hz is absent");expectTypesMatch(!0);simulation_return_current_field_asset=createSimulationReturnCurrentAssetSchema(["application/json","application/gzip"]),simulation_return_current_image_asset=createSimulationReturnCurrentAssetSchema(["image/png","image/webp"]),simulation_pcb_return_current_field=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_field"),simulation_pcb_return_current_field_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_field"),simulation_pcb_return_current_result_id:external_exports.string().min(1),layer:layer_ref,source_net_id:external_exports.string().min(1),field_type:external_exports.enum(["real","complex_phasor"]),min_x:external_exports.number().finite(),min_y:external_exports.number().finite(),columns:external_exports.number().int().positive().safe(),rows:external_exports.number().int().positive().safe(),cell_width:external_exports.number().finite().positive(),cell_height:external_exports.number().finite().positive(),copper_thickness:external_exports.number().finite().positive(),data_format:external_exports.literal("simulation_return_current_grid_json_v1"),field_asset:simulation_return_current_field_asset}).superRefine((field,context)=>{Number.isSafeInteger(field.columns*field.rows)||context.addIssue({code:external_exports.ZodIssueCode.custom,path:["columns"],message:"The grid cell count must be a safe integer"})}).describe("A sampled sheet-current field in A/mm, using plain or gzipped JSON Asset URLs; dimensions are PCB millimeters");expectTypesMatch(!0);channel=external_exports.array(external_exports.number().finite().nullable()).min(1),simulation_return_current_grid_json=external_exports.discriminatedUnion("field_type",[external_exports.object({field_type:external_exports.literal("real"),sheet_current_x:channel,sheet_current_y:channel}),external_exports.object({field_type:external_exports.literal("complex_phasor"),sheet_current_x_real:channel,sheet_current_x_imag:channel,sheet_current_y_real:channel,sheet_current_y_imag:channel})]).superRefine((grid4,context)=>{let channels=grid4.field_type==="real"?[grid4.sheet_current_x,grid4.sheet_current_y]:[grid4.sheet_current_x_real,grid4.sheet_current_x_imag,grid4.sheet_current_y_real,grid4.sheet_current_y_imag],first=channels[0];if(channels.some(values2=>values2.length!==first.length)){context.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current channels must have equal lengths"});return}for(let index2=0;index2<first.length;index2++){let masked=first[index2]===null;if(channels.some(values2=>values2[index2]===null!==masked)){context.addIssue({code:external_exports.ZodIssueCode.custom,message:`Cell ${index2} must be null in every channel or finite in every channel`});return}}}).describe("Decoded real or complex sheet-current arrays with a shared conductor mask");expectTypesMatch(!0);simulation_pcb_return_current_heatmap=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_heatmap"),simulation_pcb_return_current_heatmap_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_heatmap"),simulation_pcb_return_current_result_id:external_exports.string().min(1),layer:layer_ref,source_net_id:external_exports.string().min(1),min_x:external_exports.number().finite(),min_y:external_exports.number().finite(),max_x:external_exports.number().finite(),max_y:external_exports.number().finite(),image_asset:simulation_return_current_image_asset}).superRefine((heatmap,context)=>{for(let axis of["x","y"])heatmap[`max_${axis}`]<=heatmap[`min_${axis}`]&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:[`max_${axis}`],message:"Heatmap bounds must have positive width and height"})}).describe("A transparent PNG/WebP current-density overlay in A/mm\xB2; the top-left pixel maps to (min_x, max_y)");expectTypesMatch(!0);marker_base=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_marker"),simulation_pcb_return_current_marker_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_marker"),simulation_pcb_return_current_result_id:external_exports.string().min(1),role:external_exports.enum(["signal_source","signal_load","return_source","return_sink","signal_transition","return_transition"]),label:external_exports.string().optional(),label_x:external_exports.number().finite().optional(),label_y:external_exports.number().finite().optional()}),simulation_pcb_return_current_marker=external_exports.discriminatedUnion("target_type",[marker_base.extend({target_type:external_exports.literal("pcb_port"),pcb_port_id:external_exports.string().min(1),layer:layer_ref}),marker_base.extend({target_type:external_exports.literal("pcb_via"),pcb_via_id:external_exports.string().min(1),from_layer:layer_ref,to_layer:layer_ref})]).superRefine((marker,context)=>{marker.label_x===void 0!=(marker.label_y===void 0)&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["label_x"],message:"label_x and label_y must be provided together"}),marker.target_type==="pcb_via"&&marker.from_layer===marker.to_layer&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["to_layer"],message:"A via transition must connect distinct layers"})}).describe("A signal/return port or via highlight; markers do not assert measured via-transfer currents");expectTypesMatch(!0);any_circuit_element=external_exports.union([source_runtime_error,source_trace,source_bus,source_port,source_component_internal_connection,any_source_component,source_net,source_group,source_simple_chip,source_simple_capacitor,source_simple_diode,source_simple_led,source_simple_resistor,source_simple_power_source,source_simple_battery,source_simple_inductor,source_simple_pin_header,source_simple_pinout,source_simple_resonator,source_simple_switch,source_simple_transistor,source_simple_test_point,source_simple_mosfet,source_simple_op_amp,source_simple_potentiometer,source_simple_push_button,source_pcb_ground_plane,source_manually_placed_via,source_board,source_project_metadata,source_invalid_component_property_error,source_trace_not_connected_error,source_pin_missing_trace_warning,source_unnamed_trace_warning,source_confusing_net_name_warning,source_missing_manufacturer_part_number_warning,source_component_availability_warning,source_refdes_convention_warning,source_no_power_pin_defined_warning,source_no_ground_pin_defined_warning,source_component_pins_underspecified_warning,source_pin_must_be_connected_error,unknown_error_finding_part,source_part_not_found_warning,source_i2c_misconfigured_error,source_component_misconfigured_error,source_ambiguous_port_reference,pcb_component,pcb_debug_object,pcb_hole,pcb_missing_footprint_error,external_footprint_load_error,circuit_json_footprint_load_error,pcb_manual_edit_conflict_warning,pcb_connector_not_in_accessible_orientation_warning,pcb_component_missing_courtyard_warning,supplier_footprint_mismatch_warning,pcb_fabricator_extra_charge_warning,pcb_plated_hole,pcb_keepout,pcb_keepout_overlap_warning,pcb_port,pcb_net,pcb_text,pcb_trace,pcb_trace_warning,pcb_trace_style_warning,pcb_trace_too_long_warning,pcb_trace_too_long_error,pcb_bus_length_skew_error,pcb_trace_too_many_vias_warning,pcb_via,pcb_smtpad,pcb_solder_paste,pcb_soldermask_opening,pcb_board,pcb_bend,pcb_stiffener,pcb_panel,pcb_group,pcb_trace_hint,pcb_silkscreen_line,pcb_silkscreen_path,pcb_silkscreen_text,pcb_silkscreen_pill,pcb_copper_text,pcb_silkscreen_rect,pcb_silkscreen_circle,pcb_silkscreen_oval,pcb_silkscreen_graphic,pcb_bus_routing_constraint_error,pcb_bus_routing_constraint_warning,pcb_trace_error,pcb_trace_missing_error,pcb_placement_error,pcb_packing_error,pcb_panelization_placement_error,pcb_port_not_matched_error,pcb_port_not_connected_error,pcb_via_clearance_error,pcb_via_trace_clearance_error,pcb_pad_pad_clearance_error,pcb_pad_trace_clearance_error,pcb_fabrication_note_path,pcb_fabrication_note_text,pcb_fabrication_note_rect,pcb_fabrication_note_dimension,pcb_note_text,pcb_note_rect,pcb_note_path,pcb_note_line,pcb_note_dimension,pcb_autorouting_error,pcb_preflight_routing_error,pcb_footprint_overlap_error,pcb_courtyard_overlap_error,pcb_breakout_point,pcb_cutout,pcb_ground_plane,pcb_ground_plane_region,pcb_thermal_spoke,pcb_copper_pour,pcb_component_outside_board_error,pcb_component_not_on_board_edge_error,pcb_component_invalid_layer_error,pcb_courtyard_rect,pcb_courtyard_outline,pcb_courtyard_polygon,pcb_courtyard_circle,pcb_courtyard_pill,schematic_box,schematic_text,schematic_line,schematic_rect,schematic_circle,schematic_arc,schematic_component,schematic_symbol,schematic_port,schematic_trace,schematic_path,schematic_error,schematic_layout_error,schematic_net_label,schematic_debug_object,schematic_voltage_probe,schematic_manual_edit_conflict_warning,schematic_component_overlap_warning,schematic_component_styling_warning,schematic_sheet_styling_warning,schematic_missing_sheet_warning,schematic_element_outside_sheet_warning,schematic_graphic,schematic_group,schematic_sheet,schematic_table,schematic_table_cell,cad_component,cad_cable,cad_reference_surface,cad_collision_error,simulation_voltage_source,simulation_current_source,simulation_experiment,simulation_return_current_excitation,simulation_pcb_return_current_result,simulation_pcb_return_current_field,simulation_pcb_return_current_heatmap,simulation_pcb_return_current_marker,simulation_transient_voltage_graph,simulation_transient_current_graph,simulation_dc_operating_point_voltage,simulation_dc_operating_point_current,simulation_dc_sweep_voltage_graph,simulation_dc_sweep_current_graph,simulation_ac_sweep_voltage_graph,simulation_ac_sweep_current_graph,simulation_parameter_sweep,simulation_switch,simulation_voltage_probe,simulation_current_probe,simulation_oscilloscope_trace,simulation_unknown_experiment_error,simulation_op_amp,simulation_spice_subcircuit]),any_soup_element=any_circuit_element;expectTypesMatch(!0);expectStringUnionsMatch(!0)}});var require_ms=__commonJS({"node_modules/ms/index.js"(exports,module){"use strict";var s11=1e3,m4=s11*60,h11=m4*60,d10=h11*24,w10=d10*7,y10=d10*365.25;module.exports=function(val,options){options=options||{};var type=typeof val;if(type==="string"&&val.length>0)return parse5(val);if(type==="number"&&isFinite(val))return options.long?fmtLong(val):fmtShort(val);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(val))};function parse5(str10){if(str10=String(str10),!(str10.length>100)){var match2=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str10);if(match2){var n10=parseFloat(match2[1]),type=(match2[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n10*y10;case"weeks":case"week":case"w":return n10*w10;case"days":case"day":case"d":return n10*d10;case"hours":case"hour":case"hrs":case"hr":case"h":return n10*h11;case"minutes":case"minute":case"mins":case"min":case"m":return n10*m4;case"seconds":case"second":case"secs":case"sec":case"s":return n10*s11;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n10;default:return}}}}function fmtShort(ms5){var msAbs=Math.abs(ms5);return msAbs>=d10?Math.round(ms5/d10)+"d":msAbs>=h11?Math.round(ms5/h11)+"h":msAbs>=m4?Math.round(ms5/m4)+"m":msAbs>=s11?Math.round(ms5/s11)+"s":ms5+"ms"}function fmtLong(ms5){var msAbs=Math.abs(ms5);return msAbs>=d10?plural(ms5,msAbs,d10,"day"):msAbs>=h11?plural(ms5,msAbs,h11,"hour"):msAbs>=m4?plural(ms5,msAbs,m4,"minute"):msAbs>=s11?plural(ms5,msAbs,s11,"second"):ms5+" ms"}function plural(ms5,msAbs,n10,name){var isPlural=msAbs>=n10*1.5;return Math.round(ms5/n10)+" "+name+(isPlural?"s":"")}}});var require_common=__commonJS({"node_modules/debug/src/common.js"(exports,module){"use strict";function setup(env){createDebug.debug=createDebug,createDebug.default=createDebug,createDebug.coerce=coerce3,createDebug.disable=disable,createDebug.enable=enable,createDebug.enabled=enabled,createDebug.humanize=require_ms(),createDebug.destroy=destroy,Object.keys(env).forEach(key=>{createDebug[key]=env[key]}),createDebug.names=[],createDebug.skips=[],createDebug.formatters={};function selectColor(namespace){let hash=0;for(let i10=0;i10<namespace.length;i10++)hash=(hash<<5)-hash+namespace.charCodeAt(i10),hash|=0;return createDebug.colors[Math.abs(hash)%createDebug.colors.length]}createDebug.selectColor=selectColor;function createDebug(namespace){let prevTime,enableOverride=null,namespacesCache,enabledCache;function debug19(...args){if(!debug19.enabled)return;let self2=debug19,curr=Number(new Date),ms5=curr-(prevTime||curr);self2.diff=ms5,self2.prev=prevTime,self2.curr=curr,prevTime=curr,args[0]=createDebug.coerce(args[0]),typeof args[0]!="string"&&args.unshift("%O");let index2=0;args[0]=args[0].replace(/%([a-zA-Z%])/g,(match2,format)=>{if(match2==="%%")return"%";index2++;let formatter=createDebug.formatters[format];if(typeof formatter=="function"){let val=args[index2];match2=formatter.call(self2,val),args.splice(index2,1),index2--}return match2}),createDebug.formatArgs.call(self2,args),(self2.log||createDebug.log).apply(self2,args)}return debug19.namespace=namespace,debug19.useColors=createDebug.useColors(),debug19.color=createDebug.selectColor(namespace),debug19.extend=extend,debug19.destroy=createDebug.destroy,Object.defineProperty(debug19,"enabled",{enumerable:!0,configurable:!1,get:()=>enableOverride!==null?enableOverride:(namespacesCache!==createDebug.namespaces&&(namespacesCache=createDebug.namespaces,enabledCache=createDebug.enabled(namespace)),enabledCache),set:v11=>{enableOverride=v11}}),typeof createDebug.init=="function"&&createDebug.init(debug19),debug19}function extend(namespace,delimiter){let newDebug=createDebug(this.namespace+(typeof delimiter>"u"?":":delimiter)+namespace);return newDebug.log=this.log,newDebug}function enable(namespaces){createDebug.save(namespaces),createDebug.namespaces=namespaces,createDebug.names=[],createDebug.skips=[];let split=(typeof namespaces=="string"?namespaces:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let ns3 of split)ns3[0]==="-"?createDebug.skips.push(ns3.slice(1)):createDebug.names.push(ns3)}function matchesTemplate(search,template){let searchIndex=0,templateIndex=0,starIndex=-1,matchIndex=0;for(;searchIndex<search.length;)if(templateIndex<template.length&&(template[templateIndex]===search[searchIndex]||template[templateIndex]==="*"))template[templateIndex]==="*"?(starIndex=templateIndex,matchIndex=searchIndex,templateIndex++):(searchIndex++,templateIndex++);else if(starIndex!==-1)templateIndex=starIndex+1,matchIndex++,searchIndex=matchIndex;else return!1;for(;templateIndex<template.length&&template[templateIndex]==="*";)templateIndex++;return templateIndex===template.length}function disable(){let namespaces=[...createDebug.names,...createDebug.skips.map(namespace=>"-"+namespace)].join(",");return createDebug.enable(""),namespaces}function enabled(name){for(let skip of createDebug.skips)if(matchesTemplate(name,skip))return!1;for(let ns3 of createDebug.names)if(matchesTemplate(name,ns3))return!0;return!1}function coerce3(val){return val instanceof Error?val.stack||val.message:val}function destroy(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return createDebug.enable(createDebug.load()),createDebug}module.exports=setup}});var require_browser=__commonJS({"node_modules/debug/src/browser.js"(exports,module){"use strict";exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage=localstorage();exports.destroy=(()=>{let warned=!1;return()=>{warned||(warned=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();exports.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function useColors(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let m4;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(m4=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(m4[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function formatArgs(args){if(args[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+args[0]+(this.useColors?"%c ":" ")+"+"+module.exports.humanize(this.diff),!this.useColors)return;let c4="color: "+this.color;args.splice(1,0,c4,"color: inherit");let index2=0,lastC=0;args[0].replace(/%[a-zA-Z%]/g,match2=>{match2!=="%%"&&(index2++,match2==="%c"&&(lastC=index2))}),args.splice(lastC,0,c4)}exports.log=console.debug||console.log||(()=>{});function save(namespaces){try{namespaces?exports.storage.setItem("debug",namespaces):exports.storage.removeItem("debug")}catch{}}function load(){let r10;try{r10=exports.storage.getItem("debug")||exports.storage.getItem("DEBUG")}catch{}return!r10&&typeof process<"u"&&"env"in process&&(r10=process.env.DEBUG),r10}function localstorage(){try{return localStorage}catch{}}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.j=function(v11){try{return JSON.stringify(v11)}catch(error2){return"[UnexpectedJSONParseError]: "+error2.message}}}});function applyToPoint(matrix2,point7){return Array.isArray(point7)?[matrix2.a*point7[0]+matrix2.c*point7[1]+matrix2.e,matrix2.b*point7[0]+matrix2.d*point7[1]+matrix2.f]:{x:matrix2.a*point7.x+matrix2.c*point7.y+matrix2.e,y:matrix2.b*point7.x+matrix2.d*point7.y+matrix2.f}}var init_applyToPoint=__esm({"node_modules/transformation-matrix/src/applyToPoint.js"(){"use strict"}});var init_fromObject=__esm({"node_modules/transformation-matrix/src/fromObject.js"(){"use strict"}});var init_fromString=__esm({"node_modules/transformation-matrix/src/fromString.js"(){"use strict"}});var init_identity=__esm({"node_modules/transformation-matrix/src/identity.js"(){"use strict"}});var init_inverse=__esm({"node_modules/transformation-matrix/src/inverse.js"(){"use strict"}});function isUndefined(val){return typeof val>"u"}var init_utils=__esm({"node_modules/transformation-matrix/src/utils.js"(){"use strict"}});var init_isAffineMatrix=__esm({"node_modules/transformation-matrix/src/isAffineMatrix.js"(){"use strict";init_utils()}});function translate(tx4,ty4=0){return{a:1,c:0,e:tx4,b:0,d:1,f:ty4}}var init_translate=__esm({"node_modules/transformation-matrix/src/translate.js"(){"use strict"}});function transform(...matrices){matrices=Array.isArray(matrices[0])?matrices[0]:matrices;let multiply10=(m13,m23)=>({a:m13.a*m23.a+m13.c*m23.b,c:m13.a*m23.c+m13.c*m23.d,e:m13.a*m23.e+m13.c*m23.f+m13.e,b:m13.b*m23.a+m13.d*m23.b,d:m13.b*m23.c+m13.d*m23.d,f:m13.b*m23.e+m13.d*m23.f+m13.f});switch(matrices.length){case 0:throw new Error("no matrices provided");case 1:return matrices[0];case 2:return multiply10(matrices[0],matrices[1]);default:{let[m13,m23,...rest]=matrices,m4=multiply10(m13,m23);return transform(m4,...rest)}}}function compose(...matrices){return transform(...matrices)}var init_transform=__esm({"node_modules/transformation-matrix/src/transform.js"(){"use strict"}});function rotate(angle3,cx4,cy4){let cosAngle=cos(angle3),sinAngle=sin(angle3),rotationMatrix={a:cosAngle,c:-sinAngle,e:0,b:sinAngle,d:cosAngle,f:0};return isUndefined(cx4)||isUndefined(cy4)?rotationMatrix:transform([translate(cx4,cy4),rotationMatrix,translate(-cx4,-cy4)])}function rotateDEG(angle3,cx4=void 0,cy4=void 0){return rotate(angle3*PI/180,cx4,cy4)}var cos,sin,PI,init_rotate=__esm({"node_modules/transformation-matrix/src/rotate.js"(){"use strict";init_utils();init_translate();init_transform();({cos,sin,PI}=Math)}});function scale(sx4,sy4=void 0,cx4=void 0,cy4=void 0){isUndefined(sy4)&&(sy4=sx4);let scaleMatrix={a:sx4,c:0,e:0,b:0,d:sy4,f:0};return isUndefined(cx4)||isUndefined(cy4)?scaleMatrix:transform([translate(cx4,cy4),scaleMatrix,translate(-cx4,-cy4)])}var init_scale=__esm({"node_modules/transformation-matrix/src/scale.js"(){"use strict";init_utils();init_translate();init_transform()}});var init_shear=__esm({"node_modules/transformation-matrix/src/shear.js"(){"use strict"}});var tan,init_skew=__esm({"node_modules/transformation-matrix/src/skew.js"(){"use strict";({tan}=Math)}});var init_toString=__esm({"node_modules/transformation-matrix/src/toString.js"(){"use strict"}});var init_smoothMatrix=__esm({"node_modules/transformation-matrix/src/smoothMatrix.js"(){"use strict"}});var init_fromTriangles=__esm({"node_modules/transformation-matrix/src/fromTriangles.js"(){"use strict";init_inverse();init_transform();init_smoothMatrix()}});var init_fromDefinition=__esm({"node_modules/transformation-matrix/src/fromDefinition.js"(){"use strict";init_fromObject();init_translate();init_scale();init_rotate();init_skew();init_shear()}});var init_fromTransformAttribute_autogenerated=__esm({"node_modules/transformation-matrix/src/fromTransformAttribute.autogenerated.js"(){"use strict"}});var init_fromTransformAttribute=__esm({"node_modules/transformation-matrix/src/fromTransformAttribute.js"(){"use strict";init_fromTransformAttribute_autogenerated()}});function decomposeTSR(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose(matrix2,scale(-1,-1)):matrix2=compose(matrix2,scale(1,-1)):flipY2&&(matrix2=compose(matrix2,scale(-1,1)));let a10=matrix2.a,b11=matrix2.b,c4=matrix2.c,d10=matrix2.d,scaleX,scaleY,rotation5;if(a10!==0||c4!==0){let hypotAc=Math.hypot(a10,c4);scaleX=hypotAc,scaleY=(a10*d10-b11*c4)/hypotAc;let acos=Math.acos(a10/hypotAc);rotation5=c4>0?-acos:acos}else if(b11!==0||d10!==0){let hypotBd=Math.hypot(b11,d10);scaleX=(a10*d10-b11*c4)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b11/hypotBd);rotation5=Math.PI/2+(d10>0?-acos:acos)}else scaleX=0,scaleY=0,rotation5=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation5}}}var init_decompose=__esm({"node_modules/transformation-matrix/src/decompose.js"(){"use strict";init_scale();init_transform()}});var init_flip=__esm({"node_modules/transformation-matrix/src/flip.js"(){"use strict"}});var init_fromMovingPoints=__esm({"node_modules/transformation-matrix/src/fromMovingPoints.js"(){"use strict";init_translate();init_applyToPoint();init_rotate();init_scale();init_transform()}});var init_src=__esm({"node_modules/transformation-matrix/src/index.js"(){"use strict";init_applyToPoint();init_fromObject();init_fromString();init_identity();init_inverse();init_isAffineMatrix();init_rotate();init_scale();init_shear();init_skew();init_toString();init_transform();init_translate();init_fromTriangles();init_smoothMatrix();init_fromDefinition();init_fromTransformAttribute();init_decompose();init_flip();init_fromMovingPoints()}});var init_parsel=__esm({"node_modules/parsel-js/dist/parsel.js"(){"use strict"}});var require_performance_now=__commonJS({"node_modules/performance-now/lib/performance-now.js"(exports,module){"use strict";(function(){var getNanoSeconds,hrtime,loadTime,moduleLoadTime,nodeLoadTime,upTime;typeof performance<"u"&&performance!==null&&performance.now?module.exports=function(){return performance.now()}:typeof process<"u"&&process!==null&&process.hrtime?(module.exports=function(){return(getNanoSeconds()-nodeLoadTime)/1e6},hrtime=process.hrtime,getNanoSeconds=function(){var hr3;return hr3=hrtime(),hr3[0]*1e9+hr3[1]},moduleLoadTime=getNanoSeconds(),upTime=process.uptime()*1e9,nodeLoadTime=moduleLoadTime-upTime):Date.now?(module.exports=function(){return Date.now()-loadTime},loadTime=Date.now()):(module.exports=function(){return new Date().getTime()-loadTime},loadTime=new Date().getTime())}).call(exports)}});var init_chunk_GIGMPRPV=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-GIGMPRPV.js"(){"use strict"}});var init_chunk_LL3GOPYX=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-LL3GOPYX.js"(){"use strict"}});function doesLineIntersectLine2([a13,a22],[b13,b22],{lineThickness=0}={}){return lineThickness===0?doSegmentsIntersect2(a13,a22,b13,b22):segmentsDistance2(a13,a22,b13,b22)<=lineThickness}function doSegmentsIntersect2(p13,q13,p23,q22){let o13=orientation2(p13,q13,p23),o23=orientation2(p13,q13,q22),o32=orientation2(p23,q22,p13),o42=orientation2(p23,q22,q13);return!!(o13!==o23&&o32!==o42||o13===0&&onSegment2(p13,p23,q13)||o23===0&&onSegment2(p13,q22,q13)||o32===0&&onSegment2(p23,p13,q22)||o42===0&&onSegment2(p23,q13,q22))}function orientation2(p11,q11,r10){let val=(q11.y-p11.y)*(r10.x-q11.x)-(q11.x-p11.x)*(r10.y-q11.y);return val===0?0:val>0?1:2}function onSegment2(p11,q11,r10){return q11.x<=Math.max(p11.x,r10.x)&&q11.x>=Math.min(p11.x,r10.x)&&q11.y<=Math.max(p11.y,r10.y)&&q11.y>=Math.min(p11.y,r10.y)}function segmentsDistance2(a13,a22,b13,b22){if(a13.x===a22.x&&a13.y===a22.y)return pointToSegmentDistance2(a13,b13,b22);if(b13.x===b22.x&&b13.y===b22.y)return pointToSegmentDistance2(b13,a13,a22);if(doSegmentsIntersect2(a13,a22,b13,b22))return 0;let distances=[pointToSegmentDistance2(a13,b13,b22),pointToSegmentDistance2(a22,b13,b22),pointToSegmentDistance2(b13,a13,a22),pointToSegmentDistance2(b22,a13,a22)];return Math.min(...distances)}function pointToSegmentDistance2(p11,v11,w10){let l22=(w10.x-v11.x)**2+(w10.y-v11.y)**2;if(l22===0)return distance4(p11,v11);let t48=((p11.x-v11.x)*(w10.x-v11.x)+(p11.y-v11.y)*(w10.y-v11.y))/l22;t48=Math.max(0,Math.min(1,t48));let projection2={x:v11.x+t48*(w10.x-v11.x),y:v11.y+t48*(w10.y-v11.y)};return distance4(p11,projection2)}function distance4(p13,p23){let dx4=p13.x-p23.x,dy4=p13.y-p23.y;return Math.sqrt(dx4*dx4+dy4*dy4)}var init_chunk_CHQOCSFB=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-CHQOCSFB.js"(){"use strict"}});var init_chunk_MHHTZHOJ=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-MHHTZHOJ.js"(){"use strict"}});var init_dist3=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/index.js"(){"use strict";init_chunk_GIGMPRPV();init_chunk_LL3GOPYX();init_chunk_CHQOCSFB();init_chunk_MHHTZHOJ()}});function findConnectedNetworks(connections){let networks=new Map,netCounter=0;function getOrCreateNetwork(nodeId){for(let[,network]of networks)if(network.has(nodeId))return network;let newNetwork=new Set;return networks.set(`connectivity_net${netCounter++}`,newNetwork),newNetwork}for(let connection of connections){let network=null;for(let nodeId of connection){if(!network)network=getOrCreateNetwork(nodeId);else if(!network.has(nodeId)){let existingNetwork=getOrCreateNetwork(nodeId);if(existingNetwork!==network){for(let node2 of existingNetwork)network.add(node2);networks.delete(Array.from(networks.entries()).find(([,net])=>net===existingNetwork)[0])}}network.add(nodeId)}}return Object.fromEntries(Array.from(networks.entries()).map(([netId,connectedNodes])=>[netId,Array.from(connectedNodes)]))}var ConnectivityMap,getSourcePortConnectivityMapFromCircuitJson,getFullConnectivityMapFromCircuitJson,PcbConnectivityMap,init_dist4=__esm({"node_modules/circuit-json-to-connectivity-map/dist/index.js"(){"use strict";init_dist3();ConnectivityMap=class{constructor(netMap){__publicField(this,"netMap");__publicField(this,"idToNetMap");this.netMap=netMap,this.idToNetMap={};for(let[netId,ids]of Object.entries(netMap))for(let id3 of ids)this.idToNetMap[id3]=netId}addConnections(connections){for(let connection of connections){let existingNets=new Set;for(let id3 of connection){let existingNetId=this.idToNetMap[id3];existingNetId&&existingNets.add(existingNetId)}let targetNetId;if(existingNets.size===0)targetNetId=`connectivity_net${Object.keys(this.netMap).length}`,this.netMap[targetNetId]=[];else if(existingNets.size===1)targetNetId=existingNets.values().next().value??`connectivity_net${Object.keys(this.netMap).length}`;else{targetNetId=existingNets.values().next().value??`connectivity_net${Object.keys(this.netMap).length}`;for(let netId of existingNets)if(netId!==targetNetId){this.netMap[targetNetId].push(...this.netMap[netId]),this.netMap[netId]=this.netMap[targetNetId];for(let id3 of this.netMap[targetNetId])this.idToNetMap[id3]=targetNetId}}for(let id3 of connection)this.netMap[targetNetId].includes(id3)||this.netMap[targetNetId].push(id3),this.idToNetMap[id3]=targetNetId}}getIdsConnectedToNet(netId){return this.netMap[netId]||[]}getNetConnectedToId(id3){return this.idToNetMap[id3]}areIdsConnected(id1,id22){if(id1===id22)return!0;let netId1=this.getNetConnectedToId(id1);if(!netId1)return!1;let netId2=this.getNetConnectedToId(id22);return netId2?netId1===netId2||netId2===id1||netId2===id1:!1}areAllIdsConnected(ids){let netId=this.getNetConnectedToId(ids[0]);for(let id3 of ids){let nextNetId=this.getNetConnectedToId(id3);if(nextNetId===void 0||nextNetId!==netId)return!1}return!0}},getSourcePortConnectivityMapFromCircuitJson=circuitJson=>{let connections=[];for(let element of circuitJson)if(element.type==="source_trace")connections.push([...element.connected_source_port_ids??[],...element.connected_source_net_ids??[]]);else if(element.type==="source_component"){if(element.internally_connected_source_port_ids)for(let portGroup of element.internally_connected_source_port_ids)connections.push(portGroup)}else element.type==="source_component_internal_connection"&&connections.push(element.source_port_ids);let netMap=findConnectedNetworks(connections);return new ConnectivityMap(netMap)},getFullConnectivityMapFromCircuitJson=circuitJson=>{let connections=[];for(let element of circuitJson)if(element.type==="source_trace")connections.push([element.source_trace_id,...element.connected_source_port_ids??[],...element.connected_source_net_ids??[]].filter(Boolean));else if(element.type==="pcb_port"){let{pcb_port_id,source_port_id}=element;source_port_id&&pcb_port_id&&connections.push([source_port_id,pcb_port_id])}else if(element.type==="pcb_smtpad"){let{pcb_smtpad_id,pcb_port_id}=element;pcb_port_id&&pcb_smtpad_id&&connections.push([pcb_smtpad_id,pcb_port_id])}else if(element.type==="pcb_plated_hole"){let{pcb_plated_hole_id,pcb_port_id}=element;pcb_port_id&&pcb_plated_hole_id&&connections.push([pcb_plated_hole_id,pcb_port_id])}else if(element.type==="pcb_trace"){let{pcb_trace_id,source_trace_id}=element,route2=Array.isArray(element.route)?element.route.filter(rp4=>rp4&&rp4.route_type==="wire"):[];if(source_trace_id&&pcb_trace_id&&connections.push([pcb_trace_id,source_trace_id]),Array.isArray(route2)){let startId=route2.find(rp4=>rp4?.start_pcb_port_id)?.start_pcb_port_id,endId=route2.find(rp4=>rp4?.end_pcb_port_id)?.end_pcb_port_id;startId&&pcb_trace_id&&connections.push([startId,pcb_trace_id]),pcb_trace_id&&endId&&connections.push([pcb_trace_id,endId])}}else if(element.type==="pcb_via"){let{pcb_via_id,pcb_trace_id,source_trace_id,source_net_id}=element,connectedIds=[...element.pcb_port_ids??[],pcb_trace_id,source_trace_id,source_net_id].filter(connectedId=>!!connectedId);pcb_via_id&&connectedIds.length>0&&connections.push([pcb_via_id,...connectedIds])}else if(element.type==="source_component"&&element.internally_connected_source_port_ids)for(let portGroup of element.internally_connected_source_port_ids)connections.push(portGroup);let netMap=findConnectedNetworks(connections);return new ConnectivityMap(netMap)},PcbConnectivityMap=class{constructor(circuitJson){__publicField(this,"circuitJson");__publicField(this,"traceIdToElm");__publicField(this,"portIdToElm");__publicField(this,"connMap");this.circuitJson=circuitJson||[],this.traceIdToElm=new Map,this.portIdToElm=new Map,circuitJson?(this._buildTraceMap(),this._buildPortMap(),this.connMap=this._buildTraceConnectivityMap()):this.connMap=new ConnectivityMap({})}_buildPortMap(){for(let element of this.circuitJson)element.type==="pcb_port"&&this.portIdToElm.set(element.pcb_port_id,element)}_buildTraceMap(){for(let element of this.circuitJson)element.type==="pcb_trace"&&this.traceIdToElm.set(element.pcb_trace_id,element)}_buildTraceConnectivityMap(){let connections=[],traceIds=Array.from(this.traceIdToElm.keys());for(let i10=0;i10<traceIds.length;i10++)for(let j11=i10+1;j11<traceIds.length;j11++){let trace1=this.traceIdToElm.get(traceIds[i10]),trace2=this.traceIdToElm.get(traceIds[j11]);this._arePcbTracesConnected(trace1,trace2)&&connections.push([traceIds[i10],traceIds[j11]])}for(let port of this.portIdToElm.values())for(let trace of this.traceIdToElm.values())for(let rp4 of trace.route)rp4.route_type==="wire"&&(rp4.start_pcb_port_id===port.pcb_port_id?connections.push([port.pcb_port_id,trace.pcb_trace_id]):rp4.end_pcb_port_id===port.pcb_port_id&&connections.push([trace.pcb_trace_id,port.pcb_port_id]));return new ConnectivityMap(findConnectedNetworks(connections))}addTrace(trace){this.traceIdToElm.set(trace.pcb_trace_id,trace);let connections=[];for(let rp4 of trace.route)rp4.route_type==="wire"&&(rp4.start_pcb_port_id&&connections.push([rp4.start_pcb_port_id,trace.pcb_trace_id]),rp4.end_pcb_port_id&&connections.push([rp4.end_pcb_port_id,trace.pcb_trace_id]));this.connMap.addConnections(connections)}_arePcbTracesConnected(trace1,trace2){for(let i10=0;i10<trace1.route.length-1;i10++){let segment1A=trace1.route[i10],segment1B=trace1.route[i10+1];if(segment1A.route_type==="wire"&&segment1B.route_type==="wire"&&segment1A.layer===segment1B.layer)for(let j11=0;j11<trace2.route.length-1;j11++){let segment2A=trace2.route[j11],segment2B=trace2.route[j11+1];if(segment2A.route_type!=="wire"||segment2B.route_type!=="wire"||segment2A.layer!==segment2B.layer||segment1A.layer!==segment2A.layer)continue;let radius=(segment1A.width+segment2A.width)/2;if(Math.max(segment1A.x,segment1B.x)+radius<Math.min(segment2A.x,segment2B.x)||Math.max(segment2A.x,segment2B.x)+radius<Math.min(segment1A.x,segment1B.x)||Math.max(segment1A.y,segment1B.y)+radius<Math.min(segment2A.y,segment2B.y)||Math.max(segment2A.y,segment2B.y)+radius<Math.min(segment1A.y,segment1B.y))continue;if(doesLineIntersectLine2([segment1A,segment1B],[segment2A,segment2B],{lineThickness:(segment1A.width+segment2A.width)/2}))return!0}}return!1}areTracesConnected(traceId1,traceId2){return this.connMap.areIdsConnected(traceId1,traceId2)}getAllTracesConnectedToTrace(traceId){let netId=this.connMap.getNetConnectedToId(traceId);return netId?this.connMap.getIdsConnectedToNet(netId).filter(id3=>this.traceIdToElm.has(id3)).map(id3=>this.traceIdToElm.get(id3)):[]}getAllTracesConnectedToPort(portId){let netId=this.connMap.getNetConnectedToId(portId);return netId?this.connMap.getIdsConnectedToNet(netId).filter(id3=>this.traceIdToElm.has(id3)).map(id3=>this.traceIdToElm.get(id3)):[]}}}});var require_boolbase=__commonJS({"node_modules/boolbase/index.js"(exports,module){"use strict";module.exports={trueFunc:function(){return!0},falseFunc:function(){return!1}}}});function E(t48,l10){return Array.isArray(l10)?[t48.a*l10[0]+t48.c*l10[1]+t48.e,t48.b*l10[0]+t48.d*l10[1]+t48.f]:{x:t48.a*l10.x+t48.c*l10.y+t48.e,y:t48.b*l10.x+t48.d*l10.y+t48.f}}function g0(t48){return typeof t48>"u"}function Bt(t48,l10=0){return{a:1,c:0,e:t48,b:0,d:1,f:l10}}function G(...t48){t48=Array.isArray(t48[0])?t48[0]:t48;let l10=(i10,s11)=>({a:i10.a*s11.a+i10.c*s11.b,c:i10.a*s11.c+i10.c*s11.d,e:i10.a*s11.e+i10.c*s11.f+i10.e,b:i10.b*s11.a+i10.d*s11.b,d:i10.b*s11.c+i10.d*s11.d,f:i10.b*s11.e+i10.d*s11.f+i10.f});switch(t48.length){case 0:throw new Error("no matrices provided");case 1:return t48[0];case 2:return l10(t48[0],t48[1]);default:{let[i10,s11,...y10]=t48,p11=l10(i10,s11);return G(p11,...y10)}}}function Do(t48,l10,i10){let s11=Jh(t48),y10=$h(t48),p11={a:s11,c:-y10,e:0,b:y10,d:s11,f:0};return g0(l10)||g0(i10)?p11:G([Bt(l10,i10),p11,Bt(-l10,-i10)])}function Mh(t48,l10){function i10(){this.constructor=t48}i10.prototype=l10.prototype,t48.prototype=new i10}function u0(t48,l10,i10,s11){var y10=Error.call(this,t48);return Object.setPrototypeOf&&Object.setPrototypeOf(y10,u0.prototype),y10.expected=l10,y10.found=i10,y10.location=s11,y10.name="SyntaxError",y10}function qo(t48,l10,i10){return i10=i10||" ",t48.length>l10?t48:(l10-=t48.length,i10+=i10.repeat(l10),t48+i10.slice(0,l10))}function S(t48){if(t48.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let l10=1/0,i10=-1/0,s11=1/0,y10=-1/0,p11=c4=>{l10=Math.min(l10,c4.x),i10=Math.max(i10,c4.x),s11=Math.min(s11,c4.y),y10=Math.max(y10,c4.y)};return t48.forEach(c4=>{switch(c4.type){case"path":c4.points.forEach(p11);break;case"text":p11({x:c4.x,y:c4.y});break;case"circle":{let{x:f10,y:d10,radius:a10}=c4;p11({x:f10-a10,y:d10-a10}),p11({x:f10+a10,y:d10+a10});break}case"box":{let{x:f10,y:d10,width:a10,height:m4}=c4,h11=a10/2,b11=m4/2;p11({x:f10-h11,y:d10-b11}),p11({x:f10+h11,y:d10+b11});break}}}),{minX:l10,maxX:i10,minY:s11,maxY:y10}}function n(t48){let l10=t48.size;if(!l10){let i10=S(t48.primitives);l10={width:i10.maxX-i10.minX,height:i10.maxY-i10.minY}}return{...t48,size:l10}}function G5(t48){return typeof t48=="object"}function I(t48,l10){return{width:Math.max(...l10.map(i10=>Math.abs(i10.x-t48.x)))*2,height:Math.max(...l10.map(i10=>Math.abs(i10.y-t48.y)))*2}}function C3(t48){return typeof t48=="object"}function bb(t48){return typeof t48=="object"}function H(t48,l10){let{width:i10,height:s11}=t48.size,y10=1,p11=1;l10.width!==void 0&&l10.height!==void 0?(y10=l10.width/i10,p11=l10.height/s11):l10.width!==void 0?y10=p11=l10.width/i10:l10.height!==void 0&&(y10=p11=l10.height/s11);let c4=t48.primitives.map(f10=>{switch(f10.type){case"path":return{...f10,points:f10.points.map(d10=>({x:d10.x*y10,y:d10.y*p11}))};case"text":return{...f10,x:f10.x*y10,y:f10.y*p11,fontSize:f10.fontSize?f10.fontSize*y10:void 0};case"circle":return{...f10,x:f10.x*y10,y:f10.y*p11,radius:f10.radius*y10};case"box":return{...f10,x:f10.x*y10,y:f10.y*p11,width:f10.width*y10,height:f10.height*p11};default:return f10}});return{...t48,primitives:c4,center:{x:t48.center.x*y10,y:t48.center.y*p11},ports:t48.ports.map(f10=>({...f10,x:f10.x*y10,y:f10.y*p11})),size:{width:i10*y10,height:s11*p11}}}function zb(t48){return typeof t48=="object"}function Cb(t48){return typeof t48=="object"}var Jh,$h,x8,g8,Wh,L,Y,q,o,Ho,e,X,Bh,Yg,v0,ep,Ih,op,Dh,jg,w0,rp,qh,ip,Hh,Mg,S0,lp,Gh,ap,Uh,Bg,A0,pp,Zh,sp,Kh,Hg,P0,yp,Qh,mp,td,Kg,R0,np,ed,xp,z,rd,r7,F0,fp2,id,cp,hp,ld,m7,T0,dp,ad,_p,bp,U,sd,r,gp,up,vp,wp,yd,Y7,E0,Sp,md,Ap,nd,j7,V0,Pp,xd,Rp,Z,Fp,Tp,Ep,Vp,K,hd,tu,L0,Lp,dd,Yp,_d,iu,Y0,Xp,bd,X0,gd,su2,z0,zp,ud,kp,fu,cu,hu,du,_u,Go,Uo,Zo,jp,N,wd,Op,Jp,Sd,Ad,$p,Pd,Mp,k0,Cp,Rd,j0,Fd,Wp,Np,Td,Ed,Bp,Vd,Ip,Dp,Ld,Yd,qp,Xd,Hp,Gp,zd,kd,Up,Zp,Q,Od,Nu,Kp,Qp,Jd,$d,ts,Md,qu,es,os,Cd,Wd,rs,Nd,Zu,is2,ls,Bd,Id,as,tt,ps,ss,ys,ms2,et,Hd,h6,O0,ns,Gd,xs,Ud,g6,J0,fs,Zd,cs,Kd,S6,$0,hs,Qd,ds,t2,F6,M0,_s,e2,bs,o2,L6,gs,us,r2,i2,vs,ot,ws,Ss,As,Ps,It,p2,G6,Rs,Fs,s2,Ts,y2,Q6,Es,Vs,m2,C0,Ls,n2,av,Ys,Xs,x2,zs,rt,c2,nv,W0,ks,h2,d2,js,_2,Os,it,Js,$s,Ms,Cs,g2,Ws,lt,Ns,Bs,Is,Ds,v2,qv,N0,qs,w2,S2,Hs,at,Gs,Us,Zs,Ks,k,R2,nw,B0,Qs,F2,ty,ey,T2,bw,I0,oy,E2,ry,iy,V2,Pw,D0,ly,L2,ay,Y2,Ew,q0,py,X2,sy,pt,k2,zw,H0,G0,j2,yy,my,ny,O2,Bw,U0,Z0,J2,xy,st,M2,Gw,K0,fy,C2,cy,hy,dy,W2,lS,Q0,_y,N2,by,i0,Ko,B2,gy,l0,Qo,I2,uy,a0,tr,D2,vy,p0,er,q2,wy,j,Sy,Ay,Py,Ry,Fy,Ty,Ey,Vy,te,Ly,U2,B,or,s0,Yy,Xy,rr,zy,O,K2,tA,ee,ky,Q2,jy,t5,iA,oe,Oy,e5,Jy,o5,sA,re,$y,r5,My,i5,xA,ie,Cy,l5,Wy,a5,dA,le,Ny,p5,By,s5,uA,ae,Iy,y5,Dy,J,qy,Hy,Gy,Uy,Zy,Ky,yt,x5,Qy,f5,tm,c5,em,h5,om,d5,rm,_5,im,b5,lm,g5,am,pm,mt,sm,ym,nt,mm2,nm,xm,fm,cm,xt,hm,dm,_m,bm,gm,ft,ir,lr,ar,um,pr,sr,yr,vm,mr,nr,xr,wm,Sm,ct,fr,cr,hr,Am,dr,_r,br,Pm,gr,ur,vr,Rm,Fm,ht,wr,Sr,Ar,Tm,Pr,Rr,Fr,Em,Tr,Er,Vr,Vm,Lm,dt,Lr,Yr,Xr,Ym,zr,kr,jr,Xm,Or,Jr,$r,zm,pe,T5,MR,se,km,E5,ye,Mr,Cr,Wr,jm,me,Om,$,L5,eF,ne,Jm,Y5,$m,X5,lF,xe,Mm,z5,Cm,k5,yF,fe,Wm,j5,Nm,O5,fF,ce,Bm,J5,Im,$5,_F,he,Dm,M5,qm,C5,vF,de,Hm,W5,Gm,Um,B5,I5,_e,Zm,D5,y0,q5,H5,Km,Qm,tn,Z5,K5,be,en,ge,on,M,rn,ln,an,pn,sn,yn,m0,lT,aT,pT,sT,yT,mn,nn,xn,_t,fn,cn,Nr,Br,Ir,hn,dn,ue,Dr,qr,_n,bn,gn,ve,un,vn,Hr,Gr,wn,bt,Sn,An,Pn,Rn,Ur,gt,Zr,Kr,Qr,Fn,ti,ei,oi,Tn,ri,ii,li,En,Vn,p4,Ln,we,Yn,s4,Dt,ai,pi,si,Se,yi,mi,ni,Xn,zn,ut,kn,jn,On,Jn,vt,$n,Mn,Cn,Wn,Nn,x4,Bn,Ae,In,f4,Pe,Dn,qn,xi,fi,Hn,Gn,h4,Un,Zn,qt,Kn,Re,ci,Qn,hi,t9,e9,_4,o9,Fe,r9,b4,Te,di,n0,Ee,i9,x,l9,u4,a9,p9,Wt,v4,s9,w4,g,y9,m9,_i,bi,A,n9,x9,f9,c9,h9,d9,_9,b9,g9,A4,u9,v9,Ht,P4,w9,u,S9,A9,gi,ui,P,P9,R9,F9,T9,E9,V9,L9,Y9,X9,F4,z9,Ve,vi,T4,Le,k9,j9,wi,Si,O9,J9,V4,$9,L4,wt,M9,C9,W9,C,X4,uY,Ye,Ai,z4,N9,k4,AY,Xe,Pi,j4,B9,O4,TY,ze,Ri,J4,I9,$4,YY,ke,Fi,M4,D9,C4,jY,je,Ti,W4,q9,N4,MY,Oe,Ei,B4,H9,G9,St,U9,Z9,K9,Q9,At,tx,ex,ox,rx,H4,ix,lx,Gt,G4,ax,v,px,sx,Vi,Li,R,yx,mx,nx,xx,fx,cx,hx,dx,_x,Z4,bx,gx,Ut,K4,ux,w,vx,wx,Yi,Xi,F,Sx,Ax,Px,Rx,Fx,Tx,Ex,Vx,Lx,Je,Yx,t_,Xx,zx,kx,o_,jx,$e,zi,r_,Me,Ox,Jx,ki,ji,$x,V,l_,rk,Ce,Oi,a_,Mx,pk,sk,yk,mk,nk,Cx,p_,hk,We,Ji,s_,Wx,y_,gk,Ne,$i,m_,Nx,n_,Sk,Be,Mi,x_,Bx,f_,Fk,Ie,Ci,c_,Ix,Dx,d_,qx,De,Hx,qe,__,Gx,Ux,g_,Zx,He,Kx,Pt,Wi,Ni,Bi,Qx,Ii,Di,qi,t1,Hi,Gi,Ui,e1,Rt,v_,Kk,Ge,Zi,w_,o1,S_,oj,Ue,Ki,A_,r1,i1,P_,yj,Ze,Qi,R_,l1,a1,T_,cj,Ke,p1,E_,Qe,s1,ol,tl,rl,el,y1,m1,L_,n1,x1,f1,Y_,to,c1,eo,z_,h1,k_,il,j_,D,ll,al,pl,d1,O_,_1,J_,sl,$_,b1,yl,ml,nl,g1,xl,fl,cl,u1,hl,dl,_l,v1,Ft,C_,Hj,w1,W_,N_,S1,B_,Kj,A1,I_,D_,P1,q_,oO,R1,H_,G_,F1,U_,aO,T1,Z_,E1,V1,Q_,L1,oo,ro,t3,io,bl,e3,o3,Y1,Tt,i3,bO,lo,X1,l3,z1,a3,wO,ao,k1,p3,j1,s3,RO,po,O1,y3,J1,Et,$1,M1,C1,W1,n3,NO,so,N1,x3,B1,Vt,I1,D1,q1,H1,yo,h3,G1,mo,gl,d3,Lt,ul,vl,wl,U1,_3,fJ,no,Sl,b3,xo,Al,Pl,Rl,Z1,Fl,Tl,El,K1,Q1,tf,Yt,Vl,Ll,Yl,ef,Xl,zl,kl,of,jl,Ol,Jl,rf,$l,MJ,CJ,WJ,NJ,BJ,fo,lf,v3,af,pf,co,sf,Zt,yf,Ml,mf,nf,Cl,xf,ho,ff,Kt,cf,Wl,hf,df,Nl,_f,_o,bf,Qt,gf,Bl,uf,vf,Il,wf,bo,Sf,t0,Af,Dl,Pf,Rf,ql,Ff,go,Tf,e0,Ef,Hl,Vf,Lf,Gl,Yf,uo,Xf,o0,zf,Ul,kf,jf,Zl,Of,Jf,Xt,Kl,Ql,ta,$f,ea,oa,ra,Mf,ia,la,aa,Cf,Wf,zt,pa,sa,ya,Nf,ma,na,xa,Bf,fa,ca,ha,If,W,Df,vo,qf,Hf,wo,Gf,Uf,So,Zf,Kf,Ao,Qf,tc,Po,ec,oc,Ro,rc,x0,kt,da,_a2,ba,ic,ga,ua,va,lc,wa,Sa,Aa,ac,f0,jt,Pa,Ra,Fa,pc,Ta,Ea,Va,sc,La,Ya,Xa,yc,Ot,mc,nc,xc,fc,za,iW,lW,aW,pW,sW,Fo,cc,hc,j3,O3,To,dc,J3,c0,$3,M3,_c,bc,Jt,uc,gc,vc,wc,Ac,Sc,Pc,Rc,r0,ka,ja,Oa,Eo,Ja,$a,Ma,Fc,Ca,Wa,Na,Tc,Ba,qW,HW,GW,UW,ZW,Vo,Ec,Vc,B3,I3,Lc,Yc,q3,Xc,Lo,zc,H3,Yo,Ia,G3,U3,kc,jc,K3,Oc,Xo,Da,Q3,zo,Jc,$c,tb,Mc,Cc,Wc,Nc,Bc,rb,qa,ko,Ic,ib,jo,Dc,qc,ab,Hc,Oo,Gc,pb,Jo,Ha,sb,yb,Uc,Zc,nb,Kc,$o,Qc,Mo,th,eh,Ga,Ua,oh,rh,fb,cb,Co,ih,hb,h0,db,_b,lh,ah,$t,ub,ph,vb,sh,wb,yh,Sb,mh,d0,hB,dB,_B,bB,gB,nh,Pb,SB,xh,Rb,fh,Fb,ch,hh,Eb,Vb,Wo,dh,Lb,_0,Yb,Xb,_h,bh,gh,jb,Ob,No,uh,Jb,b0,$b,Mb,vh,wh,Bo,Sh,Mt,Ah,Ph,Rh,Fh,Bb,Io,Th,Ib,Eh,Ct,Vh,Lh,Yh,Xh,zh,jQ,init_dist5=__esm({"node_modules/schematic-symbols/dist/index.js"(){"use strict";({cos:Jh,sin:$h,PI:x8}=Math);({tan:g8}=Math);Mh(u0,Error);u0.prototype.format=function(t48){var l10="Error: "+this.message;if(this.location){var i10=null,s11;for(s11=0;s11<t48.length;s11++)if(t48[s11].source===this.location.source){i10=t48[s11].text.split(/\r\n|\n|\r/g);break}var y10=this.location.start,p11=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(y10):y10,c4=this.location.source+":"+p11.line+":"+p11.column;if(i10){var f10=this.location.end,d10=qo("",p11.line.toString().length," "),a10=i10[y10.line-1],m4=y10.line===f10.line?f10.column:a10.length+1,h11=m4-y10.column||1;l10+=`
13
+ See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),dispatcher}function releaseAsyncTransition(){ReactSharedInternals.asyncTransitions--}function startTransition(scope){var prevTransition=ReactSharedInternals.T,currentTransition={};currentTransition.types=prevTransition!==null?prevTransition.types:null,currentTransition._updatedFibers=new Set,ReactSharedInternals.T=currentTransition;try{var returnValue=scope(),onStartTransitionFinish=ReactSharedInternals.S;onStartTransitionFinish!==null&&onStartTransitionFinish(currentTransition,returnValue),typeof returnValue=="object"&&returnValue!==null&&typeof returnValue.then=="function"&&(ReactSharedInternals.asyncTransitions++,returnValue.then(releaseAsyncTransition,releaseAsyncTransition),returnValue.then(noop,reportGlobalError))}catch(error2){reportGlobalError(error2)}finally{prevTransition===null&&currentTransition._updatedFibers&&(scope=currentTransition._updatedFibers.size,currentTransition._updatedFibers.clear(),10<scope&&console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.")),prevTransition!==null&&currentTransition.types!==null&&(prevTransition.types!==null&&prevTransition.types!==currentTransition.types&&console.error("We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React."),prevTransition.types=currentTransition.types),ReactSharedInternals.T=prevTransition}}function addTransitionType(type){var transition=ReactSharedInternals.T;if(transition!==null){var transitionTypes=transition.types;transitionTypes===null?transition.types=[type]:transitionTypes.indexOf(type)===-1&&transitionTypes.push(type)}else ReactSharedInternals.asyncTransitions===0&&console.error("addTransitionType can only be called inside a `startTransition()` callback. It must be associated with a specific Transition."),startTransition(addTransitionType.bind(null,type))}function enqueueTask(task){if(enqueueTaskImpl===null)try{var requireString=("require"+Math.random()).slice(0,7);enqueueTaskImpl=(module&&module[requireString]).call(module,"timers").setImmediate}catch{enqueueTaskImpl=function(callback){didWarnAboutMessageChannel===!1&&(didWarnAboutMessageChannel=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var channel2=new MessageChannel;channel2.port1.onmessage=callback,channel2.port2.postMessage(void 0)}}return enqueueTaskImpl(task)}function aggregateErrors(errors){return 1<errors.length&&typeof AggregateError=="function"?new AggregateError(errors):errors[0]}function popActScope(prevActQueue,prevActScopeDepth){prevActScopeDepth!==actScopeDepth-1&&console.error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "),actScopeDepth=prevActScopeDepth}function recursivelyFlushAsyncActWork(returnValue,resolve7,reject){var queue=ReactSharedInternals.actQueue;if(queue!==null)if(queue.length!==0)try{flushActQueue(queue),enqueueTask(function(){return recursivelyFlushAsyncActWork(returnValue,resolve7,reject)});return}catch(error2){ReactSharedInternals.thrownErrors.push(error2)}else ReactSharedInternals.actQueue=null;0<ReactSharedInternals.thrownErrors.length?(queue=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0,reject(queue)):resolve7(returnValue)}function flushActQueue(queue){if(!isFlushing){isFlushing=!0;var i10=0;try{for(;i10<queue.length;i10++){var callback=queue[i10];do{ReactSharedInternals.didUsePromise=!1;var continuation=callback(!1);if(continuation!==null){if(ReactSharedInternals.didUsePromise){queue[i10]=callback,queue.splice(0,i10);return}callback=continuation}else break}while(!0)}queue.length=0}catch(error2){queue.splice(0,i10+1),ReactSharedInternals.thrownErrors.push(error2)}finally{isFlushing=!1}}}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_CONSUMER_TYPE=Symbol.for("react.consumer"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_SUSPENSE_LIST_TYPE=Symbol.for("react.suspense_list"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),REACT_ACTIVITY_TYPE=Symbol.for("react.activity"),REACT_VIEW_TRANSITION_TYPE=Symbol.for("react.view_transition"),MAYBE_ITERATOR_SYMBOL=Symbol.iterator,didWarnStateUpdateForUnmountedComponent={},ReactNoopUpdateQueue={isMounted:function(){return!1},enqueueForceUpdate:function(publicInstance){warnNoop(publicInstance,"forceUpdate")},enqueueReplaceState:function(publicInstance){warnNoop(publicInstance,"replaceState")},enqueueSetState:function(publicInstance){warnNoop(publicInstance,"setState")}},assign=Object.assign,emptyObject={};Object.freeze(emptyObject),Component.prototype.isReactComponent={},Component.prototype.setState=function(partialState,callback){if(typeof partialState!="object"&&typeof partialState!="function"&&partialState!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,partialState,callback,"setState")},Component.prototype.forceUpdate=function(callback){this.updater.enqueueForceUpdate(this,callback,"forceUpdate")};var deprecatedAPIs={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]};for(fnName in deprecatedAPIs)deprecatedAPIs.hasOwnProperty(fnName)&&defineDeprecationWarning(fnName,deprecatedAPIs[fnName]);ComponentDummy.prototype=Component.prototype,deprecatedAPIs=PureComponent.prototype=new ComponentDummy,deprecatedAPIs.constructor=PureComponent,assign(deprecatedAPIs,Component.prototype),deprecatedAPIs.isPureReactComponent=!0;var isArrayImpl=Array.isArray,REACT_CLIENT_REFERENCE=Symbol.for("react.client.reference"),ReactSharedInternals={H:null,A:null,T:null,S:null,actQueue:null,asyncTransitions:0,isBatchingLegacy:!1,didScheduleLegacyUpdate:!1,didUsePromise:!1,thrownErrors:[],getCurrentStack:null,recentlyCreatedOwnerStacks:0},hasOwnProperty=Object.prototype.hasOwnProperty,createTask=console.createTask?console.createTask:function(){return null};deprecatedAPIs={react_stack_bottom_frame:function(callStackForError){return callStackForError()}};var specialPropKeyWarningShown,didWarnAboutOldJSXRuntime,didWarnAboutElementRef={},unknownOwnerDebugStack=deprecatedAPIs.react_stack_bottom_frame.bind(deprecatedAPIs,UnknownOwner)(),unknownOwnerDebugTask=createTask(getTaskName(UnknownOwner)),didWarnAboutMaps=!1,userProvidedKeyEscapeRegex=/\/+/g,reportGlobalError=typeof reportError=="function"?reportError:function(error2){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var event=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof error2=="object"&&error2!==null&&typeof error2.message=="string"?String(error2.message):String(error2),error:error2});if(!window.dispatchEvent(event))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",error2);return}console.error(error2)},didWarnAboutMessageChannel=!1,enqueueTaskImpl=null,actScopeDepth=0,didWarnNoAwaitAct=!1,isFlushing=!1,queueSeveralMicrotasks=typeof queueMicrotask=="function"?function(callback){queueMicrotask(function(){return queueMicrotask(callback)})}:enqueueTask;deprecatedAPIs=Object.freeze({__proto__:null,c:function(size3){return resolveDispatcher().useMemoCache(size3)}});var fnName={map:mapChildren,forEach:function(children,forEachFunc,forEachContext){mapChildren(children,function(){forEachFunc.apply(this,arguments)},forEachContext)},count:function(children){var n10=0;return mapChildren(children,function(){n10++}),n10},toArray:function(children){return mapChildren(children,function(child){return child})||[]},only:function(children){if(!isValidElement7(children))throw Error("React.Children.only expected to receive a single React element child.");return children}};exports.Activity=REACT_ACTIVITY_TYPE,exports.Children=fnName,exports.Component=Component,exports.Fragment=REACT_FRAGMENT_TYPE,exports.Profiler=REACT_PROFILER_TYPE,exports.PureComponent=PureComponent,exports.StrictMode=REACT_STRICT_MODE_TYPE,exports.Suspense=REACT_SUSPENSE_TYPE,exports.ViewTransition=REACT_VIEW_TRANSITION_TYPE,exports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=ReactSharedInternals,exports.__COMPILER_RUNTIME=deprecatedAPIs,exports.act=function(callback){var prevActQueue=ReactSharedInternals.actQueue,prevActScopeDepth=actScopeDepth;actScopeDepth++;var queue=ReactSharedInternals.actQueue=prevActQueue!==null?prevActQueue:[],didAwaitActCall=!1;try{var result=callback()}catch(error2){ReactSharedInternals.thrownErrors.push(error2)}if(0<ReactSharedInternals.thrownErrors.length)throw popActScope(prevActQueue,prevActScopeDepth),callback=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0,callback;if(result!==null&&typeof result=="object"&&typeof result.then=="function"){var thenable=result;return queueSeveralMicrotasks(function(){didAwaitActCall||didWarnNoAwaitAct||(didWarnNoAwaitAct=!0,console.error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(resolve7,reject){didAwaitActCall=!0,thenable.then(function(returnValue){if(popActScope(prevActQueue,prevActScopeDepth),prevActScopeDepth===0){try{flushActQueue(queue),enqueueTask(function(){return recursivelyFlushAsyncActWork(returnValue,resolve7,reject)})}catch(error$0){ReactSharedInternals.thrownErrors.push(error$0)}if(0<ReactSharedInternals.thrownErrors.length){var _thrownError=aggregateErrors(ReactSharedInternals.thrownErrors);ReactSharedInternals.thrownErrors.length=0,reject(_thrownError)}}else resolve7(returnValue)},function(error2){popActScope(prevActQueue,prevActScopeDepth),0<ReactSharedInternals.thrownErrors.length&&(error2=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0),reject(error2)})}}}var returnValue$jscomp$0=result;if(popActScope(prevActQueue,prevActScopeDepth),prevActScopeDepth===0&&(flushActQueue(queue),queue.length!==0&&queueSeveralMicrotasks(function(){didAwaitActCall||didWarnNoAwaitAct||(didWarnNoAwaitAct=!0,console.error("A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\n\nawait act(() => ...)"))}),ReactSharedInternals.actQueue=null),0<ReactSharedInternals.thrownErrors.length)throw callback=aggregateErrors(ReactSharedInternals.thrownErrors),ReactSharedInternals.thrownErrors.length=0,callback;return{then:function(resolve7,reject){didAwaitActCall=!0,prevActScopeDepth===0?(ReactSharedInternals.actQueue=queue,enqueueTask(function(){return recursivelyFlushAsyncActWork(returnValue$jscomp$0,resolve7,reject)})):resolve7(returnValue$jscomp$0)}}},exports.addTransitionType=addTransitionType,exports.cache=function(fn3){return function(){return fn3.apply(null,arguments)}},exports.cacheSignal=function(){return null},exports.captureOwnerStack=function(){var getCurrentStack=ReactSharedInternals.getCurrentStack;return getCurrentStack===null?null:getCurrentStack()},exports.cloneElement=function(element,config,children){if(element==null)throw Error("The argument must be a React element, but you passed "+element+".");var props=assign({},element.props),key=element.key,owner=element._owner;if(config!=null){var JSCompiler_inline_result;a:{if(hasOwnProperty.call(config,"ref")&&(JSCompiler_inline_result=Object.getOwnPropertyDescriptor(config,"ref").get)&&JSCompiler_inline_result.isReactWarning){JSCompiler_inline_result=!1;break a}JSCompiler_inline_result=config.ref!==void 0}JSCompiler_inline_result&&(owner=getOwner()),hasValidKey(config)&&(checkKeyStringCoercion(config.key),key=""+config.key);for(propName in config)!hasOwnProperty.call(config,propName)||propName==="key"||propName==="__self"||propName==="__source"||propName==="ref"&&config.ref===void 0||(props[propName]=config[propName])}var propName=arguments.length-2;if(propName===1)props.children=children;else if(1<propName){JSCompiler_inline_result=Array(propName);for(var i10=0;i10<propName;i10++)JSCompiler_inline_result[i10]=arguments[i10+2];props.children=JSCompiler_inline_result}for(props=ReactElement(element.type,key,props,owner,element._debugStack,element._debugTask),key=2;key<arguments.length;key++)validateChildKeys(arguments[key]);return props},exports.createContext=function(defaultValue){return defaultValue={$$typeof:REACT_CONTEXT_TYPE,_currentValue:defaultValue,_currentValue2:defaultValue,_threadCount:0,Provider:null,Consumer:null},defaultValue.Provider=defaultValue,defaultValue.Consumer={$$typeof:REACT_CONSUMER_TYPE,_context:defaultValue},defaultValue._currentRenderer=null,defaultValue._currentRenderer2=null,defaultValue},exports.createElement=function(type,config,children){for(var i10=2;i10<arguments.length;i10++)validateChildKeys(arguments[i10]);var propName;i10={};var key=null;if(config!=null)for(propName in didWarnAboutOldJSXRuntime||!("__self"in config)||"key"in config||(didWarnAboutOldJSXRuntime=!0,console.warn("Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: https://react.dev/link/new-jsx-transform")),hasValidKey(config)&&(checkKeyStringCoercion(config.key),key=""+config.key),config)hasOwnProperty.call(config,propName)&&propName!=="key"&&propName!=="__self"&&propName!=="__source"&&(i10[propName]=config[propName]);var childrenLength=arguments.length-2;if(childrenLength===1)i10.children=children;else if(1<childrenLength){for(var childArray=Array(childrenLength),_i3=0;_i3<childrenLength;_i3++)childArray[_i3]=arguments[_i3+2];Object.freeze&&Object.freeze(childArray),i10.children=childArray}if(type&&type.defaultProps)for(propName in childrenLength=type.defaultProps,childrenLength)i10[propName]===void 0&&(i10[propName]=childrenLength[propName]);return key&&defineKeyPropWarningGetter(i10,typeof type=="function"?type.displayName||type.name||"Unknown":type),(propName=1e4>ReactSharedInternals.recentlyCreatedOwnerStacks++)?(childArray=Error.stackTraceLimit,Error.stackTraceLimit=10,childrenLength=Error("react-stack-top-frame"),Error.stackTraceLimit=childArray):childrenLength=unknownOwnerDebugStack,ReactElement(type,key,i10,getOwner(),childrenLength,propName?createTask(getTaskName(type)):unknownOwnerDebugTask)},exports.createRef=function(){var refObject={current:null};return Object.seal(refObject),refObject},exports.forwardRef=function(render2){render2!=null&&render2.$$typeof===REACT_MEMO_TYPE?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof render2!="function"?console.error("forwardRef requires a render function but was given %s.",render2===null?"null":typeof render2):render2.length!==0&&render2.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",render2.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),render2!=null&&render2.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var elementType={$$typeof:REACT_FORWARD_REF_TYPE,render:render2},ownName;return Object.defineProperty(elementType,"displayName",{enumerable:!1,configurable:!0,get:function(){return ownName},set:function(name){ownName=name,render2.name||render2.displayName||(Object.defineProperty(render2,"name",{value:name}),render2.displayName=name)}}),elementType},exports.isValidElement=isValidElement7,exports.lazy=function(ctor){ctor={_status:-1,_result:ctor};var lazyType3={$$typeof:REACT_LAZY_TYPE,_payload:ctor,_init:lazyInitializer},ioInfo={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return ctor._ioInfo=ioInfo,lazyType3._debugInfo=[{awaited:ioInfo}],lazyType3},exports.memo=function(type,compare2){type==null&&console.error("memo: The first argument must be a component. Instead received: %s",type===null?"null":typeof type),compare2={$$typeof:REACT_MEMO_TYPE,type,compare:compare2===void 0?null:compare2};var ownName;return Object.defineProperty(compare2,"displayName",{enumerable:!1,configurable:!0,get:function(){return ownName},set:function(name){ownName=name,type.name||type.displayName||(Object.defineProperty(type,"name",{value:name}),type.displayName=name)}}),compare2},exports.startTransition=startTransition,exports.unstable_useCacheRefresh=function(){return resolveDispatcher().useCacheRefresh()},exports.use=function(usable){return resolveDispatcher().use(usable)},exports.useActionState=function(action,initialState,permalink){return resolveDispatcher().useActionState(action,initialState,permalink)},exports.useCallback=function(callback,deps){return resolveDispatcher().useCallback(callback,deps)},exports.useContext=function(Context){var dispatcher=resolveDispatcher();return Context.$$typeof===REACT_CONSUMER_TYPE&&console.error("Calling useContext(Context.Consumer) is not supported and will cause bugs. Did you mean to call useContext(Context) instead?"),dispatcher.useContext(Context)},exports.useDebugValue=function(value,formatterFn){return resolveDispatcher().useDebugValue(value,formatterFn)},exports.useDeferredValue=function(value,initialValue){return resolveDispatcher().useDeferredValue(value,initialValue)},exports.useEffect=function(create10,deps){return create10==null&&console.warn("React Hook useEffect requires an effect callback. Did you forget to pass a callback to the hook?"),resolveDispatcher().useEffect(create10,deps)},exports.useEffectEvent=function(callback){return resolveDispatcher().useEffectEvent(callback)},exports.useId=function(){return resolveDispatcher().useId()},exports.useImperativeHandle=function(ref,create10,deps){return resolveDispatcher().useImperativeHandle(ref,create10,deps)},exports.useInsertionEffect=function(create10,deps){return create10==null&&console.warn("React Hook useInsertionEffect requires an effect callback. Did you forget to pass a callback to the hook?"),resolveDispatcher().useInsertionEffect(create10,deps)},exports.useLayoutEffect=function(create10,deps){return create10==null&&console.warn("React Hook useLayoutEffect requires an effect callback. Did you forget to pass a callback to the hook?"),resolveDispatcher().useLayoutEffect(create10,deps)},exports.useMemo=function(create10,deps){return resolveDispatcher().useMemo(create10,deps)},exports.useOptimistic=function(passthrough,reducer){return resolveDispatcher().useOptimistic(passthrough,reducer)},exports.useReducer=function(reducer,initialArg,init){return resolveDispatcher().useReducer(reducer,initialArg,init)},exports.useRef=function(initialValue){return resolveDispatcher().useRef(initialValue)},exports.useState=function(initialState){return resolveDispatcher().useState(initialState)},exports.useSyncExternalStore=function(subscribe,getSnapshot,getServerSnapshot){return resolveDispatcher().useSyncExternalStore(subscribe,getSnapshot,getServerSnapshot)},exports.useTransition=function(){return resolveDispatcher().useTransition()},exports.version="19.3.0",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()}});var require_react=__commonJS({"node_modules/react/index.js"(exports,module){"use strict";module.exports=require_react_development()}});var util,objectUtil,ZodParsedType,getParsedType,init_util=__esm({"node_modules/zod/v3/helpers/util.js"(){"use strict";(function(util3){util3.assertEqual=_11=>{};function assertIs(_arg){}util3.assertIs=assertIs;function assertNever(_x4){throw new Error}util3.assertNever=assertNever,util3.arrayToEnum=items=>{let obj={};for(let item of items)obj[item]=item;return obj},util3.getValidEnumValues=obj=>{let validKeys=util3.objectKeys(obj).filter(k11=>typeof obj[obj[k11]]!="number"),filtered={};for(let k11 of validKeys)filtered[k11]=obj[k11];return util3.objectValues(filtered)},util3.objectValues=obj=>util3.objectKeys(obj).map(function(e55){return obj[e55]}),util3.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},util3.find=(arr,checker)=>{for(let item of arr)if(checker(item))return item},util3.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)}util3.joinValues=joinValues,util3.jsonStringifyReplacer=(_11,value)=>typeof value=="bigint"?value.toString():value})(util||(util={}));(function(objectUtil3){objectUtil3.mergeShapes=(first,second)=>({...first,...second})})(objectUtil||(objectUtil={}));ZodParsedType=util.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),getParsedType=data=>{switch(typeof data){case"undefined":return ZodParsedType.undefined;case"string":return ZodParsedType.string;case"number":return Number.isNaN(data)?ZodParsedType.nan:ZodParsedType.number;case"boolean":return ZodParsedType.boolean;case"function":return ZodParsedType.function;case"bigint":return ZodParsedType.bigint;case"symbol":return ZodParsedType.symbol;case"object":return Array.isArray(data)?ZodParsedType.array:data===null?ZodParsedType.null:data.then&&typeof data.then=="function"&&data.catch&&typeof data.catch=="function"?ZodParsedType.promise:typeof Map<"u"&&data instanceof Map?ZodParsedType.map:typeof Set<"u"&&data instanceof Set?ZodParsedType.set:typeof Date<"u"&&data instanceof Date?ZodParsedType.date:ZodParsedType.object;default:return ZodParsedType.unknown}}}});var ZodIssueCode,quotelessJson,ZodError,init_ZodError=__esm({"node_modules/zod/v3/ZodError.js"(){"use strict";init_util();ZodIssueCode=util.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"]),quotelessJson=obj=>JSON.stringify(obj,null,2).replace(/"([^"]+)":/g,"$1:"),ZodError=class _ZodError3 extends Error{get errors(){return this.issues}constructor(issues){super(),this.issues=[],this.addIssue=sub8=>{this.issues=[...this.issues,sub8]},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,i10=0;for(;i10<issue.path.length;){let el3=issue.path[i10];i10===issue.path.length-1?(curr[el3]=curr[el3]||{_errors:[]},curr[el3]._errors.push(mapper(issue))):curr[el3]=curr[el3]||{_errors:[]},curr=curr[el3],i10++}}};return processError(this),fieldErrors}static assert(value){if(!(value instanceof _ZodError3))throw new Error(`Not a ZodError: ${value}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,util.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(mapper=issue=>issue.message){let fieldErrors={},formErrors=[];for(let sub8 of this.issues)if(sub8.path.length>0){let firstEl=sub8.path[0];fieldErrors[firstEl]=fieldErrors[firstEl]||[],fieldErrors[firstEl].push(mapper(sub8))}else formErrors.push(mapper(sub8));return{formErrors,fieldErrors}}get formErrors(){return this.flatten()}};ZodError.create=issues=>new ZodError(issues)}});var errorMap,en_default,init_en=__esm({"node_modules/zod/v3/locales/en.js"(){"use strict";init_ZodError();init_util();errorMap=(issue,_ctx)=>{let message;switch(issue.code){case ZodIssueCode.invalid_type:issue.received===ZodParsedType.undefined?message="Required":message=`Expected ${issue.expected}, received ${issue.received}`;break;case ZodIssueCode.invalid_literal:message=`Invalid literal value, expected ${JSON.stringify(issue.expected,util.jsonStringifyReplacer)}`;break;case ZodIssueCode.unrecognized_keys:message=`Unrecognized key(s) in object: ${util.joinValues(issue.keys,", ")}`;break;case ZodIssueCode.invalid_union:message="Invalid input";break;case ZodIssueCode.invalid_union_discriminator:message=`Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;break;case ZodIssueCode.invalid_enum_value:message=`Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;break;case ZodIssueCode.invalid_arguments:message="Invalid function arguments";break;case ZodIssueCode.invalid_return_type:message="Invalid function return type";break;case ZodIssueCode.invalid_date:message="Invalid date";break;case ZodIssueCode.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}"`:util.assertNever(issue.validation):issue.validation!=="regex"?message=`Invalid ${issue.validation}`:message="Invalid";break;case ZodIssueCode.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 ZodIssueCode.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 ZodIssueCode.custom:message="Invalid input";break;case ZodIssueCode.invalid_intersection_types:message="Intersection results could not be merged";break;case ZodIssueCode.not_multiple_of:message=`Number must be a multiple of ${issue.multipleOf}`;break;case ZodIssueCode.not_finite:message="Number must be finite";break;default:message=_ctx.defaultError,util.assertNever(issue)}return{message}},en_default=errorMap}});function setErrorMap(map){overrideErrorMap=map}function getErrorMap(){return overrideErrorMap}var overrideErrorMap,init_errors=__esm({"node_modules/zod/v3/errors.js"(){"use strict";init_en();overrideErrorMap=en_default}});function addIssueToContext(ctx,issueData){let overrideMap=getErrorMap(),issue=makeIssue({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default?void 0:en_default].filter(x11=>!!x11)});ctx.common.issues.push(issue)}var makeIssue,EMPTY_PATH,ParseStatus,INVALID,DIRTY,OK,isAborted,isDirty,isValid,isAsync,init_parseUtil=__esm({"node_modules/zod/v3/helpers/parseUtil.js"(){"use strict";init_errors();init_en();makeIssue=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_PATH=[];ParseStatus=class _ParseStatus3{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 s11 of results){if(s11.status==="aborted")return INVALID;s11.status==="dirty"&&status.dirty(),arrayValue.push(s11.value)}return{status:status.value,value:arrayValue}}static async mergeObjectAsync(status,pairs5){let syncPairs=[];for(let pair of pairs5){let key=await pair.key,value=await pair.value;syncPairs.push({key,value})}return _ParseStatus3.mergeObjectSync(status,syncPairs)}static mergeObjectSync(status,pairs5){let finalObject={};for(let pair of pairs5){let{key,value}=pair;if(key.status==="aborted"||value.status==="aborted")return INVALID;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}}},INVALID=Object.freeze({status:"aborted"}),DIRTY=value=>({status:"dirty",value}),OK=value=>({status:"valid",value}),isAborted=x11=>x11.status==="aborted",isDirty=x11=>x11.status==="dirty",isValid=x11=>x11.status==="valid",isAsync=x11=>typeof Promise<"u"&&x11 instanceof Promise}});var init_typeAliases=__esm({"node_modules/zod/v3/helpers/typeAliases.js"(){"use strict"}});var errorUtil,init_errorUtil=__esm({"node_modules/zod/v3/helpers/errorUtil.js"(){"use strict";(function(errorUtil3){errorUtil3.errToObj=message=>typeof message=="string"?{message}:message||{},errorUtil3.toString=message=>typeof message=="string"?message:message?.message})(errorUtil||(errorUtil={}))}});function processCreateParams(params){if(!params)return{};let{errorMap:errorMap3,invalid_type_error,required_error,description}=params;if(errorMap3&&(invalid_type_error||required_error))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return errorMap3?{errorMap:errorMap3,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}}function timeRegexSource(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 timeRegex(args){return new RegExp(`^${timeRegexSource(args)}$`)}function datetimeRegex(args){let regex=`${dateRegexSource}T${timeRegexSource(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 isValidIP(ip4,version2){return!!((version2==="v4"||!version2)&&ipv4Regex.test(ip4)||(version2==="v6"||!version2)&&ipv6Regex.test(ip4))}function isValidJWT(jwt,alg){if(!jwtRegex.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 isValidCidr(ip4,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex.test(ip4)||(version2==="v6"||!version2)&&ipv6CidrRegex.test(ip4))}function floatSafeRemainder(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}function deepPartialify(schema){if(schema instanceof ZodObject){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional.create(deepPartialify(fieldSchema))}return new ZodObject({...schema._def,shape:()=>newShape})}else return schema instanceof ZodArray?new ZodArray({...schema._def,type:deepPartialify(schema.element)}):schema instanceof ZodOptional?ZodOptional.create(deepPartialify(schema.unwrap())):schema instanceof ZodNullable?ZodNullable.create(deepPartialify(schema.unwrap())):schema instanceof ZodTuple?ZodTuple.create(schema.items.map(item=>deepPartialify(item))):schema}function mergeValues(a10,b11){let aType=getParsedType(a10),bType=getParsedType(b11);if(a10===b11)return{valid:!0,data:a10};if(aType===ZodParsedType.object&&bType===ZodParsedType.object){let bKeys=util.objectKeys(b11),sharedKeys=util.objectKeys(a10).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a10,...b11};for(let key of sharedKeys){let sharedValue=mergeValues(a10[key],b11[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType.array&&bType===ZodParsedType.array){if(a10.length!==b11.length)return{valid:!1};let newArray=[];for(let index2=0;index2<a10.length;index2++){let itemA=a10[index2],itemB=b11[index2],sharedValue=mergeValues(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else return aType===ZodParsedType.date&&bType===ZodParsedType.date&&+a10==+b11?{valid:!0,data:a10}:{valid:!1}}function createZodEnum(values2,params){return new ZodEnum({values:values2,typeName:ZodFirstPartyTypeKind.ZodEnum,...processCreateParams(params)})}function cleanParams(params,data){let p11=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p11=="string"?{message:p11}:p11}function custom(check,_params={},fatal){return check?ZodAny.create().superRefine((data,ctx)=>{let r10=check(data);if(r10 instanceof Promise)return r10.then(r11=>{if(!r11){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r10){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}}):ZodAny.create()}var ParseInputLazyPath,handleResult,ZodType,cuidRegex,cuid2Regex,ulidRegex,uuidRegex,nanoidRegex,jwtRegex,durationRegex,emailRegex,_emojiRegex,emojiRegex,ipv4Regex,ipv4CidrRegex,ipv6Regex,ipv6CidrRegex,base64Regex,base64urlRegex,dateRegexSource,dateRegex,ZodString,ZodNumber,ZodBigInt,ZodBoolean,ZodDate,ZodSymbol,ZodUndefined,ZodNull,ZodAny,ZodUnknown,ZodNever,ZodVoid,ZodArray,ZodObject,ZodUnion,getDiscriminator,ZodDiscriminatedUnion,ZodIntersection,ZodTuple,ZodRecord,ZodMap,ZodSet,ZodFunction,ZodLazy,ZodLiteral,ZodEnum,ZodNativeEnum,ZodPromise,ZodEffects,ZodOptional,ZodNullable,ZodDefault,ZodCatch,ZodNaN,BRAND,ZodBranded,ZodPipeline,ZodReadonly,late,ZodFirstPartyTypeKind,instanceOfType,stringType,numberType,nanType,bigIntType,booleanType,dateType,symbolType,undefinedType,nullType,anyType,unknownType,neverType,voidType,arrayType,objectType,strictObjectType,unionType,discriminatedUnionType,intersectionType,tupleType,recordType,mapType,setType,functionType,lazyType,literalType,enumType,nativeEnumType,promiseType,effectsType,optionalType,nullableType,preprocessType,pipelineType,ostring,onumber,oboolean,coerce,NEVER,init_types=__esm({"node_modules/zod/v3/types.js"(){"use strict";init_ZodError();init_errors();init_errorUtil();init_parseUtil();init_util();ParseInputLazyPath=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}},handleResult=(ctx,result)=>{if(isValid(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 ZodError(ctx.common.issues);return this._error=error2,this._error}}};ZodType=class{get description(){return this._def.description}_getType(input2){return getParsedType(input2.data)}_getOrReturnCtx(input2,ctx){return ctx||{common:input2.parent.common,data:input2.data,parsedType:getParsedType(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}_processInputParams(input2){return{status:new ParseStatus,ctx:{common:input2.parent.common,data:input2.data,parsedType:getParsedType(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}}_parseSync(input2){let result=this._parse(input2);if(isAsync(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:getParsedType(data)},result=this._parseSync({data,path:ctx.path,parent:ctx});return handleResult(ctx,result)}"~validate"(data){let ctx={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)};if(!this["~standard"].async)try{let result=this._parseSync({data,path:[],parent:ctx});return isValid(result)?{value:result.value}:{issues:ctx.common.issues}}catch(err2){err2?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),ctx.common={issues:[],async:!0}}return this._parseAsync({data,path:[],parent:ctx}).then(result=>isValid(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:getParsedType(data)},maybeAsyncResult=this._parse({data,path:ctx.path,parent:ctx}),result=await(isAsync(maybeAsyncResult)?maybeAsyncResult:Promise.resolve(maybeAsyncResult));return handleResult(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:ZodIssueCode.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 ZodEffects({schema:this,typeName:ZodFirstPartyTypeKind.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 ZodOptional.create(this,this._def)}nullable(){return ZodNullable.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray.create(this)}promise(){return ZodPromise.create(this,this._def)}or(option){return ZodUnion.create([this,option],this._def)}and(incoming){return ZodIntersection.create(this,incoming,this._def)}transform(transform7){return new ZodEffects({...processCreateParams(this._def),schema:this,typeName:ZodFirstPartyTypeKind.ZodEffects,effect:{type:"transform",transform:transform7}})}default(def){let defaultValueFunc=typeof def=="function"?def:()=>def;return new ZodDefault({...processCreateParams(this._def),innerType:this,defaultValue:defaultValueFunc,typeName:ZodFirstPartyTypeKind.ZodDefault})}brand(){return new ZodBranded({typeName:ZodFirstPartyTypeKind.ZodBranded,type:this,...processCreateParams(this._def)})}catch(def){let catchValueFunc=typeof def=="function"?def:()=>def;return new ZodCatch({...processCreateParams(this._def),innerType:this,catchValue:catchValueFunc,typeName:ZodFirstPartyTypeKind.ZodCatch})}describe(description){let This=this.constructor;return new This({...this._def,description})}pipe(target){return ZodPipeline.create(this,target)}readonly(){return ZodReadonly.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},cuidRegex=/^c[^\s-]{8,}$/i,cuid2Regex=/^[0-9a-z]+$/,ulidRegex=/^[0-9A-HJKMNP-TV-Z]{26}$/i,uuidRegex=/^[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,nanoidRegex=/^[a-z0-9_-]{21}$/i,jwtRegex=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,durationRegex=/^[-+]?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)?)??$/,emailRegex=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,_emojiRegex="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",ipv4Regex=/^(?:(?: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])$/,ipv4CidrRegex=/^(?:(?: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])$/,ipv6Regex=/^(([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]))$/,ipv6CidrRegex=/^(([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])$/,base64Regex=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64urlRegex=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,dateRegexSource="((\\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])))",dateRegex=new RegExp(`^${dateRegexSource}$`);ZodString=class _ZodString3 extends ZodType{_parse(input2){if(this._def.coerce&&(input2.data=String(input2.data)),this._getType(input2)!==ZodParsedType.string){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.string,received:ctx2.parsedType}),INVALID}let status=new ParseStatus,ctx;for(let check of this._def.checks)if(check.kind==="min")input2.data.length<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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?addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}):tooSmall&&addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}),status.dirty())}else if(check.kind==="email")emailRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"email",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="emoji")emojiRegex||(emojiRegex=new RegExp(_emojiRegex,"u")),emojiRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"emoji",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="uuid")uuidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"uuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="nanoid")nanoidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"nanoid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid")cuidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"cuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid2")cuid2Regex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"cuid2",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="ulid")ulidRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"ulid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty());else if(check.kind==="url")try{new URL(input2.data)}catch{ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"url",code:ZodIssueCode.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),addIssueToContext(ctx,{validation:"regex",code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{startsWith:check.value},message:check.message}),status.dirty()):check.kind==="endsWith"?input2.data.endsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{endsWith:check.value},message:check.message}),status.dirty()):check.kind==="datetime"?datetimeRegex(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"datetime",message:check.message}),status.dirty()):check.kind==="date"?dateRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"date",message:check.message}),status.dirty()):check.kind==="time"?timeRegex(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"time",message:check.message}),status.dirty()):check.kind==="duration"?durationRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"duration",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="ip"?isValidIP(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"ip",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="jwt"?isValidJWT(input2.data,check.alg)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"jwt",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="cidr"?isValidCidr(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"cidr",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="base64"?base64Regex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"base64",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):check.kind==="base64url"?base64urlRegex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{validation:"base64url",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()):util.assertNever(check);return{status:status.value,value:input2.data}}_regex(regex,validation,message){return this.refinement(data=>regex.test(data),{validation,code:ZodIssueCode.invalid_string,...errorUtil.errToObj(message)})}_addCheck(check){return new _ZodString3({...this._def,checks:[...this._def.checks,check]})}email(message){return this._addCheck({kind:"email",...errorUtil.errToObj(message)})}url(message){return this._addCheck({kind:"url",...errorUtil.errToObj(message)})}emoji(message){return this._addCheck({kind:"emoji",...errorUtil.errToObj(message)})}uuid(message){return this._addCheck({kind:"uuid",...errorUtil.errToObj(message)})}nanoid(message){return this._addCheck({kind:"nanoid",...errorUtil.errToObj(message)})}cuid(message){return this._addCheck({kind:"cuid",...errorUtil.errToObj(message)})}cuid2(message){return this._addCheck({kind:"cuid2",...errorUtil.errToObj(message)})}ulid(message){return this._addCheck({kind:"ulid",...errorUtil.errToObj(message)})}base64(message){return this._addCheck({kind:"base64",...errorUtil.errToObj(message)})}base64url(message){return this._addCheck({kind:"base64url",...errorUtil.errToObj(message)})}jwt(options){return this._addCheck({kind:"jwt",...errorUtil.errToObj(options)})}ip(options){return this._addCheck({kind:"ip",...errorUtil.errToObj(options)})}cidr(options){return this._addCheck({kind:"cidr",...errorUtil.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,...errorUtil.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,...errorUtil.errToObj(options?.message)})}duration(message){return this._addCheck({kind:"duration",...errorUtil.errToObj(message)})}regex(regex,message){return this._addCheck({kind:"regex",regex,...errorUtil.errToObj(message)})}includes(value,options){return this._addCheck({kind:"includes",value,position:options?.position,...errorUtil.errToObj(options?.message)})}startsWith(value,message){return this._addCheck({kind:"startsWith",value,...errorUtil.errToObj(message)})}endsWith(value,message){return this._addCheck({kind:"endsWith",value,...errorUtil.errToObj(message)})}min(minLength,message){return this._addCheck({kind:"min",value:minLength,...errorUtil.errToObj(message)})}max(maxLength,message){return this._addCheck({kind:"max",value:maxLength,...errorUtil.errToObj(message)})}length(len6,message){return this._addCheck({kind:"length",value:len6,...errorUtil.errToObj(message)})}nonempty(message){return this.min(1,errorUtil.errToObj(message))}trim(){return new _ZodString3({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new _ZodString3({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new _ZodString3({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(ch4=>ch4.kind==="datetime")}get isDate(){return!!this._def.checks.find(ch4=>ch4.kind==="date")}get isTime(){return!!this._def.checks.find(ch4=>ch4.kind==="time")}get isDuration(){return!!this._def.checks.find(ch4=>ch4.kind==="duration")}get isEmail(){return!!this._def.checks.find(ch4=>ch4.kind==="email")}get isURL(){return!!this._def.checks.find(ch4=>ch4.kind==="url")}get isEmoji(){return!!this._def.checks.find(ch4=>ch4.kind==="emoji")}get isUUID(){return!!this._def.checks.find(ch4=>ch4.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(ch4=>ch4.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(ch4=>ch4.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(ch4=>ch4.kind==="cuid2")}get isULID(){return!!this._def.checks.find(ch4=>ch4.kind==="ulid")}get isIP(){return!!this._def.checks.find(ch4=>ch4.kind==="ip")}get isCIDR(){return!!this._def.checks.find(ch4=>ch4.kind==="cidr")}get isBase64(){return!!this._def.checks.find(ch4=>ch4.kind==="base64")}get isBase64url(){return!!this._def.checks.find(ch4=>ch4.kind==="base64url")}get minLength(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4}get maxLength(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5}};ZodString.create=params=>new ZodString({checks:[],typeName:ZodFirstPartyTypeKind.ZodString,coerce:params?.coerce??!1,...processCreateParams(params)});ZodNumber=class _ZodNumber3 extends ZodType{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)!==ZodParsedType.number){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.number,received:ctx2.parsedType}),INVALID}let ctx,status=new ParseStatus;for(let check of this._def.checks)check.kind==="int"?util.isInteger(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="multipleOf"?floatSafeRemainder(input2.data,check.value)!==0&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):check.kind==="finite"?Number.isFinite(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_finite,message:check.message}),status.dirty()):util.assertNever(check);return{status:status.value,value:input2.data}}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodNumber3({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new _ZodNumber3({...this._def,checks:[...this._def.checks,check]})}int(message){return this._addCheck({kind:"int",message:errorUtil.toString(message)})}positive(message){return this._addCheck({kind:"min",value:0,inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:0,inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:0,inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:0,inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}finite(message){return this._addCheck({kind:"finite",message:errorUtil.toString(message)})}safe(message){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:errorUtil.toString(message)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:errorUtil.toString(message)})}get minValue(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4}get maxValue(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5}get isInt(){return!!this._def.checks.find(ch4=>ch4.kind==="int"||ch4.kind==="multipleOf"&&util.isInteger(ch4.value))}get isFinite(){let max5=null,min4=null;for(let ch4 of this._def.checks){if(ch4.kind==="finite"||ch4.kind==="int"||ch4.kind==="multipleOf")return!0;ch4.kind==="min"?(min4===null||ch4.value>min4)&&(min4=ch4.value):ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value)}return Number.isFinite(min4)&&Number.isFinite(max5)}};ZodNumber.create=params=>new ZodNumber({checks:[],typeName:ZodFirstPartyTypeKind.ZodNumber,coerce:params?.coerce||!1,...processCreateParams(params)});ZodBigInt=class _ZodBigInt3 extends ZodType{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)!==ZodParsedType.bigint)return this._getInvalidInput(input2);let ctx,status=new ParseStatus;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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):util.assertNever(check);return{status:status.value,value:input2.data}}_getInvalidInput(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.bigint,received:ctx.parsedType}),INVALID}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodBigInt3({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new _ZodBigInt3({...this._def,checks:[...this._def.checks,check]})}positive(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}get minValue(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4}get maxValue(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5}};ZodBigInt.create=params=>new ZodBigInt({checks:[],typeName:ZodFirstPartyTypeKind.ZodBigInt,coerce:params?.coerce??!1,...processCreateParams(params)});ZodBoolean=class extends ZodType{_parse(input2){if(this._def.coerce&&(input2.data=!!input2.data),this._getType(input2)!==ZodParsedType.boolean){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.boolean,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodBoolean.create=params=>new ZodBoolean({typeName:ZodFirstPartyTypeKind.ZodBoolean,coerce:params?.coerce||!1,...processCreateParams(params)});ZodDate=class _ZodDate3 extends ZodType{_parse(input2){if(this._def.coerce&&(input2.data=new Date(input2.data)),this._getType(input2)!==ZodParsedType.date){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.date,received:ctx2.parsedType}),INVALID}if(Number.isNaN(input2.data.getTime())){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_date}),INVALID}let status=new ParseStatus,ctx;for(let check of this._def.checks)check.kind==="min"?input2.data.getTime()<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext(ctx,{code:ZodIssueCode.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),addIssueToContext(ctx,{code:ZodIssueCode.too_big,message:check.message,inclusive:!0,exact:!1,maximum:check.value,type:"date"}),status.dirty()):util.assertNever(check);return{status:status.value,value:new Date(input2.data.getTime())}}_addCheck(check){return new _ZodDate3({...this._def,checks:[...this._def.checks,check]})}min(minDate,message){return this._addCheck({kind:"min",value:minDate.getTime(),message:errorUtil.toString(message)})}max(maxDate,message){return this._addCheck({kind:"max",value:maxDate.getTime(),message:errorUtil.toString(message)})}get minDate(){let min4=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min4===null||ch4.value>min4)&&(min4=ch4.value);return min4!=null?new Date(min4):null}get maxDate(){let max5=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max5===null||ch4.value<max5)&&(max5=ch4.value);return max5!=null?new Date(max5):null}};ZodDate.create=params=>new ZodDate({checks:[],coerce:params?.coerce||!1,typeName:ZodFirstPartyTypeKind.ZodDate,...processCreateParams(params)});ZodSymbol=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.symbol){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.symbol,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodSymbol.create=params=>new ZodSymbol({typeName:ZodFirstPartyTypeKind.ZodSymbol,...processCreateParams(params)});ZodUndefined=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.undefined,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodUndefined.create=params=>new ZodUndefined({typeName:ZodFirstPartyTypeKind.ZodUndefined,...processCreateParams(params)});ZodNull=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.null){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.null,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodNull.create=params=>new ZodNull({typeName:ZodFirstPartyTypeKind.ZodNull,...processCreateParams(params)});ZodAny=class extends ZodType{constructor(){super(...arguments),this._any=!0}_parse(input2){return OK(input2.data)}};ZodAny.create=params=>new ZodAny({typeName:ZodFirstPartyTypeKind.ZodAny,...processCreateParams(params)});ZodUnknown=class extends ZodType{constructor(){super(...arguments),this._unknown=!0}_parse(input2){return OK(input2.data)}};ZodUnknown.create=params=>new ZodUnknown({typeName:ZodFirstPartyTypeKind.ZodUnknown,...processCreateParams(params)});ZodNever=class extends ZodType{_parse(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.never,received:ctx.parsedType}),INVALID}};ZodNever.create=params=>new ZodNever({typeName:ZodFirstPartyTypeKind.ZodNever,...processCreateParams(params)});ZodVoid=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.void,received:ctx.parsedType}),INVALID}return OK(input2.data)}};ZodVoid.create=params=>new ZodVoid({typeName:ZodFirstPartyTypeKind.ZodVoid,...processCreateParams(params)});ZodArray=class _ZodArray3 extends ZodType{_parse(input2){let{ctx,status}=this._processInputParams(input2),def=this._def;if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(def.exactLength!==null){let tooBig=ctx.data.length>def.exactLength.value,tooSmall=ctx.data.length<def.exactLength.value;(tooBig||tooSmall)&&(addIssueToContext(ctx,{code:tooBig?ZodIssueCode.too_big:ZodIssueCode.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&&(addIssueToContext(ctx,{code:ZodIssueCode.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&&(addIssueToContext(ctx,{code:ZodIssueCode.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,i10)=>def.type._parseAsync(new ParseInputLazyPath(ctx,item,ctx.path,i10)))).then(result2=>ParseStatus.mergeArray(status,result2));let result=[...ctx.data].map((item,i10)=>def.type._parseSync(new ParseInputLazyPath(ctx,item,ctx.path,i10)));return ParseStatus.mergeArray(status,result)}get element(){return this._def.type}min(minLength,message){return new _ZodArray3({...this._def,minLength:{value:minLength,message:errorUtil.toString(message)}})}max(maxLength,message){return new _ZodArray3({...this._def,maxLength:{value:maxLength,message:errorUtil.toString(message)}})}length(len6,message){return new _ZodArray3({...this._def,exactLength:{value:len6,message:errorUtil.toString(message)}})}nonempty(message){return this.min(1,message)}};ZodArray.create=(schema,params)=>new ZodArray({type:schema,minLength:null,maxLength:null,exactLength:null,typeName:ZodFirstPartyTypeKind.ZodArray,...processCreateParams(params)});ZodObject=class _ZodObject3 extends ZodType{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let shape21=this._def.shape(),keys=util.objectKeys(shape21);return this._cached={shape:shape21,keys},this._cached}_parse(input2){if(this._getType(input2)!==ZodParsedType.object){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx2.parsedType}),INVALID}let{status,ctx}=this._processInputParams(input2),{shape:shape21,keys:shapeKeys}=this._getCached(),extraKeys=[];if(!(this._def.catchall instanceof ZodNever&&this._def.unknownKeys==="strip"))for(let key in ctx.data)shapeKeys.includes(key)||extraKeys.push(key);let pairs5=[];for(let key of shapeKeys){let keyValidator=shape21[key],value=ctx.data[key];pairs5.push({key:{status:"valid",value:key},value:keyValidator._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}if(this._def.catchall instanceof ZodNever){let unknownKeys=this._def.unknownKeys;if(unknownKeys==="passthrough")for(let key of extraKeys)pairs5.push({key:{status:"valid",value:key},value:{status:"valid",value:ctx.data[key]}});else if(unknownKeys==="strict")extraKeys.length>0&&(addIssueToContext(ctx,{code:ZodIssueCode.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];pairs5.push({key:{status:"valid",value:key},value:catchall._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}}return ctx.common.async?Promise.resolve().then(async()=>{let syncPairs=[];for(let pair of pairs5){let key=await pair.key,value=await pair.value;syncPairs.push({key,value,alwaysSet:pair.alwaysSet})}return syncPairs}).then(syncPairs=>ParseStatus.mergeObjectSync(status,syncPairs)):ParseStatus.mergeObjectSync(status,pairs5)}get shape(){return this._def.shape()}strict(message){return errorUtil.errToObj,new _ZodObject3({...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:errorUtil.errToObj(message).message??defaultError}:{message:defaultError}}}:{}})}strip(){return new _ZodObject3({...this._def,unknownKeys:"strip"})}passthrough(){return new _ZodObject3({...this._def,unknownKeys:"passthrough"})}extend(augmentation){return new _ZodObject3({...this._def,shape:()=>({...this._def.shape(),...augmentation})})}merge(merging){return new _ZodObject3({unknownKeys:merging._def.unknownKeys,catchall:merging._def.catchall,shape:()=>({...this._def.shape(),...merging._def.shape()}),typeName:ZodFirstPartyTypeKind.ZodObject})}setKey(key,schema){return this.augment({[key]:schema})}catchall(index2){return new _ZodObject3({...this._def,catchall:index2})}pick(mask){let shape21={};for(let key of util.objectKeys(mask))mask[key]&&this.shape[key]&&(shape21[key]=this.shape[key]);return new _ZodObject3({...this._def,shape:()=>shape21})}omit(mask){let shape21={};for(let key of util.objectKeys(this.shape))mask[key]||(shape21[key]=this.shape[key]);return new _ZodObject3({...this._def,shape:()=>shape21})}deepPartial(){return deepPartialify(this)}partial(mask){let newShape={};for(let key of util.objectKeys(this.shape)){let fieldSchema=this.shape[key];mask&&!mask[key]?newShape[key]=fieldSchema:newShape[key]=fieldSchema.optional()}return new _ZodObject3({...this._def,shape:()=>newShape})}required(mask){let newShape={};for(let key of util.objectKeys(this.shape))if(mask&&!mask[key])newShape[key]=this.shape[key];else{let newField=this.shape[key];for(;newField instanceof ZodOptional;)newField=newField._def.innerType;newShape[key]=newField}return new _ZodObject3({...this._def,shape:()=>newShape})}keyof(){return createZodEnum(util.objectKeys(this.shape))}};ZodObject.create=(shape21,params)=>new ZodObject({shape:()=>shape21,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)});ZodObject.strictCreate=(shape21,params)=>new ZodObject({shape:()=>shape21,unknownKeys:"strict",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)});ZodObject.lazycreate=(shape21,params)=>new ZodObject({shape:shape21,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)});ZodUnion=class extends ZodType{_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 ZodError(result.ctx.common.issues));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}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 ZodError(issues2));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}}get options(){return this._def.options}};ZodUnion.create=(types,params)=>new ZodUnion({options:types,typeName:ZodFirstPartyTypeKind.ZodUnion,...processCreateParams(params)});getDiscriminator=type=>type instanceof ZodLazy?getDiscriminator(type.schema):type instanceof ZodEffects?getDiscriminator(type.innerType()):type instanceof ZodLiteral?[type.value]:type instanceof ZodEnum?type.options:type instanceof ZodNativeEnum?util.objectValues(type.enum):type instanceof ZodDefault?getDiscriminator(type._def.innerType):type instanceof ZodUndefined?[void 0]:type instanceof ZodNull?[null]:type instanceof ZodOptional?[void 0,...getDiscriminator(type.unwrap())]:type instanceof ZodNullable?[null,...getDiscriminator(type.unwrap())]:type instanceof ZodBranded||type instanceof ZodReadonly?getDiscriminator(type.unwrap()):type instanceof ZodCatch?getDiscriminator(type._def.innerType):[],ZodDiscriminatedUnion=class _ZodDiscriminatedUnion3 extends ZodType{_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;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}):(addIssueToContext(ctx,{code:ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[discriminator]}),INVALID)}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=getDiscriminator(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 _ZodDiscriminatedUnion3({typeName:ZodFirstPartyTypeKind.ZodDiscriminatedUnion,discriminator,options,optionsMap,...processCreateParams(params)})}};ZodIntersection=class extends ZodType{_parse(input2){let{status,ctx}=this._processInputParams(input2),handleParsed=(parsedLeft,parsedRight)=>{if(isAborted(parsedLeft)||isAborted(parsedRight))return INVALID;let merged=mergeValues(parsedLeft.value,parsedRight.value);return merged.valid?((isDirty(parsedLeft)||isDirty(parsedRight))&&status.dirty(),{status:status.value,value:merged.data}):(addIssueToContext(ctx,{code:ZodIssueCode.invalid_intersection_types}),INVALID)};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}))}};ZodIntersection.create=(left,right,params)=>new ZodIntersection({left,right,typeName:ZodFirstPartyTypeKind.ZodIntersection,...processCreateParams(params)});ZodTuple=class _ZodTuple3 extends ZodType{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(ctx.data.length<this._def.items.length)return addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),INVALID;!this._def.rest&&ctx.data.length>this._def.items.length&&(addIssueToContext(ctx,{code:ZodIssueCode.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 ParseInputLazyPath(ctx,item,ctx.path,itemIndex)):null}).filter(x11=>!!x11);return ctx.common.async?Promise.all(items).then(results=>ParseStatus.mergeArray(status,results)):ParseStatus.mergeArray(status,items)}get items(){return this._def.items}rest(rest){return new _ZodTuple3({...this._def,rest})}};ZodTuple.create=(schemas,params)=>{if(!Array.isArray(schemas))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ZodTuple({items:schemas,typeName:ZodFirstPartyTypeKind.ZodTuple,rest:null,...processCreateParams(params)})};ZodRecord=class _ZodRecord3 extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;let pairs5=[],keyType=this._def.keyType,valueType=this._def.valueType;for(let key in ctx.data)pairs5.push({key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,key)),value:valueType._parse(new ParseInputLazyPath(ctx,ctx.data[key],ctx.path,key)),alwaysSet:key in ctx.data});return ctx.common.async?ParseStatus.mergeObjectAsync(status,pairs5):ParseStatus.mergeObjectSync(status,pairs5)}get element(){return this._def.valueType}static create(first,second,third){return second instanceof ZodType?new _ZodRecord3({keyType:first,valueType:second,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(third)}):new _ZodRecord3({keyType:ZodString.create(),valueType:first,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(second)})}},ZodMap=class extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.map)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.map,received:ctx.parsedType}),INVALID;let keyType=this._def.keyType,valueType=this._def.valueType,pairs5=[...ctx.data.entries()].map(([key,value],index2)=>({key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,[index2,"key"])),value:valueType._parse(new ParseInputLazyPath(ctx,value,ctx.path,[index2,"value"]))}));if(ctx.common.async){let finalMap=new Map;return Promise.resolve().then(async()=>{for(let pair of pairs5){let key=await pair.key,value=await pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID;(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 pairs5){let key=pair.key,value=pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}}}};ZodMap.create=(keyType,valueType,params)=>new ZodMap({valueType,keyType,typeName:ZodFirstPartyTypeKind.ZodMap,...processCreateParams(params)});ZodSet=class _ZodSet3 extends ZodType{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.set)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.set,received:ctx.parsedType}),INVALID;let def=this._def;def.minSize!==null&&ctx.data.size<def.minSize.value&&(addIssueToContext(ctx,{code:ZodIssueCode.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&&(addIssueToContext(ctx,{code:ZodIssueCode.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 INVALID;element.status==="dirty"&&status.dirty(),parsedSet.add(element.value)}return{status:status.value,value:parsedSet}}let elements=[...ctx.data.values()].map((item,i10)=>valueType._parse(new ParseInputLazyPath(ctx,item,ctx.path,i10)));return ctx.common.async?Promise.all(elements).then(elements2=>finalizeSet(elements2)):finalizeSet(elements)}min(minSize,message){return new _ZodSet3({...this._def,minSize:{value:minSize,message:errorUtil.toString(message)}})}max(maxSize,message){return new _ZodSet3({...this._def,maxSize:{value:maxSize,message:errorUtil.toString(message)}})}size(size3,message){return this.min(size3,message).max(size3,message)}nonempty(message){return this.min(1,message)}};ZodSet.create=(valueType,params)=>new ZodSet({valueType,minSize:null,maxSize:null,typeName:ZodFirstPartyTypeKind.ZodSet,...processCreateParams(params)});ZodFunction=class _ZodFunction3 extends ZodType{constructor(){super(...arguments),this.validate=this.implement}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.function)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.function,received:ctx.parsedType}),INVALID;function makeArgsIssue(args,error2){return makeIssue({data:args,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter(x11=>!!x11),issueData:{code:ZodIssueCode.invalid_arguments,argumentsError:error2}})}function makeReturnsIssue(returns,error2){return makeIssue({data:returns,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter(x11=>!!x11),issueData:{code:ZodIssueCode.invalid_return_type,returnTypeError:error2}})}let params={errorMap:ctx.common.contextualErrorMap},fn3=ctx.data;if(this._def.returns instanceof ZodPromise){let me4=this;return OK(async function(...args){let error2=new ZodError([]),parsedArgs=await me4._def.args.parseAsync(args,params).catch(e55=>{throw error2.addIssue(makeArgsIssue(args,e55)),error2}),result=await Reflect.apply(fn3,this,parsedArgs);return await me4._def.returns._def.type.parseAsync(result,params).catch(e55=>{throw error2.addIssue(makeReturnsIssue(result,e55)),error2})})}else{let me4=this;return OK(function(...args){let parsedArgs=me4._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError([makeArgsIssue(args,parsedArgs.error)]);let result=Reflect.apply(fn3,this,parsedArgs.data),parsedReturns=me4._def.returns.safeParse(result,params);if(!parsedReturns.success)throw new ZodError([makeReturnsIssue(result,parsedReturns.error)]);return parsedReturns.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...items){return new _ZodFunction3({...this._def,args:ZodTuple.create(items).rest(ZodUnknown.create())})}returns(returnType){return new _ZodFunction3({...this._def,returns:returnType})}implement(func){return this.parse(func)}strictImplement(func){return this.parse(func)}static create(args,returns,params){return new _ZodFunction3({args:args||ZodTuple.create([]).rest(ZodUnknown.create()),returns:returns||ZodUnknown.create(),typeName:ZodFirstPartyTypeKind.ZodFunction,...processCreateParams(params)})}},ZodLazy=class extends ZodType{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})}};ZodLazy.create=(getter,params)=>new ZodLazy({getter,typeName:ZodFirstPartyTypeKind.ZodLazy,...processCreateParams(params)});ZodLiteral=class extends ZodType{_parse(input2){if(input2.data!==this._def.value){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_literal,expected:this._def.value}),INVALID}return{status:"valid",value:input2.data}}get value(){return this._def.value}};ZodLiteral.create=(value,params)=>new ZodLiteral({value,typeName:ZodFirstPartyTypeKind.ZodLiteral,...processCreateParams(params)});ZodEnum=class _ZodEnum3 extends ZodType{_parse(input2){if(typeof input2.data!="string"){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}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 addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(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(values2,newDef=this._def){return _ZodEnum3.create(values2,{...this._def,...newDef})}exclude(values2,newDef=this._def){return _ZodEnum3.create(this.options.filter(opt2=>!values2.includes(opt2)),{...this._def,...newDef})}};ZodEnum.create=createZodEnum;ZodNativeEnum=class extends ZodType{_parse(input2){let nativeEnumValues=util.getValidEnumValues(this._def.values),ctx=this._getOrReturnCtx(input2);if(ctx.parsedType!==ZodParsedType.string&&ctx.parsedType!==ZodParsedType.number){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}if(this._cache||(this._cache=new Set(util.getValidEnumValues(this._def.values))),!this._cache.has(input2.data)){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(input2.data)}get enum(){return this._def.values}};ZodNativeEnum.create=(values2,params)=>new ZodNativeEnum({values:values2,typeName:ZodFirstPartyTypeKind.ZodNativeEnum,...processCreateParams(params)});ZodPromise=class extends ZodType{unwrap(){return this._def.type}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType.promise&&ctx.common.async===!1)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.promise,received:ctx.parsedType}),INVALID;let promisified=ctx.parsedType===ZodParsedType.promise?ctx.data:Promise.resolve(ctx.data);return OK(promisified.then(data=>this._def.type.parseAsync(data,{path:ctx.path,errorMap:ctx.common.contextualErrorMap})))}};ZodPromise.create=(schema,params)=>new ZodPromise({type:schema,typeName:ZodFirstPartyTypeKind.ZodPromise,...processCreateParams(params)});ZodEffects=class extends ZodType{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ZodFirstPartyTypeKind.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(input2){let{status,ctx}=this._processInputParams(input2),effect=this._def.effect||null,checkCtx={addIssue:arg=>{addIssueToContext(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 INVALID;let result=await this._def.schema._parseAsync({data:processed2,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID:result.status==="dirty"?DIRTY(result.value):status.value==="dirty"?DIRTY(result.value):result});{if(status.value==="aborted")return INVALID;let result=this._def.schema._parseSync({data:processed,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID:result.status==="dirty"?DIRTY(result.value):status.value==="dirty"?DIRTY(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"?INVALID:(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"?INVALID:(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(!isValid(base))return INVALID;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=>isValid(base)?Promise.resolve(effect.transform(base.value,checkCtx)).then(result=>({status:status.value,value:result})):INVALID);util.assertNever(effect)}};ZodEffects.create=(schema,effect,params)=>new ZodEffects({schema,typeName:ZodFirstPartyTypeKind.ZodEffects,effect,...processCreateParams(params)});ZodEffects.createWithPreprocess=(preprocess,schema,params)=>new ZodEffects({schema,effect:{type:"preprocess",transform:preprocess},typeName:ZodFirstPartyTypeKind.ZodEffects,...processCreateParams(params)});ZodOptional=class extends ZodType{_parse(input2){return this._getType(input2)===ZodParsedType.undefined?OK(void 0):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodOptional.create=(type,params)=>new ZodOptional({innerType:type,typeName:ZodFirstPartyTypeKind.ZodOptional,...processCreateParams(params)});ZodNullable=class extends ZodType{_parse(input2){return this._getType(input2)===ZodParsedType.null?OK(null):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodNullable.create=(type,params)=>new ZodNullable({innerType:type,typeName:ZodFirstPartyTypeKind.ZodNullable,...processCreateParams(params)});ZodDefault=class extends ZodType{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return ctx.parsedType===ZodParsedType.undefined&&(data=this._def.defaultValue()),this._def.innerType._parse({data,path:ctx.path,parent:ctx})}removeDefault(){return this._def.innerType}};ZodDefault.create=(type,params)=>new ZodDefault({innerType:type,typeName:ZodFirstPartyTypeKind.ZodDefault,defaultValue:typeof params.default=="function"?params.default:()=>params.default,...processCreateParams(params)});ZodCatch=class extends ZodType{_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 isAsync(result)?result.then(result2=>({status:"valid",value:result2.status==="valid"?result2.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})})):{status:"valid",value:result.status==="valid"?result.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})}}removeCatch(){return this._def.innerType}};ZodCatch.create=(type,params)=>new ZodCatch({innerType:type,typeName:ZodFirstPartyTypeKind.ZodCatch,catchValue:typeof params.catch=="function"?params.catch:()=>params.catch,...processCreateParams(params)});ZodNaN=class extends ZodType{_parse(input2){if(this._getType(input2)!==ZodParsedType.nan){let ctx=this._getOrReturnCtx(input2);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.nan,received:ctx.parsedType}),INVALID}return{status:"valid",value:input2.data}}};ZodNaN.create=params=>new ZodNaN({typeName:ZodFirstPartyTypeKind.ZodNaN,...processCreateParams(params)});BRAND=Symbol("zod_brand"),ZodBranded=class extends ZodType{_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}},ZodPipeline=class _ZodPipeline3 extends ZodType{_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"?INVALID:inResult.status==="dirty"?(status.dirty(),DIRTY(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"?INVALID:inResult.status==="dirty"?(status.dirty(),{status:"dirty",value:inResult.value}):this._def.out._parseSync({data:inResult.value,path:ctx.path,parent:ctx})}}static create(a10,b11){return new _ZodPipeline3({in:a10,out:b11,typeName:ZodFirstPartyTypeKind.ZodPipeline})}},ZodReadonly=class extends ZodType{_parse(input2){let result=this._def.innerType._parse(input2),freeze=data=>(isValid(data)&&(data.value=Object.freeze(data.value)),data);return isAsync(result)?result.then(data=>freeze(data)):freeze(result)}unwrap(){return this._def.innerType}};ZodReadonly.create=(type,params)=>new ZodReadonly({innerType:type,typeName:ZodFirstPartyTypeKind.ZodReadonly,...processCreateParams(params)});late={object:ZodObject.lazycreate};(function(ZodFirstPartyTypeKind3){ZodFirstPartyTypeKind3.ZodString="ZodString",ZodFirstPartyTypeKind3.ZodNumber="ZodNumber",ZodFirstPartyTypeKind3.ZodNaN="ZodNaN",ZodFirstPartyTypeKind3.ZodBigInt="ZodBigInt",ZodFirstPartyTypeKind3.ZodBoolean="ZodBoolean",ZodFirstPartyTypeKind3.ZodDate="ZodDate",ZodFirstPartyTypeKind3.ZodSymbol="ZodSymbol",ZodFirstPartyTypeKind3.ZodUndefined="ZodUndefined",ZodFirstPartyTypeKind3.ZodNull="ZodNull",ZodFirstPartyTypeKind3.ZodAny="ZodAny",ZodFirstPartyTypeKind3.ZodUnknown="ZodUnknown",ZodFirstPartyTypeKind3.ZodNever="ZodNever",ZodFirstPartyTypeKind3.ZodVoid="ZodVoid",ZodFirstPartyTypeKind3.ZodArray="ZodArray",ZodFirstPartyTypeKind3.ZodObject="ZodObject",ZodFirstPartyTypeKind3.ZodUnion="ZodUnion",ZodFirstPartyTypeKind3.ZodDiscriminatedUnion="ZodDiscriminatedUnion",ZodFirstPartyTypeKind3.ZodIntersection="ZodIntersection",ZodFirstPartyTypeKind3.ZodTuple="ZodTuple",ZodFirstPartyTypeKind3.ZodRecord="ZodRecord",ZodFirstPartyTypeKind3.ZodMap="ZodMap",ZodFirstPartyTypeKind3.ZodSet="ZodSet",ZodFirstPartyTypeKind3.ZodFunction="ZodFunction",ZodFirstPartyTypeKind3.ZodLazy="ZodLazy",ZodFirstPartyTypeKind3.ZodLiteral="ZodLiteral",ZodFirstPartyTypeKind3.ZodEnum="ZodEnum",ZodFirstPartyTypeKind3.ZodEffects="ZodEffects",ZodFirstPartyTypeKind3.ZodNativeEnum="ZodNativeEnum",ZodFirstPartyTypeKind3.ZodOptional="ZodOptional",ZodFirstPartyTypeKind3.ZodNullable="ZodNullable",ZodFirstPartyTypeKind3.ZodDefault="ZodDefault",ZodFirstPartyTypeKind3.ZodCatch="ZodCatch",ZodFirstPartyTypeKind3.ZodPromise="ZodPromise",ZodFirstPartyTypeKind3.ZodBranded="ZodBranded",ZodFirstPartyTypeKind3.ZodPipeline="ZodPipeline",ZodFirstPartyTypeKind3.ZodReadonly="ZodReadonly"})(ZodFirstPartyTypeKind||(ZodFirstPartyTypeKind={}));instanceOfType=(cls,params={message:`Input not instance of ${cls.name}`})=>custom(data=>data instanceof cls,params),stringType=ZodString.create,numberType=ZodNumber.create,nanType=ZodNaN.create,bigIntType=ZodBigInt.create,booleanType=ZodBoolean.create,dateType=ZodDate.create,symbolType=ZodSymbol.create,undefinedType=ZodUndefined.create,nullType=ZodNull.create,anyType=ZodAny.create,unknownType=ZodUnknown.create,neverType=ZodNever.create,voidType=ZodVoid.create,arrayType=ZodArray.create,objectType=ZodObject.create,strictObjectType=ZodObject.strictCreate,unionType=ZodUnion.create,discriminatedUnionType=ZodDiscriminatedUnion.create,intersectionType=ZodIntersection.create,tupleType=ZodTuple.create,recordType=ZodRecord.create,mapType=ZodMap.create,setType=ZodSet.create,functionType=ZodFunction.create,lazyType=ZodLazy.create,literalType=ZodLiteral.create,enumType=ZodEnum.create,nativeEnumType=ZodNativeEnum.create,promiseType=ZodPromise.create,effectsType=ZodEffects.create,optionalType=ZodOptional.create,nullableType=ZodNullable.create,preprocessType=ZodEffects.createWithPreprocess,pipelineType=ZodPipeline.create,ostring=()=>stringType().optional(),onumber=()=>numberType().optional(),oboolean=()=>booleanType().optional(),coerce={string:(arg=>ZodString.create({...arg,coerce:!0})),number:(arg=>ZodNumber.create({...arg,coerce:!0})),boolean:(arg=>ZodBoolean.create({...arg,coerce:!0})),bigint:(arg=>ZodBigInt.create({...arg,coerce:!0})),date:(arg=>ZodDate.create({...arg,coerce:!0}))},NEVER=INVALID}});var external_exports={};__export(external_exports,{BRAND:()=>BRAND,DIRTY:()=>DIRTY,EMPTY_PATH:()=>EMPTY_PATH,INVALID:()=>INVALID,NEVER:()=>NEVER,OK:()=>OK,ParseStatus:()=>ParseStatus,Schema:()=>ZodType,ZodAny:()=>ZodAny,ZodArray:()=>ZodArray,ZodBigInt:()=>ZodBigInt,ZodBoolean:()=>ZodBoolean,ZodBranded:()=>ZodBranded,ZodCatch:()=>ZodCatch,ZodDate:()=>ZodDate,ZodDefault:()=>ZodDefault,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion,ZodEffects:()=>ZodEffects,ZodEnum:()=>ZodEnum,ZodError:()=>ZodError,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind,ZodFunction:()=>ZodFunction,ZodIntersection:()=>ZodIntersection,ZodIssueCode:()=>ZodIssueCode,ZodLazy:()=>ZodLazy,ZodLiteral:()=>ZodLiteral,ZodMap:()=>ZodMap,ZodNaN:()=>ZodNaN,ZodNativeEnum:()=>ZodNativeEnum,ZodNever:()=>ZodNever,ZodNull:()=>ZodNull,ZodNullable:()=>ZodNullable,ZodNumber:()=>ZodNumber,ZodObject:()=>ZodObject,ZodOptional:()=>ZodOptional,ZodParsedType:()=>ZodParsedType,ZodPipeline:()=>ZodPipeline,ZodPromise:()=>ZodPromise,ZodReadonly:()=>ZodReadonly,ZodRecord:()=>ZodRecord,ZodSchema:()=>ZodType,ZodSet:()=>ZodSet,ZodString:()=>ZodString,ZodSymbol:()=>ZodSymbol,ZodTransformer:()=>ZodEffects,ZodTuple:()=>ZodTuple,ZodType:()=>ZodType,ZodUndefined:()=>ZodUndefined,ZodUnion:()=>ZodUnion,ZodUnknown:()=>ZodUnknown,ZodVoid:()=>ZodVoid,addIssueToContext:()=>addIssueToContext,any:()=>anyType,array:()=>arrayType,bigint:()=>bigIntType,boolean:()=>booleanType,coerce:()=>coerce,custom:()=>custom,date:()=>dateType,datetimeRegex:()=>datetimeRegex,defaultErrorMap:()=>en_default,discriminatedUnion:()=>discriminatedUnionType,effect:()=>effectsType,enum:()=>enumType,function:()=>functionType,getErrorMap:()=>getErrorMap,getParsedType:()=>getParsedType,instanceof:()=>instanceOfType,intersection:()=>intersectionType,isAborted:()=>isAborted,isAsync:()=>isAsync,isDirty:()=>isDirty,isValid:()=>isValid,late:()=>late,lazy:()=>lazyType,literal:()=>literalType,makeIssue:()=>makeIssue,map:()=>mapType,nan:()=>nanType,nativeEnum:()=>nativeEnumType,never:()=>neverType,null:()=>nullType,nullable:()=>nullableType,number:()=>numberType,object:()=>objectType,objectUtil:()=>objectUtil,oboolean:()=>oboolean,onumber:()=>onumber,optional:()=>optionalType,ostring:()=>ostring,pipeline:()=>pipelineType,preprocess:()=>preprocessType,promise:()=>promiseType,quotelessJson:()=>quotelessJson,record:()=>recordType,set:()=>setType,setErrorMap:()=>setErrorMap,strictObject:()=>strictObjectType,string:()=>stringType,symbol:()=>symbolType,transformer:()=>effectsType,tuple:()=>tupleType,undefined:()=>undefinedType,union:()=>unionType,unknown:()=>unknownType,util:()=>util,void:()=>voidType});var init_external=__esm({"node_modules/zod/v3/external.js"(){"use strict";init_errors();init_parseUtil();init_typeAliases();init_util();init_types();init_ZodError()}});var init_zod=__esm({"node_modules/zod/index.js"(){"use strict";init_external();init_external()}});function getSiPrefixMultiplier(prefix){return SI_PREFIX_VALUES.get(prefix)}function getBaseTscircuitUnit(unit2){for(let info of Object.values(unitMappings)){if(unit2 in info.variants)return{baseUnit:info.baseUnit,conversionFactor:info.variants[unit2]};for(let[variant,conversionFactor]of Object.entries(info.variants)){if(!unit2.endsWith(variant))continue;let prefix=unit2.slice(0,-variant.length),prefixMultiplier=getSiPrefixMultiplier(prefix);if(prefixMultiplier!=null)return{baseUnit:info.baseUnit,conversionFactor:prefixMultiplier*conversionFactor}}}return{baseUnit:unit2,conversionFactor:1}}function parseAndConvertSiUnit(v11,unitOfValue){if(v11==null)return{parsedUnit:null,unitOfValue:null,value:null};if(typeof v11=="string"&&v11.match(/^-?[\d.]+$/))return{value:Number.parseFloat(v11),parsedUnit:null,unitOfValue:null};if(typeof v11=="number")return{value:v11,parsedUnit:null,unitOfValue:null};if(typeof v11=="object"&&"x"in v11&&"y"in v11){let firstResult=parseAndConvertSiUnit(v11.x,unitOfValue),xResult=parseAndConvertSiUnit(v11.x,unitOfValue),yResult=parseAndConvertSiUnit(v11.y,unitOfValue);return xResult.value===null||yResult.value===null?{parsedUnit:null,unitOfValue:null,value:null}:{parsedUnit:firstResult.parsedUnit,unitOfValue:firstResult.unitOfValue,value:{x:xResult.value,y:yResult.value}}}let unitReversed=v11.toString().split("").reverse().join("").match(/[^\d\s]+/)?.[0];if(!unitReversed)throw new Error(`Could not determine unit: "${v11}"`);let unit2=unitReversed.split("").reverse().join(""),numberPart=v11.slice(0,-unit2.length),bareSiPrefixMultiplier=getSiPrefixMultiplier(unit2);if(unitOfValue&&bareSiPrefixMultiplier!=null)return{parsedUnit:null,unitOfValue,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};if(bareSiPrefixMultiplier!=null&&!unitMappingAndVariantSuffixes.has(unit2))return{parsedUnit:null,unitOfValue:null,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};let{baseUnit,conversionFactor}=getBaseTscircuitUnit(unit2);return{parsedUnit:unit2,unitOfValue:baseUnit,value:conversionFactor*Number.parseFloat(numberPart)}}function formatSiUnit(value){if(value==null)return"";if(value===0)return"0";let absValue=Math.abs(value),prefixIndex=SI_PREFIXES2.findIndex(p11=>{let scaled2=absValue/p11.value;return scaled2>=1&&scaled2<1e3});prefixIndex===-1&&(prefixIndex=SI_PREFIXES2.indexOf(FALLBACK_PREFIX));let prefix=SI_PREFIXES2[prefixIndex],scaled=value/prefix.value;for(;prefixIndex>0&&Math.abs(Number(scaled.toPrecision(3)))>=1e3;)prefixIndex-=1,prefix=SI_PREFIXES2[prefixIndex],scaled=value/prefix.value;let formatted=scaled.toPrecision(3);return formatted.includes(".")&&!/\.0+$/.test(formatted)&&(formatted=formatted.replace(/0+$/,"")),formatted=formatted.replace(/\.0+$/,""),`${formatted}${prefix.symbol}`}var formatMm,SI_PREFIX_VALUES,SI_PREFIXES,unitMappings,unitMappingAndVariantSuffixes,SI_PREFIX_PATTERN,SI_UNIT_PATTERN,SI_PREFIXES2,FALLBACK_PREFIX,init_dist=__esm({"node_modules/format-si-unit/dist/index.js"(){"use strict";formatMm=value=>{let rounded=Math.round(value*1e3)/1e3;return`${Number(rounded.toFixed(3))}mm`},SI_PREFIX_VALUES=new Map([["T",1e12],["G",1e9],["M",1e6],["K",1e3],["k",1e3],["",1],["m",.001],["\xB5",1e-6],["\u03BC",1e-6],["u",1e-6],["n",1e-9],["p",1e-12],["f",1e-15]]),SI_PREFIXES=[...SI_PREFIX_VALUES.keys()];unitMappings={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,mohm:.001,mOhm:.001,milliohm:.001,\u03A9:1,ohm:1,Ohm:1,k\u03A9:1e3,K\u03A9:1e3,kohm:1e3,kOhm:1e3,KOhm:1e3,Kohm:1e3,M\u03A9:1e6,Mohm:1e6,MOhm:1e6,megohm:1e6,Megohm:1e6,G\u03A9:1e9,Gohm:1e9,GOhm:1e9,T\u03A9:1e12,Tohm:1e12,TOhm: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,\u03BCA: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,\u03BCF:1e-6,uF:1e-6,mF:.001,F:1,kF:1e3,KF:1e3,MF:1e6}},H:{baseUnit:"H",variants:{pH:1e-12,nH:1e-9,\u00B5H:1e-6,\u03BCH:1e-6,uH:1e-6,mH:.001,H:1,kH:1e3,KH:1e3,MH:1e6}},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,\u03BCs:.001,ms:1,s:1e3}},mm:{baseUnit:"mm",variants:{nm:1e-6,\u00B5m:.001,\u03BCm:.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}}},unitMappingAndVariantSuffixes=new Set;for(let[baseUnit,info]of Object.entries(unitMappings)){unitMappingAndVariantSuffixes.add(baseUnit);for(let variant of Object.keys(info.variants))unitMappingAndVariantSuffixes.add(variant)}SI_PREFIX_PATTERN=SI_PREFIXES.filter(prefix=>prefix!=="").sort((a10,b11)=>b11.length-a10.length).map(prefix=>prefix.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),SI_UNIT_PATTERN=new RegExp(`^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)(?:(${SI_PREFIX_PATTERN}))?$`),SI_PREFIXES2=[{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"},{value:1,symbol:""},{value:.001,symbol:"m"},{value:1e-6,symbol:"\xB5"},{value:1e-9,symbol:"n"},{value:1e-12,symbol:"p"}],FALLBACK_PREFIX=SI_PREFIXES2[SI_PREFIXES2.length-1]}});var dist_exports={};__export(dist_exports,{all_layers:()=>all_layers,any_circuit_element:()=>any_circuit_element,any_soup_element:()=>any_soup_element,any_source_component:()=>any_source_component,asset:()=>asset,base_circuit_json_error:()=>base_circuit_json_error,battery_capacity:()=>battery_capacity,brep_shape:()=>brep_shape,cadModelDefaultDirectionMap:()=>cadModelDefaultDirectionMap,cad_cable:()=>cad_cable,cad_collision_error:()=>cad_collision_error,cad_component:()=>cad_component,cad_model_axis_directions:()=>cad_model_axis_directions,cad_model_formats:()=>cad_model_formats,cad_reference_surface:()=>cad_reference_surface,capacitance:()=>capacitance,circle_shape:()=>circle_shape,circuit_json_footprint_load_error:()=>circuit_json_footprint_load_error,current:()=>current,distance:()=>distance,duration_ms:()=>duration_ms,experiment_type:()=>experiment_type,external_footprint_load_error:()=>external_footprint_load_error,frequency:()=>frequency,getRotationBetweenPcbPin1Locations:()=>getRotationBetweenPcbPin1Locations,getSimulationReturnCurrentGridJsonSchema:()=>getSimulationReturnCurrentGridJsonSchema,getZodPrefixedIdWithDefault:()=>getZodPrefixedIdWithDefault,inductance:()=>inductance,insertionDirectionToCanonical:()=>insertionDirectionToCanonical,insertionDirectionToVector:()=>insertionDirectionToVector,insertion_direction:()=>insertion_direction,kicadAt:()=>kicadAt,kicadEffects:()=>kicadEffects,kicadFont:()=>kicadFont,kicadFootprintAttributes:()=>kicadFootprintAttributes,kicadFootprintMetadata:()=>kicadFootprintMetadata,kicadFootprintModel:()=>kicadFootprintModel,kicadFootprintPad:()=>kicadFootprintPad,kicadFootprintProperties:()=>kicadFootprintProperties,kicadProperty:()=>kicadProperty,kicadSymbolEffects:()=>kicadSymbolEffects,kicadSymbolMetadata:()=>kicadSymbolMetadata,kicadSymbolPinNames:()=>kicadSymbolPinNames,kicadSymbolPinNumbers:()=>kicadSymbolPinNumbers,kicadSymbolProperties:()=>kicadSymbolProperties,kicadSymbolProperty:()=>kicadSymbolProperty,layer_ref:()=>layer_ref,layer_string:()=>layer_string,length:()=>length,manufacturing_drc_properties:()=>manufacturing_drc_properties,ms:()=>ms,ninePointAnchor:()=>ninePointAnchor,parseAndConvertSiUnit:()=>parseAndConvertSiUnit,pcbRenderLayer:()=>pcbRenderLayer,pcb_autorouting_error:()=>pcb_autorouting_error,pcb_bend:()=>pcb_bend,pcb_board:()=>pcb_board,pcb_breakout_point:()=>pcb_breakout_point,pcb_bus_length_skew_error:()=>pcb_bus_length_skew_error,pcb_bus_routing_constraint_error:()=>pcb_bus_routing_constraint_error,pcb_bus_routing_constraint_warning:()=>pcb_bus_routing_constraint_warning,pcb_component:()=>pcb_component,pcb_component_invalid_layer_error:()=>pcb_component_invalid_layer_error,pcb_component_missing_courtyard_warning:()=>pcb_component_missing_courtyard_warning,pcb_component_not_on_board_edge_error:()=>pcb_component_not_on_board_edge_error,pcb_component_outside_board_error:()=>pcb_component_outside_board_error,pcb_connector_not_in_accessible_orientation_warning:()=>pcb_connector_not_in_accessible_orientation_warning,pcb_copper_pour:()=>pcb_copper_pour,pcb_copper_pour_brep:()=>pcb_copper_pour_brep,pcb_copper_pour_polygon:()=>pcb_copper_pour_polygon,pcb_copper_pour_rect:()=>pcb_copper_pour_rect,pcb_copper_text:()=>pcb_copper_text,pcb_courtyard_circle:()=>pcb_courtyard_circle,pcb_courtyard_outline:()=>pcb_courtyard_outline,pcb_courtyard_overlap_error:()=>pcb_courtyard_overlap_error,pcb_courtyard_pill:()=>pcb_courtyard_pill,pcb_courtyard_polygon:()=>pcb_courtyard_polygon,pcb_courtyard_rect:()=>pcb_courtyard_rect,pcb_cutout:()=>pcb_cutout,pcb_cutout_circle:()=>pcb_cutout_circle,pcb_cutout_path:()=>pcb_cutout_path,pcb_cutout_polygon:()=>pcb_cutout_polygon,pcb_cutout_rect:()=>pcb_cutout_rect,pcb_debug_line:()=>pcb_debug_line,pcb_debug_object:()=>pcb_debug_object,pcb_debug_object_base:()=>pcb_debug_object_base,pcb_debug_point:()=>pcb_debug_point,pcb_debug_rect:()=>pcb_debug_rect,pcb_fabrication_note_dimension:()=>pcb_fabrication_note_dimension,pcb_fabrication_note_path:()=>pcb_fabrication_note_path,pcb_fabrication_note_rect:()=>pcb_fabrication_note_rect,pcb_fabrication_note_text:()=>pcb_fabrication_note_text,pcb_fabricator_extra_charge_warning:()=>pcb_fabricator_extra_charge_warning,pcb_footprint_overlap_error:()=>pcb_footprint_overlap_error,pcb_ground_plane:()=>pcb_ground_plane,pcb_ground_plane_region:()=>pcb_ground_plane_region,pcb_group:()=>pcb_group,pcb_hole:()=>pcb_hole,pcb_hole_circle_or_square_shape:()=>pcb_hole_circle_or_square_shape,pcb_hole_circle_shape:()=>pcb_hole_circle_shape,pcb_hole_oval_shape:()=>pcb_hole_oval_shape,pcb_hole_pill_shape:()=>pcb_hole_pill_shape,pcb_hole_rect_shape:()=>pcb_hole_rect_shape,pcb_hole_rotated_pill_shape:()=>pcb_hole_rotated_pill_shape,pcb_keepout:()=>pcb_keepout,pcb_keepout_outline:()=>pcb_keepout_outline,pcb_keepout_overlap_warning:()=>pcb_keepout_overlap_warning,pcb_manual_edit_conflict_warning:()=>pcb_manual_edit_conflict_warning,pcb_missing_footprint_error:()=>pcb_missing_footprint_error,pcb_net:()=>pcb_net,pcb_note_dimension:()=>pcb_note_dimension,pcb_note_line:()=>pcb_note_line,pcb_note_path:()=>pcb_note_path,pcb_note_rect:()=>pcb_note_rect,pcb_note_text:()=>pcb_note_text,pcb_packing_error:()=>pcb_packing_error,pcb_pad_pad_clearance_error:()=>pcb_pad_pad_clearance_error,pcb_pad_trace_clearance_error:()=>pcb_pad_trace_clearance_error,pcb_panel:()=>pcb_panel,pcb_panelization_placement_error:()=>pcb_panelization_placement_error,pcb_pin1_location:()=>pcb_pin1_location,pcb_placement_error:()=>pcb_placement_error,pcb_plated_hole:()=>pcb_plated_hole,pcb_port:()=>pcb_port,pcb_port_not_connected_error:()=>pcb_port_not_connected_error,pcb_port_not_matched_error:()=>pcb_port_not_matched_error,pcb_preflight_routing_error:()=>pcb_preflight_routing_error,pcb_route_hint:()=>pcb_route_hint,pcb_route_hints:()=>pcb_route_hints,pcb_silkscreen_circle:()=>pcb_silkscreen_circle,pcb_silkscreen_graphic:()=>pcb_silkscreen_graphic,pcb_silkscreen_graphic_brep:()=>pcb_silkscreen_graphic_brep,pcb_silkscreen_line:()=>pcb_silkscreen_line,pcb_silkscreen_oval:()=>pcb_silkscreen_oval,pcb_silkscreen_path:()=>pcb_silkscreen_path,pcb_silkscreen_pill:()=>pcb_silkscreen_pill,pcb_silkscreen_rect:()=>pcb_silkscreen_rect,pcb_silkscreen_text:()=>pcb_silkscreen_text,pcb_smtpad:()=>pcb_smtpad,pcb_smtpad_pill:()=>pcb_smtpad_pill,pcb_solder_paste:()=>pcb_solder_paste,pcb_soldermask_opening:()=>pcb_soldermask_opening,pcb_stiffener:()=>pcb_stiffener,pcb_stiffener_polygon:()=>pcb_stiffener_polygon,pcb_stiffener_rect:()=>pcb_stiffener_rect,pcb_text:()=>pcb_text,pcb_thermal_spoke:()=>pcb_thermal_spoke,pcb_trace:()=>pcb_trace,pcb_trace_error:()=>pcb_trace_error,pcb_trace_hint:()=>pcb_trace_hint,pcb_trace_missing_error:()=>pcb_trace_missing_error,pcb_trace_route_point:()=>pcb_trace_route_point,pcb_trace_route_point_through_pad:()=>pcb_trace_route_point_through_pad,pcb_trace_route_point_via:()=>pcb_trace_route_point_via,pcb_trace_route_point_wire:()=>pcb_trace_route_point_wire,pcb_trace_style_warning:()=>pcb_trace_style_warning,pcb_trace_too_long_error:()=>pcb_trace_too_long_error,pcb_trace_too_long_warning:()=>pcb_trace_too_long_warning,pcb_trace_too_many_vias_warning:()=>pcb_trace_too_many_vias_warning,pcb_trace_warning:()=>pcb_trace_warning,pcb_via:()=>pcb_via,pcb_via_clearance_error:()=>pcb_via_clearance_error,pcb_via_trace_clearance_error:()=>pcb_via_trace_clearance_error,point:()=>point,point3:()=>point3,point_with_bulge:()=>point_with_bulge,polygon_shape:()=>polygon_shape,port_arrangement:()=>port_arrangement,position:()=>position,position3:()=>position3,rect_shape:()=>rect_shape,resistance:()=>resistance,ring:()=>ring,rotated_rect_shape:()=>rotated_rect_shape,rotation:()=>rotation,route_hint_point:()=>route_hint_point,schematic_arc:()=>schematic_arc,schematic_box:()=>schematic_box,schematic_circle:()=>schematic_circle,schematic_component:()=>schematic_component,schematic_component_overlap_warning:()=>schematic_component_overlap_warning,schematic_component_port_arrangement_by_sides:()=>schematic_component_port_arrangement_by_sides,schematic_component_port_arrangement_by_size:()=>schematic_component_port_arrangement_by_size,schematic_component_styling_warning:()=>schematic_component_styling_warning,schematic_debug_line:()=>schematic_debug_line,schematic_debug_object:()=>schematic_debug_object,schematic_debug_object_base:()=>schematic_debug_object_base,schematic_debug_point:()=>schematic_debug_point,schematic_debug_rect:()=>schematic_debug_rect,schematic_element_outside_sheet_warning:()=>schematic_element_outside_sheet_warning,schematic_error:()=>schematic_error,schematic_graphic:()=>schematic_graphic,schematic_group:()=>schematic_group,schematic_layout_error:()=>schematic_layout_error,schematic_line:()=>schematic_line,schematic_manual_edit_conflict_warning:()=>schematic_manual_edit_conflict_warning,schematic_missing_sheet_warning:()=>schematic_missing_sheet_warning,schematic_net_label:()=>schematic_net_label,schematic_path:()=>schematic_path,schematic_pin_styles:()=>schematic_pin_styles,schematic_port:()=>schematic_port,schematic_rect:()=>schematic_rect,schematic_sheet:()=>schematic_sheet,schematic_sheet_size:()=>schematic_sheet_size,schematic_sheet_styling_warning:()=>schematic_sheet_styling_warning,schematic_symbol:()=>schematic_symbol,schematic_table:()=>schematic_table,schematic_table_cell:()=>schematic_table_cell,schematic_text:()=>schematic_text,schematic_text_part:()=>schematic_text_part,schematic_trace:()=>schematic_trace,schematic_voltage_probe:()=>schematic_voltage_probe,simulation_ac_current_source:()=>simulation_ac_current_source,simulation_ac_sweep_current_graph:()=>simulation_ac_sweep_current_graph,simulation_ac_sweep_voltage_graph:()=>simulation_ac_sweep_voltage_graph,simulation_ac_voltage_source:()=>simulation_ac_voltage_source,simulation_complex_sample:()=>simulation_complex_sample,simulation_current_probe:()=>simulation_current_probe,simulation_current_source:()=>simulation_current_source,simulation_dc_current_source:()=>simulation_dc_current_source,simulation_dc_operating_point_current:()=>simulation_dc_operating_point_current,simulation_dc_operating_point_voltage:()=>simulation_dc_operating_point_voltage,simulation_dc_sweep_current_graph:()=>simulation_dc_sweep_current_graph,simulation_dc_sweep_unit:()=>simulation_dc_sweep_unit,simulation_dc_sweep_voltage_graph:()=>simulation_dc_sweep_voltage_graph,simulation_dc_voltage_source:()=>simulation_dc_voltage_source,simulation_experiment:()=>simulation_experiment,simulation_op_amp:()=>simulation_op_amp,simulation_oscilloscope_trace:()=>simulation_oscilloscope_trace,simulation_parameter_sweep:()=>simulation_parameter_sweep,simulation_parameter_sweep_coordinate:()=>simulation_parameter_sweep_coordinate,simulation_parameter_type:()=>simulation_parameter_type,simulation_parameter_unit:()=>simulation_parameter_unit,simulation_pcb_return_current_field:()=>simulation_pcb_return_current_field,simulation_pcb_return_current_heatmap:()=>simulation_pcb_return_current_heatmap,simulation_pcb_return_current_marker:()=>simulation_pcb_return_current_marker,simulation_pcb_return_current_result:()=>simulation_pcb_return_current_result,simulation_return_current_contact:()=>simulation_return_current_contact,simulation_return_current_excitation:()=>simulation_return_current_excitation,simulation_return_current_field_asset:()=>simulation_return_current_field_asset,simulation_return_current_grid_json:()=>simulation_return_current_grid_json,simulation_return_current_image_asset:()=>simulation_return_current_image_asset,simulation_spice_subcircuit:()=>simulation_spice_subcircuit,simulation_switch:()=>simulation_switch,simulation_terminal_port:()=>simulation_terminal_port,simulation_transient_current_graph:()=>simulation_transient_current_graph,simulation_transient_voltage_graph:()=>simulation_transient_voltage_graph,simulation_unknown_experiment_error:()=>simulation_unknown_experiment_error,simulation_voltage_probe:()=>simulation_voltage_probe,simulation_voltage_source:()=>simulation_voltage_source,size:()=>size,source_ambiguous_port_reference:()=>source_ambiguous_port_reference,source_board:()=>source_board,source_bus:()=>source_bus,source_component_availability_warning:()=>source_component_availability_warning,source_component_base:()=>source_component_base,source_component_internal_connection:()=>source_component_internal_connection,source_component_misconfigured_error:()=>source_component_misconfigured_error,source_component_pins_underspecified_warning:()=>source_component_pins_underspecified_warning,source_confusing_net_name_warning:()=>source_confusing_net_name_warning,source_datasheet:()=>source_datasheet,source_failed_to_create_component_error:()=>source_failed_to_create_component_error,source_group:()=>source_group,source_i2c_misconfigured_error:()=>source_i2c_misconfigured_error,source_interconnect:()=>source_interconnect,source_invalid_component_property_error:()=>source_invalid_component_property_error,source_manually_placed_via:()=>source_manually_placed_via,source_missing_manufacturer_part_number_warning:()=>source_missing_manufacturer_part_number_warning,source_missing_property_error:()=>source_missing_property_error,source_motor:()=>source_motor,source_net:()=>source_net,source_no_ground_pin_defined_warning:()=>source_no_ground_pin_defined_warning,source_no_power_pin_defined_warning:()=>source_no_power_pin_defined_warning,source_part_not_found_warning:()=>source_part_not_found_warning,source_pcb_ground_plane:()=>source_pcb_ground_plane,source_pin_attributes:()=>source_pin_attributes,source_pin_missing_trace_warning:()=>source_pin_missing_trace_warning,source_pin_must_be_connected_error:()=>source_pin_must_be_connected_error,source_port:()=>source_port,source_printed_part:()=>source_printed_part,source_project_metadata:()=>source_project_metadata,source_property_ignored_warning:()=>source_property_ignored_warning,source_refdes_convention_warning:()=>source_refdes_convention_warning,source_runtime_error:()=>source_runtime_error,source_simple_ammeter:()=>source_simple_ammeter,source_simple_battery:()=>source_simple_battery,source_simple_capacitor:()=>source_simple_capacitor,source_simple_chip:()=>source_simple_chip,source_simple_connector:()=>source_simple_connector,source_simple_connector_standards:()=>source_simple_connector_standards,source_simple_crystal:()=>source_simple_crystal,source_simple_current_source:()=>source_simple_current_source,source_simple_diode:()=>source_simple_diode,source_simple_fiducial:()=>source_simple_fiducial,source_simple_fuse:()=>source_simple_fuse,source_simple_ground:()=>source_simple_ground,source_simple_inductor:()=>source_simple_inductor,source_simple_led:()=>source_simple_led,source_simple_mosfet:()=>source_simple_mosfet,source_simple_op_amp:()=>source_simple_op_amp,source_simple_pin_header:()=>source_simple_pin_header,source_simple_pinout:()=>source_simple_pinout,source_simple_potentiometer:()=>source_simple_potentiometer,source_simple_power_source:()=>source_simple_power_source,source_simple_push_button:()=>source_simple_push_button,source_simple_resistor:()=>source_simple_resistor,source_simple_resonator:()=>source_simple_resonator,source_simple_switch:()=>source_simple_switch,source_simple_test_point:()=>source_simple_test_point,source_simple_transistor:()=>source_simple_transistor,source_simple_voltage_probe:()=>source_simple_voltage_probe,source_simple_voltage_source:()=>source_simple_voltage_source,source_subassembly:()=>source_subassembly,source_trace:()=>source_trace,source_trace_not_connected_error:()=>source_trace_not_connected_error,source_unnamed_trace_warning:()=>source_unnamed_trace_warning,spice_simulation_options:()=>spice_simulation_options,standard_shape:()=>standard_shape,supplier_footprint_mismatch_warning:()=>supplier_footprint_mismatch_warning,supplier_name:()=>supplier_name,time:()=>time,timestamp:()=>timestamp,unknown_error_finding_part:()=>unknown_error_finding_part,visible_layer:()=>visible_layer,voltage:()=>voltage,wave_shape:()=>wave_shape});function createSimulationReturnCurrentAssetSchema(mimetypes){return asset.extend({project_relative_path:external_exports.string().min(1),url:external_exports.string().url()}).superRefine((value,context)=>{mimetypes.includes(value.mimetype)||context.addIssue({code:external_exports.ZodIssueCode.custom,path:["mimetype"],message:`Expected one of: ${mimetypes.join(", ")}`}),value.url.startsWith("data:")&&/^data:([^;,]*)(?:;[^,]*)?,/i.exec(value.url)?.[1]?.toLowerCase()!==value.mimetype&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["url"],message:"Data URL media type must match asset.mimetype"})})}function getSimulationReturnCurrentGridJsonSchema(field){let count=field.columns*field.rows;if(!Number.isSafeInteger(field.columns)||field.columns<=0||!Number.isSafeInteger(field.rows)||field.rows<=0||!Number.isSafeInteger(count))throw new Error("Grid dimensions must be positive safe integers");return simulation_return_current_grid_json.superRefine((grid4,context)=>{grid4.field_type!==field.field_type&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["field_type"],message:"Decoded field_type must match the parent field"}),(grid4.field_type==="real"?grid4.sheet_current_x:grid4.sheet_current_x_real).length!==count&&context.addIssue({code:external_exports.ZodIssueCode.custom,message:`Each current channel must have ${count} entries (columns * rows)`})})}var resistance,capacitance,inductance,voltage,length,frequency,distance,current,duration_ms,time,ms,timestamp,rotation,battery_capacity,expectTypesMatch,expectStringUnionsMatch,point,position,point3,position3,size,finite_distance,positive_distance,circle_shape,rect_shape,rotated_rect_shape,polygon_shape,standard_shape,randomId,getZodPrefixedIdWithDefault,ninePointAnchor,pcbRenderLayer,asset,kicadAt,kicadFont,kicadEffects,kicadProperty,kicadFootprintProperties,kicadFootprintAttributes,kicadFootprintPad,kicadFootprintModel,kicadFootprintMetadata,kicadSymbolPinNumbers,kicadSymbolPinNames,kicadSymbolEffects,kicadSymbolProperty,kicadSymbolProperties,kicadSymbolMetadata,base_circuit_json_error,supplier_name,source_component_base,source_simple_capacitor,source_simple_resistor,source_simple_diode,source_simple_fiducial,source_simple_led,source_simple_ground,source_simple_chip,source_printed_part,source_subassembly,source_motor,source_simple_power_source,source_simple_current_source,source_simple_fuse,source_simple_ammeter,pin_voltage,source_pin_attributes,source_simple_battery,source_simple_inductor,source_simple_push_button,source_simple_potentiometer,source_simple_crystal,source_simple_pin_header,source_simple_connector_standards,source_simple_connector,source_simple_pinout,source_simple_resonator,source_simple_transistor,source_simple_test_point,source_simple_mosfet,source_simple_op_amp,source_simple_switch,source_project_metadata,source_missing_property_error,source_failed_to_create_component_error,source_invalid_component_property_error,source_trace_not_connected_error,source_property_ignored_warning,source_pin_missing_trace_warning,source_missing_manufacturer_part_number_warning,source_refdes_convention_warning,source_component_availability_warning,source_simple_voltage_probe,source_interconnect,source_i2c_misconfigured_error,source_component_misconfigured_error,source_simple_voltage_source,source_datasheet,any_source_component,source_port,source_component_internal_connection,source_trace,source_group,source_net,source_board,source_ambiguous_port_reference,source_pcb_ground_plane,all_layers,layer_string,layer_ref,visible_layer,source_manually_placed_via,source_unnamed_trace_warning,source_no_power_pin_defined_warning,source_no_ground_pin_defined_warning,source_component_pins_underspecified_warning,source_pin_must_be_connected_error,unknown_error_finding_part,source_part_not_found_warning,source_confusing_net_name_warning,route_length,trace_spacing,source_bus,source_runtime_error,schematic_box,schematic_path,schematic_pin_styles,schematic_component_port_arrangement_by_size,schematic_component_port_arrangement_by_sides,port_arrangement,schematic_component,schematicSymbolMetadata,schematic_symbol,schematic_line,schematic_rect,schematic_circle,schematic_arc,schematic_trace,fivePointAnchor,schematic_text_part,schematic_text,schematic_port,schematic_net_label,schematic_error,schematic_layout_error,schematic_debug_object_base,schematic_debug_rect,schematic_debug_line,schematic_debug_point,schematic_debug_object,schematic_voltage_probe,schematic_manual_edit_conflict_warning,schematic_component_overlap_warning,schematic_component_styling_warning,schematic_sheet_styling_warning,schematic_element_outside_sheet_warning,positiveFiniteDistance,schematic_graphic,schematic_group,schematic_table,schematic_table_cell,schematic_sheet_size,schematic_sheet,schematic_missing_sheet_warning,point_with_bulge,ring,brep_shape,insertionDirectionToCanonical,insertionDirectionToVector,insertion_direction,pcb_pin1_location,pin1LocationRotationCycles,getRotationBetweenPcbPin1Locations,pcb_route_hint,pcb_route_hints,route_hint_point,manufacturing_drc_properties,pcb_component,pcb_debug_object_base,pcb_debug_rect,pcb_debug_line,pcb_debug_point,pcb_debug_object,pcb_hole_circle,pcb_hole_circle_shape,pcb_hole_rect,pcb_hole_rect_shape,pcb_hole_circle_or_square,pcb_hole_circle_or_square_shape,pcb_hole_oval,pcb_hole_oval_shape,pcb_hole_pill,pcb_hole_pill_shape,pcb_hole_rotated_pill,pcb_hole_rotated_pill_shape,pcb_hole,pcb_plated_hole_circle,pcb_plated_hole_oval,pcb_circular_hole_with_rect_pad,pcb_pill_hole_with_rect_pad,pcb_rotated_pill_hole_with_rect_pad,pcb_hole_with_polygon_pad,pcb_plated_hole,pcb_port,pcb_smtpad_circle,pcb_smtpad_rect,pcb_smtpad_rotated_rect,pcb_smtpad_pill,pcb_smtpad_rotated_pill,pcb_smtpad_polygon,pcb_smtpad,pcb_solder_paste_circle,pcb_solder_paste_rect,pcb_solder_paste_pill,pcb_solder_paste_rotated_rect,pcb_solder_paste_rotated_pill,pcb_solder_paste_oval,pcb_solder_paste_polygon,pcb_solder_paste,opening_base,pcb_soldermask_opening,pcb_text,positive_width,pcb_trace_route_point_wire,pcb_trace_route_point_via,pcb_trace_route_point_through_pad,pcb_trace_route_point,pcb_trace,pcb_trace_warning,pcb_trace_style_warning,pcb_trace_too_long_error,pcb_bus_length_skew_error,pcb_trace_too_long_warning,pcb_trace_too_many_vias_warning,error_base,pcb_bus_routing_constraint_error,warning_base,pcb_bus_routing_constraint_warning,pcb_trace_error,pcb_trace_missing_error,pcb_port_not_matched_error,pcb_port_not_connected_error,pcb_net,pcb_via,pcb_board,finite_point,pcb_bend,positive_length,finite_point2,pcb_stiffener_base,pcb_stiffener_rect,pcb_stiffener_polygon,pcb_stiffener,pcb_panel,pcb_placement_error,pcb_packing_error,pcb_panelization_placement_error,pcb_trace_hint,pcb_silkscreen_line,pcb_silkscreen_path,pcb_silkscreen_text,pcb_copper_text,pcb_silkscreen_rect,pcb_silkscreen_circle,pcb_silkscreen_oval,pcb_silkscreen_graphic_base,pcb_silkscreen_graphic_brep,pcb_silkscreen_graphic,pcb_silkscreen_pill,pcb_fabrication_note_text,pcb_fabrication_note_path,pcb_fabrication_note_rect,pcb_fabrication_note_dimension,pcb_note_text,pcb_note_rect,pcb_note_path,pcb_note_line,pcb_note_dimension,pcb_footprint_overlap_error,pcb_courtyard_overlap_error,pcb_keepout_outline,pcb_keepout,pcb_keepout_overlap_warning,pcb_cutout_base,pcb_cutout_rect,pcb_cutout_circle,pcb_cutout_polygon,pcb_cutout_path,pcb_cutout,pcb_missing_footprint_error,external_footprint_load_error,circuit_json_footprint_load_error,pcb_group,pcb_autorouting_error,pcb_preflight_routing_error,pcb_manual_edit_conflict_warning,connectorOrientationDirection,pcb_connector_not_in_accessible_orientation_warning,pcb_component_missing_courtyard_warning,supplier_footprint_mismatch_warning,pcb_fabricator_extra_charge_warning,pcb_breakout_point,pcb_ground_plane,pcb_ground_plane_region,pcb_thermal_spoke,pcb_copper_pour_base,pcb_copper_pour_rect,pcb_copper_pour_brep,pcb_copper_pour_polygon,pcb_copper_pour,pcb_component_outside_board_error,pcb_component_not_on_board_edge_error,pcb_component_invalid_layer_error,pcb_via_clearance_error,pcb_via_trace_clearance_error,pcb_pad_pad_clearance_error,pcb_pad_trace_clearance_error,pcb_courtyard_rect,pcb_courtyard_outline,pcb_courtyard_polygon,pcb_courtyard_circle,pcb_courtyard_pill,cad_model_formats,cad_model_axis_directions,cadModelDefaultDirectionMap,cad_component,cad_collision_error,connectorPin1Position,cad_cable,FRAME_TOLERANCE,unitDirection,extent,cad_reference_surface,wave_shape,percentage,simulation_dc_voltage_source,simulation_ac_voltage_source,simulation_voltage_source,percentage2,simulation_dc_current_source,simulation_ac_current_source,simulation_current_source,simulation_dc_sweep_unit,simulation_parameter_unit,experiment_type,spice_simulation_options,simulation_experiment,simulation_parameter_sweep_coordinate,simulation_transient_voltage_graph,simulation_transient_current_graph,simulation_switch,simulation_voltage_probe,simulation_current_probe,simulation_unknown_experiment_error,simulation_parameter_type,simulation_parameter_sweep_base,simulation_parameter_sweep,simulation_dc_operating_point_voltage,simulation_dc_operating_point_current,simulation_dc_sweep_voltage_graph,simulation_dc_sweep_current_graph,simulation_complex_sample,simulation_ac_sweep_voltage_graph,simulation_ac_sweep_current_graph,simulation_op_amp,simulation_spice_subcircuit,hasValue,simulation_oscilloscope_trace,contact_position,simulation_return_current_contact,simulation_terminal_port,simulation_return_current_excitation,simulation_pcb_return_current_result,simulation_return_current_field_asset,simulation_return_current_image_asset,simulation_pcb_return_current_field,channel,simulation_return_current_grid_json,simulation_pcb_return_current_heatmap,marker_base,simulation_pcb_return_current_marker,any_circuit_element,any_soup_element,init_dist2=__esm({"node_modules/circuit-json/dist/index.mjs"(){"use strict";init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();resistance=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"\u03A9").value),capacitance=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"F").value).transform(value=>Number.parseFloat(value.toPrecision(12))),inductance=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"H").value),voltage=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"V").value),length=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11).value),frequency=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"Hz").value),distance=length,current=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11,"A").value),duration_ms=external_exports.string().or(external_exports.number()).transform(v11=>parseAndConvertSiUnit(v11).value),time=duration_ms,ms=duration_ms,timestamp=external_exports.string().datetime(),rotation=external_exports.string().or(external_exports.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_capacity=external_exports.number().or(external_exports.string().endsWith("mAh")).transform(v11=>{if(typeof v11=="string"){let valString=v11.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v11}).describe("Battery capacity in mAh"),expectTypesMatch=shouldBe=>{};expectTypesMatch("extra props b");expectTypesMatch("missing props b");expectTypesMatch(!0);expectTypesMatch("mismatched prop types: a");expectStringUnionsMatch=shouldBe=>{};expectStringUnionsMatch(!0);expectStringUnionsMatch('T1 has extra: "c", T2 has extra: "d"');expectStringUnionsMatch('T1 has extra: "c"');expectStringUnionsMatch('T2 has extra: "c"');expectStringUnionsMatch('T1 has extra: "d", T2 has extra: "c"');expectStringUnionsMatch(!0);point=external_exports.object({x:distance,y:distance}),position=point;expectTypesMatch(!0);expectTypesMatch(!0);point3=external_exports.object({x:distance,y:distance,z:distance}),position3=point3;expectTypesMatch(!0);size=external_exports.object({width:external_exports.number(),height:external_exports.number()});expectTypesMatch(!0);finite_distance=distance.pipe(external_exports.number().finite()),positive_distance=distance.pipe(external_exports.number().finite().positive()),circle_shape=external_exports.object({shape:external_exports.literal("circle"),x:finite_distance,y:finite_distance,radius:positive_distance}).strict(),rect_shape=external_exports.object({shape:external_exports.literal("rect"),x:finite_distance,y:finite_distance,width:positive_distance,height:positive_distance}).strict(),rotated_rect_shape=rect_shape.extend({shape:external_exports.literal("rotated_rect"),ccw_rotation:rotation.pipe(external_exports.number().finite())}),polygon_shape=external_exports.object({shape:external_exports.literal("polygon"),points:external_exports.array(point.extend({x:finite_distance,y:finite_distance})).min(3).refine(points=>{let twice_area=points.reduce((sum,point23,index2)=>{let next2=points[(index2+1)%points.length];return sum+point23.x*next2.y-next2.x*point23.y},0);return Number.isFinite(twice_area)&&twice_area!==0},"Polygon boundary must enclose a nonzero area")}).strict();expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);standard_shape=external_exports.discriminatedUnion("shape",[circle_shape,rect_shape,rotated_rect_shape,polygon_shape]);expectTypesMatch(!0);randomId=length43=>{let chars2="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";return Array.from({length:length43},()=>chars2[Math.floor(Math.random()*chars2.length)]).join("")},getZodPrefixedIdWithDefault=prefix=>external_exports.string().optional().default(()=>`${prefix}_${randomId(10)}`),ninePointAnchor=external_exports.enum(["top_left","top_center","top_right","center_left","center","center_right","bottom_left","bottom_center","bottom_right"]);expectTypesMatch(!0);pcbRenderLayer=external_exports.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","inner7_copper","inner8_copper","edge_cuts","drill"]);expectTypesMatch(!0);asset=external_exports.object({project_relative_path:external_exports.string(),url:external_exports.string(),mimetype:external_exports.string()});expectTypesMatch(!0);kicadAt=point.extend({rotation:rotation.optional()});expectTypesMatch(!0);kicadFont=external_exports.object({size:point.optional(),thickness:distance.optional()});expectTypesMatch(!0);kicadEffects=external_exports.object({font:kicadFont.optional()});expectTypesMatch(!0);kicadProperty=external_exports.object({value:external_exports.string(),at:kicadAt.optional(),layer:external_exports.string().optional(),uuid:external_exports.string().optional(),hide:external_exports.boolean().optional(),effects:kicadEffects.optional()});expectTypesMatch(!0);kicadFootprintProperties=external_exports.object({Reference:kicadProperty.optional(),Value:kicadProperty.optional(),Datasheet:kicadProperty.optional(),Description:kicadProperty.optional()});expectTypesMatch(!0);kicadFootprintAttributes=external_exports.object({through_hole:external_exports.boolean().optional(),smd:external_exports.boolean().optional(),exclude_from_pos_files:external_exports.boolean().optional(),exclude_from_bom:external_exports.boolean().optional()});expectTypesMatch(!0);kicadFootprintPad=external_exports.object({name:external_exports.string(),type:external_exports.string(),shape:external_exports.string().optional(),at:kicadAt.optional(),size:point.optional(),drill:distance.optional(),layers:external_exports.array(external_exports.string()).optional(),removeUnusedLayers:external_exports.boolean().optional(),uuid:external_exports.string().optional()});expectTypesMatch(!0);kicadFootprintModel=external_exports.object({path:external_exports.string(),offset:point3.optional(),scale:point3.optional(),rotate:point3.optional()});expectTypesMatch(!0);kicadFootprintMetadata=external_exports.object({footprintName:external_exports.string().optional(),version:external_exports.union([external_exports.number(),external_exports.string()]).optional(),generator:external_exports.string().optional(),generatorVersion:external_exports.union([external_exports.number(),external_exports.string()]).optional(),layer:external_exports.string().optional(),properties:kicadFootprintProperties.optional(),attributes:kicadFootprintAttributes.optional(),pads:external_exports.array(kicadFootprintPad).optional(),embeddedFonts:external_exports.boolean().optional(),model:kicadFootprintModel.optional()});expectTypesMatch(!0);kicadSymbolPinNumbers=external_exports.object({hide:external_exports.boolean().optional()});expectTypesMatch(!0);kicadSymbolPinNames=external_exports.object({offset:distance.optional(),hide:external_exports.boolean().optional()});expectTypesMatch(!0);kicadSymbolEffects=external_exports.object({font:kicadFont.optional(),justify:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())]).optional(),hide:external_exports.boolean().optional()});expectTypesMatch(!0);kicadSymbolProperty=external_exports.object({value:external_exports.string(),id:external_exports.union([external_exports.number(),external_exports.string()]).optional(),at:kicadAt.optional(),effects:kicadSymbolEffects.optional()});expectTypesMatch(!0);kicadSymbolProperties=external_exports.object({Reference:kicadSymbolProperty.optional(),Value:kicadSymbolProperty.optional(),Footprint:kicadSymbolProperty.optional(),Datasheet:kicadSymbolProperty.optional(),Description:kicadSymbolProperty.optional(),ki_keywords:kicadSymbolProperty.optional(),ki_fp_filters:kicadSymbolProperty.optional()});expectTypesMatch(!0);kicadSymbolMetadata=external_exports.object({symbolName:external_exports.string().optional(),extends:external_exports.string().optional(),pinNumbers:kicadSymbolPinNumbers.optional(),pinNames:kicadSymbolPinNames.optional(),excludeFromSim:external_exports.boolean().optional(),inBom:external_exports.boolean().optional(),onBoard:external_exports.boolean().optional(),properties:kicadSymbolProperties.optional(),embeddedFonts:external_exports.boolean().optional()});expectTypesMatch(!0);base_circuit_json_error=external_exports.object({error_type:external_exports.string(),message:external_exports.string(),is_fatal:external_exports.boolean().optional()});expectTypesMatch(!0);supplier_name=external_exports.enum(["jlcpcb","macrofab","pcbway","digikey","mouser","lcsc"]);expectTypesMatch(!0);source_component_base=external_exports.object({type:external_exports.literal("source_component"),ftype:external_exports.string().optional(),source_component_id:external_exports.string(),name:external_exports.string(),manufacturer_part_number:external_exports.string().optional(),supplier_part_numbers:external_exports.record(supplier_name,external_exports.array(external_exports.string())).optional(),display_value:external_exports.string().optional(),display_name:external_exports.string().optional(),are_pins_interchangeable:external_exports.boolean().optional(),internally_connected_source_port_ids:external_exports.array(external_exports.array(external_exports.string())).optional(),source_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);source_simple_capacitor=source_component_base.extend({ftype:external_exports.literal("simple_capacitor"),capacitance,max_voltage_rating:voltage.optional(),display_capacitance:external_exports.string().optional(),max_decoupling_trace_length:distance.optional()});expectTypesMatch(!0);source_simple_resistor=source_component_base.extend({ftype:external_exports.literal("simple_resistor"),resistance,display_resistance:external_exports.string().optional()});expectTypesMatch(!0);source_simple_diode=source_component_base.extend({ftype:external_exports.literal("simple_diode")});expectTypesMatch(!0);source_simple_fiducial=source_component_base.extend({ftype:external_exports.literal("simple_fiducial")});expectTypesMatch(!0);source_simple_led=source_simple_diode.extend({ftype:external_exports.literal("simple_led"),color:external_exports.string().optional(),wavelength:external_exports.string().optional()});expectTypesMatch(!0);source_simple_ground=source_component_base.extend({ftype:external_exports.literal("simple_ground")});expectTypesMatch(!0);source_simple_chip=source_component_base.extend({ftype:external_exports.literal("simple_chip")});expectTypesMatch(!0);source_printed_part=source_component_base.extend({ftype:external_exports.literal("printedpart"),material:external_exports.enum(["pla","petg","nylon"]).optional(),color:external_exports.string().trim().min(1).optional()});expectTypesMatch(!0);source_subassembly=source_component_base.extend({ftype:external_exports.literal("subassembly")});expectTypesMatch(!0);source_motor=source_component_base.extend({ftype:external_exports.literal("motor")});expectTypesMatch(!0);source_simple_power_source=source_component_base.extend({ftype:external_exports.literal("simple_power_source"),voltage});expectTypesMatch(!0);source_simple_current_source=source_component_base.extend({ftype:external_exports.literal("simple_current_source"),current,frequency:frequency.optional(),peak_to_peak_current:current.optional(),wave_shape:external_exports.enum(["sine","square","triangle","sawtooth","dc"]).optional().default("dc"),phase:external_exports.number().optional(),duty_cycle:external_exports.number().min(0).max(1).optional()});expectTypesMatch(!0);source_simple_fuse=source_component_base.extend({ftype:external_exports.literal("simple_fuse"),current_rating_amps:external_exports.number().describe("Nominal current in amps the fuse is rated for"),voltage_rating_volts:external_exports.number().describe("Voltage rating in volts, e.g. \xB15V would be 5")});expectTypesMatch(!0);source_simple_ammeter=source_component_base.extend({ftype:external_exports.literal("simple_ammeter")});expectTypesMatch(!0);pin_voltage=external_exports.union([external_exports.number(),external_exports.string().trim().regex(/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?\s*(?:[fpnumkKMGTµμ]?V?|V)?$/,"Expected a scalar voltage, optionally with SI units")]).pipe(voltage).pipe(external_exports.number().finite()),source_pin_attributes=external_exports.object({is_input:external_exports.boolean().optional(),is_output:external_exports.boolean().optional(),is_bidirectional:external_exports.boolean().optional(),is_passive:external_exports.boolean().optional(),can_use_tri_state:external_exports.boolean().optional(),is_using_tri_state:external_exports.boolean().optional(),can_use_open_collector:external_exports.boolean().optional(),is_using_open_collector:external_exports.boolean().optional(),can_use_open_emitter:external_exports.boolean().optional(),is_using_open_emitter:external_exports.boolean().optional(),is_gpio:external_exports.boolean().optional(),highlight_color:external_exports.string().optional(),must_be_connected:external_exports.boolean().optional(),provides_power:external_exports.boolean().optional(),requires_power:external_exports.boolean().optional(),provides_ground:external_exports.boolean().optional(),requires_ground:external_exports.boolean().optional(),provides_voltage:pin_voltage.optional(),requires_voltage:pin_voltage.optional(),required_voltage_tolerance:external_exports.number().finite().min(0).max(1).optional(),do_not_connect:external_exports.boolean().optional(),include_in_board_pinout:external_exports.boolean().optional(),can_use_internal_pullup:external_exports.boolean().optional(),is_using_internal_pullup:external_exports.boolean().optional(),needs_external_pullup:external_exports.boolean().optional(),can_use_internal_pulldown:external_exports.boolean().optional(),is_using_internal_pulldown:external_exports.boolean().optional(),needs_external_pulldown:external_exports.boolean().optional(),can_use_open_drain:external_exports.boolean().optional(),is_using_open_drain:external_exports.boolean().optional(),can_use_push_pull:external_exports.boolean().optional(),is_using_push_pull:external_exports.boolean().optional(),should_have_decoupling_capacitor:external_exports.boolean().optional(),recommended_decoupling_capacitor_capacitance:external_exports.union([external_exports.string(),external_exports.number()]).optional(),is_configured_for_i2c_sda:external_exports.boolean().optional(),is_configured_for_i2c_scl:external_exports.boolean().optional(),is_configured_for_spi_mosi:external_exports.boolean().optional(),is_configured_for_spi_miso:external_exports.boolean().optional(),is_configured_for_spi_sck:external_exports.boolean().optional(),is_configured_for_spi_cs:external_exports.boolean().optional(),is_configured_for_uart_tx:external_exports.boolean().optional(),is_configured_for_uart_rx:external_exports.boolean().optional(),supports_i2c_sda:external_exports.boolean().optional(),supports_i2c_scl:external_exports.boolean().optional(),supports_spi_mosi:external_exports.boolean().optional(),supports_spi_miso:external_exports.boolean().optional(),supports_spi_sck:external_exports.boolean().optional(),supports_spi_cs:external_exports.boolean().optional(),supports_uart_tx:external_exports.boolean().optional(),supports_uart_rx:external_exports.boolean().optional()});expectTypesMatch(!0);source_simple_battery=source_component_base.extend({ftype:external_exports.literal("simple_battery"),capacity:battery_capacity});expectTypesMatch(!0);source_simple_inductor=source_component_base.extend({ftype:external_exports.literal("simple_inductor"),inductance,display_inductance:external_exports.string().optional(),max_current_rating:external_exports.number().optional()});expectTypesMatch(!0);source_simple_push_button=source_component_base.extend({ftype:external_exports.literal("simple_push_button")});expectTypesMatch(!0);source_simple_potentiometer=source_component_base.extend({ftype:external_exports.literal("simple_potentiometer"),max_resistance:resistance,display_max_resistance:external_exports.string().optional()});expectTypesMatch(!0);source_simple_crystal=source_component_base.extend({ftype:external_exports.literal("simple_crystal"),frequency:external_exports.number().describe("Frequency in Hz"),load_capacitance:external_exports.number().optional().describe("Load capacitance in pF"),pin_variant:external_exports.enum(["two_pin","four_pin"]).optional()});expectTypesMatch(!0);source_simple_pin_header=source_component_base.extend({ftype:external_exports.literal("simple_pin_header"),pin_count:external_exports.number(),gender:external_exports.enum(["male","female"]).optional().default("male")});expectTypesMatch(!0);source_simple_connector_standards=["usb_c","m2","jst_sh","jst_gh","jst_zh","jst_ph","jst_xh","jst_vh"],source_simple_connector=source_component_base.extend({ftype:external_exports.literal("simple_connector"),standard:external_exports.enum(source_simple_connector_standards).optional(),pin_count:external_exports.number().int().positive().optional()});expectTypesMatch(!0);source_simple_pinout=source_component_base.extend({ftype:external_exports.literal("simple_pinout")});expectTypesMatch(!0);source_simple_resonator=source_component_base.extend({ftype:external_exports.literal("simple_resonator"),load_capacitance:capacitance,equivalent_series_resistance:resistance.optional(),frequency});expectTypesMatch(!0);source_simple_transistor=source_component_base.extend({ftype:external_exports.literal("simple_transistor"),transistor_type:external_exports.enum(["npn","pnp"])});expectTypesMatch(!0);source_simple_test_point=source_component_base.extend({ftype:external_exports.literal("simple_test_point"),footprint_variant:external_exports.enum(["pad","through_hole"]).optional(),pad_shape:external_exports.enum(["rect","circle"]).optional(),pad_diameter:external_exports.union([external_exports.number(),external_exports.string()]).optional(),hole_diameter:external_exports.union([external_exports.number(),external_exports.string()]).optional(),width:external_exports.union([external_exports.number(),external_exports.string()]).optional(),height:external_exports.union([external_exports.number(),external_exports.string()]).optional()});expectTypesMatch(!0);source_simple_mosfet=source_component_base.extend({ftype:external_exports.literal("simple_mosfet"),channel_type:external_exports.enum(["n","p"]),mosfet_mode:external_exports.enum(["enhancement","depletion"])});expectTypesMatch(!0);source_simple_op_amp=source_component_base.extend({ftype:external_exports.literal("simple_op_amp")});expectTypesMatch(!0);source_simple_switch=source_component_base.extend({ftype:external_exports.literal("simple_switch")});expectTypesMatch(!0);source_project_metadata=external_exports.object({type:external_exports.literal("source_project_metadata"),name:external_exports.string().optional(),software_used_string:external_exports.string().optional(),project_url:external_exports.string().optional(),source_filesystem_md5_hash:external_exports.string().optional(),created_at:timestamp.optional()});expectTypesMatch(!0);source_missing_property_error=base_circuit_json_error.extend({type:external_exports.literal("source_missing_property_error"),source_missing_property_error_id:getZodPrefixedIdWithDefault("source_missing_property_error"),source_component_id:external_exports.string(),property_name:external_exports.string(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("source_missing_property_error").default("source_missing_property_error")}).describe("The source code is missing a property");expectTypesMatch(!0);source_failed_to_create_component_error=base_circuit_json_error.extend({type:external_exports.literal("source_failed_to_create_component_error"),source_failed_to_create_component_error_id:getZodPrefixedIdWithDefault("source_failed_to_create_component_error"),error_type:external_exports.literal("source_failed_to_create_component_error").default("source_failed_to_create_component_error"),component_name:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),parent_source_component_id:external_exports.string().optional(),pcb_center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),schematic_center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional()}).describe("Error emitted when a component fails to be constructed");expectTypesMatch(!0);source_invalid_component_property_error=base_circuit_json_error.extend({type:external_exports.literal("source_invalid_component_property_error"),source_invalid_component_property_error_id:getZodPrefixedIdWithDefault("source_invalid_component_property_error"),source_component_id:external_exports.string(),property_name:external_exports.string(),property_value:external_exports.unknown().optional(),expected_format:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("source_invalid_component_property_error").default("source_invalid_component_property_error")}).describe("The source component property is invalid");expectTypesMatch(!0);source_trace_not_connected_error=base_circuit_json_error.extend({type:external_exports.literal("source_trace_not_connected_error"),source_trace_not_connected_error_id:getZodPrefixedIdWithDefault("source_trace_not_connected_error"),error_type:external_exports.literal("source_trace_not_connected_error").default("source_trace_not_connected_error"),subcircuit_id:external_exports.string().optional(),source_group_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),connected_source_port_ids:external_exports.array(external_exports.string()).optional(),selectors_not_found:external_exports.array(external_exports.string()).optional()}).describe("Occurs when a source trace selector does not match any ports");expectTypesMatch(!0);source_property_ignored_warning=external_exports.object({type:external_exports.literal("source_property_ignored_warning"),source_property_ignored_warning_id:getZodPrefixedIdWithDefault("source_property_ignored_warning"),source_component_id:external_exports.string(),property_name:external_exports.string(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("source_property_ignored_warning").default("source_property_ignored_warning"),message:external_exports.string()}).describe("The source property was ignored");expectTypesMatch(!0);source_pin_missing_trace_warning=external_exports.object({type:external_exports.literal("source_pin_missing_trace_warning"),source_pin_missing_trace_warning_id:getZodPrefixedIdWithDefault("source_pin_missing_trace_warning"),warning_type:external_exports.literal("source_pin_missing_trace_warning").default("source_pin_missing_trace_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source component pin is missing a trace connection");expectTypesMatch(!0);source_missing_manufacturer_part_number_warning=external_exports.object({type:external_exports.literal("source_missing_manufacturer_part_number_warning"),source_missing_manufacturer_part_number_warning_id:getZodPrefixedIdWithDefault("source_missing_manufacturer_part_number_warning"),warning_type:external_exports.literal("source_missing_manufacturer_part_number_warning").default("source_missing_manufacturer_part_number_warning"),message:external_exports.string(),source_component_id:external_exports.string(),standard:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source component is missing its manufacturer part number");expectTypesMatch(!0);source_refdes_convention_warning=external_exports.object({type:external_exports.literal("source_refdes_convention_warning"),source_refdes_convention_warning_id:getZodPrefixedIdWithDefault("source_refdes_convention_warning"),warning_type:external_exports.literal("source_refdes_convention_warning").default("source_refdes_convention_warning"),message:external_exports.string(),source_component_id:external_exports.string(),refdes:external_exports.string(),source_component_ftype:external_exports.string(),expected_prefixes:external_exports.array(external_exports.string()),actual_prefix:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source component reference designator does not match the component type convention");expectTypesMatch(!0);source_component_availability_warning=external_exports.object({type:external_exports.literal("source_component_availability_warning"),source_component_availability_warning_id:getZodPrefixedIdWithDefault("source_component_availability_warning"),warning_type:external_exports.literal("source_component_availability_warning").default("source_component_availability_warning"),message:external_exports.string(),source_component_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),supplier_name,supplier_part_numbers:external_exports.array(external_exports.string()).nonempty()}).describe("Warning emitted when no supplier alternative can be confirmed in stock. Availability may be unknown or change over time.");expectTypesMatch(!0);source_simple_voltage_probe=source_component_base.extend({ftype:external_exports.literal("simple_voltage_probe")});expectTypesMatch(!0);source_interconnect=source_component_base.extend({ftype:external_exports.literal("interconnect")});expectTypesMatch(!0);source_i2c_misconfigured_error=base_circuit_json_error.extend({type:external_exports.literal("source_i2c_misconfigured_error"),source_i2c_misconfigured_error_id:getZodPrefixedIdWithDefault("source_i2c_misconfigured_error"),error_type:external_exports.literal("source_i2c_misconfigured_error").default("source_i2c_misconfigured_error"),source_port_ids:external_exports.array(external_exports.string())}).describe("Error emitted when incompatible I2C pins (e.g. SDA and SCL) are connected to the same net");expectTypesMatch(!0);source_component_misconfigured_error=base_circuit_json_error.extend({type:external_exports.literal("source_component_misconfigured_error"),source_component_misconfigured_error_id:getZodPrefixedIdWithDefault("source_component_misconfigured_error"),error_type:external_exports.literal("source_component_misconfigured_error").default("source_component_misconfigured_error"),source_component_ids:external_exports.array(external_exports.string()),source_port_ids:external_exports.array(external_exports.string()).optional()}).describe("Error emitted when one or more source components have an invalid or conflicting configuration");expectTypesMatch(!0);source_simple_voltage_source=source_component_base.extend({ftype:external_exports.literal("simple_voltage_source"),voltage,frequency:frequency.optional(),peak_to_peak_voltage:voltage.optional(),wave_shape:external_exports.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation.optional(),duty_cycle:external_exports.number().optional().describe("Duty cycle as a fraction (0 to 1)"),pulse_delay:ms.optional(),rise_time:ms.optional(),fall_time:ms.optional(),pulse_width:ms.optional(),period:ms.optional()});expectTypesMatch(!0);source_datasheet=external_exports.object({type:external_exports.literal("source_datasheet"),source_datasheet_id:external_exports.string(),manufacturer_part_number:external_exports.string(),datasheet_pdf_urls:external_exports.array(external_exports.string().url()),description:external_exports.string().optional()});expectTypesMatch(!0);any_source_component=external_exports.union([source_datasheet,source_simple_resistor,source_simple_capacitor,source_simple_diode,source_simple_fiducial,source_simple_led,source_simple_ground,source_simple_chip,source_printed_part,source_subassembly,source_motor,source_simple_power_source,source_simple_current_source,source_simple_ammeter,source_simple_battery,source_simple_inductor,source_simple_push_button,source_simple_potentiometer,source_simple_crystal,source_simple_pin_header,source_simple_connector,source_simple_pinout,source_simple_resonator,source_simple_switch,source_simple_transistor,source_simple_test_point,source_simple_mosfet,source_simple_op_amp,source_simple_fuse,source_simple_voltage_probe,source_interconnect,source_simple_voltage_source,source_project_metadata,source_missing_property_error,source_invalid_component_property_error,source_failed_to_create_component_error,source_trace_not_connected_error,source_property_ignored_warning,source_pin_missing_trace_warning,source_missing_manufacturer_part_number_warning,source_refdes_convention_warning,source_component_availability_warning,source_i2c_misconfigured_error,source_component_misconfigured_error]);expectTypesMatch(!0);source_port=external_exports.object({type:external_exports.literal("source_port"),pin_number:external_exports.number().optional(),port_hints:external_exports.array(external_exports.string()).optional(),name:external_exports.string(),source_port_id:external_exports.string(),source_component_id:external_exports.string().optional(),source_group_id:external_exports.string().optional(),most_frequently_referenced_by_name:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional()}).merge(source_pin_attributes);expectTypesMatch(!0);source_component_internal_connection=external_exports.object({type:external_exports.literal("source_component_internal_connection"),source_component_internal_connection_id:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);source_trace=external_exports.object({type:external_exports.literal("source_trace"),source_trace_id:external_exports.string(),connected_source_port_ids:external_exports.array(external_exports.string()),connected_source_net_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),max_length:external_exports.number().optional(),max_via_count:external_exports.number().int().nonnegative().optional(),name:external_exports.string().optional(),min_trace_thickness:external_exports.number().optional(),display_name:external_exports.string().optional()});expectTypesMatch(!0);source_group=external_exports.object({type:external_exports.literal("source_group"),source_group_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),parent_subcircuit_id:external_exports.string().optional(),parent_source_group_id:external_exports.string().optional(),is_subcircuit:external_exports.boolean().optional(),show_as_schematic_box:external_exports.boolean().optional(),name:external_exports.string().optional(),was_automatically_named:external_exports.boolean().optional()});expectTypesMatch(!0);source_net=external_exports.object({type:external_exports.literal("source_net"),source_net_id:external_exports.string(),name:external_exports.string(),member_source_group_ids:external_exports.array(external_exports.string()),is_power:external_exports.boolean().optional(),is_ground:external_exports.boolean().optional(),is_digital_signal:external_exports.boolean().optional(),is_analog_signal:external_exports.boolean().optional(),is_positive_voltage_source:external_exports.boolean().optional(),trace_width:external_exports.number().optional(),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional()});expectTypesMatch(!0);source_board=external_exports.object({type:external_exports.literal("source_board"),source_board_id:external_exports.string(),source_group_id:external_exports.string(),title:external_exports.string().optional()}).describe("Defines a board in the source domain");expectTypesMatch(!0);source_ambiguous_port_reference=base_circuit_json_error.extend({type:external_exports.literal("source_ambiguous_port_reference"),source_ambiguous_port_reference_id:getZodPrefixedIdWithDefault("source_ambiguous_port_reference"),error_type:external_exports.literal("source_ambiguous_port_reference").default("source_ambiguous_port_reference"),source_port_id:external_exports.string().optional(),source_component_id:external_exports.string().optional()}).describe("Error emitted when a port hint matches multiple non-overlapping pads, making the port reference ambiguous");expectTypesMatch(!0);source_pcb_ground_plane=external_exports.object({type:external_exports.literal("source_pcb_ground_plane"),source_pcb_ground_plane_id:external_exports.string(),source_group_id:external_exports.string(),source_net_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Defines a ground plane in the source domain");expectTypesMatch(!0);all_layers=["top","bottom","inner1","inner2","inner3","inner4","inner5","inner6","inner7","inner8"],layer_string=external_exports.enum(all_layers),layer_ref=layer_string.or(external_exports.object({name:layer_string})).transform(layer=>typeof layer=="string"?layer:layer.name);expectTypesMatch(!0);visible_layer=external_exports.enum(["top","bottom"]),source_manually_placed_via=external_exports.object({type:external_exports.literal("source_manually_placed_via"),source_manually_placed_via_id:external_exports.string(),source_group_id:external_exports.string(),source_net_id:external_exports.string().min(1).optional(),subcircuit_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional()}).describe("Defines a via that is manually placed in the source domain");expectTypesMatch(!0);source_unnamed_trace_warning=external_exports.object({type:external_exports.literal("source_unnamed_trace_warning"),source_unnamed_trace_warning_id:getZodPrefixedIdWithDefault("source_unnamed_trace_warning"),warning_type:external_exports.literal("source_unnamed_trace_warning").default("source_unnamed_trace_warning"),message:external_exports.string(),source_trace_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a source trace is missing a name");expectTypesMatch(!0);source_no_power_pin_defined_warning=external_exports.object({type:external_exports.literal("source_no_power_pin_defined_warning"),source_no_power_pin_defined_warning_id:getZodPrefixedIdWithDefault("source_no_power_pin_defined_warning"),warning_type:external_exports.literal("source_no_power_pin_defined_warning").default("source_no_power_pin_defined_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a chip has no source ports with requires_power=true");expectTypesMatch(!0);source_no_ground_pin_defined_warning=external_exports.object({type:external_exports.literal("source_no_ground_pin_defined_warning"),source_no_ground_pin_defined_warning_id:getZodPrefixedIdWithDefault("source_no_ground_pin_defined_warning"),warning_type:external_exports.literal("source_no_ground_pin_defined_warning").default("source_no_ground_pin_defined_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a chip has no source ports marked as ground pins");expectTypesMatch(!0);source_component_pins_underspecified_warning=external_exports.object({type:external_exports.literal("source_component_pins_underspecified_warning"),source_component_pins_underspecified_warning_id:getZodPrefixedIdWithDefault("source_component_pins_underspecified_warning"),warning_type:external_exports.literal("source_component_pins_underspecified_warning").default("source_component_pins_underspecified_warning"),message:external_exports.string(),source_component_id:external_exports.string(),source_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when all ports on a source component are underspecified");expectTypesMatch(!0);source_pin_must_be_connected_error=base_circuit_json_error.extend({type:external_exports.literal("source_pin_must_be_connected_error"),source_pin_must_be_connected_error_id:getZodPrefixedIdWithDefault("source_pin_must_be_connected_error"),error_type:external_exports.literal("source_pin_must_be_connected_error").default("source_pin_must_be_connected_error"),source_component_id:external_exports.string(),source_port_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a pin with mustBeConnected attribute is not connected to any trace");expectTypesMatch(!0);unknown_error_finding_part=base_circuit_json_error.extend({type:external_exports.literal("unknown_error_finding_part"),unknown_error_finding_part_id:getZodPrefixedIdWithDefault("unknown_error_finding_part"),error_type:external_exports.literal("unknown_error_finding_part").default("unknown_error_finding_part"),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when an unexpected error occurs while finding a part");expectTypesMatch(!0);source_part_not_found_warning=external_exports.object({type:external_exports.literal("source_part_not_found_warning"),source_part_not_found_warning_id:getZodPrefixedIdWithDefault("source_part_not_found_warning"),warning_type:external_exports.literal("source_part_not_found_warning").default("source_part_not_found_warning"),message:external_exports.string(),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),supplier_name:supplier_name.optional(),manufacturer_part_number:external_exports.string().optional(),supplier_part_number:external_exports.string().optional(),part_name:external_exports.string().optional()}).describe("Warning emitted when a requested part can not be found");expectTypesMatch(!0);source_confusing_net_name_warning=external_exports.object({type:external_exports.literal("source_confusing_net_name_warning"),source_confusing_net_name_warning_id:getZodPrefixedIdWithDefault("source_confusing_net_name_warning"),warning_type:external_exports.literal("source_confusing_net_name_warning").default("source_confusing_net_name_warning"),message:external_exports.string(),source_net_ids:external_exports.array(external_exports.string()).min(2),net_name:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when electrically disconnected source nets share a name");expectTypesMatch(!0);route_length=external_exports.union([external_exports.number().nonnegative().finite(),external_exports.object({reference:external_exports.literal("longest_manhattan"),source_trace_ids:external_exports.array(external_exports.string()).min(1).optional(),offset:external_exports.number().finite().optional()})]),trace_spacing=external_exports.union([external_exports.number().positive().finite(),external_exports.object({width_multiplier:external_exports.number().positive().finite()})]),source_bus=external_exports.object({type:external_exports.literal("source_bus"),source_bus_id:external_exports.string(),name:external_exports.string().optional(),source_trace_ids:external_exports.array(external_exports.string()).min(1),max_length_skew:external_exports.number().nonnegative().finite().optional(),target_impedance:external_exports.number().positive().finite().optional(),target_differential_impedance:external_exports.number().positive().finite().optional(),differential_pair:external_exports.object({positive_source_trace_id:external_exports.string(),negative_source_trace_id:external_exports.string(),trace_gap:external_exports.number().positive().finite().optional(),max_uncoupled_length:external_exports.number().nonnegative().finite().optional()}).optional(),length_match_source_trace_ids:external_exports.array(external_exports.string()).min(1).optional(),min_length:route_length.optional(),max_length:route_length.optional(),target_length:route_length.optional(),length_tolerance:external_exports.number().nonnegative().finite().optional(),pcb_trace_spacing:trace_spacing.optional(),pcb_spacing_to_other_signals:trace_spacing.optional(),target_impedance_min:external_exports.number().positive().finite().optional(),target_impedance_max:external_exports.number().positive().finite().optional(),target_differential_impedance_min:external_exports.number().positive().finite().optional(),target_differential_impedance_max:external_exports.number().positive().finite().optional(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);source_runtime_error=base_circuit_json_error.pick({message:!0,error_type:!0}).extend({type:external_exports.literal("source_runtime_error"),source_runtime_error_id:getZodPrefixedIdWithDefault("source_runtime_error"),error_type:external_exports.literal("source_runtime_error").default("source_runtime_error"),phase_name:external_exports.string().optional()}).describe("An unexpected runtime failure while generating or validating a circuit");expectTypesMatch(!0);schematic_box=external_exports.object({type:external_exports.literal("schematic_box"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),width:distance,height:distance,is_dashed:external_exports.boolean().default(!1),x:distance,y:distance,subcircuit_id:external_exports.string().optional()}).describe("Draws a box on the schematic");expectTypesMatch(!0);schematic_path=external_exports.object({type:external_exports.literal("schematic_path"),schematic_path_id:getZodPrefixedIdWithDefault("schematic_path"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),fill_color:external_exports.string().optional(),is_filled:external_exports.boolean().optional(),is_dashed:external_exports.boolean().default(!1),stroke_width:distance.nullable().optional(),stroke_color:external_exports.string().optional(),dash_length:distance.optional(),dash_gap:distance.optional(),points:external_exports.array(point),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);schematic_pin_styles=external_exports.record(external_exports.object({left_margin:length.optional(),right_margin:length.optional(),top_margin:length.optional(),bottom_margin:length.optional()})),schematic_component_port_arrangement_by_size=external_exports.object({left_size:external_exports.number(),right_size:external_exports.number(),top_size:external_exports.number().optional(),bottom_size:external_exports.number().optional()});expectTypesMatch(!0);schematic_component_port_arrangement_by_sides=external_exports.object({left_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),right_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),top_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["left-to-right","right-to-left"]).optional()}).optional(),bottom_side:external_exports.object({pins:external_exports.array(external_exports.number()),direction:external_exports.enum(["left-to-right","right-to-left"]).optional()}).optional()});expectTypesMatch(!0);port_arrangement=external_exports.union([schematic_component_port_arrangement_by_size,schematic_component_port_arrangement_by_sides]),schematic_component=external_exports.object({type:external_exports.literal("schematic_component"),size,center:point,source_component_id:external_exports.string().optional(),schematic_component_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),pin_spacing:length.optional(),pin_styles:schematic_pin_styles.optional(),box_width:length.optional(),symbol_name:external_exports.string().optional(),port_arrangement:port_arrangement.optional(),port_labels:external_exports.record(external_exports.string()).optional(),symbol_display_value:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),schematic_group_id:external_exports.string().optional(),is_schematic_group:external_exports.boolean().optional(),source_group_id:external_exports.string().optional(),is_box_with_pins:external_exports.boolean().optional().default(!0)});expectTypesMatch(!0);schematicSymbolMetadata=external_exports.object({kicad_symbol:kicadSymbolMetadata.optional()}).catchall(external_exports.unknown()),schematic_symbol=external_exports.object({type:external_exports.literal("schematic_symbol"),schematic_symbol_id:external_exports.string(),name:external_exports.string().optional(),metadata:schematicSymbolMetadata.optional()}).describe("Defines a named schematic symbol that can be referenced by components.");expectTypesMatch(!0);schematic_line=external_exports.object({type:external_exports.literal("schematic_line"),schematic_line_id:getZodPrefixedIdWithDefault("schematic_line"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),x1:distance,y1:distance,x2:distance,y2:distance,stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_dashed:external_exports.boolean().default(!1),dash_length:distance.optional(),dash_gap:distance.optional(),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled line on the schematic");expectTypesMatch(!0);schematic_rect=external_exports.object({type:external_exports.literal("schematic_rect"),schematic_rect_id:getZodPrefixedIdWithDefault("schematic_rect"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),center:point,width:distance,height:distance,rotation:rotation.default(0),stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_filled:external_exports.boolean().default(!1),fill_color:external_exports.string().optional(),is_dashed:external_exports.boolean().default(!1),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled rectangle on the schematic");expectTypesMatch(!0);schematic_circle=external_exports.object({type:external_exports.literal("schematic_circle"),schematic_circle_id:getZodPrefixedIdWithDefault("schematic_circle"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),center:point,radius:distance,stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_filled:external_exports.boolean().default(!1),fill_color:external_exports.string().optional(),is_dashed:external_exports.boolean().default(!1),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled circle on the schematic");expectTypesMatch(!0);schematic_arc=external_exports.object({type:external_exports.literal("schematic_arc"),schematic_arc_id:getZodPrefixedIdWithDefault("schematic_arc"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),center:point,radius:distance,start_angle_degrees:rotation,end_angle_degrees:rotation,direction:external_exports.enum(["clockwise","counterclockwise"]).default("counterclockwise"),stroke_width:distance.nullable().optional(),color:external_exports.string().default("#000000"),is_dashed:external_exports.boolean().default(!1),subcircuit_id:external_exports.string().optional()}).describe("Draws a styled arc on the schematic");expectTypesMatch(!0);schematic_trace=external_exports.object({type:external_exports.literal("schematic_trace"),schematic_trace_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),junctions:external_exports.array(external_exports.object({x:external_exports.number(),y:external_exports.number()})),edges:external_exports.array(external_exports.object({from:external_exports.object({x:external_exports.number(),y:external_exports.number()}),to:external_exports.object({x:external_exports.number(),y:external_exports.number()}),is_crossing:external_exports.boolean().optional(),from_schematic_port_id:external_exports.string().optional(),to_schematic_port_id:external_exports.string().optional()})),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional()});expectTypesMatch(!0);fivePointAnchor=external_exports.enum(["center","left","right","top","bottom"]);expectTypesMatch(!0);schematic_text_part=external_exports.object({text:external_exports.string(),is_overlined:external_exports.boolean().optional()}),schematic_text=external_exports.object({type:external_exports.literal("schematic_text"),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),schematic_symbol_id:external_exports.string().optional(),schematic_text_id:external_exports.string(),source_trace_id:external_exports.string().optional(),text:external_exports.string(),text_parts:external_exports.array(schematic_text_part).min(1).optional(),display_superscript:external_exports.string().optional(),font_size:external_exports.number().default(.18),position:external_exports.object({x:distance,y:distance}),rotation:external_exports.number().default(0),anchor:external_exports.union([fivePointAnchor.describe("legacy"),ninePointAnchor]).default("center"),color:external_exports.string().default("#000000"),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);schematic_port=external_exports.object({type:external_exports.literal("schematic_port"),schematic_port_id:external_exports.string(),source_port_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),center:point,facing_direction:external_exports.enum(["up","down","left","right"]).optional(),distance_from_component_edge:external_exports.number().optional(),side_of_component:external_exports.enum(["top","bottom","left","right"]).optional(),true_ccw_index:external_exports.number().optional(),pin_number:external_exports.number().optional(),display_pin_label:external_exports.string().optional(),display_pin_label_text_parts:external_exports.array(schematic_text_part).min(1).optional(),display_pin_label_font_size:external_exports.number().positive().finite().optional(),subcircuit_id:external_exports.string().optional(),is_connected:external_exports.boolean().optional(),is_internal_circuit_port:external_exports.boolean().optional(),is_overlapping_internal_circuit_port:external_exports.boolean().optional(),has_input_arrow:external_exports.boolean().optional(),has_output_arrow:external_exports.boolean().optional(),is_drawn_with_inversion_circle:external_exports.boolean().optional()}).describe("Defines a port on a schematic component");expectTypesMatch(!0);schematic_net_label=external_exports.object({type:external_exports.literal("schematic_net_label"),schematic_net_label_id:getZodPrefixedIdWithDefault("schematic_net_label"),schematic_sheet_id:external_exports.string().optional(),schematic_trace_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),source_net_id:external_exports.string(),center:point,anchor_position:point.optional(),anchor_side:external_exports.enum(["top","bottom","left","right"]),text:external_exports.string(),display_superscript:external_exports.string().optional(),symbol_name:external_exports.string().optional(),is_movable:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);schematic_error=base_circuit_json_error.extend({type:external_exports.literal("schematic_error"),schematic_error_id:external_exports.string(),error_type:external_exports.literal("schematic_port_not_found").default("schematic_port_not_found"),subcircuit_id:external_exports.string().optional()}).describe("Defines a schematic error on the schematic");expectTypesMatch(!0);schematic_layout_error=base_circuit_json_error.extend({type:external_exports.literal("schematic_layout_error"),schematic_layout_error_id:getZodPrefixedIdWithDefault("schematic_layout_error"),error_type:external_exports.literal("schematic_layout_error").default("schematic_layout_error"),source_group_id:external_exports.string(),schematic_group_id:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when schematic layout fails for a group");expectTypesMatch(!0);schematic_debug_object_base=external_exports.object({type:external_exports.literal("schematic_debug_object"),label:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}),schematic_debug_rect=schematic_debug_object_base.extend({shape:external_exports.literal("rect"),center:point,size}),schematic_debug_line=schematic_debug_object_base.extend({shape:external_exports.literal("line"),start:point,end:point}),schematic_debug_point=schematic_debug_object_base.extend({shape:external_exports.literal("point"),center:point}),schematic_debug_object=external_exports.discriminatedUnion("shape",[schematic_debug_rect,schematic_debug_line,schematic_debug_point]);expectTypesMatch(!0);schematic_voltage_probe=external_exports.object({type:external_exports.literal("schematic_voltage_probe"),schematic_voltage_probe_id:external_exports.string(),schematic_sheet_id:external_exports.string().optional(),source_component_id:external_exports.string().optional(),name:external_exports.string().optional(),position:point,schematic_trace_id:external_exports.string(),voltage:voltage.optional(),subcircuit_id:external_exports.string().optional(),color:external_exports.string().optional(),label_alignment:ninePointAnchor.optional()}).describe("Defines a voltage probe measurement point on a schematic trace");expectTypesMatch(!0);schematic_manual_edit_conflict_warning=external_exports.object({type:external_exports.literal("schematic_manual_edit_conflict_warning"),schematic_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault("schematic_manual_edit_conflict_warning"),warning_type:external_exports.literal("schematic_manual_edit_conflict_warning").default("schematic_manual_edit_conflict_warning"),message:external_exports.string(),schematic_component_id:external_exports.string(),schematic_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),source_component_id:external_exports.string()}).describe("Warning emitted when a component has both manual placement and explicit schX/schY coordinates");expectTypesMatch(!0);schematic_component_overlap_warning=external_exports.object({type:external_exports.literal("schematic_component_overlap_warning"),schematic_component_overlap_warning_id:getZodPrefixedIdWithDefault("schematic_component_overlap_warning"),warning_type:external_exports.literal("schematic_component_overlap_warning").default("schematic_component_overlap_warning"),message:external_exports.string(),schematic_component_ids:external_exports.tuple([external_exports.string(),external_exports.string()]),schematic_sheet_id:external_exports.string().optional()}).describe("Warning emitted when the rendered bounds of two schematic components overlap");expectTypesMatch(!0);schematic_component_styling_warning=external_exports.object({type:external_exports.literal("schematic_component_styling_warning"),schematic_component_styling_warning_id:getZodPrefixedIdWithDefault("schematic_component_styling_warning"),warning_type:external_exports.literal("schematic_component_styling_warning").default("schematic_component_styling_warning"),message:external_exports.string(),schematic_component_id:external_exports.string(),styling_issue_type:external_exports.string(),schematic_port_ids:external_exports.array(external_exports.string()).optional(),source_component_id:external_exports.string().optional(),schematic_sheet_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a schematic component has a visual styling issue");expectTypesMatch(!0);schematic_sheet_styling_warning=external_exports.object({type:external_exports.literal("schematic_sheet_styling_warning"),schematic_sheet_styling_warning_id:getZodPrefixedIdWithDefault("schematic_sheet_styling_warning"),warning_type:external_exports.literal("schematic_sheet_styling_warning").default("schematic_sheet_styling_warning"),message:external_exports.string(),schematic_sheet_id:external_exports.string(),styling_issue_type:external_exports.literal("non_default_sheet_size"),subcircuit_id:external_exports.string().optional()}).describe("Style warning emitted when a schematic sheet uses a non-default size");expectTypesMatch(!0);schematic_element_outside_sheet_warning=external_exports.object({type:external_exports.literal("schematic_element_outside_sheet_warning"),schematic_element_outside_sheet_warning_id:getZodPrefixedIdWithDefault("schematic_element_outside_sheet_warning"),warning_type:external_exports.literal("schematic_element_outside_sheet_warning").default("schematic_element_outside_sheet_warning"),message:external_exports.string(),schematic_sheet_id:external_exports.string(),schematic_element_type:external_exports.enum(["schematic_component","schematic_net_label","schematic_trace"]),schematic_element_id:external_exports.string()}).describe("Warning emitted when a schematic component, net label, or trace extends outside its schematic sheet");expectTypesMatch(!0);positiveFiniteDistance=distance.pipe(external_exports.number().positive().finite()),schematic_graphic=external_exports.object({type:external_exports.literal("schematic_graphic"),schematic_graphic_id:getZodPrefixedIdWithDefault("schematic_graphic"),schematic_sheet_id:external_exports.string().optional(),asset:asset.optional(),svg_content:external_exports.string().optional(),width:positiveFiniteDistance.optional(),height:positiveFiniteDistance.optional()}).describe("References a graphic asset or inline SVG content with optional centered layout bounds on a schematic sheet").superRefine(({asset:asset23,svg_content},ctx)=>{asset23===void 0&&svg_content===void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"At least one of asset or svg_content is required"})});expectTypesMatch(!0);schematic_group=external_exports.object({type:external_exports.literal("schematic_group"),schematic_group_id:getZodPrefixedIdWithDefault("schematic_group"),schematic_sheet_id:external_exports.string().optional(),source_group_id:external_exports.string(),is_subcircuit:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),width:length,height:length,center:point,schematic_component_ids:external_exports.array(external_exports.string()),show_as_schematic_box:external_exports.boolean().optional(),name:external_exports.string().optional(),description:external_exports.string().optional()}).describe("Defines a group of components on the schematic");expectTypesMatch(!0);schematic_table=external_exports.object({type:external_exports.literal("schematic_table"),schematic_table_id:getZodPrefixedIdWithDefault("schematic_table"),schematic_sheet_id:external_exports.string().optional(),anchor_position:point,column_widths:external_exports.array(distance),row_heights:external_exports.array(distance),cell_padding:distance.optional(),border_width:distance.optional(),subcircuit_id:external_exports.string().optional(),schematic_component_id:external_exports.string().optional(),anchor:ninePointAnchor.optional()}).describe("Defines a table on the schematic");expectTypesMatch(!0);schematic_table_cell=external_exports.object({type:external_exports.literal("schematic_table_cell"),schematic_table_cell_id:getZodPrefixedIdWithDefault("schematic_table_cell"),schematic_sheet_id:external_exports.string().optional(),schematic_table_id:external_exports.string(),start_row_index:external_exports.number(),end_row_index:external_exports.number(),start_column_index:external_exports.number(),end_column_index:external_exports.number(),text:external_exports.string().optional(),center:point,width:distance,height:distance,horizontal_align:external_exports.enum(["left","center","right"]).optional(),vertical_align:external_exports.enum(["top","middle","bottom"]).optional(),font_size:distance.optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a cell within a schematic_table");expectTypesMatch(!0);schematic_sheet_size=external_exports.enum(["a4","ansi_b"]),schematic_sheet=external_exports.object({type:external_exports.literal("schematic_sheet"),schematic_sheet_id:getZodPrefixedIdWithDefault("schematic_sheet"),name:external_exports.string().optional(),sheet_index:external_exports.number().optional(),sheet_size:schematic_sheet_size.optional(),sheet_width:external_exports.number().positive().optional(),sheet_height:external_exports.number().positive().optional(),subcircuit_id:external_exports.string().optional(),outline_color:external_exports.string().optional()}).describe("Defines a schematic sheet or page that components can be placed on");expectTypesMatch(!0);schematic_missing_sheet_warning=external_exports.object({type:external_exports.literal("schematic_missing_sheet_warning"),schematic_missing_sheet_warning_id:getZodPrefixedIdWithDefault("schematic_missing_sheet_warning"),warning_type:external_exports.literal("schematic_missing_sheet_warning").default("schematic_missing_sheet_warning"),message:external_exports.string()}).describe("Circuit-wide warning emitted when a schematic has no schematic sheet. Display as a banner without attaching it to a component or drawing a target outline or leader line.");expectTypesMatch(!0);point_with_bulge=external_exports.object({x:distance,y:distance,bulge:external_exports.number().optional()});expectTypesMatch(!0);ring=external_exports.object({vertices:external_exports.array(point_with_bulge)});expectTypesMatch(!0);brep_shape=external_exports.object({outer_ring:ring,inner_rings:external_exports.array(ring).default([])});expectTypesMatch(!0);insertionDirectionToCanonical={from_left:"from_left",from_right:"from_right",from_top:"from_top",from_bottom:"from_bottom",from_above:"from_above",from_below:"from_below",from_x_neg:"from_left",from_x_pos:"from_right",from_y_pos:"from_top",from_y_neg:"from_bottom",from_z_pos:"from_above",from_z_neg:"from_below",from_front:"from_top",from_back:"from_bottom"},insertionDirectionToVector={from_left:{x:-1,y:0,z:0},from_right:{x:1,y:0,z:0},from_top:{x:0,y:1,z:0},from_bottom:{x:0,y:-1,z:0},from_above:{x:0,y:0,z:1},from_below:{x:0,y:0,z:-1}},insertion_direction=external_exports.enum(["from_left","from_right","from_top","from_bottom","from_above","from_below","from_x_neg","from_x_pos","from_y_pos","from_y_neg","from_z_pos","from_z_neg","from_front","from_back"]).transform(value=>insertionDirectionToCanonical[value]).describe('The side exposing the receptacle where the cable or mating part is attached, following the 2D PCB diagram convention, not a 3D viewport frame. In project coordinate space, "from_top" is +Y, "from_bottom" -Y, "from_left" -X, "from_right" +X, "from_above" +Z and "from_below" -Z. A receptacle on the +Y edge is "from_top" even though the plug moves in -Y as it seats. Cartesian spellings such as "from_y_pos" are accepted and normalized to the named values, as are the deprecated "from_front" (now "from_top") and "from_back" (now "from_bottom").');expectTypesMatch(!0);expectTypesMatch(!0);pcb_pin1_location=external_exports.enum(["leftside_top","leftside_bottom","rightside_top","rightside_bottom","topside_left","topside_right","bottomside_left","bottomside_right"]);expectTypesMatch(!0);pin1LocationRotationCycles=[["leftside_top","bottomside_left","rightside_bottom","topside_right"],["leftside_bottom","bottomside_right","rightside_top","topside_left"]],getRotationBetweenPcbPin1Locations=(from,to3)=>{for(let cycle of pin1LocationRotationCycles){let fromIndex=cycle.indexOf(from),toIndex=cycle.indexOf(to3);if(fromIndex!==-1&&toIndex!==-1)return(toIndex-fromIndex+cycle.length)%cycle.length*90}return null},pcb_route_hint=external_exports.object({x:distance,y:distance,via:external_exports.boolean().optional(),via_to_layer:layer_ref.optional()}),pcb_route_hints=external_exports.array(pcb_route_hint);expectTypesMatch(!0);expectTypesMatch(!0);route_hint_point=external_exports.object({x:distance,y:distance,via:external_exports.boolean().optional(),to_layer:layer_ref.optional(),trace_width:distance.optional()});expectTypesMatch(!0);manufacturing_drc_properties=external_exports.object({min_trace_width:length.optional(),min_board_edge_clearance:length.optional(),min_via_hole_edge_to_via_hole_edge_clearance:length.optional(),min_plated_hole_drill_edge_to_drill_edge_clearance:length.optional(),min_trace_to_pad_edge_clearance:length.optional(),min_trace_to_hole_edge_clearance:length.optional().describe("Minimum distance from a trace copper edge to a non-plated hole edge, in mm. No default is applied when omitted."),min_pad_edge_to_pad_edge_clearance:length.optional(),min_same_net_trace_edge_to_trace_edge_clearance:length.optional(),min_different_net_trace_edge_to_trace_edge_clearance:length.optional(),min_via_edge_to_pad_edge_clearance:length.optional(),min_via_hole_diameter:length.optional(),min_via_pad_diameter:length.optional()}),pcb_component=external_exports.object({type:external_exports.literal("pcb_component"),pcb_component_id:getZodPrefixedIdWithDefault("pcb_component"),source_component_id:external_exports.string(),center:point,layer:layer_ref,rotation,display_offset_x:external_exports.string().optional().describe("How to display the x offset for this part, usually corresponding with how the user specified it"),display_offset_y:external_exports.string().optional().describe("How to display the y offset for this part, usually corresponding with how the user specified it"),width:length,height:length,do_not_place:external_exports.boolean().optional(),is_allowed_to_be_off_board:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),position_mode:external_exports.enum(["packed","relative_to_group_anchor","relative_to_another_component","none"]).optional(),anchor_position:point.optional(),anchor_alignment:ninePointAnchor.optional(),positioned_relative_to_pcb_group_id:external_exports.string().optional(),positioned_relative_to_pcb_board_id:external_exports.string().optional(),cable_insertion_center:point.optional(),insertion_direction:insertion_direction.optional(),pin1_location:pcb_pin1_location.optional().describe("Location of pin 1 on the unrotated, top-view component footprint"),supplier_pin1_location_map:external_exports.record(supplier_name,pcb_pin1_location).optional().describe("Pin 1 location for each supplier's unrotated, top-view footprint"),metadata:external_exports.object({kicad_footprint:kicadFootprintMetadata.optional()}).optional(),obstructs_within_bounds:external_exports.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");expectTypesMatch(!0);pcb_debug_object_base=external_exports.object({type:external_exports.literal("pcb_debug_object"),pcb_debug_object_id:getZodPrefixedIdWithDefault("pcb_debug_object"),label:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}),pcb_debug_rect=pcb_debug_object_base.extend({shape:external_exports.literal("rect"),center:point,size}),pcb_debug_line=pcb_debug_object_base.extend({shape:external_exports.literal("line"),start:point,end:point}),pcb_debug_point=pcb_debug_object_base.extend({shape:external_exports.literal("point"),center:point}),pcb_debug_object=external_exports.discriminatedUnion("shape",[pcb_debug_rect,pcb_debug_line,pcb_debug_point]);expectTypesMatch(!0);pcb_hole_circle=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("circle"),hole_diameter:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_circle_shape=pcb_hole_circle.describe("Defines a circular hole on the PCB");expectTypesMatch(!0);pcb_hole_rect=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("rect"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_rect_shape=pcb_hole_rect.describe("Defines a rectangular (square-capable) hole on the PCB. Use equal width/height for square.");expectTypesMatch(!0);pcb_hole_circle_or_square=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.enum(["circle","square"]),hole_diameter:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_circle_or_square_shape=pcb_hole_circle_or_square.describe("Defines a circular or square hole on the PCB");expectTypesMatch(!0);pcb_hole_oval=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("oval"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_oval_shape=pcb_hole_oval.describe("Defines an oval hole on the PCB");expectTypesMatch(!0);pcb_hole_pill=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("pill"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_pill_shape=pcb_hole_pill.describe("Defines a pill-shaped hole on the PCB");expectTypesMatch(!0);pcb_hole_rotated_pill=external_exports.object({type:external_exports.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault("pcb_hole"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),hole_shape:external_exports.literal("rotated_pill"),hole_width:external_exports.number(),hole_height:external_exports.number(),x:distance,y:distance,ccw_rotation:rotation,is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional()}),pcb_hole_rotated_pill_shape=pcb_hole_rotated_pill.describe("Defines a rotated pill-shaped hole on the PCB");expectTypesMatch(!0);pcb_hole=pcb_hole_circle_or_square.or(pcb_hole_oval).or(pcb_hole_pill).or(pcb_hole_rotated_pill).or(pcb_hole_circle).or(pcb_hole_rect),pcb_plated_hole_circle=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("circle"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),outer_diameter:external_exports.number(),hole_diameter:external_exports.number(),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_plated_hole_oval=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.enum(["oval","pill"]),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),outer_width:external_exports.number(),outer_height:external_exports.number(),hole_width:external_exports.number(),hole_height:external_exports.number(),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,ccw_rotation:rotation,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_circular_hole_with_rect_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("circular_hole_with_rect_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.literal("circle"),pad_shape:external_exports.literal("rect"),hole_diameter:external_exports.number(),rect_pad_width:external_exports.number(),rect_pad_height:external_exports.number(),rect_border_radius:external_exports.number().optional(),hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional(),rect_ccw_rotation:rotation.optional()}),pcb_pill_hole_with_rect_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("pill_hole_with_rect_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.literal("pill"),pad_shape:external_exports.literal("rect"),hole_width:external_exports.number(),hole_height:external_exports.number(),rect_pad_width:external_exports.number(),rect_pad_height:external_exports.number(),rect_border_radius:external_exports.number().optional(),hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_rotated_pill_hole_with_rect_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("rotated_pill_hole_with_rect_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.literal("rotated_pill"),pad_shape:external_exports.literal("rect"),hole_width:external_exports.number(),hole_height:external_exports.number(),hole_ccw_rotation:rotation,rect_pad_width:external_exports.number(),rect_pad_height:external_exports.number(),rect_border_radius:external_exports.number().optional(),rect_ccw_rotation:rotation,hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional()}),pcb_hole_with_polygon_pad=external_exports.object({type:external_exports.literal("pcb_plated_hole"),shape:external_exports.literal("hole_with_polygon_pad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),hole_shape:external_exports.enum(["circle","oval","pill","rotated_pill"]),hole_diameter:external_exports.number().optional(),hole_width:external_exports.number().optional(),hole_height:external_exports.number().optional(),pad_outline:external_exports.array(external_exports.object({x:distance,y:distance})).min(3),hole_offset_x:distance.default(0),hole_offset_y:distance.default(0),is_covered_with_solder_mask:external_exports.boolean().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault("pcb_plated_hole"),soldermask_margin:external_exports.number().optional(),ccw_rotation:rotation.optional()}),pcb_plated_hole=external_exports.union([pcb_plated_hole_circle,pcb_plated_hole_oval,pcb_circular_hole_with_rect_pad,pcb_pill_hole_with_rect_pad,pcb_rotated_pill_hole_with_rect_pad,pcb_hole_with_polygon_pad]);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);pcb_port=external_exports.object({type:external_exports.literal("pcb_port"),pcb_port_id:getZodPrefixedIdWithDefault("pcb_port"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),source_port_id:external_exports.string(),pcb_component_id:external_exports.string().optional(),x:distance,y:distance,layers:external_exports.array(layer_ref),is_board_pinout:external_exports.boolean().optional()}).describe("Defines a port on the PCB");expectTypesMatch(!0);pcb_smtpad_circle=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("circle"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,radius:external_exports.number(),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_rect=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),rect_border_radius:external_exports.number().optional(),corner_radius:external_exports.number().optional(),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),soldermask_margin_left:external_exports.number().optional(),soldermask_margin_top:external_exports.number().optional(),soldermask_margin_right:external_exports.number().optional(),soldermask_margin_bottom:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_rotated_rect=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("rotated_rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),rect_border_radius:external_exports.number().optional(),corner_radius:external_exports.number().optional(),ccw_rotation:rotation,layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),soldermask_margin_left:external_exports.number().optional(),soldermask_margin_top:external_exports.number().optional(),soldermask_margin_right:external_exports.number().optional(),soldermask_margin_bottom:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_pill=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_rotated_pill=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("rotated_pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),ccw_rotation:rotation,layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad_polygon=external_exports.object({type:external_exports.literal("pcb_smtpad"),shape:external_exports.literal("polygon"),pcb_smtpad_id:getZodPrefixedIdWithDefault("pcb_smtpad"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),points:external_exports.array(point),layer:layer_ref,port_hints:external_exports.array(external_exports.string()).optional(),pcb_component_id:external_exports.string().optional(),pcb_port_id:external_exports.string().optional(),is_covered_with_solder_mask:external_exports.boolean().optional(),soldermask_margin:external_exports.number().optional(),solderpaste_margin:external_exports.number().optional()}),pcb_smtpad=external_exports.discriminatedUnion("shape",[pcb_smtpad_circle,pcb_smtpad_rect,pcb_smtpad_rotated_rect,pcb_smtpad_rotated_pill,pcb_smtpad_pill,pcb_smtpad_polygon]).describe("Defines an SMT pad on the PCB");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);pcb_solder_paste_circle=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("circle"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,radius:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_rect=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_pill=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("pill"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_rotated_rect=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("rotated_rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),ccw_rotation:distance,layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_rotated_pill=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("rotated_pill"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),radius:external_exports.number(),ccw_rotation:rotation,layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_oval=external_exports.object({type:external_exports.literal("pcb_solder_paste"),shape:external_exports.literal("oval"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),x:distance,y:distance,width:external_exports.number(),height:external_exports.number(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste_polygon=polygon_shape.extend({type:external_exports.literal("pcb_solder_paste"),pcb_solder_paste_id:getZodPrefixedIdWithDefault("pcb_solder_paste"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),holes:external_exports.array(polygon_shape.shape.points).optional(),layer:layer_ref,pcb_component_id:external_exports.string().optional(),pcb_smtpad_id:external_exports.string().optional()}),pcb_solder_paste=external_exports.union([pcb_solder_paste_circle,pcb_solder_paste_rect,pcb_solder_paste_pill,pcb_solder_paste_rotated_rect,pcb_solder_paste_rotated_pill,pcb_solder_paste_oval,pcb_solder_paste_polygon]).describe("Defines solderpaste on the PCB");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);opening_base=external_exports.object({type:external_exports.literal("pcb_soldermask_opening"),pcb_soldermask_opening_id:getZodPrefixedIdWithDefault("pcb_soldermask_opening"),layer:layer_ref.pipe(visible_layer),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}),pcb_soldermask_opening=external_exports.discriminatedUnion("shape",[circle_shape.extend(opening_base.shape),rect_shape.extend(opening_base.shape),rotated_rect_shape.extend(opening_base.shape),polygon_shape.extend(opening_base.shape)]).describe("An explicit opening in top or bottom solder mask or flex coverlay, independent of pads. Removes mask without adding copper or solder paste.");expectTypesMatch(!0);pcb_text=external_exports.object({type:external_exports.literal("pcb_text"),pcb_text_id:getZodPrefixedIdWithDefault("pcb_text"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),text:external_exports.string(),center:point,layer:layer_ref,width:length,height:length,lines:external_exports.number(),align:external_exports.enum(["bottom-left"])}).describe("Defines text on the PCB");expectTypesMatch(!0);positive_width=distance.pipe(external_exports.number().finite().positive()),pcb_trace_route_point_wire=external_exports.object({route_type:external_exports.literal("wire"),x:distance,y:distance,width:distance,start_width:positive_width.optional(),end_width:positive_width.optional(),width_interpolation_mode:external_exports.enum(["linear","quadratic"]).optional(),copper_pour_id:external_exports.string().optional(),is_inside_copper_pour:external_exports.boolean().optional(),start_pcb_port_id:external_exports.string().optional(),end_pcb_port_id:external_exports.string().optional(),layer:layer_ref}).superRefine((wire,ctx)=>{let present=[wire.start_width,wire.end_width,wire.width_interpolation_mode].filter(v11=>v11!==void 0).length;present!==0&&(present!==3&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Wire taper requires start_width, end_width and width_interpolation_mode together"}),wire.width!==wire.start_width&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["start_width"],message:"start_width must equal width"}),(!Number.isFinite(wire.x)||!Number.isFinite(wire.y))&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Tapered wire coordinates must be finite"}))}),pcb_trace_route_point_via=external_exports.object({route_type:external_exports.literal("via"),x:distance,y:distance,copper_pour_id:external_exports.string().optional(),is_inside_copper_pour:external_exports.boolean().optional(),hole_diameter:distance.optional(),outer_diameter:distance.optional(),tented_on_top:external_exports.boolean().optional(),tented_on_bottom:external_exports.boolean().optional(),from_layer:layer_ref,to_layer:layer_ref}),pcb_trace_route_point_through_pad=external_exports.object({route_type:external_exports.literal("through_pad"),start:point,end:point,width:distance,start_layer:layer_ref,end_layer:layer_ref,pcb_smtpad_id:external_exports.string().optional(),pcb_plated_hole_id:external_exports.string().optional()}),pcb_trace_route_point=external_exports.union([pcb_trace_route_point_wire,pcb_trace_route_point_via,pcb_trace_route_point_through_pad]),pcb_trace=external_exports.object({type:external_exports.literal("pcb_trace"),source_trace_id:external_exports.string().optional(),pcb_component_id:external_exports.string().optional(),pcb_trace_id:getZodPrefixedIdWithDefault("pcb_trace"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),route_thickness_mode:external_exports.enum(["constant","interpolated"]).default("constant").optional(),route_order_index:external_exports.number().optional(),should_round_corners:external_exports.boolean().optional(),trace_length:external_exports.number().optional(),is_antenna_trace:external_exports.boolean().optional(),highlight_color:external_exports.string().optional(),route:external_exports.array(pcb_trace_route_point).superRefine((route2,ctx)=>{for(let[i10,wire]of route2.entries()){if(wire.route_type!=="wire"||wire.width_interpolation_mode===void 0)continue;let next2=route2[i10+1],end=next2?.route_type==="through_pad"?next2.start:next2,layer=next2?.route_type==="wire"?next2.layer:next2?.route_type==="via"?next2.from_layer:next2?.start_layer,length43=end?Math.hypot(end.x-wire.x,end.y-wire.y):NaN;(!Number.isFinite(length43)||length43<=0||layer!==wire.layer)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:[i10],message:"Tapered wire must lead to a distinct finite next point on the same layer"})}})}).describe("Defines a trace on the PCB");expectTypesMatch(!0);expectTypesMatch(!0);pcb_trace_warning=external_exports.object({type:external_exports.literal("pcb_trace_warning"),pcb_trace_warning_id:getZodPrefixedIdWithDefault("pcb_trace_warning"),warning_type:external_exports.literal("pcb_trace_warning").default("pcb_trace_warning"),message:external_exports.string(),center:point.optional(),pcb_trace_id:external_exports.string(),source_trace_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()),pcb_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines a trace warning on the PCB");expectTypesMatch(!0);pcb_trace_style_warning=external_exports.object({type:external_exports.literal("pcb_trace_style_warning"),pcb_trace_style_warning_id:getZodPrefixedIdWithDefault("pcb_trace_style_warning"),warning_type:external_exports.literal("pcb_trace_style_warning").default("pcb_trace_style_warning"),message:external_exports.string(),styling_issue_type:external_exports.literal("long_segment_at_odd_angle"),pcb_trace_id:external_exports.string(),source_trace_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,start_route_index:external_exports.number().int().nonnegative(),end_route_index:external_exports.number().int().nonnegative(),segment_start:point,segment_end:point,center:point,segment_length:distance,minimum_segment_length:distance,angle_degrees:external_exports.number().min(0).lt(360),nearest_allowed_angle_degrees:external_exports.number().min(0).lt(360).multipleOf(45),angle_deviation_degrees:external_exports.number().min(0).max(22.5),angle_tolerance_degrees:external_exports.number().min(0).lt(22.5)}).describe("Warning for a long PCB trace segment whose direction deviates from a multiple of 45 degrees");expectTypesMatch(!0);pcb_trace_too_long_error=external_exports.object({type:external_exports.literal("pcb_trace_too_long_error"),pcb_trace_too_long_error_id:getZodPrefixedIdWithDefault("pcb_trace_too_long_error"),error_type:external_exports.literal("pcb_trace_too_long_error").default("pcb_trace_too_long_error"),message:external_exports.string(),pcb_trace_id:external_exports.string(),source_net_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),actual_trace_length:distance,maximum_trace_length:distance,subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a PCB trace is longer than its maximum allowed length");expectTypesMatch(!0);pcb_bus_length_skew_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_bus_length_skew_error"),pcb_bus_length_skew_error_id:getZodPrefixedIdWithDefault("pcb_bus_length_skew_error"),error_type:external_exports.literal("pcb_bus_length_skew_error").default("pcb_bus_length_skew_error"),source_bus_id:external_exports.string(),source_trace_ids:external_exports.array(external_exports.string()),pcb_trace_ids:external_exports.array(external_exports.string()),actual_length_skew:external_exports.number().nonnegative().finite(),maximum_length_skew:external_exports.number().nonnegative().finite(),subcircuit_id:external_exports.string().optional()});expectTypesMatch(!0);pcb_trace_too_long_warning=external_exports.object({type:external_exports.literal("pcb_trace_too_long_warning"),pcb_trace_too_long_warning_id:getZodPrefixedIdWithDefault("pcb_trace_too_long_warning"),warning_type:external_exports.literal("pcb_trace_too_long_warning").default("pcb_trace_too_long_warning"),message:external_exports.string(),pcb_trace_id:external_exports.string(),source_net_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),actual_trace_length:distance,maximum_trace_length:distance,subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a PCB trace is longer than its maximum allowed length");expectTypesMatch(!0);pcb_trace_too_many_vias_warning=external_exports.object({type:external_exports.literal("pcb_trace_too_many_vias_warning"),pcb_trace_too_many_vias_warning_id:getZodPrefixedIdWithDefault("pcb_trace_too_many_vias_warning"),warning_type:external_exports.literal("pcb_trace_too_many_vias_warning").default("pcb_trace_too_many_vias_warning"),message:external_exports.string(),pcb_trace_id:external_exports.string(),source_net_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),actual_via_count:external_exports.number().int().nonnegative(),maximum_via_count:external_exports.number().int().nonnegative(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a PCB trace has more vias than its maximum allowed count");expectTypesMatch(!0);error_base=base_circuit_json_error.extend({type:external_exports.literal("pcb_bus_routing_constraint_error"),pcb_bus_routing_constraint_error_id:getZodPrefixedIdWithDefault("pcb_bus_routing_constraint_error"),error_type:external_exports.literal("pcb_bus_routing_constraint_error").default("pcb_bus_routing_constraint_error"),source_bus_id:external_exports.string(),source_trace_ids:external_exports.array(external_exports.string()).min(1),pcb_trace_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}),pcb_bus_routing_constraint_error=external_exports.discriminatedUnion("routing_rule",[error_base.extend({routing_rule:external_exports.literal("length_skew"),actual_length_skew:external_exports.number().nonnegative().finite(),maximum_length_skew:external_exports.number().nonnegative().finite()}),error_base.extend({routing_rule:external_exports.literal("min_length"),actual_trace_length:external_exports.number().nonnegative().finite(),minimum_trace_length:external_exports.number().finite()}),error_base.extend({routing_rule:external_exports.literal("max_length"),actual_trace_length:external_exports.number().nonnegative().finite(),maximum_trace_length:external_exports.number().finite()}),error_base.extend({routing_rule:external_exports.literal("target_length"),actual_trace_length:external_exports.number().nonnegative().finite(),target_trace_length:external_exports.number().finite(),length_tolerance:external_exports.number().nonnegative().finite()}),error_base.extend({routing_rule:external_exports.literal("pcb_trace_spacing"),other_pcb_trace_id:external_exports.string(),other_source_trace_id:external_exports.string().optional(),actual_centerline_spacing:external_exports.number().nonnegative().finite(),minimum_centerline_spacing:external_exports.number().positive().finite()}),error_base.extend({routing_rule:external_exports.literal("pcb_spacing_to_other_signals"),other_pcb_trace_id:external_exports.string(),other_source_trace_id:external_exports.string().optional(),actual_centerline_spacing:external_exports.number().nonnegative().finite(),minimum_centerline_spacing:external_exports.number().positive().finite()}),error_base.extend({routing_rule:external_exports.literal("impedance_target"),target_impedance:external_exports.number().positive().finite(),minimum_impedance:external_exports.number().positive().finite().optional(),maximum_impedance:external_exports.number().positive().finite().optional()})]).superRefine((error2,ctx)=>{error2.routing_rule==="impedance_target"&&(error2.minimum_impedance===void 0&&error2.maximum_impedance===void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["minimum_impedance"],message:"Provide an impedance bound"}),error2.minimum_impedance!==void 0&&error2.maximum_impedance!==void 0&&error2.minimum_impedance>error2.maximum_impedance&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["maximum_impedance"],message:"Impedance bounds must be ordered"}))}).describe("A declared bus or differential-pair routing constraint is violated.");expectTypesMatch(!0);warning_base=external_exports.object({type:external_exports.literal("pcb_bus_routing_constraint_warning"),pcb_bus_routing_constraint_warning_id:getZodPrefixedIdWithDefault("pcb_bus_routing_constraint_warning"),warning_type:external_exports.literal("pcb_bus_routing_constraint_warning").default("pcb_bus_routing_constraint_warning"),source_bus_id:external_exports.string(),source_trace_ids:external_exports.array(external_exports.string()).min(1),pcb_trace_ids:external_exports.array(external_exports.string()),message:external_exports.string(),subcircuit_id:external_exports.string().optional()}).describe("A declared bus or pair constraint could not be verified; this is not a pass."),pcb_bus_routing_constraint_warning=external_exports.discriminatedUnion("routing_rule",[warning_base.extend({routing_rule:external_exports.literal("route_geometry")}),warning_base.extend({routing_rule:external_exports.literal("reference_geometry")}),warning_base.extend({routing_rule:external_exports.literal("spacing_geometry")}),warning_base.extend({routing_rule:external_exports.literal("target_length")}),warning_base.extend({routing_rule:external_exports.literal("physical_impedance")})]);expectTypesMatch(!0);pcb_trace_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_trace_error"),pcb_trace_error_id:getZodPrefixedIdWithDefault("pcb_trace_error"),error_type:external_exports.literal("pcb_trace_error").default("pcb_trace_error"),center:point.optional(),pcb_trace_id:external_exports.string(),source_trace_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()),pcb_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines a trace error on the PCB");expectTypesMatch(!0);pcb_trace_missing_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_trace_missing_error"),pcb_trace_missing_error_id:getZodPrefixedIdWithDefault("pcb_trace_missing_error"),error_type:external_exports.literal("pcb_trace_missing_error").default("pcb_trace_missing_error"),center:point.optional(),source_trace_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()),pcb_port_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines an error when a source trace has no corresponding PCB trace");expectTypesMatch(!0);pcb_port_not_matched_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_port_not_matched_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_port_not_matched_error").default("pcb_port_not_matched_error"),pcb_component_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines a trace error on the PCB where a port is not matched");expectTypesMatch(!0);pcb_port_not_connected_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_port_not_connected_error"),pcb_port_not_connected_error_id:getZodPrefixedIdWithDefault("pcb_port_not_connected_error"),error_type:external_exports.literal("pcb_port_not_connected_error").default("pcb_port_not_connected_error"),pcb_port_ids:external_exports.array(external_exports.string()),pcb_component_ids:external_exports.array(external_exports.string()),subcircuit_id:external_exports.string().optional()}).describe("Defines an error when a pcb port is not connected to any trace");expectTypesMatch(!0);pcb_net=external_exports.object({type:external_exports.literal("pcb_net"),pcb_net_id:getZodPrefixedIdWithDefault("pcb_net"),source_net_id:external_exports.string().optional(),highlight_color:external_exports.string().optional()}).describe("Defines a net on the PCB");expectTypesMatch(!0);pcb_via=external_exports.object({type:external_exports.literal("pcb_via"),pcb_via_id:getZodPrefixedIdWithDefault("pcb_via"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),x:distance,y:distance,outer_diameter:distance.default("0.6mm"),hole_diameter:distance.default("0.25mm"),topmost_drill_layer:layer_ref.optional(),bottommost_drill_layer:layer_ref.optional(),through_hole:external_exports.boolean().optional(),from_layer:layer_ref.optional(),to_layer:layer_ref.optional(),layers:external_exports.array(layer_ref),pcb_port_ids:external_exports.array(external_exports.string()).optional(),pcb_trace_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),source_net_id:external_exports.string().min(1).optional(),net_is_assignable:external_exports.boolean().optional(),net_assigned:external_exports.boolean().optional(),is_tented:external_exports.boolean().optional(),tented_on_top:external_exports.boolean().optional(),tented_on_bottom:external_exports.boolean().optional()}).transform(({is_tented,...via})=>(is_tented!==void 0&&(via.tented_on_top??(via.tented_on_top=is_tented),via.tented_on_bottom??(via.tented_on_bottom=is_tented)),via)).describe("Defines a via on the PCB");expectTypesMatch(!0);pcb_board=external_exports.object({type:external_exports.literal("pcb_board"),pcb_board_id:getZodPrefixedIdWithDefault("pcb_board"),pcb_panel_id:external_exports.string().optional(),carrier_pcb_board_id:external_exports.string().optional(),is_subcircuit:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),is_mounted_to_carrier_board:external_exports.boolean().optional(),is_via_in_pad_allowed:external_exports.boolean().optional(),default_via_tented_on_top:external_exports.boolean().optional(),default_via_tented_on_bottom:external_exports.boolean().optional(),default_via_plugged:external_exports.boolean().optional(),width:length.optional(),height:length.optional(),center:point,display_offset_x:external_exports.string().optional().describe("How to display the x offset for this board, usually corresponding with how the user specified it"),display_offset_y:external_exports.string().optional().describe("How to display the y offset for this board, usually corresponding with how the user specified it"),thickness:length.optional().default(1.4),num_layers:external_exports.number().optional().default(4),allow_blind_and_buried_vias:external_exports.boolean().optional().describe("Whether autorouters may generate blind and buried vias. False restricts newly generated vias to the full board stack."),outline:external_exports.array(point).optional(),shape:external_exports.enum(["rect","polygon"]).optional(),material:external_exports.enum(["fr4","fr1","flex"]).default("fr4"),solder_mask_color:external_exports.string().optional(),silkscreen_color:external_exports.string().optional(),anchor_position:point.optional(),anchor_alignment:ninePointAnchor.optional(),position_mode:external_exports.enum(["relative_to_panel_anchor","none"]).optional()}).merge(manufacturing_drc_properties).describe("Defines the board outline of the PCB");expectTypesMatch(!0);finite_point=point.extend({x:length.pipe(external_exports.number().finite()),y:length.pipe(external_exports.number().finite())}),pcb_bend=external_exports.object({type:external_exports.literal("pcb_bend"),pcb_bend_id:getZodPrefixedIdWithDefault("pcb_bend"),pcb_board_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),start:finite_point,end:finite_point,bend_angle:rotation.pipe(external_exports.number().finite()),bend_radius:length.pipe(external_exports.number().finite().positive()),bend_side:external_exports.enum(["left","right"])}).refine(({start,end})=>start.x!==end.x||start.y!==end.y,{message:"Bend centerline endpoints must be distinct",path:["end"]}).describe("Defines a finite-radius bend on a flat PCB for runtime CAD folding");expectTypesMatch(!0);positive_length=length.pipe(external_exports.number().finite().positive()),finite_point2=point.extend({x:length.pipe(external_exports.number().finite()),y:length.pipe(external_exports.number().finite())}),pcb_stiffener_base=external_exports.object({type:external_exports.literal("pcb_stiffener"),pcb_stiffener_id:getZodPrefixedIdWithDefault("pcb_stiffener"),pcb_board_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),layer:external_exports.enum(["top","bottom"]),material:external_exports.enum(["fr4","polyimide","stainless_steel","aluminum"]),thickness:positive_length,adhesive_thickness:length.pipe(external_exports.number().finite().nonnegative()).optional()}),pcb_stiffener_rect=pcb_stiffener_base.extend({shape:external_exports.literal("rect"),center:finite_point2,rotation:rotation.pipe(external_exports.number().finite()).optional(),width:positive_length,height:positive_length,outline:external_exports.never().optional()});expectTypesMatch(!0);pcb_stiffener_polygon=pcb_stiffener_base.extend({shape:external_exports.literal("polygon"),outline:external_exports.array(finite_point2).min(3).refine(points=>{let twice_area=points.reduce((sum,p11,i10)=>{let next2=points[(i10+1)%points.length];return sum+p11.x*next2.y-next2.x*p11.y},0);return Number.isFinite(twice_area)&&twice_area!==0},"Stiffener outline must enclose a nonzero area"),center:external_exports.never().optional(),rotation:external_exports.never().optional(),width:external_exports.never().optional(),height:external_exports.never().optional()});expectTypesMatch(!0);pcb_stiffener=external_exports.discriminatedUnion("shape",[pcb_stiffener_rect,pcb_stiffener_polygon]).describe("Defines bonded mechanical PCB reinforcement without adding copper layers");expectTypesMatch(!0);pcb_panel=external_exports.object({type:external_exports.literal("pcb_panel"),pcb_panel_id:getZodPrefixedIdWithDefault("pcb_panel"),width:length,height:length,center:point,thickness:length.optional().default(1.4),covered_with_solder_mask:external_exports.boolean().optional().default(!0)}).describe("Defines a PCB panel that can contain multiple boards");expectTypesMatch(!0);pcb_placement_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_placement_error"),pcb_placement_error_id:getZodPrefixedIdWithDefault("pcb_placement_error"),error_type:external_exports.literal("pcb_placement_error").default("pcb_placement_error"),subcircuit_id:external_exports.string().optional()}).describe("Defines a placement error on the PCB");expectTypesMatch(!0);pcb_packing_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_packing_error"),pcb_packing_error_id:getZodPrefixedIdWithDefault("pcb_packing_error"),error_type:external_exports.literal("pcb_packing_error").default("pcb_packing_error"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a failure to pack PCB components within layout bounds");expectTypesMatch(!0);pcb_panelization_placement_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_panelization_placement_error"),pcb_panelization_placement_error_id:getZodPrefixedIdWithDefault("pcb_panelization_placement_error"),error_type:external_exports.literal("pcb_panelization_placement_error").default("pcb_panelization_placement_error"),pcb_panel_id:external_exports.string().optional(),pcb_board_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a panelization placement error on the PCB");expectTypesMatch(!0);pcb_trace_hint=external_exports.object({type:external_exports.literal("pcb_trace_hint"),pcb_trace_hint_id:getZodPrefixedIdWithDefault("pcb_trace_hint"),pcb_port_id:external_exports.string(),pcb_component_id:external_exports.string(),route:external_exports.array(route_hint_point),subcircuit_id:external_exports.string().optional()}).describe("A hint that can be used during generation of a PCB trace");expectTypesMatch(!0);pcb_silkscreen_line=external_exports.object({type:external_exports.literal("pcb_silkscreen_line"),pcb_silkscreen_line_id:getZodPrefixedIdWithDefault("pcb_silkscreen_line"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),stroke_width:distance.default("0.1mm"),x1:distance,y1:distance,x2:distance,y2:distance,layer:visible_layer}).describe("Defines a silkscreen line on the PCB");expectTypesMatch(!0);pcb_silkscreen_path=external_exports.object({type:external_exports.literal("pcb_silkscreen_path"),pcb_silkscreen_path_id:getZodPrefixedIdWithDefault("pcb_silkscreen_path"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,route:external_exports.array(point),stroke_width:length}).describe("Defines a silkscreen path on the PCB");expectTypesMatch(!0);pcb_silkscreen_text=external_exports.object({type:external_exports.literal("pcb_silkscreen_text"),pcb_silkscreen_text_id:getZodPrefixedIdWithDefault("pcb_silkscreen_text"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("0.2mm"),pcb_component_id:external_exports.string(),text:external_exports.string(),is_knockout:external_exports.boolean().default(!1).optional(),knockout_padding:external_exports.object({left:length,top:length,bottom:length,right:length}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports.number().optional(),layer:layer_ref,is_mirrored:external_exports.boolean().default(!1).optional(),anchor_position:point.default({x:0,y:0}),anchor_alignment:ninePointAnchor.default("center")}).describe("Defines silkscreen text on the PCB");expectTypesMatch(!0);pcb_copper_text=external_exports.object({type:external_exports.literal("pcb_copper_text"),pcb_copper_text_id:getZodPrefixedIdWithDefault("pcb_copper_text"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("0.2mm"),pcb_component_id:external_exports.string(),text:external_exports.string(),is_knockout:external_exports.boolean().default(!1).optional(),knockout_padding:external_exports.object({left:length,top:length,bottom:length,right:length}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports.number().optional(),layer:layer_ref,is_mirrored:external_exports.boolean().default(!1).optional(),anchor_position:point.default({x:0,y:0}),anchor_alignment:ninePointAnchor.default("center")}).describe("Defines copper text on the PCB");expectTypesMatch(!0);pcb_silkscreen_rect=external_exports.object({type:external_exports.literal("pcb_silkscreen_rect"),pcb_silkscreen_rect_id:getZodPrefixedIdWithDefault("pcb_silkscreen_rect"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:layer_ref,stroke_width:length.default("1mm"),corner_radius:length.optional(),is_filled:external_exports.boolean().default(!0).optional(),has_stroke:external_exports.boolean().optional(),is_stroke_dashed:external_exports.boolean().optional(),ccw_rotation:external_exports.number().optional()}).describe("Defines a silkscreen rect on the PCB");expectTypesMatch(!0);pcb_silkscreen_circle=external_exports.object({type:external_exports.literal("pcb_silkscreen_circle"),pcb_silkscreen_circle_id:getZodPrefixedIdWithDefault("pcb_silkscreen_circle"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius:length,layer:visible_layer,stroke_width:length.default("1mm"),is_filled:external_exports.boolean().optional()}).describe("Defines a silkscreen circle on the PCB");expectTypesMatch(!0);pcb_silkscreen_oval=external_exports.object({type:external_exports.literal("pcb_silkscreen_oval"),pcb_silkscreen_oval_id:getZodPrefixedIdWithDefault("pcb_silkscreen_oval"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius_x:distance,radius_y:distance,layer:visible_layer,ccw_rotation:rotation.optional()}).describe("Defines a silkscreen oval on the PCB");expectTypesMatch(!0);pcb_silkscreen_graphic_base=external_exports.object({type:external_exports.literal("pcb_silkscreen_graphic"),pcb_silkscreen_graphic_id:getZodPrefixedIdWithDefault("pcb_silkscreen_graphic"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,image_asset:asset.optional()}),pcb_silkscreen_graphic_brep=pcb_silkscreen_graphic_base.extend({shape:external_exports.literal("brep"),brep_shape}).describe("Defines a BRep silkscreen graphic on the PCB");expectTypesMatch(!0);pcb_silkscreen_graphic=external_exports.discriminatedUnion("shape",[pcb_silkscreen_graphic_brep]).describe("Defines a silkscreen graphic on the PCB");expectTypesMatch(!0);pcb_silkscreen_pill=external_exports.object({type:external_exports.literal("pcb_silkscreen_pill"),pcb_silkscreen_pill_id:getZodPrefixedIdWithDefault("pcb_silkscreen_pill"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:layer_ref,ccw_rotation:external_exports.number().optional()}).describe("Defines a silkscreen pill on the PCB");expectTypesMatch(!0);pcb_fabrication_note_text=external_exports.object({type:external_exports.literal("pcb_fabrication_note_text"),pcb_fabrication_note_text_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_text"),subcircuit_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("1mm"),pcb_component_id:external_exports.string(),text:external_exports.string(),ccw_rotation:external_exports.number().optional(),layer:visible_layer,anchor_position:point.default({x:0,y:0}),anchor_alignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),color:external_exports.string().optional()}).describe("Defines a fabrication note in text on the PCB, useful for leaving notes for assemblers or fabricators");expectTypesMatch(!0);pcb_fabrication_note_path=external_exports.object({type:external_exports.literal("pcb_fabrication_note_path"),pcb_fabrication_note_path_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_path"),pcb_component_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,route:external_exports.array(point),stroke_width:length,color:external_exports.string().optional(),is_filled:external_exports.boolean().optional(),has_stroke:external_exports.boolean().optional()}).describe("Defines a fabrication path on the PCB for fabricators or assemblers");expectTypesMatch(!0);pcb_fabrication_note_rect=external_exports.object({type:external_exports.literal("pcb_fabrication_note_rect"),pcb_fabrication_note_rect_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_rect"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:visible_layer,stroke_width:length.default("0.1mm"),corner_radius:length.optional(),is_filled:external_exports.boolean().optional(),has_stroke:external_exports.boolean().optional(),is_stroke_dashed:external_exports.boolean().optional(),color:external_exports.string().optional()}).describe("Defines a fabrication note rectangle on the PCB");expectTypesMatch(!0);pcb_fabrication_note_dimension=external_exports.object({type:external_exports.literal("pcb_fabrication_note_dimension"),pcb_fabrication_note_dimension_id:getZodPrefixedIdWithDefault("pcb_fabrication_note_dimension"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,from:point,to:point,text:external_exports.string().optional(),text_ccw_rotation:external_exports.number().optional(),offset:length.optional(),offset_distance:length.optional(),offset_direction:external_exports.object({x:external_exports.number(),y:external_exports.number()}).optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:length.default("1mm"),color:external_exports.string().optional(),arrow_size:length.default("1mm")}).describe("Defines a measurement annotation within PCB fabrication notes");expectTypesMatch(!0);pcb_note_text=external_exports.object({type:external_exports.literal("pcb_note_text"),pcb_note_text_id:getZodPrefixedIdWithDefault("pcb_note_text"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:distance.default("1mm"),text:external_exports.string().optional(),anchor_position:point.default({x:0,y:0}),anchor_alignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),layer:visible_layer.default("top"),is_mirrored_from_top_view:external_exports.boolean().optional(),color:external_exports.string().optional()}).describe("Defines a documentation note in text on the PCB");expectTypesMatch(!0);pcb_note_rect=external_exports.object({type:external_exports.literal("pcb_note_rect"),pcb_note_rect_id:getZodPrefixedIdWithDefault("pcb_note_rect"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),text:external_exports.string().optional(),center:point,width:length,height:length,layer:visible_layer.default("top"),stroke_width:length.default("0.1mm"),corner_radius:length.optional(),is_filled:external_exports.boolean().optional(),has_stroke:external_exports.boolean().optional(),is_stroke_dashed:external_exports.boolean().optional(),color:external_exports.string().optional()}).describe("Defines a rectangular documentation note on the PCB");expectTypesMatch(!0);pcb_note_path=external_exports.object({type:external_exports.literal("pcb_note_path"),pcb_note_path_id:getZodPrefixedIdWithDefault("pcb_note_path"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),text:external_exports.string().optional(),route:external_exports.array(point),layer:visible_layer.default("top"),stroke_width:length.default("0.1mm"),color:external_exports.string().optional()}).describe("Defines a polyline documentation note on the PCB");expectTypesMatch(!0);pcb_note_line=external_exports.object({type:external_exports.literal("pcb_note_line"),pcb_note_line_id:getZodPrefixedIdWithDefault("pcb_note_line"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),text:external_exports.string().optional(),x1:distance,y1:distance,x2:distance,y2:distance,layer:visible_layer.default("top"),stroke_width:distance.default("0.1mm"),color:external_exports.string().optional(),is_dashed:external_exports.boolean().optional()}).describe("Defines a straight documentation note line on the PCB");expectTypesMatch(!0);pcb_note_dimension=external_exports.object({type:external_exports.literal("pcb_note_dimension"),pcb_note_dimension_id:getZodPrefixedIdWithDefault("pcb_note_dimension"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),name:external_exports.string().optional(),from:point,to:point,text:external_exports.string().optional(),text_ccw_rotation:external_exports.number().optional(),offset_distance:length.optional(),offset_direction:external_exports.object({x:external_exports.number(),y:external_exports.number()}).optional(),font:external_exports.literal("tscircuit2024").default("tscircuit2024"),font_size:length.default("1mm"),layer:visible_layer.default("top"),color:external_exports.string().optional(),arrow_size:length.default("1mm")}).describe("Defines a measurement annotation within PCB documentation notes");expectTypesMatch(!0);pcb_footprint_overlap_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_footprint_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_footprint_overlap_error").default("pcb_footprint_overlap_error"),pcb_smtpad_ids:external_exports.array(external_exports.string()).optional(),pcb_plated_hole_ids:external_exports.array(external_exports.string()).optional(),pcb_hole_ids:external_exports.array(external_exports.string()).optional(),pcb_keepout_ids:external_exports.array(external_exports.string()).optional()}).describe("Error emitted when a pcb footprint overlaps with another element");expectTypesMatch(!0);pcb_courtyard_overlap_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_courtyard_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_courtyard_overlap_error").default("pcb_courtyard_overlap_error"),pcb_component_ids:external_exports.tuple([external_exports.string(),external_exports.string()])}).describe("Error emitted when the courtyard (CrtYd) of one PCB component overlaps with the courtyard of another");expectTypesMatch(!0);pcb_keepout_outline=external_exports.object({type:external_exports.literal("pcb_keepout"),shape:external_exports.literal("outline"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),outline:external_exports.array(point).min(2),stroke_width:length,pcb_keepout_id:external_exports.string(),layers:external_exports.array(external_exports.string()),description:external_exports.string().optional(),excluded_pcb_component_ids:external_exports.array(external_exports.string()).optional(),warning_only:external_exports.boolean().optional(),allow_traces:external_exports.boolean().optional(),allow_placements:external_exports.boolean().optional()}),pcb_keepout=external_exports.object({type:external_exports.literal("pcb_keepout"),shape:external_exports.literal("rect"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:distance,height:distance,pcb_keepout_id:external_exports.string(),layers:external_exports.array(external_exports.string()),description:external_exports.string().optional(),excluded_pcb_component_ids:external_exports.array(external_exports.string()).optional(),warning_only:external_exports.boolean().optional(),allow_traces:external_exports.boolean().optional(),allow_placements:external_exports.boolean().optional()}).or(external_exports.object({type:external_exports.literal("pcb_keepout"),shape:external_exports.literal("circle"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius:distance,pcb_keepout_id:external_exports.string(),layers:external_exports.array(external_exports.string()),description:external_exports.string().optional(),excluded_pcb_component_ids:external_exports.array(external_exports.string()).optional(),warning_only:external_exports.boolean().optional(),allow_traces:external_exports.boolean().optional(),allow_placements:external_exports.boolean().optional()})).or(pcb_keepout_outline);expectTypesMatch(!0);expectTypesMatch(!0);pcb_keepout_overlap_warning=external_exports.object({type:external_exports.literal("pcb_keepout_overlap_warning"),pcb_keepout_overlap_warning_id:getZodPrefixedIdWithDefault("pcb_keepout_overlap_warning"),warning_type:external_exports.literal("pcb_keepout_overlap_warning").default("pcb_keepout_overlap_warning"),message:external_exports.string(),pcb_keepout_id:external_exports.string(),pcb_component_ids:external_exports.array(external_exports.string()).optional(),pcb_trace_ids:external_exports.array(external_exports.string()).optional(),pcb_smtpad_ids:external_exports.array(external_exports.string()).optional(),pcb_plated_hole_ids:external_exports.array(external_exports.string()).optional(),pcb_via_ids:external_exports.array(external_exports.string()).optional(),center:point.optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when copper overlaps a PCB keepout with warning_only enabled");expectTypesMatch(!0);pcb_cutout_base=external_exports.object({type:external_exports.literal("pcb_cutout"),pcb_cutout_id:getZodPrefixedIdWithDefault("pcb_cutout"),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),pcb_board_id:external_exports.string().optional(),pcb_panel_id:external_exports.string().optional()}),pcb_cutout_rect=pcb_cutout_base.extend({shape:external_exports.literal("rect"),center:point,width:length,height:length,rotation:rotation.optional(),corner_radius:length.optional()});expectTypesMatch(!0);pcb_cutout_circle=pcb_cutout_base.extend({shape:external_exports.literal("circle"),center:point,radius:length});expectTypesMatch(!0);pcb_cutout_polygon=pcb_cutout_base.extend({shape:external_exports.literal("polygon"),points:external_exports.array(point)});expectTypesMatch(!0);pcb_cutout_path=pcb_cutout_base.extend({shape:external_exports.literal("path"),route:external_exports.array(point),slot_width:length,slot_length:length.optional(),space_between_slots:length.optional(),slot_corner_radius:length.optional()});expectTypesMatch(!0);pcb_cutout=external_exports.discriminatedUnion("shape",[pcb_cutout_rect,pcb_cutout_circle,pcb_cutout_polygon,pcb_cutout_path]).describe("Defines a cutout on the PCB, removing board material.");expectTypesMatch(!0);pcb_missing_footprint_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_missing_footprint_error"),pcb_missing_footprint_error_id:getZodPrefixedIdWithDefault("pcb_missing_footprint_error"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("pcb_missing_footprint_error").default("pcb_missing_footprint_error"),source_component_id:external_exports.string()}).describe("Defines a missing footprint error on the PCB");expectTypesMatch(!0);external_footprint_load_error=base_circuit_json_error.extend({type:external_exports.literal("external_footprint_load_error"),external_footprint_load_error_id:getZodPrefixedIdWithDefault("external_footprint_load_error"),pcb_component_id:external_exports.string(),source_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),footprinter_string:external_exports.string().optional(),error_type:external_exports.literal("external_footprint_load_error").default("external_footprint_load_error")}).describe("Defines an error when an external footprint fails to load");expectTypesMatch(!0);circuit_json_footprint_load_error=base_circuit_json_error.extend({type:external_exports.literal("circuit_json_footprint_load_error"),circuit_json_footprint_load_error_id:getZodPrefixedIdWithDefault("circuit_json_footprint_load_error"),pcb_component_id:external_exports.string(),source_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),error_type:external_exports.literal("circuit_json_footprint_load_error").default("circuit_json_footprint_load_error"),circuit_json:external_exports.array(external_exports.any()).optional()}).describe("Defines an error when a circuit JSON footprint fails to load");expectTypesMatch(!0);pcb_group=external_exports.object({type:external_exports.literal("pcb_group"),pcb_group_id:getZodPrefixedIdWithDefault("pcb_group"),source_group_id:external_exports.string(),is_subcircuit:external_exports.boolean().optional(),subcircuit_id:external_exports.string().optional(),width:length.optional(),height:length.optional(),center:point,display_offset_x:external_exports.string().optional().describe("How to display the x offset for this group, usually corresponding with how the user specified it"),display_offset_y:external_exports.string().optional().describe("How to display the y offset for this group, usually corresponding with how the user specified it"),outline:external_exports.array(point).optional(),anchor_position:point.optional(),anchor_alignment:ninePointAnchor.default("center"),position_mode:external_exports.enum(["packed","relative_to_group_anchor","none"]).optional(),positioned_relative_to_pcb_group_id:external_exports.string().optional(),positioned_relative_to_pcb_board_id:external_exports.string().optional(),pcb_component_ids:external_exports.array(external_exports.string()),child_layout_mode:external_exports.enum(["packed","none"]).optional(),name:external_exports.string().optional(),description:external_exports.string().optional(),layout_mode:external_exports.string().optional(),autorouter_configuration:external_exports.object({trace_clearance:length}).optional(),autorouter_used_string:external_exports.string().optional()}).describe("Defines a group of components on the PCB");expectTypesMatch(!0);pcb_autorouting_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_autorouting_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_autorouting_error"),error_type:external_exports.literal("pcb_autorouting_error").default("pcb_autorouting_error"),subcircuit_id:external_exports.string().optional()}).describe("The autorouting has failed to route a portion of the board");expectTypesMatch(!0);pcb_preflight_routing_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_preflight_routing_error"),pcb_preflight_routing_error_id:getZodPrefixedIdWithDefault("pcb_preflight_routing_error"),error_type:external_exports.literal("pcb_preflight_routing_error").default("pcb_preflight_routing_error"),error_code:external_exports.string(),subcircuit_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),routing_phase_index:external_exports.number().int().optional(),phase_name:external_exports.string().optional(),source_trace_ids:external_exports.array(external_exports.string()).optional(),pcb_component_ids:external_exports.array(external_exports.string()).optional(),pcb_port_ids:external_exports.array(external_exports.string()).optional(),related_error_ids:external_exports.array(external_exports.string()).optional(),measurements:external_exports.record(external_exports.number().finite()).optional()});expectTypesMatch(!0);pcb_manual_edit_conflict_warning=external_exports.object({type:external_exports.literal("pcb_manual_edit_conflict_warning"),pcb_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault("pcb_manual_edit_conflict_warning"),warning_type:external_exports.literal("pcb_manual_edit_conflict_warning").default("pcb_manual_edit_conflict_warning"),message:external_exports.string(),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),source_component_id:external_exports.string()}).describe("Warning emitted when a component has both manual placement and explicit pcbX/pcbY coordinates");expectTypesMatch(!0);connectorOrientationDirection=external_exports.enum(["x-","x+","y+","y-"]),pcb_connector_not_in_accessible_orientation_warning=external_exports.object({type:external_exports.literal("pcb_connector_not_in_accessible_orientation_warning"),pcb_connector_not_in_accessible_orientation_warning_id:getZodPrefixedIdWithDefault("pcb_connector_not_in_accessible_orientation_warning"),warning_type:external_exports.literal("pcb_connector_not_in_accessible_orientation_warning").default("pcb_connector_not_in_accessible_orientation_warning"),message:external_exports.string(),pcb_component_id:external_exports.string(),source_component_id:external_exports.string().optional(),pcb_board_id:external_exports.string().optional(),facing_direction:connectorOrientationDirection,recommended_facing_direction:connectorOrientationDirection,subcircuit_id:external_exports.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");expectTypesMatch(!0);pcb_component_missing_courtyard_warning=external_exports.object({type:external_exports.literal("pcb_component_missing_courtyard_warning"),pcb_component_missing_courtyard_warning_id:getZodPrefixedIdWithDefault("pcb_component_missing_courtyard_warning"),warning_type:external_exports.literal("pcb_component_missing_courtyard_warning").default("pcb_component_missing_courtyard_warning"),message:external_exports.string(),pcb_component_id:external_exports.string(),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning emitted when a PCB component has no courtyard geometry");expectTypesMatch(!0);supplier_footprint_mismatch_warning=external_exports.object({type:external_exports.literal("supplier_footprint_mismatch_warning"),supplier_footprint_mismatch_warning_id:getZodPrefixedIdWithDefault("supplier_footprint_mismatch_warning"),warning_type:external_exports.literal("supplier_footprint_mismatch_warning").default("supplier_footprint_mismatch_warning"),message:external_exports.string(),source_component_id:external_exports.string(),pcb_component_id:external_exports.string().optional(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),supplier_name:supplier_name.optional(),supplier_part_number:external_exports.string().optional(),supplier_footprint_url:external_exports.string().optional(),footprint_copper_intersection_over_union:external_exports.number()}).describe("Warning emitted when a supplier part footprint does not match the expected footprint");expectTypesMatch(!0);pcb_fabricator_extra_charge_warning=external_exports.object({type:external_exports.literal("pcb_fabricator_extra_charge_warning"),pcb_fabricator_extra_charge_warning_id:getZodPrefixedIdWithDefault("pcb_fabricator_extra_charge_warning"),warning_type:external_exports.literal("pcb_fabricator_extra_charge_warning").default("pcb_fabricator_extra_charge_warning"),message:external_exports.string(),fabricator_preset:external_exports.string(),pcb_board_id:external_exports.string().optional(),pcb_via_ids:external_exports.array(external_exports.string()).optional(),subcircuit_id:external_exports.string().optional()}).describe("Warning that a design feature incurs an extra charge for the selected fabricator preset, such as via hole diameters below 0.3 mm with JLCPCB economy or standard presets.");expectTypesMatch(!0);pcb_breakout_point=external_exports.object({type:external_exports.literal("pcb_breakout_point"),pcb_breakout_point_id:getZodPrefixedIdWithDefault("pcb_breakout_point"),pcb_group_id:external_exports.string(),subcircuit_id:external_exports.string().optional(),source_trace_id:external_exports.string().optional(),source_port_id:external_exports.string().optional(),source_net_id:external_exports.string().optional(),layer:layer_ref.optional(),x:distance,y:distance}).describe("Defines a routing target within a pcb_group for a source_trace or source_net");expectTypesMatch(!0);pcb_ground_plane=external_exports.object({type:external_exports.literal("pcb_ground_plane"),pcb_ground_plane_id:getZodPrefixedIdWithDefault("pcb_ground_plane"),source_pcb_ground_plane_id:external_exports.string(),source_net_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Defines a ground plane on the PCB");expectTypesMatch(!0);pcb_ground_plane_region=external_exports.object({type:external_exports.literal("pcb_ground_plane_region"),pcb_ground_plane_region_id:getZodPrefixedIdWithDefault("pcb_ground_plane_region"),pcb_ground_plane_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,points:external_exports.array(point)}).describe("Defines a polygon region of a ground plane");expectTypesMatch(!0);pcb_thermal_spoke=external_exports.object({type:external_exports.literal("pcb_thermal_spoke"),pcb_thermal_spoke_id:getZodPrefixedIdWithDefault("pcb_thermal_spoke"),pcb_ground_plane_id:external_exports.string(),shape:external_exports.string(),spoke_count:external_exports.number(),spoke_thickness:distance,spoke_inner_diameter:distance,spoke_outer_diameter:distance,pcb_plated_hole_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Pattern for connecting a ground plane to a plated hole");expectTypesMatch(!0);pcb_copper_pour_base=external_exports.object({type:external_exports.literal("pcb_copper_pour"),pcb_copper_pour_id:getZodPrefixedIdWithDefault("pcb_copper_pour"),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:layer_ref,source_net_id:external_exports.string().optional(),covered_with_solder_mask:external_exports.boolean().optional().default(!0)}),pcb_copper_pour_rect=pcb_copper_pour_base.extend({shape:external_exports.literal("rect"),center:point,width:length,height:length,rotation:rotation.optional()});expectTypesMatch(!0);pcb_copper_pour_brep=pcb_copper_pour_base.extend({shape:external_exports.literal("brep"),brep_shape});expectTypesMatch(!0);pcb_copper_pour_polygon=pcb_copper_pour_base.extend({shape:external_exports.literal("polygon"),points:external_exports.array(point)});expectTypesMatch(!0);pcb_copper_pour=external_exports.discriminatedUnion("shape",[pcb_copper_pour_rect,pcb_copper_pour_brep,pcb_copper_pour_polygon]).describe("Defines a copper pour on the PCB.");expectTypesMatch(!0);pcb_component_outside_board_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_component_outside_board_error"),pcb_component_outside_board_error_id:getZodPrefixedIdWithDefault("pcb_component_outside_board_error"),error_type:external_exports.literal("pcb_component_outside_board_error").default("pcb_component_outside_board_error"),pcb_component_id:external_exports.string(),pcb_board_id:external_exports.string(),component_center:point,component_bounds:external_exports.object({min_x:external_exports.number(),max_x:external_exports.number(),min_y:external_exports.number(),max_y:external_exports.number()}),subcircuit_id:external_exports.string().optional(),source_component_id:external_exports.string().optional()}).describe("Error emitted when a PCB component is placed outside the board boundaries");expectTypesMatch(!0);pcb_component_not_on_board_edge_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_component_not_on_board_edge_error"),pcb_component_not_on_board_edge_error_id:getZodPrefixedIdWithDefault("pcb_component_not_on_board_edge_error"),error_type:external_exports.literal("pcb_component_not_on_board_edge_error").default("pcb_component_not_on_board_edge_error"),pcb_component_id:external_exports.string(),pcb_board_id:external_exports.string(),component_center:point,pad_to_nearest_board_edge_distance:external_exports.number(),source_component_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a component that must be placed on the board edge is centered away from the edge");expectTypesMatch(!0);pcb_component_invalid_layer_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_component_invalid_layer_error"),pcb_component_invalid_layer_error_id:getZodPrefixedIdWithDefault("pcb_component_invalid_layer_error"),error_type:external_exports.literal("pcb_component_invalid_layer_error").default("pcb_component_invalid_layer_error"),pcb_component_id:external_exports.string().optional(),source_component_id:external_exports.string(),layer:layer_ref,subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a component is placed on an invalid layer (components can only be on 'top' or 'bottom' layers)");expectTypesMatch(!0);pcb_via_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_via_clearance_error"),pcb_error_id:getZodPrefixedIdWithDefault("pcb_error"),error_type:external_exports.literal("pcb_via_clearance_error").default("pcb_via_clearance_error"),pcb_via_ids:external_exports.array(external_exports.string()).min(2),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),pcb_center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when vias are closer than the allowed clearance");expectTypesMatch(!0);pcb_via_trace_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_via_trace_clearance_error"),pcb_via_trace_clearance_error_id:getZodPrefixedIdWithDefault("pcb_via_trace_clearance_error"),error_type:external_exports.literal("pcb_via_trace_clearance_error").default("pcb_via_trace_clearance_error"),pcb_via_id:external_exports.string(),pcb_trace_id:external_exports.string(),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a via and trace are closer than the allowed clearance");expectTypesMatch(!0);pcb_pad_pad_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_pad_pad_clearance_error"),pcb_pad_pad_clearance_error_id:getZodPrefixedIdWithDefault("pcb_pad_pad_clearance_error"),error_type:external_exports.literal("pcb_pad_pad_clearance_error").default("pcb_pad_pad_clearance_error"),pcb_pad_ids:external_exports.array(external_exports.string()).min(2),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when pads are closer than the allowed clearance");expectTypesMatch(!0);pcb_pad_trace_clearance_error=base_circuit_json_error.extend({type:external_exports.literal("pcb_pad_trace_clearance_error"),pcb_pad_trace_clearance_error_id:getZodPrefixedIdWithDefault("pcb_pad_trace_clearance_error"),error_type:external_exports.literal("pcb_pad_trace_clearance_error").default("pcb_pad_trace_clearance_error"),pcb_pad_id:external_exports.string(),pcb_trace_id:external_exports.string(),minimum_clearance:distance.optional(),actual_clearance:distance.optional(),center:external_exports.object({x:external_exports.number().optional(),y:external_exports.number().optional()}).optional(),subcircuit_id:external_exports.string().optional()}).describe("Error emitted when a pad and trace are closer than allowed clearance");expectTypesMatch(!0);pcb_courtyard_rect=external_exports.object({type:external_exports.literal("pcb_courtyard_rect"),pcb_courtyard_rect_id:getZodPrefixedIdWithDefault("pcb_courtyard_rect"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,layer:visible_layer,ccw_rotation:rotation.optional(),color:external_exports.string().optional()}).describe("Defines a courtyard rectangle on the PCB");expectTypesMatch(!0);pcb_courtyard_outline=external_exports.object({type:external_exports.literal("pcb_courtyard_outline"),pcb_courtyard_outline_id:getZodPrefixedIdWithDefault("pcb_courtyard_outline"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,outline:external_exports.array(point).min(2)}).describe("Defines a courtyard outline on the PCB");expectTypesMatch(!0);pcb_courtyard_polygon=external_exports.object({type:external_exports.literal("pcb_courtyard_polygon"),pcb_courtyard_polygon_id:getZodPrefixedIdWithDefault("pcb_courtyard_polygon"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),layer:visible_layer,points:external_exports.array(point).min(3),color:external_exports.string().optional()}).describe("Defines a courtyard polygon on the PCB");expectTypesMatch(!0);pcb_courtyard_circle=external_exports.object({type:external_exports.literal("pcb_courtyard_circle"),pcb_courtyard_circle_id:getZodPrefixedIdWithDefault("pcb_courtyard_circle"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,radius:length,layer:visible_layer,color:external_exports.string().optional()}).describe("Defines a courtyard circle on the PCB");expectTypesMatch(!0);pcb_courtyard_pill=external_exports.object({type:external_exports.literal("pcb_courtyard_pill"),pcb_courtyard_pill_id:getZodPrefixedIdWithDefault("pcb_courtyard_pill"),pcb_component_id:external_exports.string(),pcb_group_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),center:point,width:length,height:length,radius:length,layer:visible_layer,color:external_exports.string().optional()}).describe("Defines a courtyard pill on the PCB");expectTypesMatch(!0);cad_model_formats=["obj","stl","3mf","gltf","glb","step","wrl"],cad_model_axis_directions=["x+","x-","y+","y-","z+","z-"],cadModelDefaultDirectionMap={obj:"z+",stl:"z+","3mf":"z+",gltf:"y+",glb:"y+",step:"z+",wrl:"y+"},cad_component=external_exports.object({type:external_exports.literal("cad_component"),cad_component_id:external_exports.string(),pcb_component_id:external_exports.string().optional().describe("Optional PCB component reference; omit for CAD geometry without a PCB component"),source_component_id:external_exports.string(),position:point3,rotation:point3.optional(),is_on_folded_board:external_exports.boolean().optional().describe("True when position and rotation describe the assembled folded board pose. False or omitted means the flat board pose. PCB records remain flat; pcb_component_id identifies the flat mount and owning board for reversible transforms."),size:point3.optional(),layer:layer_ref.optional(),subcircuit_id:external_exports.string().optional(),footprinter_string:external_exports.string().optional(),model_obj_url:external_exports.string().optional(),model_stl_url:external_exports.string().optional(),model_3mf_url:external_exports.string().optional(),model_gltf_url:external_exports.string().optional(),model_glb_url:external_exports.string().optional(),model_step_url:external_exports.string().optional(),model_wrl_url:external_exports.string().optional(),model_asset:asset.optional(),model_unit_to_mm_scale_factor:external_exports.number().optional(),model_board_normal_direction:external_exports.enum(cad_model_axis_directions).optional().describe(`The direction in the model's coordinate space that is considered "up" or "coming out of the board surface"`),model_origin_position:point3.optional(),model_origin_alignment:external_exports.enum(["unknown","center","center_of_component_on_board_surface","bottom_center_of_component"]).optional(),model_object_fit:external_exports.enum(["contain_within_bounds","fill_bounds"]).optional().default("contain_within_bounds"),model_jscad:external_exports.any().optional(),color:external_exports.string().trim().min(1).optional().describe("Explicit color override for CAD geometry, including authored JSCAD material colors. Omit to preserve model materials."),show_as_translucent_model:external_exports.boolean().optional(),show_as_bounding_box:external_exports.boolean().optional(),show_hidden_edges:external_exports.boolean().optional(),anchor_alignment:external_exports.enum(["center","center_of_component_on_board_surface"]).optional().default("center")}).describe("Defines CAD geometry, optionally associated with a PCB component");expectTypesMatch(!0);cad_collision_error=base_circuit_json_error.extend({type:external_exports.literal("cad_collision_error"),cad_collision_error_id:getZodPrefixedIdWithDefault("cad_collision_error"),error_type:external_exports.literal("cad_collision_error").default("cad_collision_error"),cad_component_ids:external_exports.array(external_exports.string()).min(1),pcb_component_ids:external_exports.array(external_exports.string()).optional(),source_component_ids:external_exports.array(external_exports.string()).min(1),intersection_area_mm2:external_exports.number().finite().nonnegative(),threshold_area_mm2:external_exports.number().finite().nonnegative()}).describe("An aperture-bearing part intersects the finished enclosure. The intersection_area_mm2 is the union silhouette area of the solid intersection projected along the aperture face normal, in the right-handed Circuit JSON world frame (+X right, +Y top, +Z above). It is an area in square millimetres, not intersection volume or surface area. This indicates possible aperture misplacement, insufficient size/depth, or body clearance problems; it does not prove which cause applies.");expectTypesMatch(!0);connectorPin1Position=point3.refine(point23=>[point23.x,point23.y,point23.z].every(Number.isFinite),"Connector pin 1 positions must be finite").describe("Resolved pin 1 position at the connector mating face, in right-handed circuit world, millimeters: +X right, +Y top, +Z above. An absolute point, not a direction. Computed by the circuit producer from endpoint geometry. Together with the endpoint path tangent, fixes connector roll and identifies its pin 1 side; renderers must not infer it from footprints."),cad_cable=external_exports.object({type:external_exports.literal("cad_cable"),cad_cable_id:external_exports.string(),name:external_exports.string().min(1),from_source_component_id:external_exports.string(),to_source_component_id:external_exports.string(),from_connector_pin1_position:connectorPin1Position.optional(),to_connector_pin1_position:connectorPin1Position.optional(),cableprinter_string:external_exports.string().min(1).describe('Physical cable definition, e.g. "usb_c" or "jst_ph_pins6". Independent of the route.'),path:external_exports.array(point3).min(2).refine(path=>path.every((point23,i10)=>[point23.x,point23.y,point23.z].every(Number.isFinite)&&(i10===0||Math.hypot(point23.x-path[i10-1].x,point23.y-path[i10-1].y,point23.z-path[i10-1].z)>1e-8)),"Cable paths require finite, distinct consecutive points").describe("Resolved cable centerline points in right-handed circuit world, millimeters: +X right, +Y top, +Z above. First/last samples are connector wire exits; their tangents point into/out of the cable. Includes routing/slack; renderers must not recompute the path.")}).describe("A physical assembly cable with a resolved 3D route. Several cables are independent cad_cable records, each with its own endpoints, definition and path. Does not imply electrical pin mapping.");expectTypesMatch(!0);FRAME_TOLERANCE=1e-6,unitDirection=external_exports.object({x:external_exports.number().finite(),y:external_exports.number().finite(),z:external_exports.number().finite()}).refine(v11=>Math.abs(Math.hypot(v11.x,v11.y,v11.z)-1)<=FRAME_TOLERANCE,"Reference surface directions must be unit vectors"),extent=distance.pipe(external_exports.number().finite().positive()),cad_reference_surface=external_exports.object({type:external_exports.literal("cad_reference_surface"),cad_reference_surface_id:external_exports.string().min(1),source_component_id:external_exports.string().min(1).describe("Owning assembly part's source component ID. The part may have no CAD geometry."),name:external_exports.string().trim().min(1).describe("Reference name, unique within the owning part, e.g. shade in STEM.shade."),shape:external_exports.literal("rect"),center:point3.refine(p11=>[p11.x,p11.y,p11.z].every(Number.isFinite),"Reference surface centers must be finite").describe("Resolved surface center in right-handed circuit-world XYZ, millimeters: +X right, +Y top, +Z above. An absolute point after assembly placement."),normal:unitDirection.describe("Outward unit normal in circuit-world XYZ. Dimensionless direction; transform with the part's rotation, without translation."),x_axis:unitDirection.describe("In-plane unit X direction in circuit-world XYZ, perpendicular to normal. The second tangent is normal cross x_axis, giving a right-handed frame."),width:extent.optional().describe("Rectangular extent along x_axis in millimeters. Supply together with height. Omission leaves the surface's display size unspecified."),height:extent.optional().describe("Rectangular extent along normal cross x_axis in millimeters. Supply together with width."),subcircuit_id:external_exports.string().optional()}).superRefine((surface,ctx)=>{surface.width===void 0!=(surface.height===void 0)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["width"],message:"Provide width and height together"});let{normal:n10,x_axis:x11}=surface;Math.abs(n10.x*x11.x+n10.y*x11.y+n10.z*x11.z)>FRAME_TOLERANCE&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,path:["x_axis"],message:"x_axis must be perpendicular to normal"})}).describe("A named assembly mounting surface with a resolved world-space frame. Reference geometry for optional visualization; does not add solid material or electrical connectivity. The producer resolves part placement independently of CAD-model offsets; renderers consume the world frame without reapplying the owning model's transform.");expectTypesMatch(!0);wave_shape=external_exports.enum(["sinewave","square","triangle","sawtooth"]),percentage=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_voltage_source=external_exports.object({type:external_exports.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault("simulation_voltage_source"),is_dc_source:external_exports.literal(!0).optional().default(!0),positive_source_port_id:external_exports.string().optional(),negative_source_port_id:external_exports.string().optional(),positive_source_net_id:external_exports.string().optional(),negative_source_net_id:external_exports.string().optional(),voltage,ac_magnitude:voltage.optional(),ac_phase:rotation.optional()}).describe("Defines a DC voltage source for simulation"),simulation_ac_voltage_source=external_exports.object({type:external_exports.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault("simulation_voltage_source"),is_dc_source:external_exports.literal(!1),terminal1_source_port_id:external_exports.string().optional(),terminal2_source_port_id:external_exports.string().optional(),terminal1_source_net_id:external_exports.string().optional(),terminal2_source_net_id:external_exports.string().optional(),voltage:voltage.optional(),frequency:frequency.optional(),peak_to_peak_voltage:voltage.optional(),wave_shape:wave_shape.optional(),phase:rotation.optional(),duty_cycle:percentage.optional(),pulse_delay:ms.optional(),rise_time:ms.optional(),fall_time:ms.optional(),pulse_width:ms.optional(),period:ms.optional(),ac_magnitude:voltage.optional(),ac_phase:rotation.optional()}).describe("Defines an AC voltage source for simulation"),simulation_voltage_source=external_exports.union([simulation_dc_voltage_source,simulation_ac_voltage_source]).describe("Defines a voltage source for simulation");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);percentage2=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_current_source=external_exports.object({type:external_exports.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault("simulation_current_source"),is_dc_source:external_exports.literal(!0).optional().default(!0),positive_source_port_id:external_exports.string().optional(),negative_source_port_id:external_exports.string().optional(),positive_source_net_id:external_exports.string().optional(),negative_source_net_id:external_exports.string().optional(),current,ac_magnitude:current.optional(),ac_phase:rotation.optional()}).describe("Defines a DC current source for simulation"),simulation_ac_current_source=external_exports.object({type:external_exports.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault("simulation_current_source"),is_dc_source:external_exports.literal(!1),terminal1_source_port_id:external_exports.string().optional(),terminal2_source_port_id:external_exports.string().optional(),terminal1_source_net_id:external_exports.string().optional(),terminal2_source_net_id:external_exports.string().optional(),current:current.optional(),frequency:frequency.optional(),peak_to_peak_current:current.optional(),wave_shape:wave_shape.optional(),phase:rotation.optional(),duty_cycle:percentage2.optional(),ac_magnitude:current.optional(),ac_phase:rotation.optional()}).describe("Defines an AC current source for simulation"),simulation_current_source=external_exports.union([simulation_dc_current_source,simulation_ac_current_source]).describe("Defines a current source for simulation");expectTypesMatch(!0);expectTypesMatch(!0);expectTypesMatch(!0);simulation_dc_sweep_unit=external_exports.custom(dcSweepUnit=>dcSweepUnit==="V"||dcSweepUnit==="A"),simulation_parameter_unit=external_exports.custom(parameterUnit=>parameterUnit==="\u03A9"||parameterUnit==="F"||parameterUnit==="H"||parameterUnit==="V"||parameterUnit==="A"),experiment_type=external_exports.union([external_exports.literal("spice_dc_sweep"),external_exports.literal("spice_dc_operating_point"),external_exports.literal("spice_transient_analysis"),external_exports.literal("spice_ac_analysis"),external_exports.literal("pcb_return_current")]),spice_simulation_options=external_exports.object({method:external_exports.enum(["trap","gear"]).optional(),reltol:external_exports.union([external_exports.number(),external_exports.string()]).optional(),abstol:external_exports.union([external_exports.number(),external_exports.string()]).optional(),vntol:external_exports.union([external_exports.number(),external_exports.string()]).optional()}).describe("SPICE solver options for a simulation experiment"),simulation_experiment=external_exports.object({type:external_exports.literal("simulation_experiment"),simulation_experiment_id:getZodPrefixedIdWithDefault("simulation_experiment"),name:external_exports.string(),experiment_type,time_per_step:duration_ms.optional(),start_time_ms:ms.optional(),end_time_ms:ms.optional(),spice_options:spice_simulation_options.optional(),dc_sweep_voltage_source_id:external_exports.string().optional(),dc_sweep_current_source_id:external_exports.string().optional(),dc_sweep_start:external_exports.number().optional(),dc_sweep_stop:external_exports.number().optional(),dc_sweep_step:external_exports.number().refine(dcSweepStep=>dcSweepStep!==0).optional(),dc_sweep_unit:simulation_dc_sweep_unit.optional(),ac_sweep_type:external_exports.enum(["linear","decade","octave"]).optional(),ac_samples_per_interval:external_exports.number().int().positive().optional(),ac_sample_count:external_exports.number().int().positive().optional(),ac_start_frequency_hz:external_exports.number().positive().optional(),ac_stop_frequency_hz:external_exports.number().positive().optional()}).superRefine((experiment,context)=>{if(experiment.experiment_type==="spice_dc_sweep"){let requiredFields=["dc_sweep_start","dc_sweep_stop","dc_sweep_step","dc_sweep_unit"];for(let field of requiredFields)experiment[field]===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:[field],message:`${field} is required for a DC sweep`});let hasVoltageSource=experiment.dc_sweep_voltage_source_id!==void 0,hasCurrentSource=experiment.dc_sweep_current_source_id!==void 0;hasVoltageSource===hasCurrentSource&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["dc_sweep_voltage_source_id"],message:"Exactly one DC sweep voltage or current source ID is required"})}experiment.experiment_type==="spice_ac_analysis"&&(experiment.ac_sweep_type===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_sweep_type"],message:"ac_sweep_type is required for an AC analysis"}),experiment.ac_start_frequency_hz===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_start_frequency_hz"],message:"ac_start_frequency_hz is required for an AC analysis"}),experiment.ac_stop_frequency_hz===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_stop_frequency_hz"],message:"ac_stop_frequency_hz is required for an AC analysis"}),experiment.ac_sweep_type==="linear"&&experiment.ac_sample_count===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_sample_count"],message:"ac_sample_count is required for a linear AC analysis"}),(experiment.ac_sweep_type==="decade"||experiment.ac_sweep_type==="octave")&&experiment.ac_samples_per_interval===void 0&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["ac_samples_per_interval"],message:"ac_samples_per_interval is required for decade and octave AC analyses"}))}).describe("Defines a simulation experiment configuration");expectTypesMatch(!0);simulation_parameter_sweep_coordinate=external_exports.object({simulation_parameter_sweep_id:external_exports.string(),sweep_index:external_exports.number().int().nonnegative(),parameter_value:external_exports.number(),parameter_unit:simulation_parameter_unit});expectTypesMatch(!0);simulation_transient_voltage_graph=external_exports.object({type:external_exports.literal("simulation_transient_voltage_graph"),simulation_transient_voltage_graph_id:getZodPrefixedIdWithDefault("simulation_transient_voltage_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),timestamps_ms:external_exports.array(external_exports.number()).optional(),voltage_levels:external_exports.array(external_exports.number()),source_component_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),time_per_step:duration_ms,start_time_ms:ms,end_time_ms:ms,name:external_exports.string().optional(),color:external_exports.string().optional()}).describe("Stores voltage measurements over time for a simulation");expectTypesMatch(!0);simulation_transient_current_graph=external_exports.object({type:external_exports.literal("simulation_transient_current_graph"),simulation_transient_current_graph_id:getZodPrefixedIdWithDefault("simulation_transient_current_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),timestamps_ms:external_exports.array(external_exports.number()).optional(),current_levels:external_exports.array(external_exports.number()),source_component_id:external_exports.string().optional(),subcircuit_connectivity_map_key:external_exports.string().optional(),time_per_step:duration_ms,start_time_ms:ms,end_time_ms:ms,name:external_exports.string().optional(),color:external_exports.string().optional()}).describe("Stores current measurements over time for a simulation");expectTypesMatch(!0);simulation_switch=external_exports.object({type:external_exports.literal("simulation_switch"),simulation_switch_id:getZodPrefixedIdWithDefault("simulation_switch"),source_component_id:external_exports.string().optional(),closes_at:ms.optional(),opens_at:ms.optional(),starts_closed:external_exports.boolean().optional(),switching_frequency:frequency.optional()}).describe("Defines a switch for simulation timing control");expectTypesMatch(!0);simulation_voltage_probe=external_exports.object({type:external_exports.literal("simulation_voltage_probe"),simulation_voltage_probe_id:getZodPrefixedIdWithDefault("simulation_voltage_probe"),source_component_id:external_exports.string().optional(),name:external_exports.string().optional(),signal_input_source_port_id:external_exports.string().optional(),signal_input_source_net_id:external_exports.string().optional(),reference_input_source_port_id:external_exports.string().optional(),reference_input_source_net_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),color:external_exports.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_exports.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_exports.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_exports.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_exports.ZodIssueCode.custom,message:"A voltage probe must have exactly one of signal_input_source_port_id or signal_input_source_net_id."})});expectTypesMatch(!0);simulation_current_probe=external_exports.object({type:external_exports.literal("simulation_current_probe"),simulation_current_probe_id:getZodPrefixedIdWithDefault("simulation_current_probe"),source_component_id:external_exports.string().optional(),name:external_exports.string().optional(),positive_source_port_id:external_exports.string().optional(),negative_source_port_id:external_exports.string().optional(),positive_source_net_id:external_exports.string().optional(),negative_source_net_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional(),color:external_exports.string().optional()}).describe("Defines a current probe for simulation. It measures current flowing from the positive endpoint to the negative endpoint.").superRefine((data,ctx)=>{let hasPositivePort=!!data.positive_source_port_id,hasNegativePort=!!data.negative_source_port_id,hasPositiveNet=!!data.positive_source_net_id,hasNegativeNet=!!data.negative_source_net_id,hasPorts=hasPositivePort||hasNegativePort,hasNets=hasPositiveNet||hasNegativeNet;if(hasPorts&&hasNets){ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Cannot mix port and net connections in a current probe."});return}if(hasPorts){(!hasPositivePort||!hasNegativePort)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current probe using source ports requires both positive_source_port_id and negative_source_port_id."});return}if(hasNets){(!hasPositiveNet||!hasNegativeNet)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current probe using source nets requires both positive_source_net_id and negative_source_net_id."});return}ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"A current probe must have either positive/negative source port ids or positive/negative source net ids."})});expectTypesMatch(!0);simulation_unknown_experiment_error=base_circuit_json_error.extend({type:external_exports.literal("simulation_unknown_experiment_error"),simulation_unknown_experiment_error_id:getZodPrefixedIdWithDefault("simulation_unknown_experiment_error"),error_type:external_exports.literal("simulation_unknown_experiment_error").default("simulation_unknown_experiment_error"),simulation_experiment_id:external_exports.string().optional(),subcircuit_id:external_exports.string().optional()}).describe("An unknown error occurred during the simulation experiment.");expectTypesMatch(!0);simulation_parameter_type=external_exports.enum(["resistance","capacitance","inductance","voltage","current"]),simulation_parameter_sweep_base=external_exports.object({type:external_exports.literal("simulation_parameter_sweep"),simulation_parameter_sweep_id:getZodPrefixedIdWithDefault("simulation_parameter_sweep"),simulation_experiment_id:external_exports.string(),name:external_exports.string().optional(),parameter_values:external_exports.array(external_exports.number()).min(1),parameter_unit:simulation_parameter_unit}),simulation_parameter_sweep=external_exports.discriminatedUnion("parameter_type",[simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("resistance"),resistor_source_component_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("capacitance"),capacitor_source_component_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("inductance"),inductor_source_component_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("voltage"),source_net_id:external_exports.string()}),simulation_parameter_sweep_base.extend({parameter_type:external_exports.literal("current"),current_source_component_id:external_exports.string()})]).describe("Repeats a simulation experiment over component parameter values");expectTypesMatch(!0);simulation_dc_operating_point_voltage=external_exports.object({type:external_exports.literal("simulation_dc_operating_point_voltage"),simulation_dc_operating_point_voltage_id:getZodPrefixedIdWithDefault("simulation_dc_operating_point_voltage"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_voltage_probe_id:external_exports.string(),voltage:external_exports.number(),name:external_exports.string().optional(),color:external_exports.string().optional()});expectTypesMatch(!0);simulation_dc_operating_point_current=external_exports.object({type:external_exports.literal("simulation_dc_operating_point_current"),simulation_dc_operating_point_current_id:getZodPrefixedIdWithDefault("simulation_dc_operating_point_current"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_current_probe_id:external_exports.string(),current:external_exports.number(),name:external_exports.string().optional(),color:external_exports.string().optional()});expectTypesMatch(!0);simulation_dc_sweep_voltage_graph=external_exports.object({type:external_exports.literal("simulation_dc_sweep_voltage_graph"),simulation_dc_sweep_voltage_graph_id:getZodPrefixedIdWithDefault("simulation_dc_sweep_voltage_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_voltage_probe_id:external_exports.string(),sweep_values:external_exports.array(external_exports.number()),sweep_unit:simulation_dc_sweep_unit,voltage_levels:external_exports.array(external_exports.number()),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.sweep_values.length===graph.voltage_levels.length,{message:"sweep_values and voltage_levels must have the same length"});expectTypesMatch(!0);simulation_dc_sweep_current_graph=external_exports.object({type:external_exports.literal("simulation_dc_sweep_current_graph"),simulation_dc_sweep_current_graph_id:getZodPrefixedIdWithDefault("simulation_dc_sweep_current_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_current_probe_id:external_exports.string(),sweep_values:external_exports.array(external_exports.number()),sweep_unit:simulation_dc_sweep_unit,current_levels:external_exports.array(external_exports.number()),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.sweep_values.length===graph.current_levels.length,{message:"sweep_values and current_levels must have the same length"});expectTypesMatch(!0);simulation_complex_sample=external_exports.object({re:external_exports.number(),im:external_exports.number()});expectTypesMatch(!0);simulation_ac_sweep_voltage_graph=external_exports.object({type:external_exports.literal("simulation_ac_sweep_voltage_graph"),simulation_ac_sweep_voltage_graph_id:getZodPrefixedIdWithDefault("simulation_ac_sweep_voltage_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_voltage_probe_id:external_exports.string(),frequencies_hz:external_exports.array(external_exports.number()),complex_voltages:external_exports.array(simulation_complex_sample),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.frequencies_hz.length===graph.complex_voltages.length,{message:"frequencies_hz and complex_voltages must have the same length"});expectTypesMatch(!0);simulation_ac_sweep_current_graph=external_exports.object({type:external_exports.literal("simulation_ac_sweep_current_graph"),simulation_ac_sweep_current_graph_id:getZodPrefixedIdWithDefault("simulation_ac_sweep_current_graph"),simulation_experiment_id:external_exports.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate.optional(),simulation_current_probe_id:external_exports.string(),frequencies_hz:external_exports.array(external_exports.number()),complex_currents:external_exports.array(simulation_complex_sample),name:external_exports.string().optional(),color:external_exports.string().optional()}).refine(graph=>graph.frequencies_hz.length===graph.complex_currents.length,{message:"frequencies_hz and complex_currents must have the same length"});expectTypesMatch(!0);simulation_op_amp=external_exports.object({type:external_exports.literal("simulation_op_amp"),simulation_op_amp_id:getZodPrefixedIdWithDefault("simulation_op_amp"),source_component_id:external_exports.string().optional(),inverting_input_source_port_id:external_exports.string(),non_inverting_input_source_port_id:external_exports.string(),output_source_port_id:external_exports.string(),positive_supply_source_port_id:external_exports.string(),negative_supply_source_port_id:external_exports.string()}).describe("Defines a simple ideal operational amplifier for simulation");expectTypesMatch(!0);simulation_spice_subcircuit=external_exports.object({type:external_exports.literal("simulation_spice_subcircuit"),simulation_spice_subcircuit_id:getZodPrefixedIdWithDefault("simulation_spice_subcircuit"),source_component_id:external_exports.string(),spice_pin_to_source_port_map:external_exports.record(external_exports.string(),external_exports.string()),subcircuit_source:external_exports.string()}).describe("Defines a custom SPICE subcircuit model for simulation");expectTypesMatch(!0);hasValue=value=>value!==void 0,simulation_oscilloscope_trace=external_exports.object({type:external_exports.literal("simulation_oscilloscope_trace"),simulation_oscilloscope_trace_id:getZodPrefixedIdWithDefault("simulation_oscilloscope_trace"),simulation_transient_voltage_graph_id:external_exports.string().optional(),simulation_transient_current_graph_id:external_exports.string().optional(),simulation_voltage_probe_id:external_exports.string().optional(),simulation_current_probe_id:external_exports.string().optional(),display_name:external_exports.string().optional(),color:external_exports.string().optional(),display_center_value:external_exports.number().optional(),display_center_offset_divs:external_exports.number().optional(),volts_per_div:external_exports.number().positive().optional(),amps_per_div:external_exports.number().positive().optional()}).describe("Defines how a simulation measurement is rendered as an oscilloscope-style trace.").superRefine((data,ctx)=>{let voltageReferences=[data.simulation_transient_voltage_graph_id,data.simulation_voltage_probe_id].filter(hasValue).length,currentReferences=[data.simulation_transient_current_graph_id,data.simulation_current_probe_id].filter(hasValue).length;voltageReferences+currentReferences!==1&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"An oscilloscope trace must reference exactly one voltage graph, current graph, voltage probe, or current probe."}),voltageReferences>0&&data.amps_per_div!==void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Voltage oscilloscope traces must use volts_per_div, not amps_per_div."}),currentReferences>0&&data.volts_per_div!==void 0&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current oscilloscope traces must use amps_per_div, not volts_per_div."})});expectTypesMatch(!0);contact_position=external_exports.object({x:external_exports.number().finite(),y:external_exports.number().finite(),layer:layer_ref}),simulation_return_current_contact=external_exports.discriminatedUnion("contact_type",[contact_position.extend({contact_type:external_exports.literal("pcb_port"),pcb_port_id:external_exports.string().min(1)}),contact_position.extend({contact_type:external_exports.literal("pcb_via"),pcb_via_id:external_exports.string().min(1)}),contact_position.extend({contact_type:external_exports.literal("pcb_copper_pour"),pcb_copper_pour_id:external_exports.string().min(1)})]).describe("Identifies the reference conductor at a return-current contact");expectTypesMatch(!0);simulation_terminal_port=external_exports.object({signal_pcb_port_id:external_exports.string().min(1),reference_pcb_port_id:external_exports.string().min(1).optional(),reference_layer:layer_ref,resistance:external_exports.number().finite().positive()}).describe("A two-terminal return-current excitation port with resistance in ohms");expectTypesMatch(!0);simulation_return_current_excitation=external_exports.object({type:external_exports.literal("simulation_return_current_excitation"),simulation_return_current_excitation_id:getZodPrefixedIdWithDefault("simulation_return_current_excitation"),simulation_experiment_id:external_exports.string().min(1),pcb_trace_id:external_exports.string().min(1),ground_source_net_id:external_exports.string().min(1),current:external_exports.number().finite(),return_source:simulation_return_current_contact,return_sink:simulation_return_current_contact,source_port:simulation_terminal_port.optional(),load_port:simulation_terminal_port.optional()}).describe("Excites a signal trace with signed current in amperes, peak for AC; return_source is near the load and return_sink near the driver for positive current");expectTypesMatch(!0);simulation_pcb_return_current_result=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_result"),simulation_pcb_return_current_result_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_result"),simulation_experiment_id:external_exports.string().min(1),pcb_board_id:external_exports.string().min(1),simulation_return_current_excitation_ids:external_exports.array(external_exports.string().min(1)).min(1).refine(ids=>new Set(ids).size===ids.length,"Excitation IDs must be unique"),frequency_hz:external_exports.number().finite().positive().optional()}).describe("A PCB return-current result at one frequency, or a frequency-independent result when frequency_hz is absent");expectTypesMatch(!0);simulation_return_current_field_asset=createSimulationReturnCurrentAssetSchema(["application/json","application/gzip"]),simulation_return_current_image_asset=createSimulationReturnCurrentAssetSchema(["image/png","image/webp"]),simulation_pcb_return_current_field=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_field"),simulation_pcb_return_current_field_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_field"),simulation_pcb_return_current_result_id:external_exports.string().min(1),layer:layer_ref,source_net_id:external_exports.string().min(1),field_type:external_exports.enum(["real","complex_phasor"]),min_x:external_exports.number().finite(),min_y:external_exports.number().finite(),columns:external_exports.number().int().positive().safe(),rows:external_exports.number().int().positive().safe(),cell_width:external_exports.number().finite().positive(),cell_height:external_exports.number().finite().positive(),copper_thickness:external_exports.number().finite().positive(),data_format:external_exports.literal("simulation_return_current_grid_json_v1"),field_asset:simulation_return_current_field_asset}).superRefine((field,context)=>{Number.isSafeInteger(field.columns*field.rows)||context.addIssue({code:external_exports.ZodIssueCode.custom,path:["columns"],message:"The grid cell count must be a safe integer"})}).describe("A sampled sheet-current field in A/mm, using plain or gzipped JSON Asset URLs; dimensions are PCB millimeters");expectTypesMatch(!0);channel=external_exports.array(external_exports.number().finite().nullable()).min(1),simulation_return_current_grid_json=external_exports.discriminatedUnion("field_type",[external_exports.object({field_type:external_exports.literal("real"),sheet_current_x:channel,sheet_current_y:channel}),external_exports.object({field_type:external_exports.literal("complex_phasor"),sheet_current_x_real:channel,sheet_current_x_imag:channel,sheet_current_y_real:channel,sheet_current_y_imag:channel})]).superRefine((grid4,context)=>{let channels=grid4.field_type==="real"?[grid4.sheet_current_x,grid4.sheet_current_y]:[grid4.sheet_current_x_real,grid4.sheet_current_x_imag,grid4.sheet_current_y_real,grid4.sheet_current_y_imag],first=channels[0];if(channels.some(values2=>values2.length!==first.length)){context.addIssue({code:external_exports.ZodIssueCode.custom,message:"Current channels must have equal lengths"});return}for(let index2=0;index2<first.length;index2++){let masked=first[index2]===null;if(channels.some(values2=>values2[index2]===null!==masked)){context.addIssue({code:external_exports.ZodIssueCode.custom,message:`Cell ${index2} must be null in every channel or finite in every channel`});return}}}).describe("Decoded real or complex sheet-current arrays with a shared conductor mask");expectTypesMatch(!0);simulation_pcb_return_current_heatmap=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_heatmap"),simulation_pcb_return_current_heatmap_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_heatmap"),simulation_pcb_return_current_result_id:external_exports.string().min(1),layer:layer_ref,source_net_id:external_exports.string().min(1),min_x:external_exports.number().finite(),min_y:external_exports.number().finite(),max_x:external_exports.number().finite(),max_y:external_exports.number().finite(),image_asset:simulation_return_current_image_asset}).superRefine((heatmap,context)=>{for(let axis of["x","y"])heatmap[`max_${axis}`]<=heatmap[`min_${axis}`]&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:[`max_${axis}`],message:"Heatmap bounds must have positive width and height"})}).describe("A transparent PNG/WebP current-density overlay in A/mm\xB2; the top-left pixel maps to (min_x, max_y)");expectTypesMatch(!0);marker_base=external_exports.object({type:external_exports.literal("simulation_pcb_return_current_marker"),simulation_pcb_return_current_marker_id:getZodPrefixedIdWithDefault("simulation_pcb_return_current_marker"),simulation_pcb_return_current_result_id:external_exports.string().min(1),role:external_exports.enum(["signal_source","signal_load","return_source","return_sink","signal_transition","return_transition"]),label:external_exports.string().optional(),label_x:external_exports.number().finite().optional(),label_y:external_exports.number().finite().optional()}),simulation_pcb_return_current_marker=external_exports.discriminatedUnion("target_type",[marker_base.extend({target_type:external_exports.literal("pcb_port"),pcb_port_id:external_exports.string().min(1),layer:layer_ref}),marker_base.extend({target_type:external_exports.literal("pcb_via"),pcb_via_id:external_exports.string().min(1),from_layer:layer_ref,to_layer:layer_ref})]).superRefine((marker,context)=>{marker.label_x===void 0!=(marker.label_y===void 0)&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["label_x"],message:"label_x and label_y must be provided together"}),marker.target_type==="pcb_via"&&marker.from_layer===marker.to_layer&&context.addIssue({code:external_exports.ZodIssueCode.custom,path:["to_layer"],message:"A via transition must connect distinct layers"})}).describe("A signal/return port or via highlight; markers do not assert measured via-transfer currents");expectTypesMatch(!0);any_circuit_element=external_exports.union([source_runtime_error,source_datasheet,source_trace,source_bus,source_port,source_component_internal_connection,any_source_component,source_net,source_group,source_simple_chip,source_simple_capacitor,source_simple_diode,source_simple_led,source_simple_resistor,source_simple_power_source,source_simple_battery,source_simple_inductor,source_simple_pin_header,source_simple_pinout,source_simple_resonator,source_simple_switch,source_simple_transistor,source_simple_test_point,source_simple_mosfet,source_simple_op_amp,source_simple_potentiometer,source_simple_push_button,source_pcb_ground_plane,source_manually_placed_via,source_board,source_project_metadata,source_invalid_component_property_error,source_trace_not_connected_error,source_pin_missing_trace_warning,source_unnamed_trace_warning,source_confusing_net_name_warning,source_missing_manufacturer_part_number_warning,source_component_availability_warning,source_refdes_convention_warning,source_no_power_pin_defined_warning,source_no_ground_pin_defined_warning,source_component_pins_underspecified_warning,source_pin_must_be_connected_error,unknown_error_finding_part,source_part_not_found_warning,source_i2c_misconfigured_error,source_component_misconfigured_error,source_ambiguous_port_reference,pcb_component,pcb_debug_object,pcb_hole,pcb_missing_footprint_error,external_footprint_load_error,circuit_json_footprint_load_error,pcb_manual_edit_conflict_warning,pcb_connector_not_in_accessible_orientation_warning,pcb_component_missing_courtyard_warning,supplier_footprint_mismatch_warning,pcb_fabricator_extra_charge_warning,pcb_plated_hole,pcb_keepout,pcb_keepout_overlap_warning,pcb_port,pcb_net,pcb_text,pcb_trace,pcb_trace_warning,pcb_trace_style_warning,pcb_trace_too_long_warning,pcb_trace_too_long_error,pcb_bus_length_skew_error,pcb_trace_too_many_vias_warning,pcb_via,pcb_smtpad,pcb_solder_paste,pcb_soldermask_opening,pcb_board,pcb_bend,pcb_stiffener,pcb_panel,pcb_group,pcb_trace_hint,pcb_silkscreen_line,pcb_silkscreen_path,pcb_silkscreen_text,pcb_silkscreen_pill,pcb_copper_text,pcb_silkscreen_rect,pcb_silkscreen_circle,pcb_silkscreen_oval,pcb_silkscreen_graphic,pcb_bus_routing_constraint_error,pcb_bus_routing_constraint_warning,pcb_trace_error,pcb_trace_missing_error,pcb_placement_error,pcb_packing_error,pcb_panelization_placement_error,pcb_port_not_matched_error,pcb_port_not_connected_error,pcb_via_clearance_error,pcb_via_trace_clearance_error,pcb_pad_pad_clearance_error,pcb_pad_trace_clearance_error,pcb_fabrication_note_path,pcb_fabrication_note_text,pcb_fabrication_note_rect,pcb_fabrication_note_dimension,pcb_note_text,pcb_note_rect,pcb_note_path,pcb_note_line,pcb_note_dimension,pcb_autorouting_error,pcb_preflight_routing_error,pcb_footprint_overlap_error,pcb_courtyard_overlap_error,pcb_breakout_point,pcb_cutout,pcb_ground_plane,pcb_ground_plane_region,pcb_thermal_spoke,pcb_copper_pour,pcb_component_outside_board_error,pcb_component_not_on_board_edge_error,pcb_component_invalid_layer_error,pcb_courtyard_rect,pcb_courtyard_outline,pcb_courtyard_polygon,pcb_courtyard_circle,pcb_courtyard_pill,schematic_box,schematic_text,schematic_line,schematic_rect,schematic_circle,schematic_arc,schematic_component,schematic_symbol,schematic_port,schematic_trace,schematic_path,schematic_error,schematic_layout_error,schematic_net_label,schematic_debug_object,schematic_voltage_probe,schematic_manual_edit_conflict_warning,schematic_component_overlap_warning,schematic_component_styling_warning,schematic_sheet_styling_warning,schematic_missing_sheet_warning,schematic_element_outside_sheet_warning,schematic_graphic,schematic_group,schematic_sheet,schematic_table,schematic_table_cell,cad_component,cad_cable,cad_reference_surface,cad_collision_error,simulation_voltage_source,simulation_current_source,simulation_experiment,simulation_return_current_excitation,simulation_pcb_return_current_result,simulation_pcb_return_current_field,simulation_pcb_return_current_heatmap,simulation_pcb_return_current_marker,simulation_transient_voltage_graph,simulation_transient_current_graph,simulation_dc_operating_point_voltage,simulation_dc_operating_point_current,simulation_dc_sweep_voltage_graph,simulation_dc_sweep_current_graph,simulation_ac_sweep_voltage_graph,simulation_ac_sweep_current_graph,simulation_parameter_sweep,simulation_switch,simulation_voltage_probe,simulation_current_probe,simulation_oscilloscope_trace,simulation_unknown_experiment_error,simulation_op_amp,simulation_spice_subcircuit]),any_soup_element=any_circuit_element;expectTypesMatch(!0);expectStringUnionsMatch(!0)}});var require_ms=__commonJS({"node_modules/ms/index.js"(exports,module){"use strict";var s11=1e3,m4=s11*60,h11=m4*60,d10=h11*24,w10=d10*7,y10=d10*365.25;module.exports=function(val,options){options=options||{};var type=typeof val;if(type==="string"&&val.length>0)return parse5(val);if(type==="number"&&isFinite(val))return options.long?fmtLong(val):fmtShort(val);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(val))};function parse5(str10){if(str10=String(str10),!(str10.length>100)){var match2=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str10);if(match2){var n10=parseFloat(match2[1]),type=(match2[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n10*y10;case"weeks":case"week":case"w":return n10*w10;case"days":case"day":case"d":return n10*d10;case"hours":case"hour":case"hrs":case"hr":case"h":return n10*h11;case"minutes":case"minute":case"mins":case"min":case"m":return n10*m4;case"seconds":case"second":case"secs":case"sec":case"s":return n10*s11;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n10;default:return}}}}function fmtShort(ms5){var msAbs=Math.abs(ms5);return msAbs>=d10?Math.round(ms5/d10)+"d":msAbs>=h11?Math.round(ms5/h11)+"h":msAbs>=m4?Math.round(ms5/m4)+"m":msAbs>=s11?Math.round(ms5/s11)+"s":ms5+"ms"}function fmtLong(ms5){var msAbs=Math.abs(ms5);return msAbs>=d10?plural(ms5,msAbs,d10,"day"):msAbs>=h11?plural(ms5,msAbs,h11,"hour"):msAbs>=m4?plural(ms5,msAbs,m4,"minute"):msAbs>=s11?plural(ms5,msAbs,s11,"second"):ms5+" ms"}function plural(ms5,msAbs,n10,name){var isPlural=msAbs>=n10*1.5;return Math.round(ms5/n10)+" "+name+(isPlural?"s":"")}}});var require_common=__commonJS({"node_modules/debug/src/common.js"(exports,module){"use strict";function setup(env){createDebug.debug=createDebug,createDebug.default=createDebug,createDebug.coerce=coerce3,createDebug.disable=disable,createDebug.enable=enable,createDebug.enabled=enabled,createDebug.humanize=require_ms(),createDebug.destroy=destroy,Object.keys(env).forEach(key=>{createDebug[key]=env[key]}),createDebug.names=[],createDebug.skips=[],createDebug.formatters={};function selectColor(namespace){let hash=0;for(let i10=0;i10<namespace.length;i10++)hash=(hash<<5)-hash+namespace.charCodeAt(i10),hash|=0;return createDebug.colors[Math.abs(hash)%createDebug.colors.length]}createDebug.selectColor=selectColor;function createDebug(namespace){let prevTime,enableOverride=null,namespacesCache,enabledCache;function debug19(...args){if(!debug19.enabled)return;let self2=debug19,curr=Number(new Date),ms5=curr-(prevTime||curr);self2.diff=ms5,self2.prev=prevTime,self2.curr=curr,prevTime=curr,args[0]=createDebug.coerce(args[0]),typeof args[0]!="string"&&args.unshift("%O");let index2=0;args[0]=args[0].replace(/%([a-zA-Z%])/g,(match2,format)=>{if(match2==="%%")return"%";index2++;let formatter=createDebug.formatters[format];if(typeof formatter=="function"){let val=args[index2];match2=formatter.call(self2,val),args.splice(index2,1),index2--}return match2}),createDebug.formatArgs.call(self2,args),(self2.log||createDebug.log).apply(self2,args)}return debug19.namespace=namespace,debug19.useColors=createDebug.useColors(),debug19.color=createDebug.selectColor(namespace),debug19.extend=extend,debug19.destroy=createDebug.destroy,Object.defineProperty(debug19,"enabled",{enumerable:!0,configurable:!1,get:()=>enableOverride!==null?enableOverride:(namespacesCache!==createDebug.namespaces&&(namespacesCache=createDebug.namespaces,enabledCache=createDebug.enabled(namespace)),enabledCache),set:v11=>{enableOverride=v11}}),typeof createDebug.init=="function"&&createDebug.init(debug19),debug19}function extend(namespace,delimiter){let newDebug=createDebug(this.namespace+(typeof delimiter>"u"?":":delimiter)+namespace);return newDebug.log=this.log,newDebug}function enable(namespaces){createDebug.save(namespaces),createDebug.namespaces=namespaces,createDebug.names=[],createDebug.skips=[];let split=(typeof namespaces=="string"?namespaces:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let ns3 of split)ns3[0]==="-"?createDebug.skips.push(ns3.slice(1)):createDebug.names.push(ns3)}function matchesTemplate(search,template){let searchIndex=0,templateIndex=0,starIndex=-1,matchIndex=0;for(;searchIndex<search.length;)if(templateIndex<template.length&&(template[templateIndex]===search[searchIndex]||template[templateIndex]==="*"))template[templateIndex]==="*"?(starIndex=templateIndex,matchIndex=searchIndex,templateIndex++):(searchIndex++,templateIndex++);else if(starIndex!==-1)templateIndex=starIndex+1,matchIndex++,searchIndex=matchIndex;else return!1;for(;templateIndex<template.length&&template[templateIndex]==="*";)templateIndex++;return templateIndex===template.length}function disable(){let namespaces=[...createDebug.names,...createDebug.skips.map(namespace=>"-"+namespace)].join(",");return createDebug.enable(""),namespaces}function enabled(name){for(let skip of createDebug.skips)if(matchesTemplate(name,skip))return!1;for(let ns3 of createDebug.names)if(matchesTemplate(name,ns3))return!0;return!1}function coerce3(val){return val instanceof Error?val.stack||val.message:val}function destroy(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return createDebug.enable(createDebug.load()),createDebug}module.exports=setup}});var require_browser=__commonJS({"node_modules/debug/src/browser.js"(exports,module){"use strict";exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage=localstorage();exports.destroy=(()=>{let warned=!1;return()=>{warned||(warned=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();exports.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function useColors(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let m4;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(m4=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(m4[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function formatArgs(args){if(args[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+args[0]+(this.useColors?"%c ":" ")+"+"+module.exports.humanize(this.diff),!this.useColors)return;let c4="color: "+this.color;args.splice(1,0,c4,"color: inherit");let index2=0,lastC=0;args[0].replace(/%[a-zA-Z%]/g,match2=>{match2!=="%%"&&(index2++,match2==="%c"&&(lastC=index2))}),args.splice(lastC,0,c4)}exports.log=console.debug||console.log||(()=>{});function save(namespaces){try{namespaces?exports.storage.setItem("debug",namespaces):exports.storage.removeItem("debug")}catch{}}function load(){let r10;try{r10=exports.storage.getItem("debug")||exports.storage.getItem("DEBUG")}catch{}return!r10&&typeof process<"u"&&"env"in process&&(r10=process.env.DEBUG),r10}function localstorage(){try{return localStorage}catch{}}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.j=function(v11){try{return JSON.stringify(v11)}catch(error2){return"[UnexpectedJSONParseError]: "+error2.message}}}});function applyToPoint(matrix2,point7){return Array.isArray(point7)?[matrix2.a*point7[0]+matrix2.c*point7[1]+matrix2.e,matrix2.b*point7[0]+matrix2.d*point7[1]+matrix2.f]:{x:matrix2.a*point7.x+matrix2.c*point7.y+matrix2.e,y:matrix2.b*point7.x+matrix2.d*point7.y+matrix2.f}}var init_applyToPoint=__esm({"node_modules/transformation-matrix/src/applyToPoint.js"(){"use strict"}});var init_fromObject=__esm({"node_modules/transformation-matrix/src/fromObject.js"(){"use strict"}});var init_fromString=__esm({"node_modules/transformation-matrix/src/fromString.js"(){"use strict"}});var init_identity=__esm({"node_modules/transformation-matrix/src/identity.js"(){"use strict"}});var init_inverse=__esm({"node_modules/transformation-matrix/src/inverse.js"(){"use strict"}});function isUndefined(val){return typeof val>"u"}var init_utils=__esm({"node_modules/transformation-matrix/src/utils.js"(){"use strict"}});var init_isAffineMatrix=__esm({"node_modules/transformation-matrix/src/isAffineMatrix.js"(){"use strict";init_utils()}});function translate(tx4,ty4=0){return{a:1,c:0,e:tx4,b:0,d:1,f:ty4}}var init_translate=__esm({"node_modules/transformation-matrix/src/translate.js"(){"use strict"}});function transform(...matrices){matrices=Array.isArray(matrices[0])?matrices[0]:matrices;let multiply10=(m13,m23)=>({a:m13.a*m23.a+m13.c*m23.b,c:m13.a*m23.c+m13.c*m23.d,e:m13.a*m23.e+m13.c*m23.f+m13.e,b:m13.b*m23.a+m13.d*m23.b,d:m13.b*m23.c+m13.d*m23.d,f:m13.b*m23.e+m13.d*m23.f+m13.f});switch(matrices.length){case 0:throw new Error("no matrices provided");case 1:return matrices[0];case 2:return multiply10(matrices[0],matrices[1]);default:{let[m13,m23,...rest]=matrices,m4=multiply10(m13,m23);return transform(m4,...rest)}}}function compose(...matrices){return transform(...matrices)}var init_transform=__esm({"node_modules/transformation-matrix/src/transform.js"(){"use strict"}});function rotate(angle3,cx4,cy4){let cosAngle=cos(angle3),sinAngle=sin(angle3),rotationMatrix={a:cosAngle,c:-sinAngle,e:0,b:sinAngle,d:cosAngle,f:0};return isUndefined(cx4)||isUndefined(cy4)?rotationMatrix:transform([translate(cx4,cy4),rotationMatrix,translate(-cx4,-cy4)])}function rotateDEG(angle3,cx4=void 0,cy4=void 0){return rotate(angle3*PI/180,cx4,cy4)}var cos,sin,PI,init_rotate=__esm({"node_modules/transformation-matrix/src/rotate.js"(){"use strict";init_utils();init_translate();init_transform();({cos,sin,PI}=Math)}});function scale(sx4,sy4=void 0,cx4=void 0,cy4=void 0){isUndefined(sy4)&&(sy4=sx4);let scaleMatrix={a:sx4,c:0,e:0,b:0,d:sy4,f:0};return isUndefined(cx4)||isUndefined(cy4)?scaleMatrix:transform([translate(cx4,cy4),scaleMatrix,translate(-cx4,-cy4)])}var init_scale=__esm({"node_modules/transformation-matrix/src/scale.js"(){"use strict";init_utils();init_translate();init_transform()}});var init_shear=__esm({"node_modules/transformation-matrix/src/shear.js"(){"use strict"}});var tan,init_skew=__esm({"node_modules/transformation-matrix/src/skew.js"(){"use strict";({tan}=Math)}});var init_toString=__esm({"node_modules/transformation-matrix/src/toString.js"(){"use strict"}});var init_smoothMatrix=__esm({"node_modules/transformation-matrix/src/smoothMatrix.js"(){"use strict"}});var init_fromTriangles=__esm({"node_modules/transformation-matrix/src/fromTriangles.js"(){"use strict";init_inverse();init_transform();init_smoothMatrix()}});var init_fromDefinition=__esm({"node_modules/transformation-matrix/src/fromDefinition.js"(){"use strict";init_fromObject();init_translate();init_scale();init_rotate();init_skew();init_shear()}});var init_fromTransformAttribute_autogenerated=__esm({"node_modules/transformation-matrix/src/fromTransformAttribute.autogenerated.js"(){"use strict"}});var init_fromTransformAttribute=__esm({"node_modules/transformation-matrix/src/fromTransformAttribute.js"(){"use strict";init_fromTransformAttribute_autogenerated()}});function decomposeTSR(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose(matrix2,scale(-1,-1)):matrix2=compose(matrix2,scale(1,-1)):flipY2&&(matrix2=compose(matrix2,scale(-1,1)));let a10=matrix2.a,b11=matrix2.b,c4=matrix2.c,d10=matrix2.d,scaleX,scaleY,rotation5;if(a10!==0||c4!==0){let hypotAc=Math.hypot(a10,c4);scaleX=hypotAc,scaleY=(a10*d10-b11*c4)/hypotAc;let acos=Math.acos(a10/hypotAc);rotation5=c4>0?-acos:acos}else if(b11!==0||d10!==0){let hypotBd=Math.hypot(b11,d10);scaleX=(a10*d10-b11*c4)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b11/hypotBd);rotation5=Math.PI/2+(d10>0?-acos:acos)}else scaleX=0,scaleY=0,rotation5=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation5}}}var init_decompose=__esm({"node_modules/transformation-matrix/src/decompose.js"(){"use strict";init_scale();init_transform()}});var init_flip=__esm({"node_modules/transformation-matrix/src/flip.js"(){"use strict"}});var init_fromMovingPoints=__esm({"node_modules/transformation-matrix/src/fromMovingPoints.js"(){"use strict";init_translate();init_applyToPoint();init_rotate();init_scale();init_transform()}});var init_src=__esm({"node_modules/transformation-matrix/src/index.js"(){"use strict";init_applyToPoint();init_fromObject();init_fromString();init_identity();init_inverse();init_isAffineMatrix();init_rotate();init_scale();init_shear();init_skew();init_toString();init_transform();init_translate();init_fromTriangles();init_smoothMatrix();init_fromDefinition();init_fromTransformAttribute();init_decompose();init_flip();init_fromMovingPoints()}});var init_parsel=__esm({"node_modules/parsel-js/dist/parsel.js"(){"use strict"}});var require_performance_now=__commonJS({"node_modules/performance-now/lib/performance-now.js"(exports,module){"use strict";(function(){var getNanoSeconds,hrtime,loadTime,moduleLoadTime,nodeLoadTime,upTime;typeof performance<"u"&&performance!==null&&performance.now?module.exports=function(){return performance.now()}:typeof process<"u"&&process!==null&&process.hrtime?(module.exports=function(){return(getNanoSeconds()-nodeLoadTime)/1e6},hrtime=process.hrtime,getNanoSeconds=function(){var hr3;return hr3=hrtime(),hr3[0]*1e9+hr3[1]},moduleLoadTime=getNanoSeconds(),upTime=process.uptime()*1e9,nodeLoadTime=moduleLoadTime-upTime):Date.now?(module.exports=function(){return Date.now()-loadTime},loadTime=Date.now()):(module.exports=function(){return new Date().getTime()-loadTime},loadTime=new Date().getTime())}).call(exports)}});var init_chunk_GIGMPRPV=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-GIGMPRPV.js"(){"use strict"}});var init_chunk_LL3GOPYX=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-LL3GOPYX.js"(){"use strict"}});function doesLineIntersectLine2([a13,a22],[b13,b22],{lineThickness=0}={}){return lineThickness===0?doSegmentsIntersect2(a13,a22,b13,b22):segmentsDistance2(a13,a22,b13,b22)<=lineThickness}function doSegmentsIntersect2(p13,q13,p23,q22){let o13=orientation2(p13,q13,p23),o23=orientation2(p13,q13,q22),o32=orientation2(p23,q22,p13),o42=orientation2(p23,q22,q13);return!!(o13!==o23&&o32!==o42||o13===0&&onSegment2(p13,p23,q13)||o23===0&&onSegment2(p13,q22,q13)||o32===0&&onSegment2(p23,p13,q22)||o42===0&&onSegment2(p23,q13,q22))}function orientation2(p11,q11,r10){let val=(q11.y-p11.y)*(r10.x-q11.x)-(q11.x-p11.x)*(r10.y-q11.y);return val===0?0:val>0?1:2}function onSegment2(p11,q11,r10){return q11.x<=Math.max(p11.x,r10.x)&&q11.x>=Math.min(p11.x,r10.x)&&q11.y<=Math.max(p11.y,r10.y)&&q11.y>=Math.min(p11.y,r10.y)}function segmentsDistance2(a13,a22,b13,b22){if(a13.x===a22.x&&a13.y===a22.y)return pointToSegmentDistance2(a13,b13,b22);if(b13.x===b22.x&&b13.y===b22.y)return pointToSegmentDistance2(b13,a13,a22);if(doSegmentsIntersect2(a13,a22,b13,b22))return 0;let distances=[pointToSegmentDistance2(a13,b13,b22),pointToSegmentDistance2(a22,b13,b22),pointToSegmentDistance2(b13,a13,a22),pointToSegmentDistance2(b22,a13,a22)];return Math.min(...distances)}function pointToSegmentDistance2(p11,v11,w10){let l22=(w10.x-v11.x)**2+(w10.y-v11.y)**2;if(l22===0)return distance4(p11,v11);let t48=((p11.x-v11.x)*(w10.x-v11.x)+(p11.y-v11.y)*(w10.y-v11.y))/l22;t48=Math.max(0,Math.min(1,t48));let projection2={x:v11.x+t48*(w10.x-v11.x),y:v11.y+t48*(w10.y-v11.y)};return distance4(p11,projection2)}function distance4(p13,p23){let dx4=p13.x-p23.x,dy4=p13.y-p23.y;return Math.sqrt(dx4*dx4+dy4*dy4)}var init_chunk_CHQOCSFB=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-CHQOCSFB.js"(){"use strict"}});var init_chunk_MHHTZHOJ=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/chunk-MHHTZHOJ.js"(){"use strict"}});var init_dist3=__esm({"node_modules/circuit-json-to-connectivity-map/node_modules/@tscircuit/math-utils/dist/index.js"(){"use strict";init_chunk_GIGMPRPV();init_chunk_LL3GOPYX();init_chunk_CHQOCSFB();init_chunk_MHHTZHOJ()}});function findConnectedNetworks(connections){let networks=new Map,netCounter=0;function getOrCreateNetwork(nodeId){for(let[,network]of networks)if(network.has(nodeId))return network;let newNetwork=new Set;return networks.set(`connectivity_net${netCounter++}`,newNetwork),newNetwork}for(let connection of connections){let network=null;for(let nodeId of connection){if(!network)network=getOrCreateNetwork(nodeId);else if(!network.has(nodeId)){let existingNetwork=getOrCreateNetwork(nodeId);if(existingNetwork!==network){for(let node2 of existingNetwork)network.add(node2);networks.delete(Array.from(networks.entries()).find(([,net])=>net===existingNetwork)[0])}}network.add(nodeId)}}return Object.fromEntries(Array.from(networks.entries()).map(([netId,connectedNodes])=>[netId,Array.from(connectedNodes)]))}var ConnectivityMap,getSourcePortConnectivityMapFromCircuitJson,getFullConnectivityMapFromCircuitJson,PcbConnectivityMap,init_dist4=__esm({"node_modules/circuit-json-to-connectivity-map/dist/index.js"(){"use strict";init_dist3();ConnectivityMap=class{constructor(netMap){__publicField(this,"netMap");__publicField(this,"idToNetMap");this.netMap=netMap,this.idToNetMap={};for(let[netId,ids]of Object.entries(netMap))for(let id3 of ids)this.idToNetMap[id3]=netId}addConnections(connections){for(let connection of connections){let existingNets=new Set;for(let id3 of connection){let existingNetId=this.idToNetMap[id3];existingNetId&&existingNets.add(existingNetId)}let targetNetId;if(existingNets.size===0)targetNetId=`connectivity_net${Object.keys(this.netMap).length}`,this.netMap[targetNetId]=[];else if(existingNets.size===1)targetNetId=existingNets.values().next().value??`connectivity_net${Object.keys(this.netMap).length}`;else{targetNetId=existingNets.values().next().value??`connectivity_net${Object.keys(this.netMap).length}`;for(let netId of existingNets)if(netId!==targetNetId){this.netMap[targetNetId].push(...this.netMap[netId]),this.netMap[netId]=this.netMap[targetNetId];for(let id3 of this.netMap[targetNetId])this.idToNetMap[id3]=targetNetId}}for(let id3 of connection)this.netMap[targetNetId].includes(id3)||this.netMap[targetNetId].push(id3),this.idToNetMap[id3]=targetNetId}}getIdsConnectedToNet(netId){return this.netMap[netId]||[]}getNetConnectedToId(id3){return this.idToNetMap[id3]}areIdsConnected(id1,id22){if(id1===id22)return!0;let netId1=this.getNetConnectedToId(id1);if(!netId1)return!1;let netId2=this.getNetConnectedToId(id22);return netId2?netId1===netId2||netId2===id1||netId2===id1:!1}areAllIdsConnected(ids){let netId=this.getNetConnectedToId(ids[0]);for(let id3 of ids){let nextNetId=this.getNetConnectedToId(id3);if(nextNetId===void 0||nextNetId!==netId)return!1}return!0}},getSourcePortConnectivityMapFromCircuitJson=circuitJson=>{let connections=[];for(let element of circuitJson)if(element.type==="source_trace")connections.push([...element.connected_source_port_ids??[],...element.connected_source_net_ids??[]]);else if(element.type==="source_component"){if(element.internally_connected_source_port_ids)for(let portGroup of element.internally_connected_source_port_ids)connections.push(portGroup)}else element.type==="source_component_internal_connection"&&connections.push(element.source_port_ids);let netMap=findConnectedNetworks(connections);return new ConnectivityMap(netMap)},getFullConnectivityMapFromCircuitJson=circuitJson=>{let connections=[];for(let element of circuitJson)if(element.type==="source_trace")connections.push([element.source_trace_id,...element.connected_source_port_ids??[],...element.connected_source_net_ids??[]].filter(Boolean));else if(element.type==="pcb_port"){let{pcb_port_id,source_port_id}=element;source_port_id&&pcb_port_id&&connections.push([source_port_id,pcb_port_id])}else if(element.type==="pcb_smtpad"){let{pcb_smtpad_id,pcb_port_id}=element;pcb_port_id&&pcb_smtpad_id&&connections.push([pcb_smtpad_id,pcb_port_id])}else if(element.type==="pcb_plated_hole"){let{pcb_plated_hole_id,pcb_port_id}=element;pcb_port_id&&pcb_plated_hole_id&&connections.push([pcb_plated_hole_id,pcb_port_id])}else if(element.type==="pcb_trace"){let{pcb_trace_id,source_trace_id}=element,route2=Array.isArray(element.route)?element.route.filter(rp4=>rp4&&rp4.route_type==="wire"):[];if(source_trace_id&&pcb_trace_id&&connections.push([pcb_trace_id,source_trace_id]),Array.isArray(route2)){let startId=route2.find(rp4=>rp4?.start_pcb_port_id)?.start_pcb_port_id,endId=route2.find(rp4=>rp4?.end_pcb_port_id)?.end_pcb_port_id;startId&&pcb_trace_id&&connections.push([startId,pcb_trace_id]),pcb_trace_id&&endId&&connections.push([pcb_trace_id,endId])}}else if(element.type==="pcb_via"){let{pcb_via_id,pcb_trace_id,source_trace_id,source_net_id}=element,connectedIds=[...element.pcb_port_ids??[],pcb_trace_id,source_trace_id,source_net_id].filter(connectedId=>!!connectedId);pcb_via_id&&connectedIds.length>0&&connections.push([pcb_via_id,...connectedIds])}else if(element.type==="source_component"&&element.internally_connected_source_port_ids)for(let portGroup of element.internally_connected_source_port_ids)connections.push(portGroup);let netMap=findConnectedNetworks(connections);return new ConnectivityMap(netMap)},PcbConnectivityMap=class{constructor(circuitJson){__publicField(this,"circuitJson");__publicField(this,"traceIdToElm");__publicField(this,"portIdToElm");__publicField(this,"connMap");this.circuitJson=circuitJson||[],this.traceIdToElm=new Map,this.portIdToElm=new Map,circuitJson?(this._buildTraceMap(),this._buildPortMap(),this.connMap=this._buildTraceConnectivityMap()):this.connMap=new ConnectivityMap({})}_buildPortMap(){for(let element of this.circuitJson)element.type==="pcb_port"&&this.portIdToElm.set(element.pcb_port_id,element)}_buildTraceMap(){for(let element of this.circuitJson)element.type==="pcb_trace"&&this.traceIdToElm.set(element.pcb_trace_id,element)}_buildTraceConnectivityMap(){let connections=[],traceIds=Array.from(this.traceIdToElm.keys());for(let i10=0;i10<traceIds.length;i10++)for(let j11=i10+1;j11<traceIds.length;j11++){let trace1=this.traceIdToElm.get(traceIds[i10]),trace2=this.traceIdToElm.get(traceIds[j11]);this._arePcbTracesConnected(trace1,trace2)&&connections.push([traceIds[i10],traceIds[j11]])}for(let port of this.portIdToElm.values())for(let trace of this.traceIdToElm.values())for(let rp4 of trace.route)rp4.route_type==="wire"&&(rp4.start_pcb_port_id===port.pcb_port_id?connections.push([port.pcb_port_id,trace.pcb_trace_id]):rp4.end_pcb_port_id===port.pcb_port_id&&connections.push([trace.pcb_trace_id,port.pcb_port_id]));return new ConnectivityMap(findConnectedNetworks(connections))}addTrace(trace){this.traceIdToElm.set(trace.pcb_trace_id,trace);let connections=[];for(let rp4 of trace.route)rp4.route_type==="wire"&&(rp4.start_pcb_port_id&&connections.push([rp4.start_pcb_port_id,trace.pcb_trace_id]),rp4.end_pcb_port_id&&connections.push([rp4.end_pcb_port_id,trace.pcb_trace_id]));this.connMap.addConnections(connections)}_arePcbTracesConnected(trace1,trace2){for(let i10=0;i10<trace1.route.length-1;i10++){let segment1A=trace1.route[i10],segment1B=trace1.route[i10+1];if(segment1A.route_type==="wire"&&segment1B.route_type==="wire"&&segment1A.layer===segment1B.layer)for(let j11=0;j11<trace2.route.length-1;j11++){let segment2A=trace2.route[j11],segment2B=trace2.route[j11+1];if(segment2A.route_type!=="wire"||segment2B.route_type!=="wire"||segment2A.layer!==segment2B.layer||segment1A.layer!==segment2A.layer)continue;let radius=(segment1A.width+segment2A.width)/2;if(Math.max(segment1A.x,segment1B.x)+radius<Math.min(segment2A.x,segment2B.x)||Math.max(segment2A.x,segment2B.x)+radius<Math.min(segment1A.x,segment1B.x)||Math.max(segment1A.y,segment1B.y)+radius<Math.min(segment2A.y,segment2B.y)||Math.max(segment2A.y,segment2B.y)+radius<Math.min(segment1A.y,segment1B.y))continue;if(doesLineIntersectLine2([segment1A,segment1B],[segment2A,segment2B],{lineThickness:(segment1A.width+segment2A.width)/2}))return!0}}return!1}areTracesConnected(traceId1,traceId2){return this.connMap.areIdsConnected(traceId1,traceId2)}getAllTracesConnectedToTrace(traceId){let netId=this.connMap.getNetConnectedToId(traceId);return netId?this.connMap.getIdsConnectedToNet(netId).filter(id3=>this.traceIdToElm.has(id3)).map(id3=>this.traceIdToElm.get(id3)):[]}getAllTracesConnectedToPort(portId){let netId=this.connMap.getNetConnectedToId(portId);return netId?this.connMap.getIdsConnectedToNet(netId).filter(id3=>this.traceIdToElm.has(id3)).map(id3=>this.traceIdToElm.get(id3)):[]}}}});var require_boolbase=__commonJS({"node_modules/boolbase/index.js"(exports,module){"use strict";module.exports={trueFunc:function(){return!0},falseFunc:function(){return!1}}}});function E(t48,l10){return Array.isArray(l10)?[t48.a*l10[0]+t48.c*l10[1]+t48.e,t48.b*l10[0]+t48.d*l10[1]+t48.f]:{x:t48.a*l10.x+t48.c*l10.y+t48.e,y:t48.b*l10.x+t48.d*l10.y+t48.f}}function g0(t48){return typeof t48>"u"}function Bt(t48,l10=0){return{a:1,c:0,e:t48,b:0,d:1,f:l10}}function G(...t48){t48=Array.isArray(t48[0])?t48[0]:t48;let l10=(i10,s11)=>({a:i10.a*s11.a+i10.c*s11.b,c:i10.a*s11.c+i10.c*s11.d,e:i10.a*s11.e+i10.c*s11.f+i10.e,b:i10.b*s11.a+i10.d*s11.b,d:i10.b*s11.c+i10.d*s11.d,f:i10.b*s11.e+i10.d*s11.f+i10.f});switch(t48.length){case 0:throw new Error("no matrices provided");case 1:return t48[0];case 2:return l10(t48[0],t48[1]);default:{let[i10,s11,...y10]=t48,p11=l10(i10,s11);return G(p11,...y10)}}}function Do(t48,l10,i10){let s11=Jh(t48),y10=$h(t48),p11={a:s11,c:-y10,e:0,b:y10,d:s11,f:0};return g0(l10)||g0(i10)?p11:G([Bt(l10,i10),p11,Bt(-l10,-i10)])}function Mh(t48,l10){function i10(){this.constructor=t48}i10.prototype=l10.prototype,t48.prototype=new i10}function u0(t48,l10,i10,s11){var y10=Error.call(this,t48);return Object.setPrototypeOf&&Object.setPrototypeOf(y10,u0.prototype),y10.expected=l10,y10.found=i10,y10.location=s11,y10.name="SyntaxError",y10}function qo(t48,l10,i10){return i10=i10||" ",t48.length>l10?t48:(l10-=t48.length,i10+=i10.repeat(l10),t48+i10.slice(0,l10))}function S(t48){if(t48.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let l10=1/0,i10=-1/0,s11=1/0,y10=-1/0,p11=c4=>{l10=Math.min(l10,c4.x),i10=Math.max(i10,c4.x),s11=Math.min(s11,c4.y),y10=Math.max(y10,c4.y)};return t48.forEach(c4=>{switch(c4.type){case"path":c4.points.forEach(p11);break;case"text":p11({x:c4.x,y:c4.y});break;case"circle":{let{x:f10,y:d10,radius:a10}=c4;p11({x:f10-a10,y:d10-a10}),p11({x:f10+a10,y:d10+a10});break}case"box":{let{x:f10,y:d10,width:a10,height:m4}=c4,h11=a10/2,b11=m4/2;p11({x:f10-h11,y:d10-b11}),p11({x:f10+h11,y:d10+b11});break}}}),{minX:l10,maxX:i10,minY:s11,maxY:y10}}function n(t48){let l10=t48.size;if(!l10){let i10=S(t48.primitives);l10={width:i10.maxX-i10.minX,height:i10.maxY-i10.minY}}return{...t48,size:l10}}function G5(t48){return typeof t48=="object"}function I(t48,l10){return{width:Math.max(...l10.map(i10=>Math.abs(i10.x-t48.x)))*2,height:Math.max(...l10.map(i10=>Math.abs(i10.y-t48.y)))*2}}function C3(t48){return typeof t48=="object"}function bb(t48){return typeof t48=="object"}function H(t48,l10){let{width:i10,height:s11}=t48.size,y10=1,p11=1;l10.width!==void 0&&l10.height!==void 0?(y10=l10.width/i10,p11=l10.height/s11):l10.width!==void 0?y10=p11=l10.width/i10:l10.height!==void 0&&(y10=p11=l10.height/s11);let c4=t48.primitives.map(f10=>{switch(f10.type){case"path":return{...f10,points:f10.points.map(d10=>({x:d10.x*y10,y:d10.y*p11}))};case"text":return{...f10,x:f10.x*y10,y:f10.y*p11,fontSize:f10.fontSize?f10.fontSize*y10:void 0};case"circle":return{...f10,x:f10.x*y10,y:f10.y*p11,radius:f10.radius*y10};case"box":return{...f10,x:f10.x*y10,y:f10.y*p11,width:f10.width*y10,height:f10.height*p11};default:return f10}});return{...t48,primitives:c4,center:{x:t48.center.x*y10,y:t48.center.y*p11},ports:t48.ports.map(f10=>({...f10,x:f10.x*y10,y:f10.y*p11})),size:{width:i10*y10,height:s11*p11}}}function zb(t48){return typeof t48=="object"}function Cb(t48){return typeof t48=="object"}var Jh,$h,x8,g8,Wh,L,Y,q,o,Ho,e,X,Bh,Yg,v0,ep,Ih,op,Dh,jg,w0,rp,qh,ip,Hh,Mg,S0,lp,Gh,ap,Uh,Bg,A0,pp,Zh,sp,Kh,Hg,P0,yp,Qh,mp,td,Kg,R0,np,ed,xp,z,rd,r7,F0,fp2,id,cp,hp,ld,m7,T0,dp,ad,_p,bp,U,sd,r,gp,up,vp,wp,yd,Y7,E0,Sp,md,Ap,nd,j7,V0,Pp,xd,Rp,Z,Fp,Tp,Ep,Vp,K,hd,tu,L0,Lp,dd,Yp,_d,iu,Y0,Xp,bd,X0,gd,su2,z0,zp,ud,kp,fu,cu,hu,du,_u,Go,Uo,Zo,jp,N,wd,Op,Jp,Sd,Ad,$p,Pd,Mp,k0,Cp,Rd,j0,Fd,Wp,Np,Td,Ed,Bp,Vd,Ip,Dp,Ld,Yd,qp,Xd,Hp,Gp,zd,kd,Up,Zp,Q,Od,Nu,Kp,Qp,Jd,$d,ts,Md,qu,es,os,Cd,Wd,rs,Nd,Zu,is2,ls,Bd,Id,as,tt,ps,ss,ys,ms2,et,Hd,h6,O0,ns,Gd,xs,Ud,g6,J0,fs,Zd,cs,Kd,S6,$0,hs,Qd,ds,t2,F6,M0,_s,e2,bs,o2,L6,gs,us,r2,i2,vs,ot,ws,Ss,As,Ps,It,p2,G6,Rs,Fs,s2,Ts,y2,Q6,Es,Vs,m2,C0,Ls,n2,av,Ys,Xs,x2,zs,rt,c2,nv,W0,ks,h2,d2,js,_2,Os,it,Js,$s,Ms,Cs,g2,Ws,lt,Ns,Bs,Is,Ds,v2,qv,N0,qs,w2,S2,Hs,at,Gs,Us,Zs,Ks,k,R2,nw,B0,Qs,F2,ty,ey,T2,bw,I0,oy,E2,ry,iy,V2,Pw,D0,ly,L2,ay,Y2,Ew,q0,py,X2,sy,pt,k2,zw,H0,G0,j2,yy,my,ny,O2,Bw,U0,Z0,J2,xy,st,M2,Gw,K0,fy,C2,cy,hy,dy,W2,lS,Q0,_y,N2,by,i0,Ko,B2,gy,l0,Qo,I2,uy,a0,tr,D2,vy,p0,er,q2,wy,j,Sy,Ay,Py,Ry,Fy,Ty,Ey,Vy,te,Ly,U2,B,or,s0,Yy,Xy,rr,zy,O,K2,tA,ee,ky,Q2,jy,t5,iA,oe,Oy,e5,Jy,o5,sA,re,$y,r5,My,i5,xA,ie,Cy,l5,Wy,a5,dA,le,Ny,p5,By,s5,uA,ae,Iy,y5,Dy,J,qy,Hy,Gy,Uy,Zy,Ky,yt,x5,Qy,f5,tm,c5,em,h5,om,d5,rm,_5,im,b5,lm,g5,am,pm,mt,sm,ym,nt,mm2,nm,xm,fm,cm,xt,hm,dm,_m,bm,gm,ft,ir,lr,ar,um,pr,sr,yr,vm,mr,nr,xr,wm,Sm,ct,fr,cr,hr,Am,dr,_r,br,Pm,gr,ur,vr,Rm,Fm,ht,wr,Sr,Ar,Tm,Pr,Rr,Fr,Em,Tr,Er,Vr,Vm,Lm,dt,Lr,Yr,Xr,Ym,zr,kr,jr,Xm,Or,Jr,$r,zm,pe,T5,MR,se,km,E5,ye,Mr,Cr,Wr,jm,me,Om,$,L5,eF,ne,Jm,Y5,$m,X5,lF,xe,Mm,z5,Cm,k5,yF,fe,Wm,j5,Nm,O5,fF,ce,Bm,J5,Im,$5,_F,he,Dm,M5,qm,C5,vF,de,Hm,W5,Gm,Um,B5,I5,_e,Zm,D5,y0,q5,H5,Km,Qm,tn,Z5,K5,be,en,ge,on,M,rn,ln,an,pn,sn,yn,m0,lT,aT,pT,sT,yT,mn,nn,xn,_t,fn,cn,Nr,Br,Ir,hn,dn,ue,Dr,qr,_n,bn,gn,ve,un,vn,Hr,Gr,wn,bt,Sn,An,Pn,Rn,Ur,gt,Zr,Kr,Qr,Fn,ti,ei,oi,Tn,ri,ii,li,En,Vn,p4,Ln,we,Yn,s4,Dt,ai,pi,si,Se,yi,mi,ni,Xn,zn,ut,kn,jn,On,Jn,vt,$n,Mn,Cn,Wn,Nn,x4,Bn,Ae,In,f4,Pe,Dn,qn,xi,fi,Hn,Gn,h4,Un,Zn,qt,Kn,Re,ci,Qn,hi,t9,e9,_4,o9,Fe,r9,b4,Te,di,n0,Ee,i9,x,l9,u4,a9,p9,Wt,v4,s9,w4,g,y9,m9,_i,bi,A,n9,x9,f9,c9,h9,d9,_9,b9,g9,A4,u9,v9,Ht,P4,w9,u,S9,A9,gi,ui,P,P9,R9,F9,T9,E9,V9,L9,Y9,X9,F4,z9,Ve,vi,T4,Le,k9,j9,wi,Si,O9,J9,V4,$9,L4,wt,M9,C9,W9,C,X4,uY,Ye,Ai,z4,N9,k4,AY,Xe,Pi,j4,B9,O4,TY,ze,Ri,J4,I9,$4,YY,ke,Fi,M4,D9,C4,jY,je,Ti,W4,q9,N4,MY,Oe,Ei,B4,H9,G9,St,U9,Z9,K9,Q9,At,tx,ex,ox,rx,H4,ix,lx,Gt,G4,ax,v,px,sx,Vi,Li,R,yx,mx,nx,xx,fx,cx,hx,dx,_x,Z4,bx,gx,Ut,K4,ux,w,vx,wx,Yi,Xi,F,Sx,Ax,Px,Rx,Fx,Tx,Ex,Vx,Lx,Je,Yx,t_,Xx,zx,kx,o_,jx,$e,zi,r_,Me,Ox,Jx,ki,ji,$x,V,l_,rk,Ce,Oi,a_,Mx,pk,sk,yk,mk,nk,Cx,p_,hk,We,Ji,s_,Wx,y_,gk,Ne,$i,m_,Nx,n_,Sk,Be,Mi,x_,Bx,f_,Fk,Ie,Ci,c_,Ix,Dx,d_,qx,De,Hx,qe,__,Gx,Ux,g_,Zx,He,Kx,Pt,Wi,Ni,Bi,Qx,Ii,Di,qi,t1,Hi,Gi,Ui,e1,Rt,v_,Kk,Ge,Zi,w_,o1,S_,oj,Ue,Ki,A_,r1,i1,P_,yj,Ze,Qi,R_,l1,a1,T_,cj,Ke,p1,E_,Qe,s1,ol,tl,rl,el,y1,m1,L_,n1,x1,f1,Y_,to,c1,eo,z_,h1,k_,il,j_,D,ll,al,pl,d1,O_,_1,J_,sl,$_,b1,yl,ml,nl,g1,xl,fl,cl,u1,hl,dl,_l,v1,Ft,C_,Hj,w1,W_,N_,S1,B_,Kj,A1,I_,D_,P1,q_,oO,R1,H_,G_,F1,U_,aO,T1,Z_,E1,V1,Q_,L1,oo,ro,t3,io,bl,e3,o3,Y1,Tt,i3,bO,lo,X1,l3,z1,a3,wO,ao,k1,p3,j1,s3,RO,po,O1,y3,J1,Et,$1,M1,C1,W1,n3,NO,so,N1,x3,B1,Vt,I1,D1,q1,H1,yo,h3,G1,mo,gl,d3,Lt,ul,vl,wl,U1,_3,fJ,no,Sl,b3,xo,Al,Pl,Rl,Z1,Fl,Tl,El,K1,Q1,tf,Yt,Vl,Ll,Yl,ef,Xl,zl,kl,of,jl,Ol,Jl,rf,$l,MJ,CJ,WJ,NJ,BJ,fo,lf,v3,af,pf,co,sf,Zt,yf,Ml,mf,nf,Cl,xf,ho,ff,Kt,cf,Wl,hf,df,Nl,_f,_o,bf,Qt,gf,Bl,uf,vf,Il,wf,bo,Sf,t0,Af,Dl,Pf,Rf,ql,Ff,go,Tf,e0,Ef,Hl,Vf,Lf,Gl,Yf,uo,Xf,o0,zf,Ul,kf,jf,Zl,Of,Jf,Xt,Kl,Ql,ta,$f,ea,oa,ra,Mf,ia,la,aa,Cf,Wf,zt,pa,sa,ya,Nf,ma,na,xa,Bf,fa,ca,ha,If,W,Df,vo,qf,Hf,wo,Gf,Uf,So,Zf,Kf,Ao,Qf,tc,Po,ec,oc,Ro,rc,x0,kt,da,_a2,ba,ic,ga,ua,va,lc,wa,Sa,Aa,ac,f0,jt,Pa,Ra,Fa,pc,Ta,Ea,Va,sc,La,Ya,Xa,yc,Ot,mc,nc,xc,fc,za,iW,lW,aW,pW,sW,Fo,cc,hc,j3,O3,To,dc,J3,c0,$3,M3,_c,bc,Jt,uc,gc,vc,wc,Ac,Sc,Pc,Rc,r0,ka,ja,Oa,Eo,Ja,$a,Ma,Fc,Ca,Wa,Na,Tc,Ba,qW,HW,GW,UW,ZW,Vo,Ec,Vc,B3,I3,Lc,Yc,q3,Xc,Lo,zc,H3,Yo,Ia,G3,U3,kc,jc,K3,Oc,Xo,Da,Q3,zo,Jc,$c,tb,Mc,Cc,Wc,Nc,Bc,rb,qa,ko,Ic,ib,jo,Dc,qc,ab,Hc,Oo,Gc,pb,Jo,Ha,sb,yb,Uc,Zc,nb,Kc,$o,Qc,Mo,th,eh,Ga,Ua,oh,rh,fb,cb,Co,ih,hb,h0,db,_b,lh,ah,$t,ub,ph,vb,sh,wb,yh,Sb,mh,d0,hB,dB,_B,bB,gB,nh,Pb,SB,xh,Rb,fh,Fb,ch,hh,Eb,Vb,Wo,dh,Lb,_0,Yb,Xb,_h,bh,gh,jb,Ob,No,uh,Jb,b0,$b,Mb,vh,wh,Bo,Sh,Mt,Ah,Ph,Rh,Fh,Bb,Io,Th,Ib,Eh,Ct,Vh,Lh,Yh,Xh,zh,jQ,init_dist5=__esm({"node_modules/schematic-symbols/dist/index.js"(){"use strict";({cos:Jh,sin:$h,PI:x8}=Math);({tan:g8}=Math);Mh(u0,Error);u0.prototype.format=function(t48){var l10="Error: "+this.message;if(this.location){var i10=null,s11;for(s11=0;s11<t48.length;s11++)if(t48[s11].source===this.location.source){i10=t48[s11].text.split(/\r\n|\n|\r/g);break}var y10=this.location.start,p11=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(y10):y10,c4=this.location.source+":"+p11.line+":"+p11.column;if(i10){var f10=this.location.end,d10=qo("",p11.line.toString().length," "),a10=i10[y10.line-1],m4=y10.line===f10.line?f10.column:a10.length+1,h11=m4-y10.column||1;l10+=`
14
14
  --> `+c4+`
15
15
  `+d10+` |
16
16
  `+p11.line+" | "+a10+`
@@ -949,7 +949,7 @@ orientation: ${label.orientation}`});for(let inlineLabel of inlineNetLabelPlacem
949
949
  `)});let textX=inlineLabel.center.x,textY=inlineLabel.center.y,anchorSide="center",rotation5;if(inlineLabel.stubTracePath){let stubStart=inlineLabel.stubTracePath[0],stubEnd=inlineLabel.stubTracePath[1],labelOffset=inlineLabel.width/2;stubEnd[inlineLabel.axis]>stubStart[inlineLabel.axis]?(labelOffset=-inlineLabel.width/2,anchorSide="center_left"):anchorSide="center_right",inlineLabel.axis==="x"?textX+=labelOffset:textY+=labelOffset}inlineLabel.axis==="y"&&(rotation5=90),graphics.texts.push({x:textX,y:textY,text:inlineLabel.netLabelText??inlineLabel.netId??"",color:"green",fontSize:inlineLabel.height,anchorSide,rotation:rotation5}),graphics.points.push({x:inlineLabel.anchorPoint.x,y:inlineLabel.anchorPoint.y,color:"green",label:`inline anchor
950
950
  ${inlineLabel.netLabelText??inlineLabel.netId}`})}return graphics},estimateInlineNetLabelWidth=(text2,fontSize=DEFAULT_INLINE_NET_LABEL_HEIGHT)=>{let fontScale=fontSize/.18;return text2.length*.12*fontScale+.12*fontScale},getAnchorCandidates=(segment2,labelWidth,step=.1)=>{let along2=segment2.axis==="x"?"x":"y",start=segment2.start[along2],end=segment2.end[along2],mid=(start+end)/2,direction3=Math.sign(end-start)||1,pointAt2=value=>segment2.axis==="x"?{x:value,y:segment2.start.y}:{x:segment2.start.x,y:segment2.start.y+(value-start)},slack=segment2.length-labelWidth;if(slack<=0)return[pointAt2(mid)];let offsets=[0];for(let offset2=step;offset2<=slack/2+1e-9;offset2+=step)offsets.push(offset2,-offset2);return offsets.push(slack/2,-slack/2),offsets.map(offset2=>pointAt2(mid+offset2*direction3))},doesPathIntersectBounds3=(path,bounds)=>{for(let i23=0;i23<path.length-1;i23++){let a22=path[i23],b22=path[i23+1],segmentBounds={minX:Math.min(a22.x,b22.x),maxX:Math.max(a22.x,b22.x),minY:Math.min(a22.y,b22.y),maxY:Math.max(a22.y,b22.y)};if(boundsOverlap2(segmentBounds,bounds))return!0}return!1},GEOMETRY_EPSILON3=1e-6,getCollisionLimitedTerminalStubEnd=({start,intendedEnd,minimumLength,traces,ownGlobalConnNetId,ignoredTraceIds})=>{let isHorizontal5=Math.abs(intendedEnd.x-start.x)>=Math.abs(intendedEnd.y-start.y),alongAxis=isHorizontal5?"x":"y",acrossAxis=isHorizontal5?"y":"x",direction3=Math.sign(intendedEnd[alongAxis]-start[alongAxis])||1,intendedLength=Math.abs(intendedEnd[alongAxis]-start[alongAxis]),availableLength=intendedLength;for(let trace of traces)if(!ignoredTraceIds.has(trace.mspPairId)&&trace.globalConnNetId!==ownGlobalConnNetId)for(let segmentIndex=0;segmentIndex<trace.tracePath.length-1;segmentIndex++){let segmentStart=trace.tracePath[segmentIndex],segmentEnd=trace.tracePath[segmentIndex+1],startAlong=(segmentStart[alongAxis]-start[alongAxis])*direction3,endAlong=(segmentEnd[alongAxis]-start[alongAxis])*direction3,startAcross=segmentStart[acrossAxis]-start[acrossAxis],endAcross=segmentEnd[acrossAxis]-start[acrossAxis],minAlong=Math.min(startAlong,endAlong),maxAlong=Math.max(startAlong,endAlong),minAcross=Math.min(startAcross,endAcross),maxAcross=Math.max(startAcross,endAcross),collisionDistance;if(Math.abs(startAcross)<=GEOMETRY_EPSILON3&&Math.abs(endAcross)<=GEOMETRY_EPSILON3&&maxAlong>=-GEOMETRY_EPSILON3&&minAlong<=intendedLength+INLINE_NET_LABEL_STUB_TRACE_CLEARANCE+GEOMETRY_EPSILON3)collisionDistance=Math.max(0,minAlong);else{let crossesStubAxis=minAcross<=GEOMETRY_EPSILON3&&maxAcross>=-GEOMETRY_EPSILON3,perpendicularAlong=(startAlong+endAlong)/2;crossesStubAxis&&Math.abs(startAlong-endAlong)<=GEOMETRY_EPSILON3&&perpendicularAlong>=-GEOMETRY_EPSILON3&&perpendicularAlong<=intendedLength+INLINE_NET_LABEL_STUB_TRACE_CLEARANCE+GEOMETRY_EPSILON3&&(collisionDistance=Math.max(0,perpendicularAlong))}collisionDistance!==void 0&&(availableLength=Math.min(availableLength,collisionDistance-INLINE_NET_LABEL_STUB_TRACE_CLEARANCE))}return availableLength+GEOMETRY_EPSILON3<minimumLength?null:isHorizontal5?{x:start.x+direction3*availableLength,y:start.y}:{x:start.x,y:start.y+direction3*availableLength}},EPSILON29=1e-6,isStrictlyBetween2=({coordinate:coordinate3,segmentStartCoordinate,segmentEndCoordinate})=>coordinate3>Math.min(segmentStartCoordinate,segmentEndCoordinate)+EPSILON29&&coordinate3<Math.max(segmentStartCoordinate,segmentEndCoordinate)-EPSILON29,isStrictInteriorPerpendicularCrossing=({firstSegmentStart,firstSegmentEnd,secondSegmentStart,secondSegmentEnd})=>{let firstIsHorizontal=Math.abs(firstSegmentStart.y-firstSegmentEnd.y)<=EPSILON29,firstIsVertical=Math.abs(firstSegmentStart.x-firstSegmentEnd.x)<=EPSILON29,secondIsHorizontal=Math.abs(secondSegmentStart.y-secondSegmentEnd.y)<=EPSILON29,secondIsVertical=Math.abs(secondSegmentStart.x-secondSegmentEnd.x)<=EPSILON29,horizontalStart,horizontalEnd;if(firstIsHorizontal)horizontalStart=firstSegmentStart,horizontalEnd=firstSegmentEnd;else if(secondIsHorizontal)horizontalStart=secondSegmentStart,horizontalEnd=secondSegmentEnd;else return!1;let verticalStart,verticalEnd;if(firstIsVertical)verticalStart=firstSegmentStart,verticalEnd=firstSegmentEnd;else if(secondIsVertical)verticalStart=secondSegmentStart,verticalEnd=secondSegmentEnd;else return!1;return isStrictlyBetween2({coordinate:verticalStart.x,segmentStartCoordinate:horizontalStart.x,segmentEndCoordinate:horizontalEnd.x})&&isStrictlyBetween2({coordinate:horizontalStart.y,segmentStartCoordinate:verticalStart.y,segmentEndCoordinate:verticalEnd.y})},doesTraceRecoveryPathConflict=(tracePath,collisionTraces)=>{for(let pathIndex=0;pathIndex<tracePath.length-1;pathIndex++){let pathStart=tracePath[pathIndex],pathEnd=tracePath[pathIndex+1];for(let trace of collisionTraces)for(let traceIndex=0;traceIndex<trace.tracePath.length-1;traceIndex++){let traceStart=trace.tracePath[traceIndex],traceEnd=trace.tracePath[traceIndex+1];if(doSegmentsIntersect22(pathStart,pathEnd,traceStart,traceEnd)&&!isStrictInteriorPerpendicularCrossing({firstSegmentStart:pathStart,firstSegmentEnd:pathEnd,secondSegmentStart:traceStart,secondSegmentEnd:traceEnd}))return!0}}return!1},getTraceRecoveryConnectivityMaps=inputProblem=>{let chipMap={},pinMap=new Map;for(let chip of inputProblem.chips){chipMap[chip.chipId]=chip;for(let pin of chip.pins)pinMap.set(pin.pinId,{...pin,chipId:chip.chipId,_facingDirection:pin._facingDirection??getPinDirection2(pin,chip)})}return{chipMap,pinMap}},getSimpleConnectionPath=(first,second)=>{let firstDirection=dir(first._facingDirection),secondDirection=dir(second._facingDirection),dx22=second.x-first.x,dy22=second.y-first.y;if((firstDirection.x?Math.abs(dy22)<=1e-6:Math.abs(dx22)<=1e-6)&&firstDirection.x===-secondDirection.x&&firstDirection.y===-secondDirection.y&&dx22*firstDirection.x+dy22*firstDirection.y>1e-6)return[{x:first.x,y:first.y},{x:second.x,y:second.y}];if(firstDirection.x*secondDirection.x||firstDirection.y*secondDirection.y)return;let elbow=firstDirection.x?{x:second.x,y:first.y}:{x:first.x,y:second.y};for(let[pin,direction3]of[[first,firstDirection],[second,secondDirection]])if((elbow.x-pin.x)*direction3.x+(elbow.y-pin.y)*direction3.y<=1e-6)return;return[{x:first.x,y:first.y},elbow,{x:second.x,y:second.y}]},EPS18=1e-9,isHorizontal4=(start,end)=>Math.abs(start.y-end.y)<EPS18,isVertical5=(start,end)=>Math.abs(start.x-end.x)<EPS18,compactConsecutivePoints=path=>path.filter((point62,index2)=>{let previousPoint=path[index2-1];return!previousPoint||Math.abs(point62.x-previousPoint.x)>=EPS18||Math.abs(point62.y-previousPoint.y)>=EPS18}),isValidOrthogonalPath=path=>{if(path.length<2||!path.every((point62,index2)=>{let nextPoint=path[index2+1];return nextPoint?isHorizontal4(point62,nextPoint)||isVertical5(point62,nextPoint):!0}))return!1;for(let firstSegmentIndex=0;firstSegmentIndex<path.length-1;firstSegmentIndex++)for(let secondSegmentIndex=firstSegmentIndex+2;secondSegmentIndex<path.length-1;secondSegmentIndex++)if(segmentsIntersect22(path[firstSegmentIndex],path[firstSegmentIndex+1],path[secondSegmentIndex],path[secondSegmentIndex+1]))return!1;return!0},getEndpointAlignedSegmentCandidates=tracePath=>{let candidates=[];for(let segmentIndex=2;segmentIndex<=tracePath.length-4;segmentIndex++){let previousPoint=tracePath[segmentIndex-1],start=tracePath[segmentIndex],end=tracePath[segmentIndex+1],nextPoint=tracePath[segmentIndex+2],segmentIsVertical=isVertical5(start,end),segmentIsHorizontal=isHorizontal4(start,end);if(!segmentIsVertical&&!segmentIsHorizontal||segmentIsVertical&&(!isHorizontal4(previousPoint,start)||!isHorizontal4(end,nextPoint))||segmentIsHorizontal&&(!isVertical5(previousPoint,start)||!isVertical5(end,nextPoint)))continue;let alignedCoordinates=segmentIsVertical?[previousPoint.x,nextPoint.x]:[previousPoint.y,nextPoint.y];for(let alignedCoordinate of alignedCoordinates){if(Math.abs(alignedCoordinate-(segmentIsVertical?start.x:start.y))<EPS18)continue;let candidate=tracePath.map(point62=>({...point62}));segmentIsVertical?(candidate[segmentIndex].x=alignedCoordinate,candidate[segmentIndex+1].x=alignedCoordinate):(candidate[segmentIndex].y=alignedCoordinate,candidate[segmentIndex+1].y=alignedCoordinate);let compactedCandidate=compactConsecutivePoints(candidate);isValidOrthogonalPath(compactedCandidate)&&candidates.push(compactedCandidate)}}return candidates},countOtherNetCrossings2=({tracePath,globalConnNetId,otherTraces})=>otherTraces.reduce((crossingCount,otherTrace)=>crossingCount+(otherTrace.globalConnNetId===globalConnNetId?0:countPathIntersections(tracePath,otherTrace.tracePath)),0),reduceTraceCrossings=({tracePath,globalConnNetId,otherTraces,isCandidateValid})=>{let bestPath=tracePath,bestCrossingCount=countOtherNetCrossings2({tracePath,globalConnNetId,otherTraces}),bestPathLength=getPathLength4(tracePath);for(let candidate of getEndpointAlignedSegmentCandidates(tracePath)){if(!isCandidateValid(candidate))continue;let crossingCount=countOtherNetCrossings2({tracePath:candidate,globalConnNetId,otherTraces}),pathLength4=getPathLength4(candidate);(crossingCount<bestCrossingCount||crossingCount===bestCrossingCount&&pathLength4<bestPathLength)&&(bestPath=candidate,bestCrossingCount=crossingCount,bestPathLength=pathLength4)}return bestPath},RECOVERED_TRACE_PREFIX="net-label-to-trace-",MAX_NAMED_NET_RECOVERY_PERPENDICULAR_OFFSET=.05,MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET=.25,getCanonicalPairKey=(firstPinId,secondPinId)=>[firstPinId,secondPinId].sort().join("--"),getPerpendicularOffset=(firstPoint,secondPoint)=>{let xDistance=Math.abs(firstPoint.x-secondPoint.x),yDistance=Math.abs(firstPoint.y-secondPoint.y);return xDistance>=yDistance?yDistance:xDistance},arePinsCoFacingAlongSeparationAxis=(firstPin,secondPin)=>{if(firstPin._facingDirection!==secondPin._facingDirection)return!1;let xDistance=Math.abs(firstPin.x-secondPin.x),yDistance=Math.abs(firstPin.y-secondPin.y);return xDistance>=yDistance?firstPin._facingDirection==="x+"||firstPin._facingDirection==="x-":firstPin._facingDirection==="y+"||firstPin._facingDirection==="y-"},NetLabelToTraceSolver=class extends BaseSolver10{constructor(input2,options={}){super();__publicField(this,"input");__publicField(this,"options");__publicField(this,"inputProblem");__publicField(this,"outputTraces");__publicField(this,"outputNetLabelPlacements");__publicField(this,"recoveredTraceIds",new Set);__publicField(this,"chipMap");__publicField(this,"pinMap");__publicField(this,"canRecoverParallelPair");__publicField(this,"queuedCandidates");__publicField(this,"currentCandidate",null);this.input=input2,this.options=options,this.inputProblem=input2.inputProblem,this.outputTraces=[...input2.traces],this.outputNetLabelPlacements=[...input2.netLabelPlacements];let{chipMap,pinMap}=getTraceRecoveryConnectivityMaps(this.inputProblem);this.chipMap=chipMap,this.pinMap=pinMap,this.canRecoverParallelPair=getParallelNetLabelPolicy(this.inputProblem,getConnectivityMapsFromInputProblem(this.inputProblem).netConnMap,new Set(input2.traces.filter(trace=>trace.pinIds.length>1).flatMap(trace=>trace.pinIds))),this.queuedCandidates=this.buildCandidatePairs(),this.stats.candidateCount=this.queuedCandidates.length,this.stats.recoveredTraceCount=0}getConstructorParams(){return[this.input,this.options]}isPortOnlyFallbackLabel(label,groundGlobalConnNetIds){return!(label.pinIds.length!==1||label.mspConnectionPairIds.length!==0||!label.netId||groundGlobalConnNetIds.has(label.globalConnNetId))}isDirectConnectionLabel(label){if(!label.netId||label.pinIds.length!==1)return!1;let pinId=label.pinIds[0];return this.inputProblem.directConnections.some(connection=>connection.netId===label.netId&&connection.pinIds.includes(pinId))}getMultiPinNetConnection(label){if(!label.netId||label.pinIds.length!==1)return;let pinId=label.pinIds[0];return this.inputProblem.netConnections.find(connection=>connection.isGround===!1&&connection.pinIds.length>2&&connection.netId===label.netId&&connection.pinIds.includes(pinId))}getTwoPinNetConnection(label){return this.inputProblem.netConnections.find(connection=>!connection.isGround&&connection.pinIds.length===2&&connection.netId===label.netId&&connection.pinIds.includes(label.pinIds[0]))}buildCandidatePairs(){let{netConnMap}=getConnectivityMapsFromInputProblem(this.inputProblem),groundGlobalConnNetIds=new Set;for(let connection of this.inputProblem.netConnections){if(!connection.isGround)continue;let globalConnNetId=netConnMap.getNetConnectedToId(connection.netId);globalConnNetId&&groundGlobalConnNetIds.add(globalConnNetId)}let labelsByGlobalNet=new Map;for(let label of this.input.netLabelPlacements){if(!this.isPortOnlyFallbackLabel(label,groundGlobalConnNetIds)||!this.isDirectConnectionLabel(label)&&!this.getMultiPinNetConnection(label)&&!this.getTwoPinNetConnection(label))continue;let labels=labelsByGlobalNet.get(label.globalConnNetId)??[];labels.push(label),labelsByGlobalNet.set(label.globalConnNetId,labels)}let candidates=[];for(let labels of labelsByGlobalNet.values())for(let firstIndex=0;firstIndex<labels.length;firstIndex++)for(let secondIndex=firstIndex+1;secondIndex<labels.length;secondIndex++){let firstLabel=labels[firstIndex],secondLabel=labels[secondIndex],firstPin=this.pinMap.get(firstLabel.pinIds[0]),secondPin=this.pinMap.get(secondLabel.pinIds[0]);if(!firstPin||!secondPin||!this.canRecoverParallelPair(firstPin,secondPin))continue;let perpendicularOffset=getPerpendicularOffset(firstPin,secondPin),bothLabelsBelongToDirectConnections=this.isDirectConnectionLabel(firstLabel)&&this.isDirectConnectionLabel(secondLabel),firstMultiPinNetConnection=this.getMultiPinNetConnection(firstLabel),secondMultiPinNetConnection=this.getMultiPinNetConnection(secondLabel),twoPinNetConnection=this.getTwoPinNetConnection(firstLabel),simpleConnectionPath=!bothLabelsBelongToDirectConnections&&twoPinNetConnection&&firstPin.chipId!==secondPin.chipId&&twoPinNetConnection===this.getTwoPinNetConnection(secondLabel)?getSimpleConnectionPath(firstPin,secondPin):void 0;!simpleConnectionPath&&!bothLabelsBelongToDirectConnections&&(!firstMultiPinNetConnection||firstMultiPinNetConnection!==secondMultiPinNetConnection||perpendicularOffset>MAX_NAMED_NET_RECOVERY_PERPENDICULAR_OFFSET)||arePinsInDifferentSchematicSections(this.inputProblem,firstPin,secondPin)||doesPairCrossRestrictedCenterLines({inputProblem:this.inputProblem,chipMap:this.chipMap,pinIdMap:this.pinMap,p1:firstPin,p2:secondPin})||candidates.push({firstLabel,secondLabel,pins:[firstPin,secondPin],perpendicularOffset,routeDistance:Math.abs(firstPin.x-secondPin.x)+Math.abs(firstPin.y-secondPin.y),key:getCanonicalPairKey(firstPin.pinId,secondPin.pinId),recoveryMode:"fallback_labels",simpleConnectionPath})}candidates.push(...this.buildRoutedComponentCandidates(groundGlobalConnNetIds));let selectedCandidates=this.options.onlyInlineDirectConnections||this.options.onlyInlineConnections?candidates.filter(candidate=>this.options.onlyInlineConnections&&candidate.simpleConnectionPath?.length===2&&this.inputProblem.netConnections.some(net=>net.allowInlineNetLabel&&!net.isGround&&net.pinIds.length===2&&candidate.pins.every(pin=>net.pinIds.includes(pin.pinId)))||this.inputProblem.directConnections.some(connection=>candidate.pins.every(pin=>connection.pinIds.includes(pin.pinId))&&(connection.allowInlineNetLabel||this.inputProblem.netConnections.some(net=>net.allowInlineNetLabel&&candidate.pins.every(pin=>net.pinIds.includes(pin.pinId)))))):candidates;return selectedCandidates.sort((first,second)=>first.perpendicularOffset-second.perpendicularOffset||first.routeDistance-second.routeDistance||first.key.localeCompare(second.key)),selectedCandidates}buildRoutedComponentCandidates(groundGlobalConnNetIds){let{netConnMap}=getConnectivityMapsFromInputProblem(this.inputProblem),candidates=[],directConnections=new Set(this.inputProblem.directConnections);for(let connection of[...this.inputProblem.netConnections.filter(connection2=>connection2.pinIds.length>2&&connection2.isGround===!1),...this.inputProblem.directConnections]){let isDirectConnection=directConnections.has(connection),canRecoverElbow=isDirectConnection&&(this.options.onlyInlineDirectConnections||this.options.onlyInlineConnections),globalConnNetId=netConnMap.getNetConnectedToId(connection.pinIds[0]);if(!globalConnNetId||isDirectConnection&&groundGlobalConnNetIds.has(globalConnNetId))continue;let connectionPinIds=connection.pinIds;isDirectConnection&&(connectionPinIds=[...this.pinMap.keys()].filter(pinId=>netConnMap.getNetConnectedToId(pinId)===globalConnNetId));let traceConnectedPinComponents=getTraceConnectedPinComponents({pinIds:connectionPinIds,traces:this.outputTraces.filter(trace=>trace.globalConnNetId===globalConnNetId)}).filter(component=>component.traces.length>0);for(let firstIndex=0;firstIndex<traceConnectedPinComponents.length;firstIndex++)for(let secondIndex=firstIndex+1;secondIndex<traceConnectedPinComponents.length;secondIndex++){let firstComponent=traceConnectedPinComponents[firstIndex],secondComponent=traceConnectedPinComponents[secondIndex];if(isDirectConnection&&!(firstComponent.pinIds.includes(connection.pinIds[0])&&secondComponent.pinIds.includes(connection.pinIds[1])||firstComponent.pinIds.includes(connection.pinIds[1])&&secondComponent.pinIds.includes(connection.pinIds[0])))continue;let firstLabel=this.input.netLabelPlacements.find(label=>label.globalConnNetId===globalConnNetId&&label.mspConnectionPairIds.length>0&&label.pinIds.some(pinId=>firstComponent.pinIds.includes(pinId))),secondLabel=this.input.netLabelPlacements.find(label=>label.globalConnNetId===globalConnNetId&&label.mspConnectionPairIds.length>0&&label.pinIds.some(pinId=>secondComponent.pinIds.includes(pinId)));if(!firstLabel||!secondLabel||firstLabel===secondLabel)continue;let labelsAreAligned=getPerpendicularOffset(firstLabel.anchorPoint,secondLabel.anchorPoint)<=MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET;if(!labelsAreAligned&&!canRecoverElbow)continue;let bestCandidate,firstPinIds=firstComponent.pinIds,secondPinIds=secondComponent.pinIds;isDirectConnection&&(firstPinIds=connection.pinIds.filter(pinId=>firstComponent.pinIds.includes(pinId)),secondPinIds=connection.pinIds.filter(pinId=>secondComponent.pinIds.includes(pinId)));for(let firstPinId of firstPinIds)for(let secondPinId of secondPinIds){let firstPin=this.pinMap.get(firstPinId),secondPin=this.pinMap.get(secondPinId);if(!firstPin||!secondPin||!this.canRecoverParallelPair(firstPin,secondPin)||isDirectConnection&&firstPin.chipId===secondPin.chipId)continue;let perpendicularOffset=getPerpendicularOffset(firstPin,secondPin),simpleConnectionPath=canRecoverElbow&&(!labelsAreAligned||perpendicularOffset>MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET)?getSimpleConnectionPath(firstPin,secondPin):void 0;if((!labelsAreAligned||perpendicularOffset>MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET)&&!simpleConnectionPath||arePinsCoFacingAlongSeparationAxis(firstPin,secondPin)||arePinsInDifferentSchematicSections(this.inputProblem,firstPin,secondPin)||doesPairCrossRestrictedCenterLines({inputProblem:this.inputProblem,chipMap:this.chipMap,pinIdMap:this.pinMap,p1:firstPin,p2:secondPin}))continue;let routeDistance=Math.abs(firstPin.x-secondPin.x)+Math.abs(firstPin.y-secondPin.y),recoveryMode="routed_components";isDirectConnection&&(recoveryMode="routed_direct_connection");let candidate={firstLabel,secondLabel,pins:[firstPin,secondPin],perpendicularOffset,routeDistance,key:getCanonicalPairKey(firstPin.pinId,secondPin.pinId),recoveryMode,netConnectionPinIds:connectionPinIds,simpleConnectionPath};(!bestCandidate||candidate.routeDistance<bestCandidate.routeDistance||candidate.routeDistance===bestCandidate.routeDistance&&(candidate.perpendicularOffset<bestCandidate.perpendicularOffset||candidate.perpendicularOffset===bestCandidate.perpendicularOffset&&candidate.key.localeCompare(bestCandidate.key)<0))&&(bestCandidate=candidate)}bestCandidate&&candidates.push(bestCandidate)}}return candidates}isSupersededConnectorTrace(trace,candidate){return!this.input.netLabelConnectorTraceIds?.has(trace.mspPairId)||trace.pinIds.length!==1?!1:candidate.pins.some(pin=>pin.pinId===trace.pinIds[0])}routeIntersectsRemainingLabels(tracePath,candidate){for(let label of this.outputNetLabelPlacements)if(!(label===candidate.firstLabel||label===candidate.secondLabel)&&pathIntersectsRenderedLabel(tracePath,label))return!0;return this.input.inlineNetLabelPlacements.some(label=>pathIntersectsRenderedLabel(tracePath,label))}tryAcceptCurrentRoute(){let candidate=this.currentCandidate,tracePath=this.activeSubSolver?.solvedTracePath;if(!candidate||!tracePath)return;let retainedTraces=this.outputTraces.filter(trace=>!this.isSupersededConnectorTrace(trace,candidate)),collisionTraces=retainedTraces;if(candidate.recoveryMode!=="fallback_labels"&&(collisionTraces=retainedTraces.filter(trace=>trace.globalConnNetId!==candidate.firstLabel.globalConnNetId)),candidate.simpleConnectionPath&&(tracePath=candidate.simpleConnectionPath,findFirstCollision(tracePath,this.activeSubSolver.obstacles)||collisionTraces.reduce((count,trace)=>count+findPerpendicularPathCrossings(tracePath,trace.tracePath,{includeTerminalSegments:!0}).length,0)>1)||doesTraceRecoveryPathConflict(tracePath,collisionTraces)||this.routeIntersectsRemainingLabels(tracePath,candidate))return;tracePath=reduceTraceCrossings({tracePath,globalConnNetId:candidate.firstLabel.globalConnNetId,otherTraces:collisionTraces,isCandidateValid:candidatePath=>findFirstCollision(candidatePath,this.activeSubSolver.obstacles)===null&&!doesTraceRecoveryPathConflict(candidatePath,collisionTraces)&&!this.routeIntersectsRemainingLabels(candidatePath,candidate)});let[firstPin,secondPin]=candidate.pins,mspPairId=`${RECOVERED_TRACE_PREFIX}${candidate.key}`,recoveredTrace={mspPairId,dcConnNetId:candidate.firstLabel.globalConnNetId,globalConnNetId:candidate.firstLabel.globalConnNetId,pins:[firstPin,secondPin],tracePath,mspConnectionPairIds:[mspPairId],pinIds:[firstPin.pinId,secondPin.pinId]};this.recoveredTraceIds.add(mspPairId),this.outputTraces=[...retainedTraces,recoveredTrace],candidate.recoveryMode!=="routed_components"&&(this.outputNetLabelPlacements=this.outputNetLabelPlacements.filter(label=>label!==candidate.firstLabel&&label!==candidate.secondLabel)),this.stats.recoveredTraceCount++}areCandidatePinsAlreadyConnected(candidate){return candidate.netConnectionPinIds?getTraceConnectedPinComponents({pinIds:candidate.netConnectionPinIds,traces:this.outputTraces}).some(component=>component.pinIds.includes(candidate.pins[0].pinId)&&component.pinIds.includes(candidate.pins[1].pinId)):!1}_step(){if(this.activeSubSolver){this.activeSubSolver.step(),this.activeSubSolver.solved?(this.tryAcceptCurrentRoute(),this.activeSubSolver=null,this.currentCandidate=null):this.activeSubSolver.failed&&(this.activeSubSolver=null,this.currentCandidate=null);return}let candidate=this.queuedCandidates.shift();for(;candidate&&(!this.outputNetLabelPlacements.includes(candidate.firstLabel)||!this.outputNetLabelPlacements.includes(candidate.secondLabel)||this.areCandidatePinsAlreadyConnected(candidate));)candidate=this.queuedCandidates.shift();if(!candidate){this.solved=!0;return}this.currentCandidate=candidate,this.activeSubSolver=new SchematicTraceSingleLineSolver2({inputProblem:this.inputProblem,pins:candidate.pins,chipMap:this.chipMap})}getOutput(){return{traces:this.outputTraces,netLabelPlacements:this.outputNetLabelPlacements,inlineNetLabelPlacements:this.input.inlineNetLabelPlacements}}visualize(){if(this.activeSubSolver)return this.activeSubSolver.visualize();let graphics=visualizeInlineNetLabelOutput({inputProblem:this.inputProblem,...this.getOutput()});for(let trace of this.outputTraces)this.recoveredTraceIds.has(trace.mspPairId)&&graphics.lines.push({points:trace.tracePath,strokeColor:"green",label:`recovered from net labels: ${trace.pinIds.join(" -> ")}`});return graphics}};function definePipelineStep22(solverName,solverClass,getConstructorParams,opts={}){return{solverName,solverClass,getConstructorParams,onSolved:opts.onSolved,shouldSkip:opts.shouldSkip}}var SchematicTracePipelineSolver=class extends BaseSolver10{constructor(inputProblem,opts){super();__publicField(this,"mspConnectionPairSolver");__publicField(this,"schematicTraceLinesSolver");__publicField(this,"longDistancePairSolver");__publicField(this,"unroutedTraceRecoverySolver");__publicField(this,"traceOverlapShiftSolver");__publicField(this,"netLabelPlacementSolver");__publicField(this,"labelMergingSolver");__publicField(this,"traceLabelOverlapAvoidanceSolver");__publicField(this,"traceCleanupSolver");__publicField(this,"example28Solver");__publicField(this,"availableNetOrientationSolver");__publicField(this,"postLabelTraceOverlapShiftSolver");__publicField(this,"railNetLabelCornerPlacementSolver");__publicField(this,"traceAnchoredNetLabelOverlapSolver");__publicField(this,"finalTraceAnchoredNetLabelOverlapSolver");__publicField(this,"preAlignmentNetLabelTraceCollisionSolver");__publicField(this,"netLabelTraceCollisionSolver");__publicField(this,"traceCleanupSolver2");__publicField(this,"netLabelNetLabelCollisionSolver");__publicField(this,"finalRailNetLabelCornerPlacementSolver");__publicField(this,"traceElbowTransitionSimplificationSolver");__publicField(this,"preAlignmentTraceElbowTransitionSimplificationSolver");__publicField(this,"finalTraceElbowTransitionSimplificationSolver");__publicField(this,"sameNetJunctionAlignmentSolver");__publicField(this,"inlineDirectTraceRecoverySolver");__publicField(this,"inlineNetLabelSolver");__publicField(this,"netLabelToTraceSolver");__publicField(this,"startTimeOfPhase");__publicField(this,"endTimeOfPhase");__publicField(this,"timeSpentOnPhase");__publicField(this,"firstIterationOfPhase");__publicField(this,"inputProblem");__publicField(this,"hideRatsNet");__publicField(this,"pipelineDef",[definePipelineStep22("mspConnectionPairSolver",MspConnectionPairSolver,()=>[{inputProblem:this.inputProblem}],{onSolved:mspSolver=>{}}),definePipelineStep22("schematicTraceLinesSolver",SchematicTraceLinesSolver,()=>[{mspConnectionPairs:this.mspConnectionPairSolver.mspConnectionPairs,dcConnMap:this.mspConnectionPairSolver.dcConnMap,globalConnMap:this.mspConnectionPairSolver.globalConnMap,inputProblem:this.inputProblem,chipMap:this.mspConnectionPairSolver.chipMap}]),definePipelineStep22("longDistancePairSolver",LongDistancePairSolver,instance=>[{inputProblem:instance.inputProblem,primaryMspConnectionPairs:instance.mspConnectionPairSolver.mspConnectionPairs,alreadySolvedTraces:instance.schematicTraceLinesSolver.solvedTracePaths,failedConnectionPairs:instance.schematicTraceLinesSolver.failedConnectionPairs}],{onSolved:schematicTraceLinesSolver=>{}}),definePipelineStep22("unroutedTraceRecoverySolver",UnroutedTraceRecoverySolver,instance=>[{inputProblem:instance.inputProblem,failedConnectionPairs:instance.schematicTraceLinesSolver.failedConnectionPairs,alreadySolvedTraces:instance.longDistancePairSolver.getOutput().allTracesMerged}]),definePipelineStep22("traceOverlapShiftSolver",TraceOverlapShiftSolver,()=>[{inputProblem:this.inputProblem,inputTracePaths:this.unroutedTraceRecoverySolver?.getOutput().allTracesMerged,globalConnMap:this.mspConnectionPairSolver.globalConnMap}],{onSolved:_solver=>{}}),definePipelineStep22("netLabelPlacementSolver",NetLabelPlacementSolver,()=>[{inputProblem:this.inputProblem,inputTraceMap:this.traceOverlapShiftSolver?.correctedTraceMap??Object.fromEntries(this.unroutedTraceRecoverySolver.getOutput().allTracesMerged.map(p23=>[p23.mspPairId,p23]))}],{onSolved:_solver=>{}}),definePipelineStep22("traceLabelOverlapAvoidanceSolver",TraceLabelOverlapAvoidanceSolver,instance=>{let traceMap=instance.traceOverlapShiftSolver?.correctedTraceMap??Object.fromEntries(instance.unroutedTraceRecoverySolver.getOutput().allTracesMerged.map(p23=>[p23.mspPairId,p23])),traces=Object.values(traceMap),netLabelPlacements=instance.netLabelPlacementSolver.netLabelPlacements;return[{inputProblem:instance.inputProblem,traces,netLabelPlacements}]}),definePipelineStep22("traceElbowTransitionSimplificationSolver",TraceElbowTransitionSimplificationSolver,instance=>{let overlapAvoidanceOutput=instance.traceLabelOverlapAvoidanceSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:overlapAvoidanceOutput.traces,completedReroutes:overlapAvoidanceOutput.completedReroutes,netLabelPlacements:instance.traceLabelOverlapAvoidanceSolver.netLabelPlacements,paddingBuffer:.1}]}),definePipelineStep22("traceCleanupSolver",TraceCleanupSolver,instance=>{let traces=instance.traceElbowTransitionSimplificationSolver.getOutput().traces,overlapShiftSolver=instance.traceOverlapShiftSolver,inlineLabelNetIds=new Set([...instance.inputProblem.directConnections,...instance.inputProblem.netConnections].filter(connection=>connection.allowInlineNetLabel).map(connection=>connection.netId)),traceIdsInNewCrossingsAfterOverlapShift=new Set;for(let traceIndex=0;traceIndex<overlapShiftSolver.inputTracePaths.length;traceIndex++){let inputTrace=overlapShiftSolver.inputTracePaths[traceIndex],shiftedTrace=overlapShiftSolver.correctedTraceMap[inputTrace.mspPairId];for(let otherTraceIndex=traceIndex+1;otherTraceIndex<overlapShiftSolver.inputTracePaths.length;otherTraceIndex++){let otherInputTrace=overlapShiftSolver.inputTracePaths[otherTraceIndex];if(inputTrace.globalConnNetId===otherInputTrace.globalConnNetId||!inlineLabelNetIds.has(inputTrace.userNetId??"")&&!inlineLabelNetIds.has(otherInputTrace.userNetId??""))continue;let otherShiftedTrace=overlapShiftSolver.correctedTraceMap[otherInputTrace.mspPairId],crossingCountBeforeShift=findPerpendicularPathCrossings(inputTrace.tracePath,otherInputTrace.tracePath).length;findPerpendicularPathCrossings(shiftedTrace.tracePath,otherShiftedTrace.tracePath).length>crossingCountBeforeShift&&(traceIdsInNewCrossingsAfterOverlapShift.add(inputTrace.mspPairId),traceIdsInNewCrossingsAfterOverlapShift.add(otherInputTrace.mspPairId))}}let labelMergingOutput=instance.traceLabelOverlapAvoidanceSolver.labelMergingSolver.getOutput();return[{inputProblem:instance.inputProblem,allTraces:traces,allLabelPlacements:labelMergingOutput.netLabelPlacements,mergedLabelNetIdMap:labelMergingOutput.mergedLabelNetIdMap,paddingBuffer:.1,eligibleTraceIds:traceIdsInNewCrossingsAfterOverlapShift}]}),definePipelineStep22("netLabelPlacementSolver",NetLabelPlacementSolver,instance=>{let traces=instance.traceCleanupSolver?.getOutput().traces??instance.traceLabelOverlapAvoidanceSolver.getOutput().traces;return[{inputProblem:instance.inputProblem,inputTraceMap:Object.fromEntries(traces.map(trace=>[trace.mspPairId,trace]))}]}),definePipelineStep22("example28Solver",Example28Solver,instance=>{let traces=instance.traceCleanupSolver?.getOutput().traces??instance.traceLabelOverlapAvoidanceSolver.getOutput().traces;return[{inputProblem:instance.inputProblem,traces,netLabelPlacements:instance.netLabelPlacementSolver.netLabelPlacements}]}),definePipelineStep22("availableNetOrientationSolver",AvailableNetOrientationSolver,instance=>[{inputProblem:instance.inputProblem,traces:instance.example28Solver.outputTraces,netLabelPlacements:instance.example28Solver.outputNetLabelPlacements}]),definePipelineStep22("postLabelTraceOverlapShiftSolver",TraceOverlapShiftSolver,instance=>[{inputProblem:instance.inputProblem,inputTracePaths:instance.availableNetOrientationSolver.traces,globalConnMap:instance.mspConnectionPairSolver.globalConnMap,traceIdsToShift:new Set(instance.availableNetOrientationSolver.netLabelConnectorTraceIds)}]),definePipelineStep22("railNetLabelCornerPlacementSolver",RailNetLabelCornerPlacementSolver,instance=>[{inputProblem:instance.inputProblem,traces:Object.values(instance.postLabelTraceOverlapShiftSolver.correctedTraceMap),netLabelPlacements:instance.availableNetOrientationSolver.outputNetLabelPlacements,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]),definePipelineStep22("traceAnchoredNetLabelOverlapSolver",TraceAnchoredNetLabelOverlapSolver,instance=>[{inputProblem:instance.inputProblem,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds,traces:instance.railNetLabelCornerPlacementSolver.getOutput().traces,netLabelPlacements:instance.railNetLabelCornerPlacementSolver.outputNetLabelPlacements}]),definePipelineStep22("preAlignmentNetLabelTraceCollisionSolver",NetLabelTraceCollisionSolver,instance=>[{inputProblem:instance.inputProblem,traces:instance.railNetLabelCornerPlacementSolver.getOutput().traces,netLabelPlacements:instance.traceAnchoredNetLabelOverlapSolver.outputNetLabelPlacements}]),definePipelineStep22("preAlignmentTraceElbowTransitionSimplificationSolver",TraceElbowTransitionSimplificationSolver,instance=>{let collisionOutput=instance.preAlignmentNetLabelTraceCollisionSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:collisionOutput.traces,completedReroutes:collisionOutput.completedReroutes,netLabelPlacements:collisionOutput.netLabelPlacements,paddingBuffer:.1,allowShorterPaths:!0}]}),definePipelineStep22("traceCleanupSolver2",TraceCleanupSolver,instance=>{let collisionOutput=instance.preAlignmentTraceElbowTransitionSimplificationSolver.getOutput(),labelMergingOutput=instance.traceLabelOverlapAvoidanceSolver.labelMergingSolver.getOutput();return[{inputProblem:instance.inputProblem,allTraces:collisionOutput.traces,allLabelPlacements:collisionOutput.netLabelPlacements,mergedLabelNetIdMap:labelMergingOutput.mergedLabelNetIdMap,paddingBuffer:.1,operations:["rerouting_generated_net_label_connector_crossings","aligning_same_net_rails"],eligibleTraceIds:new Set(instance.traceCleanupSolver.getOutput().traces.map(trace=>trace.mspPairId)),netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]}),definePipelineStep22("netLabelTraceCollisionSolver",NetLabelTraceCollisionSolver,instance=>{let previousOutput=instance.preAlignmentNetLabelTraceCollisionSolver.getOutput(),alignmentOutput=instance.traceCleanupSolver2.getOutput(),connectorMovement=moveNetLabelConnectorsToReroutedTraces({originalTraces:previousOutput.traces,reroutedTraces:alignmentOutput.traces,netLabelPlacements:previousOutput.netLabelPlacements}),previousTraceMap=new Map(previousOutput.traces.map(trace=>[trace.mspPairId,trace])),netLabelPlacements=connectorMovement.netLabelPlacements;for(let trace of connectorMovement.traces){let previousTrace=previousTraceMap.get(trace.mspPairId);if(!previousTrace||previousTrace.tracePath===trace.tracePath)continue;let currentLabels=netLabelPlacements;netLabelPlacements=moveAttachedLabelsToReroutedTrace({trace:previousTrace,originalTracePath:previousTrace.tracePath,reroutedTracePath:trace.tracePath,netLabelPlacements:currentLabels}).map((movedLabel,labelIndex)=>{let label=currentLabels[labelIndex];return label.orientation==="y+"||label.orientation==="y-"?movedLabel:label})}return[{inputProblem:instance.inputProblem,traces:connectorMovement.traces,netLabelPlacements}]}),definePipelineStep22("finalTraceElbowTransitionSimplificationSolver",TraceElbowTransitionSimplificationSolver,instance=>{let collisionOutput=instance.netLabelTraceCollisionSolver.getOutput(),completedReroutes=[...instance.traceLabelOverlapAvoidanceSolver.getOutput().completedReroutes,...instance.preAlignmentNetLabelTraceCollisionSolver.getOutput().completedReroutes,...collisionOutput.completedReroutes];return[{inputProblem:instance.inputProblem,traces:collisionOutput.traces,completedReroutes,netLabelPlacements:collisionOutput.netLabelPlacements,paddingBuffer:.1,allowShorterPaths:!0}]}),definePipelineStep22("finalRailNetLabelCornerPlacementSolver",RailNetLabelCornerPlacementSolver,instance=>[{inputProblem:instance.inputProblem,...instance.finalTraceElbowTransitionSimplificationSolver.getOutput(),originalTraces:instance.railNetLabelCornerPlacementSolver.getOutput().traces,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds,onlyOverlappingLabels:!0}]),definePipelineStep22("netLabelNetLabelCollisionSolver",NetLabelNetLabelCollisionSolver,instance=>{let placementOutput=instance.finalRailNetLabelCornerPlacementSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:placementOutput.traces,netLabelPlacements:placementOutput.netLabelPlacements,preserveNonInlineLabelsAgainstInlineEligibleCollisions:!0}]}),definePipelineStep22("finalTraceAnchoredNetLabelOverlapSolver",TraceAnchoredNetLabelOverlapSolver,instance=>[{inputProblem:instance.inputProblem,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds,traces:instance.netLabelNetLabelCollisionSolver.traces,netLabelPlacements:instance.netLabelNetLabelCollisionSolver.getOutput().netLabelPlacements,overlapMode:"traces"}]),definePipelineStep22("sameNetJunctionAlignmentSolver",SameNetJunctionAlignmentSolver,instance=>{let collisionOutput=instance.finalTraceAnchoredNetLabelOverlapSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:instance.netLabelNetLabelCollisionSolver.traces,netLabelPlacements:collisionOutput.netLabelPlacements,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]}),definePipelineStep22("inlineDirectTraceRecoverySolver",NetLabelToTraceSolver,instance=>[{inputProblem:instance.inputProblem,...instance.sameNetJunctionAlignmentSolver.getOutput(),inlineNetLabelPlacements:[],netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds},{onlyInlineConnections:!0}]),definePipelineStep22("inlineNetLabelSolver",InlineNetLabelSolver,instance=>{let recoveredOutput=instance.inlineDirectTraceRecoverySolver.getOutput(),completedReroutes=[...instance.traceLabelOverlapAvoidanceSolver.getOutput().completedReroutes,...instance.preAlignmentNetLabelTraceCollisionSolver.getOutput().completedReroutes,...instance.netLabelTraceCollisionSolver.getOutput().completedReroutes];return[{inputProblem:instance.inputProblem,traces:recoveredOutput.traces,netLabelPlacements:recoveredOutput.netLabelPlacements,completedReroutes,resolveTraceCollisions:!0,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]}),definePipelineStep22("netLabelToTraceSolver",NetLabelToTraceSolver,instance=>{let inlineOutput=instance.inlineNetLabelSolver.getOutput();return[{inputProblem:instance.inputProblem,...inlineOutput}]})]);__publicField(this,"currentPipelineStepIndex",0);this.hideRatsNet=opts?.hideRatsNet??!1,this.inputProblem=this.cloneAndCorrectInputProblem(inputProblem),this.MAX_ITERATIONS=1e6,this.startTimeOfPhase={},this.endTimeOfPhase={},this.timeSpentOnPhase={},this.firstIterationOfPhase={}}getSolverName(){return"SchematicTracePipelineSolver"}getConstructorParams(){return[this.inputProblem,{hideRatsNet:this.hideRatsNet}]}cloneAndCorrectInputProblem(original){let cloned=structuredClone({...original,_chipObstacleSpatialIndex:void 0,_hideRatsNet:this.hideRatsNet});return correctPinsInsideChips(cloned),cloned}_step(){let pipelineStepDef=this.pipelineDef[this.currentPipelineStepIndex];if(!pipelineStepDef){this.solved=!0;return}if(this.activeSubSolver){this.activeSubSolver.step(),this.activeSubSolver.solved?(this.endTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.timeSpentOnPhase[pipelineStepDef.solverName]=this.endTimeOfPhase[pipelineStepDef.solverName]-this.startTimeOfPhase[pipelineStepDef.solverName],pipelineStepDef.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStepIndex++):this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null);return}let constructorParams=pipelineStepDef.getConstructorParams(this);this.activeSubSolver=new pipelineStepDef.solverClass(...constructorParams),this[pipelineStepDef.solverName]=this.activeSubSolver,this.timeSpentOnPhase[pipelineStepDef.solverName]=0,this.startTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.firstIterationOfPhase[pipelineStepDef.solverName]=this.iterations}solveUntilPhase(phase){for(;this.getCurrentPhase().toLowerCase()!==phase.toLowerCase();)this.step()}getCurrentPhase(){return this.pipelineDef[this.currentPipelineStepIndex]?.solverName??"none"}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let visualizations=[visualizeInputProblem2(this.inputProblem,{hideRatsNet:this.hideRatsNet}),...this.pipelineDef.map(p23=>this[p23.solverName]?.visualize()).filter(Boolean).map((viz,stepIndex)=>{for(let rect of viz.rects??[])rect.step=stepIndex;for(let point62 of viz.points??[])point62.step=stepIndex;for(let circle3 of viz.circles??[])circle3.step=stepIndex;for(let text2 of viz.texts??[])text2.step=stepIndex;for(let line2 of viz.lines??[])line2.step=stepIndex;return viz})];if(visualizations.length===1)return visualizations[0];let finalGraphics={points:visualizations.flatMap(v23=>v23.points||[]),rects:visualizations.flatMap(v23=>v23.rects||[]),lines:visualizations.flatMap(v23=>v23.lines||[]),circles:visualizations.flatMap(v23=>v23.circles||[]),texts:visualizations.flatMap(v23=>v23.texts||[])};return colorAvailableNetOrientationLabels(finalGraphics,this.inputProblem),finalGraphics}preview(){return this.activeSubSolver?this.activeSubSolver.preview():super.preview()}},POINT_EPSILON2=1e-8,isPointOnSegment32=(point62,start,end)=>{let cross52=(point62.y-start.y)*(end.x-start.x)-(point62.x-start.x)*(end.y-start.y);if(Math.abs(cross52)>POINT_EPSILON2)return!1;let dot23=(point62.x-start.x)*(end.x-start.x)+(point62.y-start.y)*(end.y-start.y);if(dot23<-POINT_EPSILON2)return!1;let squaredLength6=(end.x-start.x)**2+(end.y-start.y)**2;return dot23<=squaredLength6+POINT_EPSILON2},isPointInRing=(point62,ring4)=>{let isInside=!1;for(let currentIndex=0,previousIndex=ring4.vertices.length-1;currentIndex<ring4.vertices.length;previousIndex=currentIndex++){let current3=ring4.vertices[currentIndex],previous=ring4.vertices[previousIndex];if(isPointOnSegment32(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&&(isInside=!isInside)}return isInside},isPointInShape=(point62,shape21)=>isPointInRing(point62,shape21.outer_ring)&&!shape21.inner_rings.some(innerRing=>isPointInRing(point62,innerRing)),isPointInShapeUnion=(point62,shapes)=>shapes.some(shape21=>isPointInShape(point62,shape21)),getShapeUnionBounds=shapes=>{let vertices=shapes.flatMap(shape21=>shape21.outer_ring.vertices);if(vertices.length!==0)return{minX:Math.min(...vertices.map(vertex=>vertex.x)),maxX:Math.max(...vertices.map(vertex=>vertex.x)),minY:Math.min(...vertices.map(vertex=>vertex.y)),maxY:Math.max(...vertices.map(vertex=>vertex.y))}},isViaAnnulusInsideShapeUnion=({center:center2,radius,shapes})=>{let samplePoints=[center2];for(let sampleIndex=0;sampleIndex<32;sampleIndex++){let angle3=sampleIndex/32*Math.PI*2;samplePoints.push({x:center2.x+Math.cos(angle3)*radius,y:center2.y+Math.sin(angle3)*radius})}return samplePoints.every(samplePoint=>isPointInShapeUnion(samplePoint,shapes))},layerMatches=(layer,layers)=>layers.some(candidateLayer=>String(candidateLayer)===String(layer)),componentToObstacle=component=>{if(!(component.do_not_place||!component.obstructs_within_bounds))return{kind:"rect",center:component.center,width:component.width,height:component.height,ccwRotation:component.rotation}},smtPadToObstacle=smtPad2=>smtPad2.shape==="circle"?{kind:"circle",center:{x:smtPad2.x,y:smtPad2.y},radius:smtPad2.radius}:smtPad2.shape==="polygon"?{kind:"polygon",points:smtPad2.points}:{kind:"rect",center:{x:smtPad2.x,y:smtPad2.y},width:smtPad2.width,height:smtPad2.height,ccwRotation:smtPad2.shape==="rotated_rect"||smtPad2.shape==="rotated_pill"?smtPad2.ccw_rotation:0},platedHoleToObstacle=platedHole2=>{if(platedHole2.shape==="circle")return{kind:"circle",center:{x:platedHole2.x,y:platedHole2.y},radius:platedHole2.outer_diameter/2};if("outer_width"in platedHole2)return{kind:"rect",center:{x:platedHole2.x,y:platedHole2.y},width:platedHole2.outer_width,height:platedHole2.outer_height,ccwRotation:platedHole2.ccw_rotation};if(platedHole2.shape==="hole_with_polygon_pad"){let rotationRadians=(platedHole2.ccw_rotation??0)*Math.PI/180,cosine=Math.cos(rotationRadians),sine=Math.sin(rotationRadians);return{kind:"polygon",points:platedHole2.pad_outline.map(point62=>({x:platedHole2.x+point62.x*cosine-point62.y*sine,y:platedHole2.y+point62.x*sine+point62.y*cosine}))}}return{kind:"rect",center:{x:platedHole2.x,y:platedHole2.y},width:platedHole2.rect_pad_width,height:platedHole2.rect_pad_height,ccwRotation:"rect_ccw_rotation"in platedHole2?platedHole2.rect_ccw_rotation??0:0}},holeToObstacle=hole=>"hole_diameter"in hole?hole.hole_shape==="circle"?{kind:"circle",center:{x:hole.x,y:hole.y},radius:hole.hole_diameter/2}:{kind:"rect",center:{x:hole.x,y:hole.y},width:hole.hole_diameter,height:hole.hole_diameter,ccwRotation:0}:{kind:"rect",center:{x:hole.x,y:hole.y},width:hole.hole_width,height:hole.hole_height,ccwRotation:hole.hole_shape==="rotated_pill"?hole.ccw_rotation:0},getDistanceToSegment=(point62,start,end)=>{let segmentX=end.x-start.x,segmentY=end.y-start.y,squaredLength6=segmentX**2+segmentY**2;if(squaredLength6===0)return Math.hypot(point62.x-start.x,point62.y-start.y);let projection2=Math.max(0,Math.min(1,((point62.x-start.x)*segmentX+(point62.y-start.y)*segmentY)/squaredLength6));return Math.hypot(point62.x-(start.x+projection2*segmentX),point62.y-(start.y+projection2*segmentY))},isPointInPolygon4=(point62,polygon2)=>{let isInside=!1;for(let currentIndex=0,previousIndex=polygon2.length-1;currentIndex<polygon2.length;previousIndex=currentIndex++){let current3=polygon2[currentIndex],previous=polygon2[previousIndex];current3.y>point62.y!=previous.y>point62.y&&point62.x<(previous.x-current3.x)*(point62.y-current3.y)/(previous.y-current3.y)+current3.x&&(isInside=!isInside)}return isInside},doesCircleIntersectObstacle=(center2,radius,obstacle)=>{if(obstacle.kind==="circle")return Math.hypot(center2.x-obstacle.center.x,center2.y-obstacle.center.y)<radius+obstacle.radius;if(obstacle.kind==="polygon")return isPointInPolygon4(center2,obstacle.points)?!0:obstacle.points.some((point62,pointIndex)=>getDistanceToSegment(center2,point62,obstacle.points[(pointIndex+1)%obstacle.points.length])<radius);let rotationRadians=-obstacle.ccwRotation*Math.PI/180,deltaX=center2.x-obstacle.center.x,deltaY=center2.y-obstacle.center.y,localX=deltaX*Math.cos(rotationRadians)-deltaY*Math.sin(rotationRadians),localY=deltaX*Math.sin(rotationRadians)+deltaY*Math.cos(rotationRadians),outsideX=Math.max(Math.abs(localX)-obstacle.width/2,0),outsideY=Math.max(Math.abs(localY)-obstacle.height/2,0);return Math.hypot(outsideX,outsideY)<radius},getStitchingObstacles=(circuitJson,layers)=>circuitJson.flatMap(element=>{if(element.type==="pcb_component"&&layerMatches(element.layer,layers)){let obstacle=componentToObstacle(element);return obstacle?[obstacle]:[]}return element.type==="pcb_smtpad"&&layerMatches(element.layer,layers)?[smtPadToObstacle(element)]:element.type==="pcb_plated_hole"&&element.layers.some(layer=>layerMatches(layer,layers))?[platedHoleToObstacle(element)]:element.type==="pcb_hole"?[holeToObstacle(element)]:[]}),doesViaIntersectStitchingObstacle=({center:center2,radius,obstacles})=>obstacles.some(obstacle=>doesCircleIntersectObstacle(center2,radius,obstacle)),resolveOptions=(options={})=>{let resolvedOptions={sourceNetIds:options.sourceNetIds?new Set(options.sourceNetIds):void 0,layers:options.layers??["top","bottom"],viaStitchPitch:options.viaStitchPitch??1,viaHoleDiameter:options.viaHoleDiameter??.3,viaOuterDiameter:options.viaOuterDiameter??.6,pourEdgeClearance:options.pourEdgeClearance??.2,obstacleClearance:options.obstacleClearance??.2,minimumViaSeparation:options.minimumViaSeparation??Math.max(options.viaOuterDiameter??.6,.8),gridOrigin:options.gridOrigin??{x:0,y:0},isTented:options.isTented??!0};for(let[optionName,optionValue]of[["viaStitchPitch",resolvedOptions.viaStitchPitch],["viaHoleDiameter",resolvedOptions.viaHoleDiameter],["viaOuterDiameter",resolvedOptions.viaOuterDiameter],["minimumViaSeparation",resolvedOptions.minimumViaSeparation]])if(!Number.isFinite(optionValue)||optionValue<=0)throw new Error(`${optionName} must be a finite number greater than zero`);if(!Number.isFinite(resolvedOptions.pourEdgeClearance)||resolvedOptions.pourEdgeClearance<0)throw new Error("pourEdgeClearance must be a finite non-negative number");if(!Number.isFinite(resolvedOptions.obstacleClearance)||resolvedOptions.obstacleClearance<0)throw new Error("obstacleClearance must be a finite non-negative number");if(!Number.isFinite(resolvedOptions.gridOrigin.x)||!Number.isFinite(resolvedOptions.gridOrigin.y))throw new Error("gridOrigin coordinates must be finite numbers");if(resolvedOptions.viaHoleDiameter>=resolvedOptions.viaOuterDiameter)throw new Error("viaHoleDiameter must be smaller than viaOuterDiameter");if(String(resolvedOptions.layers[0])===String(resolvedOptions.layers[1]))throw new Error("layers must contain two distinct PCB layers");return resolvedOptions},isBrepCopperPour=element=>element.type==="pcb_copper_pour"&&element.shape==="brep",getCopperPourPairContexts=(input2,options)=>{let sourceNetsById=new Map(input2.circuitJson.filter(element=>element.type==="source_net").map(sourceNet=>[sourceNet.source_net_id,sourceNet])),poursBySourceNetId=new Map;for(let element of input2.circuitJson){if(!isBrepCopperPour(element)||!element.source_net_id||options.sourceNetIds&&!options.sourceNetIds.has(element.source_net_id))continue;let sourceNetPours=poursBySourceNetId.get(element.source_net_id)??[];sourceNetPours.push(element),poursBySourceNetId.set(element.source_net_id,sourceNetPours)}let[fromLayer,toLayer]=options.layers,contexts=[];for(let[sourceNetId,sourceNetPours]of poursBySourceNetId){let fromLayerPours=sourceNetPours.filter(copperPour=>String(copperPour.layer)===String(fromLayer)),toLayerPours=sourceNetPours.filter(copperPour=>String(copperPour.layer)===String(toLayer));fromLayerPours.length===0||toLayerPours.length===0||contexts.push({sourceNetId,sourceNet:sourceNetsById.get(sourceNetId),fromLayerPours,toLayerPours})}return contexts},getPcbTraceViaRadius=(routePoint3,fallbackRadius)=>(routePoint3.outer_diameter??fallbackRadius*2)/2,isTooCloseToOccupiedVia=({center:center2,radius,occupiedVias,minimumViaSeparation})=>occupiedVias.some(occupiedVia=>Math.hypot(center2.x-occupiedVia.center.x,center2.y-occupiedVia.center.y)<Math.max(minimumViaSeparation,radius+occupiedVia.radius)),getGridCoordinates=({minimum,maximum,origin,pitch})=>{let coordinates=[],firstGridIndex=Math.ceil((minimum-origin)/pitch),lastGridIndex=Math.floor((maximum-origin)/pitch);for(let gridIndex=firstGridIndex;gridIndex<=lastGridIndex;gridIndex++)coordinates.push(origin+gridIndex*pitch);return coordinates},ViaStitchSolver=class extends BaseSolver{constructor(input2){super();__publicField(this,"input");__publicField(this,"options");__publicField(this,"copperPourPairContexts");__publicField(this,"pcbVias",[]);__publicField(this,"occupiedVias",[]);__publicField(this,"existingPcbViaIds",new Set);__publicField(this,"stitchingObstacles");__publicField(this,"nextCopperPourPairIndex",0);__publicField(this,"nextViaId",0);this.input=input2,this.options=resolveOptions(input2.options),this.copperPourPairContexts=getCopperPourPairContexts(input2,this.options),this.stitchingObstacles=getStitchingObstacles(input2.circuitJson,this.options.layers);let fallbackViaRadius=this.options.viaOuterDiameter/2;for(let element of input2.circuitJson)if(element.type==="pcb_via"){let pcbVia=element;this.existingPcbViaIds.add(pcbVia.pcb_via_id),this.occupiedVias.push({center:{x:pcbVia.x,y:pcbVia.y},radius:pcbVia.outer_diameter/2})}else if(element.type==="pcb_trace")for(let routePoint3 of element.route)routePoint3.route_type==="via"&&this.occupiedVias.push({center:{x:routePoint3.x,y:routePoint3.y},radius:getPcbTraceViaRadius(routePoint3,fallbackViaRadius)})}_step(){let copperPourPairContext=this.copperPourPairContexts[this.nextCopperPourPairIndex];if(!copperPourPairContext){this.solved=!0,this.progress=1;return}this.processCopperPourPair(copperPourPairContext),this.nextCopperPourPairIndex+=1,this.progress=this.copperPourPairContexts.length===0?1:this.nextCopperPourPairIndex/this.copperPourPairContexts.length,this.solved=this.nextCopperPourPairIndex===this.copperPourPairContexts.length}processCopperPourPair(context){let[fromLayer,toLayer]=this.options.layers,fromLayerShapes=context.fromLayerPours.map(copperPour=>copperPour.brep_shape),toLayerShapes=context.toLayerPours.map(copperPour=>copperPour.brep_shape),fromBounds=getShapeUnionBounds(fromLayerShapes),toBounds=getShapeUnionBounds(toLayerShapes);if(!fromBounds||!toBounds)return;let overlapBounds={minX:Math.max(fromBounds.minX,toBounds.minX),maxX:Math.min(fromBounds.maxX,toBounds.maxX),minY:Math.max(fromBounds.minY,toBounds.minY),maxY:Math.min(fromBounds.maxY,toBounds.maxY)};if(overlapBounds.minX>overlapBounds.maxX||overlapBounds.minY>overlapBounds.maxY)return;let viaRadius=this.options.viaOuterDiameter/2,requiredCopperRadius=viaRadius+this.options.pourEdgeClearance,requiredObstacleRadius=viaRadius+this.options.obstacleClearance,xCoordinates=getGridCoordinates({minimum:overlapBounds.minX+requiredCopperRadius,maximum:overlapBounds.maxX-requiredCopperRadius,origin:this.options.gridOrigin.x,pitch:this.options.viaStitchPitch}),yCoordinates=getGridCoordinates({minimum:overlapBounds.minY+requiredCopperRadius,maximum:overlapBounds.maxY-requiredCopperRadius,origin:this.options.gridOrigin.y,pitch:this.options.viaStitchPitch});for(let y23 of yCoordinates)for(let x23 of xCoordinates){let center2={x:x23,y:y23};if(isTooCloseToOccupiedVia({center:center2,radius:viaRadius,occupiedVias:this.occupiedVias,minimumViaSeparation:this.options.minimumViaSeparation})||doesViaIntersectStitchingObstacle({center:center2,radius:requiredObstacleRadius,obstacles:this.stitchingObstacles})||!isViaAnnulusInsideShapeUnion({center:center2,radius:requiredCopperRadius,shapes:fromLayerShapes})||!isViaAnnulusInsideShapeUnion({center:center2,radius:requiredCopperRadius,shapes:toLayerShapes}))continue;let pcbViaId=`via_stitch_via_${this.nextViaId++}`;for(;this.existingPcbViaIds.has(pcbViaId);)pcbViaId=`via_stitch_via_${this.nextViaId++}`;let referencePour=context.fromLayerPours[0],pcbVia={type:"pcb_via",pcb_via_id:pcbViaId,x:x23,y:y23,hole_diameter:this.options.viaHoleDiameter,outer_diameter:this.options.viaOuterDiameter,layers:[fromLayer,toLayer],from_layer:fromLayer,to_layer:toLayer,source_net_id:context.sourceNetId,subcircuit_id:referencePour.subcircuit_id,pcb_group_id:referencePour.pcb_group_id,subcircuit_connectivity_map_key:context.sourceNet?.subcircuit_connectivity_map_key,is_tented:this.options.isTented};this.pcbVias.push(pcbVia),this.existingPcbViaIds.add(pcbViaId),this.occupiedVias.push({center:center2,radius:viaRadius})}}getOutput(){return{processedCopperPourPairCount:this.copperPourPairContexts.length,pcbVias:this.pcbVias}}},SOLVERS={DogboneFanoutSolver,BusLanesSolver,BusLanesPipelineSolver,PackSolver2,LayoutPipelineSolver,AutoroutingPipelineSolver:cie,AssignableAutoroutingPipeline2:K$,AssignableAutoroutingPipeline3:lU,AutoroutingPipeline1_OriginalUnravel:P$,AutoroutingPipelineSolver3_HgPortPointPathing:kU,AutoroutingPipelineSolver4:f2,AutoroutingPipelineSolver5:w22,AutoroutingPipelineSolver7_MultiGraph:ote,AutoroutingPipelineSolver8:ate,AutoroutingPipelineSolver9_PreloadedTraceGraph:cie,AutoroutingPipelineSolver9_Networked:Oie,AutoroutingPipelineSolver11_Simplification:hce,CopperPourPipelineSolver,CreateFdmEnclosureSolver,FanoutSolver,ImplicitCopperPourPipelineSolver,SchematicTracePipelineSolver,ViaStitchSolver},AUTOROUTER_CACHE_KEY_PREFIX="capacity-autorouter:",cacheProvidersByLocalCacheEngine=new WeakMap;function isPromiseLike(value){return typeof value=="object"&&value!==null&&"then"in value&&typeof value.then=="function"}function isAsyncFunction(fn3){return fn3.constructor.name==="AsyncFunction"}var LocalCacheEngineCacheProvider=class{constructor(localCacheEngine3){__publicField(this,"localCacheEngine");__publicField(this,"isSyncCache");__publicField(this,"cacheHits",0);__publicField(this,"cacheMisses",0);__publicField(this,"cacheHitsByPrefix",{});__publicField(this,"cacheMissesByPrefix",{});__publicField(this,"knownCacheKeys",new Set);this.localCacheEngine=localCacheEngine3,this.isSyncCache=!isAsyncFunction(localCacheEngine3.getItem)&&!isAsyncFunction(localCacheEngine3.setItem)}getCachedSolutionSync(cacheKey){if(this.isSyncCache){this.knownCacheKeys.add(cacheKey);try{let cachedItem=this.localCacheEngine.getItem(this.getLocalCacheEngineKey(cacheKey));if(isPromiseLike(cachedItem)){this.isSyncCache=!1,Promise.resolve(cachedItem).catch(()=>{}),this.recordCacheMiss(cacheKey);return}return this.parseCachedItem(cacheKey,cachedItem)}catch{this.recordCacheMiss(cacheKey);return}}}async getCachedSolution(cacheKey){this.knownCacheKeys.add(cacheKey);try{let cachedItem=await this.localCacheEngine.getItem(this.getLocalCacheEngineKey(cacheKey));return this.parseCachedItem(cacheKey,cachedItem)}catch{this.recordCacheMiss(cacheKey);return}}setCachedSolutionSync(cacheKey,cachedSolution){if(this.isSyncCache){this.knownCacheKeys.add(cacheKey);try{let serializedSolution=JSON.stringify(cachedSolution);if(serializedSolution===void 0)return;let writeResult=this.localCacheEngine.setItem(this.getLocalCacheEngineKey(cacheKey),serializedSolution);isPromiseLike(writeResult)&&(this.isSyncCache=!1,Promise.resolve(writeResult).catch(()=>{}))}catch{}}}async setCachedSolution(cacheKey,cachedSolution){this.knownCacheKeys.add(cacheKey);try{let serializedSolution=JSON.stringify(cachedSolution);if(serializedSolution===void 0)return;await this.localCacheEngine.setItem(this.getLocalCacheEngineKey(cacheKey),serializedSolution)}catch{}}getAllCacheKeys(){return[...this.knownCacheKeys]}clearCache(){for(let cacheKey of this.knownCacheKeys){let localCacheEngineKey=this.getLocalCacheEngineKey(cacheKey);try{let clearResult=this.localCacheEngine.removeItem?this.localCacheEngine.removeItem(localCacheEngineKey):this.localCacheEngine.setItem(localCacheEngineKey,"null");isPromiseLike(clearResult)&&Promise.resolve(clearResult).catch(()=>{})}catch{}}this.knownCacheKeys.clear(),this.cacheHits=0,this.cacheMisses=0,this.cacheHitsByPrefix={},this.cacheMissesByPrefix={}}getLocalCacheEngineKey(cacheKey){return`${AUTOROUTER_CACHE_KEY_PREFIX}${cacheKey}`}parseCachedItem(cacheKey,cachedItem){if(cachedItem===null){this.recordCacheMiss(cacheKey);return}try{let cachedSolution=JSON.parse(cachedItem);if(cachedSolution===null){this.recordCacheMiss(cacheKey);return}return this.recordCacheHit(cacheKey),cachedSolution}catch{this.recordCacheMiss(cacheKey);return}}recordCacheHit(cacheKey){this.cacheHits++;let prefix=cacheKey.split(":")[0];this.cacheHitsByPrefix[prefix]=(this.cacheHitsByPrefix[prefix]??0)+1}recordCacheMiss(cacheKey){this.cacheMisses++;let prefix=cacheKey.split(":")[0];this.cacheMissesByPrefix[prefix]=(this.cacheMissesByPrefix[prefix]??0)+1}};function getCacheProviderForLocalCacheEngine(localCacheEngine3){let cacheProvider=cacheProvidersByLocalCacheEngine.get(localCacheEngine3);return cacheProvider||(cacheProvider=new LocalCacheEngineCacheProvider(localCacheEngine3),cacheProvidersByLocalCacheEngine.set(localCacheEngine3,cacheProvider)),cacheProvider}var getAutorouterSolverName=({useAssignableSolver=!1,useAutoJumperSolver=!1,autorouterVersion:autorouterVersion22,useLaserPrefabSolver=!1,useTraceSimplificationSolver=!1,platformConfig:platformConfig3,effort})=>{let pipeline9SolverName=platformConfig3?.useCloudAutorouter&&(effort===void 0||effort===1)?"AutoroutingPipelineSolver9_Networked":"AutoroutingPipelineSolver9_PreloadedTraceGraph";return useTraceSimplificationSolver?"AutoroutingPipelineSolver11_Simplification":autorouterVersion22==="beta_pipeline1"?"AutoroutingPipeline1_OriginalUnravel":autorouterVersion22==="beta_pipeline3"?"AutoroutingPipelineSolver3_HgPortPointPathing":autorouterVersion22==="beta_pipeline4"?"AutoroutingPipelineSolver4":autorouterVersion22==="beta_pipeline5"?"AutoroutingPipelineSolver5":autorouterVersion22==="beta_pipeline7"?"AutoroutingPipelineSolver7_MultiGraph":autorouterVersion22==="beta_pipeline9"||autorouterVersion22==="latest"?pipeline9SolverName:useLaserPrefabSolver?"AutoroutingPipelineSolver8":useAutoJumperSolver?"AssignableAutoroutingPipeline3":useAssignableSolver?"AssignableAutoroutingPipeline2":pipeline9SolverName};function getCapacityAutorouterCacheProvider(platformConfig3){return platformConfig3?.localCacheEngine?getCacheProviderForLocalCacheEngine(platformConfig3.localCacheEngine):null}var 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:autorouterVersion22,useLaserPrefabSolver=!1,useTraceSimplificationSolver=!1,effort,platformConfig:platformConfig3,onSolverStarted}=options,solverName=getAutorouterSolverName({useAssignableSolver,useAutoJumperSolver,autorouterVersion:autorouterVersion22,useLaserPrefabSolver,useTraceSimplificationSolver,platformConfig:platformConfig3,effort}),solverCacheProvider=getCapacityAutorouterCacheProvider(platformConfig3),solverOptions={capacityDepth,targetMinCapacity,cacheProvider:solverCacheProvider,effort};this.solver=solverName==="AutoroutingPipelineSolver9_Networked"?new Oie(input2,{...solverOptions,effort:1}):new SOLVERS[solverName](input2,solverOptions),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:solverCacheProvider,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.getOutputSimplifiedPcbTraces()}),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:"getCurrentPhase"in this.solver?this.solver.getCurrentPhase():this.solver.activeSubSolver?.getSolverName()??this.solver.getSolverName(),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.getOutputSimplifiedPcbTraces()}getConnectedOffboardObstacles(){return"getConnectedOffboardObstacles"in this.solver?this.solver.getConnectedOffboardObstacles():{}}},createTscircuitAutorouterStrategy=(name,strategyOptions)=>({name,cacheable:!0,getSolverName:options=>getAutorouterSolverName({...options,...strategyOptions}),create:({simpleRouteJson,commonAutorouterOptions,onSolverStarted})=>new TscircuitAutorouter(simpleRouteJson,{...commonAutorouterOptions,...strategyOptions,onSolverStarted:details=>onSolverStarted?.({...details,solverConstructorArgs:[details.solverParams]})})}),defaultLocalAutorouterStrategy=createTscircuitAutorouterStrategy("tscircuit",{}),simplificationLocalAutorouterStrategy=createTscircuitAutorouterStrategy("tscircuit_simplify",{useTraceSimplificationSolver:!0}),createFanoutAutorouterStrategy=mode=>({name:mode,cacheable:!1,followUpAutorouter:"default",getSolverName:()=>"FanoutSolver",create:({simpleRouteJson,busFanoutDirections,fanoutBounds,fanoutRoutingLayers,allowBlindAndBuriedVias,componentNamesById,onSolverStarted})=>new FanoutAutorouter(simpleRouteJson,{mode,busFanoutDirections,fanoutBounds,fanoutRoutingLayers,allowBlindAndBuriedVias,componentNamesById,onSolverStarted})}),localAutorouterStrategies=new Map([["single_layer_fanout",createFanoutAutorouterStrategy("single_layer_fanout")],["fanout",createFanoutAutorouterStrategy("fanout")],["dogbone",{name:"dogbone",preserveOutputTraces:!0,followUpAutorouter:"default",cacheable:!1,getSolverName:()=>"DogboneFanoutSolver",create:({simpleRouteJson,fanoutRoutingLayers,onSolverStarted,onSolverEnded})=>new DogboneAutorouter({input:simpleRouteJson,fanoutRoutingLayers},{onSolverStarted,onSolverEnded})}],["bus_lanes",{name:"bus_lanes",preserveOutputTraces:!0,cacheable:!1,getSolverName:()=>"BusLanesPipelineSolver",create:({simpleRouteJson,onSolverStarted})=>(onSolverStarted?.({solverName:"BusLanesPipelineSolver",solverParams:simpleRouteJson,solverConstructorArgs:[simpleRouteJson]}),new BusLanesAutorouter(simpleRouteJson))}],["simplify",simplificationLocalAutorouterStrategy]]),getLocalAutorouterStrategy=preset=>localAutorouterStrategies.get(preset??"")??defaultLocalAutorouterStrategy,getLocalAutoroutingStages=(autorouterConfig3,platformConfig3)=>{let strategy=getLocalAutorouterStrategy(autorouterConfig3.preset),stages=[{autorouterConfig:autorouterConfig3,strategy,usesPreviousStageOutput:!1}];if(strategy.followUpAutorouter&&!autorouterConfig3.algorithmFn){let followUpAutorouterConfig=getPresetAutoroutingConfig(strategy.followUpAutorouter,platformConfig3);stages.push({autorouterConfig:followUpAutorouterConfig,strategy:getLocalAutorouterStrategy(followUpAutorouterConfig.preset),usesPreviousStageOutput:!0})}return stages},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=su3(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component3)continue;let source_component=su3(circuitJson).source_component.get(pcb_component3.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p23=>p23.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_component23=su3(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component23||!schematic_component23.source_component_id)continue;let source_component=su3(circuitJson).source_component.get(schematic_component23.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p23=>p23.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(su3(circuitJson).pcb_trace_hint.get(edit_event.pcb_trace_hint_id))circuitJson=circuitJson.map(e211=>e211.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e211,route:edit_event.route}:e211);else{let pcbPort=su3(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e211=>!(e211.type==="pcb_trace_hint"&&e211.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(e211=>e211.type==="pcb_component"&&e211.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(e211=>e211.pcb_component_id!==editEvent.pcb_component_id?e211:transformPCBElement(e211,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e211=>e211.type==="schematic_component"&&e211.schematic_component_id===editEvent.schematic_component_id?{...e211,center:editEvent.new_center}:e211):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},getBusSourceTraceIdOrThrow=({bus,busSourceTraces,traceNameOrPortSelector})=>{let sourceTracesWithMatchingName=busSourceTraces.filter(sourceTrace2=>sourceTrace2.name===traceNameOrPortSelector),selectedSourcePortId=(sourceTracesWithMatchingName.length===0?bus.getSubcircuit().selectOne(traceNameOrPortSelector,{type:"port"}):null)?.source_port_id??void 0,matchingSourceTraces=selectedSourcePortId?busSourceTraces.filter(sourceTrace2=>sourceTrace2.connected_source_port_ids.includes(selectedSourcePortId)):sourceTracesWithMatchingName;if(matchingSourceTraces.length===0)throw new Error(`Could not find source trace for trace name or port selector "${traceNameOrPortSelector}" in bus "${bus.name}"`);if(matchingSourceTraces.length>1)throw new Error(`Trace name or port selector "${traceNameOrPortSelector}" matches multiple source traces in bus "${bus.name}"`);return matchingSourceTraces[0].source_trace_id},getSourceBusTargetLength=({bus,busSourceTraces})=>{let targetLength=bus._parsedProps.targetLength;return targetLength===void 0||typeof targetLength=="number"?targetLength:{reference:targetLength.reference,offset:targetLength.offset,source_trace_ids:targetLength.of?.map(traceNameOrPortSelector=>getBusSourceTraceIdOrThrow({bus,busSourceTraces,traceNameOrPortSelector}))}},Bus=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_bus_id")}get config(){return{componentName:"Bus",zodProps:busProps}}doInitialSourceAddConnectivityMapKey(){let{db:db22}=this.root,subcircuit_id=this.getSubcircuit().subcircuit_id,busSourceTraces=db22.source_trace.list().filter(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id),source_trace_ids=this._parsedProps.connections.map(traceNameOrPortSelector=>getBusSourceTraceIdOrThrow({bus:this,busSourceTraces,traceNameOrPortSelector}));if(new Set(source_trace_ids).size!==source_trace_ids.length)throw new Error(`Bus "${this.name}" resolves multiple entries to one trace`);let sourceBus=db22.source_bus.insert({name:this._parsedProps.name,source_trace_ids,max_length_skew:this._parsedProps.maxLengthSkew,target_length:getSourceBusTargetLength({bus:this,busSourceTraces}),length_tolerance:this._parsedProps.lengthTolerance,subcircuit_id});this.source_bus_id=sourceBus.source_bus_id}},resolvePointToPointConnection=(differentialPair,connectionSelector)=>{let{db:db22}=differentialPair.root,subcircuit=differentialPair.getSubcircuit(),subcircuitSourceTraces=db22.source_trace.list().filter(sourceTrace=>sourceTrace.subcircuit_id===subcircuit.subcircuit_id),matchingSourceTraces=subcircuitSourceTraces.filter(sourceTrace=>sourceTrace.name===connectionSelector),connectivityMapKeys=new Set;if(matchingSourceTraces.length>0)for(let sourceTrace of matchingSourceTraces)sourceTrace.subcircuit_connectivity_map_key&&connectivityMapKeys.add(sourceTrace.subcircuit_connectivity_map_key);else{let selectedPort=subcircuit.selectOne(connectionSelector,{type:"port"});if(selectedPort?.source_port_id){let sourcePort=db22.source_port.get(selectedPort.source_port_id);sourcePort?.subcircuit_connectivity_map_key&&connectivityMapKeys.add(sourcePort.subcircuit_connectivity_map_key)}}if(connectivityMapKeys.size!==1)return;let connectivityMapKey=connectivityMapKeys.values().next().value;if(!connectivityMapKey)return;let sourcePorts=db22.source_port.list().filter(sourcePort=>sourcePort.subcircuit_connectivity_map_key===connectivityMapKey);return{sourceTraceIds:subcircuitSourceTraces.filter(trace=>trace.subcircuit_connectivity_map_key===connectivityMapKey).map(trace=>trace.source_trace_id),sourcePorts,sourceTraceName:matchingSourceTraces.length>0?connectionSelector:void 0}},formatTerminalPinList=terminalPinSelectors=>terminalPinSelectors.length<=1?terminalPinSelectors.join(""):terminalPinSelectors.length===2?`${terminalPinSelectors[0]} and ${terminalPinSelectors[1]}`:`${terminalPinSelectors.slice(0,-1).join(", ")}, and ${terminalPinSelectors.at(-1)}`,getTerminalPinSelector=(sourcePort,sourceComponentsById)=>{let sourceComponent;if(sourcePort.source_component_id&&(sourceComponent=sourceComponentsById.get(sourcePort.source_component_id)),!sourceComponent?.name)return sourcePort.source_port_id;let portName=sourcePort.most_frequently_referenced_by_name??sourcePort.name;return`.${sourceComponent.name} > .${portName}`},getPointToPointWarningMessage=({differentialPairName,connectionPolarity,connectionSelector,sourceTraceName,terminalPinSelectors})=>{let terminalList=formatTerminalPinList(terminalPinSelectors),terminalListDescription=terminalList?`: ${terminalList}`:"";return sourceTraceName&&terminalPinSelectors.length>2?`Differential pair "${differentialPairName}" ${connectionPolarity}Connection uses the ambiguous trace name "${sourceTraceName}": its connection has more than 2 terminal pins${terminalListDescription}.`:`Differential pair "${differentialPairName}" ${connectionPolarity}Connection="${connectionSelector}" is not point-to-point: expected exactly 2 terminal pins, found ${terminalPinSelectors.length}${terminalListDescription}.`},DifferentialPair_doInitialSourceDesignRuleChecks=differentialPair=>{let{db:db22}=differentialPair.root,sourceComponentsById=new Map;for(let sourceComponent of db22.source_component.list())sourceComponentsById.set(sourceComponent.source_component_id,{name:sourceComponent.name});let memberTraceIds=[],resolvedPolarityCount=0;for(let connectionPolarity of["positive","negative"]){let connectionSelector=differentialPair._parsedProps.negativeConnection;connectionPolarity==="positive"&&(connectionSelector=differentialPair._parsedProps.positiveConnection);let resolvedConnection=resolvePointToPointConnection(differentialPair,connectionSelector);if(!resolvedConnection)continue;resolvedPolarityCount++,memberTraceIds.push(...resolvedConnection.sourceTraceIds);let terminalSourcePorts=resolvedConnection.sourcePorts;if(terminalSourcePorts.length===2)continue;let warningSourceComponentId="",firstTerminalSourcePort=terminalSourcePorts[0];if(firstTerminalSourcePort){if(!firstTerminalSourcePort.source_component_id)throw new Error(`Differential pair "${differentialPair.name}" resolved terminal port "${firstTerminalSourcePort.source_port_id}" without a source_component_id`);warningSourceComponentId=firstTerminalSourcePort.source_component_id}let terminalPinSelectors=terminalSourcePorts.map(sourcePort=>getTerminalPinSelector(sourcePort,sourceComponentsById)).sort((selectorA,selectorB)=>selectorA.localeCompare(selectorB));db22.source_property_ignored_warning.insert({source_component_id:warningSourceComponentId,property_name:`${connectionPolarity}Connection`,error_type:"source_property_ignored_warning",message:getPointToPointWarningMessage({differentialPairName:differentialPair.name,connectionPolarity,connectionSelector,sourceTraceName:resolvedConnection.sourceTraceName,terminalPinSelectors}),subcircuit_id:differentialPair.getSubcircuit().subcircuit_id??void 0})}resolvedPolarityCount===2&&memberTraceIds.length>0&&db22.source_bus.insert({name:differentialPair.name,source_trace_ids:[...new Set(memberTraceIds)],max_length_skew:differentialPair._parsedProps.maxLengthSkew,subcircuit_id:differentialPair.getSubcircuit().subcircuit_id??void 0})},DifferentialPair=class extends PrimitiveComponent2{get config(){return{componentName:"DifferentialPair",zodProps:differentialPairProps}}doInitialSourceDesignRuleChecks(){DifferentialPair_doInitialSourceDesignRuleChecks(this)}},expandSrjBoundsToIncludeConnectionPoints=input2=>{let expandedBounds={...input2.bounds};for(let connection of input2.connections)if(!connection.isOffBoard)for(let point62 of connection.pointsToConnect)expandedBounds.minX=Math.min(expandedBounds.minX,point62.x),expandedBounds.maxX=Math.max(expandedBounds.maxX,point62.x),expandedBounds.minY=Math.min(expandedBounds.minY,point62.y),expandedBounds.maxY=Math.max(expandedBounds.maxY,point62.y);return expandedBounds},getSrjOutlineForRoutingBounds=({bounds,outline},routingBounds2)=>{if(outline)return outline;if(!(bounds.minX===routingBounds2.minX&&bounds.maxX===routingBounds2.maxX&&bounds.minY===routingBounds2.minY&&bounds.maxY===routingBounds2.maxY))return new Box(bounds.minX,bounds.minY,bounds.maxX,bounds.maxY).toPoints().map(({x:x23,y:y23})=>({x:x23,y:y23}))},getBusTargetLengthBounds=bus=>{if(!bus.source_bus_id)return{};let{db:db22}=bus.root,sourceBus=db22.source_bus.get(bus.source_bus_id);if(sourceBus.target_length===void 0)return{};let tolerance=sourceBus.length_tolerance;if(tolerance===void 0)throw new Error(`Bus "${bus.name}" requires lengthTolerance with targetLength`);let targetLength;if(typeof sourceBus.target_length=="number")targetLength=sourceBus.target_length;else{let reference3=sourceBus.target_length,manhattanLengths=(reference3.source_trace_ids??sourceBus.source_trace_ids).map(sourceTraceId=>{let sourceTrace=db22.source_trace.get(sourceTraceId),pcbPorts=db22.pcb_port.list().filter(port=>sourceTrace.connected_source_port_ids.includes(port.source_port_id));if(pcbPorts.length!==2)throw new Error(`Bus "${bus.name}" targetLength requires two placed endpoint pads per reference trace`);return Math.abs(pcbPorts[0].x-pcbPorts[1].x)+Math.abs(pcbPorts[0].y-pcbPorts[1].y)});targetLength=Math.max(...manhattanLengths)+(reference3.offset??0)}return{minLength:Math.max(0,targetLength-tolerance),maxLength:targetLength+tolerance}},getBusSrjConnectionNamesOrThrow=({srjConnections,bus,sourceTraceId,traceNameOrPortSelector,busSourceTraces})=>{let directSrjConnections=srjConnections.filter(srjConnection=>srjConnection.source_trace_id===sourceTraceId);if(directSrjConnections.length>0)return directSrjConnections.map(srjConnection=>srjConnection.name);let sourceTrace=busSourceTraces.find(trace=>trace.source_trace_id===sourceTraceId),connectedSourceTraces=busSourceTraces.filter(trace=>trace.source_trace_id===sourceTraceId||sourceTrace.subcircuit_connectivity_map_key!==void 0&&trace.subcircuit_connectivity_map_key===sourceTrace.subcircuit_connectivity_map_key),connectedSourceNetIds=new Set(connectedSourceTraces.flatMap(trace=>trace.connected_source_net_ids??[])),matchingSrjConnections=srjConnections.filter(srjConnection=>connectedSourceNetIds.has(srjConnection.name));if(matchingSrjConnections.length===0)throw new Error(`Could not find an SRJ connection for "${traceNameOrPortSelector}" in bus "${bus.name}"`);return matchingSrjConnections.map(srjConnection=>srjConnection.name)},normalizeNetName=netNameOrSelector=>netNameOrSelector.trim().replace(/^net\./,"").replace(/^\./,""),getPlaneTerminatedSourceTraceLayers=({fanoutPourNetMap,sourceNets,sourceTraces,subcircuitId})=>{let traceLayers=new Map;if(!fanoutPourNetMap)return traceLayers;let planeLayerBySourceNetId=new Map;for(let[layer,netOrNets]of Object.entries(fanoutPourNetMap)){let netNames=Array.isArray(netOrNets)?netOrNets:[netOrNets];for(let netNameOrSelector of netNames){let netName=normalizeNetName(netNameOrSelector);for(let sourceNet of sourceNets){if(sourceNet.name!==netName)continue;let previousLayer=planeLayerBySourceNetId.get(sourceNet.source_net_id);if(previousLayer&&previousLayer!==layer)throw new Error(`Fanout plane net "${netName}" maps to multiple layers ("${previousLayer}" and "${layer}"); use fanoutPourNetMap to select one`);planeLayerBySourceNetId.set(sourceNet.source_net_id,layer)}}}for(let sourceTrace of sourceTraces){if(subcircuitId&&sourceTrace.subcircuit_id!==subcircuitId||sourceTrace.connected_source_port_ids.length!==1)continue;let mappedLayers=new Set((sourceTrace.connected_source_net_ids??[]).map(sourceNetId=>planeLayerBySourceNetId.get(sourceNetId)).filter(layer2=>layer2!==void 0));if(mappedLayers.size>1)throw new Error(`Source trace "${sourceTrace.name??sourceTrace.source_trace_id}" connects to fanout planes on multiple layers`);let layer=mappedLayers.values().next().value;layer&&traceLayers.set(sourceTrace.source_trace_id,layer)}return traceLayers},getBusesForSimpleRouteJson=({srjConnections,buses,sourceTraces,subcircuitId,planeTerminatedSourceTraceLayers,preservedSourceTraceIds})=>{let declaredSrjBuses=[];for(let bus of buses){let busSubcircuitId=bus.getSubcircuit().subcircuit_id;if(subcircuitId&&busSubcircuitId!==subcircuitId)continue;let busSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.subcircuit_id===busSubcircuitId),connectionNames=bus._parsedProps.connections.flatMap(traceNameOrPortSelector=>{let sourceTraceId=getBusSourceTraceIdOrThrow({bus,busSourceTraces,traceNameOrPortSelector});return preservedSourceTraceIds?.has(sourceTraceId)?[]:getBusSrjConnectionNamesOrThrow({srjConnections,bus,sourceTraceId,traceNameOrPortSelector,busSourceTraces})});if(new Set(connectionNames).size!==connectionNames.length)throw new Error(`Bus "${bus.name}" resolves multiple entries to one trace`);connectionNames.length!==0&&declaredSrjBuses.push({busId:bus.name,name:bus.name,connectionNames,...getBusTargetLengthBounds(bus),...bus._parsedProps.maxLengthSkew!==void 0?{maxLengthSkew:bus._parsedProps.maxLengthSkew}:{},...bus._parsedProps.pcbTraceWidth!==void 0?{traceWidth:bus._parsedProps.pcbTraceWidth}:{},...bus._parsedProps.pcbAllowedLayers!==void 0?{allowedLayers:bus._parsedProps.pcbAllowedLayers}:{},...bus._parsedProps.preferredLayer!==void 0?{preferredLayer:bus._parsedProps.preferredLayer}:{},...bus._parsedProps.preferredLayers!==void 0?{preferredLayers:bus._parsedProps.preferredLayers}:{}})}let planeSrjBuses=[];for(let[sourceTraceId,layer]of planeTerminatedSourceTraceLayers??[]){let sourceTrace=sourceTraces.find(candidate=>candidate.source_trace_id===sourceTraceId),srjConnection=srjConnections.find(connection=>connection.source_trace_id===sourceTraceId);if(!sourceTrace||!srjConnection)continue;let busId=sourceTrace.name??sourceTrace.source_trace_id;if([...declaredSrjBuses,...planeSrjBuses].some(bus=>bus.busId===busId))throw new Error(`Fanout plane trace "${busId}" conflicts with an existing bus name`);planeSrjBuses.push({busId,name:busId,connectionNames:[srjConnection.name],termination:{type:"plane",layer}})}let srjBuses=[...planeSrjBuses,...declaredSrjBuses];return srjBuses.length>0?srjBuses:void 0},getDifferentialPairSourceTracesByTraceName=(differentialPairSourceTraces,traceName)=>differentialPairSourceTraces.filter(sourceTrace=>sourceTrace.name===traceName),getDifferentialPairSourceTracesByPortId=(differentialPairSourceTraces,sourcePortId)=>differentialPairSourceTraces.filter(sourceTrace=>sourceTrace.connected_source_port_ids.includes(sourcePortId)),getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow=({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector})=>{let differentialPairSubcircuit=differentialPair.getSubcircuit(),sourceTracesWithMatchingName=getDifferentialPairSourceTracesByTraceName(differentialPairSourceTraces,traceNameOrPortSelector),selectedSourcePortId=(sourceTracesWithMatchingName.length===0?differentialPairSubcircuit.selectOne(traceNameOrPortSelector,{type:"port"}):null)?.source_port_id??void 0,matchingSourceTraces=selectedSourcePortId?getDifferentialPairSourceTracesByPortId(differentialPairSourceTraces,selectedSourcePortId):sourceTracesWithMatchingName;if(matchingSourceTraces.length===0)throw new Error(`Could not find source trace for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPair.name}"`);if(matchingSourceTraces.length>1)throw new Error(`Trace name or port selector "${traceNameOrPortSelector}" matches multiple source traces for differential pair "${differentialPair.name}"`);let sourceTrace=matchingSourceTraces[0];if(!sourceTrace)throw new Error(`Expected one source trace for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPair.name}"`);let subcircuitConnectivityMapKey=sourceTrace.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)throw new Error(`Source trace "${sourceTrace.source_trace_id}" does not have a subcircuit connectivity map key for differential pair "${differentialPair.name}"`);return subcircuitConnectivityMapKey},getDifferentialPairSrjConnectionNamesByCohortOrThrow=({srjConnections,differentialPairName,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey,traceNameOrPortSelector})=>{let differentialPairSourceTraceIds=[],differentialPairSourceNetIds=new Set;for(let sourceTrace of differentialPairSourceTraces)if(sourceTrace.subcircuit_connectivity_map_key===traceSubcircuitConnectivityMapKey){differentialPairSourceTraceIds.push(sourceTrace.source_trace_id);for(let sourceNetId of sourceTrace.connected_source_net_ids??[])differentialPairSourceNetIds.add(sourceNetId)}let matchingSrjConnections=[];for(let srjConnection of srjConnections)(differentialPairSourceNetIds.has(srjConnection.name)||srjConnection.source_trace_id&&differentialPairSourceTraceIds.includes(srjConnection.source_trace_id))&&matchingSrjConnections.push(srjConnection);if(matchingSrjConnections.length===0)throw new Error(`Could not find an SRJ connection for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPairName}"`);let connectionNamesByCohort=new Map;for(let srjConnection of matchingSrjConnections){let cohort=srjConnection.routingPcbGroupId;if(connectionNamesByCohort.has(cohort)){let cohortLabel=cohort===void 0?"the global routing cohort":`routing PCB group "${cohort}"`;throw new Error(`Subcircuit connectivity map key "${traceSubcircuitConnectivityMapKey}" matches multiple SRJ connections in ${cohortLabel} for differential pair "${differentialPairName}"`)}connectionNamesByCohort.set(cohort,srjConnection.name)}return connectionNamesByCohort},getDifferentialPairCohortLabel=cohort=>cohort===void 0?"the global routing cohort":`routing PCB group "${cohort}"`,getDifferentialPairsForSimpleRouteJson=({srjConnections,differentialPairs,sourceTraces,subcircuitId})=>{let srjDifferentialPairs=[];for(let differentialPair of differentialPairs){let differentialPairSubcircuitId=differentialPair.getSubcircuit().subcircuit_id;if(subcircuitId&&differentialPairSubcircuitId!==subcircuitId)continue;let differentialPairSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.subcircuit_id===differentialPairSubcircuitId),positiveTraceNameOrPortSelector=differentialPair._parsedProps.positiveConnection,negativeTraceNameOrPortSelector=differentialPair._parsedProps.negativeConnection,positiveSubcircuitConnectivityMapKey=getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector:positiveTraceNameOrPortSelector}),negativeSubcircuitConnectivityMapKey=getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector:negativeTraceNameOrPortSelector}),positiveSrjConnectionNamesByCohort=getDifferentialPairSrjConnectionNamesByCohortOrThrow({srjConnections,differentialPairName:differentialPair.name,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey:positiveSubcircuitConnectivityMapKey,traceNameOrPortSelector:positiveTraceNameOrPortSelector}),negativeSrjConnectionNamesByCohort=getDifferentialPairSrjConnectionNamesByCohortOrThrow({srjConnections,differentialPairName:differentialPair.name,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey:negativeSubcircuitConnectivityMapKey,traceNameOrPortSelector:negativeTraceNameOrPortSelector}),lengthTolerance=differentialPair._parsedProps.maxLengthSkew??.1;for(let cohort of positiveSrjConnectionNamesByCohort.keys())if(!negativeSrjConnectionNamesByCohort.has(cohort))throw new Error(`Differential pair "${differentialPair.name}" has a positive SRJ connection in ${getDifferentialPairCohortLabel(cohort)} without a matching negative SRJ connection`);for(let cohort of negativeSrjConnectionNamesByCohort.keys())if(!positiveSrjConnectionNamesByCohort.has(cohort))throw new Error(`Differential pair "${differentialPair.name}" has a negative SRJ connection in ${getDifferentialPairCohortLabel(cohort)} without a matching positive SRJ connection`);for(let[cohort,positiveSrjConnectionName]of positiveSrjConnectionNamesByCohort){let negativeSrjConnectionName=negativeSrjConnectionNamesByCohort.get(cohort);srjDifferentialPairs.push({connectionNames:[positiveSrjConnectionName,negativeSrjConnectionName],lengthTolerance,...differentialPair._parsedProps.pcbTraceGap!==void 0?{traceGap:differentialPair._parsedProps.pcbTraceGap}:{},...differentialPair._parsedProps.maxUncoupledLength!==void 0?{maxUncoupledLength:differentialPair._parsedProps.maxUncoupledLength}:{}})}}return srjDifferentialPairs.length>0?srjDifferentialPairs:void 0},getLayerName=layer=>typeof layer=="string"?layer:layer.name,getPreservedTraceConnectionName=trace=>trace.source_trace_id??trace.connection_name??trace.pcb_trace_id,getPhysicalConnectionIdsForPreservedTrace=trace=>{let physicallyConnectedIds=new Set(trace.connectsTo??[]);for(let routePoint3 of trace.route)if(routePoint3.route_type==="wire")for(let pcbPortId of[routePoint3.start_pcb_port_id,routePoint3.end_pcb_port_id])pcbPortId&&physicallyConnectedIds.add(pcbPortId);return Array.from(physicallyConnectedIds)},getSimpleRouteForPreservedTrace=trace=>trace.route.map(routePoint3=>{if(routePoint3.route_type==="wire")return{route_type:"wire",x:routePoint3.x,y:routePoint3.y,width:routePoint3.width,layer:getLayerName(routePoint3.layer)};if(routePoint3.route_type==="via"){let preservedViaRoutePoint=routePoint3,viaDiameter=preservedViaRoutePoint.outer_diameter??preservedViaRoutePoint.via_diameter,viaHoleDiameter=preservedViaRoutePoint.hole_diameter??preservedViaRoutePoint.via_hole_diameter;return{route_type:"via",x:routePoint3.x,y:routePoint3.y,from_layer:getLayerName(routePoint3.from_layer),to_layer:getLayerName(routePoint3.to_layer),...viaDiameter!==void 0?{via_diameter:viaDiameter}:{},...viaHoleDiameter!==void 0?{via_hole_diameter:viaHoleDiameter}:{}}}return{route_type:"through_obstacle",start:routePoint3.start,end:routePoint3.end,from_layer:getLayerName(routePoint3.start_layer),to_layer:getLayerName(routePoint3.end_layer),width:routePoint3.width}}),getPreservedRoutedSubcircuitTraces=({scopedDb,relevantSubcircuitIds})=>scopedDb.pcb_trace.list().filter(trace=>!trace.subcircuit_id||trace.pcb_component_id&&!trace.source_trace_id?!1:relevantSubcircuitIds===null||relevantSubcircuitIds.has(trace.subcircuit_id)).map(trace=>{let preservedTrace=trace,connectionName=getPreservedTraceConnectionName(preservedTrace);return{type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,source_trace_id:trace.source_trace_id,connection_name:connectionName,connectsTo:getPhysicalConnectionIdsForPreservedTrace(preservedTrace),route:getSimpleRouteForPreservedTrace(preservedTrace)}}).filter(trace=>trace.route.length>=2),COPPER_POUR_RECT_HEIGHT=.5,dedupeStrings2=values2=>Array.from(new Set(values2.filter(value=>!!value))),getLayerName2=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:group2,board})=>outline&&outline.length>=3?outline:group2?.outline&&group2.outline.length>=3?group2.outline:board?.outline&&board.outline.length>=3?board.outline:null,getCopperPourBoundsRect=({group:group2,board})=>group2?.width&&group2.height?{center:group2.center,width:group2.width,height:group2.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:group2})=>{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=getLayerName2(props.layer),connectedTo=getCopperPourConnectedTo(net,connMap);if(connectedTo.length===0)continue;let boundary=getCopperPourBoundary({outline:props.outline,group:group2,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:group2,board});boundsRect&&obstacles.push(createCopperPourObstacle({layer,connectedTo,center:boundsRect.center,width:boundsRect.width,height:boundsRect.height}))}return obstacles},getSrjConnectionPointsFromPcbTraceHints=(connectedPcbPorts,pcbTraceHints)=>{let connectedPcbPortById=new Map(connectedPcbPorts.map(pcbPort=>[pcbPort.pcb_port_id,pcbPort]));return pcbTraceHints.flatMap(pcbTraceHint=>{let pcbPort=connectedPcbPortById.get(pcbTraceHint.pcb_port_id);if(!pcbPort)return[];let layer=pcbPort.layers?.[0]??"top";return pcbTraceHint.route.map(routePoint3=>({x:routePoint3.x,y:routePoint3.y,layer}))})},getOwningPcbBoardForSubcircuit=(db22,subcircuitId)=>{let visitedSubcircuitIds=new Set,currentSubcircuitId=subcircuitId,isRequestedSubcircuit=!0;for(;currentSubcircuitId&&!visitedSubcircuitIds.has(currentSubcircuitId);){visitedSubcircuitIds.add(currentSubcircuitId);let sourceGroup=db22.source_group.getWhere({subcircuit_id:currentSubcircuitId}),sourceBoard=sourceGroup?db22.source_board.getWhere({source_group_id:sourceGroup.source_group_id}):void 0;if(sourceBoard)return{board:db22.pcb_board.getWhere({source_board_id:sourceBoard.source_board_id})??null,subcircuitIsBoard:isRequestedSubcircuit};currentSubcircuitId=sourceGroup?.parent_subcircuit_id??null,isRequestedSubcircuit=!1}return{board:null,subcircuitIsBoard:!1}},getSimpleRouteJsonFromCircuitJson=({db:db22,circuitJson,subcircuit_id,minTraceWidth,minTraceToPadEdgeClearance,minTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaHoleDiameter,minViaPadDiameter,nominalTraceWidth,subcircuitComponent,routingPcbGroupId,fanoutPourNetMap,ignoreExistingTopLevelPcbRouteState=!1})=>{if(!db22&&circuitJson&&(db22=su3(circuitJson)),!db22)throw new Error("db or circuitJson is required");let traceHints=db22.pcb_trace_hint.list(),relevantSubcircuitIds=subcircuit_id?new Set([subcircuit_id]):null;if(subcircuit_id){let descendantSubcircuitIds=getDescendantSubcircuitIds2(db22,subcircuit_id);for(let id3 of descendantSubcircuitIds)relevantSubcircuitIds.add(id3)}let allElements=circuitJson??db22.toArray(),sourceTraceById=new Map(allElements.flatMap(element=>element.type==="source_trace"?[[element.source_trace_id,element]]:[])),subcircuitElements=allElements.map(element=>{if(ignoreExistingTopLevelPcbRouteState||element.type!=="pcb_trace"||element.subcircuit_id||!element.source_trace_id)return element;let inheritedSubcircuitId=sourceTraceById.get(element.source_trace_id)?.subcircuit_id;return inheritedSubcircuitId?{...element,subcircuit_id:inheritedSubcircuitId}:element}).filter(e211=>!subcircuit_id||"subcircuit_id"in e211&&relevantSubcircuitIds.has(e211.subcircuit_id)),board=null,subcircuitIsBoard=!1;if(subcircuit_id){let owningBoard=getOwningPcbBoardForSubcircuit(db22,subcircuit_id);board=owningBoard.board,subcircuitIsBoard=owningBoard.subcircuitIsBoard&&board!==null}board||(board=db22.pcb_board.list()[0]),db22=su3(subcircuitElements);let getPortSelector=sourcePort=>{if(!sourcePort?.source_component_id)return;let sourceComponent=db22.source_component.get(sourcePort.source_component_id);if(sourceComponent?.name)return`${sourceComponent.name}.${sourcePort.name}`},pcbGroup=routingPcbGroupId?db22.pcb_group.get(routingPcbGroupId):subcircuit_id?db22.pcb_group.getWhere({subcircuit_id}):void 0,activeRoutingPcbGroupId=subcircuitComponent?.pcb_group_id;activeRoutingPcbGroupId==null&&!subcircuitIsBoard&&(activeRoutingPcbGroupId=pcbGroup?.pcb_group_id);let sharedConnMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),breakoutPoints=db22.pcb_breakout_point.list().filter(bp22=>!subcircuit_id||relevantSubcircuitIds?.has(bp22.subcircuit_id)),breakoutPointIsInActiveRoutingGroup=breakoutPoint=>breakoutPoint.subcircuit_id===subcircuit_id&&(activeRoutingPcbGroupId?breakoutPoint.pcb_group_id===activeRoutingPcbGroupId:!subcircuitIsBoard),preservedRoutedSubcircuitTraces=getPreservedRoutedSubcircuitTraces({scopedDb:db22,relevantSubcircuitIds}),preservedSrjTraceByPcbTraceId=new Map(preservedRoutedSubcircuitTraces.map(trace=>[trace.pcb_trace_id,trace])),isPcbViaRepresentedByPreservedSrjTrace=via=>{if(!via.pcb_trace_id)return!1;let preservedTrace=preservedSrjTraceByPcbTraceId.get(via.pcb_trace_id);if(!preservedTrace)return!1;let pcbViaLayerNames=new Set(via.layers);return preservedTrace.route.some(routePoint3=>{if(routePoint3.route_type!=="via"||routePoint3.x!==via.x||routePoint3.y!==via.y)return!1;let routeViaLayerNames=new Set(getViaSpanLayers({fromLayer:routePoint3.from_layer,toLayer:routePoint3.to_layer,layerCount:board?.num_layers??2}));return routeViaLayerNames.size===pcbViaLayerNames.size&&[...routeViaLayerNames].every(layer=>pcbViaLayerNames.has(layer))})},obstacles=getObstaclesFromCircuitJson2([...board?[board]:[],...db22.source_component.list(),...db22.source_port.list(),...db22.pcb_port.list(),...db22.pcb_component.list(),...db22.pcb_smtpad.list(),...db22.pcb_plated_hole.list(),...db22.pcb_hole.list(),...db22.pcb_trace.list().filter(trace=>!trace.source_trace_id),...db22.pcb_via.list().filter(via=>(!ignoreExistingTopLevelPcbRouteState||!!via.subcircuit_id)&&!isPcbViaRepresentedByPreservedSrjTrace(via)),...db22.pcb_keepout.list(),...db22.pcb_cutout.list()].filter(e211=>e211.type==="pcb_board"||!subcircuit_id||relevantSubcircuitIds?.has(e211.subcircuit_id)),sharedConnMap);obstacles.push(...getUnbrokenCopperPourObstacles({connMap:sharedConnMap,subcircuitComponent,board,group:pcbGroup}));for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id3=>sharedConnMap.getIdsConnectedToNet(id3));obstacle.connectedTo=[...new Set([...obstacle.connectedTo,...additionalIds])]}let internalConnections=db22.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 db22.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db22.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole2=db22.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole2&&pcbElementIdToSourcePortId.set(platedHole2.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(o23=>[{x:o23.center.x-o23.width/2,y:o23.center.y-o23.height/2},{x:o23.center.x+o23.width/2,y:o23.center.y+o23.height/2}]).concat(board?.outline??[]),boardBounds=board&&!board.outline?{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}:void 0,bounds,useGroupBoundsAsSrjBounds=!!(pcbGroup?.width&&pcbGroup.height&&subcircuit_id&&!subcircuitIsBoard);if(useGroupBoundsAsSrjBounds?bounds={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}:boardBounds?bounds=boardBounds:bounds={minX:Math.min(...allPoints.map(p23=>p23.x))-1,maxX:Math.max(...allPoints.map(p23=>p23.x))+1,minY:Math.min(...allPoints.map(p23=>p23.y))-1,maxY:Math.max(...allPoints.map(p23=>p23.y))+1},pcbGroup?.width&&pcbGroup.height&&!useGroupBoundsAsSrjBounds){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 sourceTraceIdsAlreadyPreservedAsSrjTraces=new Set(db22.pcb_trace.list().filter(t48=>t48.source_trace_id?subcircuit_id?t48.subcircuit_id===subcircuit_id:t48.subcircuit_id?db22.source_trace.get(t48.source_trace_id)?.subcircuit_id===t48.subcircuit_id:!1:!1).map(t48=>t48.source_trace_id).filter(id3=>!!id3)),sourcePortIdToBreakoutPoint=new Map;for(let bp22 of breakoutPoints){let spId=bp22.source_port_id;spId&&sourcePortIdToBreakoutPoint.set(spId,bp22)}let getPcbPortRoutePoint=pcbPort=>{let layer=pcbPort.layers?.[0]??"top",breakoutPoint=sourcePortIdToBreakoutPoint.get(pcbPort.source_port_id),portSelector=getPortSelector(db22.source_port.get(pcbPort.source_port_id));return breakoutPoint&&!breakoutPointIsInActiveRoutingGroup(breakoutPoint)?{x:breakoutPoint.x,y:breakoutPoint.y,layer:breakoutPoint.layer??layer,pointId:breakoutPoint.pcb_breakout_point_id,port_selector:portSelector}:{x:pcbPort.x,y:pcbPort.y,layer,pointId:pcbPort.pcb_port_id,pcb_port_id:pcbPort.pcb_port_id,port_selector:portSelector}},sourceTraces=db22.source_trace.list(),planeTerminatedSourceTraceLayers=getPlaneTerminatedSourceTraceLayers({fanoutPourNetMap,sourceNets:db22.source_net.list(),sourceTraces,subcircuitId:subcircuit_id}),directTraceConnections=sourceTraces.filter(trace=>!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(trace.source_trace_id)).filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id).filter(sourceTrace=>sourceTrace.connected_source_net_ids.length===0||planeTerminatedSourceTraceLayers.has(sourceTrace.source_trace_id)).map(trace=>{let connectedPcbPorts=trace.connected_source_port_ids.map(sourcePortId=>db22.pcb_port.getWhere({source_port_id:sourcePortId})).filter(pcbPort=>pcbPort!==null),isPlaneTerminatedSourceTrace=planeTerminatedSourceTraceLayers.has(trace.source_trace_id);if(connectedPcbPorts.length<2&&!(isPlaneTerminatedSourceTrace&&connectedPcbPorts.length===1))return null;for(let connectedPort of connectedPcbPorts)if(connectedPort.x===void 0||connectedPort.y===void 0)return console.error(`(source_port_id: ${connectedPort.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let srjTraceHintConnectionPoints=getSrjConnectionPointsFromPcbTraceHints(connectedPcbPorts,traceHints),connectedPortRoutePoints=connectedPcbPorts.map(port=>getPcbPortRoutePoint(port)),[firstConnectedPortRoutePoint,...remainingPortRoutePoints]=connectedPortRoutePoints;return{name:trace.source_trace_id??sharedConnMap.getNetConnectedToId(trace.source_trace_id)??"",source_trace_id:trace.source_trace_id,nominalTraceWidth:trace.min_trace_thickness,width:trace.min_trace_thickness,pointsToConnect:[firstConnectedPortRoutePoint,...srjTraceHintConnectionPoints,...remainingPortRoutePoints]}}).filter(c23=>c23!==null),source_nets=db22.source_net.list().filter(e211=>!subcircuit_id||e211.subcircuit_id===subcircuit_id),connectionsFromNets=[],connectionFromNetId=new Map,handledNetConnectivityKeys=new Set,sourceNetIds=new Set(source_nets.map(net=>net.source_net_id)),currentSubcircuitSourceTraces=db22.source_trace.list().filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id),exposedBridgeSourceTraceIds=new Set((subcircuitComponent?.selectAll("trace")??[]).flatMap(trace=>{let candidate=trace;return candidate._exposesSubcircuitConnection&&candidate.source_trace_id?[candidate.source_trace_id]:[]})),exposedDescendantSourceNetIds=new Set;for(let trace of currentSubcircuitSourceTraces)if(exposedBridgeSourceTraceIds.has(trace.source_trace_id))for(let sourceNetId of trace.connected_source_net_ids??[])sourceNetIds.has(sourceNetId)||exposedDescendantSourceNetIds.add(sourceNetId);let routedDescendantSourceTraceIds=new Set(subcircuit_id?db22.pcb_trace.list().filter(trace=>trace.subcircuit_id&&trace.subcircuit_id!==subcircuit_id&&relevantSubcircuitIds?.has(trace.subcircuit_id)).map(trace=>trace.source_trace_id).filter(id3=>!!id3):[]),sourceTracesEligibleForNetConnections=db22.source_trace.list().filter(trace=>!planeTerminatedSourceTraceLayers.has(trace.source_trace_id)).filter(trace=>!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(trace.source_trace_id)||subcircuit_id!=null&&trace.subcircuit_id===subcircuit_id).filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id||(trace.connected_source_net_ids?.some(id3=>sourceNetIds.has(id3))??!1)||(trace.connected_source_net_ids?.some(id3=>exposedDescendantSourceNetIds.has(id3))??!1)&&!routedDescendantSourceTraceIds.has(trace.source_trace_id)),getSourceConnectivityKey=id3=>id3?sharedConnMap.getNetConnectedToId(id3)??id3:null;for(let net of source_nets){let netConnectivityKey=getSourceConnectivityKey(net.source_net_id);if(!netConnectivityKey||handledNetConnectivityKeys.has(netConnectivityKey))continue;handledNetConnectivityKeys.add(netConnectivityKey);let connectedSourceNets=source_nets.filter(sourceNet=>getSourceConnectivityKey(sourceNet.source_net_id)===netConnectivityKey),connectedSourceNetIds=connectedSourceNets.map(sourceNet=>sourceNet.source_net_id),connectedSourceTraces=sourceTracesEligibleForNetConnections.filter(st22=>[st22.source_trace_id,...st22.connected_source_net_ids??[]].some(id3=>getSourceConnectivityKey(id3)===netConnectivityKey)),nominalTraceWidthForConnection;for(let sourceNet of connectedSourceNets)sourceNet.trace_width!==void 0&&(nominalTraceWidthForConnection=Math.max(nominalTraceWidthForConnection??0,sourceNet.trace_width));for(let sourceTrace of connectedSourceTraces)sourceTrace.min_trace_thickness!==void 0&&(nominalTraceWidthForConnection=Math.max(nominalTraceWidthForConnection??0,sourceTrace.min_trace_thickness));let pointsToConnect=[],addedPointIds=new Set,connectedPcbPorts=[];for(let st22 of connectedSourceTraces){let pcb_ports=db22.pcb_port.list().filter(p23=>st22.connected_source_port_ids.includes(p23.source_port_id));for(let p23 of pcb_ports){let routePoint3=getPcbPortRoutePoint(p23);addedPointIds.has(routePoint3.pointId)||(addedPointIds.add(routePoint3.pointId),connectedPcbPorts.push(p23),pointsToConnect.push(routePoint3))}}pointsToConnect.push(...getSrjConnectionPointsFromPcbTraceHints(connectedPcbPorts,traceHints));let connection={name:net.source_net_id??sharedConnMap.getNetConnectedToId(net.source_net_id),nominalTraceWidth:nominalTraceWidthForConnection,width:nominalTraceWidthForConnection,pointsToConnect};if(pointsToConnect.length!==0){connectionsFromNets.push(connection);for(let sourceNetId of connectedSourceNetIds)connectionFromNetId.set(sourceNetId,connection)}}let connectionsFromBreakoutPoints=[];for(let bp22 of breakoutPoints){let bpSourcePortId=bp22.source_port_id,pt22={x:bp22.x,y:bp22.y,layer:bp22.layer??"top",pointId:bp22.pcb_breakout_point_id};if(bpSourcePortId){let pcb_port3=db22.pcb_port.getWhere({source_port_id:bpSourcePortId});if(!pcb_port3)continue;let portPt={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,port_selector:getPortSelector(db22.source_port.get(pcb_port3.source_port_id))},isInActiveRoutingGroup=breakoutPointIsInActiveRoutingGroup(bp22),isInTransparentChildRoutingGroup=!isInActiveRoutingGroup&&bp22.subcircuit_id===subcircuit_id;if(isInActiveRoutingGroup||isInTransparentChildRoutingGroup){connectionsFromBreakoutPoints.push({name:isInTransparentChildRoutingGroup?`breakout:${bp22.pcb_breakout_point_id}`:bpSourcePortId,source_trace_id:bp22.source_trace_id,routingPcbGroupId:isInTransparentChildRoutingGroup?bp22.pcb_group_id:void 0,pointsToConnect:[portPt,pt22]});continue}bp22.source_trace_id||connectionsFromBreakoutPoints.push({name:bpSourcePortId,pointsToConnect:[portPt,pt22]});continue}if(bp22.source_net_id){let conn=connectionFromNetId.get(bp22.source_net_id);conn?conn.pointsToConnect.push(pt22):connectionsFromBreakoutPoints.push({name:bp22.source_net_id,pointsToConnect:[pt22]})}}let routableConnectionsFromNets=connectionsFromNets.filter(connection=>connection.pointsToConnect.length>=2),allConns=[...directTraceConnections,...routableConnectionsFromNets,...connectionsFromBreakoutPoints],defaultTraceWidth=minTraceWidth??board?.min_trace_width??.1;for(let conn of allConns)conn.nominalTraceWidth??(conn.nominalTraceWidth=nominalTraceWidth??defaultTraceWidth),conn.width??(conn.width=nominalTraceWidth??defaultTraceWidth);bounds=expandSrjBoundsToIncludeConnectionPoints({bounds,connections:allConns});let differentialPairs=subcircuitComponent?.selectAll("differentialpair")??[],buses=subcircuitComponent?.selectAll("bus")??[],srjDifferentialPairs=getDifferentialPairsForSimpleRouteJson({srjConnections:allConns,differentialPairs,sourceTraces:db22.source_trace.list(),subcircuitId:subcircuit_id}),srjBuses=getBusesForSimpleRouteJson({srjConnections:allConns,buses,sourceTraces:db22.source_trace.list(),subcircuitId:subcircuit_id,planeTerminatedSourceTraceLayers,preservedSourceTraceIds:sourceTraceIdsAlreadyPreservedAsSrjTraces});if(subcircuit_id){let pointIdToConn=new Map;for(let conn of allConns)for(let pt22 of conn.pointsToConnect)pt22.pointId&&pointIdToConn.set(pt22.pointId,conn);let existingTraces=db22.pcb_trace.list().filter(t48=>relevantSubcircuitIds?.has(t48.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,resolvedMinTraceToHoleEdgeClearance=minTraceToHoleEdgeClearance??board?.min_trace_to_hole_edge_clearance,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,differentialPairs:srjDifferentialPairs,...srjBuses?{buses:srjBuses}:{},traces:preservedRoutedSubcircuitTraces.length>0?preservedRoutedSubcircuitTraces:void 0,layerCount:board?.num_layers??2,allowBlindAndBuriedVias:board?.allow_blind_and_buried_vias??!1,minTraceWidth:Math.min(defaultTraceWidth,...allConns.map(c23=>c23.width)),minViaDiameter:resolvedMinViaPadDiameter,minViaHoleDiameter:resolvedMinViaHoleDiameter,minViaPadDiameter:resolvedMinViaPadDiameter,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,minTraceToPadEdgeClearance:resolvedMinTraceToPadEdgeClearance,minTraceToHoleEdgeClearance:resolvedMinTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance:resolvedMinViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance:resolvedMinViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance:resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance:resolvedMinPadEdgeToPadEdgeClearance,minBoardEdgeClearance:resolvedMinBoardEdgeClearance,nominalTraceWidth,outline:getSrjOutlineForRoutingBounds({bounds:boardBounds??bounds,outline:board?.outline?.map(point62=>({...point62}))},bounds)},connMap:sharedConnMap}},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 i23=0;i23<unqInputPinLabels.length;i23++)for(let label of unqInputPinLabels[i23])if(/^\d+$/.test(label)){desiredNumbers[i23]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i23=0;i23<desiredNumbers.length;i23++){let desiredNumber=desiredNumbers[i23];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i23].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i23])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i23].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i23=0;i23<result.length;i23++)result[i23][0]?.includes("_alt")&&(highestPinNumber++,result[i23].unshift(`pin${highestPinNumber}`));for(let i23=0;i23<result.length;i23++)result[i23].length===0&&(highestPinNumber++,result[i23].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 i23=0;i23<unqInputPinLabels.length;i23++){let inputLabels=unqInputPinLabels[i23];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i23].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i23].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:db22}=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(offset2=>({...applyToPoint2(globalTransform,offset2),via:offset2.via,to_layer:offset2.to_layer,trace_width:offset2.trace_width}))}doInitialPcbTraceHintRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this;db22.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}};function getTitleAnchorAndPosition({anchor:anchor3,x:x23,y:y23,width,height,isInside}){switch(anchor3){case"top_left":return{x:x23,y:y23+height,textAnchor:isInside?"top_left":"bottom_left"};case"top_center":return{x:x23+width/2,y:y23+height,textAnchor:isInside?"top_center":"bottom_center"};case"top_right":return{x:x23+width,y:y23+height,textAnchor:isInside?"top_right":"bottom_right"};case"center_left":return{x:x23,y:y23+height/2,textAnchor:isInside?"center_left":"center_right"};case"center":return{x:x23+width/2,y:y23+height/2,textAnchor:"center"};case"center_right":return{x:x23+width,y:y23+height/2,textAnchor:isInside?"center_right":"center_left"};case"bottom_left":return{x:x23,y:y23,textAnchor:isInside?"bottom_left":"top_left"};case"bottom_center":return{x:x23+width/2,y:y23,textAnchor:isInside?"bottom_center":"top_center"};case"bottom_right":return{x:x23+width,y:y23,textAnchor:isInside?"bottom_right":"top_right"};default:return{x:x23+width/2,y:y23+height,textAnchor:"center"}}}var getSchematicBoxPinLabels=pinLabels=>pinLabels?Object.entries(getNumericPinLabels(pinLabels)).map(([pinKey,pinLabel])=>{let pinNumber=getPinNumberFromPinLabelsKey(pinKey);if(pinNumber===null)throw new Error(`Invalid schematicbox pinLabels key "${pinKey}". Expected pin<number>.`);let pinAliases=typeof pinLabel=="string"?[pinLabel]:[...pinLabel];return{pinNumber,displayPinLabel:pinAliases[0]??pinKey,pinAliases}}):[],getSchematicBoxPinStyleFromReferencedChip=({referencedChip,schematicBoxPins})=>{let referencedChipPinStyle=getNumericSchPinStyle(referencedChip._parsedProps.schPinStyle,referencedChip._parsedProps.pinLabels);if(!referencedChipPinStyle)return;let schematicBoxPinStyle={};for(let{pinNumber,referencedSourcePort}of schematicBoxPins){if(referencedSourcePort.pin_number===void 0)continue;let pinStyle=referencedChipPinStyle[`pin${referencedSourcePort.pin_number}`];pinStyle&&(schematicBoxPinStyle[`pin${pinNumber}`]=pinStyle)}return Object.keys(schematicBoxPinStyle).length>0?schematicBoxPinStyle:void 0},mergeSchematicBoxPinStyles=({inheritedPinStyle,overridePinStyle})=>{if(!inheritedPinStyle&&!overridePinStyle)return;let mergedPinStyle={...inheritedPinStyle};for(let[pinKey,pinStyle]of Object.entries(overridePinStyle??{}))mergedPinStyle[pinKey]={...mergedPinStyle[pinKey],...pinStyle};return Object.keys(mergedPinStyle).length>0?mergedPinStyle:void 0},SchematicBox_doInitialSchematicComponentRender=schematicBox=>{if(schematicBox.root?.schematicDisabled)return;let{db:db22}=schematicBox.root,props=schematicBox._parsedProps;if(!props.chipRef)return;let referencedChip=schematicBox.getSubcircuit().selectOne(props.chipRef);if(!referencedChip?.source_component_id)throw new Error(`Could not resolve chipRef "${props.chipRef}" for ${schematicBox.getString()}`);let schematicBoxPinLabels=getSchematicBoxPinLabels(props.pinLabels),pinLabelsByPinKey=Object.fromEntries(schematicBoxPinLabels.map(({pinNumber,displayPinLabel})=>[`pin${pinNumber}`,displayPinLabel])),sourcePorts=db22.source_port.list({source_component_id:referencedChip.source_component_id}),schematicBoxPins=schematicBoxPinLabels.map(schematicBoxPin=>{let referencedSourcePort=sourcePorts.find(sourcePort=>schematicBoxPin.pinAliases.some(pinAlias=>sourcePort.name===pinAlias||sourcePort.port_hints?.includes(pinAlias)));if(!referencedSourcePort)throw new Error(`Could not find pin "${schematicBoxPin.displayPinLabel}" on chipRef "${props.chipRef}"`);return{...schematicBoxPin,referencedSourcePort}}),inheritedPinStyle=getSchematicBoxPinStyleFromReferencedChip({referencedChip,schematicBoxPins}),schematicBoxPinStyle=mergeSchematicBoxPinStyles({inheritedPinStyle,overridePinStyle:getNumericSchPinStyle(props.schPinStyle,props.pinLabels)}),dimensions4=getAllDimensionsForSchematicBox({schWidth:props.width,schHeight:props.height,schPinSpacing:.2,pinCount:schematicBoxPinLabels.length,schPortArrangement:props.schPinArrangement,numericSchPinStyle:getNumericSchPinStyle(schematicBoxPinStyle),pinLabels:pinLabelsByPinKey}),center2=schematicBox._getGlobalSchematicPositionBeforeLayout(),size3=dimensions4.getSize(),schematicSheetId=schematicBox._resolveSchematicSheetId(),portLabels=Object.fromEntries(schematicBoxPinLabels.map(({pinNumber,displayPinLabel})=>[String(pinNumber),displayPinLabel])),schematicComponent=db22.schematic_component.insert({center:center2,size:size3,source_component_id:referencedChip.source_component_id,is_box_with_pins:!0,port_arrangement:underscorifyPortArrangement(props.schPinArrangement),port_labels:portLabels,pin_spacing:.2,pin_styles:underscorifyPinStyles(schematicBoxPinStyle),schematic_sheet_id:schematicSheetId});schematicBox.schematic_component_id=schematicComponent.schematic_component_id;for(let{pinNumber,displayPinLabel,referencedSourcePort}of schematicBoxPins){let portPosition=dimensions4.getPortPositionByPinNumber(pinNumber);if(!portPosition)throw new Error(`Could not determine schematic position for ${schematicBox.getString()} pin${pinNumber}`);let facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[portPosition.side];db22.schematic_port.insert({schematic_component_id:schematicComponent.schematic_component_id,center:{x:center2.x+portPosition.x,y:center2.y+portPosition.y},source_port_id:referencedSourcePort.source_port_id,facing_direction:facingDirection,distance_from_component_edge:.4,side_of_component:portPosition.side,pin_number:pinNumber,true_ccw_index:portPosition.trueIndex,display_pin_label:displayPinLabel,is_connected:!1,schematic_sheet_id:schematicSheetId})}let sectionName=props.name??props.chipRef;db22.schematic_text.insert({text:sectionName,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,schematic_sheet_id:schematicSheetId});let referencedSourceComponent=db22.source_component.get(referencedChip.source_component_id);db22.schematic_text.insert({text:referencedSourceComponent?.manufacturer_part_number??"",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,schematic_sheet_id:schematicSheetId})},SchematicBox=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:schematicBoxProps,shouldRenderAsSchematicBox:!0}}doInitialSchematicComponentRender(){SchematicBox_doInitialSchematicComponentRender(this)}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db22}=this.root,{_parsedProps:props}=this;if(props.chipRef)return;let 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,x23,y23,centerX,centerY;if(hasOverlay){let portsWithPosition=props.overlay.map(selector2=>({selector:selector2,port:this.getSubcircuit().selectOne(selector2,{type:"port"})})).filter(({port})=>port!=null).map(({port})=>({position:port._getGlobalSchematicPositionAfterLayout()}));if(portsWithPosition.length===0)return;let xs3=portsWithPosition.map(p23=>p23.position.x),ys3=portsWithPosition.map(p23=>p23.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,x23=left+(props.schX??0),y23=top+(props.schY??0),centerX=x23+width/2,centerY=y23+height/2}else if(hasFixedSize){width=props.width,height=props.height;let center2=this._getGlobalSchematicPositionBeforeLayout();centerX=center2.x,centerY=center2.y,x23=centerX-width/2,y23=centerY-height/2}else return;if(db22.schematic_box.insert({height,width,x:x23,y:y23,is_dashed:props.strokeStyle==="dashed",schematic_sheet_id:this._resolveSchematicSheetId()}),props.title){let isInside=props.titleInside,TITLE_PADDING=.1,anchor3=props.titleAlignment,anchorPos=getTitleAnchorAndPosition({anchor:anchor3,x:x23,y:y23,width,height,isInside}),titleOffsetY,titleOffsetX,textAnchor=anchorPos.textAnchor;isInside?(titleOffsetY=anchor3.includes("top")?-TITLE_PADDING:anchor3.includes("bottom")?TITLE_PADDING:0,titleOffsetX=anchor3.includes("left")?TITLE_PADDING:anchor3.includes("right")?-TITLE_PADDING:0):(titleOffsetY=anchor3.includes("top")?TITLE_PADDING:anchor3.includes("bottom")?-TITLE_PADDING:0,titleOffsetX=anchor3.includes("center_left")?-TITLE_PADDING:anchor3.includes("center_right")?TITLE_PADDING:0);let titleX=anchorPos.x+titleOffsetX,titleY=anchorPos.y+titleOffsetY;db22.schematic_text.insert({anchor:textAnchor,text:props.title,font_size:props.titleFontSize??.18,color:props.titleColor??"#000000",position:{x:titleX,y:titleY},rotation:0,schematic_sheet_id:this._resolveSchematicSheetId()})}}},Group_doInitialAssignSchematicSheetToConnectedComponents=group2=>{if(!group2.isSubcircuit||group2.root?.schematicDisabled)return;let{db:db22}=group2.root,schematicSheetIdsBySubcircuitConnectivityMapKey=new Map,schematicBoxReferencedSourceComponentIds=new Set,schematicBoxes=group2.getDescendants().filter(component=>component instanceof SchematicBox&&component.getSubcircuit()===group2);for(let schematicBox of schematicBoxes){let{chipRef,pinLabels}=schematicBox._parsedProps,schematicSheetId=schematicBox._resolveSchematicSheetId();if(!chipRef||!schematicSheetId)continue;let referencedComponent=schematicBox.getSubcircuit().selectOne(chipRef);if(!(referencedComponent instanceof NormalComponent)||!referencedComponent.source_component_id)continue;schematicBoxReferencedSourceComponentIds.add(referencedComponent.source_component_id);let referencedSourcePorts=db22.source_port.list({source_component_id:referencedComponent.source_component_id});for(let{pinAliases}of getSchematicBoxPinLabels(pinLabels)){let subcircuitConnectivityMapKey=referencedSourcePorts.find(sourcePort=>pinAliases.some(pinAlias=>sourcePort.name===pinAlias||sourcePort.port_hints?.includes(pinAlias)))?.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)continue;let schematicSheetIds=schematicSheetIdsBySubcircuitConnectivityMapKey.get(subcircuitConnectivityMapKey)??new Set;schematicSheetIds.add(schematicSheetId),schematicSheetIdsBySubcircuitConnectivityMapKey.set(subcircuitConnectivityMapKey,schematicSheetIds)}}let normalComponents=group2.getDescendants().filter(component=>component instanceof NormalComponent&&component.getSubcircuit()===group2);for(let normalComponent of normalComponents){if(!normalComponent.source_component_id||schematicBoxReferencedSourceComponentIds.has(normalComponent.source_component_id)||normalComponent._resolveSchematicSheetId())continue;let connectedSchematicSheetIds=new Set,sourcePorts=db22.source_port.list({source_component_id:normalComponent.source_component_id});for(let sourcePort of sourcePorts){let subcircuitConnectivityMapKey=sourcePort.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)continue;let schematicSheetIds=schematicSheetIdsBySubcircuitConnectivityMapKey.get(subcircuitConnectivityMapKey);if(schematicSheetIds)for(let schematicSheetId of schematicSheetIds)connectedSchematicSheetIds.add(schematicSheetId)}if(connectedSchematicSheetIds.size!==1)continue;let[inferredSchematicSheetId]=connectedSchematicSheetIds;inferredSchematicSheetId&&(normalComponent.schematic_sheet_id=inferredSchematicSheetId)}},SUPPORTED_COMPONENT_FIELDS=new Set(["x","y","minx","maxx","miny","maxy","width","height"]);function Group_doInitialPcbCalcPlacementResolution(group2){if(group2.root?.pcbDisabled||!group2.isSubcircuit)return;let{db:db22}=group2.root,normalComponentNameMap=group2.getNormalComponentNameMap?.()??new Map,allNormalComponents=collectNormalComponentsInSubcircuit(group2);if(!allNormalComponents.some(shouldResolvePlacementInCalcPhase))return;let 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(([,degree2])=>degree2===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=db22.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(group2){let components=[],walk=node2=>{node2._isNormalComponent&&components.push(node2);for(let child of node2.children)child.isSubcircuit||walk(child)};for(let child of group2.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,x23=pcbComponent.center.x,y23=pcbComponent.center.y;setSubcircuitPcbComponentCalcVariables({vars,componentName:component.name,position:{x:x23,y:y23},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:db22}=component.root,padElements=[...db22.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db22.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})];for(let pad2 of padElements){let aliases4=new Set;for(let hint of pad2.port_hints??[])typeof hint=="string"&&hint.length>0&&aliases4.add(hint);let pcbPortId=pad2.pcb_port_id;if(pcbPortId){let pcbPort=db22.pcb_port.get(pcbPortId),sourcePort=pcbPort?.source_port_id?db22.source_port.get(pcbPort.source_port_id):null;sourcePort?.name&&aliases4.add(sourcePort.name),sourcePort?.pin_number!=null&&aliases4.add(`pin${sourcePort.pin_number}`)}for(let alias of aliases4){let referencePath=`${component.name}.${alias}`;refsToElements.has(referencePath)||refsToElements.set(referencePath,[]),refsToElements.get(referencePath).push(pad2)}}return refsToElements}function Group_doInitialPcbComponentAnchorAlignment(group2){if(group2.root?.pcbDisabled||!group2.pcb_group_id)return;let pcbPositionAnchor=group2._parsedProps?.pcbPositionAnchor;if(!pcbPositionAnchor)return;let targetPosition=group2._getGlobalPcbPositionBeforeLayout(),{pcbX,pcbY}=group2._parsedProps;if(pcbX===void 0&&pcbY===void 0)return;let{db:db22}=group2.root,pcbGroup=db22.pcb_group.get(group2.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)&&(group2._repositionOnPcb(newCenter),db22.pcb_group.update(group2.pcb_group_id,{center:newCenter})),db22.pcb_group.update(group2.pcb_group_id,{anchor_position:targetPosition,anchor_alignment:pcbPositionAnchor,display_offset_x:pcbX,display_offset_y:pcbY})}var Group_doInitialPcbLayoutFlex=group2=>{let{db:db22}=group2.root,{_parsedProps:props}=group2,pcbChildren=group2.children.filter(c23=>c23.pcb_component_id||c23.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,direction3=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:direction3,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction3,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?direction3==="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=group2._getGlobalPcbPositionBeforeLayout(),offset2={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+offset2.x,y:child.position.y+child.size.height/2+offset2.y});db22.pcb_group.update(group2.pcb_group_id,{width:bounds.width,height:bounds.height,center:groupCenter})},MIN_GAP=1;function Group_doInitialPcbLayoutGrid(group2){let{db:db22}=group2.root,props=group2._parsedProps,pcbChildren=getPcbChildren(group2);if(pcbChildren.length===0)return;let childDimensions=calculateChildDimensions({db:db22,pcbChildren}),gridConfig=parseGridConfiguration(props),gridLayout=createGridLayout({props,pcbChildren,childDimensions,gridConfig}),cssGrid=createCssGrid({pcbChildren,childDimensions,gridLayout,gridConfig}),{itemCoordinates}=cssGrid.layout();positionChildren({db:db22,group:group2,pcbChildren,itemCoordinates,gridLayout}),updateGroupDimensions({db:db22,group:group2,props,gridLayout})}function getPcbChildren(group2){return group2.children.filter(child=>child.pcb_component_id||child.pcb_group_id)}function calculateChildDimensions(params){let{db:db22,pcbChildren}=params,maxWidth=0,maxHeight=0;for(let child of pcbChildren){let width=0,height=0;if(child.pcb_group_id){let pcbGroup=db22.pcb_group.get(child.pcb_group_id);width=pcbGroup?.width??0,height=pcbGroup?.height??0}else if(child.pcb_component_id){let pcbComp=db22.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,index2)=>({key:child.getString()||`child-${index2}`,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:db22,group:group2,pcbChildren,itemCoordinates,gridLayout}=params,groupCenter=group2._getGlobalPcbPositionBeforeLayout(),allCircuitJson=db22.toArray();for(let i23=0;i23<pcbChildren.length;i23++){let child=pcbChildren[i23],childKey=child.getString()||`child-${i23}`,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:db22,group:group2,props,gridLayout}=params;if(group2.pcb_group_id){let groupCenter=group2._getGlobalPcbPositionBeforeLayout();db22.pcb_group.update(group2.pcb_group_id,{width:props.width??gridLayout.containerWidth,height:props.height??gridLayout.containerHeight,center:groupCenter})}}var solvePackSolverWithTimeout=(solver,timeoutMs,getCurrentTime=()=>performance.now())=>{if(timeoutMs===void 0||!Number.isFinite(timeoutMs)||timeoutMs<=0)return solver.solve(),{elapsedMs:0,timedOut:!1};let startedAt=getCurrentTime(),elapsedMs=0;for(;!solver.solved&&!solver.failed&&(solver.step(),!(solver.solved||solver.failed));)if(elapsedMs=getCurrentTime()-startedAt,elapsedMs>=timeoutMs)return{elapsedMs,timedOut:!0};return{elapsedMs,timedOut:!1}},applyComponentConstraintClusters=(group2,packInput)=>{let constraints=group2.children.filter(c23=>c23.componentName==="Constraint"&&c23._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x23=>(parent[x23]!==x23&&(parent[x23]=find2(parent[x23])),parent[x23]),union2=(a22,b22)=>{let ra3=find2(a22),rb22=find2(b22);ra3!==rb22&&(parent[rb22]=ra3)},makeSet=x23=>{x23 in parent||(parent[x23]=x23)},getIdFromSelector=sel2=>{let name=sel2.startsWith(".")?sel2.slice(1):sel2;return group2.children.find(c23=>c23.name===name)?.pcb_component_id??void 0};for(let constraint of constraints){let props=constraint._parsedProps;if("left"in props&&"right"in props){let a22=getIdFromSelector(props.left),b22=getIdFromSelector(props.right);a22&&b22&&(makeSet(a22),makeSet(b22),union2(a22,b22))}else if("top"in props&&"bottom"in props){let a22=getIdFromSelector(props.top),b22=getIdFromSelector(props.bottom);a22&&b22&&(makeSet(a22),makeSet(b22),union2(a22,b22))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s23=>getIdFromSelector(s23)).filter(s23=>!!s23);for(let id3 of ids)makeSet(id3);for(let i23=1;i23<ids.length;i23++)union2(ids[0],ids[i23])}}for(let id3 of Object.keys(parent)){let rootId=find2(id3);clusterByRoot.has(rootId)||clusterByRoot.set(rootId,{componentIds:[],constraints:[]}),clusterByRoot.get(rootId).componentIds.push(id3)}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(c23=>[c23.componentId,c23]));for(let[rootId,info]of clusterByRoot.entries()){if(info.componentIds.length<=1)continue;let solver=new Solver,kVars={},getVar=(id3,axis)=>{let key=`${id3}_${axis}`;return kVars[key]||(kVars[key]=new Variable(key)),kVars[key]},anchor3=info.componentIds[0];solver.addConstraint(new Constraint(getVar(anchor3,"x"),Operator.Eq,0,Strength.required)),solver.addConstraint(new Constraint(getVar(anchor3,"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(s23=>getIdFromSelector(s23)).filter(s23=>!!s23);if(ids.length>1){let base=getVar(ids[0],"x");for(let i23=1;i23<ids.length;i23++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i23],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s23=>getIdFromSelector(s23)).filter(s23=>!!s23);if(ids.length>1){let base=getVar(ids[0],"y");for(let i23=1;i23<ids.length;i23++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i23],"y"),[-1,base]),Operator.Eq,0,Strength.required))}}}solver.updateVariables();let positions={};for(let id3 of info.componentIds)positions[id3]={x:getVar(id3,"x").value(),y:getVar(id3,"y").value()};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let id3 of info.componentIds){let comp=packCompById[id3],pos=positions[id3];if(comp)for(let pad2 of comp.pads){let ax22=pos.x+pad2.offset.x,ay22=pos.y+pad2.offset.y;minX=Math.min(minX,ax22-pad2.size.x/2),maxX=Math.max(maxX,ax22+pad2.size.x/2),minY=Math.min(minY,ay22-pad2.size.y/2),maxY=Math.max(maxY,ay22+pad2.size.y/2)}}let clusterCenter={x:(minX+maxX)/2,y:(minY+maxY)/2},mergedPads=[],relCenters={};for(let id3 of info.componentIds){let comp=packCompById[id3],pos=positions[id3];if(comp){relCenters[id3]={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(c23=>!info.componentIds.includes(c23.componentId)),packInput.components.push({componentId:info.componentIds[0],pads:mergedPads,availableRotationDegrees:[0]}),info.relativeCenters=relCenters,clusterMap[info.componentIds[0]]=info}return clusterMap},updateCadRotation=({db:db22,pcbComponentId,rotationDegrees,layer})=>{if(rotationDegrees==null||!db22?.cad_component?.list)return;let cadComponent=db22.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)};db22.cad_component.update(cadComponent.cad_component_id,{rotation:nextRotation}),cadComponent.rotation=nextRotation},isDescendantGroup=(db22,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group2=db22.source_group.get(groupId);return!group2||!group2.parent_source_group_id?!1:isDescendantGroup(db22,group2.parent_source_group_id,ancestorId)},applyPackOutput=(group2,packOutput,clusterMap,initialPackOutput)=>{let{db:db22}=group2.root;for(let packedComponent of packOutput.components){if(packedComponent.isStatic)continue;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;db22.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=db22.pcb_component.get(memberId);if(!member)continue;let originalCenter2=member.center,transformMatrix2=compose2(group2._computePcbGlobalTransformBeforeLayout(),translate2(center2.x+rotatedRel.x,center2.y+rotatedRel.y),rotate2(angleRad),translate2(-originalCenter2.x,-originalCenter2.y)),related=db22.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===memberId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db22,pcbComponentId:memberId,rotationDegrees:rotationDegrees2,layer:member.layer})}continue}let pcbComponent=db22.pcb_component.get(componentId);if(pcbComponent){db22.pcb_component.update(componentId,{position_mode:"packed"});let currentGroupId=group2.source_group_id,componentGroupId=db22.source_component.get(pcbComponent.source_component_id)?.source_group_id;if(componentGroupId!==void 0&&!isDescendantGroup(db22,componentGroupId,currentGroupId))continue;let originalCenter2=pcbComponent.center,rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix2=compose2(group2._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees2*Math.PI/180),translate2(-originalCenter2.x,-originalCenter2.y)),related=db22.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===componentId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db22,pcbComponentId:componentId,rotationDegrees:rotationDegrees2,layer:pcbComponent.layer});continue}let pcbGroup=db22.pcb_group.list().find(g23=>g23.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=initialPackOutput.components.find(component=>component.componentId===componentId)?.center??pcbGroup.center,rotationDegrees=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix=compose2(group2._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees*Math.PI/180),translate2(-originalCenter.x,-originalCenter.y)),relatedElements=db22.toArray().filter(elm=>{if("source_group_id"in elm&&elm.source_group_id&&(elm.source_group_id===componentId||isDescendantGroup(db22,elm.source_group_id,componentId)))return!0;if("source_component_id"in elm&&elm.source_component_id){let sourceComponent=db22.source_component.get(elm.source_component_id);if(sourceComponent?.source_group_id&&(sourceComponent.source_group_id===componentId||isDescendantGroup(db22,sourceComponent.source_group_id,componentId)))return!0}if("pcb_component_id"in elm&&elm.pcb_component_id){let pcbComp=db22.pcb_component.get(elm.pcb_component_id);if(pcbComp?.source_component_id){let sourceComp=db22.source_component.get(pcbComp.source_component_id);if(sourceComp?.source_group_id&&(sourceComp.source_group_id===componentId||isDescendantGroup(db22,sourceComp.source_group_id,componentId)))return!0}}return!1});for(let elm of relatedElements)elm.type==="pcb_component"&&db22.pcb_component.update(elm.pcb_component_id,{position_mode:"packed"});transformPCBElements(relatedElements,transformMatrix),db22.pcb_group.update(pcbGroup.pcb_group_id,{center:center2})}if(group2.pcb_group_id){let groupPcbComponents=db22.pcb_component.list({pcb_group_id:group2.pcb_group_id});group2.calculatePcbGroupBounds(findBoundsAndCenter(groupPcbComponents))}},normalizeLayer=layer=>(layer??"top").toLowerCase(),getPackComponentPcbLayer=(component,db22)=>{let layers=new Set,directPcbComponent=db22.pcb_component.get(component.componentId);directPcbComponent&&layers.add(normalizeLayer(directPcbComponent.layer));for(let pad2 of component.pads){let via=db22.pcb_via.get(pad2.padId),pcbComponentId=db22.pcb_smtpad.get(pad2.padId)?.pcb_component_id??db22.pcb_plated_hole.get(pad2.padId)?.pcb_component_id??via?.pcb_component_id;if(!pcbComponentId)continue;let pcbComponent=db22.pcb_component.get(pcbComponentId);pcbComponent&&layers.add(normalizeLayer(pcbComponent.layer))}return layers.size===1?layers.values().next().value:void 0},getPackInputsByPcbLayer=(packInput,db22)=>{let componentsByLayer=new Map;for(let component of packInput.components){let layer=getPackComponentPcbLayer(component,db22);if(!layer)return[packInput];let components=componentsByLayer.get(layer)??[];components.push(component),componentsByLayer.set(layer,components)}if(componentsByLayer.size<=1)return[packInput];let layerPriority=layer=>layer==="top"?0:layer==="bottom"?1:2;return Array.from(componentsByLayer.entries()).sort(([layerA],[layerB])=>layerPriority(layerA)-layerPriority(layerB)||layerA.localeCompare(layerB)).map(([,components])=>({...packInput,components}))},DEFAULT_MIN_GAP="1mm",debug42=(0,import_debug12.default)("Group_doInitialPcbLayoutPack"),getCollisionObstacleForStaticComponent=component=>{if(component.courtyard&&component.center)return{obstacleId:component.componentId,absoluteCenter:{x:component.center.x+component.courtyard.offsetFromCenter.x,y:component.center.y+component.courtyard.offsetFromCenter.y},width:component.courtyard.width,height:component.courtyard.height};if(component.pads.length===0)return;let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let pad2 of component.pads){let absoluteCenter=pad2.absoluteCenter??(component.center?{x:component.center.x+pad2.offset.x,y:component.center.y+pad2.offset.y}:pad2.offset);minX=Math.min(minX,absoluteCenter.x-pad2.size.x/2),minY=Math.min(minY,absoluteCenter.y-pad2.size.y/2),maxX=Math.max(maxX,absoluteCenter.x+pad2.size.x/2),maxY=Math.max(maxY,absoluteCenter.y+pad2.size.y/2)}return{obstacleId:component.componentId,absoluteCenter:{x:(minX+maxX)/2,y:(minY+maxY)/2},width:maxX-minX,height:maxY-minY}},getCrossLayerPadObstacles=({components,targetLayer:targetLayer2,db:db22})=>components.flatMap(component=>component.pads.flatMap(pad2=>{let platedHole2=db22.pcb_plated_hole.get(pad2.padId),via=db22.pcb_via.get(pad2.padId);if(!(platedHole2?.layers??via?.layers)?.includes(targetLayer2))return[];let absoluteCenter=pad2.absoluteCenter??(component.center?{x:component.center.x+pad2.offset.x,y:component.center.y+pad2.offset.y}:pad2.offset);return[{obstacleId:`cross_layer_${targetLayer2}_${pad2.padId}`,absoluteCenter,width:pad2.size.x,height:pad2.size.y}]})),Group_doInitialPcbLayoutPack=group2=>{let{db:db22}=group2.root,{_parsedProps:props}=group2;group2.root?.emit("packing:start",{subcircuit_id:group2.subcircuit_id,componentDisplayName:group2.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(group2);let excludedPcbGroupIds=new Set;for(let child of group2.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=(db32,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group22=db32.source_group.get(groupId);return!group22||!group22.parent_source_group_id?!1:isDescendantGroup2(db32,group22.parent_source_group_id,ancestorId)};if(excludedPcbGroupIds.size>0)for(let element of db22.toArray()){if(element.type!=="pcb_component")continue;let sourceComponent=db22.source_component.get(element.source_component_id);if(sourceComponent?.source_group_id)for(let groupId of excludedPcbGroupIds)isDescendantGroup2(db22,sourceComponent.source_group_id,groupId)&&staticPcbComponentIds.add(element.pcb_component_id)}let filteredCircuitJson=db22.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 initialPackOutput=convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group2.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)}),packInput={...convertPackOutputToPackInput(initialPackOutput),packOrderStrategy:packOrderStrategy??"largest_to_smallest",packPlacementStrategy:packPlacementStrategy??"minimum_sum_squared_distance_to_network",minGap:gapMm,bounds},clusterMap=applyComponentConstraintClusters(group2,packInput);debug42.enabled&&(group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${group2.name}`,content:JSON.stringify(db22.toArray())}),group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${group2.name}`,content:packInput}));let packInputs=getPackInputsByPcbLayer(packInput,db22),packOutput={...packInput,components:[]},packingFailed=!1,reportPackingError=solverErrorMessage=>{let message=`Unable to pack all PCB components within the layout bounds: ${solverErrorMessage}`;db22.pcb_packing_error.insert({error_type:"pcb_packing_error",message,pcb_group_id:group2.pcb_group_id??void 0,subcircuit_id:group2.subcircuit_id??void 0}),group2.root?.emit("packing:error",{subcircuit_id:group2.subcircuit_id,componentDisplayName:group2.getString(),error:{message}})};try{for(let layerPackInput of packInputs){let targetLayer2=getPackComponentPcbLayer(layerPackInput.components[0],db22),componentIdsForLayer=new Set(layerPackInput.components.map(component=>component.componentId)),staticLayerObstacles=layerPackInput.components.flatMap(component=>{if(!component.isStatic)return[];let obstacle=getCollisionObstacleForStaticComponent(component);return obstacle?[obstacle]:[]}),canUseCrossLayerNetworkReferences=layerPackInput.components.every(component=>!!db22.pcb_component.get(component.componentId)&&!clusterMap[component.componentId]),crossLayerStaticComponents=packInput.components.filter(component=>component.isStatic&&!componentIdsForLayer.has(component.componentId)),fallbackCrossLayerObstacles=canUseCrossLayerNetworkReferences?[]:crossLayerStaticComponents.flatMap(component=>{let obstacle=getCollisionObstacleForStaticComponent(component);return obstacle?[obstacle]:[]}),collisionOnlyPadIds=new Set([...layerPackInput.components.filter(component=>component.isStatic),...canUseCrossLayerNetworkReferences?[]:crossLayerStaticComponents].flatMap(component=>component.pads.map(pad2=>pad2.padId))),networkReferenceSources=new Map([...packOutput.components.map(component=>[component.componentId,{component,courtyardSize:Number.EPSILON}]),...canUseCrossLayerNetworkReferences?crossLayerStaticComponents.map(component=>[component.componentId,{component,courtyardSize:1e-6}]):[]]),networkReferenceComponents=Array.from(networkReferenceSources.values(),({component,courtyardSize})=>({...component,componentId:`network_reference_${component.componentId}`,isStatic:!0,courtyard:{offsetFromCenter:{x:0,y:0},width:courtyardSize,height:courtyardSize}})),crossLayerPadObstacles=targetLayer2?getCrossLayerPadObstacles({components:Array.from(networkReferenceSources.values(),({component})=>component),targetLayer:targetLayer2,db:db22}):[],solverInput={...layerPackInput,weightedConnections:layerPackInput.weightedConnections?.filter(connection=>connection.padIds.every(padId=>!collisionOnlyPadIds.has(padId))),obstacles:[...layerPackInput.obstacles??[],...staticLayerObstacles,...fallbackCrossLayerObstacles,...crossLayerPadObstacles],components:[...networkReferenceComponents,...layerPackInput.components.filter(component=>!component.isStatic)]},solver=new PackSolver2(solverInput),solverParams=solver.getConstructorParams();group2.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams,solverConstructorArgs:[solverParams],componentName:group2.getString()});let pcbPackSolverTimeoutMs=group2.root?.platform?.pcbPackSolverTimeoutMs,{timedOut}=solvePackSolverWithTimeout(solver,pcbPackSolverTimeoutMs);if(timedOut&&(packingFailed=!0,reportPackingError(`PackSolver2 timed out after ${pcbPackSolverTimeoutMs}ms`)),solver.failed){packingFailed=!0;let solverErrorMessage=solver.error??solver.activeSubSolver?.error??"No valid packing solution found";reportPackingError(solverErrorMessage)}if(packOutput.components.push(...solver.packedComponents.filter(component=>componentIdsForLayer.has(component.componentId))),timedOut)break}}catch(error2){throw reportPackingError(error2 instanceof Error?error2.message:String(error2)),error2}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group2.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group2,packOutput,clusterMap,initialPackOutput),!packingFailed&&group2.root?.emit("packing:end",{subcircuit_id:group2.subcircuit_id,componentDisplayName:group2.getString()})},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=group2=>group2.children.filter(child=>child.componentName==="Port"),normalizeGroupSchematicBoxPorts=group2=>{let{db:db22}=group2.root,ports=getDirectGroupPorts(group2);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&&db22.source_port.update(port.source_port_id,{pin_number:port._parsedProps.pinNumber,port_hints:port.getNameAndAliases()})}},getGroupSchematicBoxPinLabels=group2=>{let pinLabels={};for(let port of getDirectGroupPorts(group2)){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=group2=>{if(group2.root?.schematicDisabled)return;let{db:db22}=group2.root,props=group2._parsedProps;props.schPinSpacing!==void 0&&db22.source_property_ignored_warning.insert({source_component_id:group2.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(group2);let dimensions4=group2._getSchematicBoxDimensions();if(!dimensions4)return;let center2=group2._getGlobalSchematicPositionBeforeLayout(),size3=dimensions4.getSize(),portLabels=group2._getPinLabelsFromPorts(),schPortArrangement=group2._getSchematicPortArrangement(),schematicComponent=db22.schematic_component.insert({center:center2,size:size3,source_group_id:group2.source_group_id,schematic_group_id:group2.schematic_group_id??void 0,subcircuit_id:group2.subcircuit_id??group2.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,schematic_sheet_id:group2._resolveSchematicSheetId()});group2.schematic_component_id=schematicComponent.schematic_component_id,group2.schematic_group_id&&db22.schematic_group.update(group2.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&&db22.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,schematic_sheet_id:group2._resolveSchematicSheetId()})},getSizeOfTreeNodeChild=(db22,child)=>{let{sourceComponent,sourceGroup}=child;if(child.nodeType==="component"){let schComponent=db22.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=db22.schematic_group.getWhere({source_group_id:sourceGroup?.source_group_id});if(schGroup?.width&&schGroup?.height)return{width:schGroup.width,height:schGroup.height};let groupComponents=db22.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=group2=>{let{db:db22}=group2.root,props=group2._parsedProps,tree=getCircuitJsonTree(db22.toArray(),{source_group_id:group2.source_group_id}),rawJustify=props.schJustifyContent??props.justifyContent,rawAlign=props.schAlignItems??props.alignItems,rawGap=props.schFlexGap??props.schGap??props.gap,direction3=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(db22,child)).filter(size3=>size3!==null),{alignItems,justifyContent,direction:direction3,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction3,rowGap,columnGap});for(let child of tree.childNodes){let size3=getSizeOfTreeNodeChild(db22,child);flexBox.addChild({metadata:child,width:size3?.width??0,height:size3?.height??0,flexBasis:size3?direction3==="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 offset2={x:-(bounds.maxX+bounds.minX)/2,y:-(bounds.maxY+bounds.minY)/2},allCircuitJson=db22.toArray();for(let child of flexBox.children){let{sourceComponent,sourceGroup}=child.metadata;if(sourceComponent){let schComponent=db22.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+offset2.x,y:child.position.y+child.size.height/2+offset2.y})}if(sourceGroup){if(!db22.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+offset2.x,y:child.position.y+child.size.height/2+offset2.y})}}group2.schematic_group_id&&db22.schematic_group.update(group2.schematic_group_id,{width:bounds.width,height:bounds.height})};function updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId,deltaX,deltaY}){let rects=db22.schematic_rect.list({schematic_component_id:schematicComponentId});for(let rect of rects)rect.center.x+=deltaX,rect.center.y+=deltaY;let lines=db22.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=db22.schematic_circle.list({schematic_component_id:schematicComponentId});for(let circle3 of circles)circle3.center.x+=deltaX,circle3.center.y+=deltaY;let arcs=db22.schematic_arc.list({schematic_component_id:schematicComponentId});for(let arc2 of arcs)arc2.center.x+=deltaX,arc2.center.y+=deltaY;let paths=db22.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(group2){let{db:db22}=group2.root,props=group2._parsedProps,schematicChildren=group2.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=db22.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=group2._getGlobalSchematicPositionBeforeLayout(),firstCellCenterX=groupCenter.x-totalGridWidth/2+maxCellWidth/2,firstCellCenterY=groupCenter.y+totalGridHeight/2-maxCellHeight/2;for(let i23=0;i23<schematicChildren.length;i23++){let child=schematicChildren[i23];if(!child.schematic_component_id)continue;let row=Math.floor(i23/numCols),col=i23%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i23} (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=db22.schematic_component.get(child.schematic_component_id);if(schComp){let oldChildCenter=schComp.center,newChildCenter={x:targetCellCenterX,y:targetCellCenterY};db22.schematic_component.update(child.schematic_component_id,{center:newChildCenter});let deltaX=newChildCenter.x-oldChildCenter.x,deltaY=newChildCenter.y-oldChildCenter.y,schPorts=db22.schematic_port.list({schematic_component_id:child.schematic_component_id});for(let port of schPorts)db22.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});let schTexts=db22.schematic_text.list({schematic_component_id:child.schematic_component_id});for(let text2 of schTexts)db22.schematic_text.update(text2.schematic_text_id,{position:{x:text2.position.x+deltaX,y:text2.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId:child.schematic_component_id,deltaX,deltaY})}}group2.schematic_group_id&&db22.schematic_group.update(group2.schematic_group_id,{width:totalGridWidth,height:totalGridHeight,center:groupCenter})}var debug52=(0,import_debug13.default)("Group_doInitialSchematicLayoutMatchAdapt");function Group_doInitialSchematicLayoutMatchAdapt(group2){let{db:db22}=group2.root,subtreeCircuitJson=buildSubtree(db22.toArray(),{source_group_id:group2.source_group_id});if(subtreeCircuitJson.filter(item=>item.type==="source_component").length<=1)return;let floatingGraph=convertCircuitJsonToBpc(subtreeCircuitJson);debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(floatingGraph,{title:`floatingBpcGraph-${group2.name}`}));let floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p23=>({...p23,color:p23.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(p23=>p23.boxId===box2.boxId).filter(bp22=>!bp22.color.includes("center")).length<=2).map(b22=>b22.boxId)),corpus:{}});debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(laidOutBpcGraph,{title:`laidOutBpcGraph-${group2.name}`}));let groupOffset=group2._getGlobalSchematicPositionBeforeLayout();for(let box2 of laidOutBpcGraph.boxes){if(!box2.center)continue;let schematic_component23=db22.schematic_component.get(box2.boxId);if(schematic_component23){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db22.schematic_port.list({schematic_component_id:schematic_component23.schematic_component_id}),texts=db22.schematic_text.list({schematic_component_id:schematic_component23.schematic_component_id}),positionDelta={x:newCenter.x-schematic_component23.center.x,y:newCenter.y-schematic_component23.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text2 of texts)text2.position.x+=positionDelta.x,text2.position.y+=positionDelta.y;updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId:schematic_component23.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component23.center=newCenter;continue}let schematic_net_label3=db22.schematic_net_label.get(box2.boxId);if(schematic_net_label3){let pin=laidOutBpcGraph.pins.find(p23=>p23.boxId===box2.boxId&&p23.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`)}}function getSchematicTextWidth2({text:text2,fontSize}){let charWidth=.12*(fontSize/.18);return text2.length*charWidth}var SYMBOL_TEXT_FONT_SIZE=.18,TEXT_BOX_ENABLED_FTYPES=new Set(["simple_resistor","simple_capacitor","simple_inductor","simple_crystal","simple_resonator","simple_potentiometer","simple_fuse","simple_diode","simple_led","simple_transistor","simple_mosfet","simple_op_amp","simple_voltage_source","simple_test_point"]);function getSchematicTextBounds({text:text2,position:position4,anchor:anchor3,fontSize}){let width=getSchematicTextWidth2({text:text2,fontSize}),height=fontSize,relMinX,relMaxX;anchor3.includes("left")?(relMinX=0,relMaxX=width):anchor3.includes("right")?(relMinX=-width,relMaxX=0):(relMinX=-width/2,relMaxX=width/2);let relMinY,relMaxY;return anchor3.includes("top")?(relMinY=-height,relMaxY=0):anchor3.includes("bottom")?(relMinY=0,relMaxY=height):(relMinY=-height/2,relMaxY=height/2),{minX:position4.x+relMinX,maxX:position4.x+relMaxX,minY:position4.y+relMinY,maxY:position4.y+relMaxY}}function getSymbolTextBounds({schematicComponent,sourceComponent}){if(!schematicComponent.symbol_name)return[];let symbol=zh[schematicComponent.symbol_name];if(!symbol?.primitives||!symbol.center)return[];let textBounds=[];for(let primitive of symbol.primitives){if(primitive.type!=="text")continue;let value;primitive.text==="{REF}"?value=sourceComponent?.display_name??sourceComponent?.name??"":primitive.text==="{VAL}"?value=schematicComponent.symbol_display_value??"":value=primitive.text??"",value&&textBounds.push(getSchematicTextBounds({text:value,position:{x:primitive.x-symbol.center.x+schematicComponent.center.x,y:primitive.y-symbol.center.y+schematicComponent.center.y},anchor:primitive.anchor??"center",fontSize:SYMBOL_TEXT_FONT_SIZE}))}return textBounds}function getSymbolBoxBounds(schematicComponent){return getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height})}function getSchematicComponentTextInclusiveBounds(db22,schematicComponent){if(!schematicComponent.center||!schematicComponent.size)return null;let sourceComponent=schematicComponent.source_component_id?db22.source_component.get(schematicComponent.source_component_id):void 0;if(!sourceComponent||!TEXT_BOX_ENABLED_FTYPES.has(sourceComponent.ftype))return null;let textBounds=getSymbolTextBounds({schematicComponent,sourceComponent});if(textBounds.length===0)return null;let boxBounds=getSymbolBoxBounds(schematicComponent),bounds={...boxBounds};for(let textBound of textBounds)bounds.minX=Math.min(bounds.minX,textBound.minX),bounds.maxX=Math.max(bounds.maxX,textBound.maxX),bounds.minY=Math.min(bounds.minY,textBound.minY),bounds.maxY=Math.max(bounds.maxY,textBound.maxY);return bounds.minX===boxBounds.minX&&bounds.maxX===boxBounds.maxX&&bounds.minY===boxBounds.minY&&bounds.maxY===boxBounds.maxY?null:bounds}function getOrientedSchematicComponent(schematicComponent,ccwRotationDegrees){let size3=schematicComponent.size;return size3&&(size3=getRotatedSize2(size3,ccwRotationDegrees)),{...schematicComponent,symbol_name:getRotatedSymbolName(schematicComponent.symbol_name,ccwRotationDegrees),size:size3}}function getSchematicComponentWithTextBounds({db:db22,schematicComponent,ccwRotationDegrees=0}){let orientedComponent=getOrientedSchematicComponent(schematicComponent,ccwRotationDegrees),textBounds=getSchematicComponentTextInclusiveBounds(db22,orientedComponent);if(!textBounds)return null;let boxBounds=getSymbolBoxBounds(orientedComponent);if(orientedComponent.size.height>orientedComponent.size.width)return textBounds;let padLeft=Math.max(0,boxBounds.minX-textBounds.minX),padRight=Math.max(0,textBounds.maxX-boxBounds.maxX),padTop=Math.max(0,textBounds.maxY-boxBounds.maxY),padBottom=Math.max(0,boxBounds.minY-textBounds.minY),left=padLeft,right=padRight;padLeft>0&&padRight>0&&(left=Math.max(padLeft,padRight),right=left);let top=padTop,bottom=padBottom;return padTop>0&&padBottom>0&&(top=Math.max(padTop,padBottom),bottom=top),{minX:boxBounds.minX-left,maxX:boxBounds.maxX+right,minY:boxBounds.minY-bottom,maxY:boxBounds.maxY+top}}var debug62=(0,import_debug14.default)("Group_doInitialSchematicLayoutMatchpack"),DEFAULT_AVAILABLE_ROTATIONS=[0,90,180,270],ROTATION_TO_PLACE_SIDE_ON_TOP={"y+":0,"x+":90,"y-":180,"x-":270};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 getPowerGroundForcedRotation(db22,ports){if(ports.length!==2)return null;let powerGroundRotations=new Set;for(let port of ports){let connectivityKey=db22.source_port.get(port.source_port_id)?.subcircuit_connectivity_map_key;if(!connectivityKey)continue;let net=db22.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey});if(!net)continue;let isGround=net.is_ground??!1,isPositiveVoltageSource=net.is_power===!0||net.is_positive_voltage_source===!0;if(isPositiveVoltageSource===isGround)continue;let rotationToPlacePinOnTop=ROTATION_TO_PLACE_SIDE_ON_TOP[facingDirectionToSide(port.facing_direction)],rotation5=isPositiveVoltageSource?rotationToPlacePinOnTop:(rotationToPlacePinOnTop+180)%360;powerGroundRotations.add(rotation5)}return powerGroundRotations.size===1?powerGroundRotations.values().next().value:null}function getChipSize({db:db22,schematicComponent,component,ccwRotationDegrees}){let orientedSymbolSize=schematicComponent.size;orientedSymbolSize&&(orientedSymbolSize=getRotatedSize2(orientedSymbolSize,ccwRotationDegrees));let componentWithTextBounds=getSchematicComponentWithTextBounds({db:db22,schematicComponent,ccwRotationDegrees}),textPadLeft=0,textPadRight=0,textPadTop=0,textPadBottom=0;if(componentWithTextBounds&&schematicComponent.center){let halfWidth=(orientedSymbolSize?.width??0)/2,halfHeight=(orientedSymbolSize?.height??0)/2;textPadLeft=schematicComponent.center.x-halfWidth-componentWithTextBounds.minX,textPadRight=componentWithTextBounds.maxX-(schematicComponent.center.x+halfWidth),textPadTop=componentWithTextBounds.maxY-(schematicComponent.center.y+halfHeight),textPadBottom=schematicComponent.center.y-halfHeight-componentWithTextBounds.minY}let marginLeft=(component?._parsedProps?.schMarginLeft??component?._parsedProps?.schMarginX??0)+textPadLeft,marginRight=(component?._parsedProps?.schMarginRight??component?._parsedProps?.schMarginX??0)+textPadRight,marginTop=(component?._parsedProps?.schMarginTop??component?._parsedProps?.schMarginY??0)+textPadTop,marginBottom=(component?._parsedProps?.schMarginBottom??component?._parsedProps?.schMarginY??0)+textPadBottom;component?.config.shouldRenderAsSchematicBox&&(marginTop+=.4,marginBottom+=.4);let orientedFootprint={width:(orientedSymbolSize?.width||1)+marginLeft+marginRight,height:(orientedSymbolSize?.height||1)+marginTop+marginBottom},chipSize=getRotatedSize2(orientedFootprint,ccwRotationDegrees);return{x:chipSize.width,y:chipSize.height}}function getReservedChipSize({db:db22,schematicComponent,component,ccwRotationDegrees,chipGap}){let unrotatedSize=getChipSize({db:db22,schematicComponent,component,ccwRotationDegrees:0});if(!shouldSwapOrientation(ccwRotationDegrees))return unrotatedSize;let rotatedSize=getChipSize({db:db22,schematicComponent,component,ccwRotationDegrees});return rotatedSize.x-unrotatedSize.x>=chipGap||rotatedSize.y-unrotatedSize.y>=chipGap?rotatedSize:unrotatedSize}function getNestedGroupMatchpackProxy({db:db22,schematicGroup,groupComponents,groupInstance}){let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let component of groupComponents){if(!component.center||!component.size)continue;hasValidBounds=!0;let componentBounds=getSchematicComponentWithTextBounds({db:db22,schematicComponent:component})??getBoundFromCenteredRect({center:component.center,width:component.size.width,height:component.size.height});minX=Math.min(minX,componentBounds.minX),maxX=Math.max(maxX,componentBounds.maxX),minY=Math.min(minY,componentBounds.minY),maxY=Math.max(maxY,componentBounds.maxY)}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,contentCenter=hasValidBounds?{x:(minX+maxX)/2,y:(minY+maxY)/2}:schematicGroup.center??{x:0,y:0};return{center:{x:contentCenter.x+(marginRight-marginLeft)/2,y:contentCenter.y+(marginTop-marginBottom)/2},size:{x:(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,y:(hasValidBounds?maxY-minY:2)+marginTop+marginBottom}}}function isTreeChildExplicitlyPositioned(treeChild,group2){if(treeChild.nodeType==="component"&&treeChild.sourceComponent){let component=group2.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=group2.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,index2){return child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name||`chip_${index2}`:child.nodeType==="group"&&child.sourceGroup?child.sourceGroup.name||`group_${index2}`:null}var getSchematicComponentForSourceComponent=({db:db22,sourceComponentId,schematicSheetId})=>db22.schematic_component.getWhere({source_component_id:sourceComponentId,...schematicSheetId?{schematic_sheet_id:schematicSheetId}:{}});function convertTreeToMatchPackInputProblem(tree,db22,group2,opts={}){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2},nestedGroupMatchpackProxyMap={},groupOffset=group2._getGlobalSchematicPositionBeforeLayout();debug62(`[${group2.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index2)=>{let explicitlyPositioned=isTreeChildExplicitlyPositioned(child,group2);if(debug62(explicitlyPositioned?`[${group2.name}] Child ${index2} explicitly positioned, including as fixed chip`:`[${group2.name}] Processing child ${index2}: nodeType=${child.nodeType}`),child.nodeType==="component"?debug62(`[${group2.name}] - Component: ${child.sourceComponent?.name}`):child.nodeType==="group"&&debug62(`[${group2.name}] - Group: ${child.sourceGroup?.name}`),child.nodeType==="component"&&child.sourceComponent){let chipId=getTreeChildChipId(child,index2),schematicComponent=getSchematicComponentForSourceComponent({db:db22,sourceComponentId:child.sourceComponent.source_component_id,schematicSheetId:opts.schematicSheetId});if(!schematicComponent)return;let component=group2.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),ports=db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),availableRotations=[...DEFAULT_AVAILABLE_ROTATIONS];if(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]),availableRotations.length===DEFAULT_AVAILABLE_ROTATIONS.length){let forcedRotation=getPowerGroundForcedRotation(db22,ports);forcedRotation!==null&&(availableRotations=[forcedRotation])}let ccwRotationDegrees=availableRotations.length===1?availableRotations[0]:0;problem.chipMap[chipId]={chipId,pins:[],size:getReservedChipSize({db:db22,schematicComponent,component,ccwRotationDegrees,chipGap:problem.chipGap}),isCapacitor:child.sourceComponent.ftype==="simple_capacitor",isCrystal:child.sourceComponent.ftype==="simple_crystal",isResistor:child.sourceComponent.ftype==="simple_resistor",isTestPoint:child.sourceComponent.ftype==="simple_test_point",availableRotations,...explicitlyPositioned&&{fixedPosition:{x:schematicComponent.center.x-groupOffset.x,y:schematicComponent.center.y-groupOffset.y}}};for(let port of ports){let sourcePort=db22.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),y:(port.center?.y||0)-(schematicComponent.center.y||0)},side}}}else if(child.nodeType==="group"&&child.sourceGroup){let groupId=getTreeChildChipId(child,index2);debug62(`[${group2.name}] Processing nested group: ${groupId}`);let schematicGroup=db22.schematic_group?.getWhere?.({source_group_id:child.sourceGroup.source_group_id}),groupInstance=group2.children.find(groupChild=>groupChild.source_group_id===child.sourceGroup?.source_group_id);if(debug62(`[${group2.name}] Found schematic_group for ${groupId}:`,schematicGroup),schematicGroup){debug62(`[${group2.name}] Treating group ${groupId} as composite chip`);let groupComponents=db22.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`[${group2.name}] Group ${groupId} has ${groupComponents.length} components:`,groupComponents.map(c23=>c23.source_component_id));let matchpackProxy=getNestedGroupMatchpackProxy({db:db22,schematicGroup,groupComponents,groupInstance});nestedGroupMatchpackProxyMap[groupId]=matchpackProxy,debug62(`[${group2.name}] Group ${groupId} computed proxy: ${matchpackProxy.size.x} x ${matchpackProxy.size.y} centered at (${matchpackProxy.center.x}, ${matchpackProxy.center.y})`);let groupPins=[];for(let comp of groupComponents){let ports=db22.schematic_port.list({schematic_component_id:comp.schematic_component_id});for(let port of ports){let sourcePort=db22.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 side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-matchpackProxy.center.x,y:(port.center?.y||0)-matchpackProxy.center.y},side}}}debug62(`[${group2.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:matchpackProxy.size},debug62(`[${group2.name}] Added group ${groupId} to chipMap`)}else debug62(`[${group2.name}] Warning: No schematic_group found for group ${groupId}`)}}),debug62(`[${group2.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=db22.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){let groupComponents=db22.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});for(let comp of groupComponents){let sourcePorts=db22.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(`[${group2.name}] \u2713 Pin ${pinId} has connectivity key: ${connectivityKey}`)}else debug62(`[${group2.name}] Pin ${pinId} has no connectivity key`)}}}}else if(treeNode?.nodeType==="component"&&treeNode.sourceComponent){let sourcePorts=db22.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(`[${group2.name}] Pin ${pinId} has connectivity key: ${connectivityKey}`)}}}}debug62(`[${group2.name}] Found ${connectivityGroups.size} connectivity groups:`,Array.from(connectivityGroups.entries()).map(([key,pins])=>({key,pins})));for(let[connectivityKey,pins]of connectivityGroups){let tracesWithThisKey=db22.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(`[${group2.name}] Connectivity ${connectivityKey}: hasNetConnections=${hasNetConnections}, hasDirectConnections=${hasDirectConnections}`),pins.length>=2&&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=db22.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&&db22.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p23=>p23.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i23=0;i23<directlyConnectedPins.length;i23++)for(let j22=i23+1;j22<directlyConnectedPins.length;j22++){let pin1=directlyConnectedPins[i23],pin2=directlyConnectedPins[j22];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group2.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net3=db22.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey}),isGround=source_net3?.is_ground??!1,isPositiveVoltageSource=source_net3?.is_power===!0||source_net3?.is_positive_voltage_source===!0;problem.netMap[connectivityKey]={netId:connectivityKey,isGround,isPositiveVoltageSource};for(let pinId of pins)problem.netConnMap[`${pinId}-${connectivityKey}`]=!0;debug62(`[${group2.name}] Created net ${connectivityKey} with ${pins.length} pins:`,pins)}}return{inputProblem:problem,nestedGroupMatchpackProxyMap}}function applySchematicMatchPackLayoutToTree(group2,tree,opts={}){let{db:db22}=group2.root;if(debug62(`[${group2.name}] Starting matchpack layout with ${tree.childNodes.length} children`),debug62(`[${group2.name}] Tree structure:`,JSON.stringify(tree,null,2)),tree.childNodes.length<=1){debug62(`[${group2.name}] Only ${tree.childNodes.length} children, skipping layout`);return}debug62("Converting circuit tree to InputProblem...");let{inputProblem,nestedGroupMatchpackProxyMap}=convertTreeToMatchPackInputProblem(tree,db22,group2,opts);debug62.enabled&&group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${group2.name}`,content:JSON.stringify(inputProblem,null,2)});let solver=new LayoutPipelineSolver(inputProblem);if(group2.root?.emit("solver:started",{type:"solver:started",solverName:"LayoutPipelineSolver",solverParams:inputProblem,solverConstructorArgs:[inputProblem],componentName:group2.getString()}),debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group2.name}`})}if(solver.solve(),group2.root?.emit("solver:ended",{type:"solver:ended",solverName:"LayoutPipelineSolver",componentName:group2.getString(),solved:solver.solved,failed:solver.failed,iterations:solver.iterations,error:solver.error}),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed){let solverError=solver.error??"Unknown Matchpack failure";debug62(`Solver failed with error: ${solverError}`),db22.schematic_layout_error.insert({error_type:"schematic_layout_error",message:`Matchpack layout solver failed: ${solverError}`,is_fatal:!1,source_group_id:group2.source_group_id,schematic_group_id:group2.schematic_group_id,subcircuit_id:group2.subcircuit_id??void 0});return}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-${group2.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=group2._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 groupChild=group2.children.find(c23=>c23.source_component_id===treeNode.sourceComponent?.source_component_id);if(groupChild?._parsedProps?.schX!==void 0||groupChild?._parsedProps?.schY!==void 0){debug62(`Skipping position update for fixed chip ${chipId}`);continue}let schematicComponent=getSchematicComponentForSourceComponent({db:db22,sourceComponentId:treeNode.sourceComponent.source_component_id,schematicSheetId:opts.schematicSheetId});if(schematicComponent){debug62(`Moving component ${chipId} to (${newCenter.x}, ${newCenter.y})`);let ports=db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),texts=db22.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 text2 of texts)text2.position.x+=positionDelta.x,text2.position.y+=positionDelta.y;if(updateSchematicPrimitivesForLayoutShift({db:db22,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,cos32=Math.cos(angleRad),sin32=Math.sin(angleRad);for(let port of ports){let dx22=port.center.x-newCenter.x,dy22=port.center.y-newCenter.y,rotatedDx=dx22*cos32-dy22*sin32,rotatedDy=dx22*sin32+dy22*cos32;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 text2 of texts){let dx22=text2.position.x-newCenter.x,dy22=text2.position.y-newCenter.y,rotatedDx=dx22*cos32-dy22*sin32,rotatedDy=dx22*sin32+dy22*cos32;text2.position.x=newCenter.x+rotatedDx,text2.position.y=newCenter.y+rotatedDy}schematicComponent.symbol_name&&(schematicComponent.symbol_name=getRotatedSymbolName(schematicComponent.symbol_name,placement.ccwRotationDegrees))}}}else if(treeNode.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db22.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=db22.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`Group ${chipId} has ${groupComponents.length} components to move`);let matchpackProxy=nestedGroupMatchpackProxyMap[chipId],oldCenter=matchpackProxy?.center??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=db22.schematic_port.list({schematic_component_id:component.schematic_component_id}),texts=db22.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 text2 of texts)text2.position&&(text2.position.x+=positionDelta.x,text2.position.y+=positionDelta.y);updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId:component.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y})}schematicGroup.center=newCenter,matchpackProxy&&(schematicGroup.width=matchpackProxy.size.x,schematicGroup.height=matchpackProxy.size.y),debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}function getSchematicSheetIdsBySourceGroupId({circuitJson,schematicSheetIdsBySourceComponentId}){let parentBySourceGroupId=new Map;for(let element of circuitJson)element.type==="source_group"&&parentBySourceGroupId.set(element.source_group_id,element.parent_source_group_id);let schematicSheetIdsBySourceGroupId=new Map;for(let element of circuitJson){if(element.type!=="source_component"||!element.source_group_id)continue;let schematicSheetIds=schematicSheetIdsBySourceComponentId.get(element.source_component_id);if(schematicSheetIds!==void 0)for(let schematicSheetId of schematicSheetIds){let sourceGroupId=element.source_group_id,visitedSourceGroupIds=new Set;for(;sourceGroupId&&!visitedSourceGroupIds.has(sourceGroupId);){visitedSourceGroupIds.add(sourceGroupId);let groupSchematicSheetIds=schematicSheetIdsBySourceGroupId.get(sourceGroupId)??new Set;groupSchematicSheetIds.add(schematicSheetId),schematicSheetIdsBySourceGroupId.set(sourceGroupId,groupSchematicSheetIds),sourceGroupId=parentBySourceGroupId.get(sourceGroupId)}}}return schematicSheetIdsBySourceGroupId}function getCircuitJsonScopedToSchematicSheet({circuitJson,schematicSheetId,rootSourceGroupId,schematicSheetIdsBySourceComponentId,schematicSheetIdsBySourceGroupId}){let isGroupOnSheet=sourceGroupId=>sourceGroupId===rootSourceGroupId||schematicSheetIdsBySourceGroupId.get(sourceGroupId)?.has(schematicSheetId)===!0;return circuitJson.filter(element=>element.type==="source_group"?isGroupOnSheet(element.source_group_id):element.type==="source_component"?schematicSheetIdsBySourceComponentId.get(element.source_component_id)?.has(schematicSheetId)!==!0?!1:element.source_group_id?isGroupOnSheet(element.source_group_id):!0:!0)}function getSchematicCircuitJsonTrees(circuitJson,opts){let{source_group_id}=opts,schematicSheetIdsBySourceComponentId=new Map;for(let element of circuitJson){if(element.type!=="schematic_component"||!element.source_component_id||!element.schematic_sheet_id)continue;let schematicSheetIds2=schematicSheetIdsBySourceComponentId.get(element.source_component_id)??new Set;schematicSheetIds2.add(element.schematic_sheet_id),schematicSheetIdsBySourceComponentId.set(element.source_component_id,schematicSheetIds2)}let schematicSheetIds=new Set;for(let componentSchematicSheetIds of schematicSheetIdsBySourceComponentId.values())for(let schematicSheetId of componentSchematicSheetIds)schematicSheetIds.add(schematicSheetId);if(schematicSheetIds.size<=1)return[{tree:getCircuitJsonTree(circuitJson,{source_group_id}),schematicSheetId:schematicSheetIds.values().next().value}];let schematicSheetIdsBySourceGroupId=getSchematicSheetIdsBySourceGroupId({circuitJson,schematicSheetIdsBySourceComponentId});return Array.from(schematicSheetIds).map(schematicSheetId=>({tree:getCircuitJsonTree(getCircuitJsonScopedToSchematicSheet({circuitJson,schematicSheetId,rootSourceGroupId:source_group_id,schematicSheetIdsBySourceComponentId,schematicSheetIdsBySourceGroupId}),{source_group_id}),schematicSheetId}))}function Group_doInitialSchematicLayoutMatchPack(group2){let{db:db22}=group2.root,trees=getSchematicCircuitJsonTrees(db22.toArray(),{source_group_id:group2.source_group_id});for(let{tree,schematicSheetId}of trees)applySchematicMatchPackLayoutToTree(group2,tree,{schematicSheetId})}var SECTION_GAP=1,MARGIN2=1.5;function computeSchematicSectionLayoutUsingRows({sectionBlocks,groupSchPositionBeforeLayout:groupOffset}){let totalArea=sectionBlocks.reduce((sum,block)=>{let paddedWidth=Math.max(block.size.x,.5)+MARGIN2*2,paddedHeight=Math.max(block.size.y,.5)+MARGIN2*2;return sum+paddedWidth*paddedHeight},0),targetRowWidth=Math.sqrt(totalArea)*2,computedSectionsMatrix=[],currentSectionRow=[],currentRowSectionWidth=0;for(let section of sectionBlocks){let paddedWidth=Math.max(section.size.x,.5)+MARGIN2*2,paddedHeight=Math.max(section.size.y,.5)+MARGIN2*2,neededWidth=currentRowSectionWidth>0?currentRowSectionWidth+SECTION_GAP+paddedWidth:paddedWidth;currentSectionRow.length>0&&neededWidth>targetRowWidth&&(computedSectionsMatrix.push(currentSectionRow),currentSectionRow=[],currentRowSectionWidth=0);let xOffsetInRow=currentRowSectionWidth>0?currentRowSectionWidth+SECTION_GAP:0;currentSectionRow.push({sectionName:section.sectionName,rowOffset:xOffsetInRow,width:paddedWidth,height:paddedHeight}),currentRowSectionWidth=xOffsetInRow+paddedWidth}currentSectionRow.length>0&&computedSectionsMatrix.push(currentSectionRow);let sectionPlacements=new Map,rowY=0;for(let sectionRow of computedSectionsMatrix){let rowHeight=Math.max(...sectionRow.map(rowEntry=>rowEntry.height)),rowCenteringOffsetX=-(sectionRow[sectionRow.length-1].rowOffset+sectionRow[sectionRow.length-1].width)/2;for(let section of sectionRow)sectionPlacements.set(section.sectionName,{x:rowCenteringOffsetX+section.rowOffset+section.width/2+groupOffset.x,y:rowY-rowHeight/2+groupOffset.y});rowY-=rowHeight+SECTION_GAP}return sectionPlacements}var debug7=(0,import_debug15.default)("Group_doInitialSchematicLayoutSections");function Group_doInitialSchematicLayoutSections(group2){let{db:db22}=group2.root,sectionNamesUsedByChildren=new Set,hasChildrenWithoutSection=!1;for(let child of group2.children){if(!child.source_component_id)continue;let sectionName=child.getSchematicSectionName();sectionName!==null?sectionNamesUsedByChildren.add(sectionName):hasChildrenWithoutSection=!0}let sectionNamesToLayout=Array.from(sectionNamesUsedByChildren);if(hasChildrenWithoutSection&&sectionNamesToLayout.push(null),sectionNamesToLayout.length===0)return;for(let sectionName of sectionNamesToLayout){let sectionTree=getCircuitJsonTree(db22.toArray(),{source_group_id:group2.source_group_id});sectionTree.childNodes=sectionTree.childNodes.filter(child=>child.nodeType!=="component"||!child.sourceComponent?!1:(group2.children.find(c23=>c23.source_component_id===child.sourceComponent?.source_component_id)?.getSchematicSectionName()??null)===sectionName),applySchematicMatchPackLayoutToTree(group2,sectionTree)}if(sectionNamesToLayout.length<=1)return;let sectionNameToBoundsWithChildren=new Map;for(let sectionName of sectionNamesToLayout){let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,sourceCompIds=new Set;for(let child of group2.children){let sourceComponentId=child.source_component_id;if(!sourceComponentId||child.getSchematicSectionName()!==sectionName)continue;let schComp=db22.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;sourceCompIds.add(sourceComponentId);let hw22=schComp.size.width/2,hh22=schComp.size.height/2;minX=Math.min(minX,schComp.center.x-hw22),maxX=Math.max(maxX,schComp.center.x+hw22),minY=Math.min(minY,schComp.center.y-hh22),maxY=Math.max(maxY,schComp.center.y+hh22)}!Number.isFinite(minX)||sourceCompIds.size===0||sectionNameToBoundsWithChildren.set(sectionName,{sectionName,center:{x:(minX+maxX)/2,y:(minY+maxY)/2},size:{x:maxX-minX,y:maxY-minY},sourceCompIds})}if(sectionNameToBoundsWithChildren.size<=1)return;let anchoredSections=new Set;for(let child of group2.children){if(!child.source_component_id)continue;let props=child._parsedProps;(props?.schX!==void 0||props?.schY!==void 0)&&anchoredSections.add(child.getSchematicSectionName())}let groupSchPositionBeforeLayout=group2._getGlobalSchematicPositionBeforeLayout(),sectionPlacements=computeSchematicSectionLayoutUsingRows({sectionBlocks:Array.from(sectionNameToBoundsWithChildren.values()).map(bounds=>({sectionName:bounds.sectionName,size:bounds.size})),groupSchPositionBeforeLayout});for(let[sectionName,placement]of sectionPlacements){let boundsWithChildren=sectionNameToBoundsWithChildren.get(sectionName);if(!boundsWithChildren)continue;if(anchoredSections.has(sectionName)){debug7(`[${group2.name}] Section "${sectionName}" anchored by manual position, skipping shift`);continue}let delta={x:placement.x-boundsWithChildren.center.x,y:placement.y-boundsWithChildren.center.y};for(let sourceComponentId of boundsWithChildren.sourceCompIds){let schComp=db22.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;let ports=db22.schematic_port.list({schematic_component_id:schComp.schematic_component_id}),texts=db22.schematic_text.list({schematic_component_id:schComp.schematic_component_id});for(let port of ports)port.center.x+=delta.x,port.center.y+=delta.y;for(let text2 of texts)text2.position.x+=delta.x,text2.position.y+=delta.y;updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId:schComp.schematic_component_id,deltaX:delta.x,deltaY:delta.y}),schComp.center={x:schComp.center.x+delta.x,y:schComp.center.y+delta.y}}}}var updateMissingSchematicSheetWarning=({db:db22,schematicDisabled})=>{let existingWarning=db22.schematic_missing_sheet_warning.list()[0],hasSchematicComponents=db22.schematic_component.list().length>0;if(!(!schematicDisabled&&hasSchematicComponents&&db22.schematic_sheet.list().length===0)){existingWarning&&db22.schematic_missing_sheet_warning.delete(existingWarning.schematic_missing_sheet_warning_id);return}existingWarning||db22.schematic_missing_sheet_warning.insert({warning_type:"schematic_missing_sheet_warning",message:"No <schematicsheet> was found. Add a <schematicsheet> to define the schematic drawing area."})},Group_doInitialSchematicSheetRender=group2=>{let root=group2.root;if(!root?.isRootCircuit)return;let isRootGroup=root.firstChild===group2,isRootAssemblyChild=isAssemblyDeviceContainer(root.firstChild)&&group2.parent===root.firstChild;!isRootGroup&&!isRootAssemblyChild||updateMissingSchematicSheetWarning({db:root.db,schematicDisabled:root.schematicDisabled})},Group_updateSchematicSheetRender=group2=>{Group_doInitialSchematicSheetRender(group2)},NetLabel=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_label_id");__publicField(this,"schematic_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(),dx22=connectedPortPosition.x-anchorPos.x,dy22=connectedPortPosition.y-anchorPos.y;if(Math.abs(dx22)>Math.abs(dy22)){if(dx22>0)return"right";if(dx22<0)return"left"}else{if(dy22>0)return"top";if(dy22<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:db22}=this.root,{_parsedProps:props}=this;if(props.inline&&this.root?._featureMspSchematicTraceRouting&&this._getConnectedPorts().length>0)return;let 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=db22.schematic_net_label.insert({text:props.net,source_net_id:net.source_net_id,anchor_position:anchorPos,center:center2,anchor_side:anchorSide,schematic_sheet_id:this._resolveSchematicSheetId()});this.source_net_label_id=netLabel.source_net_id,this.schematic_net_label_id=netLabel.schematic_net_label_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(){let connectsTo=this._resolveConnectsTo();if(connectsTo)for(let connection of connectsTo)this.add(new Trace({from:connection,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor()||this._parsedProps.inline)return;let{schX,schY}=this._parsedProps;if(schX===void 0&&schY===void 0)return;let{db:db22}=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=db22.source_trace.list().find(st22=>st22.connected_source_net_ids?.includes(net.source_net_id)&&st22.connected_source_port_ids?.includes(port.source_port_id??""));if(candidateSourceTrace&&(existingTraceForThisConnection=db22.schematic_trace.list().some(t48=>t48.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 i23=0;i23<path.length-1;i23++)edges.push({from:{x:path[i23].x,y:path[i23].y},to:{x:path[i23+1].x,y:path[i23+1].y}});let source_trace_id,subcircuit_connectivity_map_key;if(net?.source_net_id&&port.source_port_id){let st22=db22.source_trace.list().find(s23=>s23.connected_source_net_ids?.includes(net.source_net_id)&&s23.connected_source_port_ids?.includes(port.source_port_id));source_trace_id=st22?.source_trace_id,subcircuit_connectivity_map_key=st22?.subcircuit_connectivity_map_key||db22.source_net.get(net.source_net_id)?.subcircuit_connectivity_map_key}db22.schematic_trace.insert({source_trace_id,edges,junctions:[],subcircuit_connectivity_map_key,schematic_sheet_id:this._resolveSchematicSheetId()}),db22.schematic_port.update(port.schematic_port_id,{is_connected:!0})}}},getNetNameFromPorts=ports=>{let directlyConnectedTraces=[...new Set(ports.flatMap(port=>port._getDirectlyConnectedTraces()))],displayLabel=directlyConnectedTraces.find(trace=>trace._parsedProps.schDisplayLabel)?._parsedProps.schDisplayLabel??directlyConnectedTraces.find(trace=>trace._parsedProps.displayName)?._parsedProps.displayName??directlyConnectedTraces.find(trace=>trace._parsedProps.name)?._parsedProps.name;if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0};let db22=ports.find(port=>port.root)?.root?.db,sourcePortIds=ports.map(port=>port.source_port_id).filter(sourcePortId=>!!sourcePortId);return{name:(db22?getNetNameFromSourcePorts(db22,sourcePortIds):ports.map(port=>port._getNetLabelText()).filter(name=>!!name).sort((a22,b22)=>a22.localeCompare(b22,void 0,{numeric:!0,sensitivity:"base"}))[0])??"",wasAssignedDisplayLabel:!1}},appendToMap=(map,key,value)=>{let values2=map.get(key);values2?values2.push(value):map.set(key,[value])},createCanonicalSchematicNetLabelTextResolver=group2=>{let{db:db22}=group2.root,sourceNetByConnectionKey=new Map,portsByConnectionKey=new Map,sourcePortIdsByConnectionKey=new Map,resolvedTextByConnectionKey=new Map;for(let sourceNet of db22.source_net.list())sourceNet.subcircuit_connectivity_map_key&&sourceNetByConnectionKey.set(sourceNet.subcircuit_connectivity_map_key,sourceNet);for(let port of group2.selectAll("port")){let connectionKey=port._getSubcircuitConnectivityKey();connectionKey&&appendToMap(portsByConnectionKey,connectionKey,port)}for(let sourcePort of db22.source_port.list())sourcePort.subcircuit_connectivity_map_key&&appendToMap(sourcePortIdsByConnectionKey,sourcePort.subcircuit_connectivity_map_key,sourcePort.source_port_id);return({subcircuitConnectivityMapKey})=>{let cached=resolvedTextByConnectionKey.get(subcircuitConnectivityMapKey);if(cached)return cached;let resolvedSourceNet=sourceNetByConnectionKey.get(subcircuitConnectivityMapKey);if(resolvedSourceNet?.name){let result2={name:resolvedSourceNet.name,wasAssignedDisplayLabel:!0};return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,result2),result2}let portLabel=getNetNameFromPorts(portsByConnectionKey.get(subcircuitConnectivityMapKey)??[]);if(portLabel.name)return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,portLabel),portLabel;let result={name:getNetNameFromSourcePorts(db22,sourcePortIdsByConnectionKey.get(subcircuitConnectivityMapKey)??[])??"",wasAssignedDisplayLabel:!1};return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,result),result}},asSchematicPortId=id3=>id3,asSourcePortId=id3=>id3,debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender"),INLINE_NET_LABEL_COLOR="rgb(132, 0, 0)",VERTICAL_INLINE_NET_LABEL_ROTATION=-90;function applyInlineNetLabelPlacements(args){let{group:group2,solver,userNetIdToConnKey,sourceTraceIdByPinPairKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId}=args,{db:db22}=group2.root,inlineNetLabelPlacements=solver.inlineNetLabelSolver?.getOutput().inlineNetLabelPlacements??[];if(inlineNetLabelPlacements.length===0)return;let resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group2),globalConnMap=solver.mspConnectionPairSolver.globalConnMap;for(let placement of inlineNetLabelPlacements){let schematicPortIds=placement.pinIds.map(asSchematicPortId),placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id3=>userNetIdToConnKey.has(id3)),crossScopeSourceTraceId=schematicPortIds.length===1?crossScopeSourceTraceIdBySchematicPortIdAndNetId.get(schematicPortIds[0])?.get(placement.netId??placement.globalConnNetId):void 0,connKey=(crossScopeSourceTraceId?db22.source_trace.get(crossScopeSourceTraceId)?.subcircuit_connectivity_map_key:void 0)??(placementUserNetId?userNetIdToConnKey.get(placementUserNetId):void 0),text2=placement.netLabelText??(connKey?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey}).name:placement.netId??placement.globalConnNetId);if(!text2){debug8(`skipping inline net label for "${placement.netId}" REASON:no resolvable text`);continue}let sourceTraceId=crossScopeSourceTraceId??sourceTraceIdByPinPairKey.get([...schematicPortIds].sort().join("::"));if(!sourceTraceId&&connKey){let sourcePortIds=schematicPortIds.flatMap(schematicPortId=>{let sourcePortId=db22.schematic_port.get(schematicPortId)?.source_port_id;return sourcePortId?[sourcePortId]:[]});sourceTraceId=db22.source_trace.list().find(sourceTrace=>sourceTrace.subcircuit_connectivity_map_key===connKey&&sourcePortIds.some(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId)))?.source_trace_id}let schematicSheetId=group2._resolveSchematicSheetId(),schematicPort=db22.schematic_port.get(schematicPortIds[0]);schematicPort?.schematic_sheet_id&&(schematicSheetId=schematicPort.schematic_sheet_id);let placementOffset={x:0,y:0},stubTracePath=placement.stubTracePath?.map(point62=>({...point62}));if(stubTracePath&&schematicPortIds.length===1){let portCenter=db22.schematic_port.get(schematicPortIds[0])?.center;portCenter&&(placementOffset={x:portCenter.x-stubTracePath[0].x,y:portCenter.y-stubTracePath[0].y},stubTracePath=stubTracePath.map(point62=>({x:point62.x+placementOffset.x,y:point62.y+placementOffset.y})))}let shiftedAnchorPoint={x:placement.anchorPoint.x+placementOffset.x,y:placement.anchorPoint.y+placementOffset.y},position4={x:placement.center.x+placementOffset.x,y:placement.center.y+placementOffset.y},textAnchor="center",halfHeight=placement.height/2;switch(placement.side){case"y+":position4.y=shiftedAnchorPoint.y+halfHeight;break;case"y-":position4.y=shiftedAnchorPoint.y-halfHeight;break;case"x+":position4.x=shiftedAnchorPoint.x+halfHeight;break;case"x-":position4.x=shiftedAnchorPoint.x-halfHeight;break}if(stubTracePath&&stubTracePath.length===2){let[start,end]=stubTracePath;if(placement.axis==="x"){let extendsRight=end.x>start.x;textAnchor=extendsRight?"left":"right",position4.x+=extendsRight?-placement.width/2:placement.width/2}else{let extendsUp=end.y>start.y;textAnchor=extendsUp?"left":"right",position4.y+=extendsUp?-placement.width/2:placement.width/2}}stubTracePath&&stubTracePath.length===2&&(db22.schematic_trace.insert({source_trace_id:sourceTraceId,edges:[{from:stubTracePath[0],to:stubTracePath[1]}],junctions:[],subcircuit_connectivity_map_key:connKey,schematic_sheet_id:schematicSheetId}),db22.schematic_port.update(schematicPortIds[0],{is_connected:!0})),db22.schematic_text.insert({text:text2,source_trace_id:sourceTraceId,anchor:textAnchor,position:position4,rotation:placement.axis==="y"?VERTICAL_INLINE_NET_LABEL_ROTATION:0,font_size:placement.height,color:INLINE_NET_LABEL_COLOR,schematic_sheet_id:schematicSheetId})}}var NET_LABEL_TEXT_HEIGHT=.18,getNetLabelTextBounds=({center:center2,text:text2})=>{let halfWidth=getSchematicNetLabelTextWidth2({text:text2})/2,halfHeight=NET_LABEL_TEXT_HEIGHT/2;return{minX:center2.x-halfWidth,maxX:center2.x+halfWidth,minY:center2.y-halfHeight,maxY:center2.y+halfHeight}},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"}},debug9=(0,import_debug18.default)("Group_doInitialSchematicTraceRender"),isSameNet=(label,sourceNet)=>label.schematicNetLabel.source_net_id!=null&&label.schematicNetLabel.source_net_id===sourceNet.source_net_id,isUserDefinedNetLabelRedundantWithPlacement=(label,solverPlacement)=>isSameNet(label,solverPlacement.sourceNet)?label.schematicPortIds.some(id3=>solverPlacement.schematicPortIds.has(id3))?!0:label.schematicNetLabel.center?doBoundsOverlap(getNetLabelTextBounds({center:label.schematicNetLabel.center,text:label.schematicNetLabel.text}),solverPlacement.bounds):!1:!1;function applyNetLabelPlacements(args){let{group:group2,routedSchematicPortIdBySchematicPortId,solver,connKeyToSourceNet,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces,netLabels}=args,{db:db22}=group2.root,resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group2),netLabelPlacements=solver.inlineNetLabelSolver?.getOutput().netLabelPlacements??solver.netLabelNetLabelCollisionSolver?.getOutput().netLabelPlacements??solver.netLabelTraceCollisionSolver?.getOutput().netLabelPlacements??solver.netLabelPlacementSolver?.netLabelPlacements??solver.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],dedupedNetLabelPlacements=[],netLabelPlacementKeys=new Set;for(let placement of netLabelPlacements){let pinIds=[...placement.pinIds??[]].sort(),key=`${placement.globalConnNetId}|${pinIds.join("::")}|${placement.netId??""}`;if(netLabelPlacementKeys.has(key)){debug9(`skipping duplicate placement for "${placement.netId}" REASON:identical net label placement`);continue}netLabelPlacementKeys.add(key),dedupedNetLabelPlacements.push(placement)}let netLabelPlacementCountByGlobalNetId=new Map,routedPairKeysByGlobalNetId=new Map,globalNetIdsWithPortOnlyPlacements=new Set;for(let placement of dedupedNetLabelPlacements)netLabelPlacementCountByGlobalNetId.set(placement.globalConnNetId,(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)+1),(placement.pinIds?.length??0)>1&&(routedPairKeysByGlobalNetId.has(placement.globalConnNetId)||routedPairKeysByGlobalNetId.set(placement.globalConnNetId,new Set),routedPairKeysByGlobalNetId.get(placement.globalConnNetId).add(placement.pinIds.slice().sort().join("::"))),(placement.pinIds?.length??0)<=1&&globalNetIdsWithPortOnlyPlacements.add(placement.globalConnNetId);let globalConnMap=solver.mspConnectionPairSolver.globalConnMap,userDefinedNetLabels=netLabels.map(label=>{if(!label.schematic_net_label_id)return null;let dbLabel=db22.schematic_net_label.get(label.schematic_net_label_id);return dbLabel?{schematicNetLabel:dbLabel,schematicPortIds:label._getConnectedPorts().map(port=>port.schematic_port_id).filter(id3=>!!id3).map(id3=>routedSchematicPortIdBySchematicPortId.get(id3)??id3),shouldUseSchematicTraceSolver:label._parsedProps.schX===void 0&&label._parsedProps.schY===void 0}:null}).filter(label=>label!==null);for(let placement of dedupedNetLabelPlacements){debug9(`processing placement: ${placement.netId}`);let schPortIds=placement.pinIds.map(asSchematicPortId),placementSourceTraceId=(schPortIds.length===1?crossScopeSourceTraceIdBySchematicPortIdAndNetId.get(schPortIds[0])?.get(placement.netId??placement.globalConnNetId):void 0)??(schPortIds.length===1?sourceTraceIdByPortOnlyLabelSchematicPortId.get(schPortIds[0]):void 0),placementSourceTrace=placementSourceTraceId?db22.source_trace.get(placementSourceTraceId):void 0,placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id3=>userNetIdToConnKey.get(id3)),placementConnKey=placementSourceTrace?.subcircuit_connectivity_map_key??userNetIdToConnKey.get(placementUserNetId),orientation22=placement.orientation,anchor_side=oppositeSide2(orientation22),sourceNet;placementConnKey&&(sourceNet=connKeyToSourceNet.get(placementConnKey));let resolvedCanonicalNetLabel=placementConnKey?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:placementConnKey}):{name:placement.netId??placement.globalConnNetId,wasAssignedDisplayLabel:!1},canonicalNetLabel=placement.netLabelText?{name:placement.netLabelText,wasAssignedDisplayLabel:!0}:resolvedCanonicalNetLabel,schematicSheetId=group2._resolveSchematicSheetId(),schematicPort=db22.schematic_port.get(schPortIds[0]);schematicPort?.schematic_sheet_id&&(schematicSheetId=schematicPort.schematic_sheet_id);let anchor_position=placement.anchorPoint;if(schPortIds.length===1&&schPortIds[0]){let anchorSchPort=db22.schematic_port.get(schPortIds[0]);anchorSchPort?.center&&!anchorSchPort.is_connected&&(anchor_position=anchorSchPort.center)}if(schPortIds.some(schPortId=>schematicPortIdsWithPreExistingNetLabels.has(schPortId))){debug9(`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(id3=>schematicPortIdsWithRoutedTraces.has(id3)),hasSingleLabelPlacement=(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)<=1;if(!hasExplicitPortNetTrace&&!isPowerOrGroundNet&&hasRoutedTraceForPlacementPort&&hasSingleLabelPlacement){debug9(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed trace`);continue}let text22=canonicalNetLabel.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text22}),solverManagedUserNetLabel=userDefinedNetLabels.find(label=>label.shouldUseSchematicTraceSolver&&isSameNet(label,sourceNet)&&label.schematicPortIds.some(id3=>schPortIds.includes(id3)));if(solverManagedUserNetLabel){db22.schematic_net_label.update(solverManagedUserNetLabel.schematicNetLabel.schematic_net_label_id,{anchor_position,center:center22,anchor_side,schematic_sheet_id:schematicSheetId,source_trace_id:placementSourceTraceId});continue}if(!isPowerOrGroundNet){let solverPlacement={sourceNet,text:text22,schematicPortIds:new Set(schPortIds),bounds:getNetLabelTextBounds({center:center22,text:text22})};if(userDefinedNetLabels.some(label=>isUserDefinedNetLabelRedundantWithPlacement(label,solverPlacement)))continue}let netLabel2={text:text22,source_net_id:sourceNet.source_net_id,anchor_position,center:center22,anchor_side,schematic_sheet_id:schematicSheetId,source_trace_id:placementSourceTraceId};db22.schematic_net_label.insert(netLabel2);continue}let{name:text2,wasAssignedDisplayLabel}=canonicalNetLabel,shouldKeepRoutedPairLabel=(placement.pinIds?.length??0)>1&&(globalNetIdsWithPortOnlyPlacements.has(placement.globalConnNetId)||(routedPairKeysByGlobalNetId.get(placement.globalConnNetId)?.size??0)>1);if(!wasAssignedDisplayLabel&&!shouldKeepRoutedPairLabel&&schPortIds.some(schPortId=>schematicPortIdsWithRoutedTraces.has(schPortId))){debug9(`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:text2}),netLabel={text:text2,source_net_id:placementConnKey??placement.netId??placement.globalConnNetId,anchor_position,center:center2,anchor_side,schematic_sheet_id:schematicSheetId,source_trace_id:placementSourceTraceId};db22.schematic_net_label.insert(netLabel)}}var cross42=(ax22,ay22,bx22,by22)=>ax22*by22-ay22*bx22;function segmentIntersection(p13,p23,q13,q22,tol){let r23={x:p23.x-p13.x,y:p23.y-p13.y},s23={x:q22.x-q13.x,y:q22.y-q13.y},rxs=cross42(r23.x,r23.y,s23.x,s23.y),q_p={x:q13.x-p13.x,y:q13.y-p13.y},q_pxr=cross42(q_p.x,q_p.y,r23.x,r23.y);if(Math.abs(rxs)<tol&&Math.abs(q_pxr)<tol||Math.abs(rxs)<tol&&Math.abs(q_pxr)>=tol)return null;let t48=cross42(q_p.x,q_p.y,s23.x,s23.y)/rxs,u23=cross42(q_p.x,q_p.y,r23.x,r23.y)/rxs;return t48<-tol||t48>1+tol||u23<-tol||u23>1+tol?null:{x:p13.x+t48*r23.x,y:p13.y+t48*r23.y}}var TOL4=1e-6;function isHorizontalEdge(edge){let dx22=Math.abs(edge.to.x-edge.from.x),dy22=Math.abs(edge.to.y-edge.from.y);return dx22>=dy22}function length73(a22,b22){return Math.hypot(b22.x-a22.x,b22.y-a22.y)}function pointAt(a22,b22,t48){return{x:a22.x+(b22.x-a22.x)*t48,y:a22.y+(b22.y-a22.y)*t48}}function paramAlong(a22,b22,p23){let L22=length73(a22,b22);if(L22<TOL4)return 0;let t48=((p23.x-a22.x)*(b22.x-a22.x)+(p23.y-a22.y)*(b22.y-a22.y))/((b22.x-a22.x)*(b22.x-a22.x)+(b22.y-a22.y)*(b22.y-a22.y));return Math.max(0,Math.min(1,t48))*L22}function mergeIntervals(intervals,tol=TOL4){if(intervals.length===0)return intervals;intervals.sort((a22,b22)=>a22.start-b22.start);let merged=[],cur={...intervals[0]};for(let i23=1;i23<intervals.length;i23++){let nxt=intervals[i23];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 L22=length73(edge.from,edge.to);if(L22<TOL4||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d23=>({start:Math.max(0,d23-half),end:Math.min(L22,d23+half)})).filter(iv22=>iv22.end-iv22.start>TOL4),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir2={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d03,d13,isCrossing)=>{if(d13-d03<=TOL4)return;let t03=d03/L22,t110=d13/L22;result.push({from:pointAt(edge.from,edge.to,t03),to:pointAt(edge.from,edge.to,t110),...isCrossing?{is_crossing:!0}:{}})};for(let iv22 of intervals)iv22.start-cursor>TOL4&&addSeg(cursor,iv22.start,!1),addSeg(iv22.start,iv22.end,!0),cursor=iv22.end;return L22-cursor>TOL4&&addSeg(cursor,L22,!1),result.length>0?result:[edge]}function computeCrossings(traces,opts={}){let crossLen=opts.crossSegmentLength??.075,tol=opts.tolerance??TOL4,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 A22=traces[ti3];for(let ei3=0;ei3<A22.edges.length;ei3++){let eA22=A22.edges[ei3];for(let tj2=ti3;tj2<traces.length;tj2++){let B22=traces[tj2];for(let ej2=tj2===ti3?ei3+1:0;ej2<B22.edges.length;ej2++){let eB2=B22.edges[ej2];if(A22.connectivity_key!==void 0&&A22.connectivity_key===B22.connectivity_key)continue;let P23=segmentIntersection(eA22.from,eA22.to,eB2.from,eB2.to,tol);if(!P23)continue;let LA22=length73(eA22.from,eA22.to),LB2=length73(eB2.from,eB2.to);if(LA22<tol||LB2<tol)continue;let dA22=paramAlong(eA22.from,eA22.to,P23),dB3=paramAlong(eB2.from,eB2.to,P23),nearEndpointA=dA22<=tol||Math.abs(LA22-dA22)<=tol||Number.isNaN(dA22),nearEndpointB=dB3<=tol||Math.abs(LB2-dB3)<=tol||Number.isNaN(dB3);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA22),bIsHorizontal=isHorizontalEdge(eB2),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax22=Math.abs(eA22.to.x-eA22.from.x),ay22=Math.abs(eA22.to.y-eA22.from.y),bx22=Math.abs(eB2.to.x-eB2.from.x),by22=Math.abs(eB2.to.y-eB2.from.y),aScore=ax22-ay22,bScore=bx22-by22;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj2,edgeIdx:assignToA?ei3:ej2}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA22:dB3),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t48=>({source_trace_id:t48.source_trace_id,connectivity_key:t48.connectivity_key,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 uniqueSorted3=Array.from(new Set(splittingDistances.map(d23=>Number(d23.toFixed(6))))).sort((a22,b22)=>a22-b22),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted3,crossLen);out[ti3].edges.push(...split)}}return out}var TOL22=1e-6;function nearlyEqual2(a22,b22,tol=TOL22){return Math.abs(a22-b22)<=tol}function pointEq(a22,b22,tol=TOL22){return nearlyEqual2(a22.x,b22.x,tol)&&nearlyEqual2(a22.y,b22.y,tol)}function onSegment32(p23,a22,b22,tol=TOL22){let minX=Math.min(a22.x,b22.x)-tol,maxX=Math.max(a22.x,b22.x)+tol,minY=Math.min(a22.y,b22.y)-tol,maxY=Math.max(a22.y,b22.y)+tol;return p23.x<minX||p23.x>maxX||p23.y<minY||p23.y>maxY?!1:Math.abs((b22.x-a22.x)*(p23.y-a22.y)-(b22.y-a22.y)*(p23.x-a22.x))<=tol}function dedupePoints(points,tol=TOL22){let map=new Map;for(let p23 of points){let key=`${p23.x.toFixed(6)},${p23.y.toFixed(6)}`;map.has(key)||map.set(key,p23)}return Array.from(map.values())}function edgeVec(e211){return{x:e211.to.x-e211.from.x,y:e211.to.y-e211.from.y}}function isEndpointOfEdge(p23,e211,tol=TOL22){return pointEq(p23,e211.from,tol)||pointEq(p23,e211.to,tol)}function isParallel(e111,e211,tol=TOL22){let v13=edgeVec(e111),v23=edgeVec(e211),L13=Math.hypot(v13.x,v13.y),L22=Math.hypot(v23.x,v23.y);if(L13<tol||L22<tol)return!0;let cross52=v13.x*v23.y-v13.y*v23.x;return Math.abs(cross52)<=tol*L13*L22}function incidentEdgesAtPoint(trace,p23,tol=TOL22){return trace.edges.filter(e211=>pointEq(e211.from,p23,tol)||pointEq(e211.to,p23,tol))}function nearestEndpointOnTrace(trace,p23,tol=TOL22){for(let e211 of trace.edges){if(pointEq(e211.from,p23,tol))return e211.from;if(pointEq(e211.to,p23,tol))return e211.to}return null}function edgeDirectionFromPoint(e211,p23,tol=TOL22){let other=pointEq(e211.from,p23,tol)||nearlyEqual2(e211.from.x,p23.x,tol)&&nearlyEqual2(e211.from.y,p23.y,tol)?e211.to:e211.from,dx22=other.x-p23.x,dy22=other.y-p23.y;return Math.abs(dx22)<tol&&Math.abs(dy22)<tol?null:Math.abs(dx22)>=Math.abs(dy22)?dx22>=0?"right":"left":dy22>=0?"up":"down"}function getCornerOrientationAtPoint(trace,p23,tol=TOL22){let incident=incidentEdgesAtPoint(trace,p23,tol);if(incident.length<2)return null;let dirs=incident.map(e211=>edgeDirectionFromPoint(e211,p23,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??TOL22,result={};for(let t48 of traces)result[t48.source_trace_id]=[];let endpointsByTrace=traces.map(t48=>{let pts=[];for(let e211 of t48.edges)pts.push(e211.from,e211.to);return dedupePoints(pts,tol)});for(let i23=0;i23<traces.length;i23++){let A22=traces[i23],AEnds=endpointsByTrace[i23];for(let j22=i23+1;j22<traces.length;j22++){let B22=traces[j22],BEnds=endpointsByTrace[j22];if(A22.connectivity_key!==void 0&&A22.connectivity_key===B22.connectivity_key){for(let eA22 of A22.edges)for(let eB2 of B22.edges){let p23=segmentIntersection(eA22.from,eA22.to,eB2.from,eB2.to,tol);p23&&(isEndpointOfEdge(p23,eA22,tol)||isEndpointOfEdge(p23,eB2,tol)||(result[A22.source_trace_id].push(p23),A22.source_trace_id!==B22.source_trace_id&&result[B22.source_trace_id].push(p23)))}for(let pa3 of AEnds)for(let pb22 of BEnds)if(pointEq(pa3,pb22,tol)){let aEdgesAtP=incidentEdgesAtPoint(A22,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B22,pb22,tol),hasCorner=aEdgesAtP.some(eA22=>bEdgesAtP.some(eB2=>!isParallel(eA22,eB2,tol))),aCorner=getCornerOrientationAtPoint(A22,pa3,tol),bCorner=getCornerOrientationAtPoint(B22,pb22,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A22.source_trace_id].push(pa3),A22.source_trace_id!==B22.source_trace_id&&result[B22.source_trace_id].push(pb22))}for(let pa3 of AEnds)for(let eB2 of B22.edges)if(onSegment32(pa3,eB2.from,eB2.to,tol)){let hasCorner=incidentEdgesAtPoint(A22,pa3,tol).some(eA22=>!isParallel(eA22,eB2,tol)),aCorner=getCornerOrientationAtPoint(A22,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B22,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B22,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A22.source_trace_id].push(pa3),A22.source_trace_id!==B22.source_trace_id&&result[B22.source_trace_id].push(pa3))}for(let pb22 of BEnds)for(let eA22 of A22.edges)if(onSegment32(pb22,eA22.from,eA22.to,tol)){let hasCorner=incidentEdgesAtPoint(B22,pb22,tol).some(eB2=>!isParallel(eA22,eB2,tol)),bCorner=getCornerOrientationAtPoint(B22,pb22,tol),aEndpointNearPb=nearestEndpointOnTrace(A22,pb22,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A22,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B22.source_trace_id].push(pb22),A22.source_trace_id!==B22.source_trace_id&&result[A22.source_trace_id].push(pb22))}}}}for(let id3 of Object.keys(result))result[id3]=dedupePoints(result[id3],tol);return result}var TOL32=1e-6;function isCollinear(a22,b22,tol=TOL32){let adx=a22.to.x-a22.from.x,ady=a22.to.y-a22.from.y,bdx=b22.to.x-b22.from.x,bdy=b22.to.y-b22.from.y,aLen=Math.hypot(adx,ady),bLen=Math.hypot(bdx,bdy);if(aLen<=tol||bLen<=tol)return!1;let directionCross=adx*bdy-ady*bdx;if(Math.abs(directionCross)>tol*aLen*bLen)return!1;let offsetCross=adx*(b22.from.y-a22.from.y)-ady*(b22.from.x-a22.from.x);return Math.abs(offsetCross)<=tol*aLen}function splitEdgeAroundIntervals(edge,intervals){let merged=mergeIntervals(intervals);if(merged.length===0)return[edge];let edgeLength=length73(edge.from,edge.to);if(edgeLength<=TOL32)return[edge];let result=[],cursor=0;for(let interval of merged)interval.start-cursor>TOL32&&result.push({from:pointAt(edge.from,edge.to,cursor/edgeLength),to:pointAt(edge.from,edge.to,interval.start/edgeLength)}),interval.end-interval.start>TOL32&&result.push({from:pointAt(edge.from,edge.to,interval.start/edgeLength),to:pointAt(edge.from,edge.to,interval.end/edgeLength),is_crossing:!0}),cursor=Math.max(cursor,interval.end);return edgeLength-cursor>TOL32&&result.push({from:pointAt(edge.from,edge.to,cursor/edgeLength),to:edge.to}),result}function removeOverlappingSameNetCrossingSegments(traces){let intervalsToRemove=new Map;for(let crossingTraceIndex=0;crossingTraceIndex<traces.length;crossingTraceIndex++){let crossingTrace=traces[crossingTraceIndex];if(crossingTrace.connectivity_key){for(let crossingEdge of crossingTrace.edges)if(!(!crossingEdge.is_crossing||length73(crossingEdge.from,crossingEdge.to)<=TOL32))for(let traceIndex=0;traceIndex<traces.length;traceIndex++){let candidateTrace=traces[traceIndex];if(!(traceIndex===crossingTraceIndex||candidateTrace.connectivity_key!==crossingTrace.connectivity_key))for(let edgeIndex=0;edgeIndex<candidateTrace.edges.length;edgeIndex++){let candidateEdge=candidateTrace.edges[edgeIndex],candidateLength=length73(candidateEdge.from,candidateEdge.to);if(candidateEdge.is_crossing||candidateLength<=TOL32||!isCollinear(candidateEdge,crossingEdge))continue;let start=Math.max(0,Math.min(paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.from),paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.to))),end=Math.min(candidateLength,Math.max(paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.from),paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.to)));if(end-start<=TOL32)continue;let key=`${traceIndex}:${edgeIndex}`,intervals=intervalsToRemove.get(key)??[];intervals.push({start,end}),intervalsToRemove.set(key,intervals)}}}}return intervalsToRemove.size===0?traces:traces.map((trace,traceIndex)=>({...trace,edges:trace.edges.flatMap((edge,edgeIndex)=>{let intervals=intervalsToRemove.get(`${traceIndex}:${edgeIndex}`);return intervals?splitEdgeAroundIntervals(edge,intervals):[edge]})}))}var debug10=(0,import_debug19.default)("Group_doInitialSchematicTraceRender"),MAX_PIN_SNAP_GAP=1.5;function extendTraceEndpointsToReachPinsInsideExpandedBoundingBox(params,db22){let{points,schematicPortIds,componentBoundsByPortId}=params,centers=schematicPortIds.map(id3=>{let center2=db22.schematic_port.get(id3)?.center,bounds=componentBoundsByPortId.get(id3);return!center2||!bounds?null:{center:center2,bounds}}).filter(port=>!!port);if(centers.length===0)return points;let result=points.map(p23=>({x:p23.x,y:p23.y})),d23=(a22,b22)=>(a22.x-b22.x)**2+(a22.y-b22.y)**2,usedCenters=new Set;for(let i23=0;i23<centers.length;i23++)result.some(p23=>d23(centers[i23].center,p23)<=1e-12)&&usedCenters.add(i23);let ALIGN_EPS=.001,endpoints=["start","end"],candidates=[];for(let endpoint of endpoints){let endpointPoint=endpoint==="start"?result[0]:result[result.length-1];for(let i23=0;i23<centers.length;i23++){if(usedCenters.has(i23))continue;let{center:center2,bounds}=centers[i23],dist4=d23(center2,endpointPoint);Math.abs(center2.x-endpointPoint.x)>ALIGN_EPS&&Math.abs(center2.y-endpointPoint.y)>ALIGN_EPS||dist4>MAX_PIN_SNAP_GAP**2&&pointToBoundsDistance(endpointPoint,bounds)>ALIGN_EPS||candidates.push({endpoint,centerIndex:i23,dist:dist4})}}candidates.sort((a22,b22)=>a22.dist-b22.dist);let usedEndpoints=new Set;for(let{endpoint,centerIndex,dist:dist4}of candidates){if(usedEndpoints.has(endpoint)||usedCenters.has(centerIndex)||(usedCenters.add(centerIndex),usedEndpoints.add(endpoint),dist4<=1e-12))continue;let center2=centers[centerIndex].center;endpoint==="start"?result.unshift({x:center2.x,y:center2.y}):result.push({x:center2.x,y:center2.y})}return result}function applyTracesFromSolverOutput(args){let{group:group2,solver,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}=args,{db:db22}=group2.root,customSymbolPortIds=new Set(group2.selectAll("port").filter(port=>{if(!port._getSymbolAncestor())return!1;let symbol=port.getParentNormalComponent()?._parsedProps.symbol;return(0,import_react9.isValidElement)(symbol)||isCircuitJsonSymbol(symbol)}).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId)),componentBoundsByPortId=new Map;for(let schematicComponent of db22.schematic_component.list()){let textInclusiveBounds=getSchematicComponentWithTextBounds({db:db22,schematicComponent}),componentBounds=getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height});for(let port of db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id})){let isInsideComponentBounds=port.center.x>componentBounds.minX&&port.center.x<componentBounds.maxX&&port.center.y>componentBounds.minY&&port.center.y<componentBounds.maxY,schematicPortId=asSchematicPortId(port.schematic_port_id);!textInclusiveBounds&&!customSymbolPortIds.has(schematicPortId)||!textInclusiveBounds&&isInsideComponentBounds||componentBoundsByPortId.set(schematicPortId,textInclusiveBounds??componentBounds)}}let traces=solver.inlineNetLabelSolver?.getOutput().traces??solver.sameNetJunctionAlignmentSolver?.getOutput().traces??solver.netLabelTraceCollisionSolver?.getOutput().traces??solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug10(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let solvedTraceSchematicPortIds=Array.from(new Set(solvedTracePath.pinIds??[])).map(asSchematicPortId);if(solvedTraceSchematicPortIds.length>0&&solvedTraceSchematicPortIds.every(id3=>schematicPortIdsWithPreExistingNetLabels.has(id3))){debug10(`Skipping solver netlabel-covered trace ${solvedTracePath?.mspPairId} because all schematic ports already have netlabels`);continue}let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug10(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let snappedPoints=extendTraceEndpointsToReachPinsInsideExpandedBoundingBox({points,schematicPortIds:solvedTraceSchematicPortIds,componentBoundsByPortId},db22),edges=[];for(let i23=0;i23<snappedPoints.length-1;i23++)edges.push({from:{x:snappedPoints[i23].x,y:snappedPoints[i23].y},to:{x:snappedPoints[i23+1].x,y:snappedPoints[i23+1].y}});let source_trace_id=String(solvedTracePath?.mspPairId),subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let firstPinId=solvedTracePath.pins[0]?.pinId,secondPinId=solvedTracePath.pins[1]?.pinId,pA22=firstPinId?asSchematicPortId(firstPinId):void 0,pB2=secondPinId?asSchematicPortId(secondPinId):void 0;if(pA22&&pB2){let routedSchematicPortIds=new Set([pA22,pB2]);for(let routedSchematicPortId of routedSchematicPortIds)db22.schematic_port.update(routedSchematicPortId,{is_connected:!0});subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))}}if(subcircuit_connectivity_map_key||(subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))),!subcircuit_connectivity_map_key){let sourcePortConnKeys=solvedTraceSchematicPortIds.map(schematicPortId=>{let sourcePortId=db22.schematic_port.get(schematicPortId)?.source_port_id;if(sourcePortId)return db22.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key}).filter(key=>!!key);new Set(sourcePortConnKeys).size===1&&(subcircuit_connectivity_map_key=sourcePortConnKeys[0])}let endpointSchematicSheetIds=new Set(solvedTraceSchematicPortIds.map(schematicPortId=>db22.schematic_port.get(schematicPortId)?.schematic_sheet_id).filter(sheetId=>!!sheetId)),schematicSheetId2;endpointSchematicSheetIds.size===1?schematicSheetId2=endpointSchematicSheetIds.values().next().value:endpointSchematicSheetIds.size===0&&(schematicSheetId2=group2._resolveSchematicSheetId()),pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key,schematic_sheet_id:schematicSheetId2})}debug10(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t48=>({source_trace_id:t48.source_trace_id,edges:t48.edges,connectivity_key:t48.subcircuit_connectivity_map_key}))),existingTracesForJunctions=[],schematicSheetId=group2._resolveSchematicSheetId();for(let t48 of db22.schematic_trace.list()){if(t48.edges.length===0||t48.schematic_sheet_id!==schematicSheetId)continue;let sourceTrace=t48.source_trace_id?db22.source_trace.get(t48.source_trace_id):void 0;existingTracesForJunctions.push({schematic_trace_id:t48.schematic_trace_id,source_trace_id:t48.source_trace_id??t48.schematic_trace_id,edges:t48.edges,connectivity_key:t48.subcircuit_connectivity_map_key??sourceTrace?.subcircuit_connectivity_map_key})}let tracesWithTrimmedCrossingOverlaps=removeOverlappingSameNetCrossingSegments([...withCrossings,...existingTracesForJunctions]),visibleTraces=tracesWithTrimmedCrossingOverlaps.slice(0,withCrossings.length),visibleExistingTraces=tracesWithTrimmedCrossingOverlaps.slice(withCrossings.length);for(let trace of visibleExistingTraces)trace.schematic_trace_id&&db22.schematic_trace.update(trace.schematic_trace_id,{edges:trace.edges});let junctionsById=computeJunctions([...visibleTraces,...visibleExistingTraces]);for(let t48 of visibleTraces){let pendingTrace=pendingTraces.find(pendingTrace2=>pendingTrace2.source_trace_id===t48.source_trace_id),traceSchematicSheetId=schematicSheetId;pendingTrace?.schematic_sheet_id&&(traceSchematicSheetId=pendingTrace.schematic_sheet_id),db22.schematic_trace.insert({source_trace_id:t48.source_trace_id,edges:t48.edges,junctions:junctionsById[t48.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTrace?.subcircuit_connectivity_map_key,schematic_sheet_id:traceSchematicSheetId})}}var INLINE_NET_LABEL_FONT_SIZE=.12,markConnectionEligibleForInlineNetLabel=(connection,name)=>{connection.anchoredNetLabelWidth??(connection.anchoredNetLabelWidth=Number(getSchematicNetLabelTextWidth2({text:name}).toFixed(2))),connection.allowInlineNetLabel=!0,connection.inlineNetLabelHeight=INLINE_NET_LABEL_FONT_SIZE,connection.inlineNetLabelWidth=Number(getSchematicNetLabelTextWidth2({text:name,font_size:INLINE_NET_LABEL_FONT_SIZE}).toFixed(2))},applyInlineNetLabelEligibility=({directConnections,netConnections,connKeyToSchematicPortIds,connKeyToSourceNet,connKeysWithExplicitPortNetTraces,schematicPortIdsWithExplicitNetLabels,schematicPortIdsWithInlineNetLabels,areSchematicPortsOnDifferentComponents,resolveCanonicalNetLabelText})=>{for(let directConnection of directConnections){let{connKey}=directConnection;if(!connKey||connKeyToSchematicPortIds.get(connKey)?.length!==2)continue;let sourceNet=connKeyToSourceNet.get(connKey);if(sourceNet?.is_power||sourceNet?.is_ground)continue;let{name,wasAssignedDisplayLabel}=resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey});!name||!wasAssignedDisplayLabel||markConnectionEligibleForInlineNetLabel(directConnection,name)}for(let netConnection of netConnections){let{schematicPortIds}=netConnection,{isSameSheetCrossSectionConnection}=netConnection,hasInlineNetLabel=schematicPortIds.some(schematicPortId=>schematicPortIdsWithInlineNetLabels.has(schematicPortId)),isSinglePort=schematicPortIds.length===1,firstSchematicPortId=schematicPortIds[0],hasPortsOnDifferentComponents=firstSchematicPortId!==void 0&&schematicPortIds.slice(1).some(otherSchematicPortId=>areSchematicPortsOnDifferentComponents([firstSchematicPortId,otherSchematicPortId]));if(!hasInlineNetLabel&&!isSameSheetCrossSectionConnection&&!isSinglePort&&!hasPortsOnDifferentComponents||!hasInlineNetLabel&&schematicPortIds.some(schematicPortId=>schematicPortIdsWithExplicitNetLabels.has(schematicPortId)))continue;let{connKey}=netConnection;if(!connKey&&!isSameSheetCrossSectionConnection||connKey&&!isSameSheetCrossSectionConnection&&!connKeysWithExplicitPortNetTraces.has(connKey))continue;let sourceNet=connKey?connKeyToSourceNet.get(connKey):void 0;if(!hasInlineNetLabel&&(netConnection.isPowerOrGroundConnection||sourceNet?.is_power||sourceNet?.is_ground))continue;let name=netConnection.netLabelText??"",wasAssignedDisplayLabel=!!name;if(!isSameSheetCrossSectionConnection){if(!connKey)continue;let resolvedLabel=resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey});name=resolvedLabel.name,wasAssignedDisplayLabel=resolvedLabel.wasAssignedDisplayLabel}!name||!hasInlineNetLabel&&!wasAssignedDisplayLabel||markConnectionEligibleForInlineNetLabel(netConnection,name)}},getPortForSchematicSymbolPort=port=>{let{schX,schY}=port._parsedProps;if(schX!==void 0&&schY!==void 0||!port.getParentNormalComponent()?.getSchematicSymbol())return port;let internallyConnectedPorts=port._getPortsInternallyConnectedToThisPort(),schematicSymbolPortDef=port.schematicSymbolPortDef??internallyConnectedPorts.find(connectedPort=>connectedPort.schematicSymbolPortDef)?.schematicSymbolPortDef;return schematicSymbolPortDef?internallyConnectedPorts.find(connectedPort=>connectedPort.schematicSymbolPortDef===schematicSymbolPortDef)??port:port};function createRoutedSchematicPortIdMap(group2){let{db:db22}=group2.root,routedSchematicPortIdBySchematicPortId=new Map;for(let port of group2.selectAll("port")){if(!port.schematic_port_id)continue;let schematicPort=db22.schematic_port.get(port.schematic_port_id),terminalPort=getPortForSchematicSymbolPort(port),terminalSchematicPort=terminalPort.schematic_port_id?db22.schematic_port.get(terminalPort.schematic_port_id):void 0;!schematicPort||!terminalSchematicPort||schematicPort.schematic_component_id!==terminalSchematicPort.schematic_component_id||schematicPort.schematic_sheet_id!==terminalSchematicPort.schematic_sheet_id||routedSchematicPortIdBySchematicPortId.set(asSchematicPortId(schematicPort.schematic_port_id),asSchematicPortId(terminalSchematicPort.schematic_port_id))}return routedSchematicPortIdBySchematicPortId}var isDirectConnectionEndpointOutsideSchematicScope=({db:db22,sourcePortId,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId})=>{if(sourcePortIdsInSchematicScope.has(otherSourcePortId))return!1;let sourcePort=db22.source_port.get(sourcePortId),otherSourcePort=db22.source_port.get(otherSourcePortId);if(!sourcePort||!otherSourcePort)return!1;if(sourcePort.subcircuit_id!==otherSourcePort.subcircuit_id)return!0;if(!schematicSheetId)return!1;let otherEndpointSchematicPorts=db22.schematic_port.list({source_port_id:otherSourcePortId});return otherEndpointSchematicPorts.some(schematicPort=>schematicPort.schematic_sheet_id===schematicSheetId)?!1:otherEndpointSchematicPorts.some(schematicPort=>schematicPort.schematic_sheet_id!==void 0)},getDirectConnectionOutsideSchematicScopeSourcePortId=({db:db22,sourcePortId,sourcePortIdsInSchematicScope,schematicSheetId})=>{if(db22.source_port.get(sourcePortId))for(let sourceTrace of db22.source_trace.list()){let connectedSourcePortIds=(sourceTrace.connected_source_port_ids??[]).map(asSourcePortId);if(connectedSourcePortIds.length!==2||(sourceTrace.connected_source_net_ids??[]).length>0||!connectedSourcePortIds.includes(sourcePortId))continue;let otherSourcePortId=connectedSourcePortIds.find(portId=>portId!==sourcePortId);if(otherSourcePortId&&isDirectConnectionEndpointOutsideSchematicScope({db:db22,sourcePortId,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId}))return otherSourcePortId}},resolveNetLabelForPortMissingTrace=({group:group2,sourcePortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId,connKey,sourceNet})=>{let{db:db22}=group2.root,connectedPortsForKey=group2.selectAll("port").filter(port=>port._getSubcircuitConnectivityKey()===connKey),{name:resolvedPortNetLabelText,wasAssignedDisplayLabel}=getNetNameFromPorts(connectedPortsForKey),assignedPortNetLabelText=wasAssignedDisplayLabel?resolvedPortNetLabelText:void 0,fallbackPortNetLabelText=wasAssignedDisplayLabel?void 0:resolvedPortNetLabelText||void 0,implicitPortLabelText=getNetNameFromSourcePorts(db22,connectedSourcePortIdsForKey),directConnectionOutsideSchematicScopeSourcePortId=getDirectConnectionOutsideSchematicScopeSourcePortId({db:db22,sourcePortId,sourcePortIdsInSchematicScope,schematicSheetId}),directConnectionOutsideSchematicScopeLabelText=directConnectionOutsideSchematicScopeSourcePortId?getSourcePortNetLabelText(db22,directConnectionOutsideSchematicScopeSourcePortId):void 0;return{text:sourceNet?.name||sourceNet?.source_net_id||assignedPortNetLabelText||directConnectionOutsideSchematicScopeLabelText||fallbackPortNetLabelText||implicitPortLabelText||connKey,wasAssignedDisplayLabel,directConnectionOutsideSchematicScopeSourcePortId}},ASCII_ADVANCES=[28,28,35,56,56,89,67,19,33,33,39,58,28,33,28,28,56,56,56,56,56,56,56,56,56,56,28,28,58,58,58,56,102,67,67,72,72,67,61,78,72,28,50,67,56,83,72,78,67,78,72,67,61,72,67,94,67,67,61,28,28,28,47,56,33,56,56,50,56,56,28,56,56,22,22,50,22,83,56,56,56,56,33,50,28,56,50,72,50,50,50,33,26,33,58];function getSchematicTextObstacleWidth({text:text2,fontSize}){let totalAdvance=0;for(let character of text2){let advance2=ASCII_ADVANCES[character.charCodeAt(0)-32];if(advance2===void 0)return getSchematicTextWidth2({text:text2,fontSize});totalAdvance+=advance2}return totalAdvance*(fontSize/100)}var DEFAULT_SCHEMATIC_TEXT_FONT_SIZE=.18;function getSchematicTextBounds2(text2){let fontSize=text2.font_size??DEFAULT_SCHEMATIC_TEXT_FONT_SIZE,width=getSchematicTextObstacleWidth({text:text2.text??"",fontSize}),height=fontSize,anchor3=text2.anchor??"center",minX,maxX;anchor3.includes("left")?(minX=0,maxX=width):anchor3.includes("right")?(minX=-width,maxX=0):(minX=-width/2,maxX=width/2);let minY,maxY;anchor3.includes("top")?(minY=-height,maxY=0):anchor3.includes("bottom")?(minY=0,maxY=height):(minY=-height/2,maxY=height/2);let rotation5=(text2.rotation??0)*Math.PI/180,cos32=Math.cos(rotation5),sin32=Math.sin(rotation5),corners=[{x:minX,y:minY},{x:minX,y:maxY},{x:maxX,y:minY},{x:maxX,y:maxY}].map(corner=>({x:text2.position.x+corner.x*cos32-corner.y*sin32,y:text2.position.y+corner.x*sin32+corner.y*cos32}));return getBoundsFromPoints(corners)}var REFDES_TEXT_BOX_CHIP_OVERLAP=.01,REFDES_TEXT_BOX_CLEARANCE=.06;function isReferenceDesignatorText(text2,sourceComponent){return sourceComponent?text2.text===sourceComponent.display_name||text2.text===sourceComponent.name:!1}function schematicTextToTextBox(text2,options={}){if(!text2.text)return null;let bounds=getSchematicTextBounds2(text2);if(isReferenceDesignatorText(text2,options.sourceComponent)&&options.schematicComponent?.center&&options.schematicComponent?.size){let componentBounds=getBoundFromCenteredRect({center:options.schematicComponent.center,width:options.schematicComponent.size.width,height:options.schematicComponent.size.height}),textHeight=bounds.maxY-bounds.minY;bounds.minY>componentBounds.maxY&&(bounds.minX-=REFDES_TEXT_BOX_CLEARANCE,bounds.maxX+=REFDES_TEXT_BOX_CLEARANCE,bounds.minY=componentBounds.maxY-REFDES_TEXT_BOX_CHIP_OVERLAP,bounds.maxY=componentBounds.maxY+textHeight+REFDES_TEXT_BOX_CLEARANCE)}return{chipId:text2.schematic_component_id,center:getBoundsCenter(bounds),width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY,text:text2.text}}var DEFAULT_MAX_MSP_PAIR_DISTANCE2=2.4,SCHEMATIC_RAIL_NET_LABEL_HEIGHT=.42;function createSchematicTraceSolverInputProblem(group2,opts={}){let{db:db22}=group2.root,routedSchematicPortIdBySchematicPortId=createRoutedSchematicPortIdMap(group2),resolveRoutedSchematicPortId=schematicPortId=>routedSchematicPortIdBySchematicPortId.get(schematicPortId)??schematicPortId,sourcePortConnectivityMap=getSourcePortConnectivityMapFromCircuitJson(db22.toArray()),getStableSourceConnectivityNetId=connectivityNetId=>{let canonicalSourceId=[...sourcePortConnectivityMap.getIdsConnectedToNet(connectivityNetId)].sort()[0];return canonicalSourceId?`source_connectivity_${canonicalSourceId}`:`source_${connectivityNetId}`},getSourceConnectivityNetId=sourceTrace=>{let connectivityNetId=[...sourceTrace.connected_source_port_ids,...sourceTrace.connected_source_net_ids].map(sourceId=>sourcePortConnectivityMap.getNetConnectedToId(sourceId)).find(netId=>!!netId);return connectivityNetId?getStableSourceConnectivityNetId(connectivityNetId):sourceTrace.subcircuit_connectivity_map_key??sourceTrace.source_trace_id},powerOrGroundSourceConnectivityNetIds=new Set;for(let sourceNet of db22.source_net.list()){if(!sourceNet.is_power&&!sourceNet.is_ground)continue;let connectivityNetId=sourcePortConnectivityMap.getNetConnectedToId(sourceNet.source_net_id);connectivityNetId&&powerOrGroundSourceConnectivityNetIds.add(getStableSourceConnectivityNetId(connectivityNetId))}let connKeyToSourceNet=new Map,childGroups=[],componentsToVisit=[...group2.children].reverse();for(;componentsToVisit.length>0;){let child=componentsToVisit.pop();if(child instanceof Group5){if(child.isSubcircuit){child._parsedProps.showAsSchematicBox&&childGroups.push(child);continue}childGroups.push(child)}componentsToVisit.push(...[...child.children].reverse())}let allSchematicGroupIds=[group2.schematic_group_id,...childGroups.map(a22=>a22.schematic_group_id)],schematicComponents=db22.schematic_component.list().filter(component=>allSchematicGroupIds.includes(component.schematic_group_id)).filter(component=>opts.schematicSheetId===void 0||component.schematic_sheet_id===opts.schematicSheetId),schematicComponentIds=new Set(schematicComponents.map(component=>component.schematic_component_id)),schematicComponentsById=new Map(schematicComponents.map(component=>[component.schematic_component_id,component])),textBoxes=db22.schematic_text.list().filter(text2=>text2.schematic_component_id&&schematicComponentIds.has(text2.schematic_component_id)).map(text2=>{let schematicComponent=schematicComponentsById.get(text2.schematic_component_id);if(!schematicComponent)return;let sourceComponent=db22.source_component.get(schematicComponent.source_component_id);return schematicTextToTextBox(text2,{schematicComponent,sourceComponent})}).filter(textBox=>!!textBox),sectionIdBySchematicComponentId=new Map,boardDescendants=group2._getBoard()?.getDescendants()??[];for(let component of boardDescendants){let schematicComponentId=component.schematic_component_id,sectionId=component.getSchematicSectionName();schematicComponentId&&sectionId&&sectionIdBySchematicComponentId.set(schematicComponentId,sectionId)}let chips=[];for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,schematicPorts=db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),pins=schematicPorts.filter(schematicPort=>{let id3=asSchematicPortId(schematicPort.schematic_port_id);return resolveRoutedSchematicPortId(id3)===id3}).map(schematicPort=>{let schematicPortId=asSchematicPortId(schematicPort.schematic_port_id),sourcePort=schematicPort.source_port_id?db22.source_port.get(schematicPort.source_port_id):void 0;return{pinId:schematicPortId,displayName:schematicPort.display_pin_label??schematicPort.pin_number?.toString()??sourcePort?.name,x:schematicPort.center.x,y:schematicPort.center.y,_facingDirection:convertFacingDirectionToElbowDirection(schematicPort.facing_direction??null)}}),sectionId=sectionIdBySchematicComponentId.get(schematicComponent.schematic_component_id),obstacleBounds=(schematicComponent.is_box_with_pins===!1?void 0:getSchematicComponentWithTextBounds({db:db22,schematicComponent}))??getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height});for(let port of schematicPorts)obstacleBounds.minX=Math.min(obstacleBounds.minX,port.center.x),obstacleBounds.maxX=Math.max(obstacleBounds.maxX,port.center.x),obstacleBounds.minY=Math.min(obstacleBounds.minY,port.center.y),obstacleBounds.maxY=Math.max(obstacleBounds.maxY,port.center.y);chips.push({chipId,center:getBoundsCenter(obstacleBounds),width:obstacleBounds.maxX-obstacleBounds.minX,height:obstacleBounds.maxY-obstacleBounds.minY,pins,sectionId})}let schematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToConnKey=new Map,componentPortBySchematicPortId=new Map(group2.selectAll("port").filter(port=>port.schematic_port_id).map(port=>[asSchematicPortId(port.schematic_port_id),port])),resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group2);for(let sc3 of schematicComponents){let ports=db22.schematic_port.list({schematic_component_id:sc3.schematic_component_id});for(let sp22 of ports){let schematicPortId=asSchematicPortId(sp22.schematic_port_id);if(schematicPortIdsInScope.add(schematicPortId),sp22.source_port_id){let sourcePortId=asSourcePortId(sp22.source_port_id);schPortIdToSourcePortId.set(schematicPortId,sourcePortId),sourcePortIdToSchPortId.set(sourcePortId,schematicPortId)}}}let sourcePortIdsInSchematicScope=new Set(sourcePortIdToSchPortId.keys()),netLabelsInScope=(opts.netLabels??[]).filter(netLabel=>netLabel._getConnectedPorts().some(port=>port.schematic_port_id?schematicPortIdsInScope.has(asSchematicPortId(port.schematic_port_id)):!1)),schematicPortIdsWithExplicitNetLabels=new Set(netLabelsInScope.filter(netLabel=>!netLabel._parsedProps.inline).flatMap(netLabel=>netLabel._getConnectedPorts()).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId).map(resolveRoutedSchematicPortId)),solverManagedNetLabelSchematicPortIds=new Set(netLabelsInScope.filter(netLabel=>netLabel._parsedProps.inline||netLabel._parsedProps.schX===void 0&&netLabel._parsedProps.schY===void 0).flatMap(netLabel=>netLabel._getConnectedPorts()).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId).map(resolveRoutedSchematicPortId)),schematicPortIdsWithInlineNetLabels=new Set(netLabelsInScope.filter(netLabel=>netLabel._parsedProps.inline).flatMap(netLabel=>netLabel._getConnectedPorts()).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId).map(resolveRoutedSchematicPortId)),allowedSubcircuitIds=new Set;group2.subcircuit_id&&allowedSubcircuitIds.add(group2.subcircuit_id);for(let cg2 of childGroups)cg2.subcircuit_id&&allowedSubcircuitIds.add(cg2.subcircuit_id);let tracesInScope=db22.source_trace.list().filter(st22=>{if(st22.subcircuit_id===group2.subcircuit_id)return!0;for(let source_port_id of st22.connected_source_port_ids)if(sourcePortIdToSchPortId.has(asSourcePortId(source_port_id)))return!0;return!1}),schematicPortIdsWithExternallyRoutedRepresentations=new Set;for(let sourceTrace of tracesInScope)if(sourceTrace.subcircuit_id!==group2.subcircuit_id&&sourceTrace.connected_source_net_ids.length!==0)for(let sourcePortId of sourceTrace.connected_source_port_ids){let typedSourcePortId=asSourcePortId(sourcePortId),schematicPortId=sourcePortIdToSchPortId.get(typedSourcePortId);!schematicPortId||solverManagedNetLabelSchematicPortIds.has(schematicPortId)||!db22.schematic_port.list({source_port_id:sourcePortId}).some(port=>port.schematic_port_id===schematicPortId?!1:(port.schematic_component_id?db22.schematic_component.get(port.schematic_component_id):void 0)?.schematic_sheet_id===opts.schematicSheetId)||schematicPortIdsWithExternallyRoutedRepresentations.add(schematicPortId)}let externalNetIds=tracesInScope.flatMap(st22=>st22.connected_source_net_ids);for(let netId of externalNetIds){let net=db22.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}for(let net of db22.source_net.list().filter(sourceNet=>!sourceNet.subcircuit_id||allowedSubcircuitIds.has(sourceNet.subcircuit_id)))net.subcircuit_connectivity_map_key&&connKeyToSourceNet.set(net.subcircuit_connectivity_map_key,net);let directConnections=[],boundaryTraceNetConnections=[],connectedPairKeys=new Set,crossScopeSourceTraceIdBySchematicPortIdAndNetId=new Map,crossSectionNetConnectionByKey=new Map,setCrossScopeSourceTraceId=({schematicPortId,netId,sourceTraceId,replaceExisting=!1})=>{let sourceTraceIdByNetId=crossScopeSourceTraceIdBySchematicPortIdAndNetId.get(schematicPortId)??new Map;return sourceTraceIdByNetId.has(netId)&&!replaceExisting?!1:(sourceTraceIdByNetId.set(netId,sourceTraceId),crossScopeSourceTraceIdBySchematicPortIdAndNetId.set(schematicPortId,sourceTraceIdByNetId),!0)},addPortToCrossSectionInlineNetConnection=({sourceConnectivityNetId,schematicPortId,text:text2,sourceTraceId,connKey,preferInScopeTraceMetadata=!1})=>{let netId=sourceConnectivityNetId;if(setCrossScopeSourceTraceId({schematicPortId,netId,sourceTraceId,replaceExisting:preferInScopeTraceMetadata}),schematicPortIdsWithExplicitNetLabels.has(schematicPortId))return;let connection=crossSectionNetConnectionByKey.get(sourceConnectivityNetId);connection?preferInScopeTraceMetadata&&(connection.netLabelText=text2,connection.netLabelWidth=Number(getSchematicNetLabelTextWidth2({text:text2}).toFixed(2)),connection.connKey=connKey??connection.connKey):(connection={netId,netLabelText:text2,schematicPortIds:[],netLabelWidth:Number(getSchematicNetLabelTextWidth2({text:text2}).toFixed(2)),connKey,isSameSheetCrossSectionConnection:!0,isPowerOrGroundConnection:powerOrGroundSourceConnectivityNetIds.has(netId)},crossSectionNetConnectionByKey.set(sourceConnectivityNetId,connection),boundaryTraceNetConnections.push(connection)),connection.schematicPortIds.includes(schematicPortId)||connection.schematicPortIds.push(schematicPortId)},sourceTraceIdsByPortOnlyLabelSchematicPortId=new Map,sourceTraceIdByPinPairKey=new Map,connKeysWithExplicitPortNetTraces=new Set;for(let sourceTrace of tracesInScope)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);let areSchematicPortsInDifferentSectionsOnSameSheet=(firstSchematicPortId,secondSchematicPortId)=>{let firstSchematicPort=db22.schematic_port.get(firstSchematicPortId),secondSchematicPort=db22.schematic_port.get(secondSchematicPortId);if(!firstSchematicPort||!secondSchematicPort||!(firstSchematicPort.schematic_sheet_id===secondSchematicPort.schematic_sheet_id))return!1;let firstSectionId=firstSchematicPort.schematic_component_id?sectionIdBySchematicComponentId.get(firstSchematicPort.schematic_component_id):void 0,secondSectionId=secondSchematicPort.schematic_component_id?sectionIdBySchematicComponentId.get(secondSchematicPort.schematic_component_id):void 0;return firstSectionId!==secondSectionId&&(firstSectionId!==void 0||secondSectionId!==void 0)},doesSourcePortCrossSectionOnSameSheet=({schematicPortId,otherSourcePortId})=>db22.schematic_port.list({source_port_id:otherSourcePortId}).some(otherSchematicPort=>areSchematicPortsInDifferentSectionsOnSameSheet(schematicPortId,asSchematicPortId(otherSchematicPort.schematic_port_id)));for(let st22 of tracesInScope){let connected=Array.from(new Set((st22.connected_source_port_ids??[]).map(sourcePortId=>sourcePortIdToSchPortId.get(asSourcePortId(sourcePortId))).filter(schematicPortId=>!!schematicPortId&&schematicPortIdsInScope.has(schematicPortId)).map(resolveRoutedSchematicPortId))),sourcePortIdForSingleConnectedEndpoint=connected.length===1?schPortIdToSourcePortId.get(connected[0]):void 0,otherSourcePortId=sourcePortIdForSingleConnectedEndpoint?st22.connected_source_port_ids.map(asSourcePortId).find(sourcePortId=>sourcePortId!==sourcePortIdForSingleConnectedEndpoint):void 0,crossesSchematicScopeBoundary=!!(sourcePortIdForSingleConnectedEndpoint&&otherSourcePortId&&isDirectConnectionEndpointOutsideSchematicScope({db:db22,sourcePortId:sourcePortIdForSingleConnectedEndpoint,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId:opts.schematicSheetId})),crossesSchematicSectionOnSameSheet=!!(connected.length===1&&otherSourcePortId&&doesSourcePortCrossSectionOnSameSheet({schematicPortId:connected[0],otherSourcePortId}));if(connected.length===1&&st22.connected_source_port_ids.length===2&&crossesSchematicScopeBoundary&&st22.connected_source_net_ids.length===0&&st22.subcircuit_connectivity_map_key){let schematicPortId=connected[0],sourcePortId=schPortIdToSourcePortId.get(schematicPortId);if(sourcePortId){let connKey=st22.subcircuit_connectivity_map_key,sourcePortConnKey=db22.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key,sourceNetInCurrentSubcircuit=db22.source_net.list().find(sourceNet=>sourceNet.subcircuit_id===group2.subcircuit_id&&sourcePortConnectivityMap.areIdsConnected(sourceNet.source_net_id,sourcePortId)),sourceNetForLabel=connKeyToSourceNet.get(connKey)??(sourcePortConnKey?connKeyToSourceNet.get(sourcePortConnKey):void 0)??sourceNetInCurrentSubcircuit,connectedSourcePortIdsForKey=Array.from(schematicPortIdsInScope).map(portId=>schPortIdToSourcePortId.get(portId)).filter(sourcePortId2=>sourcePortId2?db22.source_port.get(sourcePortId2)?.subcircuit_connectivity_map_key===connKey:!1),{text:text2}=resolveNetLabelForPortMissingTrace({group:group2,sourcePortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId:opts.schematicSheetId,connKey,sourceNet:sourceNetForLabel});if(text2){let sourceConnectivityNetId=getSourceConnectivityNetId(st22);userNetIdToConnKey.has(sourceConnectivityNetId)||userNetIdToConnKey.set(sourceConnectivityNetId,connKey),crossesSchematicSectionOnSameSheet?addPortToCrossSectionInlineNetConnection({sourceConnectivityNetId,schematicPortId,text:text2,sourceTraceId:st22.source_trace_id,connKey}):setCrossScopeSourceTraceId({schematicPortId,netId:sourceConnectivityNetId,sourceTraceId:st22.source_trace_id})&&boundaryTraceNetConnections.push({netId:sourceConnectivityNetId,netLabelText:text2,schematicPortIds:[schematicPortId],netLabelWidth:Number(getSchematicNetLabelTextWidth2({text:text2}).toFixed(2)),connKey})}}}else if(connected.length>=2){for(let schematicPortId of connected){let sourceTraceIds=sourceTraceIdsByPortOnlyLabelSchematicPortId.get(schematicPortId)??new Set;sourceTraceIds.add(st22.source_trace_id),sourceTraceIdsByPortOnlyLabelSchematicPortId.set(schematicPortId,sourceTraceIds)}let traceLabel=st22.name??st22.display_name,userNetId=traceLabel??st22.source_trace_id;st22.subcircuit_connectivity_map_key&&userNetIdToConnKey.set(userNetId,st22.subcircuit_connectivity_map_key);let maxMspDist=group2._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE2,portsForConnection=connected.map(schematicPortId=>componentPortBySchematicPortId.get(schematicPortId)).filter(port=>!!port),renderedNetLabelText=st22.subcircuit_connectivity_map_key?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:st22.subcircuit_connectivity_map_key}).name:getNetNameFromPorts(portsForConnection).name||traceLabel,shouldRenderNetLabels=connected.slice(1).some((b22,index2)=>{let a22=connected[index2],portA=db22.schematic_port.get(a22),portB=db22.schematic_port.get(b22);return!portA||!portB?!1:Math.sqrt((portA.center.x-portB.center.x)**2+(portA.center.y-portB.center.y)**2)>maxMspDist}),netLabelWidth=renderedNetLabelText&&shouldRenderNetLabels?Number(getSchematicNetLabelTextWidth2({text:renderedNetLabelText}).toFixed(2)):void 0,crossSectionNetLabelText=renderedNetLabelText;for(let i23=0;i23<connected.length-1;i23++){let a22=connected[i23],b22=connected[i23+1],pairKey=[a22,b22].sort().join("::");if(!connectedPairKeys.has(pairKey)){if(connectedPairKeys.add(pairKey),crossSectionNetLabelText&&areSchematicPortsInDifferentSectionsOnSameSheet(a22,b22)){let sourceConnectivityNetId=getSourceConnectivityNetId(st22);st22.subcircuit_connectivity_map_key&&userNetIdToConnKey.set(sourceConnectivityNetId,st22.subcircuit_connectivity_map_key),addPortToCrossSectionInlineNetConnection({sourceConnectivityNetId,schematicPortId:a22,text:crossSectionNetLabelText,sourceTraceId:st22.source_trace_id,connKey:st22.subcircuit_connectivity_map_key,preferInScopeTraceMetadata:!0}),addPortToCrossSectionInlineNetConnection({sourceConnectivityNetId,schematicPortId:b22,text:crossSectionNetLabelText,sourceTraceId:st22.source_trace_id,connKey:st22.subcircuit_connectivity_map_key,preferInScopeTraceMetadata:!0});continue}sourceTraceIdByPinPairKey.set(pairKey,st22.source_trace_id),directConnections.push({schematicPortIds:[a22,b22],netId:userNetId,netLabelWidth,connKey:st22.subcircuit_connectivity_map_key})}}}}let netConnections=[...boundaryTraceNetConnections],connKeyToSchematicPortIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){if(schematicPortIdsWithExternallyRoutedRepresentations.has(schId))continue;let sp22=db22.source_port.get(srcPortId);if(!sp22?.subcircuit_connectivity_map_key)continue;let connKey=sp22.subcircuit_connectivity_map_key;connKeyToSchematicPortIds.has(connKey)||connKeyToSchematicPortIds.set(connKey,[]);let routedSchematicPortId=resolveRoutedSchematicPortId(schId),netSchematicPortIds=connKeyToSchematicPortIds.get(connKey);netSchematicPortIds.includes(routedSchematicPortId)||netSchematicPortIds.push(routedSchematicPortId)}for(let[connKey,schematicPortIds]of connKeyToSchematicPortIds){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 netLabelTextWidth=Number(getSchematicNetLabelTextWidth2({text:String(userNetId)}).toFixed(2)),netLabelWidth=netLabelTextWidth,netLabelHeight;(sourceNet.is_ground||sourceNet.is_power)&&(netLabelWidth=SCHEMATIC_RAIL_NET_LABEL_HEIGHT,netLabelHeight=netLabelTextWidth),netConnections.push({netId:userNetId,schematicPortIds,isGround:sourceNet.is_ground,netLabelWidth,netLabelHeight,connKey})}}applyInlineNetLabelEligibility({directConnections,netConnections,connKeyToSchematicPortIds,connKeyToSourceNet,connKeysWithExplicitPortNetTraces,schematicPortIdsWithExplicitNetLabels,schematicPortIdsWithInlineNetLabels,areSchematicPortsOnDifferentComponents:schematicPortIds=>{let componentIds=schematicPortIds.map(schematicPortId=>db22.schematic_port.get(schematicPortId)?.schematic_component_id);return componentIds.every(componentId=>!!componentId)&&componentIds[0]!==componentIds[1]},resolveCanonicalNetLabelText});let availableNetLabelOrientations=(()=>{let netToAllowedOrientations={},presentNetIds=new Set(netConnections.map(nc3=>nc3.netId));for(let net of db22.source_net.list().filter(n23=>!n23.subcircuit_id||allowedSubcircuitIds.has(n23.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+"]);for(let{netId}of boundaryTraceNetConnections)netToAllowedOrientations[netId]??(netToAllowedOrientations[netId]=["x-","x+"]);return netToAllowedOrientations})(),inputProblem={chips,directConnections:directConnections.map(({schematicPortIds,connKey,...connection})=>({...connection,pinIds:schematicPortIds})),netConnections:netConnections.map(({schematicPortIds,connKey,isSameSheetCrossSectionConnection,isPowerOrGroundConnection,...connection})=>({...connection,pinIds:schematicPortIds})),textBoxes,availableNetLabelOrientations,maxMspPairDistance:group2._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE2},sourceTraceIdByPortOnlyLabelSchematicPortId=new Map(Array.from(sourceTraceIdsByPortOnlyLabelSchematicPortId).flatMap(([schematicPortId,sourceTraceIds])=>sourceTraceIds.size!==1?[]:[[schematicPortId,sourceTraceIds.values().next().value]]));return{inputProblem,routedSchematicPortIdBySchematicPortId,connKeyToSourceNet,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,netLabelsInScope,sourceTraceIdByPinPairKey}}var getSchematicPortIdsWithAssignedNetLabels=(netLabels,routedSchematicPortIdBySchematicPortId)=>{let schematicPortIdsWithNetLabels=new Set;for(let netLabel of netLabels){let{inline,schX,schY}=netLabel._parsedProps;if(inline||schX===void 0&&schY===void 0)continue;let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(routedSchematicPortIdBySchematicPortId.get(asSchematicPortId(port.schematic_port_id))??asSchematicPortId(port.schematic_port_id))}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver})=>{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=asSchematicPortId(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}}return schematicPortIdsWithRoutedTraces},NEAR_EXISTING_NET_LABEL_DISTANCE=.5,SAME_ANCHOR_POSITION_DISTANCE=.1,doesSchematicNetLabelRepresentCurrentSourceConnection=args=>{let{nl:nl3,connKey,sourceNet,text:text2}=args;return sourceNet?.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.source_net_id?nl3.source_net_id===connKey:nl3.text===text2},insertNetLabelsForPortsMissingTrace=({schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,group:group2,schPortIdToSourcePortId,connKeyToSourceNet})=>{let{db:db22}=group2.root,sourcePortIdsInSchematicScope=new Set(Array.from(schematicPortIdsInScope).map(schematicPortId=>schPortIdToSourcePortId.get(schematicPortId)).filter(sourcePortId=>sourcePortId!==void 0));for(let schematicPortId of schematicPortIdsInScope){if(schematicPortIdsWithExternallyRoutedRepresentations.has(schematicPortId))continue;let schPort=db22.schematic_port.get(schematicPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schematicPortId);if(!srcPortId)continue;let sourcePort=db22.source_port.get(srcPortId);if(group2._parsedProps.showAsSchematicBox&&sourcePort?.subcircuit_id===group2.subcircuit_id&&!sourcePort.source_component_id&&getDirectConnectionOutsideSchematicScopeSourcePortId({db:db22,sourcePortId:srcPortId,sourcePortIdsInSchematicScope,schematicSheetId:schPort.schematic_sheet_id}))continue;let connKey=sourcePort?.subcircuit_connectivity_map_key;if(!connKey)continue;let sourceNet=connKeyToSourceNet.get(connKey),schComponent=schPort.schematic_component_id?db22.schematic_component.get(schPort.schematic_component_id):void 0,portSchematicSheetId=schComponent?.schematic_sheet_id??group2._resolveSchematicSheetId(),connectedSourcePortIdsForKey=Array.from(schematicPortIdsInScope).map(portId=>schPortIdToSourcePortId.get(portId)).filter(sourcePortId=>sourcePortId?db22.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1),{text:text2,wasAssignedDisplayLabel,directConnectionOutsideSchematicScopeSourcePortId}=resolveNetLabelForPortMissingTrace({group:group2,sourcePortId:srcPortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId:schPort.schematic_sheet_id,connKey,sourceNet}),shouldPreserveDirectConnectionEndpointLabels=directConnectionOutsideSchematicScopeSourcePortId?db22.schematic_port.list({source_port_id:directConnectionOutsideSchematicScopeSourcePortId}).some(port=>!port.is_connected):!1,isCollapsedBoxPort=schComponent?.is_box_with_pins&&sourcePort&&!sourcePort.source_component_id,hasExternalTrace=db22.source_trace.list().some(trace=>trace.connected_source_port_ids.includes(srcPortId)&&trace.subcircuit_id!==sourcePort?.subcircuit_id);if(isCollapsedBoxPort&&!hasExternalTrace&&!!!(sourceNet||wasAssignedDisplayLabel))continue;let connectedPortCountForKey=Array.from(schematicPortIdsInScope).filter(portId=>{let sourcePortId=schPortIdToSourcePortId.get(portId);return sourcePortId?db22.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1}).length,isGndNet=sourceNet?.is_ground??!1,isPowerNet=!isGndNet&&(sourceNet?.is_power??!1),side;isGndNet?side="top":isPowerNet?side="bottom":side=getEnteringEdgeFromDirection(schPort.facing_direction||"right")||"right";let center2=computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side:side,text:text2}),existingNetLabelForCurrentSourceConnection=db22.schematic_net_label.list().find(nl3=>nl3.schematic_sheet_id!==portSchematicSheetId?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text:text2}));if(existingNetLabelForCurrentSourceConnection&&connectedPortCountForKey<=1&&!shouldPreserveDirectConnectionEndpointLabels){db22.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text:text2,anchor_position:schPort.center,center:center2,anchor_side:side});continue}if(existingNetLabelForCurrentSourceConnection){let dx22=existingNetLabelForCurrentSourceConnection.anchor_position.x-schPort.center.x,dy22=existingNetLabelForCurrentSourceConnection.anchor_position.y-schPort.center.y;if(dx22*dx22+dy22*dy22<NEAR_EXISTING_NET_LABEL_DISTANCE*NEAR_EXISTING_NET_LABEL_DISTANCE){if(isGndNet){let anchor_side=existingNetLabelForCurrentSourceConnection.anchor_side??side;db22.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text:text2,anchor_position:schPort.center,center:computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side,text:text2}),anchor_side})}else if(!isPowerNet&&existingNetLabelForCurrentSourceConnection.text===text2){let anchor_side=existingNetLabelForCurrentSourceConnection.anchor_side??side;db22.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text:text2,anchor_position:schPort.center,center:computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side,text:text2}),anchor_side})}continue}if(db22.schematic_net_label.list().some(nl3=>{if(nl3.schematic_sheet_id!==portSchematicSheetId)return!1;let dx32=nl3.anchor_position.x-schPort.center.x,dy32=nl3.anchor_position.y-schPort.center.y;return dx32*dx32+dy32*dy32>=SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text:text2})}))continue}if(!sourceNet&&!shouldPreserveDirectConnectionEndpointLabels)for(let nl3 of db22.schematic_net_label.list()){if(nl3.source_net_id!==connKey||nl3.schematic_sheet_id!==portSchematicSheetId)continue;connectedSourcePortIdsForKey.some(sourcePortId=>{let schPortId=Array.from(schPortIdToSourcePortId.entries()).find(([,id3])=>id3===sourcePortId)?.[0],connectedSchPort;if(schPortId&&(connectedSchPort=db22.schematic_port.get(schPortId)),!connectedSchPort?.center||!nl3.anchor_position)return!1;let dx22=nl3.anchor_position.x-connectedSchPort.center.x,dy22=nl3.anchor_position.y-connectedSchPort.center.y;return dx22*dx22+dy22*dy22<SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE})||db22.schematic_net_label.delete(nl3.schematic_net_label_id)}let netLabel={text:text2,source_net_id:sourceNet?.source_net_id??connKey,anchor_position:schPort.center,center:center2,anchor_side:side,schematic_sheet_id:portSchematicSheetId};db22.schematic_net_label.insert(netLabel)}},debug11=(0,import_debug16.default)("Group_doInitialSchematicTraceRender"),renderSchematicTracesForSheet=({group:group2,schematicSheetId,netLabels})=>{let{inputProblem,routedSchematicPortIdBySchematicPortId,connKeyToSourceNet,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,netLabelsInScope,sourceTraceIdByPinPairKey}=createSchematicTraceSolverInputProblem(group2,{schematicSheetId,netLabels});if(inputProblem.chips.length===0)return;let schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(netLabelsInScope,routedSchematicPortIdBySchematicPortId);if(!(inputProblem.directConnections.length>0||inputProblem.netConnections.length>0)){insertNetLabelsForPortsMissingTrace({group:group2,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,connKeyToSourceNet});return}debug11.enabled&&group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(inputProblem,null,2)});let solver=new SchematicTracePipelineSolver(inputProblem),solverConstructorArgs=solver.getConstructorParams();group2.root?.emit("solver:started",{type:"solver:started",solverName:"SchematicTracePipelineSolver",solverParams:solverConstructorArgs[0],solverConstructorArgs,componentName:group2.getString()}),solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver});applyTracesFromSolverOutput({group:group2,solver,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}),applyNetLabelPlacements({group:group2,routedSchematicPortIdBySchematicPortId,solver,connKeyToSourceNet,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces,netLabels:netLabelsInScope}),applyInlineNetLabelPlacements({group:group2,solver,userNetIdToConnKey,sourceTraceIdByPinPairKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId});let{db:db22}=group2.root;for(let[schematicPortId,routedSchematicPortId]of routedSchematicPortIdBySchematicPortId)db22.schematic_port.get(routedSchematicPortId)?.is_connected&&db22.schematic_port.update(schematicPortId,{is_connected:!0});insertNetLabelsForPortsMissingTrace({group:group2,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,connKeyToSourceNet})},Group_doInitialSchematicTraceRender=group2=>{if(!group2.root?._featureMspSchematicTraceRouting||!group2.isSubcircuit||group2.root?.schematicDisabled)return;let netLabels=new Set,board=group2._getBoard(),schematicScope=group2;for(;schematicScope;){if(schematicScope instanceof Group5)for(let netLabel of schematicScope.selectAll("netlabel"))netLabels.add(netLabel);if(schematicScope===board)break;schematicScope=schematicScope.parent}let netLabelComponents=[...netLabels],schematicGroupIds=new Set([group2,...group2.getDescendants().filter(component=>component instanceof Group5)].map(schematicGroup=>schematicGroup.schematic_group_id).filter(schematicGroupId=>!!schematicGroupId)),schematicSheetIds=new Set(group2.root.db.schematic_component.list().filter(schematicComponent=>schematicGroupIds.has(schematicComponent.schematic_group_id)).map(schematicComponent=>schematicComponent.schematic_sheet_id).filter(schematicSheetId=>!!schematicSheetId));if(schematicSheetIds.size===0){renderSchematicTracesForSheet({group:group2,netLabels:netLabelComponents});return}for(let schematicSheetId of schematicSheetIds)renderSchematicTracesForSheet({group:group2,schematicSheetId,netLabels:netLabelComponents})};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 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(id3){if(idToColorMap.has(id3))return idToColorMap.get(id3);let color3=SIMULATION_COLOR_PALETTE[colorIndex];return colorIndex=(colorIndex+1)%SIMULATION_COLOR_PALETTE.length,idToColorMap.set(id3,color3),color3}function resetSimulationColorState(){idToColorMap.clear(),colorIndex=0}var getSpiceyEngine=()=>({async simulate(spiceString){let simulation_experiment_id="spice-experiment-1",{circuit:parsedCircuit,tran}=simulate(spiceString);return{simulationResultCircuitJson:spiceyTranToVGraphs(tran,parsedCircuit,simulation_experiment_id)}}}),isCurrentGraph2=element=>element.type==="simulation_transient_current_graph",isSimulationCurrentResult=circuitElement=>circuitElement.type==="simulation_dc_operating_point_current"||circuitElement.type==="simulation_dc_sweep_current_graph"||circuitElement.type==="simulation_ac_sweep_current_graph",isSimulationVoltageResult=circuitElement=>circuitElement.type==="simulation_dc_operating_point_voltage"||circuitElement.type==="simulation_dc_sweep_voltage_graph"||circuitElement.type==="simulation_ac_sweep_voltage_graph",isVoltageGraph=element=>element.type==="simulation_transient_voltage_graph",isSimulationAnalysisResult2=circuitElement=>isVoltageGraph(circuitElement)||isCurrentGraph2(circuitElement)||isSimulationVoltageResult(circuitElement)||isSimulationCurrentResult(circuitElement),attachSweepCoordinateToSimulationResult=({simulationResult,simulationParameterSweepCoordinate})=>{if(!simulationParameterSweepCoordinate||!isSimulationAnalysisResult2(simulationResult))return simulationResult;let simulationResultWithSweepCoordinate={...simulationResult},simulationResultIdKey=`${simulationResultWithSweepCoordinate.type}_id`;return Reflect.deleteProperty(simulationResultWithSweepCoordinate,simulationResultIdKey),simulationResultWithSweepCoordinate.simulation_parameter_sweep_coordinate=simulationParameterSweepCoordinate,simulationResultWithSweepCoordinate},getSourceComponentOrThrow=({circuitJson,sourceComponentId,isMatchingSourceComponent})=>{let sourceComponent=circuitJson.find(circuitElement=>isMatchingSourceComponent(circuitElement)&&circuitElement.source_component_id===sourceComponentId);if(!sourceComponent)throw new Error(`Parameter sweep target ${sourceComponentId} was not found`);return sourceComponent},applyParameterSweepCoordinate=({circuitJson,parameterSweep,simulationParameterSweepCoordinate})=>{let sweptCircuitJson=structuredClone(circuitJson),parameterValue=simulationParameterSweepCoordinate.parameter_value;if(parameterSweep.parameter_type==="resistance"){let resistor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.resistor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_resistor"});return resistor.resistance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="capacitance"){let capacitor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.capacitor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_capacitor"});return capacitor.capacitance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="inductance"){let inductor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.inductor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_inductor"});return inductor.inductance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="voltage"){let groundNet=sweptCircuitJson.find(circuitElement=>circuitElement.type==="source_net"&&circuitElement.name.toUpperCase()==="GND");if(!groundNet||groundNet.type!=="source_net")throw new Error("A voltage parameter sweep requires a GND net");let sweepVoltageSource={type:"simulation_voltage_source",simulation_voltage_source_id:`simulation_voltage_source_${simulationParameterSweepCoordinate.simulation_parameter_sweep_id}_${simulationParameterSweepCoordinate.sweep_index}`,is_dc_source:!0,positive_source_net_id:parameterSweep.source_net_id,negative_source_net_id:groundNet.source_net_id,voltage:parameterValue};return sweptCircuitJson.push(sweepVoltageSource),sweptCircuitJson}if(parameterSweep.parameter_type==="current"){let currentSourcePortIds=new Set(sweptCircuitJson.filter(circuitElement=>circuitElement.type==="source_port"&&circuitElement.source_component_id===parameterSweep.current_source_component_id).map(sourcePort=>sourcePort.source_port_id)),currentSource=sweptCircuitJson.find(circuitElement=>circuitElement.type==="simulation_current_source"&&(circuitElement.is_dc_source?!!(circuitElement.positive_source_port_id&&currentSourcePortIds.has(circuitElement.positive_source_port_id)):!!(circuitElement.terminal1_source_port_id&&currentSourcePortIds.has(circuitElement.terminal1_source_port_id))));if(!currentSource)throw new Error(`Current sweep target ${parameterSweep.current_source_component_id} has no simulation source`);return currentSource.current=parameterValue,sweptCircuitJson}throw new Error("Parameter sweep target is incomplete")},createSimulationRun=({circuitJson,simulationParameterSweepCoordinate})=>{let spiceNetlist=circuitJsonToSpice(circuitJson);return{spiceNetlist,spiceString:spiceNetlist.toSpiceString(),simulationParameterSweepCoordinate}},createSimulationRuns=({circuitJson,simulationExperimentId})=>{let parameterSweep=circuitJson.find(circuitElement=>circuitElement.type==="simulation_parameter_sweep"&&circuitElement.simulation_experiment_id===simulationExperimentId);return parameterSweep?parameterSweep.parameter_values.map((parameterValue,sweepIndex)=>{let simulationParameterSweepCoordinate={simulation_parameter_sweep_id:parameterSweep.simulation_parameter_sweep_id,sweep_index:sweepIndex,parameter_value:parameterValue,parameter_unit:parameterSweep.parameter_unit};return createSimulationRun({circuitJson:applyParameterSweepCoordinate({circuitJson,parameterSweep,simulationParameterSweepCoordinate}),simulationParameterSweepCoordinate})}):[createSimulationRun({circuitJson})]},SI_PREFIX_MULTIPLIERS={p:1e-12,n:1e-9,u:1e-6,\u00B5:1e-6,m:.001,"":1,k:1e3,K:1e3,M:1e6,G:1e9},parseSimulationGraphValue=value=>{if(value===void 0)return;if(typeof value=="number")return value;let match2=value.trim().match(/^([+-]?(?:\d+(?:\.\d*)?|\.\d+))\s*([pnumµkKMG]?)/);if(!match2)return;let numericValue=Number(match2[1]);if(Number.isFinite(numericValue))return numericValue*(SI_PREFIX_MULTIPLIERS[match2[2]??""]??1)},getVoltageProbeGraphDisplayOverrides=probe=>{let{graphDisplayName,graphCenter,graphVerticalOffset,graphVoltagePerDiv}=probe._parsedProps;return{displayName:graphDisplayName,color:probe.color??void 0,center:graphCenter,verticalOffset:parseSimulationGraphValue(graphVerticalOffset),valuePerDiv:parseSimulationGraphValue(graphVoltagePerDiv)}},getAmmeterGraphDisplayOverrides=ammeter=>{let{color:color3,graphDisplayName,graphCenter,graphVerticalOffset,graphCurrentPerDiv}=ammeter._parsedProps;return{displayName:graphDisplayName,color:color3,center:graphCenter,verticalOffset:parseSimulationGraphValue(graphVerticalOffset),valuePerDiv:parseSimulationGraphValue(graphCurrentPerDiv)}},getFiniteBounds=values2=>{let min4=Number.POSITIVE_INFINITY,max5=Number.NEGATIVE_INFINITY;for(let value of values2)Number.isFinite(value)&&(min4=Math.min(min4,value),max5=Math.max(max5,value));return min4===Number.POSITIVE_INFINITY||max5===Number.NEGATIVE_INFINITY?null:{min:min4,max:max5}},getGraphLevels2=graph=>graph.type==="simulation_transient_current_graph"?graph.current_levels:graph.voltage_levels,DISPLAY_SECTION_HEIGHT_DIVS=2,DISPLAY_SECTION_DATA_FILL=.8,getAutoDisplayScale=({graph,index:index2,graphCount})=>{let bounds=getFiniteBounds(getGraphLevels2(graph));if(!bounds)return null;let center2=(bounds.min+bounds.max)/2,span=bounds.max-bounds.min,valuePerDiv=span>0?span/(DISPLAY_SECTION_HEIGHT_DIVS*DISPLAY_SECTION_DATA_FILL):Math.max(Math.abs(center2)/10,Number.EPSILON);return{display_center_value:center2,display_center_offset_divs:((graphCount-1)/2-index2)*DISPLAY_SECTION_HEIGHT_DIVS,value_per_div:valuePerDiv}},isDefinedString=value=>value!==void 0,getTraceByVoltageProbeId=traces=>{let traceByVoltageProbeId=new Map;for(let trace of traces)trace.simulation_voltage_probe_id&&traceByVoltageProbeId.set(trace.simulation_voltage_probe_id,trace);return traceByVoltageProbeId},getTraceByCurrentProbeId=traces=>{let traceByCurrentProbeId=new Map;for(let trace of traces)trace.simulation_current_probe_id&&traceByCurrentProbeId.set(trace.simulation_current_probe_id,trace);return traceByCurrentProbeId},insertIndependentAxisScopeTraces=({db:db22,graphs,graphDisplayOverridesByProbeId})=>{if(graphs.length===0)return;let existingScopeTraces=db22.simulation_oscilloscope_trace.list(),traceByVoltageProbeId=getTraceByVoltageProbeId(existingScopeTraces),traceByCurrentProbeId=getTraceByCurrentProbeId(existingScopeTraces),graphIdsWithTrace=new Set(existingScopeTraces.flatMap(trace=>[trace.simulation_transient_voltage_graph_id,trace.simulation_transient_current_graph_id]).filter(isDefinedString));for(let[index2,{type,graph}]of graphs.entries()){let scale42=getAutoDisplayScale({graph,index:index2,graphCount:graphs.length});if(!scale42)continue;let graphId=type==="voltage"?graph.simulation_transient_voltage_graph_id:graph.simulation_transient_current_graph_id;if(graphIdsWithTrace.has(graphId))continue;let sourceProbeId=graph.source_probe_id??void 0,probeTrace=sourceProbeId===void 0?void 0:type==="voltage"?traceByVoltageProbeId.get(sourceProbeId):traceByCurrentProbeId.get(sourceProbeId),overrides=sourceProbeId===void 0?void 0:graphDisplayOverridesByProbeId?.get(sourceProbeId),valuePerDiv=overrides?.valuePerDiv??scale42.value_per_div,displayCenter=overrides?.center??scale42.display_center_value,displayCenterOffsetDivs=overrides?.verticalOffset!==void 0&&valuePerDiv!==0?overrides.verticalOffset/valuePerDiv:probeTrace?.display_center_offset_divs??scale42.display_center_offset_divs;db22.simulation_oscilloscope_trace.insert({...type==="voltage"?{simulation_transient_voltage_graph_id:graph.simulation_transient_voltage_graph_id,volts_per_div:valuePerDiv}:{simulation_transient_current_graph_id:graph.simulation_transient_current_graph_id,amps_per_div:valuePerDiv},display_name:overrides?.displayName??probeTrace?.display_name,color:overrides?.color??probeTrace?.color??graph.color,display_center_value:displayCenter,display_center_offset_divs:displayCenterOffsetDivs})}},isCircuitElementInput=element=>!!(element&&typeof element=="object"&&"type"in element),debug12=(0,import_debug20.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender"),getCircuitJsonForAnalogSimulation=({circuitJson,simulationExperimentId,voltageProbes,ammeters})=>{let voltageProbeIds=new Set(voltageProbes.map(voltageProbe=>voltageProbe.simulation_voltage_probe_id).filter(simulationVoltageProbeId=>!!simulationVoltageProbeId)),currentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId));return circuitJson.filter(element=>{if(element.type==="simulation_experiment")return element.simulation_experiment_id===simulationExperimentId;if(element.type==="simulation_voltage_probe")return voltageProbeIds.has(element.simulation_voltage_probe_id);if(element.type==="simulation_current_probe")return currentProbeIds.has(element.simulation_current_probe_id);if(element.type==="simulation_parameter_sweep")return element.simulation_experiment_id===simulationExperimentId;if(element.type==="simulation_oscilloscope_trace"){if(element.simulation_voltage_probe_id)return voltageProbeIds.has(element.simulation_voltage_probe_id);if(element.simulation_current_probe_id)return currentProbeIds.has(element.simulation_current_probe_id)}return!(element.type==="simulation_transient_voltage_graph"||element.type==="simulation_transient_current_graph"||element.type==="simulation_dc_operating_point_voltage"||element.type==="simulation_dc_operating_point_current"||element.type==="simulation_dc_sweep_voltage_graph"||element.type==="simulation_dc_sweep_current_graph"||element.type==="simulation_ac_sweep_voltage_graph"||element.type==="simulation_ac_sweep_current_graph"||element.type==="simulation_unknown_experiment_error")})};function Group_doInitialSimulationSpiceEngineRender(group2){if(group2.getInheritedProperty("analogSimulationDisabled")||!group2.isSubcircuit)return;let{root}=group2;if(!root)return;let analogSimulations=[...group2.selectAll("analogsimulation"),...group2.selectAll("analogtransientsimulation"),...group2.selectAll("analogdcoperatingpointsimulation"),...group2.selectAll("analogdcsweepsimulation"),...group2.selectAll("analogacsweepsimulation")];if(analogSimulations.length===0)return;resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());for(let analogSimulation of analogSimulations){let simulationExperimentId=analogSimulation.simulation_experiment_id;if(!simulationExperimentId){debug12("No simulation experiment id found, skipping simulation");continue}let simulationExperiment=root.db.simulation_experiment.get(simulationExperimentId);if(!simulationExperiment){debug12("No simulation experiment found, skipping simulation");continue}let simulationScope=analogSimulation.getGroup()??group2,voltageProbes=simulationScope.selectAll("voltageprobe"),ammeters=simulationScope.selectAll("ammeter"),circuitJson=getCircuitJsonForAnalogSimulation({circuitJson:root.db.toArray(),simulationExperimentId,voltageProbes,ammeters}),simulationRuns;try{simulationRuns=createSimulationRuns({circuitJson,simulationExperimentId}),debug12(`Generated ${simulationRuns.length} SPICE run(s):
951
951
  ${simulationRuns.map(simulationRun=>simulationRun.spiceString).join(`
952
- `)}`)}catch(error2){debug12(`Failed to convert circuit JSON to SPICE: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)});continue}let voltageProbeByGraphName=new Map,voltageProbeById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.finalProbeName&&voltageProbeByGraphName.set(probe.finalProbeName,probe),probe.simulation_voltage_probe_id&&(voltageProbeById.set(probe.simulation_voltage_probe_id,probe),graphDisplayOverridesByProbeId.set(probe.simulation_voltage_probe_id,getVoltageProbeGraphDisplayOverrides(probe)));for(let ammeter of ammeters)ammeter.simulation_current_probe_id&&graphDisplayOverridesByProbeId.set(ammeter.simulation_current_probe_id,getAmmeterGraphDisplayOverrides(ammeter));let scopedCurrentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId)),currentProbeById=new Map,currentProbeByName=new Map;for(let probe of root.db.simulation_current_probe.list().filter(probe2=>scopedCurrentProbeIds.has(probe2.simulation_current_probe_id)))currentProbeById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&&currentProbeByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbeById.has(probe.simulation_voltage_probe_id)),firstSpiceNetlist=simulationRuns[0]?.spiceNetlist,graphNamesFromNetlist=firstSpiceNetlist?getTransientVoltageGraphNamesFromSpiceNetlist(firstSpiceNetlist):[];if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[simulationProbeIndex,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbeById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[simulationProbeIndex];probe&&graphName&&voltageProbeByGraphName.set(graphName,probe)}else debug12(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);let engineName=analogSimulation.getSpiceEngineName()??"spicey",spiceEngine3=spiceEngineMap[engineName];if(!spiceEngine3)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(spiceEngineName=>spiceEngineName!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${simulationExperimentId}`;debug12(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group2._queueAsyncEffect(effectId,async()=>{try{let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let simulationRun of simulationRuns){debug12(`Running simulation with engine: ${engineName}`);let simulationResult=await spiceEngine3.simulate(simulationRun.spiceString);debug12(`Simulation completed, received ${simulationResult.simulationResultCircuitJson.length} elements`);for(let simulationResultCircuitElement of simulationResult.simulationResultCircuitJson){if(!isCircuitElementInput(simulationResultCircuitElement)){debug12("Skipping invalid simulation result element");continue}let simulationResultWithSweepCoordinate=attachSweepCoordinateToSimulationResult({simulationResult:simulationResultCircuitElement,simulationParameterSweepCoordinate:simulationRun.simulationParameterSweepCoordinate});if(isVoltageGraph(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0;probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}else if(isSimulationVoltageResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbeById.get(simulationResultWithSweepCoordinate.simulation_voltage_probe_id)??(simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch?.simulation_voltage_probe_id&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.simulation_voltage_probe_id=probeMatch.simulation_voltage_probe_id)}if(isCurrentGraph2(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(simulationResultWithSweepCoordinate.source_probe_id?currentProbeById.get(simulationResultWithSweepCoordinate.source_probe_id):void 0)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_current_probe_id)}else if(isSimulationCurrentResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=currentProbeById.get(simulationResultWithSweepCoordinate.simulation_current_probe_id)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.simulation_current_probe_id=probeMatch.simulation_current_probe_id)}let insertedSimulationResult=root.db.insert(simulationResultWithSweepCoordinate);isVoltageGraph(insertedSimulationResult)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedSimulationResult}),isCurrentGraph2(insertedSimulationResult)&&insertedCurrentGraphs.push({type:"current",graph:insertedSimulationResult}),debug12(`Inserted ${simulationResultWithSweepCoordinate.type} into database`)}}analogSimulation.usesIndependentGraphAxes()&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group2._markDirty("SimulationSpiceEngineRender")}catch(error2){debug12(`Simulation failed for engine ${engineName}: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group2){if(!group2.isSubcircuit)return;let{db:db22}=group2.root,traces=group2.selectAll("trace"),vias=group2.selectAll("via"),nets=group2.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t48=>{let source_trace3=db22.source_trace.get(t48.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(c23=>c23!==null));let sourceNets=db22.source_net.list().filter(net=>net.subcircuit_id===group2.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group2._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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`,db22.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=db22.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id3 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id3)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.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=db22.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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n23=>n23.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)}}var Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks=group2=>{let isRootSubcircuit=group2.root?.firstChild===group2;if(!group2.isSubcircuit||!isRootSubcircuit||group2._getBoard())return;let routingDisabled=group2.root?.pcbRoutingDisabled||group2.getInheritedProperty("routingDisabled"),drcChecksDisabled=group2.root?.platform?.drcChecksDisabled??group2.getInheritedProperty("drcChecksDisabled"),routingDrcChecksDisabled=group2.root?.platform?.routingDrcChecksDisabled??group2.getInheritedProperty("routingDrcChecksDisabled");if(group2.root?.pcbDisabled||routingDisabled||drcChecksDisabled||routingDrcChecksDisabled||group2._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender")||group2._hasTracesToRoute()&&!group2._areChildSubcircuitsRouted()||group2._standaloneSubcircuitDrcChecksComplete||group2._standaloneSubcircuitDrcChecksInProgress)return;let{db:db22}=group2.root,subcircuitCircuitJson=db22.subtree({subcircuit_id:group2.subcircuit_id}).toArray();group2._standaloneSubcircuitDrcChecksInProgress=!0,group2._queueAsyncEffect("standalone-subcircuit:routing-drc-checks",async()=>{try{let results=await runAllRoutingChecks(subcircuitCircuitJson);db22.insertAll(dedupePcbDrcErrors(results)),group2._standaloneSubcircuitDrcChecksComplete=!0}finally{group2._standaloneSubcircuitDrcChecksInProgress=!1}})},addPourNetMap=(target,pourNetMap)=>{for(let[layer,netOrNets]of Object.entries(pourNetMap)){if(!netOrNets)continue;let nets=Array.isArray(netOrNets)?netOrNets:[netOrNets],layerNets=target.get(layer)??new Set;for(let net of nets)layerNets.add(net);target.set(layer,layerNets)}},toFanoutPourNetMap=netsByLayer=>Object.fromEntries(Array.from(netsByLayer,([layer,nets])=>[layer,nets.size===1?Array.from(nets)[0]:Array.from(nets)])),Group_getFanoutPourNetMap=(group2,routingPhasePlans)=>{let explicitMaps=routingPhasePlans.map(plan=>plan.fanoutPourNetMap).filter(map=>map!==void 0),netsByLayer=new Map;if(explicitMaps.length>0){for(let explicitMap of explicitMaps)addPourNetMap(netsByLayer,explicitMap);return toFanoutPourNetMap(netsByLayer)}let scope=group2;for(;scope;){if(scope.isSubcircuit){let subcircuit=scope,copperPours=subcircuit.selectAll("copperpour");for(let copperPour of copperPours){if(copperPour.getSubcircuit()!==subcircuit)continue;let{layer,connectsTo}=copperPour._parsedProps;addPourNetMap(netsByLayer,{[layer]:connectsTo})}}scope=scope.parent}return netsByLayer.size>0?toFanoutPourNetMap(netsByLayer):void 0},baseBreakoutPointProps=pcbLayoutProps.omit({pcbRotation:!0,layer:!0}),BaseBreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"matchedSourceTraceId",null);__publicField(this,"isPcbPrimitive",!0)}_getSourceTraceIdForPort(port){let{db:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}_renderPcbBreakoutPoint({layer}={}){if(this.pcb_breakout_point_id||this.root?.pcbDisabled)return;let{db:db22}=this.root,position4=this._getGlobalPcbPositionBeforeLayout(),group2=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group2||!group2.pcb_group_id)return;let pcb_breakout_point3=db22.pcb_breakout_point.insert({pcb_group_id:group2.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.matchedSourceTraceId??this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,layer,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:db22}=this.root;if(!this.pcb_breakout_point_id)return;let updatedProperties={x:newCenter.x,y:newCenter.y};this.matchedSourceTraceId&&(updatedProperties.source_trace_id=this.matchedSourceTraceId),db22.pcb_breakout_point.update(this.pcb_breakout_point_id,updatedProperties)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root;if(!this.pcb_breakout_point_id)return;let point62=db22.pcb_breakout_point.get(this.pcb_breakout_point_id);point62&&db22.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point62.x+deltaX,y:point62.y+deltaY})}getPcbSize(){return{width:0,height:0}}},BreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){if(this.matchedPort)return;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}"`))}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint()}},SavedFanoutPoint=class extends BreakoutPoint{constructor(){super(...arguments);__publicField(this,"exitLayer","top")}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint({layer:this.exitLayer})}};function getSavedFanoutTraces(breakout,input2){let{db:db22}=breakout.root,boardLayers=getViaBoardLayers(input2.layerCount),coveredConnections=new Set,exits=breakout.children.filter(child=>child instanceof SavedFanoutPoint),traces=(breakout._parsedProps.pcbTracePaths??[]).map((path,pathIndex)=>{for(let point62 of path.route)if((point62.route_type==="wire"?[point62.layer]:[point62.from_layer,point62.to_layer]).some(layer=>!boardLayers.includes(layer)))throw new Error(`Saved fanout path "${path.connection}" uses a layer unavailable on this board`);let exit=exits[pathIndex],port=exit.matchedPort,connection=input2.connections.find(connection2=>connection2.pointsToConnect.some(point62=>point62.pcb_port_id===port.pcb_port_id));if(!connection)throw new Error(`No fanout connection for saved path "${path.connection}"`);let pcbExit=db22.pcb_breakout_point.get(exit.pcb_breakout_point_id),localExit=path.route.at(-1),transform7=compose2(exit._computePcbGlobalTransformBeforeLayout(),translate2(-localExit.x,-localExit.y)),originalExit=applyToPoint2(transform7,localExit),route2=resolveSavedTraceRouteWidths(path.route).map(point62=>{let position4=applyToPoint2(transform7,point62);return{...point62,x:position4.x+pcbExit.x-originalExit.x,y:position4.y+pcbExit.y-originalExit.y}}),first=route2[0],firstLayer=first.route_type==="wire"?first.layer:first.from_layer,portPosition=port._getGlobalPcbPositionAfterLayout();if(Math.hypot(first.x-portPosition.x,first.y-portPosition.y)>1e-4||!port.getAvailablePcbLayers().includes(firstLayer))throw new Error(`Saved fanout path "${path.connection}" must start at its PCB port on an available layer`);if(first.route_type==="via"&&!input2.allowViaInPad)throw new Error(`Saved fanout path "${path.connection}" starts with a via at a pad; enable allowViaInPad`);let last=route2.at(-1),lastLayer=last.route_type==="wire"?last.layer:last.to_layer,endpoints=[{...first,layer:firstLayer},{...last,layer:lastLayer}];if(connection.pointsToConnect.some(point62=>!endpoints.some(endpoint=>Math.hypot(point62.x-endpoint.x,point62.y-endpoint.y)<1e-4&&point62.layer===endpoint.layer)))throw new Error(`Saved fanout path "${path.connection}" does not cover its connection endpoints`);let startContactWidths=getSavedTraceViaContactWidths(route2,0,input2.minTraceWidth),endContactWidths=getSavedTraceViaContactWidths(route2,route2.length-1,input2.minTraceWidth);return first.route_type==="via"&&(route2.splice(1,0,{route_type:"wire",x:first.x,y:first.y,layer:first.to_layer,width:startContactWidths.toWidth}),route2.unshift({route_type:"wire",x:first.x,y:first.y,layer:first.from_layer,width:startContactWidths.fromWidth})),last.route_type==="via"&&(route2.splice(route2.length-1,0,{route_type:"wire",x:last.x,y:last.y,layer:last.from_layer,width:endContactWidths.fromWidth}),route2.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth})),last.route_type==="via"&&route2.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth}),coveredConnections.add(connection),{type:"pcb_trace",pcb_trace_id:`saved_fanout_${breakout.pcb_group_id}_${pathIndex}`,connection_name:connection.name,source_trace_id:connection.source_trace_id,connectsTo:[connection.source_trace_id,...connection.pointsToConnect.map(point62=>point62.pointId)].filter(id3=>!!id3),route:route2}}),missing=input2.connections.filter(connection=>!coveredConnections.has(connection));if(missing.length)throw new Error(`pcbTracePaths must cover every fanout connection; missing: ${missing.map(connection=>connection.name).join(", ")}`);return traces}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a22,b22){return getPhaseSortValue(a22.routingPhaseIndex)-getPhaseSortValue(b22.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,buses=[]){let busRoutingPhaseIndexes=new Set;for(let bus of buses){if(bus._parsedProps.routingPhaseIndex===void 0)continue;bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection)))&&busRoutingPhaseIndexes.add(bus._parsedProps.routingPhaseIndex)}if(busRoutingPhaseIndexes.size>1)throw new Error(`Trace "${trace.name}" belongs to buses with different routing phases`);let busRoutingPhaseIndex=busRoutingPhaseIndexes.values().next().value;if(busRoutingPhaseIndex!==void 0)return busRoutingPhaseIndex;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 convertPortSelectorToEndpointKey(selector2){return selector2.trim().replace(/\s*>\s*/g,".").replace(/\s+/g,".").replace(/^\./,"").replace(/\.\./g,".")}function getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps){return phaseProps.connection===void 0&&phaseProps.connections===void 0?phaseProps.pcbTracePaths?.map(path=>path.connection)??[]:[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelector){let connectionSelectorEndpointKey=convertPortSelectorToEndpointKey(connectionSelector);if(trace.getTracePortPathSelectors().some(selector2=>convertPortSelectorToEndpointKey(selector2)===connectionSelectorEndpointKey))return!0;let port=trace.getSubcircuit().selectOne(connectionSelector,{type:"port"});return port!==null&&(trace._findConnectedPorts().ports?.includes(port)??!1)}function resolvePhaseConnectionTraces(group2,traces,phaseProps){let resolvedTraces=new Set,phaseName=phaseProps.name??"unnamed phase";for(let rawSelector of getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps)){let selector2=rawSelector.trim(),explicitlySelectsTrace=selector2.startsWith("trace."),namedTraces=explicitlySelectsTrace?group2.selectAll(selector2).filter(trace=>traces.includes(trace)):traces.filter(trace=>trace.name===selector2),endpointTraces=explicitlySelectsTrace?[]:traces.filter(trace=>traceHasEndpointMatchingConnectionSelector(trace,selector2));if(namedTraces.length>1||namedTraces.length>0&&endpointTraces.length>0)throw new Error(`Autorouting phase "${phaseName}": connection "${rawSelector}" is ambiguous. Use a unique trace name qualified as "trace.DDR_D0" or a port such as ".U1 > .A1".`);let matches=namedTraces.length>0?namedTraces:endpointTraces;if(matches.length===0)throw new Error(`Autorouting phase "${phaseName}": connection "${rawSelector}" matched no trace or endpoint. Use a trace name such as "DDR_D0" or a port such as ".U1 > .A1".`);for(let trace of matches)resolvedTraces.add(trace)}return resolvedTraces}function getAutoroutersByPhaseIndex(group2){let autoroutingPhases=group2.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(group2){let autoroutingPhases=group2.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,minTraceToHoleEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minTraceToHoleEdgeClearance===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),minTraceToHoleEdgeClearance:toParsedDistance(minTraceToHoleEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group2){let traces=group2.selectAll("trace"),nets=group2.selectAll("net"),buses=group2.selectAll("bus"),breakouts=group2.selectAll("group").filter(candidate=>candidate.isRoutingDirective),breakoutByTrace=new Map,breakoutByNet=new Map;for(let trace of traces){let ancestor=trace.parent;for(;ancestor&&ancestor!==group2;){if(ancestor.isRoutingDirective){breakoutByTrace.set(trace,ancestor);break}ancestor=ancestor.parent}}for(let net of nets)net.parent?.isRoutingDirective&&breakouts.includes(net.parent)&&breakoutByNet.set(net,net.parent);let plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group2),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group2),selectedTracesByPhaseIndex=new Map(Array.from(phasePropsByPhaseIndex,([phaseIndex,phaseProps])=>[phaseIndex,resolvePhaseConnectionTraces(group2,traces,phaseProps)])),groupFanoutProps=group2._parsedProps,routeRemaining=group2.getInheritedProperty("routeRemaining")!==!1,defaultPhaseProps=phasePropsByPhaseIndex.get(null),includeUnassignedConnections=routeRemaining||defaultPhaseProps!==void 0&&!defaultPhaseProps.reroute&&getConnectionSelectorsFromAutoroutingPhaseProps(defaultPhaseProps).length===0,hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute),hasConnectionTargetedPhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps).length>0);if(!hasDirectRoutingTargets&&!hasReroutePhase&&!hasConnectionTargetedPhase&&breakouts.length===0)return[];for(let net of nets){if(breakoutByNet.has(net))continue;let routingPhaseIndex=getNetRoutingPhaseIndex(net);routingPhaseIndex===null&&!includeUnassignedConnections||getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){if(breakoutByTrace.has(trace))continue;let routingPhaseIndex=getTraceRoutingPhaseIndex(trace,buses);routingPhaseIndex===null&&!includeUnassignedConnections||getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex){let connectionSelectors=getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps);if(connectionSelectors.length>0){let plan=getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex);plan.connectionSelectors=connectionSelectors;for(let trace of traces)if(!breakoutByTrace.has(trace)&&selectedTracesByPhaseIndex.get(phaseIndex).has(trace)){if(!phaseProps.reroute)for(let existingPlan of plansByPhaseIndex.values())existingPlan!==plan&&(existingPlan.traces=existingPlan.traces.filter(existingTrace=>existingTrace!==trace));if(plan.traces.includes(trace))continue;plan.traces.push(trace)}}(phaseProps.reroute||phaseProps.pcbTracePaths!==void 0)&&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.algorithmFn=phaseProps?.algorithmFn,plan.isImplicitRemainingPhase=plan.routingPhaseIndex===null&&phaseProps===void 0,plan.phaseName=phaseProps?.name,plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.busFanoutDirections=phaseProps?.busFanoutDirections??groupFanoutProps.busFanoutDirections,plan.fanoutBoundaryPadding=phaseProps?.fanoutBoundaryPadding??groupFanoutProps.fanoutBoundaryPadding;let fanoutRoutingLayers=phaseProps?.fanoutRoutingLayers??groupFanoutProps.fanoutRoutingLayers;plan.fanoutRoutingLayers=fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),plan.fanoutPourNetMap=phaseProps?.fanoutPourNetMap??groupFanoutProps.fanoutPourNetMap,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}for(let phase of group2.selectAll("autoroutingphase")){let plan=plansByPhaseIndex.get(phase._parsedProps.phaseIndex??null);if(!plan||(plan.autoroutingPhase=phase,phase._parsedProps.pcbTracePaths===void 0))continue;let config=plan.autorouter!==void 0?getPresetAutoroutingConfig(plan.autorouter,group2.root?.platform):group2._getAutorouterConfig(),isFanout=["fanout","single_layer_fanout"].includes(config.preset??"");plan.getPrecomputedRoutingResult=input2=>getSavedAutoroutingPhaseTraces(phase,input2,isFanout)}let breakoutPlans=[];for(let breakout of breakouts){let breakoutProps22=breakout._parsedProps,shouldUseDefaultAutorouterForBreakoutPoints=breakout.children.some(child=>child instanceof BreakoutPoint)&&breakout.props.autorouter===void 0,breakoutTraces=traces.filter(trace=>breakoutByTrace.get(trace)===breakout),unroutedBreakoutTraces=breakoutTraces.filter(trace=>!trace.pcb_trace_id),pcbGroup=breakout.pcb_group_id?breakout.root?.db.pcb_group.get(breakout.pcb_group_id):null,outlineBounds=pcbGroup?.outline?getBoundsFromPoints(pcbGroup.outline):null,routingWidth=pcbGroup?.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),routingHeight=pcbGroup?.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0),routingBounds2=pcbGroup&&routingWidth&&routingHeight?{minX:pcbGroup.center.x-routingWidth/2,maxX:pcbGroup.center.x+routingWidth/2,minY:pcbGroup.center.y-routingHeight/2,maxY:pcbGroup.center.y+routingHeight/2}:void 0,rawBreakoutProps=breakout.props,hasExplicitGeometry=rawBreakoutProps.width!==void 0||rawBreakoutProps.height!==void 0||!!rawBreakoutProps.outline?.length,hasExplicitFanoutBoundaryPadding=rawBreakoutProps.fanoutBoundaryPadding!==void 0,breakoutPlan={routingPhaseIndex:null,routingPcbGroupId:breakout.pcb_group_id??void 0,fanoutRegionPcbGroupId:breakout.pcb_group_id??void 0,routingBounds:routingBounds2,fanoutBounds:hasExplicitGeometry?routingBounds2:hasExplicitFanoutBoundaryPadding?void 0:routingBounds2,autorouter:breakoutProps22.autorouter??"fanout",busFanoutDirections:breakoutProps22.busFanoutDirections,fanoutBoundaryPadding:breakoutProps22.fanoutBoundaryPadding,fanoutRoutingLayers:breakoutProps22.fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),fanoutPourNetMap:breakoutProps22.fanoutPourNetMap,nets:nets.filter(net=>breakoutByNet.get(net)===breakout),traces:breakoutTraces};if(breakout.isDogboneFanout&&breakoutProps22.pcbTracePaths===void 0){breakoutPlans.push({...breakoutPlan,routingBounds:void 0,fanoutBounds:routingBounds2});continue}if(breakout._parsedProps.pcbTracePaths!==void 0){breakoutPlans.push({...breakoutPlan,autorouter:{local:!0,groupMode:"subcircuit",allowViaInPad:(typeof breakoutProps22.autorouter=="object"?breakoutProps22.autorouter.allowViaInPad:void 0)??group2._getAutorouterConfig().allowViaInPad},getPrecomputedRoutingResult:input2=>({traces:getSavedFanoutTraces(breakout,input2)})});continue}if(!shouldUseDefaultAutorouterForBreakoutPoints){breakoutPlans.push(breakoutPlan);continue}if(breakoutPlans.push({...breakoutPlan,autorouter:"default",traces:[]}),unroutedBreakoutTraces.length>0){let automaticFanoutBusIds=new Set(buses.filter(bus=>unroutedBreakoutTraces.some(trace=>bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection))))).map(bus=>bus.name));for(let trace of unroutedBreakoutTraces)trace.name&&automaticFanoutBusIds.add(trace.name);let automaticBusFanoutDirections=breakoutProps22.busFanoutDirections?Object.fromEntries(Object.entries(breakoutProps22.busFanoutDirections).filter(([busId])=>automaticFanoutBusIds.has(busId))):void 0;breakoutPlans.push({...breakoutPlan,routingPcbGroupId:void 0,busFanoutDirections:automaticBusFanoutDirections,traces:unroutedBreakoutTraces})}}if(routeRemaining&&hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[...breakoutPlans,{routingPhaseIndex:null,isImplicitRemainingPhase:!0,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return[...breakoutPlans,...plans]}var RoutingPhasePreparationError=class extends Error{},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.2150",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 && bun run scripts/smoke-tests/check-dist-bundled-schematic-solver.ts","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","@jscad/modeling":"^2.13.0","@resvg/resvg-js":"^2.6.2","@tsci/tscircuit.ti":"github:tscircuit/ti#57e314be4b2b06bc546d4def7453e619604d1157","@tscircuit/alphabet":"0.0.25","@tscircuit/bga-fanout-solver":"github:tscircuit/bga-fanout-solver#247c835cb8d69b65e53891dcf869731079415b39","@tscircuit/bus-lanes-solver":"https://jscdn.tscircuit.com/@tscircuit/bus-lanes-solver/0.0.21.tgz","@tscircuit/cableprinter":"^0.0.6","@tscircuit/capacity-autorouter":"^0.0.982","@tscircuit/checks":"^0.0.253","@tscircuit/circuit-json-util":"^0.0.122","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.67","@tscircuit/create-fdm-enclosure":"0.0.4","@tscircuit/dogbone-solver":"https://jscdn.tscircuit.com/@tscircuit/dogbone-solver/0.0.1.tgz","@tscircuit/fanout-solver":"0.0.78","@tscircuit/flex-utils":"https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.8.tgz","@tscircuit/footprinter":"^0.0.431","@tscircuit/image-utils":"^0.0.8","@tscircuit/implicit-copper-pour-solver":"github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92","@tscircuit/infer-cable-insertion-point":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#23260504fceffff2d64bf11720f74e974d1d9321","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.97","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/modelprinter":"^0.0.18","@tscircuit/ngspice-spice-engine":"^0.0.20","@tscircuit/props":"^0.0.701","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"https://jscdn.tscircuit.com/@tscircuit/schematic-trace-solver/0.0.230.tgz","@tscircuit/solver-utils":"^0.0.16","@tscircuit/soup-util":"^0.0.41","@tscircuit/via-stitch-solver":"github:tscircuit/via-stitch-solver#64f2ac7781b795bdc0d74ba411988e60767fa653","@tscircuit/winding-breakout-point-solver":"github:tscircuit/winding-breakout-point-solver#202dbe9eb0088633b6fa094120dba6f2f41f8803","@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.525","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.33","circuit-json-to-gltf":"^0.0.151","circuit-json-to-spice":"^0.0.45","circuit-to-svg":"^0.0.450",concurrently:"^9.1.2","connectivity-map":"^1.0.1",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.142",kicadts:"^0.0.53","live-server":"^1.2.2",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"0.0.34",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.248",spicets:"^0.0.4",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/create-fdm-enclosure":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/modelprinter":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","circuit-json-to-spice":"*","schematic-symbols":"*",spicets:"*",typescript:"^5.0.0","@tscircuit/cableprinter":"*"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.25","calculate-packing":"^0.0.90","css-select":"5.1.0","format-si-unit":"^0.0.12","gl-matrix":"^3.4.4",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","jscad-planner":"^0.0.18","jscad-fiber":"^0.0.88"},overrides:{"@tscircuit/circuit-json-util":"^0.0.122","@tscircuit/props":"^0.0.701","circuit-json":"^0.0.525","@tscircuit/cableprinter":"^0.0.6"}},getFnv1aHash=value=>{let hash=2166136261;for(let i23=0;i23<value.length;i23++)hash^=value.charCodeAt(i23),hash=Math.imul(hash,16777619);return hash>>>0},getJsonHash=value=>{let serializedValue=JSON.stringify(value),hash1=getFnv1aHash(serializedValue),hash2=getFnv1aHash(`${serializedValue}${hash1}`);return`${hash1.toString(16).padStart(8,"0")}${hash2.toString(16).padStart(8,"0")}`},getLocalAutoroutingCacheKey=(simpleRouteJson,solverOptions)=>`routes:core@${package_default3.version}:solver:${getJsonHash(solverOptions)}:srj:${getJsonHash(simpleRouteJson)}`,getCachedLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey})=>{if(!cacheEngine)return null;try{let cachedResult=await cacheEngine.getItem(cacheKey);if(!cachedResult)return null;let parsedResult=JSON.parse(cachedResult);return!parsedResult||!Array.isArray(parsedResult.traces)?null:parsedResult}catch{return null}},cacheLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey,result})=>{if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(result))}catch{}},SRJ_POINT_POSITION_TOLERANCE_MM=1e-6,srjPointsHaveSamePointId=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0&&first.pointId===second.pointId,srjPointsHaveSameBoardPositionAndLayer=(first,second)=>Math.abs(first.x-second.x)<=SRJ_POINT_POSITION_TOLERANCE_MM&&Math.abs(first.y-second.y)<=SRJ_POINT_POSITION_TOLERANCE_MM&&first.layer===second.layer,srjPointsReferToSameEndpoint=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0?srjPointsHaveSamePointId(first,second):srjPointsHaveSameBoardPositionAndLayer(first,second),getPairedGlobalPoint=(simpleRouteJson,connection)=>{let globalConnection=simpleRouteJson.connections.find(candidate=>candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(globalPoint=>connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint))));if(!globalConnection)return;let pairedPoints=globalConnection.pointsToConnect.filter(globalPoint=>!connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint)));return pairedPoints.length===1?pairedPoints[0]:void 0},getPairedBreakoutExitTarget=(simpleRouteJson,connection)=>{if(!connection.routingPcbGroupId||!connection.source_trace_id)return;let pairedGlobalPoint=getPairedGlobalPoint(simpleRouteJson,connection);if(!(!pairedGlobalPoint||!simpleRouteJson.connections.some(candidate=>candidate.routingPcbGroupId!==void 0&&candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(candidatePoint=>srjPointsReferToSameEndpoint(candidatePoint,pairedGlobalPoint)))))return{x:pairedGlobalPoint.x,y:pairedGlobalPoint.y,layer:pairedGlobalPoint.layer}};function connectionIsInRoutingPhase(connection,phasePlan){if(connection.routingPcbGroupId)return connection.routingPcbGroupId===phasePlan.routingPcbGroupId;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||connection.rootConnectionName===trace.source_trace_id||connection.mergedConnectionNames?.includes(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.routingPcbGroupId||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);let includedConnectionNames=new Set;for(let connection of connections)includedConnectionNames.add(connection.name);let differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split across autorouting phases`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let srjConnectionByName=new Map(simpleRouteJson.connections.map(connection=>[connection.name,connection])),buses=(simpleRouteJson.buses??[]).map(bus=>{let connectionNames=bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName)),cohortConnectionNames=bus.connectionNames.filter(connectionName=>srjConnectionByName.get(connectionName)?.routingPcbGroupId===phasePlan.routingPcbGroupId);if(bus.maxLengthSkew!==void 0&&connectionNames.length>0&&connectionNames.length!==cohortConnectionNames.length)throw new RoutingPhasePreparationError(`Length-matched bus "${bus.name||"unnamed bus"}" cannot be split across autorouting phases. Assign the complete bus to one routingPhaseIndex.`);let connectionExitTargets=Object.fromEntries(connectionNames.flatMap(connectionName=>{let connection=srjConnectionByName.get(connectionName);if(!connection)return[];let pairedTarget=getPairedBreakoutExitTarget(simpleRouteJson,connection);return pairedTarget?[[connectionName,pairedTarget]]:[]}));return{...bus,connectionNames,...Object.keys(connectionExitTargets).length>0?{connectionExitTargets}:{}}}).filter(bus=>bus.connectionNames.length>0),bounds=expandSrjBoundsToIncludeConnectionPoints({bounds:phasePlan.routingBounds??simpleRouteJson.bounds,connections});return{...simpleRouteJson,bounds,outline:getSrjOutlineForRoutingBounds(simpleRouteJson,bounds),connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}}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,minTraceToHoleEdgeClearance=drcTolerances.minTraceToHoleEdgeClearance??simpleRouteJson.minTraceToHoleEdgeClearance,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,minTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}var removeCompletedFanoutConnections=(simpleRouteJson,routingPcbGroupId)=>{let connections=simpleRouteJson.connections.filter(connection=>connection.routingPcbGroupId!==routingPcbGroupId),includedConnectionNames=new Set(connections.map(connection=>connection.name)),differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split at a breakout boundary`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let buses=(simpleRouteJson.buses??[]).map(bus=>({...bus,connectionNames:bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName))})).filter(bus=>bus.connectionNames.length>0);return{...simpleRouteJson,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}},connectFanoutTracesToBreakoutPoints=(simpleRouteJson,breakoutPointIdByConnectionName)=>({...simpleRouteJson,traces:simpleRouteJson.traces?.map(trace=>{let breakoutPointId=breakoutPointIdByConnectionName.get(trace.connection_name??"");return breakoutPointId?{...trace,connectsTo:[...new Set([...trace.connectsTo??[],breakoutPointId])]}:trace})});function Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson,fanoutOutputSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan}){let routingPcbGroupId=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId)return{downstreamSimpleRouteJson:fanoutOutputSimpleRouteJson,baseSimpleRouteJson,synchronizedBreakoutPoints:[]};let outputConnectionByName=new Map(fanoutOutputSimpleRouteJson.connections.map(connection=>[connection.name,connection])),baseConnections=baseSimpleRouteJson.connections.map(connection=>({...connection,pointsToConnect:connection.pointsToConnect.map(point62=>({...point62}))})),synchronizedBreakoutPoints=[],breakoutPointIdByConnectionName=new Map;for(let inputConnection of fanoutInputSimpleRouteJson.connections){if(inputConnection.routingPcbGroupId!==routingPcbGroupId||!inputConnection.source_trace_id)continue;let outputConnection=outputConnectionByName.get(inputConnection.name);if(!outputConnection)continue;let globalPointMatches=baseConnections.filter(connection=>{if(connection.routingPcbGroupId===routingPcbGroupId)return!1;let sharesSourceTrace=connection.source_trace_id===inputConnection.source_trace_id,sharesPointId=connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsHaveSamePointId(globalPoint,inputPoint)));return!sharesSourceTrace&&!sharesPointId?!1:connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(globalPoint,inputPoint)))}).flatMap(globalConnection=>globalConnection.pointsToConnect.flatMap((previousPoint,pointIndex)=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(previousPoint,inputPoint))?[{globalConnection,pointIndex,previousPoint}]:[])),changedPointIndex=outputConnection.pointsToConnect.findIndex((outputPoint,pointIndex)=>{let inputPoint=inputConnection.pointsToConnect[pointIndex];return inputPoint!==void 0&&!srjPointsHaveSameBoardPositionAndLayer(outputPoint,inputPoint)});if(changedPointIndex<0)continue;let fanoutExitPoint=outputConnection.pointsToConnect[changedPointIndex];globalPointMatches.length===0&&synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint:inputConnection.pointsToConnect[changedPointIndex],fanoutExitPoint});for(let{globalConnection,pointIndex,previousPoint}of globalPointMatches){let{terminalVia:_previousTerminalVia,...previousPointWithoutLayerOverrides}=previousPoint,synchronizedGlobalPoint={...previousPointWithoutLayerOverrides,x:fanoutExitPoint.x,y:fanoutExitPoint.y,layer:fanoutExitPoint.layer,...fanoutExitPoint.terminalVia?{terminalVia:{...fanoutExitPoint.terminalVia}}:{}};globalConnection.pointsToConnect[pointIndex]=synchronizedGlobalPoint,previousPoint.pointId&&breakoutPointIdByConnectionName.set(inputConnection.name,previousPoint.pointId),synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint,fanoutExitPoint})}}let newFanoutSourceKeepouts=fanoutOutputSimpleRouteJson.obstacles.filter(obstacle=>obstacle.isFanoutSourceKeepout===!0&&obstacle.componentId!==void 0),completedSourceComponentIds=new Set(newFanoutSourceKeepouts.flatMap(obstacle=>obstacle.componentId===void 0?[]:[obstacle.componentId])),retainedBaseObstacles=baseSimpleRouteJson.obstacles.filter(obstacle=>!obstacle.componentId||!completedSourceComponentIds.has(obstacle.componentId));return{downstreamSimpleRouteJson:removeCompletedFanoutConnections(connectFanoutTracesToBreakoutPoints(fanoutOutputSimpleRouteJson,breakoutPointIdByConnectionName),routingPcbGroupId),baseSimpleRouteJson:{...baseSimpleRouteJson,connections:baseConnections,obstacles:[...retainedBaseObstacles,...newFanoutSourceKeepouts]},synchronizedBreakoutPoints}}function getJumperPadInfos(db22){let padInfos=[],jumperSourceComponentIds=new Set(db22.source_component.list().filter(component=>component.name?.startsWith("__autoplaced_jumper")).map(component=>component.source_component_id));if(jumperSourceComponentIds.size===0)return padInfos;let jumperPcbComponentIds=new Set(db22.pcb_component.list().filter(component=>jumperSourceComponentIds.has(component.source_component_id)).map(component=>component.pcb_component_id)),jumperSmtpads=db22.pcb_smtpad.list().filter(pad2=>jumperPcbComponentIds.has(pad2.pcb_component_id));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,x23,y23,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x23)<tolerance&&Math.abs(pad2.y-y23)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x23,y23){for(let pad2 of padInfos)if(x23>=pad2.minX&&x23<=pad2.maxX&&y23>=pad2.minY&&y23<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route2,padInfos){if(route2.length===0||padInfos.length===0)return[route2];let segments=[],currentSegment=[];for(let i23=0;i23<route2.length;i23++){let point62=route2[i23];if(currentSegment.push(point62),point62.route_type==="wire"&&i23>0&&i23<route2.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,padInfos){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}var claimSrjAssignablePcbViasTraversedByRoute=({db:db22,pcbTrace,routeWithSrjMetadata})=>{for(let routePoint3 of routeWithSrjMetadata){if(routePoint3.route_type!=="through_pad")continue;let pcbViaId=routePoint3.circuitJsonMetadata?.pcb_via_id;if(!pcbViaId)continue;let assignablePcbVia=db22.pcb_via.get(pcbViaId);!assignablePcbVia?.net_is_assignable||assignablePcbVia.net_assigned&&assignablePcbVia.pcb_trace_id!==pcbTrace.pcb_trace_id||db22.pcb_via.update(assignablePcbVia.pcb_via_id,{pcb_trace_id:pcbTrace.pcb_trace_id,net_assigned:!0})}},getAxisGap=(firstMinimum,firstMaximum,secondMinimum,secondMaximum)=>Math.max(secondMinimum-firstMaximum,firstMinimum-secondMaximum),findFanoutPhaseSeparationConflict=regions=>{for(let firstIndex=0;firstIndex<regions.length;firstIndex++){let firstRegion=regions[firstIndex];for(let secondIndex=firstIndex+1;secondIndex<regions.length;secondIndex++){let secondRegion=regions[secondIndex];if(firstRegion.regionId&&firstRegion.regionId===secondRegion.regionId)continue;let horizontalGap=getAxisGap(firstRegion.bounds.minX,firstRegion.bounds.maxX,secondRegion.bounds.minX,secondRegion.bounds.maxX),verticalGap=getAxisGap(firstRegion.bounds.minY,firstRegion.bounds.maxY,secondRegion.bounds.minY,secondRegion.bounds.maxY),availableGap=Math.max(horizontalGap,verticalGap),requiredGap=firstRegion.boundaryKeepaway+secondRegion.boundaryKeepaway;if(availableGap+1e-6<requiredGap)return{firstRegion,secondRegion,availableGap,requiredGap}}}};function getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces,stageOutputPcbTraces}){let replacedPcbTraceIds=new Set(stageOutputPcbTraces.flatMap(trace=>[trace.pcb_trace_id,...trace.__replaces_pcb_trace_id?[trace.__replaces_pcb_trace_id]:[]]));return[...accumulatedPcbTraces.filter(trace=>!replacedPcbTraceIds.has(trace.pcb_trace_id)),...stageOutputPcbTraces]}var POINT_EPSILON3=1e-6;function isPointOnWireSegment({point:point62,segmentStart,segmentEnd}){return point62.layer&&(segmentStart.layer!==point62.layer||segmentEnd.layer!==point62.layer)?!1:pointToSegmentDistance(point62,segmentStart,segmentEnd)<=POINT_EPSILON3}function isPointInSmtPad({point:point62,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point62.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point62.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance3(point62,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point62,hole,traceWidth=0}){return distance3(point62,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db22,trace){let sourcePortIds=new Set,route2=trace.route,endpoints=[route2[0],route2[route2.length-1]].filter(point62=>!!point62&&point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db22.pcb_port.list())pcbPort.source_port_id&&(endpoint.layer&&pcbPort.layers&&!pcbPort.layers.includes(endpoint.layer)||distance3(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id));for(let smtpad2 of db22.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||endpoint.layer&&smtpad2.layer!==endpoint.layer||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db22.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route2=trace.route.filter(point62=>point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);return[route2[0],route2[route2.length-1]].filter(point62=>!!point62)}function getSourceIdsFromConnectedPcbTraces(db22,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db22.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db22.source_trace.get(existingTrace.source_trace_id)&&!db22.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point62=>point62.route_type==="wire");for(let i23=0;i23<existingRoute.length-1;i23++){let segmentStart=existingRoute[i23],segmentEnd=existingRoute[i23+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db22,trace){let sourcePortIds=new Set;for(let point62 of trace.route)for(let pcbPortId of[point62.start_pcb_port_id,point62.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db22.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db22,trace)}function buildSourceConnectivityMap(sourceTraces){let connMap=new ConnectivityMap({});return connMap.addConnections(sourceTraces.map(trace=>[trace.source_trace_id,...trace.connected_source_port_ids,...trace.connected_source_net_ids])),connMap}function getSourceTraceIdForRoutedTrace({db:db22,trace,subcircuit_id}){if(trace.source_trace_id&&(db22.source_trace.get(trace.source_trace_id)??db22.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db22,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db22,trace)[0];let sourceTraces=db22.source_trace.list(),connMap=buildSourceConnectivityMap(sourceTraces),endpointNetIds=sourcePortIds.map(sourcePortId=>connMap.getNetConnectedToId(sourcePortId)).filter(netId=>!!netId),exactSourceTrace=sourcePortIds.length>=2?sourceTraces.find(sourceTrace=>sourcePortIds.every(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId))):void 0;if(exactSourceTrace)return exactSourceTrace.source_trace_id;let sourceTracesInEndpointNets=sourceTraces.filter(sourceTrace=>{let sourceTraceNetId=connMap.getNetConnectedToId(sourceTrace.source_trace_id);return endpointNetIds.some(netId=>netId===sourceTraceNetId)}),connectedToEndpoint=sourceTracesInEndpointNets.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>sourcePortIds.includes(sourcePortId))),candidates=connectedToEndpoint.length>0?connectedToEndpoint:sourceTracesInEndpointNets;if(candidates.length!==0)return(candidates.find(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id)??candidates[0])?.source_trace_id}function groupPadsByInternalConnection(pads,orientation22){let groups=[];for(let pad2 of pads){let key=orientation22==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group2 of groups){let groupKey=orientation22==="vertical"?group2[0].center.y:group2[0].center.x;if(Math.abs(key-groupKey)<.01){group2.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g23=>g23.length>=2)}function insertAutoplacedJumpers(params){let{db:db22,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db22.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation5=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db22.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation5,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=db22.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db22.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=db22.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 group2 of internalGroups){let sourcePortIds=[];for(let groupPad of group2){let padInfo=padData.find(p23=>Math.abs(p23.pad.center.x-groupPad.center.x)<.01&&Math.abs(p23.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db22.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(group2){let relevantSubcircuitIds=new Set;if(!group2.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group2.subcircuit_id);let db22=group2.root?.db;if(!db22)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db22,group2.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group2){let db22=group2.root?.db;if(!db22)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group2);return db22.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group2.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:group2,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db22=group2.root?.db;if(!db22)return;let replacementPcbTraceIds=new Set(pcbTraceIdsToReplace),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(group2).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group2.subcircuit_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 db22.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db22.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db22.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group2){return getExistingPcbTracesForReroute(group2).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route2){let jumperRoutes=route2.filter(p23=>p23.route_type==="jumper"),wireAndViaRoutes=route2.filter(p23=>p23.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 i23=0;i23<wireAndViaRoutes.length;i23++){let p23=wireAndViaRoutes[i23];if(p23.route_type!=="wire")continue;let distToStart=Math.hypot(p23.x-jumperStart.x,p23.y-jumperStart.y),distToEnd=Math.hypot(p23.x-jumperEnd.x,p23.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i23),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i23)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a22,b22)=>a22.startIdx-b22.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 ax22=anchorPosition.x,ay22=anchorPosition.y;switch(alignment){case"top_left":return{x:ax22+width/2,y:ay22-height/2};case"top_center":return{x:ax22,y:ay22-height/2};case"top_right":return{x:ax22-width/2,y:ay22-height/2};case"center_left":return{x:ax22+width/2,y:ay22};case"center_right":return{x:ax22-width/2,y:ay22};case"bottom_left":return{x:ax22+width/2,y:ay22+height/2};case"bottom_center":return{x:ax22,y:ay22+height/2};case"bottom_right":return{x:ax22-width/2,y:ay22+height/2};default:return anchorPosition}}var getDistanceToPoint=(routePoint3,targetPoint)=>{let position4=getRoutePointPosition(routePoint3);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},platformAllowsLegacyAutorouters=group2=>{let platform=group2.root?.platform;return platform!==void 0&&"allowLegacyAutorouters"in platform&&platform.allowLegacyAutorouters===!0},getDisabledLegacyGroupAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let resolvedGroupAutorouter=group2._parsedProps.autorouter??group2.getInheritedProperty("autorouter");return getLegacyAutorouterPreset(resolvedGroupAutorouter)},getDisabledLegacyAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let legacyGroupAutorouterPreset=getDisabledLegacyGroupAutorouterPreset(group2);if(legacyGroupAutorouterPreset)return legacyGroupAutorouterPreset;let routingPhaseAutorouters=group2.selectAll("autoroutingphase").map(autoroutingPhase=>autoroutingPhase._parsedProps.autorouter);for(let autorouter of routingPhaseAutorouters){let legacyAutorouterPreset=getLegacyAutorouterPreset(autorouter);if(legacyAutorouterPreset)return legacyAutorouterPreset}return null},ensureRouteStartsAtSourceTraceStart=({db:db22,route:route2,routeThicknessMode,sourceTraceId})=>{if(!sourceTraceId||route2.length<2)return route2;let firstSourcePortId=db22.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route2;let firstPcbPort=db22.pcb_port.list().find(port=>port.source_port_id===firstSourcePortId);if(!firstPcbPort)return route2;let firstPoint=route2[0],lastPoint=route2[route2.length-1];return getDistanceToPoint(lastPoint,firstPcbPort)<getDistanceToPoint(firstPoint,firstPcbPort)?reversePcbTraceRoute(route2,routeThicknessMode):route2},Group5=class extends NormalComponent{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,"_pcbPlacementDrcErrorCount",null);__publicField(this,"_pcbPlacementDrcCheckError",null);__publicField(this,"_pcbPlacementDrcChecksPending",!1);__publicField(this,"_standaloneSubcircuitDrcChecksComplete",!1);__publicField(this,"_standaloneSubcircuitDrcChecksInProgress",!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 direction3=port._parsedProps.direction;if(!direction3)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction3==="left"?"leftSide":direction3==="right"?"rightSide":direction3==="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:db22}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db22.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}`,db22.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db22}=this.root;for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&db22.source_component.update(child.source_component_id,{source_group_id:this.source_group_id});if(!this.isSubcircuit)return;let disabledLegacyAutorouterPreset=getDisabledLegacyAutorouterPreset(this);disabledLegacyAutorouterPreset&&db22.source_invalid_component_property_error.insert({source_component_id:this.source_component_id??"",property_name:"autorouter",error_type:"source_invalid_component_property_error",message:`The "${disabledLegacyAutorouterPreset}" autorouter is deprecated and is not enabled by this platform. Use the default autorouter and introduce <autoroutingphase /> or <fanout /> elements as needed.`})}doInitialSourceParentAttachment(){let{db:db22}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db22.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit||isAssemblyDeviceContainer(this.parent))return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db22.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,groupProps22=props,hasOutline=groupProps22.outline&&groupProps22.outline.length>0,numericOutline=hasOutline?groupProps22.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=db22.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)db22.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(pcbContentBounds){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db22}=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?db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db22.pcb_group.update(this.pcb_group_id,{center:center22});return}let contentBounds=pcbContentBounds;if(!contentBounds){let bounds=getBoundsOfPcbComponents(this.children);contentBounds={center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.width,height:bounds.height}}let{width,height}=contentBounds,{x:centerX,y:centerY}=contentBounds.center;if(this.isSubcircuit||this.isRoutingDirective){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),existingCenter=db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY},shouldUsePcbContentCenter=this.isSubcircuit||this.isRoutingDirective||pcbContentBounds!==void 0,center2=hasExplicitPositioning?shouldUsePcbContentCenter?{x:props.width===void 0?centerX:existingCenter.x,y:props.height===void 0?centerY:existingCenter.y}:existingCenter:{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}db22.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a543,_b6;return(_a543=this.unnamedElementCounter)[_b6=elm.lowercaseComponentName]??(_a543[_b6]=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:db22}=this.root,groupProps22=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps22.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),Group_doInitialAssignSchematicSheetToConnectedComponents(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this._findDirectChildSubcircuits();for(let subcircuitChild of subcircuitChildren)if(!subcircuitChild._isInflatedFromCircuitJson&&subcircuitChild._hasTracesToRoute()&&subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_findDirectChildSubcircuits(){let result=[],visit=children=>{for(let child of children)child.isSubcircuit&&child!==this?result.push(child):visit(child.children)};return visit(this.children),result}_shouldRouteAsync(){if(this._isLegacyAutorouterDisabled())return!1;let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug132=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithExistingTraceInput=!1;for(let routingPhasePlan of routingPhasePlans){traceCount+=routingPhasePlan.traces.length;let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):void 0;hasReroutePhaseWithExistingTraceInput||(hasReroutePhaseWithExistingTraceInput=!!(routingPhasePlan.reroute&&(routingPhasePlan.region||phaseAutorouterConfig?.preset==="simplify")))}if(debug132(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithExistingTraceInput){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug132(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db22}=this.root,debug132=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig3=this._getAutorouterConfig(),serverUrl=autorouterConfig3.serverUrl,serverMode=autorouterConfig3.serverMode,fetchWithDebug=(url3,options)=>(debug132("fetching",url3),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url3,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 preferredTraceWidth=props.defaultTraceWidth??props.nominalTraceWidth,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:preferredTraceWidth!=null?Number(preferredTraceWidth):void 0,subcircuit_id:this.subcircuit_id,subcircuitComponent:this});simpleRouteJson.allowViaInPad=autorouterConfig3.allowViaInPad;let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r23=>r23.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(r23=>r23.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:autorouterConfig3.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r23=>r23.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(r23=>r23.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(r23=>r23.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err2=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db22.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err2.message}),err2}await new Promise(resolve7=>setTimeout(resolve7,100))}}async _runLocalAutorouting(){let{db:db22}=this.root,props=this._parsedProps,debug132=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug132(`[${this.getString()}] starting local autorouting`);let autorouterConfig3=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig3),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig3),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.defaultTraceWidth??props.nominalTraceWidth??minTraceWidth),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=this.getInheritedProperty("routeRemaining")===!1||Group_hasPhasedAutorouting(routingPhasePlans),shouldEmitRoutingPhaseDebugObjects=routingPhasePlans.length>1,routingPhaseDebugLabels=new Map;if(shouldEmitRoutingPhaseDebugObjects)for(let debugObject of db22.pcb_debug_object.list())debugObject.subcircuit_id===this.subcircuit_id&&(debugObject.label?.startsWith("Autorouting phase: ")||debugObject.label?.startsWith("autorouting phase "))&&db22.pcb_debug_object.delete(debugObject.pcb_debug_object_id);let emitRoutingPhaseDebugObject=(routingPhasePlan,bounds)=>{if(!shouldEmitRoutingPhaseDebugObjects)return;let phaseLabel=routingPhaseDebugLabels.get(routingPhasePlan),phaseName=routingPhasePlan.phaseName?.trim();db22.pcb_debug_object.insert({shape:"rect",center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},size:{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY},label:`autorouting phase ${phaseLabel}${phaseName?` ${phaseName}`:""}`,subcircuit_id:this.subcircuit_id??void 0})},routingStages=routingPhasePlans.flatMap(routingPhasePlan=>{let resolvedPhaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig3,preset=resolvedPhaseAutorouterConfig.preset,implicitPhaseLabel=routingPhasePlan.reroute?preset==="simplify"?"simplify":"reroute":routingPhasePlan.fanoutRegionPcbGroupId?routingPhasePlan.autorouter==="default"&&!routingPhasePlan.getPrecomputedRoutingResult?"breakout":"fanout":preset&&preset!=="default"?preset.replaceAll("_"," "):"default";routingPhaseDebugLabels.set(routingPhasePlan,routingPhasePlan.routingPhaseIndex?.toString()??implicitPhaseLabel);let phaseAutorouterConfig=routingPhasePlan.getPrecomputedRoutingResult?{...resolvedPhaseAutorouterConfig,allowViaInPad:(typeof routingPhasePlan.autorouter=="object"?routingPhasePlan.autorouter.allowViaInPad:void 0)??autorouterConfig3.allowViaInPad}:resolvedPhaseAutorouterConfig,stages=getLocalAutoroutingStages(routingPhasePlan.algorithmFn?{...phaseAutorouterConfig,algorithmFn:routingPhasePlan.algorithmFn}:phaseAutorouterConfig,this.root?.platform);return stages.map((stage,phaseStageIndex)=>({...stage,routingPhasePlan,phaseStageIndex,phaseStageCount:stages.length}))}),implicitPhaseLabelCounts=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);implicitPhaseLabelCounts.set(label,(implicitPhaseLabelCounts.get(label)??0)+1)}let implicitPhaseLabelOrdinals=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);if(implicitPhaseLabelCounts.get(label)<=1)continue;let ordinal=(implicitPhaseLabelOrdinals.get(label)??0)+1;implicitPhaseLabelOrdinals.set(label,ordinal),routingPhaseDebugLabels.set(plan,`${label} ${ordinal}`)}let fanoutPourNetMap=routingStages.some(({autorouterConfig:autorouterConfig22})=>["fanout","single_layer_fanout","dogbone"].includes(autorouterConfig22.preset??""))?Group_getFanoutPourNetMap(this,routingPhasePlans):void 0,{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,fanoutPourNetMap}),emitFanoutBoundsConflictWarning=routingPhasePlan=>{let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)return;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),sourceComponentId=db22.pcb_component.list().find(component=>component.pcb_group_id===fanoutRegionPcbGroupId)?.source_component_id;if(!sourceComponentId)return;let message=`${pcbGroup?.name??"Breakout"} defines conflicting fanout bounds with explicit breakout geometry and fanoutBoundaryPadding. Explicit breakout geometry takes precedence, so fanoutBoundaryPadding is ignored.`;db22.source_property_ignored_warning.list().some(warning=>warning.source_component_id===sourceComponentId&&warning.property_name==="fanoutBoundaryPadding"&&warning.message===message)||db22.source_property_ignored_warning.insert({source_component_id:sourceComponentId,property_name:"fanoutBoundaryPadding",message,error_type:"source_property_ignored_warning",subcircuit_id:pcbGroup?.subcircuit_id})},fanoutConfigByPhasePlan=new Map;for(let routingStage of routingStages){let fanoutMode=routingStage.autorouterConfig.preset;(fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!fanoutConfigByPhasePlan.has(routingStage.routingPhasePlan)&&fanoutConfigByPhasePlan.set(routingStage.routingPhasePlan,routingStage.autorouterConfig)}let fanoutPhaseRegions=[];for(let[routingPhasePlan,phaseAutorouterConfig]of fanoutConfigByPhasePlan){let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)continue;let phaseSimpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);if(phaseSimpleRouteJson.connections.length===0)continue;phaseSimpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(phaseSimpleRouteJson,routingPhasePlan.drcTolerances);let breakoutPoints=db22.pcb_breakout_point.list().filter(point62=>point62.pcb_group_id===fanoutRegionPcbGroupId).map(point62=>({x:point62.x,y:point62.y})),fanoutMode=phaseAutorouterConfig.preset,fanoutBounds=FanoutAutorouter.resolveFanoutBounds(phaseSimpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:phaseSimpleRouteJson.allowBlindAndBuriedVias,breakoutPoints,onFanoutBoundsConflict:()=>emitFanoutBoundsConflictWarning(routingPhasePlan)});if(routingPhasePlan.fanoutBounds=fanoutBounds,!fanoutBounds)continue;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),maximumTraceWidth=Math.max(phaseSimpleRouteJson.minTraceWidth,...phaseSimpleRouteJson.connections.map(connection=>connection.nominalTraceWidth??connection.width??phaseSimpleRouteJson.minTraceWidth)),viaPadDiameter=phaseSimpleRouteJson.minViaPadDiameter??phaseSimpleRouteJson.min_via_pad_diameter??phaseSimpleRouteJson.minViaDiameter,traceToPadClearance=phaseSimpleRouteJson.minTraceToPadEdgeClearance??phaseSimpleRouteJson.defaultObstacleMargin??maximumTraceWidth;fanoutPhaseRegions.push({regionId:fanoutRegionPcbGroupId,name:pcbGroup?.name??routingPhasePlan.phaseName??fanoutRegionPcbGroupId,bounds:fanoutBounds,boundaryKeepaway:getFanoutBoundaryPointSpacing({traceWidth:maximumTraceWidth,traceToPadClearance,viaPadDiameter})/2})}let fanoutSeparationConflict=findFanoutPhaseSeparationConflict(fanoutPhaseRegions);if(fanoutSeparationConflict){let{firstRegion,secondRegion,availableGap,requiredGap}=fanoutSeparationConflict,separationDescription=availableGap<0?`overlap by ${Math.abs(availableGap).toFixed(3)}mm`:`are only ${availableGap.toFixed(3)}mm apart`,message=`Fanout regions "${firstRegion.name}" and "${secondRegion.name}" ${separationDescription}, but at least ${requiredGap.toFixed(3)}mm of separation is required for a via-safe routing channel. Move the components farther apart or reduce their facing fanout padding.`;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message},simpleRouteJson:baseSimpleRouteJson}),new Error(message)}for(let{regionId,bounds}of fanoutPhaseRegions)db22.pcb_group.update(regionId,{center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY});let outputTraces=[],outputJumpers=[],pcbTraceIdsToDelete=new Set,existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this),traceMatchesRoutingPhase=(trace,routingPhasePlan)=>{let connectionName=trace.connection_name??trace.pcb_trace_id,sourceTraceIds=new Set([connectionName,trace.pcb_trace_id,...getSourceTraceIdsFromRerouteName(connectionName),...getSourceTraceIdsFromRerouteName(trace.pcb_trace_id)]);return baseSimpleRouteJson.connections.some(connection=>connectionIsInRoutingPhase(connection,routingPhasePlan)?sourceTraceIds.has(connection.name)||(connection.source_trace_id?sourceTraceIds.has(connection.source_trace_id):!1)||(connection.rootConnectionName?sourceTraceIds.has(connection.rootConnectionName):!1)||connection.mergedConnectionNames?.some(name=>sourceTraceIds.has(name)):!1)},manualSourceTraceIds=new Set(this.getDescendants().filter(child=>child instanceof Trace&&!child.getSubcircuit()._isInflatedFromCircuitJson&&!!child._parsedProps.pcbPath?.length).map(trace=>trace.source_trace_id)),manualPcbTraceIds=new Set(db22.pcb_trace.list().filter(trace=>trace.source_trace_id&&manualSourceTraceIds.has(trace.source_trace_id)).map(trace=>trace.pcb_trace_id)),fixedTraceIds=new Set(manualPcbTraceIds),previousStageOutputSimpleRouteJson,skippedRemainingPhases=new Set;for(let[routingStageIndex,{routingPhasePlan,autorouterConfig:phaseAutorouterConfig,strategy:localAutorouterStrategy,usesPreviousStageOutput,phaseStageIndex,phaseStageCount}]of routingStages.entries()){if(skippedRemainingPhases.has(routingPhasePlan))continue;if(usesPreviousStageOutput||(previousStageOutputSimpleRouteJson=void 0),usesPreviousStageOutput&&previousStageOutputSimpleRouteJson===void 0)throw new Error("Autorouting follow-up stage is missing the preceding stage output");let simpleRouteJson=previousStageOutputSimpleRouteJson??baseSimpleRouteJson,isTraceSimplificationPhase=!!(routingPhasePlan.reroute&&phaseAutorouterConfig.preset==="simplify"),isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region&&!isTraceSimplificationPhase),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!isTraceSimplificationPhase&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase||isTraceSimplificationPhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(!usesPreviousStageOutput&&isTraceSimplificationPhase)simpleRouteJson={...Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:existingRerouteSeedTraces,stageOutputPcbTraces:outputTraces})};else if(!usesPreviousStageOutput&&isRegionReroutePhase&&rerouteOriginalSrj)simpleRouteJson=Fce(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region});else if(!usesPreviousStageOutput&&isConnectionReroutePhase){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan))]}}else if(!usesPreviousStageOutput&&hasPhasedAutorouting){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),activeCustomBreakoutRoutingGroupId=routingPhasePlan.routingPcbGroupId;if(activeCustomBreakoutRoutingGroupId){let activeGroupCopperPourObstacles=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,routingPcbGroupId:activeCustomBreakoutRoutingGroupId,fanoutPourNetMap}).simpleRouteJson.obstacles.filter(obstacle=>obstacle.isCopperPour),nonCopperPourObstacles=phaseInput.obstacles.filter(obstacle=>!obstacle.isCopperPour);phaseInput.obstacles=nonCopperPourObstacles.concat(activeGroupCopperPourObstacles)}simpleRouteJson={...phaseInput,traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:phaseInput.traces??[],stageOutputPcbTraces:outputTraces})}}if(phaseAutorouterConfig.preset!=="bus_lanes"){let preservesManualTraceGeometry=!phaseAutorouterConfig.algorithmFn&&(phaseAutorouterConfig.preset==="fanout"||phaseAutorouterConfig.preset==="single_layer_fanout");simpleRouteJson=withFixedTraces(simpleRouteJson,preservesManualTraceGeometry?new Set([...fixedTraceIds].filter(pcbTraceId=>!manualPcbTraceIds.has(pcbTraceId))):fixedTraceIds)}simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),simpleRouteJson.allowViaInPad=phaseAutorouterConfig.allowViaInPad;let getPrecomputedRoutingResult=usesPreviousStageOutput?void 0:routingPhasePlan.getPrecomputedRoutingResult,preflightRoutingCheckPolicy3=this.getInheritedProperty("preflightRoutingCheckPolicy")??"basic";if(routingPhasePlan.isImplicitRemainingPhase&&phaseStageIndex===0&&this.getInheritedProperty("routeRemaining")===void 0&&(preflightRoutingCheckPolicy3==="basic"||preflightRoutingCheckPolicy3==="conservative")&&simpleRouteJson.connections.length>50){skippedRemainingPhases.add(routingPhasePlan),db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouting_error_remaining_routes_${this.subcircuit_id}`,subcircuit_id:this.subcircuit_id??void 0,error_type:"pcb_autorouting_error",message:`Remaining routes left unrouted (over 50 traces remaining and preflightRoutingCheckPolicy="${preflightRoutingCheckPolicy3}"). Set <board routeRemaining={true} /> or create <autoroutingphase /> elements for specific connections in the order you'd like to route them. The autorouter may hang unless you create autorouting phases incrementally.`});continue}let simplificationHasNoTraceInput=!!(isTraceSimplificationPhase&&simpleRouteJson.traces?.length===0);if((hasPhasedAutorouting||isReroutePhase||usesPreviousStageOutput)&&(simpleRouteJson.connections.length===0&&!isTraceSimplificationPhase&&!getPrecomputedRoutingResult||simplificationHasNoTraceInput)){phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,simpleRouteJson.bounds),previousStageOutputSimpleRouteJson=simpleRouteJson;continue}let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes));let fanoutMode=phaseAutorouterConfig.preset;if((fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!routingPhasePlan.fanoutRegionPcbGroupId&&!getPrecomputedRoutingResult&&(routingPhasePlan.fanoutBounds=FanoutAutorouter.resolveFanoutBounds(simpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias})),phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,routingPhasePlan.fanoutBounds??simpleRouteJson.bounds),debug132.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug132.enabled){let graphicsObject=Go2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}let autorouterVersion22=phaseAutorouterConfig.autorouterVersion??this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0,commonAutorouterOptions={capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,platformConfig:this.root?.platform,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion22,effort},autorouterName=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom":localAutorouterStrategy.name,solverName=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn?void 0:localAutorouterStrategy.getSolverName(commonAutorouterOptions),localAutoroutingCacheSolverOptions={autorouterName,solverName,capacityDepth:commonAutorouterOptions.capacityDepth,targetMinCapacity:commonAutorouterOptions.targetMinCapacity,useAssignableSolver:commonAutorouterOptions.useAssignableSolver,useAutoJumperSolver:commonAutorouterOptions.useAutoJumperSolver,useLaserPrefabSolver:commonAutorouterOptions.useLaserPrefabSolver,useTraceSimplificationSolver:phaseAutorouterConfig.preset==="simplify",autorouterVersion:commonAutorouterOptions.autorouterVersion,effort:commonAutorouterOptions.effort},cacheEngine=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn||!localAutorouterStrategy.cacheable?void 0:this.root?.platform?.localCacheEngine,cacheKey=cacheEngine?getLocalAutoroutingCacheKey(simpleRouteJson,localAutoroutingCacheSolverOptions):void 0,cachedResult=cacheKey?await getCachedLocalAutoroutingPhaseResult({cacheEngine,cacheKey}):null,cacheDisabledReason=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom_algorithm":localAutorouterStrategy.cacheable?cacheEngine?void 0:"no_cache_engine":"strategy_not_cacheable",autoroutingMetadata={routingPhaseIndex:routingPhasePlan.routingPhaseIndex,_actualRoutingPhaseOrderIndex:routingStageIndex,phaseOrdinal:routingStageIndex+1,phaseCount:routingStages.length,connectionCount:simpleRouteJson.connections.length,obstacleCount:simpleRouteJson.obstacles.length,previousTraceCount:simpleRouteJson.traces?.length??0,isReroutePhase,autorouterName,autorouterVersion:autorouterVersion22,solverName,effort,cacheStatus:cacheEngine?cachedResult?"hit":"miss":"disabled",cacheKey,cacheDisabledReason};this.root?.emit("autorouting:start",{type:"autorouting:start",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson});let autorouter;try{let traces,precomputedOutputSimpleRouteJson;if(getPrecomputedRoutingResult){let result=getPrecomputedRoutingResult(simpleRouteJson);traces=result.traces,precomputedOutputSimpleRouteJson=result.outputSimpleRouteJson;for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id)}else if(cachedResult)debug132(`[${this.getString()}] using cached local autorouting result`),traces=cachedResult.traces;else{if(phaseAutorouterConfig.algorithmFn?autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson):autorouter=localAutorouterStrategy.create({simpleRouteJson,onSolverEnded:event=>this.root?.emit("solver:ended",{...event,type:"solver:ended",componentName:this.getString()}),commonAutorouterOptions,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias,componentNamesById:getPcbComponentNamesById(db22),onSolverStarted:({solverName:solverName2,solverParams,solverConstructorArgs})=>this.root?.emit("solver:started",{type:"solver:started",solverName:solverName2,solverParams,solverConstructorArgs,componentName:this.getString()})}),!autorouter)throw new Error("Failed to create local autorouter");let activeAutorouter=autorouter,routingPromise=new Promise((resolve7,reject)=>{activeAutorouter.on("complete",event=>{debug132(`[${this.getString()}] local autorouting complete`),resolve7(event.traces)}),activeAutorouter.on("error",event=>{debug132(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});activeAutorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,...event,type:"autorouting:progress"})}),activeAutorouter.start(),traces=await routingPromise}let transformedSimpleRouteJson=precomputedOutputSimpleRouteJson??autorouter?.getOutputSimpleRouteJson?.();if(localAutorouterStrategy.preserveOutputTraces&&transformedSimpleRouteJson?.traces&&(transformedSimpleRouteJson={...transformedSimpleRouteJson,traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:transformedSimpleRouteJson.traces})}),transformedSimpleRouteJson&&!usesPreviousStageOutput&&["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")&&routingPhasePlan.routingPcbGroupId){let synchronizedFanout=Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson:simpleRouteJson,fanoutOutputSimpleRouteJson:transformedSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan});baseSimpleRouteJson=synchronizedFanout.baseSimpleRouteJson,transformedSimpleRouteJson=synchronizedFanout.downstreamSimpleRouteJson;for(let synchronizedPoint of synchronizedFanout.synchronizedBreakoutPoints){let breakoutPoint=db22.pcb_breakout_point.list().find(point62=>point62.pcb_group_id===synchronizedPoint.routingPcbGroupId&&point62.source_trace_id===synchronizedPoint.sourceTraceId&&Math.abs(point62.x-synchronizedPoint.previousPoint.x)<=1e-6&&Math.abs(point62.y-synchronizedPoint.previousPoint.y)<=1e-6);breakoutPoint&&db22.pcb_breakout_point.update(breakoutPoint.pcb_breakout_point_id,{x:synchronizedPoint.fanoutExitPoint.x,y:synchronizedPoint.fanoutExitPoint.y,layer:synchronizedPoint.fanoutExitPoint.layer})}}if(localAutorouterStrategy.preserveOutputTraces)for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id);let stageOutputTraces=traces;transformedSimpleRouteJson?.traces?stageOutputTraces=transformedSimpleRouteJson.traces:usesPreviousStageOutput&&(stageOutputTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let eventOutputPcbTraces=stageOutputTraces;!transformedSimpleRouteJson&&!usesPreviousStageOutput&&routingPhasePlan.routingPhaseIndex!==null&&(eventOutputPcbTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let outputSimpleRouteJson={...transformedSimpleRouteJson??simpleRouteJson,traces:eventOutputPcbTraces};previousStageOutputSimpleRouteJson=transformedSimpleRouteJson?outputSimpleRouteJson:void 0,!cachedResult&&cacheKey&&await cacheLocalAutoroutingPhaseResult({cacheEngine,cacheKey,result:{...simpleRouteJson,traces}});let savedPhasePaths=getAutoroutingPhasePcbTracePaths({group:this.selectAll("group").find(group2=>group2.pcb_group_id===routingPhasePlan.fanoutRegionPcbGroupId)??routingPhasePlan.autoroutingPhase?.getGroup()??this,subcircuit:this,input:simpleRouteJson,traces,isFanout:["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")});if(this.root?.emit("autorouting:end",{...savedPhasePaths,type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson:outputSimpleRouteJson}),autorouter?.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db22,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter?.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isRegionReroutePhase&&rerouteOriginalSrj){for(let trace of rerouteOriginalSrj.traces??[])trace.type==="pcb_trace"&&pcbTraceIdsToDelete.add(trace.pcb_trace_id);let reconnectedSrj=jce(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else if(isConnectionReroutePhase){let retainedPcbTraces=outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan));outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:retainedPcbTraces,stageOutputPcbTraces:stageOutputTraces}))}else{if(isTraceSimplificationPhase)for(let existingTrace of existingRerouteSeedTraces)fixedTraceIds.has(existingTrace.pcb_trace_id)||pcbTraceIdsToDelete.add(existingTrace.pcb_trace_id);outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:outputTraces,stageOutputPcbTraces:stageOutputTraces}))}}catch(error2){let{db:db32}=this.root;throw db32.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",{type:"autorouting:error",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter?.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers,pcb_trace_ids_to_be_replaced:[...pcbTraceIdsToDelete]},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("autorouting",async()=>{try{await this._runLocalAutorouting()}catch(error2){if(!(error2 instanceof RoutingPhasePreparationError))throw error2;let{db:db22}=this.root,pcbErrorId=`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`;throw db22.pcb_autorouting_error.list().some(recordedError=>recordedError.pcb_error_id===pcbErrorId&&recordedError.message===error2.message)||(db22.pcb_autorouting_error.insert({pcb_error_id:pcbErrorId,error_type:"pcb_autorouting_error",message:error2.message,subcircuit_id:this.subcircuit_id??void 0}),this.root?.emit("autorouting:error",{type:"autorouting:error",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error2.message}})),error2}}):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(!this.isSubcircuit||this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled")||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled()||this._shouldUseTraceByTraceRouting())return;if(!this._areChildSubcircuitsRouted()){debug132(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}if(debug132(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),!this._hasTracesToRoute())return;let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations||this._startAsyncAutorouting()}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}doInitialSchematicSheetRender(){Group_doInitialSchematicSheetRender(this)}updateSchematicSheetRender(){Group_updateSchematicSheetRender(this)}updatePcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug132(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled())return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){if(this._areChildSubcircuitsRouted()){let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});if(shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations)return;debug132(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting()}return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db22}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug132(`[${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){debug132(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db22}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let cjRoute=routedTrace.route.map(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),pcb_trace3=db22.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:getCircuitJsonPcbTraceRoute(cjRoute)});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:pcb_trace3,routeWithSrjMetadata:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db22}=this.root,pcbStyle3=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle3),boardComponent=this._getBoard(),board=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):db22.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:db22,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});let materializedPcbVias=db22.pcb_via.list(),jumperPadInfos=getJumperPadInfos(db22);for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=this.subcircuit_id);let cjRoute=pcb_trace3.route.map(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db22,route:cjRoute,routeThicknessMode:pcb_trace3.route_thickness_mode,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,jumperPadInfos);for(let segment2 of processedSegments)if(segment2.length>0){let circuitJsonSegment=getCircuitJsonPcbTraceRoute(segment2),sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:circuitJsonSegment},subcircuit_id:this.subcircuit_id}),insertedPcbTrace=db22.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:circuitJsonSegment});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:insertedPcbTrace,routeWithSrjMetadata:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db22.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db22.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point62 of pcb_trace3.route)if(point62.route_type==="via"){let routedViaPoint=point62,fromLayer=point62.from_layer,toLayer=point62.to_layer,pcbVia={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:getAutoroutedViaLayers({fromLayer,toLayer,layerCount:this._getSubcircuitLayerCount(),allowBlindAndBuriedVias:board?.allow_blind_and_buried_vias??!1,physicalLayers:routedViaPoint.layers}),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:this.subcircuit_id,pcb_group_id:this.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey};if(materializedPcbVias.some(materializedPcbVia=>pcbViasSharePhysicalHole(materializedPcbVia,pcbVia)))continue;materializedPcbVias.push(db22.pcb_via.insert(pcbVia))}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,schematic_group3=db22.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.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&(child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db22.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}if(this.children.some(c23=>c23.source_component_id!==null&&c23._parsedProps?.schSectionName!==void 0)){this._doInitialSchematicLayoutSections(),this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutSections(){Group_doInitialSchematicLayoutSections(this)}_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:db22}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db22.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db22.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:db22}=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?db22.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;db22.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 dx22=port.center.x-component.center.x,dy22=port.center.y-component.center.y;return Math.abs(dx22)>Math.abs(dy22)?dx22>0?"right":"left":dy22>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)}_isLegacyAutorouterDisabled(){return getDisabledLegacyAutorouterPreset(this)!==null}_isLaserPrefabAutorouter(autorouterConfig3=this._getAutorouterConfig()){let autorouterProp3=this.props.autorouter,normalize9=value=>value?.replace(/-/g,"_")??value;return autorouterConfig3.preset==="laser_prefab"?!0:typeof autorouterProp3=="string"?normalize9(autorouterProp3)==="laser_prefab":typeof autorouterProp3=="object"&&autorouterProp3?normalize9(autorouterProp3.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig3=this._getAutorouterConfig()){let autorouterProp3=this.props.autorouter,normalize9=value=>value?.replace(/-/g,"_")??value;return autorouterConfig3.preset==="auto_jumper"?!0:typeof autorouterProp3=="string"?normalize9(autorouterProp3)==="auto_jumper":typeof autorouterProp3=="object"&&autorouterProp3?normalize9(autorouterProp3.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return getDisabledLegacyGroupAutorouterPreset(this)?!1:this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this._isLegacyAutorouterDisabled()||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db22}=this.root;if(this.isSubcircuit){let immediateChildrenByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=immediateChildrenByName.get(child._parsedProps.name)||[];components.push(child),immediateChildrenByName.set(child._parsedProps.name,components)}for(let[name,components]of immediateChildrenByName.entries()){if(components.length<=1)continue;let sameNamedTraces=components.filter(child=>child instanceof Trace),duplicateNameIsOnlyTraces=sameNamedTraces.length===components.length,mutuallyConnectedTraceKeys=sameNamedTraces.map(trace=>trace.subcircuit_connectivity_map_key),sameNamedTracesAreMutuallyConnected=duplicateNameIsOnlyTraces&&mutuallyConnectedTraceKeys.every(Boolean)&&new Set(mutuallyConnectedTraceKeys).size===1;if(!duplicateNameIsOnlyTraces||!sameNamedTracesAreMutuallyConnected){let displaySubcircuitName=this.name||"unnamed",message=duplicateNameIsOnlyTraces?`Trace "${name}" in subcircuit "${displaySubcircuitName}" shares a name with another trace, but the traces are not mutually connected. Same-named traces must have the same subcircuit connectivity map key.`:`Multiple immediate children found with name "${name}" in subcircuit "${displaySubcircuitName}". Names must be unique.`;db22.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c23=>c23.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks(this)}doInitialSchematicLabelNetsWithConflictingNames(){this.root?.schematicDisabled||this.getTopLevelRenderable()===this&&assignSchematicNetLabelSuperscripts(this.root.db)}updateSchematicLabelNetsWithConflictingNames(){this.doInitialSchematicLabelNetsWithConflictingNames()}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db22}=this.root,subtree=db22;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text2=nl3.text||net?.name||"",isGroundNet=net?.is_ground||GROUND_NET_REGEX.test(text2),isPowerNet=net?.is_power||POWER_NET_REGEX.test(text2);if(nl3.anchor_side==="top"&&isGroundNet){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&isPowerNet&&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}),groupProps22={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)}groupProps22.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps22.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps22.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group2=new Group5(groupProps22);return group2._isInflatedFromCircuitJson=!0,group2.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group2),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group2):subcircuit.add(group2),group2}var Inductor2=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,max_current_rating:props.maxCurrentRating===void 0?void 0:parseAndConvertSiUnit(props.maxCurrentRating,"A").value,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),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 Inductor2({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)}var generatedNotes=new WeakMap,getPolarity2=port=>{let hints=[port.name,...port.port_hints??[]].map(hint=>hint.toLowerCase().replace(/[^a-z0-9+-]/g,"")),anode=hints.some(hint=>["a","anode","pos","positive","+"].includes(hint)),cathode=hints.some(hint=>["k","c","cathode","neg","negative","-"].includes(hint));return anode===cathode?null:anode?"anode":"cathode"},Led_addPolarityFabricationSymbol=led2=>{let root=led2.root;if(!root)return;let{db:db22}=root,previous=generatedNotes.get(led2);for(let path of previous??[])db22.pcb_fabrication_note_path.delete(path.pcb_fabrication_note_path_id);if(generatedNotes.delete(led2),root.pcbDisabled||!led2.pcb_component_id)return;let pcb=db22.pcb_component.get(led2.pcb_component_id);if(!pcb||pcb.layer!=="top"&&pcb.layer!=="bottom")return;let ports=db22.source_port.list({source_component_id:led2.source_component_id}),anodes=ports.filter(port=>getPolarity2(port)==="anode"),cathodes=ports.filter(port=>getPolarity2(port)==="cathode");if(anodes.length!==1||cathodes.length!==1)return;let anode=anodes[0],cathode=cathodes[0],a22=db22.pcb_port.getWhere({source_port_id:anode.source_port_id}),k22=db22.pcb_port.getWhere({source_port_id:cathode.source_port_id});if(!a22||!k22)return;let distance27=Math.hypot(k22.x-a22.x,k22.y-a22.y);if(distance27<1e-6)return;let angle3=Math.atan2(k22.y-a22.y,k22.x-a22.x),frame=compose2(translate2((a22.x+k22.x)/2,(a22.y+k22.y)/2),rotate2(angle3)),point62=(x23,y23)=>applyToPoint2(frame,{x:x23,y:y23}),common={pcb_component_id:pcb.pcb_component_id,subcircuit_id:led2.getSubcircuit()?.subcircuit_id??void 0,layer:pcb.layer},notes=[];generatedNotes.set(led2,notes);let halfLength=Math.min(distance27*.2,.4),halfHeight=halfLength*.75,routes=[[point62(-distance27/2,0),point62(-halfLength,0)],[point62(-halfLength,-halfHeight),point62(halfLength,0),point62(-halfLength,halfHeight),point62(-halfLength,-halfHeight)],[point62(halfLength,-halfHeight),point62(halfLength,halfHeight)],[point62(halfLength,0),point62(distance27/2,0)]];for(let route2 of routes)notes.push(db22.pcb_fabrication_note_path.insert({...common,route:route2,stroke_width:.08}))},Led=class extends NormalComponent{get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null,baseSymbolName=variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&baseSymbolName==="led"?`led_${compactSize}`:void 0;return{schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){let hasFootprintChild=this.children.some(child=>child.componentName==="Footprint"),footprint=this.resolveFootprint(),hasPinLabels=!!this._resolvePinLabels(),shouldAddDefaultAliases=!hasPinLabels&&!hasFootprintChild&&(!footprint||isFootprinterString(footprint));super.initPorts({pinCount:2,ignoreSymbolPorts:!hasPinLabels&&!shouldAddDefaultAliases,additionalAliases:{pin1:shouldAddDefaultAliases?["anode","pos","left"]:[],pin2:shouldAddDefaultAliases?["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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_led",name:this.name,wave_length:props.wavelength,color:props.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}get pos(){return this.portMap.pos}doInitialPcbComponentSizeCalculation(){super.doInitialPcbComponentSizeCalculation(),Led_addPolarityFabricationSymbol(this)}get anode(){return this.portMap.anode}get neg(){return this.portMap.neg}get cathode(){return this.portMap.cathode}};function inflateSourceLed(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}),led2=new Led({name:sourceElm.name,color:sourceElm.color,wavelength:sourceElm.wavelength??sourceElm.wave_length,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:led2});footprint&&led2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(led2):subcircuit.add(led2)}var possibleOrientations=[{gate:"left",drain:"top",source:"bottom"},{gate:"left",drain:"bottom",source:"top"},{gate:"right",drain:"top",source:"bottom"},{gate:"right",drain:"bottom",source:"top"},{gate:"top",drain:"left",source:"right"},{gate:"top",drain:"right",source:"left"},{gate:"bottom",drain:"left",source:"right"},{gate:"bottom",drain:"right",source:"left"}],getBaselineOrientation=rotation5=>{let normalizedRotation=(rotation5%360+360)%360;if(normalizedRotation%90!==0)throw new Error(`Schematic rotation ${rotation5} is not supported for Mosfet`);return[{gate:"left",drain:"top",source:"bottom"},{gate:"top",drain:"right",source:"left"},{gate:"right",drain:"bottom",source:"top"},{gate:"bottom",drain:"left",source:"right"}][normalizedRotation/90]},getRequestedOrientation=props=>{let requestedSides={drain:props.symbolDrainSide,source:props.symbolSourceSide,gate:props.symbolGateSide},baseline=getBaselineOrientation(Number(props.schRotation??0)),matchingOrientations=possibleOrientations.filter(orientation22=>Object.keys(requestedSides).every(portName=>requestedSides[portName]===void 0||requestedSides[portName]===orientation22[portName]));if(matchingOrientations.length===0){let requestedDescription=Object.entries(requestedSides).filter(([,side])=>side!==void 0).map(([portName,side])=>`${portName}=${side}`).join(", ");throw new Error(`Invalid MOSFET symbol port side combination (${requestedDescription}). The gate must be perpendicular to the drain and source, and the drain and source must be opposite.`)}return matchingOrientations.sort((a22,b22)=>{let score=orientation22=>Object.keys(baseline).filter(portName=>orientation22[portName]!==baseline[portName]).length;return score(a22)-score(b22)})[0]},getMosfetSchematicSymbolName=props=>{let mosfetMode=props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${props.channelType}_channel_${mosfetMode}_mosfet_transistor`;if(!(props.symbolDrainSide!==void 0||props.symbolSourceSide!==void 0||props.symbolGateSide!==void 0))return baseSymbolName;let{gate,drain}=getRequestedOrientation(props);return`${baseSymbolName}_gate_${gate}_drain_${drain}`},Mosfet2=class extends NormalComponent{get config(){return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??getMosfetSchematicSymbolName(this.props),zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_mosfet",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceMosfet(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),mosfet=new Mosfet2({name:sourceElm.name,channelType:sourceElm.channel_type,mosfetMode:sourceElm.mosfet_mode,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,displayName:sourceElm.display_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:mosfet});footprint&&mosfet.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(mosfet):subcircuit.add(mosfet)}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:db22}=root,pcb_port3=db22.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 NormalComponent{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=zh[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p23=>p23.labels.includes("1")),symPort2=symbol.ports.find(p23=>p23.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(port=>port.props.pinNumber===1);pin1Port.schematicSymbolPortDef=symPort1;let firstTerminalPorts=new Set(pin1Port._getPortsInternallyConnectedToThisPort()),secondTerminalPort=ports.filter(port=>port!==pin1Port&&!firstTerminalPorts.has(port)).sort((a22,b22)=>(a22.props.pinNumber??0)-(b22.props.pinNumber??0))[0];secondTerminalPort&&(secondTerminalPort.schematicSymbolPortDef=symPort2)}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),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 Resistor2=class extends NormalComponent{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){let baseSymbolName=this.props.symbolName??"boxresistor",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&(baseSymbolName==="boxresistor"||baseSymbolName==="resistor")?`${baseSymbolName}_${compactSize}`:void 0;return{componentName:"Resistor",schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,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 Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),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 Resistor2({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 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 NormalComponent{_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:db22}=this.root,props=this._parsedProps??{},source_component=db22.source_component.insert({ftype:"simple_switch",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,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:db22}=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),db22.simulation_switch.insert(simulationSwitch)}},getImportedSwitchProps=(sourceElm,inflatorContext)=>{let sourcePorts=inflatorContext.injectionDb.source_port.list().filter(port=>port.source_component_id===sourceElm.source_component_id),pinLabels={},highestPinNumber=0;for(let sourcePort of sourcePorts){let pinNumber=sourcePort.pin_number;if(pinNumber==null)continue;highestPinNumber=Math.max(highestPinNumber,pinNumber);let labels=Array.from(new Set([sourcePort.name,...sourcePort.port_hints??[]].filter(label=>typeof label=="string"&&label.length>0)));labels.length>0&&(pinLabels[`pin${pinNumber}`]=labels)}let type="spst";return highestPinNumber>=5?type="dpdt":highestPinNumber===4?type="dpst":highestPinNumber===3&&(type="spdt"),{type,pinLabels:Object.keys(pinLabels).length>0?pinLabels:void 0}};function inflateSourceSwitch(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),importedSwitchProps=getImportedSwitchProps(sourceElm,inflatorContext),switchComponent=new Switch({name:sourceElm.name,displayName:sourceElm.display_name,...importedSwitchProps,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:switchComponent});footprint&&switchComponent.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(switchComponent):subcircuit.add(switchComponent)}function pcbTraceRouteToPcbPath(route2){if(route2.length<=2)return[];let firstPoint=route2[0],lastPoint=route2[route2.length-1];return route2.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&&currentGroupId!==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 selector2;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector2=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector2=`.${sourcePort.name}`;selector2&&connectedSelectors.push(selector2)}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 pcbTraces=injectionDb.pcb_trace.list().filter(trace2=>trace2.source_trace_id===sourceTrace.source_trace_id),pcbTrace=pcbTraces[0],pcbPath3;pcbTrace&&(pcbPath3=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt22=>pt22.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps22={path:connectedSelectors};traceWidth!==void 0&&(traceProps22.thickness=traceWidth),pcbPath3&&pcbPath3.length>0?traceProps22.pcbPath=pcbPath3:!pcbTrace&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps22.pcbStraightLine=!0);let trace=new Trace(traceProps22);trace._inflatedPcbTraces=pcbTraces.length>0?pcbTraces:void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>pcbTraces.some(trace2=>via.pcb_trace_id===trace2.pcb_trace_id)):void 0,subcircuit.add(trace)}var SHORT_ALIASES={collector:["c"],base:["b"],emitter:["e"]},Transistor=class extends NormalComponent{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 additionalAliases={},symbol=this.getSchematicSymbol();for(let symPort of symbol?.ports??[]){let pinNumber=getPinNumberFromLabels(symPort.labels);if(pinNumber)for(let label of symPort.labels){let shortAliases=SHORT_ALIASES[label];shortAliases&&(additionalAliases[`pin${pinNumber}`]=shortAliases)}}super.initPorts({pinCount:3,additionalAliases})}get collector(){return this.portMap.collector}get base(){return this.portMap.base}get emitter(){return this.portMap.emitter}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_transistor",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,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","pcb_hole","pcb_plated_hole","pcb_cutout","pcb_soldermask_opening","pcb_solder_paste"],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 elm.type==="pcb_cutout"?!0:elm.type==="pcb_solder_paste"?elm.pcb_component_id===void 0&&!elm.pcb_smtpad_id:elm.type==="pcb_soldermask_opening"?elm.pcb_component_id===void 0:"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(g23=>!g23.parent_source_group_id||renderedGroupIds.has(g23.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g23=>g23.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_fiducial":inflateSourceFiducial(sourceComponent,inflationCtx);break;case"simple_led":inflateSourceLed(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_connector":inflateSourceConnector(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_mosfet":inflateSourceMosfet(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;case"simple_switch":inflateSourceSwitch(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)},resolveBoardMotorMount=board=>{if(boardMountsToPrintedPart(board)){resolvePrintedPartMounts(board);return}let{mountedTo,mountRotation,mountRotationAnchor,mountOrientation}=board._parsedProps;if(!mountedTo){if(mountRotation||mountRotationAnchor||mountOrientation)throw new Error(`board "${board.name}" mounting alignment requires mountedTo`);return}let separator=mountedTo.lastIndexOf("."),motorName=mountedTo.slice(0,separator),face=mountedTo.slice(separator+1);if(separator<1||face!=="backface")throw new Error(`board "${board.name}" mountedTo "${mountedTo}" must name a motor backface, e.g. "NEMA17.backface"`);let motors=getComponentsInAssemblyScope(board).filter(motor2=>motor2.componentName==="AssemblyMotor"&&matchesAssemblyIdentity(motor2,motorName));if(motors.length!==1)throw new Error(`board "${board.name}" mountedTo "${mountedTo}" matched ${motors.length} motors; expected exactly one in the assembly device`);let motor=motors[0];if(motor._parsedProps.mountedTo){resolvePrintedPartMounts(board);return}let direction3=motor._parsedProps.shaftFacingDirection;if(direction3!=="z+"&&direction3!=="z-")throw new Error(`board "${board.name}" cannot mount to motor "${motorName}" facing ${direction3}: rotated PCB boards are not yet supported; use shaftFacingDirection="z+" or "z-"`);if(mountRotationAnchor&&!mountRotation)throw new Error(`board "${board.name}" mountRotationAnchor requires mountRotation`);if(motor.props.shaftFacingDirection&&mountOrientation&&mountOrientation!==(direction3==="z+"?"top_layer_toward_mount_face":"bottom_layer_toward_mount_face"))throw new Error(`board "${board.name}" mountOrientation "${mountOrientation}" conflicts with motor "${motorName}" shaftFacingDirection "${direction3}"`);return motor},resolveMotorMountedBoard=motor=>{let boards=getComponentsInAssemblyScope(motor).filter(board=>board.componentName==="Board").filter(board=>resolveBoardMotorMount(board)===motor);if(boards.length>1)throw new Error(`assembly.motor "${motor.name}" has multiple mounted boards; only one board may determine its placement`);return boards[0]};function createCircuitJsonDatabase(){if(typeof cju_indexed_default!="function")return cju_default([]);let indexed=cju_indexed_default([],{indexConfig:{byId:!0,byType:!0}});return typeof indexed.insert!="function"||typeof indexed.insertAll!="function"||typeof indexed.subtree!="function"?cju_default([]):indexed}var 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,"_featurePcbViaStitching",!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,"_hasUnrenderedUpdatesFromAsyncEffects",!1);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_hasRenderLifecycleListeners",!1);__publicField(this,"_eventListeners",{});this.children=[],this.db=createCircuitJsonDatabase(),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_react10.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 findBoard=components=>{for(let child of components){if(child.componentName==="Board")return child;if(isAssemblyDeviceContainer(child)){let nested=findBoard(child.children);if(nested)return nested}}};return findBoard(this.children)}_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||isAssemblyDeviceContainer(this.children[0]))){this.firstChild=this.children[0];return}let group2=new Group5({subcircuit:!0});group2.parent=this,group2.addAll(this.children),this.children=[group2],this.firstChild=group2}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db22}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasUnrenderedUpdatesFromAsyncEffects=!1,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.isDoneRendering();)await new Promise(resolve7=>{let resume=()=>{clearTimeout(timer),this.removeListener("asyncEffect:end",resume),resolve7()},timer=setTimeout(resume,100);this.on("asyncEffect:end",resume),this._hasUnrenderedUpdatesFromAsyncEffects&&resume()}),(this._hasUnrenderedUpdatesFromAsyncEffects||this._asyncEffectPhaseById.size===0)&&this.render();this.emit("renderComplete")}isDoneRendering(){return this._hasRenderedAtleastOnce&&!this._hasIncompleteAsyncEffects()}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0||this._hasUnrenderedUpdatesFromAsyncEffects?!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_dist9(),dist_exports4)).catch(e211=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
952
+ `)}`)}catch(error2){debug12(`Failed to convert circuit JSON to SPICE: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)});continue}let voltageProbeByGraphName=new Map,voltageProbeById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.finalProbeName&&voltageProbeByGraphName.set(probe.finalProbeName,probe),probe.simulation_voltage_probe_id&&(voltageProbeById.set(probe.simulation_voltage_probe_id,probe),graphDisplayOverridesByProbeId.set(probe.simulation_voltage_probe_id,getVoltageProbeGraphDisplayOverrides(probe)));for(let ammeter of ammeters)ammeter.simulation_current_probe_id&&graphDisplayOverridesByProbeId.set(ammeter.simulation_current_probe_id,getAmmeterGraphDisplayOverrides(ammeter));let scopedCurrentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId)),currentProbeById=new Map,currentProbeByName=new Map;for(let probe of root.db.simulation_current_probe.list().filter(probe2=>scopedCurrentProbeIds.has(probe2.simulation_current_probe_id)))currentProbeById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&&currentProbeByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbeById.has(probe.simulation_voltage_probe_id)),firstSpiceNetlist=simulationRuns[0]?.spiceNetlist,graphNamesFromNetlist=firstSpiceNetlist?getTransientVoltageGraphNamesFromSpiceNetlist(firstSpiceNetlist):[];if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[simulationProbeIndex,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbeById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[simulationProbeIndex];probe&&graphName&&voltageProbeByGraphName.set(graphName,probe)}else debug12(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);let engineName=analogSimulation.getSpiceEngineName()??"spicey",spiceEngine3=spiceEngineMap[engineName];if(!spiceEngine3)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(spiceEngineName=>spiceEngineName!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${simulationExperimentId}`;debug12(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group2._queueAsyncEffect(effectId,async()=>{try{let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let simulationRun of simulationRuns){debug12(`Running simulation with engine: ${engineName}`);let simulationResult=await spiceEngine3.simulate(simulationRun.spiceString);debug12(`Simulation completed, received ${simulationResult.simulationResultCircuitJson.length} elements`);for(let simulationResultCircuitElement of simulationResult.simulationResultCircuitJson){if(!isCircuitElementInput(simulationResultCircuitElement)){debug12("Skipping invalid simulation result element");continue}let simulationResultWithSweepCoordinate=attachSweepCoordinateToSimulationResult({simulationResult:simulationResultCircuitElement,simulationParameterSweepCoordinate:simulationRun.simulationParameterSweepCoordinate});if(isVoltageGraph(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0;probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}else if(isSimulationVoltageResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbeById.get(simulationResultWithSweepCoordinate.simulation_voltage_probe_id)??(simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch?.simulation_voltage_probe_id&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.simulation_voltage_probe_id=probeMatch.simulation_voltage_probe_id)}if(isCurrentGraph2(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(simulationResultWithSweepCoordinate.source_probe_id?currentProbeById.get(simulationResultWithSweepCoordinate.source_probe_id):void 0)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_current_probe_id)}else if(isSimulationCurrentResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=currentProbeById.get(simulationResultWithSweepCoordinate.simulation_current_probe_id)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.simulation_current_probe_id=probeMatch.simulation_current_probe_id)}let insertedSimulationResult=root.db.insert(simulationResultWithSweepCoordinate);isVoltageGraph(insertedSimulationResult)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedSimulationResult}),isCurrentGraph2(insertedSimulationResult)&&insertedCurrentGraphs.push({type:"current",graph:insertedSimulationResult}),debug12(`Inserted ${simulationResultWithSweepCoordinate.type} into database`)}}analogSimulation.usesIndependentGraphAxes()&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group2._markDirty("SimulationSpiceEngineRender")}catch(error2){debug12(`Simulation failed for engine ${engineName}: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group2){if(!group2.isSubcircuit)return;let{db:db22}=group2.root,traces=group2.selectAll("trace"),vias=group2.selectAll("via"),nets=group2.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t48=>{let source_trace3=db22.source_trace.get(t48.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(c23=>c23!==null));let sourceNets=db22.source_net.list().filter(net=>net.subcircuit_id===group2.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group2._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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`,db22.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=db22.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id3 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id3)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.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=db22.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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n23=>n23.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)}}var Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks=group2=>{let isRootSubcircuit=group2.root?.firstChild===group2;if(!group2.isSubcircuit||!isRootSubcircuit||group2._getBoard())return;let routingDisabled=group2.root?.pcbRoutingDisabled||group2.getInheritedProperty("routingDisabled"),drcChecksDisabled=group2.root?.platform?.drcChecksDisabled??group2.getInheritedProperty("drcChecksDisabled"),routingDrcChecksDisabled=group2.root?.platform?.routingDrcChecksDisabled??group2.getInheritedProperty("routingDrcChecksDisabled");if(group2.root?.pcbDisabled||routingDisabled||drcChecksDisabled||routingDrcChecksDisabled||group2._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender")||group2._hasTracesToRoute()&&!group2._areChildSubcircuitsRouted()||group2._standaloneSubcircuitDrcChecksComplete||group2._standaloneSubcircuitDrcChecksInProgress)return;let{db:db22}=group2.root,subcircuitCircuitJson=db22.subtree({subcircuit_id:group2.subcircuit_id}).toArray();group2._standaloneSubcircuitDrcChecksInProgress=!0,group2._queueAsyncEffect("standalone-subcircuit:routing-drc-checks",async()=>{try{let results=await runAllRoutingChecks(subcircuitCircuitJson);db22.insertAll(dedupePcbDrcErrors(results)),group2._standaloneSubcircuitDrcChecksComplete=!0}finally{group2._standaloneSubcircuitDrcChecksInProgress=!1}})},addPourNetMap=(target,pourNetMap)=>{for(let[layer,netOrNets]of Object.entries(pourNetMap)){if(!netOrNets)continue;let nets=Array.isArray(netOrNets)?netOrNets:[netOrNets],layerNets=target.get(layer)??new Set;for(let net of nets)layerNets.add(net);target.set(layer,layerNets)}},toFanoutPourNetMap=netsByLayer=>Object.fromEntries(Array.from(netsByLayer,([layer,nets])=>[layer,nets.size===1?Array.from(nets)[0]:Array.from(nets)])),Group_getFanoutPourNetMap=(group2,routingPhasePlans)=>{let explicitMaps=routingPhasePlans.map(plan=>plan.fanoutPourNetMap).filter(map=>map!==void 0),netsByLayer=new Map;if(explicitMaps.length>0){for(let explicitMap of explicitMaps)addPourNetMap(netsByLayer,explicitMap);return toFanoutPourNetMap(netsByLayer)}let scope=group2;for(;scope;){if(scope.isSubcircuit){let subcircuit=scope,copperPours=subcircuit.selectAll("copperpour");for(let copperPour of copperPours){if(copperPour.getSubcircuit()!==subcircuit)continue;let{layer,connectsTo}=copperPour._parsedProps;addPourNetMap(netsByLayer,{[layer]:connectsTo})}}scope=scope.parent}return netsByLayer.size>0?toFanoutPourNetMap(netsByLayer):void 0},baseBreakoutPointProps=pcbLayoutProps.omit({pcbRotation:!0,layer:!0}),BaseBreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"matchedSourceTraceId",null);__publicField(this,"isPcbPrimitive",!0)}_getSourceTraceIdForPort(port){let{db:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}_renderPcbBreakoutPoint({layer}={}){if(this.pcb_breakout_point_id||this.root?.pcbDisabled)return;let{db:db22}=this.root,position4=this._getGlobalPcbPositionBeforeLayout(),group2=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group2||!group2.pcb_group_id)return;let pcb_breakout_point3=db22.pcb_breakout_point.insert({pcb_group_id:group2.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.matchedSourceTraceId??this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,layer,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:db22}=this.root;if(!this.pcb_breakout_point_id)return;let updatedProperties={x:newCenter.x,y:newCenter.y};this.matchedSourceTraceId&&(updatedProperties.source_trace_id=this.matchedSourceTraceId),db22.pcb_breakout_point.update(this.pcb_breakout_point_id,updatedProperties)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root;if(!this.pcb_breakout_point_id)return;let point62=db22.pcb_breakout_point.get(this.pcb_breakout_point_id);point62&&db22.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point62.x+deltaX,y:point62.y+deltaY})}getPcbSize(){return{width:0,height:0}}},BreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){if(this.matchedPort)return;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}"`))}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint()}},SavedFanoutPoint=class extends BreakoutPoint{constructor(){super(...arguments);__publicField(this,"exitLayer","top")}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint({layer:this.exitLayer})}};function getSavedFanoutTraces(breakout,input2){let{db:db22}=breakout.root,boardLayers=getViaBoardLayers(input2.layerCount),coveredConnections=new Set,exits=breakout.children.filter(child=>child instanceof SavedFanoutPoint),traces=(breakout._parsedProps.pcbTracePaths??[]).map((path,pathIndex)=>{for(let point62 of path.route)if((point62.route_type==="wire"?[point62.layer]:[point62.from_layer,point62.to_layer]).some(layer=>!boardLayers.includes(layer)))throw new Error(`Saved fanout path "${path.connection}" uses a layer unavailable on this board`);let exit=exits[pathIndex],port=exit.matchedPort,connection=input2.connections.find(connection2=>connection2.pointsToConnect.some(point62=>point62.pcb_port_id===port.pcb_port_id));if(!connection)throw new Error(`No fanout connection for saved path "${path.connection}"`);let pcbExit=db22.pcb_breakout_point.get(exit.pcb_breakout_point_id),localExit=path.route.at(-1),transform7=compose2(exit._computePcbGlobalTransformBeforeLayout(),translate2(-localExit.x,-localExit.y)),originalExit=applyToPoint2(transform7,localExit),route2=resolveSavedTraceRouteWidths(path.route).map(point62=>{let position4=applyToPoint2(transform7,point62);return{...point62,x:position4.x+pcbExit.x-originalExit.x,y:position4.y+pcbExit.y-originalExit.y}}),first=route2[0],firstLayer=first.route_type==="wire"?first.layer:first.from_layer,portPosition=port._getGlobalPcbPositionAfterLayout();if(Math.hypot(first.x-portPosition.x,first.y-portPosition.y)>1e-4||!port.getAvailablePcbLayers().includes(firstLayer))throw new Error(`Saved fanout path "${path.connection}" must start at its PCB port on an available layer`);if(first.route_type==="via"&&!input2.allowViaInPad)throw new Error(`Saved fanout path "${path.connection}" starts with a via at a pad; enable allowViaInPad`);let last=route2.at(-1),lastLayer=last.route_type==="wire"?last.layer:last.to_layer,endpoints=[{...first,layer:firstLayer},{...last,layer:lastLayer}];if(connection.pointsToConnect.some(point62=>!endpoints.some(endpoint=>Math.hypot(point62.x-endpoint.x,point62.y-endpoint.y)<1e-4&&point62.layer===endpoint.layer)))throw new Error(`Saved fanout path "${path.connection}" does not cover its connection endpoints`);let startContactWidths=getSavedTraceViaContactWidths(route2,0,input2.minTraceWidth),endContactWidths=getSavedTraceViaContactWidths(route2,route2.length-1,input2.minTraceWidth);return first.route_type==="via"&&(route2.splice(1,0,{route_type:"wire",x:first.x,y:first.y,layer:first.to_layer,width:startContactWidths.toWidth}),route2.unshift({route_type:"wire",x:first.x,y:first.y,layer:first.from_layer,width:startContactWidths.fromWidth})),last.route_type==="via"&&(route2.splice(route2.length-1,0,{route_type:"wire",x:last.x,y:last.y,layer:last.from_layer,width:endContactWidths.fromWidth}),route2.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth})),last.route_type==="via"&&route2.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth}),coveredConnections.add(connection),{type:"pcb_trace",pcb_trace_id:`saved_fanout_${breakout.pcb_group_id}_${pathIndex}`,connection_name:connection.name,source_trace_id:connection.source_trace_id,connectsTo:[connection.source_trace_id,...connection.pointsToConnect.map(point62=>point62.pointId)].filter(id3=>!!id3),route:route2}}),missing=input2.connections.filter(connection=>!coveredConnections.has(connection));if(missing.length)throw new Error(`pcbTracePaths must cover every fanout connection; missing: ${missing.map(connection=>connection.name).join(", ")}`);return traces}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a22,b22){return getPhaseSortValue(a22.routingPhaseIndex)-getPhaseSortValue(b22.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,buses=[]){let busRoutingPhaseIndexes=new Set;for(let bus of buses){if(bus._parsedProps.routingPhaseIndex===void 0)continue;bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection)))&&busRoutingPhaseIndexes.add(bus._parsedProps.routingPhaseIndex)}if(busRoutingPhaseIndexes.size>1)throw new Error(`Trace "${trace.name}" belongs to buses with different routing phases`);let busRoutingPhaseIndex=busRoutingPhaseIndexes.values().next().value;if(busRoutingPhaseIndex!==void 0)return busRoutingPhaseIndex;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 convertPortSelectorToEndpointKey(selector2){return selector2.trim().replace(/\s*>\s*/g,".").replace(/\s+/g,".").replace(/^\./,"").replace(/\.\./g,".")}function getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps){return phaseProps.connection===void 0&&phaseProps.connections===void 0?phaseProps.pcbTracePaths?.map(path=>path.connection)??[]:[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelector){let connectionSelectorEndpointKey=convertPortSelectorToEndpointKey(connectionSelector);if(trace.getTracePortPathSelectors().some(selector2=>convertPortSelectorToEndpointKey(selector2)===connectionSelectorEndpointKey))return!0;let port=trace.getSubcircuit().selectOne(connectionSelector,{type:"port"});return port!==null&&(trace._findConnectedPorts().ports?.includes(port)??!1)}function resolvePhaseConnectionTraces(group2,traces,phaseProps){let resolvedTraces=new Set,phaseName=phaseProps.name??"unnamed phase";for(let rawSelector of getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps)){let selector2=rawSelector.trim(),explicitlySelectsTrace=selector2.startsWith("trace."),namedTraces=explicitlySelectsTrace?group2.selectAll(selector2).filter(trace=>traces.includes(trace)):traces.filter(trace=>trace.name===selector2),endpointTraces=explicitlySelectsTrace?[]:traces.filter(trace=>traceHasEndpointMatchingConnectionSelector(trace,selector2));if(namedTraces.length>1||namedTraces.length>0&&endpointTraces.length>0)throw new Error(`Autorouting phase "${phaseName}": connection "${rawSelector}" is ambiguous. Use a unique trace name qualified as "trace.DDR_D0" or a port such as ".U1 > .A1".`);let matches=namedTraces.length>0?namedTraces:endpointTraces;if(matches.length===0)throw new Error(`Autorouting phase "${phaseName}": connection "${rawSelector}" matched no trace or endpoint. Use a trace name such as "DDR_D0" or a port such as ".U1 > .A1".`);for(let trace of matches)resolvedTraces.add(trace)}return resolvedTraces}function getAutoroutersByPhaseIndex(group2){let autoroutingPhases=group2.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(group2){let autoroutingPhases=group2.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,minTraceToHoleEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minTraceToHoleEdgeClearance===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),minTraceToHoleEdgeClearance:toParsedDistance(minTraceToHoleEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group2){let traces=group2.selectAll("trace"),nets=group2.selectAll("net"),buses=group2.selectAll("bus"),breakouts=group2.selectAll("group").filter(candidate=>candidate.isRoutingDirective),breakoutByTrace=new Map,breakoutByNet=new Map;for(let trace of traces){let ancestor=trace.parent;for(;ancestor&&ancestor!==group2;){if(ancestor.isRoutingDirective){breakoutByTrace.set(trace,ancestor);break}ancestor=ancestor.parent}}for(let net of nets)net.parent?.isRoutingDirective&&breakouts.includes(net.parent)&&breakoutByNet.set(net,net.parent);let plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group2),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group2),selectedTracesByPhaseIndex=new Map(Array.from(phasePropsByPhaseIndex,([phaseIndex,phaseProps])=>[phaseIndex,resolvePhaseConnectionTraces(group2,traces,phaseProps)])),groupFanoutProps=group2._parsedProps,routeRemaining=group2.getInheritedProperty("routeRemaining")!==!1,defaultPhaseProps=phasePropsByPhaseIndex.get(null),includeUnassignedConnections=routeRemaining||defaultPhaseProps!==void 0&&!defaultPhaseProps.reroute&&getConnectionSelectorsFromAutoroutingPhaseProps(defaultPhaseProps).length===0,hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute),hasConnectionTargetedPhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps).length>0);if(!hasDirectRoutingTargets&&!hasReroutePhase&&!hasConnectionTargetedPhase&&breakouts.length===0)return[];for(let net of nets){if(breakoutByNet.has(net))continue;let routingPhaseIndex=getNetRoutingPhaseIndex(net);routingPhaseIndex===null&&!includeUnassignedConnections||getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){if(breakoutByTrace.has(trace))continue;let routingPhaseIndex=getTraceRoutingPhaseIndex(trace,buses);routingPhaseIndex===null&&!includeUnassignedConnections||getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex){let connectionSelectors=getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps);if(connectionSelectors.length>0){let plan=getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex);plan.connectionSelectors=connectionSelectors;for(let trace of traces)if(!breakoutByTrace.has(trace)&&selectedTracesByPhaseIndex.get(phaseIndex).has(trace)){if(!phaseProps.reroute)for(let existingPlan of plansByPhaseIndex.values())existingPlan!==plan&&(existingPlan.traces=existingPlan.traces.filter(existingTrace=>existingTrace!==trace));if(plan.traces.includes(trace))continue;plan.traces.push(trace)}}(phaseProps.reroute||phaseProps.pcbTracePaths!==void 0)&&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.algorithmFn=phaseProps?.algorithmFn,plan.isImplicitRemainingPhase=plan.routingPhaseIndex===null&&phaseProps===void 0,plan.phaseName=phaseProps?.name,plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.busFanoutDirections=phaseProps?.busFanoutDirections??groupFanoutProps.busFanoutDirections,plan.fanoutBoundaryPadding=phaseProps?.fanoutBoundaryPadding??groupFanoutProps.fanoutBoundaryPadding;let fanoutRoutingLayers=phaseProps?.fanoutRoutingLayers??groupFanoutProps.fanoutRoutingLayers;plan.fanoutRoutingLayers=fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),plan.fanoutPourNetMap=phaseProps?.fanoutPourNetMap??groupFanoutProps.fanoutPourNetMap,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}for(let phase of group2.selectAll("autoroutingphase")){let plan=plansByPhaseIndex.get(phase._parsedProps.phaseIndex??null);if(!plan||(plan.autoroutingPhase=phase,phase._parsedProps.pcbTracePaths===void 0))continue;let config=plan.autorouter!==void 0?getPresetAutoroutingConfig(plan.autorouter,group2.root?.platform):group2._getAutorouterConfig(),isFanout=["fanout","single_layer_fanout"].includes(config.preset??"");plan.getPrecomputedRoutingResult=input2=>getSavedAutoroutingPhaseTraces(phase,input2,isFanout)}let breakoutPlans=[];for(let breakout of breakouts){let breakoutProps22=breakout._parsedProps,shouldUseDefaultAutorouterForBreakoutPoints=breakout.children.some(child=>child instanceof BreakoutPoint)&&breakout.props.autorouter===void 0,breakoutTraces=traces.filter(trace=>breakoutByTrace.get(trace)===breakout),unroutedBreakoutTraces=breakoutTraces.filter(trace=>!trace.pcb_trace_id),pcbGroup=breakout.pcb_group_id?breakout.root?.db.pcb_group.get(breakout.pcb_group_id):null,outlineBounds=pcbGroup?.outline?getBoundsFromPoints(pcbGroup.outline):null,routingWidth=pcbGroup?.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),routingHeight=pcbGroup?.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0),routingBounds2=pcbGroup&&routingWidth&&routingHeight?{minX:pcbGroup.center.x-routingWidth/2,maxX:pcbGroup.center.x+routingWidth/2,minY:pcbGroup.center.y-routingHeight/2,maxY:pcbGroup.center.y+routingHeight/2}:void 0,rawBreakoutProps=breakout.props,hasExplicitGeometry=rawBreakoutProps.width!==void 0||rawBreakoutProps.height!==void 0||!!rawBreakoutProps.outline?.length,hasExplicitFanoutBoundaryPadding=rawBreakoutProps.fanoutBoundaryPadding!==void 0,breakoutPlan={routingPhaseIndex:null,routingPcbGroupId:breakout.pcb_group_id??void 0,fanoutRegionPcbGroupId:breakout.pcb_group_id??void 0,routingBounds:routingBounds2,fanoutBounds:hasExplicitGeometry?routingBounds2:hasExplicitFanoutBoundaryPadding?void 0:routingBounds2,autorouter:breakoutProps22.autorouter??"fanout",busFanoutDirections:breakoutProps22.busFanoutDirections,fanoutBoundaryPadding:breakoutProps22.fanoutBoundaryPadding,fanoutRoutingLayers:breakoutProps22.fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),fanoutPourNetMap:breakoutProps22.fanoutPourNetMap,nets:nets.filter(net=>breakoutByNet.get(net)===breakout),traces:breakoutTraces};if(breakout.isDogboneFanout&&breakoutProps22.pcbTracePaths===void 0){breakoutPlans.push({...breakoutPlan,routingBounds:void 0,fanoutBounds:routingBounds2});continue}if(breakout._parsedProps.pcbTracePaths!==void 0){breakoutPlans.push({...breakoutPlan,autorouter:{local:!0,groupMode:"subcircuit",allowViaInPad:(typeof breakoutProps22.autorouter=="object"?breakoutProps22.autorouter.allowViaInPad:void 0)??group2._getAutorouterConfig().allowViaInPad},getPrecomputedRoutingResult:input2=>({traces:getSavedFanoutTraces(breakout,input2)})});continue}if(!shouldUseDefaultAutorouterForBreakoutPoints){breakoutPlans.push(breakoutPlan);continue}if(breakoutPlans.push({...breakoutPlan,autorouter:"default",traces:[]}),unroutedBreakoutTraces.length>0){let automaticFanoutBusIds=new Set(buses.filter(bus=>unroutedBreakoutTraces.some(trace=>bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection))))).map(bus=>bus.name));for(let trace of unroutedBreakoutTraces)trace.name&&automaticFanoutBusIds.add(trace.name);let automaticBusFanoutDirections=breakoutProps22.busFanoutDirections?Object.fromEntries(Object.entries(breakoutProps22.busFanoutDirections).filter(([busId])=>automaticFanoutBusIds.has(busId))):void 0;breakoutPlans.push({...breakoutPlan,routingPcbGroupId:void 0,busFanoutDirections:automaticBusFanoutDirections,traces:unroutedBreakoutTraces})}}if(routeRemaining&&hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[...breakoutPlans,{routingPhaseIndex:null,isImplicitRemainingPhase:!0,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return[...breakoutPlans,...plans]}var RoutingPhasePreparationError=class extends Error{},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.2151",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 && bun run scripts/smoke-tests/check-dist-bundled-schematic-solver.ts","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","@jscad/modeling":"^2.13.0","@resvg/resvg-js":"^2.6.2","@tsci/tscircuit.ti":"github:tscircuit/ti#57e314be4b2b06bc546d4def7453e619604d1157","@tscircuit/alphabet":"0.0.25","@tscircuit/bga-fanout-solver":"github:tscircuit/bga-fanout-solver#247c835cb8d69b65e53891dcf869731079415b39","@tscircuit/bus-lanes-solver":"https://jscdn.tscircuit.com/@tscircuit/bus-lanes-solver/0.0.21.tgz","@tscircuit/cableprinter":"^0.0.6","@tscircuit/capacity-autorouter":"^0.0.982","@tscircuit/checks":"^0.0.253","@tscircuit/circuit-json-util":"^0.0.122","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.67","@tscircuit/create-fdm-enclosure":"0.0.4","@tscircuit/dogbone-solver":"https://jscdn.tscircuit.com/@tscircuit/dogbone-solver/0.0.1.tgz","@tscircuit/fanout-solver":"0.0.78","@tscircuit/flex-utils":"https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.8.tgz","@tscircuit/footprinter":"^0.0.431","@tscircuit/image-utils":"^0.0.8","@tscircuit/implicit-copper-pour-solver":"github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92","@tscircuit/infer-cable-insertion-point":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#23260504fceffff2d64bf11720f74e974d1d9321","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.97","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/modelprinter":"^0.0.18","@tscircuit/ngspice-spice-engine":"^0.0.20","@tscircuit/props":"^0.0.701","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"https://jscdn.tscircuit.com/@tscircuit/schematic-trace-solver/0.0.230.tgz","@tscircuit/solver-utils":"^0.0.16","@tscircuit/soup-util":"^0.0.41","@tscircuit/via-stitch-solver":"github:tscircuit/via-stitch-solver#64f2ac7781b795bdc0d74ba411988e60767fa653","@tscircuit/winding-breakout-point-solver":"github:tscircuit/winding-breakout-point-solver#202dbe9eb0088633b6fa094120dba6f2f41f8803","@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.528","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.33","circuit-json-to-gltf":"^0.0.151","circuit-json-to-spice":"^0.0.45","circuit-to-svg":"^0.0.450",concurrently:"^9.1.2","connectivity-map":"^1.0.1",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.142",kicadts:"^0.0.53","live-server":"^1.2.2",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"0.0.34",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.248",spicets:"^0.0.4",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/create-fdm-enclosure":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/modelprinter":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","circuit-json-to-spice":"*","schematic-symbols":"*",spicets:"*",typescript:"^5.0.0","@tscircuit/cableprinter":"*"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.25","calculate-packing":"^0.0.90","css-select":"5.1.0","format-si-unit":"^0.0.12","gl-matrix":"^3.4.4",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","jscad-planner":"^0.0.18","jscad-fiber":"^0.0.88"},overrides:{"@tscircuit/circuit-json-util":"^0.0.122","@tscircuit/props":"^0.0.701","circuit-json":"^0.0.528","@tscircuit/cableprinter":"^0.0.6"}},getFnv1aHash=value=>{let hash=2166136261;for(let i23=0;i23<value.length;i23++)hash^=value.charCodeAt(i23),hash=Math.imul(hash,16777619);return hash>>>0},getJsonHash=value=>{let serializedValue=JSON.stringify(value),hash1=getFnv1aHash(serializedValue),hash2=getFnv1aHash(`${serializedValue}${hash1}`);return`${hash1.toString(16).padStart(8,"0")}${hash2.toString(16).padStart(8,"0")}`},getLocalAutoroutingCacheKey=(simpleRouteJson,solverOptions)=>`routes:core@${package_default3.version}:solver:${getJsonHash(solverOptions)}:srj:${getJsonHash(simpleRouteJson)}`,getCachedLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey})=>{if(!cacheEngine)return null;try{let cachedResult=await cacheEngine.getItem(cacheKey);if(!cachedResult)return null;let parsedResult=JSON.parse(cachedResult);return!parsedResult||!Array.isArray(parsedResult.traces)?null:parsedResult}catch{return null}},cacheLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey,result})=>{if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(result))}catch{}},SRJ_POINT_POSITION_TOLERANCE_MM=1e-6,srjPointsHaveSamePointId=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0&&first.pointId===second.pointId,srjPointsHaveSameBoardPositionAndLayer=(first,second)=>Math.abs(first.x-second.x)<=SRJ_POINT_POSITION_TOLERANCE_MM&&Math.abs(first.y-second.y)<=SRJ_POINT_POSITION_TOLERANCE_MM&&first.layer===second.layer,srjPointsReferToSameEndpoint=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0?srjPointsHaveSamePointId(first,second):srjPointsHaveSameBoardPositionAndLayer(first,second),getPairedGlobalPoint=(simpleRouteJson,connection)=>{let globalConnection=simpleRouteJson.connections.find(candidate=>candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(globalPoint=>connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint))));if(!globalConnection)return;let pairedPoints=globalConnection.pointsToConnect.filter(globalPoint=>!connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint)));return pairedPoints.length===1?pairedPoints[0]:void 0},getPairedBreakoutExitTarget=(simpleRouteJson,connection)=>{if(!connection.routingPcbGroupId||!connection.source_trace_id)return;let pairedGlobalPoint=getPairedGlobalPoint(simpleRouteJson,connection);if(!(!pairedGlobalPoint||!simpleRouteJson.connections.some(candidate=>candidate.routingPcbGroupId!==void 0&&candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(candidatePoint=>srjPointsReferToSameEndpoint(candidatePoint,pairedGlobalPoint)))))return{x:pairedGlobalPoint.x,y:pairedGlobalPoint.y,layer:pairedGlobalPoint.layer}};function connectionIsInRoutingPhase(connection,phasePlan){if(connection.routingPcbGroupId)return connection.routingPcbGroupId===phasePlan.routingPcbGroupId;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||connection.rootConnectionName===trace.source_trace_id||connection.mergedConnectionNames?.includes(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.routingPcbGroupId||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);let includedConnectionNames=new Set;for(let connection of connections)includedConnectionNames.add(connection.name);let differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split across autorouting phases`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let srjConnectionByName=new Map(simpleRouteJson.connections.map(connection=>[connection.name,connection])),buses=(simpleRouteJson.buses??[]).map(bus=>{let connectionNames=bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName)),cohortConnectionNames=bus.connectionNames.filter(connectionName=>srjConnectionByName.get(connectionName)?.routingPcbGroupId===phasePlan.routingPcbGroupId);if(bus.maxLengthSkew!==void 0&&connectionNames.length>0&&connectionNames.length!==cohortConnectionNames.length)throw new RoutingPhasePreparationError(`Length-matched bus "${bus.name||"unnamed bus"}" cannot be split across autorouting phases. Assign the complete bus to one routingPhaseIndex.`);let connectionExitTargets=Object.fromEntries(connectionNames.flatMap(connectionName=>{let connection=srjConnectionByName.get(connectionName);if(!connection)return[];let pairedTarget=getPairedBreakoutExitTarget(simpleRouteJson,connection);return pairedTarget?[[connectionName,pairedTarget]]:[]}));return{...bus,connectionNames,...Object.keys(connectionExitTargets).length>0?{connectionExitTargets}:{}}}).filter(bus=>bus.connectionNames.length>0),bounds=expandSrjBoundsToIncludeConnectionPoints({bounds:phasePlan.routingBounds??simpleRouteJson.bounds,connections});return{...simpleRouteJson,bounds,outline:getSrjOutlineForRoutingBounds(simpleRouteJson,bounds),connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}}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,minTraceToHoleEdgeClearance=drcTolerances.minTraceToHoleEdgeClearance??simpleRouteJson.minTraceToHoleEdgeClearance,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,minTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}var removeCompletedFanoutConnections=(simpleRouteJson,routingPcbGroupId)=>{let connections=simpleRouteJson.connections.filter(connection=>connection.routingPcbGroupId!==routingPcbGroupId),includedConnectionNames=new Set(connections.map(connection=>connection.name)),differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split at a breakout boundary`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let buses=(simpleRouteJson.buses??[]).map(bus=>({...bus,connectionNames:bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName))})).filter(bus=>bus.connectionNames.length>0);return{...simpleRouteJson,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}},connectFanoutTracesToBreakoutPoints=(simpleRouteJson,breakoutPointIdByConnectionName)=>({...simpleRouteJson,traces:simpleRouteJson.traces?.map(trace=>{let breakoutPointId=breakoutPointIdByConnectionName.get(trace.connection_name??"");return breakoutPointId?{...trace,connectsTo:[...new Set([...trace.connectsTo??[],breakoutPointId])]}:trace})});function Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson,fanoutOutputSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan}){let routingPcbGroupId=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId)return{downstreamSimpleRouteJson:fanoutOutputSimpleRouteJson,baseSimpleRouteJson,synchronizedBreakoutPoints:[]};let outputConnectionByName=new Map(fanoutOutputSimpleRouteJson.connections.map(connection=>[connection.name,connection])),baseConnections=baseSimpleRouteJson.connections.map(connection=>({...connection,pointsToConnect:connection.pointsToConnect.map(point62=>({...point62}))})),synchronizedBreakoutPoints=[],breakoutPointIdByConnectionName=new Map;for(let inputConnection of fanoutInputSimpleRouteJson.connections){if(inputConnection.routingPcbGroupId!==routingPcbGroupId||!inputConnection.source_trace_id)continue;let outputConnection=outputConnectionByName.get(inputConnection.name);if(!outputConnection)continue;let globalPointMatches=baseConnections.filter(connection=>{if(connection.routingPcbGroupId===routingPcbGroupId)return!1;let sharesSourceTrace=connection.source_trace_id===inputConnection.source_trace_id,sharesPointId=connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsHaveSamePointId(globalPoint,inputPoint)));return!sharesSourceTrace&&!sharesPointId?!1:connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(globalPoint,inputPoint)))}).flatMap(globalConnection=>globalConnection.pointsToConnect.flatMap((previousPoint,pointIndex)=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(previousPoint,inputPoint))?[{globalConnection,pointIndex,previousPoint}]:[])),changedPointIndex=outputConnection.pointsToConnect.findIndex((outputPoint,pointIndex)=>{let inputPoint=inputConnection.pointsToConnect[pointIndex];return inputPoint!==void 0&&!srjPointsHaveSameBoardPositionAndLayer(outputPoint,inputPoint)});if(changedPointIndex<0)continue;let fanoutExitPoint=outputConnection.pointsToConnect[changedPointIndex];globalPointMatches.length===0&&synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint:inputConnection.pointsToConnect[changedPointIndex],fanoutExitPoint});for(let{globalConnection,pointIndex,previousPoint}of globalPointMatches){let{terminalVia:_previousTerminalVia,...previousPointWithoutLayerOverrides}=previousPoint,synchronizedGlobalPoint={...previousPointWithoutLayerOverrides,x:fanoutExitPoint.x,y:fanoutExitPoint.y,layer:fanoutExitPoint.layer,...fanoutExitPoint.terminalVia?{terminalVia:{...fanoutExitPoint.terminalVia}}:{}};globalConnection.pointsToConnect[pointIndex]=synchronizedGlobalPoint,previousPoint.pointId&&breakoutPointIdByConnectionName.set(inputConnection.name,previousPoint.pointId),synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint,fanoutExitPoint})}}let newFanoutSourceKeepouts=fanoutOutputSimpleRouteJson.obstacles.filter(obstacle=>obstacle.isFanoutSourceKeepout===!0&&obstacle.componentId!==void 0),completedSourceComponentIds=new Set(newFanoutSourceKeepouts.flatMap(obstacle=>obstacle.componentId===void 0?[]:[obstacle.componentId])),retainedBaseObstacles=baseSimpleRouteJson.obstacles.filter(obstacle=>!obstacle.componentId||!completedSourceComponentIds.has(obstacle.componentId));return{downstreamSimpleRouteJson:removeCompletedFanoutConnections(connectFanoutTracesToBreakoutPoints(fanoutOutputSimpleRouteJson,breakoutPointIdByConnectionName),routingPcbGroupId),baseSimpleRouteJson:{...baseSimpleRouteJson,connections:baseConnections,obstacles:[...retainedBaseObstacles,...newFanoutSourceKeepouts]},synchronizedBreakoutPoints}}function getJumperPadInfos(db22){let padInfos=[],jumperSourceComponentIds=new Set(db22.source_component.list().filter(component=>component.name?.startsWith("__autoplaced_jumper")).map(component=>component.source_component_id));if(jumperSourceComponentIds.size===0)return padInfos;let jumperPcbComponentIds=new Set(db22.pcb_component.list().filter(component=>jumperSourceComponentIds.has(component.source_component_id)).map(component=>component.pcb_component_id)),jumperSmtpads=db22.pcb_smtpad.list().filter(pad2=>jumperPcbComponentIds.has(pad2.pcb_component_id));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,x23,y23,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x23)<tolerance&&Math.abs(pad2.y-y23)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x23,y23){for(let pad2 of padInfos)if(x23>=pad2.minX&&x23<=pad2.maxX&&y23>=pad2.minY&&y23<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route2,padInfos){if(route2.length===0||padInfos.length===0)return[route2];let segments=[],currentSegment=[];for(let i23=0;i23<route2.length;i23++){let point62=route2[i23];if(currentSegment.push(point62),point62.route_type==="wire"&&i23>0&&i23<route2.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,padInfos){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}var claimSrjAssignablePcbViasTraversedByRoute=({db:db22,pcbTrace,routeWithSrjMetadata})=>{for(let routePoint3 of routeWithSrjMetadata){if(routePoint3.route_type!=="through_pad")continue;let pcbViaId=routePoint3.circuitJsonMetadata?.pcb_via_id;if(!pcbViaId)continue;let assignablePcbVia=db22.pcb_via.get(pcbViaId);!assignablePcbVia?.net_is_assignable||assignablePcbVia.net_assigned&&assignablePcbVia.pcb_trace_id!==pcbTrace.pcb_trace_id||db22.pcb_via.update(assignablePcbVia.pcb_via_id,{pcb_trace_id:pcbTrace.pcb_trace_id,net_assigned:!0})}},getAxisGap=(firstMinimum,firstMaximum,secondMinimum,secondMaximum)=>Math.max(secondMinimum-firstMaximum,firstMinimum-secondMaximum),findFanoutPhaseSeparationConflict=regions=>{for(let firstIndex=0;firstIndex<regions.length;firstIndex++){let firstRegion=regions[firstIndex];for(let secondIndex=firstIndex+1;secondIndex<regions.length;secondIndex++){let secondRegion=regions[secondIndex];if(firstRegion.regionId&&firstRegion.regionId===secondRegion.regionId)continue;let horizontalGap=getAxisGap(firstRegion.bounds.minX,firstRegion.bounds.maxX,secondRegion.bounds.minX,secondRegion.bounds.maxX),verticalGap=getAxisGap(firstRegion.bounds.minY,firstRegion.bounds.maxY,secondRegion.bounds.minY,secondRegion.bounds.maxY),availableGap=Math.max(horizontalGap,verticalGap),requiredGap=firstRegion.boundaryKeepaway+secondRegion.boundaryKeepaway;if(availableGap+1e-6<requiredGap)return{firstRegion,secondRegion,availableGap,requiredGap}}}};function getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces,stageOutputPcbTraces}){let replacedPcbTraceIds=new Set(stageOutputPcbTraces.flatMap(trace=>[trace.pcb_trace_id,...trace.__replaces_pcb_trace_id?[trace.__replaces_pcb_trace_id]:[]]));return[...accumulatedPcbTraces.filter(trace=>!replacedPcbTraceIds.has(trace.pcb_trace_id)),...stageOutputPcbTraces]}var POINT_EPSILON3=1e-6;function isPointOnWireSegment({point:point62,segmentStart,segmentEnd}){return point62.layer&&(segmentStart.layer!==point62.layer||segmentEnd.layer!==point62.layer)?!1:pointToSegmentDistance(point62,segmentStart,segmentEnd)<=POINT_EPSILON3}function isPointInSmtPad({point:point62,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point62.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point62.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance3(point62,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point62,hole,traceWidth=0}){return distance3(point62,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db22,trace){let sourcePortIds=new Set,route2=trace.route,endpoints=[route2[0],route2[route2.length-1]].filter(point62=>!!point62&&point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db22.pcb_port.list())pcbPort.source_port_id&&(endpoint.layer&&pcbPort.layers&&!pcbPort.layers.includes(endpoint.layer)||distance3(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id));for(let smtpad2 of db22.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||endpoint.layer&&smtpad2.layer!==endpoint.layer||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db22.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route2=trace.route.filter(point62=>point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);return[route2[0],route2[route2.length-1]].filter(point62=>!!point62)}function getSourceIdsFromConnectedPcbTraces(db22,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db22.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db22.source_trace.get(existingTrace.source_trace_id)&&!db22.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point62=>point62.route_type==="wire");for(let i23=0;i23<existingRoute.length-1;i23++){let segmentStart=existingRoute[i23],segmentEnd=existingRoute[i23+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db22,trace){let sourcePortIds=new Set;for(let point62 of trace.route)for(let pcbPortId of[point62.start_pcb_port_id,point62.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db22.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db22,trace)}function buildSourceConnectivityMap(sourceTraces){let connMap=new ConnectivityMap({});return connMap.addConnections(sourceTraces.map(trace=>[trace.source_trace_id,...trace.connected_source_port_ids,...trace.connected_source_net_ids])),connMap}function getSourceTraceIdForRoutedTrace({db:db22,trace,subcircuit_id}){if(trace.source_trace_id&&(db22.source_trace.get(trace.source_trace_id)??db22.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db22,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db22,trace)[0];let sourceTraces=db22.source_trace.list(),connMap=buildSourceConnectivityMap(sourceTraces),endpointNetIds=sourcePortIds.map(sourcePortId=>connMap.getNetConnectedToId(sourcePortId)).filter(netId=>!!netId),exactSourceTrace=sourcePortIds.length>=2?sourceTraces.find(sourceTrace=>sourcePortIds.every(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId))):void 0;if(exactSourceTrace)return exactSourceTrace.source_trace_id;let sourceTracesInEndpointNets=sourceTraces.filter(sourceTrace=>{let sourceTraceNetId=connMap.getNetConnectedToId(sourceTrace.source_trace_id);return endpointNetIds.some(netId=>netId===sourceTraceNetId)}),connectedToEndpoint=sourceTracesInEndpointNets.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>sourcePortIds.includes(sourcePortId))),candidates=connectedToEndpoint.length>0?connectedToEndpoint:sourceTracesInEndpointNets;if(candidates.length!==0)return(candidates.find(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id)??candidates[0])?.source_trace_id}function groupPadsByInternalConnection(pads,orientation22){let groups=[];for(let pad2 of pads){let key=orientation22==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group2 of groups){let groupKey=orientation22==="vertical"?group2[0].center.y:group2[0].center.x;if(Math.abs(key-groupKey)<.01){group2.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g23=>g23.length>=2)}function insertAutoplacedJumpers(params){let{db:db22,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db22.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation5=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db22.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation5,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=db22.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db22.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=db22.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 group2 of internalGroups){let sourcePortIds=[];for(let groupPad of group2){let padInfo=padData.find(p23=>Math.abs(p23.pad.center.x-groupPad.center.x)<.01&&Math.abs(p23.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db22.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(group2){let relevantSubcircuitIds=new Set;if(!group2.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group2.subcircuit_id);let db22=group2.root?.db;if(!db22)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db22,group2.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group2){let db22=group2.root?.db;if(!db22)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group2);return db22.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group2.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:group2,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db22=group2.root?.db;if(!db22)return;let replacementPcbTraceIds=new Set(pcbTraceIdsToReplace),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(group2).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group2.subcircuit_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 db22.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db22.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db22.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group2){return getExistingPcbTracesForReroute(group2).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route2){let jumperRoutes=route2.filter(p23=>p23.route_type==="jumper"),wireAndViaRoutes=route2.filter(p23=>p23.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 i23=0;i23<wireAndViaRoutes.length;i23++){let p23=wireAndViaRoutes[i23];if(p23.route_type!=="wire")continue;let distToStart=Math.hypot(p23.x-jumperStart.x,p23.y-jumperStart.y),distToEnd=Math.hypot(p23.x-jumperEnd.x,p23.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i23),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i23)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a22,b22)=>a22.startIdx-b22.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 ax22=anchorPosition.x,ay22=anchorPosition.y;switch(alignment){case"top_left":return{x:ax22+width/2,y:ay22-height/2};case"top_center":return{x:ax22,y:ay22-height/2};case"top_right":return{x:ax22-width/2,y:ay22-height/2};case"center_left":return{x:ax22+width/2,y:ay22};case"center_right":return{x:ax22-width/2,y:ay22};case"bottom_left":return{x:ax22+width/2,y:ay22+height/2};case"bottom_center":return{x:ax22,y:ay22+height/2};case"bottom_right":return{x:ax22-width/2,y:ay22+height/2};default:return anchorPosition}}var getDistanceToPoint=(routePoint3,targetPoint)=>{let position4=getRoutePointPosition(routePoint3);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},platformAllowsLegacyAutorouters=group2=>{let platform=group2.root?.platform;return platform!==void 0&&"allowLegacyAutorouters"in platform&&platform.allowLegacyAutorouters===!0},getDisabledLegacyGroupAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let resolvedGroupAutorouter=group2._parsedProps.autorouter??group2.getInheritedProperty("autorouter");return getLegacyAutorouterPreset(resolvedGroupAutorouter)},getDisabledLegacyAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let legacyGroupAutorouterPreset=getDisabledLegacyGroupAutorouterPreset(group2);if(legacyGroupAutorouterPreset)return legacyGroupAutorouterPreset;let routingPhaseAutorouters=group2.selectAll("autoroutingphase").map(autoroutingPhase=>autoroutingPhase._parsedProps.autorouter);for(let autorouter of routingPhaseAutorouters){let legacyAutorouterPreset=getLegacyAutorouterPreset(autorouter);if(legacyAutorouterPreset)return legacyAutorouterPreset}return null},ensureRouteStartsAtSourceTraceStart=({db:db22,route:route2,routeThicknessMode,sourceTraceId})=>{if(!sourceTraceId||route2.length<2)return route2;let firstSourcePortId=db22.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route2;let firstPcbPort=db22.pcb_port.list().find(port=>port.source_port_id===firstSourcePortId);if(!firstPcbPort)return route2;let firstPoint=route2[0],lastPoint=route2[route2.length-1];return getDistanceToPoint(lastPoint,firstPcbPort)<getDistanceToPoint(firstPoint,firstPcbPort)?reversePcbTraceRoute(route2,routeThicknessMode):route2},Group5=class extends NormalComponent{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,"_pcbPlacementDrcErrorCount",null);__publicField(this,"_pcbPlacementDrcCheckError",null);__publicField(this,"_pcbPlacementDrcChecksPending",!1);__publicField(this,"_standaloneSubcircuitDrcChecksComplete",!1);__publicField(this,"_standaloneSubcircuitDrcChecksInProgress",!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 direction3=port._parsedProps.direction;if(!direction3)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction3==="left"?"leftSide":direction3==="right"?"rightSide":direction3==="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:db22}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db22.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}`,db22.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db22}=this.root;for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&db22.source_component.update(child.source_component_id,{source_group_id:this.source_group_id});if(!this.isSubcircuit)return;let disabledLegacyAutorouterPreset=getDisabledLegacyAutorouterPreset(this);disabledLegacyAutorouterPreset&&db22.source_invalid_component_property_error.insert({source_component_id:this.source_component_id??"",property_name:"autorouter",error_type:"source_invalid_component_property_error",message:`The "${disabledLegacyAutorouterPreset}" autorouter is deprecated and is not enabled by this platform. Use the default autorouter and introduce <autoroutingphase /> or <fanout /> elements as needed.`})}doInitialSourceParentAttachment(){let{db:db22}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db22.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit||isAssemblyDeviceContainer(this.parent))return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db22.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,groupProps22=props,hasOutline=groupProps22.outline&&groupProps22.outline.length>0,numericOutline=hasOutline?groupProps22.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=db22.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)db22.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(pcbContentBounds){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db22}=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?db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db22.pcb_group.update(this.pcb_group_id,{center:center22});return}let contentBounds=pcbContentBounds;if(!contentBounds){let bounds=getBoundsOfPcbComponents(this.children);contentBounds={center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.width,height:bounds.height}}let{width,height}=contentBounds,{x:centerX,y:centerY}=contentBounds.center;if(this.isSubcircuit||this.isRoutingDirective){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),existingCenter=db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY},shouldUsePcbContentCenter=this.isSubcircuit||this.isRoutingDirective||pcbContentBounds!==void 0,center2=hasExplicitPositioning?shouldUsePcbContentCenter?{x:props.width===void 0?centerX:existingCenter.x,y:props.height===void 0?centerY:existingCenter.y}:existingCenter:{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}db22.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a543,_b6;return(_a543=this.unnamedElementCounter)[_b6=elm.lowercaseComponentName]??(_a543[_b6]=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:db22}=this.root,groupProps22=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps22.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),Group_doInitialAssignSchematicSheetToConnectedComponents(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this._findDirectChildSubcircuits();for(let subcircuitChild of subcircuitChildren)if(!subcircuitChild._isInflatedFromCircuitJson&&subcircuitChild._hasTracesToRoute()&&subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_findDirectChildSubcircuits(){let result=[],visit=children=>{for(let child of children)child.isSubcircuit&&child!==this?result.push(child):visit(child.children)};return visit(this.children),result}_shouldRouteAsync(){if(this._isLegacyAutorouterDisabled())return!1;let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug132=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithExistingTraceInput=!1;for(let routingPhasePlan of routingPhasePlans){traceCount+=routingPhasePlan.traces.length;let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):void 0;hasReroutePhaseWithExistingTraceInput||(hasReroutePhaseWithExistingTraceInput=!!(routingPhasePlan.reroute&&(routingPhasePlan.region||phaseAutorouterConfig?.preset==="simplify")))}if(debug132(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithExistingTraceInput){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug132(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db22}=this.root,debug132=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig3=this._getAutorouterConfig(),serverUrl=autorouterConfig3.serverUrl,serverMode=autorouterConfig3.serverMode,fetchWithDebug=(url3,options)=>(debug132("fetching",url3),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url3,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 preferredTraceWidth=props.defaultTraceWidth??props.nominalTraceWidth,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:preferredTraceWidth!=null?Number(preferredTraceWidth):void 0,subcircuit_id:this.subcircuit_id,subcircuitComponent:this});simpleRouteJson.allowViaInPad=autorouterConfig3.allowViaInPad;let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r23=>r23.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(r23=>r23.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:autorouterConfig3.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r23=>r23.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(r23=>r23.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(r23=>r23.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err2=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db22.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err2.message}),err2}await new Promise(resolve7=>setTimeout(resolve7,100))}}async _runLocalAutorouting(){let{db:db22}=this.root,props=this._parsedProps,debug132=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug132(`[${this.getString()}] starting local autorouting`);let autorouterConfig3=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig3),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig3),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.defaultTraceWidth??props.nominalTraceWidth??minTraceWidth),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=this.getInheritedProperty("routeRemaining")===!1||Group_hasPhasedAutorouting(routingPhasePlans),shouldEmitRoutingPhaseDebugObjects=routingPhasePlans.length>1,routingPhaseDebugLabels=new Map;if(shouldEmitRoutingPhaseDebugObjects)for(let debugObject of db22.pcb_debug_object.list())debugObject.subcircuit_id===this.subcircuit_id&&(debugObject.label?.startsWith("Autorouting phase: ")||debugObject.label?.startsWith("autorouting phase "))&&db22.pcb_debug_object.delete(debugObject.pcb_debug_object_id);let emitRoutingPhaseDebugObject=(routingPhasePlan,bounds)=>{if(!shouldEmitRoutingPhaseDebugObjects)return;let phaseLabel=routingPhaseDebugLabels.get(routingPhasePlan),phaseName=routingPhasePlan.phaseName?.trim();db22.pcb_debug_object.insert({shape:"rect",center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},size:{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY},label:`autorouting phase ${phaseLabel}${phaseName?` ${phaseName}`:""}`,subcircuit_id:this.subcircuit_id??void 0})},routingStages=routingPhasePlans.flatMap(routingPhasePlan=>{let resolvedPhaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig3,preset=resolvedPhaseAutorouterConfig.preset,implicitPhaseLabel=routingPhasePlan.reroute?preset==="simplify"?"simplify":"reroute":routingPhasePlan.fanoutRegionPcbGroupId?routingPhasePlan.autorouter==="default"&&!routingPhasePlan.getPrecomputedRoutingResult?"breakout":"fanout":preset&&preset!=="default"?preset.replaceAll("_"," "):"default";routingPhaseDebugLabels.set(routingPhasePlan,routingPhasePlan.routingPhaseIndex?.toString()??implicitPhaseLabel);let phaseAutorouterConfig=routingPhasePlan.getPrecomputedRoutingResult?{...resolvedPhaseAutorouterConfig,allowViaInPad:(typeof routingPhasePlan.autorouter=="object"?routingPhasePlan.autorouter.allowViaInPad:void 0)??autorouterConfig3.allowViaInPad}:resolvedPhaseAutorouterConfig,stages=getLocalAutoroutingStages(routingPhasePlan.algorithmFn?{...phaseAutorouterConfig,algorithmFn:routingPhasePlan.algorithmFn}:phaseAutorouterConfig,this.root?.platform);return stages.map((stage,phaseStageIndex)=>({...stage,routingPhasePlan,phaseStageIndex,phaseStageCount:stages.length}))}),implicitPhaseLabelCounts=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);implicitPhaseLabelCounts.set(label,(implicitPhaseLabelCounts.get(label)??0)+1)}let implicitPhaseLabelOrdinals=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);if(implicitPhaseLabelCounts.get(label)<=1)continue;let ordinal=(implicitPhaseLabelOrdinals.get(label)??0)+1;implicitPhaseLabelOrdinals.set(label,ordinal),routingPhaseDebugLabels.set(plan,`${label} ${ordinal}`)}let fanoutPourNetMap=routingStages.some(({autorouterConfig:autorouterConfig22})=>["fanout","single_layer_fanout","dogbone"].includes(autorouterConfig22.preset??""))?Group_getFanoutPourNetMap(this,routingPhasePlans):void 0,{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,fanoutPourNetMap}),emitFanoutBoundsConflictWarning=routingPhasePlan=>{let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)return;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),sourceComponentId=db22.pcb_component.list().find(component=>component.pcb_group_id===fanoutRegionPcbGroupId)?.source_component_id;if(!sourceComponentId)return;let message=`${pcbGroup?.name??"Breakout"} defines conflicting fanout bounds with explicit breakout geometry and fanoutBoundaryPadding. Explicit breakout geometry takes precedence, so fanoutBoundaryPadding is ignored.`;db22.source_property_ignored_warning.list().some(warning=>warning.source_component_id===sourceComponentId&&warning.property_name==="fanoutBoundaryPadding"&&warning.message===message)||db22.source_property_ignored_warning.insert({source_component_id:sourceComponentId,property_name:"fanoutBoundaryPadding",message,error_type:"source_property_ignored_warning",subcircuit_id:pcbGroup?.subcircuit_id})},fanoutConfigByPhasePlan=new Map;for(let routingStage of routingStages){let fanoutMode=routingStage.autorouterConfig.preset;(fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!fanoutConfigByPhasePlan.has(routingStage.routingPhasePlan)&&fanoutConfigByPhasePlan.set(routingStage.routingPhasePlan,routingStage.autorouterConfig)}let fanoutPhaseRegions=[];for(let[routingPhasePlan,phaseAutorouterConfig]of fanoutConfigByPhasePlan){let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)continue;let phaseSimpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);if(phaseSimpleRouteJson.connections.length===0)continue;phaseSimpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(phaseSimpleRouteJson,routingPhasePlan.drcTolerances);let breakoutPoints=db22.pcb_breakout_point.list().filter(point62=>point62.pcb_group_id===fanoutRegionPcbGroupId).map(point62=>({x:point62.x,y:point62.y})),fanoutMode=phaseAutorouterConfig.preset,fanoutBounds=FanoutAutorouter.resolveFanoutBounds(phaseSimpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:phaseSimpleRouteJson.allowBlindAndBuriedVias,breakoutPoints,onFanoutBoundsConflict:()=>emitFanoutBoundsConflictWarning(routingPhasePlan)});if(routingPhasePlan.fanoutBounds=fanoutBounds,!fanoutBounds)continue;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),maximumTraceWidth=Math.max(phaseSimpleRouteJson.minTraceWidth,...phaseSimpleRouteJson.connections.map(connection=>connection.nominalTraceWidth??connection.width??phaseSimpleRouteJson.minTraceWidth)),viaPadDiameter=phaseSimpleRouteJson.minViaPadDiameter??phaseSimpleRouteJson.min_via_pad_diameter??phaseSimpleRouteJson.minViaDiameter,traceToPadClearance=phaseSimpleRouteJson.minTraceToPadEdgeClearance??phaseSimpleRouteJson.defaultObstacleMargin??maximumTraceWidth;fanoutPhaseRegions.push({regionId:fanoutRegionPcbGroupId,name:pcbGroup?.name??routingPhasePlan.phaseName??fanoutRegionPcbGroupId,bounds:fanoutBounds,boundaryKeepaway:getFanoutBoundaryPointSpacing({traceWidth:maximumTraceWidth,traceToPadClearance,viaPadDiameter})/2})}let fanoutSeparationConflict=findFanoutPhaseSeparationConflict(fanoutPhaseRegions);if(fanoutSeparationConflict){let{firstRegion,secondRegion,availableGap,requiredGap}=fanoutSeparationConflict,separationDescription=availableGap<0?`overlap by ${Math.abs(availableGap).toFixed(3)}mm`:`are only ${availableGap.toFixed(3)}mm apart`,message=`Fanout regions "${firstRegion.name}" and "${secondRegion.name}" ${separationDescription}, but at least ${requiredGap.toFixed(3)}mm of separation is required for a via-safe routing channel. Move the components farther apart or reduce their facing fanout padding.`;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message},simpleRouteJson:baseSimpleRouteJson}),new Error(message)}for(let{regionId,bounds}of fanoutPhaseRegions)db22.pcb_group.update(regionId,{center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY});let outputTraces=[],outputJumpers=[],pcbTraceIdsToDelete=new Set,existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this),traceMatchesRoutingPhase=(trace,routingPhasePlan)=>{let connectionName=trace.connection_name??trace.pcb_trace_id,sourceTraceIds=new Set([connectionName,trace.pcb_trace_id,...getSourceTraceIdsFromRerouteName(connectionName),...getSourceTraceIdsFromRerouteName(trace.pcb_trace_id)]);return baseSimpleRouteJson.connections.some(connection=>connectionIsInRoutingPhase(connection,routingPhasePlan)?sourceTraceIds.has(connection.name)||(connection.source_trace_id?sourceTraceIds.has(connection.source_trace_id):!1)||(connection.rootConnectionName?sourceTraceIds.has(connection.rootConnectionName):!1)||connection.mergedConnectionNames?.some(name=>sourceTraceIds.has(name)):!1)},manualSourceTraceIds=new Set(this.getDescendants().filter(child=>child instanceof Trace&&!child.getSubcircuit()._isInflatedFromCircuitJson&&!!child._parsedProps.pcbPath?.length).map(trace=>trace.source_trace_id)),manualPcbTraceIds=new Set(db22.pcb_trace.list().filter(trace=>trace.source_trace_id&&manualSourceTraceIds.has(trace.source_trace_id)).map(trace=>trace.pcb_trace_id)),fixedTraceIds=new Set(manualPcbTraceIds),previousStageOutputSimpleRouteJson,skippedRemainingPhases=new Set;for(let[routingStageIndex,{routingPhasePlan,autorouterConfig:phaseAutorouterConfig,strategy:localAutorouterStrategy,usesPreviousStageOutput,phaseStageIndex,phaseStageCount}]of routingStages.entries()){if(skippedRemainingPhases.has(routingPhasePlan))continue;if(usesPreviousStageOutput||(previousStageOutputSimpleRouteJson=void 0),usesPreviousStageOutput&&previousStageOutputSimpleRouteJson===void 0)throw new Error("Autorouting follow-up stage is missing the preceding stage output");let simpleRouteJson=previousStageOutputSimpleRouteJson??baseSimpleRouteJson,isTraceSimplificationPhase=!!(routingPhasePlan.reroute&&phaseAutorouterConfig.preset==="simplify"),isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region&&!isTraceSimplificationPhase),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!isTraceSimplificationPhase&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase||isTraceSimplificationPhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(!usesPreviousStageOutput&&isTraceSimplificationPhase)simpleRouteJson={...Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:existingRerouteSeedTraces,stageOutputPcbTraces:outputTraces})};else if(!usesPreviousStageOutput&&isRegionReroutePhase&&rerouteOriginalSrj)simpleRouteJson=Fce(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region});else if(!usesPreviousStageOutput&&isConnectionReroutePhase){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan))]}}else if(!usesPreviousStageOutput&&hasPhasedAutorouting){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),activeCustomBreakoutRoutingGroupId=routingPhasePlan.routingPcbGroupId;if(activeCustomBreakoutRoutingGroupId){let activeGroupCopperPourObstacles=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,routingPcbGroupId:activeCustomBreakoutRoutingGroupId,fanoutPourNetMap}).simpleRouteJson.obstacles.filter(obstacle=>obstacle.isCopperPour),nonCopperPourObstacles=phaseInput.obstacles.filter(obstacle=>!obstacle.isCopperPour);phaseInput.obstacles=nonCopperPourObstacles.concat(activeGroupCopperPourObstacles)}simpleRouteJson={...phaseInput,traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:phaseInput.traces??[],stageOutputPcbTraces:outputTraces})}}if(phaseAutorouterConfig.preset!=="bus_lanes"){let preservesManualTraceGeometry=!phaseAutorouterConfig.algorithmFn&&(phaseAutorouterConfig.preset==="fanout"||phaseAutorouterConfig.preset==="single_layer_fanout");simpleRouteJson=withFixedTraces(simpleRouteJson,preservesManualTraceGeometry?new Set([...fixedTraceIds].filter(pcbTraceId=>!manualPcbTraceIds.has(pcbTraceId))):fixedTraceIds)}simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),simpleRouteJson.allowViaInPad=phaseAutorouterConfig.allowViaInPad;let getPrecomputedRoutingResult=usesPreviousStageOutput?void 0:routingPhasePlan.getPrecomputedRoutingResult,preflightRoutingCheckPolicy3=this.getInheritedProperty("preflightRoutingCheckPolicy")??"basic";if(routingPhasePlan.isImplicitRemainingPhase&&phaseStageIndex===0&&this.getInheritedProperty("routeRemaining")===void 0&&(preflightRoutingCheckPolicy3==="basic"||preflightRoutingCheckPolicy3==="conservative")&&simpleRouteJson.connections.length>50){skippedRemainingPhases.add(routingPhasePlan),db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouting_error_remaining_routes_${this.subcircuit_id}`,subcircuit_id:this.subcircuit_id??void 0,error_type:"pcb_autorouting_error",message:`Remaining routes left unrouted (over 50 traces remaining and preflightRoutingCheckPolicy="${preflightRoutingCheckPolicy3}"). Set <board routeRemaining={true} /> or create <autoroutingphase /> elements for specific connections in the order you'd like to route them. The autorouter may hang unless you create autorouting phases incrementally.`});continue}let simplificationHasNoTraceInput=!!(isTraceSimplificationPhase&&simpleRouteJson.traces?.length===0);if((hasPhasedAutorouting||isReroutePhase||usesPreviousStageOutput)&&(simpleRouteJson.connections.length===0&&!isTraceSimplificationPhase&&!getPrecomputedRoutingResult||simplificationHasNoTraceInput)){phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,simpleRouteJson.bounds),previousStageOutputSimpleRouteJson=simpleRouteJson;continue}let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes));let fanoutMode=phaseAutorouterConfig.preset;if((fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!routingPhasePlan.fanoutRegionPcbGroupId&&!getPrecomputedRoutingResult&&(routingPhasePlan.fanoutBounds=FanoutAutorouter.resolveFanoutBounds(simpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias})),phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,routingPhasePlan.fanoutBounds??simpleRouteJson.bounds),debug132.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug132.enabled){let graphicsObject=Go2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}let autorouterVersion22=phaseAutorouterConfig.autorouterVersion??this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0,commonAutorouterOptions={capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,platformConfig:this.root?.platform,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion22,effort},autorouterName=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom":localAutorouterStrategy.name,solverName=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn?void 0:localAutorouterStrategy.getSolverName(commonAutorouterOptions),localAutoroutingCacheSolverOptions={autorouterName,solverName,capacityDepth:commonAutorouterOptions.capacityDepth,targetMinCapacity:commonAutorouterOptions.targetMinCapacity,useAssignableSolver:commonAutorouterOptions.useAssignableSolver,useAutoJumperSolver:commonAutorouterOptions.useAutoJumperSolver,useLaserPrefabSolver:commonAutorouterOptions.useLaserPrefabSolver,useTraceSimplificationSolver:phaseAutorouterConfig.preset==="simplify",autorouterVersion:commonAutorouterOptions.autorouterVersion,effort:commonAutorouterOptions.effort},cacheEngine=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn||!localAutorouterStrategy.cacheable?void 0:this.root?.platform?.localCacheEngine,cacheKey=cacheEngine?getLocalAutoroutingCacheKey(simpleRouteJson,localAutoroutingCacheSolverOptions):void 0,cachedResult=cacheKey?await getCachedLocalAutoroutingPhaseResult({cacheEngine,cacheKey}):null,cacheDisabledReason=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom_algorithm":localAutorouterStrategy.cacheable?cacheEngine?void 0:"no_cache_engine":"strategy_not_cacheable",autoroutingMetadata={routingPhaseIndex:routingPhasePlan.routingPhaseIndex,_actualRoutingPhaseOrderIndex:routingStageIndex,phaseOrdinal:routingStageIndex+1,phaseCount:routingStages.length,connectionCount:simpleRouteJson.connections.length,obstacleCount:simpleRouteJson.obstacles.length,previousTraceCount:simpleRouteJson.traces?.length??0,isReroutePhase,autorouterName,autorouterVersion:autorouterVersion22,solverName,effort,cacheStatus:cacheEngine?cachedResult?"hit":"miss":"disabled",cacheKey,cacheDisabledReason};this.root?.emit("autorouting:start",{type:"autorouting:start",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson});let autorouter;try{let traces,precomputedOutputSimpleRouteJson;if(getPrecomputedRoutingResult){let result=getPrecomputedRoutingResult(simpleRouteJson);traces=result.traces,precomputedOutputSimpleRouteJson=result.outputSimpleRouteJson;for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id)}else if(cachedResult)debug132(`[${this.getString()}] using cached local autorouting result`),traces=cachedResult.traces;else{if(phaseAutorouterConfig.algorithmFn?autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson):autorouter=localAutorouterStrategy.create({simpleRouteJson,onSolverEnded:event=>this.root?.emit("solver:ended",{...event,type:"solver:ended",componentName:this.getString()}),commonAutorouterOptions,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias,componentNamesById:getPcbComponentNamesById(db22),onSolverStarted:({solverName:solverName2,solverParams,solverConstructorArgs})=>this.root?.emit("solver:started",{type:"solver:started",solverName:solverName2,solverParams,solverConstructorArgs,componentName:this.getString()})}),!autorouter)throw new Error("Failed to create local autorouter");let activeAutorouter=autorouter,routingPromise=new Promise((resolve7,reject)=>{activeAutorouter.on("complete",event=>{debug132(`[${this.getString()}] local autorouting complete`),resolve7(event.traces)}),activeAutorouter.on("error",event=>{debug132(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});activeAutorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,...event,type:"autorouting:progress"})}),activeAutorouter.start(),traces=await routingPromise}let transformedSimpleRouteJson=precomputedOutputSimpleRouteJson??autorouter?.getOutputSimpleRouteJson?.();if(localAutorouterStrategy.preserveOutputTraces&&transformedSimpleRouteJson?.traces&&(transformedSimpleRouteJson={...transformedSimpleRouteJson,traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:transformedSimpleRouteJson.traces})}),transformedSimpleRouteJson&&!usesPreviousStageOutput&&["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")&&routingPhasePlan.routingPcbGroupId){let synchronizedFanout=Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson:simpleRouteJson,fanoutOutputSimpleRouteJson:transformedSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan});baseSimpleRouteJson=synchronizedFanout.baseSimpleRouteJson,transformedSimpleRouteJson=synchronizedFanout.downstreamSimpleRouteJson;for(let synchronizedPoint of synchronizedFanout.synchronizedBreakoutPoints){let breakoutPoint=db22.pcb_breakout_point.list().find(point62=>point62.pcb_group_id===synchronizedPoint.routingPcbGroupId&&point62.source_trace_id===synchronizedPoint.sourceTraceId&&Math.abs(point62.x-synchronizedPoint.previousPoint.x)<=1e-6&&Math.abs(point62.y-synchronizedPoint.previousPoint.y)<=1e-6);breakoutPoint&&db22.pcb_breakout_point.update(breakoutPoint.pcb_breakout_point_id,{x:synchronizedPoint.fanoutExitPoint.x,y:synchronizedPoint.fanoutExitPoint.y,layer:synchronizedPoint.fanoutExitPoint.layer})}}if(localAutorouterStrategy.preserveOutputTraces)for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id);let stageOutputTraces=traces;transformedSimpleRouteJson?.traces?stageOutputTraces=transformedSimpleRouteJson.traces:usesPreviousStageOutput&&(stageOutputTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let eventOutputPcbTraces=stageOutputTraces;!transformedSimpleRouteJson&&!usesPreviousStageOutput&&routingPhasePlan.routingPhaseIndex!==null&&(eventOutputPcbTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let outputSimpleRouteJson={...transformedSimpleRouteJson??simpleRouteJson,traces:eventOutputPcbTraces};previousStageOutputSimpleRouteJson=transformedSimpleRouteJson?outputSimpleRouteJson:void 0,!cachedResult&&cacheKey&&await cacheLocalAutoroutingPhaseResult({cacheEngine,cacheKey,result:{...simpleRouteJson,traces}});let savedPhasePaths=getAutoroutingPhasePcbTracePaths({group:this.selectAll("group").find(group2=>group2.pcb_group_id===routingPhasePlan.fanoutRegionPcbGroupId)??routingPhasePlan.autoroutingPhase?.getGroup()??this,subcircuit:this,input:simpleRouteJson,traces,isFanout:["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")});if(this.root?.emit("autorouting:end",{...savedPhasePaths,type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson:outputSimpleRouteJson}),autorouter?.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db22,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter?.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isRegionReroutePhase&&rerouteOriginalSrj){for(let trace of rerouteOriginalSrj.traces??[])trace.type==="pcb_trace"&&pcbTraceIdsToDelete.add(trace.pcb_trace_id);let reconnectedSrj=jce(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else if(isConnectionReroutePhase){let retainedPcbTraces=outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan));outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:retainedPcbTraces,stageOutputPcbTraces:stageOutputTraces}))}else{if(isTraceSimplificationPhase)for(let existingTrace of existingRerouteSeedTraces)fixedTraceIds.has(existingTrace.pcb_trace_id)||pcbTraceIdsToDelete.add(existingTrace.pcb_trace_id);outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:outputTraces,stageOutputPcbTraces:stageOutputTraces}))}}catch(error2){let{db:db32}=this.root;throw db32.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",{type:"autorouting:error",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter?.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers,pcb_trace_ids_to_be_replaced:[...pcbTraceIdsToDelete]},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("autorouting",async()=>{try{await this._runLocalAutorouting()}catch(error2){if(!(error2 instanceof RoutingPhasePreparationError))throw error2;let{db:db22}=this.root,pcbErrorId=`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`;throw db22.pcb_autorouting_error.list().some(recordedError=>recordedError.pcb_error_id===pcbErrorId&&recordedError.message===error2.message)||(db22.pcb_autorouting_error.insert({pcb_error_id:pcbErrorId,error_type:"pcb_autorouting_error",message:error2.message,subcircuit_id:this.subcircuit_id??void 0}),this.root?.emit("autorouting:error",{type:"autorouting:error",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error2.message}})),error2}}):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(!this.isSubcircuit||this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled")||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled()||this._shouldUseTraceByTraceRouting())return;if(!this._areChildSubcircuitsRouted()){debug132(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}if(debug132(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),!this._hasTracesToRoute())return;let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations||this._startAsyncAutorouting()}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}doInitialSchematicSheetRender(){Group_doInitialSchematicSheetRender(this)}updateSchematicSheetRender(){Group_updateSchematicSheetRender(this)}updatePcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug132(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled())return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){if(this._areChildSubcircuitsRouted()){let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});if(shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations)return;debug132(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting()}return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db22}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug132(`[${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){debug132(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db22}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let cjRoute=routedTrace.route.map(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),pcb_trace3=db22.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:getCircuitJsonPcbTraceRoute(cjRoute)});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:pcb_trace3,routeWithSrjMetadata:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db22}=this.root,pcbStyle3=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle3),boardComponent=this._getBoard(),board=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):db22.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:db22,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});let materializedPcbVias=db22.pcb_via.list(),jumperPadInfos=getJumperPadInfos(db22);for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=this.subcircuit_id);let cjRoute=pcb_trace3.route.map(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db22,route:cjRoute,routeThicknessMode:pcb_trace3.route_thickness_mode,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,jumperPadInfos);for(let segment2 of processedSegments)if(segment2.length>0){let circuitJsonSegment=getCircuitJsonPcbTraceRoute(segment2),sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:circuitJsonSegment},subcircuit_id:this.subcircuit_id}),insertedPcbTrace=db22.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:circuitJsonSegment});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:insertedPcbTrace,routeWithSrjMetadata:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db22.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db22.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point62 of pcb_trace3.route)if(point62.route_type==="via"){let routedViaPoint=point62,fromLayer=point62.from_layer,toLayer=point62.to_layer,pcbVia={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:getAutoroutedViaLayers({fromLayer,toLayer,layerCount:this._getSubcircuitLayerCount(),allowBlindAndBuriedVias:board?.allow_blind_and_buried_vias??!1,physicalLayers:routedViaPoint.layers}),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:this.subcircuit_id,pcb_group_id:this.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey};if(materializedPcbVias.some(materializedPcbVia=>pcbViasSharePhysicalHole(materializedPcbVia,pcbVia)))continue;materializedPcbVias.push(db22.pcb_via.insert(pcbVia))}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,schematic_group3=db22.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.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&(child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db22.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}if(this.children.some(c23=>c23.source_component_id!==null&&c23._parsedProps?.schSectionName!==void 0)){this._doInitialSchematicLayoutSections(),this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutSections(){Group_doInitialSchematicLayoutSections(this)}_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:db22}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db22.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db22.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:db22}=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?db22.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;db22.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 dx22=port.center.x-component.center.x,dy22=port.center.y-component.center.y;return Math.abs(dx22)>Math.abs(dy22)?dx22>0?"right":"left":dy22>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)}_isLegacyAutorouterDisabled(){return getDisabledLegacyAutorouterPreset(this)!==null}_isLaserPrefabAutorouter(autorouterConfig3=this._getAutorouterConfig()){let autorouterProp3=this.props.autorouter,normalize9=value=>value?.replace(/-/g,"_")??value;return autorouterConfig3.preset==="laser_prefab"?!0:typeof autorouterProp3=="string"?normalize9(autorouterProp3)==="laser_prefab":typeof autorouterProp3=="object"&&autorouterProp3?normalize9(autorouterProp3.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig3=this._getAutorouterConfig()){let autorouterProp3=this.props.autorouter,normalize9=value=>value?.replace(/-/g,"_")??value;return autorouterConfig3.preset==="auto_jumper"?!0:typeof autorouterProp3=="string"?normalize9(autorouterProp3)==="auto_jumper":typeof autorouterProp3=="object"&&autorouterProp3?normalize9(autorouterProp3.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return getDisabledLegacyGroupAutorouterPreset(this)?!1:this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this._isLegacyAutorouterDisabled()||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db22}=this.root;if(this.isSubcircuit){let immediateChildrenByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=immediateChildrenByName.get(child._parsedProps.name)||[];components.push(child),immediateChildrenByName.set(child._parsedProps.name,components)}for(let[name,components]of immediateChildrenByName.entries()){if(components.length<=1)continue;let sameNamedTraces=components.filter(child=>child instanceof Trace),duplicateNameIsOnlyTraces=sameNamedTraces.length===components.length,mutuallyConnectedTraceKeys=sameNamedTraces.map(trace=>trace.subcircuit_connectivity_map_key),sameNamedTracesAreMutuallyConnected=duplicateNameIsOnlyTraces&&mutuallyConnectedTraceKeys.every(Boolean)&&new Set(mutuallyConnectedTraceKeys).size===1;if(!duplicateNameIsOnlyTraces||!sameNamedTracesAreMutuallyConnected){let displaySubcircuitName=this.name||"unnamed",message=duplicateNameIsOnlyTraces?`Trace "${name}" in subcircuit "${displaySubcircuitName}" shares a name with another trace, but the traces are not mutually connected. Same-named traces must have the same subcircuit connectivity map key.`:`Multiple immediate children found with name "${name}" in subcircuit "${displaySubcircuitName}". Names must be unique.`;db22.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c23=>c23.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks(this)}doInitialSchematicLabelNetsWithConflictingNames(){this.root?.schematicDisabled||this.getTopLevelRenderable()===this&&assignSchematicNetLabelSuperscripts(this.root.db)}updateSchematicLabelNetsWithConflictingNames(){this.doInitialSchematicLabelNetsWithConflictingNames()}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db22}=this.root,subtree=db22;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text2=nl3.text||net?.name||"",isGroundNet=net?.is_ground||GROUND_NET_REGEX.test(text2),isPowerNet=net?.is_power||POWER_NET_REGEX.test(text2);if(nl3.anchor_side==="top"&&isGroundNet){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&isPowerNet&&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}),groupProps22={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)}groupProps22.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps22.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps22.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group2=new Group5(groupProps22);return group2._isInflatedFromCircuitJson=!0,group2.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group2),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group2):subcircuit.add(group2),group2}var Inductor2=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,max_current_rating:props.maxCurrentRating===void 0?void 0:parseAndConvertSiUnit(props.maxCurrentRating,"A").value,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),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 Inductor2({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)}var generatedNotes=new WeakMap,getPolarity2=port=>{let hints=[port.name,...port.port_hints??[]].map(hint=>hint.toLowerCase().replace(/[^a-z0-9+-]/g,"")),anode=hints.some(hint=>["a","anode","pos","positive","+"].includes(hint)),cathode=hints.some(hint=>["k","c","cathode","neg","negative","-"].includes(hint));return anode===cathode?null:anode?"anode":"cathode"},Led_addPolarityFabricationSymbol=led2=>{let root=led2.root;if(!root)return;let{db:db22}=root,previous=generatedNotes.get(led2);for(let path of previous??[])db22.pcb_fabrication_note_path.delete(path.pcb_fabrication_note_path_id);if(generatedNotes.delete(led2),root.pcbDisabled||!led2.pcb_component_id)return;let pcb=db22.pcb_component.get(led2.pcb_component_id);if(!pcb||pcb.layer!=="top"&&pcb.layer!=="bottom")return;let ports=db22.source_port.list({source_component_id:led2.source_component_id}),anodes=ports.filter(port=>getPolarity2(port)==="anode"),cathodes=ports.filter(port=>getPolarity2(port)==="cathode");if(anodes.length!==1||cathodes.length!==1)return;let anode=anodes[0],cathode=cathodes[0],a22=db22.pcb_port.getWhere({source_port_id:anode.source_port_id}),k22=db22.pcb_port.getWhere({source_port_id:cathode.source_port_id});if(!a22||!k22)return;let distance27=Math.hypot(k22.x-a22.x,k22.y-a22.y);if(distance27<1e-6)return;let angle3=Math.atan2(k22.y-a22.y,k22.x-a22.x),frame=compose2(translate2((a22.x+k22.x)/2,(a22.y+k22.y)/2),rotate2(angle3)),point62=(x23,y23)=>applyToPoint2(frame,{x:x23,y:y23}),common={pcb_component_id:pcb.pcb_component_id,subcircuit_id:led2.getSubcircuit()?.subcircuit_id??void 0,layer:pcb.layer},notes=[];generatedNotes.set(led2,notes);let halfLength=Math.min(distance27*.2,.4),halfHeight=halfLength*.75,routes=[[point62(-distance27/2,0),point62(-halfLength,0)],[point62(-halfLength,-halfHeight),point62(halfLength,0),point62(-halfLength,halfHeight),point62(-halfLength,-halfHeight)],[point62(halfLength,-halfHeight),point62(halfLength,halfHeight)],[point62(halfLength,0),point62(distance27/2,0)]];for(let route2 of routes)notes.push(db22.pcb_fabrication_note_path.insert({...common,route:route2,stroke_width:.08}))},Led=class extends NormalComponent{get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null,baseSymbolName=variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&baseSymbolName==="led"?`led_${compactSize}`:void 0;return{schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){let hasFootprintChild=this.children.some(child=>child.componentName==="Footprint"),footprint=this.resolveFootprint(),hasPinLabels=!!this._resolvePinLabels(),shouldAddDefaultAliases=!hasPinLabels&&!hasFootprintChild&&(!footprint||isFootprinterString(footprint));super.initPorts({pinCount:2,ignoreSymbolPorts:!hasPinLabels&&!shouldAddDefaultAliases,additionalAliases:{pin1:shouldAddDefaultAliases?["anode","pos","left"]:[],pin2:shouldAddDefaultAliases?["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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_led",name:this.name,wave_length:props.wavelength,color:props.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}get pos(){return this.portMap.pos}doInitialPcbComponentSizeCalculation(){super.doInitialPcbComponentSizeCalculation(),Led_addPolarityFabricationSymbol(this)}get anode(){return this.portMap.anode}get neg(){return this.portMap.neg}get cathode(){return this.portMap.cathode}};function inflateSourceLed(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}),led2=new Led({name:sourceElm.name,color:sourceElm.color,wavelength:sourceElm.wavelength??sourceElm.wave_length,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:led2});footprint&&led2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(led2):subcircuit.add(led2)}var possibleOrientations=[{gate:"left",drain:"top",source:"bottom"},{gate:"left",drain:"bottom",source:"top"},{gate:"right",drain:"top",source:"bottom"},{gate:"right",drain:"bottom",source:"top"},{gate:"top",drain:"left",source:"right"},{gate:"top",drain:"right",source:"left"},{gate:"bottom",drain:"left",source:"right"},{gate:"bottom",drain:"right",source:"left"}],getBaselineOrientation=rotation5=>{let normalizedRotation=(rotation5%360+360)%360;if(normalizedRotation%90!==0)throw new Error(`Schematic rotation ${rotation5} is not supported for Mosfet`);return[{gate:"left",drain:"top",source:"bottom"},{gate:"top",drain:"right",source:"left"},{gate:"right",drain:"bottom",source:"top"},{gate:"bottom",drain:"left",source:"right"}][normalizedRotation/90]},getRequestedOrientation=props=>{let requestedSides={drain:props.symbolDrainSide,source:props.symbolSourceSide,gate:props.symbolGateSide},baseline=getBaselineOrientation(Number(props.schRotation??0)),matchingOrientations=possibleOrientations.filter(orientation22=>Object.keys(requestedSides).every(portName=>requestedSides[portName]===void 0||requestedSides[portName]===orientation22[portName]));if(matchingOrientations.length===0){let requestedDescription=Object.entries(requestedSides).filter(([,side])=>side!==void 0).map(([portName,side])=>`${portName}=${side}`).join(", ");throw new Error(`Invalid MOSFET symbol port side combination (${requestedDescription}). The gate must be perpendicular to the drain and source, and the drain and source must be opposite.`)}return matchingOrientations.sort((a22,b22)=>{let score=orientation22=>Object.keys(baseline).filter(portName=>orientation22[portName]!==baseline[portName]).length;return score(a22)-score(b22)})[0]},getMosfetSchematicSymbolName=props=>{let mosfetMode=props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${props.channelType}_channel_${mosfetMode}_mosfet_transistor`;if(!(props.symbolDrainSide!==void 0||props.symbolSourceSide!==void 0||props.symbolGateSide!==void 0))return baseSymbolName;let{gate,drain}=getRequestedOrientation(props);return`${baseSymbolName}_gate_${gate}_drain_${drain}`},Mosfet2=class extends NormalComponent{get config(){return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??getMosfetSchematicSymbolName(this.props),zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_mosfet",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceMosfet(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),mosfet=new Mosfet2({name:sourceElm.name,channelType:sourceElm.channel_type,mosfetMode:sourceElm.mosfet_mode,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,displayName:sourceElm.display_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:mosfet});footprint&&mosfet.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(mosfet):subcircuit.add(mosfet)}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:db22}=root,pcb_port3=db22.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 NormalComponent{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=zh[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p23=>p23.labels.includes("1")),symPort2=symbol.ports.find(p23=>p23.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(port=>port.props.pinNumber===1);pin1Port.schematicSymbolPortDef=symPort1;let firstTerminalPorts=new Set(pin1Port._getPortsInternallyConnectedToThisPort()),secondTerminalPort=ports.filter(port=>port!==pin1Port&&!firstTerminalPorts.has(port)).sort((a22,b22)=>(a22.props.pinNumber??0)-(b22.props.pinNumber??0))[0];secondTerminalPort&&(secondTerminalPort.schematicSymbolPortDef=symPort2)}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),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 Resistor2=class extends NormalComponent{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){let baseSymbolName=this.props.symbolName??"boxresistor",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&(baseSymbolName==="boxresistor"||baseSymbolName==="resistor")?`${baseSymbolName}_${compactSize}`:void 0;return{componentName:"Resistor",schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,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 Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),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 Resistor2({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 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 NormalComponent{_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:db22}=this.root,props=this._parsedProps??{},source_component=db22.source_component.insert({ftype:"simple_switch",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,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:db22}=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),db22.simulation_switch.insert(simulationSwitch)}},getImportedSwitchProps=(sourceElm,inflatorContext)=>{let sourcePorts=inflatorContext.injectionDb.source_port.list().filter(port=>port.source_component_id===sourceElm.source_component_id),pinLabels={},highestPinNumber=0;for(let sourcePort of sourcePorts){let pinNumber=sourcePort.pin_number;if(pinNumber==null)continue;highestPinNumber=Math.max(highestPinNumber,pinNumber);let labels=Array.from(new Set([sourcePort.name,...sourcePort.port_hints??[]].filter(label=>typeof label=="string"&&label.length>0)));labels.length>0&&(pinLabels[`pin${pinNumber}`]=labels)}let type="spst";return highestPinNumber>=5?type="dpdt":highestPinNumber===4?type="dpst":highestPinNumber===3&&(type="spdt"),{type,pinLabels:Object.keys(pinLabels).length>0?pinLabels:void 0}};function inflateSourceSwitch(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),importedSwitchProps=getImportedSwitchProps(sourceElm,inflatorContext),switchComponent=new Switch({name:sourceElm.name,displayName:sourceElm.display_name,...importedSwitchProps,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:switchComponent});footprint&&switchComponent.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(switchComponent):subcircuit.add(switchComponent)}function pcbTraceRouteToPcbPath(route2){if(route2.length<=2)return[];let firstPoint=route2[0],lastPoint=route2[route2.length-1];return route2.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&&currentGroupId!==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 selector2;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector2=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector2=`.${sourcePort.name}`;selector2&&connectedSelectors.push(selector2)}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 pcbTraces=injectionDb.pcb_trace.list().filter(trace2=>trace2.source_trace_id===sourceTrace.source_trace_id),pcbTrace=pcbTraces[0],pcbPath3;pcbTrace&&(pcbPath3=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt22=>pt22.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps22={path:connectedSelectors};traceWidth!==void 0&&(traceProps22.thickness=traceWidth),pcbPath3&&pcbPath3.length>0?traceProps22.pcbPath=pcbPath3:!pcbTrace&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps22.pcbStraightLine=!0);let trace=new Trace(traceProps22);trace._inflatedPcbTraces=pcbTraces.length>0?pcbTraces:void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>pcbTraces.some(trace2=>via.pcb_trace_id===trace2.pcb_trace_id)):void 0,subcircuit.add(trace)}var SHORT_ALIASES={collector:["c"],base:["b"],emitter:["e"]},Transistor=class extends NormalComponent{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 additionalAliases={},symbol=this.getSchematicSymbol();for(let symPort of symbol?.ports??[]){let pinNumber=getPinNumberFromLabels(symPort.labels);if(pinNumber)for(let label of symPort.labels){let shortAliases=SHORT_ALIASES[label];shortAliases&&(additionalAliases[`pin${pinNumber}`]=shortAliases)}}super.initPorts({pinCount:3,additionalAliases})}get collector(){return this.portMap.collector}get base(){return this.portMap.base}get emitter(){return this.portMap.emitter}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_transistor",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,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","pcb_hole","pcb_plated_hole","pcb_cutout","pcb_soldermask_opening","pcb_solder_paste"],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 elm.type==="pcb_cutout"?!0:elm.type==="pcb_solder_paste"?elm.pcb_component_id===void 0&&!elm.pcb_smtpad_id:elm.type==="pcb_soldermask_opening"?elm.pcb_component_id===void 0:"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(g23=>!g23.parent_source_group_id||renderedGroupIds.has(g23.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g23=>g23.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_fiducial":inflateSourceFiducial(sourceComponent,inflationCtx);break;case"simple_led":inflateSourceLed(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_connector":inflateSourceConnector(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_mosfet":inflateSourceMosfet(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;case"simple_switch":inflateSourceSwitch(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)},resolveBoardMotorMount=board=>{if(boardMountsToPrintedPart(board)){resolvePrintedPartMounts(board);return}let{mountedTo,mountRotation,mountRotationAnchor,mountOrientation}=board._parsedProps;if(!mountedTo){if(mountRotation||mountRotationAnchor||mountOrientation)throw new Error(`board "${board.name}" mounting alignment requires mountedTo`);return}let separator=mountedTo.lastIndexOf("."),motorName=mountedTo.slice(0,separator),face=mountedTo.slice(separator+1);if(separator<1||face!=="backface")throw new Error(`board "${board.name}" mountedTo "${mountedTo}" must name a motor backface, e.g. "NEMA17.backface"`);let motors=getComponentsInAssemblyScope(board).filter(motor2=>motor2.componentName==="AssemblyMotor"&&matchesAssemblyIdentity(motor2,motorName));if(motors.length!==1)throw new Error(`board "${board.name}" mountedTo "${mountedTo}" matched ${motors.length} motors; expected exactly one in the assembly device`);let motor=motors[0];if(motor._parsedProps.mountedTo){resolvePrintedPartMounts(board);return}let direction3=motor._parsedProps.shaftFacingDirection;if(direction3!=="z+"&&direction3!=="z-")throw new Error(`board "${board.name}" cannot mount to motor "${motorName}" facing ${direction3}: rotated PCB boards are not yet supported; use shaftFacingDirection="z+" or "z-"`);if(mountRotationAnchor&&!mountRotation)throw new Error(`board "${board.name}" mountRotationAnchor requires mountRotation`);if(motor.props.shaftFacingDirection&&mountOrientation&&mountOrientation!==(direction3==="z+"?"top_layer_toward_mount_face":"bottom_layer_toward_mount_face"))throw new Error(`board "${board.name}" mountOrientation "${mountOrientation}" conflicts with motor "${motorName}" shaftFacingDirection "${direction3}"`);return motor},resolveMotorMountedBoard=motor=>{let boards=getComponentsInAssemblyScope(motor).filter(board=>board.componentName==="Board").filter(board=>resolveBoardMotorMount(board)===motor);if(boards.length>1)throw new Error(`assembly.motor "${motor.name}" has multiple mounted boards; only one board may determine its placement`);return boards[0]};function createCircuitJsonDatabase(){if(typeof cju_indexed_default!="function")return cju_default([]);let indexed=cju_indexed_default([],{indexConfig:{byId:!0,byType:!0}});return typeof indexed.insert!="function"||typeof indexed.insertAll!="function"||typeof indexed.subtree!="function"?cju_default([]):indexed}var 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,"_featurePcbViaStitching",!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,"_hasUnrenderedUpdatesFromAsyncEffects",!1);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_hasRenderLifecycleListeners",!1);__publicField(this,"_eventListeners",{});this.children=[],this.db=createCircuitJsonDatabase(),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_react10.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 findBoard=components=>{for(let child of components){if(child.componentName==="Board")return child;if(isAssemblyDeviceContainer(child)){let nested=findBoard(child.children);if(nested)return nested}}};return findBoard(this.children)}_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||isAssemblyDeviceContainer(this.children[0]))){this.firstChild=this.children[0];return}let group2=new Group5({subcircuit:!0});group2.parent=this,group2.addAll(this.children),this.children=[group2],this.firstChild=group2}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db22}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasUnrenderedUpdatesFromAsyncEffects=!1,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.isDoneRendering();)await new Promise(resolve7=>{let resume=()=>{clearTimeout(timer),this.removeListener("asyncEffect:end",resume),resolve7()},timer=setTimeout(resume,100);this.on("asyncEffect:end",resume),this._hasUnrenderedUpdatesFromAsyncEffects&&resume()}),(this._hasUnrenderedUpdatesFromAsyncEffects||this._asyncEffectPhaseById.size===0)&&this.render();this.emit("renderComplete")}isDoneRendering(){return this._hasRenderedAtleastOnce&&!this._hasIncompleteAsyncEffects()}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0||this._hasUnrenderedUpdatesFromAsyncEffects?!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_dist9(),dist_exports4)).catch(e211=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
953
953
 
954
954
  "${e211.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(selector2){return this._guessRootComponent(),this.firstChild?.selectAll(selector2)??[]}selectOne(selector2,opts){return this._guessRootComponent(),this.firstChild?.selectOne(selector2,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)}hasEventListener(event){return(this._eventListeners[event]?.length??0)>0}on(event,listener){this._eventListeners[event]||(this._eventListeners[event]=[]),this._eventListeners[event].push(listener),event.startsWith("renderable:renderLifecycle:")&&(this._hasRenderLifecycleListeners=!0)}removeListener(event,listener){this._eventListeners[event]&&(this._eventListeners[event]=this._eventListeners[event].filter(l22=>l22!==listener),event.startsWith("renderable:renderLifecycle:")&&(this._hasRenderLifecycleListeners=Object.entries(this._eventListeners).some(([eventName,listeners])=>eventName.startsWith("renderable:renderLifecycle:")&&listeners.length>0)))}enableDebug(debug132){typeof debug132=="string"?import_debug21.default.enable(debug132):(debug132===null||debug132===!1)&&import_debug21.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),this._hasUnrenderedUpdatesFromAsyncEffects=!0}};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((resolve7,reject)=>{resolveRender=resolve7,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(v23=>safeSerialize(v23,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k22=>`${k22}:${safeSerialize(value[k22],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(str10){let hash=2166136261;for(let i23=0;i23<str10.length;i23++)hash^=str10.charCodeAt(i23),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 Board_updatePcbDesignRuleChecks=board=>{let{db:db22}=board.root,routingDisabled=board.root?.pcbRoutingDisabled||board.getInheritedProperty("routingDisabled"),pcbDisabled=board.root?.pcbDisabled,schematicDisabled=board.root?.schematicDisabled,drcChecksDisabled=board.root?.platform?.drcChecksDisabled??board.getInheritedProperty("drcChecksDisabled");if(drcChecksDisabled){board._drcChecksComplete=!0;return}let netlistDrcChecksDisabled=board.root?.platform?.netlistDrcChecksDisabled??board.getInheritedProperty("netlistDrcChecksDisabled"),placementDrcChecksDisabled=board.root?.platform?.placementDrcChecksDisabled??board.getInheritedProperty("placementDrcChecksDisabled"),routingDrcChecksDisabled=board.root?.platform?.routingDrcChecksDisabled??board.getInheritedProperty("routingDrcChecksDisabled"),shouldRunNetlistChecks=!drcChecksDisabled&&!netlistDrcChecksDisabled,shouldRunSchematicChecks=!drcChecksDisabled&&!schematicDisabled,shouldRunPlacementChecks=!drcChecksDisabled&&!pcbDisabled&&!placementDrcChecksDisabled,shouldRunRoutingChecks=!drcChecksDisabled&&!pcbDisabled&&!routingDisabled&&!routingDrcChecksDisabled,fabricatorEngine4=board.root?.platform?.fabricatorEngine,fabricatorPreset=board._parsedProps.fabricatorPreset,shouldRunFabricatorChecks=!drcChecksDisabled&&!pcbDisabled&&!!fabricatorEngine4&&!!fabricatorPreset;if((shouldRunRoutingChecks||shouldRunFabricatorChecks)&&board._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender"))return;let hasTracesToRoute=board._hasTracesToRoute();if((shouldRunRoutingChecks||shouldRunFabricatorChecks)&&hasTracesToRoute&&!board._areChildSubcircuitsRouted()||board._drcChecksComplete||board._drcChecksInProgress)return;let runDrcChecks2=async circuitJson=>{let checksToRun=[],queueCheck=(checkName,check)=>{checksToRun.push(Promise.resolve().then(check).catch(error2=>{let cause=error2 instanceof Error?error2.message:String(error2);return db22.source_runtime_error.insert({error_type:"source_runtime_error",phase_name:"PcbDesignRuleChecks",message:`DRC could not complete (${checkName}): ${cause}`}),[]}))},pcbBoardId=board.pcb_board_id;if(shouldRunFabricatorChecks&&fabricatorEngine4&&fabricatorPreset&&pcbBoardId&&queueCheck("fabricator",()=>fabricatorEngine4.runDrcChecks({circuitJson,fabricatorPreset,pcbBoardId})),shouldRunRoutingChecks&&queueCheck("routing",()=>runAllRoutingChecks(circuitJson).then(results=>results.filter(result=>!board._isExpectedCastellatedHoleDrcError(result)))),shouldRunPlacementChecks){let existingPlacementDiagnostics=db22.toArray();queueCheck("placement",()=>runAllPlacementChecks(circuitJson,{consolidateOverlaps:!1}).then(results=>consolidatePcbOverlapErrors(circuitJson,results.filter(result=>!board._isExpectedCastellatedHoleDrcError(result))).filter(result=>!existingPlacementDiagnostics.some(existing=>existing.type===result.type&&"message"in existing&&existing.message===result.message))))}if(shouldRunNetlistChecks&&queueCheck("netlist",()=>runAllNetlistChecks(circuitJson)),shouldRunSchematicChecks&&queueCheck("schematic",()=>runAllSchematicChecks(circuitJson)),!drcChecksDisabled)for(let drcCheck of board.selectAll("drccheck"))queueCheck(drcCheck.getString(),()=>drcCheck.runCustomDrcCheck(circuitJson));let checkResults=await Promise.all(checksToRun);db22.insertAll(consolidatePcbOverlapErrors(circuitJson,dedupePcbDrcErrors(checkResults.flat())))},subcircuitCircuitJson=db22.subtree({subcircuit_id:board.subcircuit_id}).toArray();board._drcChecksInProgress=!0,board._queueAsyncEffect("board:drc-checks",async()=>{try{await runDrcChecks2(subcircuitCircuitJson),board._drcChecksComplete=!0}finally{board._drcChecksInProgress=!1}})},GEOMETRY_SCALE=1e6,CONTACT_TOLERANCE=1e-7*GEOMETRY_SCALE,getRouteEndpoint=(routePoint3,side)=>routePoint3.route_type==="wire"?{point:routePoint3,layer:routePoint3.layer}:routePoint3.route_type==="via"?{point:routePoint3,layer:side==="start"?routePoint3.from_layer:routePoint3.to_layer}:{point:routePoint3[side],layer:side==="start"?routePoint3.start_layer:routePoint3.end_layer},findFloatingCopper=(circuitJson,generatedStitchingViaIds=new Set)=>{let connectivity=getFullConnectivityMapFromCircuitJson(circuitJson),pours=circuitJson.filter(e211=>e211.type==="pcb_copper_pour"),pouredNets=new Set(pours.flatMap(pour=>pour.source_net_id?[connectivity.getNetConnectedToId(pour.source_net_id)??pour.source_net_id]:[])),conductors=[],add10=conductor=>{pouredNets.has(conductor.netId)&&!conductor.polygon.isEmpty()&&conductors.push({...conductor,polygon:conductor.polygon.scale(GEOMETRY_SCALE,GEOMETRY_SCALE)})},components=new Map(circuitJson.filter(e211=>e211.type==="pcb_component").map(e211=>[e211.pcb_component_id,e211])),vias=circuitJson.filter(e211=>e211.type==="pcb_via"),board=circuitJson.find(e211=>e211.type==="pcb_board");for(let pour of pours)pour.source_net_id&&add10({polygon:getPourPolygon(pour),layers:[pour.layer],netId:connectivity.getNetConnectedToId(pour.source_net_id)??pour.source_net_id,isTerminal:!1,pourId:pour.pcb_copper_pour_id});for(let element of circuitJson)if(element.type==="pcb_smtpad"){let netId=connectivity.getNetConnectedToId(element.pcb_smtpad_id);netId&&pouredNets.has(netId)&&add10({polygon:getSmtPadPolygon(element),layers:[element.layer],netId,isTerminal:!!element.pcb_port_id})}else if(element.type==="pcb_plated_hole"){let netId=connectivity.getNetConnectedToId(element.pcb_plated_hole_id);netId&&pouredNets.has(netId)&&add10({polygon:getPlatedHolePolygon(element,element.pcb_component_id?components.get(element.pcb_component_id)?.rotation:0),layers:element.layers,netId,isTerminal:!!element.pcb_port_id})}else if(element.type==="pcb_via"){let netId=connectivity.getNetConnectedToId(element.pcb_via_id);netId&&pouredNets.has(netId)&&add10({polygon:getViaPolygon(element,element.outer_diameter,element.hole_diameter),layers:element.layers,netId,isTerminal:!generatedStitchingViaIds.has(element.pcb_via_id),viaId:element.pcb_via_id})}else if(element.type==="pcb_trace"){let netId=connectivity.getNetConnectedToId(element.pcb_trace_id);if(!netId||!pouredNets.has(netId))continue;for(let i23=0;i23<element.route.length;i23++){let routePoint3=element.route[i23];if(routePoint3.route_type==="via"){let actualVia=vias.find(via=>via.x===routePoint3.x&&via.y===routePoint3.y&&via.layers.includes(routePoint3.from_layer)&&via.layers.includes(routePoint3.to_layer));add10({polygon:getViaPolygon(routePoint3,actualVia?.outer_diameter??routePoint3.outer_diameter??board?.min_via_pad_diameter??.3,actualVia?.hole_diameter??routePoint3.hole_diameter??board?.min_via_hole_diameter??.2),layers:actualVia?.layers??getViaSpanLayers({fromLayer:routePoint3.from_layer,toLayer:routePoint3.to_layer,layerCount:board?.num_layers??2}),netId,isTerminal:!1})}let next2=element.route[i23+1];if(!next2)continue;let start=getRouteEndpoint(routePoint3,"end"),end=getRouteEndpoint(next2,"start");if(start.layer!==end.layer)continue;let startWidth=routePoint3.route_type==="via"?next2.route_type==="via"?void 0:next2.width:routePoint3.width;if(startWidth===void 0)continue;let endWidth=element.route_thickness_mode==="interpolated"&&next2.route_type!=="via"?next2.width:startWidth;add10({polygon:getTraceSegmentPolygon(start.point,end.point,startWidth,endWidth),layers:[start.layer],netId,isTerminal:!1})}}let floatingPourIds=new Set,floatingViaIds=new Set;if(conductors.length===0)return{floatingPourIds,floatingViaIds};let parent=conductors.map((_23,i23)=>i23),find2=i23=>{for(;parent[i23]!==i23;)parent[i23]=parent[parent[i23]],i23=parent[i23];return i23},bounds=conductors.map(conductor=>conductor.polygon.box),spatialIndex=new Flatbush(conductors.length);for(let box2 of bounds)spatialIndex.add(box2.xmin,box2.ymin,box2.xmax,box2.ymax);spatialIndex.finish();for(let[i23,conductor]of conductors.entries()){let box2=bounds[i23];for(let j22 of spatialIndex.search(box2.xmin-CONTACT_TOLERANCE,box2.ymin-CONTACT_TOLERANCE,box2.xmax+CONTACT_TOLERANCE,box2.ymax+CONTACT_TOLERANCE)){if(j22<=i23||find2(i23)===find2(j22))continue;let neighbor=conductors[j22];conductor.netId!==neighbor.netId||!conductor.layers.some(layer=>neighbor.layers.includes(layer))||copperPolygonsTouch(conductor.polygon,neighbor.polygon,CONTACT_TOLERANCE)&&(parent[find2(j22)]=find2(i23))}}let netsWithTerminals=new Set(conductors.flatMap(conductor=>conductor.isTerminal?[conductor.netId]:[])),terminalRoots=new Set(conductors.flatMap((conductor,i23)=>conductor.isTerminal?[find2(i23)]:[]));for(let[i23,conductor]of conductors.entries())!netsWithTerminals.has(conductor.netId)||terminalRoots.has(find2(i23))||(conductor.pourId&&floatingPourIds.add(conductor.pourId),conductor.viaId&&floatingViaIds.add(conductor.viaId));return{floatingPourIds,floatingViaIds}},Board_doInitialPcbCopperPourCleanup=board=>{if(!board.root||board.root.pcbDisabled)return;let{db:db22}=board.root;if(db22.pcb_copper_pour.list().length===0)return;let circuitJson=db22.subtree({subcircuit_id:board.subcircuit_id}).toArray();if(db22.pcb_autorouting_error.list().length>0||!circuitJson.some(element=>element.type==="pcb_copper_pour"))return;let{floatingPourIds,floatingViaIds}=findFloatingCopper(circuitJson,board._generatedStitchingViaIds);for(let pourId of floatingPourIds)db22.pcb_copper_pour.delete(pourId);for(let viaId of floatingViaIds)board._generatedStitchingViaIds.has(viaId)&&db22.pcb_via.delete(viaId);for(let trace of db22.pcb_trace.list())trace.route.some(point62=>"copper_pour_id"in point62&&point62.copper_pour_id&&floatingPourIds.has(point62.copper_pour_id))&&db22.pcb_trace.update(trace.pcb_trace_id,{route:trace.route.map(point62=>{if(!("copper_pour_id"in point62)||!point62.copper_pour_id||!floatingPourIds.has(point62.copper_pour_id))return point62;let{copper_pour_id,is_inside_copper_pour,...wireOrVia}=point62;return wireOrVia})})},resetPcbTraceRenderInSubtree=renderable=>{renderable._pcbTraceRenderWaitingForPlacementChecks&&(renderable.renderPhaseStates.PcbTraceRender.initialized=!1,renderable.renderPhaseStates.PcbTraceRender.dirty=!1,renderable._pcbTraceRenderWaitingForPlacementChecks=!1);for(let child of renderable.children)resetPcbTraceRenderInSubtree(child)},Board_doInitialPcbPlacementDesignRuleChecks=board=>{if(board.root?.pcbDisabled)return;let placementDrcChecksDisabled=board.root?.platform?.placementDrcChecksDisabled??board.getInheritedProperty("placementDrcChecksDisabled"),drcChecksDisabled=board.root?.platform?.drcChecksDisabled??board.getInheritedProperty("drcChecksDisabled");if(board._pcbPlacementDrcErrorCount=null,board._pcbPlacementDrcCheckError=null,board._pcbPlacementDrcChecksPending=!1,placementDrcChecksDisabled||drcChecksDisabled){board._pcbPlacementDrcErrorCount=0;return}let{db:db22}=board.root,subcircuitCircuitJson=db22.subtree({subcircuit_id:board.subcircuit_id}).toArray(),existingPlacementDiagnostics=db22.toArray();board._pcbPlacementDrcChecksPending=!0,board._queueAsyncEffect("board:pre-route-placement-checks",async()=>{try{let placementCheckResults=await runAllPlacementChecks(subcircuitCircuitJson,{consolidateOverlaps:!1}),relevantPlacementCheckResults=consolidatePcbOverlapErrors(subcircuitCircuitJson,placementCheckResults.filter(result=>!board._isExpectedCastellatedHoleDrcError(result))),newPlacementDiagnostics=relevantPlacementCheckResults.filter(result=>!existingPlacementDiagnostics.some(existing=>existing.type===result.type&&"message"in existing&&existing.message===result.message));db22.insertAll(newPlacementDiagnostics),board._pcbPlacementDrcErrorCount=relevantPlacementCheckResults.filter(result=>result.type.endsWith("_error")).length}catch(error2){board._pcbPlacementDrcCheckError=error2 instanceof Error?error2.message:String(error2)}finally{board._pcbPlacementDrcChecksPending=!1,resetPcbTraceRenderInSubtree(board)}})},CASTELLATED_HOLE_ENDPOINT_TOLERANCE_MM=1e-6,getConnectionTargets2=connectsTo=>connectsTo?Array.isArray(connectsTo)?connectsTo:[connectsTo]:[],BoardCastellatedHole=class _BoardCastellatedHole extends PlatedHole{constructor(outlinePoint,outlinePointIndex){let name=`castellated_hole_${outlinePointIndex+1}`,connectionTargets=getConnectionTargets2(outlinePoint.connectsTo),holeDiameter=distance.parse(outlinePoint.holeDiameter),padDiameter=distance.parse(outlinePoint.padDiameter);super({shape:"circle",holeDiameter,outerDiameter:padDiameter,portHints:[name]});__publicField(this,"outlinePointIndex");__publicField(this,"holeDiameter");__publicField(this,"padDiameter");__publicField(this,"port");__publicField(this,"trace");this.outlinePointIndex=outlinePointIndex,this.holeDiameter=holeDiameter,this.padDiameter=padDiameter,this.port=connectionTargets.length>0?new Port({name}):null,this.trace=this.port?new Trace({path:[`port.${name}`,...connectionTargets],displayName:`Castellated hole ${outlinePointIndex+1} connectivity`}):null}static fromBoardOutline(outline){return(outline??[]).flatMap((outlinePoint,outlinePointIndex)=>outlinePoint.isCastellatedHole?[new _BoardCastellatedHole(outlinePoint,outlinePointIndex)]:[])}_getParentBoard(){if(this.parent?.componentName!=="Board")throw new Error("A board castellated hole must be a direct board child");return this.parent}_getPositionFromBoardOutline(){let board=this._getParentBoard(),outlinePoint=(board.pcb_board_id?board.root?.db.pcb_board.get(board.pcb_board_id):null)?.outline?.[this.outlinePointIndex];if(!outlinePoint)throw new Error(`Missing emitted board outline point ${this.outlinePointIndex}`);return outlinePoint}_getGlobalPcbPositionBeforeLayout(){return this._getPositionFromBoardOutline()}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,position4=this._getPositionFromBoardOutline(),pcbPlatedHole=db22.pcb_plated_hole.insert({shape:"circle",outer_diameter:this.padDiameter,hole_diameter:this.holeDiameter,...position4,layers:this.getAvailablePcbLayers(),port_hints:this.getNameAndAliases(),subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0});this.pcb_plated_hole_id=pcbPlatedHole.pcb_plated_hole_id}syncPositionToBoardOutline(){this.pcb_plated_hole_id&&this._setPositionFromLayout(this._getPositionFromBoardOutline())}removePcbPrimitiveRender(){let{db:db22}=this.root;this.pcb_plated_hole_id&&(db22.pcb_plated_hole.delete(this.pcb_plated_hole_id),this.pcb_plated_hole_id=null),this.matchedPort?.pcb_port_id&&(db22.pcb_port.delete(this.matchedPort.pcb_port_id),this.matchedPort.pcb_port_id=null)}isExpectedBoardEdgeDrcError(result){if(!this.pcb_plated_hole_id)return!1;if(result.type==="pcb_placement_error")return result.pcb_placement_error_id===`copper_too_close_to_board_edge_${this.pcb_plated_hole_id}`;if(result.type!=="pcb_trace_error"||!result.pcb_trace_error_id.startsWith("trace_too_close_to_board_"))return!1;let segmentIndexMatch=result.pcb_trace_error_id.match(/_segment_(\d+)$/);if(!segmentIndexMatch)return!1;let pcbTrace=this.root?.db.pcb_trace.get(result.pcb_trace_id),segmentIndex=Number(segmentIndexMatch[1]),segmentEndpoints=[pcbTrace?.route[segmentIndex],pcbTrace?.route[segmentIndex+1]].flatMap(routePoint3=>routePoint3&&"x"in routePoint3&&"y"in routePoint3?[{x:routePoint3.x,y:routePoint3.y}]:[]),platedHole2=this.root?.db.pcb_plated_hole.get(this.pcb_plated_hole_id);return platedHole2?segmentEndpoints.some(endpoint=>Math.hypot(endpoint.x-platedHole2.x,endpoint.y-platedHole2.y)<=CASTELLATED_HOLE_ENDPOINT_TOLERANCE_MM):!1}},MIN_EFFECTIVE_BORDER_RADIUS_MM=.01,DEFAULT_VIA_PAD_DIAMETER_OVER_HOLE_DIAMETER_MM=.15,getRoundedRectOutline=(width,height,radius)=>{let w23=width/2,h23=height/2,r23=Math.min(radius,w23,h23);if(r23<MIN_EFFECTIVE_BORDER_RADIUS_MM)return[{x:-w23,y:-h23},{x:w23,y:-h23},{x:w23,y:h23},{x:-w23,y:h23}];let segments=Math.max(1,Math.ceil(Math.PI/2*r23/.1)),step=Math.PI/2/segments,outline=[];outline.push({x:-w23+r23,y:-h23}),outline.push({x:w23-r23,y:-h23});for(let i23=1;i23<=segments;i23++){let theta=-Math.PI/2+i23*step;outline.push({x:w23-r23+r23*Math.cos(theta),y:-h23+r23+r23*Math.sin(theta)})}outline.push({x:w23,y:h23-r23});for(let i23=1;i23<=segments;i23++){let theta=0+i23*step;outline.push({x:w23-r23+r23*Math.cos(theta),y:h23-r23+r23*Math.sin(theta)})}outline.push({x:-w23+r23,y:h23});for(let i23=1;i23<=segments;i23++){let theta=Math.PI/2+i23*step;outline.push({x:-w23+r23+r23*Math.cos(theta),y:h23-r23+r23*Math.sin(theta)})}outline.push({x:-w23,y:-h23+r23});for(let i23=1;i23<=segments;i23++){let theta=Math.PI+i23*step;outline.push({x:-w23+r23+r23*Math.cos(theta),y:-h23+r23+r23*Math.sin(theta)})}return outline},Board=class extends Group5{constructor(props){super(props);__publicField(this,"pcbFold");__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);__publicField(this,"_castellatedHoles");__publicField(this,"_generatedStitchingViaIds",new Set);this._castellatedHoles=BoardCastellatedHole.fromBoardOutline(this._parsedProps.outline);for(let castellatedHole of this._castellatedHoles)castellatedHole.port&&this.add(castellatedHole.port),this.add(castellatedHole),castellatedHole.trace&&this.add(castellatedHole.trace)}doInitialCadModelRender(){this.root?.pcbDisabled||(resolveBoardMotorMount(this),super.doInitialCadModelRender())}doInitialPcbFlexRender(){if(!this.pcb_board_id)return;let bends=this.root.db.pcb_bend.list().filter(bend=>bend.pcb_board_id===this.pcb_board_id);if(this.pcbFold=void 0,!bends.length)return;let pcbBoard=this.root.db.pcb_board.get(this.pcb_board_id),foldResult=tryCreatePcbFold(bends,this.boardThickness,{outline:pcbBoard.outline?.map(point62=>({x:point62.x-pcbBoard.center.x,y:point62.y-pcbBoard.center.y}))});foldResult.ok?this.pcbFold=foldResult.value:this.root.db.pcb_placement_error.insert({error_type:"pcb_placement_error",subcircuit_id:this.subcircuit_id??void 0,message:`Unable to fold PCB board ${this._parsedProps.name??"unnamed board"}; CAD remains flat: ${getReadablePcbFoldIssueMessage(foldResult.issue,bends)}`})}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(){return getBoardAvailableLayers(this._parsedProps.layers??2)}_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:db22}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcbBoard=db22.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=getDescendantSubcircuitIds2(db22,this.subcircuit_id),allowedSubcircuitIds=new Set([this.subcircuit_id,...descendantIds]),allPcbComponents=db22.pcb_component.list().filter(c23=>c23.subcircuit_id&&allowedSubcircuitIds.has(c23.subcircuit_id)),allPcbGroups=db22.pcb_group.list().filter(g23=>g23.subcircuit_id&&allowedSubcircuitIds.has(g23.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:x23,y:y23}=props.boardAnchorPosition;minX=Math.min(minX,x23),minY=Math.min(minY,y23),maxX=Math.max(maxX,x23),maxY=Math.max(maxY,y23)}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 update2={width:finalWidth,height:finalHeight,center:center2};outline&&(update2.outline=outline.map(point62=>({x:point62.x+(props.outlineOffsetX??0),y:point62.y+(props.outlineOffsetY??0)}))),db22.pcb_board.update(this.pcb_board_id,update2)}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 text2=boardInformation.join(`
955
955
  `),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:text2,ccw_rotation:0,anchor_alignment:"bottom_right",anchor_position:position4})}doInitialSourceRender(){let nestedBoard=this.getDescendants().find(d23=>d23.lowercaseComponentName==="board");if(nestedBoard)throw new Error(`Nested boards are not supported: found board "${nestedBoard.name}" inside board "${this.name}"`);super.doInitialSourceRender();let{db:db22}=this.root,source_board3=db22.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:db22}=this.root,{_parsedProps:props}=this,pcbBoardFromCircuitJson=props.circuitJson?.find(elm=>elm.type==="pcb_board"),viaTenting=getViaTenting(props.defaultViaTenting),rawProps=this.props,resolvedIsViaInPadAllowed=rawProps.isViaInPadAllowed??pcbBoardFromCircuitJson?.is_via_in_pad_allowed,resolvedAllowBlindAndBuriedVias=rawProps.allowBlindAndBuriedVias??pcbBoardFromCircuitJson?.allow_blind_and_buried_vias,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,pcbStyle3=this.getInheritedMergedProperty("pcbStyle"),styledViaDimensions=getViaDiameterDefaults(pcbStyle3),configuredViaHoleDiameter=subcircuitProps2.minViaHoleDiameter??(pcbStyle3?.viaHoleDiameter!==void 0?styledViaDimensions.holeDiameter:void 0),resolvedMinViaHoleDiameter=configuredViaHoleDiameter??jlcMinTolerances2.min_via_hole_diameter,resolvedMinViaPadDiameter=subcircuitProps2.minViaPadDiameter??(pcbStyle3?.viaPadDiameter!==void 0?styledViaDimensions.padDiameter:configuredViaHoleDiameter!==void 0?configuredViaHoleDiameter+DEFAULT_VIA_PAD_DIAMETER_OVER_HOLE_DIAMETER_MM:jlcMinTolerances2.min_via_pad_diameter),pcb_board3=db22.pcb_board.insert({source_board_id:this.source_board_id,subcircuit_id:this.subcircuit_id??void 0,center:center2,default_via_tented_on_top:viaTenting.tented_on_top??pcbBoardFromCircuitJson?.default_via_tented_on_top,default_via_tented_on_bottom:viaTenting.tented_on_bottom??pcbBoardFromCircuitJson?.default_via_tented_on_bottom,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,...resolvedIsViaInPadAllowed!==void 0&&{is_via_in_pad_allowed:resolvedIsViaInPadAllowed},...resolvedAllowBlindAndBuriedVias!==void 0&&{allow_blind_and_buried_vias:resolvedAllowBlindAndBuriedVias},...props.solderMaskColor!==void 0&&{solder_mask_color:props.solderMaskColor},...props.silkscreenColor!==void 0&&{silkscreen_color:props.silkscreenColor},min_trace_width:subcircuitProps2.minTraceWidth??jlcMinTolerances2.min_trace_width,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,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_hole_edge_clearance:subcircuitProps2.minTraceToHoleEdgeClearance??jlcMinTolerances2.min_trace_to_hole_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:db22}=this.root;this.pcb_board_id&&(db22.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){super.doInitialPcbDesignRuleChecks(),this.updatePcbDesignRuleChecks()}doInitialPcbPlacementDesignRuleChecks(){Board_doInitialPcbPlacementDesignRuleChecks(this)}doInitialPcbCopperPourCleanup(){Board_doInitialPcbCopperPourCleanup(this)}updatePcbDesignRuleChecks(){Board_updatePcbDesignRuleChecks(this)}runRenderPhaseForChildren(phase){this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase}),super.runRenderPhaseForChildren(phase)}_repositionOnPcb(position4){let{db:db22}=this.root,pcbBoard=this.pcb_board_id?db22.pcb_board.get(this.pcb_board_id):null,oldPos=pcbBoard?.center;if(!oldPos){this.pcb_board_id&&db22.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&&(db22.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(p23=>({x:p23.x+outlineDeltaX,y:p23.y+outlineDeltaY}));db22.pcb_board.update(this.pcb_board_id,{outline:newOutline});for(let castellatedHole of this._castellatedHoles)castellatedHole.syncPositionToBoardOutline()}}}_isExpectedCastellatedHoleDrcError(result){return this._castellatedHoles.some(castellatedHole=>castellatedHole.isExpectedBoardEdgeDrcError(result))}},Subcircuit=class extends Group5{constructor(props){super({...props,subcircuit:!0})}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialCreateNetsFromProps(){super.doInitialCreateNetsFromProps(),this._createTracesForExposedConnections()}_createTracesForExposedConnections(){let exposedNets=this._getNetNamesToExpose();if(!exposedNets?.length)return;let parentSubcircuit=this.parent?.getSubcircuit?.();if(parentSubcircuit&&this.name)for(let exposedNetName of exposedNets){let netName=normalizeExposedNetName(exposedNetName),parentNetSelector=`> net.${netName}`,childNetSelector=`.${this.name} > net.${netName}`;if(parentSubcircuit.children.find(child=>child instanceof Net&&child._parsedProps.name===netName)||parentSubcircuit.add(new Net({name:netName})),parentSubcircuit.children.find(child=>{if(!(child instanceof Trace)||!child._exposesSubcircuitConnection)return!1;let childProps=child._parsedProps;return childProps.from===childNetSelector&&childProps.to===parentNetSelector}))continue;let trace=new Trace({from:childNetSelector,to:parentNetSelector,displayName:netName});trace._exposesSubcircuitConnection=!0,parentSubcircuit.add(trace)}}_getNetNamesToExpose(){let explicitExposedNets=this._parsedProps.exposedNets??[];if(!this._parsedProps.exposeNets)return explicitExposedNets;let childNetNames=this.selectAll("net").filter(net=>net instanceof Net&&net.getSubcircuit()===this).map(net=>net._parsedProps.name);return Array.from(new Set([...explicitExposedNets,...childNetNames]))}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)}},normalizeExposedNetName=netName=>netName.startsWith("net.")?netName.slice(4):netName,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:db22}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcb_board3=db22.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(p23=>point4(p23.x,p23.y))),is_ccw;if(outline.length>2){let p03=point4(outline[0].x,outline[0].y),p13=point4(outline[1].x,outline[1].y),segmentDir=vector$1(p03,p13).normalize(),normalToLeft=segmentDir.rotate(Math.PI/2),testPoint=p03.translate(segmentDir.multiply(segment(p03,p13).length/2)).translate(normalToLeft.multiply(.01));is_ccw=outlinePolygon.contains(testPoint)}else is_ccw=outlinePolygon.area()>0;for(let i23=0;i23<outline.length;i23++){let p1_=outline[i23],p2_=outline[(i23+1)%outline.length];if(!p1_||!p2_)continue;let p13=point4(p1_.x,p1_.y),p23=point4(p2_.x,p2_.y),segment2=segment(p13,p23),segmentLength=segment2.length;if(segmentLength<1e-6)continue;let segmentVec=vector$1(p13,p23),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 k22=0;k22<numBitesInGap;k22++){let biteDist=firstBiteDistFromP1+k22*holeAndSpacing,pos=p13.translate(segmentDir.multiply(biteDist));mouseBiteHoles.push({x:pos.x,y:pos.y})}}}let p_prev_=outline[(i23-1+outline.length)%outline.length],p_next_=outline[(i23+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),p13),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(p23,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 angle3=vec_in_p1.angleTo(segmentVec);angle3>Math.PI&&(angle3=2*Math.PI-angle3),start_ext=cutoutWidth*Math.tan(angle3/2)}else start_ext=0;if(is_p2_convex){let angle3=segmentVec.angleTo(vec_out_p2);angle3>Math.PI&&(angle3=2*Math.PI-angle3),end_ext=cutoutWidth*Math.tan(angle3/2)}else end_ext=0}let cutoutParts=effectiveGapLength<1e-6?[{start:0-start_ext,end:segmentLength+end_ext}]:[{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=p13.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(p23=>point4(p23.x,p23.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 w23=board.width/2,h23=board.height/2;return{...board,outline:[{x:board.center.x-w23,y:board.center.y-h23},{x:board.center.x+w23,y:board.center.y-h23},{x:board.center.x+w23,y:board.center.y+h23},{x:board.center.x-w23,y:board.center.y+h23}]}}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,index2)=>({...tab,pcb_cutout_id:`panel_tab_${index2}`})),mouseBiteDiameter=tabWidth*.45,mouseBiteHoles=allMouseBites.map((bite,index2)=>({type:"pcb_hole",pcb_hole_id:`panel_mouse_bite_${index2}`,hole_shape:"circle",hole_diameter:mouseBiteDiameter,x:bite.x,y:bite.y}));return{tabCutouts,mouseBiteHoles}}function generatePanelOutlineRoutingCutouts(boards,options){return boards.map(board=>{if((!board.outline||board.outline.length===0)&&board.width&&board.height){let halfWidth=board.width/2,halfHeight=board.height/2;return{...board,outline:[{x:board.center.x-halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y+halfHeight},{x:board.center.x-halfWidth,y:board.center.y+halfHeight}]}}return board}).flatMap(board=>{if(!board.outline||board.outline.length===0)return[];let{tabCutouts}=generateCutoutsAndMousebitesForOutline(board.outline,{gapLength:0,cutoutWidth:options.cutoutWidth,mouseBites:!1,mouseBiteHoleDiameter:0,mouseBiteHoleSpacing:0});return tabCutouts.map(cutout=>({...cutout,pcb_board_id:board.pcb_board_id}))}).map((cutout,outlineRoutingCutoutIndex)=>({...cutout,pcb_cutout_id:`panel_outline_routing_cutout_${outlineRoutingCutoutIndex}`}))}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:db22,row,col,cellWidth,cellHeight,boardGap,availablePanelWidth,availablePanelHeight}){let itemsWithDims=items.map(item=>{let dims=getItemDimensions(item,db22);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(b22=>b22.width),minCellWidth),maxItemHeight=Math.max(...itemsWithDims.map(b22=>b22.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,i23)=>{let colIdx=i23%cols,rowIdx=Math.floor(i23/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 i23=0;i23<colWidths.length;i23++)colWidths[i23]=Math.max(colWidths[i23],minCellWidth);for(let i23=0;i23<rowHeights.length;i23++)rowHeights[i23]=Math.max(rowHeights[i23],minCellHeight);let gridWidth=colWidths.reduce((a22,b22)=>a22+b22,0)+(cols>1?(cols-1)*boardGap:0),gridHeight=rowHeights.reduce((a22,b22)=>a22+b22,0)+(rows>1?(rows-1)*boardGap:0),startX=-gridWidth/2,startY=-gridHeight/2,colXOffsets=[startX];for(let i23=1;i23<cols;i23++)colXOffsets.push(colXOffsets[i23-1]+colWidths[i23-1]+boardGap);let rowYOffsets=[startY];for(let i23=1;i23<rows;i23++)rowYOffsets.push(rowYOffsets[i23-1]+rowHeights[i23-1]+boardGap);let positions=[];return itemsWithDims.forEach((itemWithDims,i23)=>{let colIdx=i23%cols,rowIdx=Math.floor(i23/cols);if(rowIdx>=rowYOffsets.length||colIdx>=colXOffsets.length)return;let x23=colXOffsets[colIdx]+colWidths[colIdx]/2,y23=rowYOffsets[rowIdx]+rowHeights[rowIdx]/2;positions.push({item:itemWithDims.item,pos:{x:x23,y:y23}})}),{positions,gridWidth,gridHeight}}function getItemDimensions(item,db22){if(item.componentName==="Board"){let board=item;if(db22&&board.pcb_board_id){let pcbBoard=db22.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 offset2=board._panelPositionOffset??{x:0,y:0};minX=Math.min(minX,offset2.x-dims.width/2),maxX=Math.max(maxX,offset2.x+dims.width/2),minY=Math.min(minY,offset2.y-dims.height/2),maxY=Math.max(maxY,offset2.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,"_panelizationFeaturesGenerated",!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(c23=>c23 instanceof Board)}doInitialPanelBoardLayout(){if(this.root?.pcbDisabled)return;let layoutMode=this._parsedProps.layoutMode??"none",gridItems=this.children.filter(c23=>c23 instanceof Board||c23 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(c23=>!c23._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:db22}=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;db22.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};db22.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=db22.pcb_board.get(board.pcb_board_id);if(!boardDb)continue;let relativeX=boardDb.center.x-panelGlobalPos.x,relativeY=boardDb.center.y-panelGlobalPos.y;db22.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${relativeX}mm`,display_offset_y:`${relativeY}mm`})}}this._generatePanelizationFeatures()}_updatePanelDimensions(){let{db:db22}=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)db22.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);db22.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})}}}_generatePanelizationFeatures(){if(this._panelizationFeaturesGenerated)return;let{db:db22}=this.root,props=this._parsedProps,panelizationMethod=props.panelizationMethod??"none",childBoardInstances=this._getAllBoardInstances();if(panelizationMethod!=="none"){let childBoardIds=childBoardInstances.map(c23=>c23.pcb_board_id).filter(id3=>!!id3),boardsInPanel=db22.pcb_board.list().filter(b22=>childBoardIds.includes(b22.pcb_board_id));if(boardsInPanel.length===0)return;let tabWidth=props.tabWidth??DEFAULT_TAB_WIDTH;if(panelizationMethod==="outline_routing"){let outlineRoutingCutouts=generatePanelOutlineRoutingCutouts(boardsInPanel,{cutoutWidth:tabWidth});for(let outlineRoutingCutout of outlineRoutingCutouts)db22.pcb_cutout.insert({...outlineRoutingCutout,pcb_group_id:this.pcb_group_id??void 0,pcb_panel_id:this.pcb_panel_id??void 0})}else{let 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)db22.pcb_cutout.insert(tabCutout);for(let mouseBiteHole of mouseBiteHoles)db22.pcb_hole.insert(mouseBiteHole)}}this._panelizationFeaturesGenerated=!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:db22}=this.root,props=this._parsedProps,inserted=db22.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:db22}=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)db22.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);db22.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:db22}=this.root,props=this._parsedProps,currentPanel=db22.pcb_panel.get(this.pcb_panel_id);db22.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)}},GENERATED_ANTENNA_KEEPOUT_CLEARANCE_MM=1,GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM=1,getGeneratedAntennaKeepouts=geometry=>{let xCoordinates=geometry.route.map(point62=>point62.x),yCoordinates=geometry.route.map(point62=>point62.y),edgeClearance=geometry.traceWidth/2+GENERATED_ANTENNA_KEEPOUT_CLEARANCE_MM,left=Math.min(...xCoordinates)-edgeClearance,right=Math.max(...xCoordinates)+edgeClearance,bottom=Math.min(...yCoordinates)-edgeClearance,top=Math.max(...yCoordinates)+edgeClearance,feedOpeningPoints=[geometry.feedPoint,...geometry.secondaryPort?[geometry.secondaryPort.point]:[]],openingLeft=Math.min(...feedOpeningPoints.map(point62=>point62.x))-GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,openingRight=Math.max(...feedOpeningPoints.map(point62=>point62.x))+GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,openingBottom=Math.min(...feedOpeningPoints.map(point62=>point62.y))-GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,openingTop=Math.max(...feedOpeningPoints.map(point62=>point62.y))+GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,rects=[],addRect=(rectLeft,rectRight,rectBottom,rectTop)=>{rectRight<=rectLeft||rectTop<=rectBottom||rects.push({center:{x:(rectLeft+rectRight)/2,y:(rectBottom+rectTop)/2},width:rectRight-rectLeft,height:rectTop-rectBottom})};return geometry.feedKeepoutOpeningDirection==="left"?(addRect(left,right,openingTop,top),addRect(left,right,bottom,openingBottom),addRect(openingRight,right,openingBottom,openingTop)):(addRect(left,openingLeft,bottom,openingTop),addRect(openingRight,right,bottom,openingTop),addRect(left,right,openingTop,top)),rects},getGeneratedAntennaGeometry=antennaShape3=>{switch(antennaShape3){case"2.4ghz_quarter_wave_monopole":return{traceWidth:.6,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"left",route:[{x:0,y:0},{x:31,y:0}]};case"2.4ghz_meandered_monopole":return{traceWidth:.5,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",route:[{x:0,y:0},{x:0,y:6},{x:3,y:6},{x:3,y:1.5},{x:6,y:1.5},{x:6,y:6},{x:9,y:6},{x:9,y:1.5},{x:12,y:1.5},{x:12,y:6},{x:15,y:6}]};case"2.4ghz_inverted_f":return{traceWidth:.8,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",secondaryPort:{point:{x:-4,y:0},role:"ground"},groundViaPoint:{x:-4,y:0},route:[{x:-4,y:0},{x:-4,y:3},{x:0,y:3},{x:0,y:0},{x:0,y:3},{x:-4,y:3},{x:-4,y:8},{x:22,y:8}]};case"2.4ghz_meandered_inverted_f":return{traceWidth:.5,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",secondaryPort:{point:{x:-1.7,y:0},role:"ground"},groundViaPoint:{x:-1.7,y:0},route:[{x:-1.7,y:0},{x:-1.7,y:4.9},{x:0,y:4.9},{x:0,y:0},{x:0,y:4.9},{x:-1.7,y:4.9},{x:2.3,y:4.9},{x:2.3,y:1.4},{x:5.3,y:1.4},{x:5.3,y:4.9},{x:8.3,y:4.9},{x:8.3,y:1.4},{x:11.3,y:1.4},{x:11.3,y:4.9},{x:13.3,y:4.9}]};case"2.4ghz_folded_dipole":return{traceWidth:.9,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",secondaryPort:{point:{x:1.2,y:0},role:"feed2"},route:[{x:0,y:0},{x:-22.4,y:0},{x:-22.4,y:9},{x:23.6,y:9},{x:23.6,y:0},{x:1.2,y:0}]}}},Antenna=class extends NormalComponent{get config(){return{componentName:"Antenna",zodProps:antennaProps,sourceFtype:FTYPE.simple_chip,shouldRenderAsSchematicBox:!0}}getRefDesPrefixes(){return["ANT"]}initPorts(){let{antennaShape:antennaShape3,pcbPath:pcbPath3}=this._parsedProps,secondaryPortRole=pcbPath3?void 0:antennaShape3==="2.4ghz_inverted_f"||antennaShape3==="2.4ghz_meandered_inverted_f"?"ground":antennaShape3==="2.4ghz_folded_dipole"?"feed2":void 0;super.initPorts({pinCount:secondaryPortRole?2:1,additionalAliases:{pin1:secondaryPortRole==="feed2"?["feed","feed1"]:["feed"],...secondaryPortRole==="ground"?{pin2:["ground","gnd"]}:secondaryPortRole==="feed2"?{pin2:["feed2"]}:{}}})}doInitialReactSubtreesRender(){super.doInitialReactSubtreesRender();let{antennaShape:antennaShape3,pcbPath:pcbPath3}=this._parsedProps;if(!antennaShape3)return;let hasFootprint=this.children.some(child=>child.componentName==="Footprint");if(pcbPath3&&hasFootprint)return;let geometry=pcbPath3?void 0:getGeneratedAntennaGeometry(antennaShape3),generatedFootprint=new Footprint({name:`${this.name}_generated_antenna`});if(hasFootprint||generatedFootprint.add(new SmtPad({shape:"rect",width:.8,height:.8,pcbX:geometry?.feedPoint.x??0,pcbY:geometry?.feedPoint.y??0,layer:"top",portHints:["pin1"],coveredWithSolderMask:!0})),geometry){let keepouts=getGeneratedAntennaKeepouts(geometry);for(let keepout of keepouts)generatedFootprint.add(new Keepout({shape:"rect",pcbX:keepout.center.x,pcbY:keepout.center.y,width:keepout.width,height:keepout.height,layers:[...this.root?._getBoard()?.allLayers??["top","bottom"]],excludeRefs:[this.getSubcircuitSelector()]}));let antennaTrace=new PcbTrace({route:geometry.route.map(point62=>({route_type:"wire",...point62,width:geometry.traceWidth,layer:"top"}))});antennaTrace.isAntennaTrace=!0,generatedFootprint.add(antennaTrace),geometry.secondaryPort&&!geometry.groundViaPoint&&!hasFootprint&&generatedFootprint.add(new SmtPad({shape:"rect",width:.8,height:.8,pcbX:geometry.secondaryPort.point.x,pcbY:geometry.secondaryPort.point.y,layer:"top",portHints:["pin2"],coveredWithSolderMask:!0})),geometry.groundViaPoint&&generatedFootprint.add(new PlatedHole({shape:"circle",pcbX:geometry.groundViaPoint.x,pcbY:geometry.groundViaPoint.y,holeDiameter:.3,outerDiameter:.7,portHints:["pin2"],coveredWithSolderMask:!0}))}this.add(generatedFootprint)}doInitialCreateTracesFromProps(){super.doInitialCreateTracesFromProps();let{pcbPath:pcbPath3}=this._parsedProps;if(!pcbPath3)return;let antennaTrace=new Trace({name:`${this.name}_pcb_path`,path:[`${this.getSubcircuitSelector()} > port.pin1`],pcbPath:pcbPath3});antennaTrace.isAntennaTrace=!0,this.add(antennaTrace)}},Pinout=class extends Chip{constructor(props){super(props)}get config(){return{...super.config,componentName:"Pinout",zodProps:pinoutProps}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_pinout",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Fuse=class extends NormalComponent{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:fuseProps,sourceFtype:FTYPE.simple_fuse}}_getSchematicSymbolDisplayValue(){if(this._parsedProps.schShowRatings===!1)return"";let rawCurrent=this._parsedProps.currentRating,rawVoltage=this._parsedProps.voltageRating,current3=parseAndConvertSiUnit(rawCurrent,"A").value,voltage23=parseAndConvertSiUnit(rawVoltage,"V").value;return`${formatSiUnit(current3)}A / ${formatSiUnit(voltage23)}V`}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,currentRating=parseAndConvertSiUnit(props.currentRating,"A").value,voltageRating=parseAndConvertSiUnit(props.voltageRating,"V").value,display_current_rating,display_voltage_rating;props.schShowRatings!==!1&&(display_current_rating=`${formatSiUnit(currentRating)}A`,display_voltage_rating=`${formatSiUnit(voltageRating)}V`);let source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_fuse,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,...currentRating!=null?{current_rating_amps:currentRating}:{},...voltageRating!=null?{voltage_rating_volts:voltageRating}:{},display_current_rating,display_voltage_rating,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Jumper=class extends NormalComponent{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),direction3=this._parsedProps.schDirection??"right";return{leftSize:direction3==="left"?pinCount:0,rightSize:direction3==="right"?pinCount:0}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db22.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),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:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db22.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:normalizeDegrees(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,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}doInitialPcbPortAttachment(){let{db:db22}=this.root,pcb_ports=db22.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i23=0;i23<pcb_ports.length;i23++){let port=pcb_ports[i23],sourcePort=db22.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(h23=>/^(pin)?\d+$/.test(h23));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db22.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 NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"interconnect",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db22}=this.root,internallyConnectedPorts=this._getInternallyConnectedPins();for(let ports of internallyConnectedPorts){let sourcePortIds=ports.map(port=>port.source_port_id).filter(id3=>id3!==null);sourcePortIds.length>=2&&db22.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 NormalComponent{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}_getPinCountFromFootprintString(footprint){let match2=footprint.match(/^solderjumper([23])(?:_|$)/);return match2?Number(match2[1]):null}_getPinNumberFromBridgedPinsProp(pinName){let numericPinMatch=pinName.match(/^(?:pin)?(\d+)$/i);if(numericPinMatch)return Number(numericPinMatch[1]);let pinLabels=this._parsedProps.pinLabels??this.props.pinLabels;if(Array.isArray(pinLabels)){let labelIndex=pinLabels.findIndex(label=>label===pinName);return labelIndex>=0?labelIndex+1:null}if(pinLabels&&typeof pinLabels=="object")for(let[pinKey,labelOrLabels]of Object.entries(pinLabels)){if(!(Array.isArray(labelOrLabels)?labelOrLabels:[labelOrLabels]).includes(pinName))continue;let pinNumberMatch=pinKey.match(/^(?:pin)?(\d+)$/i);return pinNumberMatch?Number(pinNumberMatch[1]):null}return null}_getBridgedPinNumbersForFootprint(pinCount){let props=this._parsedProps??this.props;return Array.isArray(props.bridgedPins)&&props.bridgedPins.length>0?Array.from(new Set(props.bridgedPins.flat().map(pinName=>this._getPinNumberFromBridgedPinsProp(pinName)).filter(pinNumber=>pinNumber!==null&&pinNumber>=1&&pinNumber<=pinCount))).sort((a22,b22)=>a22-b22):props.bridged?Array.from({length:pinCount},(_23,index2)=>index2+1):[]}resolveFootprint(){let footprint=super.resolveFootprint();if(typeof footprint!="string")return footprint;let pinCount=this._getPinCountFromFootprintString(footprint);if(!pinCount||/_bridged\d+/.test(footprint))return footprint;let bridgedPinNumbers=this._getBridgedPinNumbersForFootprint(pinCount);return bridgedPinNumbers.length===0?footprint:footprint.replace(/^solderjumper[23]/,`solderjumper${pinCount}_bridged${bridgedPinNumbers.join("")}`)}_getPinNumberFromBridgedPinName(pinName){return this.selectOne(`port.${pinName}`,{type:"port"})?._parsedProps.pinNumber??null}get defaultInternallyConnectedPinNames(){if(this._parsedProps.bridged){let pins=this.children.filter(c23=>c23.componentName==="Port").map(p23=>p23.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(n23=>n23!==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(n23=>n23!==null))).sort((a22,b22)=>a22-b22):props.bridged&&resolvedPinCount&&(bridgedPinNumbers=Array.from({length:resolvedPinCount},(_23,i23)=>i23+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 direction3=this._parsedProps.schDirection??"right";return{leftSize:direction3==="left"?pinCount:0,rightSize:direction3==="right"?pinCount:0}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db22.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),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:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db22.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:normalizeDegrees(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,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}doInitialPcbPortAttachment(){let{db:db22}=this.root,pcb_ports=db22.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i23=0;i23<pcb_ports.length;i23++){let port=pcb_ports[i23],sourcePort=db22.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(h23=>/^(pin)?\d+$/.test(h23));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db22.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))}},PowerSource=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:props.voltage,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},VoltageSource2=class extends NormalComponent{constructor(){super(...arguments);__publicField(this,"simulation_voltage_source_id",null);__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:voltage23,frequency:frequency23}=this._parsedProps,parts=[];return voltage23!==void 0&&parts.push(`${formatSiUnit(voltage23)}V`),frequency23!==void 0&&parts.push(`${formatSiUnit(frequency23)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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,pulse_delay:props.pulseDelay,rise_time:props.riseTime,fall_time:props.fallTime,pulse_width:props.pulseWidth,period:props.period,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=this.root,{_parsedProps:props}=this,terminal1Port=this.portMap.terminal1,terminal2Port=this.portMap.terminal2,simulationVoltageSource=db22.simulation_voltage_source.insert({is_dc_source:!1,terminal1_source_port_id:terminal1Port.source_port_id??void 0,terminal2_source_port_id:terminal2Port.source_port_id??void 0,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,pulse_delay:props.pulseDelay,rise_time:props.riseTime,fall_time:props.fallTime,pulse_width:props.pulseWidth,period:props.period,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_voltage_source_id=simulationVoltageSource.simulation_voltage_source_id}},CurrentSource2=class extends NormalComponent{constructor(){super(...arguments);__publicField(this,"simulation_current_source_id",null);__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:frequency23,peakToPeakCurrent}=this._parsedProps,parts=[];return current3!==void 0&&parts.push(`${formatSiUnit(current3)}A`),peakToPeakCurrent!==void 0&&parts.push(`${formatSiUnit(peakToPeakCurrent)}A p-p`),frequency23!==void 0&&parts.push(`${formatSiUnit(frequency23)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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,manufacturer_part_number:resolveManufacturerPartNumber(props),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=this.root,{_parsedProps:props}=this,isAc=props.frequency!==void 0||props.peakToPeakCurrent!==void 0||props.waveShape!==void 0||props.acMagnitude!==void 0||props.acPhase!==void 0,posPort=this.portMap.pos,negPort=this.portMap.neg;if(isAc){let simulationCurrentSource=db22.simulation_current_source.insert({is_dc_source:!1,terminal1_source_port_id:posPort.source_port_id??void 0,terminal2_source_port_id:negPort.source_port_id??void 0,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_current_source_id=simulationCurrentSource.simulation_current_source_id}else{if(props.current===void 0)return;let simulationCurrentSource=db22.simulation_current_source.insert({is_dc_source:!0,positive_source_port_id:posPort.source_port_id??void 0,negative_source_port_id:negPort.source_port_id??void 0,current:props.current,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_current_source_id=simulationCurrentSource.simulation_current_source_id}}},PLACEMENT_MARGIN=.25,rectForComponent=(component,margin)=>({left:component.center.x-component.size.width/2-margin,right:component.center.x+component.size.width/2+margin,bottom:component.center.y-component.size.height/2-margin,top:component.center.y+component.size.height/2+margin}),rectsOverlap4=(a22,b22)=>a22.left<b22.right&&a22.right>b22.left&&a22.bottom<b22.top&&a22.top>b22.bottom,getCandidateCenters=({baseCenter,size:size3})=>{let xStep=size3.width+PLACEMENT_MARGIN*2,yStep=size3.height+PLACEMENT_MARGIN*2;return[baseCenter,{x:baseCenter.x,y:baseCenter.y+yStep},{x:baseCenter.x,y:baseCenter.y-yStep},{x:baseCenter.x+xStep,y:baseCenter.y},{x:baseCenter.x-xStep,y:baseCenter.y},{x:baseCenter.x+xStep,y:baseCenter.y+yStep},{x:baseCenter.x-xStep,y:baseCenter.y+yStep},{x:baseCenter.x+xStep,y:baseCenter.y-yStep},{x:baseCenter.x-xStep,y:baseCenter.y-yStep},{x:baseCenter.x,y:baseCenter.y+yStep*2},{x:baseCenter.x,y:baseCenter.y-yStep*2}]},getConnectedSchematicPort=({ammeterSourcePortId,schematicPorts,sourceTraces})=>{for(let sourceTrace of sourceTraces){if(!sourceTrace.connected_source_port_ids.includes(ammeterSourcePortId))continue;let connectedSourcePortId=sourceTrace.connected_source_port_ids.find(sourcePortId=>sourcePortId!==ammeterSourcePortId);if(connectedSourcePortId===void 0)continue;let schematicPort=schematicPorts.find(port=>port.source_port_id===connectedSourcePortId);if(schematicPort)return schematicPort}return null},midpoint22=ports=>({x:ports.reduce((sum,port)=>sum+port.center.x,0)/ports.length,y:ports.reduce((sum,port)=>sum+port.center.y,0)/ports.length}),shiftAmmeterSchematicElements=({ammeter,db:db22,oldCenter,newCenter})=>{let schematicComponentId=ammeter.schematic_component_id;if(!schematicComponentId)return;let deltaX=newCenter.x-oldCenter.x,deltaY=newCenter.y-oldCenter.y;if(!(deltaX===0&&deltaY===0)){db22.schematic_component.update(schematicComponentId,{center:newCenter});for(let port of db22.schematic_port.list({schematic_component_id:schematicComponentId}))db22.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});for(let text2 of db22.schematic_text.list({schematic_component_id:schematicComponentId}))db22.schematic_text.update(text2.schematic_text_id,{position:{x:text2.position.x+deltaX,y:text2.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId,deltaX,deltaY})}},Ammeter_doInitialSchematicLayout=ammeter=>{let{root}=ammeter;if(!root||root.schematicDisabled||!ammeter.schematic_component_id||ammeter._parsedProps.schX!==void 0||ammeter._parsedProps.schY!==void 0||ammeter.getGroup()?._getSchematicLayoutMode()!=="relative")return;let{db:db22}=root,schematicComponent=db22.schematic_component.get(ammeter.schematic_component_id);if(!schematicComponent)return;let ammeterSourcePortIds=[ammeter.portMap.pos.source_port_id,ammeter.portMap.neg.source_port_id].filter(sourcePortId=>typeof sourcePortId=="string");if(ammeterSourcePortIds.length===0)return;let schematicPorts=db22.schematic_port.list(),sourceTraces=db22.source_trace.list(),connectedSchematicPorts=ammeterSourcePortIds.map(ammeterSourcePortId=>getConnectedSchematicPort({ammeterSourcePortId,schematicPorts,sourceTraces})).filter(port=>port!==null);if(connectedSchematicPorts.length===0)return;let baseCenter=midpoint22(connectedSchematicPorts),obstacles=db22.schematic_component.list().filter(component=>component.schematic_component_id!==schematicComponent.schematic_component_id&&!component.is_schematic_group&&component.schematic_sheet_id===schematicComponent.schematic_sheet_id).map(component=>rectForComponent(component,PLACEMENT_MARGIN)),bestCenter=getCandidateCenters({baseCenter,size:schematicComponent.size}).find(candidateCenter=>{let candidateRect=rectForComponent({...schematicComponent,center:candidateCenter},PLACEMENT_MARGIN);return!obstacles.some(obstacle=>rectsOverlap4(candidateRect,obstacle))})??baseCenter;shiftAmmeterSchematicElements({ammeter,db:db22,oldCenter:schematicComponent.center,newCenter:bestCenter})},Ammeter=class extends NormalComponent{constructor(){super(...arguments);__publicField(this,"simulation_current_probe_id",null);__publicField(this,"pos",this.portMap.pos);__publicField(this,"neg",this.portMap.neg)}get config(){return{componentName:"Ammeter",schematicSymbolName:"dc_ammeter",zodProps:ammeterProps,sourceFtype:"simple_ammeter"}}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("Ammeter requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({ignoreSymbolPorts:!0,pinCount:2,additionalAliases:{pin1:["pos"],pin2:["neg"]}});let symbol=zh[this._getSchematicSymbolNameOrThrow()];this.portMap.pos.schematicSymbolPortDef=symbol.ports.find(port=>port.labels.includes("1"))??null,this.portMap.neg.schematicSymbolPortDef=symbol.ports.find(port=>port.labels.includes("2"))??null}doInitialSourceRender(){let{db:db22}=this.root,{supplierPartNumbers,displayName}=this._parsedProps,source_component=db22.source_component.insert({ftype:"simple_ammeter",name:this.name,supplier_part_numbers:supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(this._parsedProps),display_name:displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=this.root,{color:color3,graphDisplayName,graphCenter,graphVerticalOffset,graphCurrentPerDiv}=this._parsedProps,posPort=this.portMap.pos,negPort=this.portMap.neg,{simulation_current_probe_id}=db22.simulation_current_probe.insert({type:"simulation_current_probe",name:this.name,source_component_id:this.source_component_id,positive_source_port_id:posPort.source_port_id,negative_source_port_id:negPort.source_port_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,color:color3});if(this.simulation_current_probe_id=simulation_current_probe_id,graphDisplayName!==void 0||graphCenter!==void 0||graphVerticalOffset!==void 0||graphCurrentPerDiv!==void 0){let graphCurrentPerDivValue=parseSimulationGraphValue(graphCurrentPerDiv),graphVerticalOffsetValue=parseSimulationGraphValue(graphVerticalOffset);db22.simulation_oscilloscope_trace.insert({simulation_current_probe_id,display_name:graphDisplayName,color:color3,display_center_value:graphCenter,amps_per_div:graphCurrentPerDivValue,display_center_offset_divs:graphVerticalOffsetValue!==void 0&&graphCurrentPerDivValue!==void 0&&graphCurrentPerDivValue!==0?graphVerticalOffsetValue/graphCurrentPerDivValue:void 0})}}doInitialSchematicLayout(){Ammeter_doInitialSchematicLayout(this)}},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(selector2){let maybeEdge=selector2.split(" ").pop(),edge=edgeSpecifiers.includes(maybeEdge)?maybeEdge:void 0,componentSelector=edge?selector2.replace(` ${edge}`,""):selector2,component=container.selectOne(componentSelector,{pcbPrimitive:!0});component&&componentsWithSelectors.push({selector:selector2,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 selector2 of this._parsedProps.for)addComponentFromSelector(selector2);return{componentsWithSelectors}}},isSelectionResultPort=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourcePort=="function",isSelectionResultNet=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourceNet=="function",isSelectionResultComponent=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getPorts=="function",isCircuitJsonElement=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.type=="string",isNonEmptyString=value=>typeof value=="string"&&value.length>0,SelectionResultPortImpl=class{constructor(port){__publicField(this,"port");this.port=port}getPcbPort(){let pcbPortId=this.port.pcb_port_id;return pcbPortId?this.port.root?.db.pcb_port.get(pcbPortId)??null:null}getSourcePort(){let sourcePortId=this.port.source_port_id;return sourcePortId?this.port.root?.db.source_port.get(sourcePortId)??null:null}},SelectionResultNetImpl=class{constructor(net){__publicField(this,"net");this.net=net}getSourceNet(){let sourceNetId=this.net.source_net_id;return sourceNetId?this.net.root?.db.source_net.get(sourceNetId)??null:null}},SelectionResultComponentImpl=class{constructor(component){__publicField(this,"component");this.component=component}getPort(name){let port=this.component.selectOne(`port.${name}`,{type:"port"})??this.component.selectOne(`.${name}`,{type:"port"});return port?new SelectionResultPortImpl(port):null}getPorts(){return this.component.selectAll("port").map(port=>new SelectionResultPortImpl(port))}getPcbComponent(){let pcbComponentId=this.component.pcb_component_id;return pcbComponentId?this.component.root?.db.pcb_component.get(pcbComponentId)??null:null}getSourceComponent(){let sourceComponentId=this.component.source_component_id;return sourceComponentId?this.component.root?.db.source_component.get(sourceComponentId)??null:null}},DrcCheck=class extends PrimitiveComponent2{get config(){return{componentName:"DrcCheck",zodProps:drcCheckProps}}constructor(props){super(props)}async runCustomDrcCheck(circuitJson){let result=await this._parsedProps.checkFn(this.createCustomDrcCheckContext(circuitJson)),diagnostics=[];return Array.isArray(result)?diagnostics=result:result&&(diagnostics=[result]),diagnostics.map((diagnostic,index2)=>this.createCircuitJsonDiagnostic(diagnostic,index2)).filter(diagnostic=>!!diagnostic)}createCustomDrcCheckContext(circuitJson){return{select:this.selectCustomDrcElement.bind(this),selectAll:this.selectAllCustomDrcElements.bind(this),isConnected:(a22,b22)=>this.isConnected(a22,b22,circuitJson),isPulledUp:a22=>this.isConnected(a22,"net.VCC",circuitJson)||this.isConnected(a22,"net.VDD",circuitJson)||this.getResistanceBetween(a22,"net.VCC",circuitJson)!==null||this.getResistanceBetween(a22,"net.VDD",circuitJson)!==null,isPulledDown:a22=>this.isConnected(a22,"net.GND",circuitJson)||this.getResistanceBetween(a22,"net.GND",circuitJson)!==null,getResistanceBetween:(a22,b22)=>this.getResistanceBetween(a22,b22,circuitJson)}}selectCustomDrcElement(selector2){return this.wrapSelectionResult(this.getSubcircuit().selectOne(selector2))}selectAllCustomDrcElements(selector2){let selectionResults=[];for(let component of this.getSubcircuit().selectAll(selector2)){let selectionResult=this.wrapSelectionResult(component);selectionResult&&selectionResults.push(selectionResult)}return selectionResults}wrapSelectionResult(component){return component?component instanceof Port?new SelectionResultPortImpl(component):component instanceof Net?new SelectionResultNetImpl(component):new SelectionResultComponentImpl(component):null}createCircuitJsonDiagnostic(diagnostic,index2){let diagnosticRecord=diagnostic,diagnosticType="source_component_misconfigured_error";typeof diagnosticRecord.error_type=="string"?diagnosticType=diagnosticRecord.error_type:typeof diagnosticRecord.warning_type=="string"&&(diagnosticType=diagnosticRecord.warning_type);let diagnosticWithCircuitJsonDefaults={...diagnostic};typeof diagnosticRecord.type=="string"?diagnosticWithCircuitJsonDefaults.type=diagnosticRecord.type:diagnosticWithCircuitJsonDefaults.type=diagnosticType,typeof diagnosticRecord.warning_type!="string"&&(typeof diagnosticRecord.error_type=="string"?diagnosticWithCircuitJsonDefaults.error_type=diagnosticRecord.error_type:diagnosticWithCircuitJsonDefaults.error_type=diagnosticType);let diagnosticIdField=`${diagnosticType}_id`;return diagnosticRecord[diagnosticIdField]?diagnosticWithCircuitJsonDefaults[diagnosticIdField]=diagnosticRecord[diagnosticIdField]:diagnosticWithCircuitJsonDefaults[diagnosticIdField]=`${diagnosticType}_${this._renderId}_${index2}`,any_circuit_element.parse(diagnosticWithCircuitJsonDefaults)}isConnected(a22,b22,circuitJson){let aKeys=this.getConnectivityKeys(a22,circuitJson),bKeys=this.getConnectivityKeys(b22,circuitJson);return aKeys.some(key=>bKeys.includes(key))}getResistanceBetween(a22,b22,circuitJson){if(this.isConnected(a22,b22,circuitJson))return 0;let aKeys=this.getConnectivityKeys(a22,circuitJson),bKeys=this.getConnectivityKeys(b22,circuitJson);if(aKeys.length===0||bKeys.length===0)return null;let sourceResistors=circuitJson.filter(elm=>elm.type==="source_component"&&elm.ftype==="simple_resistor"),root=this.root;if(!root)return null;for(let resistor of sourceResistors){let resistorPorts=root.db.source_port.list({source_component_id:resistor.source_component_id});if(resistorPorts.length!==2)continue;let resistorKeys=resistorPorts.map(port=>port.subcircuit_connectivity_map_key),connectsA=resistorKeys.some(key=>key&&aKeys.includes(key)),connectsB=resistorKeys.some(key=>key&&bKeys.includes(key));if(connectsA&&connectsB)return resistor.resistance}return null}getConnectivityKeys(connectable,circuitJson){if(!connectable)return[];if(typeof connectable=="string"){let selected=this.selectCustomDrcElement(connectable);return selected?this.getConnectivityKeys(selected,circuitJson):[]}return isSelectionResultPort(connectable)?[connectable.getSourcePort()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultNet(connectable)?[connectable.getSourceNet()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultComponent(connectable)?connectable.getPorts().flatMap(port=>this.getConnectivityKeys(port,circuitJson)):isCircuitJsonElement(connectable)?this.getCircuitJsonElementConnectivityKeys(connectable,circuitJson):[]}getCircuitJsonElementConnectivityKeys(element,circuitJson){if(!element)return[];if(element.type==="source_port")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="source_net")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="pcb_port")return this.getConnectivityKeys(element.source_port_id,circuitJson);if(element.type==="source_component"){let root=this.root;return root?root.db.source_port.list({source_component_id:element.source_component_id}).map(port=>port.subcircuit_connectivity_map_key).filter(isNonEmptyString):[]}return[]}},AutoroutingPhase=class extends PrimitiveComponent2{get config(){return{componentName:"AutoroutingPhase",zodProps:autoroutingPhaseProps}}add(_component){throw new Error("<autoroutingphase> cannot contain children")}},resolvePcbDimensionOffsetDirection=({from,offset:offset2,offsetDirection,to:to3,transform:transform7})=>{if(offsetDirection)return applyToPoint2({...transform7,e:0,f:0},offsetDirection);let dx22=to3.x-from.x,dy22=to3.y-from.y,distance27=Math.hypot(dx22,dy22);if(!(offset2===void 0||distance27===0))return{x:-dy22/distance27,y:dx22/distance27}},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,transform7){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(input2);return target?target._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${input2}"`),applyToPoint2(transform7,{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(transform7,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),subcircuit=this.getSubcircuit(),group2=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,text2=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),offsetDirection=resolvePcbDimensionOffsetDirection({from,offset:props.offset,offsetDirection:props.offsetDirection,to:to3,transform:transform7}),fabrication_note_dimension=db22.pcb_fabrication_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group2?.pcb_group_id??void 0,layer,from,to:to3,text:text2,offset:props.offset,offset_distance:props.offset,offset_direction:offsetDirection,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:db22}=this.root;if(!this.fabrication_note_dimension_id)return;let dimension2=db22.pcb_fabrication_note_dimension.get(this.fabrication_note_dimension_id);dimension2&&db22.pcb_fabrication_note_dimension.update(this.fabrication_note_dimension_id,{from:{x:dimension2.from.x+deltaX,y:dimension2.from.y+deltaY},to:{x:dimension2.to.x+deltaX,y:dimension2.to.y+deltaY}})}getPcbSize(){let transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx22=to3.x-from.x,dy22=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx22*dx22+dy22*dy22),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,transform7){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(`.${input2}`);if(!target)return this.renderError(`PcbNoteDimension could not find selector "${input2}"`),applyToPoint2(transform7,{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(transform7,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),subcircuit=this.getSubcircuit(),group2=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,text2=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),offsetDirection=resolvePcbDimensionOffsetDirection({from,offset:props.offset,offsetDirection:props.offsetDirection,to:to3,transform:transform7}),pcb_note_dimension3=db22.pcb_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group2?.pcb_group_id??void 0,from,to:to3,text:text2,offset_distance:props.offset,offset_direction:offsetDirection,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:db22}=root,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);db22.pcb_note_dimension.update(this.pcb_note_dimension_id,{from,to:to3})}getPcbSize(){let transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx22=to3.x-from.x,dy22=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx22*dx22+dy22*dy22),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:db22}=this.root;if(!this.pcb_note_dimension_id)return;let dimension2=db22.pcb_note_dimension.get(this.pcb_note_dimension_id);dimension2&&db22.pcb_note_dimension.update(this.pcb_note_dimension_id,{from:{x:dimension2.from.x+deltaX,y:dimension2.from.y+deltaY},to:{x:dimension2.to.x+deltaX,y:dimension2.to.y+deltaY}})}},AutoplacedBreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"AutoplacedBreakoutPoint",zodProps:baseBreakoutPointProps}}_applySolvedBreakoutPoint({sourceTraceId,layer,position:position4}){this.matchedSourceTraceId=sourceTraceId,this._renderPcbBreakoutPoint({layer:layer_ref.parse(layer)}),this._setPositionFromLayout(position4)}},DDR_BYTE0_PORTS=[{id:"DQ0",layer:"inner3",soc:{x:-6,y:-3},ram:{x:3.941917,y:-3.650917}},{id:"DQ1",layer:"inner6",fullLayer:"inner2",soc:{x:-5.5,y:-3},ram:{x:4.591917,y:-3.650917}},{id:"DQ2",layer:"inner5",fullLayer:"inner4",soc:{x:-4.5,y:-3},ram:{x:5.891917,y:-3.650917}},{id:"DQ3",layer:"inner2",fullLayer:"inner6",soc:{x:-4.5,y:-3.5},ram:{x:6.541917,y:-3.650917}},{id:"DQ4",layer:"inner3",fullLayer:"inner2",soc:{x:-6,y:-2.5},ram:{x:6.541917,y:-2.050917}},{id:"DQ5",layer:"inner2",fullLayer:"inner5",soc:{x:-6,y:-2},ram:{x:5.891917,y:-2.050917}},{id:"DQ6",layer:"inner5",fullLayer:"inner4",soc:{x:-5,y:-2},ram:{x:4.591917,y:-2.050917}},{id:"DQ7",layer:"inner4",fullLayer:"inner6",soc:{x:-5.5,y:-2},ram:{x:3.941917,y:-2.050917}},{id:"DM0",layer:"inner4",fullLayer:"inner5",soc:{x:-5,y:-3},ram:{x:4.591917,y:-2.850917}},{id:"DQS0",layer:"inner1",differentialPairId:"DQS0",soc:{x:-4.5,y:-2.5},ram:{x:5.241917,y:-2.850917}},{id:"DQS0_n",layer:"inner1",differentialPairId:"DQS0",soc:{x:-5,y:-2.5},ram:{x:5.891917,y:-2.850917}}],DDR_BYTE1_PORTS=[{id:"DQ8",layer:"inner6",fullLayer:"inner4",soc:{x:-6,y:3},ram:{x:3.941917,y:3.549083}},{id:"DQ9",layer:"inner3",fullLayer:"inner4",soc:{x:-5.5,y:2},ram:{x:4.591917,y:3.549083}},{id:"DQ10",layer:"inner3",fullLayer:"inner2",soc:{x:-4.5,y:2},ram:{x:5.891917,y:3.549083}},{id:"DQ11",layer:"inner6",fullLayer:"inner5",soc:{x:-4.5,y:2.5},ram:{x:6.541917,y:3.549083}},{id:"DQ12",layer:"inner5",fullLayer:"inner1",soc:{x:-6,y:2.5},ram:{x:6.541917,y:1.949083}},{id:"DQ13",layer:"inner2",fullLayer:"inner3",soc:{x:-6.5,y:3},ram:{x:5.891917,y:1.949083}},{id:"DQ14",layer:"inner5",fullLayer:"inner6",soc:{x:-5,y:2.5},ram:{x:4.591917,y:1.949083}},{id:"DQ15",layer:"inner4",fullLayer:"inner1",soc:{x:-4.5,y:3.5},ram:{x:3.941917,y:1.949083}},{id:"DM1",layer:"inner4",fullLayer:"inner5",soc:{x:-5,y:3.5},ram:{x:4.591917,y:2.749083}},{id:"DQS1",layer:"inner1",fullLayer:"bottom",differentialPairId:"DQS1",soc:{x:-4.5,y:3},ram:{x:5.241917,y:2.749083}},{id:"DQS1_n",layer:"inner1",fullLayer:"bottom",differentialPairId:"DQS1",soc:{x:-5,y:3},ram:{x:5.891917,y:2.749083}}],DDR_ADDR_CTRL_PORTS=[{id:"A0",layer:"bottom",soc:{x:-6.5,y:-.5},ram:{x:7.841917,y:-3.650917}},{id:"A1",layer:"inner3",soc:{x:-7,y:-2},ram:{x:8.491917,y:-3.650917}},{id:"A2",layer:"inner3",soc:{x:-7,y:-.5},ram:{x:7.841917,y:1.949083}},{id:"A3",layer:"inner6",soc:{x:-5,y:-1},ram:{x:7.841917,y:2.749083}},{id:"A4",layer:"inner4",soc:{x:-4.5,y:-1.5},ram:{x:7.841917,y:3.549083}},{id:"A5",layer:"inner2",soc:{x:-6.5,y:-2},ram:{x:8.491917,y:3.549083}},{id:"CS0_n",layer:"inner5",soc:{x:-5.5,y:-.5},ram:{x:7.841917,y:-2.050917}},{id:"CKE0",layer:"inner1",soc:{x:-4.5,y:-1},ram:{x:8.491917,y:-2.050917}},{id:"CK0",layer:"bottom",differentialPairId:"CK0",soc:{x:-4.5,y:1},ram:{x:8.491917,y:1.149083}},{id:"CK0_n",layer:"bottom",differentialPairId:"CK0",soc:{x:-5,y:1},ram:{x:8.491917,y:1.949083}},{id:"DDR_LINK_RESET0_n",layer:"inner6",soc:{x:-5,y:-1.5},ram:{x:13.041917,y:3.549083}}],createAm62lExample=options=>{let ports=options.buses.flatMap(bus=>bus.ports),addedPairIds=new Set,makeEndpoints=port=>[{regionId:"soc",position:port.soc},{regionId:"ram",position:port.ram}],connections=[];for(let port of ports){if(!port.differentialPairId){connections.push({id:port.id,endpoints:makeEndpoints(port)});continue}if(addedPairIds.has(port.differentialPairId))continue;addedPairIds.add(port.differentialPairId);let pair=ports.filter(candidate=>candidate.differentialPairId===port.differentialPairId);if(pair.length!==2)throw new Error(`Differential pair ${port.differentialPairId} must have two members`);let[first,second]=pair;connections.push({type:"differential",connections:[{id:first.id,endpoints:makeEndpoints(first)},{id:second.id,endpoints:makeEndpoints(second)}]})}let buses=options.buses.map(bus=>{let solverBus={id:bus.id,connectionIds:bus.ports.map(port=>port.id)};return bus.preferredLayer!==void 0&&(solverBus={...solverBus,preferredLayer:bus.preferredLayer}),bus.preferredLayers!==void 0&&(solverBus={...solverBus,preferredLayers:bus.preferredLayers}),solverBus});return{regions:[{id:"soc",bounds:{minX:-16.62808,maxX:-2.37192,minY:-10.62808,maxY:10.62808},edge:"right"},{id:"ram",bounds:{minX:1.091917,maxX:18.141917,minY:-9.650917,maxY:9.549083},edge:"left"}],connections,buses,boundaryPointSpacing:.48}},ddrByte0Example=createAm62lExample({buses:[{id:"DDR_BYTE0",ports:DDR_BYTE0_PORTS,preferredLayers:["inner1","inner4"]}]}),ddrByte1Example=createAm62lExample({buses:[{id:"DDR_BYTE1",ports:DDR_BYTE1_PORTS,preferredLayers:["inner2","inner5"]}]}),fullDdrExample=createAm62lExample({buses:[{id:"DDR_BYTE0",ports:DDR_BYTE0_PORTS,preferredLayers:["inner1","inner4"]},{id:"DDR_BYTE1",ports:DDR_BYTE1_PORTS,preferredLayers:["inner2","inner5"]},{id:"DDR_ADDR_CTRL",ports:DDR_ADDR_CTRL_PORTS,preferredLayers:["inner3","inner6"]}]}),controlBusExample=createAm62lExample({buses:[{id:"DDR_ADDR_CTRL",ports:DDR_ADDR_CTRL_PORTS,preferredLayers:["inner3","inner6"]}]}),WindingBreakoutInputError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutInputError")}},WindingBreakoutInfeasibleError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutInfeasibleError")}},WindingBreakoutInvariantError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutInvariantError")}},WindingBreakoutOutputUnavailableError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutOutputUnavailableError")}},getCanonicalConnections=input2=>{let connections=[];for(let entry of input2.connections)"type"in entry?connections.push(...entry.connections):connections.push(entry);return connections},getBusLayerCandidates=bus=>bus.preferredLayer!==void 0?[bus.preferredLayer]:bus.preferredLayers!==void 0?[...new Set(bus.preferredLayers)]:["top"],getLayerCandidatesByConnection=input2=>{let candidatesByConnection=new Map;for(let bus of input2.buses){let candidates=getBusLayerCandidates(bus);for(let connectionId of bus.connectionIds)candidatesByConnection.set(connectionId,candidates)}return Object.fromEntries(getCanonicalConnections(input2).map(connection=>[connection.id,candidatesByConnection.get(connection.id)??["top"]]))},fail=message=>{throw new WindingBreakoutInputError(`WindingBreakoutSolver: ${message}`)},isRecord=value=>typeof value=="object"&&value!==null&&!Array.isArray(value),requireRecord=(value,label)=>{isRecord(value)||fail(`${label} must be an object`)},requireId=(value,label)=>{(typeof value!="string"||value.trim().length===0)&&fail(`${label} must be a non-empty string`)},requireFinite=(value,label)=>{(typeof value!="number"||!Number.isFinite(value))&&fail(`${label} must be finite`)},requirePositive=(value,label)=>{requireFinite(value,label),value<=0&&fail(`${label} must be positive`)},requireArray=(value,message)=>Array.isArray(value)?value:fail(message),validatePoint=(value,label)=>(requireRecord(value,label),requireFinite(value.x,`${label}.x`),requireFinite(value.y,`${label}.y`),value),validateBounds=(value,label)=>(requireRecord(value,label),requireFinite(value.minX,`${label}.minX`),requireFinite(value.maxX,`${label}.maxX`),requireFinite(value.minY,`${label}.minY`),requireFinite(value.maxY,`${label}.maxY`),(value.minX>=value.maxX||value.minY>=value.maxY)&&fail(`${label} must have positive width and height`),{minX:value.minX,maxX:value.maxX,minY:value.minY,maxY:value.maxY}),pointIsInsideBounds4=(point62,bounds)=>point62.x>=bounds.minX&&point62.x<=bounds.maxX&&point62.y>=bounds.minY&&point62.y<=bounds.maxY,validateWindingBreakoutInput=input2=>{(!Array.isArray(input2.regions)||input2.regions.length===0)&&fail("at least one region is required"),requirePositive(input2.boundaryPointSpacing,"boundaryPointSpacing");let regionIds=new Set,regions=input2.regions.map((value,index2)=>{requireRecord(value,`regions[${index2}]`),requireId(value.id,`regions[${index2}].id`),regionIds.has(value.id)&&fail(`duplicate region id "${value.id}"`),regionIds.add(value.id);let bounds=validateBounds(value.bounds,`region "${value.id}" bounds`);return(typeof value.edge!="string"||!new Set(["left","right","bottom","top"]).has(value.edge))&&fail(`region "${value.id}" has invalid edge`),{id:value.id,bounds,edge:value.edge,center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}}}),vertical=regions.every(region=>region.edge==="left"||region.edge==="right"),horizontal=regions.every(region=>region.edge==="bottom"||region.edge==="top");!vertical&&!horizontal&&fail("all coordinated region edges must be parallel"),(!Array.isArray(input2.connections)||input2.connections.length===0)&&fail("at least one connection is required");let connections=[],connectionIds=new Set,atomicConnectionGroups=[],validateConnection=(value,label)=>{requireRecord(value,label),requireId(value.id,`${label}.id`),connectionIds.has(value.id)&&fail(`duplicate connection id "${value.id}"`),"layer"in value&&fail(`${label}.layer is not accepted; declare layer preferences on a bus`);let endpointValues=requireArray(value.endpoints,`${label}.endpoints must be an array`),endpointRegionIds=new Set,endpoints=endpointValues.map((endpointValue,endpointIndex)=>{let endpointLabel=`${label}.endpoints[${endpointIndex}]`;requireRecord(endpointValue,endpointLabel),requireId(endpointValue.regionId,`${endpointLabel}.regionId`),regionIds.has(endpointValue.regionId)||fail(`${endpointLabel} references unknown region "${endpointValue.regionId}"`),endpointRegionIds.has(endpointValue.regionId)&&fail(`${label} has duplicate endpoint for region "${endpointValue.regionId}"`),endpointRegionIds.add(endpointValue.regionId);let position4=validatePoint(endpointValue.position,`${endpointLabel}.position`),region=regions.find(candidate=>candidate.id===endpointValue.regionId);return pointIsInsideBounds4(position4,region.bounds)||fail(`${label} endpoint for region "${region.id}" is outside its bounds`),{regionId:endpointValue.regionId,position:position4}});for(let region of regions)endpointRegionIds.has(region.id)||fail(`${label} is missing endpoint for region "${region.id}"`);return endpoints.length!==regions.length&&fail(`${label} must contain exactly one endpoint for every region`),connectionIds.add(value.id),{id:value.id,endpoints}};for(let[index2,value]of input2.connections.entries()){let label=`connections[${index2}]`;if(requireRecord(value,label),"type"in value||"connections"in value){value.type!=="differential"&&fail(`${label} has invalid differential-pair type`),"layer"in value&&fail(`${label}.layer is not accepted; declare layer preferences on a bus`);let pairConnections=requireArray(value.connections,`${label}.connections must contain exactly two members`);pairConnections.length!==2&&fail(`${label}.connections must contain exactly two members`);let first=validateConnection(pairConnections[0],`${label}.connections[0]`),second=validateConnection(pairConnections[1],`${label}.connections[1]`);first.id===second.id&&fail(`${label} members must have distinct connection ids`),connections.push(first,second),atomicConnectionGroups.push([first.id,second.id])}else connections.push(validateConnection(value,label))}let busValues=requireArray(input2.buses,"buses must be an array"),busIds=new Set,busByConnection=new Map,buses=busValues.map((value,busIndex)=>{let label=`buses[${busIndex}]`;requireRecord(value,label),requireId(value.id,`${label}.id`);let busId=value.id;busIds.has(busId)&&fail(`duplicate bus id "${busId}"`),busIds.add(busId);let connectionIdValues=requireArray(value.connectionIds,`${label}.connectionIds must be a non-empty array`);connectionIdValues.length===0&&fail(`${label}.connectionIds must be a non-empty array`);let localConnectionIds=new Set,busConnectionIds=connectionIdValues.map((connectionId,connectionIndex)=>{requireId(connectionId,`${label}.connectionIds[${connectionIndex}]`),connectionIds.has(connectionId)||fail(`${label} references unknown connection "${connectionId}"`),localConnectionIds.has(connectionId)&&fail(`${label} contains duplicate connection "${connectionId}"`),localConnectionIds.add(connectionId);let previousBusId=busByConnection.get(connectionId);return previousBusId!==void 0&&fail(`connection "${connectionId}" belongs to multiple buses "${previousBusId}" and "${value.id}"`),busByConnection.set(connectionId,busId),connectionId}),preferredLayer;value.preferredLayer!==void 0&&(requireId(value.preferredLayer,`${label}.preferredLayer`),preferredLayer=value.preferredLayer);let preferredLayers;if(value.preferredLayers!==void 0){let preferredLayerValues=requireArray(value.preferredLayers,`${label}.preferredLayers must be a non-empty array`);preferredLayerValues.length===0&&fail(`${label}.preferredLayers must be a non-empty array`);let uniquePreferredLayers=new Set;preferredLayers=preferredLayerValues.map((layer,layerIndex)=>(requireId(layer,`${label}.preferredLayers[${layerIndex}]`),uniquePreferredLayers.has(layer)&&fail(`${label}.preferredLayers contains duplicate layer "${layer}"`),uniquePreferredLayers.add(layer),layer))}let validatedBus={id:busId,connectionIds:busConnectionIds};return preferredLayer!==void 0&&(validatedBus={...validatedBus,preferredLayer}),preferredLayers!==void 0&&(validatedBus={...validatedBus,preferredLayers}),validatedBus});for(let[firstConnectionId,secondConnectionId]of atomicConnectionGroups){let firstBusId=busByConnection.get(firstConnectionId),secondBusId=busByConnection.get(secondConnectionId);firstBusId!==secondBusId&&fail(`differential pair "${firstConnectionId}/${secondConnectionId}" must belong to the same bus`)}let layerNames=[...new Set([...buses.flatMap(bus=>getBusLayerCandidates(bus)),...connections.filter(connection=>!busByConnection.has(connection.id)).map(()=>"top")])].sort((first,second)=>first.localeCompare(second));return{regions,connections,buses,layerNames,atomicConnectionGroups}},GEOMETRY_EPSILON22=1e-9,isVerticalEdge=edge=>edge==="left"||edge==="right",getAxisMinimum=(region,vertical)=>vertical?region.bounds.minY:region.bounds.minX,getAxisMaximum=(region,vertical)=>vertical?region.bounds.maxY:region.bounds.maxX,getAxisPosition=(position4,vertical)=>vertical?position4.y:position4.x,deriveLayerOffsets=(layerNames,boundaryPointSpacing)=>{let staggerOffset=boundaryPointSpacing/2;return Object.fromEntries(layerNames.map((layer,index2)=>[layer,(index2-(layerNames.length-1)/2)*staggerOffset]))},makeAtomicLayerOrder=({referenceOrder,layer,layerByConnection,atomicGroups})=>{let candidates=referenceOrder.filter(connectionId=>layerByConnection[connectionId]===layer),groupByConnection=new Map(atomicGroups.flatMap(group2=>group2.map(connectionId=>[connectionId,group2]))),addedGroups=new Set,result=[];for(let connectionId of candidates){let group2=groupByConnection.get(connectionId);if(!group2){result.push(connectionId);continue}addedGroups.has(group2)||(addedGroups.add(group2),result.push(...candidates.filter(candidate=>group2.includes(candidate))))}return result},makeGateAxes=({regions,connections,spacing,count,layerOffsets})=>{let vertical=regions.every(region=>isVerticalEdge(region.edge)),minAxis=Math.max(...regions.map(region=>getAxisMinimum(region,vertical))),maxAxis=Math.min(...regions.map(region=>getAxisMaximum(region,vertical))),minimumOffset=Math.min(...Object.values(layerOffsets)),maximumOffset=Math.max(...Object.values(layerOffsets)),span=spacing*Math.max(0,count-1)+maximumOffset-minimumOffset;if(maxAxis-minAxis+GEOMETRY_EPSILON22<span)throw new WindingBreakoutInfeasibleError(`WindingBreakoutSolver: declared breakout edges need ${span.toFixed(2)}mm but expose only ${(maxAxis-minAxis).toFixed(2)}mm`);let meanAxis=regions.reduce((regionSum,region)=>{let positions=connections.map(connection=>connection.endpoints.find(endpoint=>endpoint.regionId===region.id).position);return regionSum+positions.reduce((sum,position4)=>sum+getAxisPosition(position4,vertical),0)/positions.length},0)/regions.length,start=Math.max(minAxis-minimumOffset,Math.min(maxAxis-spacing*Math.max(0,count-1)-maximumOffset,meanAxis-spacing*Math.max(0,count-1)/2));return{vertical,axes:Array.from({length:count},(_23,index2)=>start+index2*spacing)}},pointOnEdge=(region,axis,vertical)=>{if(vertical){let x23=region.bounds.maxX;return region.edge==="left"&&(x23=region.bounds.minX),{x:x23,y:axis}}let y23=region.bounds.maxY;return region.edge==="bottom"&&(y23=region.bounds.minY),{x:axis,y:y23}},placeBreakoutGates=({regions,connections,referenceOrder,layerNames,layerByConnection,boundaryPointSpacing,atomicGroups})=>{let layerOffsets=deriveLayerOffsets(layerNames,boundaryPointSpacing),gateOrderByLayer=Object.fromEntries(layerNames.map(layer=>[layer,makeAtomicLayerOrder({referenceOrder,layer,layerByConnection,atomicGroups})])),maxLayerNetCount=Math.max(...layerNames.map(layer=>connections.filter(connection=>layerByConnection[connection.id]===layer).length)),{vertical,axes:axes2}=makeGateAxes({regions,connections,spacing:boundaryPointSpacing,count:maxLayerNetCount,layerOffsets});return{breakoutPoints:regions.flatMap(region=>layerNames.flatMap(layer=>gateOrderByLayer[layer].map((connectionId,slotIndex)=>({regionId:region.id,connectionId,layer,...pointOnEdge(region,axes2[slotIndex]+layerOffsets[layer],vertical)}))))}},getAtomicUnits=(connectionIds,atomicGroups)=>{let connectionSet=new Set(connectionIds),groupByConnection=new Map(atomicGroups.flatMap(group2=>group2.map(connectionId=>[connectionId,group2]))),addedGroups=new Set,units=[];for(let connectionId of connectionIds){let group2=groupByConnection.get(connectionId);if(!group2){units.push([connectionId]);continue}addedGroups.has(group2)||(addedGroups.add(group2),units.push(group2.filter(memberId=>connectionSet.has(memberId))))}return units},assignConnectionLayers=({validated,referenceOrder})=>{let assignments=new Map;for(let bus of validated.buses){let busConnectionSet=new Set(bus.connectionIds),orderedBusConnections=referenceOrder.filter(connectionId=>busConnectionSet.has(connectionId)),candidates=getBusLayerCandidates(bus),units=getAtomicUnits(orderedBusConnections,validated.atomicConnectionGroups);for(let[unitIndex,unit2]of units.entries()){let layer=candidates[unitIndex%candidates.length];for(let connectionId of unit2)assignments.set(connectionId,layer)}}for(let connectionId of referenceOrder)assignments.has(connectionId)||assignments.set(connectionId,"top");let layerByConnection=Object.fromEntries(referenceOrder.map(connectionId=>[connectionId,assignments.get(connectionId)])),layerNames=[...new Set(Object.values(layerByConnection))].sort((first,second)=>first.localeCompare(second));return{layerByConnection,layerNames}},getLayerNames=input2=>[...new Set(Object.values(getLayerCandidatesByConnection(input2)).flat())].sort((first,second)=>first.localeCompare(second)),CONNECTION_COLORS=["#2563eb","#dc2626","#059669","#7c3aed","#d97706","#0891b2","#db2777","#4f46e5","#65a30d","#c2410c","#0f766e","#9333ea"],getConnectionColor=connectionId=>{let hash=2166136261;for(let character of connectionId)hash^=character.charCodeAt(0),hash=Math.imul(hash,16777619);return CONNECTION_COLORS[(hash>>>0)%CONNECTION_COLORS.length]},getGraphicsLayer3=(input2,layerIds)=>{let signalLayerIds=getLayerNames(input2),indexes=[...new Set(layerIds)].map(layerId=>{let index2=signalLayerIds.indexOf(layerId);if(index2<0)throw new Error(`Cannot visualize unknown signal layer "${layerId}"`);return index2});if(indexes.length===0)throw new Error("Cannot create graphics metadata without a signal layer");return indexes.sort((first,second)=>first-second),`z${indexes.join(",")}`},createInputGraphics=(input2,activeLayer)=>{let graphics={circles:[],rects:[],texts:[]},displayedLayers=getLayerNames(input2);activeLayer&&(displayedLayers=[activeLayer]);let visibleLayers=getGraphicsLayer3(input2,displayedLayers),connections=getCanonicalConnections(input2),layerCandidatesByConnection=getLayerCandidatesByConnection(input2),endpointRadius=Math.min(.12,input2.boundaryPointSpacing/4);for(let region of input2.regions){let center2={x:(region.bounds.minX+region.bounds.maxX)/2,y:(region.bounds.minY+region.bounds.maxY)/2};graphics.rects.push({center:center2,width:region.bounds.maxX-region.bounds.minX,height:region.bounds.maxY-region.bounds.minY,fill:"rgba(226, 232, 240, 0.035)",stroke:"rgba(71, 85, 105, 0.55)",layer:visibleLayers});for(let connection of connections){let layerCandidates=layerCandidatesByConnection[connection.id];if(activeLayer&&!layerCandidates.includes(activeLayer))continue;let endpoint=connection.endpoints.find(candidate=>candidate.regionId===region.id);if(!endpoint)continue;let color3=getConnectionColor(connection.id);graphics.circles.push({center:endpoint.position,radius:endpointRadius,fill:`${color3}70`,stroke:color3,layer:getGraphicsLayer3(input2,layerCandidates)})}graphics.texts.push({x:center2.x,y:region.bounds.maxY+.35,text:region.id,anchorSide:"bottom_center",color:"#334155",fontSize:.34,layer:visibleLayers})}return graphics},createStateGraphics=(input2,state2,activeLayer)=>{let connections=getCanonicalConnections(input2),breakoutPoints=state2.breakoutPoints.filter(point62=>!activeLayer||point62.layer===activeLayer),sharedGateSlots=new Map;for(let point62 of state2.breakoutPoints){let key=`${point62.regionId}:${point62.x.toFixed(9)}:${point62.y.toFixed(9)}`,slot=sharedGateSlots.get(key)??{x:point62.x,y:point62.y,layers:new Set};slot.layers.add(point62.layer),sharedGateSlots.set(key,slot)}return{lines:state2.referenceOrder.flatMap(connectionId=>{let connection=connections.find(candidate=>candidate.id===connectionId);if(!connection)return[];let connectionBreakouts=breakoutPoints.filter(point62=>point62.connectionId===connectionId),layer=connectionBreakouts[0]?.layer;if(!layer||activeLayer&&layer!==activeLayer)return[];if(connectionBreakouts.length!==input2.regions.length)return[];let points=input2.regions.flatMap((region,regionIndex)=>{let endpoint=connection.endpoints.find(candidate=>candidate.regionId===region.id),breakout=connectionBreakouts.find(candidate=>candidate.regionId===region.id);return!endpoint||!breakout?[]:regionIndex===0?[endpoint.position,breakout]:[breakout,endpoint.position]});return points.length<2?[]:[{points,strokeColor:`${getConnectionColor(connectionId)}55`,strokeWidth:.012,strokeDash:[.025,.07],layer:getGraphicsLayer3(input2,[layer])}]}),circles:[...sharedGateSlots.values()].flatMap(slot=>{let layers=[...slot.layers].filter(layer=>!activeLayer||layer===activeLayer);return layers.length===0?[]:[{center:slot,radius:.11,fill:"rgba(15, 23, 42, 0.06)",stroke:"#475569",layer:getGraphicsLayer3(input2,layers)}]}),points:breakoutPoints.map(point62=>({x:point62.x,y:point62.y,color:getConnectionColor(point62.connectionId),label:`${point62.connectionId} \xB7 ${point62.layer}`,layer:getGraphicsLayer3(input2,[point62.layer])}))}},createSolverPhaseVisualization=({input:input2,phase,detail,activeLayer,referenceOrder,referenceRegionId,showReferenceNumbers=!1,state:state2})=>{let inputGraphics=createInputGraphics(input2,activeLayer),stateGraphics;state2&&(stateGraphics=createStateGraphics(input2,state2,activeLayer));let displayedLayers=getLayerNames(input2);activeLayer&&(displayedLayers=[activeLayer]);let textLayer=getGraphicsLayer3(input2,displayedLayers),maxY=Math.max(...input2.regions.map(region=>region.bounds.maxY)),minX=Math.min(...input2.regions.map(region=>region.bounds.minX)),texts=[...inputGraphics.texts??[],...stateGraphics?.texts??[],{x:minX,y:maxY+1.05,text:phase,anchorSide:"bottom_left",color:"#0f172a",fontSize:.42,layer:textLayer},{x:minX,y:maxY+.68,text:detail,anchorSide:"bottom_left",color:"#475569",fontSize:.25,layer:textLayer}],referenceLines=[],referenceCircles=[];if(showReferenceNumbers&&referenceOrder){let referenceRegion=input2.regions.find(region=>region.id===referenceRegionId)??input2.regions[0],connections=getCanonicalConnections(input2),layerCandidatesByConnection=getLayerCandidatesByConnection(input2),orderedPositions=[];for(let[index2,connectionId]of referenceOrder.entries()){let connection=connections.find(candidate=>candidate.id===connectionId),layerCandidates=layerCandidatesByConnection[connectionId];if(!connection||!layerCandidates||activeLayer&&!layerCandidates.includes(activeLayer))continue;let endpoint=connection.endpoints.find(candidate=>candidate.regionId===referenceRegion.id);endpoint&&(orderedPositions.push(endpoint.position),texts.push({x:endpoint.position.x+.18,y:endpoint.position.y+.18,text:`${index2+1} \xB7 ${connectionId}`,anchorSide:"bottom_left",color:getConnectionColor(connectionId),fontSize:.21,layer:getGraphicsLayer3(input2,layerCandidates)}))}let center2={x:(referenceRegion.bounds.minX+referenceRegion.bounds.maxX)/2,y:(referenceRegion.bounds.minY+referenceRegion.bounds.maxY)/2};referenceLines.push(...orderedPositions.map(position4=>({points:[center2,position4],strokeColor:"rgba(100, 116, 139, 0.35)",strokeWidth:.01,strokeDash:[.03,.05],layer:textLayer}))),orderedPositions.length>1&&referenceLines.push({points:orderedPositions,strokeColor:"rgba(15, 23, 42, 0.65)",strokeWidth:.018,strokeDash:[.04,.04],label:`${referenceRegion.id} angular winding order`,layer:textLayer}),referenceCircles.push({center:center2,radius:.07,fill:"#0f172a",stroke:"#ffffff",label:`${referenceRegion.id} angular reference center`,layer:textLayer})}return{title:phase,coordinateSystem:"cartesian",rects:inputGraphics.rects,polygons:inputGraphics.polygons,lines:[...stateGraphics?.lines??[],...referenceLines],circles:[...inputGraphics.circles??[],...stateGraphics?.circles??[],...referenceCircles],points:stateGraphics?.points,texts}},getSharedGateSlotCount=points=>new Set(points.map(point62=>`${point62.regionId}:${point62.x.toFixed(9)}:${point62.y.toFixed(9)}`)).size,GatePlacementSolver=class extends BaseSolver{constructor(params){super();__publicField(this,"params");__publicField(this,"batchIndex",0);__publicField(this,"output");__publicField(this,"plannedPlacement");__publicField(this,"placementBatches");__publicField(this,"visibleBreakoutPoints",[]);__publicField(this,"layerByConnection");__publicField(this,"visualizationLayer");this.params=params,this.visualizationLayer=params.visualizationLayer;let assignment=assignConnectionLayers({validated:params.validated,referenceOrder:params.ordering.referenceOrder});this.layerByConnection=assignment.layerByConnection,this.placementBatches=params.validated.regions.flatMap(region=>assignment.layerNames.map(layer=>({regionId:region.id,layer}))),this.MAX_ITERATIONS=this.placementBatches.length+2}setVisualizationLayer(layer){this.visualizationLayer=layer}_step(){if(!this.plannedPlacement){this.plannedPlacement=placeBreakoutGates({regions:this.params.validated.regions,connections:this.params.validated.connections,referenceOrder:this.params.ordering.referenceOrder,layerNames:[...new Set(Object.values(this.layerByConnection))].sort((first,second)=>first.localeCompare(second)),layerByConnection:this.layerByConnection,boundaryPointSpacing:this.params.input.boundaryPointSpacing,atomicGroups:this.params.validated.atomicConnectionGroups}),this.stats={phase:"plan-gate-grid",regionLayerBatches:this.placementBatches.length,placedBreakpoints:0};return}let batch=this.placementBatches[this.batchIndex];if(batch){this.visibleBreakoutPoints.push(...this.plannedPlacement.breakoutPoints.filter(point62=>point62.regionId===batch.regionId&&point62.layer===batch.layer)),this.batchIndex+=1,this.stats={phase:"place-region-layer-batch",regionId:batch.regionId,layer:batch.layer,completedBatches:this.batchIndex,totalBatches:this.placementBatches.length,placedBreakpoints:this.visibleBreakoutPoints.length};return}this.output=this.plannedPlacement,this.stats={phase:"finalize-shared-gate-slots",placedBreakpoints:this.output.breakoutPoints.length,sharedGateSlots:getSharedGateSlotCount(this.output.breakoutPoints)},this.solved=!0}computeProgress(){let completedMicrosteps=this.batchIndex;return this.plannedPlacement&&(completedMicrosteps+=1),this.output&&(completedMicrosteps+=1),completedMicrosteps/this.MAX_ITERATIONS}getConstructorParams(){return[this.params]}getOutput(){if(!this.solved||!this.output)throw new WindingBreakoutInvariantError("WindingBreakoutSolver: gate placement requested before placement completed");return this.output}visualize(){let detail="Next microstep: derive layer offsets, atomic gate orders, and the common boundary slot grid";if(this.plannedPlacement&&this.batchIndex===0)detail=`Gate grid planned \xB7 ${this.placementBatches.length} region/layer batches remain`;else if(this.plannedPlacement&&!this.output){let latestBatch=this.placementBatches[this.batchIndex-1];detail=`Placed region \u201C${latestBatch.regionId}\u201D on layer \u201C${latestBatch.layer}\u201D \xB7 ${this.batchIndex}/${this.placementBatches.length} batches`}else if(this.output){let sharedGateSlotCount=getSharedGateSlotCount(this.output.breakoutPoints);detail=`${this.output.breakoutPoints.length} gates placed; coincident layer positions form ${sharedGateSlotCount} shared slots`}let visualizationState;if(this.plannedPlacement){let breakoutPoints=this.visibleBreakoutPoints;this.output&&(breakoutPoints=this.output.breakoutPoints),visualizationState={referenceOrder:this.params.ordering.referenceOrder,breakoutPoints}}let graphics=createSolverPhaseVisualization({input:this.params.input,activeLayer:this.visualizationLayer,phase:"Step 2 \xB7 Place boundary gates",detail,state:visualizationState}),plannedSlotGuides=(this.plannedPlacement?.breakoutPoints??[]).filter(point62=>!this.visualizationLayer||point62.layer===this.visualizationLayer).map(point62=>({center:point62,radius:.065,fill:"rgba(255, 255, 255, 0.75)",stroke:"rgba(100, 116, 139, 0.5)",label:`planned slot ${point62.regionId} \xB7 ${point62.layer}`,layer:getGraphicsLayer3(this.params.input,[point62.layer])}));return{...graphics,circles:[...graphics.circles??[],...plannedSlotGuides]}}},getNaturalWindingOrder=(region,connections)=>connections.map(connection=>{let position4=connection.endpoints.find(endpoint=>endpoint.regionId===region.id).position;return{id:connection.id,angle:Math.atan2(position4.y-region.center.y,position4.x-region.center.x),radius:Math.hypot(position4.x-region.center.x,position4.y-region.center.y)}}).sort((first,second)=>first.angle-second.angle||second.radius-first.radius||first.id.localeCompare(second.id)).map(connection=>connection.id),getReferenceWindingOrder=(naturalOrder,atomicGroups,buses)=>{let groupByConnection=new Map(atomicGroups.flatMap(group2=>group2.map(connectionId=>[connectionId,group2]))),addedGroups=new Set,result=[];for(let connectionId of naturalOrder){let group2=groupByConnection.get(connectionId);if(!group2){result.push(connectionId);continue}addedGroups.has(group2)||(addedGroups.add(group2),result.push(...naturalOrder.filter(candidate=>group2.includes(candidate))))}let busByConnection=new Map(buses.flatMap(bus=>bus.connectionIds.map(connectionId=>[connectionId,bus]))),addedBuses=new Set,busContiguousResult=[];for(let connectionId of result){let bus=busByConnection.get(connectionId);if(!bus){busContiguousResult.push(connectionId);continue}if(addedBuses.has(bus))continue;addedBuses.add(bus);let busConnectionIds=new Set(bus.connectionIds);busContiguousResult.push(...result.filter(candidate=>busConnectionIds.has(candidate)))}return busContiguousResult},ReferenceOrderingSolver=class extends BaseSolver{constructor(params){super();__publicField(this,"params");__publicField(this,"naturalOrderByRegion",{});__publicField(this,"currentRegionIndex",0);__publicField(this,"output");__publicField(this,"visualizedOrder");__publicField(this,"visualizedRegionId");__publicField(this,"visualizationLayer");this.params=params,this.visualizationLayer=params.visualizationLayer,this.MAX_ITERATIONS=params.validated.regions.length+1}setVisualizationLayer(layer){this.visualizationLayer=layer}_step(){let region=this.params.validated.regions[this.currentRegionIndex];if(region){let naturalOrder=getNaturalWindingOrder(region,this.params.validated.connections);this.naturalOrderByRegion[region.id]=naturalOrder,this.visualizedRegionId=region.id,this.visualizedOrder=naturalOrder,this.currentRegionIndex+=1,this.stats={phase:"derive-natural-order",regionId:region.id,completedRegions:this.currentRegionIndex,totalRegions:this.params.validated.regions.length,naturalOrder};return}let firstRegion=this.params.validated.regions[0],referenceOrder=getReferenceWindingOrder(this.naturalOrderByRegion[firstRegion.id],this.params.validated.atomicConnectionGroups,this.params.validated.buses);this.output={naturalOrderByRegion:this.naturalOrderByRegion,referenceOrder},this.visualizedRegionId=firstRegion.id,this.visualizedOrder=referenceOrder,this.stats={phase:"atomicize-reference-order",referenceRegion:firstRegion.id,referenceOrder},this.solved=!0}computeProgress(){let completedMicrosteps=this.currentRegionIndex;return this.output&&(completedMicrosteps+=1),completedMicrosteps/this.MAX_ITERATIONS}getConstructorParams(){return[this.params]}getOutput(){if(!this.solved||!this.output)throw new WindingBreakoutInvariantError("WindingBreakoutSolver: reference order requested before ordering completed");return this.output}visualize(){let firstRegionId=this.params.validated.regions[0].id,detail=`Next microstep: derive natural order for region \u201C${firstRegionId}\u201D`;return this.visualizedRegionId&&!this.output&&(detail=`Natural order for region \u201C${this.visualizedRegionId}\u201D \xB7 ${this.currentRegionIndex}/${this.params.validated.regions.length} regions processed`),this.output&&(detail=`Reference region \u201C${firstRegionId}\u201D finalized; buses are contiguous and differential pairs are atomic`),createSolverPhaseVisualization({input:this.params.input,activeLayer:this.visualizationLayer,phase:"Step 1 \xB7 Derive reference order",detail,referenceOrder:this.visualizedOrder,referenceRegionId:this.visualizedRegionId,showReferenceNumbers:!0})}},validateBreakoutPoints=({points,connectionIds,regions,atomicGroups})=>{let regionIds=regions.map(region=>region.id),endpointCounts=new Map,layerByConnection=new Map,connectionLayersAreValid=!0;for(let point62 of points){let key=`${point62.regionId}:${point62.connectionId}`;endpointCounts.set(key,(endpointCounts.get(key)??0)+1);let previousLayer=layerByConnection.get(point62.connectionId);previousLayer!==void 0&&previousLayer!==point62.layer&&(connectionLayersAreValid=!1),layerByConnection.set(point62.connectionId,point62.layer)}let expected=regionIds.flatMap(regionId=>connectionIds.map(connectionId=>`${regionId}:${connectionId}`)),endpointsAreValid=endpointCounts.size===expected.length&&expected.every(endpoint=>endpointCounts.get(endpoint)===1),atomicGroupsAreValid=atomicGroups.every(group2=>{let layer=layerByConnection.get(group2[0]);return!layer||group2.some(connectionId=>layerByConnection.get(connectionId)!==layer)?!1:regions.every(region=>{let layerPoints=points.filter(point62=>point62.regionId===region.id&&point62.layer===layer),vertical=region.edge==="left"||region.edge==="right",orderedConnectionIds=[...layerPoints].sort((first,second)=>vertical?first.y-second.y:first.x-second.x).map(point62=>point62.connectionId),firstIndex=orderedConnectionIds.indexOf(group2[0]),secondIndex=orderedConnectionIds.indexOf(group2[1]);return firstIndex!==-1&&secondIndex!==-1&&Math.abs(firstIndex-secondIndex)===1})});return endpointsAreValid&&connectionLayersAreValid&&atomicGroupsAreValid},finalizeWindingBreakoutOutput=({validated,placement})=>{if(!validateBreakoutPoints({points:placement.breakoutPoints,connectionIds:validated.connections.map(connection=>connection.id),regions:validated.regions,atomicGroups:validated.atomicConnectionGroups}))throw new WindingBreakoutInvariantError("WindingBreakoutSolver: generated invalid breakout points");return{breakoutPoints:placement.breakoutPoints}},PIPELINE_STAGE_NAMES=["referenceOrdering","gatePlacement"],WindingBreakoutSolver=class extends BasePipelineSolver{constructor(input2){super(input2);__publicField(this,"validatedInput");__publicField(this,"output");__publicField(this,"visualizationLayer");__publicField(this,"pipelineDef",[definePipelineStep("referenceOrdering",ReferenceOrderingSolver,pipeline=>[{input:pipeline.inputProblem,validated:pipeline.getValidatedInput(),visualizationLayer:pipeline.visualizationLayer}]),definePipelineStep("gatePlacement",GatePlacementSolver,pipeline=>[{input:pipeline.inputProblem,validated:pipeline.getValidatedInput(),ordering:pipeline.getRequiredStageOutput("referenceOrdering"),visualizationLayer:pipeline.visualizationLayer}])])}_setup(){this.validatedInput=validateWindingBreakoutInput(this.inputProblem),this.stats={phase:"setup-input-validation",regionCount:this.validatedInput.regions.length,connectionCount:this.validatedInput.connections.length,layerCount:this.validatedInput.layerNames.length}}getValidatedInput(){if(!this.validatedInput)throw new Error("WindingBreakoutSolver: input has not been validated");return this.validatedInput}_step(){super._step(),!this.output&&!this.activeSubSolver&&this.currentPipelineStageIndex>=this.pipelineDef.length&&(this.output=finalizeWindingBreakoutOutput({validated:this.getValidatedInput(),placement:this.getRequiredStageOutput("gatePlacement")}),this.solved=!0),this.stats={phase:this.getCurrentStageName(),completedStages:this.currentPipelineStageIndex,totalStages:this.pipelineDef.length},this.solved&&(this.stats.phase="finalize-output-validation"),this.output&&(this.stats.valid=!0,this.stats.breakoutPointCount=this.output.breakoutPoints.length)}getRequiredStageOutput(stageName){let output=this.getStageOutput(stageName);if(output===void 0)throw new Error(`WindingBreakoutSolver: pipeline stage \u201C${stageName}\u201D has no output`);return output}setVisualizationLayer(layer){this.visualizationLayer=layer;for(let stageName of PIPELINE_STAGE_NAMES){let solver=this.getSolver(stageName);solver&&"setVisualizationLayer"in solver&&solver.setVisualizationLayer(layer)}}getConstructorParams(){return[this.inputProblem]}getOutput(){if(!this.solved||!this.output)throw new WindingBreakoutOutputUnavailableError("WindingBreakoutSolver: getOutput() called before successful completion");return this.output}initialVisualize(){return createSolverPhaseVisualization({input:this.inputProblem,activeLayer:this.visualizationLayer,phase:"Input \xB7 Validated during setup",detail:"Region bounds, breakout edges, bus layer preferences, and canonical endpoints"})}finalVisualize(){if(!this.output)return null;let ordering=this.getRequiredStageOutput("referenceOrdering");return createSolverPhaseVisualization({input:this.inputProblem,activeLayer:this.visualizationLayer,phase:"Output \xB7 Validated after gate placement",detail:"Valid: one bus-constrained breakout point per connection and region; pairs are adjacent",state:{referenceOrder:ordering.referenceOrder,breakoutPoints:this.output.breakoutPoints}})}visualize(){return{...super.visualize(),title:"Winding breakout solver \xB7 step-by-step pipeline",coordinateSystem:"cartesian"}}},toWindingConnection=connection=>({id:connection.connectionId,endpoints:connection.endpoints}),defaultImplicitBreakoutPointSolverFn=input2=>{let windingInput={regions:input2.regions.map(region=>({id:region.regionId,bounds:region.bounds,edge:region.edge})),connections:input2.connections.map(connection=>"type"in connection?{type:"differential",connections:connection.connections.map(toWindingConnection)}:toWindingConnection(connection)),buses:input2.buses.map(bus=>({id:bus.busId,connectionIds:bus.connectionIds,preferredLayers:bus.targetLayers})),boundaryPointSpacing:input2.boundaryPointSpacing},solver=new WindingBreakoutSolver(windingInput);return solver.solve(),solver.getOutput()},getFanoutBounds=pcbGroup=>{let outlineBounds=pcbGroup.outline?getBoundsFromPoints(pcbGroup.outline):null,width=pcbGroup.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),height=pcbGroup.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0);return width===void 0||height===void 0?null:{minX:pcbGroup.center.x-width/2,maxX:pcbGroup.center.x+width/2,minY:pcbGroup.center.y-height/2,maxY:pcbGroup.center.y+height/2}},getAxisGap2=(firstMin,firstMax,secondMin,secondMax)=>Math.max(firstMin-secondMax,secondMin-firstMax,0),Breakout_doInitialPcbPlacementDesignRuleChecks=breakout=>{if(breakout.root?.pcbDisabled||!breakout.pcb_group_id)return;let root=breakout.root;if(!root)return;let siblingFanouts=breakout.parent?.children.filter(sibling=>sibling instanceof breakout.constructor);if(!siblingFanouts)return;let breakoutIndex=siblingFanouts.indexOf(breakout);if(breakoutIndex<0)return;let{db:db22}=root,pcbGroup=db22.pcb_group.get(breakout.pcb_group_id);if(!pcbGroup)return;let bounds=getFanoutBounds(pcbGroup);if(bounds)for(let otherFanout of siblingFanouts.slice(breakoutIndex+1)){if(!otherFanout.pcb_group_id)continue;let otherPcbGroup=db22.pcb_group.get(otherFanout.pcb_group_id);if(!otherPcbGroup)continue;let otherBounds=getFanoutBounds(otherPcbGroup);if(!otherBounds)continue;let breakoutMargin=breakout._parsedProps.fanoutMargin,otherFanoutMargin=otherFanout._parsedProps.fanoutMargin,requiredMargin=Math.max(typeof breakoutMargin=="number"?breakoutMargin:0,typeof otherFanoutMargin=="number"?otherFanoutMargin:0),horizontalGap=getAxisGap2(bounds.minX,bounds.maxX,otherBounds.minX,otherBounds.maxX),verticalGap=getAxisGap2(bounds.minY,bounds.maxY,otherBounds.minY,otherBounds.maxY),horizontalOverlap=Math.min(bounds.maxX,otherBounds.maxX)-Math.max(bounds.minX,otherBounds.minX),verticalOverlap=Math.min(bounds.maxY,otherBounds.maxY)-Math.max(bounds.minY,otherBounds.minY),boundariesOverlap=horizontalOverlap>0&&verticalOverlap>0,violatesMargin=requiredMargin>0&&horizontalGap<requiredMargin&&verticalGap<requiredMargin;if(!boundariesOverlap&&!violatesMargin)continue;let message=boundariesOverlap?`Fanout boundaries "${breakout.name}" and "${otherFanout.name}" overlap. Fanout boundaries may not overlap.`:`Fanout boundaries "${breakout.name}" and "${otherFanout.name}" do not maintain the required ${requiredMargin}mm fanoutMargin.`;db22.pcb_placement_error.list().some(error2=>error2.message===message)||db22.pcb_placement_error.insert({error_type:"pcb_placement_error",message,subcircuit_id:breakout.subcircuit_id??void 0})}},reportWindingBreakoutInfeasibleError=(breakout,error2)=>{if(!(error2 instanceof WindingBreakoutInfeasibleError)||!breakout.root||!breakout.pcb_group_id)return!1;let componentNames=breakout.root.db.pcb_component.list().filter(pcbComponent=>pcbComponent.pcb_group_id===breakout.pcb_group_id).map(pcbComponent=>pcbComponent.source_component_id?breakout.root.db.source_component.get(pcbComponent.source_component_id)?.name:void 0).filter(name=>!!name);return breakout.root.db.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouting_error_winding_breakout_${breakout.pcb_group_id}`,error_type:"pcb_autorouting_error",message:`Winding fanout failed for ${componentNames.join(", ")||breakout.name}: ${error2.message}. The connections could not escape to the breakout boundary. Give the fanout more room by increasing the breakout's padding, or by extending the breakout to include the parts crowding it (decoupling capacitors, series resistors).`}),!0},getRoutingScopeOrThrow=breakout=>{let routingScope=breakout.parent;if(!routingScope?.selectAll)throw new Error(`Automatic breakout "${breakout.name}" has no coordinated routing scope`);return routingScope},getAutomaticBreakouts=(routingScope,breakoutToSolve)=>{let automaticBreakouts=[];for(let group2 of routingScope.selectAll("group")){if(!group2.isRoutingDirective||group2.parent!==routingScope)continue;let breakout=group2;breakout.children.some(child=>child instanceof AutoplacedBreakoutPoint)&&automaticBreakouts.push(breakout)}let getSourceTraceIds=breakout=>new Set(collectBreakoutRegionGeometry(breakout).endpointBySourceTraceId.keys()),sourceTraceIdsToSolve=getSourceTraceIds(breakoutToSolve);return automaticBreakouts.filter(automaticBreakout=>{let automaticBreakoutSourceTraceIds=getSourceTraceIds(automaticBreakout);return automaticBreakoutSourceTraceIds.size===sourceTraceIdsToSolve.size&&[...sourceTraceIdsToSolve].every(sourceTraceId=>automaticBreakoutSourceTraceIds.has(sourceTraceId))})},collectBreakoutRegionGeometry=breakout=>{if(!breakout.root||!breakout.pcb_group_id)throw new Error(`Automatic breakout "${breakout.name}" has no PCB region`);let pcbGroup=breakout.root.db.pcb_group.get(breakout.pcb_group_id);if(!pcbGroup||!pcbGroup.width||!pcbGroup.height)throw new Error(`Automatic breakout "${breakout.name}" has invalid PCB region bounds`);let bounds={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},center2={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},endpointBySourceTraceId=new Map,sourcePortIdBySourceTraceId=new Map;for(let breakoutPoint of breakout.children.filter(child=>child instanceof AutoplacedBreakoutPoint)){let matchedPort=breakoutPoint.matchedPort;if(!matchedPort?.pcb_port_id||!matchedPort.source_port_id)throw new Error(`Automatic breakout "${breakout.name}" is missing a PCB endpoint`);let sourceTraceId=breakoutPoint.matchedSourceTraceId;if(!sourceTraceId){let matchingSourceTraces=breakout.root.db.source_trace.list().filter(sourceTrace=>sourceTrace.connected_source_port_ids.includes(matchedPort.source_port_id));if(matchingSourceTraces.length===0)throw new Error(`Automatic breakout "${breakout.name}" has a point without a source trace identity`);let boundaryCrossingSourceTraces=matchingSourceTraces.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>{if(sourcePortId===matchedPort.source_port_id)return!1;let pcbPort2=breakout.root.db.pcb_port.getWhere({source_port_id:sourcePortId});return!pcbPort2||pcbPort2.pcb_group_id===breakout.pcb_group_id?!1:!(pcbPort2.x>=bounds.minX&&pcbPort2.x<=bounds.maxX&&pcbPort2.y>=bounds.minY&&pcbPort2.y<=bounds.maxY)}));sourceTraceId=(boundaryCrossingSourceTraces.length>0?boundaryCrossingSourceTraces:matchingSourceTraces).slice().sort((first,second)=>first.source_trace_id.localeCompare(second.source_trace_id))[0].source_trace_id,breakoutPoint.matchedSourceTraceId=sourceTraceId}if(endpointBySourceTraceId.has(sourceTraceId))throw new Error(`Connection "${sourceTraceId}" has duplicate endpoint for region "${breakout.pcb_group_id}"`);let pcbPort=breakout.root.db.pcb_port.get(matchedPort.pcb_port_id);if(!pcbPort)throw new Error(`Connection "${sourceTraceId}" references unknown PCB endpoint "${matchedPort.pcb_port_id}"`);if(pcbPort.pcb_group_id!==breakout.pcb_group_id)throw new Error(`Connection "${sourceTraceId}" endpoint references unknown region "${pcbPort.pcb_group_id??"unassigned"}" instead of "${breakout.pcb_group_id}"`);if(pcbPort.x===void 0||pcbPort.y===void 0)throw new Error(`Connection "${sourceTraceId}" is missing endpoint coordinates for region "${breakout.pcb_group_id}"`);endpointBySourceTraceId.set(sourceTraceId,{regionId:breakout.pcb_group_id,position:{x:pcbPort.x,y:pcbPort.y}}),sourcePortIdBySourceTraceId.set(sourceTraceId,matchedPort.source_port_id)}return{breakout,pcbGroupId:breakout.pcb_group_id,bounds,center:center2,endpointBySourceTraceId,sourcePortIdBySourceTraceId}},sortRegionsByPlacement=regions=>{let xCoordinates=regions.map(region=>region.center.x),yCoordinates=regions.map(region=>region.center.y),xSpan=Math.max(...xCoordinates)-Math.min(...xCoordinates),ySpan=Math.max(...yCoordinates)-Math.min(...yCoordinates),horizontalPlacement=xSpan>=ySpan;return regions.sort((firstRegion,secondRegion)=>{if(horizontalPlacement){let xDifference=firstRegion.center.x-secondRegion.center.x;if(xDifference!==0)return xDifference;let yDifference=firstRegion.center.y-secondRegion.center.y;if(yDifference!==0)return yDifference}else{let yDifference=firstRegion.center.y-secondRegion.center.y;if(yDifference!==0)return yDifference;let xDifference=firstRegion.center.x-secondRegion.center.x;if(xDifference!==0)return xDifference}return firstRegion.breakout.name.localeCompare(secondRegion.breakout.name)}),{regions,horizontalPlacement}},getFacingEdge=({region,regionIndex,regions,horizontalPlacement,singleRegionPreferredEdge})=>{if(regions.length===1&&singleRegionPreferredEdge)return singleRegionPreferredEdge;let otherRegions=regions.filter(candidate=>candidate!==region),otherCenter=otherRegions.reduce((sum,candidate)=>({x:sum.x+candidate.center.x/otherRegions.length,y:sum.y+candidate.center.y/otherRegions.length}),{x:0,y:0});return horizontalPlacement?otherCenter.x>region.center.x?"right":otherCenter.x<region.center.x?"left":regionIndex<regions.length/2?"right":"left":otherCenter.y>region.center.y?"top":otherCenter.y<region.center.y?"bottom":regionIndex<regions.length/2?"top":"bottom"},getSingleRegionPreferredEdge=({region,sourceTraces})=>{let root=region.breakout.root;if(!root)return;let internalSourcePortIds=new Set(region.sourcePortIdBySourceTraceId.values()),externalPcbPorts=new Map;for(let sourceTrace of sourceTraces)if(sourceTrace.connected_source_port_ids.some(sourcePortId=>internalSourcePortIds.has(sourcePortId)))for(let sourcePortId of sourceTrace.connected_source_port_ids){if(internalSourcePortIds.has(sourcePortId))continue;let pcbPort=root.db.pcb_port.getWhere({source_port_id:sourcePortId});!pcbPort?.pcb_port_id||pcbPort.x===void 0||pcbPort.y===void 0||pcbPort.x>=region.bounds.minX&&pcbPort.x<=region.bounds.maxX&&pcbPort.y>=region.bounds.minY&&pcbPort.y<=region.bounds.maxY||externalPcbPorts.set(pcbPort.pcb_port_id,{x:pcbPort.x,y:pcbPort.y})}if(externalPcbPorts.size===0)return;let distanceToEdge=(target,edge)=>{let edgePoint=edge==="left"||edge==="right"?{x:edge==="left"?region.bounds.minX:region.bounds.maxX,y:Math.max(region.bounds.minY,Math.min(region.bounds.maxY,target.y))}:{x:Math.max(region.bounds.minX,Math.min(region.bounds.maxX,target.x)),y:edge==="bottom"?region.bounds.minY:region.bounds.maxY};return Math.hypot(target.x-edgePoint.x,target.y-edgePoint.y)},edges=["right","left","top","bottom"];return edges.reduce((bestEdge,edge)=>{let bestCost=[...externalPcbPorts.values()].reduce((sum,target)=>sum+distanceToEdge(target,bestEdge),0);return[...externalPcbPorts.values()].reduce((sum,target)=>sum+distanceToEdge(target,edge),0)<bestCost?edge:bestEdge},edges[0])},getSourceTraceForConnectionOrThrow=({connectionOwner,connectionOwnerLabel,connectionSelector,sourceTraces})=>{let matchingSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.name===connectionSelector);if(matchingSourceTraces.length===0){let selectedPort=connectionOwner.getSubcircuit().selectOne(connectionSelector,{type:"port"});selectedPort?.source_port_id&&(matchingSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.connected_source_port_ids.includes(selectedPort.source_port_id)))}if(matchingSourceTraces.length===0)throw new Error(`Could not resolve "${connectionSelector}" in ${connectionOwnerLabel}`);if(matchingSourceTraces.length>1)throw new Error(`Connection "${connectionSelector}" resolves to multiple source traces in ${connectionOwnerLabel}`);return matchingSourceTraces[0]},getImplicitBreakoutSolverBuses=({routingScope,sourceTraces,coordinatedSourceTraceIds,availableLayers})=>{let solverBuses=[],subcircuitId=routingScope.getSubcircuit().subcircuit_id;for(let bus of routingScope.selectAll("bus")){if(bus.getSubcircuit().subcircuit_id!==subcircuitId)continue;let connectionIds=[];for(let connectionSelector of bus._parsedProps.connections){let sourceTrace=getSourceTraceForConnectionOrThrow({connectionOwner:bus,connectionOwnerLabel:`bus "${bus.name}"`,connectionSelector,sourceTraces});coordinatedSourceTraceIds.has(sourceTrace.source_trace_id)&&connectionIds.push(sourceTrace.source_trace_id)}if(connectionIds.length===0)continue;let solverBus={busId:bus.name,connectionIds};if(bus._parsedProps.preferredLayer!==void 0)solverBus={...solverBus,targetLayers:[bus._parsedProps.preferredLayer]};else if(bus._parsedProps.preferredLayers!==void 0)solverBus={...solverBus,targetLayers:bus._parsedProps.preferredLayers};else{let targetLayers=bus._parsedProps.pcbAllowedLayers??availableLayers;solverBus={...solverBus,targetLayers:[...new Set(targetLayers)]}}solverBuses.push(solverBus)}return solverBuses},getDifferentialPairSourceTraces=({routingScope,sourceTraces})=>{let subcircuitId=routingScope.getSubcircuit().subcircuit_id,pairs32=[];for(let differentialPair of routingScope.selectAll("differentialpair")){if(differentialPair.getSubcircuit().subcircuit_id!==subcircuitId)continue;let positiveSourceTrace=getSourceTraceForConnectionOrThrow({connectionOwner:differentialPair,connectionOwnerLabel:`differential pair "${differentialPair.name}"`,connectionSelector:differentialPair._parsedProps.positiveConnection,sourceTraces}),negativeSourceTrace=getSourceTraceForConnectionOrThrow({connectionOwner:differentialPair,connectionOwnerLabel:`differential pair "${differentialPair.name}"`,connectionSelector:differentialPair._parsedProps.negativeConnection,sourceTraces});pairs32.push({differentialPair,positiveSourceTraceId:positiveSourceTrace.source_trace_id,negativeSourceTraceId:negativeSourceTrace.source_trace_id})}return pairs32},getBoundaryPointSpacing=breakout=>{let board=breakout.root?.db.pcb_board.list()[0],traceWidth=board?.min_trace_width??.15,traceToPadClearance=board?.min_trace_to_pad_edge_clearance??.2,viaPadDiameter=board?.min_via_pad_diameter??.3;return getFanoutBoundaryPointSpacing({traceWidth,traceToPadClearance,viaPadDiameter})},getCoordinatedFanoutLayers=({routingScope,automaticBreakouts})=>{let coordinatedLayers=getBoardAvailableLayers(routingScope._getSubcircuitLayerCount());for(let automaticBreakout of automaticBreakouts){let fanoutRoutingLayers=automaticBreakout._parsedProps.fanoutRoutingLayers?.map(String);if(!fanoutRoutingLayers)continue;let fanoutLayerSet=new Set(fanoutRoutingLayers);coordinatedLayers=coordinatedLayers.filter(layer=>fanoutLayerSet.has(layer))}if(coordinatedLayers.length===0)throw new Error(`Automatic breakouts in routing scope "${routingScope.name}" have no shared fanout routing layer`);return coordinatedLayers},createImplicitBreakoutPointSolverContext=breakout=>{if(!breakout.root)throw new Error(`Automatic breakout "${breakout.name}" has no circuit root`);let routingScope=getRoutingScopeOrThrow(breakout),automaticBreakouts=getAutomaticBreakouts(routingScope,breakout),regionIds=new Set,collectedRegions=automaticBreakouts.map(automaticBreakout=>{let region=collectBreakoutRegionGeometry(automaticBreakout);if(regionIds.has(region.pcbGroupId))throw new Error(`Duplicate automatic breakout region "${region.pcbGroupId}"`);return regionIds.add(region.pcbGroupId),region}),{regions,horizontalPlacement}=sortRegionsByPlacement(collectedRegions),sourceTraceIds=new Set;for(let region of regions)for(let sourceTraceId of region.endpointBySourceTraceId.keys())sourceTraceIds.add(sourceTraceId);let sourceTraces=breakout.root.db.source_trace.list().filter(sourceTrace=>sourceTrace.subcircuit_id===routingScope.getSubcircuit().subcircuit_id),sourceTraceById=new Map;for(let sourceTrace of sourceTraces){if(sourceTraceById.has(sourceTrace.source_trace_id))throw new Error(`Duplicate connection identity "${sourceTrace.source_trace_id}"`);sourceTraceById.set(sourceTrace.source_trace_id,sourceTrace)}let sortedSourceTraceIds=[...sourceTraceIds].sort((firstSourceTraceId,secondSourceTraceId)=>{let firstName=sourceTraceById.get(firstSourceTraceId)?.name??firstSourceTraceId,secondName=sourceTraceById.get(secondSourceTraceId)?.name??secondSourceTraceId,nameDifference=firstName.localeCompare(secondName);return nameDifference!==0?nameDifference:firstSourceTraceId.localeCompare(secondSourceTraceId)});for(let sourceTraceId of sortedSourceTraceIds){if(!sourceTraceById.has(sourceTraceId))throw new Error(`Unknown connection identity "${sourceTraceId}"`);for(let region of regions)if(!region.endpointBySourceTraceId.has(sourceTraceId))throw new Error(`Connection "${sourceTraceId}" is missing endpoint for region "${region.pcbGroupId}"`)}let buses=getImplicitBreakoutSolverBuses({routingScope,sourceTraces,coordinatedSourceTraceIds:sourceTraceIds,availableLayers:getCoordinatedFanoutLayers({routingScope,automaticBreakouts})}),endpointsBySourceTraceId=new Map;for(let sourceTraceId of sortedSourceTraceIds)endpointsBySourceTraceId.set(sourceTraceId,regions.map(region=>region.endpointBySourceTraceId.get(sourceTraceId)));let differentialPairBySourceTraceId=new Map;for(let pair of getDifferentialPairSourceTraces({routingScope,sourceTraces})){let positiveIsCoordinated=sourceTraceIds.has(pair.positiveSourceTraceId),negativeIsCoordinated=sourceTraceIds.has(pair.negativeSourceTraceId);if(positiveIsCoordinated!==negativeIsCoordinated)throw new Error(`Differential pair "${pair.differentialPair.name}" is missing one coordinated member`);if(positiveIsCoordinated){if(differentialPairBySourceTraceId.has(pair.positiveSourceTraceId)||differentialPairBySourceTraceId.has(pair.negativeSourceTraceId))throw new Error("A connection belongs to multiple differential pairs");differentialPairBySourceTraceId.set(pair.positiveSourceTraceId,pair),differentialPairBySourceTraceId.set(pair.negativeSourceTraceId,pair)}}let connections=[],addedDifferentialPairs=new Set;for(let sourceTraceId of sortedSourceTraceIds){let differentialPair=differentialPairBySourceTraceId.get(sourceTraceId);if(!differentialPair){connections.push({connectionId:sourceTraceId,endpoints:endpointsBySourceTraceId.get(sourceTraceId)});continue}addedDifferentialPairs.has(differentialPair.differentialPair)||(addedDifferentialPairs.add(differentialPair.differentialPair),connections.push({type:"differential",connections:[{connectionId:differentialPair.positiveSourceTraceId,endpoints:endpointsBySourceTraceId.get(differentialPair.positiveSourceTraceId)},{connectionId:differentialPair.negativeSourceTraceId,endpoints:endpointsBySourceTraceId.get(differentialPair.negativeSourceTraceId)}]}))}let sourcePortIdByConnectionIdByRegionId=new Map,singleRegionPreferredEdge=regions.length===1?getSingleRegionPreferredEdge({region:regions[0],sourceTraces}):void 0;return{input:{regions:regions.map((region,regionIndex)=>(sourcePortIdByConnectionIdByRegionId.set(region.pcbGroupId,region.sourcePortIdBySourceTraceId),{regionId:region.pcbGroupId,bounds:region.bounds,edge:getFacingEdge({region,regionIndex,regions,horizontalPlacement,singleRegionPreferredEdge})})),connections,buses,boundaryPointSpacing:getBoundaryPointSpacing(breakout)},sourcePortIdByConnectionIdByRegionId}},cachedSolutionsByRoutingScope=new WeakMap,solveScope=(breakout,solverFn)=>{let context=createImplicitBreakoutPointSolverContext(breakout),output=solverFn(context.input);if(output instanceof Promise)throw new Error("Implicit breakout point solvers must return synchronously during PCB layout");let expectedConnectionCount=0;for(let connection of context.input.connections){if("type"in connection){expectedConnectionCount+=connection.connections.length;continue}expectedConnectionCount+=1}let breakoutPointsByRegionId=new Map,outputPointKeys=new Set;for(let region of context.input.regions)breakoutPointsByRegionId.set(region.regionId,[]);for(let breakoutPoint of output.breakoutPoints){let regionBreakoutPoints=breakoutPointsByRegionId.get(breakoutPoint.regionId);if(!regionBreakoutPoints)throw new Error(`Implicit breakout point solver returned unknown region "${breakoutPoint.regionId}"`);let outputPointKey=`${breakoutPoint.regionId}:${breakoutPoint.connectionId}`;if(outputPointKeys.has(outputPointKey))throw new Error(`Implicit breakout point solver returned duplicate endpoint for connection "${breakoutPoint.connectionId}" in region "${breakoutPoint.regionId}"`);outputPointKeys.add(outputPointKey);let sourcePortId=context.sourcePortIdByConnectionIdByRegionId.get(breakoutPoint.regionId)?.get(breakoutPoint.connectionId);if(!sourcePortId)throw new Error(`Implicit breakout point solver returned unknown connection "${breakoutPoint.connectionId}" for region "${breakoutPoint.regionId}"`);regionBreakoutPoints.push({sourcePortId,sourceTraceId:breakoutPoint.connectionId,layer:breakoutPoint.layer,x:breakoutPoint.x,y:breakoutPoint.y})}for(let[regionId,regionBreakoutPoints]of breakoutPointsByRegionId)if(regionBreakoutPoints.length!==expectedConnectionCount)throw new Error(`Implicit breakout point solver output is missing endpoints for region "${regionId}"`);return{breakoutPointsByRegionId}},solveImplicitBreakoutPoints=(breakout,solverFn)=>{let routingScope=breakout.parent;if(!routingScope||!breakout.pcb_group_id)throw new Error(`Automatic breakout "${breakout.name}" has no coordinated PCB region`);let cachedSolutions=cachedSolutionsByRoutingScope.get(routingScope);(!cachedSolutions||cachedSolutions.solverFn!==solverFn)&&(cachedSolutions={solverFn,solutions:[]},cachedSolutionsByRoutingScope.set(routingScope,cachedSolutions));let solution2=cachedSolutions.solutions.find(candidateSolution=>candidateSolution.breakoutPointsByRegionId.has(breakout.pcb_group_id));solution2||(solution2=solveScope(breakout,solverFn),cachedSolutions.solutions.push(solution2));let breakoutPoints=solution2.breakoutPointsByRegionId.get(breakout.pcb_group_id);if(!breakoutPoints)throw new Error(`Automatic breakout "${breakout.name}" references unknown implicit-breakout region "${breakout.pcb_group_id}"`);return breakoutPoints},Breakout=class extends Group5{get isDogboneFanout(){let autorouter=this._parsedProps.autorouter;return(typeof autorouter=="string"?autorouter:autorouter?.preset)==="dogbone"}get isRoutingDirective(){return!0}get config(){return{...super.config,zodProps:breakoutProps}}doInitialCreateAutoplacedBreakoutPoints(){for(let path of this._parsedProps.pcbTracePaths??[]){let exit=path.route.at(-1),point62=new SavedFanoutPoint({connection:path.connection,pcbX:exit.x,pcbY:exit.y});if(point62.exitLayer=exit.route_type==="wire"?exit.layer:exit.to_layer,this.add(point62),point62._matchConnection(),!point62.matchedPort||!this.selectAll("port").includes(point62.matchedPort))throw new Error(`Fanout trace path "${path.connection}" must select a port inside the fanout`);if(this.children.some(child=>!(child instanceof BreakoutPoint)||child===point62?!1:(child._matchConnection(),child.matchedPort===point62.matchedPort)))throw new Error(`Duplicate fanout exit for "${path.connection}"`)}let portsInBreakout=this.selectAll("port"),breakoutPortSet=new Set(portsInBreakout),manualBreakoutPoints=this.children.filter(c23=>c23 instanceof BreakoutPoint),manuallyMappedPorts=new Set(manualBreakoutPoints.map(bp22=>(bp22._matchConnection(),bp22.matchedPort)).filter(Boolean)),allTraces=this.getSubcircuit().selectAll("trace"),autoPlacedPorts=new Set;for(let trace of allTraces){let result=trace._findConnectedPorts();if(!(!result.allPortsFound||!result.ports))for(let port of result.ports){let isInside=breakoutPortSet.has(port),hasOutsidePort=result.ports.some(p23=>!breakoutPortSet.has(p23));if(!isInside||!hasOutsidePort&&!this.isDogboneFanout||manuallyMappedPorts.has(port)||autoPlacedPorts.has(port))continue;autoPlacedPorts.add(port);let breakoutPoint=new AutoplacedBreakoutPoint({});breakoutPoint.matchedPort=port,breakoutPoint.matchedSourceTraceId=trace.source_trace_id,this.add(breakoutPoint)}}}doInitialPcbAutoplaceBreakoutPoints(){if(this.root?.pcbDisabled)return;if(this.isDogboneFanout&&this._parsedProps.pcbTracePaths===void 0){for(let point62 of this.children){if(!(point62 instanceof AutoplacedBreakoutPoint))continue;let port=this.root.db.pcb_port.get(point62.matchedPort.pcb_port_id);point62._applySolvedBreakoutPoint({sourceTraceId:point62.matchedSourceTraceId,layer:port.layers[0],position:port})}return}let ownAutorouter=this.props.autorouter,inheritedAutorouter=ownAutorouter===void 0?this.parent?.getInheritedProperty("autorouter"):void 0,implicitBreakoutPointSolverFn=typeof ownAutorouter=="object"?ownAutorouter.implicitBreakoutPointSolverFn:typeof inheritedAutorouter=="object"?inheritedAutorouter.implicitBreakoutPointSolverFn:void 0,autoBreakoutPoints=this.children.filter(child=>child instanceof AutoplacedBreakoutPoint);if(autoBreakoutPoints.length===0||!this.root||!this.pcb_group_id)return;let pcbGroup=this.root.db.pcb_group.get(this.pcb_group_id);if(!pcbGroup?.width||!pcbGroup.height)return;let bounds={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},solvedBreakoutPoints;try{solvedBreakoutPoints=solveImplicitBreakoutPoints(this,implicitBreakoutPointSolverFn??defaultImplicitBreakoutPointSolverFn)}catch(error2){if(implicitBreakoutPointSolverFn||!reportWindingBreakoutInfeasibleError(this,error2))throw error2;return}let BOUNDARY_INSET_MM=1e-4,insetWithinBounds=(x23,y23)=>({x:Math.max(bounds.minX+BOUNDARY_INSET_MM,Math.min(bounds.maxX-BOUNDARY_INSET_MM,x23)),y:Math.max(bounds.minY+BOUNDARY_INSET_MM,Math.min(bounds.maxY-BOUNDARY_INSET_MM,y23))});for(let solvedPoint of solvedBreakoutPoints){let matchingBreakoutPoint=autoBreakoutPoints.find(child=>child.matchedPort?.source_port_id===solvedPoint.sourcePortId);if(matchingBreakoutPoint){let insetPoint=insetWithinBounds(solvedPoint.x,solvedPoint.y);matchingBreakoutPoint._applySolvedBreakoutPoint({sourceTraceId:solvedPoint.sourceTraceId,layer:solvedPoint.layer,position:insetPoint})}}}doInitialPcbPrimitiveRender(){super.doInitialPcbPrimitiveRender()}doInitialPcbPlacementDesignRuleChecks(){Breakout_doInitialPcbPlacementDesignRuleChecks(this)}},SilkscreenGraphic=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_graphic_id",null);__publicField(this,"pcb_silkscreen_graphic_ids",[]);__publicField(this,"pcb_silkscreen_path_ids",[]);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenGraphic",zodProps:silkscreenGraphicProps}}doInitialPcbPrimitiveRender(){this.root?.pcbDisabled||this._queueAsyncEffect("SilkscreenGraphicRender",async()=>{if(this.root?.pcbDisabled)return;let{db:db22}=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 SilkscreenGraphic. Must be "top" or "bottom".`);let sourceImage=await loadImageSource(props.imageUrl);if(sourceImage.mimetype!==SVG_MIMETYPE&&sourceImage.mimetype!==PNG_MIMETYPE)throw new Error(`Unsupported imageUrl for SilkscreenGraphic: "${props.imageUrl}". Expected an SVG or PNG image.`);let imageAsset={project_relative_path:sourceImage.projectRelativePath,url:sourceImage.dataUrl,mimetype:sourceImage.mimetype},brepShapes=sourceImage.mimetype===SVG_MIMETYPE?getSvgBRepShapes({svg:sourceImage.text,width:props.width,height:props.height,transform:this._computePcbGlobalTransformBeforeLayout()}):[this.getPlacementBoxBRepShape()],pcbComponentId=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??"";for(let brepShape of brepShapes){let graphic=db22.insert({type:"pcb_silkscreen_graphic",pcb_component_id:pcbComponentId,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,layer,shape:"brep",brep_shape:brepShape,image_asset:imageAsset});this.pcb_silkscreen_graphic_ids.push(graphic.pcb_silkscreen_graphic_id)}this.pcb_silkscreen_graphic_id=this.pcb_silkscreen_graphic_ids[0]??null,sourceImage.mimetype===SVG_MIMETYPE&&this.insertRenderableSilkscreenPaths(sourceImage.text,layer)})}insertRenderableSilkscreenPaths(svg,layer){let{db:db22}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??"";for(let route2 of getTransformedSvgPathRoutes({svg,width:props.width,height:props.height,transform:transform7})){if(route2.length<2)continue;let path=db22.pcb_silkscreen_path.insert({pcb_component_id,layer,route:route2,stroke_width:Math.max(Math.min(props.width,props.height)/60,.05),subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_ids.push(path.pcb_silkscreen_path_id)}}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}getPlacementBoxBRepShape(){let{_parsedProps:props}=this,halfWidth=props.width/2,halfHeight=props.height/2,transform7=this._computePcbGlobalTransformBeforeLayout();return{outer_ring:{vertices:ensureClockwise([{x:-halfWidth,y:halfHeight},{x:halfWidth,y:halfHeight},{x:halfWidth,y:-halfHeight},{x:-halfWidth,y:-halfHeight}]).map(point62=>applyToPoint2(transform7,point62))},inner_rings:[]}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,moveVertex=vertex=>({...vertex,x:vertex.x+deltaX,y:vertex.y+deltaY});for(let graphicId of this.pcb_silkscreen_graphic_ids){let graphic=db22.pcb_silkscreen_graphic.get(graphicId);graphic&&db22.pcb_silkscreen_graphic.update(graphicId,{brep_shape:{outer_ring:{vertices:graphic.brep_shape.outer_ring.vertices.map(moveVertex)},inner_rings:graphic.brep_shape.inner_rings.map(ring4=>({vertices:ring4.vertices.map(moveVertex)}))}})}for(let pathId of this.pcb_silkscreen_path_ids){let path=db22.pcb_silkscreen_path.get(pathId);path&&db22.pcb_silkscreen_path.update(pathId,{route:path.route.map(point62=>({...point62,x:point62.x+deltaX,y:point62.y+deltaY}))})}}},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:db22}=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=db22.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,d23=distance.parse(props.padDiameter);return{width:d23,height:d23}}_setPositionFromLayout(newCenter){if(!this.pcb_smtpad_id)return;let{db:db22}=this.root;db22.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db22.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"&&db22.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p23=>({x:p23.x+deltaX,y:p23.y+deltaY}))}))}},EPSILON30=1e-9,isWireRoutePoint=routePoint3=>routePoint3.route_type==="wire",isPointOnSegment42=(p23,a22,b22)=>{let cross52=(p23.y-a22.y)*(b22.x-a22.x)-(p23.x-a22.x)*(b22.y-a22.y);if(Math.abs(cross52)>EPSILON30)return!1;let dot23=(p23.x-a22.x)*(b22.x-a22.x)+(p23.y-a22.y)*(b22.y-a22.y);if(dot23<-EPSILON30)return!1;let squaredLength6=(b22.x-a22.x)**2+(b22.y-a22.y)**2;return!(dot23-squaredLength6>EPSILON30)},isPointInRing2=(point62,ring4)=>{if(ring4.length<3)return!1;let inside22=!1,previous=ring4[ring4.length-1];for(let current3 of ring4){if(isPointOnSegment42(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&&(inside22=!inside22),previous=current3}return inside22},isPointInRectPour=(p23,pour)=>{let{center:center2,width,height}=pour,rotationRad=(pour.rotation??0)*Math.PI/180,cosR=Math.cos(-rotationRad),sinR=Math.sin(-rotationRad),dx22=p23.x-center2.x,dy22=p23.y-center2.y,localX=dx22*cosR-dy22*sinR,localY=dx22*sinR+dy22*cosR;return Math.abs(localX)<=width/2+EPSILON30&&Math.abs(localY)<=height/2+EPSILON30},isPointInBrepPour=(p23,pour)=>{let outerRing=pour.brep_shape.outer_ring.vertices.map(v23=>({x:v23.x,y:v23.y}));if(!isPointInRing2(p23,outerRing))return!1;for(let innerRing of pour.brep_shape.inner_rings){let points=innerRing.vertices.map(v23=>({x:v23.x,y:v23.y}));if(isPointInRing2(p23,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 dx22=end.x-start.x,dy22=end.y-start.y;return Math.hypot(dx22,dy22)<=EPSILON30?!1:[0,.25,.5,.75,1].every(t48=>isPointInCopperPour({x:start.x+dx22*t48,y:start.y+dy22*t48},pour))},markTraceSegmentsInsideCopperPour=({db:db22,copperPour})=>{if(!copperPour.source_net_id)return;let sourceTraceById=new Map(db22.source_trace.list().map(sourceTrace=>[sourceTrace.source_trace_id,sourceTrace]));for(let trace of db22.pcb_trace.list()){if(!isTraceConnectedToSourceNet(trace,copperPour.source_net_id,sourceTraceById))continue;let routeChanged=!1,nextRoute=trace.route.map(routePoint3=>({...routePoint3}));for(let i23=0;i23<nextRoute.length-1;i23++){let fromRoutePoint=nextRoute[i23],toRoutePoint=nextRoute[i23+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&&db22.pcb_trace.update(trace.pcb_trace_id,{route:nextRoute})}},pendingCopperPourRenders=new WeakMap,DEFAULT_THERMAL_RELIEF_SPOKE_WIDTH_MM=.3,renderAllCopperPoursForSubcircuit=async subcircuit=>{if(!subcircuit.root)return;let{db:db22}=subcircuit.root,copperPours=subcircuit.selectAll("copperpour").filter(copperPour=>copperPour.getSubcircuit()===subcircuit),resolvedCopperPours=[];for(let copperPour of copperPours){let{_parsedProps:props}=copperPour,sourceNetId=subcircuit.selectOne(props.connectsTo)?.source_net_id;if(!sourceNetId){copperPour.renderError(`Net "${props.connectsTo}" not found for copper pour`);continue}resolvedCopperPours.push({copperPour,sourceNetId})}if(resolvedCopperPours.length===0)return;let circuitJson=db22.toArray(),boardComponent=subcircuit._getBoard(),pcbBoard=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):void 0,resolvedPcbBoardOutline=pcbBoard?.outline?.length?pcbBoard.outline:void 0;if(!resolvedPcbBoardOutline&&pcbBoard?.width!==void 0&&pcbBoard.height!==void 0){let{center:center2,width,height}=pcbBoard;resolvedPcbBoardOutline=[{x:center2.x-width/2,y:center2.y-height/2},{x:center2.x+width/2,y:center2.y-height/2},{x:center2.x+width/2,y:center2.y+height/2},{x:center2.x-width/2,y:center2.y+height/2}]}let inputProblem=convertCircuitJsonToInputProblem(circuitJson,resolvedCopperPours.map(({copperPour,sourceNetId})=>{let{_parsedProps:props}=copperPour,clearance=props.clearance??.2;return{layer:props.layer,crosshatch:props.crosshatch,crosshatchPitch:props.crosshatchPitch,crosshatchWidth:props.crosshatchWidth,subcircuit_id:subcircuit.subcircuit_id??void 0,source_net_id:sourceNetId,pad_margin:props.padMargin??clearance,trace_margin:props.traceMargin??clearance,pour_margin:clearance,board_edge_margin:props.boardEdgeMargin??clearance,board_edge_outline:copperPour._isImplicitCopperPour?resolvedPcbBoardOutline:void 0,cutout_margin:props.cutoutMargin??clearance,...props.useThermalReliefs?{use_thermal_reliefs:!0,thermal_relief_spoke_width:DEFAULT_THERMAL_RELIEF_SPOKE_WIDTH_MM}:{},outline:props.outline??resolvedPcbBoardOutline}}));await initializeManifoldGeometry();let solver=new CopperPourPipelineSolver(inputProblem);subcircuit.root.emit("solver:started",{type:"solver:started",solverName:"CopperPourPipelineSolver",solverParams:inputProblem,solverConstructorArgs:[inputProblem],componentName:subcircuit.getString()});let{brep_shapes_by_region}=solver.getOutput();for(let[regionIndex,{copperPour,sourceNetId}]of resolvedCopperPours.entries()){let{_parsedProps:props}=copperPour,coveredWithSolderMask=props.coveredWithSolderMask??!1;for(let brepShape of brep_shapes_by_region[regionIndex]??[]){let insertedPour=db22.pcb_copper_pour.insert({shape:"brep",layer:props.layer,brep_shape:brepShape,source_net_id:sourceNetId,subcircuit_id:subcircuit.subcircuit_id??void 0,covered_with_solder_mask:coveredWithSolderMask});markTraceSegmentsInsideCopperPour({db:db22,copperPour:insertedPour})}}};function CopperPour_doInitialPcbCopperPourRender(copperPour){copperPour.root?.pcbDisabled||copperPour._queueAsyncEffect("PcbCopperPourRender",async()=>{let subcircuit=copperPour.getSubcircuit(),pendingRender=pendingCopperPourRenders.get(subcircuit);if(pendingRender){await pendingRender;return}let renderPromise=renderAllCopperPoursForSubcircuit(subcircuit);pendingCopperPourRenders.set(subcircuit,renderPromise);try{await renderPromise}finally{pendingCopperPourRenders.delete(subcircuit)}})}var renderViaStitchingForCopperPours=copperPour=>{let subcircuit=copperPour.getSubcircuit();if(!subcircuit.root)return;let copperPours=subcircuit.selectAll("copperpour").filter(candidateCopperPour=>candidateCopperPour.getSubcircuit()===subcircuit);if(copperPours[0]!==copperPour)return;let sourceNetIds=copperPours.flatMap(candidateCopperPour=>{let net=subcircuit.selectOne(candidateCopperPour._parsedProps.connectsTo);return net?.source_net_id?[net.source_net_id]:[]});if(sourceNetIds.length===0)return;let{db:db22}=subcircuit.root,pcbStyle3=copperPour.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle3),boardComponent=copperPour._getBoard(),pcbBoard=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):void 0,solverInput={circuitJson:db22.toArray(),options:{sourceNetIds:[...new Set(sourceNetIds)],viaHoleDiameter:pcbBoard?.min_via_hole_diameter??holeDiameter,viaOuterDiameter:pcbBoard?.min_via_pad_diameter??padDiameter,viaStitchPitch:boardComponent?._parsedProps.viaStitchPitch}},solver=new ViaStitchSolver(solverInput);if(subcircuit.root.emit("solver:started",{type:"solver:started",solverName:"ViaStitchSolver",solverParams:solverInput,solverConstructorArgs:[solverInput],componentName:subcircuit.getString()}),solver.solve(),solver.failed)throw new Error(solver.error??"Via stitching solver failed");for(let pcbVia of solver.getOutput().pcbVias){let{pcb_via_id:_solverViaId,...pcbViaInput}=pcb_via.parse(pcbVia),insertedVia=db22.pcb_via.insert({...pcbViaInput,tented_on_top:void 0,tented_on_bottom:void 0});boardComponent?._generatedStitchingViaIds?.add(insertedVia.pcb_via_id)}};function CopperPour_doInitialPcbViaStitchRender(copperPour){copperPour.root?.pcbDisabled||!copperPour.root?._featurePcbViaStitching||copperPour._getBoard()?._parsedProps.enableViaStitching&&copperPour._queueAsyncEffect("PcbViaStitchRender",async()=>{renderViaStitchingForCopperPours(copperPour)})}var CopperPour=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"_isImplicitCopperPour",!1)}get config(){return{componentName:"CopperPour",zodProps:copperPourProps}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;createNetsFromProps(this,[props.connectsTo])}doInitialPcbCopperPourRender(){CopperPour_doInitialPcbCopperPourRender(this)}doInitialPcbViaStitchRender(){CopperPour_doInitialPcbViaStitchRender(this)}},resolveAssemblyModel=props=>{if(props.model!==void 0)return/^https?:\/\//i.test(props.model)?resolveAssemblyModelUrl(props.model):{glbUrl:`https://modelcdn.tscircuit.com/jscad_models/${encodeURIComponent(props.model)}.glb`};if(props.modelUrl!==void 0)return resolveAssemblyModelUrl(props.modelUrl)},AssemblyDevice=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblyDevice",zodProps:assemblyDeviceProps}}doInitialAssignNameToUnnamedComponents(){}computeSchematicGlobalTransform(){return identity()}_computePcbGlobalTransformBeforeLayout(){return identity()}doInitialSourceRender(){this._parsedProps.modelUrl===void 0&&this._parsedProps.model===void 0||!this.root||(this.source_component_id=this.root.db.source_component.insert({ftype:"subassembly",name:this.name}).source_component_id)}doInitialCadModelRender(){let model27=resolveAssemblyModel(this._parsedProps);!this.root||this.root.pcbDisabled||!this.source_component_id||!model27||(this.cad_component_id=renderAssemblyCadModel(this,model27,{position:{x:0,y:0,z:0},pcbRotation:0,layer:"top"}))}},resolveBoardMountRotationAnchor=board=>{let anchor3=board._parsedProps.mountRotationAnchor??"rightedge",transform7=board._computePcbGlobalTransformBeforeLayout();switch(anchor3){case"rightedge":return[transform7.a,transform7.b,0];case"leftedge":return[-transform7.a,-transform7.b,0];case"topedge":return[transform7.c,transform7.d,0];case"bottomedge":return[-transform7.c,-transform7.d,0]}let components=board.getDescendants().filter(component2=>matchesAssemblyIdentity(component2,anchor3));if(components.length!==1)throw new Error(`board "${board.name}" mountRotationAnchor "${anchor3}" matched ${components.length} components; expected exactly one on this board`);let component=components[0],pcbComponent=component.pcb_component_id&&board.root.db.pcb_component.get(component.pcb_component_id);if(!pcbComponent)throw new Error(`board "${board.name}" mountRotationAnchor "${anchor3}" has no PCB component geometry`);let pcbBoard=board.root.db.pcb_board.get(board.pcb_board_id),x23=pcbComponent.center.x-pcbBoard.center.x,y23=pcbComponent.center.y-pcbBoard.center.y;if(Math.hypot(x23,y23)<1e-6)throw new Error(`board "${board.name}" mountRotationAnchor "${anchor3}" is on the mounting axis and has no direction`);return[x23,y23,0]},radians2=degrees22=>degrees22*Math.PI/180,degrees2=angle3=>normalizeDegrees(angle3*180/Math.PI),shaftRotation=direction3=>{switch(direction3){case"x+":return{x:0,y:90,z:0};case"x-":return{x:0,y:270,z:0};case"y+":return{x:270,y:0,z:0};case"y-":return{x:90,y:0,z:0};default:return{x:0,y:0,z:0}}},resolveAssemblyMotorRotation=(motor,placement)=>{let alignment=shaftRotation(motor._parsedProps.shaftFacingDirection),board=resolveMotorMountedBoard(motor),input2=board?._parsedProps.mountRotation;if(!board||!input2)return alignment;let bottom=placement.layer==="bottom",sign=bottom?-1:1,orientation22=mat4_exports.create();mat4_exports.rotateX(orientation22,orientation22,radians2(alignment.x)),mat4_exports.rotateY(orientation22,orientation22,radians2(alignment.y+(bottom?180:0))),mat4_exports.rotateZ(orientation22,orientation22,radians2(sign*placement.pcbRotation));let expression3=input2.startsWith("calc(")?input2.match(/^calc\(\s*(.*?)\s*(?:([+-])\s*((?:\d+(?:\.\d*)?|\.\d+))\s*(degcw|degccw))?\s*\)$/):[input2,input2],path=expression3[1],separator=path.lastIndexOf("."),motorIdentity=path.slice(0,separator),directionName=path.slice(separator+1);if(!matchesAssemblyIdentity(motor,motorIdentity))throw new Error(`board "${board.name}" mountRotation "${input2}" must reference its mounted motor "${motor.name}"`);let direction3=Object.entries(motor.motorReferencePoints).find(([name])=>name===directionName)?.[1];if(!direction3)throw new Error(`assembly.motor "${motor.name}" has no ${directionName} reference`);if(Math.abs(direction3.direction.z)>1e-6)throw new Error(`board "${board.name}" mountRotation "${input2}" must reference a direction in the mounting face, e.g. "${motorIdentity}.wireside"`);let clockwiseAngle=radians2((expression3[2]==="-"?-1:1)*Number(expression3[3]??0)*(expression3[4]==="degccw"?-1:1)),anchor3=vec3_exports.normalize(vec3_exports.create(),resolveBoardMountRotationAnchor(board)),shaft=vec3_exports.transformMat4(vec3_exports.create(),[0,0,1],orientation22),turn=mat4_exports.fromRotation(mat4_exports.create(),-clockwiseAngle,shaft),target=vec3_exports.transformMat4(vec3_exports.create(),anchor3,turn),motorDirection=vec3_exports.transformMat4(vec3_exports.create(),[direction3.direction.x,direction3.direction.y,direction3.direction.z],orientation22),spin=Math.atan2(vec3_exports.dot(shaft,vec3_exports.cross(vec3_exports.create(),motorDirection,target)),vec3_exports.dot(motorDirection,target));mat4_exports.rotateZ(orientation22,orientation22,spin);let pitch=Math.asin(Math.max(-1,Math.min(1,orientation22[8]))),nonsingular=Math.abs(orientation22[8])<.999999,roll=nonsingular?Math.atan2(-orientation22[9],orientation22[10]):Math.atan2(orientation22[6],orientation22[5]),yaw=nonsingular?Math.atan2(-orientation22[4],orientation22[0]):0;return{x:degrees2(roll),y:degrees2(pitch)-(bottom?180:0),z:sign*degrees2(yaw)-placement.pcbRotation}},resolveAssemblyMotorPlacement=motor=>{let printedPartPlacement=resolveMotorPrintedPartPlacement(motor);if(printedPartPlacement)return printedPartPlacement;let board=resolveMotorMountedBoard(motor),orientation22=board?._parsedProps.mountOrientation,layer=orientation22?orientation22==="bottom_layer_toward_mount_face"?"bottom":"top":motor._parsedProps.shaftFacingDirection==="z-"?"bottom":"top";if(!board)return{position:{x:0,y:0,z:0},pcbRotation:0,layer};let pcbBoard=board.root.db.pcb_board.get(board.pcb_board_id);if(!pcbBoard)throw new Error(`Mounted board "${board.name}" has no PCB geometry`);let sign=layer==="bottom"?-1:1,boardTransform=board._computePcbGlobalTransformBeforeLayout();return{position:{...pcbBoard.center,z:sign*(-motor.motorReferencePoints.backface.position.z+(board._parsedProps.mountGap??0)+pcbBoard.thickness/2)},pcbRotation:normalizeDegrees(Math.atan2(boardTransform.b,boardTransform.a)*180/Math.PI),layer,subcircuit_id:pcbBoard.subcircuit_id}},resolveMotorFaceMount=motor=>{if(!getComponentsInAssemblyScope(motor).some(part=>part.componentName==="AssemblyMotor"&&part._parsedProps.mountedTo))return;let{transforms,roots,motorMountRoots,subcircuitId}=resolvePrintedPartMounts(motor);if(!motorMountRoots.has(roots.get(motor)))return;let world=transforms.get(motor),pitch=Math.asin(Math.max(-1,Math.min(1,world[8]))),nonsingular=Math.abs(world[8])<.999999,roll=nonsingular?Math.atan2(-world[9],world[10]):Math.atan2(world[6],world[5]),yaw=nonsingular?Math.atan2(-world[4],world[0]):0,degrees22=angle3=>normalizeDegrees(angle3*180/Math.PI);return{position:{x:world[12],y:world[13],z:world[14]},rotation:{x:degrees22(roll),y:degrees22(pitch),z:degrees22(yaw)},subcircuit_id:subcircuitId}},AssemblyMotor=class extends PrimitiveComponent2{get config(){return{componentName:"AssemblyMotor",zodProps:assemblyMotorProps}}get motorModelString(){let base=this._parsedProps.model??this._parsedProps.standard,wireConnection=this._parsedProps.wireConnection;return wireConnection===void 0?base:`${base}_${wireConnection}`}get motorModel(){let model27=(()=>{try{return parseModelString(this.motorModelString)}catch(cause){throw new Error(`assembly.motor "${this.name}" requires a NEMA modelprinter model: ${cause instanceof Error?cause.message:cause}`,{cause})}})();if(model27.fn!=="nema")throw new Error(`assembly.motor "${this.name}" requires a NEMA modelprinter model`);return model27}get motorReferencePoints(){let{fn:fn3,...parameters}=this.motorModel;return getNemaMotorReferencePoints(parameters)}doInitialSourceRender(){this.motorModel,this.source_component_id=this.root.db.source_component.insert({ftype:"motor",name:this.name}).source_component_id}doInitialCadModelRender(){if(!this.root||this.root.pcbDisabled||!this.source_component_id)return;let model27=resolveAssemblyModel({model:this.motorModelString}),faceMount=resolveMotorFaceMount(this);if(faceMount){this.cad_component_id=renderAssemblyCadModel(this,{...model27,rotationOffset:faceMount.rotation},{...faceMount,pcbRotation:0,layer:"top"});return}let placement=resolveAssemblyMotorPlacement(this);this.cad_component_id=renderAssemblyCadModel(this,{...model27,rotationOffset:resolveAssemblyMotorRotation(this,placement)},placement)}},formatMillimetersForModelprinter=millimeters=>Number(millimeters.toFixed(6)).toString(),getDefaultFlexScreenModel=component=>{let{width,height}=component._parsedProps;if(width===void 0||height===void 0)throw new Error(`assembly.screen "${component.name}" requires both width and height when cadModel is omitted`);return`flexscreen_w${formatMillimetersForModelprinter(width)}mm_h${formatMillimetersForModelprinter(height)}mm`},AssemblyScreen_doInitialCadModelRender=component=>{if(!component.root||component.root.pcbDisabled||!component.source_component_id)return;let placement=resolveAssemblyPlacement(component);component.cad_component_id=renderAssemblyCadModel(component,resolveAssemblyModel(component._parsedProps)??component._parsedProps.cadModel??getDefaultFlexScreenModel(component),placement)},AssemblyScreen=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblyScreen",zodProps:assemblyScreenProps}}doInitialAssignNameToUnnamedComponents(){if(!this._parsedProps.name)throw new Error("assembly.screen requires a non-empty name")}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"subassembly",name:this.name});this.source_component_id=sourceComponent.source_component_id}doInitialCadModelRender(){AssemblyScreen_doInitialCadModelRender(this)}},AssemblySubassembly=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblySubassembly",zodProps:assemblySubassemblyProps}}doInitialAssignNameToUnnamedComponents(){if(!this._parsedProps.name)throw new Error("assembly.subassembly requires a non-empty name")}doInitialReactSubtreesRender(){(0,import_react11.isValidElement)(this.props.cadModel)&&this.add(createInstanceFromReactElement(this.props.cadModel))}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"subassembly",name:this.name});this.source_component_id=sourceComponent.source_component_id}doInitialCadModelRender(){if(!this.root||this.root.pcbDisabled||!this.source_component_id)return;let placement=resolveAssemblyPlacement(this),model27=resolveAssemblyModel(this._parsedProps)??this._parsedProps.cadModel;model27&&!(typeof model27=="object"&&"type"in model27)&&(this.cad_component_id=renderAssemblyCadModel(this,model27,placement))}},renderPartReferenceSurfaces=part=>{let surfaces=getPartReferenceSurfaces(part);if(!surfaces.length)return;let{transforms,subcircuitId}=resolvePrintedPartMounts(part),world=transforms.get(part),rotation5=mat3_exports.fromMat4(mat3_exports.create(),world),toPoint=vector3=>({x:vector3[0],y:vector3[1],z:vector3[2]});for(let surface of surfaces){let child=part.children.find(child2=>child2.componentName==="AssemblyReferenceSurface"&&child2.name===surface.name);part.root.db.cad_reference_surface.insert({source_component_id:part.source_component_id,name:surface.name,shape:"rect",center:toPoint(vec3_exports.transformMat4(vec3_exports.create(),surface.origin,world)),normal:toPoint(vec3_exports.normalize(vec3_exports.create(),vec3_exports.transformMat3(vec3_exports.create(),surface.normal,rotation5))),x_axis:toPoint(vec3_exports.normalize(vec3_exports.create(),vec3_exports.transformMat3(vec3_exports.create(),surface.xAxis,rotation5))),width:child?._parsedProps.width,height:child?._parsedProps.height,subcircuit_id:subcircuitId})}},AssemblyPart=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblyPart",zodProps:assemblyPartProps}}doInitialReactSubtreesRender(){(0,import_react12.isValidElement)(this.props.cadModel)&&this.add(createInstanceFromReactElement(this.props.cadModel))}doInitialSourceRender(){getPartReferenceSurfaces(this),this.source_component_id=this.root.db.source_component.insert({ftype:"subassembly",name:this.name,display_name:this._parsedProps.displayName}).source_component_id}doInitialCadModelRender(){if(!this.root||this.root.pcbDisabled||!this.source_component_id)return;renderPartReferenceSurfaces(this);let model27=resolveAssemblyModel(this._parsedProps)??this._parsedProps.cadModel;model27&&!(typeof model27=="object"&&"type"in model27)&&(this.cad_component_id=renderAssemblyCadModel(this,model27,resolveAssemblyPlacement(this)))}},AssemblyReferenceSurface=class extends PrimitiveComponent2{get config(){return{componentName:"AssemblyReferenceSurface",zodProps:assemblyReferenceSurfaceProps}}doInitialSourceRender(){if(this.parent?.componentName!=="AssemblyPart"&&this.parent?.componentName!=="AssemblyPrintedPart")throw new Error(`Reference surface "${this.name}" must be a child of assembly.part or assembly.printedpart`)}get referenceFrame(){let{name,plane,normalDirection,centerXOffset,centerYOffset,centerZOffset}=this._parsedProps,sign=normalDirection.endsWith("-")?-1:1;return{name,origin:[centerXOffset,centerYOffset,centerZOffset],normal:plane==="xy"?[0,0,sign]:plane==="xz"?[0,sign,0]:[sign,0,0],xAxis:plane==="yz"?[0,1,0]:[1,0,0]}}},getModelReachAboveOrigin=({cad,authoredModel})=>{let bounds=cad.model_bounds??authoredModel?.modelBounds,origin=cad.model_origin_position??authoredModel?.modelOriginPosition;if(!bounds?.min||!bounds?.max||!origin)return;let normal=cad.model_board_normal_direction??authoredModel?.modelBoardNormalDirection??"z+",axis=normal[0];if(axis!=="x"&&axis!=="y"&&axis!=="z")return;let min4=bounds.min[axis],max5=bounds.max[axis],at22=origin[axis];if(min4===void 0||max5===void 0||at22===void 0)return;let reach=normal.endsWith("-")?at22-min4:max5-at22;return Number.isFinite(reach)&&reach>=0?reach:void 0},getComponentBody=({owner,pcbComponent,cadComponent,boardSurfaceZ})=>{let cadModelProp22=owner?._parsedProps?.cadModel,authoredModel=cadModelProp22&&typeof cadModelProp22=="object"?cadModelProp22:void 0,size3=cadComponent?.size??authoredModel?.size,x23=size3?.x,y23=size3?.y,z20=size3?.z,reach=cadComponent?getModelReachAboveOrigin({cad:cadComponent,authoredModel}):void 0,originZ=cadComponent?.position?.z,aboveBoardHeight=reach!==void 0&&originZ!==void 0?reach+Math.abs(originZ-boardSurfaceZ):void 0;return{size:x23!==void 0&&y23!==void 0?{x:x23,y:y23,z:z20}:void 0,aboveBoardHeight,rotation:cadComponent?.rotation?.z??pcbComponent.rotation??0,footprint:{width:pcbComponent.width,height:pcbComponent.height}}},getNearestBoardWall=({point:point62,board})=>{let halfWidth=(board.width??0)/2,halfHeight=(board.height??0)/2,distances=[["x_neg",Math.abs(point62.x-(board.center.x-halfWidth))],["x_pos",Math.abs(point62.x-(board.center.x+halfWidth))],["y_neg",Math.abs(point62.y-(board.center.y-halfHeight))],["y_pos",Math.abs(point62.y-(board.center.y+halfHeight))]];return distances.sort((a22,b22)=>a22[1]-b22[1]),distances[0][0]},getSolverWall=boardWall=>boardWall,INSERTION_DIRECTION_TO_BOARD_WALL={from_top:"y_pos",from_bottom:"y_neg",from_left:"x_neg",from_right:"x_pos"},getFdmEnclosureSolverInput=(apertureComponent,{board,pcbBoard})=>{let owner=apertureComponent.parent;for(;owner&&owner!==board&&!owner.pcb_component_id;)owner=owner.parent;let pcbComponent=owner?.pcb_component_id?apertureComponent.root?.db.pcb_component.get(owner.pcb_component_id):null;if(!pcbComponent)throw new Error("<enclosure.cutoutaperture /> must be nested inside a component with a PCB footprint");let aperture=apertureComponent._parsedProps,apertureAxisDirection=owner?._getEnclosureApertureAxisDirection?.(pcbComponent.layer,pcbComponent.rotation??0),apertureDirection=apertureAxisDirection?apertureAxisDirection.z!==0?apertureAxisDirection.z>0?"from_above":"from_below":Math.abs(apertureAxisDirection.x)>=Math.abs(apertureAxisDirection.y)?apertureAxisDirection.x>=0?"from_right":"from_left":apertureAxisDirection.y>=0?"from_top":"from_bottom":pcbComponent.insertion_direction,verticalFace=apertureDirection==="from_above"?"z_pos":apertureDirection==="from_below"?"z_neg":void 0,boardSide=pcbComponent.layer==="bottom"?"bottom":"top",face,center2;if(verticalFace)face=verticalFace,center2={x:pcbComponent.center.x-pcbBoard.center.x,y:pcbComponent.center.y-pcbBoard.center.y};else{let point62=pcbComponent.cable_insertion_center??pcbComponent.center,boardWall=INSERTION_DIRECTION_TO_BOARD_WALL[apertureDirection]??getNearestBoardWall({point:point62,board:pcbBoard}),cableDelta=pcbComponent.cable_insertion_center?{x:pcbComponent.cable_insertion_center.x-pcbComponent.center.x,y:pcbComponent.cable_insertion_center.y-pcbComponent.center.y}:null,cableProjectionMatchesWall=cableDelta!=null&&(boardWall==="x_neg"||boardWall==="x_pos"?Math.abs(cableDelta.x)>=Math.abs(cableDelta.y):Math.abs(cableDelta.y)>=Math.abs(cableDelta.x)),tangentPoint=apertureAxisDirection?pcbComponent.center:cableProjectionMatchesWall?point62:pcbComponent.center;face=getSolverWall(boardWall),center2={x:tangentPoint.x-pcbBoard.center.x,y:tangentPoint.y-pcbBoard.center.y}}let cadComponent=apertureComponent.root?.db.cad_component.getWhere({pcb_component_id:pcbComponent.pcb_component_id})??null,boardSurfaceZ=(boardSide==="bottom"?-1:1)*((pcbBoard.thickness??board.boardThickness)/2),componentBody=getComponentBody({owner,pcbComponent,cadComponent,boardSurfaceZ}),commonInput={face,center:center2,boardSide,apertureAxisDirection,rotation:pcbComponent.rotation??void 0,depth:aperture.depth,componentBody,widthDimensionOffset:aperture.widthDimensionOffset,heightDimensionOffset:aperture.heightDimensionOffset,margin:aperture.margin};switch(aperture.shape){case"pill":case"rect":return{...commonInput,shape:aperture.shape,width:aperture.width,height:aperture.height};case"circle":return{...commonInput,shape:"circle",radius:aperture.radius}}},EnclosureCutoutAperture=class extends PrimitiveComponent2{get config(){return{componentName:"EnclosureCutoutAperture",zodProps:enclosureCutoutApertureProps}}getFdmEnclosureSolverInput(params){return getFdmEnclosureSolverInput(this,params)}},getReferencedEnclosureBoard=(component,boardRef)=>{let rootComponent=component.root?.firstChild,selectedComponent=rootComponent?selectOne(boardRef,rootComponent,{adapter:cssSelectPrimitiveComponentAdapter}):null,board=selectedComponent instanceof Board?selectedComponent:[rootComponent,...rootComponent?.getDescendants()??[]].find(descendant=>descendant instanceof Board&&descendant.isMatchingNameOrAlias(boardRef));if(!(board instanceof Board))throw new Error(`Could not find a <board /> matching enclosure boardRef "${boardRef}"`);return board},EnclosureFdmBox_doInitialCadModelRender=component=>{let root=component.root;if(!root||root.pcbDisabled||!component.source_component_id||!component.pcb_component_id)return;let{db:db22}=root,props=component._parsedProps,board=getReferencedEnclosureBoard(component,props.boardRef),pcbBoard=board.pcb_board_id?db22.pcb_board.get(board.pcb_board_id):null;if(!pcbBoard?.width||!pcbBoard.height)throw new Error(`Could not resolve dimensions for boardRef "${props.boardRef}"`);let boardThickness=pcbBoard.thickness??board.boardThickness,inputProblem={board:{width:pcbBoard.width,height:pcbBoard.height,thickness:boardThickness},width:props.width,height:props.height,depth:props.depth,wallThickness:props.wallThickness,floorThickness:props.floorThickness,lidThickness:props.lidThickness,boardClearance:props.boardClearance,standoffHeight:props.standoffHeight,topHeadroom:props.topHeadroom,lidLipDepth:props.lidLipDepth,apertures:props.disableCutouts?[]:board.getDescendants().filter(descendant=>descendant instanceof EnclosureCutoutAperture).map(aperture=>aperture.getFdmEnclosureSolverInput({board,pcbBoard}))},solver=new CreateFdmEnclosureSolver(inputProblem),solverConstructorArgs=solver.getConstructorParams();if(root.emit("solver:started",{type:"solver:started",solverName:"CreateFdmEnclosureSolver",solverParams:solverConstructorArgs[0],solverConstructorArgs,componentName:component.getString()}),solver.solve(),solver.failed)throw new Error(solver.error??"Failed to create FDM enclosure");let output=solver.getOutput();db22.pcb_component.update(component.pcb_component_id,{center:pcbBoard.center,width:output.dimensions.width,height:output.dimensions.height});let position4={x:pcbBoard.center.x,y:pcbBoard.center.y,z:-boardThickness/2-output.dimensions.floorThickness-output.dimensions.standoffHeight},cadComponents=output.parts.map(part=>db22.cad_component.insert({position:position4,rotation:{x:0,y:0,z:0},pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,model_jscad:part.jscadPlan,model_unit_to_mm_scale_factor:1,model_object_fit:"contain_within_bounds",model_origin_alignment:"bottom_center_of_component",anchor_alignment:"center",show_as_translucent_model:!1,show_hidden_edges:props.showHiddenEdges}));component.cad_component_id=cadComponents[0]?.cad_component_id??null},EnclosureFdmBox=class _EnclosureFdmBox extends PrimitiveComponent2{get config(){return{componentName:"EnclosureFdmBox",zodProps:enclosureFdmBoxProps}}doInitialAssignNameToUnnamedComponents(){if(this._parsedProps.name)return;let top=this;for(;top.parent instanceof PrimitiveComponent2;)top=top.parent;let index2=[top,...top.getDescendants()].filter(component=>component instanceof _EnclosureFdmBox).indexOf(this);this.fallbackUnassignedName=`unnamed_enclosure_fdm_box_${index2===-1?0:index2+1}`}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name});this.source_component_id=sourceComponent.source_component_id}doInitialPcbComponentRender(){let root=this.root;if(!root||root.pcbDisabled||!this.source_component_id)return;let board=getReferencedEnclosureBoard(this,this._parsedProps.boardRef),center2=(board.pcb_board_id?root.db.pcb_board.get(board.pcb_board_id):null)?.center??board._getGlobalPcbPositionBeforeLayout(),pcbComponent=root.db.pcb_component.insert({center:center2,width:0,height:0,layer:"top",rotation:0,source_component_id:this.source_component_id,obstructs_within_bounds:!1,do_not_place:!0,is_allowed_to_be_off_board:!0});this.pcb_component_id=pcbComponent.pcb_component_id}doInitialCadModelRender(){EnclosureFdmBox_doInitialCadModelRender(this)}},Battery=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:props.capacity,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},PinHeader=class extends NormalComponent{_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,gender=this._parsedProps.gender;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"),gender==="female"&&(footprintString+="_female"),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 i23=1;i23<=pinCount;i23++){let rawLabel=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[i23-1]:this._parsedProps.pinLabels?.[`pin${i23}`];if(rawLabel){let primaryLabel=Array.isArray(rawLabel)?rawLabel[0]:rawLabel,otherLabels=Array.isArray(rawLabel)?rawLabel.slice(1):[];this.add(new Port({pinNumber:i23,name:primaryLabel,aliases:[`pin${i23}`,...otherLabels]}))}else this.add(new Port({pinNumber:i23,name:`pin${i23}`}))}}_getSchematicPortArrangement(){let pinCount=this._parsedProps.pinCount??1,facingDirection=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",schPinArrangement=this._parsedProps.schPinArrangement,pins=Array.from({length:pinCount},(_23,i23)=>`pin${i23+1}`);return facingDirection==="left"?{leftSide:{direction:schPinArrangement?.leftSide?.direction??"top-to-bottom",pins:schPinArrangement?.leftSide?.pins??pins}}:facingDirection==="up"?{topSide:{direction:schPinArrangement?.topSide?.direction??"left-to-right",pins:schPinArrangement?.topSide?.pins??pins}}:facingDirection==="down"?{bottomSide:{direction:schPinArrangement?.bottomSide?.direction??"left-to-right",pins:schPinArrangement?.bottomSide?.pins??pins}}:{rightSide:{direction:schPinArrangement?.rightSide?.direction??"top-to-bottom",pins:schPinArrangement?.rightSide?.pins??pins}}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),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 NormalComponent{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??getResonatorSymbolName(this.props.pinVariant),zodProps:resonatorProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"no_ground",source_component=db22.source_component.insert({ftype:"simple_resonator",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),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 NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"two_pin",source_component=db22.source_component.insert({ftype:"simple_potentiometer",name:this.name,manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,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}},DEFAULT_CRYSTAL_MAX_TRACE_LENGTH_MM=10,DEFAULT_CRYSTAL_MAX_VIA_COUNT=0,Crystal=class extends NormalComponent{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","X1"],pin2:["top1","2","gnd1"],pin3:["right1","3","X2"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left","X1"],pin2:["neg","right","X2"]};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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:"simple_crystal",manufacturer_part_number:resolveManufacturerPartNumber(props),supplier_part_numbers:props.supplierPartNumbers,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}doInitialSourceDesignRuleChecks(){if(super.doInitialSourceDesignRuleChecks(),!this.source_component_id)return;let{db:db22}=this.root,maximumTraceLength=this._parsedProps.maxTraceLength??DEFAULT_CRYSTAL_MAX_TRACE_LENGTH_MM,crystalSignalSourcePortIds=new Set,crystalSignalConnectivityMapKeys=new Set;for(let signalPort of[this.portMap.X1,this.portMap.X2]){if(!signalPort.source_port_id)continue;let sourcePort=db22.source_port.get(signalPort.source_port_id);sourcePort&&(crystalSignalSourcePortIds.add(signalPort.source_port_id),sourcePort.subcircuit_connectivity_map_key&&crystalSignalConnectivityMapKeys.add(sourcePort.subcircuit_connectivity_map_key))}for(let sourceTrace of db22.source_trace.list()){let isDirectlyConnectedToCrystal=sourceTrace.connected_source_port_ids.some(sourcePortId=>crystalSignalSourcePortIds.has(sourcePortId)),isOnCrystalNet=sourceTrace.subcircuit_connectivity_map_key!==void 0&&crystalSignalConnectivityMapKeys.has(sourceTrace.subcircuit_connectivity_map_key);if(!isDirectlyConnectedToCrystal&&!isOnCrystalNet)continue;let needsMaximumTraceLength=typeof sourceTrace.max_length!="number"||sourceTrace.max_length>maximumTraceLength,needsMaximumViaCount=sourceTrace.max_via_count!==DEFAULT_CRYSTAL_MAX_VIA_COUNT;!needsMaximumTraceLength&&!needsMaximumViaCount||db22.source_trace.update(sourceTrace.source_trace_id,{...needsMaximumTraceLength?{max_length:maximumTraceLength}:{},...needsMaximumViaCount?{max_via_count:DEFAULT_CRYSTAL_MAX_VIA_COUNT}:{}})}}},OpAmp=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_op_amp",name:this.name,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=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||db22.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})}},TESTPOINT_DEFAULTS={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},TestPoint=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults(),source_component=db22.source_component.insert({ftype:FTYPE.simple_test_point,name:this.name,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:resolveManufacturerPartNumber(props),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}},SchematicSymbol_doInitialSchematicComponentRender=schematicSymbol=>{if(schematicSymbol.root?.schematicDisabled||schematicSymbol.getCollapsedSchematicBoxAncestor())return;let{db:db22}=schematicSymbol.root,symbolName=schematicSymbol._getSchematicSymbolNameOrThrow(),symbol=zh[symbolName];if(!symbol)throw new Error(`No schematic symbol found for "${symbolName}"`);let center2=schematicSymbol._getGlobalSchematicPositionBeforeLayout(),schematicSheetId=schematicSymbol._resolveSchematicSheetId(),subcircuitId=schematicSymbol.getSubcircuit().subcircuit_id??void 0,schematicComponent=db22.schematic_component.insert({center:center2,size:{...symbol.size},is_box_with_pins:!0,symbol_name:symbolName,source_component_id:schematicSymbol.source_component_id??void 0,schematic_sheet_id:schematicSheetId});schematicSymbol.schematic_component_id=schematicComponent.schematic_component_id;for(let symbolPort of symbol.ports){let port=schematicSymbol.getPortForSymbolPort(symbolPort);if(!port?.source_port_id)throw new Error(`Missing source port for schematic symbol port "${symbolPort.labels.join("/")}" on ${schematicSymbol.getString()}`);let portCenter={x:center2.x+symbolPort.x-symbol.center.x,y:center2.y+symbolPort.y-symbol.center.y},schematicPort=db22.schematic_port.insert({schematic_component_id:schematicComponent.schematic_component_id,center:portCenter,source_port_id:port.source_port_id,facing_direction:getRelativeDirection(center2,portCenter),distance_from_component_edge:.4,pin_number:port._parsedProps.pinNumber,display_pin_label:port._parsedProps.aliases?.[0],is_connected:!1,schematic_sheet_id:schematicSheetId,subcircuit_id:subcircuitId});port.schematic_port_id=schematicPort.schematic_port_id}},getSingleConnectionTarget=(connectionName,target)=>{let targets=Array.isArray(target)?target:[target];if(targets.length!==1)throw new Error(`SchematicSymbol connection "${connectionName}" must select exactly one physical port`);return targets[0]},SchematicSymbol_doInitialPortMatching=schematicSymbol=>{let{db:db22}=schematicSymbol.root,{chipRef,connections}=schematicSymbol._parsedProps;if(chipRef&&!connections){db22.source_property_ignored_warning.insert({source_component_id:schematicSymbol.source_component_id,property_name:"chipRef",message:`${schematicSymbol.getString()} has chipRef "${chipRef}" without connections. chipRef will be ignored.`,error_type:"source_property_ignored_warning",subcircuit_id:schematicSymbol.getSubcircuit().subcircuit_id??void 0});return}if(connections&&!chipRef){db22.source_property_ignored_warning.insert({source_component_id:schematicSymbol.source_component_id,property_name:"connections",message:`${schematicSymbol.getString()} has connections without chipRef. connections will be ignored.`,error_type:"source_property_ignored_warning",subcircuit_id:schematicSymbol.getSubcircuit().subcircuit_id??void 0});return}if(!chipRef||!connections)return;let referencedChip=schematicSymbol.getSubcircuit().selectOne(chipRef);if(!referencedChip?.source_component_id)throw new Error(`Could not resolve chipRef "${chipRef}" for ${schematicSymbol.getString()}`);let usedConnectionNames=new Set;for(let schematicPort of schematicSymbol.ports){let symbolPort=schematicPort.schematicSymbolPortDef,matchingConnections=Object.entries(connections).filter(([connectionName2])=>schematicPort.isMatchingAnyOf([connectionName2]));if(matchingConnections.length===0)throw new Error(`${schematicSymbol.getString()} is missing an explicit connection for symbol port "${symbolPort.labels.join("/")}"`);if(matchingConnections.length>1)throw new Error(`${schematicSymbol.getString()} has multiple connections for symbol port "${symbolPort.labels.join("/")}"`);let[connectionName,connectionTarget5]=matchingConnections[0];usedConnectionNames.add(connectionName);let targetSelector=getSingleConnectionTarget(connectionName,connectionTarget5),physicalPort=schematicSymbol.getSubcircuit().selectOne(targetSelector,{type:"port"});if(!physicalPort?.source_port_id)throw new Error(`Could not resolve connection "${connectionName}" target "${targetSelector}" for ${schematicSymbol.getString()}`);if(db22.source_port.get(physicalPort.source_port_id)?.source_component_id!==referencedChip.source_component_id)throw new Error(`Connection "${connectionName}" target "${targetSelector}" does not belong to chipRef "${chipRef}"`);schematicPort.source_port_id=physicalPort.source_port_id,schematicPort.source_component_id=physicalPort.source_component_id}let unusedConnectionNames=Object.keys(connections).filter(connectionName=>!usedConnectionNames.has(connectionName));if(unusedConnectionNames.length>0)throw new Error(`${schematicSymbol.getString()} has connections that do not match symbol ports: ${unusedConnectionNames.join(", ")}`)},SchematicSymbol=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"SchematicSymbol",schematicSymbolName:this.props.symbolName,zodProps:schematicSymbolProps}}initPorts(){let symbol=zh[this._getSchematicSymbolNameOrThrow()],shouldCreateSourcePort=!(this._parsedProps.chipRef&&this._parsedProps.connections);for(let symbolPort of symbol.ports){let pinNumber=getPinNumberFromLabels(symbolPort.labels);if(!pinNumber)throw new Error(`Schematic symbol port must have a numeric pin label: ${symbolPort.labels.join("/")}`);let existingPort=this.ports.find(port2=>port2._parsedProps.pinNumber===pinNumber);if(existingPort){existingPort.schematicSymbolPortDef=symbolPort;continue}let aliases4=symbolPort.labels.filter(label=>label!==pinNumber.toString()&&label!==`pin${pinNumber}`),port=new Port({pinNumber,aliases:aliases4},{shouldCreateSourcePort});port.schematicSymbolPortDef=symbolPort,this.add(port)}}doInitialInitializePortsFromChildren(){this.initPorts()}updateInitializePortsFromChildren(){this.initPorts()}get ports(){return this.children.filter(child=>child instanceof Port)}getPortForSymbolPort(symbolPort){return this.ports.find(port=>port.schematicSymbolPortDef===symbolPort)??null}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name,display_name:this._parsedProps.displayName,are_pins_interchangeable:!1});this.source_component_id=sourceComponent.source_component_id}doInitialPortMatching(){SchematicSymbol_doInitialPortMatching(this)}doInitialSchematicComponentRender(){SchematicSymbol_doInitialSchematicComponentRender(this)}},SchematicSection=class _SchematicSection extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicSection",zodProps:schematicSectionProps}}_computeSectionBounds(board,sectionName,schematicSheetId){let{db:db22}=this.root,members=board.getDescendants().filter(c23=>c23.getSchematicSectionName()===sectionName);if(members.length===0)return null;let positions=[];for(let member of members){let schematicComponentId=member.schematic_component_id;if(!schematicComponentId)continue;let schComp=db22.schematic_component.get(schematicComponentId);if(!schComp||schComp.schematic_sheet_id!==schematicSheetId)continue;let hw22=schComp.size.width/2,hh22=schComp.size.height/2;positions.push({minX:schComp.center.x-hw22,maxX:schComp.center.x+hw22,minY:schComp.center.y-hh22,maxY:schComp.center.y+hh22});for(let text2 of db22.schematic_text.list({schematic_component_id:schematicComponentId}))positions.push(getSchematicTextBounds({text:text2.text,position:text2.position,anchor:text2.anchor,fontSize:text2.font_size}))}return positions.length===0?null:computeBoundsFromCellContents(positions)}doInitialSchematicSectionRender(){if(this.root?.schematicDisabled)return;let board=this.root?._getBoard();if(!board)return;let schematicSheetId=this._resolveSchematicSheetId(),allSections=board.getDescendants().filter(component=>component instanceof _SchematicSection&&component._resolveSchematicSheetId()===schematicSheetId);if(allSections[0]!==this)return;let{db:db22}=this.root,PADDING=.5,LABEL_PADDING=.2,STROKE_WIDTH=.02,TOL42=.001,namedSectionsWithBounds=allSections.map(section=>{let bounds=section._computeSectionBounds(board,section._parsedProps.name,schematicSheetId);return bounds?{displayName:section._parsedProps.displayName,sectionTitleFontSize:section._parsedProps.sectionTitleFontSize,rawBounds:bounds,cell:{minX:bounds.minX-PADDING,maxX:bounds.maxX+PADDING,minY:bounds.minY-PADDING,maxY:bounds.maxY+PADDING}}:null}).filter(s23=>s23!==null),unsectionedBounds=this._computeSectionBounds(board,null,schematicSheetId),allSectionsWithBounds=[...namedSectionsWithBounds];if(unsectionedBounds&&allSectionsWithBounds.push({displayName:void 0,sectionTitleFontSize:void 0,rawBounds:unsectionedBounds,cell:{minX:unsectionedBounds.minX-PADDING,maxX:unsectionedBounds.maxX+PADDING,minY:unsectionedBounds.minY-PADDING,maxY:unsectionedBounds.maxY+PADDING}}),allSectionsWithBounds.length===0)return;let allCells=allSectionsWithBounds.map(s23=>s23.cell),outer=computeBoundsFromCellContents(allCells),dividers=calculateCellBoundaries2(allSectionsWithBounds.map(s23=>s23.rawBounds),{cellMargin:1});for(let line2 of dividers)db22.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:!0,schematic_sheet_id:schematicSheetId});let hDividers=dividers.filter(l22=>Math.abs(l22.start.y-l22.end.y)<TOL42),vDividers=dividers.filter(l22=>Math.abs(l22.start.x-l22.end.x)<TOL42);for(let sectionWithBounds of allSectionsWithBounds){let{displayName,sectionTitleFontSize,rawBounds,cell}=sectionWithBounds;if(!displayName)continue;let overlapsAnotherSection=allSectionsWithBounds.some(section=>section!==sectionWithBounds&&doBoundsOverlap(section.rawBounds,rawBounds)),dividersAbove=hDividers.map(l22=>l22.start.y).filter(y23=>y23>rawBounds.maxY),topBoundary=dividersAbove.length>0?Math.min(...dividersAbove):outer.maxY,dividersToLeft=vDividers.map(l22=>l22.start.x).filter(x23=>x23<rawBounds.minX),leftBoundary=outer.minX;overlapsAnotherSection&&(leftBoundary=cell.minX),dividersToLeft.length>0&&(leftBoundary=Math.max(...dividersToLeft));let fontSize=sectionTitleFontSize??.18;db22.schematic_text.insert({anchor:"top_left",text:displayName,font_size:fontSize,color:"#000000",position:{x:leftBoundary+LABEL_PADDING,y:Math.max(topBoundary-LABEL_PADDING,rawBounds.maxY+LABEL_PADDING+fontSize)},rotation:0,schematic_sheet_id:schematicSheetId})}}},getCircuitJsonSchematicSheetSize=sheetSize=>schematic_sheet_size.parse(sheetSize.toLowerCase()),SCHEMATIC_SHEET_DIMENSIONS_MM={a4:{width:297,height:210},ansi_b:{width:431.8,height:279.4}},resolveCircuitJsonSchematicSheetProperties=({sheetSize,sheetWidth,sheetHeight})=>{let circuitJsonSheetSize=getCircuitJsonSchematicSheetSize(sheetSize),defaultDimensions=SCHEMATIC_SHEET_DIMENSIONS_MM[circuitJsonSheetSize];return{sheetSize:circuitJsonSheetSize,sheetWidth:sheetWidth??defaultDimensions.width,sheetHeight:sheetHeight??defaultDimensions.height}},SCHEMATIC_UNIT_TO_MM2=10.16/1.1,SCHEMATIC_SHEET_INNER_MARGIN2=5/SCHEMATIC_UNIT_TO_MM2,BOUNDS_EPSILON=1e-6,getSchematicElementId=schematicElement=>{switch(schematicElement.type){case"schematic_component":return schematicElement.schematic_component_id;case"schematic_net_label":return schematicElement.schematic_net_label_id;case"schematic_trace":return schematicElement.schematic_trace_id}},warnIfSchematicElementsOutsideSheet=({db:db22,schematicSheetId,schematicSheetName,schematicSheetCenter,sheetWidth,sheetHeight})=>{let sheetWidthInSchematicUnits=sheetWidth/SCHEMATIC_UNIT_TO_MM2,sheetHeightInSchematicUnits=sheetHeight/SCHEMATIC_UNIT_TO_MM2,sheetContentBounds={minX:schematicSheetCenter.x-sheetWidthInSchematicUnits/2+SCHEMATIC_SHEET_INNER_MARGIN2,maxX:schematicSheetCenter.x+sheetWidthInSchematicUnits/2-SCHEMATIC_SHEET_INNER_MARGIN2,minY:schematicSheetCenter.y-sheetHeightInSchematicUnits/2+SCHEMATIC_SHEET_INNER_MARGIN2,maxY:schematicSheetCenter.y+sheetHeightInSchematicUnits/2-SCHEMATIC_SHEET_INNER_MARGIN2},checkedElements=[...db22.schematic_component.list(),...db22.schematic_net_label.list(),...db22.schematic_trace.list()].filter(schematicElement=>schematicElement.schematic_sheet_id===schematicSheetId);for(let schematicElement of checkedElements){let elementBounds=getSchematicElementBounds(schematicElement);if(!elementBounds||!(elementBounds.minX<sheetContentBounds.minX-BOUNDS_EPSILON||elementBounds.maxX>sheetContentBounds.maxX+BOUNDS_EPSILON||elementBounds.minY<sheetContentBounds.minY-BOUNDS_EPSILON||elementBounds.maxY>sheetContentBounds.maxY+BOUNDS_EPSILON))continue;let schematicElementId=getSchematicElementId(schematicElement);db22.schematic_element_outside_sheet_warning.insert({warning_type:"schematic_element_outside_sheet_warning",message:`${schematicElement.type} ${schematicElementId} extends outside the drawing area of schematic sheet "${schematicSheetName}"`,schematic_sheet_id:schematicSheetId,schematic_element_type:schematicElement.type,schematic_element_id:schematicElementId})}},SchematicSheet=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"resolvedSchematicSheetDisplayName","Schematic Sheet")}get config(){return{componentName:"SchematicSheet",zodProps:schematicSheetProps}}doInitialSourceGroupRender(){if(this.root?.schematicDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,explicitlyReservedSheetIndices=new Set(this.root.children.flatMap(component=>[component,...component.getDescendants()]).filter(component=>component.componentName==="SchematicSheet").map(component=>component._parsedProps.sheetIndex).filter(sheetIndex2=>sheetIndex2!==void 0)),occupiedSheetIndices=new Set([...explicitlyReservedSheetIndices,...db22.schematic_sheet.list().map(schematicSheet2=>schematicSheet2.sheet_index).filter(sheetIndex2=>sheetIndex2!==void 0)]),nextAvailableSheetIndex=0;for(;occupiedSheetIndices.has(nextAvailableSheetIndex);)nextAvailableSheetIndex+=1;let sheetIndex=props.sheetIndex??nextAvailableSheetIndex,name=props.name??props.displayName??`Sheet ${sheetIndex+1}`,displayName=props.displayName??name;this.resolvedSchematicSheetDisplayName=displayName;let resolvedSheetProperties=resolveCircuitJsonSchematicSheetProperties(props),schematicSheet=db22.schematic_sheet.insert({name,display_name:displayName,sheet_index:sheetIndex,sheet_size:resolvedSheetProperties.sheetSize,sheet_width:resolvedSheetProperties.sheetWidth,sheet_height:resolvedSheetProperties.sheetHeight,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_sheet_id=schematicSheet.schematic_sheet_id;let defaultSheetProperties=resolveCircuitJsonSchematicSheetProperties({sheetSize:"A4"});(resolvedSheetProperties.sheetSize!==defaultSheetProperties.sheetSize||resolvedSheetProperties.sheetWidth!==defaultSheetProperties.sheetWidth||resolvedSheetProperties.sheetHeight!==defaultSheetProperties.sheetHeight)&&db22.schematic_sheet_styling_warning.insert({warning_type:"schematic_sheet_styling_warning",styling_issue_type:"non_default_sheet_size",schematic_sheet_id:this.schematic_sheet_id,subcircuit_id:schematicSheet.subcircuit_id,message:`Schematic sheet "${displayName}" uses a non-default size (${resolvedSheetProperties.sheetWidth} \xD7 ${resolvedSheetProperties.sheetHeight} mm). Prefer the default A4 sheet size (297 \xD7 210 mm) for consistent schematic styling.`})}doInitialSchematicSheetRender(){if(this.root?.schematicDisabled||!this.schematic_sheet_id)return;let{db:db22}=this.root,resolvedSheetProperties=resolveCircuitJsonSchematicSheetProperties(this._parsedProps);if(this._parsedProps.sheetWidth!==void 0||this._parsedProps.sheetHeight!==void 0){warnIfSchematicElementsOutsideSheet({db:db22,schematicSheetId:this.schematic_sheet_id,schematicSheetName:this.resolvedSchematicSheetDisplayName,schematicSheetCenter:{x:0,y:0},sheetWidth:resolvedSheetProperties.sheetWidth,sheetHeight:resolvedSheetProperties.sheetHeight});return}let schematicElements=[...db22.schematic_component.list(),...db22.schematic_port.list(),...db22.schematic_text.list(),...db22.schematic_line.list(),...db22.schematic_rect.list(),...db22.schematic_circle.list(),...db22.schematic_arc.list(),...db22.schematic_path.list()].filter(element=>element.schematic_sheet_id===this.schematic_sheet_id),schematicSheetCenter={x:0,y:0};if(schematicElements.length>0){let bounds=getBoundsForSchematic(schematicElements);Number.isFinite(bounds.minX)&&Number.isFinite(bounds.maxX)&&Number.isFinite(bounds.minY)&&Number.isFinite(bounds.maxY)&&(schematicSheetCenter={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},db22.schematic_sheet.update(this.schematic_sheet_id,{center:schematicSheetCenter}))}warnIfSchematicElementsOutsideSheet({db:db22,schematicSheetId:this.schematic_sheet_id,schematicSheetName:this.resolvedSchematicSheetDisplayName,schematicSheetCenter,sheetWidth:resolvedSheetProperties.sheetWidth,sheetHeight:resolvedSheetProperties.sheetHeight})}},SchematicGraphic=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_graphic_id")}get config(){return{componentName:"SchematicGraphic",zodProps:schematicGraphicProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db22}=this.root,{imageUrl,svgContent,width,height}=this._parsedProps;if(imageUrl!==void 0){this._queueAsyncEffect("SchematicGraphicRender",async()=>{if(this.root?.schematicDisabled)return;let resolvedImageUrl=await resolveStaticFileImport(imageUrl,this.root?.platform),sourceImage=await loadImageSource(resolvedImageUrl).catch(error2=>{if(svgContent===void 0||resolvedImageUrl.startsWith("data:"))throw error2;return null});if(sourceImage===null){let asset23={project_relative_path:imageUrl.startsWith("data:")?"inline":imageUrl,url:resolvedImageUrl,mimetype:SVG_MIMETYPE},schematicGraphic2=this.root.db.schematic_graphic.insert({asset:asset23,schematic_sheet_id:this._resolveSchematicSheetId(),svg_content:svgContent,...width===void 0?{}:{width},...height===void 0?{}:{height}});this.schematic_graphic_id=schematicGraphic2.schematic_graphic_id;return}if(sourceImage.mimetype!==SVG_MIMETYPE)throw new Error(`Unsupported imageUrl for SchematicGraphic: "${imageUrl}". Expected an SVG image.`);let asset3={project_relative_path:imageUrl.startsWith("data:")?sourceImage.projectRelativePath:imageUrl,url:sourceImage.dataUrl,mimetype:sourceImage.mimetype},fallbackSvgContent=sourceImage.dataUrl.startsWith("data:")?svgContent:sourceImage.text,schematicGraphic=this.root.db.schematic_graphic.insert({asset:asset3,schematic_sheet_id:this._resolveSchematicSheetId(),...fallbackSvgContent===void 0?{}:{svg_content:fallbackSvgContent},...width===void 0?{}:{width},...height===void 0?{}:{height}});this.schematic_graphic_id=schematicGraphic.schematic_graphic_id});return}if(svgContent!==void 0){let asset3={project_relative_path:"inline",url:`data:image/svg+xml,${encodeURIComponent(svgContent)}`,mimetype:SVG_MIMETYPE},schematicGraphic=db22.schematic_graphic.insert({asset:asset3,schematic_sheet_id:this._resolveSchematicSheetId(),...width===void 0?{}:{width},...height===void 0?{}:{height}});this.schematic_graphic_id=schematicGraphic.schematic_graphic_id}}},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:db22}=this.root,{_parsedProps:props}=this,rows=this.children.filter(c23=>c23.componentName==="SchematicRow");if(rows.length===0)return;let grid22=[],maxCols=0;for(let row of rows){let cells=row.children.filter(c23=>c23.componentName==="SchematicCell");maxCols=Math.max(maxCols,cells.length)}for(let i23=0;i23<rows.length;i23++)grid22[i23]=[];for(let i23=0;i23<rows.length;i23++){let cells=rows[i23].children.filter(c23=>c23.componentName==="SchematicCell"),k22=0;for(let j22=0;j22<cells.length;j22++){for(;grid22[i23][k22];)k22++;let cell=cells[j22],colSpan=cell._parsedProps.colSpan??1,rowSpan=cell._parsedProps.rowSpan??1;for(let r23=0;r23<rowSpan;r23++)for(let c23=0;c23<colSpan;c23++)grid22[i23+r23]||(grid22[i23+r23]=[]),grid22[i23+r23][k22+c23]=cell;k22+=colSpan}}maxCols=Math.max(0,...grid22.map(r23=>r23.length));let rowHeights=rows.map((row,i23)=>row._parsedProps.height??1),colWidths=Array.from({length:maxCols},(_23,j22)=>{let maxWidth=0;for(let i23=0;i23<rows.length;i23++){let cell=grid22[i23]?.[j22];if(cell){let text2=cell._parsedProps.text??cell._parsedProps.children,cellWidth=cell._parsedProps.width??(text2?.length??2)*.5;cellWidth>maxWidth&&(maxWidth=cellWidth)}}return maxWidth||10}),anchorPos=this._getGlobalSchematicPositionBeforeLayout(),table=db22.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||"",schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_table_id=table.schematic_table_id;let processedCells=new Set,yOffset=0;for(let i23=0;i23<rows.length;i23++){let xOffset=0;for(let j22=0;j22<maxCols;j22++){let cell=grid22[i23]?.[j22];if(cell&&!processedCells.has(cell)){processedCells.add(cell);let cellProps=cell._parsedProps,rowSpan=cellProps.rowSpan??1,colSpan=cellProps.colSpan??1,cellWidth=0;for(let c23=0;c23<colSpan;c23++)cellWidth+=colWidths[j22+c23];let cellHeight=0;for(let r23=0;r23<rowSpan;r23++)cellHeight+=rowHeights[i23+r23];db22.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:i23,end_row_index:i23+rowSpan-1,start_column_index:j22,end_column_index:j22+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[j22]&&(xOffset+=colWidths[j22])}yOffset+=rowHeights[i23]}}},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}}},AnalogSimulation=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_experiment_id",null)}get config(){return{componentName:"AnalogSimulation",zodProps:analogSimulationProps}}getSpiceEngineName(){return this._parsedProps.spiceEngine}usesIndependentGraphAxes(){return this._parsedProps.graphIndependentAxes===!0}doInitialSimulationRender(){let{db:db22}=this.root,{duration,name,startTime,timePerStep,spiceOptions:spiceOptions3}=this._parsedProps,durationMs=duration||10,timePerStepMs=timePerStep||.01,simulationExperiment=db22.simulation_experiment.insert({name:name??"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:durationMs,start_time_ms:startTime,time_per_step:timePerStepMs,spice_options:spiceOptions3});this.simulation_experiment_id=simulationExperiment.simulation_experiment_id}},AnalogAnalysisSimulation=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_experiment_id",null)}getSpiceEngineName(){return typeof this.props.spiceEngine=="string"?this.props.spiceEngine:void 0}usesIndependentGraphAxes(){return this.props.graphIndependentAxes===!0}getOrCreateSimulationExperiment(){if(this.simulation_experiment_id)return this.root?.db.simulation_experiment.get(this.simulation_experiment_id)??null;if(this.children.filter(child=>child.componentName==="AnalogSweepParameter").length>1)return this.renderError("An analog simulation can contain at most one sweep parameter."),null;let simulationExperiment=this.insertSimulationExperiment();return this.simulation_experiment_id=simulationExperiment?.simulation_experiment_id??null,simulationExperiment}doInitialSimulationRender(){this.getOrCreateSimulationExperiment()}},AnalogTransientSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogTransientSimulation",zodProps:analogTransientSimulationProps}}insertSimulationExperiment(){let{db:db22}=this.root,{duration,name,startTime,timePerStep,spiceOptions:spiceOptions3}=this._parsedProps;return db22.simulation_experiment.insert({name:name??"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:duration,start_time_ms:startTime,time_per_step:timePerStep,spice_options:spiceOptions3})}},AnalogDcOperatingPointSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogDcOperatingPointSimulation",zodProps:analogDcOperatingPointSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions3}=this._parsedProps;return this.root.db.simulation_experiment.insert({name:name??"spice_dc_operating_point",experiment_type:"spice_dc_operating_point",spice_options:spiceOptions3})}},AnalogDcSweepSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogDcSweepSimulation",zodProps:analogDcSweepSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions3,sweepSource,sweepStart,sweepStop,sweepStep}=this._parsedProps,sweepSourceComponent=(this.getGroup()??this.getSubcircuit())?.selectOne(sweepSource),dcSweepSourceFields;if(sweepSourceComponent instanceof VoltageSource2){sweepSourceComponent.runRenderPhase("SimulationRender");let simulationVoltageSourceId=sweepSourceComponent.simulation_voltage_source_id;if(!simulationVoltageSourceId)return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;dcSweepSourceFields={dc_sweep_voltage_source_id:simulationVoltageSourceId,dc_sweep_unit:"V"}}else if(sweepSourceComponent instanceof CurrentSource2){sweepSourceComponent.runRenderPhase("SimulationRender");let simulationCurrentSourceId=sweepSourceComponent.simulation_current_source_id;if(!simulationCurrentSourceId)return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;dcSweepSourceFields={dc_sweep_current_source_id:simulationCurrentSourceId,dc_sweep_unit:"A"}}else return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;return this.root.db.simulation_experiment.insert({name:name??"spice_dc_sweep",experiment_type:"spice_dc_sweep",spice_options:spiceOptions3,...dcSweepSourceFields,dc_sweep_start:sweepStart,dc_sweep_stop:sweepStop,dc_sweep_step:sweepStep})}},AnalogAcSweepSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogAcSweepSimulation",zodProps:analogAcSweepSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions3,sweepType,samplesPerInterval,sampleCount,startFrequency,stopFrequency}=this._parsedProps;return this.root.db.simulation_experiment.insert({name:name??"spice_ac_analysis",experiment_type:"spice_ac_analysis",spice_options:spiceOptions3,ac_sweep_type:sweepType,ac_samples_per_interval:samplesPerInterval,ac_sample_count:sampleCount,ac_start_frequency_hz:startFrequency,ac_stop_frequency_hz:stopFrequency})}},parameterUnits={resistance:"\u03A9",capacitance:"F",inductance:"H",voltage:"V",current:"A"},isParameterSweepCoordinateInRange=({parameterSweepCoordinate,stop,step})=>{let tolerance=Math.abs(step)*1e-9;return step>0?parameterSweepCoordinate<=stop+tolerance:parameterSweepCoordinate>=stop-tolerance},getGeneratedParameterSweepCoordinates=({start,stop,step})=>{let parameterSweepCoordinates=[];for(let parameterSweepCoordinate=start;isParameterSweepCoordinateInRange({parameterSweepCoordinate,stop,step});parameterSweepCoordinate=start+parameterSweepCoordinates.length*step)if(parameterSweepCoordinates.push(parameterSweepCoordinate),parameterSweepCoordinates.length>1e6)throw new Error("Parameter sweep exceeds 1,000,000 points");return parameterSweepCoordinates},getParameterSweepTargetSelector=props=>props.parameterType==="resistance"?props.resistorRef:props.parameterType==="capacitance"?props.capacitorRef:props.parameterType==="inductance"?props.inductorRef:props.parameterType==="voltage"?props.net:props.currentSourceRef,AnalogSweepParameter_doInitialSimulationRender=analogSweepParameter=>{if(!(analogSweepParameter.parent instanceof AnalogAnalysisSimulation)){analogSweepParameter.renderError("analog.sweepparameter must be nested directly in an analog simulation.");return}let simulationExperiment=analogSweepParameter.parent.getOrCreateSimulationExperiment();if(!simulationExperiment)return;let props=analogSweepParameter._parsedProps,parameterSweepCoordinates=props.values??getGeneratedParameterSweepCoordinates({start:props.start,stop:props.stop,step:props.step}),simulationScope=analogSweepParameter.parent.getGroup()??analogSweepParameter.parent.getSubcircuit(),targetSelector=getParameterSweepTargetSelector(props),parameterUnit=parameterUnits[props.parameterType],simulationParameterSweepTable=analogSweepParameter.root.db.simulation_parameter_sweep,simulationParameterSweepFields={simulation_experiment_id:simulationExperiment.simulation_experiment_id,name:props.name,parameter_type:props.parameterType,parameter_values:parameterSweepCoordinates,parameter_unit:parameterUnit},simulationParameterSweepId;if(props.parameterType==="voltage"){let sweepNet=simulationScope?.selectOne(targetSelector,{type:"net"});if(!sweepNet?.source_net_id){analogSweepParameter.renderError(`Voltage sweep net "${targetSelector}" could not be resolved.`);return}simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"voltage",source_net_id:sweepNet.source_net_id}).simulation_parameter_sweep_id}else{let sourceComponentId=simulationScope?.selectOne(targetSelector)?.source_component_id;if(!sourceComponentId){analogSweepParameter.renderError(`Parameter sweep target "${targetSelector}" could not be resolved.`);return}props.parameterType==="resistance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"resistance",resistor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:props.parameterType==="capacitance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"capacitance",capacitor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:props.parameterType==="inductance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"inductance",inductor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"current",current_source_component_id:sourceComponentId}).simulation_parameter_sweep_id}analogSweepParameter.simulation_parameter_sweep_id=simulationParameterSweepId},AnalogSweepParameter=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_parameter_sweep_id",null)}get config(){return{componentName:"AnalogSweepParameter",zodProps:analogSweepParameterProps}}doInitialSimulationRender(){AnalogSweepParameter_doInitialSimulationRender(this)}},PcbReturnCurrentSimulation=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_experiment_id",null)}get config(){return{componentName:"PcbReturnCurrentSimulation",zodProps:pcbReturnCurrentSimulationProps}}doInitialSimulationRender(){if(this.root?.pcbDisabled)return;this.parent?.componentName==="PcbReturnCurrentSimulation"&&this.renderError("A PCB return-current simulation cannot contain another simulation."),this.children.some(child=>child.componentName!=="PcbReturnCurrentExcitation")&&this.renderError("A PCB return-current simulation can contain only return-current excitations.");let experiment=this.root.db.simulation_experiment.insert({name:this._parsedProps.name??"PCB return current",experiment_type:"pcb_return_current"});this.simulation_experiment_id=experiment.simulation_experiment_id}updateSimulationRender(){this.simulation_experiment_id&&this.root.db.simulation_experiment.update(this.simulation_experiment_id,{name:this._parsedProps.name??"PCB return current"})}removeSimulationRender(){this.simulation_experiment_id&&(this.root.db.simulation_experiment.delete(this.simulation_experiment_id),this.simulation_experiment_id=null)}},positionToleranceMm=1e-6;function PcbReturnCurrentExcitation_doInitialPcbSimulationRender(excitation){if(excitation.root?.pcbDisabled)return;let{db:db22}=excitation.root,props=excitation._parsedProps,simulation2=excitation.parent;if(simulation2?.componentName!=="PcbReturnCurrentSimulation"){excitation.renderError("A PCB return-current excitation must be directly inside a PCB return-current simulation.");return}if(!simulation2.simulation_experiment_id){excitation.renderError("The PCB return-current simulation has not been declared.");return}let subcircuit=excitation.getSubcircuit(),resolvePcbPort=(selector2,role)=>{let ports=subcircuit.selectAll(selector2).filter(component=>component.componentName==="Port");ports.length!==1&&excitation.renderError(`${role} selector "${selector2}" must identify exactly one physical PCB port.`);let port=ports[0],pcbPort=port?.pcb_port_id?db22.pcb_port.get(port.pcb_port_id):null,hasPhysicalPad=pcbPort&&(db22.pcb_smtpad.list({pcb_port_id:pcbPort.pcb_port_id}).length>0||db22.pcb_plated_hole.list({pcb_port_id:pcbPort.pcb_port_id}).length>0);return(!pcbPort||!hasPhysicalPad)&&excitation.renderError(`${role} selector "${selector2}" needs a physical PCB pad or plated-hole port.`),pcbPort},signalSource=resolvePcbPort(props.source,"Signal source"),signalLoad=resolvePcbPort(props.load,"Signal load"),returnSource=resolvePcbPort(props.returnSource,"Return source (load-side ground)"),returnSink=resolvePcbPort(props.returnSink,"Return sink (driver-side ground)");new Set([signalSource.pcb_port_id,signalLoad.pcb_port_id,returnSource.pcb_port_id,returnSink.pcb_port_id]).size!==4&&excitation.renderError("Signal source, signal load, return source and return sink must be four distinct physical PCB ports.");let groundNets=subcircuit.selectAll(props.ground.startsWith("net.")?"net":props.ground).filter(component=>component.componentName==="Net"&&(!props.ground.startsWith("net.")||component.getPortSelector()===props.ground));(groundNets.length!==1||!groundNets[0].source_net_id)&&excitation.renderError(`Ground selector "${props.ground}" must identify exactly one source net.`);let groundNet=db22.source_net.get(groundNets[0].source_net_id),groundConnectivityKey=groundNet.subcircuit_connectivity_map_key;for(let[pcbPort,selector2]of[[signalSource,props.source],[signalLoad,props.load]])groundConnectivityKey&&db22.source_port.get(pcbPort.source_port_id)?.subcircuit_connectivity_map_key===groundConnectivityKey&&excitation.renderError(`Signal terminal "${selector2}" is electrically connected to ground net "${groundNet.name}".`);for(let[pcbPort,selector2]of[[returnSource,props.returnSource],[returnSink,props.returnSink]]){let sourcePort=db22.source_port.get(pcbPort.source_port_id);(!groundConnectivityKey||sourcePort?.subcircuit_connectivity_map_key!==groundConnectivityKey)&&excitation.renderError(`Return contact "${selector2}" is not electrically connected to ground net "${groundNet.name}".`)}let contact=(pcbPort,selector2,requestedLayer,role)=>{let layers=[...new Set(pcbPort.layers)];!requestedLayer&&layers.length!==1&&excitation.renderError(`${role} "${selector2}" spans multiple layers; specify ${role==="Return source"?"returnSourceLayer":"returnSinkLayer"}.`);let layer=requestedLayer??layers[0];return layers.includes(layer)||excitation.renderError(`${role} "${selector2}" has no physical port on layer "${layer}".`),{contact_type:"pcb_port",pcb_port_id:pcbPort.pcb_port_id,x:pcbPort.x,y:pcbPort.y,layer}},returnSourceContact=contact(returnSource,props.returnSource,props.returnSourceLayer,"Return source"),returnSinkContact=contact(returnSink,props.returnSink,props.returnSinkLayer,"Return sink");for(let[signalPort,referenceContact]of[[signalSource,returnSinkContact],[signalLoad,returnSourceContact]])Math.hypot(signalPort.x-referenceContact.x,signalPort.y-referenceContact.y)<=positionToleranceMm&&signalPort.layers.includes(referenceContact.layer)&&excitation.renderError("A signal terminal and its ground reference must occupy different physical PCB locations on the same layer.");let selectedSourceTraceId;if(props.trace){let traces2=subcircuit.selectAll(props.trace).filter(component=>component.componentName==="Trace");(traces2.length!==1||!traces2[0].source_trace_id)&&excitation.renderError(`Trace selector "${props.trace}" must identify exactly one routed source trace.`),selectedSourceTraceId=traces2[0].source_trace_id}let endpointMatches=(endpoint,pcbPort,end)=>endpoint?.route_type==="wire"&&Math.hypot(endpoint.x-pcbPort.x,endpoint.y-pcbPort.y)<=positionToleranceMm&&pcbPort.layers.includes(endpoint.layer)&&(!endpoint[`${end}_pcb_port_id`]||endpoint[`${end}_pcb_port_id`]===pcbPort.pcb_port_id),traces=db22.pcb_trace.list().filter(pcbTrace=>{if(pcbTrace.subcircuit_id!==subcircuit.subcircuit_id||selectedSourceTraceId&&pcbTrace.source_trace_id!==selectedSourceTraceId)return!1;let sourceTrace=pcbTrace.source_trace_id?db22.source_trace.get(pcbTrace.source_trace_id):null;if(!sourceTrace||sourceTrace.connected_source_port_ids.length!==2||!sourceTrace.connected_source_port_ids.includes(signalSource.source_port_id)||!sourceTrace.connected_source_port_ids.includes(signalLoad.source_port_id))return!1;let first=pcbTrace.route[0],last=pcbTrace.route.at(-1);return endpointMatches(first,signalSource,"start")&&endpointMatches(last,signalLoad,"end")||endpointMatches(first,signalLoad,"start")&&endpointMatches(last,signalSource,"end")});traces.length!==1&&excitation.renderError(`The connection from "${props.source}" to "${props.load}" must have exactly one complete routed PCB trace${props.trace?` selected by "${props.trace}"`:"; use trace to disambiguate multiple routes"}. Split or branched routes are not supported.`);let previousExcitations=db22.simulation_return_current_excitation.list({simulation_experiment_id:simulation2.simulation_experiment_id});previousExcitations.some(previous=>previous.pcb_trace_id===traces[0].pcb_trace_id)&&excitation.renderError("A PCB return-current simulation can excite each signal trace only once. Use separate experiments to compare different currents or directions."),previousExcitations.some(previous=>previous.ground_source_net_id!==groundNet.source_net_id)&&excitation.renderError("All excitations in a PCB return-current simulation must use the same ground net. Use separate experiments for different ground nets.");let inserted=db22.simulation_return_current_excitation.insert({simulation_experiment_id:simulation2.simulation_experiment_id,pcb_trace_id:traces[0].pcb_trace_id,ground_source_net_id:groundNet.source_net_id,current:props.current,return_source:returnSourceContact,return_sink:returnSinkContact,source_port:{signal_pcb_port_id:signalSource.pcb_port_id,reference_pcb_port_id:returnSink.pcb_port_id,reference_layer:returnSinkContact.layer,resistance:props.sourceImpedance},load_port:{signal_pcb_port_id:signalLoad.pcb_port_id,reference_pcb_port_id:returnSource.pcb_port_id,reference_layer:returnSourceContact.layer,resistance:props.loadImpedance}});excitation.simulation_return_current_excitation_id=inserted.simulation_return_current_excitation_id}var PcbReturnCurrentExcitation=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_return_current_excitation_id",null)}get config(){return{componentName:"PcbReturnCurrentExcitation",zodProps:pcbReturnCurrentExcitationProps}}doInitialPcbSimulationRender(){PcbReturnCurrentExcitation_doInitialPcbSimulationRender(this)}updatePcbSimulationRender(){this.removePcbSimulationRender(),this.doInitialPcbSimulationRender()}removePcbSimulationRender(){this.simulation_return_current_excitation_id&&(this.root.db.simulation_return_current_excitation.delete(this.simulation_return_current_excitation_id),this.simulation_return_current_excitation_id=null)}};function getLabelBounds3(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 cx22,cy22,w23,h23;if(elm.type==="schematic_component")cx22=elm.center?.x,cy22=elm.center?.y,w23=elm.size?.width,h23=elm.size?.height;else if(elm.type==="schematic_text")cx22=elm.position?.x,cy22=elm.position?.y,w23=(elm.text?.length??0)*.1,h23=.2;else return null;return typeof cx22=="number"&&typeof cy22=="number"&&typeof w23=="number"&&typeof h23=="number"?{minX:cx22-w23/2,maxX:cx22+w23/2,minY:cy22-h23/2,maxY:cy22+h23/2}:null}function getOverlapArea(a22,b22){if(!doBoundsOverlap(a22,b22))return 0;let overlapWidth=Math.min(a22.maxX,b22.maxX)-Math.max(a22.minX,b22.minX),overlapHeight=Math.min(a22.maxY,b22.maxY)-Math.max(a22.minY,b22.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(a22=>a22!==defaultAlignment)],bestAlignment=defaultAlignment,minOverlapArea=1/0;for(let alignment of orderedAlignments){let labelBounds=getLabelBounds3(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:db22}=this.root,{connectsTo,name,referenceTo,color:color3,graphDisplayName,graphCenter,graphVerticalOffset,graphVoltagePerDiv}=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=color3??getSimulationColorForId(connectedId);let finalName=name;finalName||(finalName=targets[0].split(" > ").map(s23=>s23.replace(/^\./,"")).join(".")),this.finalProbeName=finalName??null;let{simulation_voltage_probe_id}=db22.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});if(this.simulation_voltage_probe_id=simulation_voltage_probe_id,graphDisplayName!==void 0||graphCenter!==void 0||graphVerticalOffset!==void 0||graphVoltagePerDiv!==void 0){let graphVoltagePerDivValue=parseSimulationGraphValue(graphVoltagePerDiv),graphVerticalOffsetValue=parseSimulationGraphValue(graphVerticalOffset);db22.simulation_oscilloscope_trace.insert({simulation_voltage_probe_id,display_name:graphDisplayName,color:color3??void 0,display_center_value:graphCenter,volts_per_div:graphVoltagePerDivValue,display_center_offset_divs:graphVerticalOffsetValue!==void 0&&graphVoltagePerDivValue!==void 0&&graphVoltagePerDivValue!==0?graphVerticalOffsetValue/graphVoltagePerDivValue:void 0})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled)return;let{db:db22}=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 db22.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:[...db22.schematic_component.list(),...db22.schematic_text.list()],defaultAlignment:"top_right"}),schematic_voltage_probe3=db22.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}},SpiceModel=class extends PrimitiveComponent2{get config(){return{componentName:"SpiceModel",zodProps:spicemodelProps}}doInitialSimulationRender(){if(this.getInheritedProperty("analogSimulationDisabled"))return;let parent=this.parent;if(!parent)return;let parentSourceComponentId=parent.source_component_id;if(!parentSourceComponentId){this._insertSpiceModelError("spicemodel must be attached to a source component.",this._parsedProps);return}let{source,spicePinMapping}=this._parsedProps,subckt=parseSpiceNetlist(source).subckts[0]??null,spicePinNames=subckt?.pins.map(pin=>pin.name);if(!subckt||!spicePinNames||spicePinNames.length===0){this._insertSpiceModelError("spicemodel source must contain a .subckt declaration with a model name and pins.",source);return}let mapping=spicePinMapping??{};for(let spicePinName of Object.keys(mapping))if(!spicePinNames.includes(spicePinName)){this._insertSpiceModelError(`spicePinMapping references SPICE pin "${spicePinName}", but it is not present in .subckt ${subckt.name}.`,mapping);return}let spicePinToSourcePortMap={},seenSourcePortIds=new Set;for(let spicePinName of spicePinNames){let componentPinName=mapping[spicePinName]??spicePinName,matchingPorts=parent.selectAll("port").filter(port=>port instanceof Port&&port.isMatchingAnyOf([componentPinName]));if(matchingPorts.length!==1||!matchingPorts[0].source_port_id){this._insertSpiceModelError(`Could not resolve SPICE pin "${spicePinName}" to exactly one component port using "${componentPinName}".`,mapping);return}let sourcePortId=matchingPorts[0].source_port_id;if(seenSourcePortIds.has(sourcePortId)){this._insertSpiceModelError(`spicePinMapping maps more than one SPICE pin to component port "${componentPinName}".`,mapping);return}seenSourcePortIds.add(sourcePortId),spicePinToSourcePortMap[spicePinName]=sourcePortId}this.root.db.simulation_spice_subcircuit.insert({source_component_id:parentSourceComponentId,spice_pin_to_source_port_map:spicePinToSourcePortMap,subcircuit_source:source})}_insertSpiceModelError(message,propertyValue){this.root.db.source_invalid_component_property_error.insert({source_component_id:this.parent?.source_component_id||"",property_name:"spiceModel",property_value:propertyValue,message,error_type:"source_invalid_component_property_error"})}};function getPcbFlexBoardTransform(primitive){let boardId=primitive._getBoard()?.pcb_board_id,board=boardId?primitive.root.db.pcb_board.get(boardId):null;if(!board)throw new Error(`${primitive.componentName} must be inside a board`);let transform7=compose2(translate2(-board.center.x,-board.center.y),primitive._computePcbGlobalTransformBeforeLayout());return{board,transform:transform7}}var PcbBend=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_bend_id",null);__publicField(this,"tearReliefCutoutIds",[])}get config(){return{componentName:"PcbBend",zodProps:pcbBendProps}}doInitialPcbFlexRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,props=this._parsedProps,{board,transform:transform7}=getPcbFlexBoardTransform(this),bend=db22.pcb_bend.insert({pcb_board_id:board.pcb_board_id,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,name:props.name,start:applyToPoint2(transform7,{x:props.x1,y:props.y1}),end:applyToPoint2(transform7,{x:props.x2,y:props.y2}),bend_angle:props.bendAngle,bend_radius:props.bendRadius,bend_side:props.bendSide});if(this.pcb_bend_id=bend.pcb_bend_id,props.tearReliefRadius!==void 0)for(let endpoint of[bend.start,bend.end]){let cutout=db22.pcb_cutout.insert({shape:"circle",center:{x:endpoint.x+board.center.x,y:endpoint.y+board.center.y},radius:props.tearReliefRadius,pcb_board_id:board.pcb_board_id,pcb_group_id:bend.pcb_group_id,subcircuit_id:bend.subcircuit_id});this.tearReliefCutoutIds.push(cutout.pcb_cutout_id)}}removePcbFlexRender(){for(let cutoutId of this.tearReliefCutoutIds)this.root.db.pcb_cutout.delete(cutoutId);this.tearReliefCutoutIds=[],this.pcb_bend_id&&(this.root.db.pcb_bend.delete(this.pcb_bend_id),this.pcb_bend_id=null)}},PcbStiffener=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_stiffener_id",null)}get config(){return{componentName:"PcbStiffener",zodProps:pcbStiffenerProps}}doInitialPcbFlexRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,props=this._parsedProps,{board,transform:transform7}=getPcbFlexBoardTransform(this),base={pcb_board_id:board.pcb_board_id,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,name:props.name,layer:props.layer,material:props.material,thickness:props.thickness,adhesive_thickness:props.adhesiveThickness},geometry=props.shape==="rect"?{shape:"rect",center:applyToPoint2(transform7,{x:0,y:0}),rotation:decomposeTSR2(transform7).rotation.angle*180/Math.PI,width:props.width,height:props.height}:{shape:"polygon",outline:props.outline.map(point62=>applyToPoint2(transform7,point62))};this.pcb_stiffener_id=db22.pcb_stiffener.insert({...base,...geometry}).pcb_stiffener_id}doRemovePcbFlexRender(){this.pcb_stiffener_id&&(this.root.db.pcb_stiffener.delete(this.pcb_stiffener_id),this.pcb_stiffener_id=null)}},AssemblyPrintedPart=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0);__publicField(this,"compiledJscadInput");__publicField(this,"compiledJscad")}get config(){return{componentName:"AssemblyPrintedPart",zodProps:assemblyPrintedPartProps}}get printedPartPlan(){if(this._parsedProps.jscad){if(!this.compiledJscad||this.compiledJscadInput!==this._parsedProps.jscad){let{geometry,referencePlanes}=(0,import_jscad_planner3.resolveReferencePlanes)(renderToJscadPlan(this._parsedProps.jscad));if(!geometry)throw new Error(`assembly.printedpart "${this.name}" needs solid geometry in addition to references`);this.compiledJscad={geometry,referencePlanes},this.compiledJscadInput=this._parsedProps.jscad}return this.compiledJscad}}doInitialReactSubtreesRender(){(0,import_react13.isValidElement)(this.props.cadModel)&&this.add(createInstanceFromReactElement(this.props.cadModel))}doInitialSourceRender(){this.printedPartPlan,getPartReferenceSurfaces(this),this.source_component_id=this.root.db.source_component.insert({ftype:"printedpart",name:this.name,color:this._parsedProps.color,material:this._parsedProps.material}).source_component_id}doInitialCadModelRender(){if(!this.root||this.root.pcbDisabled||!this.source_component_id)return;renderPartReferenceSurfaces(this);let plan=this.printedPartPlan;if(!plan){let model27=resolveAssemblyModel(this._parsedProps)??this._parsedProps.cadModel,placement=resolveAssemblyPlacement(this);if(!model27||typeof model27=="object"&&"type"in model27)return;if(typeof model27=="object"&&"jscad"in model27){let{geometry}=(0,import_jscad_planner3.resolveReferencePlanes)(model27.jscad);if(!geometry)throw new Error(`assembly.printedpart "${this.name}" needs solid geometry in addition to references`);model27={...model27,jscad:geometry}}this.cad_component_id=renderAssemblyCadModel(this,model27,placement);return}let{transforms,subcircuitId}=resolvePrintedPartMounts(this),transform7=transforms.get(this),angles=getAssemblyEulerAngles(transform7);this.cad_component_id=renderAssemblyCadModel(this,{jscad:{type:"rotate",angles,shape:plan.geometry}},{position:{x:transform7[12],y:transform7[13],z:transform7[14]},pcbRotation:0,layer:"top",subcircuit_id:subcircuitId})}},bulletDiameterSchema=external_exports.union([external_exports.literal(2),external_exports.literal(3),external_exports.literal(3.5),external_exports.literal(4),external_exports.literal(5),external_exports.literal(5.5),external_exports.literal(6),external_exports.literal(8)]),bulletGenderSchema=external_exports.enum(["male","female"]);function getBulletConnector({diameter,gender,pinCount=1,pitch=diameter+2}){let contactDepth=diameter*2,bodyDiameter=diameter+(gender==="female"?1:.6);return{kind:gender==="male"?"bullet_male":"bullet_female",diameter,contactDepth,pinCount,pitch,bodyWidth:bodyDiameter+(pinCount-1)*pitch,bodyHeight:bodyDiameter,bodyDepth:contactDepth+diameter*1.5}}var cableStandardSchema=external_exports.enum(["usb_c","jst_sh","jst_ph","us_mains","bullet","adaptercable"]),dimension=external_exports.number().finite().positive(),color2=external_exports.string().regex(/^#[0-9a-fA-F]{6}$/),body={bodyWidth:dimension,bodyHeight:dimension,bodyDepth:dimension},cableConnectorSchema=external_exports.discriminatedUnion("kind",[external_exports.object({kind:external_exports.literal("bullet_male"),...body,diameter:bulletDiameterSchema,pinCount:external_exports.number().int().min(1).max(16).default(1),pitch:dimension,contactDepth:dimension}).strict(),external_exports.object({kind:external_exports.literal("bullet_female"),...body,diameter:bulletDiameterSchema,pinCount:external_exports.number().int().min(1).max(16).default(1),pitch:dimension,contactDepth:dimension}).strict(),external_exports.object({kind:external_exports.literal("usb_c_plug"),...body,shellWidth:dimension,shellHeight:dimension,shellDepth:dimension}).strict(),external_exports.object({kind:external_exports.literal("jst_sh_housing"),...body,pinCount:external_exports.number().int().min(2).max(15),pitch:external_exports.literal(1)}).strict(),external_exports.object({kind:external_exports.literal("jst_ph_housing"),...body,pinCount:external_exports.number().int().min(2).max(16),pitch:external_exports.literal(2)}).strict(),external_exports.object({kind:external_exports.literal("nema_5_15p"),...body}).strict(),external_exports.object({kind:external_exports.literal("iec_c13"),...body}).strict()]),cableCrossSectionSchema=external_exports.discriminatedUnion("kind",[external_exports.object({kind:external_exports.literal("round_jacket"),diameter:dimension,color:color2}).strict(),external_exports.object({kind:external_exports.literal("wire_bundle"),wires:external_exports.array(external_exports.object({diameter:dimension,color:color2}).strict()).min(2),wirePitch:dimension}).strict()]),cableDefinitionSchema=external_exports.object({standard:cableStandardSchema,connectorA:cableConnectorSchema,connectorB:cableConnectorSchema,crossSection:cableCrossSectionSchema}).strict().superRefine((cable,ctx)=>{let{connectorA,connectorB,crossSection}=cable,expected={usb_c:["usb_c_plug","usb_c_plug"],jst_sh:["jst_sh_housing","jst_sh_housing"],jst_ph:["jst_ph_housing","jst_ph_housing"],us_mains:["nema_5_15p","iec_c13"],bullet:[connectorA.kind,connectorB.kind],adaptercable:[connectorA.kind,connectorB.kind]}[cable.standard];if((connectorA.kind!==expected[0]||connectorB.kind!==expected[1])&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Connector kinds must match the cable standard"}),cable.standard==="bullet"){(!("diameter"in connectorA)||!("diameter"in connectorB)||connectorA.diameter!==connectorB.diameter||"pinCount"in connectorA&&"pinCount"in connectorB&&connectorA.pinCount!==connectorB.pinCount)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Bullet connectors require supported nominal diameters and matching contact counts"}),"pinCount"in connectorA&&(connectorA.pinCount===1&&crossSection.kind!=="round_jacket"||connectorA.pinCount>1&&crossSection.kind!=="wire_bundle")&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Bullet cables require one insulated wire per contact"});for(let connector of[connectorA,connectorB])"diameter"in connector&&(connector.bodyHeight<=connector.diameter||connector.pitch<connector.bodyHeight||Math.abs(connector.bodyWidth-(connector.bodyHeight+(connector.pinCount-1)*connector.pitch))>1e-6||crossSection.kind==="wire_bundle"&&(crossSection.wirePitch!==connector.pitch||crossSection.wires.some(wire=>wire.diameter>connector.bodyHeight))||connector.contactDepth>=connector.bodyDepth||crossSection.kind==="round_jacket"&&crossSection.diameter>connector.bodyHeight)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Bullet contact, body, and wire dimensions must fit"})}else cable.standard!=="adaptercable"&&("diameter"in connectorA||"diameter"in connectorB)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Bullet connectors require the bullet cable standard"});if(cable.standard==="adaptercable"){"pinCount"in connectorA&&"pinCount"in connectorB&&connectorA.pinCount!==connectorB.pinCount&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Adapter connector pin counts must match"}),"pinCount"in connectorA&&"pinCount"in connectorB&&connectorA.pinCount>1&&crossSection.kind!=="wire_bundle"&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Adapter cables require one wire per explicit contact"});for(let connector of[connectorA,connectorB])"diameter"in connector&&(connector.bodyHeight<=connector.diameter||connector.pitch<connector.bodyHeight||Math.abs(connector.bodyWidth-(connector.bodyHeight+(connector.pinCount-1)*connector.pitch))>1e-6||connector.contactDepth>=connector.bodyDepth||connector.pinCount===1&&(crossSection.kind!=="round_jacket"||crossSection.diameter>connector.bodyHeight)||connector.pinCount>1&&(crossSection.kind!=="wire_bundle"||crossSection.wires.some(wire=>wire.diameter>connector.bodyHeight)))&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Bullet contact, body, and wire dimensions must fit"})}if(crossSection.kind==="wire_bundle"){for(let connector of[connectorA,connectorB])(!("pinCount"in connector)||connector.pinCount!==crossSection.wires.length)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Bundle wire count must match each connector pin count"}),"pitch"in connector&&crossSection.wires.some(wire=>wire.diameter>connector.pitch)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Insulated wires must fit each connector pitch"});crossSection.wires.some(wire=>wire.diameter>crossSection.wirePitch)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Bundle wires must not overlap in the cross section"})}else(cable.standard==="jst_sh"||cable.standard==="jst_ph")&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"JST cables require a wire bundle"})}),adapterCableInputSchema=external_exports.object({standard:external_exports.literal("adaptercable"),connectorA:cableConnectorSchema,connectorB:cableConnectorSchema,crossSection:cableCrossSectionSchema.optional()}).strict(),color22=external_exports.string().regex(/^#[0-9a-fA-F]{6}$/),jacket={jacketDiameter:external_exports.number().finite().positive().default(4),color:color22.default("#263449")},cableInputSchema=external_exports.discriminatedUnion("standard",[external_exports.object({standard:external_exports.literal("bullet"),diameter:bulletDiameterSchema,pinCount:external_exports.number().int().min(1).max(16).default(1),genderA:bulletGenderSchema.default("male"),genderB:bulletGenderSchema.default("female"),wireDiameter:external_exports.number().finite().positive().default(2),color:color22.default("#263449")}).strict(),external_exports.object({standard:external_exports.literal("usb_c"),...jacket}).strict(),external_exports.object({standard:external_exports.literal("jst_sh"),pinCount:external_exports.number().int().min(2).max(15).default(4),wireDiameter:external_exports.number().finite().min(.4).max(.8).default(.6)}).strict(),external_exports.object({standard:external_exports.literal("jst_ph"),pinCount:external_exports.number().int().min(2).max(16).default(2),wireDiameter:external_exports.number().finite().min(.8).max(1.5).default(1.2)}).strict(),external_exports.object({standard:external_exports.literal("us_mains"),...jacket,jacketDiameter:jacket.jacketDiameter.default(6.2)}).strict(),adapterCableInputSchema]),wireColors=["#df4049","#263449","#e1b13c","#347dc9","#27a782","#af62bd"];function getAdapterCableDefinition(input2){let cable=adapterCableInputSchema.parse({standard:"adaptercable",...input2}),{connectorA,connectorB}=cable,bundled="pinCount"in connectorA&&"pinCount"in connectorB&&connectorA.pinCount>1,pitches=[connectorA,connectorB].flatMap(connector=>"pitch"in connector?[connector.pitch]:[]),wireDiameter=Math.min(2,...pitches.map(pitch=>pitch*.6));return cableDefinitionSchema.parse({...cable,crossSection:cable.crossSection??(bundled?{kind:"wire_bundle",wirePitch:Math.max(...pitches),wires:Array.from({length:connectorA.pinCount},(_23,index2)=>({diameter:wireDiameter,color:wireColors[index2%wireColors.length]}))}:{kind:"round_jacket",diameter:Math.min(4,connectorA.bodyHeight,connectorB.bodyHeight,...pitches.map(pitch=>Math.min(2,pitch*.6))),color:"#263449"})})}var wireColors2=["#df4049","#263449","#e1b13c","#347dc9","#27a782","#af62bd"];function getCableDefinition(cableInput){let cable=cableInputSchema.parse(cableInput);if(cable.standard==="adaptercable")return getAdapterCableDefinition(cable);if(cable.standard==="bullet"){let pitch=cable.diameter+2;return cableDefinitionSchema.parse({standard:"bullet",connectorA:getBulletConnector({diameter:cable.diameter,gender:cable.genderA,pinCount:cable.pinCount,pitch}),connectorB:getBulletConnector({diameter:cable.diameter,gender:cable.genderB,pinCount:cable.pinCount,pitch}),crossSection:cable.pinCount===1?{kind:"round_jacket",diameter:cable.wireDiameter,color:cable.color}:{kind:"wire_bundle",wirePitch:pitch,wires:Array.from({length:cable.pinCount},(_23,index2)=>({diameter:cable.wireDiameter,color:wireColors2[index2%wireColors2.length]}))}})}if(cable.standard==="usb_c"){let connector2={kind:"usb_c_plug",bodyWidth:12,bodyHeight:6,bodyDepth:18,shellWidth:8.25,shellHeight:2.4,shellDepth:6.5};return cableDefinitionSchema.parse({standard:cable.standard,connectorA:connector2,connectorB:{...connector2},crossSection:{kind:"round_jacket",diameter:cable.jacketDiameter,color:cable.color}})}if(cable.standard==="us_mains")return cableDefinitionSchema.parse({standard:cable.standard,connectorA:{kind:"nema_5_15p",bodyWidth:32,bodyHeight:28,bodyDepth:35},connectorB:{kind:"iec_c13",bodyWidth:24,bodyHeight:18,bodyDepth:30},crossSection:{kind:"round_jacket",diameter:cable.jacketDiameter,color:cable.color}});let isSh=cable.standard==="jst_sh",connector={kind:isSh?"jst_sh_housing":"jst_ph_housing",pinCount:cable.pinCount,pitch:isSh?1:2,bodyWidth:isSh?cable.pinCount+1:(cable.pinCount-1)*2+3.8,bodyHeight:isSh?2.8:4.5,bodyDepth:isSh?5:6.85};return cableDefinitionSchema.parse({standard:cable.standard,connectorA:connector,connectorB:{...connector},crossSection:{kind:"wire_bundle",wirePitch:connector.pitch,wires:Array.from({length:cable.pinCount},(_23,index2)=>({diameter:cable.wireDiameter,color:wireColors2[index2%wireColors2.length]}))}})}function parseConnectorString(connectorString){let name=connectorString.trim().toLowerCase(),bullet=/^bullet([1-9][0-9]*)?_(.+)$/.exec(name);if(bullet){let diameter,gender,seen=new Set;for(let parameter of bullet[2].split("_")){let match2=/^d([0-9]+(?:\.[0-9]+)?)mm$/.exec(parameter)??/^g(male|female)$/.exec(parameter),key=parameter[0];if(!match2||seen.has(key))throw new Error(`Invalid or duplicate connector parameter: "${parameter}"`);seen.add(key),key==="d"?diameter=Number(match2[1]):gender=match2[1]}if(diameter===void 0||gender===void 0)throw new Error("Bullet connector strings require dNmm and gmale or gfemale");return getCableDefinition({standard:"bullet",diameter:bulletDiameterSchema.parse(diameter),pinCount:bullet[1]?Number(bullet[1]):1,genderA:gender}).connectorA}let jst2=/^(jst_sh|jst_ph)(?:_pins([0-9]+))?$/.exec(name);if(jst2)return getCableDefinition({standard:jst2[1],...jst2[2]?{pinCount:Number(jst2[2])}:{}}).connectorA;if(name==="usb_c")return getCableDefinition({standard:"usb_c"}).connectorA;if(name==="nema_5_15p")return getCableDefinition({standard:"us_mains"}).connectorA;if(name==="iec_c13")return getCableDefinition({standard:"us_mains"}).connectorB;throw new Error(`Unsupported connector string: "${connectorString}"`)}function parseCableString(cableString){let cableName=cableString.trim().toLowerCase();if(cableName.startsWith("adaptercable")){let adapter=/^adaptercable_(a|b)\(([^()]+)\)_(a|b)\(([^()]+)\)$/.exec(cableName);if(!adapter||adapter[1]===adapter[3])throw new Error("Adapter cables require exactly one named a(CONNECTOR) and b(CONNECTOR)");let first=parseConnectorString(adapter[2]),second=parseConnectorString(adapter[4]);return getAdapterCableDefinition({connectorA:adapter[1]==="a"?first:second,connectorB:adapter[1]==="b"?first:second})}if(cableName==="usb_c"||cableName==="us_mains")return getCableDefinition({standard:cableName});let bulletMatch=/^bullet([1-9][0-9]*)?_(.+)$/.exec(cableName);if(bulletMatch){let diameter,genderA,genderB,seen=new Set;for(let parameter of bulletMatch[2].split("_")){let match2=/^d([0-9]+(?:\.[0-9]+)?)mm$/.exec(parameter)??/^(a|b)(male|female)$/.exec(parameter),key=parameter[0];if(!match2||seen.has(key))throw new Error(`Invalid or duplicate bullet parameter: "${parameter}"`);seen.add(key),key==="d"?diameter=Number(match2[1]):key==="a"?genderA=match2[2]:genderB=match2[2]}if(diameter===void 0)throw new Error("Bullet cables require dNmm");return getCableDefinition({standard:"bullet",diameter:bulletDiameterSchema.parse(diameter),pinCount:bulletMatch[1]?Number(bulletMatch[1]):1,genderA:genderA??"male",genderB:genderB??"female"})}let jstMatch=/^(jst_sh|jst_ph)(?:_pins([0-9]+))?$/.exec(cableName);if(jstMatch)return getCableDefinition({standard:jstMatch[1],...jstMatch[2]?{pinCount:Number(jstMatch[2])}:{}});throw new Error(`Unsupported cable string: "${cableString}". Expected usb_c, jst_sh[_pinsN], jst_ph[_pinsN], us_mains, bullet[CONTACTS]_dNmm[_amale][_bfemale], or adaptercable_a(CONNECTOR)_b(CONNECTOR).`)}function resolveAssemblyCablePin1Position(cable,connector,matingCenter,outward){let db22=cable.root.db,pins=db22.source_port.list().flatMap(sourcePort=>{if(sourcePort.source_component_id!==connector.source_component_id)return[];let pcbPort=db22.pcb_port.list().find(port=>port.source_port_id===sourcePort.source_port_id&&port.pcb_component_id===connector.pcb_component_id);if(!pcbPort)return[];let hint=[sourcePort.name,...sourcePort.port_hints??[]].find(name=>/^(?:pin)?\d+$/.test(name)),pin=sourcePort.pin_number??(hint?Number(hint.replace(/^pin/,"")):void 0);return[{position:pcbPort,pin}]}),pin1=pins.find(({pin})=>pin===1)?.position;if(!pin1||pins.length<2)return;let center2=pins.reduce((sum,{position:position4})=>({x:sum.x+position4.x/pins.length,y:sum.y+position4.y/pins.length}),{x:0,y:0}),offset2=vec3_exports.fromValues(pin1.x-center2.x,pin1.y-center2.y,0),axis=vec3_exports.normalize(vec3_exports.create(),[outward.x,outward.y,outward.z]);if(vec3_exports.scaleAndAdd(offset2,offset2,axis,-vec3_exports.dot(offset2,axis)),!(vec3_exports.length(offset2)<1e-6))return{x:matingCenter.x+offset2[0],y:matingCenter.y+offset2[1],z:matingCenter.z+offset2[2]}}function resolveAssemblyCableEndpoint(cable,selector2,cableConnector){let scoped=getComponentsInAssemblyScope(cable),motorReference=selector2.match(/^(.+)\.wireside$/);if(motorReference){let motors=scoped.filter(part=>part.componentName==="AssemblyMotor"&&part.name===motorReference[1]);if(motors.length!==1)throw new Error(`assembly.cable "${cable.name}" endpoint "${selector2}" must match exactly one motor in its assembly device`);let motor=motors[0],motorConnector=getJstMotorConnector(motor.motorModel.wireConnection);if(!motorConnector)throw new Error(`assembly.cable "${cable.name}" requires motor "${motor.name}" to have a JST PH or SH wireConnection, e.g. "jst4_ph" or "jst4_sh", for its connector endpoint`);let faceMount=resolveMotorFaceMount(motor),placement=faceMount?{position:faceMount.position,pcbRotation:0,layer:"top"}:resolveAssemblyMotorPlacement(motor),offset2=faceMount?.rotation??resolveAssemblyMotorRotation(motor,placement),orientation22=mat4_exports.create(),bottom=placement.layer==="bottom";mat4_exports.rotateX(orientation22,orientation22,offset2.x*Math.PI/180),mat4_exports.rotateY(orientation22,orientation22,(offset2.y+(bottom?180:0))*Math.PI/180),mat4_exports.rotateZ(orientation22,orientation22,(bottom?-1:1)*(placement.pcbRotation+offset2.z)*Math.PI/180);let reference3=motor.motorReferencePoints.wireside,direction22=vec3_exports.transformMat4(vec3_exports.create(),[reference3.direction.x,reference3.direction.y,reference3.direction.z],orientation22),point62=vec3_exports.transformMat4(vec3_exports.create(),[reference3.position.x,reference3.position.y,reference3.position.z],orientation22),halfPinSpan=(motorConnector.pinCount-1)*motorConnector.pitch/2,pin1Offset=vec3_exports.transformMat4(vec3_exports.create(),[reference3.direction.y*halfPinSpan,-reference3.direction.x*halfPinSpan,0],orientation22);return{sourceComponentId:motor.source_component_id,position:{x:point62[0]+placement.position.x+direction22[0]*motorConnector.matingDepth,y:point62[1]+placement.position.y+direction22[1]*motorConnector.matingDepth,z:point62[2]+placement.position.z+direction22[2]*motorConnector.matingDepth},pin1Position:{x:point62[0]+placement.position.x+direction22[0]*motorConnector.matingDepth+pin1Offset[0],y:point62[1]+placement.position.y+direction22[1]*motorConnector.matingDepth+pin1Offset[1],z:point62[2]+placement.position.z+direction22[2]*motorConnector.matingDepth+pin1Offset[2]},direction:{x:direction22[0],y:direction22[1],z:direction22[2]},cableInput:{standard:motorConnector.standard,pinCount:motorConnector.pinCount}}}let scope=getAssemblyScope(cable),matches=selectAll(preprocessSelector(selector2,cable),scope,{adapter:cssSelectPrimitiveComponentAdapter}).filter(part=>scoped.includes(part));if(matches.length!==1)throw new Error(`assembly.cable "${cable.name}" endpoint "${selector2}" matched ${matches.length} components; expected exactly one in its assembly device`);let connector=matches[0];if(!(connector instanceof NormalComponent)||connector.componentName!=="Connector"||!connector.pcb_component_id||!connector.source_component_id)throw new Error(`assembly.cable "${cable.name}" endpoint "${selector2}" must name a PCB connector or MOTOR.wireside`);let props=connector._parsedProps;if(!cableConnector&&props.standard!=="usb_c"&&props.standard!=="jst_sh"&&props.standard!=="jst_ph")throw new Error(`assembly.cable "${cable.name}" cannot infer endpoint "${selector2}"; use a connector with standard="usb_c", "jst_sh", or "jst_ph"`);let pcb=cable.root.db.pcb_component.get(connector.pcb_component_id),board=connector._getBoard(),layer=pcb.layer==="bottom"?"bottom":"top",inferredCenter=pcb.cable_insertion_center??pcb.center,inferredDirection=vec3_exports.normalize(vec3_exports.create(),[inferredCenter.x-pcb.center.x,inferredCenter.y-pcb.center.y,0]),direction3=connector._getPcbComponentInsertionAxisDirection(layer,pcb.rotation)??(props.standard==="usb_c"&&vec3_exports.length(inferredDirection)>0?{x:inferredDirection[0],y:inferredDirection[1],z:0}:{x:0,y:0,z:layer==="bottom"?-1:1}),center2=Math.abs(direction3.z)>.5?pcb.center:inferredCenter,sign=layer==="bottom"?-1:1,height=!props.standard&&cableConnector?Math.abs(direction3.z)>.5?cableConnector.bodyDepth:cableConnector.bodyHeight/2:Math.abs(direction3.z)>.5?props.standard==="jst_ph"?6:props.standard==="jst_sh"?4.25:1.5:props.standard==="usb_c"?1.5:props.standard==="jst_sh"?1.4:2.25,position4={x:center2.x,y:center2.y,z:sign*(board.boardThickness/2+height)};return{sourceComponentId:connector.source_component_id,position:position4,pin1Position:resolveAssemblyCablePin1Position(cable,connector,position4,direction3),direction:direction3,cableInput:props.standard==="usb_c"?{standard:"usb_c"}:props.standard==="jst_sh"||props.standard==="jst_ph"?{standard:props.standard,pinCount:props.pinCount}:void 0}}function inferAssemblyCablePath({from,to:to3,fromDirection,toDirection}){let distance27=Math.hypot(to3.x-from.x,to3.y-from.y,to3.z-from.z);if(distance27<1e-6)throw new Error("Cable wire exits must be at different positions");let chord=vec3_exports.fromValues(to3.x-from.x,to3.y-from.y,to3.z-from.z),routeNormal=vec3_exports.cross(vec3_exports.create(),chord,[fromDirection.x,fromDirection.y,fromDirection.z]);vec3_exports.length(routeNormal)<1e-6&&vec3_exports.cross(routeNormal,chord,Math.abs(chord[2])/distance27>.95?[0,1,0]:[0,0,1]);let archDirection=vec3_exports.normalize(vec3_exports.create(),vec3_exports.cross(vec3_exports.create(),routeNormal,chord)),archSide=from.z<0&&to3.z<0?-1:1;archDirection[2]*archSide<0&&vec3_exports.scale(archDirection,archDirection,-1);let clearance=Math.min(25,Math.max(8,distance27/3)),controlA={x:from.x+fromDirection.x*clearance,y:from.y+fromDirection.y*clearance,z:from.z+fromDirection.z*clearance},controlB={x:to3.x+toDirection.x*clearance,y:to3.y+toDirection.y*clearance,z:to3.z+toDirection.z*clearance},path=[from,{x:from.x+fromDirection.x*.1,y:from.y+fromDirection.y*.1,z:from.z+fromDirection.z*.1}];for(let i23=1;i23<48;i23++){let t48=i23/48,u23=1-t48,arch=Math.sin(Math.PI*t48)**2*Math.min(12,distance27*.15);path.push({x:u23**3*from.x+3*u23**2*t48*controlA.x+3*u23*t48**2*controlB.x+t48**3*to3.x+archDirection[0]*arch,y:u23**3*from.y+3*u23**2*t48*controlA.y+3*u23*t48**2*controlB.y+t48**3*to3.y+archDirection[1]*arch,z:u23**3*from.z+3*u23**2*t48*controlA.z+3*u23*t48**2*controlB.z+t48**3*to3.z+archDirection[2]*arch})}return path.push({x:to3.x+toDirection.x*.1,y:to3.y+toDirection.y*.1,z:to3.z+toDirection.z*.1},to3),path}var wireExitDepth=connector=>connector.bodyDepth+(connector.kind==="usb_c_plug"?connector.shellDepth:0);function resolveAssemblyCable(cable){let model27=cable._parsedProps.model,explicitDefinition=model27?parseCableString(model27):void 0,from=resolveAssemblyCableEndpoint(cable,cable._parsedProps.from,explicitDefinition?.connectorA),to3=resolveAssemblyCableEndpoint(cable,cable._parsedProps.to,explicitDefinition?.connectorB),fromDefinition=explicitDefinition??getCableDefinition(from.cableInput),toDefinition=explicitDefinition??getCableDefinition(to3.cableInput);if(from.sourceComponentId===to3.sourceComponentId)throw new Error(`assembly.cable "${cable.name}" must connect two different endpoints`);if(!explicitDefinition&&(fromDefinition.standard!==toDefinition.standard||fromDefinition.connectorA.kind!==toDefinition.connectorA.kind||"pinCount"in fromDefinition.connectorA&&"pinCount"in toDefinition.connectorA&&fromDefinition.connectorA.pinCount!==toDefinition.connectorA.pinCount))throw new Error(`assembly.cable "${cable.name}" endpoints "${cable._parsedProps.from}" and "${cable._parsedProps.to}" have incompatible connector standards or pin counts`);if(cable._parsedProps.standard&&cable._parsedProps.standard!==fromDefinition.standard)throw new Error(`assembly.cable "${cable.name}" standard="${cable._parsedProps.standard}" conflicts with its endpoints`);let definition=fromDefinition,endpointExit=(position4,direction3,depth)=>{let exit=vec3_exports.scaleAndAdd(vec3_exports.create(),[position4.x,position4.y,position4.z],[direction3.x,direction3.y,direction3.z],depth);return{x:exit[0],y:exit[1],z:exit[2]}},fromExit=endpointExit(from.position,from.direction,wireExitDepth(definition.connectorA)),toExit=endpointExit(to3.position,to3.direction,wireExitDepth(definition.connectorB));return{name:cable.name,from_source_component_id:from.sourceComponentId,to_source_component_id:to3.sourceComponentId,from_connector_pin1_position:from.pin1Position,to_connector_pin1_position:to3.pin1Position,cableprinter_string:model27??("pinCount"in definition.connectorA?`${definition.standard}_pins${definition.connectorA.pinCount}`:definition.standard),path:inferAssemblyCablePath({from:fromExit,to:toExit,fromDirection:from.direction,toDirection:to3.direction})}}var AssemblyCable=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"cadCableId")}get config(){return{componentName:"AssemblyCable",zodProps:assemblyCableProps}}doInitialCadModelRender(){if(!this.root||this.root.pcbDisabled)return;let cable=resolveAssemblyCable(this);this.cadCableId=this.root.db.cad_cable.insert(cable).cad_cable_id}updateCadModelRender(){!this.root||this.root.pcbDisabled||!this.cadCableId||this.root.db.cad_cable.update(this.cadCableId,resolveAssemblyCable(this))}},createNamespacedElement=hostType=>{let Component2=props=>(0,import_react14.createElement)(hostType,props);return Component2.displayName=hostType,Component2},analog={transientsimulation:createNamespacedElement("analogtransientsimulation"),dcoperatingpointsimulation:createNamespacedElement("analogdcoperatingpointsimulation"),dcsweepsimulation:createNamespacedElement("analogdcsweepsimulation"),acsweepsimulation:createNamespacedElement("analogacsweepsimulation"),sweepparameter:createNamespacedElement("analogsweepparameter")},assembly={referencesurface:createNamespacedElement("assembly.referencesurface"),part:createNamespacedElement("assembly.part"),cable:createNamespacedElement("assembly.cable"),printedpart:createNamespacedElement("assembly.printedpart"),motor:createNamespacedElement("assembly.motor"),subassembly:createNamespacedElement("assembly.subassembly"),cadassembly:createNamespacedElement("assembly.cadassembly"),device:createNamespacedElement("assembly.device"),screen:createNamespacedElement("assembly.screen")},EnclosureFdmBoxElement=createNamespacedElement("enclosure.fdm.box"),enclosure={cutoutaperture:createNamespacedElement("enclosure.cutoutaperture"),fdm:{box:EnclosureFdmBoxElement,Box:EnclosureFdmBoxElement}},simulation={pcbreturncurrentsimulation:createNamespacedElement("pcbreturncurrentsimulation"),pcbreturncurrentexcitation:createNamespacedElement("pcbreturncurrentexcitation")},RootCircuit=class extends IsolatedCircuit{constructor({platform,projectUrl}={}){super({platform,projectUrl,cachedSubcircuits:new Map,pendingSubcircuitRenders:new Map});__publicField(this,"isRootCircuit",!0);this.root=this}},Project2=RootCircuit,Circuit=RootCircuit,useRenderedCircuit=reactElements=>{let[isLoading,setIsLoading]=import_react15.default.useState(!0),[error2,setError]=import_react15.default.useState(null),[circuit,setCircuit]=import_react15.default.useState(),[circuitJson,setCircuitJson]=import_react15.default.useState();return import_react15.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 R22=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_runtime31.jsxs)(import_jsx_runtime31.Fragment,{children:[(0,import_jsx_runtime31.jsx)(Component2,{...combinedProps}),tracesToCreate.map((trace,i23)=>(0,import_jsx_runtime31.jsx)("trace",{...trace},i23))]})};for(let port of pinLabelsFlatArray)R22[port]=`.${name} > .${port}`;return R22},useCapacitor=createUseComponent(props=>(0,import_jsx_runtime32.jsx)("capacitor",{...props}),capacitorPins),useChip=pinLabels=>createUseComponent(props=>(0,import_jsx_runtime33.jsx)("chip",{pinLabels,...props}),pinLabels),useDiode=createUseComponent(props=>(0,import_jsx_runtime34.jsx)("diode",{...props}),diodePins),useLed=createUseComponent(props=>(0,import_jsx_runtime35.jsx)("led",{...props}),ledPins),useResistor=createUseComponent(props=>(0,import_jsx_runtime36.jsx)("resistor",{...props}),resistorPins),sel=new Proxy(refdes=>new Proxy({},{get:(_23,pin)=>`.${refdes} > .${pin}`}),{get:(_23,prop1)=>{let fn3=(...args)=>{let chipFnOrPinType=args[0];return new Proxy({},{get:(_32,pinName)=>`.${prop1} > .${pinName}`})};return new Proxy(fn3,{get:(_32,prop2)=>prop1==="net"?`net.${prop2}`:prop1==="subcircuit"?new Proxy({},{get:(_42,prop3)=>new Proxy({},{get:(_52,prop4)=>`subcircuit.${prop2} > .${prop3} > .${prop4}`})}):`.${prop1} > .${prop2}`,apply:(target,_32,args)=>prop1==="net"?new Proxy({},{get:(_42,netName)=>`net.${netName}`}):new Proxy({},{get:(_42,pinOrSubComponentName)=>{let pinResult=`.${prop1} > .${pinOrSubComponentName}`;return["U","J","CN"].some(p23=>prop1.startsWith(p23))?pinResult:new Proxy(new String(pinResult),{get:(_52,nestedProp)=>typeof nestedProp=="symbol"||nestedProp==="toString"?()=>pinResult:`.${prop1} > .${pinOrSubComponentName} > .${nestedProp}`})}})})}});extendCatalogue(components_exports);extendCatalogue({"assembly.cable":AssemblyCable,"assembly.device":AssemblyDevice,"assembly.motor":AssemblyMotor,"assembly.part":AssemblyPart,"assembly.referencesurface":AssemblyReferenceSurface,"assembly.printedpart":AssemblyPrintedPart,"assembly.screen":AssemblyScreen,"assembly.subassembly":AssemblySubassembly,"assembly.cadassembly":AssemblySubassembly,Bug:Chip,"enclosure.cutoutaperture":EnclosureCutoutAperture,"enclosure.fdm.box":EnclosureFdmBox,Fanout:Breakout,FanoutPoint:BreakoutPoint});var React4=__toESM(require_react(),1),ReactJsxRuntime=__toESM(require_jsx_runtime(),1);init_dist2();var fabricatorPresets={jlcpcb_economy_20260912:{minimumViaHoleDiameterWithoutExtraCharge:.3},jlcpcb_standard_20260912:{minimumViaHoleDiameterWithoutExtraCharge:.3}},presetAliases={jlcpcb_economy:"jlcpcb_economy_20260912",jlcpcb_standard:"jlcpcb_standard_20260912"};function resolvePreset(name){let resolved=Object.hasOwn(presetAliases,name)?presetAliases[name]:name;return Object.hasOwn(fabricatorPresets,resolved)?fabricatorPresets[resolved]:void 0}function runDrcChecks({circuitJson,fabricatorPreset,pcbBoardId}){let preset=resolvePreset(fabricatorPreset);if(!preset)return[];let threshold=preset.minimumViaHoleDiameterWithoutExtraCharge,smallVias=circuitJson.filter(element=>element.type==="pcb_via").filter(via=>via.hole_diameter<threshold);return smallVias.length===0?[]:[pcb_fabricator_extra_charge_warning.parse({type:"pcb_fabricator_extra_charge_warning",fabricator_preset:fabricatorPreset,pcb_board_id:pcbBoardId,pcb_via_ids:smallVias.map(via=>via.pcb_via_id),message:`${fabricatorPreset}: ${smallVias.length} via(s) have a hole diameter below ${threshold} mm and incur an extra fabrication charge. Use a hole diameter of at least ${threshold} mm to avoid this charge.`})]}var fabricatorEngine2={runDrcChecks};var __create3=Object.create,__defProp5=Object.defineProperty,__getOwnPropDesc3=Object.getOwnPropertyDescriptor,__getOwnPropNames3=Object.getOwnPropertyNames,__getProtoOf3=Object.getPrototypeOf,__hasOwnProp4=Object.prototype.hasOwnProperty,__commonJS3=(cb4,mod)=>function(){return mod||(0,cb4[__getOwnPropNames3(cb4)[0]])((mod={exports:{}}).exports,mod),mod.exports},__export4=(target,all)=>{for(var name in all)__defProp5(target,name,{get:all[name],enumerable:!0})},__copyProps3=(to3,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames3(from))!__hasOwnProp4.call(to3,key)&&key!==except&&__defProp5(to3,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc3(from,key))||desc.enumerable});return to3},__toESM3=(mod,isNodeMode,target)=>(target=mod!=null?__create3(__getProtoOf3(mod)):{},__copyProps3(isNodeMode||!mod||!mod.__esModule?__defProp5(target,"default",{value:mod,enumerable:!0}):target,mod)),require_react_production=__commonJS3({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_CONSUMER_TYPE=Symbol.for("react.consumer"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),MAYBE_ITERATOR_SYMBOL=Symbol.iterator;function getIteratorFn(maybeIterable){return maybeIterable===null||typeof maybeIterable!="object"?null:(maybeIterable=MAYBE_ITERATOR_SYMBOL&&maybeIterable[MAYBE_ITERATOR_SYMBOL]||maybeIterable["@@iterator"],typeof maybeIterable=="function"?maybeIterable:null)}var ReactNoopUpdateQueue={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},assign=Object.assign,emptyObject={};function Component(props,context,updater){this.props=props,this.context=context,this.refs=emptyObject,this.updater=updater||ReactNoopUpdateQueue}Component.prototype.isReactComponent={},Component.prototype.setState=function(partialState,callback){if(typeof partialState!="object"&&typeof partialState!="function"&&partialState!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,partialState,callback,"setState")},Component.prototype.forceUpdate=function(callback){this.updater.enqueueForceUpdate(this,callback,"forceUpdate")};function ComponentDummy(){}ComponentDummy.prototype=Component.prototype;function PureComponent(props,context,updater){this.props=props,this.context=context,this.refs=emptyObject,this.updater=updater||ReactNoopUpdateQueue}var pureComponentPrototype=PureComponent.prototype=new ComponentDummy;pureComponentPrototype.constructor=PureComponent,assign(pureComponentPrototype,Component.prototype),pureComponentPrototype.isPureReactComponent=!0;var isArrayImpl=Array.isArray,ReactSharedInternals={H:null,A:null,T:null,S:null,V:null},hasOwnProperty=Object.prototype.hasOwnProperty;function ReactElement(type,key,self2,source,owner,props){return self2=props.ref,{$$typeof:REACT_ELEMENT_TYPE,type,key,ref:self2!==void 0?self2:null,props}}function cloneAndReplaceKey(oldElement,newKey){return ReactElement(oldElement.type,newKey,void 0,void 0,void 0,oldElement.props)}function isValidElement33(object){return typeof object=="object"&&object!==null&&object.$$typeof===REACT_ELEMENT_TYPE}function escape2(key){var escaperLookup={"=":"=0",":":"=2"};return"$"+key.replace(/[=:]/g,function(match2){return escaperLookup[match2]})}var userProvidedKeyEscapeRegex=/\/+/g;function getElementKey(element,index2){return typeof element=="object"&&element!==null&&element.key!=null?escape2(""+element.key):index2.toString(36)}function noop$1(){}function resolveThenable(thenable){switch(thenable.status){case"fulfilled":return thenable.value;case"rejected":throw thenable.reason;default:switch(typeof thenable.status=="string"?thenable.then(noop$1,noop$1):(thenable.status="pending",thenable.then(function(fulfilledValue){thenable.status==="pending"&&(thenable.status="fulfilled",thenable.value=fulfilledValue)},function(error2){thenable.status==="pending"&&(thenable.status="rejected",thenable.reason=error2)})),thenable.status){case"fulfilled":return thenable.value;case"rejected":throw thenable.reason}}throw thenable}function mapIntoArray(children,array2,escapedPrefix,nameSoFar,callback){var type=typeof children;(type==="undefined"||type==="boolean")&&(children=null);var invokeCallback=!1;if(children===null)invokeCallback=!0;else switch(type){case"bigint":case"string":case"number":invokeCallback=!0;break;case"object":switch(children.$$typeof){case REACT_ELEMENT_TYPE:case REACT_PORTAL_TYPE:invokeCallback=!0;break;case REACT_LAZY_TYPE:return invokeCallback=children._init,mapIntoArray(invokeCallback(children._payload),array2,escapedPrefix,nameSoFar,callback)}}if(invokeCallback)return callback=callback(children),invokeCallback=nameSoFar===""?"."+getElementKey(children,0):nameSoFar,isArrayImpl(callback)?(escapedPrefix="",invokeCallback!=null&&(escapedPrefix=invokeCallback.replace(userProvidedKeyEscapeRegex,"$&/")+"/"),mapIntoArray(callback,array2,escapedPrefix,"",function(c4){return c4})):callback!=null&&(isValidElement33(callback)&&(callback=cloneAndReplaceKey(callback,escapedPrefix+(callback.key==null||children&&children.key===callback.key?"":(""+callback.key).replace(userProvidedKeyEscapeRegex,"$&/")+"/")+invokeCallback)),array2.push(callback)),1;invokeCallback=0;var nextNamePrefix=nameSoFar===""?".":nameSoFar+":";if(isArrayImpl(children))for(var i10=0;i10<children.length;i10++)nameSoFar=children[i10],type=nextNamePrefix+getElementKey(nameSoFar,i10),invokeCallback+=mapIntoArray(nameSoFar,array2,escapedPrefix,type,callback);else if(i10=getIteratorFn(children),typeof i10=="function")for(children=i10.call(children),i10=0;!(nameSoFar=children.next()).done;)nameSoFar=nameSoFar.value,type=nextNamePrefix+getElementKey(nameSoFar,i10++),invokeCallback+=mapIntoArray(nameSoFar,array2,escapedPrefix,type,callback);else if(type==="object"){if(typeof children.then=="function")return mapIntoArray(resolveThenable(children),array2,escapedPrefix,nameSoFar,callback);throw array2=String(children),Error("Objects are not valid as a React child (found: "+(array2==="[object Object]"?"object with keys {"+Object.keys(children).join(", ")+"}":array2)+"). If you meant to render a collection of children, use an array instead.")}return invokeCallback}function mapChildren(children,func,context){if(children==null)return children;var result=[],count=0;return mapIntoArray(children,result,"","",function(child){return func.call(context,child,count++)}),result}function lazyInitializer(payload){if(payload._status===-1){var ctor=payload._result;ctor=ctor(),ctor.then(function(moduleObject){(payload._status===0||payload._status===-1)&&(payload._status=1,payload._result=moduleObject)},function(error2){(payload._status===0||payload._status===-1)&&(payload._status=2,payload._result=error2)}),payload._status===-1&&(payload._status=0,payload._result=ctor)}if(payload._status===1)return payload._result.default;throw payload._result}var reportGlobalError=typeof reportError=="function"?reportError:function(error2){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var event=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof error2=="object"&&error2!==null&&typeof error2.message=="string"?String(error2.message):String(error2),error:error2});if(!window.dispatchEvent(event))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",error2);return}console.error(error2)};function noop(){}exports.Children={map:mapChildren,forEach:function(children,forEachFunc,forEachContext){mapChildren(children,function(){forEachFunc.apply(this,arguments)},forEachContext)},count:function(children){var n10=0;return mapChildren(children,function(){n10++}),n10},toArray:function(children){return mapChildren(children,function(child){return child})||[]},only:function(children){if(!isValidElement33(children))throw Error("React.Children.only expected to receive a single React element child.");return children}},exports.Component=Component,exports.Fragment=REACT_FRAGMENT_TYPE,exports.Profiler=REACT_PROFILER_TYPE,exports.PureComponent=PureComponent,exports.StrictMode=REACT_STRICT_MODE_TYPE,exports.Suspense=REACT_SUSPENSE_TYPE,exports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=ReactSharedInternals,exports.__COMPILER_RUNTIME={__proto__:null,c:function(size3){return ReactSharedInternals.H.useMemoCache(size3)}},exports.cache=function(fn3){return function(){return fn3.apply(null,arguments)}},exports.cloneElement=function(element,config,children){if(element==null)throw Error("The argument must be a React element, but you passed "+element+".");var props=assign({},element.props),key=element.key,owner=void 0;if(config!=null)for(propName in config.ref!==void 0&&(owner=void 0),config.key!==void 0&&(key=""+config.key),config)!hasOwnProperty.call(config,propName)||propName==="key"||propName==="__self"||propName==="__source"||propName==="ref"&&config.ref===void 0||(props[propName]=config[propName]);var propName=arguments.length-2;if(propName===1)props.children=children;else if(1<propName){for(var childArray=Array(propName),i10=0;i10<propName;i10++)childArray[i10]=arguments[i10+2];props.children=childArray}return ReactElement(element.type,key,void 0,void 0,owner,props)},exports.createContext=function(defaultValue){return defaultValue={$$typeof:REACT_CONTEXT_TYPE,_currentValue:defaultValue,_currentValue2:defaultValue,_threadCount:0,Provider:null,Consumer:null},defaultValue.Provider=defaultValue,defaultValue.Consumer={$$typeof:REACT_CONSUMER_TYPE,_context:defaultValue},defaultValue},exports.createElement=function(type,config,children){var propName,props={},key=null;if(config!=null)for(propName in config.key!==void 0&&(key=""+config.key),config)hasOwnProperty.call(config,propName)&&propName!=="key"&&propName!=="__self"&&propName!=="__source"&&(props[propName]=config[propName]);var childrenLength=arguments.length-2;if(childrenLength===1)props.children=children;else if(1<childrenLength){for(var childArray=Array(childrenLength),i10=0;i10<childrenLength;i10++)childArray[i10]=arguments[i10+2];props.children=childArray}if(type&&type.defaultProps)for(propName in childrenLength=type.defaultProps,childrenLength)props[propName]===void 0&&(props[propName]=childrenLength[propName]);return ReactElement(type,key,void 0,void 0,null,props)},exports.createRef=function(){return{current:null}},exports.forwardRef=function(render2){return{$$typeof:REACT_FORWARD_REF_TYPE,render:render2}},exports.isValidElement=isValidElement33,exports.lazy=function(ctor){return{$$typeof:REACT_LAZY_TYPE,_payload:{_status:-1,_result:ctor},_init:lazyInitializer}},exports.memo=function(type,compare2){return{$$typeof:REACT_MEMO_TYPE,type,compare:compare2===void 0?null:compare2}},exports.startTransition=function(scope){var prevTransition=ReactSharedInternals.T,currentTransition={};ReactSharedInternals.T=currentTransition;try{var returnValue=scope(),onStartTransitionFinish=ReactSharedInternals.S;onStartTransitionFinish!==null&&onStartTransitionFinish(currentTransition,returnValue),typeof returnValue=="object"&&returnValue!==null&&typeof returnValue.then=="function"&&returnValue.then(noop,reportGlobalError)}catch(error2){reportGlobalError(error2)}finally{ReactSharedInternals.T=prevTransition}},exports.unstable_useCacheRefresh=function(){return ReactSharedInternals.H.useCacheRefresh()},exports.use=function(usable){return ReactSharedInternals.H.use(usable)},exports.useActionState=function(action,initialState,permalink){return ReactSharedInternals.H.useActionState(action,initialState,permalink)},exports.useCallback=function(callback,deps){return ReactSharedInternals.H.useCallback(callback,deps)},exports.useContext=function(Context){return ReactSharedInternals.H.useContext(Context)},exports.useDebugValue=function(){},exports.useDeferredValue=function(value,initialValue){return ReactSharedInternals.H.useDeferredValue(value,initialValue)},exports.useEffect=function(create10,createDeps,update2){var dispatcher=ReactSharedInternals.H;if(typeof update2=="function")throw Error("useEffect CRUD overload is not enabled in this build of React.");return dispatcher.useEffect(create10,createDeps)},exports.useId=function(){return ReactSharedInternals.H.useId()},exports.useImperativeHandle=function(ref,create10,deps){return ReactSharedInternals.H.useImperativeHandle(ref,create10,deps)},exports.useInsertionEffect=function(create10,deps){return ReactSharedInternals.H.useInsertionEffect(create10,deps)},exports.useLayoutEffect=function(create10,deps){return ReactSharedInternals.H.useLayoutEffect(create10,deps)},exports.useMemo=function(create10,deps){return ReactSharedInternals.H.useMemo(create10,deps)},exports.useOptimistic=function(passthrough,reducer){return ReactSharedInternals.H.useOptimistic(passthrough,reducer)},exports.useReducer=function(reducer,initialArg,init){return ReactSharedInternals.H.useReducer(reducer,initialArg,init)},exports.useRef=function(initialValue){return ReactSharedInternals.H.useRef(initialValue)},exports.useState=function(initialState){return ReactSharedInternals.H.useState(initialState)},exports.useSyncExternalStore=function(subscribe,getSnapshot,getServerSnapshot){return ReactSharedInternals.H.useSyncExternalStore(subscribe,getSnapshot,getServerSnapshot)},exports.useTransition=function(){return ReactSharedInternals.H.useTransition()},exports.version="19.1.0"}}),require_react_development2=__commonJS3({"node_modules/react/cjs/react.development.js"(exports,module){"use strict";(function(){function defineDeprecationWarning(methodName,info){Object.defineProperty(Component.prototype,methodName,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",info[0],info[1])}})}function getIteratorFn(maybeIterable){return maybeIterable===null||typeof maybeIterable!="object"?null:(maybeIterable=MAYBE_ITERATOR_SYMBOL&&maybeIterable[MAYBE_ITERATOR_SYMBOL]||maybeIterable["@@iterator"],typeof maybeIterable=="function"?maybeIterable:null)}function warnNoop(publicInstance,callerName){publicInstance=(publicInstance=publicInstance.constructor)&&(publicInstance.displayName||publicInstance.name)||"ReactClass";var warningKey=publicInstance+"."+callerName;didWarnStateUpdateForUnmountedComponent[warningKey]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",callerName,publicInstance),didWarnStateUpdateForUnmountedComponent[warningKey]=!0)}function Component(props,context,updater){this.props=props,this.context=context,this.refs=emptyObject,this.updater=updater||ReactNoopUpdateQueue}function ComponentDummy(){}function PureComponent(props,context,updater){this.props=props,this.context=context,this.refs=emptyObject,this.updater=updater||ReactNoopUpdateQueue}function testStringCoercion(value){return""+value}function checkKeyStringCoercion(value){try{testStringCoercion(value);var JSCompiler_inline_result=!1}catch{JSCompiler_inline_result=!0}if(JSCompiler_inline_result){JSCompiler_inline_result=console;var JSCompiler_temp_const=JSCompiler_inline_result.error,JSCompiler_inline_result$jscomp$0=typeof Symbol=="function"&&Symbol.toStringTag&&value[Symbol.toStringTag]||value.constructor.name||"Object";return JSCompiler_temp_const.call(JSCompiler_inline_result,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",JSCompiler_inline_result$jscomp$0),testStringCoercion(value)}}function getComponentNameFromType(type){if(type==null)return null;if(typeof type=="function")return type.$$typeof===REACT_CLIENT_REFERENCE?null:type.displayName||type.name||null;if(typeof type=="string")return type;switch(type){case REACT_FRAGMENT_TYPE:return"Fragment";case REACT_PROFILER_TYPE:return"Profiler";case REACT_STRICT_MODE_TYPE:return"StrictMode";case REACT_SUSPENSE_TYPE:return"Suspense";case REACT_SUSPENSE_LIST_TYPE:return"SuspenseList";case REACT_ACTIVITY_TYPE:return"Activity"}if(typeof type=="object")switch(typeof type.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),type.$$typeof){case REACT_PORTAL_TYPE:return"Portal";case REACT_CONTEXT_TYPE:return(type.displayName||"Context")+".Provider";case REACT_CONSUMER_TYPE:return(type._context.displayName||"Context")+".Consumer";case REACT_FORWARD_REF_TYPE:var innerType=type.render;return type=type.displayName,type||(type=innerType.displayName||innerType.name||"",type=type!==""?"ForwardRef("+type+")":"ForwardRef"),type;case REACT_MEMO_TYPE:return innerType=type.displayName||null,innerType!==null?innerType:getComponentNameFromType(type.type)||"Memo";case REACT_LAZY_TYPE:innerType=type._payload,type=type._init;try{return getComponentNameFromType(type(innerType))}catch{}}return null}function getTaskName(type){if(type===REACT_FRAGMENT_TYPE)return"<>";if(typeof type=="object"&&type!==null&&type.$$typeof===REACT_LAZY_TYPE)return"<...>";try{var name=getComponentNameFromType(type);return name?"<"+name+">":"<...>"}catch{return"<...>"}}function getOwner(){var dispatcher=ReactSharedInternals.A;return dispatcher===null?null:dispatcher.getOwner()}function UnknownOwner(){return Error("react-stack-top-frame")}function hasValidKey(config){if(hasOwnProperty.call(config,"key")){var getter=Object.getOwnPropertyDescriptor(config,"key").get;if(getter&&getter.isReactWarning)return!1}return config.key!==void 0}function defineKeyPropWarningGetter(props,displayName){function warnAboutAccessingKey(){specialPropKeyWarningShown||(specialPropKeyWarningShown=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",displayName))}warnAboutAccessingKey.isReactWarning=!0,Object.defineProperty(props,"key",{get:warnAboutAccessingKey,configurable:!0})}function elementRefGetterWithDeprecationWarning(){var componentName=getComponentNameFromType(this.type);return didWarnAboutElementRef[componentName]||(didWarnAboutElementRef[componentName]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),componentName=this.props.ref,componentName!==void 0?componentName:null}function ReactElement(type,key,self2,source,owner,props,debugStack,debugTask){return self2=props.ref,type={$$typeof:REACT_ELEMENT_TYPE,type,key,props,_owner:owner},(self2!==void 0?self2:null)!==null?Object.defineProperty(type,"ref",{enumerable:!1,get:elementRefGetterWithDeprecationWarning}):Object.defineProperty(type,"ref",{enumerable:!1,value:null}),type._store={},Object.defineProperty(type._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(type,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(type,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:debugStack}),Object.defineProperty(type,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:debugTask}),Object.freeze&&(Object.freeze(type.props),Object.freeze(type)),type}function cloneAndReplaceKey(oldElement,newKey){return newKey=ReactElement(oldElement.type,newKey,void 0,void 0,oldElement._owner,oldElement.props,oldElement._debugStack,oldElement._debugTask),oldElement._store&&(newKey._store.validated=oldElement._store.validated),newKey}function isValidElement33(object){return typeof object=="object"&&object!==null&&object.$$typeof===REACT_ELEMENT_TYPE}function escape2(key){var escaperLookup={"=":"=0",":":"=2"};return"$"+key.replace(/[=:]/g,function(match2){return escaperLookup[match2]})}function getElementKey(element,index2){return typeof element=="object"&&element!==null&&element.key!=null?(checkKeyStringCoercion(element.key),escape2(""+element.key)):index2.toString(36)}function noop$1(){}function resolveThenable(thenable){switch(thenable.status){case"fulfilled":return thenable.value;case"rejected":throw thenable.reason;default:switch(typeof thenable.status=="string"?thenable.then(noop$1,noop$1):(thenable.status="pending",thenable.then(function(fulfilledValue){thenable.status==="pending"&&(thenable.status="fulfilled",thenable.value=fulfilledValue)},function(error2){thenable.status==="pending"&&(thenable.status="rejected",thenable.reason=error2)})),thenable.status){case"fulfilled":return thenable.value;case"rejected":throw thenable.reason}}throw thenable}function mapIntoArray(children,array2,escapedPrefix,nameSoFar,callback){var type=typeof children;(type==="undefined"||type==="boolean")&&(children=null);var invokeCallback=!1;if(children===null)invokeCallback=!0;else switch(type){case"bigint":case"string":case"number":invokeCallback=!0;break;case"object":switch(children.$$typeof){case REACT_ELEMENT_TYPE:case REACT_PORTAL_TYPE:invokeCallback=!0;break;case REACT_LAZY_TYPE:return invokeCallback=children._init,mapIntoArray(invokeCallback(children._payload),array2,escapedPrefix,nameSoFar,callback)}}if(invokeCallback){invokeCallback=children,callback=callback(invokeCallback);var childKey=nameSoFar===""?"."+getElementKey(invokeCallback,0):nameSoFar;return isArrayImpl(callback)?(escapedPrefix="",childKey!=null&&(escapedPrefix=childKey.replace(userProvidedKeyEscapeRegex,"$&/")+"/"),mapIntoArray(callback,array2,escapedPrefix,"",function(c4){return c4})):callback!=null&&(isValidElement33(callback)&&(callback.key!=null&&(invokeCallback&&invokeCallback.key===callback.key||checkKeyStringCoercion(callback.key)),escapedPrefix=cloneAndReplaceKey(callback,escapedPrefix+(callback.key==null||invokeCallback&&invokeCallback.key===callback.key?"":(""+callback.key).replace(userProvidedKeyEscapeRegex,"$&/")+"/")+childKey),nameSoFar!==""&&invokeCallback!=null&&isValidElement33(invokeCallback)&&invokeCallback.key==null&&invokeCallback._store&&!invokeCallback._store.validated&&(escapedPrefix._store.validated=2),callback=escapedPrefix),array2.push(callback)),1}if(invokeCallback=0,childKey=nameSoFar===""?".":nameSoFar+":",isArrayImpl(children))for(var i10=0;i10<children.length;i10++)nameSoFar=children[i10],type=childKey+getElementKey(nameSoFar,i10),invokeCallback+=mapIntoArray(nameSoFar,array2,escapedPrefix,type,callback);else if(i10=getIteratorFn(children),typeof i10=="function")for(i10===children.entries&&(didWarnAboutMaps||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),didWarnAboutMaps=!0),children=i10.call(children),i10=0;!(nameSoFar=children.next()).done;)nameSoFar=nameSoFar.value,type=childKey+getElementKey(nameSoFar,i10++),invokeCallback+=mapIntoArray(nameSoFar,array2,escapedPrefix,type,callback);else if(type==="object"){if(typeof children.then=="function")return mapIntoArray(resolveThenable(children),array2,escapedPrefix,nameSoFar,callback);throw array2=String(children),Error("Objects are not valid as a React child (found: "+(array2==="[object Object]"?"object with keys {"+Object.keys(children).join(", ")+"}":array2)+"). If you meant to render a collection of children, use an array instead.")}return invokeCallback}function mapChildren(children,func,context){if(children==null)return children;var result=[],count=0;return mapIntoArray(children,result,"","",function(child){return func.call(context,child,count++)}),result}function lazyInitializer(payload){if(payload._status===-1){var ctor=payload._result;ctor=ctor(),ctor.then(function(moduleObject){(payload._status===0||payload._status===-1)&&(payload._status=1,payload._result=moduleObject)},function(error2){(payload._status===0||payload._status===-1)&&(payload._status=2,payload._result=error2)}),payload._status===-1&&(payload._status=0,payload._result=ctor)}if(payload._status===1)return ctor=payload._result,ctor===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s