nexsys4 1.3.9 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -22
- package/dist/nexSys4.nxs +1 -1
- package/dist/nexsys4.min.js +1 -1
- package/package.json +1 -1
package/dist/nexsys4.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t,a,n,s,i,o,l,c){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});var u=Object.create,d=Object.defineProperty,m=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,g=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),__copyProps=(e,t,a,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var s,i=p(t),o=0,l=i.length;o<l;o++)s=i[o],h.call(e,s)||s===a||d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(n=m(t,s))||n.enumerable});return e},__toESM=(e,t,a)=>(a=null!=e?u(g(e)):{},__copyProps(!t&&e&&e.__esModule?a:d(a,"default",{value:e,enumerable:!0}),e));let b=__toESM(a,1);a=__toESM(a);var y=Symbol.for("nexsys4.nexusClientOverrides.installed"),v=Symbol.for("nexsys4.nexusClientOverrides.originals"),S=200,resolveOverrideTargets=e=>({buffer:"function"==typeof e?.buffer?e.buffer():null,platform:"function"==typeof e?.platform?e.platform():null,datahandler:"function"==typeof e?.datahandler?e.datahandler():null}),getActiveNexSys=()=>globalThis.nexSys&&"object"==typeof globalThis.nexSys?globalThis.nexSys:null,getSystemSettings=(e=getActiveNexSys())=>e?.state?.system?.settings||e?.sys?.settings||{},isOverrideTabEnabled=(e=getActiveNexSys())=>Boolean(getSystemSettings(e).overrideTab),normalizeTargetQuery=e=>{const t=String(e??"").trim();return t?`${t.charAt(0).toUpperCase()}${t.slice(1).toLowerCase()}`:""},getInputArea=()=>globalThis.document?.getElementsByTagName?.("textarea")?.[0]??null,createTabCompletion=()=>({txt:null,qry:null,vals:null,index:0,reset(){this.txt=null,this.qry=null,this.vals=null,this.index=0},tc(){const e=getInputArea();if(!e)return;if(this.txt??=String(e.value??"").split(" "),this.qry??=normalizeTargetQuery(this.txt.at(-1)),!this.qry)return;const t=Array.isArray(globalThis.nexGui?.colors?.enemies)?globalThis.nexGui.colors.enemies:[],a=Array.isArray(globalThis.GMCP?.WhoList)?globalThis.GMCP.WhoList:[];this.vals??=[...new Set([...t.map(e=>String(e)),...a.map(e=>String(e?.name??"")).filter(e=>e.startsWith(this.qry))])],this.vals.length&&(this.index>this.vals.length-1?(this.txt[this.txt.length-1]=this.qry,this.index=0):(this.txt[this.txt.length-1]=this.vals[this.index],this.index+=1),e.value=this.txt.join(" "))}}),ensureTabCompletion=(e=getActiveNexSys())=>{if(e?.tabCompletion?.tc&&e?.tabCompletion?.reset)return e.tabCompletion;const t=createTabCompletion();return e&&"object"==typeof e&&(e.tabCompletion=t),t},renderCustomPrompt=(e,t={})=>{const a=e?.api?.prompt,n=t?.line;try{const e="function"==typeof a?.render?a.render(t):null;return"string"!=typeof e?null:(n?.parsed_line&&"object"==typeof n.parsed_line&&(n.parsed_line.formatted=()=>e),e)}catch(s){return console.error("nexSys4 custom prompt render failed",s),null}},createAddBlockOverride=()=>function add_block(e=[]){const t=getActiveNexSys();t?.prepend_line&&(e.unshift(t.prepend_line),t.prepend_line=!1);const a=Boolean(getSystemSettings(t).customPrompt);let n=0;for(let i=0;i<e.length;i+=1){const s=e[i];if(!s||s.gag)continue;if(!s.parsed_line&&!s.html_line)continue;const o=Boolean(s.is_prompt&&a&&s.parsed_line)?renderCustomPrompt(t,{line:s,source:"nexus-client-override"}):null;s.is_prompt&&0===n&&null===o?s.gag=!0:(!s.parsed_line||"function"!=typeof s.parsed_line.text||s.parsed_line.text()||0!==n&&i!==e.length-1||null!==o)&&("function"==typeof this._fill_tab_completion&&this._fill_tab_completion(s),n+=1,this.lineid+=1,s.id=this.lineid,this.lines.push(s),this.unread=!0)}const s=this.prune_lines?.()??!1;(n||s)&&this.on_lines_changed?.()},createProcessLinesOverride=()=>function process_lines(e=[]){if(this.gagged)return;if(!e.length)return;this.current_block=e;const t=this.reflexes?.();for(let a=0;a<e.length&&!(a>=1e3);a+=1)if(this.current_line=e[a],this.current_line.index=a,e[a]?.line&&String(e[a].line).indexOf(String.fromCharCode(7))>=0&&this.platform?.()?.beep?.(),!this.fullstop&&"function"==typeof t?.handle_triggers){const n=t.handle_triggers(e,a);Array.isArray(n)&&(e=n)}t?.run_function?.("onBlock",e,"ALL"),this.buffer?.()?.add_block?.(e),this.current_line=void 0,this.current_block=void 0},createOnKeyUpOverride=()=>function on_key_up(e){if(!this._nexus?.datahandler?.()?.is_connected?.())return!0;if(this.dialog_has_focus?.())return!0;const t=getActiveNexSys(),a=isOverrideTabEnabled(t),n=a?ensureTabCompletion(t):null;return this.tab_pressed?9!==e||(this.tab_pressed=!1,a?(n?.tc?.(),!1):(this.player_targetted||this._nexus?.datahandler?.()?.tab_target?.(!1),this.player_targetted=!1,!1)):(n?.reset?.(),!0)},createSendCommandOverride=e=>function send_command(t){const a=getActiveNexSys(),n=Date.now();if(a&&"object"==typeof a&&(a.sentCommands=[...(Array.isArray(a.sentCommands)?a.sentCommands:[]).slice(0,S-1),{cmd:t,time:n}]),"function"==typeof e)return e.call(this,t);this._socket&&(this._socket.send(`${t}\r\n`),this.last_send=n)},installNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e||e[y])return Boolean(e);const{buffer:t,platform:a,datahandler:n}=resolveOverrideTargets(e);return!!(t&&a&&n)&&(e[v]={buffer:t,platform:a,datahandler:n,process_lines:e.process_lines,add_block:t.add_block,on_key_up:a.on_key_up,send_command:n.send_command},e.process_lines=createProcessLinesOverride(),t.add_block=createAddBlockOverride(),a.on_key_up=createOnKeyUpOverride(),n.send_command=createSendCommandOverride(n.send_command),e[y]=!0,!0)},uninstallNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e?.[y])return!1;const t=e[v];if(!t)return delete e[y],!1;const a=t.buffer||resolveOverrideTargets(e).buffer,n=t.platform||resolveOverrideTargets(e).platform,s=t.datahandler||resolveOverrideTargets(e).datahandler;return e.process_lines=t.process_lines,a&&(a.add_block=t.add_block),n&&(n.on_key_up=t.on_key_up),s&&(s.send_command=t.send_command),delete e[v],delete e[y],!0},x=["send","sendGmcp","on","off","notice","getCommandSeparator","now","setTimeout","clearTimeout","getVariable","setVariable","emitLocal","raiseToEventStream"],k=Object.freeze({promptRender:["renderPrompt"],gmcpSnapshot:["getGMCP"],debugToggle:["setDebugEnabled","isDebugEnabled"],destroy:["destroy"]}),resolveAdapterCapabilities=e=>{const t=e?.capabilities&&"object"==typeof e.capabilities?e.capabilities:{},a={};return Object.entries(k).forEach(([n,s])=>{const i=Object.prototype.hasOwnProperty.call(t,n)?Boolean(t[n]):s.every(t=>"function"==typeof e?.[t]);if(i){const t=s.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter capability "${n}" requires methods: ${t.join(", ")}`)}a[n]=i}),Object.freeze(a)},assertAdapterContract=e=>{const t=x.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter missing required methods: ${t.join(", ")}`);return resolveAdapterCapabilities(e),e},C=["Char.Vitals","Char.Status","Char.Afflictions.List","Char.Afflictions.Add","Char.Afflictions.Remove","Char.Defences.List","Char.Defences.Add","Char.Defences.Remove","Char.Items.Add","Char.Items.Remove","Char.Items.Update","Char.Items.List","IRE.Rift.List","IRE.Rift.Change","Room.Info","IRE.Target.Info"],registerEventStreamBindings=({eventBus:e,emit:t,pushTrace:a,eventRegistrations:n})=>{if(!e?.registerEvent)return;const registerBinding=(t,s)=>{const i=`nexsys4-${t.replace(/\W+/g,"-")}`,callback=e=>s(e);e.registerEvent(t,callback,{id:i,tags:["nexsys4"]}),n.push({eventName:t,id:i}),a("register:eventStream",{eventName:t,id:i})};C.forEach(e=>{registerBinding(e,a=>{t("GmcpEvent",{tag:e,payload:a??null,rawTag:e})})}),registerBinding("PromptEvent",e=>{t("PromptEvent",{source:"eventstream-prompt",payload:e??null})})},A=Object.freeze({domination:Object.freeze({sycophantcommand:Object.freeze({balance:"entity",durationMs:1750}),dervishcommand:Object.freeze({balance:"entity",durationMs:1770}),bloodleechcommand:Object.freeze({balance:"entity",durationMs:1950}),chimeracommand:Object.freeze({balance:"entity",durationMs:1950}),chimeracommanddeaf:Object.freeze({balance:"entity",durationMs:1950}),cronecommand:Object.freeze({balance:"entity",durationMs:1950}),houndcommand:Object.freeze({balance:"entity",durationMs:1950}),humbugcommand:Object.freeze({balance:"entity",durationMs:1950}),stormcommand:Object.freeze({balance:"entity",durationMs:1950}),wormcommand:Object.freeze({balance:"entity",durationMs:1950}),buboniscommand:Object.freeze({balance:"entity",durationMs:2050}),slimecommand:Object.freeze({balance:"entity",durationMs:2250}),abominationcommand:Object.freeze({balance:"entity",durationMs:2300})})}),E=Object.freeze([Object.freeze({id:"icewall-summoned",observe:Object.freeze({kind:"wall",change:"added",type:"icewall"}),pattern:/^(?<user>\w+) raises \w+ hands dramatically and summons an icewall to the (?<direction>[a-z]+)\.$/}),Object.freeze({id:"icewall-melted-by-firelash",observe:Object.freeze({kind:"wall",change:"removed",type:"icewall"}),pattern:/^The icewall to the (?<direction>[a-z]+) suddenly melts as a lash of fire strikes the opposite side of it\.$/})]),w=Object.freeze(["n","ne","e","se","s","sw","w","nw","u","d","in","out"]),_=Object.freeze({north:"n",northeast:"ne",east:"e",southeast:"se",south:"s",southwest:"sw",west:"w",northwest:"nw",up:"u",down:"d",in:"in",out:"out"}),normalizeRoomDirection=e=>{if("string"!=typeof e)return null;const t=e.trim().toLowerCase();return w.includes(t)?t:Object.hasOwn(_,t)?_[t]:null},normalizeRoomId=e=>{if("number"!=typeof e&&"string"!=typeof e)return null;if("string"==typeof e&&!e.trim())return null;const t=Number(e);return Number.isFinite(t)?t:null},roomObserverTag=e=>`room-observer:${e}`,emitRoomObservation=({entry:e,direction:t,source:a,emit:n,pushTrace:s=()=>{}})=>{const{kind:i,...o}=e.observe;"wall"===i?(null==t||normalizeRoomDirection(t)||s("room:invalid-direction",{id:e.id,direction:t}),n("RoomWallObservedEvent",{...o,direction:t??null,source:a})):"ground"===i&&n("RoomGroundObservedEvent",{...o,source:a})},createRoomObserverTriggers=({roomObserverCatalog:e=E}={})=>({group:"room/observers",triggers:e.filter(e=>e.pattern).map(e=>({name:e.id,regex:e.pattern,tags:[roomObserverTag(e.id)],action:({args:t,emit:a,pushTrace:n})=>emitRoomObservation({entry:e,direction:t?.groups?.direction,source:"text-trigger",emit:a,pushTrace:n})}))}),T="nexskill.match.skill",normalizeActionId=e=>String(e||"").trim().toLowerCase(),registerSkillEventBindings=({eventBus:e,emit:t,pushTrace:a,eventRegistrations:n,table:s=A,roomObserverCatalog:i=E,getNexSkills:o=()=>null,triggerApi:l})=>{if(!e?.registerEvent)return;i.filter(e=>e.nexskill).forEach(s=>{const i=s.nexskill,o=`${T}.${i.skill}.${normalizeActionId(i.action)}`,l=`nexsys4-room-observer-${s.id}`;e.registerEvent(o,e=>{e?.matchType===i.matchType&&emitRoomObservation({entry:s,direction:e.info,source:"nexskill",emit:t,pushTrace:a})},{id:l,tags:["nexsys4"]}),n.push({eventName:o,id:l}),a("register:eventStream",{eventName:o,id:l})});const c="nexsys4-room-observer-selection";let u=!1;e.registerEvent("nexskill.match",()=>{if(u)return;u=!0;const e=o()?.actions;if(Array.isArray(e))for(const t of i){const n=t.nexskill;t.pattern&&n&&(e.some(e=>{if(e.skill!==n.skill||normalizeActionId(e.id)!==normalizeActionId(n.action))return!1;const t=e.patterns?.[n.matchType]??e[n.matchType];return t instanceof RegExp||"string"==typeof t&&t.length>0||Array.isArray(t)&&t.length>0})&&(l?.triggers?.disable?.([roomObserverTag(t.id)]),a("room:observer-covered",{id:t.id,binding:n})))}},{id:c,tags:["nexsys4"],once:!0}),n.push({eventName:"nexskill.match",id:c}),Object.entries(s).forEach(([s,i])=>{const o=`${T}.${s}`,l=`nexsys4-${o.replace(/\W+/g,"-")}`;e.registerEvent(o,e=>{if("firstPerson"!==e?.matchType)return;const a=normalizeActionId(e.id),n=i[a];n&&t("SkillBalanceObservedEvent",{id:n.balance,durationMs:n.durationMs,reason:`nexskill:${a}`,source:"nexskill"})},{id:l,tags:["nexsys4"]}),n.push({eventName:o,id:l}),a("register:eventStream",{eventName:o,id:l})})},registerStartupGag=({onLocalEvent:e,client:t,notice:a,isDebugEnabled:n})=>{if("function"!=typeof e)return;const gagBlock=()=>{n()||t?.current_block?.forEach(e=>e.gag=!0)};let s=null,i=null,o=null;i=e("CuringStartupBeginEvent",()=>{i?.(),i=null,s||(s=e("PromptEvent",gagBlock))}),o=e("CuringStartupCompleteEvent",()=>{o?.(),o=null,gagBlock(),s?.(),s=null,a("loaded using startup spam gag.")})},createTriggerPattern=e=>void 0!==e.regex?e.regex:e.text,resolveTriggerReason=(e,t={})=>"function"==typeof e.resolveReason?e.resolveReason(t):e.reason,resolveTriggerPayload=(e,t,a={})=>{const n={id:e,source:"text"},s=resolveTriggerReason(t,a);return void 0!==t.have&&(n.have=t.have),void 0!==s&&(n.reason=s),"function"==typeof t.resolvePayload&&Object.assign(n,t.resolvePayload(a,n)||{}),n},createBalanceTextTrigger=(e,t)=>({name:`${e}-${t.name}`,regex:createTriggerPattern(t),action:({args:a,emit:n})=>{n("BalanceStateTextEvent",resolveTriggerPayload(e,t,a?.groups))}}),createBalanceTextTriggersFromFamilies=(e=[])=>e.flatMap(({id:e,entries:t=[]})=>t.map(t=>createBalanceTextTrigger(e,t))),M=["a dolomite grain","a calcite mote","a bisemutum chip","an azurite mote","a magnesium chip","an aurum flake","a plumbum flake","a stannum flake","an arsenic pellet","a ferrum flake","an antimony flake","a cuprum flake","an argentum flake","a calamine crystal","a pinch of ground cinnabar","a pinch of realgar crystals","a quartz grain","a pinch of ground malachite","a quicksilver droplet","a potash crystal","a gypsum crystal"],P=["dolomite grains","calcite motes","bisemutum chips","azurite motes","magnesium chips","aurum flakes","plumbum flakes","stannum flakes","arsenic pellets","ferrum flakes","antimony flakes","cuprum flakes","argentum flakes","calamine crystals","pinches of ground cinnabar","pinches of ground realgar","quartz grains","pinches of ground malachite","quicksilver droplets","potash crystals","gypsum crystals"],O=["a bloodroot leaf","a piece of kelp","a goldenseal root","some prickly ash bark","some bayberry bark","a ginseng root","a ginger root","a bellwort flower","a lobelia seed","a hawthorn berry","a valerian leaf","a skullcap flower","slippery elm","a kola nut","sileris berry","some irid moss","a black cohosh root","a prickly pear","some myrrh gum","an echinacea root"],D=["bloodroot leaves","pieces of kelp","goldenseal roots","pieces of prickly ash bark","pieces of bayberry bark","ginseng roots","ginger roots","bellwort flowers","lobelia seeds","hawthorn berries","valerian leaves","skullcap flowers","slippery elms","kola nuts","sileris berries","pieces of irid moss","cohosh roots","prickly pears","myrrh gums","echinacea roots"],R={"a dolomite grain":"dolomite","a calcite mote":"calcite","a bisemutum chip":"bisemutum","an azurite mote":"azurite","a magnesium chip":"magnesium","an aurum flake":"aurum","a plumbum flake":"plumbum","a stannum flake":"stannum","an arsenic pellet":"arsenic","a ferrum flake":"ferrum","an antimony flake":"antimony","a cuprum flake":"cuprum","an argentum flake":"argentum","a calamine crystal":"calamine","a pinch of ground cinnabar":"cinnabar","a pinch of realgar crystals":"realgar","a quartz grain":"quartz","a pinch of ground malachite":"malachite","a quicksilver droplet":"quicksilver","a potash crystal":"potash","a gypsum crystal":"gypsum","a bloodroot leaf":"bloodroot","a piece of kelp":"kelp","a goldenseal root":"goldenseal","some prickly ash bark":"ash","some bayberry bark":"bayberry","a ginseng root":"ginseng","a ginger root":"ginger","a bellwort flower":"bellwort","a lobelia seed":"lobelia","a hawthorn berry":"hawthorn","a valerian leaf":"valerian","a skullcap flower":"skullcap","slippery elm":"elm","a kola nut":"kola","sileris berry":"sileris","some irid moss":"moss","a black cohosh root":"cohosh","a prickly pear":"pear","some myrrh gum":"myrrh","an echinacea root":"echinacea","dolomite grains":"dolomite","calcite motes":"calcite","bisemutum chips":"bisemutum","azurite motes":"azurite","magnesium chips":"magnesium","aurum flakes":"aurum","plumbum flakes":"plumbum","stannum flakes":"stannum","arsenic pellets":"arsenic","ferrum flakes":"ferrum","antimony flakes":"antimony","cuprum flakes":"cuprum","argentum flakes":"argentum","calamine crystals":"calamine","pinches of ground cinnabar":"cinnabar","pinches of ground realgar":"realgar","quartz grains":"quartz","pinches of ground malachite":"malachite","quicksilver droplets":"quicksilver","potash crystals":"potash","gypsum crystals":"gypsum","bloodroot leaves":"bloodroot","pieces of kelp":"kelp","goldenseal roots":"goldenseal","pieces of prickly ash bark":"ash","pieces of bayberry bark":"bayberry","ginseng roots":"ginseng","ginger roots":"ginger","bellwort flowers":"bellwort","lobelia seeds":"lobelia","hawthorn berries":"hawthorn","valerian leaves":"valerian","skullcap flowers":"skullcap","slippery elms":"elm","kola nuts":"kola","sileris berries":"sileris","pieces of irid moss":"moss","cohosh roots":"cohosh","prickly pears":"pear","myrrh gums":"myrrh","echinacea roots":"echinacea"},N={antimony:"ginger",argentum:"lobelia",arsenic:"bayberry",aurum:"kelp",bisemutum:"myrrh",calamine:"hawthorn",calcite:"pear",cinnabar:"elm",cuprum:"bellwort",dolomite:"echinacea",ferrum:"ginseng",gypsum:"cohosh",magnesium:"bloodroot",malachite:"skullcap",plumbum:"goldenseal",potash:"moss",quartz:"kola",quicksilver:"sileris",realgar:"valerian",stannum:"ash"},j={ash:"stannum",bayberry:"arsenic",bellwort:"cuprum",bloodroot:"magnesium",cohosh:"gypsum",echinacea:"dolomite",elm:"cinnabar",ginseng:"ferrum",ginger:"antimony",goldenseal:"plumbum",hawthorn:"calamine",kelp:"aurum",kola:"quartz",lobelia:"argentum",moss:"potash",myrrh:"bisemutum",pear:"calcite",sileris:"quicksilver",skullcap:"malachite",valerian:"realgar"},I={azurite:0,bisemutum:0,magnesium:0,plumbum:0,arsenic:0,potash:0,stannum:0,malachite:0,realgar:0,cinnabar:0,antimony:0,ferrum:0,quartz:0,quicksilver:0,aurum:0,calamine:0,cuprum:0,argentum:0,gypsum:0,calcite:0,dolomite:0,ginseng:0,bloodroot:0,kelp:0,hawthorn:0,lobelia:0,bellwort:0,ginger:0,bayberry:0,ash:0,goldenseal:0,moss:0,valerian:0,elm:0,skullcap:0,sileris:0,kola:0,cohosh:0,pear:0,myrrh:0,echinacea:0},escapeRegExp$1=e=>String(e||"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),buildAlternation=(e=[])=>e.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean).map(escapeRegExp$1).join("|"),exactEntry=(e,t,a,n)=>({name:e,text:t,have:a,reason:n}),regexEntry=(e,t,a,n)=>({name:e,regex:t,have:a,reason:n}),dynamicReasonEntry=(e,t,a,n)=>({name:e,regex:t,have:a,resolveReason:n}),dynamicPayloadEntry=(e,t,a)=>({name:e,regex:t,resolvePayload:a}),L=[...O,...M].filter(e=>"some irid moss"!==e&&"a potash crystal"!==e),q=new RegExp(`^You eat (?<item>${buildAlternation(L)})\\.$`),B=/^Balance used: (?<duration>\d+\.\d{1,2})s\.$/,$=/^Equilibrium used: (?<duration>\d+\.\d{1,2})s\.$/,normalizeConsumedHerb=e=>{const t=String(e||"").trim().toLowerCase();return R[t]||t},parseObservedDurationSeconds=(e={})=>Number.parseFloat(String(e.duration||"")),z=[{id:"balance",entries:[exactEntry("ready","You have recovered balance on all limbs.",!0,"ready"),dynamicPayloadEntry("used",B,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"equilibrium",entries:[exactEntry("ready","You have recovered equilibrium.",!0,"ready"),dynamicPayloadEntry("used",$,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"herb",entries:[exactEntry("ready","You may eat another plant or mineral.",!0,"ready"),dynamicReasonEntry("use",q,!1,e=>normalizeConsumedHerb(e?.item))]},{id:"focus",entries:[exactEntry("ready","Your mind is able to focus once again.",!0,"ready"),exactEntry("use","You focus your mind intently on curing your mental maladies.",!1,"focus"),regexEntry("shriek",/^A diminutive homunculus resembling \w+ turns its head towards you, its jaws opening wider than what seems possible\. The homunculus stares intently at you and lets out an ear-piercing shriek that disrupts your thoughts\.$/,!1,"shriek"),regexEntry("concussion",/^(?:The blow sets your head to spinning - you cannot concentrate on anything\.|\w+ swings (?:his|her) shield around, smashing your temple with a backhanded blow\.)$/,!1,"concussion"),exactEntry("failed","You concentrate, but your mind is too tired to focus.",!1,"failed")]},{id:"sip",entries:[exactEntry("ready","You may drink another health or mana elixir.",!0,"ready"),exactEntry("health","The elixir heals and soothes you.",!1,"health"),exactEntry("mana","Your mind feels stronger and more alert.",!1,"mana"),regexEntry("apply",/^You take some elixir from .+ and rub it into your .+\.$/,!1,"apply"),exactEntry("failed-elixir","The elixir flows down your throat without effect.",!1,"failed"),exactEntry("failed-health-elixir","The health elixir fizzles away without any discernable effect.",!1,"failed")]},{id:"moss",entries:[exactEntry("ready","You may eat another bit of irid moss or potash.",!0,"ready"),exactEntry("use","You feel your health and mana replenished.",!1,"consume"),exactEntry("failed","The potash slides down without effect.",!1,"failed")]},{id:"tree",entries:[exactEntry("ready","You may utilise the tree tattoo again.",!0,"ready"),exactEntry("use","You touch the tree of life tattoo.",!1,"touch"),exactEntry("failed","Your tree of life tattoo glows faintly for a moment then fades, leaving you unchanged.",!1,"failed")]},{id:"salve",entries:[exactEntry("ready","You may apply another salve to yourself.",!0,"ready"),exactEntry("failed","The salve dissolves and quickly disappears after you apply it.",!1,"failed"),regexEntry("restoration",/^\[Curing\]: APPLY RESTORATION TO \w+$/,!1,"restoration"),regexEntry("apply",/^(?:\[Curing\]: APPLY (?:MENDING|EPIDERMAL|CALORIC).*$|You take out some salve and quickly rub it on your(?:\s\w+)+\.)$/,!1,"apply")]},{id:"immunity",entries:[exactEntry("ready","Your system is able to absorb antidotes once again.",!0,"ready"),exactEntry("failed","The liquid reacts with the substance still present in your system, cancelling itself out.",!1,"failed"),exactEntry("use","[Curing]: SIP IMMUNITY",!1,"immunity")]},{id:"rebounding",entries:[exactEntry("aura","You feel an aura of rebounding surround you.",!0,"aura"),exactEntry("discharged","Your aura of weapons rebounding disappears.",!0,"discharged"),exactEntry("already-on","You puff on the pipe, but your existing aura of weapons rebounding negates any effect.",!0,"already-on"),exactEntry("malachite","You take a long drag of malachite off your pipe.",!1,"malachite"),exactEntry("malachite-no-period","You take a long drag of malachite off your pipe",!1,"malachite"),exactEntry("skullcap","You take a long drag of skullcap off your pipe.",!1,"skullcap")]},{id:"smoke",entries:[exactEntry("ready","Your lungs have recovered enough to smoke another mineral or plant.",!0,"ready"),exactEntry("failed","Your lungs have not yet recovered enough to allow you to smoke.",!1,"failed"),regexEntry("use",/^You take a long drag of/,!1,"smoke")]},{id:"dragonbreath",entries:[regexEntry("ready",/^Your \w+ summoning is complete\.$/,!0,"ready"),exactEntry("failed","You already have your breath summoned, Wyrm.",!1,"failed"),exactEntry("lightning","You feel your eyes begin to blaze as you summon lightning to your belly.",!1,"lightning"),exactEntry("fire","With an almost inaudible growl, you begin summoning a fiery inferno into your belly.",!1,"fire"),exactEntry("acid","With a great effort, you begin to summon caustic hell to your innards.",!1,"acid"),exactEntry("cold","Flaring your wings and head back, you begin summoning forth the icy cold of the pure, endless void into your belly.",!1,"cold"),exactEntry("venom","With a great shudder, you begin to summon forth the defiling, deadly wyrmvenom of legend.",!1,"venom"),exactEntry("psi","Calling upon the vast well of mental power at your disposal, you begin to summon a mind-rending blast of psi energy.",!1,"psi")]},{id:"deafness",entries:[exactEntry("ready","The aural world fades to silence.",!0,"ready"),exactEntry("calamine","You eat a calamine crystal.",!1,"calamine"),exactEntry("hawthorn","You eat a hawthorn berry.",!1,"hawthorn")]},{id:"deaf",entries:[exactEntry("already-on","You are already deaf.",!0,"already-on"),exactEntry("trance","The world about you falls silent as the deafness trance sinks upon you.",!0,"trance"),exactEntry("use","You stare straight ahead and concentrate on a distant focal point.",!1,"deaf")]},{id:"blind",entries:[exactEntry("already-on","You are already blind.",!0,"already-on"),exactEntry("ready","You open your eyes once more, and the world about you is darkness.",!0,"ready"),exactEntry("use","You close your eyes for a moment.",!1,"blind")]},{id:"speed",entries:[exactEntry("ready","Tiny tremours spread through your body as the world seems to slow down.",!0,"ready"),exactEntry("use","[Curing]: SIP SPEED",!1,"speed")]},{id:"sileris",entries:[exactEntry("quicksilver-ready","The quicksilver hardens into a supple metallic shell.",!0,"quicksilver"),exactEntry("berry-ready","The sileris berry juice hardens into a supple purple shell.",!0,"sileris"),exactEntry("quicksilver-use","You apply a quicksilver droplet to yourself.",!1,"quicksilver"),exactEntry("berry-use","You apply a sileris berry to yourself.",!1,"sileris")]},{id:"voice",entries:[exactEntry("ready","You have recovered voice balance.",!0,"ready")]},{id:"tremolo",entries:[exactEntry("ready","You may mangle a limb with the vibrato or tremolo once again.",!0,"ready"),regexEntry("arm-use",/^With a trilling vibrato you attack \w+'s broken (?:left|right) arm\. (?:He|She) screams in pain\.$/,!1,"arm"),regexEntry("leg-use",/^Using a heavy tremolo you brutally punish \w+'s already shattered (?:left|right) leg\.$/,!1,"leg")]},{id:"homunculus",entries:[exactEntry("ready","You may order your homunculus once more.",!0,"ready"),exactEntry("failed","You are unable to order your homunculus again so soon.",!1,"failed"),regexEntry("use",/^Focusing your mind on a diminutive homunculus resembling (?:\w+), you command it to disrupt (?:\w+)'s focus\. The homunculus turns towards (?:him|her) before letting out an ear-piercing shriek\.$/,!1,"shriek")]},{id:"fitness",entries:[exactEntry("ready","You may purge your lungs once again.",!0,"ready"),exactEntry("use","You inhale deeply, purging yourself of your asthmatic condition.",!1,"fitness"),exactEntry("failed","You may not purge your lungs again as of this time.",!1,"failed")]},{id:"bloodboil",entries:[exactEntry("ready","You may boil your blood once again.",!0,"ready"),exactEntry("use","You summon spirits of fire to burn off that which afflicts you.",!1,"bloodboil"),exactEntry("failed","You have not recovered enough to boil your blood again as of yet.",!1,"failed")]},{id:"dragonheal",entries:[exactEntry("ready","You may purge your great form of afflictions once again.",!0,"ready"),exactEntry("use","You let out a great keening, and cast the impurities from your form.",!1,"dragonheal"),exactEntry("failed-recovery","You have not yet recovered enough to purge your great form of afflictions.",!1,"failed"),exactEntry("failed-disjointed","Your mind and body are too disjointed to invoke your healing powers, wyrm.",!1,"failed")]},{id:"rage",entries:[exactEntry("ready","You may channel your rage to cure your afflictions once again.",!0,"ready"),exactEntry("use","You allow your pent-up rage to vent and your eyes flash dangerously.",!1,"rage")]},{id:"salt",entries:[exactEntry("use","Directing the energy of salt, you surround yourself with a primal aura, purging yourself of ailments.",!1,"salt"),exactEntry("ready","You may channel alchemical energy to heal yourself once again.",!0,"ready"),exactEntry("failed","You have not recovered enough to heal yourself with alchemical energy once again.",!1,"failed")]},{id:"shrugging",entries:[exactEntry("ready","Your body has recovered enough to shrug afflictions once again.",!0,"ready"),exactEntry("use","Focusing inward, you purge your body of afflictions.",!1,"shrugging"),exactEntry("failed","You may not shrug again so soon.",!1,"failed")]},{id:"fool",entries:[exactEntry("ready","You may heal another affliction.",!0,"ready"),exactEntry("use","You press the Fool tarot to your forehead.",!1,"fool"),exactEntry("failed","The Fool has no effect on you.",!1,"failed")]},{id:"writhe",entries:[regexEntry("free",/^You have writhed free\b/,!0,"ready"),exactEntry("no-affliction","You begin to writhe helplessly, throwing your body off balance.",!0,"no-affliction"),exactEntry("entangled","You begin to struggle free of your entanglement.",!1,"entangled"),exactEntry("transfixation","You begin trying to wrest your mind free of that which has transfixed it.",!1,"transfixation"),exactEntry("failed-entangled","You twist and turn as you attempt to escape from your entanglement.",!1,"failed"),exactEntry("failed-transfixation","You continue trying to wrest your mind free.",!1,"failed")]},{id:"impalewrithe",entries:[exactEntry("free-direct","With an heroic effort you manage to writhe yourself free from the weapon that impaled you.",!0,"impale"),exactEntry("use","You begin to writhe furiously to escape the blade that has impaled you.",!1,"impale"),regexEntry("free-swathe",/^With a vicious snarl \w+ carves a merciless swathe through your steaming guts\. You gurgle and choke as s?he withdraws (?:his|her) dripping blade, glistening with gore\.$/,!0,"impale"),regexEntry("free-wrench",/^Searing pain tears through your midsection as you wrench away from [A-Z][a-z]+, (?:his|her) weapon ripping unceremoniously through your innards\.$/,!0,"impale"),regexEntry("free-slide",/^With a snarl of contempt, \w+ allows you to slide free of (?:her|his) weapon\.$/,!0,"impale")]},{id:"alleviate",entries:[exactEntry("ready","You may purge your body of afflictions once again.",!0,"ready"),exactEntry("use","Applying your knowledge of anatomy, you massage pressure points with your fingers, and a flood of relief courses through your body.",!1,"alleviate"),exactEntry("no-afflictions","There are no pesky afflictions keeping you from your destiny, Warrior.",!1,"no-afflictions"),exactEntry("failed","You are too exhausted to purge your body of afflictions.",!1,"failed")]},{id:"slough",entries:[exactEntry("use","You allow your outer layers to slough away, their fires extinguished along with the impurities contaminating them.",!1,"slough"),exactEntry("ready","You may slough off the impurities that plague you once again.",!0,"ready"),exactEntry("failed","You may not slough off the impurities again quite yet.",!1,"failed")]}],createBalanceTextTriggers=()=>({group:"balance/text",triggers:createBalanceTextTriggersFromFamilies(z)}),parsePositiveInteger=(e,t=1)=>{const a=Number.parseInt(String(e??""),10);return Number.isFinite(a)&&a>0?a:t},cleanItemText=e=>String(e||"").trim(),emitInventoryDelta=({emit:e,item:t,delta:a,source:n="text-trigger"})=>{e("CacheInventoryDeltaTextEvent",{item:cleanItemText(t),delta:a,source:n})},createCacheTextTriggers=()=>({group:"cache/text",triggers:[{name:"rift-out",regex:/^You remove (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftOutTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),source:"text-trigger"})}},{name:"curative-consume",regex:/^You eat (?<item>.+?)\.$/,action:({args:e,emit:t})=>{t("CacheCurativeConsumedTextEvent",{item:cleanItemText((e?.groups||{}).item),amount:1,source:"text-trigger"})}},{name:"rift-in",regex:/^You store (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)(?<capacityMarker>, which is the maximum for that type of object)?\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftInTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),atCapacity:Boolean(a.capacityMarker),source:"text-trigger"})}},{name:"rift-full",regex:"You may not store any more of that type of thing.",action:({emit:e})=>{e("CacheRiftFullTextEvent",{source:"text-trigger"})}},{name:"inventory-empty",regex:/^You have no (?<item>.+?) in your inventory\.$/,action:({args:e,emit:t})=>{t("CacheInventoryEmptyTextEvent",{item:cleanItemText((e?.groups||{}).item),source:"text-trigger"})}},{name:"give-away",regex:/^You give (?<item>.+?) to .+\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}},{name:"receive",regex:/^.+ gives (?<item>.+?) to you\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:1})}},{name:"drop",regex:/^You drop (?<item>.+?)\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}}]}),shiftTrigger=(e,t)=>({name:e,regex:t,action:({emit:t})=>{t("AvoidPostureShiftedTextEvent",{type:e})}}),observedTrigger=(e,t)=>({name:`already-${e}`,regex:t,action:({emit:t})=>{t("AvoidPostureObservedTextEvent",{type:e,reason:"already-active"})}}),createAvoidPostureTriggers=()=>({group:"defense/avoidPosture",triggers:[shiftTrigger("physical",/^You prepare yourself to avoid the brunt of physical attacks\.$/),shiftTrigger("aoe",/^You prepare yourself to avoid the brunt of area of effect attacks\.$/),shiftTrigger("mental",/^You prepare yourself to avoid the brunt of mental based attacks\.$/),shiftTrigger("arcane",/^You prepare yourself to avoid the brunt of arcane based attacks\.$/),observedTrigger("physical",/^You are already attempting to avoid the brunt of physical attacks\.$/),observedTrigger("aoe",/^You are already attempting to avoid the brunt of area of effect attacks\.$/),observedTrigger("mental",/^You are already attempting to avoid the brunt of mental based attacks\.$/),observedTrigger("arcane",/^You are already attempting to avoid the brunt of arcane based attacks\.$/),{name:"recovered",regex:/^You may once more shift your defensive posture\.$/,action:({emit:e})=>{e("AvoidPostureRecoveredTextEvent",{})}},{name:"blocked",regex:/^You have too recently shifted your defensive posture to do so again\.$/,action:({emit:e})=>{e("AvoidPostureBlockedTextEvent",{})}}]}),normalizeTextValue=e=>String(e||"").trim(),parseDelimitedEntries=e=>String(e||"").split(/[|,]/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),parseSpaceDelimitedEntries=e=>String(e||"").replace(/\s+\((\d+)\)/g,"($1)").trim().split(/\s+/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),buildLimbPayload=({args:e,client:t,source:a="text-trigger"})=>({limb:normalizeTextValue(e.groups?.limb),raw:normalizeTextValue(t?.current_line?.line),source:a}),F=String.raw`, you perceive that \w+ has dealt (?<amount>[\d.]+)% damage to your (?<limb>.+)\.$`,damageTrigger=(e,t)=>({name:e,regex:new RegExp(`^${t}${F}`),action:({args:e,client:t,emit:a})=>{a("LimbDamageTextEvent",{...buildLimbPayload({args:e,client:t}),amount:Number(e.groups?.amount)})}}),createLimbTextTriggers=()=>({group:"limb/selfDamage",triggers:[damageTrigger("carve-hit",String.raw`As .+? carves into you`),damageTrigger("crunch-hit",String.raw`As .+?'s? blow crunches into you`),{name:"pain-subsides",regex:/^The pain plaguing your (?<limb>.+) subsides\.$/,action:({args:e,client:t,emit:a})=>{a("LimbResetTextEvent",buildLimbPayload({args:e,client:t}))}}]}),normalizeTag=e=>String(e||"").trim().toLowerCase(),normalizeCommandSeparator=e=>String(e??"").trim(),toNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toOptionalBooleanFromYesNo=e=>{if(null==e||""===e)return;if("boolean"==typeof e)return e;if("number"==typeof e)return 0!==e;const t=String(e).trim().toLowerCase();return!!["yes","1","true","on"].includes(t)||!["no","0","false","off"].includes(t)&&void 0},boolWord=e=>e?"on":"off",nowMs=()=>Date.now(),G={classQueue:{name:"class",type:"c!p!t!w",pre:["touch soul","stand"],post:[],exclusions:[]},freeQueue:{name:"free",type:"free",pre:["touch soul","stand"],post:[],exclusions:["fullQueue","shieldQueue","bloodcloakQueue"]},fullQueue:{name:"full",type:"ebc!w!p!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","shieldQueue","bloodcloakQueue"]},shieldQueue:{name:"shield",type:"eb!w!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","fullQueue","bloodcloakQueue"]},shipQueue:{name:"ship",type:"s!w!t",pre:["touch soul","stand"],post:[],exclusions:[]},bloodcloakQueue:{name:"bloodcloak",type:"!teb",pre:["touch soul"],post:[],exclusions:["fullQueue","freeQueue","shieldQueue"]},battlerageQueue:{name:"battlerage",type:"!p!t!wu",pre:["touch soul"],post:[],exclusions:[]},stunQueue:{name:"stun",type:"!t",pre:["touch soul"],post:[],exclusions:[]}},escapeRegExp=e=>String(e).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),normalizeTriggerName=e=>String(e||"").replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,""),resolveSeparator=e=>normalizeCommandSeparator(e?.())||"|",splitCommands=(e,t)=>String(e||"").split(String(t||"|")||"|").map(e=>e.trim()).filter(Boolean),createQueueSentTrigger=([e,t],a)=>({name:`sent-${normalizeTriggerName(e)}`,regex:new RegExp(`^\\[System\\]: Added (?<commands>.+) to your ${escapeRegExp(t.type)} queue\\.$`),action:({args:n,client:s,emit:i})=>{const o=resolveSeparator(a),l=normalizeTextValue(n.groups?.commands);i("QueueSentTextEvent",{raw:normalizeTextValue(s?.current_line?.line),queueId:e,queueName:t.name,queueType:t.type,rawCommands:l,commands:splitCommands(l,o),separator:o,source:"text-trigger"})}}),createQueueTextTriggers=({getCommandSeparator:e}={})=>({group:"queue/text",triggers:Object.entries(G).map(t=>createQueueSentTrigger(t,e))}),createAffPrioritySnapshotTriggers=()=>({group:"serverside/affPrioritySnapshot",session:{name:"affPriorities",completionEvent:"ServersideAffPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"aff-priority-header",regex:/^Your affliction curing priorities(?::| for the priority set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideAffPrioSnapshotOpenTextEvent",{topic:"affPriorities",reason:"aff-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<prio>\d+):\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{const a=parseSpaceDelimitedEntries(e.groups.entries);return!!a.length&&(a.forEach(a=>{t("ServersideAffPrioTextEvent",{aff:a,prio:Number(e.groups.prio)})}),!0)}},{name:"close",closer:!0,closeReason:"aff-priority-terminal-line",regex:"Affs with priority 26 are ignored."}]}),createCuringSetSnapshotTriggers=()=>{let e=[],t="";const reset=()=>{e=[],t=""};return{group:"serverside/curingSetSnapshot",session:{name:"curingSets",completionEvent:"ServersideCuringSetSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"curingset-list-header",regex:"Your current curing sets",action:()=>{reset()}},{name:"set-line",regex:/^(?!-+$)(?<name>\S+)(?<current> \(current\))?$/,action:({args:a})=>{const n=String(a.groups?.name||"").trim();return!!n&&(e.push(n),a.groups?.current&&(t=n),!0)}},{name:"close",closer:!0,closeReason:"curingset-total-line",regex:/^You are using a total of (?<used>\d+) of your allowed (?<limit>\d+) curing sets\.$/,action:({args:a,emit:n})=>{n("ServersideCuringSetsTextEvent",{sets:[...e],activeSet:t,used:Number(a.groups.used),limit:Number(a.groups.limit)})}},{name:"empty",opener:!0,closer:!0,openReason:"curingset-empty-header",closeReason:"curingset-empty-line",regex:/^You have no sets defined/,action:({emit:e})=>{reset(),e("ServersideCuringSetsTextEvent",{sets:[],activeSet:"",used:0})}}]}},createCuringSetSwitchTriggers=()=>({group:"serverside/curingSetSwitch",triggers:[{name:"switched",regex:/^You will now cure using the (?<set>\S+) set\.$/,action:({args:e,emit:t})=>{t("ServersideCuringSetSwitchedTextEvent",{set:e.groups?.set||""})}}]}),createDefPrioritySnapshotTriggers=()=>({group:"serverside/defPrioritySnapshot",session:{name:"defPriorities",completionEvent:"ServersideDefPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"def-priority-header",regex:/^Your defence priorities(?::| for curing set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioSnapshotOpenTextEvent",{topic:"defPriorities",reason:"def-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<def>\w+)\s*: (?<prio>\d+)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio)})}}]}),createLivePriorityConfirmationTriggers=()=>({group:"serverside/livePriorityConfirmations",triggers:[{name:"aff-set",regex:/^You have set the '(?<aff>[^']+)' affliction to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideAffPrioTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}},{name:"def-set",regex:/^You have set the '(?<def>\w+)' defence to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}}]}),createLivePredictionConfirmationTriggers=()=>({group:"serverside/livePredictionConfirmations",triggers:[{name:"added",regex:/^You have added the (?<aff>\w+) affliction to your predicted afflictions list\.$/,action:({args:e,emit:t})=>{t("ServersidePredictionConfirmTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),status:"added",source:"live-confirmation"})}},{name:"already",regex:"You have already predicted that you have that affliction.",action:({emit:e})=>{e("ServersidePredictionConfirmTextEvent",{aff:"",status:"already",source:"live-confirmation"})}}]}),emitStatus$1=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},createLiveStatusConfirmationTriggers=()=>({group:"serverside/liveStatusConfirmations",triggers:[{name:"enabled",regex:/^Curing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"enabled",/^activated$/.test(e.groups.value))}},{name:"transmutation-on",regex:"You will now use transmutation cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!0)}},{name:"transmutation-off",regex:"You will now use concoction-based cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!1)}},{name:"sip-priority",regex:/^Curing will now prioritise (?<value>mana|health) over (?<other>mana|health)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-threshold",regex:/^(?<kind>Health|Mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"sipHealthAt":"sipManaAt",Number(e.groups.value))}},{name:"moss-threshold",regex:/^Moss (?<kind>health|mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"mossHealthAt":"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Automatic usage of focusing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focus",/^activated$/.test(e.groups.value))}},{name:"focus-over-herbs",regex:/^You will now prioritise (?<value>focus|herbs) over (?<other>focus|herbs)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focusOverHerbs",/^focus$/.test(e.groups.value))}},{name:"tree",regex:/^Automatic usage of the tree tattoo (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"tree",/^activated$/.test(e.groups.value)?"on":"off")}},{name:"clot-on",regex:"You will now attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!0)}},{name:"clot-off",regex:"You will no longer attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!1)}},{name:"clot-at",regex:/^Will clot above (?<value>\d+) bleeding\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAt",Number(e.groups.value))}},{name:"insomnia-on",regex:"You will now use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!0)}},{name:"insomnia-off",regex:"You will now not use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!1)}},{name:"fractures-above",regex:/^Will cure health based afflictions above (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^You will now use mana if above (?<value>\d+)% of your maximum mana reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"manaThreshold",Number(e.groups.value))}},{name:"batch-on",regex:"You will now attempt to cure multiple things at once.",action:({emit:e})=>{emitStatus$1(e,"batch",!0)}},{name:"batch-off",regex:"You will now cure one thing at a time.",action:({emit:e})=>{emitStatus$1(e,"batch",!1)}},{name:"clot-above",regex:/^You will now use corrupted clotting if above (?<value>\d+)% of your maximum health reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAbove",Number(e.groups.value))}}]}),createQueuePredictionTriggers=()=>({group:"serverside/queuePrediction",triggers:[{name:"queue-line",regex:/^CURING QUEUE(?:\s+LIST)?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersideQueueListTextEvent",{queue:parseDelimitedEntries(e.groups.entries)})}},{name:"predictions-line",regex:/^CURING PREDICTIONS?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersidePredictionsTextEvent",{predictions:parseDelimitedEntries(e.groups.entries).reduce((e,t)=>(e[t]=!0,e),{})})}}]}),emitStatus=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},isYes=e=>"Yes"===e,createStatusSnapshotTriggers=()=>({group:"serverside/statusSnapshot",session:{name:"status",completionEvent:"ServersideStatusSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"status-header",regex:"Curing Status:"},{name:"enabled",regex:/^Enabled:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"enabled",isYes(e.groups.value))}},{name:"reporting",regex:/^Reporting commands:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"reporting",isYes(e.groups.value))}},{name:"sipping",regex:/^Sipping:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipping",isYes(e.groups.value))}},{name:"afflictions",regex:/^Affliction Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"afflictions",isYes(e.groups.value))}},{name:"defences",regex:/^Defence Upkeep:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"defences",isYes(e.groups.value))}},{name:"transmutation",regex:/^Curing Method:\s+(?<value>\w+)$/,action:({args:e,emit:t})=>{emitStatus(t,"transmutation","transmutation"===String(e.groups.value||"").toLowerCase())}},{name:"fallback",regex:/^Fallback Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"fallback",isYes(e.groups.value))}},{name:"custom-aff-priority",regex:/^Custom Curing Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customAffPriority",isYes(e.groups.value))}},{name:"custom-def-priority",regex:/^Custom Defence Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customDefPriority",isYes(e.groups.value))}},{name:"sip-priority",regex:/^Health\/Mana Priority:\s+(?<value>Health|Mana)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-health-at",regex:/^Sip health at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipHealthAt",Number(e.groups.value))}},{name:"sip-mana-at",regex:/^Sip mana at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipManaAt",Number(e.groups.value))}},{name:"moss-health-at",regex:/^Eat moss below health:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossHealthAt",Number(e.groups.value))}},{name:"moss-mana-at",regex:/^Eat moss below mana:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Use focus:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focus",isYes(e.groups.value))}},{name:"focus-over-herbs",regex:/^Focus over herbs:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focusOverHerbs",isYes(e.groups.value))}},{name:"clot",regex:/^Use clot:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"clot",isYes(e.groups.value))}},{name:"tree",regex:/^Use tree:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"tree",isYes(e.groups.value)?"on":"off")}},{name:"clot-at",regex:/^Clot at:\s+(?<value>\d+) bleeding$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAt",Number(e.groups.value))}},{name:"insomnia",regex:/^Use insomnia:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"insomnia",isYes(e.groups.value))}},{name:"fractures-above",regex:/^Will cure fractures above:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^Will use mana above:\s+(?<value>\d+)% mana$/,action:({args:e,emit:t})=>{emitStatus(t,"manaThreshold",Number(e.groups.value))}},{name:"clot-health",regex:/^Will clot health until:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAbove",Number(e.groups.value))}},{name:"batch",regex:/^Batch actions:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"batch",isYes(e.groups.value))}},{name:"kaido-transmute",closer:!0,closeReason:"status-terminal-line",regex:/^Use Kaido Transmute:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"kaidoTransmute",isYes(e.groups.value))}}]}),H="transcendence",buildResourcePayload=({client:e,value:t})=>({key:H,value:t,min:0,max:100,source:"text-trigger",raw:normalizeTextValue(e?.current_line?.line)}),createCharacterResourceTriggers=()=>({group:"system/characterResource",triggers:[{name:"transcendence-progress",regex:/^Your body and mind continue to harmonise: you are (?<value>\d+) percent of the way to full transcendence\.$/,action:({args:e,client:t,emit:a})=>{a("CharacterResourceTextEvent",buildResourcePayload({client:t,value:Number(e.groups?.value)}))}},{name:"transcendence-achieved",regex:"You have achieved transcendence: your body and mind operate as one.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:100}))}},{name:"transcendence-harmony-lost",regex:"Your body and mind are no longer in harmony.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}},{name:"transcendence-fallen",regex:"Your body and mind fall out of their transcendent state.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}}]}),createSystemEventTriggers=()=>({group:"system/systemEvent",triggers:[{name:"line",regex:/^SystemEvent (?<eventName>.+)$/,action:({args:e,client:t,emit:a})=>{const n=normalizeTextValue(e.groups?.eventName);if(!n)return;const s=normalizeTextValue(t?.current_line?.line);a(n,{raw:s});const i=n.match(/^(?<queueName>[A-Za-z]+)QueueFired$/);i?.groups?.queueName&&a("QueueFiredTextEvent",{raw:s,queueName:i.groups.queueName})}},{name:"all-queues-cleared",regex:"[System]: All queued commands cleared.",action:({client:e,emit:t})=>{t("AllQueuesClearedTextEvent",{raw:normalizeTextValue(e?.current_line?.line)})}}]}),createSeparatorChangedTrigger=()=>({group:"system/separatorChanged",triggers:[{name:"separator-changed",regex:/^Your command separator is now:\s*(?<sep>\S+)\s*$/,action:({args:e,emit:t})=>{const a=String(e.groups?.sep||"").trim();a&&t("CommandSeparatorChangedTextEvent",{separator:a})}}]}),U=Object.freeze([Object.freeze({type:"icewall",pattern:/An icewall is here, blocking passage to the (?<direction>[a-z]+)\./g}),Object.freeze({type:"stonewall",pattern:/A large wall of stone stands here, blocking passage to the (?<direction>[a-z]+)\./g})]),V=/The ground is slick with ice\./,normalizeText=e=>String(e??"").replace(/\s+/g," ").trim(),readText=e=>"function"==typeof e?.parsed_line?.text?e.parsed_line.text():null,raw=e=>String(e?.line??""),readRoomDisplay=({block:e,room:t}={})=>{const a=normalizeRoomId(t?.id),n=normalizeText(t?.name);if(null===a||!n||!Array.isArray(e))return null;const s=[];if(e.forEach((e,t)=>{raw(e).includes("<RName")&&normalizeText(readText(e)).startsWith(n)&&s.push(t)}),!s.length)return null;const i=s.at(-1)+1;let o=i;for(;o<e.length&&!/<R(?:Exits|Name)\b/.test(raw(e[o]));)o+=1;const l=o<e.length&&raw(e[o]).includes("<RExits"),c=e.slice(i,o<e.length?o:i+1).map(readText),u=normalizeText(c.filter(e=>null!==e).join(" ")),d=normalizeText(t?.description),m=l&&1===s.length&&c.length>0&&c.every(e=>"string"==typeof e)&&Boolean(d)&&u.includes(d);return{roomId:a,complete:m,walls:U.flatMap(({type:e,pattern:t})=>[...u.matchAll(t)].map(t=>({type:e,direction:t.groups.direction}))),frozenGround:!!V.test(u)||!m&&null}},createRoomDisplayTriggers=({getGMCP:e=()=>null}={})=>({group:"room/display",session:{name:"roomDisplay",openEvents:[{event:"GmcpEvent",when:e=>"Room.Info"===e?.tag,reason:"room-info"}],fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"}]},triggers:[{name:"scan",closer:!0,regex:/^/,action:({client:t,emit:a,pushTrace:n})=>{const s=e()?.Room?.Info,i=readRoomDisplay({block:t?.current_block,room:{id:s?.num??null,name:String(s?.name??""),description:String(s?.desc??"")}});if(!i)return!1;for(const e of i.walls)normalizeRoomDirection(e.direction)||n("room:invalid-direction",e);a("RoomDisplayTextEvent",i)}}]}),Y=[createSystemEventTriggers,createSeparatorChangedTrigger,createCharacterResourceTriggers,createRoomDisplayTriggers,createRoomObserverTriggers,createBalanceTextTriggers,createCacheTextTriggers,createAvoidPostureTriggers,createLimbTextTriggers,createQueueTextTriggers,createStatusSnapshotTriggers,createAffPrioritySnapshotTriggers,createDefPrioritySnapshotTriggers,createCuringSetSnapshotTriggers,createCuringSetSwitchTriggers,createLiveStatusConfirmationTriggers,createLivePriorityConfirmationTriggers,createLivePredictionConfirmationTriggers,createQueuePredictionTriggers],createTriggerCatalog=(e={})=>Y.map(t=>t(e)),registerTextTriggers=({triggerApi:e,client:t,getCommandSeparator:a,getGMCP:n,roomObserverCatalog:s,emit:i,onLocalEvent:o,pushTrace:l,triggerIds:c,registerCleanup:u,registerTriggerGroupActivity:d,triggerSessions:m})=>{if(!e?.triggers?.add)return void l("register:nexAction:skipped",{reason:"trigger-api-unavailable"});const p="function"==typeof e.triggers.enable&&"function"==typeof e.triggers.disable,sessionToggleTag=e=>`session:${e}`,setSessionTriggers=(t,a)=>{if(!p)return;const n=sessionToggleTag(t);a?e.triggers.enable([n]):e.triggers.disable([n]),l(a?"session:enable":"session:disable",{session:t,tag:n})},resetSession=(e,t={})=>{const a=m[e];return!!a&&(a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"reset"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),l("session:reset",{session:e,...t}),!0)},beginSession=(e,t={})=>{const a=m[e];return!!a&&(setSessionTriggers(e,!0),a.active?(l("session:reopen",{session:e,...t}),!1):(a.active=!0,a.hasLines=!1,a.lastReason=String(t.reason||t.source||"begin"),a.lastOpenedAt=Date.now(),l("session:begin",{session:e,...t}),!0))},markSessionHasData=e=>{const t=m[e];t?.active&&!t.hasLines&&(t.hasLines=!0)},completeSession=(e,t={})=>{const a=m[e];if(!a?.active)return!1;const n=a.hasLines;return a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"complete"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),l("session:complete",{session:e,reason:a.lastReason,hadLines:n,completionEvent:t.completionEvent||""}),t.completionEvent&&i(t.completionEvent,{topic:e,reason:a.lastReason}),!0},registerTextTrigger=({id:a,group:n,regex:s,action:o,enabled:u=!0,tags:m=[],once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:k,onEnable:C})=>{e.triggers.add({id:a,regex:s,enabled:u,tags:m,once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:k,onEnable:C,action:e=>o({args:e,client:t,emit:i,pushTrace:l})}),c.push(a),d(n,"triggerCount"),l("register:nexAction",{id:a,group:n,enabled:u,regex:s instanceof RegExp?s.source:String(s)})};createTriggerCatalog({getCommandSeparator:a,getGMCP:n,roomObserverCatalog:s}).forEach(e=>{const t=e.session;t&&"function"==typeof o&&((t.openEvents||[]).forEach(({event:a,when:n,reason:s})=>{u(o(a,e=>{try{if(n&&!n(e))return}catch(i){throw l("session:open-error",{session:t.name,event:a,error:i}),i}beginSession(t.name,{reason:s,event:a})})),d(e.group,"hookCount")}),(t.resetEvents||[]).forEach(({event:a,reason:n})=>{u(o(a,()=>resetSession(t.name,{reason:n,event:a}))),d(e.group,"hookCount")}),(t.fallbackCloseEvents||[]).forEach(({event:a,reason:n})=>{u(o(a,()=>completeSession(t.name,{reason:n,completionEvent:t.completionEvent}))),d(e.group,"hookCount")})),e.triggers.forEach(a=>{const n=t?.name,s=Boolean(n&&!0===a.opener),i=Boolean(n&&!0===a.closer),o=["nexsys4","adapter","text",`group:${e.group}`],l=Boolean(n)&&!s,c=l?[sessionToggleTag(n)]:[],u=(!l||!p)&&(a.enabled??!0);registerTextTrigger({id:`nexsys4-${e.group.replace(/[\\/]+/g,"-")}-${a.name}`,group:e.group,regex:a.regex,enabled:u,tags:[...o,...c,...a.tags||[]],once:a.once,duration:a.duration,fg:a.fg,bg:a.bg,lines:a.lines,prompt:a.prompt,finalAction:a.finalAction,onRemove:a.onRemove,onDisable:a.onDisable,onEnable:a.onEnable,action:o=>{if(s)beginSession(n,{group:e.group,trigger:a.name,reason:a.openReason||"open"});else if(n&&!m[n]?.active)return;const l="function"==typeof a.action?a.action(o):void 0;return!n||s||i||!1===l||markSessionHasData(n),i&&completeSession(n,{reason:a.closeReason||"close",completionEvent:t.completionEvent}),l}})})})},Q="",W="#c1bfff",K="#cf6dfc",X="#FFF2D7",J=`<span style="color:${W}">[-</span><span style="color:${K}">nexSys</span><span style="color:${W}">-] </span>`,Z=Object.freeze({fg:X,bg:Q}),ee=Object.freeze({default:Object.freeze({default:Object.freeze({message:Z})}),affGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +aff ",fg:"orange",bg:Q}),message:Object.freeze({fg:"green",bg:Q})})}),affLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -aff ",fg:"orange",bg:Q}),message:Object.freeze({fg:"red",bg:Q})})}),defGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +def ",fg:"purple",bg:Q}),message:Object.freeze({fg:"green",bg:Q})})}),defLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -def ",fg:"purple",bg:Q}),message:Object.freeze({fg:"red",bg:Q})})}),balanceRecovered:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" onBal ",fg:"brown",bg:Q}),message:Object.freeze({fg:"green",bg:Q})})}),balanceLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" offBal ",fg:"brown",bg:Q}),message:Object.freeze({fg:"red",bg:Q})})}),trackableGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" + ",fg:"white",bg:Q}),message:Object.freeze({fg:"green",bg:Q})})}),trackableLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" - ",fg:"white",bg:Q}),message:Object.freeze({fg:"red",bg:Q})})}),priority:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:"priority change: ",fg:"yellow",bg:Q}),message:Object.freeze({fg:"red",bg:Q})})}),output:Object.freeze({default:Object.freeze({message:Object.freeze({fg:"red",bg:Q})})})}),escapeHtml$1=e=>String(e||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),normalizeNoticeToken=(e,t="")=>String(e||t).trim().toLowerCase(),resolveNoticeStyle=(e={})=>{const t=String(e.category||"default").trim(),a=normalizeNoticeToken(e.action,"default"),n=ee[t]||ee.default;return n[a]||n.default||ee.default.default},normalizeNoticePart=(e,t=Z)=>"string"==typeof e?{text:e,fg:t.fg,bg:t.bg}:{text:String(e?.text||""),fg:String(e?.fg??t.fg??Z.fg),bg:String(e?.bg??t.bg??Z.bg)},buildNoticeParts=(e,t={})=>{const a=resolveNoticeStyle(t),n=a.message||Z;if(Array.isArray(t.parts)&&t.parts.length)return t.parts.map(e=>normalizeNoticePart(e,n)).filter(e=>e.text);if(t.title)return[normalizeNoticePart({text:String(t.title),fg:t.titleFg??n.fg,bg:t.titleBg??n.bg},n),normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)].filter(e=>e.text);const s=[];return a.prefix?.text&&s.push(normalizeNoticePart(a.prefix,n)),s.push(normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)),s.filter(e=>e.text)},renderSpanStyle=e=>["white-space:pre-wrap",e.fg?`color:${escapeHtml$1(e.fg)}`:"",e.bg?`background-color:${escapeHtml$1(e.bg)}`:""].filter(Boolean).join(";"),renderNoticeHtml=(e,t={},a=[])=>`<span class="nexsys4-notice" style="white-space:pre-wrap;">${J}${t.html?String(t.html):(a.length?a:buildNoticeParts(e,t)).map(e=>`<span style="${renderSpanStyle(e)}">${escapeHtml$1(e.text)}</span>`).join("")}</span>`,createNoticeTransport=({client:e,emit:t,pushTrace:a})=>({notice(n,s={}){const i=String(n),o=buildNoticeParts(i,s);e.add_html_line(renderNoticeHtml(i,s,o)),a("notice",{message:i,context:s,parts:o}),t("NoticeEvent",{message:i,context:s,parts:o})}}),createTriggerSessionState=()=>({active:!1,hasLines:!1,lastReason:"idle",lastOpenedAt:0,lastClosedAt:0}),createAdapterDebugState=({debug:e=!1,traceLimit:t=200,now:a=()=>Date.now(),logLabel:n="nexSys4.adapter"}={})=>{let s=Boolean(e);const i=Math.max(1,Number(t||200)),o=[],l=new Map,c={roomDisplay:createTriggerSessionState(),status:createTriggerSessionState(),affPriorities:createTriggerSessionState(),defPriorities:createTriggerSessionState(),curingSets:createTriggerSessionState()},pushTrace=(e,t={})=>{if(!s)return null;const l={at:a(),type:e,detail:t};return o.push(l),o.length>i&&o.splice(0,o.length-i),console.log(`[${n}] ${e}`,t),l};return{pushTrace,triggerSessions:c,registerTriggerGroupActivity:(e,t="triggerCount")=>{const a=String(e||"").trim();if(!a)return null;const n=l.get(a)||{name:a,triggerCount:0,hookCount:0};return n[t]=Number(n[t]||0)+1,l.set(a,n),n},setDebugEnabled(e){s=Boolean(e),pushTrace("debug",{enabled:s})},isDebugEnabled:()=>s,snapshotTriggerGroups:()=>[...l.values()].map(e=>({...e})).sort((e,t)=>e.name.localeCompare(t.name)),snapshotTriggerSessions:()=>Object.entries(c).reduce((e,[t,a])=>(e[t]={...a},e),{}),snapshotRecentTrace:()=>[...o]}},createAdapterEventHub=({pushTrace:e=()=>{},errorLabel:t="nexSys4 adapter listener failed"}={})=>{const a=new Map,normalizeEventName=e=>String(e||"").trim(),on=(t,n)=>{const s=normalizeEventName(t);if(!s||"function"!=typeof n)return()=>{};let i=a.get(s);return i||(i=new Set,a.set(s,i)),i.add(n),e("on",{event:s,listenerCount:i.size}),()=>off(s,n)},off=(t,n)=>{const s=normalizeEventName(t),i=a.get(s);if(!s||!i)return!1;const o=i.delete(n);return i.size||a.delete(s),e("off",{event:s,removed:o,listenerCount:i.size}),o};return{emit:(n,s)=>{const i=normalizeEventName(n),o=a.get(i);if(!i||!o?.size)return i&&e("emit",{event:i,listenerCount:0,payload:s}),0;const l=[...o];return e("emit",{event:i,listenerCount:l.length,payload:s}),l.forEach(e=>{if(a.get(i)?.has(e))try{e(s)}catch(n){console.error(t,{event:i,error:n})}}),l.length},on,off,clear(){a.clear()}}},createAdapterLifecycle=({eventBus:e,triggerApi:t,pushTrace:a=()=>{},clearListeners:n=()=>{}}={})=>{const s=[],i=[],o=[],destroy=()=>{const l=o.length,c=s.length,u=[...i];o.splice(0).forEach(e=>{try{e()}catch(t){console.error("nexSys4 adapter cleanup failed",{error:t})}}),e?.removeListener&&s.forEach(({eventName:t,id:a})=>{e.removeListener(t,a)}),t?.triggers?.remove&&i.forEach(e=>t.triggers.remove(e)),a("destroy",{eventRegistrations:c,triggerIds:u,internalCleanupCount:l}),n()};return{eventRegistrations:s,triggerIds:i,registerCleanup:e=>"function"==typeof e?(o.push(e),e):()=>{},destroy}},summarizePromptContext=(e={})=>({source:e.source||"",hasLine:Boolean(e.line)}),createAdapterPromptSink=({emit:e,pushTrace:t})=>{const renderPrompt=(a,n={})=>{const s=String(a??""),i=n?.line;return i?.parsed_line&&"object"==typeof i.parsed_line&&(i.parsed_line.formatted=()=>s),e("PromptRendered",{prompt:s,context:n}),t("renderPrompt",{promptLength:s.length,context:summarizePromptContext(n)}),s};return{renderPrompt}},normalizeOutboundCommands=e=>Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[],normalizeGmcpRequests=e=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],shouldPreventExpansion=e=>"boolean"==typeof e?e:Boolean(e?.preventExpansion),createAdapterTransport=({client:e,emit:t,pushTrace:a,resolveSeparator:n}={})=>({send(s=[],i={}){const o=normalizeOutboundCommands(s);if(!o.length)return[];const l=o.join(n()||"|");return e?.send_commands&&e.send_commands(l,shouldPreventExpansion(i)),a("send",{commands:o,payload:l,context:i}),t("OutboundCommandsEvent",{commands:o,payload:l,context:i}),o},sendGmcp(n=[],s={}){const i="function"==typeof e?.datahandler?e.datahandler():null;if("function"!=typeof i?.send_GMCP)return[];const o=normalizeGmcpRequests(n);if(!o.length)return[];const l=[];return o.forEach(e=>{try{i.send_GMCP(e),l.push(e)}catch(t){console.error("nexSys4 GMCP request failed",{request:e,error:t})}}),l.length&&(a("sendGmcp",{requests:l,context:s}),t("AdapterGmcpRequest",{requests:l,context:s})),l},getVariable(t){if(!e?.variables)return;const a=e.variables();return"function"==typeof a?.get?a.get(t):a?.vars?.[t]},setVariable(t,a){if(!e?.variables)return a;const n=e.variables();return"function"==typeof n?.set?(n.set(t,a),a):n?.vars?(n.vars[t]=a,a):a}}),createNexusAdapter=(e={})=>{const t=e.nexusclient||globalThis.nexusclient,monotonicNowMs=()=>globalThis.performance?.now?globalThis.performance.now():Date.now();let a=null;const resolveSeparator=()=>a||"",n=e.eventStream||globalThis.eventStream,s=e.nexAction||globalThis.nexAction,getGMCP=()=>e.GMCP||globalThis.GMCP,getNexSkills=()=>e.nexSkills||globalThis.nexSkills,{pushTrace:i,triggerSessions:o,registerTriggerGroupActivity:l,setDebugEnabled:c,isDebugEnabled:u,snapshotTriggerGroups:d,snapshotTriggerSessions:m,snapshotRecentTrace:p}=createAdapterDebugState({debug:e.debug,traceLimit:e.traceLimit}),{emit:g,on:h,off:b,clear:y}=createAdapterEventHub({pushTrace:i}),{eventRegistrations:v,triggerIds:S,registerCleanup:x,destroy:k}=createAdapterLifecycle({eventBus:n,triggerApi:s,pushTrace:i,clearListeners:y}),{send:C,sendGmcp:A,getVariable:E,setVariable:w}=createAdapterTransport({client:t,emit:g,pushTrace:i,resolveSeparator}),normalizeEventName=e=>String(e||"").trim(),{notice:_}=createNoticeTransport({client:t,emit:g,pushTrace:i}),{renderPrompt:T}=createAdapterPromptSink({emit:g,pushTrace:i}),emitLocal=(e,t)=>{const a=normalizeEventName(e);return!!a&&(g(a,t),i("emit:local",{event:a,payload:t}),!0)},raiseToEventStream=(e,t)=>{const a=normalizeEventName(e);return!(!a||!n?.raiseEvent)&&(n.raiseEvent(a,t),i("emit:eventstream",{topic:a,payload:t}),!0)};s?.triggers?.remove&&s.triggers.remove(["nexsys4"]),n?.removeByTag&&n.removeByTag(["nexsys4"]),registerEventStreamBindings({eventBus:n,emit:g,pushTrace:i,eventRegistrations:v}),registerSkillEventBindings({eventBus:n,emit:g,pushTrace:i,eventRegistrations:v,getNexSkills,triggerApi:s,roomObserverCatalog:e.roomObserverCatalog}),registerTextTriggers({triggerApi:s,client:t,getCommandSeparator:resolveSeparator,getGMCP,roomObserverCatalog:e.roomObserverCatalog,emit:g,onLocalEvent:h,pushTrace:i,triggerIds:S,registerCleanup:x,registerTriggerGroupActivity:l,triggerSessions:o}),!1!==e.startupGag&®isterStartupGag({onLocalEvent:h,client:t,notice:_,isDebugEnabled:u});const addOnceTrigger=({id:e,regex:a,action:n})=>s?.triggers?.add?(s.triggers.add({id:e,regex:a,enabled:!0,once:!0,tags:["nexsys4","probe",`probe:${e}`],action:e=>n({args:e,client:t,emit:g,pushTrace:i})}),S.push(e),i("probe-trigger:add",{id:e,regex:a instanceof RegExp?a.source:String(a)}),()=>{s?.triggers?.remove&&s.triggers.remove(e),i("probe-trigger:remove",{id:e})}):()=>{};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send:C,sendGmcp:A,on:h,off:b,notice:_,getCommandSeparator:()=>resolveSeparator(),setSeparator(e){a=normalizeCommandSeparator(e)||null},addOnceTrigger,now:monotonicNowMs,setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),renderPrompt:T,getVariable:E,setVariable:w,emitLocal,raiseToEventStream,destroy:k,getGMCP,setDebugEnabled:c,isDebugEnabled:u,debugInfo:()=>({debugEnabled:u(),startupGagEnabled:!1!==e.startupGag,separator:resolveSeparator(),eventRegistrations:v.map(e=>({...e})),triggerIds:[...S],triggerGroups:d(),triggerSessions:m(),hasEventStream:Boolean(n?.registerEvent),hasNexActionTriggers:Boolean(s?.triggers?.add),recentTrace:p()})}},createMockAdapter=(e={})=>{const t=new Map,a=new Map,n=new Map;let s=normalizeCommandSeparator(e.separator??"|");const i=[],o=[],l=[],c=[],u=[],d=[];let m=Boolean(e.debug);const p=Math.max(1,Number(e.traceLimit||200)),g=[],pushTrace=(e,t={})=>{const a={at:nowMs(),type:e,detail:t};g.push(a),g.length>p&&g.splice(0,g.length-p),m&&console.log(`[nexSys4.mockAdapter] ${e}`,t)},normalizeEventName=e=>String(e||"").trim(),emit=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s?.size)return n&&pushTrace("emit",{event:n,listenerCount:0,payload:a}),0;const i=[...s];return pushTrace("emit",{event:n,listenerCount:i.length,payload:a}),i.forEach(e=>{if(t.get(n)?.has(e))try{e(a)}catch(s){console.error("nexSys4 mock adapter listener failed",{event:n,error:s})}}),i.length},on=(e,a)=>{const n=normalizeEventName(e);if(!n||"function"!=typeof a)return()=>{};let s=t.get(n);return s||(s=new Set,t.set(n,s)),s.add(a),pushTrace("on",{event:n,listenerCount:s.size}),()=>off(n,a)},off=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s)return!1;const i=s.delete(a);return s.size||t.delete(n),pushTrace("off",{event:n,removed:i,listenerCount:s.size}),i},removeOnceTrigger=e=>{const t=String(e||"").trim();if(!t)return!1;const a=n.delete(t);return pushTrace("probe-trigger:remove",{id:t,removed:a}),a},addOnceTrigger=({id:e,regex:t,action:a}={})=>{const s=String(e||"").trim();return s&&t instanceof RegExp&&"function"==typeof a?(n.set(s,{regex:t,action:a}),pushTrace("probe-trigger:add",{id:s,regex:t.source}),()=>removeOnceTrigger(s)):()=>{}},fireText=(e,t={})=>{const a=String(e??"");pushTrace("fireText",{text:a,detail:t,triggerCount:n.size});const s=[];return[...n.entries()].forEach(([e,i])=>{i.regex.lastIndex=0;const o=i.regex.exec(a);o&&(n.delete(e),s.push(e),i.action({args:{raw:a,line:a,text:a,groups:o.groups||{},matches:[...o]},detail:t}))}),s};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send(e=[],t={}){const a=Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[];return a.length?(i.push({commands:a,context:t}),pushTrace("send",{commands:a,context:t}),emit("OutboundCommandsEvent",{commands:a,context:t}),a):[]},sendGmcp(e=[],t={}){const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)];return a.length?(u.push(...a),pushTrace("sendGmcp",{requests:a,context:t}),emit("AdapterGmcpRequest",{requests:a,context:t}),a):[]},on,off,emit,notice(e,t={}){o.push({message:String(e),context:t}),pushTrace("notice",{message:String(e),context:t})},getCommandSeparator:()=>s,setSeparator:e=>(s=normalizeCommandSeparator(e),pushTrace("setSeparator",{separator:s}),s),addOnceTrigger,fireText,now:()=>"function"==typeof e.now?e.now():nowMs(),setTimeout:(e,t)=>setTimeout(e,t),clearTimeout(e){clearTimeout(e)},renderPrompt(e,t={}){const a=String(e??""),n={prompt:a,context:t};return d.push(n),pushTrace("renderPrompt",{promptLength:a.length,source:t.source||"",hasLine:Boolean(t.line)}),emit("PromptRendered",n),a},getVariable:e=>a.get(e),setVariable:(e,t)=>(a.set(e,t),t),emitLocal(e,t){const a=String(e||"").trim();if(!a)return!1;const n={event:a,payload:t};return l.push(n),pushTrace("emit:local",n),emit(a,t),!0},raiseToEventStream(e,t){const a=String(e||"").trim();if(!a)return!1;const n={topic:a,payload:t};return c.push(n),pushTrace("emit:eventstream",n),!0},destroy(){t.clear(),n.clear()},getSentBatches:()=>i,getNotices:()=>o,getLocalEvents:()=>l,getEventStreamEvents:()=>c,getGmcpRequests:()=>u,getRenderedPrompts:()=>d,getGMCP:()=>e.gmcp||{},setDebugEnabled(e){m=Boolean(e),pushTrace("debug",{enabled:m})},isDebugEnabled:()=>m,debugInfo:()=>({debugEnabled:m,separator:s,recentTrace:[...g],sentBatchCount:i.length,gmcpRequests:[...u],renderedPromptCount:d.length})}},defineStringPrototypeHelper=(e,t)=>"function"!=typeof String.prototype[e]&&(Object.defineProperty(String.prototype,e,{configurable:!0,writable:!0,value:t}),!0),installStringPrototypeHelpers=()=>({toProperCase:defineStringPrototypeHelper("toProperCase",function toProperCase(){return this.replace(/\w\S*/g,function formatWord(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}),capitalize:defineStringPrototypeHelper("capitalize",function capitalize(){return this.charAt(0).toUpperCase()+this.slice(1)})}),te={list:["accentato","addiction","aeon","agoraphobia","airfisted","amnesia","anorexia","asphyxiating","asthma","betrayal","blackout","blindness","blistered","bloodfire","bound","breathless","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","bruisedribs","burning","cadmuscurse","calcifiedskull","calcifiedtorso","claustrophobia","clumsiness","coldfate","concussion","condemned","conflagration","confusion","constricted","convergence","corruption","crackedribs","cremated","crescendo","crushedthroat","daeggerimpale","damagedhead","damagedleftarm","damagedleftleg","damagedrightarm","damagedrightleg","darkshade","dazed","dazzled","deadening","deafness","death","deathsickness","deepsleep","degenerate","dehydrated","dementia","demonstain","depression","deteriorate","diminished","disloyalty","disrupted","dissonance","dizziness","earworm","empoweredmannaz","empoweredloshre","enlightenment","enmesh","ensorcelled","entangled","epilepsy","fear","flamefisted","flushings","fratricide","frostbite","frozen","fulminated","generosity","grievouswounds","guilt","hamstrung","haemophilia","hallucinations","hatred","healthleech","heartseed","hecatecurse","hellsight","hindered","homunculusmercury","horror","hypersomnia","hypochondria","hypothermia","icebound","icefisted","impaled","impatience","indifference","inquisition","insomnia","internalbleeding","isolation","itching","justice","kaisurge","kkractlebrand","laceratedthroat","lapsingconsciousness","latched","lethargy","lightbind","loneliness","lovers","lovestruck","lullaby","manaleech","masochism","mildtrauma","mangledleftarm","mangledleftleg","mangledrightarm","mangledrightleg","mangledhead","mindclamp","mindravaged","muddled","mycalium","nausea","numbedleftarm","numbedrightarm","pacified","palpatarfeed","paralysis","paranoia","parasite","peace","penitence","petrified","phlogisticated","pinshot","pressure","prone","pyramides","pyre","rebbies","recklessness","reeling","retribution","revealed","sandfever","scalded","scrambledbrains","scytherus","selarnia","sensitivity","serioustrauma","shadowmadness","shivering","shyness","silenced","silver","skullfractures","slashedthroat","sleeping","slickness","slimeobscure","snared","solarburn","speechless","spiritburn","stridulating","stun","stupidity","stuttering","succumbed","temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine","tenderskin","tension","timeflux","timeloop","tonguetied","torntendons","transfixation","trueblind","unweavingbody","unweavingmind","unweavingspirit","vertigo","vinewreathed","vitiated","vitrified","voidfisted","voyria","waterbonds","weakenedmind","weariness","webbed","woeconstrained","whisperingmadness","wristfractures","unconsciousness","harmonic","bop","spiritwrack","bedevil","loki","moon","evileye","dragoncurse","swiftcurse"],prios:{aeon:4,concussion:4,crushedthroat:4,paralysis:4,peace:4,sleeping:5,grievouswounds:5,latched:5,dazzled:5,unweavingbody:5,unweavingmind:5,unweavingspirit:5,weariness:5,prone:5,timeloop:5,fulminated:5,spiritburn:6,heartseed:6,guilt:6,tenderskin:6,pyramides:6,parasite:6,hypochondria:6,pacified:6,depression:6,confusion:6,mindravaged:6,retribution:6,shadowmadness:6,whisperingmadness:6,hellsight:6,anorexia:7,scalded:7,mycalium:7,frostbite:7,flushings:7,rebbies:7,sandfever:7,asthma:7,healthleech:7,impatience:8,itching:8,fratricide:8,scytherus:8,clumsiness:8,kkractlebrand:8,damagedleftleg:8,darkshade:8,slickness:8,recklessness:8,dementia:8,icebound:8,bound:9,daeggerimpale:9,entangled:9,sensitivity:9,transfixation:9,webbed:9,tonguetied:9,haemophilia:9,lethargy:9,manaleech:9,dissonance:9,pyre:9,skullfractures:10,damagedrightleg:10,hypersomnia:10,earworm:10,crescendo:10,diminished:10,torntendons:11,brokenleftleg:11,brokenrightleg:11,hallucinations:11,calcifiedskull:12,calcifiedtorso:12,mangledleftleg:12,mangledrightleg:12,disrupted:12,mangledhead:12,voyria:12,crackedribs:12,hypothermia:13,impaled:13,brokenleftarm:13,brokenrightarm:13,indifference:13,addiction:13,nausea:13,deadening:13,frozen:13,shivering:13,mildtrauma:13,internalbleeding:13,stupidity:14,wristfractures:14,damagedleftarm:14,disloyalty:14,tension:15,damagedhead:15,dazed:15,burning:15,lovers:16,pressure:16,damagedrightarm:16,temperedcholeric:16,temperedmelancholic:16,temperedphlegmatic:16,temperedsanguine:16,mangledleftarm:17,mangledrightarm:17,agoraphobia:18,claustrophobia:18,generosity:18,justice:18,loneliness:18,vertigo:18,paranoia:19,serioustrauma:20,epilepsy:20,laceratedthroat:22,slashedthroat:22,stuttering:22,selarnia:23,fear:23,masochism:23,dizziness:25,shyness:25,stridulating:25,horror:26,bleeding:30,amnesia:30,blackout:30,insomnia:30,deafness:30,blindness:30,harmonic:100,bop:100,spiritwrack:100,bedevil:100,loki:100,moon:100,evileye:100,dragoncurse:100,swiftcurse:100},types:{countable:{pressure:{min:0,max:5},crescendo:{min:0,max:5},unweavingbody:{min:0,max:5},unweavingspirit:{min:0,max:5},unweavingmind:{min:0,max:5},burning:{min:0,max:5},horror:{min:0,max:5},pyre:{min:0,max:3},temperedcholeric:{min:0,max:8},temperedmelancholic:{min:0,max:8},temperedphlegmatic:{min:0,max:8},temperedsanguine:{min:0,max:8},torntendons:{min:0,max:6},crackedribs:{min:0,max:6},skullfractures:{min:0,max:6},wristfractures:{min:0,max:6}},nonServerside:{accentato:0,airfisted:0,asphyxiating:0,blistered:0,bloodfire:0,bruisedribs:0,cadmuscurse:0,coldfate:0,condemned:0,conflagration:0,constricted:0,convergence:0,corruption:0,cremated:0,death:0,deathsickness:0,deepsleep:0,degenerate:0,dehydrated:0,demonstain:0,deteriorate:0,empoweredloshre:0,empoweredmannaz:0,enlightenment:0,enmesh:0,ensorcelled:0,flamefisted:0,hamstrung:0,hatred:0,hecatecurse:0,hindered:0,homunculusmercury:0,icefisted:0,inquisition:0,isolation:0,kaisurge:0,lightbind:0,lullaby:0,mindclamp:0,muddled:0,numbedleftarm:0,numbedrightarm:0,palpatarfeed:0,petrified:0,phlogisticated:0,pinshot:0,revealed:0,scrambledbrains:0,silenced:0,silver:0,slimeobscure:0,solarburn:0,stun:0,timeflux:0,trueblind:0,vinewreathed:0,vitiated:0,vitrified:0,voidfisted:0,waterbonds:0,weakenedmind:0,unconsciousness:0},timed:{accentato:{length:20},aeon:{length:25},airfisted:{length:16},betrayal:{length:15},blackout:{length:20},blistered:{length:20},breathless:{length:3},bruisedribs:{length:30},cadmuscurse:{length:20},condemned:{length:20},constricted:{length:30},corruption:{length:45},dazzled:{length:60},dehydrated:{length:60},demonstain:{length:120},empoweredloshre:{length:12},empoweredmannaz:{length:20},enmesh:{length:5},ensorcelled:{length:20},flamefisted:{length:30},hamstrung:{length:9},heartseed:{length:11},hecatecurse:{length:16},icefisted:{length:30},inquisition:{length:30},lightbind:{length:22},lovestruck:{length:5},muddled:{length:12},numbedleftarm:{length:7.5},numbedrightarm:{length:7.5},palpatarfeed:{length:20},phlogisticated:{length:45},pinshot:{length:18},reeling:{length:20},revealed:{length:60},scalded:{length:20},scrambledbrains:{length:60},silver:{length:180},slimeobscure:{length:60},solarburn:{length:5},snared:{length:20},speechless:{length:300},stridulating:{length:15},stun:{length:3},succumbed:{length:30},timeflux:{length:60},trueblind:{length:6},unconsciousness:{length:10},vinewreathed:{length:30},vitrified:{length:45},voidfisted:{length:5},waterbonds:{length:30},weakenedmind:{length:60},woeconstrained:{length:30}},unknown:{moon:["stupidity","confusion","epilepsy","masochism","hypersomnia","hallucinations"],loki:["stupidity","clumsiness","recklessness","asthma","shyness","darkshade","paralysis","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","sensitivity","disloyalty","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","selarnia","slickness","scytherus"],evileye:["confusion","dizziness"],dragoncurse:["recklessness","clumsiness","epilepsy","dizziness","pacified","nausea","addiction","anorexia","generosity","disloyalty","sensitivity","vertigo","paranoia","stupidity","hypochondria","lethargy","shivering","frozen","impatience","paralysis","asthma","agoraphobia"],harmonic:["stupidity","recklessness"],bop:["stupidity","recklessness"],swiftcurse:["stupidity","clumsiness","recklessness","asthma","paralysis","deafness","sensitivity","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","impatience","claustrophobia","vertigo","agoraphobia","masochism","epilepsy","manaleech","pacified","dementia","healthleech"],bedevil:["stupidity","recklessness"]},uncurable:{bloodfire:!0,cadmuscurse:!0,conflagration:!0,death:!0,deathsickness:!0,deepsleep:!0,enlightenment:!0,isolation:!0,lullaby:!0,mindclamp:!0,palpatarfeed:!0,penitence:!0,scalded:!0,stun:!0,weakenedmind:!0}}},buildAffIndex=e=>{const t=new Set(e.list),a={};for(const[n,s]of Object.entries(e.prios))a[s]||(a[s]=[]),a[s].push(n);return Object.freeze({affSet:t,prioArrays:Object.freeze(a)})},re=(buildAffIndex(te),{herb:{length:1.6,aff_modifiers:{homunculusmercury:{multiplier:1,offset:.5}}},focus:{length:2.5,aff_modifiers:{weakenedmind:{multiplier:2,offset:.5},whisperingmadness:{multiplier:1.6,offset:0}}},sip:{length:4.5,aff_modifiers:{skullfractures:{multiplier:1,offset:1}}},moss:{length:6},tree:{length:15,aff_modifiers:{slimeobscure:{multiplier:1,offset:10}}},equilibrium:{length:20,aff_modifiers:{confusion:{multiplier:1.5,offset:0}}},balance:{length:20,aff_modifiers:{lethargy:{multiplier:1.25,offset:0}}},salve:{length:4,aff_modifiers:{timeflux:{multiplier:1.5,offset:0}}},immunity:{length:10},rebounding:{length:9},smoke:{length:1.5},dragonbreath:{length:1.5},deafness:{length:3},deaf:{length:6},blind:{length:6},speed:{length:6},wake:{length:20},sileris:{length:8},avoid:{length:30},free:{length:0},voice:{length:2.5},tremolo:{length:6},homunculus:{length:12},fitness:{length:10},bloodboil:{length:10},dragonheal:{length:20},rage:{length:10},salt:{length:10},shrugging:{length:10},alleviate:{length:10},slough:{length:10},fool:{length:40},writhe:{length:6},impalewrithe:{length:4},entity:{length:2.3},feed:{length:70},word:{length:5},anathema:{length:5},systemOutput:{length:1}}),ae=["itching","paralysis","fear","brokenrightarm","brokenleftarm","brokenrightleg","brokenleftleg","lapsingconsciousness","aeon","lovers","confusion","epilepsy","pacified","blackout","dazed","justice","slashedthroat","hellsight","peace","dazzled","shyness","dizziness","slickness","asthma","nausea","selarnia","weariness","scytherus","fratricide","haemophilia","clumsiness","hallucinations","healthleech","dementia","recklessness","anorexia","masochism","impatience","stupidity","generosity","addiction","deadening","manaleech","stuttering","paranoia","agoraphobia","loneliness","claustrophobia","vertigo","hypersomnia","shivering","frozen","burning","sensitivity","hypochondria","lethargy","disloyalty","darkshade","voyria","dissonance","phlogisticated","silver","spiritburn","tenderskin","guilt","skullfractures","wristfractures","crackedribs","torntendons","indifference","retribution","shadowmadness","parasite","depression","timeloop","crushedthroat","tension","unweavingspirit","grievouswounds","pyramides","flushings","rebbies","mycalium","sandfever","crescendo","fulminated","frostbite"],ne={ferrum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ferrum",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"]},magnesium:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat magnesium",order:["paralysis","slickness","pyramides"]},aurum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat aurum",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"]},calamine:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat calamine",order:["deafness"],delay:2.5},argentum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat argentum",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"]},cuprum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat cuprum",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"]},antimony:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat antimony",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"]},arsenic:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat arsenic"},stannum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat stannum",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"]},plumbum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"],command:"eat plumbum"},calcite:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat calcite"},ginseng:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginseng",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"]},bloodroot:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bloodroot",order:["paralysis","slickness","pyramides"]},kelp:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat kelp",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"]},hawthorn:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat hawthorn",order:["deafness"],delay:2.5},lobelia:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat lobelia",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"]},bellwort:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bellwort",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"]},ginger:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginger",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"]},bayberry:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bayberry"},ash:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ash",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"]},goldenseal:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat goldenseal",order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"]},pear:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat pear"},smoke:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","disloyalty","hellsight","manaleech","slickness","deadening","tension","unweavingspirit","earworm","dazed"]},cinnabar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"]},malachite:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke malachite"},realgar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke realgar",order:["disloyalty","hellsight","manaleech","slickness"]},elm:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke elm",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"]},skullcap:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke skullcap"},valerian:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke valerian",order:["disloyalty","hellsight","manaleech","slickness"]},caloric:{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply caloric",order:["frozen","shivering","frostbite"]},"epidermal to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to body",order:["anorexia","itching"]},"epidermal to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to head",order:["blindness","scalded","deafness","stuttering"]},"epidermal to ears":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to ears",order:["deafness"]},"mending to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to head",order:["crushedthroat","dazzled"]},"mending to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to arms",order:["brokenleftarm","brokenrightarm"]},"mending to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to legs",order:["brokenleftleg","brokenrightleg"]},"mending to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to torso",order:["burning"]},"mending to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to body",order:["selarnia"]},"restoration to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to head",order:["mangledhead","damagedhead","calcifiedskull","concussion","tonguetied","slashedthroat","laceratedthroat"],delay:4},"restoration to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to torso",order:["hypothermia","heartseed","serioustrauma","mildtrauma","calcifiedtorso","internalbleeding"],delay:4},"restoration to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to arms",order:["mangledleftarm","mangledrightarm","damagedleftarm","damagedrightarm"],delay:4},"restoration to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to legs",order:["mangledleftleg","mangledrightleg","damagedleftleg","damagedrightleg"],delay:4},focus:{bals_req:["focus"],bals_used:["focus"],blocks:["death","impatience","sleeping"],command:"focus",order:["stupidity","epilepsy","dizziness","shyness","claustrophobia","paranoia","confusion","hallucinations","dementia","pacified","peace","lovers","generosity","masochism","loneliness","vertigo","recklessness","agoraphobia","anorexia","stuttering"]},"health to head":{bals_req:["sip"],bals_used:["sip"],command:"apply health to head",order:["skullfractures"]},"health to torso":{bals_req:["sip"],bals_used:["sip"],command:"apply health to torso",order:["crackedribs","grievouswounds"]},"health to arms":{bals_req:["sip"],bals_used:["sip"],command:"apply health to arms",order:["wristfractures"]},"health to legs":{bals_req:["sip"],bals_used:["sip"],command:"apply health to legs",order:["torntendons","latched","kkractlebrand"]},concentrate:{blocks:["death","sleeping","confusion"],command:"concentrate",order:["disrupted"]},immunity:{bals_req:["immunity"],bals_used:["immunity"],blocks:["death","sleeping","anorexia"],command:"sip immunity",order:["voyria"]},stand:{bals_req:["balance","equilibrium"],blocks:["death","sleeping","paralysis","brokenrightleg","brokenleftleg","damagedleftleg","damagedrightleg","mangledrightleg","mangledleftleg","entangled","transfixation","impaled","webbed","bound"],command:"stand",order:["prone"]},tree:{bals_used:["tree"],bals_req:["tree"],blocks:["death","sleeping","paralysis",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],command:"touch tree",order:ae},health:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip health"},mana:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip mana"},potash:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat potash"},moss:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat moss"},fitness:{serverside:!1,bals_req:["equilibrium","balance","fitness"],bals_used:["balance","fitness"],blocks:["death","weariness","sleeping"],skills:["Runewarden","Monk","Shikudo","Blademaster","Infernal","Paladin","Sentinel","Druid","Unnamable"],command:"fitness",order:["asthma"]},bloodboil:{serverside:!1,bals_req:["equilibrium","balance","bloodboil"],bals_used:["equilibrium","bloodboil"],blocks:["death","haemophilia","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Magi"],command:"cast bloodboil",order:ae},restore:{serverside:!1,bals_req:["balance","equilibrium"],bals_used:["equilibrium"],command:"restore",order:["brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","skullfractures","torntendons","wristfractures","crackedribs"]},dragonflex:{serverside:!1,bals_req:["balance"],bals_used:["balance"],command:"dragonflex",skills:["Dragon"],order:["webbed","entangled"]},dragonheal:{serverside:!1,bals_req:["balance","equilibrium","dragonheal"],bals_used:["equilibrium"],command:"dragonheal",skills:["Dragon"],blocks:["death","sleeping",["recklessness","weariness"]],order:ae},dwinnu:{serverside:!1,bals_req:["voice"],bals_used:["voice"],command:"chant dwinnu",skills:["Bard"],order:["webbed","entangled"]},rage:{serverside:!1,bals_req:["rage"],bals_used:["rage"],command:"rage",skills:["Runewarden"],order:["pacified","peace","lovers","generosity"]},"touch soul":{command:"touch soul",blocks:["death"],order:["amnesia"]},salt:{serverside:!1,bals_req:["equilibrium","salt"],bals_used:["salt","equilibrium"],blocks:["death","stupidity","sleeping"],skills:["Alchemist"],command:"educe salt",order:ae},shrugging:{serverside:!1,bals_req:["equilibrium","balance","shrugging"],bals_used:["shrugging"],blocks:["death","weariness","sleeping"],skills:["Serpent"],command:"shrugging",order:ae},slough:{serverside:!1,bals_req:["equilibrium","balance","slough"],bals_used:["slough","balance"],blocks:["death","weariness","sleeping"],skills:["Fire Elemental Lord"],command:"slough impurities",order:ae},fool:{serverside:!1,bals_req:["equilibrium","balance","fool"],bals_used:["fool","balance"],blocks:["death","prone","paralysis","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Occultist"],command:"fling fool at me",order:ae},alleviate:{serverside:!1,bals_req:["equilibrium","balance","alleviate"],bals_used:["alleviate","balance"],blocks:["death","paralysis","sleeping"],skills:["Blademaster"],command:"alleviate",order:ae}},normalizeCureCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],se=Object.freeze(Object.fromEntries(Object.entries(ne).map(([e,t])=>[e,Object.freeze({...t,serverside:!1!==t.serverside,command:Object.freeze(normalizeCureCommand(t.command))})]))),ie=Object.freeze(Object.entries(se).reduce((e,[t,a])=>((Array.isArray(a.order)?a.order:[]).forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e),{})),oe={acrobatics:{command:"acrobatics on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},airpocket:{command:["outr calcite","eat calcite"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},alertness:{static:!0,command:"alertness on",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},antiforce:{command:"intone gaiartha",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],serverside:!0},arctar:{command:"command orb",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Occultist"],serverside:!1,preempt:!0},astronomy:{static:!0,command:"astronomy empower me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},"avoid physical":{command:"avoid physical",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid aoe","avoid mental","avoid arcane"]},"avoid aoe":{command:"avoid aoe",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid mental","avoid arcane"]},"avoid mental":{command:"avoid mental",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid arcane"]},"avoid arcane":{command:"avoid arcane",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid mental"]},balancing:{command:"balancing on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},belltattoo:{command:"touch bell",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0,preempt:!0},blindness:{command:["outr arsenic","eat arsenic"],bals_req:["herb"],bals_used:["herb"],blocks:["death","sleeping","anorexia"],serverside:!0},blocking:{command:"block d",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","prone"],serverside:!1,preempt:!0},bloodshield:{command:"activate bloodshield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],serverside:!0,preempt:!0},bodyaugment:{command:"intone mainaas",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},bodyblock:{static:!0,command:"bdb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},boostedregeneration:{command:"boost regeneration",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},bulk:{command:"mutate bulk",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},cloak:{command:"touch cloak",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},chargeshield:{static:!0,command:"cast chargeshield at me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},coldresist:{command:"activate cold resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},compoundmask:{command:["wear mask","secure mask"],bals_req:["free"],bals_used:["free"],skills:["Alchemist"],serverside:!1},consciousness:{command:"consciousness on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},constitution:{static:!0,command:"constitution",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},curseward:{static:!0,command:"curseward",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],serverside:!0},deafness:{command:["outr calamine","eat calamine"],bals_req:["herb","deafness"],bals_used:["herb","deafness"],blocks:["death","sleeping","anorexia"],serverside:!0},deathsight:{static:!0,command:"deathsight",bals_req:["balance","equilibrium"],bals_used:["free"],serverside:!0,preempt:!0},deflect:{command:"deflect",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","prone","sleeping"],skills:["Runewarden","Paladin","Infernal","Unnamable"],serverside:!0,preempt:!0},density:{command:"wear shackle",bals_req:["salve"],bals_used:["salve"],blocks:["death","slickness","sleeping"],serverside:!0},devilmark:{static:!0,command:"devilmark",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},diamondskin:{static:!0,command:"cast diamondskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},distortedaura:{static:!0,command:"distortaura",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},dragonarmour:{static:!0,command:"dragonarmour",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Dragon"],serverside:!0},dragonbreath:{command:"summon ice",bals_req:["balance","equilibrium","dragonbreath"],bals_used:["free","dragonbreath"],blocks:["death","prone","sleeping"],skills:["Dragon"],preempt:!0,serverside:!0},durability:{command:"intone tsuura",bals_req:["balance","equilibrium"],skills:["Depthswalker"],blocks:["death","sleeping","prone"],bals_used:["word"],serverside:!0},electricresist:{command:"activate electric resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},endure:{command:"endure",stopCommand:"endure stop",bals_req:["balance","equilibrium"],bals_used:["free"],stopBals_req:["balance","equilibrium"],stopBals_used:["free"],blocks:["death","sleeping"],stopBlocks:["death","sleeping"],serverside:!0,preempt:!0},enhancedform:{command:["amalgamate enhancement","imbibe enhancement"],bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!1,preempt:!0},evadeblock:{command:"evb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},eyes:{command:"mutate eyes",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},fireresist:{command:"activate fire resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},fangbarrier:{command:"apply quicksilver",bals_req:["salve","sileris"],bals_used:["salve","sileris"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0},fireshroud:{command:"ignite shroud",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0,skills:["Fire Elemental Lord"]},fury:{command:"fury on",bals_req:["balance"],bals_used:["equilibrium"],skills:["Runewarden","Unnamable"],serverside:!0},flying:{serverside:!1,clientOnly:!0,trackOnly:!0},ghost:{static:!0,command:"conjure ghost",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},gripping:{command:"grip",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Unnamable","Shikudo","Bard","Blademaster","Jester","Shaman"],serverside:!0,preempt:!0},groundwatch:{command:"groundwatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},"guarding right leg":{command:"guard right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left leg":{command:"guard left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding right leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding right arm":{command:"guard right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right leg","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left arm":{command:"guard left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding right leg","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding head":{command:"guard head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding right leg","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding torso":{command:"guard torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding right leg","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},guidedstrike:{static:!0,command:"enact guidedstrike",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],serverside:!0},heldbreath:{command:"hold breath",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","asthma","sleeping"],preempt:!0,serverside:!0},hiding:{command:"hide",bals_req:["equilibrium","balance"],bals_used:["balance"],skills:["Serpent"],serverside:!0},hypersight:{command:"hypersight on",bals_req:["balance"],bals_used:["equilibrium"],serverside:!0},immunity:{command:"immunity",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},insomnia:{command:"insomnia",bals_req:["free"],bals_used:["free"],blocks:["death","hypersomnia","sleeping"],serverside:!0,preempt:!0},insulation:{command:"apply caloric",bals_req:["salve"],bals_used:["salve"],blocks:["death","sleeping","slickness","hypothermia"],serverside:!0},insufflate:{command:["get phial from pack","amalgamate insufflate potency 4 stability 1","imbibe insufflate"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},ironform:{static:!0,command:["get phial from pack","amalgamate petrifying potency 4 stability 1","imbibe petrifying"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},joints:{command:"mutate joints",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},kaiboost:{command:"kai boost",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],preempt:!0,serverside:!0},kaitrance:{command:"kai trance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},kola:{command:["outr quartz","eat quartz"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},levitating:{command:"sip levitation",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},lifevision:{static:!0,command:"lifevision",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},lipreading:{static:!0,command:"lipread",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},locketdeath:{command:"solicit locket for immortality",bals_req:["free"],bals_used:["free"],serverside:!1},magicresist:{command:"activate magic resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},blademastery:{command:"mastery on",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Unnamable"],preempt:!0,serverside:!0},meditate:{command:"meditate",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","impatience"],preempt:!1,serverside:!1},mercury:{static:!0,command:"educe mercury",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},metabolise:{serverside:!1,clientOnly:!0,trackOnly:!0},metawake:{command:"metawake on",stopCommand:"metawake off",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],stopBals_req:["free"],stopBals_used:["free"],blocks:["death","sleeping","lullaby"],stopBlocks:["death","sleeping"],serverside:!0,preempt:!0},mindcloak:{command:"mind cloak on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],preempt:!0,skills:["Monk","Shikudo"],serverside:!0},mindnet:{command:"mindnet on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},mindseye:{static:!0,command:"touch mindseye",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},morimbuul:{command:"ldeck draw morimbuul",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],serverside:!1,preempt:!1},mounted:{serverside:!1,clientOnly:!0,trackOnly:!0},mouths:{command:"mutate mouths",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},nightsight:{command:"nightsight",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},numbness:{command:"numb",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"]},"parrying right leg":{command:"parry right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","guarding right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left leg":{command:"parry left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","guarding right leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying right arm":{command:"parry right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","guarding right leg","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left arm":{command:"parry left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","guarding right leg","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying head":{command:"parry head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","guarding right leg","parrying left","parrying right","parrying centre"]},"parrying torso":{command:"parry torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","guarding right leg","parrying head","parrying left","parrying right","parrying centre"]},pinchblock:{command:"pnb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},projectiles:{command:"projectiles on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],blocks:["death","sleeping","mounted"],preempt:!0,serverside:!0},poisonresist:{command:"sip venom",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},precision:{command:"intone trusad",bals_req:["balance","equilibrium"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},prismatic:{command:"strum lyre",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],serverside:!1},psitranscend:{command:"psi transcend",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],blocks:["death","sleeping"],serverside:!0},rebounding:{command:"smoke malachite",bals_req:["smoke","rebounding"],bals_used:["smoke","rebounding"],blocks:["death","asthma","sleeping"],serverside:!0},regeneration:{command:"regeneration on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo"],blocks:["death","sleeping"],serverside:!0,preempt:!0},resistance:{command:"resistance",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Monk","Shikudo","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},scales:{static:!0,command:"scales",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0},secondsight:{static:!0,command:"secondsight",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},secondskin:{static:!0,command:"weave secondskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],serverside:!0},selfishness:{command:"selfishness",bals_req:["balance","equilibrium"],bals_used:["balance"],serverside:!0},shield:{command:"touch shield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},shintrance:{command:"shin trance",bals_req:["free"],bals_used:["free"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0,preempt:!0},shinclarity:{static:!0,command:"clarity",bals_req:["balance"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shinbinding:{static:!0,command:"shinbinding on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shipwarning:{command:"shipwarning on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0},shroud:{static:!0,command:"shroud",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Occultist","Serpent"],serverside:!0},softfocusing:{command:"softfocus on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0,preempt:!0},speed:{command:"sip speed",bals_req:["speed"],bals_used:["speed"],blocks:["death","anorexia","sleeping"],serverside:!0},splitmind:{command:"split mind",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},skysight:{command:"manifest skysight",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},skywatch:{command:"skywatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},stonefist:{static:!0,command:"cast stonefist",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},stoneskin:{static:!0,command:"cast stoneskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},sulphur:{static:!0,command:"educe sulphur",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},tekurastance:{command:"tekurastance",bals_req:["free"],bals_used:["balance"],skills:["Monk","Shikudo"]},telesense:{command:"telesense on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},temperance:{command:"sip frost",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},tempest:{command:"manifest tempest",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},mutatetentacles:{command:"mutate tentacles",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},thirdeye:{command:"thirdeye",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tin:{static:!0,command:"educe tin",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Alchemist"],serverside:!0},tentacles:{command:"tentacles",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Occultist"],serverside:!0},toughness:{command:"toughness",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},treewatch:{command:"treewatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tune:{command:"blade tune",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},twoartsstance:{command:"twoartsstance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Blademaster"]},vigilance:{command:"vigilance on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},vitality:{command:"vitality on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},weathering:{command:"weathering on",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Infernal","Paladin","Monk","Shikudo","Blademaster","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},weaving:{static:!0,command:"weaving on",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0}},normalizeDefCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefPriority=(e,t)=>{const a=Number(e);return Number.isFinite(a)?a<0?0:a>26?26:a:0},le=Object.freeze(Object.fromEntries(Object.entries(oe).map(([e,t])=>{const a=!1!==t.serverside;return[e,Object.freeze({...t,command:Object.freeze(normalizeDefCommand(t.command)),stopCommand:Object.freeze(normalizeDefCommand(t.stopCommand)),bals_req:Object.freeze(normalizeDefList(t.bals_req)),bals_used:Object.freeze(normalizeDefList(t.bals_used)),stopBals_req:Object.freeze(normalizeDefList(t.stopBals_req)),stopBals_used:Object.freeze(normalizeDefList(t.stopBals_used)),skills:Object.freeze(normalizeDefList(t.skills)),opps:Object.freeze(normalizeDefList(t.opps)),blocks:Object.freeze(t.blocks?[...t.blocks]:[]),stopBlocks:Object.freeze(t.stopBlocks?[...t.stopBlocks]:[]),serverside:a,preempt:!0===t.preempt,static:!0===t.static,clientOnly:!0===t.clientOnly,trackOnly:!0===t.trackOnly,defaultPriority:normalizeDefPriority(t.defaultPriority,a)})]}))),ce=Object.freeze(Object.keys(le).reduce((e,t)=>(e[t]=Number(le[t].defaultPriority),e),{})),buildDefBySkillIndex=()=>{const e=Object.entries(le).reduce((e,[t,a])=>{const n=a.skills;return Array.isArray(n)&&n.forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e},{});return Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Object.freeze([...t])])))},ue=(buildDefBySkillIndex(),Object.freeze({snapTrack:Object.freeze({label:"Snapped",durationMs:8e3})})),de=Object.freeze({icewall:Object.freeze({gmcpItemNames:Object.freeze([])}),stonewall:Object.freeze({gmcpItemNames:Object.freeze([])})}),me=Object.freeze({CHAR_VITALS:"nexsys4.gmcp.char.vitals",CHAR_STATUS:"nexsys4.gmcp.char.status",CHAR_AFFLICTIONS_LIST:"nexsys4.gmcp.char.afflictions.list",CHAR_AFFLICTIONS_ADD:"nexsys4.gmcp.char.afflictions.add",CHAR_AFFLICTIONS_REMOVE:"nexsys4.gmcp.char.afflictions.remove",CHAR_DEFENCES_LIST:"nexsys4.gmcp.char.defences.list",CHAR_DEFENCES_ADD:"nexsys4.gmcp.char.defences.add",CHAR_DEFENCES_REMOVE:"nexsys4.gmcp.char.defences.remove",IRE_RIFT_LIST:"nexsys4.gmcp.ire.rift.list",IRE_RIFT_CHANGE:"nexsys4.gmcp.ire.rift.change",CHAR_ITEMS_LIST:"nexsys4.gmcp.char.items.list",CHAR_ITEMS_DELTA:"nexsys4.gmcp.char.items.delta",ROOM_INFO:"nexsys4.gmcp.room.info",TARGET_INFO:"nexsys4.gmcp.target.info"}),isRecord$4=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),normalizeLocation=e=>String(e??"inv").trim().toLowerCase()||"inv",mergeDefinedRecord=(...e)=>e.reduce((e,t)=>(Object.entries(isRecord$4(t)?t:{}).forEach(([t,a])=>{void 0!==a&&(e[t]=a)}),e),{}),mergeResourceStats=(e=[],t=[])=>{const a=new Map;return[...e,...t].forEach(e=>{const t=String(e?.key||"").trim().toLowerCase();t&&a.set(t,e)}),[...a.values()]},mergeBalancePatches=(e=[],t=[])=>[...Array.isArray(e)?e:[],...Array.isArray(t)?t:[]],mergeStatusPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,status:{...isRecord$4(a.status)?a.status:{},...isRecord$4(n.status)?n.status:{}}}},mergeVitalsPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{},s=isRecord$4(a.vitals)?a.vitals:{},i=isRecord$4(n.vitals)?n.vitals:{};return{...a,...n,vitals:{...s,...i,kind:i.kind||s.kind,vitals:mergeDefinedRecord(s.vitals,i.vitals),balances:mergeDefinedRecord(s.balances,i.balances),balancePatches:mergeBalancePatches(s.balancePatches,i.balancePatches),resourceStats:mergeResourceStats(Array.isArray(s.resourceStats)?s.resourceStats:[],Array.isArray(i.resourceStats)?i.resourceStats:[])}}},mergeTargetPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,target:mergeDefinedRecord(a.target,n.target)}},pe=new Map([[me.CHAR_STATUS,{keyFor:()=>me.CHAR_STATUS,merge:mergeStatusPayload}],[me.CHAR_VITALS,{keyFor:()=>me.CHAR_VITALS,merge:mergeVitalsPayload}],[me.CHAR_AFFLICTIONS_LIST,{keyFor:()=>me.CHAR_AFFLICTIONS_LIST,merge:(e,t)=>t}],[me.CHAR_DEFENCES_LIST,{keyFor:()=>me.CHAR_DEFENCES_LIST,merge:(e,t)=>t}],[me.CHAR_ITEMS_LIST,{keyFor:({payload:e}={})=>`${me.CHAR_ITEMS_LIST}:${normalizeLocation(e?.location)}`,merge:(e,t)=>t}],[me.IRE_RIFT_LIST,{keyFor:()=>me.IRE_RIFT_LIST,merge:(e,t)=>t}],[me.TARGET_INFO,{keyFor:()=>me.TARGET_INFO,merge:mergeTargetPayload}]]),ge=new Set([me.CHAR_AFFLICTIONS_ADD,me.CHAR_AFFLICTIONS_REMOVE,me.CHAR_DEFENCES_ADD,me.CHAR_DEFENCES_REMOVE,me.CHAR_ITEMS_DELTA,me.IRE_RIFT_CHANGE]),createGmcpBlockBuffer=({coalesce:e=!0}={})=>{const t=[];return{enqueue:(e={})=>{const a=String(e.topic||"").trim();a&&t.push({topic:a,payload:Object.prototype.hasOwnProperty.call(e,"payload")?e.payload:null})},flush:()=>{if(!e){const e=[...t];return t.length=0,e}const a=new Map,n=[],s=[];return t.forEach(e=>{const t=pe.get(e.topic);if(t){const n=t.keyFor(e),s=a.get(n);return void(s?a.set(n,{...s,payload:t.merge(s.payload,e.payload)}):a.set(n,e))}ge.has(e.topic)?s.push(e):n.push(e)}),t.length=0,[...a.values(),...n,...s]},size:()=>t.length}},createEventBus=({label:e="nexSys4.eventBus",debugEnabled:t=!1,traceLimit:a=200}={})=>{const n=new Map,s=new Set;let i=Boolean(t);const o=Math.max(1,Number(a||200)),l=[],pushTrace=(t,a={})=>{if(!i)return null;const n={at:Date.now(),type:t,detail:a};return l.push(n),l.length>o&&l.splice(0,l.length-o),console.log(`[${e}] ${t}`,a),n},on=(e,t)=>{const a=String(e||"").trim();if(!a||"function"!=typeof t)return()=>{};const s=n.get(a)||new Set;return s.add(t),n.set(a,s),pushTrace("on",{topic:a,listenerCount:s.size}),()=>off(a,t)},off=(e,t)=>{const a=String(e||"").trim(),s=n.get(a);if(!a||!s)return!1;const i=s.delete(t);return s.size||n.delete(a),pushTrace("off",{topic:a,removed:i,listenerCount:s.size}),i},onAny=e=>"function"!=typeof e?()=>{}:(s.add(e),pushTrace("onAny",{listenerCount:s.size}),()=>offAny(e)),offAny=e=>{const t=s.delete(e);return pushTrace("offAny",{removed:t,listenerCount:s.size}),t};return{on,off,onAny,offAny,emit:(e,t)=>{const a=String(e||"").trim();if(!a)return 0;const o=[...n.get(a)||[]],l=[...s];return i&&pushTrace("emit",{topic:a,listenerCount:o.length,anyListenerCount:l.length,payload:t}),o.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus handler failed",{topic:a,error:n})}}),l.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus global handler failed",{topic:a,error:n})}}),o.length+l.length},clear:()=>{n.clear(),s.clear()},setDebugEnabled(e){i=Boolean(e)},debugInfo:()=>({label:e,debugEnabled:i,topics:[...n.keys()],anyListenerCount:s.size,recentTrace:[...l]})}},fe=Object.freeze({RUNTIME_STARTED:"nexsys4.runtime.started",RUNTIME_STOPPED:"nexsys4.runtime.stopped",RAW_GMCP:"nexsys4.raw.gmcp",SYSTEM_VITALS_CHANGED:"nexsys4.system.vitals.changed",SYSTEM_HEALTH_CHANGED:"nexsys4.system.health.changed",SYSTEM_MANA_CHANGED:"nexsys4.system.mana.changed",SYSTEM_RAGE_CHANGED:"nexsys4.system.rage.changed",SYSTEM_BLEED_CHANGED:"nexsys4.system.bleed.changed",SYSTEM_STATUS_CHANGED:"nexsys4.system.status.changed",SYSTEM_CLASS_CHANGED:"nexsys4.system.class.changed",SYSTEM_TARGET_CHANGED:"nexsys4.system.target.changed",ROOM_CHANGED:"nexsys4.room.changed",ROOM_FEATURES_CHANGED:"nexsys4.room.features.changed",SYSTEM_RUNTIME_CHANGED:"nexsys4.system.runtime.changed",SYSTEM_PAUSE_CHANGED:"nexsys4.system.pause.changed",SYSTEM_PAUSED:"nexsys4.system.paused",SYSTEM_UNPAUSED:"nexsys4.system.unpaused",SYSTEM_LOADED:"nexsys4.system.loaded",SYSTEM_SETTINGS_CHANGED:"nexsys4.system.settings.changed",SYSTEM_BASELINE_CHANGED:"nexsys4.system.baseline.changed",SYSTEM_DEATH_DETECTED:"nexsys4.system.death.detected",SYSTEM_MOUNT_CHANGED:"nexsys4.system.mount.changed",SYSTEM_WIELDED_CHANGED:"nexsys4.system.wielded.changed",UI_CONFIG_CHANGED:"nexsys4.ui.config.changed",AFF_GOT:"nexsys4.aff.got",AFF_LOST:"nexsys4.aff.lost",AFF_STACK_CHANGED:"nexsys4.aff.stack.changed",AFF_PRIORITY_CHANGED:"nexsys4.aff.priority.changed",DEF_GOT:"nexsys4.def.got",DEF_LOST:"nexsys4.def.lost",DEF_PRIORITY_CHANGED:"nexsys4.def.priority.changed",BALANCE_GOT:"nexsys4.balance.got",BALANCE_LOST:"nexsys4.balance.lost",BALANCE_RESET:"nexsys4.balance.reset",BALANCE_DURATION_OBSERVED:"nexsys4.balance.duration.observed",BALANCE_TIMER_RESTARTED:"nexsys4.balance.timer.restarted",EQBAL_GOT:"nexsys4.eqbal.got",LIMB_UPDATED:"nexsys4.limb.updated",CACHE_AMOUNT_CHANGED:"nexsys4.cache.amount.changed",CACHE_INVENTORY_LIST:"nexsys4.cache.inventory.list",CACHE_RIFT_LIST:"nexsys4.cache.rift.list",CACHE_PRECACHE_CHANGED:"nexsys4.cache.precache.changed",ITEM_ROOM_ADDED:"nexsys4.item.room.added",ITEM_ROOM_REMOVED:"nexsys4.item.room.removed",ITEM_ROOM_UPDATED:"nexsys4.item.room.updated",ITEM_ROOM_LIST:"nexsys4.item.room.list",ITEM_INV_ADDED:"nexsys4.item.inv.added",ITEM_INV_REMOVED:"nexsys4.item.inv.removed",ITEM_INV_UPDATED:"nexsys4.item.inv.updated",ITEM_INV_LIST:"nexsys4.item.inv.list",QUEUE_UPDATED:"nexsys4.queue.updated",QUEUE_FLUSHED:"nexsys4.queue.flushed",QUEUE_DEFERRED:"nexsys4.queue.deferred",QUEUE_CLEARED:"nexsys4.queue.cleared",QUEUE_SENT:"nexsys4.queue.sent",QUEUE_FIRED:"nexsys4.queue.fired",QUEUE_FIRED_ACK:"nexsys4.queue.fired.ack",SERVERSIDE_AFF_PRIORITY_SET:"nexsys4.serverside.aff.priority.set",SERVERSIDE_DEF_PRIORITY_SET:"nexsys4.serverside.def.priority.set",SERVERSIDE_DIRTY:"nexsys4.serverside.dirty",SERVERSIDE_EVALUATED:"nexsys4.serverside.evaluated",RULE_ADDED:"nexsys4.rule.added",RULE_REMOVED:"nexsys4.rule.removed",RULE_ENABLED:"nexsys4.rule.enabled",RULE_DISABLED:"nexsys4.rule.disabled",RULE_PACK_LOADED:"nexsys4.rule.pack.loaded",RULE_PACK_UNLOADED:"nexsys4.rule.pack.unloaded",RULE_ORDER_CHANGED:"nexsys4.rule.order.changed",RULE_ACTIVATED:"nexsys4.rule.activated",RULE_DEACTIVATED:"nexsys4.rule.deactivated"}),he=Object.freeze({IDLE:"IDLE",PROBING_SEPARATOR:"PROBING_SEPARATOR",BOOTING:"BOOTING",PROVISIONING_CURINGSET:"PROVISIONING_CURINGSET",AWAITING_SNAPSHOTS:"AWAITING_SNAPSHOTS",CAPTURING_SNAPSHOTS:"CAPTURING_SNAPSHOTS",RUNNING:"RUNNING",FAILED:"FAILED"}),isRuntimeReadyPhase=e=>e===he.RUNNING,be=Object.freeze({OUTPUT_COMPLETE:"SystemOutputCompleteEvent",STARTUP_BEGIN:"CuringStartupBeginEvent",STARTUP_COMPLETE:"CuringStartupCompleteEvent",STARTUP_FINALIZED:"CuringStartupFinalizedEvent",CURINGSET_READY:"CuringSetReadyEvent"}),ye=Object.freeze(["IRE.Rift.Request","IRE.Time.Request","Char.Skills.Get","Char.Items.Inv","IRE.Time.Request","Comm.Channel.Players","IRE.Tasks.Request"]),buildStartupSnapshotCommands=()=>[`echo SystemEvent ${be.STARTUP_BEGIN}`,"curing off","score","date","curing status","curing priority list","curing queue list","curing predictions","curing priority defence list","def","curing on",`echo SystemEvent ${be.STARTUP_COMPLETE}`],buildStartupSnapshotBurst=()=>({gmcpRequests:[...ye],commands:buildStartupSnapshotCommands()}),ve=Object.freeze(["status","affPriorities","defPriorities"]),normalizeTimeoutMs=(e,t=1e3)=>{const a=Number(e);return Number.isFinite(a)&&a>0?Math.floor(a):t},normalizeRetryCount=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)&&a>=0?Math.floor(a):t},createStartupCoordinator=({adapter:e,systemModel:t,serverside:a,persistence:n,seedBaselineFromObservedStartup:s=()=>{},noticeCenter:i,buildPersistenceSnapshot:o,startupTimeoutMs:l=1e3,maxStartupRetries:c=0,publishStartupPhase:u=()=>{},publishLoaded:d=()=>{},releaseStartupPause:m=()=>!1,setRuntimePhase:p=(e,a={})=>{t.setRuntime({phase:e,...a})}})=>{let g=!1,h=0,b=null,y=null;const v=normalizeTimeoutMs(l),S=normalizeRetryCount(c),clearConvergenceTimer=()=>{b&&(e.clearTimeout(b),b=null)},getMissingRequiredTopics=()=>{if("function"==typeof a.getMissingStartupFlags)return a.getMissingStartupFlags(ve);const e=a.getStartupStatus();return ve.filter(t=>!e.flags?.[t])},formatMissingRequiredTopics=(e=[])=>e.length?` Missing required captures: ${e.join(", ")}.`:"",startConvergenceTimer=()=>{clearConvergenceTimer(),b=e.setTimeout(()=>{if(g)return;const e=getMissingRequiredTopics();retryOrFail(e.length?`Startup snapshots did not converge within ${v}ms.`:`Startup closing fence did not arrive within ${v}ms.`,{phase:"snapshot-timeout-retry",source:"startup-timeout",missingRequired:e})},v)},complete=(e="startup-check")=>{clearConvergenceTimer(),p(he.RUNNING,{startupFailureMessage:""}),s(),n.save(o()),u("startup-complete"),m({source:"startup-complete"}),d({source:"startup-complete",topic:fe.SYSTEM_LOADED}),i.publish("output","startup complete",{source:e})},fail=(e,{source:t="startup-failed",missingRequired:a=[]}={})=>{clearConvergenceTimer(),g=!0;const n=`${e}${formatMissingRequiredTopics(a)}`;return p(he.FAILED,{paused:!0,startupFailureMessage:n}),u("startup-failed"),i.publish("output",n,{force:!0,source:t,title:"startup failed: ",fg:"#fee2e2",bg:"#450a0a",titleFg:"#ffffff",titleBg:"#7f1d1d"}),!1},retryOrFail=(e,{phase:t,source:a,missingRequired:n=[]}={})=>!g&&(h>=S?fail(`${e} Exhausted ${S} startup retr${1===S?"y":"ies"}.`,{source:a,missingRequired:n}):(h+=1,requestSnapshots(y,t||"snapshot-retry",{source:a,retry:h,missingRequired:n}),!1)),requestSnapshots=(t,a="snapshot-request",n={})=>{if(y="function"==typeof t?t:y,"function"!=typeof y)return[];const s={source:"startup-snapshots",phase:a,attempt:h+1,retryCount:h,...n},{gmcpRequests:i,commands:o}=buildStartupSnapshotBurst();p(he.AWAITING_SNAPSHOTS),u(a),e.sendGmcp(i,s);const l=y(o,s);return startConvergenceTimer(),l};return{reset:()=>{g=!1,h=0,clearConvergenceTimer(),a.resetStartupStatus?.(),p(he.IDLE,{startupFailureMessage:""})},fail,requestSnapshots,handleFenceBegin:()=>!g&&(p(he.CAPTURING_SNAPSHOTS),u("snapshot-begin"),!0),handleFenceComplete:(e="snapshot:complete:text")=>{if(g)return!1;u("snapshot-complete");const t=a.getStartupStatus();t.flags.queue||a.updateObservedQueue([]),t.flags.predictions||a.updateObservedPredictions({});const n=getMissingRequiredTopics();return n.length?retryOrFail("Startup closing fence arrived before required snapshots converged.",{phase:"snapshot-retry",source:e,missingRequired:n}):(g=!0,complete(e),!0)},dispose(){clearConvergenceTimer()},isResolved:()=>g}},Se="nexsys4-default",normalizeCommand=e=>String(e||"").trim().toLowerCase().replace(/\s+/g," "),isServersideCommand=e=>{const t=normalizeCommand(e);return t.startsWith("curing ")||t.startsWith("curingset ")},normalizeSetName=e=>String(e||"").trim().toLowerCase(),toNumberMaybe=e=>{if("number"==typeof e&&Number.isFinite(e))return e;const t=Number(e);return Number.isFinite(t)?t:e},normalizeBoolean=e=>{if("boolean"==typeof e)return e;const t=String(e||"").trim().toLowerCase();return!!["on","yes","true","activated","enabled"].includes(t)||!["off","no","false","disabled"].includes(t)&&Boolean(e)},normalizeStatusValue=(e,t)=>{switch(e){case"enabled":case"reporting":case"afflictions":case"defences":case"sipping":case"transmutation":case"focus":case"useVault":case"clot":case"fallback":case"kaidoTransmute":case"customAffPriority":case"customDefPriority":case"batch":case"insomnia":return normalizeBoolean(t);case"focusOverHerbs":{if("boolean"==typeof t)return t;const e=String(t||"").trim().toLowerCase();return!!["focus","first","yes","on","true"].includes(e)||!["herbs","second","no","off","false"].includes(e)&&Boolean(t)}case"tree":{if("custom"===t)return"custom";if("boolean"==typeof t)return t?"on":"off";const e=String(t||"").trim().toLowerCase();return["custom","on","off"].includes(e)?e:["yes","activated","enabled","true"].includes(e)?"on":["no","disabled","false"].includes(e)?"off":e||"off"}case"sipPriority":return"mana"===String(t||"").trim().toLowerCase()?"mana":"health";default:return toNumberMaybe(t)}},buildCountablePriorityDefaults=e=>"function"!=typeof e.getCountablePriorityNames?{}:e.getCountablePriorityNames().reduce((e,t)=>(e[t]=0,e),{}),normalizeServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26?t:0},isServersideAffPriorityNumber=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},canonicalAffPriority=e=>{const t=normalizeServersideAffPriority(e);return 26===t?0:t},buildBaselineAffPriorities=e=>({...e.list().reduce((t,a)=>(t[a]=normalizeServersideAffPriority(e.getPriority(a)),t),{}),...buildCountablePriorityDefaults(e)}),buildObservedAffPriorities=e=>({...e.list().reduce((e,t)=>(e[t]=0,e),{}),...buildCountablePriorityDefaults(e)}),buildBaselineDefPriorities=(e,t="")=>e.list().reduce((a,n)=>{const s=e.get(n);return!s?.serverside||s.static?a:e.isAvailableForClass(n,t)?(a[n]=e.getPriority(n),a):a},{}),buildObservedDefPriorities=(e,t="")=>e.list().reduce((a,n)=>e.get(n)?.serverside&&e.isAvailableForClass(n,t)?(a[n]=0,a):a,{}),mergeWithResets=(e,t={})=>{const a={...e};return Object.entries(t).forEach(([t,n])=>{a[t]="RESET"!==n?n:e[t]}),a},createInitialServersideState=({baselineSettings:e,affModel:t,defModel:a,systemModel:n})=>{const s=n?.getClass?.()||"",i=buildBaselineAffPriorities(t),o=buildBaselineDefPriorities(a,s);return{baseline:{settings:{...e},affPriorities:i,defPriorities:o},sessionBaseline:{settings:{...e},affPriorities:{...i},defPriorities:{...o}},desired:{},observed:{settings:{...e},affPriorities:buildObservedAffPriorities(t),defPriorities:buildObservedDefPriorities(a,s),prioAff:null,manualQueue:[],predictions:{},prioritySet:""},pending:new Map,capture:{affPriorities:null,defPriorities:null,prioritySet:""},transient:{prioAff:null,manualQueue:[],predictions:{},predictionCommands:[],predictionRequests:[],fullPriorityReset:!1},diagnostics:{lastCommands:[],lastReasons:[],desyncCounter:0,recoveryCounter:0,commandRepeatCounter:0},curingsets:{sets:[],activeSet:"",priorSet:"",used:0,limit:0},startup:{flags:{status:!1,affPriorities:!1,defPriorities:!1,queue:!1,predictions:!1,curingsets:!1}},lastDiffCommands:[],dirty:!0}},createCuringSetProvisioner=({adapter:e,serverside:t,dispatchCommands:a,setRuntimePhase:n=()=>{},publishStartupPhase:s=()=>{},options:i={}}={})=>{const o=`echo SystemEvent ${be.CURINGSET_READY}`,l=Math.max(50,Number(i.curingSetProvisionTimeoutMs??i.startupTimeoutMs??1e3)),c=Math.max(1,Number(i.maxCuringSetProvisionAttempts??4));let u=!1,d=0,m=!1,p=null,g={onReady:()=>{},onAbort:()=>{}};const clearTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},settle=()=>{u=!1,clearTimer()},finishReady=()=>{const{onReady:e}=g;settle(),e({createdThisRun:m})},finishAbort=e=>{const{onAbort:t}=g;settle(),t(e)},sendProbe=(t,n)=>{clearTimer(),d+=1,a([...t,"curingset list",o],{source:"curingset-provision",reason:n,attempt:d}),p=e?.setTimeout?.(()=>{u&&finishAbort(`nexSys4 could not confirm its curing set within ${l}ms (no response from the game). Reload to retry.`)},l)},handleBarrier=()=>{if(!u)return;clearTimer();const e=t.getCuringSets?.()??{},a=(e.sets||[]).map(e=>normalizeSetName(e)),n=normalizeSetName(e.activeSet),s=Number(e.used||0),i=Number(e.limit||0),o=a.includes(Se);"nexsys4-default"!==n?d>=c?finishAbort(`nexSys4 could not secure its curing set after ${c} attempts. Reload to retry.`):o?sendProbe([`curingset switch ${Se}`],"switch"):i>0&&s>=i?finishAbort(`nexSys4 needs its own curing set but all ${i} slots are full. Delete a set or CURINGSET EXPAND (25cr), then reload.`):(m=!0,sendProbe([`curingset new ${Se}`,`curingset switch ${Se}`],"create")):finishReady()};return{start({onReady:e=()=>{},onAbort:t=()=>{}}={}){g={onReady:e,onAbort:t},u=!0,d=0,m=!1,n(he.PROVISIONING_CURINGSET),s("provision-curingset"),sendProbe([],"list")},handleBarrier,wasCreatedThisRun:()=>m,isActive:()=>u,dispose(){settle()}}},xe=Object.freeze({STARTED:"nexSys.start(): startup initiated.",ALREADY_STARTED:"nexSys.start(): runtime is already started.",STARTUP_PENDING:"nexSys.start(): runtime is already started; startup is still in progress.",STARTUP_FAILED:"nexSys.start(): runtime startup failed. Check the console and in-game notices.",SEPARATOR_PROBE:"nexSys.start(): command separator unknown; sending config to auto-detect. Startup will resume on capture."}),ke=Object.freeze(["config","more","more"]),createRuntimeStartupOrchestrator=({adapter:e,systemModel:t,persistenceApi:a,startup:n,curingSetProvisioner:s,noticeCenter:i,syncDebugMode:o,isStarted:l,markStarted:c,setRuntimePhase:u,publishStartupPhase:d,attachEventWiring:m,promptPresenter:p,publishRuntimeStarted:g,hydrateCacheFromAdapterGmcp:h,commandDispatcher:b,debugOverride:y})=>{let v=null;const continueStartup=()=>{c(),u(he.BOOTING,{startupFailureMessage:""}),d("init"),g(),m(),p.start(),h(),s.start({onReady:()=>{n.requestSnapshots(b.sendCommands)},onAbort:e=>{n.fail(e,{source:"curingset-provision"})}})};return{dispose(){v&&(v(),v=null),s?.dispose?.()},start(){if(l()){const e=t.getRuntime().phase;return e===he.FAILED?xe.STARTUP_FAILED:e===he.RUNNING?xe.ALREADY_STARTED:xe.STARTUP_PENDING}if(v)return xe.SEPARATOR_PROBE;t.setSettings({commandSeparator:void 0},{setBaseline:!0}),a.loadPersistence(),void 0!==y&&t.setSettings({debug:Boolean(y)},{setBaseline:!0}),n.reset();const s=normalizeCommandSeparator(t.getSettings().commandSeparator),c=normalizeCommandSeparator(e.getCommandSeparator()),m=s||c;return o(),m?(t.getSettings().commandSeparator!==m&&t.setSettings({commandSeparator:m},{setBaseline:!0}),c!==m&&e.setSeparator?.(m),continueStartup(),xe.STARTED):(u(he.PROBING_SEPARATOR),d("separator-probe"),i.publish("output","Command separator not configured. Sending config to auto-detect...",{source:"separator-probe"}),v=e.addOnceTrigger({id:"nexsys4-separator-probe",regex:/\bCommandSeparator\s+(?<sep>\S+)/,action:({args:a,client:n})=>{const s=normalizeCommandSeparator(String(a.groups?.sep||"").trim());s&&(n?.current_block?.forEach(e=>{e.gag=!0}),v=null,e.setSeparator(s),t.setSettings({commandSeparator:s},{setBaseline:!0}),continueStartup())}}),ke.forEach(t=>{e.send([t],{source:"separator-probe"})}),xe.SEPARATOR_PROBE)}}},Ce=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],Ae="nexsys4.parsed_gmcp_vitals",hasOwn$5=(e,t)=>Boolean(e)&&Object.prototype.hasOwnProperty.call(e,t),Ee=Object.freeze({"voice balance":"voice","entity balance":"entity"}),parseNumericVital=(e,t)=>{if(!hasOwn$5(e,t))return;const a=toNumber(e[t],NaN);return Number.isFinite(a)?a:void 0},parseResourceStat=e=>{const[t,a]=String(e).split(":");if(!t||void 0===a)return null;const n=t.trim().toLowerCase(),s=Ee[n]||n,i=a.trim();if(!s)return null;const o=toNumber(i.endsWith("%")?i.slice(0,-1):i,NaN),l=toOptionalBooleanFromYesNo(i);return{key:s,value:Number.isFinite(o)?o:i,balanceState:Number.isFinite(o)?void 0:l}},toBalancePatches=(e={})=>Object.entries(e).filter(([,e])=>void 0!==e).map(([e,t])=>({id:e,have:t})),parseGmcpVitals=(e={})=>{const t=e&&"object"==typeof e&&!Array.isArray(e)?e:{},a=Ce.reduce((e,a)=>({...e,[a]:parseNumericVital(t,a)}),{}),n={balance:toOptionalBooleanFromYesNo(t.bal),equilibrium:toOptionalBooleanFromYesNo(t.eq)};return{kind:Ae,vitals:a,balances:n,balancePatches:toBalancePatches(n),resourceStats:(Array.isArray(t.charstats)?t.charstats:[]).map(parseResourceStat).filter(Boolean)}},toParsedGmcpVitals=(e={})=>"nexsys4.parsed_gmcp_vitals"!==e?.kind?parseGmcpVitals(e):{...e,balancePatches:Array.isArray(e.balancePatches)?e.balancePatches:toBalancePatches(e.balances||{})},hasOwn$4=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),isRecord$3=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),readFirstDefined=(e,t=[])=>{for(const a of t)if(hasOwn$4(e,a)&&void 0!==e[a]&&null!==e[a])return e[a]},parseAffName=(e={})=>{if("string"==typeof e)return e.toLowerCase();if(Array.isArray(e)){const t=e[0];if("string"==typeof t)return t.toLowerCase();const a=t&&"object"==typeof t?t:{};return String(a.affliction||a.defence||a.name||a.aff||a.def||"").toLowerCase()}const t=e&&"object"==typeof e?e:{};return String(t.affliction||t.defence||t.name||t.aff||t.def||"").toLowerCase()},normalizeItemLocation$2=(e={},t=e?.item||e)=>String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),normalizeInventoryDeltaName=e=>"string"==typeof e?e:e?.name||e?.item||"",createInventoryDelta=(e,t={})=>{const a=t?.item||t,n=normalizeItemLocation$2(t,a);return{location:n,inventoryDelta:{id:a?.id??t?.id,location:n,name:normalizeInventoryDeltaName(a),icon:a?.icon??null,attrib:a?.attrib??null,amount:a?.amount??a?.count??a?.qty??t?.amount??t?.count,delta:a?.delta??t?.delta,action:e.split(".").pop(),direction:e.endsWith("remove")?"remove":e.endsWith("add")?"add":void 0},dirtyReason:`gmcp:${e}`}},hasInventoryIdentity=(e={})=>void 0!==e.id&&null!==e.id&&""!==e.id||Boolean(String(e.name||"").trim()),normalizeTargetRecord=(e={})=>{if(!isRecord$3(e))return{};const t={},a=readFirstDefined(e,["id","ID"]),n=readFirstDefined(e,["Text","text","short_desc"]),s=readFirstDefined(e,["HP","hp","hpperc"]);return void 0!==a&&(t.id=a),void 0!==n&&(t.text=n),void 0!==s&&(t.hp=s),t},createGmcpApplier=({emit:e=()=>{}}={})=>{const translate=(e={})=>{const t=[],emitTranslated=(e,a)=>{t.push({topic:e,payload:a})},a=normalizeTag(e.tag||e.rawTag||e.gmcp_method),n=e.payload;switch(a){case"char.vitals":emitTranslated(me.CHAR_VITALS,{vitals:parseGmcpVitals(n||{})});break;case"char.status":emitTranslated(me.CHAR_STATUS,{status:n||{}});break;case"char.afflictions.list":emitTranslated(me.CHAR_AFFLICTIONS_LIST,{afflictions:Array.isArray(n)?n:[]});break;case"char.afflictions.add":{const e=parseAffName(n);e&&emitTranslated(me.CHAR_AFFLICTIONS_ADD,{name:e});break}case"char.afflictions.remove":{const e=parseAffName(n);e&&emitTranslated(me.CHAR_AFFLICTIONS_REMOVE,{name:e});break}case"char.defences.list":emitTranslated(me.CHAR_DEFENCES_LIST,{defences:Array.isArray(n)?n:[]});break;case"char.defences.add":{const e=parseAffName(n);e&&emitTranslated(me.CHAR_DEFENCES_ADD,{name:e});break}case"char.defences.remove":{const e=parseAffName(n);e&&emitTranslated(me.CHAR_DEFENCES_REMOVE,{name:e});break}case"ire.rift.list":emitTranslated(me.IRE_RIFT_LIST,{rift:n||{}});break;case"ire.rift.change":emitTranslated(me.IRE_RIFT_CHANGE,{change:n||{}});break;case"char.items.list":emitTranslated(me.CHAR_ITEMS_LIST,{location:normalizeItemLocation$2(n),items:Array.isArray(n?.items)?n.items:[],itemSnapshotAvailable:Array.isArray(n?.items)});break;case"char.items.add":case"char.items.remove":case"char.items.update":{const e=createInventoryDelta(a,n||{}),t=hasInventoryIdentity(e.inventoryDelta)?e.inventoryDelta:null;emitTranslated(me.CHAR_ITEMS_DELTA,{inventoryDelta:t,dirtyReason:e.dirtyReason});break}case"room.info":emitTranslated(me.ROOM_INFO,{room:{num:n?.num??null,name:String(n?.name??""),exits:{...n?.exits||{}}}});break;case"ire.target.info":emitTranslated(me.TARGET_INFO,{target:normalizeTargetRecord(n||{})})}return t};return{translate,apply(t){translate(t).forEach(({topic:t,payload:a})=>{e(t,a)})}}},we=Object.freeze({inv:fe.ITEM_INV_LIST,room:fe.ITEM_ROOM_LIST}),_e=Object.freeze({inv:Object.freeze({add:fe.ITEM_INV_ADDED,remove:fe.ITEM_INV_REMOVED,update:fe.ITEM_INV_UPDATED}),room:Object.freeze({add:fe.ITEM_ROOM_ADDED,remove:fe.ITEM_ROOM_REMOVED,update:fe.ITEM_ROOM_UPDATED})}),normalizeItemLocation$1=e=>String(e||"").trim().toLowerCase()||"inv",createItemTopicNotifier=({publishPublic:e=()=>{}}={})=>{const notifyList=(t,a)=>{const n=we[normalizeItemLocation$1(t)];n&&e(n,{location:normalizeItemLocation$1(t),items:Array.isArray(a)?a:[]})},notifyDelta=t=>{const a=normalizeItemLocation$1(t.location),n=String(t.action||t.direction||"").trim().toLowerCase(),s=_e[a]?.[n];s&&e(s,t)};return{notify({topic:e,payload:t}={}){e!==me.CHAR_ITEMS_DELTA?e===me.CHAR_ITEMS_LIST&¬ifyList(t?.location,t?.items):t?.inventoryDelta&¬ifyDelta(t.inventoryDelta)}}},Te=new Set([me.ROOM_INFO]),createRoomIngress=({roomModel:e,readHostRoomId:t=()=>null})=>({apply:({topic:a,payload:n={}})=>a===me.ROOM_INFO?e.observeInfo(n.room):a===me.CHAR_ITEMS_LIST&&"room"===n.location&&e.observeItemList({roomId:!1===n.itemSnapshotAvailable?null:t()})}),Me=Object.freeze(["physical","aoe","mental","arcane"]),Pe="avoid",avoidDefId=e=>`avoid ${e}`,normalizeType=e=>String(e||"").trim().toLowerCase(),applyAvoidPostureObserved=({defModel:e,type:t,source:a="text-avoid-observed"})=>{const n=normalizeType(t);if(!Me.includes(n))return!1;const s=avoidDefId(n);return Me.forEach(t=>{const n=avoidDefId(t);n!==s&&e.get(n)?.have&&e.setHave(n,!1,a)}),e.setHave(s,!0,a),!0},clearAvoidPosture=({defModel:e,source:t="gmcp-avoid-absent"})=>{let a=!1;return Me.forEach(n=>{a=e.setHave(avoidDefId(n),!1,t)||a}),a},applyAvoidPostureShift=({defModel:e,balanceModel:t,type:a,source:n="text-avoid-shift"})=>{const s=normalizeType(a);return!!applyAvoidPostureObserved({defModel:e,type:s,source:n})&&(t.lose(Pe,`shift:${s}`),!0)},applyAvoidPostureRecovered=({balanceModel:e,source:t="posture-ready"})=>e.gain(Pe,t),applyAvoidPostureBlocked=({balanceModel:e,source:t="posture-blocked"})=>!!e.have(Pe)&&e.lose(Pe,t),fallbackClone=(e,t=new WeakMap)=>{if(null==e)return e;if("object"!=typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){const a=[];return t.set(e,a),e.forEach(e=>a.push(fallbackClone(e,t))),a}if(e instanceof Set){const a=new Set;return t.set(e,a),[...e].forEach(e=>a.add(fallbackClone(e,t))),a}if(e instanceof Map){const a=new Map;return t.set(e,a),[...e.entries()].forEach(([e,n])=>{a.set(fallbackClone(e,t),fallbackClone(n,t))}),a}const a={};return t.set(e,a),Object.entries(e).forEach(([e,n])=>{"function"!=typeof n&&(a[e]=fallbackClone(n,t))}),a},deepClone$1=e=>{if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return fallbackClone(e)}},deepMerge=(e,t)=>{const a=Array.isArray(e)?[...e]:{...e||{}};return Object.entries(t||{}).forEach(([e,t])=>{!t||"object"!=typeof t||Array.isArray(t)||!a[e]||"object"!=typeof a[e]||Array.isArray(a[e])?a[e]=t:a[e]=deepMerge(a[e],t)}),a},deepFreeze=e=>e&&"object"==typeof e?(Object.isFrozen(e)||(Object.freeze(e),Object.keys(e).forEach(t=>deepFreeze(e[t]))),e):e,createSnapshotCache=({getVersion:e=()=>0,buildSnapshot:t=()=>({})}={})=>{let a=NaN,n=null;return()=>{const s=e();return n&&a===s||(a=s,n=deepFreeze(t())),n}},Oe=Object.freeze(["head","torso","leftarm","rightarm","leftleg","rightleg"]),De=Object.freeze(["healthy","damaged","mangled"]),Re=Object.freeze({healthy:0,damaged:1,mangled:2}),Ne=new Set(De),je=100,Ie=Object.freeze({head:"head",torso:"torso",leftarm:"leftarm",rightarm:"rightarm",leftleg:"leftleg",rightleg:"rightleg"}),Le=Object.freeze({damagedhead:{limb:"head",stage:"damaged"},damagedleftarm:{limb:"leftarm",stage:"damaged"},damagedrightarm:{limb:"rightarm",stage:"damaged"},damagedleftleg:{limb:"leftleg",stage:"damaged"},damagedrightleg:{limb:"rightleg",stage:"damaged"},mangledhead:{limb:"head",stage:"mangled"},mangledleftarm:{limb:"leftarm",stage:"mangled"},mangledrightarm:{limb:"rightarm",stage:"mangled"},mangledleftleg:{limb:"leftleg",stage:"mangled"},mangledrightleg:{limb:"rightleg",stage:"mangled"},mildtrauma:{limb:"torso",stage:"damaged"},serioustrauma:{limb:"torso",stage:"mangled"}}),qe=Object.freeze({brokenleftarm:"leftarm",brokenrightarm:"rightarm",brokenleftleg:"leftleg",brokenrightleg:"rightleg"}),Be=new Set(Object.values(qe)),$e=Object.freeze(["percent","hits","stage","broken"]),normalizeLimbId=e=>{const t=String(e||"").trim().toLowerCase().replace(/\s+/g,"");return Ie[t]||t},normalizeAffName=e=>String(e||"").trim().toLowerCase(),deriveLimbAfflictionState=(e=[])=>{const t={},a={};return Oe.forEach(e=>{t[e]="healthy",a[e]=!1}),e.forEach(e=>{const n=normalizeAffName(e),s=qe[n];if(s)return void(a[s]=!0);const i=Le[n];i&&Re[i.stage]>Re[t[i.limb]]&&(t[i.limb]=i.stage)}),{stages:t,broken:a}},createLimbModel=({now:e=Date.now}={})=>{const t=new Set;let a=0;const n=new Map,s=Oe.reduce((t,a)=>(t[a]={id:a,percent:0,hits:0,stage:"healthy",broken:!1,lastDamageAt:null,updatedAt:e()},t),{}),buildEntrySnapshot=(e={})=>({id:e.id,percent:e.percent,hits:e.hits,stage:e.stage,broken:e.broken,lastDamageAt:e.lastDamageAt,updatedAt:e.updatedAt}),i=new Map,getEntrySnapshot=e=>s[e]?(i.has(e)||i.set(e,createSnapshotCache({getVersion:()=>n.get(e)??0,buildSnapshot:()=>buildEntrySnapshot(s[e])})),i.get(e)()):null,o=createSnapshotCache({getVersion:()=>a,buildSnapshot:()=>Oe.reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),capture=e=>$e.reduce((t,a)=>(t[a]=e[a],t),{}),commitLimbChange=(i,o,{source:l="manual",amount:c,at:u}={})=>{const d=s[i],m=$e.filter(e=>d[e]!==o[e]);if(0===m.length)return!1;d.updatedAt=u??e(),a+=1,n.set(i,(n.get(i)??0)+1);const p={limb:i,changed:m,value:getEntrySnapshot(i),previous:o,source:l,at:d.updatedAt};return void 0!==c&&(p.amount=c),t.forEach(e=>e("LimbUpdated",p)),!0},zeroCounter=e=>{e.percent=0,e.hits=0,e.lastDamageAt=null},isCounterStale=(e,t)=>null!==e.lastDamageAt&&t-e.lastDamageAt>=18e4,expireStale=t=>{const a=Number(t),n=Number.isFinite(a)?a:e();return Oe.reduce((e,t)=>{const a=s[t];if(!isCounterStale(a,n))return e;const i=capture(a);return zeroCounter(a),commitLimbChange(t,i,{source:"idle-expiry",at:n})||e},!1)};return{onChange:e=>(t.add(e),()=>t.delete(e)),list:()=>[...Oe],snapshot:()=>o(),hit:(t,a,n="manual")=>{const i=normalizeLimbId(t),o=s[i],l=Number(a);if(!o||!Number.isFinite(l)||l<=0)return!1;if("mangled"===o.stage)return!1;const c=e(),u=capture(o);return isCounterStale(o,c)&&zeroCounter(o),o.percent=Math.min(je,o.percent+l),o.hits+=1,o.lastDamageAt=c,"torso"===i&&o.percent>=je&&(o.stage="healthy"===o.stage?"damaged":"mangled",zeroCounter(o)),commitLimbChange(i,u,{source:n,amount:l,at:c})},clearDamage:(e,t="manual")=>{const a=normalizeLimbId(e),n=s[a];if(!n)return!1;const i=capture(n);return zeroCounter(n),commitLimbChange(a,i,{source:t})},reset:(e,t="manual")=>{const a=normalizeLimbId(e),n=s[a];if(!n)return!1;const i=capture(n);return n.stage="healthy",n.broken=!1,zeroCounter(n),commitLimbChange(a,i,{source:t})},setStage:(e,t,a="manual")=>{const n=normalizeLimbId(e),i=s[n],o=String(t||"").trim().toLowerCase();if(!i||!Ne.has(o)||i.stage===o)return!1;const l=capture(i);return i.stage=o,zeroCounter(i),commitLimbChange(n,l,{source:a})},setBroken:(e,t,a="manual")=>{const n=normalizeLimbId(e),i=s[n];if(!i)return!1;const o=Boolean(t)&&Be.has(n);if(i.broken===o)return!1;const l=capture(i);return i.broken=o,commitLimbChange(n,l,{source:a})},syncFromAfflictions:(e=[],t="affliction-list")=>{const a=deriveLimbAfflictionState(e);return Oe.reduce((e,n)=>{const i=s[n],o=a.stages[n],l=a.broken[n];if(i.stage===o&&i.broken===l)return e;const c=capture(i);return i.stage!==o&&(i.stage=o,zeroCounter(i)),i.broken=l,commitLimbChange(n,c,{source:t})||e},!1)},expireStale,get:e=>getEntrySnapshot(normalizeLimbId(e))}},buildLimbSnapshot=(e,t)=>{const a=e?.get?.(t);return a?{id:a.id,percent:a.percent,hits:a.hits,stage:a.stage,broken:a.broken}:null},didLimbChange=(e,t)=>Boolean(e&&t)&&(e.percent!==t.percent||e.hits!==t.hits||e.stage!==t.stage||e.broken!==t.broken),syncTorsoTrauma=({affModel:e,serverside:t,stage:a,source:n,at:s})=>{switch(a){case"damaged":return e?.lose?.("serioustrauma",{source:n,at:s}),e?.got?.("mildtrauma",{source:n,at:s}),t?.removePrediction?.("serioustrauma"),t?.addPrediction?.("mildtrauma"),!0;case"mangled":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.got?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.addPrediction?.("serioustrauma"),!0;case"healthy":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.lose?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.removePrediction?.("serioustrauma"),!0;default:return!1}},buildUnknownLimbResult=e=>({changed:!1,traumaSynced:!1,stageChanged:!1,limb:e,before:null,after:null}),buildObserveResult=(e,t,a,n)=>({changed:didLimbChange(t,a)||n,traumaSynced:n,stageChanged:t?.stage!==a?.stage,limb:e,before:t,after:a}),applyObservedLimbHit=({limbModel:e,affModel:t,serverside:a,limb:n,amount:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return buildUnknownLimbResult(l);e.hit(l,s,i);const u=buildLimbSnapshot(e,l);return buildObserveResult(l,c,u,"torso"===l&&c.stage!==u?.stage&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o}))},applyObservedLimbReset=({limbModel:e,limb:t,source:a="manual"})=>{const n=normalizeLimbId(t),s=buildLimbSnapshot(e,n);return s?(e.clearDamage(n,a),buildObserveResult(n,s,buildLimbSnapshot(e,n),!1)):buildUnknownLimbResult(n)},applyObservedLimbStage=({limbModel:e,affModel:t,serverside:a,limb:n,stage:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return buildUnknownLimbResult(l);e.setStage(l,s,i);const u=buildLimbSnapshot(e,l);return buildObserveResult(l,c,u,"torso"===l&&c.stage!==u?.stage&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o}))},applySkillBalanceObserved=({balanceModel:e,balanceId:t,durationMs:a,source:n="nexskill"})=>{const s=String(t||"").trim().toLowerCase(),i=Number(a);return!(!s||!Number.isFinite(i)||i<=0)&&e.observeDuration(s,{durationMs:i,source:n,serverDuration:!1})},ze=new Set(["char.items.add","char.items.remove","char.items.update"]),registerAdapterEvents=({register:e,options:t,queueTranslatedGmcp:a,publishPublic:n,publishPublicScoped:s,markDirty:i,flushCycle:o,outputCycle:l,startup:c,curingSetProvisioner:u,curingSetGuard:d,curingMasterSwitch:m,queueController:p,serverside:g,balanceModel:h,defModel:b,adapter:y,systemModel:v,affModel:S,cacheModel:x,limbModel:k,roomModel:C,savePersistence:A})=>{e("GmcpEvent",e=>{a(e);const s=normalizeTag(e?.tag||e?.rawTag||e?.gmcp_method);!0===t.publishRawGmcp&&n(fe.RAW_GMCP,{source:"adapter-gmcp",tag:s,payload:e?.payload??e?.gmcp_args??null}),ze.has(s)||i("gmcp-buffered")}),e("PromptEvent",()=>{C.completeObservationBlock(),k?.expireStale?.(y?.now?.()??Date.now())&&i("limb-idle-expiry"),o("prompt")}),e("ForcePopulateEvent",()=>o("force"));for(const[E,w]of[["RoomDisplayTextEvent","observeDisplay"],["RoomWallObservedEvent","observeWall"],["RoomGroundObservedEvent","observeGround"]])e(E,e=>C[w](e));e("SystemOutputCompleteEvent",()=>{l.markComplete()&&o("output-complete")}),e(be.CURINGSET_READY,()=>{u?.handleBarrier()}),e(be.STARTUP_BEGIN,()=>{c.handleFenceBegin()}),e(be.STARTUP_COMPLETE,()=>{c.handleFenceComplete("snapshot:complete:text")}),e("QueueFiredTextEvent",e=>{e?.queueName&&p.acknowledgeFired(e.queueName)}),e("QueueSentTextEvent",e=>{const t=e?.queueId||e?.queueName||e?.queueType;t&&p.acknowledgeSent(t,e)}),e("AllQueuesClearedTextEvent",()=>{p.listQueues().forEach(e=>{p.clear(e)})}),e("CommandSeparatorChangedTextEvent",({separator:e}={})=>{const t=normalizeCommandSeparator(e);t&&(y?.setSeparator(t),v?.setSettings({commandSeparator:t},{setBaseline:!0}),A?.())}),e("CharacterResourceTextEvent",(e={})=>{const t=String(e.key||"").trim().toLowerCase();t&&v?.updateResource?.(t,e.value,{numeric:!0,min:e.min,max:e.max,source:e.source||"text-trigger"})&&i(`text:resource:${t}`)}),e("BalanceStateTextEvent",e=>{const t=String(e?.id||"").trim().toLowerCase();if(!t)return;const a=String(e?.reason||e?.source||"text"),n=Number(e?.durationSeconds);if(!0!==e?.have){if(!1===e?.have){if(Number.isFinite(n)&&n>0)return void h.observeServerUse(t,n,{source:a});h.lose(t,a)}}else h.gain(t,a)}),e("SkillBalanceObservedEvent",(e={})=>{applySkillBalanceObserved({balanceModel:h,balanceId:e.id,durationMs:e.durationMs,source:e.reason||e.source||"nexskill"})}),e("AvoidPostureShiftedTextEvent",e=>{applyAvoidPostureShift({defModel:b,balanceModel:h,type:e?.type})&&i(`text:avoid:${String(e?.type||"").toLowerCase()}`)}),e("AvoidPostureObservedTextEvent",e=>{applyAvoidPostureObserved({defModel:b,type:e?.type,source:e?.reason||"text-avoid-observed"})&&i(`text:avoid-observed:${String(e?.type||"").toLowerCase()}`)}),e("AvoidPostureRecoveredTextEvent",()=>{applyAvoidPostureRecovered({balanceModel:h})}),e("AvoidPostureBlockedTextEvent",()=>{applyAvoidPostureBlocked({balanceModel:h})}),e("CacheRiftOutTextEvent",(e={})=>{const t=x?.observeRiftOutText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-out:${t.name}`)}),e("CacheRiftInTextEvent",(e={})=>{const t=x?.observeRiftInText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-in:${t.name}`)}),e("CacheRiftFullTextEvent",(e={})=>{const t=x?.invalidateRiftSnapshot?.({source:e.source||"text-trigger"});y?.sendGmcp?.(["IRE.Rift.Request"],{source:"cache-rift-full-text"}),t&&i("text:cache-rift-resync")}),e("CacheInventoryEmptyTextEvent",(e={})=>{const t=x?.observeInventoryEmptyText?.({item:e.item,source:e.source||"text-trigger"});t?.name&&(i(`text:cache-empty:${t.name}`),y?.sendGmcp?.(["Char.Items.Inv"],{source:"cache-inventory-empty-text",item:e.item||"",name:t.name}))}),e("CacheCurativeConsumedTextEvent",(e={})=>{const t=x?.observeCurativeConsumedText?.({item:e.item,amount:e.amount,source:e.source||"text-trigger"});t?.name&&i(`text:cache-consume:${t.name}`)}),e("CacheInventoryDeltaTextEvent",(e={})=>{const t=x?.observeInventoryDeltaText?.({item:e.item,amount:e.amount,delta:e.delta,source:e.source||"text-trigger"});t?.name&&i(`text:cache-${t.delta>0?"add":"remove"}:${t.name}`)}),e("LimbDamageTextEvent",e=>{const t=applyObservedLimbHit({limbModel:k,affModel:S,serverside:g,limb:e?.limb,amount:e?.amount,source:String(e?.source||"text-trigger"),at:e?.at});t.changed&&"torso"===t.limb&&t.stageChanged&&i(`text-limb-torso:${t.after?.stage||"unknown"}`)}),e("LimbResetTextEvent",e=>{const t=applyObservedLimbReset({limbModel:k,limb:e?.limb,source:String(e?.source||"text-trigger")});t.changed&&i(`text-limb-cleared:${t.limb}`)}),e("ServersideStatusTextEvent",(e={})=>{"enabled"!==String(e.key||"").trim().toLowerCase()?g.parseStatusLine(e):m?.observeConfirmation(Boolean(e.value))}),e("ServersideStatusSnapshotCompleteTextEvent",()=>{g.markStartupCaptured("status")}),e("ServersideAffPrioSnapshotOpenTextEvent",e=>{g.beginObservedAffPrioritySnapshot(e?.set||"")}),e("ServersideAffPrioSnapshotCompleteTextEvent",()=>{g.completeObservedAffPrioritySnapshot()}),e("ServersideDefPrioSnapshotOpenTextEvent",e=>{g.beginObservedDefPrioritySnapshot(e?.set||"")}),e("ServersideDefPrioSnapshotCompleteTextEvent",()=>{g.completeObservedDefPrioritySnapshot()}),e("ServersideAffPrioTextEvent",e=>{if(!e?.aff)return;const t=Number(e.prio),a=g.updateObservedAffPriority(e.aff,t);if("live-confirmation"===e.source){const n="function"==typeof S?.normalizePriorityName?S.normalizePriorityName(e.aff):String(e.aff||"").toLowerCase();s(fe.SERVERSIDE_AFF_PRIORITY_SET,{id:n,priority:t,source:"live-confirmation",accepted:a},n)}}),e("ServersideDefPrioTextEvent",e=>{if(!e?.def)return;const t=String(e.def||"").toLowerCase(),a=Number(e.prio),n=g.updateObservedDefPriority(t,a);"live-confirmation"===e.source&&s(fe.SERVERSIDE_DEF_PRIORITY_SET,{id:t,priority:a,source:"live-confirmation",accepted:n},t)}),e("ServersideQueueListTextEvent",e=>{g.updateObservedQueue(e?.queue||[])}),e("ServersidePredictionsTextEvent",e=>{g.updateObservedPredictions(e?.predictions||{})}),e("ServersidePredictionConfirmTextEvent",(e={})=>{g.confirmPrediction?.(e.aff)}),e("ServersideCuringSetsTextEvent",e=>{g.observeCuringSets({sets:e?.sets||[],activeSet:e?.activeSet||"",used:e?.used,limit:e?.limit})}),e("ServersideCuringSetSwitchedTextEvent",e=>{d?.handleSwitched({set:e?.set||""})})},Fe={short:{rl:"right leg",ll:"left leg",ra:"right arm",la:"left arm",h:"head",tt:"torso",c:"centre",l:"left",r:"right"},long:{"right leg":"rl","left leg":"ll","right arm":"ra","left arm":"la",head:"h",torso:"tt",centre:"c",left:"l",right:"r"}},Ge=["e","w","s","n","ne","se","sw","nw","in","out","d","u"],He={e:"east",w:"west",s:"south",n:"north",ne:"northeast",se:"southeast",sw:"southwest",nw:"northwest",in:"in",out:"out",down:"down",d:"down",u:"up",up:"up"},Ue={e:"west",w:"east",s:"north",n:"south",ne:"southwest",se:"northwest",sw:"northeast",nw:"southeast",in:"out",out:"in",down:"up",d:"up",u:"down",up:"down"},Ve={east:"e",west:"w",south:"s",north:"n",northeast:"ne",northwest:"nw",southeast:"se",southwest:"sw",in:"in",out:"out",down:"d",up:"up"},Ye=["Alchemist","Apostate","Bard","Blademaster","Depthswalker","Dragon","Druid","Infernal","Jester","Magi","Monk","Shikudo","Occultist","Paladin","Pariah","Priest","Psion","Runewarden","Sentinel","Serpent","Shaman","Sylvan","Unnamable","Air Elemental Lord","Earth Elemental Lord","Fire Elemental Lord","Water Elemental Lord"],normalizeClassName=(e="")=>{const t=String(e||"").trim();return t?/\bdragon\b/i.test(t)?"Dragon":Ye.find(e=>e.toLowerCase()===t.toLowerCase())||t:""},classesMatch=(e="",t="")=>normalizeClassName(e).toLowerCase()===normalizeClassName(t).toLowerCase(),classListIncludes=(e=[],t="")=>{const a=Array.isArray(e)?e:e?[e]:[];if(!a.length)return!0;const n=normalizeClassName(t).toLowerCase();return a.some(e=>normalizeClassName(e).toLowerCase()===n)},hasOwn$3=(e,t)=>Object.prototype.hasOwnProperty.call(e||{},t),normalizeCommandList=e=>{if(Array.isArray(e))return e.map(e=>String(e||"").trim()).filter(Boolean);if(e){const t=String(e).trim();return t?[t]:[]}return[]},normalizeStringList=e=>{if(Array.isArray(e))return e.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean);if(e){const t=String(e).trim().toLowerCase();return t?[t]:[]}return[]},normalizePrioritySeed=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},normalizeDefenseConfig=(e={})=>{const t=!1!==e.serverside;return deepFreeze({...deepClone$1(e),command:normalizeCommandList(e.command),stopCommand:normalizeCommandList(e.stopCommand),bals_req:normalizeStringList(e.bals_req),bals_used:normalizeStringList(e.bals_used),stopBals_req:normalizeStringList(e.stopBals_req),stopBals_used:normalizeStringList(e.stopBals_used),blocks:deepClone$1(e.blocks||[]),stopBlocks:deepClone$1(e.stopBlocks||[]),skills:normalizeStringList(e.skills),opps:normalizeStringList(e.opps),serverside:t,preempt:!0===e.preempt,static:!0===e.static,clientOnly:!0===e.clientOnly,trackOnly:!0===e.trackOnly,defaultPriority:normalizePrioritySeed(e.defaultPriority)})},createDefEntry=(e,t,a,n)=>({id:e,have:!1,lastChangeAt:0,order:t,seedStatic:a.static,defaultPriority:n,priorityOverride:null,staticRequested:!1,command:a.command,stopCommand:a.stopCommand,bals_req:a.bals_req,bals_used:a.bals_used,stopBals_req:a.stopBals_req,stopBals_used:a.stopBals_used,blocks:a.blocks,stopBlocks:a.stopBlocks,skills:a.skills,opps:a.opps,serverside:a.serverside,preempt:a.preempt,static:a.static,clientOnly:a.clientOnly,trackOnly:a.trackOnly}),resolveDefensePriority=(e={})=>null===e.priorityOverride||void 0===e.priorityOverride?Number(e.defaultPriority??-1):Number(e.priorityOverride),matchesClass=(e=[],t="")=>!e||!e.length||(Array.isArray(t)?t.some(t=>classListIncludes(e,t)):classListIncludes(e,t)),isActiveStaticPriority=e=>{const t=Number(e);return Number.isFinite(t)&&t>0},isActiveDefensePriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=25},createInitialDefenseState=({defTable:e={},defPrios:t={}}={})=>{const a=Object.keys(e),n={},s={};return a.forEach((a,i)=>{const o=normalizeDefenseConfig(e[a]),l=hasOwn$3(t,a)?normalizePrioritySeed(t[a]):o.defaultPriority;s[a]=l,n[a]=createDefEntry(a,i,o,l)}),{list:a,state:n,defaultPrios:s}},normalizeObservedDefenseId=e=>("string"==typeof e?e:String(e?.name||e?.id||e||"")).toLowerCase().replace(/\s*\(([^)]+)\)/g," $1").trim(),normalizeItemLocation=e=>String(e||"").trim().toLowerCase()||"inv",registerGmcpBridges=({registerGmcpListener:e,systemModel:t,balanceModel:a,affModel:n,defModel:s,cacheModel:i,limbModel:o,serverside:l,markDirty:c})=>{const syncLimbsFromAfflictions=e=>{o.syncFromAfflictions(n.currentSorted(),e)};e(me.CHAR_VITALS,({vitals:e}={})=>{t.updateVitals(e),a.applyVitals(e),c("gmcp:vitals")}),e(me.CHAR_STATUS,({status:e}={})=>{t.updateStatus(e||{}),c("gmcp:status")}),e(me.CHAR_AFFLICTIONS_LIST,({afflictions:e}={})=>{const t=Array.isArray(e)?e:[];n.applyList(t),syncLimbsFromAfflictions("gmcp-list"),c("gmcp:aff-list")}),e(me.CHAR_AFFLICTIONS_ADD,({name:e}={})=>{e&&(n.got(e,{source:"gmcp-add"}),syncLimbsFromAfflictions("gmcp-add"),c(`gmcp:aff-add:${e}`))}),e(me.CHAR_AFFLICTIONS_REMOVE,({name:e}={})=>{e&&(n.lose(e,{source:"gmcp-remove"}),syncLimbsFromAfflictions("gmcp-remove"),l.getTransientPrioAff()===e&&l.clearPrioAff(),c(`gmcp:aff-remove:${e}`))}),e(me.CHAR_DEFENCES_LIST,({defences:e}={})=>{const t=Array.isArray(e)?e:[];s.applyList(t,"gmcp-list"),t.some(e=>"avoid"===normalizeObservedDefenseId(e))||clearAvoidPosture({defModel:s,source:"gmcp-avoid-list-absent"}),c("gmcp:def-list")}),e(me.CHAR_DEFENCES_ADD,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);if(t){if(t.startsWith("parrying "))for(const e of s.list())e!==t&&e.startsWith("parrying ")&&s.get(e)?.have&&s.setHave(e,!1,"gmcp-parry-implied-remove");s.setHave(t,!0,"gmcp-add"),c(`gmcp:def-add:${t}`)}}),e(me.CHAR_DEFENCES_REMOVE,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);t&&("avoid"===t?clearAvoidPosture({defModel:s,source:"gmcp-avoid-remove"}):s.setHave(t,!1,"gmcp-remove"),c(`gmcp:def-remove:${t}`))}),e(me.IRE_RIFT_LIST,({rift:e}={})=>{i.observeRiftSnapshot?.(e||{}),c("gmcp:rift-list")}),e(me.IRE_RIFT_CHANGE,({change:e}={})=>{const t=i.observeRiftChange?.(e||{});t?.name&&c(`gmcp:rift-change:${t.name}`)}),e(me.CHAR_ITEMS_LIST,({items:e,location:a}={})=>{const n=normalizeItemLocation(a),s=Array.isArray(e)?e:[];if("inv"===n){i.observeInventorySnapshot?.(s);const toWieldedItem=e=>e?{id:e.id??null,name:String(e.name||""),icon:e.icon||null}:null;t.updateWielded("left",toWieldedItem(s.find(e=>"l"===e.attrib))),t.updateWielded("right",toWieldedItem(s.find(e=>"L"===e.attrib)))}c("gmcp:items-list")}),e(me.CHAR_ITEMS_DELTA,({inventoryDelta:e}={})=>{if(e){const a=normalizeItemLocation(e.location),n="inv"===a||"room"===a?i.observeItemDelta?.(e):null;if(n?.changed&&n.name&&c(`gmcp:room-pickup:${n.name}`),"inv"===a&&"update"===e.action){const{id:a,name:n,icon:s,attrib:i}=e,o=t.getChar().wielded;o.left?.id===a&&"l"!==i&&t.updateWielded("left",null),o.right?.id===a&&"L"!==i&&t.updateWielded("right",null),"l"===i?t.updateWielded("left",{id:a,name:n,icon:s}):"L"===i&&t.updateWielded("right",{id:a,name:n,icon:s})}}}),e(me.TARGET_INFO,({target:e}={})=>{t.updateTarget(e||{}),c("gmcp:target")})},normalizeBridgeSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),isSystemOutputBalance=(e={})=>"systemoutput"===normalizeBridgeSegment(e?.id),Qe=Object.freeze(["balance","equilibrium"]),getCounterpartEqbalBalance=e=>{const t=normalizeBridgeSegment(e);return Qe.includes(t)?"balance"===t?"equilibrium":"balance":null},buildEqbalRecoveredPayload=(e,t={})=>{const a=normalizeBridgeSegment(t?.id),n=getCounterpartEqbalBalance(a);return n&&e?.have?.(a)&&e.have(n)?{...t,id:"eqbal",have:!0,recoveredId:a,balances:{balance:Boolean(e.have("balance")),equilibrium:Boolean(e.have("equilibrium"))}}:null},getRecoveredBalanceSeconds=(e={})=>{const t=Number(e?.durationMs);if(Number.isFinite(t)&&t>0)return t/1e3;const a=Number(e?.lastLostAtMs),n=Number(e?.lastGotAtMs);return Number.isFinite(a)&&Number.isFinite(n)&&n>a?(n-a)/1e3:Number(e?.durationSeconds??e?.baseDurationSeconds)},formatBalanceNotice=(e={})=>{const t=String(e?.id||"").trim(),a=getRecoveredBalanceSeconds(e);return t?!Number.isFinite(a)||a<=0?t:`${t}(${a.toFixed(2)})`:""},isCountableAffliction=(e={})=>Number(e?.max)>1,formatAfflictionNotice=(e={})=>{const t=String(e?.name||"").trim();if(!t)return"";const a=Number(e?.count);return isCountableAffliction(e)&&Number.isFinite(a)?`${t}(${a})`:t},shouldEchoPriorityChange=(e={})=>["manual","public-api"].includes(String(e?.source||"").toLowerCase()),formatPriorityNotice=(e={},t)=>{const a=String(t||"").trim(),n=Number(e?.priority??e?.value),s=normalizeBridgeSegment(e?.domain),i=s&&"keepup"!==s?` (${s})`:!0===e?.static?" (static)":"";return a?Number.isFinite(n)?`${a} ${n}${i}`:`${a}${i}`:""},We=Object.freeze({RuleAdded:fe.RULE_ADDED,RuleRemoved:fe.RULE_REMOVED,RuleEnabled:fe.RULE_ENABLED,RuleDisabled:fe.RULE_DISABLED,RulePackLoaded:fe.RULE_PACK_LOADED,RulePackUnloaded:fe.RULE_PACK_UNLOADED,RuleOrderChanged:fe.RULE_ORDER_CHANGED}),Ke=Object.freeze({hp:{topic:fe.SYSTEM_HEALTH_CHANGED,maxKey:"maxhp"},mp:{topic:fe.SYSTEM_MANA_CHANGED,maxKey:"maxmp"},rage:{topic:fe.SYSTEM_RAGE_CHANGED},bleed:{topic:fe.SYSTEM_BLEED_CHANGED}}),buildVitalResourcePayload=(e={},t,{maxKey:a}={})=>{const n=e.changedFields?.[t];if(!n)return null;const s=n.current,i=n.previous;return{max:a?e.current?.[a]:s,current:s,previous:i,diff:s-i}},publishVitalResourceTopics=(e,t={})=>{Object.entries(Ke).forEach(([a,n])=>{const s=buildVitalResourcePayload(t,a,n);s&&e(n.topic,s)})},registerSystemModelBridge=({registerModelListener:e,publishPublic:t,syncDebugMode:a,systemModel:n,serverside:s,handleVitalsSideEffects:i})=>{e(n.onChange((e,n={})=>{switch(e){case"VitalsUpdated":t(fe.SYSTEM_VITALS_CHANGED,n),publishVitalResourceTopics(t,n),i();break;case"StatusUpdated":t(fe.SYSTEM_STATUS_CHANGED,n);break;case"ClassChanged":s.setBaselineFromRuntime(),t(fe.SYSTEM_CLASS_CHANGED,n);break;case"TargetUpdated":t(fe.SYSTEM_TARGET_CHANGED,n);break;case"RuntimeStateChanged":t(fe.SYSTEM_RUNTIME_CHANGED,n);break;case"PauseStateChanged":t(fe.SYSTEM_PAUSE_CHANGED,n),t(n.paused?fe.SYSTEM_PAUSED:fe.SYSTEM_UNPAUSED,n);break;case"SettingsChanged":n.changedKeys?.includes("debug")&&a(),t(fe.SYSTEM_SETTINGS_CHANGED,n);break;case"BaselineIntentChanged":t(fe.SYSTEM_BASELINE_CHANGED,n);break;case"WieldedUpdated":t(fe.SYSTEM_WIELDED_CHANGED,n);break;case"MountUpdated":t(fe.SYSTEM_MOUNT_CHANGED,n);break;case"DeathDetected":t(fe.SYSTEM_DEATH_DETECTED,n)}}))},registerAfflictionModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:s,affModel:i,serverside:o,runtimeControl:l})=>{e(i.onChange((e,c={})=>{if(("AffGot"===e||"AffLost"===e)&&"aeon"===c?.name){const e=i.haveAff("aeon");s.setRuntime({aeonLocked:e}),l?.setSlowMode(e,{source:"aeon"})}switch(e){case"AffGot":a(fe.AFF_GOT,c,c.name),n.publish("affGot",formatAfflictionNotice(c),{...c,action:"got"});break;case"AffLost":a(fe.AFF_LOST,c,c.name),n.publish("affLost",c.name,{...c,action:"lost"}),o.getTransientPrioAff()===c.name&&o.clearPrioAff();break;case"AffStackChanged":{a(fe.AFF_STACK_CHANGED,c,c.name);const e=Number(c.count),t=Number(c.previousCount);if(Number.isFinite(e)&&Number.isFinite(t)&&e>0&&t>0&&e!==t){const a=e>t,s=Math.max(e,t);n.publish(a?"affGot":"affLost",formatAfflictionNotice({...c,count:s}),{...c,action:a?"got":"lost"})}break}case"AffPriorityChanged":t(fe.AFF_PRIORITY_CHANGED,c),shouldEchoPriorityChange(c)&&n.publish("priority",formatPriorityNotice(c,c.name),{...c,action:"set",subject:"aff"})}}))},registerDefenseModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:s})=>{e(s.onChange((e,s={})=>{switch(e){case"DefGot":a(fe.DEF_GOT,s,s.id),n.publish("defGot",s.id,{...s,action:"got"});break;case"DefLost":a(fe.DEF_LOST,s,s.id),n.publish("defLost",s.id,{...s,action:"lost"});break;case"DefPriorityChanged":t(fe.DEF_PRIORITY_CHANGED,s),shouldEchoPriorityChange(s)&&n.publish("priority",formatPriorityNotice(s,s.id),{...s,action:"set",subject:"def"})}}))},registerBalanceModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:s})=>{e(s.onChange((e,i={})=>{switch(e){case"BalanceGot":a(fe.BALANCE_GOT,i,i.id);{const e=buildEqbalRecoveredPayload(s,i);e&&t(fe.EQBAL_GOT,e)}isSystemOutputBalance(i)||n.publish("balanceRecovered",formatBalanceNotice(i),{...i,action:"got"});break;case"BalanceLost":a(fe.BALANCE_LOST,i,i.id),n.publish("balanceLost",i.id,{...i,action:"lost"});break;case"BalanceReset":a(fe.BALANCE_RESET,i,i.id);break;case"BalanceDurationObserved":a(fe.BALANCE_DURATION_OBSERVED,i,i.id);break;case"BalanceLossTimerRestarted":t(fe.BALANCE_TIMER_RESTARTED,i)}}))},registerLimbModelBridge=({registerModelListener:e,publishPublicScoped:t,limbModel:a})=>{e(a.onChange((e,a={})=>{"LimbUpdated"===e&&t(fe.LIMB_UPDATED,a,a.limb)}))},registerCacheModelBridge=({registerModelListener:e,publishPublic:t,cacheModel:a})=>{e(a.onChange((e,a={})=>{switch(e){case"CacheAmountChanged":t(fe.CACHE_AMOUNT_CHANGED,a);break;case"CacheInventoryListApplied":t(fe.CACHE_INVENTORY_LIST,a);break;case"CacheRiftListApplied":t(fe.CACHE_RIFT_LIST,a);break;case"CacheDesiredPrecacheChanged":t(fe.CACHE_PRECACHE_CHANGED,a)}}))},registerQueueModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:s})=>{e(s.onChange((e,i={})=>{switch(e){case"QueueFlushed":t(fe.QUEUE_FLUSHED,i),n.publish("output",`Queue sent: ${i.queueId}`,i);break;case"QueueDeferred":t(fe.QUEUE_DEFERRED,i);break;case"QueueUpdated":t(fe.QUEUE_UPDATED,i);break;case"QueueCleared":t(fe.QUEUE_CLEARED,i);break;case"QueueSentAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueName||i.queueId;a(fe.QUEUE_SENT,{...i,queueName:e},e);break}case"QueueFiredAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueId;t(fe.QUEUE_FIRED_ACK,i),a(fe.QUEUE_FIRED,{...i,queueName:e},e);break}}}))},registerServersideModelBridge=({registerModelListener:e,publishPublic:t,serverside:a,onServersideDirty:n})=>{e(a.onChange((e,a={})=>{switch(e){case"ServersideDirty":n?.(a),t(fe.SERVERSIDE_DIRTY,a);break;case"ServersideEvaluated":t(fe.SERVERSIDE_EVALUATED,a)}}))},registerTrackableModelBridge=({registerModelListener:e,noticeCenter:t,trackableModel:a,onTrackableDirty:n})=>{"function"==typeof a?.onChange&&e(a.onChange((e,a={})=>{switch(e){case"TrackableGot":t.publish("trackableGot",a.label||a.name,{...a,action:"got"}),n?.(`trackable:${a.name||"unknown"}:got`);break;case"TrackableRefreshed":n?.(`trackable:${a.name||"unknown"}:refreshed`);break;case"TrackableLost":t.publish("trackableLost",a.label||a.name,{...a,action:"lost"}),n?.(`trackable:${a.name||"unknown"}:lost`)}}))},registerRulesModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,rules:n,runtimeControl:s,systemModel:i,onRulesDirty:o})=>{let l=new Set;const syncRuleSuspendPause=(e=[])=>{l=new Set((e||[]).filter(Boolean).map(e=>String(e)));const t=l.size>0;i?.getRuntime?.().rulesSuspended!==t&&(i?.setRuntime?.({rulesSuspended:t}),s?.syncCuringState?.({source:"rule-suspend"}))},addRuleSuspend=e=>{e&&!l.has(String(e))&&syncRuleSuspendPause([...l,String(e)])},removeRuleSuspend=e=>{if(!e||!l.has(String(e)))return;const t=new Set(l);t.delete(String(e)),syncRuleSuspendPause([...t])};e(n.onChange((e,n={})=>{const s=We[e];if(s)t(s,n);else switch(e){case"RulesDirty":o?.(n.reason||"rules-dirty");break;case"RulesEvaluated":syncRuleSuspendPause(n.suspendingRules||[],n.source);break;case"RuleSuspendActivated":addRuleSuspend(n.id);break;case"RuleSuspendDeactivated":removeRuleSuspend(n.id);break;case"RuleActivated":n.suspendsCuring&&addRuleSuspend(n.id),a(fe.RULE_ACTIVATED,n,n.id);break;case"RuleDeactivated":n.suspendsCuring&&removeRuleSuspend(n.id),a(fe.RULE_DEACTIVATED,n,n.id)}}))},registerModelEventBridges=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,syncDebugMode:s,systemModel:i,affModel:o,defModel:l,balanceModel:c,cacheModel:u,limbModel:d,trackableModel:m,queueController:p,rules:g,serverside:h,runtimeControl:b,handleVitalsSideEffects:y,onServersideDirty:v,onRulesDirty:S})=>{registerSystemModelBridge({registerModelListener:e,publishPublic:t,syncDebugMode:s,systemModel:i,serverside:h,handleVitalsSideEffects:y}),registerAfflictionModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:i,affModel:o,serverside:h,runtimeControl:b}),registerDefenseModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:l}),registerBalanceModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:c}),registerLimbModelBridge({registerModelListener:e,publishPublicScoped:a,limbModel:d}),registerCacheModelBridge({registerModelListener:e,publishPublic:t,cacheModel:u}),registerQueueModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:p}),registerServersideModelBridge({registerModelListener:e,publishPublic:t,serverside:h,onServersideDirty:v}),registerTrackableModelBridge({registerModelListener:e,noticeCenter:n,trackableModel:m,onTrackableDirty:S}),registerRulesModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,rules:g,runtimeControl:b,systemModel:i,onRulesDirty:S})},Xe=new Set(["dragon","air elemental lord","earth elemental lord","fire elemental lord","water elemental lord"]),registerCrossModelBridges=({registerModelListener:e,systemModel:t,defModel:a})=>{e(t.onChange((e,t={})=>{"ClassChanged"===e&&Xe.has(String(t?.class||"").toLowerCase())&&a.setHave("mounted",!1,"class-change")}))},registerRoomModelBridge=({registerModelListener:e,roomModel:t,defModel:a,publishPublic:n,markDirty:s})=>{e(t.onChange((e,t)=>{"RoomUpdated"===e?(a.setHave("flying",t.current.name.startsWith("Flying above "),"room-info"),n(fe.ROOM_CHANGED,t),s("room:identity")):"RoomFeaturesUpdated"===e&&(n(fe.ROOM_FEATURES_CHANGED,t),s(`room:features:${t.source}`))}))},createRuntimeEventWiring=({adapter:e,internalEvents:t,publicEvents:a})=>{let n=[];const addUnsubscriber=e=>{"function"==typeof e&&n.push(e)},dispose=()=>{n.forEach(e=>{try{e()}catch(t){console.error("nexSys4 unsubscribe failure",t)}}),n=[]};return{attach:({options:n,queueTranslatedGmcp:s,publishPublic:i,publishPublicScoped:o,noticeCenter:l,syncDebugMode:c,systemModel:u,affModel:d,defModel:m,balanceModel:p,cacheModel:g,limbModel:h,trackableModel:b,roomModel:y,queueController:v,rules:S,serverside:x,markDirty:k,invalidateOutput:C,flushCycle:A,outputCycle:E,startup:w,curingSetProvisioner:_,curingSetGuard:T,curingMasterSwitch:M,runtimeControl:P,savePersistence:O})=>{dispose();const register=(t,a)=>{addUnsubscriber(e.on(t,a))},registerModelListener=e=>{addUnsubscriber(e)},registerGmcpListener=(e,a)=>{registerModelListener(t.on(e,a))},registerPublicListener=(e,t)=>{registerModelListener(a.on(e,t))},registerInventoryResync=(t,a)=>{registerPublicListener(t,()=>{e?.sendGmcp?.(["Char.Items.Inv"],{source:a})})};registerInventoryResync(`${fe.AFF_LOST}.blindness`,"cache-visibility-resync:blindness"),registerInventoryResync(`${fe.AFF_LOST}.blackout`,"cache-visibility-resync:blackout"),registerInventoryResync(`${fe.AFF_LOST}.addiction`,"cache-visibility-resync:addiction"),registerInventoryResync(`${fe.DEF_GOT}.mindseye`,"cache-visibility-resync:mindseye"),registerInventoryResync(`${fe.DEF_LOST}.blindness`,"cache-visibility-resync:blindness"),registerAdapterEvents({register,options:n,queueTranslatedGmcp:s,publishPublic:i,publishPublicScoped:o,markDirty:k,flushCycle:A,outputCycle:E,startup:w,curingSetProvisioner:_,curingSetGuard:T,curingMasterSwitch:M,runtimeControl:P,queueController:v,serverside:x,balanceModel:p,defModel:m,adapter:e,systemModel:u,affModel:d,cacheModel:g,limbModel:h,roomModel:y,savePersistence:O}),register("OutboundCommandsEvent",(e={})=>{if("output-cycle"!==e?.context?.source)return;const t=Array.isArray(e.commands)?e.commands.filter(Boolean).map(e=>String(e)):[];if(!t.length)return;const a=u.getSettings().commandSeparator||"|";l.publish("output",`(${t.join(a)})`,{action:"commands",commands:t,source:e?.context?.cycleSource||e?.context?.source||"output-cycle"})}),registerGmcpBridges({registerGmcpListener,systemModel:u,balanceModel:p,affModel:d,defModel:m,cacheModel:g,limbModel:h,serverside:x,markDirty:k}),registerModelEventBridges({registerModelListener,publishPublic:i,publishPublicScoped:o,noticeCenter:l,syncDebugMode:c,systemModel:u,affModel:d,defModel:m,balanceModel:p,cacheModel:g,limbModel:h,trackableModel:b,queueController:v,rules:S,serverside:x,runtimeControl:P,handleVitalsSideEffects:P.handleVitalsSideEffects,onServersideDirty:C,onRulesDirty:k}),registerCrossModelBridges({registerModelListener,systemModel:u,defModel:m}),registerRoomModelBridge({registerModelListener,roomModel:y,defModel:m,publishPublic:i,markDirty:k})},dispose}},createRuntimeControlApi=({systemModel:e,rules:t,queueController:a,noticeCenter:n,markDirty:s,onResume:i,dispatchCommands:o,curingMasterSwitch:l})=>{let c=!1;const u=new Set(e.getRuntime().slowMode?["manual"]:[]),buildSystemEventCommand=e=>e?`echo SystemEvent ${e}`:null,syncServersideCuring=(e,t={})=>{if("function"!=typeof o)return[];const a=e?"curing off":"curing on";if(e&&!1===l?.getObservedEnabled())return[];if(!e&&!0===l?.getObservedEnabled())return[];l?.markExpected(a);const n=buildSystemEventCommand(t.completionEvent);return o(n?[a,n]:[a],{source:t.source||(e?"runtime-pause":"runtime-unpause")})},syncCuringState=(t={})=>{const a=e.getRuntime();return syncServersideCuring(a.paused||a.rulesSuspended,t)},setPaused=(t,n={})=>{const o=Boolean(t),l=e.getRuntime();return l.paused===o?(n.forceCuringSync&&syncCuringState(n),!1):!(!o&&!isRuntimeReadyPhase(l.phase))&&(e.setRuntime({paused:o}),s(o?"paused":"unpaused"),syncCuringState(n),o||(a.flushDeferred(),i?.(n.source||"unpause")),!0)},ensureSlowModeRule=()=>{t.lifecycle.add({id:"runtime-slow-mode",pack:"runtime",evaluate:()=>e.getRuntime().slowMode?{settings:{sipHealthAt:30,sipManaAt:20,mossHealthAt:20,mossManaAt:20,batch:!1}}:null})};return{setPaused,syncCuringState,setSlowMode(t,a={}){const n=a.source||"manual";t?u.add(n):u.delete(n);const i=u.size>0;return e.getRuntime().slowMode!==i&&(e.setRuntime({slowMode:i}),ensureSlowModeRule(),s(i?"slow-on":"slow-off"),!0)},handleVitalsSideEffects(){const t=e.getChar().dead;t&&!c&&(setPaused(!0,{source:"death-detected"}),n.publish("output","Death detected. Pausing nexSys runtime.",{source:"death-detected"})),!t&&c&&(setPaused(!1,{source:"death-recover"}),n.publish("output","Resurrection detected. Resuming nexSys runtime.",{source:"death-recover"})),c=t}}},Je="curing on",Ze="curing off",createCuringMasterSwitch=({setPaused:e,noticeCenter:t})=>{let a=null,n=null;return{getObservedEnabled:()=>a,markExpected(e){const t=String(e||"").trim().toLowerCase();return(t===Je||t===Ze)&&(n=t,!0)},observeConfirmation(s){const i=Boolean(s);return a=i,n===(i?Je:Ze)?(n=null,{attributed:!0,enabled:i}):(n=null,i?e(!1,{source:"user-curing-on"}):(e(!0,{source:"user-curing-off"}),t.publish("output","Manual `curing off` detected. nexSys is paused and will not re-enable curing; send `curing on` to resume.",{source:"user-curing-off"})),{attributed:!1,enabled:i})}}},createCuringSetGuard=({serverside:e,systemModel:t,noticeCenter:a})=>{let n=!1,s=!1;const isRunningSession=()=>isRuntimeReadyPhase(t.getRuntime().phase),markNexsysSwitch=()=>{s=!0},unload=({remove:t=!0}={})=>{const a=e.getCuringSets?.()??{},s=(a.sets||[]).map(e=>normalizeSetName(e)).filter(Boolean),i=normalizeSetName(a.priorSet),o=i&&"nexsys4-default"!==i&&s.includes(i)?i:s.find(e=>e&&"nexsys4-default"!==e)||"",l=[];o&&(markNexsysSwitch(),e.switchCuringSet(o),l.push(`curingset switch ${o}`));const c=t||!o;return c&&(e.deleteCuringSet(Se),l.push(`curingset delete ${Se}`)),n=!1,{restoreTarget:o,removed:c,commands:l}};return{handleSwitched:({set:t}={})=>{const i=normalizeSetName(t);if(!i)return;const o=s;s=!1,e.observeActiveCuringSet?.(i),isRunningSession()&&("nexsys4-default"!==i?o||n||(n=!0,a.publish("output",`nexSys paused — curing set is now ${i}; nexSys operates only in ${Se} and will resume when you switch back.`,{source:"curingset-foreign",force:!0})):n&&(n=!1,a.publish("output",`nexSys resumed — curing set is back to ${Se}.`,{source:"curingset-foreign-resume",force:!0})))},markNexsysSwitch,unload,isForeignPaused:()=>n}},isRecord$2=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),isSupportedPersistenceSchemaVersion=e=>2===Number(e),createEmptyPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:{},affSettings:{defaults:{}},defSettings:{defaults:{},static:{}},cacheSettings:{precache:{}}}),et=t.z.record(t.z.string(),t.z.unknown()).catch(()=>({})),tt=t.z.object({schemaVersion:t.z.coerce.number().refine(isSupportedPersistenceSchemaVersion),systemSettings:et,affSettings:t.z.object({defaults:et}).catch(()=>({defaults:{}})),defSettings:t.z.object({defaults:et,static:et}).catch(()=>({defaults:{},static:{}})),cacheSettings:t.z.object({precache:et}).catch(()=>({precache:{}}))}),normalizePersistenceSnapshot=(e,{assumeCurrentVersion:t=!1}={})=>{const a=t&&isRecord$2(e)&&null==e.schemaVersion?{...e,schemaVersion:2}:e,n=tt.safeParse(a);return n.success?n.data:createEmptyPersistenceSnapshot()},createRuntimePersistenceApi=({persistence:e,systemModel:t,affModel:a,defModel:n,cacheModel:s,serverside:i,syncDebugMode:o,markDirty:l})=>{const c=0,u=26,d={hasStoredSnapshot:!1,sourceKey:e?.key||"nexSys4Settings"},sanitizeSystemSettings=(e={})=>{const{customPromptEnabled:t,prompt:a,...n}=e||{},s=normalizeCommandSeparator(n.commandSeparator);if(s?n.commandSeparator=s:delete n.commandSeparator,n.ss&&"object"==typeof n.ss){const{enabled:e,...t}=n.ss;n.ss=t}return n},normalizePersistedDefPriority=e=>{const t=Number(e);return Number.isInteger(t)?t<c?c:t>u?u:t:c},buildAffDefaultMap=()=>a.list().reduce((e,t)=>(e[t]=a.getDefaultPriority(t),e),{}),countablePriorityNameSet=()=>new Set(a.getCountablePriorityNames?.()||[]),buildDefDefaultMap=()=>Object.entries(n.getDefaultPriorities()).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),buildDefStaticOverrideMap=()=>({...n.getStaticOverrides?.()||{}}),buildCacheDefaultSnapshot=()=>s.getDesiredPrecache(),isValidServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},normalizeStoredAffDefaults=(e={})=>{const t=countablePriorityNameSet();return Object.entries(e).reduce((e,[n,s])=>{const i="function"==typeof a.normalizePriorityName?a.normalizePriorityName(n):String(n||"").trim().toLowerCase();if(!i)return e;if(t.has(i))return e;const o=a.getDefaultPriority(i);return isValidServersideAffPriority(o)&&!isValidServersideAffPriority(s)?(e[i]=o,e):(e[i]=s,e)},{})},normalizeStoredDefPriorities=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),normalizeStoredDefStatics=(e={})=>Object.entries(e).reduce((e,[t,a])=>(!0!==a&&!1!==a||(e[t]=a),e),{}),buildPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:sanitizeSystemSettings(t.getSettings()),affSettings:{defaults:buildAffDefaultMap()},defSettings:{defaults:buildDefDefaultMap(),static:buildDefStaticOverrideMap()},cacheSettings:{precache:buildCacheDefaultSnapshot()}}),applyStoredSnapshot=(e={})=>{const l=sanitizeSystemSettings(e.systemSettings||{});t.setSettings(l,{setBaseline:!0}),t.setBaselineIntent({ss:l.ss||{}});const c=e.affSettings?.defaults;c&&Object.entries(normalizeStoredAffDefaults(c)).forEach(([e,t])=>{a.setDefaultPriority(e,t,"persistence")});const u=normalizeStoredDefStatics(e.defSettings?.static);Object.entries(u).forEach(([e,t])=>{n.setStatic(e,t,"persistence")});const d=normalizeStoredDefPriorities(e.defSettings?.defaults);Object.entries(d).forEach(([e,t])=>{n.setDefaultPriority(e,t,"persistence")}),e.cacheSettings?.precache&&s.setDesiredPrecache(e.cacheSettings.precache),i.setBaselineFromRuntime(),o()},loadStoredSnapshot=()=>"function"==typeof e.read?e.read():{key:e?.key||"nexSys4Settings",exists:!1,snapshot:e.load()};return{buildPersistenceSnapshot,loadPersistence(){const{key:t,exists:a,snapshot:n}=loadStoredSnapshot();return d.hasStoredSnapshot=Boolean(a),d.sourceKey=t||e?.key||"nexSys4Settings",applyStoredSnapshot(n),{key:d.sourceKey,exists:d.hasStoredSnapshot,snapshot:n}},seedBaselineFromObservedStartup({skipObservedAdoption:e=!1}={}){if(d.hasStoredSnapshot)return!1;if(e)return!1;const s=i.getObserved?.()||{},l=sanitizeSystemSettings({ss:s.settings||{}});Object.keys(l).length&&t.setSettings(l,{setBaseline:!0});const c=countablePriorityNameSet();return Object.entries(s.affPriorities||{}).forEach(([e,t])=>{c.has(String(e||"").toLowerCase())||isValidServersideAffPriority(t)&&a.setDefaultPriority(e,t,"startup-observed-baseline")}),Object.entries(s.defPriorities||{}).forEach(([e,t])=>{n.get(e)&&n.setDefaultPriority(e,normalizePersistedDefPriority(t),"startup-observed-baseline")}),i.setBaselineFromRuntime(),o(),!0},savePersistence(){const t=buildPersistenceSnapshot();return e.save(t),i.setBaselineFromRuntime(),l("persistence-save"),t}}},evaluateBlockCondition=(e,t)=>Array.isArray(e)?e.every(e=>t(e)):t(e),isBlocked=(e=[],t)=>e.some(e=>evaluateBlockCondition(e,t)),normalizeDefensePriority=e=>{const t=Number(e);return Number.isInteger(t)?t<0?0:t>26?26:t:0},resolveEffectiveDefensePriority=({storedPriority:e,overlayValue:t})=>normalizeDefensePriority(void 0===t||"RESET"===t?e:t),resolveCureActions=(e={},t={})=>Object.keys({...e||{},...t||{}}).reduce((t,a)=>(t[a]=!0===e?.[a],t),{}),rt=new Set(["balance","equilibrium","free"]),hasRequiredSpecialBalances=(e,t)=>e.filter(e=>!rt.has(e)).every(e=>t.have(e)),createIntent=({entry:e,direction:t,priority:a,commands:n,balsReq:s,balsUsed:i})=>({source:"defense",id:e.id,defense:e.id,direction:t,priority:a,commands:[...n],bals_req:[...s],bals_used:[...i],tableOrder:e.order,static:e.static,serverside:e.serverside}),createDefensePlanner=({defModel:e,balanceModel:t,affModel:a,systemModel:n,getObservedServersidePriority:s=()=>0})=>{const i=new Set(t.list?.()||[]),haveValidBalanceMetadata=(e,t)=>e.length>0&&t.length>0&&e.every(e=>i.has(e))&&t.every(e=>i.has(e)),getEffectivePriority=(t,a)=>resolveEffectiveDefensePriority({storedPriority:e.getPriority(t.id),overlayValue:a?.overlay?.defPriorities?.[t.id]});return{plan:({ruleEvaluation:i}={})=>{const o=n.getClass(),l=e.list().map(t=>e.get(t)).filter(Boolean).map(e=>({entry:e,priority:getEffectivePriority(e,i)})).sort((e,t)=>e.priority!==t.priority?e.priority-t.priority:e.entry.order-t.entry.order);e.pruneStaticRequests?.((t,a)=>{const n=getEffectivePriority(a,i);return a.static&&!a.have&&isActiveDefensePriority(n)&&e.isAvailableForClass(t,o)},"automatic-planner");const c=new Set,u=[],d=[],m=[];return l.forEach(({entry:n,priority:i})=>{const reject=(e,t)=>m.push({source:"defense",id:n.id,direction:e,reason:t});!1===n.serverside&&!n.trackOnly&&n.command.length&&!n.have&&isActiveDefensePriority(i)&&(c.has(n.id)?reject("on","opposing-defense-selected"):e.isAvailableForClass(n.id,o)?n.static&&!n.staticRequested?reject("on","static-not-requested"):isBlocked(n.blocks,e=>a.haveAff(e))?reject("on","blocked"):haveValidBalanceMetadata(n.bals_req,n.bals_used)?hasRequiredSpecialBalances(n.bals_req,t)?(n.opps.forEach(e=>c.add(e)),u.push(createIntent({entry:n,direction:"on",priority:i,commands:n.command,balsReq:n.bals_req,balsUsed:n.bals_used}))):reject("on","special-balance-unavailable"):reject("on","invalid-balance-metadata"):reject("on","class-unavailable")),n.stopCommand.length&&n.have&&0===i&&(n.serverside&&0!==Number(s(n.id))?reject("off","serverside-priority-not-zero"):e.isAvailableForClass(n.id,o)?isBlocked(n.stopBlocks,e=>a.haveAff(e))?reject("off","blocked"):haveValidBalanceMetadata(n.stopBals_req,n.stopBals_used)?hasRequiredSpecialBalances(n.stopBals_req,t)?d.push(createIntent({entry:n,direction:"off",priority:0,commands:n.stopCommand,balsReq:n.stopBals_req,balsUsed:n.stopBals_used})):reject("off","special-balance-unavailable"):reject("off","invalid-balance-metadata"):reject("off","class-unavailable"))}),d.sort((e,t)=>e.tableOrder-t.tableOrder),{upkeep:u,tearDown:d,candidates:[...u,...d],trace:m}}}},at=new Set(["balance","equilibrium","free"]),normalizeCommands$1=e=>{if(Array.isArray(e))return e.map(e=>String(e||"").trim()).filter(Boolean);const t=String(e||"").trim();return t?[t]:[]},normalizeBalances=e=>(Array.isArray(e)?e:[]).map(e=>String(e||"").trim().toLowerCase()).filter(Boolean),createCurePlanner=({cureTable:e={},affModel:t,balanceModel:a,systemModel:n})=>{const s=new Map(Object.keys(e).map((e,t)=>[e,t])),i=new Set(a.list?.()||[]),isAvailableForClass=e=>{const t=Array.isArray(e.skills)?e.skills:[];return!t.length||classListIncludes(t,n.getClass())},haveRequiredSpecialBalances=e=>e.filter(e=>!at.has(e)).every(e=>a.have(e)),haveValidBalanceMetadata=e=>e.every(e=>i.has(e));return{plan:({ruleEvaluation:a}={})=>{const n=a?.policy?.cureActions||{},i=a?.provenance?.cureActions||{},o=[],l=[];return Object.entries(n).forEach(([a,n])=>{if(!n)return;const c=e[a],reject=e=>l.push({source:"cure",id:a,reason:e});if(!c)return void reject("unknown-cure");if(!1!==c.serverside)return void reject("serverside-managed");const u=normalizeCommands$1(c.command),d=normalizeBalances(c.bals_req),m=normalizeBalances(c.bals_used);if(!u.length||!d.length||!m.length)return void reject("invalid-action-metadata");if(!haveValidBalanceMetadata(d)||!haveValidBalanceMetadata(m))return void reject("unknown-balance");if(!isAvailableForClass(c))return void reject("class-unavailable");if(isBlocked(c.blocks,e=>t.haveAff(e)))return void reject("blocked");if(!haveRequiredSpecialBalances(d))return void reject("special-balance-unavailable");const p=i[a]||{};o.push({source:"cure",id:a,cure:a,commands:u,bals_req:d,bals_used:m,ruleId:p.ruleId||null,ruleOrder:Number.isInteger(p.ruleOrder)?p.ruleOrder:-1,tableOrder:s.get(a)??Number.MAX_SAFE_INTEGER})}),o.sort((e,t)=>e.ruleOrder!==t.ruleOrder?t.ruleOrder-e.ruleOrder:e.tableOrder-t.tableOrder),{candidates:o,trace:l}}}},isExactlyFree=(e=[])=>1===e.length&&"free"===e[0],usesMainBalance=(e=[])=>e.includes("balance")||e.includes("equilibrium"),usesDirectTransport=(e=[])=>!usesMainBalance(e),createAutomaticActionPlanner=()=>({plan({cureCandidates:e=[],defenseUpkeepCandidates:t=[],defenseTearDownCandidates:a=[],trace:n=[]}={}){const s=[...e,...t,...a],i=s.filter(e=>usesDirectTransport(e.bals_req)),o=s.filter(e=>!usesDirectTransport(e.bals_req)),l=o.filter(e=>isExactlyFree(e.bals_used)),c=o.filter(e=>!isExactlyFree(e.bals_used)&&!usesMainBalance(e.bals_used)),u=o.find(e=>usesMainBalance(e.bals_used)),d=[...l,...c,...u?[u]:[]];return{directActions:i,queuePlans:{freeQueue:d.flatMap(e=>e.commands)},selectedActions:[...i,...d],trace:[...n]}}}),dedupeCommandIntents=(e=[])=>{const t=new Map,a=[];return e.forEach(e=>{const n=e?.command,s=t.get(n);if(s)return void(!0===e?.requiresCompletion&&(s.requiresCompletion=!0));const i={...e};t.set(n,i),a.push(i)}),a},createOutputPlanner=({systemModel:e,rules:t,serverside:a,curePlanner:n,defensePlanner:s,automaticActionPlanner:i,precachePlanner:o,queueController:l})=>({plan({source:c="prompt",injectedCommands:u=[],suppressedServersideCommands:d=[]}={}){const m=e.getRuntime(),p=t.evaluate({source:c}),g=a.evaluate({emitCommands:!1,source:c,ruleEvaluation:p}),h=d.length?g.commands.filter(e=>!d.includes(e)):g.commands,b=[];let y;if("prompt"===c){if(e.getRuntime().rulesSuspended)y={directActions:[],queuePlans:{freeQueue:[]},selectedActions:[],trace:[]};else{const e=n.plan({ruleEvaluation:p}),t=s.plan({ruleEvaluation:p});y=i.plan({cureCandidates:e.candidates,defenseUpkeepCandidates:t.upkeep,defenseTearDownCandidates:t.tearDown,trace:[...e.trace,...t.trace]})}l.setPlannerCommands("freeQueue",y.queuePlans.freeQueue),y.directActions.forEach(e=>{e.commands.forEach(t=>{b.push({source:e.source,action:e,command:t})})})}m.slowMode||o.plan().forEach(e=>b.push(e)),h.forEach(e=>{b.push({source:"serverside",command:e,requiresCompletion:!0})}),u.forEach(e=>{b.push({source:"injected",command:e})});const v=dedupeCommandIntents(b);return{intents:v,commands:v.map(e=>e.command),serversideCommands:h,ruleEvaluation:p,automaticPlan:y}}}),createPrecachePlanner=({cacheModel:e})=>({plan:()=>e.getPrecacheCommands().map(e=>({source:"precache",command:e,requiresCompletion:!0}))}),createQueueState=()=>Object.entries(G).reduce((e,[t,a])=>(e[t]={...deepClone$1(a),id:t,items:[],prepend:[],plannerCommands:[],pending:!1,lastSignature:"",deferred:!1},e),{}),splitCommandValue=(e,t="|")=>{const a=String(t||"|")||"|";return String(e).split(a).map(e=>e.trim()).filter(Boolean)},normalizeCommands=(e,t="|")=>e?Array.isArray(e)?e.flatMap(e=>null==e?[]:splitCommandValue(e,t)).filter(Boolean):splitCommandValue(e,t):[],hasQueuedItems=e=>e.items.length>0||e.prepend.length>0||e.plannerCommands.length>0,buildLogicalCommands=e=>[`echo SystemEvent ${e.name}QueueFired`,...e.pre,...e.plannerCommands,...e.prepend,...e.items,...e.post].filter(Boolean),clearQueueState=e=>{e.items=[],e.prepend=[],e.plannerCommands=[],e.pending=!1,e.lastSignature="",e.deferred=!1},resolveQueueId=(e,t)=>{if(e[t])return t;const a=String(t||"").replace(/QueueFired$/i,"").toLowerCase();return Object.keys(e).find(t=>{const n=e[t];return n.name.toLowerCase()===a||n.type.toLowerCase()===a})||null},hasLocalQueueState=(e={})=>(e.items||[]).length>0||(e.prepend||[]).length>0||(e.plannerCommands||[]).length>0||e.pending||e.deferred||Boolean(e.lastSignature),clearLocalQueueState=e=>{if(!e)return!1;const t=hasLocalQueueState(e);return clearQueueState(e),t},markQueueDeferred=e=>{if(!e)return!1;const t=!e.deferred||!e.pending;return e.deferred=!0,e.pending=!0,t},markQueueAwaitingAck=(e,t)=>{if(!e)return!1;const a=e.lastSignature!==t||!0!==e.pending||!1!==e.deferred;return e.lastSignature=t,e.pending=!0,e.deferred=!1,a},createQueueMutationApi=({state:e,emit:t,flush:a,clearQueue:n,getSeparator:s,markStateChanged:i=()=>{}})=>{const resolveSeparator=()=>("function"==typeof s?s():"|")||"|",haveSameCommands=(e=[],t=[])=>e.length===t.length&&e.every((e,a)=>e===t[a]),clear=(a,n={})=>{const s=e[a];return!!s&&(!!clearLocalQueueState(s)&&(i(a),t("QueueCleared",{queueId:a,remote:Boolean(n.remote),command:n.command||null}),!0))};return{add(n,s,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(s,resolveSeparator());if(!c.length)return!1;const u=[];if(o.allowDuplicate)u.push(...c);else{const e=new Map;l.items.forEach(t=>{e.set(t,(e.get(t)||0)+1)}),c.forEach(t=>{const a=e.get(t)||0;a>0?e.set(t,a-1):u.push(t)})}return!!u.length&&(l.items.push(...u),i(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},addClear(n,s,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(s,resolveSeparator());return!(!c.length||haveSameCommands(l.items,c))&&(l.items=c,i(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},prepend(n,s,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(s,resolveSeparator());return!!c.length&&(!(!o.allowDuplicate&&c.every(e=>l.prepend.includes(e)))&&(l.prepend.unshift(...c),i(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0))},setPlannerCommands(s,o=[],l={}){const c=e[s];if(!c)return!1;const u=normalizeCommands(o,resolveSeparator());if(haveSameCommands(c.plannerCommands,u))return!1;const d=c.pending&&!c.deferred&&Boolean(c.lastSignature);return c.plannerCommands=u,i(s),t("QueueUpdated",{queueId:s,queue:deepClone$1(c)}),!1===l.autoFlush||(hasQueuedItems(c)?(a(s,{force:!0}),!0):d?(n(s),!0):((c.pending||c.deferred||c.lastSignature)&&(c.pending=!1,c.deferred=!1,c.lastSignature="",i(s)),!0))},clear,setPreCommands(a,n=[]){const s=e[a];if(!s)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(s.pre,o)&&(s.pre=o,i(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(s)}),!0)},setPostCommands(a,n=[]){const s=e[a];if(!s)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(s.post,o)&&(s.post=o,i(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(s)}),!0)}}},chunkCommands=(e=[],t=20)=>{const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],n=Math.max(1,Number(t||20)),s=[];for(let i=0;i<a.length;i+=n)s.push(a.slice(i,i+n));return s},chunkCommandsWithTrailing=(e=[],{maxEntries:t=20,trailing:a=[]}={})=>{const n=chunkCommands(e,t),s=chunkCommands(a,t).flat();if(!s.length)return n;if(!n.length)return chunkCommands(s,t);const i=n[n.length-1];return i.length+s.length<=Math.max(1,Number(t||20))?(i.push(...s),n):[...n,...chunkCommands(s,t)]},createQueueFlushApi=({state:e,emit:t,send:a,getRuntimeState:n,getSeparator:s,maxEntriesPerSubmission:i,onQueueFired:o,markStateChanged:l=()=>{}})=>{const buildRemoteClearCommand=e=>`clearqueue ${e.type}`,buildStackPlan=(e=[])=>({type:"stackPlan",commands:e.filter(Boolean).map(e=>String(e))}),markExcludedQueuesCleared=(t=[])=>{t.forEach(t=>{const a=e[t];a&&clearLocalQueueState(a)&&l(t)})},deferQueue=(e,a)=>(markQueueDeferred(a)&&l(e),t("QueueDeferred",{queueId:e,queue:deepClone$1(a)}),[]),flush=(o,c={})=>{const u=e[o];if(!u||!hasQueuedItems(u))return[];const d=n?n():{paused:!1,phase:he.RUNNING,settings:{}};if(!isRuntimeReadyPhase(d.phase))return deferQueue(o,u);const m=Boolean(d.settings?.queueWhilePaused);if((d.paused||d.rulesSuspended)&&!m)return deferQueue(o,u);const p=buildLogicalCommands(u),g=p.join("");if(!c.force&&g===u.lastSignature)return[];const h=[],b=[];u.exclusions.forEach(t=>{const a=e[t];a&&hasQueuedItems(a)&&(h.push(buildRemoteClearCommand(a)),b.push(t))});const y="function"==typeof s?s():"|",v=chunkCommands(p,Math.max(1,i-h.length)).map((e,t)=>buildStackPlan([`queue ${0===t?"addclear":"add"} ${u.type} ${e.join(y)}`])),S=[];return h.length>0&&S.push(buildStackPlan(h)),S.push(...v),markQueueAwaitingAck(u,g)&&l(o),markExcludedQueuesCleared(b),a(S,{source:"queue-controller",queueId:o,excludedIds:b}),t("QueueFlushed",{queueId:o,plans:S,signature:g}),S};return{flush,clearQueue:n=>{const s=e[n];if(!s)return!1;const i=buildRemoteClearCommand(s);clearLocalQueueState(s)&&l(n),t("QueueCleared",{queueId:n,remote:!0,command:i});const o=[buildStackPlan([i])];return a(o,{source:"queue-controller",queueId:n,remote:!0,action:"clear-queue"}),o},flushDeferred(){const t=[];return Object.keys(e).forEach(a=>{e[a].deferred&&flush(a,{force:!0}).length&&t.push(a)}),t},flushAll(){const t=[];return Object.keys(e).forEach(e=>{const a=flush(e);a.length&&t.push({queueId:e,plans:a})}),t},acknowledgeSent(a,n={}){const s=resolveQueueId(e,a);if(!s)return!1;const i=e[s];return t("QueueSentAcknowledged",{...n,queueId:s,queueType:i?.type||n.queueType||""}),!0},acknowledgeFired(a){const n=resolveQueueId(e,a);if(!n)return!1;const s=e[n],i=s?deepClone$1(s):null;return clearLocalQueueState(e[n])&&l(n),o?.({queueId:n,queue:i}),t("QueueFiredAcknowledged",{queueId:n}),!0}}},createQueueController=({send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n=20,onQueueFired:s}={})=>{const i=new Set,o=createQueueState();let l=0;const c=new Map,markStateChanged=e=>{l+=1,e&&c.set(e,(c.get(e)??0)+1)},emit=(e,t)=>{i.forEach(a=>a(e,t))},buildQueueSnapshot=(e={})=>({id:e.id,name:e.name,type:e.type,pre:[...e.pre||[]],post:[...e.post||[]],exclusions:[...e.exclusions||[]],items:[...e.items||[]],prepend:[...e.prepend||[]],plannerCommands:[...e.plannerCommands||[]],pending:Boolean(e.pending),lastSignature:e.lastSignature||"",deferred:Boolean(e.deferred)}),u=new Map,getQueueSnapshot=e=>o[e]?(u.has(e)||u.set(e,createSnapshotCache({getVersion:()=>c.get(e)??0,buildSnapshot:()=>buildQueueSnapshot(o[e])})),u.get(e)()):null,d=createSnapshotCache({getVersion:()=>l,buildSnapshot:()=>Object.keys(o).reduce((e,t)=>(e[t]=getQueueSnapshot(t),e),{})}),m=createQueueFlushApi({state:o,emit,send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n,onQueueFired:s,markStateChanged}),p=createQueueMutationApi({state:o,emit,flush:m.flush,clearQueue:m.clearQueue,getSeparator:a,markStateChanged});return{onChange:e=>(i.add(e),()=>i.delete(e)),listQueues:()=>Object.keys(o),getQueue:e=>getQueueSnapshot(e),snapshot:()=>d(),add:p.add,addClear:p.addClear,prepend:p.prepend,setPlannerCommands:p.setPlannerCommands,clear:p.clear,clearQueue:m.clearQueue,flush:m.flush,flushAll:m.flushAll,flushDeferred:m.flushDeferred,acknowledgeSent:m.acknowledgeSent,acknowledgeFired:m.acknowledgeFired,setPreCommands:p.setPreCommands,setPostCommands:p.setPostCommands}},createSettingCommand=(e,t)=>Object.freeze({commandId:e,buildCommand:t}),nt=Object.freeze({afflictions:createSettingCommand("curing-afflictions",e=>`curing afflictions ${boolWord(e)}`),defences:createSettingCommand("curing-defences",e=>`curing defences ${boolWord(e)}`),sipping:createSettingCommand("curing-sipping",e=>`curing sipping ${boolWord(e)}`),transmutation:createSettingCommand("curing-transmutation",e=>`curing transmutation ${boolWord(e)}`),sipHealthAt:createSettingCommand("curing-siphealth",e=>`curing siphealth ${e}`),sipManaAt:createSettingCommand("curing-sipmana",e=>`curing sipmana ${e}`),mossHealthAt:createSettingCommand("curing-mosshealth",e=>`curing mosshealth ${e}`),mossManaAt:createSettingCommand("curing-mossmana",e=>`curing mossmana ${e}`),sipPriority:createSettingCommand("curing-priority-mode",e=>`curing priority ${String(e||"health").toLowerCase()}`),focus:createSettingCommand("curing-focus-enabled",e=>`curing focus ${boolWord(e)}`),focusOverHerbs:createSettingCommand("curing-focus-priority-mode",e=>"curing focus "+(e?"first":"second")),tree:createSettingCommand("curing-tree",e=>{const t=String(e||"on").toLowerCase();return["on","off","custom"].includes(t)?`curing tree ${t}`:null}),useVault:createSettingCommand("curing-usevault",e=>`curing usevault ${boolWord(e)}`),clot:createSettingCommand("curing-useclot",e=>`curing useclot ${boolWord(e)}`),clotAt:createSettingCommand("curing-clotat",e=>`curing clotat ${e}`),fallback:createSettingCommand("curing-fallback",e=>`curing fallback ${boolWord(e)}`),kaidoTransmute:createSettingCommand("curing-kaidotransmute",e=>e?"curing kaidotransmute":null),batch:createSettingCommand("curing-batch",e=>`curing batch ${boolWord(e)}`),fracturesAbove:createSettingCommand("curing-healthaffsabove",e=>`curing healthaffsabove ${e}`),manaThreshold:createSettingCommand("curing-manathreshold",e=>`curing manathreshold ${e}`)}),sameArray=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},mapDiff=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]),toGamePriorityToken=e=>isServersideAffPriorityNumber(e)?String(Number(e)):String(26),createServersideDiffPlanner=({baseline:e={},getBaseline:t,getAffPriorityCommandName:a,getDefPriorityTokens:n}={})=>{const resolveBaseline=()=>"function"==typeof t?t()||{}:e,resolveAffPriorityCommandName=e=>{if("function"==typeof a){const t=a(e);if(t)return String(t)}return String(e)},resolveDefPriorityTokens=(e,t)=>{if(!isServersideAffPriorityNumber(t))return["reset"];if("function"==typeof n){const a=n(e,Number(t));if(Array.isArray(a)&&a.length)return a.map(e=>String(e));if(null!=a&&!1!==a)return[String(a)]}return[String(Number(t))]},normalizeDesiredDefPriority=e=>"RESET"===e||void 0===e?0:isServersideAffPriorityNumber(e)?Number(e):0;return{build:({desired:e={},observed:t={}}={})=>{const a=resolveBaseline(),n=a.settings||{},s=a.affPriorities||{},i=[],o=[],l=e.settings||{};mapDiff(l,t.settings||{}).sort().forEach(e=>{const t=nt[e];if(!t)return;const a=t.buildCommand(l[e]);a&&(i.push(a),o.push(`settings:${e}`))});const c=e.affPriorities||{},u=t.affPriorities||{};!0===e.fullPriorityReset&&(i.push("curing priority reset"),o.push("aff-priority:reset-all"));const resolveDesiredAffPriority=e=>{const t=c[e];return"RESET"===t||void 0===t?s[e]??0:t},d=[...new Set([...Object.keys(c),...Object.keys(u)])].filter(e=>canonicalAffPriority(resolveDesiredAffPriority(e))!==canonicalAffPriority(u[e])).sort().map(e=>[e,toGamePriorityToken(resolveDesiredAffPriority(e))]);if(d.length){const e=d.flatMap(([e,t])=>[resolveAffPriorityCommandName(e),String(t)]);i.push(`curing priority ${e.join(" ")}`),d.forEach(([e])=>o.push(`aff-priority:${e}`))}const m=e.defPriorities||{},p=t.defPriorities||{},g=[...new Set([...Object.keys(m),...Object.keys(p)])].filter(e=>normalizeDesiredDefPriority(m[e])!==Number(p[e]??0)).sort().map(e=>{const t=m[e];return"RESET"===t||void 0===t?[e,["reset"],`def-priority-reset:${e}`]:isServersideAffPriorityNumber(t)?[e,resolveDefPriorityTokens(e,t),`def-priority:${e}`]:[e,["reset"],`def-priority-reset:${e}`]});if(g.length){const e=g.flatMap(([e,t])=>[e,...t]);i.push(`curing priority defence ${e.join(" ")}`),g.forEach(([,,e])=>o.push(e))}const h=e.prioAff;h!==t.prioAff&&(h?(i.push(`curing prioaff ${h}`),o.push(`prioaff:${h}`)):(i.push("curing prioaff none"),o.push("prioaff:clear")));const b=e.manualQueue||[];return sameArray(b,t.manualQueue||[])||(i.push("curing queue reset"),b.forEach((e,t)=>{i.push(`curing queue insert ${t+1} ${e}`)}),o.push("manual-queue:reconcile")),{commands:Array.from(new Set(i)),reasonCodes:o,baseSettings:n}},getBaseSettings:()=>resolveBaseline().settings||{},getBaseAff:()=>resolveBaseline().affPriorities||{},getBaseDef:()=>resolveBaseline().defPriorities||{}}},st=Object.freeze(["status","affPriorities","defPriorities"]),it=Object.freeze({reportingcommands:"reporting",afflictions:"afflictions",defences:"defences",sipping:"sipping",transmutation:"transmutation",siphealth:"sipHealthAt",siphealthat:"sipHealthAt",sipmana:"sipManaAt",sipmanaat:"sipManaAt",mosshealth:"mossHealthAt",mosshealthat:"mossHealthAt",mossmana:"mossManaAt",mossmanaat:"mossManaAt",priority:"sipPriority",sippriority:"sipPriority",focus:"focus",focusoverherbs:"focusOverHerbs",tree:"tree",usevault:"useVault",useclot:"clot",clot:"clot",clotat:"clotAt",clotabove:"clotAbove",fallback:"fallback",kaidotransmute:"kaidoTransmute",customcuringpriority:"customAffPriority",customdefencepriority:"customDefPriority",batch:"batch",healthaffsabove:"fracturesAbove",fracturesabove:"fracturesAbove",manathreshold:"manaThreshold",insomnia:"insomnia"}),ot=Object.freeze(new Set(["status","enabled"])),createServersideObservationApi=({state:e,affModel:t,defModel:a,systemModel:n,emit:s,markDirty:i,replaceBucket:o,maybeResolveFullPriorityReset:l,getRuleEvaluation:c=()=>({overlay:{}}),normalizeAffPriorityName:u=e=>String(e||"").toLowerCase()})=>{const getRuleOverlay=()=>c()?.overlay||{},getMissingStartupFlags=(t=Object.keys(e.startup.flags))=>t.filter(t=>t in e.startup.flags&&!e.startup.flags[t]),d=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>({...e.startup.flags})}),m=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>{const e=d(),t=getMissingStartupFlags(st);return{ready:Object.values(e).every(Boolean),requiredReady:0===t.length,missingRequired:t,flags:e}}}),markStartupCaptured=t=>t in e.startup.flags&&!e.startup.flags[t]&&(o("startup",{...e.startup,flags:{...e.startup.flags,[t]:!0}}),s("ServersideStartupSnapshotCaptured",{topic:t,flags:d()}),!0),updateObservedSetting=(t,a)=>{if(e.observed.settings[t]!==a){if(o("observed",{...e.observed,settings:{...e.observed.settings,[t]:a}}),e.startup.flags.status){const n=getRuleOverlay().settings?.[t];void 0!==n&&"RESET"!==n||o("sessionBaseline",{...e.sessionBaseline,settings:{...e.sessionBaseline.settings,[t]:a}})}i(`observed-setting:${t}`)}},normalizeCaptureSetName=e=>String(e||"").trim().toLowerCase(),isCaptureSetOwned=e=>{const t=e||"";return""===t||"nexsys4-default"===t},completeObservedAffPrioritySnapshot=()=>{const t=e.capture.affPriorities,a=e.capture.prioritySet||"";if(e.capture.affPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,affPriorities:t,prioritySet:a}),l(),i("observed-aff-priority-snapshot")}return markStartupCaptured("affPriorities"),!0},updateObservedAffPriority=(t,a)=>{const n=e.capture.affPriorities||e.observed.affPriorities,s=String(t||"").toLowerCase(),c=u(t);if(!c)return!1;if(!Object.prototype.hasOwnProperty.call(n,c))return!1;const d=normalizeServersideAffPriority(a);if(e.capture.affPriorities)return s&&s!==c&&delete n[s],n[c]=d,!0;const m={...e.observed.affPriorities};if(s&&s!==c&&delete m[s],m[c]=d,o("observed",{...e.observed,affPriorities:m}),l(),e.startup.flags.affPriorities){const t=getRuleOverlay().affPriorities?.[c];void 0!==t&&"RESET"!==t||o("sessionBaseline",{...e.sessionBaseline,affPriorities:{...e.sessionBaseline.affPriorities,[c]:d}})}return i(`observed-aff-priority:${c}`),!0},completeObservedDefPrioritySnapshot=()=>{const t=e.capture.defPriorities,a=e.capture.prioritySet||"";if(e.capture.defPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,defPriorities:t,prioritySet:a}),i("observed-def-priority-snapshot")}return markStartupCaptured("defPriorities"),!0},updateObservedQueue=(t=[])=>{const a=t||[],n=e.observed.manualQueue,s=a.length===n.length&&a.every((e,t)=>e===n[t]);markStartupCaptured("queue"),s||(o("observed",{...e.observed,manualQueue:[...a]}),i("observed-manual-queue"))},updateObservedPredictions=(t={})=>{const a=t||{},n=e.observed.predictions,s=Object.keys(a),l=s.length===Object.keys(n).length&&s.every(e=>a[e]===n[e]);markStartupCaptured("predictions"),l||(o("observed",{...e.observed,predictions:{...a}}),i("observed-predictions"))},parseStatusLine=({key:e,value:t})=>{const a=String(e||"").trim();if(ot.has(a.toLowerCase()))return;const n=it[a.toLowerCase()]||a;updateObservedSetting(n,normalizeStatusValue(n,t))};return{markStartupCaptured,resetStartupStatus:()=>{const t=Object.keys(e.startup.flags).reduce((e,t)=>(e[t]=!1,e),{});return e.capture.affPriorities=null,e.capture.defPriorities=null,o("startup",{...e.startup,flags:t}),s("ServersideStartupReset",{flags:d()}),!0},isStartupReady:()=>Object.values(e.startup.flags).every(Boolean),getStartupStatus:()=>m(),getMissingStartupFlags,beginObservedAffPrioritySnapshot:(a="")=>(e.capture.affPriorities=buildObservedAffPriorities(t),e.capture.prioritySet=normalizeCaptureSetName(a),!0),completeObservedAffPrioritySnapshot,updateObservedSetting,updateObservedAffPriority,beginObservedDefPrioritySnapshot:(t="")=>(e.capture.defPriorities=buildObservedDefPriorities(a,n.getClass()),e.capture.prioritySet=normalizeCaptureSetName(t),!0),completeObservedDefPrioritySnapshot,updateObservedDefPriority:(t,s)=>{const l=e.capture.defPriorities||e.observed.defPriorities,c=String(t||"").toLowerCase(),u=a.get(c);if(!u?.serverside)return!1;if(!a.isAvailableForClass(c,n.getClass()))return!1;const d="RESET"===String(s).toUpperCase()?0:Number(s);if(!Number.isFinite(d))return!1;if(e.capture.defPriorities)return l[c]=d,!0;if(o("observed",{...e.observed,defPriorities:{...e.observed.defPriorities,[c]:d}}),e.startup.flags.defPriorities){const t=getRuleOverlay().defPriorities?.[c];if(void 0===t||"RESET"===t){const t={...e.sessionBaseline.defPriorities};u.static?delete t[c]:t[c]=d,o("sessionBaseline",{...e.sessionBaseline,defPriorities:t})}}return i(`observed-def-priority:${c}`),!0},updateObservedQueue,updateObservedPredictions,parseStatusLine}},createServersideTransientApi=({state:e,markDirty:t,replaceBucket:a,normalizeAffName:n=e=>String(e||"").toLowerCase()})=>{const getPredictionCommands=()=>Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],getPredictionRequests=()=>Array.isArray(e.transient.predictionRequests)?e.transient.predictionRequests:[],normalizePredictionAff=e=>String(n(e)||"").trim().toLowerCase(),replaceTransient=t=>a("transient",{...e.transient,...t}),clearPredictionCommands=(e=new Set)=>{if(!e.size)return!1;const t=getPredictionCommands(),a=t.filter(t=>!e.has(normalizeCommand(t)));return a.length!==t.length&&replaceTransient({predictionCommands:a})},clearPredictionRequest=e=>{const t=getPredictionRequests();if(!t.length)return!1;const a=normalizePredictionAff(e),n=a?t.indexOf(a):0;if(n<0)return!1;const s=[...t];return s.splice(n,1),replaceTransient({predictionRequests:s})},queuePredictionCommand=e=>{const a=normalizePredictionAff(e);if(!a)return!1;const n=`curing predict ${a}`,s=normalizeCommand(n),i=getPredictionCommands(),o=getPredictionRequests();return!i.some(e=>normalizeCommand(e)===s)&&!o.includes(a)&&(replaceTransient({predictionCommands:[...i,n],predictionRequests:[...o,a]}),t(`prediction-request:${a}`),!0)};return{setPrioAff(s){const i=s?n(s):null;return e.transient.prioAff!==i&&(a("transient",{...e.transient,prioAff:i}),t("prioaff"),!0)},clearPrioAff:()=>!!e.transient.prioAff&&(a("transient",{...e.transient,prioAff:null}),t("prioaff-clear"),!0),requestPriorityReset:()=>!e.transient.fullPriorityReset&&(a("transient",{...e.transient,fullPriorityReset:!0}),t("priority-reset-request"),!0),addPrediction:e=>queuePredictionCommand(e),removePrediction(e){const a=normalizePredictionAff(e);if(!a)return!1;const n=clearPredictionCommands(new Set([normalizeCommand(`curing predict ${a}`)])),s=clearPredictionRequest(a);return n&&t(`prediction-cancel:${a}`),n||s},confirmPrediction:e=>clearPredictionRequest(e),manualQueueAdd(n){const s=String(n||"").toLowerCase();return!(!s||e.transient.manualQueue.includes(s))&&(a("transient",{...e.transient,manualQueue:[...e.transient.manualQueue,s]}),t("manual-queue-add"),!0)},manualQueueInsert(n,s){const i=String(s||"").toLowerCase(),o=Math.max(1,Math.min(20,Number(n||1)));if(!i||e.transient.manualQueue.includes(i))return!1;const l=[...e.transient.manualQueue];return l.splice(o-1,0,i),a("transient",{...e.transient,manualQueue:l}),t("manual-queue-insert"),!0},manualQueueRemove(n){const s=String(n||"").toLowerCase(),i=e.transient.manualQueue.indexOf(s);if(i<0)return!1;const o=[...e.transient.manualQueue];return o.splice(i,1),a("transient",{...e.transient,manualQueue:o}),t("manual-queue-remove"),!0},manualQueueReset:()=>!!e.transient.manualQueue.length&&(a("transient",{...e.transient,manualQueue:[]}),t("manual-queue-reset"),!0)}},shallowCopyDesired=e=>({settings:{...e.settings},affPriorities:{...e.affPriorities},defPriorities:{...e.defPriorities},manualQueue:[...e.manualQueue||[]],predictions:{...e.predictions},prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),predictionCommands:[...e.predictionCommands||[]],appliedRules:[...e.appliedRules||[]]}),areCommandSequencesEqual=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},createServersideEvaluationApi=({state:e,affModel:t,defModel:a,systemModel:n,diffPlanner:s,sendCommands:i,emit:o,markDirty:l,replaceBucket:c,getRuleEvaluation:u,now:d,options:m})=>{const clearResolvedPending=()=>{const t=m.pendingTimeoutMs||12e3,a=d();let n=e.pending;for(const[s,i]of e.pending.entries())a-i>t&&(n===e.pending&&(n=new Map(e.pending)),n.delete(s));return c("pending",n)},clearSentPredictionCommands=(t=[])=>{const a=new Set(t.map(e=>normalizeCommand(e)));if(!a.size)return!1;const n=Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],s=n.filter(e=>!a.has(normalizeCommand(e)));return s.length!==n.length&&c("transient",{...e.transient,predictionCommands:s})},markPendingCommands=(t=[],a={})=>{const n=t.map(e=>normalizeCommand(e)).filter(e=>e&&isServersideCommand(e));if(n.length){const t=d(),a=new Map(e.pending);n.forEach(e=>a.set(e,t)),c("pending",a)}return n.length&&(o("ServersidePendingUpdated",{commands:[...n],context:{...a}}),clearSentPredictionCommands(n)),n},buildEffectiveServersideDefPriorities=t=>{const s=n.getClass(),i=t.overlay.defPriorities||{},o=Object.entries(e.sessionBaseline.defPriorities).reduce((e,[t,n])=>{const o=a.get(t);return o?.serverside&&!o.static&&a.isAvailableForClass(t,s)?(e[t]=resolveEffectiveDefensePriority({storedPriority:n,overlayValue:i[t]}),e):e},{}),l=a.getStaticRequests?.()||{};return Object.keys(l).forEach(e=>{const t=a.get(e);if(!t?.serverside||!t.static||t.have||!a.isAvailableForClass(e,s))return;const n=resolveEffectiveDefensePriority({storedPriority:a.getPriority(e),overlayValue:i[e]});n>=1&&n<=25&&(o[e]=n)}),o},resolveDesired=t=>(c("desired",{settings:{...e.sessionBaseline.settings,...t.overlay.settings},affPriorities:mergeWithResets(e.sessionBaseline.affPriorities,t.overlay.affPriorities),defPriorities:buildEffectiveServersideDefPriorities(t),manualQueue:Array.isArray(t.overlay.manualQueue)?[...t.overlay.manualQueue]:[...e.transient.manualQueue],predictions:{},prioAff:null!==e.transient.prioAff&&void 0!==e.transient.prioAff?e.transient.prioAff:t.overlay.prioAff||null,fullPriorityReset:e.transient.fullPriorityReset,predictionCommands:[...e.transient.predictionCommands||[]],appliedRules:t.applied}),{desired:e.desired,evaluation:t});return{markPendingCommands,maybeResolveFullPriorityReset:()=>!!e.transient.fullPriorityReset&&(!!Object.keys(e.sessionBaseline.affPriorities).every(t=>(e.observed.affPriorities[t]??e.sessionBaseline.affPriorities[t])===e.sessionBaseline.affPriorities[t])&&(c("transient",{...e.transient,fullPriorityReset:!1}),o("ServersideFullPriorityResetResolved",{fullPriorityReset:!1}),!0)),evaluate({emitCommands:t=!0,source:a="prompt",ruleEvaluation:n=u()}={}){clearResolvedPending();const{desired:l}=resolveDesired(n),d=s.build({desired:l,observed:e.observed});let p=[...l.predictionCommands,...d.commands].filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));const g=Math.max(1,Number(m.maxCommandsPerCycle||40));let h=e.diagnostics.recoveryCounter;p.length>g&&(p=p.slice(0,g),h+=1);const b=(d.commands||[]).filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));let y=b.length&&areCommandSequencesEqual(e.lastDiffCommands||[],b)?e.diagnostics.commandRepeatCounter+1:0,v=e.diagnostics.desyncCounter;return y>=(m.desyncCommandRepeats||3)&&(v+=1,h+=1,p.push("curing status","curing priority list","curing priority defence list","curing queue list","curing predictions"),y=0),t&&p.length&&(i(p,{source:"serverside-reconcile",reasonCodes:d.reasonCodes,cycleSource:a}),markPendingCommands(p,{source:"serverside-reconcile",reasonCodes:d.reasonCodes,cycleSource:a})),e.lastDiffCommands=[...b],c("diagnostics",{...e.diagnostics,lastCommands:[...p],lastReasons:[...d.reasonCodes],desyncCounter:v,recoveryCounter:h,commandRepeatCounter:y}),e.dirty=!1,o("ServersideEvaluated",{source:a,desired:shallowCopyDesired(l),commands:[...p],reasons:[...d.reasonCodes]}),{desired:shallowCopyDesired(l),commands:p,reasons:d.reasonCodes}},setBaselineFromRuntime(){const{enabled:s,...i}=n.getBaselineIntent().ss||{},o=n.getClass(),u={...e.baseline,settings:{...e.baseline.settings,...i},affPriorities:buildBaselineAffPriorities(t),defPriorities:buildBaselineDefPriorities(a,o)};c("baseline",u);const d=buildObservedDefPriorities(a,o),m=Object.keys(d).reduce((t,a)=>(t[a]=e.observed.defPriorities[a]??d[a],t),{});c("observed",{...e.observed,defPriorities:m}),c("sessionBaseline",{settings:{...u.settings},affPriorities:{...u.affPriorities},defPriorities:{...u.defPriorities}}),l("baseline-refresh")},observeOutbound:(e=[])=>markPendingCommands(e,{source:"observe-outbound"})}},createServersideCuringSetApi=({state:e,sendCommands:t,markPendingCommands:a,markDirty:n,markStartupCaptured:s,replaceBucket:i})=>{const issueCuringSetCommand=(e,n)=>{const s=normalizeCommand(e);return!!s&&(t([s],{source:"serverside-curingset",reason:n}),a([s],{source:"serverside-curingset",reason:n}),!0)};return{switchCuringSet(t){const a=normalizeSetName(t);if(!a)return!1;const s=issueCuringSetCommand(`curingset switch ${a}`,"switch");return s&&(i("curingsets",{...e.curingsets,activeSet:a}),n("curingset-switch")),s},deleteCuringSet(e){const t=normalizeSetName(e);return!!t&&issueCuringSetCommand(`curingset delete ${t}`,"delete")},observeActiveCuringSet(t){const a=normalizeSetName(t);if(!a||a===normalizeSetName(e.curingsets.activeSet))return!1;const s=i("curingsets",{...e.curingsets,activeSet:a});return s&&n("curingset-active"),s},observeCuringSets({sets:t=[],activeSet:a="",used:o,limit:l}={}){const c=[...new Set((t||[]).map(e=>normalizeSetName(e)).filter(Boolean))],u=normalizeSetName(a),d=Number(o),m=Number(l),p=Number.isFinite(d)?d:e.curingsets.used,g=Number.isFinite(m)?m:e.curingsets.limit,h=e.curingsets.priorSet||(u&&"nexsys4-default"!==u?u:"");i("curingsets",{...e.curingsets,sets:c,activeSet:u,priorSet:h,used:p,limit:g}),s("curingsets"),n("curingset-observed")}}},lt=Object.freeze(["baseline","sessionBaseline","desired","observed","transient","pending","diagnostics","curingsets","startup"]),areBucketValuesEqual=(e,t)=>{if(Object.is(e,t))return!0;if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;if(e instanceof Date||t instanceof Date)return e instanceof Date&&t instanceof Date&&e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t))return!(!Array.isArray(e)||!Array.isArray(t))&&(e.length===t.length&&e.every((e,a)=>areBucketValuesEqual(e,t[a])));if(e instanceof Map||t instanceof Map){if(!(e instanceof Map&&t instanceof Map))return!1;if(e.size!==t.size)return!1;const a=[...e.entries()],n=[...t.entries()];for(let e=0;e<a.length;e+=1){const[t,s]=a[e],[i,o]=n[e];if(!Object.is(t,i)||!areBucketValuesEqual(s,o))return!1}return!0}const a=Object.keys(e),n=Object.keys(t);return a.length===n.length&&a.every(a=>Object.prototype.hasOwnProperty.call(t,a)&&areBucketValuesEqual(e[a],t[a]))},createServersideController=({adapter:e,dispatchCommands:t,affModel:a,defModel:n,systemModel:s,getRuleEvaluation:i=()=>({overlay:{settings:{},affPriorities:{},defPriorities:{},predictions:{}},applied:[]}),options:o={}}={})=>{if("function"!=typeof t)throw new Error("createServersideController requires a dispatchCommands function.");const now=()=>e.now(),l=t,{enabled:c,...u}=s.getBaselineIntent().ss||{},d=createInitialServersideState({baselineSettings:{afflictions:!0,defences:!0,sipping:!0,transmutation:!0,fallback:!0,kaidoTransmute:!1,...u},affModel:a,defModel:n,systemModel:s}),m=new Set,emit=(e,t)=>{m.forEach(a=>a(e,t))},markDirty=(e="state-change")=>{d.dirty=!0,emit("ServersideDirty",{reason:e})},replaceBucket=(e,t)=>!areBucketValuesEqual(d[e],t)&&(d[e]=t,!0),p=createServersideDiffPlanner({getBaseline:()=>d.baseline,getAffPriorityCommandName:"function"==typeof a?.formatPriorityCommandName?e=>a.formatPriorityCommandName(e):void 0,getDefPriorityTokens:(e,t)=>{const a=[String(Number(t))];return!0===n.get(e)?.preempt&&a.push("preempt"),a}}),g="function"==typeof a?.normalizeName?e=>a.normalizeName(e):e=>String(e||"").toLowerCase(),h="function"==typeof a?.normalizePriorityName?e=>a.normalizePriorityName(e):e=>String(e||"").toLowerCase(),b=createServersideEvaluationApi({state:d,affModel:a,defModel:n,systemModel:s,diffPlanner:p,sendCommands:l,emit,markDirty,replaceBucket,getRuleEvaluation:i,now,options:o}),y=createServersideObservationApi({state:d,affModel:a,defModel:n,systemModel:s,emit,markDirty,replaceBucket,maybeResolveFullPriorityReset:b.maybeResolveFullPriorityReset,getRuleEvaluation:i,normalizeAffPriorityName:h}),v=createServersideTransientApi({state:d,markDirty,replaceBucket,normalizeAffName:g}),S=createServersideCuringSetApi({state:d,sendCommands:l,markPendingCommands:b.markPendingCommands,markDirty,markStartupCaptured:y.markStartupCaptured,replaceBucket}),requestSnapshotSync=()=>l(["curing status","curing priority list","curing queue list","curing predictions","curingset list","curing priority defence list"],{source:"serverside-snapshot-sync"}),copyRecord=(e={})=>({...e||{}}),copyArray=(e=[])=>[...e||[]],copyDesiredSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),predictionCommands:copyArray(e.predictionCommands),appliedRules:copyArray(e.appliedRules)}),copyObservedSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioritySet:e.prioritySet||""}),copyTransientSnapshot=(e={})=>({prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),fullPriorityReset:Boolean(e.fullPriorityReset)}),copyDiagnosticsSnapshot=(e={})=>({lastCommands:copyArray(e.lastCommands),lastReasons:copyArray(e.lastReasons),desyncCounter:Number(e.desyncCounter||0),recoveryCounter:Number(e.recoveryCounter||0),commandRepeatCounter:Number(e.commandRepeatCounter||0)}),copyCuringSetSnapshot=(e={})=>({sets:copyArray(e.sets),activeSet:e.activeSet||"",priorSet:e.priorSet||"",used:Number(e.used||0),limit:Number(e.limit||0)}),x=createSnapshotCache({getVersion:()=>d.baseline,buildSnapshot:()=>({settings:copyRecord(d.baseline.settings),affPriorities:copyRecord(d.baseline.affPriorities),defPriorities:copyRecord(d.baseline.defPriorities)})}),k=createSnapshotCache({getVersion:()=>d.sessionBaseline,buildSnapshot:()=>({settings:copyRecord(d.sessionBaseline.settings),affPriorities:copyRecord(d.sessionBaseline.affPriorities),defPriorities:copyRecord(d.sessionBaseline.defPriorities)})}),C=createSnapshotCache({getVersion:()=>d.desired,buildSnapshot:()=>copyDesiredSnapshot(d.desired)}),A=createSnapshotCache({getVersion:()=>d.observed,buildSnapshot:()=>copyObservedSnapshot(d.observed)}),E=createSnapshotCache({getVersion:()=>d.transient,buildSnapshot:()=>copyTransientSnapshot(d.transient)}),w=createSnapshotCache({getVersion:()=>d.pending,buildSnapshot:()=>[...d.pending.entries()]}),_=createSnapshotCache({getVersion:()=>d.diagnostics,buildSnapshot:()=>copyDiagnosticsSnapshot(d.diagnostics)}),T=createSnapshotCache({getVersion:()=>d.curingsets,buildSnapshot:()=>copyCuringSetSnapshot(d.curingsets)}),M={baseline:x,sessionBaseline:k,desired:C,observed:A,transient:E,pending:w,diagnostics:_,curingsets:T,startup:createSnapshotCache({getVersion:()=>d.startup,buildSnapshot:()=>({flags:copyRecord(d.startup.flags)})})};let P=null;const getSnapshot=()=>{const e=lt.reduce((e,t)=>(e[t]=M[t](),e),{});return P&<.every(t=>P[t]===e[t])||(P=deepFreeze(e)),P},acknowledgeCommand=e=>acknowledgeCommands([e]),acknowledgeCommands=(e=[])=>{let t=d.pending;return e.forEach(e=>{const a=normalizeCommand(e);a&&t.has(a)&&(t===d.pending&&(t=new Map(d.pending)),t.delete(a))}),replaceBucket("pending",t)};return{onChange:e=>(m.add(e),()=>m.delete(e)),markDirty,evaluate:b.evaluate,isDirty:()=>d.dirty,getTransientPrioAff:()=>d.transient.prioAff,getObserved:()=>A(),getCuringSets:()=>T(),snapshot:()=>getSnapshot(),isStartupReady:y.isStartupReady,getStartupStatus:y.getStartupStatus,getMissingStartupFlags:y.getMissingStartupFlags,markStartupCaptured:y.markStartupCaptured,resetStartupStatus:y.resetStartupStatus,setBaselineFromRuntime:b.setBaselineFromRuntime,requestSnapshotSync,beginObservedAffPrioritySnapshot:y.beginObservedAffPrioritySnapshot,completeObservedAffPrioritySnapshot:y.completeObservedAffPrioritySnapshot,updateObservedSetting:y.updateObservedSetting,updateObservedAffPriority:y.updateObservedAffPriority,beginObservedDefPrioritySnapshot:y.beginObservedDefPrioritySnapshot,completeObservedDefPrioritySnapshot:y.completeObservedDefPrioritySnapshot,updateObservedDefPriority:y.updateObservedDefPriority,updateObservedQueue:y.updateObservedQueue,updateObservedPredictions:y.updateObservedPredictions,parseStatusLine:y.parseStatusLine,setPrioAff:v.setPrioAff,clearPrioAff:v.clearPrioAff,requestPriorityReset:v.requestPriorityReset,addPrediction:v.addPrediction,removePrediction:v.removePrediction,manualQueueAdd:v.manualQueueAdd,manualQueueInsert:v.manualQueueInsert,manualQueueRemove:v.manualQueueRemove,manualQueueReset:v.manualQueueReset,confirmPrediction:v.confirmPrediction,switchCuringSet:S.switchCuringSet,deleteCuringSet:S.deleteCuringSet,observeCuringSets:S.observeCuringSets,observeActiveCuringSet:S.observeActiveCuringSet,acknowledgeCommand,acknowledgeCommands,markPendingCommands:b.markPendingCommands,observeOutbound:b.observeOutbound}},ct=Object.freeze({BALANCE:"balance",EQUILIBRIUM:"equilibrium",ENTITY:"entity",FOCUS:"focus",FREE:"free",WRITHE:"writhe"}),focusLocked=e=>!e.haveBal(ct.FOCUS)||e.haveAff("impatience"),lockCureCondition=(e,t)=>e.haveAffs(["asthma","slickness","anorexia"])&&focusLocked(e)||t.some(t=>e.haveAffs(["asthma","slickness",t])),cureActionRule=(e,t)=>({id:`automatic-cure.${e}`,pack:"general",evaluate:a=>t(a)?{cureActions:{[e]:!0}}:null}),createDefaultRulePack=()=>[{id:"aeon-threshold-and-priority",pack:"general",evaluate:e=>e.haveAff("aeon")?{settings:{sipHealthAt:30,sipManaAt:10,mossHealthAt:0,mossManaAt:0,batch:!1,clotAt:5e3},affPriorities:{asthma:3,weariness:4,anorexia:5,impatience:7,paralysis:8}}:null},{id:"nonfunctional-legs-paralysis",pack:"general",evaluate:e=>e.haveAnAff(["brokenleftleg","damagedleftleg","mangledleftleg"])&&e.haveAnAff(["brokenrightleg","damagedrightleg","mangledrightleg"])?{affPriorities:{paralysis:25}}:null},{id:"kelp-paralysis-slickness",pack:"general",evaluate:e=>1==e.cureAffCount("kelp")&&e.haveAffs(["paralysis","asthma","slickness"])?{affPriorities:{asthma:1}}:null},{id:"darkshade-lightwall",pack:"general",evaluate:e=>e.haveAff("darkshade")&&e.affElapsed("darkshade")>1e4&&e.roomHasItem("a lightwall")?{affPriorities:{darkshade:2}}:null},cureActionRule("fitness",e=>e.canUseCure("fitness")&&e.haveAff("asthma")&&(e.haveAnAff(["slickness","hellsight"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity"])||e.haveAnAff(["damagedhead","mangledhead","damagedleftleg","damagedrightleg"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity","slickness","hellsight","disloyalty"]))),cureActionRule("bloodboil",e=>e.canUseCure("bloodboil")&&e.haveAffs(["asthma","slickness"])&&(e.haveAnAff(["hypochondria","paralysis"])||e.haveAff("anorexia")&&focusLocked(e))),cureActionRule("dwinnu",e=>e.canUseCure("dwinnu")&&(e.haveAffs(["webbed","entangled"])||e.haveAnAff(["webbed","entangled"])&&e.haveAff("transfixation"))),cureActionRule("salt",e=>e.canUseCure("salt")&&lockCureCondition(e,["hypochondria","paralysis"])),cureActionRule("shrugging",e=>e.canUseCure("shrugging")&&lockCureCondition(e,["hypochondria","paralysis"])),cureActionRule("fool",e=>e.canUseCure("fool")&&lockCureCondition(e,["hypochondria","impatience"])),cureActionRule("alleviate",e=>e.canUseCure("alleviate")&&lockCureCondition(e,["hypochondria","impatience"])),cureActionRule("dragonflex",e=>e.canUseCure("dragonflex")&&(e.haveAffs(["entangled","webbed"])||e.haveAnAff(["entangled","webbed"])&&(!e.haveBal(ct.WRITHE)||e.haveAff("transfixation")))),cureActionRule("dragonheal",e=>e.canUseCure("dragonheal")&&e.haveAffs(["asthma","slickness","anorexia"])&&focusLocked(e))],createRuleContext=({affModel:e,defModel:t,balanceModel:a,limbModel:n,systemModel:s,trackableModel:i,roomHasItem:o=()=>!1,cureTable:l={}})=>{let c=null;const u=new Map,getLimb=e=>n?.get?.(e)||null,isTarget=e=>Array.isArray(e)?e.some(e=>isTarget(e)):"function"==typeof s.isTarget&&s.isTarget(e);return{haveAff:t=>e.haveAff(t),haveAffs:(t=[])=>e.haveAffs(t),haveAnAff:(t=[])=>e.haveAnAff(t),affCount:t=>Number(e.get?.(t)?.count||0),cureAffCount:t=>{const a=String(t||"");if(u.has(a))return u.get(a);const n=l?.[a]?.order;let s=0;return Array.isArray(n)&&n.forEach(t=>{e.haveAff(t)&&(s+=1)}),u.set(a,s),s},canUseCure:e=>{const t=l?.[String(e||"").trim().toLowerCase()];if(!t||!1!==t.serverside||!t.command?.length)return!1;const a=Array.isArray(t.skills)?t.skills:[];return!a.length||classListIncludes(a,s.getClass())},affElapsed:t=>e.elapsed(t),sortedActiveAffs:()=>(null===c&&(c="function"==typeof e.currentSorted?e.currentSorted():[]),c),haveDef:e=>t.haveDef(e),haveDefs:(e=[])=>e.every(e=>t.haveDef(e)),haveADef:(e=[])=>e.some(e=>t.haveDef(e)),haveBal:e=>a.have(e),haveBals:(e=[])=>e.every(e=>a.have(e)),haveABal:(e=[])=>e.some(e=>a.have(e)),balElapsed:e=>a.elapsed(e),balRemaining:e=>a.remainingMs(e),suspendCuring:(e={})=>({...e&&"object"==typeof e?e:{},suspendCuring:!0}),limbDamage:e=>Number(getLimb(e)?.percent||0),limbStage:e=>getLimb(e)?.stage??"healthy",isLimbBroken:e=>!0===getLimb(e)?.broken,haveTrackable:e=>i?.have?.(e)??!1,trackableElapsed:e=>i?.elapsedMs?.(e)??Number.POSITIVE_INFINITY,trackableRemaining:e=>i?.remainingMs?.(e)??0,roomHasItem:o,isTarget,isClass:e=>s.isClass(e)}},ut=Object.freeze(["affPriorities","defPriorities","cureActions","settings","predictions"]),normalizeRule=(e,t="runtime")=>{if(!e?.id)throw new Error("Rule must include an id");if("function"!=typeof e.evaluate)throw new Error(`Rule "${e.id}" must expose evaluate(context)`);const a=Array.isArray(e.tags)?e.tags.map(e=>String(e).trim().toLowerCase()).filter(Boolean):[];return{id:String(e.id),enabled:!1!==e.enabled,terminal:!0===e.terminal,pack:e.pack||t,tags:a,meta:deepClone$1(e.meta||{}),evaluate:e.evaluate}},stripMasterSwitchSetting=(e={})=>{const{enabled:t,...a}=e||{};return a},createEmptyOverlay=()=>({affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0}),createEmptyProvenance=()=>({affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0}),createProvenanceEntry=(e,t)=>({ruleId:e.id,ruleOrder:t,pack:e.pack}),mergeOverlay=(e,t,a,n,s)=>{if(!a)return;const i=createProvenanceEntry(n,s);ut.forEach(n=>{if(!a[n]||"object"!=typeof a[n])return;const s="settings"===n?stripMasterSwitchSetting(a[n]):a[n];Object.entries(s).forEach(([a,s])=>{e[n][a]=s,t[n][a]=i})}),void 0!==a.prioAff&&(e.prioAff=a.prioAff,t.prioAff=i),Array.isArray(a.manualQueue)&&(e.manualQueue=[...a.manualQueue],t.manualQueue=i)},diffRuleActivity=(e,t)=>{const a=[];return e.forEach((e,n)=>{t.has(n)||a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{e.has(n)||a.push({...t,from:!1,to:!0})}),a},diffRuleSuspension=(e,t)=>{const a=[];return e.forEach((e,n)=>{e.suspendsCuring&&!t.get(n)?.suspendsCuring&&a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{t.suspendsCuring&&!e.get(n)?.suspendsCuring&&a.push({...t,from:!1,to:!0})}),a},createRuleRegistry=(e=[])=>{const t=[],a=new Set,n=new Map,emit=(e,t)=>{a.forEach(a=>{try{a(e,t)}catch(n){console.error("nexSys4 rule registry listener failed",{event:e,error:n})}})},findIndex=e=>t.findIndex(t=>t.id===e),synthesizeDeactivation=(e,t)=>{const a=String(e);if(!n.has(a))return!1;const s=n.get(a);return n.delete(a),emit("RuleDeactivated",{...s,source:t}),!0},addRule=(e,a={})=>{const n=normalizeRule(e,a.pack);return!(findIndex(n.id)>=0)&&(Number.isInteger(a.index)&&a.index>=0&&a.index<t.length?t.splice(a.index,0,n):t.push(n),emit("RuleAdded",{id:n.id,pack:n.pack}),!0)},removeRule=e=>{const a=findIndex(e);if(a<0)return!1;synthesizeDeactivation(e,"removed");const[n]=t.splice(a,1);return emit("RuleRemoved",{id:n.id,pack:n.pack}),!0},setEnabled=(e,a)=>{const n=findIndex(e);return!(n<0||t[n].enabled===a)&&(t[n].enabled=a,a||synthesizeDeactivation(e,"disabled"),emit(a?"RuleEnabled":"RuleDisabled",{id:e}),!0)},setPackEnabled=(e,a)=>{let n=!1;return t.forEach(t=>{t.pack===e&&(n=setEnabled(t.id,a)||n)}),n},loadPack=(e,t=[])=>{let a=!1;return t.forEach(t=>{a=addRule({...t,pack:e},{pack:e})||a}),a&&emit("RulePackLoaded",{packId:e}),a},unloadPack=e=>{const a=t.filter(t=>t.pack===e).map(e=>e.id);return!!a.length&&(a.forEach(e=>removeRule(e)),emit("RulePackUnloaded",{packId:e,count:a.length}),!0)},reorder=(e=[])=>{if(!Array.isArray(e)||!e.length)return!1;const a=new Set(t.map(e=>e.id)),n=new Set(e);if(e.length!==t.length||n.size!==t.length||[...a].some(e=>!n.has(e)))return!1;const s=new Map(t.map(e=>[e.id,e]));return t.length=0,e.forEach(e=>t.push(s.get(e))),emit("RuleOrderChanged",{order:[...e]}),!0},evaluate=(e={})=>{const a=createEmptyOverlay(),s=createEmptyProvenance(),i=[],o=new Map;for(let n=0;n<t.length;n+=1){const l=t[n];if(!l.enabled)continue;const c=l.evaluate(e);if(c&&(i.push(l.id),o.set(l.id,{id:l.id,pack:l.pack,meta:l.meta,ruleOrder:n,suspendsCuring:!0===c.suspendCuring}),mergeOverlay(a,s,c,l,n),l.terminal))break}const l=diffRuleActivity(n,o),c=diffRuleSuspension(n,o);return n.clear(),o.forEach((e,t)=>n.set(t,e)),{overlay:a,provenance:s,applied:i,transitions:l,suspendTransitions:c,suspendingRules:[...o.values()].filter(e=>e.suspendsCuring).map(e=>e.id)}};return e.forEach(e=>addRule(e,{pack:e.pack||"general"})),{onChange:e=>(a.add(e),()=>a.delete(e)),addRule,removeRule,enableRule:e=>setEnabled(e,!0),disableRule:e=>setEnabled(e,!1),enablePack:e=>setPackEnabled(e,!0),disablePack:e=>setPackEnabled(e,!1),loadPack,unloadPack,reorder,evaluate,list:()=>t.map((e,t)=>({id:e.id,ruleOrder:t,enabled:e.enabled,terminal:e.terminal,isActive:n.has(e.id),suspendsCuring:Boolean(n.get(e.id)?.suspendsCuring),pack:e.pack,tags:[...e.tags],meta:deepClone$1(e.meta)}))}},dt=new Set(["RuleAdded","RuleRemoved","RuleEnabled","RuleDisabled","RulePackLoaded","RulePackUnloaded","RuleOrderChanged"]),copyRecord=(e={})=>({...e||{}}),copyProvenanceRecord=(e={})=>Object.entries(e||{}).reduce((e,[t,a])=>(e[t]=a?{...a}:a,e),{}),copyOverlay=(e={})=>({affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),cureActions:copyRecord(e.cureActions),settings:copyRecord(e.settings),predictions:copyRecord(e.predictions),prioAff:e.prioAff,manualQueue:Array.isArray(e.manualQueue)?[...e.manualQueue]:void 0}),copyProvenance=(e={})=>({affPriorities:copyProvenanceRecord(e.affPriorities),defPriorities:copyProvenanceRecord(e.defPriorities),cureActions:copyProvenanceRecord(e.cureActions),settings:copyProvenanceRecord(e.settings),predictions:copyProvenanceRecord(e.predictions),prioAff:e.prioAff?{...e.prioAff}:void 0,manualQueue:e.manualQueue?{...e.manualQueue}:void 0}),copyRules=(e=[])=>e.map(e=>({...e,tags:[...e.tags||[]],meta:deepClone$1(e.meta||{})})),copyTransitionPayload=(e,t)=>({id:e.id,pack:e.pack,meta:e.meta,ruleOrder:e.ruleOrder,source:t,suspendsCuring:!0===e.suspendsCuring}),createRuleController=({affModel:e,defModel:t,balanceModel:a,limbModel:n,systemModel:s,trackableModel:i,roomHasItem:o=()=>!1,cureTable:l={},initialRules:c=createDefaultRulePack()}={})=>{const u=new Set,d=createRuleRegistry(c);let m=0,p={overlay:{affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0},provenance:{affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0},policy:{cureActions:{}},applied:[],suspendingRules:[],source:"initial"};const emit=(e,t)=>{m+=1,u.forEach(a=>a(e,t))};d.onChange((e,t)=>{emit(e,t)});const emitTransitions=(e,t)=>{e.transitions.forEach(e=>{e.to||emit("RuleDeactivated",copyTransitionPayload(e,t))}),e.transitions.forEach(e=>{e.to&&emit("RuleActivated",copyTransitionPayload(e,t))}),e.suspendTransitions.forEach(e=>{emit(e.to?"RuleSuspendActivated":"RuleSuspendDeactivated",copyTransitionPayload(e,t))})},g=createSnapshotCache({getVersion:()=>m,buildSnapshot:()=>({overlay:copyOverlay(p.overlay),provenance:copyProvenance(p.provenance),policy:{cureActions:copyRecord(p.policy.cureActions)},applied:[...p.applied],suspendingRules:[...p.suspendingRules],source:p.source,registry:copyRules(d.list())})}),applyLifecycleChange=e=>(e&&emit("RulesDirty",{reason:"rule-lifecycle"}),e);return{onChange:e=>(u.add(e),()=>u.delete(e)),evaluate({source:c="prompt"}={}){const u=createRuleContext({affModel:e,defModel:t,balanceModel:a,limbModel:n,systemModel:s,trackableModel:i,roomHasItem:o,cureTable:l}),m=d.evaluate(u);return p={...m,policy:{cureActions:resolveCureActions(m.overlay.cureActions,m.provenance.cureActions)},source:c},emitTransitions(m,c),emit("RulesEvaluated",{source:c,applied:[...m.applied],suspendingRules:[...m.suspendingRules]}),p},snapshot:()=>g(),getEvaluation:()=>p,resolveDefensePriority:(e,t)=>resolveEffectiveDefensePriority({storedPriority:t,overlayValue:p.overlay.defPriorities?.[e]}),lifecycle:{add:(e,t)=>applyLifecycleChange(d.addRule(e,t)),remove:e=>applyLifecycleChange(d.removeRule(e)),enable:e=>applyLifecycleChange(d.enableRule(e)),disable:e=>applyLifecycleChange(d.disableRule(e)),enablePack:e=>applyLifecycleChange(d.enablePack(e)),disablePack:e=>applyLifecycleChange(d.disablePack(e)),load:(e,t)=>applyLifecycleChange(d.loadPack(e,t)),unload:e=>applyLifecycleChange(d.unloadPack(e)),reorder:e=>applyLifecycleChange(d.reorder(e)),list:()=>d.list()},isLifecycleEvent:e=>dt.has(e)}},createCommandDispatcher=({adapter:e}={})=>{const t=[],a=200,isDebugEnabled=()=>"function"==typeof e?.isDebugEnabled&&e.isDebugEnabled(),normalizeCommands=(e=[])=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],resolveSeparator=()=>("function"==typeof e?.getCommandSeparator?e.getCommandSeparator():"|")||"|",normalizeStackPlan=e=>{if(e&&"object"==typeof e&&!Array.isArray(e)){if("stackPlan"!==e.type)return null;const t=normalizeCommands(e.commands);return t.length?{type:"stackPlan",commands:t}:null}const t=normalizeCommands(e);return t.length?{type:"stackPlan",commands:t}:null},normalizeStackPlans=(e=[])=>{if(Array.isArray(e))return e.map(normalizeStackPlan).filter(Boolean);const t=normalizeStackPlan(e);return t?[t]:[]},serializeStackPlan=e=>e.commands.join(resolveSeparator()),recordDispatch=({mode:n,commands:s=[],context:i={},stackIndex:o=1,stackCount:l=1,stackPlan:c=null}={})=>{const u=normalizeCommands(s);if(!u.length)return[];const d={mode:n,commands:[...u],context:{...i},at:e.now(),stackIndex:o,stackCount:l,stackPlan:c?{type:c.type,commands:[...c.commands]}:null};return t.push(d),!isDebugEnabled()&&t.length>a&&t.splice(0,t.length-a),u},sendCommands=(t=[],a={})=>{const n=recordDispatch({mode:"commands",commands:t,context:a});return n.length?(e.send(n,a),n):[]};return{send:sendCommands,sendCommands,sendStackPlan:(t=[],a={})=>{const n=normalizeStackPlans(t);return n.length?(n.forEach((t,s)=>{const i={...a,stackIndex:s+1,stackCount:n.length};recordDispatch({mode:"stack-plan",commands:t.commands,context:i,stackIndex:s+1,stackCount:n.length,stackPlan:t}),e.send(serializeStackPlan(t),i)}),n.map(e=>({type:e.type,commands:[...e.commands]}))):[]},normalizeCommands,history:()=>t.map(e=>({mode:e.mode,commands:[...e.commands],context:{...e.context},at:e.at,stackIndex:e.stackIndex,stackCount:e.stackCount,stackPlan:e.stackPlan?{type:e.stackPlan.type,commands:[...e.stackPlan.commands]}:null}))}},mt=Object.freeze({freeQueue:[{balanceId:ct.BALANCE,minDurationMs:250},{balanceId:ct.EQUILIBRIUM,minDurationMs:250}],fullQueue:[{balanceId:ct.BALANCE,minDurationMs:250},{balanceId:ct.EQUILIBRIUM,minDurationMs:250}],classQueue:[{balanceId:ct.ENTITY,minDurationMs:500}]}),createQueueFiredSideEffects=({balanceModel:e,now:t})=>({queueId:a})=>{const n=mt[a]||[];if(!n.length)return[];const s=t();return n.filter(({balanceId:t,minDurationMs:a})=>!1===e.have(t)&&e.computeDurationMs(t)>Number(a||0)).map(({balanceId:t})=>(e.restartLossTimer(t,`queue-fired-resync:${a}`,s),t))},createDomainControllers=({adapter:e,seedData:t,options:a={},now:n,models:s})=>{const{systemModel:i,affModel:o,balanceModel:l,defModel:c,cacheModel:u,limbModel:d,trackableModel:m,roomModel:p}=s,g=createCommandDispatcher({adapter:e}),h=createQueueFiredSideEffects({balanceModel:l,now:n}),b=createQueueController({send:g.sendStackPlan,getRuntimeState:()=>{const e=i.getRuntime();return{paused:e.paused,rulesSuspended:e.rulesSuspended,phase:e.phase,settings:i.getSettings()}},getSeparator:()=>i.getSettings().commandSeparator,maxEntriesPerSubmission:Number(a.maxEntriesPerSubmission||20),onQueueFired:h}),y=createRuleController({affModel:o,defModel:c,balanceModel:l,limbModel:d,systemModel:i,trackableModel:m,cureTable:t.cureTable,roomHasItem:p.haveItem}),v=createServersideController({adapter:e,dispatchCommands:g.sendCommands,affModel:o,defModel:c,systemModel:i,getRuleEvaluation:y.getEvaluation,options:{maxCommandsPerCycle:Number(a.maxSsCommandsPerCycle||40)}}),S=createDefensePlanner({defModel:c,balanceModel:l,affModel:o,systemModel:i,getObservedServersidePriority:e=>v.getObserved().defPriorities?.[e]??0}),x=createCurePlanner({cureTable:t.cureTable,affModel:o,balanceModel:l,systemModel:i}),k=createAutomaticActionPlanner(),C=createPrecachePlanner({cacheModel:u});return{commandDispatcher:g,queueController:b,rules:y,serverside:v,curePlanner:x,defensePlanner:S,automaticActionPlanner:k,precachePlanner:C,outputPlanner:createOutputPlanner({systemModel:i,rules:y,serverside:v,curePlanner:x,defensePlanner:S,automaticActionPlanner:k,precachePlanner:C,queueController:b})}},secondsToMs$1=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds$1=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createBalanceState=(e={})=>{const t={};return Object.entries(e||{}).forEach(([e,a])=>{t[e]={id:e,have:!0,baseDurationMs:secondsToMs$1(a.length),config:deepFreeze(deepClone$1(a||{})),lastLostAtMs:0,lastGotAtMs:0,activeDurationMs:0,expectedReadyAtMs:0,lastRecoveredDurationMs:0,lastServerDurationMs:0,callbacks:{},timer:null}}),t},createBalancePayload=(e,t={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastServerDurationMs:e.lastServerDurationMs,...t}),createBalanceMutationApi=({state:e,emit:t,now:a,setTimeoutFn:n,clearTimeoutFn:s,computeDurationMs:i})=>{const clearTimer=e=>{e.timer&&(s?.(e.timer),e.timer=null)},normalizeDurationMs=(e={},t=0)=>Number.isFinite(Number(e.durationMs))?Math.max(0,Math.round(Number(e.durationMs))):Number.isFinite(Number(e.durationSeconds))?secondsToMs$1(e.durationSeconds):Math.max(0,Math.round(Number(t)||0)),o=1e3,scheduleRecovery=(e,t)=>{clearTimer(e),!n||e.have||e.expectedReadyAtMs<=0||(e.timer=n(()=>{gain(e.id,"timer",a())},Math.max(0,e.expectedReadyAtMs+o-t)))},applyServerDuration=(e,t)=>{e.lastServerDurationMs=t},emitDurationObserved=(e,a,n,s)=>{t("BalanceDurationObserved",createBalancePayload(e,{source:s,atMs:n,durationMs:a,durationSeconds:msToSeconds$1(a)}))},createTimingPayload=(e,t,a,n)=>createBalancePayload(e,{reason:t,atMs:a,durationMs:n,durationSeconds:msToSeconds$1(n)});function gain(n,s="manual",i=a()){const o=e[n];if(!o||o.have)return!1;const l=o.activeDurationMs;return o.have=!0,o.lastGotAtMs=i,o.lastRecoveredDurationMs=Math.max(0,i-o.lastLostAtMs),o.activeDurationMs=0,o.expectedReadyAtMs=0,clearTimer(o),o.callbacks.onStop?.(o),t("BalanceGot",createTimingPayload(o,s,i,o.lastRecoveredDurationMs||l)),!0}const lose=(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||!c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.have=!1,c.lastLostAtMs=o,c.activeDurationMs=u,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),c.callbacks.onStart?.(c),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLost",createTimingPayload(c,s,o,u)),!0},observeDuration=(t,n={})=>{const s=e[t],i=normalizeDurationMs(n,0);if(!s||i<=0)return!1;const o=n.atMs??n.at??a(),l=String(n.source||"observed-duration"),c=!0===n.serverDuration;if(s.have){const e=lose(t,l,o,{durationMs:i,serverDuration:c,autoRegain:n.autoRegain});return e&&emitDurationObserved(s,i,o,l),e}return c&&applyServerDuration(s,i),s.activeDurationMs=i,s.expectedReadyAtMs=s.lastLostAtMs+i,!1!==n.autoRegain?scheduleRecovery(s,o):clearTimer(s),emitDurationObserved(s,i,o,l),!0},observeServerUse=(e,t,a={})=>observeDuration(e,{...a,durationMs:secondsToMs$1(t),serverDuration:!0,source:a.source||"serverside-duration"});return{gain,lose,restartLossTimer:(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.lastLostAtMs=o,c.activeDurationMs=u,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLossTimerRestarted",createTimingPayload(c,s,o,u)),!0},observeDuration,observeServerUse,reset(n,s="reset"){const i=e[n];return!!i&&(clearTimer(i),i.have=!0,i.lastGotAtMs=a(),i.activeDurationMs=0,i.expectedReadyAtMs=0,i.callbacks.onReset?.(i),t("BalanceReset",createBalancePayload(i,{reason:s})),!0)},setCallback(t,a={}){const n=e[t];return!!n&&(n.callbacks={...n.callbacks,...a},!0)},applyVitals(t={}){const n=toParsedGmcpVitals(t);n.balancePatches.forEach(({id:e,have:t})=>{if(!e||void 0===t)return;const n=a();t?gain(e,"gmcp-vitals",n):lose(e,"gmcp-vitals",n)}),n.resourceStats.forEach(({key:t,balanceState:n})=>{e[t]&&void 0!==n&&(n?gain(t,"gmcp-charstat",a()):lose(t,"gmcp-charstat",a()))})},dispose(){Object.values(e).forEach(clearTimer)}}},createBalanceQueryApi=({state:e,now:t,haveAff:a,getVersion:n=()=>0,getEntryVersion:s=()=>n()})=>{const buildEntrySnapshot=(e={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,baseDurationSeconds:msToSeconds$1(e.baseDurationMs),config:e.config,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,activeDurationSeconds:msToSeconds$1(e.activeDurationMs),expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(e.lastRecoveredDurationMs),lastServerDurationMs:e.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(e.lastServerDurationMs)}),i=new Map,getEntrySnapshot=t=>e[t]?(i.has(t)||i.set(t,createSnapshotCache({getVersion:()=>s(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),i.get(t)()):null,o=createSnapshotCache({getVersion:n,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),computeDurationMs=t=>{const n=e[t];if(!n)return 0;let s=Number(n.baseDurationMs||0);const i=n.config.aff_modifiers||{};return Object.entries(i).forEach(([e,t])=>{if(!a(e))return;const n=Number(t.multiplier??1),i=secondsToMs$1(t.offset??0);s=Math.round(s*n+i)}),Math.max(0,s)},elapsedMs=(a,n=t())=>{const s=e[a];return s?s.have?Math.max(0,n-s.lastGotAtMs):Math.max(0,n-s.lastLostAtMs):0},remainingMs=(a,n=t())=>{const s=e[a];return!s||s.have?0:s.expectedReadyAtMs>0?Math.max(0,s.expectedReadyAtMs-n):Math.max(0,s.activeDurationMs-elapsedMs(a,n))},timing=(a,n=t())=>{const s=e[a];if(!s)return null;const i=elapsedMs(a,n),o=remainingMs(a,n),l=computeDurationMs(a);return{id:s.id,have:s.have,atMs:n,elapsedMs:i,elapsedSeconds:msToSeconds$1(i),remainingMs:o,remainingSeconds:msToSeconds$1(o),baseDurationMs:s.baseDurationMs,baseDurationSeconds:msToSeconds$1(s.baseDurationMs),computedDurationMs:l,computedDurationSeconds:msToSeconds$1(l),activeDurationMs:s.activeDurationMs,activeDurationSeconds:msToSeconds$1(s.activeDurationMs),expectedReadyAtMs:s.expectedReadyAtMs,lastLostAtMs:s.lastLostAtMs,lastGotAtMs:s.lastGotAtMs,lastRecoveredDurationMs:s.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(s.lastRecoveredDurationMs),lastServerDurationMs:s.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(s.lastServerDurationMs)}};return{list:()=>Object.keys(e),snapshot:()=>o(),get:e=>getEntrySnapshot(e),have:t=>Boolean(e[t]?.have),elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,a=t())=>msToSeconds$1(elapsedMs(e,a)),remaining:remainingMs,remainingMs,remainingSeconds:(e,a=t())=>msToSeconds$1(remainingMs(e,a)),timing,computeDuration:computeDurationMs,computeDurationMs,computeDurationSeconds:e=>msToSeconds$1(computeDurationMs(e))}},createBalanceModel=({balanceTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n,haveAff:s=()=>!1}={})=>{const i=createBalanceState(e),o=new Set;let l=0;const c=new Map,emit=(e,t)=>{l+=1,t?.id&&c.set(t.id,(c.get(t.id)??0)+1),o.forEach(a=>a(e,t))},u=createBalanceQueryApi({state:i,now:t,haveAff:s,getVersion:()=>l,getEntryVersion:e=>c.get(e)??0}),d=createBalanceMutationApi({state:i,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n,computeDurationMs:u.computeDurationMs});return{onChange:e=>(o.add(e),()=>o.delete(e)),list:u.list,snapshot:u.snapshot,get:u.get,have:u.have,elapsed:u.elapsed,elapsedMs:u.elapsedMs,elapsedSeconds:u.elapsedSeconds,remaining:u.remaining,remainingMs:u.remainingMs,remainingSeconds:u.remainingSeconds,timing:u.timing,computeDuration:u.computeDuration,computeDurationMs:u.computeDurationMs,computeDurationSeconds:u.computeDurationSeconds,gain:d.gain,lose:d.lose,restartLossTimer:d.restartLossTimer,observeDuration:d.observeDuration,observeServerUse:d.observeServerUse,reset:d.reset,setCallback:d.setCallback,applyVitals:d.applyVitals,dispose:d.dispose}},asSet=(e={})=>Array.isArray(e)?new Set(e.map(e=>String(e).toLowerCase())):new Set(Object.keys(e).map(e=>String(e).toLowerCase())),pt=0,gt=1,createAfflictionReference=(e,t={})=>{const a=String(e||"").trim().toLowerCase();if(!a)return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1};if(t[a])return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!0};const n=a.match(/^(.*?)(?:\s*\((\d+)\)|(\d+))$/),s=Number(n?.[2]??n?.[3]),i=n?.[1]?.trim();return n&&t[i]?{raw:a,name:i,count:s,hasExplicitCount:!0,isCountable:!0}:{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1}},normalizeAfflictionName=(e,t={})=>createAfflictionReference(e,t).name,normalizeAfflictionPriorityName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable&&a.hasExplicitCount&&Number(a.count)>1?`${a.name}${a.count}`:a.name},formatAfflictionPriorityCommandName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable?a.hasExplicitCount?`${a.name}${a.count}`:`${a.name}1`:a.name},createAffEntry=(e,t,a,n=null)=>({name:e,have:!1,count:0,min:Number(n?.min??pt),max:Number(n?.max??gt),since:0,lastChangeAt:0,order:t,defaultPriority:a,priorityOverride:null,timer:null}),createInitialAfflictionState=(e={})=>{const t=e.types?.countable||{},a=[...e.list||[]].reduce((e,a)=>{const n=normalizeAfflictionName(a,t);return n&&!e.includes(n)&&e.push(n),e},[]),n=Object.entries(e.prios||{}).reduce((e,[a,n])=>{const s=normalizeAfflictionName(a,t);return s&&(e[s]=n),e},{}),s={};return a.forEach((e,a)=>{s[e]=createAffEntry(e,a,n[e]??100,t[e]||null)}),{list:a,defaultPrios:n,state:s,timedConfig:e.types?.timed||{},countableConfig:t,uncurableSet:asSet(e.types?.uncurable||{})}},ensureAffEntry=(e,t,a={},n)=>{const s=normalizeAfflictionName(n,a);return e[s]||(e[s]=createAffEntry(s,Object.keys(e).length,t[s]??100,a[s]||null)),e[s]},toPriorityNumber=e=>{const t=Number(e);return Number.isFinite(t)?t:null},getPriorityValue=e=>e?e.priorityOverride??e.defaultPriority:null,getDefaultPriorityValue=e=>e?.defaultPriority??null,setPriorityValue=(e,t)=>e.priorityOverride===t?{changed:!1,priority:t}:(e.priorityOverride=t,{changed:!0,priority:t}),resetPriorityValue=e=>{const t=e.defaultPriority;return null===e.priorityOverride||void 0===e.priorityOverride?{changed:!1,priority:t}:(e.priorityOverride=null,{changed:!0,priority:t})},setDefaultPriorityValue=(e,t,{shouldSyncCurrentPriorityToDefault:a=e=>null===e.priorityOverride||void 0===e.priorityOverride,syncCurrentPriorityToDefault:n=()=>{}}={})=>{const s=e.defaultPriority;if(s===t)return{changed:!1,currentChanged:!1,priority:t,previousDefaultPriority:s};const i=a(e);return e.defaultPriority=t,i&&n(e,t),{changed:!0,currentChanged:i,priority:t,previousDefaultPriority:s}},createAfflictionPriorityApi=({state:e,defaultPrios:t,countableConfig:a,emit:n})=>{const getEntry=(n,{ensure:s=!1}={})=>s?ensureAffEntry(e,t,a,n):e[normalizeAfflictionName(n,a)]||null;return{ensureAff:e=>getEntry(e,{ensure:!0}),getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):100},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):100},setPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setPriorityValue(i,s);return!!o.changed&&(n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority}),!0)},resetPriority(e,t="manual"){const a=getEntry(e,{ensure:!0}),s=resetPriorityValue(a);return!!s.changed&&(n("AffPriorityChanged",{name:a.name,source:t,priority:s.priority,defaultPriority:a.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setDefaultPriorityValue(i,s);return!!o.changed&&(n("AffDefaultPriorityChanged",{name:i.name,source:a,priority:o.priority,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority,defaultChanged:!0}),!0)}}},createAfflictionLifecycleApi=({state:e,defaultPrios:t,timedConfig:a,countableConfig:n,emit:s,now:i,setTimeoutFn:o,clearTimeoutFn:l})=>{const clearTimer=e=>{e.timer&&(l?.(e.timer),e.timer=null)},emitAffGot=(e,t,a)=>{s("AffGot",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitAffLost=(e,t,a)=>{s("AffLost",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitStackChanged=(e,t,a)=>{s("AffStackChanged",{name:e.name,count:e.count,previousCount:a,min:e.min,max:e.max,have:e.have,at:t})},clampCount=(e,t)=>{const a=Number(t);return Number.isFinite(a)?Math.max(e.min,Math.min(e.max,a)):e.count},scheduleTimedExpiry=e=>{const t=a[e.name];if(!t)return;clearTimer(e);const n=Math.round(1e3*Number(t.length||0));n<=0||!o||(e.timer=o(()=>{lose(e.name,{source:"timed-expiry",at:i()})},n))},applyCountableState=(e,t,a={})=>{const n=a.at??i(),s=a.source||"manual",o=e.have,l=e.count;return e.count=clampCount(e,t),e.have=e.count>0,e.have&&!o&&(e.since=n),e.lastChangeAt=n,emitStackChanged(e,n,l),!o&&e.have?emitAffGot(e,n,s):o&&!e.have&&emitAffLost(e,n,s),o},got=(a,s={})=>{const o=createAfflictionReference(a,n),l=ensureAffEntry(e,t,n,o.name),c=s.at??i(),u=s.source||"manual",d=l.have;if(n[l.name]){const e=Number(s.count);return applyCountableState(l,Number.isFinite(e)?e:o.hasExplicitCount?o.count:l.count+Number(s.countDelta??1),{at:c,source:u}),l.have?scheduleTimedExpiry(l):clearTimer(l),!0}return!d&&(l.have=!0,l.count=1,l.since=c,l.lastChangeAt=c,scheduleTimedExpiry(l),emitAffGot(l,c,u),!0)},lose=(a,s={})=>{const o=ensureAffEntry(e,t,n,createAfflictionReference(a,n).name),l=s.at??i(),c=s.source||"manual",u=o.have;if(n[o.name]){const e=Number(s.count);return applyCountableState(o,Number.isFinite(e)?e:Number.isFinite(Number(s.countDelta))?o.count-Math.abs(Number(s.countDelta)):0,{at:l,source:c}),clearTimer(o),!0}return!!u&&(o.have=!1,o.count=0,o.lastChangeAt=l,clearTimer(o),emitAffLost(o,l,c),!0)};return{got,lose,applyList(t=[]){const a=new Set,s=new Map,i=new Set;(t||[]).forEach(e=>{const t=createAfflictionReference("string"==typeof e?e:String(e?.name||e?.affliction||e||""),n);if(t.name){if(n[t.name])return t.hasExplicitCount?(i.add(t.name),void s.set(t.name,Math.max(s.get(t.name)??0,t.count))):void(i.has(t.name)||s.set(t.name,(s.get(t.name)??0)+1));a.add(t.name)}}),Object.keys(e).forEach(t=>{n[t]?s.has(t)?got(t,{source:"gmcp-list",count:s.get(t)}):(e[t].have||e[t].count>0)&&lose(t,{source:"gmcp-list"}):a.has(t)?got(t,{source:"gmcp-list"}):e[t].have&&lose(t,{source:"gmcp-list"})})},dispose(){Object.values(e).forEach(clearTimer)}}},secondsToMs=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createAfflictionQueryApi=({state:e,list:t,timedConfig:a,countableConfig:n,uncurableSet:s,getPriority:i,now:o,getVersion:l=()=>0,getEntryVersion:c=()=>l()})=>{const buildEntrySnapshot=(e={})=>({name:e.name,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride}),u=new Map,getEntrySnapshot=t=>e[t]?(u.has(t)||u.set(t,createSnapshotCache({getVersion:()=>c(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),u.get(t)()):null,d=createSnapshotCache({getVersion:l,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),elapsedMs=(t,a=o())=>{const s=e[normalizeAfflictionName(t,n)];return s?.have?Math.max(0,a-s.since):0},durationMs=e=>{const t=a[normalizeAfflictionName(e,n)];return t?secondsToMs(t.length):0},remainingMs=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s],l=durationMs(s);return!i?.have||l<=0?0:Math.max(0,l-elapsedMs(s,a))},timing=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s];if(!i)return null;const l=elapsedMs(s,a),c=durationMs(s),u=remainingMs(s,a);return{name:s,have:i.have,atMs:a,sinceMs:i.since,lastChangeAtMs:i.lastChangeAt,elapsedMs:l,elapsedSeconds:msToSeconds(l),timedDurationMs:c,timedDurationSeconds:msToSeconds(c),remainingMs:u,remainingSeconds:msToSeconds(u)}};return{snapshot:()=>d(),get:e=>getEntrySnapshot(normalizeAfflictionName(e,n)),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],getCountablePriorityNames:()=>Object.entries(n).flatMap(([e,t])=>{const a=Math.max(0,Number(t?.max??0)),n=[];for(let s=2;s<=a;s+=1)n.push(`${e}${s}`);return n}),normalizeName:e=>normalizeAfflictionName(e,n),normalizePriorityName:e=>normalizeAfflictionPriorityName(e,n),formatPriorityCommandName:e=>formatAfflictionPriorityCommandName(e,n),haveAff(t){const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)},haveAffs:(t=[])=>t.every(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),haveAnAff:(t=[])=>t.some(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),currentSorted:()=>Object.values(e).filter(e=>e.have).sort((e,t)=>{const a=i(e.name),n=i(t.name);return a!==n?a-n:e.order-t.order}).map(e=>e.name),isCountable(e){const t=normalizeAfflictionName(e,n);return Boolean(n[t])},isTimed(e){const t=normalizeAfflictionName(e,n);return Boolean(a[t])},isUncurable(e){const t=normalizeAfflictionName(e,n);return s.has(t)},elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,t=o())=>msToSeconds(elapsedMs(e,t)),remaining:remainingMs,remainingMs,remainingSeconds:(e,t=o())=>msToSeconds(remainingMs(e,t)),timing}},createAfflictionModel=({affTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n}={})=>{const{list:s,defaultPrios:i,state:o,timedConfig:l,countableConfig:c,uncurableSet:u}=createInitialAfflictionState(e),d=new Set;let m=0;const p=new Map,emit=(e,t)=>{m+=1,t?.name&&p.set(t.name,(p.get(t.name)??0)+1),d.forEach(a=>a(e,t))},getEntryVersion=e=>p.get(e)??0,g=createAfflictionPriorityApi({state:o,defaultPrios:i,countableConfig:c,emit}),h=createAfflictionLifecycleApi({state:o,defaultPrios:i,timedConfig:l,countableConfig:c,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n}),b=createAfflictionQueryApi({state:o,list:s,timedConfig:l,countableConfig:c,uncurableSet:u,getPriority:g.getPriority,now:t,getVersion:()=>m,getEntryVersion});return{onChange:e=>(d.add(e),()=>d.delete(e)),snapshot:b.snapshot,get:b.get,list:b.list,getCountablePriorityNames:b.getCountablePriorityNames,normalizeName:b.normalizeName,normalizePriorityName:b.normalizePriorityName,formatPriorityCommandName:b.formatPriorityCommandName,got:h.got,lose:h.lose,applyList:h.applyList,setPriority:g.setPriority,resetPriority:g.resetPriority,getPriority:g.getPriority,getDefaultPriority:g.getDefaultPriority,setDefaultPriority:g.setDefaultPriority,haveAff:b.haveAff,haveAffs:b.haveAffs,haveAnAff:b.haveAnAff,currentSorted:b.currentSorted,isCountable:b.isCountable,isTimed:b.isTimed,isUncurable:b.isUncurable,elapsed:b.elapsed,elapsedMs:b.elapsedMs,elapsedSeconds:b.elapsedSeconds,remaining:b.remaining,remainingMs:b.remainingMs,remainingSeconds:b.remainingSeconds,timing:b.timing,dispose:h.dispose}},createDefenseLifecycleApi=({state:e,emit:t})=>{const setStaticRequested=(a,n,s="manual")=>{const i=e[a];if(!i?.static)return!1;const o=Boolean(n);return i.staticRequested!==o&&(i.staticRequested=o,t("DefStaticRequestChanged",{id:a,requested:o,source:s}),!0)},consumeStaticPriority=(a,n="manual",s={})=>{const i=e[a];if(!i?.static)return!1;const o=isActiveStaticPriority(resolveDefensePriority(i)),l=setStaticRequested(a,!1,n);return o&&(i.priorityOverride=0,t("DefPriorityChanged",{id:a,value:0,source:n,consumed:!0,static:!0,defaultPriority:i.defaultPriority,...s})),o||l},setHave=(a,n,s="manual",i=Date.now())=>{const o=e[a];if(!o||o.have===n)return!1;o.have=n,o.lastChangeAt=i;const l={id:a,source:s,at:i,have:o.have,lastChangeAt:o.lastChangeAt,static:o.static,serverside:o.serverside,preempt:o.preempt};return t(n?"DefGot":"DefLost",l),n&&consumeStaticPriority(a,s,{triggeredByGain:!0}),!0},setStatic=(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=Boolean(n);if(i.static===o)return!1;const l=i.static,c=resolveDefensePriority(i);let u=!1,d=!1;return i.static=o,!o&&i.staticRequested&&(i.staticRequested=!1),o&&i.have&&isActiveStaticPriority(c)?(i.priorityOverride=0,d=!0,u=resolveDefensePriority(i)!==c):o||0!==i.priorityOverride||(i.priorityOverride=null,u=resolveDefensePriority(i)!==c),t("DefStaticChanged",{id:a,value:o,previousValue:l,source:s,have:i.have,static:i.static,seedStatic:i.seedStatic,defaultPriority:i.defaultPriority,currentPriority:resolveDefensePriority(i),serverside:i.serverside,preempt:i.preempt}),u&&t("DefPriorityChanged",{id:a,value:resolveDefensePriority(i),source:s,static:i.static,defaultPriority:i.defaultPriority,staticChanged:!0,consumed:d}),!0},setCommand=(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=normalizeCommandList(n);return i.command=o,t("DefCommandChanged",{id:a,value:o,source:s}),!0};return{consumeStaticPriority,requestStatic(e=[],t="manual"){let a=!1;return(e||[]).forEach(e=>{a=setStaticRequested(e,!0,t)||a}),a},clearStaticRequests(t,a="manual"){const n=Array.isArray(t)?t:Object.keys(e).filter(t=>e[t]?.staticRequested);let s=!1;return n.forEach(e=>{s=setStaticRequested(e,!1,a)||s}),s},pruneStaticRequests(t,a="planner"){let n=!1;return Object.keys(e).forEach(s=>{e[s]?.staticRequested&&!t(s,e[s])&&(n=setStaticRequested(s,!1,a)||n)}),n},setHave,setStatic,setCommand,applyList(t=[],a="gmcp-list"){const n=new Set;(t||[]).forEach(e=>{const t=normalizeObservedDefenseId(e);t&&n.add(t)}),Object.keys(e).forEach(t=>{n.has(t)?(setHave(t,!0,a),e[t].static&&consumeStaticPriority(t,a,{observedActive:!0})):e[t].have&&!e[t].clientOnly&&setHave(t,!1,a)})}}},toDefensePriorityNumber=e=>{const t=toPriorityNumber(e);return null===t?null:t<0?0:t>26?26:t},createDefensePriorityApi=({state:e,emit:t,consumeStaticPriority:a})=>{const getEntry=t=>e[t]||null,clearActiveOpps=(e,t,a)=>{isActiveDefensePriority(getPriorityValue(e))&&e.opps?.length&&e.opps.forEach(e=>{const n=getEntry(e);n&&isActiveDefensePriority(getPriorityValue(n))&&a(n,t)})};return{getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):-1},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):-1},setPriority(e,n,s="manual"){const i=toDefensePriorityNumber(n);if(null===i)return!1;const o=getEntry(e);if(!o)return!1;if(o.static&&!0===o.have&&isActiveStaticPriority(i))return a(e,s,{ignoredWhileActive:!0});const l=setPriorityValue(o,i);return!!l.changed&&(t("DefPriorityChanged",{id:o.id,value:l.priority,source:s,static:o.static,defaultPriority:o.defaultPriority}),clearActiveOpps(o,s,(e,a)=>{const n=setPriorityValue(e,0);n.changed&&t("DefPriorityChanged",{id:e.id,value:n.priority,source:a,static:e.static,defaultPriority:e.defaultPriority,clearedByOpp:o.id})}),!0)},resetPriority(e,n="manual"){const s=getEntry(e);if(!s)return!1;if(s.static&&!0===s.have)return a(e,n,{reset:!0,ignoredWhileActive:!0});const i=resetPriorityValue(s);return!!i.changed&&(t("DefPriorityChanged",{id:s.id,value:i.priority,source:n,static:s.static,defaultPriority:s.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,a,n="manual"){const s=toDefensePriorityNumber(a);if(null===s)return!1;const i=getEntry(e);if(!i)return!1;const o=setDefaultPriorityValue(i,s);return!!o.changed&&(t("DefDefaultPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&t("DefPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,defaultPriority:i.defaultPriority,defaultChanged:!0}),clearActiveOpps(i,n,(e,a)=>{const n=setDefaultPriorityValue(e,0);n.changed&&(t("DefDefaultPriorityChanged",{id:e.id,value:n.priority,source:a,static:e.static,previousDefaultPriority:n.previousDefaultPriority,currentPriority:getPriorityValue(e),clearedByOpp:i.id}),n.currentChanged&&t("DefPriorityChanged",{id:e.id,value:n.priority,source:a,static:e.static,defaultPriority:e.defaultPriority,defaultChanged:!0,clearedByOpp:i.id}))}),!0)}}},createDefenseQueryApi=({state:e,list:t,getVersion:a=()=>0,getEntryVersion:n=()=>a()})=>{const buildDefEntrySnapshot=(e={})=>({id:e.id,have:e.have,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride,priority:resolveDefensePriority(e),staticRequested:e.staticRequested,command:e.command,stopCommand:e.stopCommand,bals_req:e.bals_req,bals_used:e.bals_used,stopBals_req:e.stopBals_req,stopBals_used:e.stopBals_used,blocks:e.blocks,stopBlocks:e.stopBlocks,skills:e.skills,opps:e.opps,serverside:e.serverside,preempt:e.preempt,static:e.static,clientOnly:e.clientOnly,trackOnly:e.trackOnly}),s=new Map,getDefSnapshot=t=>e[t]?(s.has(t)||s.set(t,createSnapshotCache({getVersion:()=>n(t),buildSnapshot:()=>buildDefEntrySnapshot(e[t])})),s.get(t)()):null,i=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=resolveDefensePriority(e[a]),t),{})}),o=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Number(e[a].defaultPriority??-1),t),{})}),l=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Boolean(e[a]?.static),t),{})}),c=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(Boolean(e[a]?.static)!==Boolean(e[a]?.seedStatic)&&(t[a]=Boolean(e[a]?.static)),t),{})}),u=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(e[a]?.staticRequested&&(t[a]=!0),t),{})}),d=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getDefSnapshot(t),e),{})});return{snapshot:()=>d(),get:e=>getDefSnapshot(e),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],isAvailableForClass:(t,a="")=>matchesClass(e[t]?.skills,a),haveDef:t=>Boolean(e[t]?.have),getPriority(t){const a=e[t];return a?resolveDefensePriority(a):-1},getDefaultPriority:t=>Number(e[t]?.defaultPriority??-1),getPriorities:()=>i(),getDefaultPriorities:()=>o(),getStatics:()=>l(),getStaticOverrides:()=>c(),getStaticRequests:()=>u(),isStaticRequested:t=>Boolean(e[t]?.staticRequested),isStatic:t=>Boolean(e[t]?.static)}},createDefenseModel=({defTable:e={},defPrios:t={}}={})=>{const{state:a,list:n}=createInitialDefenseState({defTable:e,defPrios:t}),s=new Set;let i=0;const o=new Map,emit=(e,t)=>{i+=1,t?.id&&o.set(t.id,(o.get(t.id)??0)+1),s.forEach(a=>a(e,t))},getEntryVersion=e=>o.get(e)??0,l=createDefenseLifecycleApi({state:a,emit}),c=createDefensePriorityApi({state:a,emit,consumeStaticPriority:l.consumeStaticPriority}),u=createDefenseQueryApi({state:a,list:n,getVersion:()=>i,getEntryVersion});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:u.snapshot,get:u.get,list:u.list,isAvailableForClass:u.isAvailableForClass,haveDef:u.haveDef,isStatic:u.isStatic,setStatic:l.setStatic,setCommand:l.setCommand,setHave:l.setHave,applyList:l.applyList,requestStatic:l.requestStatic,clearStaticRequests:l.clearStaticRequests,pruneStaticRequests:l.pruneStaticRequests,setPriority:c.setPriority,setDefaultPriority:c.setDefaultPriority,resetPriority:c.resetPriority,getPriority:c.getPriority,getDefaultPriority:c.getDefaultPriority,getDefaultPriorities:u.getDefaultPriorities,getPriorities:u.getPriorities,getStatics:u.getStatics,getStaticOverrides:u.getStaticOverrides,getStaticRequests:u.getStaticRequests,isStaticRequested:u.isStaticRequested}},ft=1e4,ht=["brokenleftarm","damagedleftarm","mangledleftarm"],bt=["brokenrightarm","damagedrightarm","mangledrightarm"],createCachePrecacheSupport=({state:e,haveAff:t=()=>!1,haveDef:a=()=>!1}={})=>{const isPrecacheBlocked=()=>{if(t("aeon")||a("prismatic"))return!0;const e=ht.some(e=>t(e)),n=bt.some(e=>t(e));return!(!e||!n)},buildPrecacheCommands=()=>isPrecacheBlocked()?[]:e.hydration.inventoryKnown&&e.hydration.riftKnown?Object.entries(e.desiredPrecache).flatMap(([t,a])=>{const n=toNumber(e.inventory[t],0),s=toNumber(e.rift[t],0),i=Math.max(0,toNumber(e.riftCapacity,ft)),o=Math.max(0,toNumber(a,0)),l=Math.max(0,o-n),c=Math.max(0,n-o),u=Math.min(l,s),d=Math.max(0,i-s);return u>0?[`outr ${u} ${t}`]:c>0&&d>0?[`inr ${Math.min(c,d)} ${t}`]:[]}):[];return{getPrecacheCommands:()=>buildPrecacheCommands(),isPrecacheBlocked,isHydrated:()=>e.hydration.inventoryKnown&&e.hydration.riftKnown,getTotal:t=>toNumber(e.inventory[t],0)+toNumber(e.rift[t],0)}},findCaseInsensitiveKey=(e={},t="")=>{if(!e||"object"!=typeof e)return null;const a=String(t).toLowerCase();return Object.keys(e).find(e=>String(e).toLowerCase()===a)||null},createCacheNameNormalizer=({cacheTable:e={},cacheNames:t={}}={})=>{const a=t.herb_name_to_herb||{},n=new Set(Object.keys(e)),toCount=(e,t=1)=>Math.max(0,toNumber(e,t)),resolveName=e=>{if(!e)return"";const t=String(e).trim().toLowerCase();return a[t]||t},resolveCountedName=e=>{const t=resolveName(e);if(n.has(t)||!t.endsWith("s"))return t;const a=resolveName(t.slice(0,-1));return n.has(a)?a:t},parseNameAndAmount=(e,t)=>{const a=String(e||"").trim().toLowerCase();if(!a)return{name:"",amount:Math.max(0,toNumber(t,1))};const s=a.match(/^a group of\s+(\d+)\s+(.+)$/);if(s){const[,e,a]=s,i=resolveCountedName(a);if(n.has(i))return{name:i,amount:toCount(t,toNumber(e,1))}}const i=a.match(/^(\d+)\s+(.+)$/);if(i){const[,e,a]=i,s=resolveCountedName(a);if(n.has(s))return{name:s,amount:toCount(t,toNumber(e,1))}}return{name:resolveCountedName(a),amount:toCount(t,1)}};return{resolveName,parseNameAndAmount,normalizeName:e=>parseNameAndAmount(e).name}},readGmcpPath=(e={},t=[])=>{const a=findCaseInsensitiveKey(e,t.join("."));if(a)return e[a];let n=e;for(const s of t){if(!n||"object"!=typeof n)return;const e=findCaseInsensitiveKey(n,s);if(!e)return;n=n[e]}return n},createCacheStateSupport=({state:e,emit:t=()=>{},cacheTable:a={},cacheNames:n={}}={})=>{const{parseNameAndAmount:s,normalizeName:i}=createCacheNameNormalizer({cacheTable:a,cacheNames:n}),o={invAddsById:new Map,roomRemovesById:new Map,appliedIds:new Set},normalizeItemId=e=>null==e||""===e?"":String(e),adjustInventoryAmount=(a,n,s="inventory-delta")=>!(!a||!(a in e.inventory))&&(e.inventory[a]=Math.max(0,e.inventory[a]+toNumber(n,0)),t("CacheAmountChanged",{bucket:"inventory",name:a,amount:e.inventory[a],source:s}),!0),parseInventoryEntry=(e={})=>{const t=e?.item||e,a=s(t?.name||t?.item||t,t?.amount??t?.count??t?.qty??e?.amount??e?.count??e?.qty);return{id:normalizeItemId(t?.id??e?.id),location:String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),name:a.name,amount:a.amount,icon:t?.icon??e?.icon,attrib:t?.attrib??e?.attrib}},storeInventoryCurative=(t={})=>{if(!t.id||!t.name||!(t.name in e.inventory))return!1;const a={name:t.name,amount:t.amount,location:t.location||"inv"};return void 0!==t.icon&&null!==t.icon&&(a.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(a.attrib=t.attrib),e.inventoryCurativesById[t.id]=a,!0},deleteInventoryCurative=t=>{const a=normalizeItemId(t);return!(!a||!(a in e.inventoryCurativesById))&&(delete e.inventoryCurativesById[a],!0)},deleteInventoryCurativesByName=t=>{let a=!1;return Object.entries(e.inventoryCurativesById).forEach(([n,s])=>{s?.name===t&&(delete e.inventoryCurativesById[n],a=!0)}),a},emitInventoryIdentityChanged=()=>{t("CacheInventoryIdentityChanged",{...e.inventoryCurativesById})},buildResult=({changed:e=!1,identityChanged:t=!1,name:a="",amount:n=0,delta:s=0,source:i=""}={})=>({changed:e,identityChanged:t,name:a,amount:n,delta:s,source:i}),readInventorySnapshot=(e={})=>{const t=readGmcpPath(e,["Char","Items","List"]);if(void 0!==t)return t;const a=readGmcpPath(e,["Items","Inv"]);return void 0!==a?{location:"inv",items:a}:void 0},setAmount=(a,n,s,o="manual")=>{const l=i(n);if(!l||!(l in e[a]))return!1;const c=Math.max(0,toNumber(s,e[a][l]));return e[a][l]=c,t("CacheAmountChanged",{bucket:a,name:l,amount:c,source:o}),!0},setRiftCapacity=(a,n="manual")=>{const s=toNumber(e.riftCapacity,ft),i=Math.max(0,toNumber(a,s));return i!==e.riftCapacity&&(e.riftCapacity=i,t("CacheRiftCapacityChanged",{amount:i,source:n}),!0)},observeInventorySnapshot=(a=[])=>{const n={...e.inventory},s={};Object.keys(n).forEach(e=>{n[e]=0}),(a||[]).forEach(e=>{const t=parseInventoryEntry(e);if("inv"===t.location&&t.name&&t.name in n&&(n[t.name]+=t.amount,t.id)){const e={name:t.name,amount:t.amount,location:t.location};void 0!==t.icon&&null!==t.icon&&(e.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(e.attrib=t.attrib),s[t.id]=e}}),e.inventory=n,e.inventoryCurativesById=s,e.hydration.inventoryKnown=!0,t("CacheInventoryListApplied",{...e.inventory})},applyRoomPickupTransfer=t=>{if(!t||o.appliedIds.has(t))return null;const a=o.invAddsById.get(t),n=o.roomRemovesById.get(t);if(!a||!n)return null;const s=a.name&&a.name in e.inventory,i=Math.max(0,toNumber(a.amount,0)),l=n.name&&n.name in e.inventory,c=Math.max(0,toNumber(n.amount,0)),u=s&&i>0?a:l&&c>0?n:null;if(o.invAddsById.delete(t),o.roomRemovesById.delete(t),o.appliedIds.add(t),!u)return null;const d=Math.max(0,toNumber(u.amount,0));return!u.name||!(u.name in e.inventory)||d<=0?null:adjustInventoryAmount(u.name,d,"gmcp:room-pickup")?buildResult({changed:!0,name:u.name,amount:d,delta:d,source:"gmcp:room-pickup"}):null},observeRoomPickupCandidate=(e,t)=>{if(!e.id||o.appliedIds.has(e.id))return null;if("inv"===e.location&&"add"===t)o.invAddsById.set(e.id,e);else{if("room"!==e.location||"remove"!==t)return null;o.roomRemovesById.set(e.id,e)}return applyRoomPickupTransfer(e.id)},observeRiftSnapshot=(a={})=>{const n=a.items||a,i=Array.isArray(n)?n:Object.entries(n).map(([e,t])=>({name:e,amount:t})),o={...e.rift};Object.keys(o).forEach(e=>{o[e]=0}),i.forEach(e=>{const t=s(e.name||e.item||e,e.amount??e.count??e.qty??0);t.name&&t.name in o&&(o[t.name]=t.amount)}),e.rift=o,e.hydration.riftKnown=!0,t("CacheRiftListApplied",{...e.rift})},hydrateFromGmcp=(e={})=>{let t=!1;const a=readInventorySnapshot(e);void 0!==a&&(Array.isArray(a)?(observeInventorySnapshot(a),t=!0):"inv"===String(a?.location??a?.Location??"inv").toLowerCase()&&(observeInventorySnapshot(a?.items||[]),t=!0));const n=readGmcpPath(e,["IRE","Rift","List"]);return void 0!==n&&(observeRiftSnapshot(n||{}),t=!0),t};return{observeInventorySnapshot,observeItemDelta:(t={})=>{const a=parseInventoryEntry(t),n=String(t.action||"").toLowerCase(),s=String(t.direction||"").toLowerCase(),i=n||s;let o=!1;if("inv"===a.location){const t=a.id&&e.inventoryCurativesById[a.id]||null;"add"===i?a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):"remove"===i?(o=!!t&&deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):"update"===i?a.name&&a.name in e.inventory?(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):t&&(o=deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged())}const l=observeRoomPickupCandidate(a,i);return l?{...l,identityChanged:o}:buildResult({identityChanged:o})},observeRiftSnapshot,observeRiftChange:(t={})=>{const a=t.amount??t.count??t.qty;if(null==a||""===a)return!1;const n=s(t.name||t.item||t.desc||t,a);return!(!n.name||!(n.name in e.rift))&&(setAmount("rift",n.name,n.amount,"gmcp:rift-change"),{name:n.name,riftAmount:e.rift[n.name]})},observeRiftOutText:({item:t,name:a,amount:n=1,riftAmount:i}={})=>{const o=s(t||a,n);if(!o.name||!(o.name in e.inventory)||!(o.name in e.rift))return!1;const l=Math.max(0,toNumber(n,o.amount));return!(l<=0)&&(adjustInventoryAmount(o.name,l,"text:rift-out"),setAmount("rift",o.name,i,"text:rift-out"),{name:o.name,amount:l,riftAmount:e.rift[o.name]})},observeRiftInText:({item:t,name:a,amount:n=1,riftAmount:i,atCapacity:o=!1}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory)||!(l.name in e.rift))return!1;const c=Math.max(0,toNumber(n,l.amount));return!(c<=0)&&(adjustInventoryAmount(l.name,-c,"text:rift-in"),setAmount("rift",l.name,i,"text:rift-in"),o&&setRiftCapacity(i,"text:rift-in-max"),{name:l.name,amount:c,riftAmount:e.rift[l.name],riftCapacity:e.riftCapacity})},invalidateRiftSnapshot:({source:a="rift-resync"}={})=>!!e.hydration.riftKnown&&(e.hydration.riftKnown=!1,t("CacheRiftSnapshotInvalidated",{source:a}),!0),observeInventoryDeltaText:({item:t,name:a,amount:n,delta:i,source:o="text:inventory"}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory))return!1;const c=Math.max(0,toNumber(n,l.amount)),u=toNumber(i,0);if(c<=0||0===u)return!1;const d=u>0?c:-c;return adjustInventoryAmount(l.name,d,o),{name:l.name,amount:c,delta:d,inventoryAmount:e.inventory[l.name]}},observeInventoryEmptyText:({item:t,name:a,source:n="text:inventory-empty"}={})=>{const i=s(t||a,0);if(!i.name||!(i.name in e.inventory))return!1;const o=e.inventory[i.name],l=deleteInventoryCurativesByName(i.name);return l&&emitInventoryIdentityChanged(),setAmount("inventory",i.name,0,n),{changed:0!==o||l,identityChanged:l,name:i.name,amount:0,delta:-o,inventoryAmount:e.inventory[i.name],source:n}},observeCurativeConsumedText:({item:t,name:a,amount:n=1}={})=>{const i=s(t||a,n);if(!i.name||!(i.name in e.inventory))return!1;const o=Math.max(0,toNumber(n,i.amount));return!(o<=0)&&(adjustInventoryAmount(i.name,-o,"text:consume"),{name:i.name,amount:o,inventoryAmount:e.inventory[i.name]})},completeObservationBlock:()=>{o.invAddsById.clear(),o.roomRemovesById.clear(),o.appliedIds.clear()},hydrateFromGmcp,setDesiredPrecache:(a={})=>{Object.entries(a).forEach(([t,a])=>{t in e.desiredPrecache&&(e.desiredPrecache[t]=Math.max(0,toNumber(a,0)))}),t("CacheDesiredPrecacheChanged",{...e.desiredPrecache})}}},createCacheModel=({cacheTable:e={},cacheNames:t={},haveAff:a=()=>!1,haveDef:n=()=>!1}={})=>{const s=new Set;let i=0;const o={inventory:{...e},rift:{...e},riftCapacity:ft,inventoryCurativesById:{},desiredPrecache:Object.keys(e).reduce((e,t)=>(e[t]=0,e),{}),hydration:{inventoryKnown:!1,riftKnown:!1}},emit=(e,t)=>{i+=1,s.forEach(a=>a(e,t))},l=createSnapshotCache({getVersion:()=>i,buildSnapshot:()=>({inventory:{...o.inventory},rift:{...o.rift},riftCapacity:o.riftCapacity,inventoryCurativesById:Object.entries(o.inventoryCurativesById).reduce((e,[t,a])=>(e[t]={...a},e),{}),desiredPrecache:{...o.desiredPrecache},hydration:{...o.hydration}})});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:()=>l(),...createCacheStateSupport({state:o,emit,cacheTable:e,cacheNames:t}),...createCachePrecacheSupport({state:o,haveAff:a,haveDef:n}),getDesiredPrecache:()=>({...o.desiredPrecache})}},yt={loadOnLogin:!1,flushSafetyMs:250,maxSendPerChunk:20,queueWhilePaused:!1,overrideTab:!1,customPrompt:!0,debug:!1,notices:{affGot:!0,affLost:!0,defGot:!0,defLost:!0,balanceLost:!1,balanceRecovered:!1,trackableGot:!1,trackableLost:!1,priority:!0,output:!1},ss:{transmutation:!0,sipPriority:"health",sipHealthAt:80,sipManaAt:70,mossHealthAt:90,mossManaAt:80,focus:!0,focusOverHerbs:!0,tree:"on",clot:!0,clotAt:19,fracturesAbove:35,manaThreshold:10,batch:!0}},vt={paused:!0,rulesSuspended:!1,slowMode:!1,aeonLocked:!1,phase:he.IDLE,startupFailureMessage:""},St={name:"",class:"",race:"",color:"",hp:0,maxhp:0,mp:0,maxmp:0,ep:0,maxep:0,wp:0,maxwp:0,bleed:0,rage:0,dead:!1,mount:null,wielded:{left:null,right:null}},xt={id:"",text:"",isPlayer:null,hp:""},getChangedPatchKeys=(e={},t,a)=>Object.keys(e||{}).filter(e=>JSON.stringify(a[e])!==JSON.stringify(t[e])),createSystemConfigApi=({state:e,emit:t})=>({getRuntime:()=>e.runtime,getSettings:()=>e.settings,getBaselineIntent:()=>e.baselineIntent,setRuntime(a={}){const n=e.runtime,s=deepMerge(e.runtime,a),i=Object.keys(s).filter(e=>s[e]!==n[e]);if(!i.length)return!1;const o=n.paused;return e.runtime=s,e.runtime.paused!==o&&t("PauseStateChanged",{paused:e.runtime.paused}),t("RuntimeStateChanged",{current:e.runtime,changedKeys:i}),!0},setSettings(a={},n={}){const s=e.settings,i=deepMerge(e.settings,a),o=getChangedPatchKeys(a,s,i);return!!o.length&&(e.settings=i,n.setBaseline&&(e.baselineIntent=deepMerge(e.baselineIntent,a)),t("SettingsChanged",{current:e.settings,patch:a,changedKeys:o}),!0)},setBaselineIntent(a={}){const n=e.baselineIntent,s=deepMerge(e.baselineIntent,a),i=getChangedPatchKeys(a,n,s);return!!i.length&&(e.baselineIntent=s,t("BaselineIntentChanged",{current:e.baselineIntent,patch:a,changedKeys:i}),!0)}}),collectChangedFields=(e={})=>{const t={};return Object.entries(e).forEach(([e,[a,n]])=>{a!==n&&(t[e]={previous:a,current:n})}),t},kt=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],normalizeResourceKey=e=>String(e||"").trim().toLowerCase(),hasOwn$2=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),normalizeResourceValue=(e,t={})=>{if(!t.numeric)return{valid:!0,value:e};const a=Number(e);if(!Number.isFinite(a))return{valid:!1,value:void 0};const n=Number(t.min),s=Number(t.max);let i=a;return Number.isFinite(n)&&i<n&&(i=n),Number.isFinite(s)&&i>s&&(i=s),{valid:!0,value:i}},isDragonClass=(e="")=>/\bdragon\b/i.test(String(e||"")),getDragonColor=(e="")=>{const t=String(e||"").trim().split(/\s+/).filter(Boolean),a=t.findIndex(e=>"dragon"===e.toLowerCase()),n=a>0?t[a-1]:"";return n?n[0].toUpperCase()+n.slice(1).toLowerCase():""},normalizeStatusClass=({className:e="",race:t="",classProvided:a=!1,raceProvided:n=!1}={})=>{const s=String(e||"").trim(),i=String(t||"").trim(),o=isDragonClass(s),l=isDragonClass(i);return o||!a&&n&&l?{className:"Dragon",color:getDragonColor(s)||getDragonColor(i)}:{className:normalizeClassName(s),color:""}},createSystemCharacterApi=({state:e,emit:t})=>{let a=new Set;return{updateVitals(n={}){const s=toParsedGmcpVitals(n),i=s.resourceStats.filter(({balanceState:e})=>void 0===e),o=new Set(i.map(({key:e})=>e)),l=[...a].filter(e=>!o.has(e)),c={dead:e.char.dead};kt.forEach(t=>{c[t]=e.char[t]}),[...i.map(({key:e})=>e),...l].forEach(t=>{t in c||(c[t]=e.char[t])}),kt.forEach(t=>{void 0!==s.vitals[t]&&(e.char[t]=s.vitals[t])}),i.forEach(({key:t,value:a})=>{e.char[t]=a}),l.forEach(t=>{delete e.char[t]}),a=o,e.char.dead=e.char.hp<=0;const u={dead:[c.dead,e.char.dead]};kt.forEach(t=>{u[t]=[c[t],e.char[t]]}),i.forEach(({key:t})=>{u[t]=[c[t],e.char[t]]}),l.forEach(t=>{u[t]=[c[t],e.char[t]]});const d=collectChangedFields(u);return!!Object.keys(d).length&&(t("VitalsUpdated",{current:e.char,hpDiff:e.char.hp-c.hp,mpDiff:e.char.mp-c.mp,changedFields:d}),e.char.dead&&!c.dead&&t("DeathDetected",{hp:e.char.hp,previousHp:c.hp}),!0)},updateResource(a,n,s={}){const i=normalizeResourceKey(a);if(!i)return!1;const o=normalizeResourceValue(n,s);if(!o.valid)return!1;const l=e.char[i];return!Object.is(l,o.value)&&(e.char[i]=o.value,t("VitalsUpdated",{current:e.char,hpDiff:0,mpDiff:0,changedFields:{[i]:{previous:l,current:o.value}},source:String(s.source||"manual")}),!0)},updateStatus(a={}){const n={name:e.char.name,class:e.char.class,race:e.char.race,color:e.char.color};hasOwn$2(a,"name")&&(e.char.name=a.name??""),hasOwn$2(a,"race")&&(e.char.race=a.race??"");const s=hasOwn$2(a,"class"),i=hasOwn$2(a,"race");if(s||i){const t=normalizeStatusClass({className:s?a.class:e.char.class,race:e.char.race,classProvided:s,raceProvided:i});e.char.class=t.className,e.char.color=t.color}const o=collectChangedFields({name:[n.name,e.char.name],class:[n.class,e.char.class],race:[n.race,e.char.race],color:[n.color,e.char.color]});return!!Object.keys(o).length&&(n.class!==e.char.class&&t("ClassChanged",{class:e.char.class,previousClass:n.class}),t("StatusUpdated",{current:e.char,changedFields:o}),!0)},updateWielded(a,n){if("left"!==a&&"right"!==a)return!1;const s=e.char.wielded[a],i=n?{id:n.id??null,name:String(n.name||""),icon:n.icon||null}:null;return(null!==s||null!==i)&&((!s||!i||s.id!==i.id||s.name!==i.name)&&(e.char.wielded[a]=i,t("WieldedUpdated",{side:a,current:i,previous:s}),!0))},updateMount(a){const n=e.char.mount,s=a?{name:String(a.name||""),id:a.id??null}:null;return n!==s&&((!n||!s||n.name!==s.name||n.id!==s.id)&&(e.char.mount=s,t("MountUpdated",{current:s,previous:n}),!0))},getChar:()=>e.char,getClass:()=>e.char.class,checkClass:t=>classesMatch(e.char.class,t),isClass:t=>void 0===t||!!t&&(Array.isArray(t)?t.some(t=>classesMatch(e.char.class,t)):classesMatch(e.char.class,t))}},Ct=["Text","text","short_desc"],hasOwn$1=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),getProvidedValue=(e,t,a,n="")=>{for(const s of t)if(hasOwn$1(e,s))return e[s]??n;return a},deriveIsPlayer=e=>"-1"===String(e),createSystemTargetApi=({state:e,emit:t})=>({updateTarget(a={}){const n=e.target,s={id:getProvidedValue(a,["id","ID"],n.id),text:getProvidedValue(a,Ct,n.text),hp:getProvidedValue(a,["HP","hp","hpperc"],n.hp)};if(s.isPlayer=deriveIsPlayer(s.id),s.id===n.id&&s.text===n.text&&s.hp===n.hp&&s.isPlayer===n.isPlayer)return!1;e.target=s;const i=Ct.some(e=>hasOwn$1(a,e)),o=s.id!==n.id||s.text!==n.text;return!(!i||!o)&&(t("TargetUpdated",{current:e.target,changedFields:collectChangedFields({id:[n.id,s.id],text:[n.text,s.text],isPlayer:[n.isPlayer,s.isPlayer],hp:[n.hp,s.hp]})}),!0)},isTarget(t){if(null==t)return!1;const a=String(t).toLowerCase();return e.target.text.toLowerCase()===a||String(e.target.id).toLowerCase()===a}}),createSystemModel=(e={})=>{const t={settings:deepMerge(yt,e.settings||{}),baselineIntent:deepMerge(yt,e.baselineIntent||{}),runtime:deepMerge(vt,e.runtime||{}),char:deepMerge(St,e.char||{}),target:deepMerge(xt,e.target||{})};t.runtime={...t.runtime};const a=new Set;let n=0;const emit=(e,t)=>{n+=1,a.forEach(a=>a(e,t))},s=createSystemConfigApi({state:t,emit}),i=createSystemCharacterApi({state:t,emit}),o=createSystemTargetApi({state:t,emit}),copySettingsBucket=(e={})=>({...e,notices:{...e.notices||{}},ss:{...e.ss||{}}}),copyCharSnapshot=(e={})=>({...e,mount:e.mount?{...e.mount}:null,wielded:{left:e.wielded?.left?{...e.wielded.left}:null,right:e.wielded?.right?{...e.wielded.right}:null}}),copyTargetSnapshot=(e={})=>({...e}),l=createSnapshotCache({getVersion:()=>n,buildSnapshot:()=>({settings:copySettingsBucket(t.settings),baselineIntent:copySettingsBucket(t.baselineIntent),runtime:{...t.runtime},char:copyCharSnapshot(t.char),target:copyTargetSnapshot(t.target)})});return{onChange:e=>(a.add(e),()=>a.delete(e)),snapshot:()=>l(),getRuntime:s.getRuntime,getSettings:s.getSettings,getBaselineIntent:s.getBaselineIntent,setRuntime:s.setRuntime,setSettings:s.setSettings,setBaselineIntent:s.setBaselineIntent,updateVitals:i.updateVitals,updateResource:i.updateResource,updateStatus:i.updateStatus,updateWielded:i.updateWielded,updateMount:i.updateMount,getChar:i.getChar,getClass:i.getClass,checkClass:i.checkClass,isClass:i.isClass,updateTarget:o.updateTarget,isTarget:o.isTarget}},normalizeTrackableId=e=>String(e??"").trim(),isValidTrackableDuration=e=>Number.isFinite(e)&&Number.isInteger(e)&&e>0,normalizeTrackableLabel=(e,t)=>("string"==typeof e?e.trim():"")||t,createTrackableEntry=(e,t)=>({id:e,label:t.label,have:!1,since:0,expiresAt:0,durationMs:t.durationMs,lastChangeAt:0,source:"",timer:null,generation:0}),createTrackableStateView=e=>({id:e.id,label:e.label,have:e.have,since:e.since,expiresAt:e.expiresAt,durationMs:e.durationMs,lastChangeAt:e.lastChangeAt,source:e.source}),At="manual",normalizeDefinition=(e,t)=>{const a=normalizeTrackableId(e);if(!a||a!==e||"string"!=typeof t?.label||!t.label.trim()||!isValidTrackableDuration(t?.durationMs))throw new Error(`Invalid trackable definition: ${String(e)}`);return{label:t.label.trim(),durationMs:t.durationMs}},normalizeSource=(e,t=At)=>("string"==typeof e?e.trim():"")||t,createTrackableModel=({definitions:e={},now:t=()=>Date.now(),setTimeoutFn:a=(e,t)=>setTimeout(e,t),clearTimeoutFn:n=e=>clearTimeout(e)}={})=>{const s={},i={},o=new Set,l=new Map;let c=0,u=!1;Object.entries(e||{}).forEach(([e,t])=>{const a=normalizeDefinition(e,t);s[e]=a,i[e]=createTrackableEntry(e,a),l.set(e,0)});const readNow=()=>{const e=Number(t());return Number.isFinite(e)?e:0},emit=(e,t)=>{c+=1,l.set(t.name,(l.get(t.name)??0)+1),o.forEach(a=>a(e,t))},clearEntryTimer=e=>{null!==e.timer&&(n(e.timer),e.timer=null)},nextGeneration=e=>(e.generation+=1,e.generation),isActiveAt=(e,t)=>Boolean(e?.have&&e.expiresAt>t),d=new Map,getEntrySnapshot=e=>i[e]?(d.has(e)||d.set(e,createSnapshotCache({getVersion:()=>l.get(e)??0,buildSnapshot:()=>createTrackableStateView(i[e])})),d.get(e)()):null,m=createSnapshotCache({getVersion:()=>c,buildSnapshot:()=>Object.keys(i).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),resolveAt=(e={})=>{if(void 0===e.at)return readNow();const t=Number(e.at);return Number.isFinite(t)?t:null},lose=(e,t={})=>{if(u)return!1;const a=normalizeTrackableId(e),n=i[a];if(!a||!n?.have)return!1;const s=void 0!==t.at,o=resolveAt(t);return!(null===o||s&&o<n.since)&&(clearEntryTimer(n),nextGeneration(n),n.have=!1,n.since=0,n.expiresAt=0,n.lastChangeAt=o,n.source=normalizeSource(t.source),emit("TrackableLost",{name:a,label:n.label,have:!1,at:o,since:0,expiresAt:0,durationMs:n.durationMs,source:n.source,reason:normalizeSource(t.reason,"observed")}),!0)},scheduleExpiry=e=>{const t=e.generation;e.timer=a(()=>{u||e.generation!==t||(e.timer=null,lose(e.id,{source:"timer",reason:"expired",at:readNow()}))},e.expiresAt-readNow())},got=(e,t={})=>{if(u)return!1;const a=normalizeTrackableId(e);if(!a)return!1;const n=s[a],o=n?.durationMs??Number(t.durationMs);if(!isValidTrackableDuration(o))return!1;const c=resolveAt(t);if(null===c)return!1;const d=readNow(),m=c+o;if(m<=d)return!1;let p=i[a];if(p&&c<p.lastChangeAt)return!1;const g=isActiveAt(p,d),h=p?.since??0,b=p?.expiresAt??0;p?clearEntryTimer(p):(p=createTrackableEntry(a,{label:normalizeTrackableLabel(t.label,a),durationMs:o}),i[a]=p,l.set(a,0)),nextGeneration(p),p.label=normalizeTrackableLabel(t.label,n?.label||p.label||a),p.have=!0,p.since=c,p.expiresAt=m,p.durationMs=o,p.lastChangeAt=c,p.source=normalizeSource(t.source);const y={name:a,label:p.label,have:!0,at:c,since:c,expiresAt:m,durationMs:o,source:p.source};return g?emit("TrackableRefreshed",{...y,previousSince:h,previousExpiresAt:b}):emit("TrackableGot",y),scheduleExpiry(p),!0},elapsedMs=(e,t=readNow())=>{const a=i[normalizeTrackableId(e)];return isActiveAt(a,t)?Math.max(0,t-a.since):Number.POSITIVE_INFINITY},remainingMs=(e,t=readNow())=>{const a=i[normalizeTrackableId(e)];return isActiveAt(a,t)?Math.max(0,a.expiresAt-t):0};return{onChange:e=>u||"function"!=typeof e?()=>{}:(o.add(e),()=>o.delete(e)),snapshot:()=>m(),get:e=>getEntrySnapshot(normalizeTrackableId(e)),list:()=>Object.keys(i),have:e=>isActiveAt(i[normalizeTrackableId(e)],readNow()),elapsedMs,remainingMs,timing(e){const t=normalizeTrackableId(e),a=i[t];if(!a)return null;const n=readNow();return{id:t,have:isActiveAt(a,n),atMs:n,sinceMs:a.since,expiresAtMs:a.expiresAt,lastChangeAtMs:a.lastChangeAt,durationMs:a.durationMs,elapsedMs:elapsedMs(t,n),remainingMs:remainingMs(t,n)}},got,lose,dispose(){u||(u=!0,Object.values(i).forEach(e=>{clearEntryTimer(e),nextGeneration(e)}),o.clear())}}},sameRecord=(e,t)=>Object.keys(e).length===Object.keys(t).length&&Object.keys(e).every(a=>Object.hasOwn(t,a)&&e[a]===t[a]),copyWalls=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Object.fromEntries(Object.keys(t).map(e=>[e,{type:e}]))])),sameWalls=(e,t)=>Object.keys(e).length===Object.keys(t).length&&Object.entries(e).every(([e,a])=>t[e]&&Object.keys(a).length===Object.keys(t[e]).length&&Object.keys(a).every(a=>Object.hasOwn(t[e],a))),createRoomModel=({wallTable:e={},readRoomItems:t=()=>null}={})=>{const a={id:null,name:"",exits:{},walls:{},frozenGround:!1,featuresKnown:!1},n=Object.keys(e),s=n.filter(t=>e[t].gmcpItemNames?.length),i=new Set;let o=0,l=!1;const identity=()=>({id:a.id,name:a.name,exits:{...a.exits}}),features=()=>({walls:copyWalls(a.walls),frozenGround:a.frozenGround,featuresKnown:a.featuresKnown}),c=createSnapshotCache({getVersion:()=>o,buildSnapshot:()=>({...identity(),...features()})}),emit=(e,t)=>i.forEach(a=>a(e,t)),changedFeatures=e=>{const t={};sameWalls(e.walls,a.walls)||(t.walls={previous:e.walls,current:copyWalls(a.walls)});for(const n of["frozenGround","featuresKnown"])e[n]!==a[n]&&(t[n]={previous:e[n],current:a[n]});return t},commitFeatures=(e,t)=>{const n=changedFeatures(e);return!!Object.keys(n).length&&(o+=1,emit("RoomFeaturesUpdated",{roomId:a.id,source:t,current:features(),changedFields:n}),!0)},acceptsRoom=e=>e&&"object"==typeof e&&null!==a.id&&(!Object.hasOwn(e,"roomId")||normalizeRoomId(e.roomId)===a.id),readTrustedItems=()=>{if(!l||null===a.id)return null;const e=t();return Array.isArray(e)?e:null},addWall=(e,t)=>{a.walls[e]??={},a.walls[e][t]={type:t}},removeWall=(e,t)=>{a.walls[e]?.[t]&&(delete a.walls[e][t],Object.keys(a.walls[e]).length||delete a.walls[e])};return{onChange:e=>(i.add(e),()=>i.delete(e)),snapshot:c,getWalls(e){const t=c().walls[normalizeRoomDirection(e)];return n.filter(e=>t?.[e]).map(e=>t[e])},listWalls:()=>w.flatMap(e=>n.filter(t=>a.walls[e]?.[t]).map(t=>({direction:e,type:t}))),haveWall(e,t){const n=a.walls[normalizeRoomDirection(e)];return void 0===t?Boolean(n&&Object.keys(n).length):Boolean(n&&Object.hasOwn(n,t))},isGroundFrozen:()=>a.frozenGround,isItemSnapshotKnown:()=>null!==readTrustedItems(),haveItem:e=>"string"==typeof e&&Boolean(readTrustedItems()?.some(t=>t?.name===e)),observeInfo(e={}){if(!e||"object"!=typeof e)return!1;const t=normalizeRoomId(e.num);if(null===t)return!1;const n=identity(),s=features(),i={};if(t!==a.id&&(a.id=t,a.walls={},a.frozenGround=!1,a.featuresKnown=!1,l=!1,i.id={previous:n.id,current:t}),Object.hasOwn(e,"name")&&(a.name=String(e.name??"")),Object.hasOwn(e,"exits")){const t=e.exits&&"object"==typeof e.exits&&!Array.isArray(e.exits)?e.exits:{};a.exits=Object.fromEntries(Object.entries(t).filter(([,e])=>"string"==typeof e||"number"==typeof e))}n.name!==a.name&&(i.name={previous:n.name,current:a.name}),sameRecord(n.exits,a.exits)||(i.exits={previous:n.exits,current:{...a.exits}});const c=changedFeatures(s);return!(!Object.keys(i).length&&!Object.keys(c).length)&&(o+=1,Object.keys(i).length&&emit("RoomUpdated",{current:identity(),changedFields:i}),Object.keys(c).length&&emit("RoomFeaturesUpdated",{roomId:a.id,source:"room-change",current:features(),changedFields:c}),!0)},observeItemList({roomId:e}={}){const t=null!==a.id&&normalizeRoomId(e)===a.id,n=l!==t;return l=t,n},observeDisplay(e={}){if(!e||"object"!=typeof e)return!1;if(normalizeRoomId(e.roomId)!==a.id||null===a.id)return!1;const t=features(),s=[];let i=!0===e.complete&&Array.isArray(e.walls)&&"boolean"==typeof e.frozenGround;for(const a of Array.isArray(e.walls)?e.walls:[]){const e=normalizeRoomDirection(a?.direction);e&&n.includes(a?.type)?s.push({direction:e,type:a.type}):i=!1}return i&&(a.walls={}),s.forEach(({direction:e,type:t})=>addWall(e,t)),(i||!0===e.frozenGround)&&(a.frozenGround=e.frozenGround),a.featuresKnown=i,commitFeatures(t,"display")},observeWall(e={}){if(!acceptsRoom(e)||!n.includes(e.type)||!["added","removed"].includes(e.change))return!1;const t=normalizeRoomDirection(e.direction);if(!t&&null!=e.direction)return!1;if(t&&Boolean(a.walls[t]?.[e.type])===("added"===e.change))return!1;const s=features();if(t)"added"===e.change?addWall(t,e.type):removeWall(t,e.type);else if("removed"===e.change){const t=w.filter(t=>a.walls[t]?.[e.type]);1===t.length?removeWall(t[0],e.type):a.featuresKnown=!1}else a.featuresKnown=!1;return commitFeatures(s,e.source||"public-observe")},observeGround(e={}){if(!acceptsRoom(e)||"boolean"!=typeof e.frozen)return!1;if(a.frozenGround===e.frozen)return!1;const t=features();return a.frozenGround=e.frozen,commitFeatures(t,e.source||"public-observe")},completeObservationBlock(){if(!s.length)return!1;const t=readTrustedItems();if(null===t)return!1;let n=null;for(const i of s){const s=e[i].gmcpItemNames,o=t.reduce((e,t)=>e+Number(s.includes(t?.name)),0),l=w.filter(e=>a.walls[e]?.[i]);0===o&&l.length?(n??=features(),l.forEach(e=>removeWall(e,i))):o!==l.length&&a.featuresKnown&&(n??=features(),a.featuresKnown=!1)}return!!n&&commitFeatures(n,"corroboration")}}},createModels=({adapter:e,seedData:t,options:a={},now:n})=>{const s=Boolean(a.debug),{gmcpSnapshot:i}=resolveAdapterCapabilities(e),o=createRoomModel({wallTable:t.roomWallTable,readRoomItems:()=>{const t=i?e.getGMCP()?.Items?.room:null;return Array.isArray(t)?t:null}}),l=createSystemModel({settings:{debug:s},baselineIntent:{debug:s}}),c=createAfflictionModel({affTable:t.affTable,now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),u=createBalanceModel({balanceTable:t.balanceTable,haveAff:e=>c.haveAff(e),now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),d=createDefenseModel({defTable:t.defTable,defPrios:t.defPrios});return{roomModel:o,systemModel:l,affModel:c,balanceModel:u,defModel:d,cacheModel:createCacheModel({cacheTable:t.cacheTable,cacheNames:t.cacheNames,haveAff:e=>c.haveAff(e),haveDef:e=>d.haveDef(e)}),limbModel:createLimbModel({now:n}),trackableModel:createTrackableModel({definitions:t.trackableTable,now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout})}},Et="parry",wt=25,resetParryPriorities=e=>{Object.keys(Fe.long).forEach(t=>{e.setDefaultPriority(`parrying ${t}`,0,Et),e.get(`guarding ${t}`)&&e.setDefaultPriority(`guarding ${t}`,0,Et)})},createCombatDomainService=({affModel:e,defModel:t,limbModel:a,systemModel:n,queueController:s,serverside:i})=>({observeLimbHit:({limb:t,amount:n,source:s="manual",at:o}={})=>applyObservedLimbHit({limbModel:a,affModel:e,serverside:i,limb:t,amount:n,source:s,at:o}),observeLimbReset:({limb:e,source:t="manual"}={})=>applyObservedLimbReset({limbModel:a,limb:e,source:t}),observeLimbStage:({limb:t,stage:n,source:s="manual",at:o}={})=>applyObservedLimbStage({limbModel:a,affModel:e,serverside:i,limb:t,stage:n,source:s,at:o}),parry(e){resetParryPriorities(t);const a=Fe.short[e]||e,i=t.get(`guarding ${a}`);let o;return i&&n.isClass(i.skills)?(t.setDefaultPriority(`guarding ${a}`,wt,Et),o=`guard ${a}`):(t.setDefaultPriority(`parrying ${a}`,wt,Et),n.isClass("Dragon")?(t.setCommand(`parrying ${a}`,`clawparry ${a}`,Et),o=`clawparry ${a}`):(t.setCommand(`parrying ${a}`,`parry ${a}`,Et),o=`parry ${a}`)),s.prepend("freeQueue",o),{limbName:a,command:o}}}),isRecordValue=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),hasSupportedSchemaVersion=e=>isRecordValue(e)&&isSupportedPersistenceSchemaVersion(e.schemaVersion),createPersistenceStore=({adapter:e,key:t="nexSys4Settings",noticeCenter:a}={})=>{let n=!1;const noticeSchemaResetIfNeeded=e=>{n||!isRecordValue(e)||null==e.schemaVersion||isSupportedPersistenceSchemaVersion(e.schemaVersion)||(n=!0,a?.publish?.("persistence","Saved nexSys4 settings were in an older format and have been reset to defaults.",{force:!0}))},read=()=>{const a=e.getVariable(t);return noticeSchemaResetIfNeeded(a),{key:t,exists:hasSupportedSchemaVersion(a),snapshot:deepClone$1(normalizePersistenceSnapshot(a))}},load=()=>read().snapshot,save=(a={})=>{const n=deepClone$1(normalizePersistenceSnapshot(a,{assumeCurrentVersion:!0}));return e.setVariable(t,n),deepClone$1(n)};return{key:t,read,load,save}},createNoticeCenter=({adapter:e,systemModel:t})=>({publish:(a,n,s={})=>{const i=t.getSettings().notices||{},{force:o=!1,...l}=s;(o||!1!==i[a])&&e.notice(String(n),{category:a,...l})}}),_t=Object.freeze({PLANNED:"planned",SENT:"sent",AWAITING_COMPLETION:"awaiting-completion",COMPLETED:"completed",EXPIRED:"expired",RECOVERING:"recovering"}),createOutputCycle=({adapter:e,dispatchCommands:t,systemModel:a,serverside:n,outputPlanner:s,noticeCenter:i,options:o={}}={})=>{const now=()=>e?.now?.()??Date.now();let l=[],c="",u=1,d=null,m=null,p=null,g=[];const h=`echo SystemEvent ${be.OUTPUT_COMPLETE}`,b=Math.max(50,Number(o.outputCompletionTimeoutMs||1e3)),y=Math.max(0,Number(o.maxOutputRecoveryAttempts??2)),clearCompletionTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},recordBatchState=(e,t,a={})=>{if(!e)return null;const n=now();return e.state=t,e.stateHistory.push({state:t,at:n}),Object.assign(e,a),e},snapshotBatch=e=>e?{id:e.id,source:e.source,state:e.state,stateHistory:e.stateHistory.map(e=>({...e})),completionRequired:e.completionRequired,recoveryAttempts:e.recoveryAttempts,maxRecoveryAttempts:e.maxRecoveryAttempts,commands:[...e.commands],dispatchedCommands:[...e.dispatchedCommands],serversideCommands:[...e.serversideCommands],batchCount:e.batchCount,createdAt:e.createdAt,sentAt:e.sentAt??null,completedAt:e.completedAt??null,expiredAt:e.expiredAt??null,lastRecoveryAt:e.lastRecoveryAt??null}:null,storeLastBatch=e=>{m=snapshotBatch(e)},createBatch=({source:e,intents:t=[],commands:a,serversideCommands:n,maxCommands:s})=>{const i=t.some(e=>!0===e?.requiresCompletion),o=i?a.filter(e=>e!==h):[...a],l=i?chunkCommandsWithTrailing(o,{maxEntries:s,trailing:[h]}):chunkCommands(o,s);return{id:u++,source:e,state:_t.PLANNED,stateHistory:[{state:_t.PLANNED,at:now()}],completionRequired:i,recoveryAttempts:0,maxRecoveryAttempts:y,commands:[...o],dispatchedCommands:i?[...o,h]:[...o],serversideCommands:[...n],batches:l,batchCount:l.length,createdAt:now(),observedOutbound:!1}},dispatchBatchBatches=(e,a,n={})=>{a.forEach((s,i)=>{t(s,{source:n.source||"output-cycle",cycleSource:e.source,batch:i+1,batchCount:a.length,outputBatchId:e.id,outputBatchState:e.state,recoveryAttempt:n.recoveryAttempt||0})})},scheduleCompletionTimeout=t=>{clearCompletionTimer(),p=e?.setTimeout?.(()=>{if(d&&d.id===t.id&&d.completionRequired){if(recordBatchState(d,_t.EXPIRED,{expiredAt:now()}),c="",d.recoveryAttempts>=d.maxRecoveryAttempts)return i?.publish?.("output",`Output completion confirmation expired after ${d.maxRecoveryAttempts} recovery probe(s).`,{force:!0}),storeLastBatch(d),d=null,void clearCompletionTimer();d.recoveryAttempts+=1,recordBatchState(d,_t.RECOVERING,{lastRecoveryAt:now()}),dispatchBatchBatches(d,[[h]],{source:"output-cycle-recovery",recoveryAttempt:d.recoveryAttempts}),scheduleCompletionTimeout(d)}},b)};return{planAndSend:({source:e="prompt"}={})=>{const t=a.getRuntime(),i=a.getSettings();if(t.paused||t.rulesSuspended)return t.rulesSuspended&&s.plan({source:"prompt"===e?"prompt":`${e}:rule-suspend-check`}),[];const o=n.getCuringSets?.().activeSet||"";if(o&&"nexsys4-default"!==o)return[];if(d)return[];const u="output-complete"===e?[...g]:[];g=[];const m=s.plan({source:e,injectedCommands:l,suppressedServersideCommands:u});if(a.getRuntime().paused||a.getRuntime().rulesSuspended)return l=[],[];if(!m.commands.length)return l=[],[];const p=Math.max(1,Number(i.maxSendPerChunk||20)),h=createBatch({source:e,intents:m.intents,commands:m.commands,serversideCommands:m.serversideCommands,maxCommands:p}),b=h.dispatchedCommands.join("");return b===c?[]:(h.serversideCommands.length&&!h.observedOutbound&&(n.observeOutbound(h.serversideCommands),h.observedOutbound=!0),recordBatchState(h,_t.SENT,{sentAt:now()}),dispatchBatchBatches(h,h.batches),c=b,h.completionRequired?(d=h,recordBatchState(d,_t.AWAITING_COMPLETION),scheduleCompletionTimeout(d)):(recordBatchState(h,_t.COMPLETED,{completedAt:now()}),storeLastBatch(h)),l=[],m.commands)},markComplete:()=>!!d&&(clearCompletionTimer(),g=[...d.serversideCommands],d.serversideCommands.length&&n.acknowledgeCommands(d.serversideCommands),recordBatchState(d,_t.COMPLETED,{completedAt:now()}),storeLastBatch(d),d=null,!0),isWaitingForCompletion:()=>d?.state===_t.AWAITING_COMPLETION||d?.state===_t.RECOVERING,isBlockingOutput:()=>Boolean(d),getLifecycleState:()=>({activeBatch:snapshotBatch(d),lastBatch:snapshotBatch(m)}),invalidate(){c=""},injectCommands(e=[]){l=[...l,...e.filter(Boolean)]},dispose(){clearCompletionTimer(),d=null,g=[]}}},Tt="nexSysSettings",isRecord$1=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),mergeLegacyDefPriorities=(e={},t={})=>{const a={};return new Set([...Object.keys(e),...Object.keys(t)]).forEach(n=>{const s=Number(t[n])||0;a[n]=s>0?s:Number(e[n])||0}),a},Mt={customPrompt:"customPrompt",overrideTab:"overrideTab",loadOnLogin:"loadOnLogin",queueWhilePaused:"queueWhilePaused"},Pt={echoOutput:"output",echoAffGot:"affGot",echoAffLost:"affLost",echoDefGot:"defGot",echoDefLost:"defLost",echoBalanceGot:"balanceRecovered",echoBalanceLost:"balanceLost",echoTrackableGot:"trackableGot",echoTrackableLost:"trackableLost",echoPrioritySet:"priority"},Ot={sipPriority:"sipPriority",sipHealthAt:"sipHealthAt",sipManaAt:"sipManaAt",mossHealthAt:"mossHealthAt",mossManaAt:"mossManaAt",focus:"focus",focusOverHerbs:"focusOverHerbs",tree:"tree",clot:"clot",clotAt:"clotAt",insomnia:"insomnia",fracturesAbove:"fracturesAbove",manaAbilitiesAbove:"manaThreshold",clotAbove:"clotAbove",batch:"batch"},transformSystemSettings=(e={})=>{const t={};Object.entries(Mt).forEach(([a,n])=>{void 0!==e[a]&&(t[n]=e[a])});const a={};Object.entries(Pt).forEach(([t,n])=>{void 0!==e[t]&&(a[n]=Boolean(e[t]))}),Object.keys(a).length&&(t.notices=a);const n={};return Object.entries(Ot).forEach(([t,a])=>{void 0!==e[t]&&(n[a]=normalizeStatusValue(a,e[t]))}),void 0!==e.curingMethod&&(n.transmutation="Transmutation"===e.curingMethod),Object.keys(n).length&&(t.ss=n),t},transformLegacySettings=(e={})=>({systemSettings:transformSystemSettings(e.systemSettings||{}),defSettings:{defaults:mergeLegacyDefPriorities(e.defSettings?.keepup,e.defSettings?.static)},cacheSettings:{precache:{...e.cacheSettings||{}}}}),importLegacySettings=({adapter:e,persistence:t,noticeCenter:a,legacyKey:n=Tt}={})=>{if(t.read().exists)return!1;const s=e.getVariable(n);return!!isRecord$1(s)&&(t.save(transformLegacySettings(s)),a?.publish?.("persistence","Imported curing, defence, and cache settings from your original nexSys installation.",{force:!0}),!0)},createRuntimeServices=({adapter:e,options:t={},models:a,controllers:n})=>{const{systemModel:s,affModel:i,defModel:o,limbModel:l}=a,{commandDispatcher:c,queueController:u,rules:d,serverside:m,curePlanner:p,defensePlanner:g,automaticActionPlanner:h,precachePlanner:b,outputPlanner:y}=n,v=createNoticeCenter({adapter:e,systemModel:s}),S=createPersistenceStore({adapter:e,key:t.persistenceKey||"nexSys4Settings",noticeCenter:v});return importLegacySettings({adapter:e,persistence:S,noticeCenter:v}),{persistence:S,combatService:createCombatDomainService({affModel:i,defModel:o,limbModel:l,systemModel:s,queueController:u,serverside:m}),noticeCenter:v,rules:d,curePlanner:p,defensePlanner:g,automaticActionPlanner:h,precachePlanner:b,outputCycle:createOutputCycle({adapter:e,dispatchCommands:c.sendCommands,systemModel:s,serverside:m,outputPlanner:y,noticeCenter:v,options:t})}},createRuntimeDependencies=({adapter:e,seedData:t,options:a={}})=>{const now=()=>e.now(),n=createModels({adapter:e,seedData:t,options:a,now}),s=createDomainControllers({adapter:e,seedData:t,options:a,now,models:n}),i=createRuntimeServices({adapter:e,options:a,models:n,controllers:s});return{now,...s,...n,...i}},createRuntimeFlushCoordinator=({adapter:e,systemModel:t,serverside:a,outputCycle:n,flushGmcpBuffer:s})=>{const now=()=>e?.now?.()??Date.now(),i={started:!1,safetyTimer:null,dirty:!1,flushing:!1,dirtyAt:null},clearSafetyTimer=()=>{i.safetyTimer&&(e.clearTimeout(i.safetyTimer),i.safetyTimer=null)},isRuntimeReady=()=>isRuntimeReadyPhase(t.getRuntime().phase),hasPendingSafetyWork=()=>{const e="function"!=typeof a.isDirty||a.isDirty();return i.dirty&&e},scheduleSafetyFlush=()=>{const a=t.getSettings(),n=Number(a.flushSafetyMs||120),s=Number(a.flushSafetyMaxWaitMs||500),o=now();i.dirtyAt||(i.dirtyAt=o),clearSafetyTimer();const l=o-i.dirtyAt,c=l>=s?0:Math.min(n,s-l);i.safetyTimer=e.setTimeout(()=>{i.safetyTimer=null,hasPendingSafetyWork()?(i.dirtyAt=null,flushCycle("safety-flush")):i.dirtyAt=null},c)},invalidateOutput=()=>{i.dirty=!0,n.invalidate?.()},markDirty=(e="dirty")=>{if(invalidateOutput(),a.markDirty(e),!isRuntimeReady())return clearSafetyTimer(),void(i.dirtyAt=null);i.flushing||n.isBlockingOutput?.()||scheduleSafetyFlush()},flushCycle=(e="prompt")=>{if(!i.started||i.flushing)return[];if(clearSafetyTimer(),!isRuntimeReady())return[];i.flushing=!0;try{if(s(),t.getRuntime().paused)return i.dirty=!1,[];const a=n.planAndSend({source:e});return i.dirty=n.isBlockingOutput()&&0===a.length,i.dirty||(i.dirtyAt=null),a}finally{i.flushing=!1}};return{start(){i.started=!0},stop(){i.started=!1,i.dirty=!1,i.flushing=!1,i.dirtyAt=null,clearSafetyTimer()},isStarted:()=>i.started,isFlushing:()=>i.flushing,invalidateOutput,markDirty,flushCycle}},cell=(e="",t="",a="")=>({text:e,fg:t,bg:a}),createDefaultCureColors=()=>({antimony:{fg:"olive",bg:""},argentum:{fg:"royalblue",bg:""},arsenic:{fg:"",bg:""},aurum:{fg:"ForestGreen",bg:""},azurite:{fg:"",bg:""},bisemutum:{fg:"",bg:""},calamine:{fg:"",bg:""},calcite:{fg:"slategray",bg:""},cinnabar:{fg:"greenyellow",bg:""},cuprum:{fg:"DeepSkyBlue",bg:""},ferrum:{fg:"DarkOrange",bg:""},gypsum:{fg:"",bg:""},magnesium:{fg:"Red",bg:""},plumbum:{fg:"Gold",bg:""},potash:{fg:"",bg:""},quartz:{fg:"",bg:""},quicksilver:{fg:"",bg:""},realgar:{fg:"firebrick",bg:""},stannum:{fg:"Tan",bg:""},caloric:{fg:"darkseagreen",bg:""},mending:{fg:"orchid",bg:""},epidermal:{fg:"sienna",bg:""},restoration:{fg:"darkviolet",bg:""},health:{fg:"lightpink",bg:""},writhe:{fg:"PaleGoldenRod",bg:"darkslategray"}}),createDefaultVars=()=>({blackout:!1,paused:cell("","red"),retard:cell("","blue"),aeon:cell("","red"),h:cell("0","green"),m:cell("0","green"),e:cell("0","green"),w:cell("0","green"),maxh:cell(""),maxm:cell(""),maxe:cell(""),maxw:cell(""),ph:cell("100%","green"),pm:cell("100%","green"),pe:cell("100%"),pw:cell("100%"),diffh:cell("","green"),diffm:cell("","green"),diffhp:cell("","green"),diffmp:cell("","green"),target:cell("","pink"),targetHP:cell("","green"),eq:cell(""),bal:cell(""),c:cell(""),k:cell(""),d:cell(""),b:cell(""),shield:cell("","cyan"),prismatic:cell("","magenta"),curseward:cell("","hotpink"),reflections:cell("","purple"),bloodshield:cell("","crimson"),rage:cell("","red"),karma:cell("","green"),transcendence:cell("","cyan"),essence:cell("","purple"),kai:cell("","blue")}),createDefaultAffs=(e=createDefaultCureColors())=>({addiction:{text:"add",...e.ferrum},aeon:{text:"ae",...e.cinnabar},agoraphobia:{text:"agor",...e.argentum},amnesia:{text:"amn",fg:"",bg:""},anorexia:{text:"ANO",...e.epidermal},asthma:{text:"AST",...e.aurum},blackout:{text:"bo",fg:"",bg:""},blindness:{text:"unb",...e.arsenic},bound:{text:"bnd",...e.writhe},brokenleftarm:{text:"la1",...e.mending},brokenleftleg:{text:"ll1",...e.mending},brokenrightarm:{text:"ra1",...e.mending},brokenrightleg:{text:"rl1",...e.mending},bruisedribs:{text:"ribs",fg:"",bg:""},burning:{text:"burn",...e.mending},calcifiedskull:{text:"calh",...e.restoration},calcifiedtorso:{text:"calt",...e.restoration},claustrophobia:{text:"clau",...e.stannum},clumsiness:{text:"clu",...e.aurum},concussion:{text:"conc",...e.restoration},confusion:{text:"con",...e.stannum},corruption:{text:"corr",fg:"",bg:""},crackedribs:{text:"cr",...e.health},crushedthroat:{text:"cru",...e.mending},daeggerimpale:{text:"daeg",...e.writhe},damage:{text:"dmg",fg:"tomato",bg:""},damagedleftarm:{text:"la2",...e.restoration},damagedleftleg:{text:"ll2",...e.restoration},damagedrightarm:{text:"ra2",...e.restoration},damagedrightleg:{text:"rl2",...e.restoration},damagedhead:{text:"hd2",...e.restoration},darkshade:{text:"dark",...e.ferrum},dazed:{text:"dzd",...e.cinnabar},dazzled:{text:"dzl",...e.mending},deadening:{text:"dea",...e.cinnabar},deafness:{text:"und",...e.calamine},dehydrated:{text:"deh",fg:"",bg:""},dementia:{text:"dem",...e.stannum},depression:{text:"dep",...e.plumbum},deteriorate:{text:"det",fg:"",bg:""},disloyalty:{text:"disl",...e.realgar},disrupted:{text:"disr",fg:"",bg:""},dissonance:{text:"disso",...e.plumbum},dizziness:{text:"diz",...e.plumbum},enscorcelled:{text:"ensor",fg:"",bg:""},entangled:{text:"entgl",...e.writhe},epilepsy:{text:"epi",...e.plumbum},fear:{text:"fear",fg:"",bg:""},flushings:{text:"flush",...e.ferrum},fratricide:{text:"frat",...e.argentum},frozen:{text:"frz",...e.caloric},generosity:{text:"gen",...e.cuprum},grievouswounds:{text:"grv",...e.health},guilt:{text:"gui",...e.argentum},haemophilia:{text:"haem",...e.ferrum},hallucinations:{text:"hall",...e.stannum},hamstrung:{text:"hms",fg:"",bg:""},healthleech:{text:"hthl",...e.aurum},heartseed:{text:"heart",...e.restoration},hellsight:{text:"hell",...e.realgar},horror:{text:"hor",...e.argentum},hypersomnia:{text:"hypers",...e.stannum},hypochondria:{text:"hypoch",...e.argentum},hypothermia:{text:"hypoth",...e.restoration},icefisted:{text:"ice",fg:"",bg:""},impaled:{text:"impl",...e.writhe},impatience:{text:"IMPAT",...e.plumbum},indifference:{text:"ind",...e.cuprum},insomnia:{text:"insomnia",fg:"",bg:""},itching:{text:"itch",...e.epidermal},justice:{text:"just",...e.cuprum},kkractlebrand:{text:"kkr",...e.health},laceratedthroat:{text:"lac2",...e.restoration},latched:{text:"latch",...e.health},lethargy:{text:"let",...e.ferrum},lightbind:{text:"light",fg:"",bg:""},loneliness:{text:"lon",...e.argentum},lovers:{text:"love",...e.cuprum},manaleech:{text:"man",...e.realgar},mangledleftarm:{text:"la3",...e.restoration},mangledleftleg:{text:"ll3",...e.restoration},mangledrightarm:{text:"ra3",...e.restoration},mangledrightleg:{text:"rl3",...e.restoration},mangledhead:{text:"hd3",...e.restoration},masochism:{text:"maso",...e.argentum},mildtrauma:{text:"tor1",...e.restoration},mycalium:{text:"myc",...e.plumbum},nausea:{text:"nau",...e.ferrum},numbedleftarm:{text:"nbla",fg:"",bg:""},numbedrightarm:{text:"nbra",fg:"",bg:""},pacified:{text:"pac",...e.cuprum},paralysis:{text:"PAR",...e.magnesium},paranoia:{text:"prn",...e.stannum},parasite:{text:"prs",...e.aurum},peace:{text:"pea",...e.cuprum},phlogisticated:{text:"phlog",fg:"",bg:""},pinshot:{text:"psh",fg:"",bg:""},pressure:{text:"pres",...e.calcite},prone:{text:"pr",fg:"",bg:""},pyramides:{text:"pyra",...e.magnesium},pyre:{text:"pyre",...e.cuprum},rebbies:{text:"reb",...e.aurum},recklessness:{text:"reck",...e.argentum},retardation:{text:"ret",fg:"",bg:""},retribution:{text:"retr",...e.cuprum},revealed:{text:"rev",fg:"",bg:""},sandfever:{text:"sand",...e.plumbum},scalded:{text:"scald",...e.epidermal},scytherus:{text:"scy",...e.ferrum},selarnia:{text:"sel",...e.mending},sensitivity:{text:"sen",...e.aurum},serioustrauma:{text:"tor2",...e.restoration},shadowmadness:{text:"shad",...e.plumbum},shivering:{text:"shiv",...e.caloric},shyness:{text:"shy",...e.plumbum},skullfractures:{text:"sf",...e.health},slashedthroat:{text:"lac1",...e.epidermal},sleeping:{text:"slp",fg:"",bg:""},slickness:{text:"SLI",...e.magnesium},slimeobscure:{text:"nkh",fg:"",bg:""},spiritburn:{text:"spirB",...e.argentum},spiritwrack:{text:"spirW",fg:"",bg:""},stupidity:{text:"st",...e.plumbum},stuttering:{text:"stut",...e.epidermal},homunculusmercury:{text:"merc",fg:"",bg:""},temperedcholeric:{text:"choH",...e.antimony},temperedmelancholic:{text:"melaH",...e.antimony},temperedphlegmatic:{text:"phleH",...e.antimony},temperedsanguine:{text:"sanH",...e.antimony},tenderskin:{text:"tend",...e.argentum},tension:{text:"tens",...e.cinnabar},timeflux:{text:"tmfx",fg:"",bg:""},timeloop:{text:"tmlp",...e.cuprum},tonguetied:{text:"tngt",...e.restoration},torntendons:{text:"tt",...e.health},transfixation:{text:"trfx",...e.writhe},unweavingbody:{text:"unwB",...e.ferrum},unweavingspirit:{text:"unwS",...e.cinnabar},unweavingmind:{text:"unwM",...e.plumbum},vertigo:{text:"vert",...e.argentum},vitrified:{text:"vitri",fg:"",bg:""},voidfisted:{text:"void",fg:"",bg:""},voyria:{text:"voy",fg:"",bg:""},weariness:{text:"wea",...e.aurum},webbed:{text:"web",...e.writhe},whisperingmadness:{text:"mad",...e.argentum},wristfractures:{text:"wf",...e.health}}),createDefaultPromptState=()=>{const e=createDefaultCureColors();return{vars:createDefaultVars(),affs:createDefaultAffs(e),cureColors:e}},Dt={"&":"&","<":"<",">":">",'"':""","'":"'"},escapeHtml=e=>String(e??"").replace(/[&<>"']/g,e=>Dt[e]),renderChunk=(e,t="",a="")=>{if(""===e||null==e)return"";const n=[];return t&&n.push(`color:${t}`),a&&n.push(`background-color:${a}`),`<span${n.length?` style="${n.join(";")}"`:""}>${escapeHtml(e)}</span>`},createPromptBuilder=({vars:e,affs:t,cureColors:a,renderAffsHtml:n,renderDiffHtml:s,renderTargetHtml:i,renderVarHtml:o,renderChunkHtml:l=renderChunk})=>{const c=[],u={vars:e,affs:t,cureColors:a,add(t,a,n){if(""===t||null==t)return u;const s="string"==typeof t?e[t]:null;return s&&"object"==typeof s&&"text"in s?c.push("function"==typeof o?o(t):l(s.text,s.fg,s.bg)):c.push(l(t,a,n)),u},addHTML:e=>(e&&c.push(String(e)),u),addAffs:()=>(c.push(n()),u),addDiff:()=>(c.push(s()),u),addTarget:()=>(c.push(i()),u),toHTML:()=>`<span class="nexsys-prompt">${c.join("")}</span>`};return u},Rt=new Set(["diffh","diffm","diffhp","diffmp"]),Nt=new Set(["target","targetHP"]),getCellSignature=(e={})=>`${String(e.text??"")}\0${String(e.fg??"")}\0${String(e.bg??"")}`,createPromptRenderer=({state:e,getComposer:t,getFallbackComposer:a,getSortedAffNames:n,getAffSnapshot:s,renderChunkHtml:i=renderChunk})=>{const o=new Map,l=new Map,c=new Map;let u="",d="",m="",p=!0,g=!0,h=!0,b=[];const markVarsDirty=(t=[])=>{Array.isArray(t)&&t.length&&t.forEach(t=>{const a=e.vars[t];a&&"object"==typeof a&&"text"in a&&l.delete(t),Rt.has(t)&&(g=!0),Nt.has(t)&&(h=!0)})},syncExternalVarMutations=()=>{const t=new Set;Object.keys(e.vars||{}).forEach(a=>{t.add(a);const n=e.vars[a];if(!n||"object"!=typeof n||!("text"in n))return void((l.has(a)||o.has(a))&&(l.delete(a),o.delete(a)));const s=getCellSignature(n);l.get(a)!==s&&(l.delete(a),o.delete(a),Rt.has(a)&&(g=!0),Nt.has(a)&&(h=!0))}),[...l.keys()].forEach(e=>{t.has(e)||(l.delete(e),o.delete(e),Rt.has(e)&&(g=!0),Nt.has(e)&&(h=!0))})},syncExternalAffMutations=()=>{if(p||!b.length)return;let t=!1;b.forEach(a=>{const n=getCellSignature(e.affs[a]||{});c.get(a)!==n&&(t=!0)}),t&&(p=!0)},renderVarHtml=t=>{const a=e.vars[t];if(!a||"object"!=typeof a||!("text"in a))return"";const n=getCellSignature(a);return l.get(t)===n&&o.has(t)||(o.set(t,i(a.text,a.fg,a.bg)),l.set(t,n)),o.get(t)||""},buildAffsHtml=()=>{const t=n()||[],{affs:a}=e;if(b=[...t],c.clear(),!t.length)return'<span class="nexsys-prompt-affs mono"></span>';const o=[i("[","brown")];for(let e=0;e<t.length;e+=1){const n=t[e],l=a[n]||{text:n,fg:"",bg:""},u="function"==typeof s&&s(n)||{},d=Number(u.max)>1&&Number.isFinite(Number(u.count))?`(${Number(u.count)})`:"";c.set(n,getCellSignature(a[n]||{}));const m=e<t.length-1?" ":"";o.push(i(`${l.text}${d}${m}`,l.fg,l.bg))}return o.push(i("]","brown")),`<span class="nexsys-prompt-affs mono">${o.join("")}</span>`},renderAffsHtml=()=>(p&&(u=buildAffsHtml(),p=!1),u),renderDiffHtml=()=>{if(g){const t=e.vars.diffh||{},a=e.vars.diffhp||{},n=e.vars.diffm||{},s=e.vars.diffmp||{},o=[];t.text&&(o.push(i(`${t.text}h`,t.fg,t.bg)),a.text&&o.push(i(`(${a.text})`,a.fg,a.bg))),n.text&&(o.length&&o.push(i(", ")),o.push(i(`${n.text}m`,n.fg,n.bg)),s.text&&o.push(i(`(${s.text})`,s.fg,s.bg))),d=o.join(""),g=!1}return d},renderTargetHtml=()=>{if(h){const t=e.vars.target||{},a=e.vars.targetHP||{},n=[];(t.text||a.text)&&(n.push(i(" [")),t.text&&n.push(renderVarHtml("target")),t.text&&a.text&&n.push(i(": ")),a.text&&n.push(renderVarHtml("targetHP")),n.push(i("] "))),m=n.join(""),h=!1}return m},resetTransients=()=>{const{vars:t}=e,a=["diffh","diffm","diffhp","diffmp"].filter(e=>{const a=t[e];return!(!a||""===a.text)&&(a.text="",!0)});a.length&&markVarsDirty(a)},composeHtml=t=>{const a=createPromptBuilder({vars:e.vars,affs:e.affs,cureColors:e.cureColors,renderAffsHtml,renderDiffHtml,renderTargetHtml,renderVarHtml,renderChunkHtml:i});return t(a),a.toHTML()};return{render(){const e=t(),n=a?.();syncExternalVarMutations(),syncExternalAffMutations();let s="";try{if("function"!=typeof e)throw new TypeError("Prompt composer must be a function");s=composeHtml(e)}catch(i){if(console.error(e===n?"nexSys4 default prompt compose error":"nexSys4 custom prompt compose error; using default prompt",i),"function"==typeof n&&n!==e)try{s=composeHtml(n)}catch(o){console.error("nexSys4 default prompt compose error",o)}}return resetTransients(),s},markAffsDirty(){p=!0},isAffDirty:()=>p,markDiffDirty(){g=!0},markTargetDirty(){h=!0},markVarsDirty}},defaultCompose=e=>{const{vars:t}=e;t.blackout?e.add("-"):(e.add("paused").add("aeon").add("retard"),t.prismatic.text&&e.add("[[",t.prismatic.fg,t.prismatic.bg),t.shield.text&&e.add("((",t.shield.fg,t.shield.bg),t.bloodshield.text&&e.add("|B|","red",""),e.add("h"),e.add(`(${t.ph.text}), `,t.h.fg,t.h.bg),e.add("m"),e.add(`(${t.pm.text}) `,t.m.fg,t.m.bg),t.karma.text&&e.add(`${t.karma.text}K `,t.karma.fg,t.karma.bg),Number(t.rage.text)>0&&e.add(`${t.rage.text}R `,t.rage.fg),e.add("eq").add("bal").add("|").add("c").add("k").add("d").add("b"),t.shield.text&&e.add("))",t.shield.fg,t.shield.bg),t.prismatic.text&&e.add("]]",t.prismatic.fg,t.prismatic.bg),t.bloodshield.text&&e.add("|B|","red",""),e.add(" ").addAffs().addDiff())},jt=new Set(["diffh","diffm","diffhp","diffmp"]),It=new Set(["target","targetHP"]),Lt=Object.freeze(["deafness","blindness","insomnia"]),clampPct=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>100?100:t:0},colorGradation=e=>{const t=clampPct(e),a=t<75?50:Math.abs(t-100)/2+25;return`hsl(${(1.2*t).toFixed(0)}, 100%, ${a}%)`},colorPercentage=e=>{const t=Number(e)||0;return t>75?"green":t>=33?"yellow":"red"},createPromptPresenter=({publicEvents:e,affModel:t,defModel:a,balanceModel:n,systemModel:s,renderPrompt:i}={})=>{const o=createDefaultPromptState();let l=defaultCompose;const isPromptDefTracked=e=>"function"==typeof a?.get?Boolean(a.get(e)):"function"==typeof a?.haveDef,c=Lt.filter(isPromptDefTracked),u=new Set(c),haveDef=e=>Boolean(a?.haveDef?.(e)),d=createPromptRenderer({state:o,getComposer:()=>l,getFallbackComposer:()=>defaultCompose,getSortedAffNames:()=>{const e=t?.currentSorted&&t.currentSorted()||[],a=new Set,n=[];return e.forEach(e=>{u.has(e)||a.has(e)||(a.add(e),n.push(e))}),c.forEach(e=>{haveDef(e)||a.has(e)||(a.add(e),n.push(e))}),n},getAffSnapshot:e=>t?.get?.(e)||null}),isRecord=e=>e&&"object"==typeof e&&!Array.isArray(e),isCellLike=e=>isRecord(e)&&("text"in e||"fg"in e||"bg"in e),normalizeCellField=e=>null==e?"":String(e),getVarRegion=e=>jt.has(e)?"diff":It.has(e)?"target":"",ensureVarCell=e=>{const t=o.vars[e];if(t&&"object"==typeof t&&"text"in t)return t;if(e in o.vars)return null;const a={text:"",fg:"",bg:""};return o.vars[e]=a,a},applyCell=(e,t={},a={})=>{const n=a.create?ensureVarCell(e):o.vars[e];if(!n||"object"!=typeof n||!("text"in n))return!1;let s=!1;if("text"in t){const e=normalizeCellField(t.text);n.text!==e&&(n.text=e,s=!0)}if("fg"in t){const e=normalizeCellField(t.fg);n.fg!==e&&(n.fg=e,s=!0)}if("bg"in t){const e=normalizeCellField(t.bg);n.bg!==e&&(n.bg=e,s=!0)}return!!s&&(d.markVarsDirty([e]),"diff"===a.region&&d.markDiffDirty(),"target"===a.region&&d.markTargetDirty(),!0)},applyFlag=(e,t)=>{const a=Boolean(t);return o.vars[e]!==a&&(o.vars[e]=a,!0)},updateVars=(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{const n=o.vars[e],s=getVarRegion(e);"boolean"!=typeof n?"boolean"!=typeof a||void 0!==n?t=applyCell(e,isCellLike(a)?a:{text:a},{create:!0,region:s})||t:o.vars[e]!==a&&(o.vars[e]=a,t=!0):t=applyFlag(e,a)||t}),t},updateAffs=(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.affs&&(delete o.affs[e],t=!0));const n=isCellLike(a)?a:{text:a},s=o.affs[e],i=s&&"object"==typeof s?s:o.affs[e]={text:"",fg:"",bg:""};["text","fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t&&d.markAffsDirty(),t},updateCureColors=(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.cureColors&&(delete o.cureColors[e],t=!0));const n=isRecord(a)?a:{fg:a},s=o.cureColors[e],i=s&&"object"==typeof s?s:o.cureColors[e]={fg:"",bg:""};["fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t},updateBalanceGlyphs=()=>{applyCell("eq",{text:n?.have?.(ct.EQUILIBRIUM)?"e":""}),applyCell("bal",{text:n?.have?.(ct.BALANCE)?"x":""})},updateDefGlyphs=()=>{applyCell("c",{text:haveDef("cloak")?"c":""}),applyCell("k",{text:haveDef("kola")?"k":""}),applyCell("d",{text:haveDef("deafness")?"d":""}),applyCell("b",{text:haveDef("blindness")?"b":""}),applyCell("shield",{text:haveDef("shield")?"(":""}),applyCell("prismatic",{text:haveDef("prismatic")?"[":""}),applyCell("curseward",{text:haveDef("curseward")?"{":""}),applyCell("reflections",{text:haveDef("reflections")?"<":""}),applyCell("bloodshield",{text:haveDef("bloodshield")?"{":""})},pctOf=(e,t)=>{const a=Number(e)||0,n=Number(t)||0;return n>0?100*a/n:0},onVitals=(e={})=>{const t=e.current||s?.snapshot?.().char||{},a=pctOf(t.hp,t.maxhp),n=pctOf(t.mp,t.maxmp),i=pctOf(t.ep,t.maxep),o=pctOf(t.wp,t.maxwp);applyCell("h",{text:t.hp??"",fg:colorGradation(a)}),applyCell("m",{text:t.mp??"",fg:colorGradation(n)}),applyCell("e",{text:t.ep??"",fg:colorGradation(i)}),applyCell("w",{text:t.wp??"",fg:colorGradation(o)}),applyCell("maxh",{text:t.maxhp??""}),applyCell("maxm",{text:t.maxmp??""}),applyCell("maxe",{text:t.maxep??""}),applyCell("maxw",{text:t.maxwp??""}),applyCell("ph",{text:`${a.toFixed(1)}%`}),applyCell("pm",{text:`${n.toFixed(1)}%`}),applyCell("pe",{text:`${i.toFixed(1)}%`}),applyCell("pw",{text:`${o.toFixed(1)}%`});const l=Number(e.hpDiff||0),c=Number(e.mpDiff||0),u=Number(t.maxhp)||0,d=Number(t.maxmp)||0;if(l){const e=l<0?"red":"green";applyCell("diffh",{text:`${l>0?"+":""}${l}`,fg:e},{region:"diff"}),applyCell("diffhp",{text:u?`${(l/u*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}if(c){const e=c<0?"red":"green";applyCell("diffm",{text:`${c>0?"+":""}${c}`,fg:e},{region:"diff"}),applyCell("diffmp",{text:d?`${(c/d*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}applyCell("karma",{text:t.karma??""}),applyCell("rage",{text:t.rage??""}),applyCell("transcendence",{text:t.transcendence??""}),applyCell("essence",{text:t.essence??""}),applyCell("kai",{text:t.kai??""}),applyFlag("blackout",t.dead)},onRuntimeChange=()=>{const e=s?.snapshot?.().runtime||{};applyCell("retard",{text:e.slowMode?"(r)":""}),applyCell("paused",{text:e.paused?"(p)":""}),applyCell("aeon",{text:e.aeonLocked?"(a)":""})},onTargetChange=()=>{const e=s?.snapshot?.().target||{};applyCell("target",{text:e.text||""},{region:"target"}),applyCell("targetHP",{text:e.hp||""},{region:"target"});const t=parseInt(e.hp,10);Number.isFinite(t)&&applyCell("targetHP",{fg:colorGradation(t)},{region:"target"})},onAffEvent=(e={})=>{"aeon"===e?.name&&applyCell("aeon",{text:t?.haveAff?.("aeon")?"(a)":""}),d.markAffsDirty()},onDefEvent=(e={})=>{updateDefGlyphs(),u.has(e?.id)&&d.markAffsDirty()},onBalanceEvent=()=>updateBalanceGlyphs(),m=[];let p=!1;const subscribe=(t,a)=>{if(!e||"function"!=typeof e.on)return;const n=e.on(t,a);"function"==typeof n&&m.push(n)};return{start:()=>{p||(p=!0,subscribe(fe.SYSTEM_VITALS_CHANGED,onVitals),subscribe(fe.SYSTEM_RUNTIME_CHANGED,onRuntimeChange),subscribe(fe.SYSTEM_PAUSE_CHANGED,onRuntimeChange),subscribe(fe.SYSTEM_TARGET_CHANGED,onTargetChange),subscribe(fe.AFF_GOT,onAffEvent),subscribe(fe.AFF_LOST,onAffEvent),subscribe(fe.AFF_STACK_CHANGED,onAffEvent),subscribe(fe.AFF_PRIORITY_CHANGED,()=>d.markAffsDirty()),subscribe(fe.DEF_GOT,onDefEvent),subscribe(fe.DEF_LOST,onDefEvent),subscribe(fe.BALANCE_GOT,onBalanceEvent),subscribe(fe.BALANCE_LOST,onBalanceEvent),subscribe(fe.BALANCE_RESET,onBalanceEvent),subscribe(fe.BALANCE_TIMER_RESTARTED,onBalanceEvent),updateDefGlyphs(),updateBalanceGlyphs(),onRuntimeChange())},stop:()=>{m.forEach(e=>{try{e()}catch(t){console.error("nexSys4 prompt presenter unsubscribe failed",t)}}),m.length=0,p=!1},render:(e={})=>{const t=d.render();return"function"==typeof i?i(t,e):t},set(e){if("function"!=typeof e)throw new TypeError("prompt.set requires a function");l=e},reset(){l=defaultCompose},updateVars,updateAffs,updateCureColors,colorGradation,colorPercentage,get vars(){return o.vars},get affs(){return o.affs},get cureColors(){return o.cureColors},_state:o,_onVitals:onVitals,_onAffEvent:onAffEvent,_onDefEvent:onDefEvent,_onBalanceEvent:onBalanceEvent,_onRuntimeChange:onRuntimeChange,_onTargetChange:onTargetChange}},qt=Object.freeze({INTERNAL:"internal",JS:"js",EVENTSTREAM:"eventstream"}),Bt=Object.freeze({STABLE:"stable",EXPERIMENTAL:"experimental",DEPRECATED:"deprecated"}),$t=/^nexsys4(\.[a-z0-9_-]+)+$/,zt=Object.freeze(Object.values(qt)),Ft=Object.freeze(Object.values(Bt)),Gt=Object.freeze({[qt.INTERNAL]:Object.freeze([null,qt.INTERNAL]),[qt.JS]:Object.freeze([null,qt.INTERNAL,qt.JS]),[qt.EVENTSTREAM]:Object.freeze([null,qt.INTERNAL,qt.JS,qt.EVENTSTREAM])}),topicEntry=(e,t,a={})=>{const n=a.scopedAudience??null,s={audience:e,scopedAudience:n,stability:a.stability??Bt.STABLE,description:t};return null!=n&&a.scopedPayloadKey&&(s.scopedPayloadKey=a.scopedPayloadKey),Object.freeze(s)},eventStreamTopic=(e,t={})=>topicEntry(qt.EVENTSTREAM,e,t),jsTopic=(e,t={})=>topicEntry(qt.JS,e,t),scopedEventStreamTopic=(e,t)=>eventStreamTopic(e,{scopedAudience:qt.EVENTSTREAM,scopedPayloadKey:t}),isScopedAudienceAllowed=(e,t)=>{const a=Gt[e];return Array.isArray(a)&&a.includes(t)},validateRegistryEntry=(e,t)=>{if(!$t.test(e))throw new Error(`Invalid topic registry key "${e}": expected lowercase dotted nexsys4.* form.`);if(!t||"object"!=typeof t||Array.isArray(t))throw new Error(`Invalid registry entry for "${e}": expected an object.`);if(!zt.includes(t.audience))throw new Error(`Invalid audience for "${e}": received "${t.audience}".`);if(!("scopedAudience"in t))throw new Error(`Missing scopedAudience metadata for "${e}".`);if(null!=t.scopedAudience&&!zt.includes(t.scopedAudience))throw new Error(`Invalid scopedAudience for "${e}": received "${t.scopedAudience}".`);if(!isScopedAudienceAllowed(t.audience,t.scopedAudience??null))throw new Error(`Invalid scopedAudience for "${e}": "${t.scopedAudience}" exceeds base audience "${t.audience}".`);if(null!=t.scopedAudience&&("string"!=typeof t.scopedPayloadKey||!t.scopedPayloadKey.trim()))throw new Error(`Missing scopedPayloadKey for scoped topic "${e}".`);if(!Ft.includes(t.stability))throw new Error(`Invalid stability for "${e}": received "${t.stability}".`);if("string"!=typeof t.description||!t.description.trim())throw new Error(`Invalid description for "${e}": expected a non-empty string.`)},validateTopicRegistry=(e,t=Object.values(fe))=>{if(!e||"object"!=typeof e||Array.isArray(e))throw new Error("Invalid topic registry: expected an object.");for(const a of t)if(!Object.prototype.hasOwnProperty.call(e,a))throw new Error(`Missing registry entry for "${a}".`);for(const a of Object.keys(e)){if(!t.includes(a))throw new Error(`Unexpected registry entry for "${a}".`);validateRegistryEntry(a,e[a])}return!0},Ht=Object.freeze({[fe.RUNTIME_STARTED]:eventStreamTopic("Runtime startup completed."),[fe.RUNTIME_STOPPED]:eventStreamTopic("Runtime shutdown completed."),[fe.RAW_GMCP]:eventStreamTopic("Raw GMCP payload observed at the adapter boundary."),[fe.SYSTEM_VITALS_CHANGED]:eventStreamTopic("Character vitals changed."),[fe.SYSTEM_HEALTH_CHANGED]:eventStreamTopic("Health changed."),[fe.SYSTEM_MANA_CHANGED]:eventStreamTopic("Mana changed."),[fe.SYSTEM_RAGE_CHANGED]:eventStreamTopic("Rage changed."),[fe.SYSTEM_BLEED_CHANGED]:eventStreamTopic("Bleed changed."),[fe.SYSTEM_STATUS_CHANGED]:eventStreamTopic("Character status snapshot changed."),[fe.SYSTEM_CLASS_CHANGED]:eventStreamTopic("Character class changed."),[fe.SYSTEM_TARGET_CHANGED]:eventStreamTopic("Current target changed."),[fe.ROOM_CHANGED]:eventStreamTopic("Current room identity changed synchronously at ingestion (id, name, exits)."),[fe.ROOM_FEATURES_CHANGED]:eventStreamTopic("Current room walls, frozen ground, or catalog-relative completeness changed synchronously."),[fe.SYSTEM_RUNTIME_CHANGED]:jsTopic("Runtime implementation state changed."),[fe.SYSTEM_PAUSE_CHANGED]:eventStreamTopic("Runtime pause state changed."),[fe.SYSTEM_PAUSED]:eventStreamTopic("Runtime paused."),[fe.SYSTEM_UNPAUSED]:eventStreamTopic("Runtime unpaused."),[fe.SYSTEM_LOADED]:eventStreamTopic("Startup game-state initialization completed."),[fe.SYSTEM_SETTINGS_CHANGED]:jsTopic("Runtime settings changed."),[fe.SYSTEM_BASELINE_CHANGED]:jsTopic("Baseline intent changed."),[fe.SYSTEM_DEATH_DETECTED]:eventStreamTopic("Death was detected from character state."),[fe.SYSTEM_MOUNT_CHANGED]:eventStreamTopic("Mounted state changed."),[fe.SYSTEM_WIELDED_CHANGED]:eventStreamTopic("Wielded equipment changed."),[fe.UI_CONFIG_CHANGED]:jsTopic("Configuration dialog open state changed."),[fe.AFF_GOT]:scopedEventStreamTopic("Affliction became active.","name"),[fe.AFF_LOST]:scopedEventStreamTopic("Affliction was cured or removed.","name"),[fe.AFF_STACK_CHANGED]:scopedEventStreamTopic("Affliction stack count changed.","name"),[fe.AFF_PRIORITY_CHANGED]:jsTopic("Affliction priority changed."),[fe.DEF_GOT]:scopedEventStreamTopic("Defence became active.","id"),[fe.DEF_LOST]:scopedEventStreamTopic("Defence expired or was removed.","id"),[fe.DEF_PRIORITY_CHANGED]:jsTopic("Defence priority changed."),[fe.BALANCE_GOT]:scopedEventStreamTopic("Balance became available.","id"),[fe.BALANCE_LOST]:scopedEventStreamTopic("Balance was consumed or lost.","id"),[fe.BALANCE_RESET]:scopedEventStreamTopic("Balance timing was reset.","id"),[fe.BALANCE_DURATION_OBSERVED]:scopedEventStreamTopic("Observed balance recovery duration changed.","id"),[fe.BALANCE_TIMER_RESTARTED]:jsTopic("Balance loss timer was restarted without a state flip."),[fe.EQBAL_GOT]:eventStreamTopic("Balance and equilibrium are both available."),[fe.LIMB_UPDATED]:scopedEventStreamTopic("Limb damage or break state changed.","limb"),[fe.CACHE_AMOUNT_CHANGED]:eventStreamTopic("Cached item counts changed."),[fe.CACHE_INVENTORY_LIST]:eventStreamTopic("Inventory cache snapshot applied."),[fe.CACHE_RIFT_LIST]:eventStreamTopic("Rift cache snapshot applied."),[fe.CACHE_PRECACHE_CHANGED]:jsTopic("Desired precache state changed."),[fe.ITEM_ROOM_ADDED]:eventStreamTopic("An item appeared in the current room."),[fe.ITEM_ROOM_REMOVED]:eventStreamTopic("An item left the current room."),[fe.ITEM_ROOM_UPDATED]:eventStreamTopic("A current-room item changed."),[fe.ITEM_ROOM_LIST]:eventStreamTopic("Current-room item list snapshot received."),[fe.ITEM_INV_ADDED]:eventStreamTopic("An item was added to inventory."),[fe.ITEM_INV_REMOVED]:eventStreamTopic("An item was removed from inventory."),[fe.ITEM_INV_UPDATED]:eventStreamTopic("An inventory item changed."),[fe.ITEM_INV_LIST]:eventStreamTopic("Inventory item list snapshot received."),[fe.QUEUE_UPDATED]:jsTopic("Queue contents changed."),[fe.QUEUE_FLUSHED]:jsTopic("Queue flush decision completed."),[fe.QUEUE_DEFERRED]:jsTopic("Queue execution was deferred."),[fe.QUEUE_CLEARED]:jsTopic("Queue contents were cleared."),[fe.QUEUE_SENT]:scopedEventStreamTopic("A queue submission was accepted by the server.","queueName"),[fe.QUEUE_FIRED]:scopedEventStreamTopic("A queue fire was acknowledged for a named queue.","queueName"),[fe.QUEUE_FIRED_ACK]:eventStreamTopic("Queue fire acknowledgement was recorded."),[fe.SERVERSIDE_AFF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside affliction priority confirmation was observed.","id"),[fe.SERVERSIDE_DEF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside defence priority confirmation was observed.","id"),[fe.SERVERSIDE_DIRTY]:jsTopic("Serverside reconciliation dirty flag changed."),[fe.SERVERSIDE_EVALUATED]:jsTopic("Serverside evaluation completed."),[fe.RULE_ADDED]:jsTopic("Declarative rule was added to the general rule registry."),[fe.RULE_REMOVED]:jsTopic("Declarative rule was removed from the general rule registry."),[fe.RULE_ENABLED]:jsTopic("Declarative rule was enabled."),[fe.RULE_DISABLED]:jsTopic("Declarative rule was disabled."),[fe.RULE_PACK_LOADED]:jsTopic("Declarative rule pack was loaded."),[fe.RULE_PACK_UNLOADED]:jsTopic("Declarative rule pack was unloaded."),[fe.RULE_ORDER_CHANGED]:jsTopic("General rule evaluation order changed."),[fe.RULE_ACTIVATED]:scopedEventStreamTopic("Declarative rule became active.","id"),[fe.RULE_DEACTIVATED]:scopedEventStreamTopic("Declarative rule stopped being active.","id")});validateTopicRegistry(Ht);var buildExactTopicSet=e=>new Set(Object.keys(e||{})),buildScopedBaseMap=e=>{const t=new Map;return Object.entries(e||{}).forEach(([e,a])=>{null!=a?.scopedAudience&&t.set(e,a.scopedAudience)}),t},createEventStreamPublisher=({adapter:e,registry:t,globallyEnabled:a,rawGmcpEnabled:n})=>{const s=buildExactTopicSet(t),i=buildScopedBaseMap(t),resolveAudience=e=>{const a=String(e||"").trim();if(!a)return null;if(s.has(a))return t[a].audience;const n=a.lastIndexOf(".");if(n<0)return null;const o=a.slice(0,n);return i.get(o)??null},isAllowed=(e,t)=>!!a&&(t===qt.EVENTSTREAM&&!(e===fe.RAW_GMCP&&!n)),evaluate=(t,a)=>{const n=String(t||"").trim();return!!isAllowed(n,resolveAudience(n))&&("function"==typeof e?.raiseToEventStream&&e.raiseToEventStream(n,a))};return{attach:e=>e&&"function"==typeof e.onAny?e.onAny((e,t)=>{evaluate(t,e)}):()=>{},evaluate,resolveAudience,debugInfo:()=>({globallyEnabled:Boolean(a),rawGmcpEnabled:Boolean(n),exactTopicCount:s.size,scopedBaseCount:i.size})}},normalizeScopedTopicSegment=e=>{const t=String(e||"").trim().toLowerCase();return t?t.replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""):""},normalizePublishedPayload=(e={})=>e&&"object"==typeof e&&!Array.isArray(e)?e:{value:e},normalizeMessage=(e,t={},a)=>{const n=normalizePublishedPayload(t);return{...n,topic:e,at:n.at??a()}},createRuntimeEventPorts=({adapter:e,internalEvents:t,publicEvents:a,now:n})=>{const publishPublic=(e,t={})=>{const s=normalizeMessage(e,t,n);return a.emit(e,s),s},publishPublicScoped=(e,t={},a)=>{const n=publishPublic(e,t),s=normalizeScopedTopicSegment(a);return s?(publishPublic(`${e}.${s}`,n),n):n};return{publishPublic,publishPublicScoped,publishInternal:(e,a={})=>{const s=normalizeMessage(e,a,n);return t.emit(e,s),s},publishAdapterLocal:(t,a={})=>("function"==typeof e?.emitLocal&&e.emitLocal(t,a),a)}},createRuntimeEngine=({adapter:e,seedData:t,options:a={}})=>{const n=resolveAdapterCapabilities(e),{now:s,commandDispatcher:i,systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m,trackableModel:p,roomModel:g,persistence:h,queueController:b,rules:y,serverside:v,combatService:S,noticeCenter:x,curePlanner:k,defensePlanner:C,automaticActionPlanner:A,precachePlanner:E,outputPlanner:w,outputCycle:_}=createRuntimeDependencies({adapter:e,seedData:t,options:a}),T=createGmcpBlockBuffer({coalesce:!1!==a.coalesceGmcp}),M=createEventBus({label:"nexSys4.internal"}),P=createEventBus({label:"nexSys4.public"}),O=createPromptPresenter({publicEvents:P,affModel:l,defModel:u,balanceModel:c,systemModel:o,renderPrompt:(t,a={})=>n.promptRender?e.renderPrompt(t,a):t}),D=createEventStreamPublisher({adapter:e,registry:Ht,globallyEnabled:!1!==a.publishToEventStream,rawGmcpEnabled:!0===a.publishRawGmcp}),R=createRuntimeEventPorts({adapter:e,internalEvents:M,publicEvents:P,now:s});D.attach(P);const setRuntimePhase=(e,t={})=>o.setRuntime({phase:e,...t}),syncDebugMode=()=>{const t=Boolean(o.getSettings().debug);return n.debugToggle&&e.setDebugEnabled(t),M.setDebugEnabled?.(t),P.setDebugEnabled?.(t),t},N=R.publishPublic,j=R.publishPublicScoped,I=R.publishAdapterLocal,publishStartupPhase=e=>I("StartupPhaseEvent",{phase:e});let L;const q=createCuringSetProvisioner({adapter:e,serverside:v,dispatchCommands:i.sendCommands,setRuntimePhase,publishStartupPhase,options:a}),B=createStartupCoordinator({adapter:e,systemModel:o,serverside:v,persistence:h,seedBaselineFromObservedStartup:()=>V.seedBaselineFromObservedStartup({skipObservedAdoption:q.wasCreatedThisRun()}),noticeCenter:x,buildPersistenceSnapshot:()=>V.buildPersistenceSnapshot(),startupTimeoutMs:a.startupTimeoutMs,maxStartupRetries:a.maxStartupRetries,startupFinalizeTimeoutMs:a.startupFinalizeTimeoutMs,maxStartupFinalizeRecoveryAttempts:a.maxStartupFinalizeRecoveryAttempts,publishStartupPhase,publishLoaded:e=>N(fe.SYSTEM_LOADED,e),releaseStartupPause:e=>L.setPaused(!1,e),setRuntimePhase}),$=createGmcpApplier({emit:(e,t)=>M.emit(e,t)}),z=createItemTopicNotifier({publishPublic:N}),F=createRoomIngress({roomModel:g,readHostRoomId:()=>n.gmcpSnapshot?e.getGMCP()?.Room?.Info?.num:null}),queueTranslatedGmcp=e=>{$.translate(e).forEach(e=>{z.notify(e),F.apply(e),Te.has(e.topic)||T.enqueue(e)})},hydrateCacheFromAdapterGmcp=()=>{if(!n.gmcpSnapshot)return!1;const t=e.getGMCP();return!(!t||"object"!=typeof t)&&(d.hydrateFromGmcp?.(t)??!1)},G=createRuntimeFlushCoordinator({adapter:e,systemModel:o,serverside:v,outputCycle:_,flushGmcpBuffer:()=>{T.flush().forEach(({topic:e,payload:t})=>{M.emit(e,t)}),d.completeObservationBlock?.({source:"runtime-flush"})}}),H=createCuringMasterSwitch({setPaused:(e,t)=>L.setPaused(e,t),noticeCenter:x,now:s,options:a});L=createRuntimeControlApi({systemModel:o,rules:y,serverside:v,queueController:b,noticeCenter:x,curingMasterSwitch:H,dispatchCommands:i.sendCommands,markDirty:G.markDirty,onResume:e=>{G.isFlushing()||G.flushCycle(e)}});const U=createCuringSetGuard({serverside:v,systemModel:o,runtimeControl:L,noticeCenter:x}),V=createRuntimePersistenceApi({persistence:h,systemModel:o,affModel:l,defModel:u,cacheModel:d,serverside:v,syncDebugMode,markDirty:G.markDirty}),Y=createRuntimeEventWiring({adapter:e,internalEvents:M,publicEvents:P}),Q=createRuntimeStartupOrchestrator({adapter:e,systemModel:o,persistenceApi:V,startup:B,curingSetProvisioner:q,noticeCenter:x,syncDebugMode,isStarted:G.isStarted,markStarted:G.start,setRuntimePhase,publishStartupPhase,attachEventWiring:()=>{Y.attach({options:a,queueTranslatedGmcp,publishPublic:N,publishPublicScoped:j,noticeCenter:x,syncDebugMode,systemModel:o,affModel:l,defModel:u,balanceModel:c,cacheModel:d,limbModel:m,trackableModel:p,roomModel:g,queueController:b,rules:y,serverside:v,markDirty:G.markDirty,invalidateOutput:G.invalidateOutput,flushCycle:G.flushCycle,outputCycle:_,startup:B,curingSetProvisioner:q,curingSetGuard:U,curingMasterSwitch:H,runtimeControl:L,savePersistence:V.savePersistence}),n.gmcpSnapshot&&g.observeInfo(e.getGMCP()?.Room?.Info)},promptPresenter:O,publishRuntimeStarted:()=>N(fe.RUNTIME_STARTED,{source:"runtime-start"}),hydrateCacheFromAdapterGmcp,runtimeControl:L,commandDispatcher:i,debugOverride:a.bootstrapDebugOverride}),stop=()=>{Q.dispose(),p.dispose?.(),G.isStarted()&&(N(fe.RUNTIME_STOPPED,{source:"runtime-stop"}),G.stop(),B.dispose?.(),_.dispose?.(),Y.dispose(),setRuntimePhase(he.IDLE,{paused:!0,startupFailureMessage:""}),O.stop(),l.dispose?.(),c.dispose?.(),M.clear(),P.clear(),D.attach(P),n.destroy&&e.destroy())};let W=null;const snapshot=()=>{const e=o.snapshot(),t=l.snapshot(),a=c.snapshot(),n=u.snapshot(),s=d.snapshot(),i=m.snapshot(),h=p.snapshot(),S=g.snapshot(),x=b.snapshot(),k=v.snapshot(),C=y.snapshot();return W&&W.system===e&&W.affs===t&&W.balances===a&&W.defs===n&&W.cache===s&&W.limbs===i&&W.trackables===h&&W.room===S&&W.queues===x&&W.rules===C&&W.serverside===k||(W={system:e,affs:t,balances:a,defs:n,cache:s,limbs:i,trackables:h,room:S,queues:x,rules:C,serverside:k}),W};return{start:Q.start,stop,flushCycle:G.flushCycle,savePersistence:V.savePersistence,setPaused:L.setPaused,setSlowMode:L.setSlowMode,setConfigOpen:(e,t="runtime-ui")=>N(fe.UI_CONFIG_CHANGED,{open:Boolean(e),source:t}),get paused(){return o.getRuntime().paused},snapshot,adapter:e,models:{systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m,trackableModel:p,roomModel:g},services:{combat:S},planners:{curePlanner:k,defensePlanner:C,automaticActionPlanner:A,precachePlanner:E,outputPlanner:w,outputCycle:_},queueController:b,rules:y,serverside:v,curingSetGuard:U,noticeCenter:x,persistence:h,commandDispatcher:i,promptPresenter:O,topics:fe,onEvent:(e,t)=>P.on(e,t),offEvent:(e,t)=>P.off(e,t),markDirty:G.markDirty,ingestGmcp(e,t){queueTranslatedGmcp({tag:e,payload:t}),!0===a.publishRawGmcp&&N(fe.RAW_GMCP,{source:"manual-gmcp",tag:String(e||"").trim().toLowerCase(),payload:t}),G.markDirty(`manual-gmcp:${e}`)},evaluateNow:(e="manual")=>G.flushCycle(e),addOutputCommands(e=[]){_.injectCommands(Array.isArray(e)?e:[e]),G.markDirty("manual-output-inject")},dispatchCommands:i.sendCommands,debugInfo:()=>({adapter:e.debugInfo?.()??null,internalEvents:M.debugInfo?.()??null,publicEvents:P.debugInfo?.()??null,eventStreamPublisher:D.debugInfo?.()??null})}},toArray=e=>Array.isArray(e)?e:[e],normalizeQueueKey=e=>String(e||"").trim(),normalizeCommandContext=(e,t)=>"boolean"==typeof e?{...t,preventExpansion:e}:e&&"object"==typeof e&&!Array.isArray(e)?{...t,...e}:{...t},createPublicCommandApi=({runtime:e})=>{const t=e.queueController,a=t.listQueues().map(e=>({queueId:e,meta:t.getQueue(e)||{}})),n=new Map,s=new Map,resolveQueueId=e=>{const t=normalizeQueueKey(e);return s.get(t)||t},getQueueHandle=e=>{const t=resolveQueueId(e);return n.get(t)||null},inspectQueue=e=>t.getQueue(resolveQueueId(e)),addQueue=(e,a,n)=>t.add(resolveQueueId(e),a,n),addClearQueue=(e,a,n)=>t.addClear(resolveQueueId(e),a,n),prependQueue=(e,a,n)=>t.prepend(resolveQueueId(e),a,n),clearLocalQueue=e=>t.clear(resolveQueueId(e)),clearGameQueue=e=>t.clearQueue(resolveQueueId(e)),flushQueue=(e,a)=>t.flush(resolveQueueId(e),a),isQueued=(e,t)=>{if(!t)return!1;const a=inspectQueue(e);return!!a&&(a.items.includes(t)||a.prepend.includes(t)||a.plannerCommands.includes(t))};a.forEach(({queueId:e,meta:t})=>{n.set(e,{get id(){return e},get queueId(){return e},get name(){return inspectQueue(e)?.name||t.name||""},get type(){return inspectQueue(e)?.type||t.type||""},get exclusions(){return inspectQueue(e)?.exclusions||t.exclusions||[]},inspect:()=>inspectQueue(e),state:()=>inspectQueue(e),add:(t,a)=>addQueue(e,t,a),addClear:(t,a)=>addClearQueue(e,t,a),prepend:(t,a)=>prependQueue(e,t,a),clear:()=>clearLocalQueue(e),clearQueue:()=>clearGameQueue(e),flush:t=>flushQueue(e,t),isQueued:t=>isQueued(e,t)}),s.set(e,e),t.name&&s.set(t.name,e)});const i={listQueues:()=>t.listQueues(),inspect:e=>inspectQueue(e),get:e=>getQueueHandle(e),add:(e,t,a)=>addQueue(e,t,a),addClear:(e,t,a)=>addClearQueue(e,t,a),prepend:(e,t,a)=>prependQueue(e,t,a),clear:e=>clearLocalQueue(e),clearQueue:e=>clearGameQueue(e),flush:(e,t)=>flushQueue(e,t),flushAll:()=>t.flushAll(),isQueued:(e,t)=>isQueued(e,t)},o={listQueues:()=>i.listQueues(),inspect:e=>i.inspect(e),get:e=>i.get(e)},l={};return a.forEach(({queueId:e,meta:t})=>{const a=n.get(e);a&&(l[e]=a,o[e]=a,t.name&&(o[t.name]=a))}),{queue:i,queues:o,...l,sendCmd:(t,a={})=>e.dispatchCommands([t],normalizeCommandContext(a,{source:"public-api"})),setTarget(t){const a=String(t??"").trim();if(!a)return{target:"",dispatched:!1,dispatchResult:null};const n=e.dispatchCommands(["settarget "+a],{source:"set-target"});return{target:a,dispatched:Boolean(n),dispatchResult:n}},sendInline:(t=[],a={})=>e.dispatchCommands(toArray(t),normalizeCommandContext(a,{source:"public-api-inline"})),addOutput(t=[]){e.addOutputCommands(toArray(t))},evaluateNow:(t="public-api")=>e.evaluateNow(t)}},Ut="nexSys4",Vt="https://unpkg.com/nexsys4/dist/nexSys4.nxs",Yt="khaseem",Qt=Object.freeze(["nexSys4.userSettings"]),Wt=1e4,Kt=Object.freeze({fg:"red"}),toLowerName=e=>String(e??"").trim().toLowerCase(),safeCall=e=>{try{return e()}catch{return null}},clonePackageItem=e=>{if(!e||"object"!=typeof e)return null;if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return e}},getReflexes=e=>safeCall(()=>e?.reflexes?.())??null,getPackageRegistry=e=>{const t=safeCall(()=>e?.packages?.());if("function"==typeof t?.get)return t;const a=safeCall(()=>getReflexes(e)?.packages?.());return"function"==typeof a?.get?a:null},getInstalledPackage=(e,t)=>safeCall(()=>getPackageRegistry(e)?.get(t))??null,findGroupByName=(e,t)=>{if(!Array.isArray(e))return null;const a=toLowerName(t);return e.find(e=>toLowerName(e?.name)===a)??null},capturePreservedGroups=(e,t)=>t.map(t=>{const a=findGroupByName(e?.items,t);return a?{name:t,data:clonePackageItem(a)}:null}).filter(Boolean),applyPreservedGroup=(e,t,a)=>{const n=findGroupByName(e?.items,t.name);n&&t.data&&("function"!=typeof n.apply?"object"==typeof n&&Object.assign(n,clonePackageItem(t.data)):n.apply(t.data,a))},enableShippedGroups=(e,t)=>{if(!Array.isArray(e?.items))return;const a=new Set(t.map(toLowerName));e.items.filter(e=>"group"===e?.type&&!a.has(toLowerName(e.name))).forEach(e=>{e.enabled=!0})},reportUpdateError=({adapter:e,consoleObj:t,message:a,nexusClient:n})=>{t.error(a),"function"!=typeof e?.notice?n?.display?.(a):e.notice(a,Kt)},createAbortSignal=({AbortControllerCtor:e,setTimeoutFn:t,timeoutMs:a})=>{if(!e||a<=0)return{signal:void 0,timeout:null};const n=new e,s=t(()=>n.abort(),a);return{signal:n.signal,timeout:s}},updateNxs=async({adapter:e=null,clearTimeoutFn:t=clearTimeout,consoleObj:a=console,fetchFn:n=globalThis.fetch,nexusClient:s=globalThis.nexusclient,packageName:i=Ut,preservedGroupNames:o=Qt,setTimeoutFn:l=setTimeout,skipCharacterName:c=Yt,timeoutMs:u=Wt,url:d=Vt}={})=>{if(c&&toLowerName(s?.charname)===toLowerName(c))return null;let m=null;try{if("function"!=typeof n)throw new Error("fetch is not available.");const e=getInstalledPackage(s,i);if(!e||"function"!=typeof e.apply)throw new Error(`${i} package is not installed in Nexus.`);const t=capturePreservedGroups(e,o),{signal:a,timeout:c}=createAbortSignal({AbortControllerCtor:globalThis.AbortController,setTimeoutFn:l,timeoutMs:u});m=c;const p=await n(d,{cache:"no-store",...a?{signal:a}:{}});if(!p?.ok)throw new Error(`${i} update failed: ${p?.status??"unknown"} ${p?.statusText??""}`.trim());const g=await p.json(),h=getReflexes(s);e.apply(g,h);const b=getInstalledPackage(s,i)??e;return t.forEach(e=>applyPreservedGroup(b,e,h)),enableShippedGroups(b,o),g}catch(p){return reportUpdateError({adapter:e,consoleObj:a,message:"AbortError"===p?.name?`${i} update timed out. Check your connection.`:`${i} update error: ${p?.message??String(p)}`,nexusClient:s}),null}finally{null!==m&&t(m)}},createPublicControlApi=({runtime:e,getModels:t})=>{const applySettings=(a={})=>(t().systemModel.setSettings(a,{setBaseline:!0}),e.savePersistence());return{pause:()=>e.setPaused(!0),unpause:()=>e.setPaused(!1),pauseToggle:()=>e.setPaused(!e.paused),setSlowMode:t=>e.setSlowMode(t),slowOn:()=>e.setSlowMode(!0),slowOff:()=>e.setSlowMode(!1),applySettings,setDebug:e=>applySettings({debug:Boolean(e)}),debugOn:()=>applySettings({debug:!0}),debugOff:()=>applySettings({debug:!1}),debug:()=>({runtime:e.snapshot(),internals:e.debugInfo?.()??null}),start:e.start,stop:e.stop,updateNxs:(t={})=>updateNxs({adapter:e.adapter,...t})}},resolveAudienceFor=(e,t)=>{const a=String(e||"").trim();if(!a)return null;if(Object.prototype.hasOwnProperty.call(t,a))return t[a].audience;const n=a.lastIndexOf(".");return n<0?null:t[a.slice(0,n)]?.scopedAudience??null},isPublicAudience=e=>e===qt.JS||e===qt.EVENTSTREAM,defaultIsDevMode=()=>{try{const e=globalThis.process?.env?.NODE_ENV;return!!e&&"production"!==e}catch{return!1}},defaultWarn=e=>{console.warn(e)},createPublicEventApi=({runtime:e,registry:t=Ht,isDevMode:a=defaultIsDevMode,warn:n=defaultWarn})=>{const s={on(s,i){const o=String(s||"").trim();return o&&"function"==typeof i?isPublicAudience(resolveAudienceFor(o,t))?e.onEvent(o,i):(a()&&n(`[nexSys4] topic "${o}" is not a public topic`),()=>{}):()=>{}},off(t,a){const n=String(t||"").trim();return!!n&&e.offEvent(n,a)}};return{events:s,on:s.on,off:s.off}},createPublicMutationApi=({runtime:e,getModels:t})=>{const a=e.services.combat,normalizeServersidePriority=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},samePriorityMaps=(e={},t={})=>{const a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(const n of a)if(normalizeServersidePriority(e?.[n])!==normalizeServersidePriority(t?.[n]))return!1;return!0},resetPriorities=(e=[],t,a="public-api")=>{let n=!1;return e.forEach(e=>{t(e,a)&&(n=!0)}),n},buildAffPriorityTarget=e=>{const t=e.list().reduce((t,a)=>(t[a]=normalizeServersidePriority(e.getPriority?.(a)),t),{});return e.getCountablePriorityNames?.().forEach(e=>{t[e]=0}),t},buildDefPriorityTarget=(e,t)=>{const a=t.snapshot?.().char?.class||"";return e.list().reduce((t,n)=>{const s=e.get(n);return!s?.serverside||s.static?t:"function"!=typeof e.isAvailableForClass||e.isAvailableForClass(n,a)?(t[n]=normalizeServersidePriority(e.getPriority?.(n)),t):t},{})},restorePersistedPriorities=({restoreAffs:a=!1,restoreDefs:n=!1,reason:s})=>{const{affModel:i,defModel:o,systemModel:l}=t();let c=!1;a&&(c=resetPriorities(i.list(),(e,t)=>i.resetPriority(e,t))||c),n&&(c=resetPriorities(o.list(),(e,t)=>o.resetPriority(e,t))||c);const u=e.serverside.snapshot?.(),d=a?buildAffPriorityTarget(i):null,m=n?buildDefPriorityTarget(o,l):null,p=Boolean(u&&(a&&!samePriorityMaps(u.sessionBaseline?.affPriorities,d)||n&&!samePriorityMaps(u.sessionBaseline?.defPriorities,m)));return!(!c&&!p)&&(refreshServersideBaseline(),e.markDirty(s),!0)},refreshServersideBaseline=()=>{e.serverside.setBaselineFromRuntime?.()},applyMutation=(t,a)=>!!t&&(refreshServersideBaseline(),e.markDirty(a),!0),applyDirtyOnly=(t,a)=>!!t&&(e.markDirty(a),!0);return{updateAffPriority:(e,a)=>applyMutation(t().affModel.setPriority(e,a,"public-api"),"api-aff-priority"),updateAffDefault:(e,a)=>applyMutation(t().affModel.setDefaultPriority(e,a,"public-api"),"api-aff-default"),resetAffPriority:e=>applyMutation(t().affModel.resetPriority(e,"public-api"),"api-aff-priority-reset"),resetAllAffPriorities:()=>restorePersistedPriorities({restoreAffs:!0,reason:"api-aff-priority-reset-all"}),updateDefPriority:(e,a)=>applyMutation(t().defModel.setPriority(e,a,"public-api"),"api-def-priority"),updateDefDefault:(e,a)=>applyMutation(t().defModel.setDefaultPriority(e,a,"public-api"),"api-def-default"),updateDefStatic:(e,a)=>applyMutation(t().defModel.setStatic(e,a,"public-api"),"api-def-static"),updateDefCommand:(e,a)=>applyMutation(t().defModel.setCommand(e,a,"public-api"),"api-def-command"),resetDefPriority:e=>applyMutation(t().defModel.resetPriority(e,"public-api"),"api-def-priority-reset"),resetAllDefPriorities:()=>restorePersistedPriorities({restoreDefs:!0,reason:"api-def-priority-reset-all"}),resetAllPriorities:()=>restorePersistedPriorities({restoreAffs:!0,restoreDefs:!0,reason:"api-priority-reset-all"}),defup(){const a=t().defModel,n=[];let s=!1;for(const t of a.list()){const i=a.get(t);if(!i||i.have)continue;a.resetPriority(t,"defup")&&(s=!0);const o=a.get(t),l=normalizeServersidePriority(e.rules.resolveDefensePriority(t,a.getPriority(t)));o?.static&&l>=1&&l<=25&&n.push(t)}const i=a.requestStatic?.(n,"defup")??!1;return(s||i)&&(refreshServersideBaseline(),e.markDirty("api-defup")),s||i},defoff(){const a=t().defModel;let n=!1;for(const e of a.list())a.get(e)&&a.setPriority(e,0,"defoff")&&(n=!0);const s=a.clearStaticRequests?.(void 0,"defoff")??!1;return(n||s)&&(refreshServersideBaseline(),e.markDirty("api-defoff")),n||s},setPrecache:(a={})=>(t().cacheModel.setDesiredPrecache(a),e.markDirty("api-precache"),e.savePersistence()),prioAff:t=>applyDirtyOnly(e.serverside.setPrioAff(t),"api-prioaff"),clearPrioAff:()=>applyDirtyOnly(e.serverside.clearPrioAff(),"api-prioaff-clear"),parry(t){a.parry(t),refreshServersideBaseline(),e.markDirty("api-parry")}}},Xt="public-observe",freezeHandles=(e=[],t)=>Object.freeze(e.reduce((e,a)=>(e[a]=Object.freeze(t(a)),e),{})),getObserveSource=(e={})=>String(e?.source||Xt),getObserveAt=(e={})=>e?.atMs??e?.at,getAffSnapshotState=(e,t)=>({have:e.haveAff(t),count:e.get(t)?.count??0}),didAffStateChange=(e,t)=>e.have!==t.have||e.count!==t.count,createPublicObserveApi=({runtime:e,getModels:t})=>{const a=t(),n=a.affModel,s=a.defModel,i=a.balanceModel,o=a.limbModel,l=a.systemModel,c=a.trackableModel,u=a.roomModel,d=e.services.combat,syncLimbsFromAfflictions=()=>{o.syncFromAfflictions(n.currentSorted(),"affliction")},m=freezeHandles(n.list?.()||[],t=>({got(a={}){const s=getAffSnapshotState(n,t);return n.got(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&(syncLimbsFromAfflictions(),e.markDirty(`api-observe-aff-got:${t}`),!0)},lost(a={}){const s=getAffSnapshotState(n,t);return n.lose(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&(syncLimbsFromAfflictions(),e.markDirty(`api-observe-aff-lost:${t}`),!0)}})),p=freezeHandles(s.list?.()||[],t=>({got:(a={})=>!!s.setHave(t,!0,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-got:${t}`),!0),lost:(a={})=>!!s.setHave(t,!1,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-lost:${t}`),!0)})),g=freezeHandles(i.list?.()||[],t=>{const observeServerUse=(a,n={})=>{const s=i.observeServerUse(t,a,{...n,source:getObserveSource({...n,source:n.source||"server-duration-observe"})});return s&&e.markDirty(`api-observe-balance-used:${t}`),s};return{got(a={}){const n=i.gain(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-got:${t}`),n},lost(a={}){const n=i.lose(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-lost:${t}`),n},used:observeServerUse,serverUsed:observeServerUse,observeServerUse}}),createObservedLimbHit=(e,t={},a)=>d.observeLimbHit({limb:e,amount:a,source:getObserveSource(t),at:getObserveAt(t)}),createObservedLimbReset=(e,t={})=>d.observeLimbReset({limb:e,source:getObserveSource(t)}),createObservedLimbStage=(e,t,a={})=>d.observeLimbStage({limb:e,stage:t,source:getObserveSource(a),at:getObserveAt(a)}),markObservedLimbResult=t=>!!t.changed&&(e.markDirty("torso"===t.limb&&t.stageChanged?`api-observe-limb-torso:${t.after?.stage||"unknown"}`:`api-observe-limb:${t.limb}`),!0),h=freezeHandles(o?.list?.()||[],e=>({hit:(t,a={})=>markObservedLimbResult(createObservedLimbHit(e,a,t)),reset:(t={})=>markObservedLimbResult(createObservedLimbReset(e,t)),setStage:(t,a={})=>markObservedLimbResult(createObservedLimbStage(e,t,a))})),b=Object.freeze({...h,get(e){if(!e)return null;const t=o?.get?.(e);return t?.id&&h[t.id]||null},list:()=>Object.keys(h),hit:(e,t,a={})=>markObservedLimbResult(createObservedLimbHit(e,a,t)),reset:(e,t={})=>markObservedLimbResult(createObservedLimbReset(e,t)),setStage:(e,t,a={})=>markObservedLimbResult(createObservedLimbStage(e,t,a))}),y=Object.freeze({set(t={}){const a=l.updateMount({name:String(t.name||""),id:t.id??null});return a&&e.markDirty("api-observe-mount-set"),a},clear(){const t=l.updateMount(null);return t&&e.markDirty("api-observe-mount-clear"),t}}),normalizeTrackableOptions=(e={})=>{const{atMs:t,at:a,...n}=e||{},s=getObserveAt(e);return{...n,...void 0===s?{}:{at:s},source:getObserveSource(e)}},v=Object.freeze({got:(e,t={})=>c.got(e,normalizeTrackableOptions(t)),lost:(e,t={})=>c.lose(e,normalizeTrackableOptions(t))});return{observe:Object.freeze({affs:m,defs:p,balances:g,limbs:b,mount:y,trackables:v,room:Object.freeze({frozenGround:Object.freeze({got:(e={})=>u.observeGround({...e,frozen:!0,source:getObserveSource(e)}),lost:(e={})=>u.observeGround({...e,frozen:!1,source:getObserveSource(e)})}),walls:Object.freeze({got:(e,t,a={})=>null!=e&&u.observeWall({...a,direction:e,type:t,change:"added",source:getObserveSource(a)}),lost:(e,t,a={})=>u.observeWall({...a,direction:e,type:t,change:"removed",source:getObserveSource(a)})})})})}},createPublicPromptApi=({runtime:e,control:t})=>{const a=e?.promptPresenter;if(!a)return{prompt:null};const getSystemModel=()=>e?.models?.systemModel;let n=null;return n={colorGradation:a.colorGradation,colorPercentage:a.colorPercentage,render:e=>a.render(e),set:e=>(a.set(e),n),reset:()=>(a.reset(),n),updateVars:(e={})=>(a.updateVars?.(e),n),updateAffs:(e={})=>(a.updateAffs?.(e),n),updateCureColors:(e={})=>(a.updateCureColors?.(e),n),get vars(){return a.vars},get affs(){return a.affs},get cureColors(){return a.cureColors},get enabled(){const e=getSystemModel()?.snapshot?.().settings||{};return Boolean(e.customPrompt)},set enabled(e){t?.applySettings?.({customPrompt:Boolean(e)})}},{prompt:n}},createPublicLineApi=({lineUtils:e={}})=>({replace:e.replace,replaceHTML:e.replaceHTML,replaceWord:e.replaceWord,replaceWordHTML:e.replaceWordHTML,nextLine:e.nextLine,checkLine:e.checkLine,prevLine:e.prevLine,prependNotice:e.prependNotice,say:e.say}),normalizeScopedSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),createPublicRulesApi=({runtime:e})=>({add:(t,a)=>e.rules.lifecycle.add(t,a),remove:t=>e.rules.lifecycle.remove(t),enable:t=>e.rules.lifecycle.enable(t),disable:t=>e.rules.lifecycle.disable(t),enablePack:t=>e.rules.lifecycle.enablePack(t),disablePack:t=>e.rules.lifecycle.disablePack(t),load:(t,a)=>e.rules.lifecycle.load(t,a),unload:t=>e.rules.lifecycle.unload(t),reorder:t=>e.rules.lifecycle.reorder(t),list:()=>e.rules.lifecycle.list(),bindTransition(t,a={}){const n=normalizeScopedSegment(t);if(!n)return()=>{};const s=e.topics||{},i=[];return"function"==typeof a.onActivate&&i.push(e.onEvent(`${s.RULE_ACTIVATED||"nexsys4.rule.activated"}.${n}`,a.onActivate)),"function"==typeof a.onDeactivate&&i.push(e.onEvent(`${s.RULE_DEACTIVATED||"nexsys4.rule.deactivated"}.${n}`,a.onDeactivate)),()=>{i.forEach(e=>e?.())}}}),createPublicServersideApi=({runtime:e})=>({predictions:{add:t=>e.serverside.addPrediction(t),remove:t=>e.serverside.removePrediction(t)},ssQueue:{add:t=>e.serverside.manualQueueAdd(t),insert:(t,a)=>e.serverside.manualQueueInsert(t,a),remove:t=>e.serverside.manualQueueRemove(t),reset:()=>e.serverside.manualQueueReset()},ss:{syncSnapshots:()=>e.serverside.requestSnapshotSync(),startupStatus:()=>e.serverside.getStartupStatus(),unload:(t={})=>e.curingSetGuard.unload(t)}}),createPublicStateApi=({runtime:e,getModels:t})=>{const{systemModel:a,affModel:n,defModel:s,balanceModel:i,limbModel:o,trackableModel:l}=t();return{snapshot:e.snapshot,getTarget:()=>a.snapshot().target,topics:e.topics,haveAff:e=>n.haveAff(e),affElapsedMs:e=>n.elapsedMs(e),affElapsedSeconds:e=>n.elapsedSeconds(e),affRemainingMs:e=>n.remainingMs(e),affRemainingSeconds:e=>n.remainingSeconds(e),affTiming:e=>n.timing(e),haveAffs:e=>n.haveAffs(toArray(e)),haveAnAff:e=>n.haveAnAff(toArray(e)),haveDef:e=>s.haveDef(e),haveDefs:e=>toArray(e).every(e=>s.haveDef(e)),haveAnyDef:e=>toArray(e).some(e=>s.haveDef(e)),haveBal:e=>i.have(e),haveBals:e=>toArray(e).every(e=>i.have(e)),haveAnyBal:e=>toArray(e).some(e=>i.have(e)),balElapsedMs:e=>i.elapsedMs(e),balElapsedSeconds:e=>i.elapsedSeconds(e),balRemainingMs:e=>i.remainingMs(e),balRemainingSeconds:e=>i.remainingSeconds(e),balTiming:e=>i.timing(e),getTrackable:e=>l.get(e),listTrackables:()=>l.list(),haveTrackable:e=>l.have(e),trackableElapsedMs:e=>l.elapsedMs(e),trackableRemainingMs:e=>l.remainingMs(e),trackableTiming:e=>l.timing(e),getLimb:e=>o?.get?.(e)||null,listLimbs:()=>o?.list?.()||[],getClass:()=>a.getClass(),checkClass:e=>a.checkClass(e),isClass:e=>a.isClass(e),isTarget:e=>a.isTarget(e)}},createPublicRoomApi=({roomModel:e})=>Object.freeze({get:e.snapshot,isGroundFrozen:e.isGroundFrozen,walls:Object.freeze({get:t=>Object.freeze(e.getWalls(t)),list:()=>Object.freeze(e.listWalls().map(e=>Object.freeze(e))),have:e.haveWall}),items:Object.freeze({have:e.haveItem,isKnown:e.isItemSnapshotKnown})}),isRecord=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),cloneAndFreezeCells=(e={})=>{const t={};for(const[a,n]of Object.entries(e))t[a]=isRecord(n)?Object.freeze({...n}):n;return Object.freeze(t)},buildPromptSnapshot=e=>e?Object.freeze({vars:cloneAndFreezeCells(e.vars),affs:cloneAndFreezeCells(e.affs),cureColors:cloneAndFreezeCells(e.cureColors)}):null,createPublicApi=({runtime:e,lineUtils:t={}})=>{const getModels=()=>e.models,a=createPublicStateApi({runtime:e,getModels}),n=createPublicEventApi({runtime:e}),s=createPublicControlApi({runtime:e,getModels}),i=createPublicCommandApi({runtime:e}),o=createPublicMutationApi({runtime:e,getModels}),l=createPublicObserveApi({runtime:e,getModels}),c=createPublicRulesApi({runtime:e}),u=createPublicServersideApi({runtime:e}),d=createPublicPromptApi({runtime:e,control:s}),m=createPublicLineApi({lineUtils:t}),{systemModel:p,affModel:g,defModel:h,balanceModel:b,limbModel:y,cacheModel:v,trackableModel:S,roomModel:x}=getModels(),k=Object.freeze(Object.create(null,{system:{enumerable:!0,get:()=>p.snapshot()},room:{enumerable:!0,get:()=>x.snapshot()},target:{enumerable:!0,get:()=>p.snapshot().target},class:{enumerable:!0,get:()=>p.snapshot().char.class},affs:{enumerable:!0,get:()=>g.snapshot()},defs:{enumerable:!0,get:()=>h.snapshot()},balances:{enumerable:!0,get:()=>b.snapshot()},limbs:{enumerable:!0,get:()=>y.snapshot()},queue:{enumerable:!0,get:()=>e.queueController.snapshot()},cache:{enumerable:!0,get:()=>v.snapshot()},trackables:{enumerable:!0,get:()=>S.snapshot()},prompt:{enumerable:!0,get:()=>buildPromptSnapshot(e.promptPresenter)},serverside:{enumerable:!0,get:()=>e.serverside.snapshot()},rules:{enumerable:!0,get:()=>e.rules.snapshot()}})),C=Object.freeze({on:n.events.on,off:n.events.off,topics:e.topics}),A=Object.freeze({affs:l.observe.affs,defs:l.observe.defs,balances:l.observe.balances,limbs:l.observe.limbs,mount:Object.freeze({set:l.observe.mount.set,reset:l.observe.mount.clear}),trackables:l.observe.trackables,room:l.observe.room}),E=Object.freeze({openConfig:(t="api.ui.openConfig")=>e.setConfigOpen(!0,t),closeConfig:(t="api.ui.closeConfig")=>e.setConfigOpen(!1,t),setConfigOpen:(t,a="api.ui.setConfigOpen")=>e.setConfigOpen(Boolean(t),a)}),w={...i.queue,...i.queues,list:i.queue.listQueues};return{state:k,api:{room:createPublicRoomApi({roomModel:x}),affs:{have:a.haveAff,haveAll:a.haveAffs,haveAny:a.haveAnAff,elapsedMs:a.affElapsedMs,elapsedSeconds:a.affElapsedSeconds,remainingMs:a.affRemainingMs,remainingSeconds:a.affRemainingSeconds,timing:a.affTiming,setPriority:o.updateAffPriority,setDefaultPriority:o.updateAffDefault,resetPriority:o.resetAffPriority,resetAllPriorities:o.resetAllAffPriorities},defs:{have:a.haveDef,haveAll:a.haveDefs,haveAny:a.haveAnyDef,setPriority:o.updateDefPriority,setDefaultPriority:o.updateDefDefault,setStatic:o.updateDefStatic,setCommand:o.updateDefCommand,resetPriority:o.resetDefPriority,resetAllPriorities:o.resetAllDefPriorities,defup:o.defup,defoff:o.defoff,parry:o.parry},balances:{have:a.haveBal,haveAll:a.haveBals,haveAny:a.haveAnyBal,elapsedMs:a.balElapsedMs,elapsedSeconds:a.balElapsedSeconds,remainingMs:a.balRemainingMs,remainingSeconds:a.balRemainingSeconds,timing:a.balTiming},trackables:{get:a.getTrackable,list:a.listTrackables,have:a.haveTrackable,elapsedMs:a.trackableElapsedMs,remainingMs:a.trackableRemainingMs,timing:a.trackableTiming},limbs:{get:a.getLimb,list:a.listLimbs},target:{get:a.getTarget,set:i.setTarget,is:a.isTarget},class:{get:a.getClass,is:a.isClass,check:a.checkClass},command:{send:i.sendCmd,sendInline:i.sendInline,addOutput:i.addOutput,evaluateNow:i.evaluateNow},queue:w,rules:c,prompt:d.prompt,observe:A,ui:E,line:m,control:{...s},ss:{predictions:u.predictions,queue:{add:u.ssQueue.add,insert:u.ssQueue.insert,remove:u.ssQueue.remove,clear:u.ssQueue.reset},syncSnapshots:u.ss.syncSnapshots,startupStatus:u.ss.startupStatus,unload:u.ss.unload,precache:{set:o.setPrecache},prioAff:{set:o.prioAff,reset:o.clearPrioAff}}},events:C}},generateChunk=(e,t,a)=>{const n=document.createElement("span");return n.style.color=t,n.style.backgroundColor=a,n.textContent=e,n},cloneTrustedHtmlNodes=e=>{const t=document.createElement("template");return t.innerHTML=String(e??""),[...t.content.childNodes].map(e=>e.cloneNode(!0))},replaceWordNodes=(e,t,a)=>{const n=String(t??"");if(!n)return!1;const s=document.createTreeWalker(e,globalThis.NodeFilter?.SHOW_TEXT??4),i=[];for(;s.nextNode();)i.push(s.currentNode);let o=!1;return i.forEach(e=>{const t=e?.textContent||"";if(!e?.parentNode||!t.includes(n))return;const s=document.createDocumentFragment();let i=0;for(;i<t.length;){const e=t.indexOf(n,i);if(-1===e){s.append(t.slice(i));break}e>i&&s.append(t.slice(i,e)),a().forEach(e=>s.appendChild(e)),i=e+n.length,o=!0}e.replaceWith(s)}),o},updateCurrentFormattedLine=e=>{const t=document.createElement("span");t.innerHTML=globalThis.nexusclient.current_line.parsed_line.formatted();const a=e(t);return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.innerHTML,a},replace$1=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.outerHTML,!0},replaceHTML=e=>(globalThis.nexusclient.current_line.parsed_line.formatted=()=>e,!0),replaceWord=(e,t,a,n)=>updateCurrentFormattedLine(s=>replaceWordNodes(s,e,()=>[generateChunk(t,a,n)])),replaceWordHTML=(e,t)=>updateCurrentFormattedLine(a=>replaceWordNodes(a,e,()=>cloneTrustedHtmlNodes(t))),matchPattern=(e,t)=>"string"==typeof t?e.includes(t):t instanceof RegExp&&t.test(e),prevLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n<=0)&&matchPattern(t[n-1].parsed_line.text(),e)},nextLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n>=t.length-1)&&matchPattern(t[n+1].parsed_line.text(),e)},checkLine=(e,t)=>{const{current_block:a,current_line:n}=globalThis.nexusclient,s=a.indexOf(n)+t;return!(s<0||s>a.length-1)&&matchPattern(a[s].parsed_line.text(),e)},prependNotice=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexSys.prepend_line={timestamp:globalThis.nexusclient.current_block[1].timestamp,timestamp_ms:globalThis.nexusclient.current_block[1].timestamp_ms,parsed_line:{text:()=>t.outerHTML,formatted:()=>t.outerHTML}},t.outerHTML},say=e=>{const t=new SpeechSynthesisUtterance;t.voice=globalThis.speechSynthesis.getVoices().find(e=>"Google UK English Female"===e.voiceURI)||globalThis.speechSynthesis.getVoices().find(e=>"en-US"===e.lang),t.rate=1.1,t.pitch=1.3,t.text=e,globalThis.speechSynthesis.speaking&&globalThis.speechSynthesis.cancel(),setTimeout(()=>globalThis.speechSynthesis.speak(t),10)},Jt={affTable:te,balanceTable:re,cacheTable:I,cacheNames:{herb_name_to_herb:R,mineral_to_herb:N,herb_to_mineral:j,herb_names:O,herb_names_group:D,mineral_names:M,mineral_names_group:P},cureTable:se,defTable:le,defPrios:ce,trackableTable:ue,roomWallTable:de},Zt=Object.freeze({affCount:Array.isArray(te?.list)?te.list.length:0,cureCount:Object.keys(se||{}).length,defCount:Object.keys(le||{}).length,balanceCount:Object.keys(re||{}).length,cacheCount:Object.keys(I||{}).length,trackableCount:Object.keys(ue||{}).length}),createNexSys=({adapter:e,adapterType:t="nexus",options:a={}}={})=>{installStringPrototypeHelpers();const n={...a.adapterOptions||{}};void 0===n.debug&&(n.debug=a.debug??!1),void 0===n.startupGag&&(n.startupGag=a.startupGag??!0);const s=assertAdapterContract(e||("mock"===t?createMockAdapter(n):createNexusAdapter(n))),i=createRuntimeEngine({adapter:s,seedData:Jt,options:a}),{state:o,api:l,events:c}=createPublicApi({runtime:i,lineUtils:{replace:replace$1,replaceHTML,replaceWord,replaceWordHTML,nextLine,checkLine,prependNotice,prevLine,say}});return{version:"1.3.9",seedMeta:Zt,tables:{limbs:Fe,dirs:Ge,dirMap:He,oppdirs:Ue,shortDirs:Ve,classList:Ye},adapter:s,runtime:i,state:o,api:l,events:c}},clearGlobalNexSys=()=>{if("undefined"==typeof globalThis)return;const e=globalThis.nexSys,t=e?.api?.control?.stop;if(e&&"function"==typeof t)try{t()}catch(a){console.error("nexSys4 failed to stop the existing global runtime during reinstall",a)}try{delete globalThis.nexSys}catch{globalThis.nexSys=void 0}},installGlobalNexSys=(e={})=>{clearGlobalNexSys();const t=createNexSys(e);return globalThis.nexSys=t,t.api.control.start(),t},er=Object.freeze({coalesceGmcp:!0,publishToEventStream:!0,publishRawGmcp:!1,debug:!1,startupTimeoutMs:5e3,maxStartupRetries:3,maxEntriesPerSubmission:20,pendingTimeoutMs:12e3,desyncCommandRepeats:3,maxSsCommandsPerCycle:40}),bootstrapNexus$1=(e={})=>{const{forceNew:t,...a}=e,n=Object.prototype.hasOwnProperty.call(a,"debug");return uninstallNexusClientOverrides(),installNexusClientOverrides(),installGlobalNexSys({adapterType:"nexus",options:{...er,...a,bootstrapDebugOverride:n?Boolean(a.debug):void 0}})},tr=Symbol.for("nexsys4.startup.installed"),rr="font_stacks_original",getNexusclient=()=>globalThis.nexusclient&&"object"==typeof globalThis.nexusclient?globalThis.nexusclient:null,mountGui=e=>{if(!globalThis.ReactDOM||!globalThis.React)return!1;document.getElementById("modal-root")||document.body.appendChild(Object.assign(document.createElement("div"),{id:"modal-root"})),document.getElementById("nexsys-modal")?.remove();const t=Object.assign(document.createElement("div"),{id:"nexsys-modal"});return document.getElementById("modal-root").appendChild(t),globalThis.ReactDOM.createRoot(t).render(globalThis.React.createElement(e.component,{nexSys:e})),!0},injectFonts=()=>{const e=document.getElementsByTagName("head")[0],t=document.createElement("link");t.rel="stylesheet",t.href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap",e.appendChild(t);const a=document.createElement("link");a.rel="stylesheet",a.href="https://fonts.googleapis.com/css?family=Roboto%20Mono:300,400,500,700&display=swap",e.appendChild(a)},patchFontStacks=e=>{const t=e.settings();if(void 0!==t[rr])return;const a=document.getElementsByTagName("head")[0],n=document.getElementById("nexSysCSS")||document.createElement("style");n.id="nexSysCSS",n.parentNode||a.appendChild(n),t[rr]=t.font_stacks,t.font_stacks=function(){return n.textContent=`.timestamp {font-family: ${t.font_stack}}`,[{name:"RobotoMono",stack:"Roboto Mono,Consolas,monospace"},{name:"Consolas",stack:"Consolas,RobotoMono,monospace"},{name:"Verdana",stack:"Verdana, Geneva, sans-serif"},{name:"Lucida",stack:"'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Geneva, Verdana, sans-serif"},{name:"Arial",stack:"Arial, 'Helvetica Neue', Helvetica, sans-serif"},{name:"Futura",stack:"Futura, 'Trebuchet MS', Arial, sans-serif"},{name:"Book Antiqua",stack:"'Book Antiqua', Palatino, 'Palatino Linotype', 'Palatino LT STD', Georgia, serif"},...t[rr]()]}},initializeSettings=e=>{void 0===e.variables().vars.nexSys4Settings&&(e.variables().vars.nexSys4Settings={})},startupNexus=()=>{const e=getNexusclient();return!!e&&(e[tr]||(injectFonts(),patchFontStacks(e),initializeSettings(e),e[tr]=!0),mountGui(globalThis.nexSys),!0)},ar=(0,b.createContext)(null);function useNexSys(){return(0,b.useContext)(ar)}var nr=__commonJSMin(e=>{var t=Symbol.for("react.transitional.element");Symbol.for("react.fragment");function jsxProd(e,a,n){var s=null;if(void 0!==n&&(s=""+n),void 0!==a.key&&(s=""+a.key),"key"in a)for(var i in n={},a)"key"!==i&&(n[i]=a[i]);else n=a;return a=n.ref,{$$typeof:t,type:e,key:s,ref:void 0!==a?a:null,props:n}}e.jsx=jsxProd,e.jsxs=jsxProd}),sr=__commonJSMin((e,t)=>{t.exports=nr()})();function NexSysProvider({nexSys:e,children:t}){return(0,sr.jsx)(ar.Provider,{value:e,children:t})}var ir={ink900:"#121310",ink800:"#191a16",ink700:"#20211b",ink600:"#26271f",textStrong:"#efe5ce",text:"#d4cbb6",textDim:"#a49b87",textFaint:"#7b7460",brassDeep:"#9a7433",brass:"#cba362",brassBright:"#e0c384",brassContrast:"#241a08",oxblood:"#c4776c",verdigris:"#7fa196"},or="203, 163, 98",lr={border:`rgba(${or}, 0.18)`,borderStrong:`rgba(${or}, 0.34)`,selectFill:`rgba(${or}, 0.13)`,shadow:"rgba(0, 0, 0, 0.42)",dragShadow:"rgba(0, 0, 0, 0.55)"},cr=(ir.ink900,ir.ink800,ir.ink700,ir.ink600,ir.textStrong,ir.text,ir.textDim,ir.textFaint,ir.brass,ir.brassBright,ir.brassDeep,ir.brassContrast,ir.verdigris,ir.oxblood,lr.border,lr.borderStrong,ir.brass,lr.selectFill,lr.shadow,lr.dragShadow,{radius:5}),ur=(ir.ink900,ir.ink800,ir.ink700,ir.ink600,ir.textStrong,ir.text,ir.textDim,ir.textFaint,ir.brassDeep,ir.brass,ir.brassBright,ir.oxblood,ir.verdigris,lr.border,lr.borderStrong,lr.selectFill,lr.shadow,'"Roboto Mono", ui-monospace, "Cascadia Code", "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", monospace'),dr=(()=>(0,s.createTheme)({palette:{mode:"dark",primary:{main:ir.brass,light:ir.brassBright,dark:ir.brassDeep,contrastText:ir.brassContrast},secondary:{main:ir.verdigris},error:{main:ir.oxblood},success:{main:ir.verdigris},info:{main:ir.verdigris},warning:{main:ir.brassBright},divider:lr.border,background:{default:ir.ink900,paper:ir.ink700,deep:ir.ink900,surface:ir.ink800,panel:ir.ink700,raised:ir.ink600},text:{primary:ir.textStrong,secondary:ir.textDim,disabled:ir.textFaint},border:{main:lr.border,strong:lr.borderStrong},select:{line:ir.brass,fill:lr.selectFill},action:{hover:lr.selectFill,selected:lr.selectFill}},shape:{borderRadius:cr.radius},typography:{fontFamily:ur,fontSize:13,button:{textTransform:"none",fontWeight:700},subtitle1:{fontWeight:700,letterSpacing:"0.01em"},subtitle2:{fontWeight:700,letterSpacing:"0.01em"},overline:{letterSpacing:"0.14em"}},components:{MuiTypography:{styleOverrides:{root:{fontFamily:ur}}},MuiPaper:{styleOverrides:{root:{backgroundImage:"none"}}},MuiSwitch:{defaultProps:{size:"small"}},MuiSelect:{defaultProps:{size:"small"}},MuiTextField:{defaultProps:{size:"small"}},MuiPopover:{styleOverrides:{paper:{backgroundColor:ir.ink600,backgroundImage:"none",border:`1px solid ${lr.borderStrong}`}}},MuiTooltip:{styleOverrides:{tooltip:{backgroundColor:ir.ink600,color:ir.textStrong,border:`1px solid ${lr.borderStrong}`,fontFamily:ur,fontSize:"0.72rem"},arrow:{color:ir.ink600}}},MuiLinearProgress:{styleOverrides:{determinate:{transition:"none",backgroundColor:lr.selectFill},bar:{transition:"none",backgroundColor:ir.brass}}},MuiDialog:{styleOverrides:{paper:({theme:e})=>({backgroundColor:e.palette.background.surface,backgroundImage:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius})}},MuiDialogTitle:{styleOverrides:{root:({theme:e})=>({"&&":{backgroundColor:e.palette.background.surface,color:e.palette.text.primary,borderBottom:`1px solid ${e.palette.divider}`}})}}}}))(),mr=!1;function useDialogOpen(e){const[t,a]=(0,b.useState)(mr);return(0,b.useEffect)(()=>e?.events?.on?.(fe.UI_CONFIG_CHANGED,({open:e})=>{a(Boolean(e))})??void 0,[e]),[t,a]}var cloneSettings=(e={})=>(0,i.produce)(e,()=>{}),toFiniteNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toPriority=e=>toFiniteNumber(e,0),toConfigPriority=e=>Math.max(0,Math.min(26,toPriority(e))),toQuantity=e=>Math.max(0,toFiniteNumber(e,0)),isBlankInput=e=>""===e,toDraftConfigPriority=(e,t=0)=>{if(isBlankInput(e))return"";const a=Number(e);return Number.isFinite(a)?Math.max(0,Math.min(26,a)):t},isActiveDefPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=25},normalizePriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a),e),{}),buildAffPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toPriority(a?.defaultPriority),e),{}),buildDefPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a?.defaultPriority),e),{}),buildDefStaticDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Boolean(a?.static),e),{}),buildDefOppsMap=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Array.isArray(a?.opps)?a.opps:[],e),{}),buildPrecacheDraft=(e={})=>Object.entries(e?.desiredPrecache??{}).reduce((e,[t,a])=>(e[t]=toQuantity(a),e),{}),buildDraft=(e={})=>({settings:cloneSettings(e.system?.settings??{}),affPriorities:buildAffPriorityDraft(e.affs??{}),defPriorities:buildDefPriorityDraft(e.defs??{}),defStatics:buildDefStaticDraft(e.defs??{}),defOpps:buildDefOppsMap(e.defs??{}),desiredPrecache:buildPrecacheDraft(e.cache??{})}),keysChangedFrom=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]);function useSettingsForm(e){const[t]=(0,b.useState)(()=>buildDraft(e?.runtime?.snapshot?.()??{})),[a,n]=(0,b.useState)(()=>t.settings),[s,o]=(0,b.useState)(()=>t.affPriorities),[l,c]=(0,b.useState)(()=>t.defPriorities),[u,d]=(0,b.useState)(()=>t.defStatics),[m,p]=(0,b.useState)(()=>t.desiredPrecache);return{pending:a,set:(0,b.useCallback)((e,t)=>{n(a=>a?(0,i.produce)(a,a=>{const n=e.split(".");let s=a;for(let e=0;e<n.length-1;e+=1)s[n[e]]&&"object"==typeof s[n[e]]||(s[n[e]]={}),s=s[n[e]];s[n[n.length-1]]=t}):a)},[]),affPriorities:s,setAffPriority:(0,b.useCallback)((e,t)=>{o(a=>({...a,[e]:toConfigPriority(t)}))},[]),defPriorities:l,setDefPriority:(0,b.useCallback)((e,a)=>{c(n=>{const s=toDraftConfigPriority(a,n?.[e]??0),i={...n,[e]:s};return isActiveDefPriority(s)&&(t.defOpps[e]||[]).forEach(e=>{isActiveDefPriority(i[e])&&(i[e]=0)}),i})},[t]),defStatics:u,setDefStatic:(0,b.useCallback)((e,t)=>{d(a=>({...a,[e]:Boolean(t)}))},[]),desiredPrecache:m,setPrecache:(0,b.useCallback)((e,t)=>{p(a=>({...a,[e]:toQuantity(t)}))},[]),commit:(0,b.useCallback)(()=>{if(!e)return;const n=t;keysChangedFrom(s,n.affPriorities).forEach(t=>{e.api?.affs?.setDefaultPriority?.(t,s[t])});const i=normalizePriorityDraft(l);keysChangedFrom(i,n.defPriorities).forEach(t=>{e.api?.defs?.setDefaultPriority?.(t,i[t])}),keysChangedFrom(u,n.defStatics).forEach(t=>{e.api?.defs?.setStatic?.(t,u[t])});const o=keysChangedFrom(m,n.desiredPrecache).reduce((e,t)=>(e[t]=m[t]??0,e),{});Object.keys(o).length&&e.api?.ss?.precache?.set?.(o),a&&e.api?.control?.applySettings?.(a)},[a,s,l,u,m,t,e])}}function LabelledSwitch({label:e,checked:t,onChange:a}){return(0,sr.jsx)(n.FormControlLabel,{control:(0,sr.jsx)(n.Switch,{checked:Boolean(t),onChange:e=>a(e.target.checked),size:"small"}),label:e,sx:{ml:0,mr:0,gap:.5,alignItems:"center",userSelect:"none","& .MuiSwitch-root":{mr:.5},"& .MuiFormControlLabel-label":{fontSize:11,lineHeight:1.25}}})}function ThresholdSlider({label:e,value:t,onChange:a,min:s=0,max:i=100,step:o=5,unit:l="%"}){return(0,sr.jsxs)(n.Box,{sx:{mb:1},children:[(0,sr.jsxs)(n.Typography,{variant:"body2",sx:{mb:.5,fontSize:11,lineHeight:1.3},children:[e,": ",t,l]}),(0,sr.jsx)(n.Slider,{value:t,min:s,max:i,step:o,onChange:(e,t)=>a(t),size:"small",sx:{color:"primary.main"}})]})}var pr="50px",gr={minWidth:95,height:25,px:1,fontSize:11,lineHeight:1};function SectionHeader({children:e}){return(0,sr.jsx)(n.Typography,{variant:"overline",sx:{display:"block",color:"primary.main",mt:2,mb:.5,fontWeight:700},children:e})}function SystemSettingsTab({pending:e,set:t}){return e?(0,sr.jsxs)(n.Box,{sx:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",columnGap:{xs:2,md:pr},rowGap:2,pt:1},children:[(0,sr.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,sr.jsx)(SectionHeader,{children:"nexSys Config"}),(0,sr.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,sr.jsx)(LabelledSwitch,{label:"Load on login",checked:!!e.loadOnLogin,onChange:e=>t("loadOnLogin",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Queue while paused",checked:e.queueWhilePaused,onChange:e=>t("queueWhilePaused",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Override Tab target",checked:e.overrideTab,onChange:e=>t("overrideTab",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Custom Prompt",checked:e.customPrompt,onChange:e=>t("customPrompt",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Debug output",checked:e.debug,onChange:e=>t("debug",e)})]}),(0,sr.jsx)(SectionHeader,{children:"Notices (Echo)"}),(0,sr.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,sr.jsx)(LabelledSwitch,{label:"Affliction gained",checked:e.notices?.affGot,onChange:e=>t("notices.affGot",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Affliction lost",checked:e.notices?.affLost,onChange:e=>t("notices.affLost",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Defence gained",checked:e.notices?.defGot,onChange:e=>t("notices.defGot",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Defence lost",checked:e.notices?.defLost,onChange:e=>t("notices.defLost",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Balance lost",checked:e.notices?.balanceLost,onChange:e=>t("notices.balanceLost",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Balance recovered",checked:e.notices?.balanceRecovered,onChange:e=>t("notices.balanceRecovered",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Trackable gained",checked:e.notices?.trackableGot,onChange:e=>t("notices.trackableGot",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Trackable lost",checked:e.notices?.trackableLost,onChange:e=>t("notices.trackableLost",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Priority changes",checked:e.notices?.priority,onChange:e=>t("notices.priority",e)}),(0,sr.jsx)(LabelledSwitch,{label:"General output",checked:e.notices?.output,onChange:e=>t("notices.output",e)})]})]}),(0,sr.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:190},width:{xs:"100%",md:190},minWidth:0},children:[(0,sr.jsx)(SectionHeader,{children:"Curing Method"}),(0,sr.jsxs)(n.Box,{sx:{mb:1},children:[(0,sr.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Curing type"}),(0,sr.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.transmutation?"transmutation":"concoctions",onChange:(e,a)=>a&&t("ss.transmutation","transmutation"===a),sx:{"& .MuiToggleButton-root":gr},children:[(0,sr.jsx)(n.ToggleButton,{value:"transmutation",children:"Transmutation"}),(0,sr.jsx)(n.ToggleButton,{value:"concoctions",children:"Concoctions"})]})]}),(0,sr.jsxs)(n.Box,{sx:{mb:1},children:[(0,sr.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Sip priority"}),(0,sr.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.sipPriority??"health",onChange:(e,a)=>a&&t("ss.sipPriority",a),sx:{"& .MuiToggleButton-root":gr},children:[(0,sr.jsx)(n.ToggleButton,{value:"health",children:"Health"}),(0,sr.jsx)(n.ToggleButton,{value:"mana",children:"Mana"})]})]}),(0,sr.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column",mt:1},children:[(0,sr.jsx)(LabelledSwitch,{label:"Batching",checked:e.ss?.batch,onChange:e=>t("ss.batch",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Tree Tattoo",checked:"on"===e.ss?.tree,onChange:e=>t("ss.tree",e?"on":"off")}),(0,sr.jsx)(LabelledSwitch,{label:"Focus",checked:e.ss?.focus,onChange:e=>t("ss.focus",e)}),e.ss?.focus&&(0,sr.jsx)(LabelledSwitch,{label:"Focus over Herbs",checked:e.ss?.focusOverHerbs,onChange:e=>t("ss.focusOverHerbs",e)}),(0,sr.jsx)(LabelledSwitch,{label:"Blood clotting",checked:e.ss?.clot,onChange:e=>t("ss.clot",e)}),e.ss?.clot&&(0,sr.jsx)(n.Box,{sx:{ml:1,mt:2,mb:.5},children:(0,sr.jsx)(n.TextField,{label:"Clot above",value:e.ss?.clotAt??"",onChange:e=>t("ss.clotAt",Number(e.target.value)||0),type:"number",size:"small",sx:{width:100,maxWidth:"100%"},slotProps:{htmlInput:{min:0}}})})]})]}),(0,sr.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,sr.jsx)(SectionHeader,{children:"Thresholds"}),(0,sr.jsx)(ThresholdSlider,{label:"Sip health at",value:e.ss?.sipHealthAt??0,onChange:e=>t("ss.sipHealthAt",e)}),(0,sr.jsx)(ThresholdSlider,{label:"Sip mana at",value:e.ss?.sipManaAt??0,onChange:e=>t("ss.sipManaAt",e)}),(0,sr.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,sr.jsx)(ThresholdSlider,{label:"Moss health at",value:e.ss?.mossHealthAt??0,onChange:e=>t("ss.mossHealthAt",e)}),(0,sr.jsx)(ThresholdSlider,{label:"Moss mana at",value:e.ss?.mossManaAt??0,onChange:e=>t("ss.mossManaAt",e)}),(0,sr.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,sr.jsx)(ThresholdSlider,{label:"Cure fractures above",value:e.ss?.fracturesAbove??0,onChange:e=>t("ss.fracturesAbove",e)}),(0,sr.jsx)(ThresholdSlider,{label:"Use mana abilities above",value:e.ss?.manaThreshold??0,onChange:e=>t("ss.manaThreshold",e)})]})]}):null}function useNexSysSnapshot(e){return(0,b.useSyncExternalStore)((0,b.useCallback)(t=>{const a=e.events.topics,n=[a.SYSTEM_SETTINGS_CHANGED,a.SYSTEM_STATUS_CHANGED,a.SYSTEM_CLASS_CHANGED,a.AFF_PRIORITY_CHANGED,a.DEF_PRIORITY_CHANGED,a.CACHE_PRECACHE_CHANGED,a.SYSTEM_RUNTIME_CHANGED];return n.forEach(a=>e.events.on(a,t)),()=>n.forEach(a=>e.events.off(a,t))},[e]),e.runtime.snapshot,e.runtime.snapshot)}var fr=Object.freeze({}),hr=new Set(Object.keys(te?.types?.nonServerside??{}));function buildColumns(e,t={}){return(0,i.produce)({},a=>{for(let e=0;e<=25;e++)a[`col-${e}`]={id:`col-${e}`,label:0===e?"Ignored 26":`Prio ${e}`,priority:e,affs:[]};for(const[n,s]of Object.entries(e)){if(hr.has(n))continue;const e=Number(t[n]??s.defaultPriority??0);!Number.isFinite(e)||e>26||a[`col-${Math.max(0,Math.min(25,26===e?0:e))}`].affs.push(n)}})}function findContainer(e,t){return t[e]?e:Object.keys(t).find(a=>t[a].affs.includes(e))??null}function useAffPriorities(e,t={}){const[a,n]=(0,b.useState)(null),[s,c]=(0,b.useState)(null),u=(0,b.useRef)(null),d=useNexSysSnapshot(e)?.affs??fr,{affPriorities:m=fr,setAffPriority:p}=t,g=(0,b.useMemo)(()=>buildColumns(d,m),[d,m]);return{columns:s??g,activeId:a,sensors:(0,o.useSensors)((0,o.useSensor)(o.PointerSensor,{activationConstraint:{distance:4}}),(0,o.useSensor)(o.KeyboardSensor,{coordinateGetter:l.sortableKeyboardCoordinates})),onDragStart:(0,b.useCallback)(({active:e})=>{n(String(e.id));const t=(0,i.produce)(g,()=>{});u.current=t,c(t)},[g]),onDragOver:(0,b.useCallback)(({active:e,over:t})=>{if(!t)return;const a=String(e.id),n=String(t.id),s=u.current;if(!s)return;const o=findContainer(a,s),d=findContainer(n,s);if(!o||!d)return;let m;if(o===d){const e=s[o].affs,t=e.indexOf(a),c=e.indexOf(n);if(-1===t||-1===c||t===c)return;m=(0,i.produce)(s,a=>{a[o].affs=(0,l.arrayMove)(e,t,c)})}else m=(0,i.produce)(s,e=>{const t=e[o].affs,s=e[d].affs;if(-1===t.indexOf(a))return;const i=s.indexOf(n),l=-1===i?s.length:i;e[o].affs=t.filter(e=>e!==a),e[d].affs=[...s.slice(0,l),a,...s.slice(l)]});u.current=m,c(m)},[]),onDragEnd:(0,b.useCallback)(({active:e,over:t})=>{n(null);const a=u.current;if(u.current=null,c(null),!t||!a)return;const s=String(e.id),i=findContainer(s,a);if(!i)return;const o=a[i]?.priority??0;o!==(g[findContainer(s,g)]?.priority??0)&&p?.(s,o)},[g,p]),onDragCancel:(0,b.useCallback)(()=>{n(null),u.current=null,c(null)},[])}}var br={antimony:"olive",argentum:"royalblue",aurum:"ForestGreen",calcite:"slategray",cinnabar:"greenyellow",cuprum:"DeepSkyBlue",ferrum:"DarkOrange",magnesium:"Red",plumbum:"Gold",realgar:"firebrick",stannum:"Tan",caloric:"darkseagreen",mending:"orchid",epidermal:"sienna",restoration:"darkviolet",health:"lightpink",writhe:"PaleGoldenRod"},yr={ginseng:"ferrum",bloodroot:"magnesium",kelp:"aurum",hawthorn:"calamine",lobelia:"argentum",bellwort:"cuprum",ginger:"antimony",bayberry:"arsenic",ash:"stannum",goldenseal:"plumbum",pear:"calcite",elm:"cinnabar",valerian:"realgar",skullcap:"azurite",moss:"potash",kola:"quartz",sileris:"quicksilver",cohosh:"gypsum"};function resolveCureColor(e){if(e in br)return br[e]??null;const t=yr[e];if(t)return br[t]??null;const a=e.match(/^(caloric|mending|epidermal|restoration|health)\b/);return a?br[a[1]]??null:null}var vr=["bound","daeggerimpale","entangled","impaled","transfixation","webbed","icebound"],Sr={};for(const[Jn,Zn]of Object.entries(ie))for(const e of Zn){const t=resolveCureColor(e);if(t){Sr[Jn]=t;break}}for(const Jn of vr)Sr[Jn]||(Sr[Jn]=br.writhe);function getAffColor(e){return Sr[e]??null}function AffChip({name:e,isDragging:t=!1}){const a=getAffColor(e);return(0,sr.jsx)(n.Chip,{label:e,size:"small",sx:{fontSize:13,height:22,mb:.25,padding:.5,opacity:t?.4:1,cursor:"grab",bgcolor:"background.deep",color:a??"text.secondary",border:"1px solid",borderColor:a??"divider","& .MuiChip-label":{px:.75},"&:active":{cursor:"grabbing"}}})}function SortableAffChip({name:e}){const{attributes:t,listeners:a,setNodeRef:s,transform:i,transition:o,isDragging:u}=(0,l.useSortable)({id:e});return(0,sr.jsx)(n.Box,{ref:s,...t,...a,sx:{transform:c.CSS.Transform.toString(i),transition:o,touchAction:"none"},children:(0,sr.jsx)(AffChip,{name:e,isDragging:u})})}function PriorityColumn({column:e}){const t=0===e.priority,{setNodeRef:a}=(0,o.useDroppable)({id:e.id});return(0,sr.jsxs)(n.Box,{sx:{minWidth:125,maxWidth:125,border:"1px solid",borderColor:t?"divider":"border.strong",borderRadius:1,p:.5,bgcolor:t?"background.deep":"select.fill",flexShrink:0},children:[(0,sr.jsx)(n.Typography,{variant:"caption",sx:{display:"block",textAlign:"center",fontWeight:700,color:t?"text.secondary":"primary.main",mb:.5,fontSize:13},children:e.label}),(0,sr.jsx)(l.SortableContext,{items:e.affs,strategy:l.verticalListSortingStrategy,children:(0,sr.jsx)(n.Box,{ref:a,sx:{minHeight:28,display:"flex",flexDirection:"column"},children:e.affs.map(e=>(0,sr.jsx)(SortableAffChip,{name:e},e))})})]})}function AffPrioritiesTab({settingsForm:e}){const{columns:t,activeId:a,sensors:s,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u}=useAffPriorities(useNexSys(),e);return(0,sr.jsx)(n.Box,{sx:{py:1},children:(0,sr.jsx)(n.Box,{sx:{display:"inline-flex",gap:.75,alignItems:"flex-start"},children:(0,sr.jsxs)(o.DndContext,{sensors:s,collisionDetection:o.closestCorners,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u,children:[Object.keys(t).map(e=>(0,sr.jsx)(PriorityColumn,{column:t[e]},e)),(0,sr.jsx)(o.DragOverlay,{children:a?(0,sr.jsx)(AffChip,{name:a}):null})]})})})}function r(e){var t,a,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(a=r(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function clsx(){for(var e,t,a=0,n="",s=arguments.length;a<s;a++)(e=arguments[a])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}function composeClasses(e,t,a=void 0){const n={};for(const s in e){const i=e[s];let o="",l=!0;for(let e=0;e<i.length;e+=1){const n=i[e];n&&(o+=(!0===l?"":" ")+t(n),l=!1,a&&a[n]&&(o+=" "+a[n]))}n[s]=o}return n}function formatMuiErrorMessage(e,...t){const a=new URL(`https://mui.com/production-error/?code=${e}`);return t.forEach(e=>a.searchParams.append("args[]",e)),`Minified MUI error #${e}; visit ${a} for the full message.`}function capitalize$1(e){if("string"!=typeof e)throw new Error(formatMuiErrorMessage(7));return e.charAt(0).toUpperCase()+e.slice(1)}var xr=capitalize$1;function fastDeepAssign(e,t){const a=Array.isArray(t),n=Array.isArray(e);return isPrimitive(t)?t:isPrimitiveOrBuiltIn(e)?clone(t):a&&n?mergeArray(e,t):a!==n?clone(t):mergeObject(e,t)}function cloneArray(e){let t=0;const a=e.length,n=new Array(a);for(t=0;t<a;t+=1)n[t]=clone(e[t]);return n}function cloneObject(e){const t={};for(const a in e)t[a]=clone(e[a]);return t}function mergeArray(e,t){const a=e.length;for(let n=0;n<t.length;n+=1)e[a+n]=clone(t[n]);return e}function isMergeableObject(e){return!("object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date)}function isPrimitive(e){return"object"!=typeof e||null===e}function isPrimitiveOrBuiltIn(e){return"object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date}function clone(e){return isMergeableObject(e)?Array.isArray(e)?cloneArray(e):cloneObject(e):e}function mergeObject(e,t){for(const a in t)e[a]=a in e?fastDeepAssign(e[a],t[a]):clone(t[a]);return e}function isObjectEmpty(e){if(null==e)return!0;for(const t in e)return!1;return!0}var kr=__commonJSMin(e=>{Symbol.for("react.transitional.element"),Symbol.for("react.portal");var t=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),n=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),i=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.suspense_list"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),m=(Symbol.for("react.view_transition"),Symbol.for("react.client.reference"));e.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===t||e===n||e===a||e===l||e===c||"object"==typeof e&&null!==e&&(e.$$typeof===d||e.$$typeof===u||e.$$typeof===i||e.$$typeof===s||e.$$typeof===o||e.$$typeof===m||void 0!==e.getModuleId)}}),Cr=__commonJSMin((e,t)=>{t.exports=kr()})();function isPlainObject(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}function deepClone(e){if(b.isValidElement(e)||(0,Cr.isValidElementType)(e)||!isPlainObject(e))return e;const t={};return Object.keys(e).forEach(a=>{t[a]=deepClone(e[a])}),t}function deepmerge(e,t,a={clone:!0}){const n=a.clone?{...e}:e;return isPlainObject(e)&&isPlainObject(t)&&Object.keys(t).forEach(s=>{b.isValidElement(t[s])||(0,Cr.isValidElementType)(t[s])?n[s]=t[s]:isPlainObject(t[s])&&Object.prototype.hasOwnProperty.call(e,s)&&isPlainObject(e[s])?n[s]=deepmerge(e[s],t[s],a):a.clone?n[s]=isPlainObject(t[s])?deepClone(t[s]):t[s]:n[s]=t[s]}),n}var Ar=/min-width:\s*([0-9.]+)/;function sortContainerQueries(e,t){if(!e.containerQueries||!hasContainerQuery(t))return t;const a=[];for(const s in t)s.startsWith("@container")&&a.push(s);a.sort((e,t)=>+(e.match(Ar)?.[1]||0)-+(t.match(Ar)?.[1]||0));const n=t;for(let s=0;s<a.length;s+=1){const e=a[s],t=n[e];delete n[e],n[e]=t}return n}function hasContainerQuery(e){for(const t in e)if(t.startsWith("@container"))return!0;return!1}function isCqShorthand(e,t){return"@"===t||t.startsWith("@")&&(e.some(e=>t.startsWith(`@${e}`))||!!t.match(/^@\d/))}function getContainerQuery(e,t){const a=t.match(/^@([^/]+)?\/?(.+)?$/);if(!a)return null;const[,n,s]=a,i=Number.isNaN(+n)?n||0:+n;return e.containerQueries(s).up(i)}function cssContainerQueries(e){const toContainerQuery=(e,t)=>e.replace("@media",t?`@container ${t}`:"@container");function attachCq(t,a){t.up=(...t)=>toContainerQuery(e.breakpoints.up(...t),a),t.down=(...t)=>toContainerQuery(e.breakpoints.down(...t),a),t.between=(...t)=>toContainerQuery(e.breakpoints.between(...t),a),t.only=(...t)=>toContainerQuery(e.breakpoints.only(...t),a),t.not=(...t)=>{const n=toContainerQuery(e.breakpoints.not(...t),a);return n.includes("not all and")?n.replace("not all and ","").replace("min-width:","width<").replace("max-width:","width>").replace("and","or"):n}}const t={},containerQueries=e=>(attachCq(t,e),t);return attachCq(containerQueries),{...e,containerQueries}}var sortBreakpointsValues=e=>{const t=Object.keys(e).map(t=>({key:t,val:e[t]}))||[];return t.sort((e,t)=>e.val-t.val),t.reduce((e,t)=>({...e,[t.key]:t.val}),{})};function createBreakpoints(e){const{values:t={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:a="px",step:n=5,...s}=e,i=sortBreakpointsValues(t),o=Object.keys(i);function up(e){return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a})`}function down(e){return`@media (max-width:${("number"==typeof t[e]?t[e]:e)-n/100}${a})`}function between(e,s){const i=o.indexOf(s);return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a}) and (max-width:${(-1!==i&&"number"==typeof t[o[i]]?t[o[i]]:s)-n/100}${a})`}function only(e){return o.indexOf(e)+1<o.length?between(e,o[o.indexOf(e)+1]):up(e)}function not(e){const t=o.indexOf(e);return 0===t?up(o[1]):t===o.length-1?down(o[t]):between(e,o[o.indexOf(e)+1]).replace("@media","@media not all and")}const l=[];for(let c=0;c<o.length;c+=1)l.push(up(o[c]));return{keys:o,values:i,up,down,between,only,not,unit:a,internal_mediaKeys:l,...s}}var Er={},wr={xs:0,sm:600,md:900,lg:1200,xl:1536},_r=createBreakpoints({values:wr}),Tr={containerQueries:e=>({up:t=>{let a="number"==typeof t?t:wr[t]||t;return"number"==typeof a&&(a=`${a}px`),e?`@container ${e} (min-width:${a})`:`@container (min-width:${a})`}})};function handleBreakpoints(e,t,a){const n={};return iterateBreakpoints(n,e.theme,t,(e,t,s)=>{const i=a(t,s);e?n[e]=i:fastDeepAssign(n,i)})}function iterateBreakpoints(e,t,a,n){if(t??=Er,Array.isArray(a)){const s=t.breakpoints??_r;for(let t=0;t<a.length;t+=1)buildBreakpoint(e,s.up(s.keys[t]),a[t],void 0,n);return e}if("object"==typeof a){const s=t.breakpoints??_r,i=s.values??wr;for(const o in a)if(isCqShorthand(s.keys,o)){const s=getContainerQuery(t.containerQueries?t:Tr,o);s&&buildBreakpoint(e,s,a[o],o,n)}else if(o in i)buildBreakpoint(e,s.up(o),a[o],o,n);else{const t=o;e[t]=a[t]}return e}return n(void 0,a),e}function buildBreakpoint(e,t,a,n,s){e[t]??={},s(t,a,n)}function createEmptyBreakpointObject(e=_r){const{internal_mediaKeys:t}=e,a={};for(let n=0;n<t.length;n+=1)a[t[n]]={};return a}function removeUnusedBreakpoints(e,t){const a=e.internal_mediaKeys;for(let n=0;n<a.length;n+=1){const e=a[n];isObjectEmpty(t[e])&&delete t[e]}return t}function hasBreakpoint(e,t){if(Array.isArray(t))return!0;if("object"==typeof t&&null!==t){for(let n=0;n<e.keys.length;n+=1)if(e.keys[n]in t)return!0;const a=Object.keys(t);for(let t=0;t<a.length;t+=1)if(isCqShorthand(e.keys,a[t]))return!0}return!1}function getStyleValue2(e,t,a,n){let s;return s="function"==typeof e?e(a):Array.isArray(e)?e[a]||a:"string"==typeof a&&getPath(e,a,!0,n)||a,t&&(s=t(s,a,e)),s}function getPath(e,t,a=!0,n=void 0){if(!e||!t)return null;const s=t.split(".");if(e.vars&&a){const t=getPathImpl(e.vars,s,n);if(null!=t)return t}return getPathImpl(e,s,n)}function getPathImpl(e,t,a=void 0){let n,s=e,i=0;for(;i<t.length;){if(null==s)return s;n=s,s=s[t[i]],i+=1}if(a&&void 0===s){const e=t[t.length-1],s=`${a}${"default"===e?"":capitalize$1(e)}`;return n?.[s]}return s}function style$1(e){const{prop:t,cssProperty:a=e.prop,themeKey:n,transform:s}=e,fn=e=>{if(null==e[t])return null;const i=e[t],o=getPath(e.theme,n)||{};return handleBreakpoints(e,i,e=>{const n=getStyleValue2(o,s,e,t);return!1===a?n:{[a]:n}})};return fn.propTypes={},fn.filterProps=[t],fn}var Mr={internal_cache:{}},Pr={m:"margin",p:"padding"},Or={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},Dr={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},Rr={};for(const Jn in Pr)Rr[Jn]=[Pr[Jn]];for(const Jn in Pr)for(const e in Or){const t=Pr[Jn],a=Or[e],n=Array.isArray(a)?a.map(e=>t+e):[t+a];Rr[Jn+e]=n}for(const Jn in Dr)Rr[Jn]=Rr[Dr[Jn]];var Nr=new Set(["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"]),jr=new Set(["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"]),Ir=new Set([...Nr,...jr]);function createUnaryUnit(e,t,a,n){const s=getPath(e,t,!0)??a;return"number"==typeof s||"string"==typeof s?e=>"string"==typeof e?e:"string"==typeof s?s.startsWith("var(")&&0===e?0:s.startsWith("var(")&&1===e?s:`calc(${e} * ${s})`:s*e:Array.isArray(s)?e=>{if("string"==typeof e)return e;const t=s[Math.abs(e)];return e>=0?t:"number"==typeof t?-t:"string"==typeof t&&t.startsWith("var(")?`calc(-1 * ${t})`:`-${t}`}:"function"==typeof s?s:()=>{}}function createUnarySpacing(e){return createUnaryUnit(e,"spacing",8,"spacing")}function getValue(e,t){return"string"==typeof t||null==t?t:e(t)}var Lr=[""];function style(e,t){const a=e.theme??Mr,n=a?.internal_cache?.unarySpacing??createUnarySpacing(a),s={};for(const i in e){if(!t.has(i))continue;const a=Rr[i]??(Lr[0]=i,Lr),o=e[i];iterateBreakpoints(s,e.theme,o,(e,t)=>{const i=e?s[e]:s;for(let s=0;s<a.length;s+=1)i[a[s]]=getValue(n,t)})}return s}function margin(e){return style(e,Nr)}function padding(e){return style(e,jr)}function spacing(e){return style(e,Ir)}function compose(...e){const t=e.reduce((e,t)=>(t.filterProps.forEach(a=>{e[a]=t}),e),{}),fn=e=>{const a={};for(const n in e)t[n]&&fastDeepAssign(a,t[n](e));return a};return fn.propTypes={},fn.filterProps=e.reduce((e,t)=>e.concat(t.filterProps),[]),fn}function borderTransform(e){return"number"!=typeof e?e:`${e}px solid`}function createBorderStyle(e,t){return style$1({prop:e,themeKey:"borders",transform:t})}margin.propTypes={},margin.filterProps=Nr,padding.propTypes={},padding.filterProps=jr,spacing.propTypes={},spacing.filterProps=Ir;var qr=createBorderStyle("border",borderTransform),Br=createBorderStyle("borderTop",borderTransform),$r=createBorderStyle("borderRight",borderTransform),zr=createBorderStyle("borderBottom",borderTransform),Fr=createBorderStyle("borderLeft",borderTransform),Gr=createBorderStyle("borderColor"),Hr=createBorderStyle("borderTopColor"),Ur=createBorderStyle("borderRightColor"),Vr=createBorderStyle("borderBottomColor"),Yr=createBorderStyle("borderLeftColor"),Qr=createBorderStyle("outline",borderTransform),Wr=createBorderStyle("outlineColor"),borderRadius=e=>{if(void 0!==e.borderRadius&&null!==e.borderRadius){const t=createUnaryUnit(e.theme,"shape.borderRadius",4,"borderRadius"),styleFromPropValue=e=>({borderRadius:getValue(t,e)});return handleBreakpoints(e,e.borderRadius,styleFromPropValue)}return null};borderRadius.propTypes={},borderRadius.filterProps=["borderRadius"];compose(qr,Br,$r,zr,Fr,Gr,Hr,Ur,Vr,Yr,borderRadius,Qr,Wr);var gap=e=>{if(void 0!==e.gap&&null!==e.gap){const t=createUnaryUnit(e.theme,"spacing",8,"gap"),styleFromPropValue=e=>({gap:getValue(t,e)});return handleBreakpoints(e,e.gap,styleFromPropValue)}return null};gap.propTypes={},gap.filterProps=["gap"];var columnGap=e=>{if(void 0!==e.columnGap&&null!==e.columnGap){const t=createUnaryUnit(e.theme,"spacing",8,"columnGap"),styleFromPropValue=e=>({columnGap:getValue(t,e)});return handleBreakpoints(e,e.columnGap,styleFromPropValue)}return null};columnGap.propTypes={},columnGap.filterProps=["columnGap"];var rowGap=e=>{if(void 0!==e.rowGap&&null!==e.rowGap){const t=createUnaryUnit(e.theme,"spacing",8,"rowGap"),styleFromPropValue=e=>({rowGap:getValue(t,e)});return handleBreakpoints(e,e.rowGap,styleFromPropValue)}return null};rowGap.propTypes={},rowGap.filterProps=["rowGap"];compose(gap,columnGap,rowGap,style$1({prop:"gridColumn"}),style$1({prop:"gridRow"}),style$1({prop:"gridAutoFlow"}),style$1({prop:"gridAutoColumns"}),style$1({prop:"gridAutoRows"}),style$1({prop:"gridTemplateColumns"}),style$1({prop:"gridTemplateRows"}),style$1({prop:"gridTemplateAreas"}),style$1({prop:"gridArea"}));function paletteTransform(e,t){return"grey"===t?t:e}compose(style$1({prop:"color",themeKey:"palette",transform:paletteTransform}),style$1({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:paletteTransform}),style$1({prop:"backgroundColor",themeKey:"palette",transform:paletteTransform}));function sizingTransform(e){return e<=1&&0!==e?100*e+"%":e}var Kr=style$1({prop:"width",transform:sizingTransform}),maxWidth=e=>{if(void 0!==e.maxWidth&&null!==e.maxWidth){const styleFromPropValue=t=>{const a=e.theme?.breakpoints?.values?.[t]||wr[t];return a?"px"!==e.theme?.breakpoints?.unit?{maxWidth:`${a}${e.theme.breakpoints.unit}`}:{maxWidth:a}:{maxWidth:sizingTransform(t)}};return handleBreakpoints(e,e.maxWidth,styleFromPropValue)}return null};maxWidth.filterProps=["maxWidth"];var Xr=style$1({prop:"minWidth",transform:sizingTransform}),Jr=style$1({prop:"height",transform:sizingTransform}),Zr=style$1({prop:"maxHeight",transform:sizingTransform}),ea=style$1({prop:"minHeight",transform:sizingTransform}),ta=(style$1({prop:"size",cssProperty:"width",transform:sizingTransform}),style$1({prop:"size",cssProperty:"height",transform:sizingTransform}),compose(Kr,maxWidth,Xr,Jr,Zr,ea,style$1({prop:"boxSizing"})),{border:{themeKey:"borders",transform:borderTransform},borderTop:{themeKey:"borders",transform:borderTransform},borderRight:{themeKey:"borders",transform:borderTransform},borderBottom:{themeKey:"borders",transform:borderTransform},borderLeft:{themeKey:"borders",transform:borderTransform},borderColor:{themeKey:"palette"},borderTopColor:{themeKey:"palette"},borderRightColor:{themeKey:"palette"},borderBottomColor:{themeKey:"palette"},borderLeftColor:{themeKey:"palette"},outline:{themeKey:"borders",transform:borderTransform},outlineColor:{themeKey:"palette"},borderRadius:{themeKey:"shape.borderRadius",style:borderRadius},color:{themeKey:"palette",transform:paletteTransform},bgcolor:{themeKey:"palette",cssProperty:"backgroundColor",transform:paletteTransform},backgroundColor:{themeKey:"palette",transform:paletteTransform},p:{style:padding},pt:{style:padding},pr:{style:padding},pb:{style:padding},pl:{style:padding},px:{style:padding},py:{style:padding},padding:{style:padding},paddingTop:{style:padding},paddingRight:{style:padding},paddingBottom:{style:padding},paddingLeft:{style:padding},paddingX:{style:padding},paddingY:{style:padding},paddingInline:{style:padding},paddingInlineStart:{style:padding},paddingInlineEnd:{style:padding},paddingBlock:{style:padding},paddingBlockStart:{style:padding},paddingBlockEnd:{style:padding},m:{style:margin},mt:{style:margin},mr:{style:margin},mb:{style:margin},ml:{style:margin},mx:{style:margin},my:{style:margin},margin:{style:margin},marginTop:{style:margin},marginRight:{style:margin},marginBottom:{style:margin},marginLeft:{style:margin},marginX:{style:margin},marginY:{style:margin},marginInline:{style:margin},marginInlineStart:{style:margin},marginInlineEnd:{style:margin},marginBlock:{style:margin},marginBlockStart:{style:margin},marginBlockEnd:{style:margin},displayPrint:{cssProperty:!1,transform:e=>({"@media print":{display:e}})},display:{},overflow:{},textOverflow:{},visibility:{},whiteSpace:{},flexBasis:{},flexDirection:{},flexWrap:{},justifyContent:{},alignItems:{},alignContent:{},order:{},flex:{},flexGrow:{},flexShrink:{},alignSelf:{},justifyItems:{},justifySelf:{},gap:{style:gap},rowGap:{style:rowGap},columnGap:{style:columnGap},gridColumn:{},gridRow:{},gridAutoFlow:{},gridAutoColumns:{},gridAutoRows:{},gridTemplateColumns:{},gridTemplateRows:{},gridTemplateAreas:{},gridArea:{},position:{},zIndex:{themeKey:"zIndex"},top:{},right:{},bottom:{},left:{},boxShadow:{themeKey:"shadows"},width:{transform:sizingTransform},maxWidth:{style:maxWidth},minWidth:{transform:sizingTransform},height:{transform:sizingTransform},maxHeight:{transform:sizingTransform},minHeight:{transform:sizingTransform},boxSizing:{},font:{themeKey:"font"},fontFamily:{themeKey:"typography"},fontSize:{themeKey:"typography"},fontStyle:{themeKey:"typography"},fontWeight:{themeKey:"typography"},letterSpacing:{},textTransform:{},lineHeight:{},textAlign:{},typography:{cssProperty:!1,themeKey:"typography"}}),ra={};function unstable_createStyleFunctionSx(){function styleFunctionSx(e){if(!e.sx)return null;const{sx:t,theme:a=ra,nested:n}=e,s=a.unstable_sxConfig??ta,i={sx:null,theme:a,nested:!0};function process(t){let o=t;if("function"==typeof t)o=t(a);else if("object"!=typeof t)return t;if(!o)return null;const l=a.breakpoints??_r,c=createEmptyBreakpointObject(l);for(const n in o){const t=callIfFn(o[n],a);null!=t&&("object"==typeof t?s[n]?setThemeValue(c,n,t,a,s):hasBreakpoint(l,t)?iterateBreakpoints(c,e.theme,t,(e,t)=>{c[e][n]=t}):(i.sx=t,c[n]=styleFunctionSx(i)):setThemeValue(c,n,t,a,s))}return!n&&a.modularCssLayers?{"@layer sx":sortContainerQueries(a,removeUnusedBreakpoints(l,c))}:sortContainerQueries(a,removeUnusedBreakpoints(l,c))}return Array.isArray(t)?t.map(process):process(t)}return styleFunctionSx.filterProps=["sx"],styleFunctionSx}var aa=unstable_createStyleFunctionSx();function setThemeValue(e,t,a,n,s){const i=s[t];if(!i)return void(e[t]=a);if(null==a)return;const{themeKey:o}=i;if("typography"===o&&"inherit"===a)return void(e[t]=a);const{style:l}=i;if(l)return void fastDeepAssign(e,l({[t]:a,theme:n}));const{cssProperty:c=t,transform:u}=i,d=getPath(n,o);iterateBreakpoints(e,n,a,(a,n)=>{const s=getStyleValue2(d,u,n,t);!1===c?fastDeepAssign(a?e[a]:e,s):a?e[a][c]=s:e[c]=s})}function callIfFn(e,t){return"function"==typeof e?e(t):e}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)({}).hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},_extends.apply(null,arguments)}var na=!1;function sheetForTag(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]}function createStyleElement(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}var sa=function(){function StyleSheet(e){var t=this;this._insertTag=function(e){var a;a=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,a),t.tags.push(e)},this.isSpeedy=void 0===e.speedy?!na:e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var e=StyleSheet.prototype;return e.hydrate=function hydrate(e){e.forEach(this._insertTag)},e.insert=function insert(e){this.ctr%(this.isSpeedy?65e3:1)==0&&this._insertTag(createStyleElement(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var a=sheetForTag(t);try{a.insertRule(e,a.cssRules.length)}catch(n){}}else t.appendChild(document.createTextNode(e));this.ctr++},e.flush=function flush(){this.tags.forEach(function(e){var t;return null==(t=e.parentNode)?void 0:t.removeChild(e)}),this.tags=[],this.ctr=0},StyleSheet}(),ia="-ms-",oa="-moz-",la="-webkit-",ca="comm",ua="rule",da="decl",ma="@import",pa="@keyframes",ga="@layer",fa=Math.abs,ha=String.fromCharCode,ba=Object.assign;function hash(e,t){return 45^charat(e,0)?(((t<<2^charat(e,0))<<2^charat(e,1))<<2^charat(e,2))<<2^charat(e,3):0}function trim(e){return e.trim()}function match(e,t){return(e=t.exec(e))?e[0]:e}function replace(e,t,a){return e.replace(t,a)}function indexof(e,t){return e.indexOf(t)}function charat(e,t){return 0|e.charCodeAt(t)}function substr(e,t,a){return e.slice(t,a)}function strlen(e){return e.length}function sizeof(e){return e.length}function append(e,t){return t.push(e),e}function combine(e,t){return e.map(t).join("")}var ya=1,va=1,Sa=0,xa=0,ka=0,Ca="";function node(e,t,a,n,s,i,o){return{value:e,root:t,parent:a,type:n,props:s,children:i,line:ya,column:va,length:o,return:""}}function copy(e,t){return ba(node("",null,null,"",null,null,0),e,{length:-e.length},t)}function char(){return ka}function prev(){return ka=xa>0?charat(Ca,--xa):0,va--,10===ka&&(va=1,ya--),ka}function next(){return ka=xa<Sa?charat(Ca,xa++):0,va++,10===ka&&(va=1,ya++),ka}function peek(){return charat(Ca,xa)}function caret(){return xa}function slice(e,t){return substr(Ca,e,t)}function token(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function alloc(e){return ya=va=1,Sa=strlen(Ca=e),xa=0,[]}function dealloc(e){return Ca="",e}function delimit(e){return trim(slice(xa-1,delimiter(91===e?e+2:40===e?e+1:e)))}function whitespace(e){for(;(ka=peek())&&ka<33;)next();return token(e)>2||token(ka)>3?"":" "}function escaping(e,t){for(;--t&&next()&&!(ka<48||ka>102||ka>57&&ka<65||ka>70&&ka<97););return slice(e,caret()+(t<6&&32==peek()&&32==next()))}function delimiter(e){for(;next();)switch(ka){case e:return xa;case 34:case 39:34!==e&&39!==e&&delimiter(ka);break;case 40:41===e&&delimiter(e);break;case 92:next()}return xa}function commenter(e,t){for(;next()&&e+ka!==57&&(e+ka!==84||47!==peek()););return"/*"+slice(t,xa-1)+"*"+ha(47===e?e:next())}function identifier(e){for(;!token(peek());)next();return slice(e,xa)}function compile(e){return dealloc(parse("",null,null,null,[""],e=alloc(e),0,[0],e))}function parse(e,t,a,n,s,i,o,l,c){for(var u=0,d=0,m=o,p=0,g=0,h=0,b=1,y=1,v=1,S=0,x="",k=s,C=i,A=n,E=x;y;)switch(h=S,S=next()){case 40:if(108!=h&&58==charat(E,m-1)){-1!=indexof(E+=replace(delimit(S),"&","&\f"),"&\f")&&(v=-1);break}case 34:case 39:case 91:E+=delimit(S);break;case 9:case 10:case 13:case 32:E+=whitespace(h);break;case 92:E+=escaping(caret()-1,7);continue;case 47:switch(peek()){case 42:case 47:append(comment(commenter(next(),caret()),t,a),c);break;default:E+="/"}break;case 123*b:l[u++]=strlen(E)*v;case 125*b:case 59:case 0:switch(S){case 0:case 125:y=0;case 59+d:-1==v&&(E=replace(E,/\f/g,"")),g>0&&strlen(E)-m&&append(g>32?declaration(E+";",n,a,m-1):declaration(replace(E," ","")+";",n,a,m-2),c);break;case 59:E+=";";default:if(append(A=ruleset(E,t,a,u,d,s,l,x,k=[],C=[],m),i),123===S)if(0===d)parse(E,t,A,A,k,i,m,l,C);else switch(99===p&&110===charat(E,3)?100:p){case 100:case 108:case 109:case 115:parse(e,A,A,n&&append(ruleset(e,A,A,0,0,s,l,x,s,k=[],m),C),s,C,m,l,n?k:C);break;default:parse(E,A,A,A,[""],C,0,l,C)}}u=d=g=0,b=v=1,x=E="",m=o;break;case 58:m=1+strlen(E),g=h;default:if(b<1)if(123==S)--b;else if(125==S&&0==b++&&125==prev())continue;switch(E+=ha(S),S*b){case 38:v=d>0?1:(E+="\f",-1);break;case 44:l[u++]=(strlen(E)-1)*v,v=1;break;case 64:45===peek()&&(E+=delimit(next())),p=peek(),d=m=strlen(x=E+=identifier(caret())),S++;break;case 45:45===h&&2==strlen(E)&&(b=0)}}return i}function ruleset(e,t,a,n,s,i,o,l,c,u,d){for(var m=s-1,p=0===s?i:[""],g=sizeof(p),h=0,b=0,y=0;h<n;++h)for(var v=0,S=substr(e,m+1,m=fa(b=o[h])),x=e;v<g;++v)(x=trim(b>0?p[v]+" "+S:replace(S,/&\f/g,p[v])))&&(c[y++]=x);return node(e,t,a,0===s?ua:l,c,u,d)}function comment(e,t,a){return node(e,t,a,ca,ha(char()),substr(e,2,-2),0)}function declaration(e,t,a,n){return node(e,t,a,da,substr(e,0,n),substr(e,n+1,-1),n)}function serialize(e,t){for(var a="",n=sizeof(e),s=0;s<n;s++)a+=t(e[s],s,e,t)||"";return a}function stringify(e,t,a,n){switch(e.type){case ga:if(e.children.length)break;case ma:case da:return e.return=e.return||e.value;case ca:return"";case pa:return e.return=e.value+"{"+serialize(e.children,n)+"}";case ua:e.value=e.props.join(",")}return strlen(a=serialize(e.children,n))?e.return=e.value+"{"+a+"}":""}function middleware(e){var t=sizeof(e);return function(a,n,s,i){for(var o="",l=0;l<t;l++)o+=e[l](a,n,s,i)||"";return o}}function rulesheet(e){return function(t){t.root||(t=t.return)&&e(t)}}function memoize(e){var t=Object.create(null);return function(a){return void 0===t[a]&&(t[a]=e(a)),t[a]}}var Aa=function identifierWithPointTracking(e,t,a){for(var n=0,s=0;n=s,s=peek(),38===n&&12===s&&(t[a]=1),!token(s);)next();return slice(e,xa)},Ea=function toRules(e,t){var a=-1,n=44;do{switch(token(n)){case 0:38===n&&12===peek()&&(t[a]=1),e[a]+=Aa(xa-1,t,a);break;case 2:e[a]+=delimit(n);break;case 4:if(44===n){e[++a]=58===peek()?"&\f":"",t[a]=e[a].length;break}default:e[a]+=ha(n)}}while(n=next());return e},wa=function getRules(e,t){return dealloc(Ea(alloc(e),t))},_a=new WeakMap,Ta=function compat(e){if("rule"===e.type&&e.parent&&!(e.length<1)){for(var t=e.value,a=e.parent,n=e.column===a.column&&e.line===a.line;"rule"!==a.type;)if(!(a=a.parent))return;if((1!==e.props.length||58===t.charCodeAt(0)||_a.get(a))&&!n){_a.set(e,!0);for(var s=[],i=wa(t,s),o=a.props,l=0,c=0;l<i.length;l++)for(var u=0;u<o.length;u++,c++)e.props[c]=s[l]?i[l].replace(/&\f/g,o[u]):o[u]+" "+i[l]}}},Ma=function removeLabel(e){if("decl"===e.type){var t=e.value;108===t.charCodeAt(0)&&98===t.charCodeAt(2)&&(e.return="",e.value="")}};function prefix(e,t){switch(hash(e,t)){case 5103:return la+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return la+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return la+e+oa+e+ia+e+e;case 6828:case 4268:return la+e+ia+e+e;case 6165:return la+e+ia+"flex-"+e+e;case 5187:return la+e+replace(e,/(\w+).+(:[^]+)/,la+"box-$1$2"+ia+"flex-$1$2")+e;case 5443:return la+e+ia+"flex-item-"+replace(e,/flex-|-self/,"")+e;case 4675:return la+e+ia+"flex-line-pack"+replace(e,/align-content|flex-|-self/,"")+e;case 5548:return la+e+ia+replace(e,"shrink","negative")+e;case 5292:return la+e+ia+replace(e,"basis","preferred-size")+e;case 6060:return la+"box-"+replace(e,"-grow","")+la+e+ia+replace(e,"grow","positive")+e;case 4554:return la+replace(e,/([^-])(transform)/g,"$1"+la+"$2")+e;case 6187:return replace(replace(replace(e,/(zoom-|grab)/,la+"$1"),/(image-set)/,la+"$1"),e,"")+e;case 5495:case 3959:return replace(e,/(image-set\([^]*)/,la+"$1$`$1");case 4968:return replace(replace(e,/(.+:)(flex-)?(.*)/,la+"box-pack:$3"+ia+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+la+e+e;case 4095:case 3583:case 4068:case 2532:return replace(e,/(.+)-inline(.+)/,la+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(strlen(e)-1-t>6)switch(charat(e,t+1)){case 109:if(45!==charat(e,t+4))break;case 102:return replace(e,/(.+:)(.+)-([^]+)/,"$1"+la+"$2-$3$1"+oa+(108==charat(e,t+3)?"$3":"$2-$3"))+e;case 115:return~indexof(e,"stretch")?prefix(replace(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(115!==charat(e,t+1))break;case 6444:switch(charat(e,strlen(e)-3-(~indexof(e,"!important")&&10))){case 107:return replace(e,":",":"+la)+e;case 101:return replace(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+la+(45===charat(e,14)?"inline-":"")+"box$3$1"+la+"$2$3$1"+ia+"$2box$3")+e}break;case 5936:switch(charat(e,t+11)){case 114:return la+e+ia+replace(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return la+e+ia+replace(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return la+e+ia+replace(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return la+e+ia+e+e}return e}var Pa=[function prefixer(e,t,a,n){if(e.length>-1&&!e.return)switch(e.type){case da:e.return=prefix(e.value,e.length);break;case pa:return serialize([copy(e,{value:replace(e.value,"@","@"+la)})],n);case ua:if(e.length)return combine(e.props,function(t){switch(match(t,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return serialize([copy(e,{props:[replace(t,/:(read-\w+)/,":"+oa+"$1")]})],n);case"::placeholder":return serialize([copy(e,{props:[replace(t,/:(plac\w+)/,":"+la+"input-$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,":"+oa+"$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,ia+"input-$1")]})],n)}return""})}}],Oa=function createCache(e){var t=e.key;if("css"===t){var a=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(a,function(e){-1!==e.getAttribute("data-emotion").indexOf(" ")&&(document.head.appendChild(e),e.setAttribute("data-s",""))})}var n,s,i=e.stylisPlugins||Pa,o={},l=[];n=e.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+t+' "]'),function(e){for(var t=e.getAttribute("data-emotion").split(" "),a=1;a<t.length;a++)o[t[a]]=!0;l.push(e)});var c,u=[Ta,Ma],d=[stringify,rulesheet(function(e){c.insert(e)})],m=middleware(u.concat(i,d)),p=function stylis(e){return serialize(compile(e),m)};s=function insert(e,t,a,n){c=a,p(e?e+"{"+t.styles+"}":t.styles),n&&(g.inserted[t.name]=!0)};var g={key:t,sheet:new sa({key:t,container:n,nonce:e.nonce,speedy:e.speedy,prepend:e.prepend,insertionPoint:e.insertionPoint}),nonce:e.nonce,inserted:o,registered:{},insert:s};return g.sheet.hydrate(l),g},Da=!0;function getRegisteredStyles(e,t,a){var n="";return a.split(" ").forEach(function(a){void 0!==e[a]?t.push(e[a]+";"):a&&(n+=a+" ")}),n}var Ra=function registerStyles(e,t,a){var n=e.key+"-"+t.name;!1!==a&&!1!==Da||void 0!==e.registered[n]||(e.registered[n]=t.styles)},Na=function insertStyles(e,t,a){Ra(e,t,a);var n=e.key+"-"+t.name;if(void 0===e.inserted[t.name]){var s=t;do{e.insert(t===s?"."+n:"",s,e.sheet,!0),s=s.next}while(void 0!==s)}};function murmur2(e){for(var t,a=0,n=0,s=e.length;s>=4;++n,s-=4)t=1540483477*(65535&(t=255&e.charCodeAt(n)|(255&e.charCodeAt(++n))<<8|(255&e.charCodeAt(++n))<<16|(255&e.charCodeAt(++n))<<24))+(59797*(t>>>16)<<16),a=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&a)+(59797*(a>>>16)<<16);switch(s){case 3:a^=(255&e.charCodeAt(n+2))<<16;case 2:a^=(255&e.charCodeAt(n+1))<<8;case 1:a=1540483477*(65535&(a^=255&e.charCodeAt(n)))+(59797*(a>>>16)<<16)}return(((a=1540483477*(65535&(a^=a>>>13))+(59797*(a>>>16)<<16))^a>>>15)>>>0).toString(36)}var ja={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,scale:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Ia=!1,La=/[A-Z]|^ms/g,qa=/_EMO_([^_]+?)_([^]*?)_EMO_/g,Ba=function isCustomProperty(e){return 45===e.charCodeAt(1)},$a=function isProcessableValue(e){return null!=e&&"boolean"!=typeof e},za=memoize(function(e){return Ba(e)?e:e.replace(La,"-$&").toLowerCase()}),Fa=function processStyleValue(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(qa,function(e,t,a){return Ha={name:t,styles:a,next:Ha},t})}return 1===ja[e]||Ba(e)||"number"!=typeof t||0===t?t:t+"px"},Ga="Component selectors can only be used in conjunction with @emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware compiler transform.";function handleInterpolation(e,t,a){if(null==a)return"";var n=a;if(void 0!==n.__emotion_styles)return n;switch(typeof a){case"boolean":return"";case"object":var s=a;if(1===s.anim)return Ha={name:s.name,styles:s.styles,next:Ha},s.name;var i=a;if(void 0!==i.styles){var o=i.next;if(void 0!==o)for(;void 0!==o;)Ha={name:o.name,styles:o.styles,next:Ha},o=o.next;return i.styles+";"}return createStringFromObject(e,t,a);case"function":if(void 0!==e){var l=Ha,c=a(e);return Ha=l,handleInterpolation(e,t,c)}}var u=a;if(null==t)return u;var d=t[u];return void 0!==d?d:u}function createStringFromObject(e,t,a){var n="";if(Array.isArray(a))for(var s=0;s<a.length;s++)n+=handleInterpolation(e,t,a[s])+";";else for(var i in a){var o=a[i];if("object"!=typeof o){var l=o;null!=t&&void 0!==t[l]?n+=i+"{"+t[l]+"}":$a(l)&&(n+=za(i)+":"+Fa(i,l)+";")}else{if("NO_COMPONENT_SELECTOR"===i&&Ia)throw new Error(Ga);if(!Array.isArray(o)||"string"!=typeof o[0]||null!=t&&void 0!==t[o[0]]){var c=handleInterpolation(e,t,o);switch(i){case"animation":case"animationName":n+=za(i)+":"+c+";";break;default:n+=i+"{"+c+"}"}}else for(var u=0;u<o.length;u++)$a(o[u])&&(n+=za(i)+":"+Fa(i,o[u])+";")}}return n}var Ha,Ua=/label:\s*([^\s;{]+)\s*(;|$)/g;function serializeStyles(e,t,a){if(1===e.length&&"object"==typeof e[0]&&null!==e[0]&&void 0!==e[0].styles)return e[0];var n=!0,s="";Ha=void 0;var i=e[0];null==i||void 0===i.raw?(n=!1,s+=handleInterpolation(a,t,i)):s+=i[0];for(var o=1;o<e.length;o++)s+=handleInterpolation(a,t,e[o]),n&&(s+=i[o]);Ua.lastIndex=0;for(var l,c="";null!==(l=Ua.exec(s));)c+="-"+l[1];return{name:murmur2(s)+c,styles:s,next:Ha}}var Va=function syncFallback(e){return e()},Ya=!!a.useInsertionEffect&&a.useInsertionEffect,Qa=Ya||Va,Wa=(Ya||a.useLayoutEffect,a.createContext("undefined"!=typeof HTMLElement?Oa({key:"css"}):null)),Ka=(Wa.Provider,function withEmotionCache(e){return(0,a.forwardRef)(function(t,n){return e(t,(0,a.useContext)(Wa),n)})}),Xa=a.createContext({}),Ja=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,Za=!1,en=memoize(function(e){return Ja.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91}),tn=function testOmitPropsOnComponent(e){return"theme"!==e},rn=function getDefaultShouldForwardProp(e){return"string"==typeof e&&e.charCodeAt(0)>96?en:tn},an=function composeShouldForwardProps(e,t,a){var n;if(t){var s=t.shouldForwardProp;n=e.__emotion_forwardProp&&s?function(t){return e.__emotion_forwardProp(t)&&s(t)}:s}return"function"!=typeof n&&a&&(n=e.__emotion_forwardProp),n},nn=function Insertion(e){var t=e.cache,a=e.serialized,n=e.isStringTag;return Ra(t,a,n),Qa(function(){return Na(t,a,n)}),null},sn=function createStyled(e,t){var n,s,i=e.__emotion_real===e,o=i&&e.__emotion_base||e;void 0!==t&&(n=t.label,s=t.target);var l=an(e,t,i),c=l||rn(o),u=!c("as");return function(){var d=arguments,m=i&&void 0!==e.__emotion_styles?e.__emotion_styles.slice(0):[];if(void 0!==n&&m.push("label:"+n+";"),null==d[0]||void 0===d[0].raw)m.push.apply(m,d);else{var p=d[0];m.push(p[0]);for(var g=d.length,h=1;h<g;h++)m.push(d[h],p[h])}var b=Ka(function(e,t,n){var i=u&&e.as||o,d="",p=[],g=e;if(null==e.theme){for(var h in g={},e)g[h]=e[h];g.theme=a.useContext(Xa)}"string"==typeof e.className?d=getRegisteredStyles(t.registered,p,e.className):null!=e.className&&(d=e.className+" ");var b=serializeStyles(m.concat(p),t.registered,g);d+=t.key+"-"+b.name,void 0!==s&&(d+=" "+s);var y=u&&void 0===l?rn(i):c,v={};for(var S in e)u&&"as"===S||y(S)&&(v[S]=e[S]);return v.className=d,n&&(v.ref=n),a.createElement(a.Fragment,null,a.createElement(nn,{cache:t,serialized:b,isStringTag:"string"==typeof i}),a.createElement(i,v))});return b.displayName=void 0!==n?n:"Styled("+("string"==typeof o?o:o.displayName||o.name||"Component")+")",b.defaultProps=e.defaultProps,b.__emotion_real=b,b.__emotion_base=o,b.__emotion_styles=m,b.__emotion_forwardProp=l,Object.defineProperty(b,"toString",{value:function value(){return void 0===s&&Za?"NO_COMPONENT_SELECTOR":"."+s}}),b.withComponent=function(e,a){return createStyled(e,_extends({},t,a,{shouldForwardProp:an(b,a,!0)})).apply(void 0,m)},b}},ln=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"],cn=sn.bind(null);function styled$1(e,t){return cn(e,t)}function internal_mutateStyles(e,t){Array.isArray(e.__emotion_styles)&&(e.__emotion_styles=t(e.__emotion_styles))}ln.forEach(function(e){cn[e]=cn(e)});var un=[];function internal_serializeStyles(e){return un[0]=e,serializeStyles(un)}var dn={borderRadius:4};function createSpacing(e=8,t=createUnarySpacing({spacing:e})){if(e.mui)return e;const spacing=(...e)=>(0===e.length?[1]:e).map(e=>{const a=t(e);return"number"==typeof a?`${a}px`:a}).join(" ");return spacing.mui=!0,spacing}function applyStyles(e,t){const a=this;if(a.vars){if(!a.colorSchemes?.[e]||"function"!=typeof a.getColorSchemeSelector)return{};let n=a.getColorSchemeSelector(e);return"&"===n?t:((n.includes("data-")||n.includes("."))&&(n=`*:where(${n.replace(/\s*&$/,"")}) &`),{[n]:t})}return a.palette.mode===e?t:{}}function createTheme$1(e={},...t){const{breakpoints:a={},palette:n={},spacing:s,shape:i={},...o}=e;let l=deepmerge({breakpoints:createBreakpoints(a),direction:"ltr",components:{},palette:{mode:"light",...n},spacing:createSpacing(s),shape:{...dn,...i}},o);return l=cssContainerQueries(l),l.applyStyles=applyStyles,l=t.reduce((e,t)=>deepmerge(e,t),l),l.unstable_sxConfig={...ta,...o?.unstable_sxConfig},l.unstable_sx=function sx(e){return aa({sx:e,theme:this})},l.internal_cache={},l}var defaultGenerator=e=>e,mn=(()=>{let e=defaultGenerator;return{configure(t){e=t},generate:t=>e(t),reset(){e=defaultGenerator}}})(),pn={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",open:"open",readOnly:"readOnly",required:"required",selected:"selected"};function generateUtilityClass(e,t,a="Mui"){const n=pn[t];return n?`${a}-${n}`:`${mn.generate(e)}-${t}`}function generateUtilityClasses(e,t,a="Mui"){const n={};return t.forEach(t=>{n[t]=generateUtilityClass(e,t,a)}),n}function preprocessStyles(e){const{variants:t,...a}=e,n={variants:t,style:internal_serializeStyles(a),isProcessed:!0};return n.style===a||t&&t.forEach(e=>{"function"!=typeof e.style&&(e.style=internal_serializeStyles(e.style))}),n}var gn=createTheme$1();function shouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}function shallowLayer(e,t){return t&&e&&"object"==typeof e&&e.styles&&!e.styles.startsWith("@layer")&&(e.styles=`@layer ${t}{${String(e.styles)}}`),e}function defaultOverridesResolver(e){return e?(t,a)=>a[e]:null}function attachTheme(e,t,a){e.theme=isObjectEmpty(e.theme)?a:e.theme[t]||e.theme}function processStyle(e,t,a){const n="function"==typeof t?t(e):t;if(Array.isArray(n))return n.flatMap(t=>processStyle(e,t,a));if(Array.isArray(n?.variants)){let t;if(n.isProcessed)t=a?shallowLayer(n.style,a):n.style;else{const{variants:e,...s}=n;t=a?shallowLayer(internal_serializeStyles(s),a):s}return processStyleVariants(e,n.variants,[t],a)}return n?.isProcessed?a?shallowLayer(internal_serializeStyles(n.style),a):n.style:a?shallowLayer(internal_serializeStyles(n),a):n}function processStyleVariants(e,t,a=[],n=void 0){let s;e:for(let i=0;i<t.length;i+=1){const o=t[i];if("function"==typeof o.props){if(s??={...e,...e.ownerState,ownerState:e.ownerState},!o.props(s))continue}else for(const t in o.props)if(e[t]!==o.props[t]&&e.ownerState?.[t]!==o.props[t])continue e;"function"==typeof o.style?(s??={...e,...e.ownerState,ownerState:e.ownerState},a.push(n?shallowLayer(internal_serializeStyles(o.style(s)),n):o.style(s))):a.push(n?shallowLayer(internal_serializeStyles(o.style),n):o.style)}return a}function createStyled(e={}){const{themeId:t,defaultTheme:a=gn,rootShouldForwardProp:n=shouldForwardProp,slotShouldForwardProp:s=shouldForwardProp}=e;function styleAttachTheme(e){attachTheme(e,t,a)}const styled=(e,t={})=>{internal_mutateStyles(e,e=>e.filter(e=>e!==aa));const{name:a,slot:i,skipVariantsResolver:o,skipSx:l,overridesResolver:c=defaultOverridesResolver(lowercaseFirstLetter(i)),...u}=t,d=a&&a.startsWith("Mui")||i?"components":"custom",m=void 0!==o?o:i&&"Root"!==i&&"root"!==i||!1,p=l||!1;let g=shouldForwardProp;"Root"===i||"root"===i?g=n:i?g=s:isStringTag(e)&&(g=void 0);const h=styled$1(e,{shouldForwardProp:g,label:generateStyledLabel(a,i),...u}),transformStyle=e=>{if(e.__emotion_real===e)return e;if("function"==typeof e)return function styleFunctionProcessor(t){return processStyle(t,e,t.theme.modularCssLayers?d:void 0)};if(isPlainObject(e)){const t=preprocessStyles(e);return function styleObjectProcessor(e){return t.variants?processStyle(e,t,e.theme.modularCssLayers?d:void 0):e.theme.modularCssLayers?shallowLayer(t.style,d):t.style}}return e},muiStyledResolver=(...t)=>{const n=[],s=t.map(transformStyle),i=[];if(n.push(styleAttachTheme),a&&c&&i.push(function styleThemeOverrides(e){const t=e.theme.components?.[a]?.styleOverrides;if(!t)return null;const n={};for(const a in t)n[a]=processStyle(e,t[a],e.theme.modularCssLayers?"theme":void 0);return c(e,n)}),a&&!m&&i.push(function styleThemeVariants(e){const t=e.theme?.components?.[a]?.variants;return t?processStyleVariants(e,t,[],e.theme.modularCssLayers?"theme":void 0):null}),p||i.push(aa),Array.isArray(s[0])){const e=s.shift(),t=new Array(n.length).fill(""),a=new Array(i.length).fill("");let o;o=[...t,...e,...a],o.raw=[...t,...e.raw,...a],n.unshift(o)}const o=h(...n,...s,...i);return e.muiName&&(o.muiName=e.muiName),o};return h.withConfig&&(muiStyledResolver.withConfig=h.withConfig),muiStyledResolver};return styled}function generateStyledLabel(e,t){let a;return a}function isStringTag(e){return"string"==typeof e&&e.charCodeAt(0)>96}function lowercaseFirstLetter(e){return e?e.charAt(0).toLowerCase()+e.slice(1):e}function resolveProps(e,t,a=!1){const n={...t};for(const s in e)if(Object.prototype.hasOwnProperty.call(e,s)){const i=s;if("components"===i||"slots"===i)n[i]={...e[i],...n[i]};else if("componentsProps"===i||"slotProps"===i){const s=e[i],o=t[i];if(o)if(s){n[i]={...o};for(const e in s)if(Object.prototype.hasOwnProperty.call(s,e)){const t=e;n[i][t]=resolveProps(s[t],o[t],a)}}else n[i]=o;else n[i]=s||{}}else"className"===i&&a&&void 0!==t.className?n.className=clsx(e?.className,t?.className):"style"===i&&a&&t.style?n.style={...e?.style,...t?.style}:void 0===n[i]&&(n[i]=e[i])}return n}function clamp(e,t=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER){return Math.max(t,Math.min(e,a))}function clampWrapper(e,t=0,a=1){return clamp(e,t,a)}function hexToRgb(e){e=e.slice(1);const t=new RegExp(`.{1,${e.length>=6?2:1}}`,"g");let a=e.match(t);return a&&1===a[0].length&&(a=a.map(e=>e+e)),a?`rgb${4===a.length?"a":""}(${a.map((e,t)=>t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3).join(", ")})`:""}function decomposeColor(e){if(e.type)return e;if("#"===e.charAt(0))return decomposeColor(hexToRgb(e));const t=e.indexOf("("),a=e.substring(0,t);if(!["rgb","rgba","hsl","hsla","color"].includes(a))throw new Error(formatMuiErrorMessage(9,e));let n,s=e.substring(t+1,e.length-1);if("color"===a){if(s=s.split(" "),n=s.shift(),4===s.length&&"/"===s[3].charAt(0)&&(s[3]=s[3].slice(1)),!["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].includes(n))throw new Error(formatMuiErrorMessage(10,n))}else s=s.split(",");return s=s.map(e=>parseFloat(e)),{type:a,values:s,colorSpace:n}}var colorChannel=e=>{const t=decomposeColor(e);return t.values.slice(0,3).map((e,a)=>t.type.includes("hsl")&&0!==a?`${e}%`:e).join(" ")},private_safeColorChannel=(e,t)=>{try{return colorChannel(e)}catch(a){return e}};function recomposeColor(e){const{type:t,colorSpace:a}=e;let{values:n}=e;return t.includes("rgb")?n=n.map((e,t)=>t<3?parseInt(e,10):e):t.includes("hsl")&&(n[1]=`${n[1]}%`,n[2]=`${n[2]}%`),n=t.includes("color")?`${a} ${n.join(" ")}`:`${n.join(", ")}`,`${t}(${n})`}function hslToRgb(e){e=decomposeColor(e);const{values:t}=e,a=t[0],n=t[1]/100,s=t[2]/100,i=n*Math.min(s,1-s),f=(e,t=(e+a/30)%12)=>s-i*Math.max(Math.min(t-3,9-t,1),-1);let o="rgb";const l=[Math.round(255*f(0)),Math.round(255*f(8)),Math.round(255*f(4))];return"hsla"===e.type&&(o+="a",l.push(t[3])),recomposeColor({type:o,values:l})}function getLuminance(e){let t="hsl"===(e=decomposeColor(e)).type||"hsla"===e.type?decomposeColor(hslToRgb(e)).values:e.values;return t=t.map(t=>("color"!==e.type&&(t/=255),t<=.03928?t/12.92:((t+.055)/1.055)**2.4)),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function getContrastRatio(e,t){const a=getLuminance(e),n=getLuminance(t);return(Math.max(a,n)+.05)/(Math.min(a,n)+.05)}function alpha(e,t){return e=decomposeColor(e),t=clampWrapper(t),"rgb"!==e.type&&"hsl"!==e.type||(e.type+="a"),"color"===e.type?e.values[3]=`/${t}`:e.values[3]=t,recomposeColor(e)}function private_safeAlpha(e,t,a){try{return alpha(e,t)}catch(n){return e}}function darken(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]*=1-t;else if(e.type.includes("rgb")||e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]*=1-t;return recomposeColor(e)}function private_safeDarken(e,t,a){try{return darken(e,t)}catch(n){return e}}function lighten(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]+=(100-e.values[2])*t;else if(e.type.includes("rgb"))for(let a=0;a<3;a+=1)e.values[a]+=(255-e.values[a])*t;else if(e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]+=(1-e.values[a])*t;return recomposeColor(e)}function private_safeLighten(e,t,a){try{return lighten(e,t)}catch(n){return e}}function emphasize(e,t=.15){return getLuminance(e)>.5?darken(e,t):lighten(e,t)}function private_safeEmphasize(e,t,a){try{return emphasize(e,t)}catch(n){return e}}var hn=b.createContext(void 0);function getThemeProps(e){const{theme:t,name:a,props:n}=e;if(!t||!t.components||!t.components[a])return n;const s=t.components[a];return s.defaultProps?resolveProps(s.defaultProps,n,t.components.mergeClassNameAndStyle):s.styleOverrides||s.variants?n:resolveProps(s,n,t.components.mergeClassNameAndStyle)}function useDefaultProps$1({props:e,name:t}){return getThemeProps({props:e,name:t,theme:{components:b.useContext(hn)}})}var bn={theme:void 0};function unstable_memoTheme(e){let t,a;return function styleMemoized(n){let s=t;return void 0!==s&&n.theme===a||(bn.theme=n.theme,s=preprocessStyles(e(bn)),t=s,a=n.theme),s}}function createGetCssVar$1(e=""){function appendVar(...t){if(!t.length)return"";const a=t[0];return"string"!=typeof a||a.match(/(#|\(|\)|(-?(\d*\.)?\d+)(px|em|%|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc))|^(-?(\d*\.)?\d+)$|(\d+ \d+ \d+)/)?`, ${a}`:`, var(--${e?`${e}-`:""}${a}${appendVar(...t.slice(1))})`}return(t,...a)=>`var(--${e?`${e}-`:""}${t}${appendVar(...a)})`}var assignNestedKeys=(e,t,a,n=[])=>{let s=e;t.forEach((e,i)=>{i===t.length-1?Array.isArray(s)?s[Number(e)]=a:s&&"object"==typeof s&&(s[e]=a):s&&"object"==typeof s&&(s[e]||(s[e]=n.includes(e)?[]:{}),s=s[e])})},walkObjectDeep=(e,t,a)=>{function recurse(e,n=[],s=[]){Object.entries(e).forEach(([e,i])=>{(!a||a&&!a([...n,e]))&&null!=i&&("object"==typeof i&&Object.keys(i).length>0?recurse(i,[...n,e],Array.isArray(i)?[...s,e]:s):t([...n,e],i,s))})}recurse(e)},getCssValue=(e,t)=>"number"==typeof t?["lineHeight","fontWeight","opacity","zIndex"].some(t=>e.includes(t))||e[e.length-1].toLowerCase().includes("opacity")?t:`${t}px`:t;function cssVarsParser(e,t){const{prefix:a,shouldSkipGeneratingVar:n}=t||{},s={},i={},o={};return walkObjectDeep(e,(e,t,l)=>{if(!("string"!=typeof t&&"number"!=typeof t||n&&n(e,t))){const n=`--${a?`${a}-`:""}${e.join("-")}`,c=getCssValue(e,t);Object.assign(s,{[n]:c}),assignNestedKeys(i,e,`var(${n})`,l),assignNestedKeys(o,e,`var(${n}, ${c})`,l)}},e=>"vars"===e[0]),{css:s,vars:i,varsWithDefaults:o}}function prepareCssVars(e,t={}){const{getSelector:a=defaultGetSelector,disableCssColorScheme:n,colorSchemeSelector:s,enableContrastVars:i}=t,{colorSchemes:o={},components:l,defaultColorScheme:c="light",...u}=e,{vars:d,css:m,varsWithDefaults:p}=cssVarsParser(u,t);let g=p;const h={},{[c]:b,...y}=o;if(Object.entries(y||{}).forEach(([e,a])=>{const{vars:n,css:s,varsWithDefaults:i}=cssVarsParser(a,t);g=deepmerge(g,i),h[e]={css:s,vars:n}}),b){const{css:e,vars:a,varsWithDefaults:n}=cssVarsParser(b,t);g=deepmerge(g,n),h[c]={css:e,vars:a}}function defaultGetSelector(t,a){let n=s;if("class"===s&&(n=".%s"),"data"===s&&(n="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(n=`[${s}="%s"]`),t){if("media"===n)return e.defaultColorScheme===t?":root":{[`@media (prefers-color-scheme: ${o[t]?.palette?.mode||t})`]:{":root":a}};if(n)return e.defaultColorScheme===t?`:root, ${n.replace("%s",String(t))}`:n.replace("%s",String(t))}return":root"}return{vars:g,generateThemeVars:()=>{let e={...d};return Object.entries(h).forEach(([,{vars:t}])=>{e=deepmerge(e,t)}),e},generateStyleSheets:()=>{const t=[],s=e.defaultColorScheme||"light";function insertStyleSheet(e,a){Object.keys(a).length&&t.push("string"==typeof e?{[e]:{...a}}:e)}insertStyleSheet(a(void 0,{...m}),m);const{[s]:l,...c}=h;if(l){const{css:e}=l,t=o[s]?.palette?.mode,i=!n&&t?{colorScheme:t,...e}:{...e};insertStyleSheet(a(s,{...i}),i)}return Object.entries(c).forEach(([e,{css:t}])=>{const s=o[e]?.palette?.mode,i=!n&&s?{colorScheme:s,...t}:{...t};insertStyleSheet(a(e,{...i}),i)}),i&&t.push({":root":{"--__l-threshold":"0.7","--__l":"clamp(0, (l / var(--__l-threshold) - 1) * -infinity, 1)","--__a":"clamp(0.87, (l / var(--__l-threshold) - 1) * -infinity, 1)"}}),t}}}function createGetColorSchemeSelector(e){return function getColorSchemeSelector(t){return"media"===e?`@media (prefers-color-scheme: ${t})`:e?e.startsWith("data-")&&!e.includes("%s")?`[${e}="${t}"] &`:"class"===e?`.${t} &`:"data"===e?`[data-${t}] &`:`${e.replace("%s",t)} &`:"&"}}var yn={black:"#000",white:"#fff"},vn={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},Sn={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},xn={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},kn={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},Cn={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},An={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},En={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"};function getLight(){return{text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:yn.white,default:yn.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}}}var wn=getLight();function getDark(){return{text:{primary:yn.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:yn.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}}}var _n=getDark();function addLightOrDark(e,t,a,n){const s=n.light||n,i=n.dark||1.5*n;e[t]||(e.hasOwnProperty(a)?e[t]=e[a]:"light"===t?e.light=lighten(e.main,s):"dark"===t&&(e.dark=darken(e.main,i)))}function mixLightOrDark(e,t,a,n,s){const i=s.light||s,o=s.dark||1.5*s;t[a]||(t.hasOwnProperty(n)?t[a]=t[n]:"light"===a?t.light=`color-mix(in ${e}, ${t.main}, #fff ${(100*i).toFixed(0)}%)`:"dark"===a&&(t.dark=`color-mix(in ${e}, ${t.main}, #000 ${(100*o).toFixed(0)}%)`))}function getDefaultPrimary(e="light"){return"dark"===e?{main:Cn[200],light:Cn[50],dark:Cn[400]}:{main:Cn[700],light:Cn[400],dark:Cn[800]}}function getDefaultSecondary(e="light"){return"dark"===e?{main:Sn[200],light:Sn[50],dark:Sn[400]}:{main:Sn[500],light:Sn[300],dark:Sn[700]}}function getDefaultError(e="light"){return"dark"===e?{main:xn[500],light:xn[300],dark:xn[700]}:{main:xn[700],light:xn[400],dark:xn[800]}}function getDefaultInfo(e="light"){return"dark"===e?{main:An[400],light:An[300],dark:An[700]}:{main:An[700],light:An[500],dark:An[900]}}function getDefaultSuccess(e="light"){return"dark"===e?{main:En[400],light:En[300],dark:En[700]}:{main:En[800],light:En[500],dark:En[900]}}function getDefaultWarning(e="light"){return"dark"===e?{main:kn[400],light:kn[300],dark:kn[700]}:{main:"#ed6c02",light:kn[500],dark:kn[900]}}function contrastColor(e){return`oklch(from ${e} var(--__l) 0 h / var(--__a))`}function createPalette(e){const{mode:t="light",contrastThreshold:a=3,tonalOffset:n=.2,colorSpace:s,...i}=e,o=e.primary||getDefaultPrimary(t),l=e.secondary||getDefaultSecondary(t),c=e.error||getDefaultError(t),u=e.info||getDefaultInfo(t),d=e.success||getDefaultSuccess(t),m=e.warning||getDefaultWarning(t);function getContrastText(e){return s?contrastColor(e):getContrastRatio(e,_n.text.primary)>=a?_n.text.primary:wn.text.primary}const augmentColor=({color:e,name:t,mainShade:a=500,lightShade:i=300,darkShade:o=700})=>{if(!(e={...e}).main&&e[a]&&(e.main=e[a]),!e.hasOwnProperty("main"))throw new Error(formatMuiErrorMessage(11,t?` (${t})`:"",a));if("string"!=typeof e.main)throw new Error(formatMuiErrorMessage(12,t?` (${t})`:"",JSON.stringify(e.main)));return s?(mixLightOrDark(s,e,"light",i,n),mixLightOrDark(s,e,"dark",o,n)):(addLightOrDark(e,"light",i,n),addLightOrDark(e,"dark",o,n)),e.contrastText||(e.contrastText=getContrastText(e.main)),e};let p;return"light"===t?p=getLight():"dark"===t&&(p=getDark()),deepmerge({common:{...yn},mode:t,primary:augmentColor({color:o,name:"primary"}),secondary:augmentColor({color:l,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:augmentColor({color:c,name:"error"}),warning:augmentColor({color:m,name:"warning"}),info:augmentColor({color:u,name:"info"}),success:augmentColor({color:d,name:"success"}),grey:vn,contrastThreshold:a,getContrastText,augmentColor,tonalOffset:n,...p},i)}function prepareTypographyVars(e){const t={};return Object.entries(e).forEach(e=>{const[a,n]=e;"object"==typeof n&&(t[a]=`${n.fontStyle?`${n.fontStyle} `:""}${n.fontVariant?`${n.fontVariant} `:""}${n.fontWeight?`${n.fontWeight} `:""}${n.fontStretch?`${n.fontStretch} `:""}${n.fontSize||""}${n.lineHeight?`/${n.lineHeight} `:""}${n.fontFamily||""}`)}),t}function createMixins(e,t){return{toolbar:{minHeight:56,[e.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[e.up("sm")]:{minHeight:64}},...t}}function round(e){return Math.round(1e5*e)/1e5}var Tn={textTransform:"uppercase"},Mn='"Roboto", "Helvetica", "Arial", sans-serif';function createTypography(e,t){const{fontFamily:a=Mn,fontSize:n=14,fontWeightLight:s=300,fontWeightRegular:i=400,fontWeightMedium:o=500,fontWeightBold:l=700,htmlFontSize:c=16,allVariants:u,pxToRem:d,...m}="function"==typeof t?t(e):t,p=n/14,g=d||(e=>e/c*p+"rem"),buildVariant=(e,t,n,s,i)=>({fontFamily:a,fontWeight:e,fontSize:g(t),lineHeight:n,...a===Mn?{letterSpacing:`${round(s/t)}em`}:{},...i,...u});return deepmerge({htmlFontSize:c,pxToRem:g,fontFamily:a,fontSize:n,fontWeightLight:s,fontWeightRegular:i,fontWeightMedium:o,fontWeightBold:l,h1:buildVariant(s,96,1.167,-1.5),h2:buildVariant(s,60,1.2,-.5),h3:buildVariant(i,48,1.167,0),h4:buildVariant(i,34,1.235,.25),h5:buildVariant(i,24,1.334,0),h6:buildVariant(o,20,1.6,.15),subtitle1:buildVariant(i,16,1.75,.15),subtitle2:buildVariant(o,14,1.57,.1),body1:buildVariant(i,16,1.5,.15),body2:buildVariant(i,14,1.43,.15),button:buildVariant(o,14,1.75,.4,Tn),caption:buildVariant(i,12,1.66,.4),overline:buildVariant(i,12,2.66,1,Tn),inherit:{fontFamily:"inherit",fontWeight:"inherit",fontSize:"inherit",lineHeight:"inherit",letterSpacing:"inherit"}},m,{clone:!1})}var Pn=.2,On=.14,Dn=.12;function createShadow(...e){return[`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,${Pn})`,`${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,${On})`,`${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,${Dn})`].join(",")}var Rn=["none",createShadow(0,2,1,-1,0,1,1,0,0,1,3,0),createShadow(0,3,1,-2,0,2,2,0,0,1,5,0),createShadow(0,3,3,-2,0,3,4,0,0,1,8,0),createShadow(0,2,4,-1,0,4,5,0,0,1,10,0),createShadow(0,3,5,-1,0,5,8,0,0,1,14,0),createShadow(0,3,5,-1,0,6,10,0,0,1,18,0),createShadow(0,4,5,-2,0,7,10,1,0,2,16,1),createShadow(0,5,5,-3,0,8,10,1,0,3,14,2),createShadow(0,5,6,-3,0,9,12,1,0,3,16,2),createShadow(0,6,6,-3,0,10,14,1,0,4,18,3),createShadow(0,6,7,-4,0,11,15,1,0,4,20,3),createShadow(0,7,8,-4,0,12,17,2,0,5,22,4),createShadow(0,7,8,-4,0,13,19,2,0,5,24,4),createShadow(0,7,9,-4,0,14,21,2,0,5,26,4),createShadow(0,8,9,-5,0,15,22,2,0,6,28,5),createShadow(0,8,10,-5,0,16,24,2,0,6,30,5),createShadow(0,8,11,-5,0,17,26,2,0,6,32,5),createShadow(0,9,11,-5,0,18,28,2,0,7,34,6),createShadow(0,9,12,-6,0,19,29,2,0,7,36,6),createShadow(0,10,13,-6,0,20,31,3,0,8,38,7),createShadow(0,10,13,-6,0,21,33,3,0,8,40,7),createShadow(0,10,14,-6,0,22,35,3,0,8,42,7),createShadow(0,11,14,-7,0,23,36,3,0,9,44,8),createShadow(0,11,15,-7,0,24,38,3,0,9,46,8)],Nn={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},jn={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function formatMs(e){return`${Math.round(e)}ms`}function getAutoHeightDuration(e){if(!e)return 0;const t=e/36;return Math.min(Math.round(10*(4+15*t**.25+t/5)),3e3)}function createTransitions(e){const t={...Nn,...e.easing},a={...jn,...e.duration};return{getAutoHeightDuration,create:(e=["all"],n={})=>{const{duration:s=a.standard,easing:i=t.easeInOut,delay:o=0,...l}=n;return(Array.isArray(e)?e:[e]).map(e=>`${e} ${"string"==typeof s?s:formatMs(s)} ${i} ${"string"==typeof o?o:formatMs(o)}`).join(",")},...e,easing:t,duration:a}}var In={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500};function isSerializable(e){return isPlainObject(e)||void 0===e||"string"==typeof e||"boolean"==typeof e||"number"==typeof e||Array.isArray(e)}function stringifyTheme(e={}){const t={...e};function serializeTheme(e){const t=Object.entries(e);for(let a=0;a<t.length;a++){const[n,s]=t[a];!isSerializable(s)||n.startsWith("unstable_")||n.startsWith("internal_")?delete e[n]:isPlainObject(s)&&(e[n]={...s},serializeTheme(e[n]))}}return serializeTheme(t),`import { unstable_createBreakpoints as createBreakpoints, createTransitions } from '@mui/material/styles';\n\nconst theme = ${JSON.stringify(t,null,2)};\n\ntheme.breakpoints = createBreakpoints(theme.breakpoints || {});\ntheme.transitions = createTransitions(theme.transitions || {});\n\nexport default theme;`}function coefficientToPercentage(e){return"number"==typeof e?`${(100*e).toFixed(0)}%`:`calc((${e}) * 100%)`}var parseAddition=e=>{if(!Number.isNaN(+e))return+e;const t=e.match(/\d*\.?\d+/g);if(!t)return 0;let a=0;for(let n=0;n<t.length;n+=1)a+=+t[n];return a};function attachColorManipulators(e){Object.assign(e,{alpha(t,a){const n=this||e;return n.colorSpace?`oklch(from ${t} l c h / ${"string"==typeof a?`calc(${a})`:a})`:n.vars?`rgba(${t.replace(/var\(--([^,\s)]+)(?:,[^)]+)?\)+/g,"var(--$1Channel)")} / ${"string"==typeof a?`calc(${a})`:a})`:alpha(t,parseAddition(a))},lighten(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #fff ${coefficientToPercentage(a)})`:lighten(t,a)},darken(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #000 ${coefficientToPercentage(a)})`:darken(t,a)}})}function createThemeNoVars(e={},...t){const{breakpoints:a,mixins:n={},spacing:s,palette:i={},transitions:o={},typography:l={},shape:c,colorSpace:u,...d}=e;if(e.vars&&void 0===e.generateThemeVars)throw new Error(formatMuiErrorMessage(22));const m=createPalette({...i,colorSpace:u}),p=createTheme$1(e);let g=deepmerge(p,{mixins:createMixins(p.breakpoints,n),palette:m,shadows:Rn.slice(),typography:createTypography(m,l),transitions:createTransitions(o),zIndex:{...In}});return g=deepmerge(g,d),g=t.reduce((e,t)=>deepmerge(e,t),g),g.unstable_sxConfig={...ta,...d?.unstable_sxConfig},g.unstable_sx=function sx(e){return aa({sx:e,theme:this})},g.toRuntimeSource=stringifyTheme,attachColorManipulators(g),g}function getOverlayAlpha(e){let t;return t=e<1?5.11916*e**2:4.5*Math.log(e+1)+2,Math.round(10*t)/1e3}var Ln=[...Array(25)].map((e,t)=>{if(0===t)return"none";const a=getOverlayAlpha(t);return`linear-gradient(rgba(255 255 255 / ${a}), rgba(255 255 255 / ${a}))`});function getOpacity(e){return{inputPlaceholder:"dark"===e?.5:.42,inputUnderline:"dark"===e?.7:.42,switchTrackDisabled:"dark"===e?.2:.12,switchTrack:"dark"===e?.3:.38}}function getOverlays(e){return"dark"===e?Ln:[]}function createColorScheme(e){const{palette:t={mode:"light"},opacity:a,overlays:n,colorSpace:s,...i}=e,o=createPalette({...t,colorSpace:s});return{palette:o,opacity:{...getOpacity(o.mode),...a},overlays:n||getOverlays(o.mode),...i}}function shouldSkipGeneratingVar(e){return!!e[0].match(/(cssVarPrefix|colorSchemeSelector|modularCssLayers|rootSelector|typography|mixins|breakpoints|direction|transitions)/)||!!e[0].match(/sxConfig$/)||"palette"===e[0]&&!!e[1]?.match(/(mode|contrastThreshold|tonalOffset)/)}var excludeVariablesFromRoot=e=>[...[...Array(25)].map((t,a)=>`--${e?`${e}-`:""}overlays-${a}`),`--${e?`${e}-`:""}palette-AppBar-darkBg`,`--${e?`${e}-`:""}palette-AppBar-darkColor`],createGetSelector_default=e=>(t,a)=>{const n=e.rootSelector||":root",s=e.colorSchemeSelector;let i=s;if("class"===s&&(i=".%s"),"data"===s&&(i="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(i=`[${s}="%s"]`),e.defaultColorScheme===t){if("dark"===t){const s={};return excludeVariablesFromRoot(e.cssVarPrefix).forEach(e=>{s[e]=a[e],delete a[e]}),"media"===i?{[n]:a,"@media (prefers-color-scheme: dark)":{[n]:s}}:i?{[i.replace("%s",t)]:s,[`${n}, ${i.replace("%s",t)}`]:a}:{[n]:{...a,...s}}}if(i&&"media"!==i)return`${n}, ${i.replace("%s",String(t))}`}else if(t){if("media"===i)return{[`@media (prefers-color-scheme: ${String(t)})`]:{[n]:a}};if(i)return i.replace("%s",String(t))}return n};function assignNode(e,t){t.forEach(t=>{e[t]||(e[t]={})})}function setColor(e,t,a){!e[t]&&a&&(e[t]=a)}function toRgb(e){return"string"==typeof e&&e.startsWith("hsl")?hslToRgb(e):e}function setColorChannel(e,t){`${t}Channel`in e||(e[`${t}Channel`]=private_safeColorChannel(toRgb(e[t]),`MUI: Can't create \`palette.${t}Channel\` because \`palette.${t}\` is not one of these formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().\nTo suppress this warning, you need to explicitly provide the \`palette.${t}Channel\` as a string (in rgb format, for example "12 12 12") or undefined if you want to remove the channel token.`))}function getSpacingVal(e){return"number"==typeof e?`${e}px`:"string"==typeof e||"function"==typeof e||Array.isArray(e)?e:"8px"}var silent=e=>{try{return e()}catch(t){}},createGetCssVar=(e="mui")=>createGetCssVar$1(e);function attachColorScheme$1(e,t,a,n,s){if(!a)return;a=!0===a?{}:a;const i="dark"===s?"dark":"light";if(!n)return void(t[s]=createColorScheme({...a,palette:{mode:i,...a?.palette},colorSpace:e}));const{palette:o,...l}=createThemeNoVars({...n,palette:{mode:i,...a?.palette},colorSpace:e});return t[s]={...a,palette:o,opacity:{...getOpacity(i),...a?.opacity},overlays:a?.overlays||getOverlays(i)},l}function createThemeWithVars(e={},...t){const{colorSchemes:a={light:!0},defaultColorScheme:n,disableCssColorScheme:s=!1,cssVarPrefix:i="mui",nativeColor:o=!1,shouldSkipGeneratingVar:l=shouldSkipGeneratingVar,colorSchemeSelector:c=(a.light&&a.dark?"media":void 0),rootSelector:u=":root",...d}=e,m=Object.keys(a)[0],p=n||(a.light&&"light"!==m?"light":m),g=createGetCssVar(i),{[p]:h,light:b,dark:y,...v}=a,S={...v};let x,k=h;if(("dark"===p&&!("dark"in a)||"light"===p&&!("light"in a))&&(k=!0),!k)throw new Error(formatMuiErrorMessage(21,p));o&&(x="oklch");const C=attachColorScheme$1(x,S,k,d,p);b&&!S.light&&attachColorScheme$1(x,S,b,void 0,"light"),y&&!S.dark&&attachColorScheme$1(x,S,y,void 0,"dark");let A={defaultColorScheme:p,...C,cssVarPrefix:i,colorSchemeSelector:c,rootSelector:u,getCssVar:g,colorSchemes:S,font:{...prepareTypographyVars(C.typography),...C.font},spacing:getSpacingVal(d.spacing)};Object.keys(A.colorSchemes).forEach(e=>{const t=A.colorSchemes[e].palette,setCssVarColor=e=>{const a=e.split("-"),n=a[1],s=a[2];return g(e,t[n][s])};function colorMix(e,t,a){if(x){let n;return e===private_safeAlpha&&(n=`transparent ${(100*(1-a)).toFixed(0)}%`),e===private_safeDarken&&(n=`#000 ${(100*a).toFixed(0)}%`),e===private_safeLighten&&(n=`#fff ${(100*a).toFixed(0)}%`),`color-mix(in ${x}, ${t}, ${n})`}return e(t,a)}if("light"===t.mode&&(setColor(t.common,"background","#fff"),setColor(t.common,"onBackground","#000")),"dark"===t.mode&&(setColor(t.common,"background","#000"),setColor(t.common,"onBackground","#fff")),assignNode(t,["Alert","AppBar","Avatar","Button","Chip","FilledInput","LinearProgress","Skeleton","Slider","SnackbarContent","SpeedDialAction","StepConnector","StepContent","Switch","TableCell","Tooltip"]),"light"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-main")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-main")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.main))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.main))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.main))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.main))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-100")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-400")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-300")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-A100")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-400")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-700")),setColor(t.FilledInput,"bg","rgba(0, 0, 0, 0.06)"),setColor(t.FilledInput,"hoverBg","rgba(0, 0, 0, 0.09)"),setColor(t.FilledInput,"disabledBg","rgba(0, 0, 0, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.LinearProgress,"successBg",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.main,.62)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.11):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.11)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Slider,"errorTrack",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Slider,"infoTrack",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Slider,"successTrack",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Slider,"warningTrack",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62));const e=x?colorMix(private_safeDarken,o?g("palette-background-default"):t.background.default,.6825):private_safeEmphasize(t.background.default,.8);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?_n.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-400")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-400")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-common-white")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-100")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62)),setColor(t.TableCell,"border",colorMix(private_safeLighten,private_safeAlpha(o?g("palette-divider"):t.divider,1),.88)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}if("dark"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-dark")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-dark")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-dark")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-dark")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.dark))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.dark))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.dark))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.dark))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-900")),setColor(t.AppBar,"darkBg",setCssVarColor("palette-background-paper")),setColor(t.AppBar,"darkColor",setCssVarColor("palette-text-primary")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-600")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-800")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-300")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-300")),setColor(t.FilledInput,"bg","rgba(255, 255, 255, 0.09)"),setColor(t.FilledInput,"hoverBg","rgba(255, 255, 255, 0.13)"),setColor(t.FilledInput,"disabledBg","rgba(255, 255, 255, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.LinearProgress,"successBg",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeDarken,o?g("palette-warning-main"):t.warning.main,.5)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.13):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.13)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.Slider,"errorTrack",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.Slider,"infoTrack",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.Slider,"successTrack",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.Slider,"warningTrack",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.5));const e=x?colorMix(private_safeLighten,o?g("palette-background-default"):t.background.default,.985):private_safeEmphasize(t.background.default,.98);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?wn.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-600")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-600")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-grey-300")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-600")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.55)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.55)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.55)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.55)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.55)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.55)),setColor(t.TableCell,"border",colorMix(private_safeDarken,private_safeAlpha(o?g("palette-divider"):t.divider,1),.68)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}o||(setColorChannel(t.background,"default"),setColorChannel(t.background,"paper"),setColorChannel(t.common,"background"),setColorChannel(t.common,"onBackground"),setColorChannel(t,"divider")),Object.keys(t).forEach(e=>{const a=t[e];"tonalOffset"!==e&&!o&&a&&"object"==typeof a&&(a.main&&setColor(t[e],"mainChannel",private_safeColorChannel(toRgb(a.main))),a.light&&setColor(t[e],"lightChannel",private_safeColorChannel(toRgb(a.light))),a.dark&&setColor(t[e],"darkChannel",private_safeColorChannel(toRgb(a.dark))),a.contrastText&&setColor(t[e],"contrastTextChannel",private_safeColorChannel(toRgb(a.contrastText))),"text"===e&&(setColorChannel(t[e],"primary"),setColorChannel(t[e],"secondary")),"action"===e&&(a.active&&setColorChannel(t[e],"active"),a.selected&&setColorChannel(t[e],"selected")))})}),A=t.reduce((e,t)=>deepmerge(e,t),A);const E={prefix:i,disableCssColorScheme:s,shouldSkipGeneratingVar:l,getSelector:createGetSelector_default(A),enableContrastVars:o},{vars:w,generateThemeVars:_,generateStyleSheets:T}=prepareCssVars(A,E);return A.vars=w,Object.entries(A.colorSchemes[A.defaultColorScheme]).forEach(([e,t])=>{A[e]=t}),A.generateThemeVars=_,A.generateStyleSheets=T,A.generateSpacing=function generateSpacing(){return createSpacing(d.spacing,createUnarySpacing(this))},A.getColorSchemeSelector=createGetColorSchemeSelector(c),A.spacing=A.generateSpacing(),A.shouldSkipGeneratingVar=l,A.unstable_sxConfig={...ta,...d?.unstable_sxConfig},A.unstable_sx=function sx(e){return aa({sx:e,theme:this})},A.internal_cache={},A.toRuntimeSource=stringifyTheme,A}function attachColorScheme(e,t,a){e.colorSchemes&&a&&(e.colorSchemes[t]={...!0!==a&&a,palette:createPalette({...!0===a?{}:a.palette,mode:t})})}function createTheme(e={},...t){const{palette:a,cssVariables:n=!1,colorSchemes:s=(a?void 0:{light:!0}),defaultColorScheme:i=a?.mode,...o}=e,l=i||"light",c=s?.[l],u={...s,...a?{[l]:{..."boolean"!=typeof c&&c,palette:a}}:void 0};if(!1===n){if(!("colorSchemes"in e))return createThemeNoVars(e,...t);let n=a;"palette"in e||u[l]&&(!0!==u[l]?n=u[l].palette:"dark"===l&&(n={mode:"dark"}));const s=createThemeNoVars({...e,palette:n},...t);return s.defaultColorScheme=l,s.colorSchemes=u,"light"===s.palette.mode&&(s.colorSchemes.light={...!0!==u.light&&u.light,palette:s.palette},attachColorScheme(s,"dark",u.dark)),"dark"===s.palette.mode&&(s.colorSchemes.dark={...!0!==u.dark&&u.dark,palette:s.palette},attachColorScheme(s,"light",u.light)),s}return a||"light"in u||"light"!==l||(u.light=!0),createThemeWithVars({...o,colorSchemes:u,defaultColorScheme:l,..."boolean"!=typeof n&&n},...t)}function slotShouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}var qn=createStyled({themeId:"$$material",defaultTheme:createTheme(),rootShouldForwardProp:e=>slotShouldForwardProp(e)&&"classes"!==e}),Bn=unstable_memoTheme;function useDefaultProps(e){return useDefaultProps$1(e)}function getSvgIconUtilityClass(e){return generateUtilityClass("MuiSvgIcon",e)}generateUtilityClasses("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);var useUtilityClasses=e=>{const{color:t,fontSize:a,classes:n}=e;return composeClasses({root:["root","inherit"!==t&&`color${xr(t)}`,`fontSize${xr(a)}`]},getSvgIconUtilityClass,n)},$n=qn("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,"inherit"!==a.color&&t[`color${xr(a.color)}`],t[`fontSize${xr(a.fontSize)}`]]}})(Bn(({theme:e})=>({userSelect:"none",width:"1em",height:"1em",display:"inline-block",flexShrink:0,transition:e.transitions?.create?.("fill",{duration:(e.vars??e).transitions?.duration?.shorter}),variants:[{props:e=>!e.hasSvgAsChild,style:{fill:"currentColor"}},{props:{fontSize:"inherit"},style:{fontSize:"inherit"}},{props:{fontSize:"small"},style:{fontSize:e.typography?.pxToRem?.(20)||"1.25rem"}},{props:{fontSize:"medium"},style:{fontSize:e.typography?.pxToRem?.(24)||"1.5rem"}},{props:{fontSize:"large"},style:{fontSize:e.typography?.pxToRem?.(35)||"2.1875rem"}},...Object.entries((e.vars??e).palette).filter(([,e])=>e&&e.main).map(([t])=>({props:{color:t},style:{color:(e.vars??e).palette?.[t]?.main}})),{props:{color:"action"},style:{color:(e.vars??e).palette?.action?.active}},{props:{color:"disabled"},style:{color:(e.vars??e).palette?.action?.disabled}},{props:{color:"inherit"},style:{color:void 0}}]}))),zn=b.forwardRef(function SvgIcon(e,t){const a=useDefaultProps({props:e,name:"MuiSvgIcon"}),{children:n,className:s,color:i="inherit",component:o="svg",fontSize:l="medium",htmlColor:c,inheritViewBox:u=!1,titleAccess:d,viewBox:m="0 0 24 24",...p}=a,g=b.isValidElement(n)&&"svg"===n.type,h={...a,color:i,component:o,fontSize:l,instanceFontSize:e.fontSize,inheritViewBox:u,viewBox:m,hasSvgAsChild:g},y={};return u||(y.viewBox=m),(0,sr.jsxs)($n,{as:o,className:clsx(useUtilityClasses(h).root,s),focusable:"false",color:c,"aria-hidden":!d||void 0,role:d?"img":void 0,ref:t,...y,...p,...g&&n.props,ownerState:h,children:[g?n.props.children:n,d?(0,sr.jsx)("title",{children:d}):null]})});function createSvgIcon(e,t){function Component(t,a){return(0,sr.jsx)(zn,{"data-testid":void 0,ref:a,...t,children:e})}return Component.muiName=zn.muiName,b.memo(b.forwardRef(Component))}zn.muiName="SvgIcon";var Fn=createSvgIcon((0,sr.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25"}),"HelpOutlined"),Gn=Object.freeze({}),Hn=Object.freeze({}),getDefaultClassFilter=(e="")=>{const t=normalizeClassName(e);return Ye.includes(t)?t:"all"};function useDefPriorities(e,t={}){const a=useNexSysSnapshot(e)??Gn,n=a.defs??Hn,s=a.system?.char?.class??"",{defPriorities:i=Hn,defStatics:o=Hn,setDefPriority:l,setDefStatic:c}=t,u=(0,b.useMemo)(()=>getDefaultClassFilter(s),[s]),[d,m]=(0,b.useState)(null),p=d??u,g=(0,b.useMemo)(()=>["all",...Ye],[]),h=(0,b.useMemo)(()=>Object.entries(n).reduce((e,[t,a])=>(e[t]={...a,defaultPriority:i[t]??a.defaultPriority,static:o[t]??a.static},e),{}),[n,i,o]),y=(0,b.useMemo)(()=>Object.entries(h).filter(([,e])=>!e.trackOnly&&e.command?.length>0),[h]),v=(0,b.useMemo)(()=>"all"===p?y.map(([e])=>e):y.filter(([,e])=>classListIncludes(e.skills,p)).map(([e])=>e),[y,p]),S=(0,b.useCallback)((e,t)=>{c?.(e,t)},[c]),x=(0,b.useCallback)((e,t)=>{l?.(e,t)},[l]);return{defList:v,defsState:h,classFilter:p,setClassFilter:(0,b.useCallback)(e=>{m(e)},[]),classOptions:g,updateStatic:S,updatePriority:x}}function defNameColor(e){const t=e?.bals_used??[],a=e?.bals_req??[],n=["balance","equilibrium"];return t.some(e=>n.includes(e))?"error.main":a.some(e=>n.includes(e))?"warning.main":"success.main"}var Un=(0,sr.jsxs)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:[(0,sr.jsxs)(n.Box,{children:[(0,sr.jsx)(n.Box,{component:"span",sx:{color:"error.main",fontWeight:700},children:"Consumes balance"}),": These skills use eq or bal to activate and should have the lowest priority."]}),(0,sr.jsxs)(n.Box,{children:[(0,sr.jsx)(n.Box,{component:"span",sx:{color:"warning.main",fontWeight:700},children:"Requires balance"}),": These skills are free to use but require eq or bal to activate and should have the middle priority."]}),(0,sr.jsxs)(n.Box,{children:[(0,sr.jsx)(n.Box,{component:"span",sx:{color:"success.main",fontWeight:700},children:"Free action"}),": These skills are free to use and should likely have the highest priority."]})]}),Vn=(0,sr.jsx)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:"Checked defences are player-controlled and only raised by the manual defence-up action. Unchecked defences are kept up automatically by nexSys (via server-side curing, or by nexSys issuing the command directly for client-planned defences)."}),Yn={py:.25,px:.75,border:"none"},Qn={py:.5,px:.75,border:"none",borderBottom:"1px solid",borderColor:"divider",bgcolor:"background.panel",color:"text.primary",fontWeight:700,fontSize:13,whiteSpace:"nowrap"};function HelpIcon(){return(0,sr.jsx)(Fn,{sx:{fontSize:14,verticalAlign:"middle",ml:.25,opacity:.7}})}function DefRow({name:e,def:t,updateStatic:a,updatePriority:s}){const i=defNameColor(t);return(0,sr.jsxs)(n.TableRow,{sx:{"& td":Yn},children:[(0,sr.jsx)(n.TableCell,{padding:"checkbox",sx:{...Yn,width:36},children:(0,sr.jsx)(n.Checkbox,{size:"small",checked:Boolean(t?.static),onChange:t=>a(e,t.target.checked),sx:{p:.25}})}),(0,sr.jsx)(n.TableCell,{sx:{width:100},children:(0,sr.jsx)(n.Typography,{variant:"body2",sx:{color:i,fontSize:13},children:e})}),(0,sr.jsx)(n.TableCell,{sx:{width:50},children:(0,sr.jsx)(n.TextField,{value:t?.defaultPriority??0,onChange:t=>s(e,t.target.value),type:"number",size:"small",sx:{width:56},slotProps:{htmlInput:{min:0,max:26,style:{padding:"2px 6px",fontSize:13}}}})})]})}function DefHalfTable({defNames:e,defsState:t,updateStatic:a,updatePriority:s}){return(0,sr.jsx)(n.TableContainer,{sx:{flex:1},children:(0,sr.jsxs)(n.Table,{size:"small",stickyHeader:!0,sx:{tableLayout:"fixed"},children:[(0,sr.jsx)(n.TableHead,{children:(0,sr.jsxs)(n.TableRow,{children:[(0,sr.jsx)(n.TableCell,{padding:"checkbox",sx:{...Qn,width:36},children:(0,sr.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:Vn,children:(0,sr.jsxs)("span",{children:["Defup",(0,sr.jsx)(HelpIcon,{})]})})}),(0,sr.jsx)(n.TableCell,{sx:{...Qn,width:100},children:(0,sr.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:Un,children:(0,sr.jsxs)("span",{children:["Name ",(0,sr.jsx)(HelpIcon,{})]})})}),(0,sr.jsx)(n.TableCell,{sx:{...Qn,width:70},children:"Priority"})]})}),(0,sr.jsx)(n.TableBody,{children:e.map(e=>(0,sr.jsx)(DefRow,{name:e,def:t[e],updateStatic:a,updatePriority:s},e))})]})})}function DefPrioritiesTab({settingsForm:e}){const{defList:t,defsState:a,classFilter:s,setClassFilter:i,classOptions:o,updateStatic:l,updatePriority:c}=useDefPriorities(useNexSys(),e),[u,d]=(0,b.useMemo)(()=>{const e=Math.ceil(t.length/2);return[t.slice(0,e),t.slice(e)]},[t]);return(0,sr.jsxs)(n.Box,{sx:{pt:1},children:[(0,sr.jsxs)(n.FormControl,{size:"small",sx:{mb:1.5,minWidth:180},children:[(0,sr.jsx)(n.InputLabel,{children:"Class"}),(0,sr.jsx)(n.Select,{value:s,label:"Class",onChange:e=>i(e.target.value),children:o.map(e=>(0,sr.jsx)(n.MenuItem,{value:e,children:"all"===e?"All Classes":e},e))})]}),(0,sr.jsxs)(n.Box,{sx:{display:"flex",gap:1,alignItems:"flex-start"},children:[(0,sr.jsx)(DefHalfTable,{defNames:u,defsState:a,updateStatic:l,updatePriority:c}),d.length>0&&(0,sr.jsx)(DefHalfTable,{defNames:d,defsState:a,updateStatic:l,updatePriority:c})]})]})}var Wn=Object.freeze({}),Kn=O.map(e=>R[e]).filter(Boolean).map(e=>({herb:e,mineral:j[e]??null}));function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function usePrecache(e,t={}){const a=useNexSysSnapshot(e),{desiredPrecache:n,setPrecache:s}=t,i=n??a?.cache?.desiredPrecache??Wn;return{pairs:(0,b.useMemo)(()=>Kn.map(({herb:e,mineral:t})=>({herb:e,herbLabel:capitalize(e),herbQty:i[e]??0,mineral:t,mineralLabel:t?capitalize(t):null,mineralQty:t?i[t]??0:0})),[i]),update:(0,b.useCallback)((e,t)=>{s?.(e,Math.max(0,t))},[s])}}function QuantityControl({label:e,value:t,onIncrement:a,onDecrement:s,compact:i=!1}){return(0,sr.jsxs)(n.Box,{sx:{display:"flex",alignItems:"center",gap:1,mb:i?0:.5},children:[(0,sr.jsxs)(n.ButtonGroup,{size:"small",variant:"outlined",children:[(0,sr.jsx)(n.Button,{onClick:s,disabled:t<=0,sx:{minWidth:28,px:.5,fontSize:12},children:"−"}),(0,sr.jsx)(n.Button,{disableRipple:!0,disableFocusRipple:!0,sx:{minWidth:36,px:.5,cursor:"default",pointerEvents:"none",fontSize:12,color:"text.primary",borderColor:"divider"},children:t}),(0,sr.jsx)(n.Button,{onClick:a,sx:{minWidth:28,px:.5,fontSize:12},children:"+"})]}),(0,sr.jsx)(n.Typography,{variant:"body2",children:e})]})}function PairRow({pair:e,update:t}){return(0,sr.jsxs)(n.Box,{sx:{display:"flex",gap:.5},children:[(0,sr.jsx)(n.Box,{sx:{flex:1},children:(0,sr.jsx)(QuantityControl,{compact:!0,label:e.herbLabel,value:e.herbQty,onIncrement:()=>t(e.herb,e.herbQty+1),onDecrement:()=>t(e.herb,e.herbQty-1)})}),(0,sr.jsx)(n.Box,{sx:{flex:1},children:e.mineral?(0,sr.jsx)(QuantityControl,{compact:!0,label:e.mineralLabel,value:e.mineralQty,onIncrement:()=>t(e.mineral,e.mineralQty+1),onDecrement:()=>t(e.mineral,e.mineralQty-1)}):(0,sr.jsx)(n.Box,{sx:{height:28}})})]})}function PrecacheTab({settingsForm:e}){const{pairs:t,update:a}=usePrecache(useNexSys(),e);return(0,sr.jsxs)(n.Box,{sx:{pt:1},children:[(0,sr.jsxs)(n.Box,{sx:{display:"flex",gap:.5,mb:.25},children:[(0,sr.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Herb"}),(0,sr.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Mineral"})]}),t.map(e=>(0,sr.jsx)(PairRow,{pair:e,update:a},e.herb))]})}function ColorSettingsTab(){return(0,sr.jsx)(n.Box,{sx:{pt:2},children:(0,sr.jsx)(n.Typography,{variant:"body2",color:"text.secondary",children:"Color settings are not yet implemented."})})}var Xn=["System","Aff Priorities","Defences","Precache","Colors"];function ConfigTabs({settingsForm:e}){const[t,a]=(0,b.useState)(0),{pending:s,set:i}=e;return(0,sr.jsxs)(n.Box,{sx:{width:"100%"},children:[(0,sr.jsx)(n.Tabs,{value:t,onChange:(e,t)=>a(t),variant:"scrollable",scrollButtons:"auto",sx:{borderBottom:"1px solid",borderColor:"divider",mb:1,"& .MuiTab-root":{fontSize:11,minHeight:36,py:.5}},children:Xn.map(e=>(0,sr.jsx)(n.Tab,{label:e},e))}),(0,sr.jsxs)(n.Box,{sx:{overflowX:"auto",overflowY:"visible"},children:[0===t&&(0,sr.jsx)(SystemSettingsTab,{pending:s,set:i}),1===t&&(0,sr.jsx)(AffPrioritiesTab,{settingsForm:e}),2===t&&(0,sr.jsx)(DefPrioritiesTab,{settingsForm:e}),3===t&&(0,sr.jsx)(PrecacheTab,{settingsForm:e}),4===t&&(0,sr.jsx)(ColorSettingsTab,{})]})]})}function ConfigDialogContent({nexSys:e,onClose:t}){const a=useSettingsForm(e),handleSave=()=>{a.commit(),e?.api?.ui?.closeConfig("ui.save"),t()},handleCancel=()=>{e?.api?.ui?.closeConfig("ui.cancel"),t()};return(0,sr.jsxs)(n.Dialog,{open:!0,onClose:handleCancel,maxWidth:"md",slotProps:{paper:{sx:{width:{xs:"calc(100% - 24px)",md:900},maxWidth:"calc(100% - 24px)",bgcolor:"background.surface",color:"text.primary",backgroundImage:"none",border:"1px solid",borderColor:"divider"}}},children:[(0,sr.jsxs)(n.DialogTitle,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",bgcolor:"background.surface",color:"text.primary",pb:.5,borderBottom:"1px solid",borderColor:"divider"},children:[(0,sr.jsx)(n.Typography,{component:"span",variant:"h6",sx:{fontSize:14,color:"primary.main",fontWeight:700},children:"nexSys4 Configuration"}),(0,sr.jsx)(n.Typography,{component:"span",variant:"caption",sx:{color:"text.secondary"},children:"v1.0.4"})]}),(0,sr.jsx)(n.DialogContent,{sx:{"&.MuiDialogContent-root":{p:0,overflowY:"auto",overflowX:"hidden"}},children:(0,sr.jsx)(n.Box,{sx:{px:2,pt:2,pb:0},children:(0,sr.jsx)(ConfigTabs,{settingsForm:a})})}),(0,sr.jsxs)(n.DialogActions,{sx:{borderTop:"1px solid",borderColor:"divider",px:2,py:1},children:[(0,sr.jsx)(n.Button,{onClick:handleCancel,size:"small",sx:{fontSize:11},children:"Cancel"}),(0,sr.jsx)(n.Button,{onClick:handleSave,variant:"contained",size:"small",sx:{fontSize:11},children:"Save"})]})]})}function ConfigDialog(){const e=useNexSys(),[t,a]=useDialogOpen(e);return(0,sr.jsx)(s.ThemeProvider,{theme:dr,children:t?(0,sr.jsx)(ConfigDialogContent,{nexSys:e,onClose:()=>a(!1)}):null})}function NexSysGuiApp({nexSys:e}){return(0,sr.jsx)(NexSysProvider,{nexSys:e,children:(0,sr.jsx)(ConfigDialog,{})})}var bootstrapNexus=(e={})=>{const t=bootstrapNexus$1(e);return t.component=NexSysGuiApp,startupNexus(),t.api.control.updateNxs(),t};e.bootstrapNexus=bootstrapNexus}(globalThis.nexSys=globalThis.nexSys||{},nexRuntime.zod,React,nexRuntime.mui,nexRuntime.muiStyles,nexRuntime.immer,nexRuntime.dndCore,nexRuntime.dndSortable,nexRuntime.dndUtilities);
|
|
1
|
+
!function(e,t,a,n,s,i,o,l,c){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});var u=Object.create,d=Object.defineProperty,m=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,g=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),__copyProps=(e,t,a,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var s,i=p(t),o=0,l=i.length;o<l;o++)s=i[o],h.call(e,s)||s===a||d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(n=m(t,s))||n.enumerable});return e},__toESM=(e,t,a)=>(a=null!=e?u(g(e)):{},__copyProps(!t&&e&&e.__esModule?a:d(a,"default",{value:e,enumerable:!0}),e));let b=__toESM(a,1);a=__toESM(a);var y=Symbol.for("nexsys4.nexusClientOverrides.installed"),v=Symbol.for("nexsys4.nexusClientOverrides.originals"),S=200,resolveOverrideTargets=e=>({buffer:"function"==typeof e?.buffer?e.buffer():null,platform:"function"==typeof e?.platform?e.platform():null,datahandler:"function"==typeof e?.datahandler?e.datahandler():null}),getActiveNexSys=()=>globalThis.nexSys&&"object"==typeof globalThis.nexSys?globalThis.nexSys:null,getSystemSettings=(e=getActiveNexSys())=>e?.state?.system?.settings||e?.sys?.settings||{},isOverrideTabEnabled=(e=getActiveNexSys())=>Boolean(getSystemSettings(e).overrideTab),normalizeTargetQuery=e=>{const t=String(e??"").trim();return t?`${t.charAt(0).toUpperCase()}${t.slice(1).toLowerCase()}`:""},getInputArea=()=>globalThis.document?.getElementsByTagName?.("textarea")?.[0]??null,createTabCompletion=()=>({txt:null,qry:null,vals:null,index:0,reset(){this.txt=null,this.qry=null,this.vals=null,this.index=0},tc(){const e=getInputArea();if(!e)return;if(this.txt??=String(e.value??"").split(" "),this.qry??=normalizeTargetQuery(this.txt.at(-1)),!this.qry)return;const t=Array.isArray(globalThis.nexGui?.colors?.enemies)?globalThis.nexGui.colors.enemies:[],a=Array.isArray(globalThis.GMCP?.WhoList)?globalThis.GMCP.WhoList:[];this.vals??=[...new Set([...t.map(e=>String(e)),...a.map(e=>String(e?.name??"")).filter(e=>e.startsWith(this.qry))])],this.vals.length&&(this.index>this.vals.length-1?(this.txt[this.txt.length-1]=this.qry,this.index=0):(this.txt[this.txt.length-1]=this.vals[this.index],this.index+=1),e.value=this.txt.join(" "))}}),ensureTabCompletion=(e=getActiveNexSys())=>{if(e?.tabCompletion?.tc&&e?.tabCompletion?.reset)return e.tabCompletion;const t=createTabCompletion();return e&&"object"==typeof e&&(e.tabCompletion=t),t},renderCustomPrompt=(e,t={})=>{const a=e?.api?.prompt,n=t?.line;try{const e="function"==typeof a?.render?a.render(t):null;return"string"!=typeof e?null:(n?.parsed_line&&"object"==typeof n.parsed_line&&(n.parsed_line.formatted=()=>e),e)}catch(s){return console.error("nexSys4 custom prompt render failed",s),null}},createAddBlockOverride=()=>function add_block(e=[]){const t=getActiveNexSys();t?.prepend_line&&(e.unshift(t.prepend_line),t.prepend_line=!1);const a=Boolean(getSystemSettings(t).customPrompt);let n=0;for(let i=0;i<e.length;i+=1){const s=e[i];if(!s||s.gag)continue;if(!s.parsed_line&&!s.html_line)continue;const o=Boolean(s.is_prompt&&a&&s.parsed_line)?renderCustomPrompt(t,{line:s,source:"nexus-client-override"}):null;s.is_prompt&&0===n&&null===o?s.gag=!0:(!s.parsed_line||"function"!=typeof s.parsed_line.text||s.parsed_line.text()||0!==n&&i!==e.length-1||null!==o)&&("function"==typeof this._fill_tab_completion&&this._fill_tab_completion(s),n+=1,this.lineid+=1,s.id=this.lineid,this.lines.push(s),this.unread=!0)}const s=this.prune_lines?.()??!1;(n||s)&&this.on_lines_changed?.()},createProcessLinesOverride=()=>function process_lines(e=[]){if(this.gagged)return;if(!e.length)return;this.current_block=e;const t=this.reflexes?.();for(let a=0;a<e.length&&!(a>=1e3);a+=1)if(this.current_line=e[a],this.current_line.index=a,e[a]?.line&&String(e[a].line).indexOf(String.fromCharCode(7))>=0&&this.platform?.()?.beep?.(),!this.fullstop&&"function"==typeof t?.handle_triggers){const n=t.handle_triggers(e,a);Array.isArray(n)&&(e=n)}t?.run_function?.("onBlock",e,"ALL"),this.buffer?.()?.add_block?.(e),this.current_line=void 0,this.current_block=void 0},createOnKeyUpOverride=()=>function on_key_up(e){if(!this._nexus?.datahandler?.()?.is_connected?.())return!0;if(this.dialog_has_focus?.())return!0;const t=getActiveNexSys(),a=isOverrideTabEnabled(t),n=a?ensureTabCompletion(t):null;return this.tab_pressed?9!==e||(this.tab_pressed=!1,a?(n?.tc?.(),!1):(this.player_targetted||this._nexus?.datahandler?.()?.tab_target?.(!1),this.player_targetted=!1,!1)):(n?.reset?.(),!0)},createSendCommandOverride=e=>function send_command(t){const a=getActiveNexSys(),n=Date.now();if(a&&"object"==typeof a&&(a.sentCommands=[...(Array.isArray(a.sentCommands)?a.sentCommands:[]).slice(0,S-1),{cmd:t,time:n}]),"function"==typeof e)return e.call(this,t);this._socket&&(this._socket.send(`${t}\r\n`),this.last_send=n)},installNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e||e[y])return Boolean(e);const{buffer:t,platform:a,datahandler:n}=resolveOverrideTargets(e);return!!(t&&a&&n)&&(e[v]={buffer:t,platform:a,datahandler:n,process_lines:e.process_lines,add_block:t.add_block,on_key_up:a.on_key_up,send_command:n.send_command},e.process_lines=createProcessLinesOverride(),t.add_block=createAddBlockOverride(),a.on_key_up=createOnKeyUpOverride(),n.send_command=createSendCommandOverride(n.send_command),e[y]=!0,!0)},uninstallNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e?.[y])return!1;const t=e[v];if(!t)return delete e[y],!1;const a=t.buffer||resolveOverrideTargets(e).buffer,n=t.platform||resolveOverrideTargets(e).platform,s=t.datahandler||resolveOverrideTargets(e).datahandler;return e.process_lines=t.process_lines,a&&(a.add_block=t.add_block),n&&(n.on_key_up=t.on_key_up),s&&(s.send_command=t.send_command),delete e[v],delete e[y],!0},x=["send","sendGmcp","on","off","notice","getCommandSeparator","now","setTimeout","clearTimeout","getVariable","setVariable","emitLocal","raiseToEventStream"],k=Object.freeze({promptRender:["renderPrompt"],gmcpSnapshot:["getGMCP"],debugToggle:["setDebugEnabled","isDebugEnabled"],destroy:["destroy"]}),resolveAdapterCapabilities=e=>{const t=e?.capabilities&&"object"==typeof e.capabilities?e.capabilities:{},a={};return Object.entries(k).forEach(([n,s])=>{const i=Object.prototype.hasOwnProperty.call(t,n)?Boolean(t[n]):s.every(t=>"function"==typeof e?.[t]);if(i){const t=s.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter capability "${n}" requires methods: ${t.join(", ")}`)}a[n]=i}),Object.freeze(a)},assertAdapterContract=e=>{const t=x.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter missing required methods: ${t.join(", ")}`);return resolveAdapterCapabilities(e),e},C=["Char.Vitals","Char.Status","Char.Afflictions.List","Char.Afflictions.Add","Char.Afflictions.Remove","Char.Defences.List","Char.Defences.Add","Char.Defences.Remove","Char.Items.Add","Char.Items.Remove","Char.Items.Update","Char.Items.List","IRE.Rift.List","IRE.Rift.Change","Room.Info","IRE.Target.Info"],registerEventStreamBindings=({eventBus:e,emit:t,pushTrace:a,eventRegistrations:n})=>{if(!e?.registerEvent)return;const registerBinding=(t,s)=>{const i=`nexsys4-${t.replace(/\W+/g,"-")}`,callback=e=>s(e);e.registerEvent(t,callback,{id:i,tags:["nexsys4"]}),n.push({eventName:t,id:i}),a("register:eventStream",{eventName:t,id:i})};C.forEach(e=>{registerBinding(e,a=>{t("GmcpEvent",{tag:e,payload:a??null,rawTag:e})})}),registerBinding("PromptEvent",e=>{t("PromptEvent",{source:"eventstream-prompt",payload:e??null})})},A=Object.freeze({domination:Object.freeze({sycophantcommand:Object.freeze({balance:"entity",durationMs:1750}),dervishcommand:Object.freeze({balance:"entity",durationMs:1770}),bloodleechcommand:Object.freeze({balance:"entity",durationMs:1950}),chimeracommand:Object.freeze({balance:"entity",durationMs:1950}),chimeracommanddeaf:Object.freeze({balance:"entity",durationMs:1950}),cronecommand:Object.freeze({balance:"entity",durationMs:1950}),houndcommand:Object.freeze({balance:"entity",durationMs:1950}),humbugcommand:Object.freeze({balance:"entity",durationMs:1950}),stormcommand:Object.freeze({balance:"entity",durationMs:1950}),wormcommand:Object.freeze({balance:"entity",durationMs:1950}),buboniscommand:Object.freeze({balance:"entity",durationMs:2050}),slimecommand:Object.freeze({balance:"entity",durationMs:2250}),abominationcommand:Object.freeze({balance:"entity",durationMs:2300})})}),E=Object.freeze([Object.freeze({id:"icewall-summoned",observe:Object.freeze({kind:"wall",change:"added",type:"icewall"}),pattern:/^(?<user>\w+) raises \w+ hands dramatically and summons an icewall to the (?<direction>[a-z]+)\.$/}),Object.freeze({id:"icewall-melted-by-firelash",observe:Object.freeze({kind:"wall",change:"removed",type:"icewall"}),pattern:/^The icewall to the (?<direction>[a-z]+) suddenly melts as a lash of fire strikes the opposite side of it\.$/})]),w=Object.freeze(["n","ne","e","se","s","sw","w","nw","u","d","in","out"]),_=Object.freeze({north:"n",northeast:"ne",east:"e",southeast:"se",south:"s",southwest:"sw",west:"w",northwest:"nw",up:"u",down:"d",in:"in",out:"out"}),normalizeRoomDirection=e=>{if("string"!=typeof e)return null;const t=e.trim().toLowerCase();return w.includes(t)?t:Object.hasOwn(_,t)?_[t]:null},normalizeRoomId=e=>{if("number"!=typeof e&&"string"!=typeof e)return null;if("string"==typeof e&&!e.trim())return null;const t=Number(e);return Number.isFinite(t)?t:null},roomObserverTag=e=>`room-observer:${e}`,emitRoomObservation=({entry:e,direction:t,source:a,emit:n,pushTrace:s=()=>{}})=>{const{kind:i,...o}=e.observe;"wall"===i?(null==t||normalizeRoomDirection(t)||s("room:invalid-direction",{id:e.id,direction:t}),n("RoomWallObservedEvent",{...o,direction:t??null,source:a})):"ground"===i&&n("RoomGroundObservedEvent",{...o,source:a})},createRoomObserverTriggers=({roomObserverCatalog:e=E}={})=>({group:"room/observers",triggers:e.filter(e=>e.pattern).map(e=>({name:e.id,regex:e.pattern,tags:[roomObserverTag(e.id)],action:({args:t,emit:a,pushTrace:n})=>emitRoomObservation({entry:e,direction:t?.groups?.direction,source:"text-trigger",emit:a,pushTrace:n})}))}),T="nexskill.match.skill",normalizeActionId=e=>String(e||"").trim().toLowerCase(),registerSkillEventBindings=({eventBus:e,emit:t,pushTrace:a,eventRegistrations:n,table:s=A,roomObserverCatalog:i=E,getNexSkills:o=()=>null,triggerApi:l})=>{if(!e?.registerEvent)return;i.filter(e=>e.nexskill).forEach(s=>{const i=s.nexskill,o=`${T}.${i.skill}.${normalizeActionId(i.action)}`,l=`nexsys4-room-observer-${s.id}`;e.registerEvent(o,e=>{e?.matchType===i.matchType&&emitRoomObservation({entry:s,direction:e.info,source:"nexskill",emit:t,pushTrace:a})},{id:l,tags:["nexsys4"]}),n.push({eventName:o,id:l}),a("register:eventStream",{eventName:o,id:l})});const c="nexsys4-room-observer-selection";let u=!1;e.registerEvent("nexskill.match",()=>{if(u)return;u=!0;const e=o()?.actions;if(Array.isArray(e))for(const t of i){const n=t.nexskill;t.pattern&&n&&(e.some(e=>{if(e.skill!==n.skill||normalizeActionId(e.id)!==normalizeActionId(n.action))return!1;const t=e.patterns?.[n.matchType]??e[n.matchType];return t instanceof RegExp||"string"==typeof t&&t.length>0||Array.isArray(t)&&t.length>0})&&(l?.triggers?.disable?.([roomObserverTag(t.id)]),a("room:observer-covered",{id:t.id,binding:n})))}},{id:c,tags:["nexsys4"],once:!0}),n.push({eventName:"nexskill.match",id:c}),Object.entries(s).forEach(([s,i])=>{const o=`${T}.${s}`,l=`nexsys4-${o.replace(/\W+/g,"-")}`;e.registerEvent(o,e=>{if("firstPerson"!==e?.matchType)return;const a=normalizeActionId(e.id),n=i[a];n&&t("SkillBalanceObservedEvent",{id:n.balance,durationMs:n.durationMs,reason:`nexskill:${a}`,source:"nexskill"})},{id:l,tags:["nexsys4"]}),n.push({eventName:o,id:l}),a("register:eventStream",{eventName:o,id:l})})},registerStartupGag=({onLocalEvent:e,client:t,notice:a,isDebugEnabled:n})=>{if("function"!=typeof e)return;const gagBlock=()=>{n()||t?.current_block?.forEach(e=>e.gag=!0)};let s=null,i=null,o=null;i=e("CuringStartupBeginEvent",()=>{i?.(),i=null,s||(s=e("PromptEvent",gagBlock))}),o=e("CuringStartupCompleteEvent",()=>{o?.(),o=null,gagBlock(),s?.(),s=null,a("loaded using startup spam gag.")})},createTriggerPattern=e=>void 0!==e.regex?e.regex:e.text,resolveTriggerReason=(e,t={})=>"function"==typeof e.resolveReason?e.resolveReason(t):e.reason,resolveTriggerPayload=(e,t,a={})=>{const n={id:e,source:"text"},s=resolveTriggerReason(t,a);return void 0!==t.have&&(n.have=t.have),void 0!==s&&(n.reason=s),"function"==typeof t.resolvePayload&&Object.assign(n,t.resolvePayload(a,n)||{}),n},createBalanceTextTrigger=(e,t)=>({name:`${e}-${t.name}`,regex:createTriggerPattern(t),action:({args:a,emit:n})=>{n("BalanceStateTextEvent",resolveTriggerPayload(e,t,a?.groups))}}),createBalanceTextTriggersFromFamilies=(e=[])=>e.flatMap(({id:e,entries:t=[]})=>t.map(t=>createBalanceTextTrigger(e,t))),M=["a dolomite grain","a calcite mote","a bisemutum chip","an azurite mote","a magnesium chip","an aurum flake","a plumbum flake","a stannum flake","an arsenic pellet","a ferrum flake","an antimony flake","a cuprum flake","an argentum flake","a calamine crystal","a pinch of ground cinnabar","a pinch of realgar crystals","a quartz grain","a pinch of ground malachite","a quicksilver droplet","a potash crystal","a gypsum crystal"],P=["dolomite grains","calcite motes","bisemutum chips","azurite motes","magnesium chips","aurum flakes","plumbum flakes","stannum flakes","arsenic pellets","ferrum flakes","antimony flakes","cuprum flakes","argentum flakes","calamine crystals","pinches of ground cinnabar","pinches of ground realgar","quartz grains","pinches of ground malachite","quicksilver droplets","potash crystals","gypsum crystals"],O=["a bloodroot leaf","a piece of kelp","a goldenseal root","some prickly ash bark","some bayberry bark","a ginseng root","a ginger root","a bellwort flower","a lobelia seed","a hawthorn berry","a valerian leaf","a skullcap flower","slippery elm","a kola nut","sileris berry","some irid moss","a black cohosh root","a prickly pear","some myrrh gum","an echinacea root"],D=["bloodroot leaves","pieces of kelp","goldenseal roots","pieces of prickly ash bark","pieces of bayberry bark","ginseng roots","ginger roots","bellwort flowers","lobelia seeds","hawthorn berries","valerian leaves","skullcap flowers","slippery elms","kola nuts","sileris berries","pieces of irid moss","cohosh roots","prickly pears","myrrh gums","echinacea roots"],R={"a dolomite grain":"dolomite","a calcite mote":"calcite","a bisemutum chip":"bisemutum","an azurite mote":"azurite","a magnesium chip":"magnesium","an aurum flake":"aurum","a plumbum flake":"plumbum","a stannum flake":"stannum","an arsenic pellet":"arsenic","a ferrum flake":"ferrum","an antimony flake":"antimony","a cuprum flake":"cuprum","an argentum flake":"argentum","a calamine crystal":"calamine","a pinch of ground cinnabar":"cinnabar","a pinch of realgar crystals":"realgar","a quartz grain":"quartz","a pinch of ground malachite":"malachite","a quicksilver droplet":"quicksilver","a potash crystal":"potash","a gypsum crystal":"gypsum","a bloodroot leaf":"bloodroot","a piece of kelp":"kelp","a goldenseal root":"goldenseal","some prickly ash bark":"ash","some bayberry bark":"bayberry","a ginseng root":"ginseng","a ginger root":"ginger","a bellwort flower":"bellwort","a lobelia seed":"lobelia","a hawthorn berry":"hawthorn","a valerian leaf":"valerian","a skullcap flower":"skullcap","slippery elm":"elm","a kola nut":"kola","sileris berry":"sileris","some irid moss":"moss","a black cohosh root":"cohosh","a prickly pear":"pear","some myrrh gum":"myrrh","an echinacea root":"echinacea","dolomite grains":"dolomite","calcite motes":"calcite","bisemutum chips":"bisemutum","azurite motes":"azurite","magnesium chips":"magnesium","aurum flakes":"aurum","plumbum flakes":"plumbum","stannum flakes":"stannum","arsenic pellets":"arsenic","ferrum flakes":"ferrum","antimony flakes":"antimony","cuprum flakes":"cuprum","argentum flakes":"argentum","calamine crystals":"calamine","pinches of ground cinnabar":"cinnabar","pinches of ground realgar":"realgar","quartz grains":"quartz","pinches of ground malachite":"malachite","quicksilver droplets":"quicksilver","potash crystals":"potash","gypsum crystals":"gypsum","bloodroot leaves":"bloodroot","pieces of kelp":"kelp","goldenseal roots":"goldenseal","pieces of prickly ash bark":"ash","pieces of bayberry bark":"bayberry","ginseng roots":"ginseng","ginger roots":"ginger","bellwort flowers":"bellwort","lobelia seeds":"lobelia","hawthorn berries":"hawthorn","valerian leaves":"valerian","skullcap flowers":"skullcap","slippery elms":"elm","kola nuts":"kola","sileris berries":"sileris","pieces of irid moss":"moss","cohosh roots":"cohosh","prickly pears":"pear","myrrh gums":"myrrh","echinacea roots":"echinacea"},N={antimony:"ginger",argentum:"lobelia",arsenic:"bayberry",aurum:"kelp",bisemutum:"myrrh",calamine:"hawthorn",calcite:"pear",cinnabar:"elm",cuprum:"bellwort",dolomite:"echinacea",ferrum:"ginseng",gypsum:"cohosh",magnesium:"bloodroot",malachite:"skullcap",plumbum:"goldenseal",potash:"moss",quartz:"kola",quicksilver:"sileris",realgar:"valerian",stannum:"ash"},j={ash:"stannum",bayberry:"arsenic",bellwort:"cuprum",bloodroot:"magnesium",cohosh:"gypsum",echinacea:"dolomite",elm:"cinnabar",ginseng:"ferrum",ginger:"antimony",goldenseal:"plumbum",hawthorn:"calamine",kelp:"aurum",kola:"quartz",lobelia:"argentum",moss:"potash",myrrh:"bisemutum",pear:"calcite",sileris:"quicksilver",skullcap:"malachite",valerian:"realgar"},I={azurite:0,bisemutum:0,magnesium:0,plumbum:0,arsenic:0,potash:0,stannum:0,malachite:0,realgar:0,cinnabar:0,antimony:0,ferrum:0,quartz:0,quicksilver:0,aurum:0,calamine:0,cuprum:0,argentum:0,gypsum:0,calcite:0,dolomite:0,ginseng:0,bloodroot:0,kelp:0,hawthorn:0,lobelia:0,bellwort:0,ginger:0,bayberry:0,ash:0,goldenseal:0,moss:0,valerian:0,elm:0,skullcap:0,sileris:0,kola:0,cohosh:0,pear:0,myrrh:0,echinacea:0},escapeRegExp$1=e=>String(e||"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),buildAlternation=(e=[])=>e.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean).map(escapeRegExp$1).join("|"),exactEntry=(e,t,a,n)=>({name:e,text:t,have:a,reason:n}),regexEntry=(e,t,a,n)=>({name:e,regex:t,have:a,reason:n}),dynamicReasonEntry=(e,t,a,n)=>({name:e,regex:t,have:a,resolveReason:n}),dynamicPayloadEntry=(e,t,a)=>({name:e,regex:t,resolvePayload:a}),L=[...O,...M].filter(e=>"some irid moss"!==e&&"a potash crystal"!==e),q=new RegExp(`^You eat (?<item>${buildAlternation(L)})\\.$`),B=/^Balance used: (?<duration>\d+\.\d{1,2})s\.$/,$=/^Equilibrium used: (?<duration>\d+\.\d{1,2})s\.$/,normalizeConsumedHerb=e=>{const t=String(e||"").trim().toLowerCase();return R[t]||t},parseObservedDurationSeconds=(e={})=>Number.parseFloat(String(e.duration||"")),z=[{id:"balance",entries:[exactEntry("ready","You have recovered balance on all limbs.",!0,"ready"),dynamicPayloadEntry("used",B,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"equilibrium",entries:[exactEntry("ready","You have recovered equilibrium.",!0,"ready"),dynamicPayloadEntry("used",$,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"herb",entries:[exactEntry("ready","You may eat another plant or mineral.",!0,"ready"),dynamicReasonEntry("use",q,!1,e=>normalizeConsumedHerb(e?.item))]},{id:"focus",entries:[exactEntry("ready","Your mind is able to focus once again.",!0,"ready"),exactEntry("use","You focus your mind intently on curing your mental maladies.",!1,"focus"),regexEntry("shriek",/^A diminutive homunculus resembling \w+ turns its head towards you, its jaws opening wider than what seems possible\. The homunculus stares intently at you and lets out an ear-piercing shriek that disrupts your thoughts\.$/,!1,"shriek"),regexEntry("concussion",/^(?:The blow sets your head to spinning - you cannot concentrate on anything\.|\w+ swings (?:his|her) shield around, smashing your temple with a backhanded blow\.)$/,!1,"concussion"),exactEntry("failed","You concentrate, but your mind is too tired to focus.",!1,"failed")]},{id:"sip",entries:[exactEntry("ready","You may drink another health or mana elixir.",!0,"ready"),exactEntry("health","The elixir heals and soothes you.",!1,"health"),exactEntry("mana","Your mind feels stronger and more alert.",!1,"mana"),regexEntry("apply",/^You take some elixir from .+ and rub it into your .+\.$/,!1,"apply"),exactEntry("failed-elixir","The elixir flows down your throat without effect.",!1,"failed"),exactEntry("failed-health-elixir","The health elixir fizzles away without any discernable effect.",!1,"failed")]},{id:"moss",entries:[exactEntry("ready","You may eat another bit of irid moss or potash.",!0,"ready"),exactEntry("use","You feel your health and mana replenished.",!1,"consume"),exactEntry("failed","The potash slides down without effect.",!1,"failed")]},{id:"tree",entries:[exactEntry("ready","You may utilise the tree tattoo again.",!0,"ready"),exactEntry("use","You touch the tree of life tattoo.",!1,"touch"),exactEntry("failed","Your tree of life tattoo glows faintly for a moment then fades, leaving you unchanged.",!1,"failed")]},{id:"salve",entries:[exactEntry("ready","You may apply another salve to yourself.",!0,"ready"),exactEntry("failed","The salve dissolves and quickly disappears after you apply it.",!1,"failed"),regexEntry("restoration",/^\[Curing\]: APPLY RESTORATION TO \w+$/,!1,"restoration"),regexEntry("apply",/^(?:\[Curing\]: APPLY (?:MENDING|EPIDERMAL|CALORIC).*$|You take out some salve and quickly rub it on your(?:\s\w+)+\.)$/,!1,"apply")]},{id:"immunity",entries:[exactEntry("ready","Your system is able to absorb antidotes once again.",!0,"ready"),exactEntry("failed","The liquid reacts with the substance still present in your system, cancelling itself out.",!1,"failed"),exactEntry("use","[Curing]: SIP IMMUNITY",!1,"immunity")]},{id:"rebounding",entries:[exactEntry("aura","You feel an aura of rebounding surround you.",!0,"aura"),exactEntry("discharged","Your aura of weapons rebounding disappears.",!0,"discharged"),exactEntry("already-on","You puff on the pipe, but your existing aura of weapons rebounding negates any effect.",!0,"already-on"),exactEntry("malachite","You take a long drag of malachite off your pipe.",!1,"malachite"),exactEntry("malachite-no-period","You take a long drag of malachite off your pipe",!1,"malachite"),exactEntry("skullcap","You take a long drag of skullcap off your pipe.",!1,"skullcap")]},{id:"smoke",entries:[exactEntry("ready","Your lungs have recovered enough to smoke another mineral or plant.",!0,"ready"),exactEntry("failed","Your lungs have not yet recovered enough to allow you to smoke.",!1,"failed"),regexEntry("use",/^You take a long drag of/,!1,"smoke")]},{id:"dragonbreath",entries:[regexEntry("ready",/^Your \w+ summoning is complete\.$/,!0,"ready"),exactEntry("failed","You already have your breath summoned, Wyrm.",!1,"failed"),exactEntry("lightning","You feel your eyes begin to blaze as you summon lightning to your belly.",!1,"lightning"),exactEntry("fire","With an almost inaudible growl, you begin summoning a fiery inferno into your belly.",!1,"fire"),exactEntry("acid","With a great effort, you begin to summon caustic hell to your innards.",!1,"acid"),exactEntry("cold","Flaring your wings and head back, you begin summoning forth the icy cold of the pure, endless void into your belly.",!1,"cold"),exactEntry("venom","With a great shudder, you begin to summon forth the defiling, deadly wyrmvenom of legend.",!1,"venom"),exactEntry("psi","Calling upon the vast well of mental power at your disposal, you begin to summon a mind-rending blast of psi energy.",!1,"psi")]},{id:"deafness",entries:[exactEntry("ready","The aural world fades to silence.",!0,"ready"),exactEntry("calamine","You eat a calamine crystal.",!1,"calamine"),exactEntry("hawthorn","You eat a hawthorn berry.",!1,"hawthorn")]},{id:"deaf",entries:[exactEntry("already-on","You are already deaf.",!0,"already-on"),exactEntry("trance","The world about you falls silent as the deafness trance sinks upon you.",!0,"trance"),exactEntry("use","You stare straight ahead and concentrate on a distant focal point.",!1,"deaf")]},{id:"blind",entries:[exactEntry("already-on","You are already blind.",!0,"already-on"),exactEntry("ready","You open your eyes once more, and the world about you is darkness.",!0,"ready"),exactEntry("use","You close your eyes for a moment.",!1,"blind")]},{id:"speed",entries:[exactEntry("ready","Tiny tremours spread through your body as the world seems to slow down.",!0,"ready"),exactEntry("use","[Curing]: SIP SPEED",!1,"speed")]},{id:"sileris",entries:[exactEntry("quicksilver-ready","The quicksilver hardens into a supple metallic shell.",!0,"quicksilver"),exactEntry("berry-ready","The sileris berry juice hardens into a supple purple shell.",!0,"sileris"),exactEntry("quicksilver-use","You apply a quicksilver droplet to yourself.",!1,"quicksilver"),exactEntry("berry-use","You apply a sileris berry to yourself.",!1,"sileris")]},{id:"voice",entries:[exactEntry("ready","You have recovered voice balance.",!0,"ready")]},{id:"tremolo",entries:[exactEntry("ready","You may mangle a limb with the vibrato or tremolo once again.",!0,"ready"),regexEntry("arm-use",/^With a trilling vibrato you attack \w+'s broken (?:left|right) arm\. (?:He|She) screams in pain\.$/,!1,"arm"),regexEntry("leg-use",/^Using a heavy tremolo you brutally punish \w+'s already shattered (?:left|right) leg\.$/,!1,"leg")]},{id:"homunculus",entries:[exactEntry("ready","You may order your homunculus once more.",!0,"ready"),exactEntry("failed","You are unable to order your homunculus again so soon.",!1,"failed"),regexEntry("use",/^Focusing your mind on a diminutive homunculus resembling (?:\w+), you command it to disrupt (?:\w+)'s focus\. The homunculus turns towards (?:him|her) before letting out an ear-piercing shriek\.$/,!1,"shriek")]},{id:"fitness",entries:[exactEntry("ready","You may purge your lungs once again.",!0,"ready"),exactEntry("use","You inhale deeply, purging yourself of your asthmatic condition.",!1,"fitness"),exactEntry("failed","You may not purge your lungs again as of this time.",!1,"failed")]},{id:"bloodboil",entries:[exactEntry("ready","You may boil your blood once again.",!0,"ready"),exactEntry("use","You summon spirits of fire to burn off that which afflicts you.",!1,"bloodboil"),exactEntry("failed","You have not recovered enough to boil your blood again as of yet.",!1,"failed")]},{id:"dragonheal",entries:[exactEntry("ready","You may purge your great form of afflictions once again.",!0,"ready"),exactEntry("use","You let out a great keening, and cast the impurities from your form.",!1,"dragonheal"),exactEntry("failed-recovery","You have not yet recovered enough to purge your great form of afflictions.",!1,"failed"),exactEntry("failed-disjointed","Your mind and body are too disjointed to invoke your healing powers, wyrm.",!1,"failed")]},{id:"rage",entries:[exactEntry("ready","You may channel your rage to cure your afflictions once again.",!0,"ready"),exactEntry("use","You allow your pent-up rage to vent and your eyes flash dangerously.",!1,"rage")]},{id:"salt",entries:[exactEntry("use","Directing the energy of salt, you surround yourself with a primal aura, purging yourself of ailments.",!1,"salt"),exactEntry("ready","You may channel alchemical energy to heal yourself once again.",!0,"ready"),exactEntry("failed","You have not recovered enough to heal yourself with alchemical energy once again.",!1,"failed")]},{id:"shrugging",entries:[exactEntry("ready","Your body has recovered enough to shrug afflictions once again.",!0,"ready"),exactEntry("use","Focusing inward, you purge your body of afflictions.",!1,"shrugging"),exactEntry("failed","You may not shrug again so soon.",!1,"failed")]},{id:"fool",entries:[exactEntry("ready","You may heal another affliction.",!0,"ready"),exactEntry("use","You press the Fool tarot to your forehead.",!1,"fool"),exactEntry("failed","The Fool has no effect on you.",!1,"failed")]},{id:"writhe",entries:[regexEntry("free",/^You have writhed free\b/,!0,"ready"),exactEntry("no-affliction","You begin to writhe helplessly, throwing your body off balance.",!0,"no-affliction"),exactEntry("entangled","You begin to struggle free of your entanglement.",!1,"entangled"),exactEntry("transfixation","You begin trying to wrest your mind free of that which has transfixed it.",!1,"transfixation"),exactEntry("failed-entangled","You twist and turn as you attempt to escape from your entanglement.",!1,"failed"),exactEntry("failed-transfixation","You continue trying to wrest your mind free.",!1,"failed")]},{id:"impalewrithe",entries:[exactEntry("free-direct","With an heroic effort you manage to writhe yourself free from the weapon that impaled you.",!0,"impale"),exactEntry("use","You begin to writhe furiously to escape the blade that has impaled you.",!1,"impale"),regexEntry("free-swathe",/^With a vicious snarl \w+ carves a merciless swathe through your steaming guts\. You gurgle and choke as s?he withdraws (?:his|her) dripping blade, glistening with gore\.$/,!0,"impale"),regexEntry("free-wrench",/^Searing pain tears through your midsection as you wrench away from [A-Z][a-z]+, (?:his|her) weapon ripping unceremoniously through your innards\.$/,!0,"impale"),regexEntry("free-slide",/^With a snarl of contempt, \w+ allows you to slide free of (?:her|his) weapon\.$/,!0,"impale")]},{id:"alleviate",entries:[exactEntry("ready","You may purge your body of afflictions once again.",!0,"ready"),exactEntry("use","Applying your knowledge of anatomy, you massage pressure points with your fingers, and a flood of relief courses through your body.",!1,"alleviate"),exactEntry("no-afflictions","There are no pesky afflictions keeping you from your destiny, Warrior.",!1,"no-afflictions"),exactEntry("failed","You are too exhausted to purge your body of afflictions.",!1,"failed")]},{id:"slough",entries:[exactEntry("use","You allow your outer layers to slough away, their fires extinguished along with the impurities contaminating them.",!1,"slough"),exactEntry("ready","You may slough off the impurities that plague you once again.",!0,"ready"),exactEntry("failed","You may not slough off the impurities again quite yet.",!1,"failed")]}],createBalanceTextTriggers=()=>({group:"balance/text",triggers:createBalanceTextTriggersFromFamilies(z)}),parsePositiveInteger=(e,t=1)=>{const a=Number.parseInt(String(e??""),10);return Number.isFinite(a)&&a>0?a:t},cleanItemText=e=>String(e||"").trim(),emitInventoryDelta=({emit:e,item:t,delta:a,source:n="text-trigger"})=>{e("CacheInventoryDeltaTextEvent",{item:cleanItemText(t),delta:a,source:n})},createCacheTextTriggers=()=>({group:"cache/text",triggers:[{name:"rift-out",regex:/^You remove (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftOutTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),source:"text-trigger"})}},{name:"curative-consume",regex:/^You eat (?<item>.+?)\.$/,action:({args:e,emit:t})=>{t("CacheCurativeConsumedTextEvent",{item:cleanItemText((e?.groups||{}).item),amount:1,source:"text-trigger"})}},{name:"rift-in",regex:/^You store (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)(?<capacityMarker>, which is the maximum for that type of object)?\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftInTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),atCapacity:Boolean(a.capacityMarker),source:"text-trigger"})}},{name:"rift-full",regex:"You may not store any more of that type of thing.",action:({emit:e})=>{e("CacheRiftFullTextEvent",{source:"text-trigger"})}},{name:"inventory-empty",regex:/^You have no (?<item>.+?) in your inventory\.$/,action:({args:e,emit:t})=>{t("CacheInventoryEmptyTextEvent",{item:cleanItemText((e?.groups||{}).item),source:"text-trigger"})}},{name:"give-away",regex:/^You give (?<item>.+?) to .+\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}},{name:"receive",regex:/^.+ gives (?<item>.+?) to you\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:1})}},{name:"drop",regex:/^You drop (?<item>.+?)\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}}]}),shiftTrigger=(e,t)=>({name:e,regex:t,action:({emit:t})=>{t("AvoidPostureShiftedTextEvent",{type:e})}}),observedTrigger=(e,t)=>({name:`already-${e}`,regex:t,action:({emit:t})=>{t("AvoidPostureObservedTextEvent",{type:e,reason:"already-active"})}}),createAvoidPostureTriggers=()=>({group:"defense/avoidPosture",triggers:[shiftTrigger("physical",/^You prepare yourself to avoid the brunt of physical attacks\.$/),shiftTrigger("aoe",/^You prepare yourself to avoid the brunt of area of effect attacks\.$/),shiftTrigger("mental",/^You prepare yourself to avoid the brunt of mental based attacks\.$/),shiftTrigger("arcane",/^You prepare yourself to avoid the brunt of arcane based attacks\.$/),observedTrigger("physical",/^You are already attempting to avoid the brunt of physical attacks\.$/),observedTrigger("aoe",/^You are already attempting to avoid the brunt of area of effect attacks\.$/),observedTrigger("mental",/^You are already attempting to avoid the brunt of mental based attacks\.$/),observedTrigger("arcane",/^You are already attempting to avoid the brunt of arcane based attacks\.$/),{name:"recovered",regex:/^You may once more shift your defensive posture\.$/,action:({emit:e})=>{e("AvoidPostureRecoveredTextEvent",{})}},{name:"blocked",regex:/^You have too recently shifted your defensive posture to do so again\.$/,action:({emit:e})=>{e("AvoidPostureBlockedTextEvent",{})}}]}),normalizeTextValue=e=>String(e||"").trim(),parseDelimitedEntries=e=>String(e||"").split(/[|,]/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),parseSpaceDelimitedEntries=e=>String(e||"").replace(/\s+\((\d+)\)/g,"($1)").trim().split(/\s+/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),buildLimbPayload=({args:e,client:t,source:a="text-trigger"})=>({limb:normalizeTextValue(e.groups?.limb),raw:normalizeTextValue(t?.current_line?.line),source:a}),F=String.raw`, you perceive that \w+ has dealt (?<amount>[\d.]+)% damage to your (?<limb>.+)\.$`,damageTrigger=(e,t)=>({name:e,regex:new RegExp(`^${t}${F}`),action:({args:e,client:t,emit:a})=>{a("LimbDamageTextEvent",{...buildLimbPayload({args:e,client:t}),amount:Number(e.groups?.amount)})}}),createLimbTextTriggers=()=>({group:"limb/selfDamage",triggers:[damageTrigger("carve-hit",String.raw`As .+? carves into you`),damageTrigger("crunch-hit",String.raw`As .+?'s? blow crunches into you`),{name:"pain-subsides",regex:/^The pain plaguing your (?<limb>.+) subsides\.$/,action:({args:e,client:t,emit:a})=>{a("LimbResetTextEvent",buildLimbPayload({args:e,client:t}))}}]}),normalizeTag=e=>String(e||"").trim().toLowerCase(),normalizeCommandSeparator=e=>String(e??"").trim(),toNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toOptionalBooleanFromYesNo=e=>{if(null==e||""===e)return;if("boolean"==typeof e)return e;if("number"==typeof e)return 0!==e;const t=String(e).trim().toLowerCase();return!!["yes","1","true","on"].includes(t)||!["no","0","false","off"].includes(t)&&void 0},boolWord=e=>e?"on":"off",nowMs=()=>Date.now(),G={classQueue:{name:"class",type:"c!p!t!w",pre:["touch soul","stand"],post:[],exclusions:[]},freeQueue:{name:"free",type:"free",pre:["touch soul","stand"],post:[],exclusions:["fullQueue","shieldQueue","bloodcloakQueue"]},fullQueue:{name:"full",type:"ebc!w!p!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","shieldQueue","bloodcloakQueue"]},shieldQueue:{name:"shield",type:"eb!w!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","fullQueue","bloodcloakQueue"]},shipQueue:{name:"ship",type:"s!w!t",pre:["touch soul","stand"],post:[],exclusions:[]},bloodcloakQueue:{name:"bloodcloak",type:"!teb",pre:["touch soul"],post:[],exclusions:["fullQueue","freeQueue","shieldQueue"]},battlerageQueue:{name:"battlerage",type:"!p!t!wu",pre:["touch soul"],post:[],exclusions:[]},stunQueue:{name:"stun",type:"!t",pre:["touch soul"],post:[],exclusions:[]}},escapeRegExp=e=>String(e).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),normalizeTriggerName=e=>String(e||"").replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,""),resolveSeparator=e=>normalizeCommandSeparator(e?.())||"|",splitCommands=(e,t)=>String(e||"").split(String(t||"|")||"|").map(e=>e.trim()).filter(Boolean),createQueueSentTrigger=([e,t],a)=>({name:`sent-${normalizeTriggerName(e)}`,regex:new RegExp(`^\\[System\\]: Added (?<commands>.+) to your ${escapeRegExp(t.type)} queue\\.$`),action:({args:n,client:s,emit:i})=>{const o=resolveSeparator(a),l=normalizeTextValue(n.groups?.commands);i("QueueSentTextEvent",{raw:normalizeTextValue(s?.current_line?.line),queueId:e,queueName:t.name,queueType:t.type,rawCommands:l,commands:splitCommands(l,o),separator:o,source:"text-trigger"})}}),createQueueTextTriggers=({getCommandSeparator:e}={})=>({group:"queue/text",triggers:Object.entries(G).map(t=>createQueueSentTrigger(t,e))}),createAffPrioritySnapshotTriggers=()=>({group:"serverside/affPrioritySnapshot",session:{name:"affPriorities",completionEvent:"ServersideAffPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"aff-priority-header",regex:/^Your affliction curing priorities(?::| for the priority set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideAffPrioSnapshotOpenTextEvent",{topic:"affPriorities",reason:"aff-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<prio>\d+):\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{const a=parseSpaceDelimitedEntries(e.groups.entries);return!!a.length&&(a.forEach(a=>{t("ServersideAffPrioTextEvent",{aff:a,prio:Number(e.groups.prio)})}),!0)}},{name:"close",closer:!0,closeReason:"aff-priority-terminal-line",regex:"Affs with priority 26 are ignored."}]}),createCuringSetSnapshotTriggers=()=>{let e=[],t="";const reset=()=>{e=[],t=""};return{group:"serverside/curingSetSnapshot",session:{name:"curingSets",completionEvent:"ServersideCuringSetSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"curingset-list-header",regex:"Your current curing sets",action:()=>{reset()}},{name:"set-line",regex:/^(?!-+$)(?<name>\S+)(?<current> \(current\))?$/,action:({args:a})=>{const n=String(a.groups?.name||"").trim();return!!n&&(e.push(n),a.groups?.current&&(t=n),!0)}},{name:"close",closer:!0,closeReason:"curingset-total-line",regex:/^You are using a total of (?<used>\d+) of your allowed (?<limit>\d+) curing sets\.$/,action:({args:a,emit:n})=>{n("ServersideCuringSetsTextEvent",{sets:[...e],activeSet:t,used:Number(a.groups.used),limit:Number(a.groups.limit)})}},{name:"empty",opener:!0,closer:!0,openReason:"curingset-empty-header",closeReason:"curingset-empty-line",regex:/^You have no sets defined/,action:({emit:e})=>{reset(),e("ServersideCuringSetsTextEvent",{sets:[],activeSet:"",used:0})}}]}},createCuringSetSwitchTriggers=()=>({group:"serverside/curingSetSwitch",triggers:[{name:"switched",regex:/^You will now cure using the (?<set>\S+) set\.$/,action:({args:e,emit:t})=>{t("ServersideCuringSetSwitchedTextEvent",{set:e.groups?.set||""})}}]}),createDefPrioritySnapshotTriggers=()=>({group:"serverside/defPrioritySnapshot",session:{name:"defPriorities",completionEvent:"ServersideDefPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"def-priority-header",regex:/^Your defence priorities(?::| for curing set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioSnapshotOpenTextEvent",{topic:"defPriorities",reason:"def-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<def>\w+)\s*: (?<prio>\d+)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio)})}}]}),createLivePriorityConfirmationTriggers=()=>({group:"serverside/livePriorityConfirmations",triggers:[{name:"aff-set",regex:/^You have set the '(?<aff>[^']+)' affliction to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideAffPrioTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}},{name:"def-set",regex:/^You have set the '(?<def>\w+)' defence to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}}]}),createLivePredictionConfirmationTriggers=()=>({group:"serverside/livePredictionConfirmations",triggers:[{name:"added",regex:/^You have added the (?<aff>\w+) affliction to your predicted afflictions list\.$/,action:({args:e,emit:t})=>{t("ServersidePredictionConfirmTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),status:"added",source:"live-confirmation"})}},{name:"already",regex:"You have already predicted that you have that affliction.",action:({emit:e})=>{e("ServersidePredictionConfirmTextEvent",{aff:"",status:"already",source:"live-confirmation"})}}]}),emitStatus$1=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},createLiveStatusConfirmationTriggers=()=>({group:"serverside/liveStatusConfirmations",triggers:[{name:"enabled",regex:/^Curing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"enabled",/^activated$/.test(e.groups.value))}},{name:"transmutation-on",regex:"You will now use transmutation cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!0)}},{name:"transmutation-off",regex:"You will now use concoction-based cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!1)}},{name:"sip-priority",regex:/^Curing will now prioritise (?<value>mana|health) over (?<other>mana|health)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-threshold",regex:/^(?<kind>Health|Mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"sipHealthAt":"sipManaAt",Number(e.groups.value))}},{name:"moss-threshold",regex:/^Moss (?<kind>health|mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"mossHealthAt":"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Automatic usage of focusing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focus",/^activated$/.test(e.groups.value))}},{name:"focus-over-herbs",regex:/^You will now prioritise (?<value>focus|herbs) over (?<other>focus|herbs)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focusOverHerbs",/^focus$/.test(e.groups.value))}},{name:"focus-affliction",regex:/^You will (?<mode>now|no longer) focus while afflicted by (?<affliction>guilt|fulminated)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"guilt"===e.groups.affliction?"focusWithGuilt":"focusWithFulminated","now"===e.groups.mode)}},{name:"tree",regex:/^Automatic usage of the tree tattoo (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"tree",/^activated$/.test(e.groups.value)?"on":"off")}},{name:"clot-on",regex:"You will now attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!0)}},{name:"clot-off",regex:"You will no longer attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!1)}},{name:"clot-at",regex:/^Will clot above (?<value>\d+) bleeding\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAt",Number(e.groups.value))}},{name:"clot-to",regex:/^Will clot down to (?:the default value of )?(?<value>\d+) bleeding\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotTo",Number(e.groups.value))}},{name:"insomnia-on",regex:"You will now use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!0)}},{name:"insomnia-off",regex:"You will now not use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!1)}},{name:"fractures-above",regex:/^Will cure health based afflictions above (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^You will now use mana if above (?<value>\d+)% of your maximum mana reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"manaThreshold",Number(e.groups.value))}},{name:"batch-on",regex:"You will now attempt to cure multiple things at once.",action:({emit:e})=>{emitStatus$1(e,"batch",!0)}},{name:"batch-off",regex:"You will now cure one thing at a time.",action:({emit:e})=>{emitStatus$1(e,"batch",!1)}},{name:"clot-above",regex:/^You will now use corrupted clotting if above (?<value>\d+)% of your maximum health reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAbove",Number(e.groups.value))}}]}),createQueuePredictionTriggers=()=>({group:"serverside/queuePrediction",triggers:[{name:"queue-line",regex:/^CURING QUEUE(?:\s+LIST)?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersideQueueListTextEvent",{queue:parseDelimitedEntries(e.groups.entries)})}},{name:"predictions-line",regex:/^CURING PREDICTIONS?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersidePredictionsTextEvent",{predictions:parseDelimitedEntries(e.groups.entries).reduce((e,t)=>(e[t]=!0,e),{})})}}]}),emitStatus=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},isYes=e=>"Yes"===e,createStatusSnapshotTriggers=()=>({group:"serverside/statusSnapshot",session:{name:"status",completionEvent:"ServersideStatusSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"status-header",regex:"Curing Status:"},{name:"enabled",regex:/^Enabled:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"enabled",isYes(e.groups.value))}},{name:"reporting",regex:/^Reporting commands:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"reporting",isYes(e.groups.value))}},{name:"sipping",regex:/^Sipping:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipping",isYes(e.groups.value))}},{name:"afflictions",regex:/^Affliction Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"afflictions",isYes(e.groups.value))}},{name:"defences",regex:/^Defence Upkeep:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"defences",isYes(e.groups.value))}},{name:"transmutation",regex:/^Curing Method:\s+(?<value>\w+)$/,action:({args:e,emit:t})=>{emitStatus(t,"transmutation","transmutation"===String(e.groups.value||"").toLowerCase())}},{name:"fallback",regex:/^Fallback Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"fallback",isYes(e.groups.value))}},{name:"custom-aff-priority",regex:/^Custom Curing Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customAffPriority",isYes(e.groups.value))}},{name:"custom-def-priority",regex:/^Custom Defence Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customDefPriority",isYes(e.groups.value))}},{name:"sip-priority",regex:/^Health\/Mana Priority:\s+(?<value>Health|Mana)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-health-at",regex:/^Sip health at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipHealthAt",Number(e.groups.value))}},{name:"sip-mana-at",regex:/^Sip mana at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipManaAt",Number(e.groups.value))}},{name:"moss-health-at",regex:/^Eat moss below health:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossHealthAt",Number(e.groups.value))}},{name:"moss-mana-at",regex:/^Eat moss below mana:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Use focus:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focus",isYes(e.groups.value))}},{name:"focus-over-herbs",regex:/^Focus over herbs:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focusOverHerbs",isYes(e.groups.value))}},{name:"clot",regex:/^Use clot:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"clot",isYes(e.groups.value))}},{name:"tree",regex:/^Use tree:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"tree",isYes(e.groups.value)?"on":"off")}},{name:"clot-at",regex:/^Clot at:\s+(?<value>\d+) bleeding$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAt",Number(e.groups.value))}},{name:"clot-to",regex:/^Clot to:\s+(?<value>\d+) bleeding$/,action:({args:e,emit:t})=>{emitStatus(t,"clotTo",Number(e.groups.value))}},{name:"insomnia",regex:/^Use insomnia:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"insomnia",isYes(e.groups.value))}},{name:"fractures-above",regex:/^Will cure fractures above:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^Will use mana above:\s+(?<value>\d+)% mana$/,action:({args:e,emit:t})=>{emitStatus(t,"manaThreshold",Number(e.groups.value))}},{name:"clot-health",regex:/^Will clot health until:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAbove",Number(e.groups.value))}},{name:"batch",regex:/^Batch actions:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"batch",isYes(e.groups.value))}},{name:"kaido-transmute",closer:!0,closeReason:"status-terminal-line",regex:/^Use Kaido Transmute:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"kaidoTransmute",isYes(e.groups.value))}}]}),H="transcendence",buildResourcePayload=({client:e,value:t})=>({key:H,value:t,min:0,max:100,source:"text-trigger",raw:normalizeTextValue(e?.current_line?.line)}),createCharacterResourceTriggers=()=>({group:"system/characterResource",triggers:[{name:"transcendence-progress",regex:/^Your body and mind continue to harmonise: you are (?<value>\d+) percent of the way to full transcendence\.$/,action:({args:e,client:t,emit:a})=>{a("CharacterResourceTextEvent",buildResourcePayload({client:t,value:Number(e.groups?.value)}))}},{name:"transcendence-achieved",regex:"You have achieved transcendence: your body and mind operate as one.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:100}))}},{name:"transcendence-harmony-lost",regex:"Your body and mind are no longer in harmony.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}},{name:"transcendence-fallen",regex:"Your body and mind fall out of their transcendent state.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}}]}),createSystemEventTriggers=()=>({group:"system/systemEvent",triggers:[{name:"line",regex:/^SystemEvent (?<eventName>.+)$/,action:({args:e,client:t,emit:a})=>{const n=normalizeTextValue(e.groups?.eventName);if(!n)return;const s=normalizeTextValue(t?.current_line?.line);a(n,{raw:s});const i=n.match(/^(?<queueName>[A-Za-z]+)QueueFired$/);i?.groups?.queueName&&a("QueueFiredTextEvent",{raw:s,queueName:i.groups.queueName})}},{name:"all-queues-cleared",regex:"[System]: All queued commands cleared.",action:({client:e,emit:t})=>{t("AllQueuesClearedTextEvent",{raw:normalizeTextValue(e?.current_line?.line)})}}]}),createSeparatorChangedTrigger=()=>({group:"system/separatorChanged",triggers:[{name:"separator-changed",regex:/^Your command separator is now:\s*(?<sep>\S+)\s*$/,action:({args:e,emit:t})=>{const a=String(e.groups?.sep||"").trim();a&&t("CommandSeparatorChangedTextEvent",{separator:a})}}]}),U=Object.freeze([Object.freeze({type:"icewall",pattern:/An icewall is here, blocking passage to the (?<direction>[a-z]+)\./g}),Object.freeze({type:"stonewall",pattern:/A large wall of stone stands here, blocking passage to the (?<direction>[a-z]+)\./g})]),V=/The ground is slick with ice\./,normalizeText=e=>String(e??"").replace(/\s+/g," ").trim(),readText=e=>"function"==typeof e?.parsed_line?.text?e.parsed_line.text():null,raw=e=>String(e?.line??""),Y=/<RNum\s+(\d+)\b/,roomNumber=e=>{const t=raw(e);return t.includes("<RName")?normalizeRoomId(t.match(Y)?.[1]):null},readRoomDisplay=({block:e,room:t}={})=>{const a=normalizeRoomId(t?.id);if(null===a||!Array.isArray(e))return null;const n=[];if(e.forEach((e,t)=>{roomNumber(e)===a&&n.push(t)}),!n.length)return null;const s=n.at(-1)+1;let i=s;for(;i<e.length&&!/<R(?:Exits|Name)\b/.test(raw(e[i]));)i+=1;const o=i<e.length&&raw(e[i]).includes("<RExits"),l=e.slice(s,i<e.length?i:s+1).map(readText),c=normalizeText(l.filter(e=>null!==e).join(" ")),u=normalizeText(t?.description),d=o&&1===n.length&&l.length>0&&l.every(e=>"string"==typeof e)&&Boolean(u)&&c.includes(u);return{roomId:a,complete:d,walls:U.flatMap(({type:e,pattern:t})=>[...c.matchAll(t)].map(t=>({type:e,direction:t.groups.direction}))),frozenGround:!!V.test(c)||!d&&null}},createRoomDisplayTriggers=({getGMCP:e=()=>null}={})=>({group:"room/display",session:{name:"roomDisplay",openEvents:[{event:"GmcpEvent",when:e=>"Room.Info"===e?.tag,reason:"room-info"}],fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"}]},triggers:[{name:"scan",closer:!0,regex:/^/,action:({client:t,emit:a,pushTrace:n})=>{const s=e()?.Room?.Info,i=readRoomDisplay({block:t?.current_block,room:{id:s?.num??null,description:String(s?.desc??"")}});if(!i)return!1;for(const e of i.walls)normalizeRoomDirection(e.direction)||n("room:invalid-direction",e);a("RoomDisplayTextEvent",i)}}]}),Q=[createSystemEventTriggers,createSeparatorChangedTrigger,createCharacterResourceTriggers,createRoomDisplayTriggers,createRoomObserverTriggers,createBalanceTextTriggers,createCacheTextTriggers,createAvoidPostureTriggers,createLimbTextTriggers,createQueueTextTriggers,createStatusSnapshotTriggers,createAffPrioritySnapshotTriggers,createDefPrioritySnapshotTriggers,createCuringSetSnapshotTriggers,createCuringSetSwitchTriggers,createLiveStatusConfirmationTriggers,createLivePriorityConfirmationTriggers,createLivePredictionConfirmationTriggers,createQueuePredictionTriggers],createTriggerCatalog=(e={})=>Q.map(t=>t(e)),registerTextTriggers=({triggerApi:e,client:t,getCommandSeparator:a,getGMCP:n,roomObserverCatalog:s,emit:i,onLocalEvent:o,pushTrace:l,triggerIds:c,registerCleanup:u,registerTriggerGroupActivity:d,triggerSessions:m})=>{if(!e?.triggers?.add)return void l("register:nexAction:skipped",{reason:"trigger-api-unavailable"});const p="function"==typeof e.triggers.enable&&"function"==typeof e.triggers.disable,sessionToggleTag=e=>`session:${e}`,setSessionTriggers=(t,a)=>{if(!p)return;const n=sessionToggleTag(t);a?e.triggers.enable([n]):e.triggers.disable([n]),l(a?"session:enable":"session:disable",{session:t,tag:n})},resetSession=(e,t={})=>{const a=m[e];return!!a&&(a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"reset"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),l("session:reset",{session:e,...t}),!0)},beginSession=(e,t={})=>{const a=m[e];return!!a&&(setSessionTriggers(e,!0),a.active?(l("session:reopen",{session:e,...t}),!1):(a.active=!0,a.hasLines=!1,a.lastReason=String(t.reason||t.source||"begin"),a.lastOpenedAt=Date.now(),l("session:begin",{session:e,...t}),!0))},markSessionHasData=e=>{const t=m[e];t?.active&&!t.hasLines&&(t.hasLines=!0)},completeSession=(e,t={})=>{const a=m[e];if(!a?.active)return!1;const n=a.hasLines;return a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"complete"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),l("session:complete",{session:e,reason:a.lastReason,hadLines:n,completionEvent:t.completionEvent||""}),t.completionEvent&&i(t.completionEvent,{topic:e,reason:a.lastReason}),!0},registerTextTrigger=({id:a,group:n,regex:s,action:o,enabled:u=!0,tags:m=[],once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:k,onEnable:C})=>{e.triggers.add({id:a,regex:s,enabled:u,tags:m,once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:k,onEnable:C,action:e=>o({args:e,client:t,emit:i,pushTrace:l})}),c.push(a),d(n,"triggerCount"),l("register:nexAction",{id:a,group:n,enabled:u,regex:s instanceof RegExp?s.source:String(s)})};createTriggerCatalog({getCommandSeparator:a,getGMCP:n,roomObserverCatalog:s}).forEach(e=>{const t=e.session;t&&"function"==typeof o&&((t.openEvents||[]).forEach(({event:a,when:n,reason:s})=>{u(o(a,e=>{try{if(n&&!n(e))return}catch(i){throw l("session:open-error",{session:t.name,event:a,error:i}),i}beginSession(t.name,{reason:s,event:a})})),d(e.group,"hookCount")}),(t.resetEvents||[]).forEach(({event:a,reason:n})=>{u(o(a,()=>resetSession(t.name,{reason:n,event:a}))),d(e.group,"hookCount")}),(t.fallbackCloseEvents||[]).forEach(({event:a,reason:n})=>{u(o(a,()=>completeSession(t.name,{reason:n,completionEvent:t.completionEvent}))),d(e.group,"hookCount")})),e.triggers.forEach(a=>{const n=t?.name,s=Boolean(n&&!0===a.opener),i=Boolean(n&&!0===a.closer),o=["nexsys4","adapter","text",`group:${e.group}`],l=Boolean(n)&&!s,c=l?[sessionToggleTag(n)]:[],u=(!l||!p)&&(a.enabled??!0);registerTextTrigger({id:`nexsys4-${e.group.replace(/[\\/]+/g,"-")}-${a.name}`,group:e.group,regex:a.regex,enabled:u,tags:[...o,...c,...a.tags||[]],once:a.once,duration:a.duration,fg:a.fg,bg:a.bg,lines:a.lines,prompt:a.prompt,finalAction:a.finalAction,onRemove:a.onRemove,onDisable:a.onDisable,onEnable:a.onEnable,action:o=>{if(s)beginSession(n,{group:e.group,trigger:a.name,reason:a.openReason||"open"});else if(n&&!m[n]?.active)return;const l="function"==typeof a.action?a.action(o):void 0;return!n||s||i||!1===l||markSessionHasData(n),i&&completeSession(n,{reason:a.closeReason||"close",completionEvent:t.completionEvent}),l}})})})},W="",K="#c1bfff",X="#cf6dfc",J="#FFF2D7",Z=`<span style="color:${K}">[-</span><span style="color:${X}">nexSys</span><span style="color:${K}">-] </span>`,ee=Object.freeze({fg:J,bg:W}),te=Object.freeze({default:Object.freeze({default:Object.freeze({message:ee})}),affGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +aff ",fg:"orange",bg:W}),message:Object.freeze({fg:"green",bg:W})})}),affLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -aff ",fg:"orange",bg:W}),message:Object.freeze({fg:"red",bg:W})})}),defGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +def ",fg:"purple",bg:W}),message:Object.freeze({fg:"green",bg:W})})}),defLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -def ",fg:"purple",bg:W}),message:Object.freeze({fg:"red",bg:W})})}),balanceRecovered:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" onBal ",fg:"brown",bg:W}),message:Object.freeze({fg:"green",bg:W})})}),balanceLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" offBal ",fg:"brown",bg:W}),message:Object.freeze({fg:"red",bg:W})})}),trackableGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" + ",fg:"white",bg:W}),message:Object.freeze({fg:"green",bg:W})})}),trackableLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" - ",fg:"white",bg:W}),message:Object.freeze({fg:"red",bg:W})})}),priority:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:"priority change: ",fg:"yellow",bg:W}),message:Object.freeze({fg:"red",bg:W})})}),output:Object.freeze({default:Object.freeze({message:Object.freeze({fg:"red",bg:W})})})}),escapeHtml$1=e=>String(e||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),normalizeNoticeToken=(e,t="")=>String(e||t).trim().toLowerCase(),resolveNoticeStyle=(e={})=>{const t=String(e.category||"default").trim(),a=normalizeNoticeToken(e.action,"default"),n=te[t]||te.default;return n[a]||n.default||te.default.default},normalizeNoticePart=(e,t=ee)=>"string"==typeof e?{text:e,fg:t.fg,bg:t.bg}:{text:String(e?.text||""),fg:String(e?.fg??t.fg??ee.fg),bg:String(e?.bg??t.bg??ee.bg)},buildNoticeParts=(e,t={})=>{const a=resolveNoticeStyle(t),n=a.message||ee;if(Array.isArray(t.parts)&&t.parts.length)return t.parts.map(e=>normalizeNoticePart(e,n)).filter(e=>e.text);if(t.title)return[normalizeNoticePart({text:String(t.title),fg:t.titleFg??n.fg,bg:t.titleBg??n.bg},n),normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)].filter(e=>e.text);const s=[];return a.prefix?.text&&s.push(normalizeNoticePart(a.prefix,n)),s.push(normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)),s.filter(e=>e.text)},renderSpanStyle=e=>["white-space:pre-wrap",e.fg?`color:${escapeHtml$1(e.fg)}`:"",e.bg?`background-color:${escapeHtml$1(e.bg)}`:""].filter(Boolean).join(";"),renderNoticeHtml=(e,t={},a=[])=>`<span class="nexsys4-notice" style="white-space:pre-wrap;">${Z}${t.html?String(t.html):(a.length?a:buildNoticeParts(e,t)).map(e=>`<span style="${renderSpanStyle(e)}">${escapeHtml$1(e.text)}</span>`).join("")}</span>`,createNoticeTransport=({client:e,emit:t,pushTrace:a})=>({notice(n,s={}){const i=String(n),o=buildNoticeParts(i,s);e.add_html_line(renderNoticeHtml(i,s,o)),a("notice",{message:i,context:s,parts:o}),t("NoticeEvent",{message:i,context:s,parts:o})}}),createTriggerSessionState=()=>({active:!1,hasLines:!1,lastReason:"idle",lastOpenedAt:0,lastClosedAt:0}),createAdapterDebugState=({debug:e=!1,traceLimit:t=200,now:a=()=>Date.now(),logLabel:n="nexSys4.adapter"}={})=>{let s=Boolean(e);const i=Math.max(1,Number(t||200)),o=[],l=new Map,c={roomDisplay:createTriggerSessionState(),status:createTriggerSessionState(),affPriorities:createTriggerSessionState(),defPriorities:createTriggerSessionState(),curingSets:createTriggerSessionState()},pushTrace=(e,t={})=>{if(!s)return null;const l={at:a(),type:e,detail:t};return o.push(l),o.length>i&&o.splice(0,o.length-i),console.log(`[${n}] ${e}`,t),l};return{pushTrace,triggerSessions:c,registerTriggerGroupActivity:(e,t="triggerCount")=>{const a=String(e||"").trim();if(!a)return null;const n=l.get(a)||{name:a,triggerCount:0,hookCount:0};return n[t]=Number(n[t]||0)+1,l.set(a,n),n},setDebugEnabled(e){s=Boolean(e),pushTrace("debug",{enabled:s})},isDebugEnabled:()=>s,snapshotTriggerGroups:()=>[...l.values()].map(e=>({...e})).sort((e,t)=>e.name.localeCompare(t.name)),snapshotTriggerSessions:()=>Object.entries(c).reduce((e,[t,a])=>(e[t]={...a},e),{}),snapshotRecentTrace:()=>[...o]}},createAdapterEventHub=({pushTrace:e=()=>{},errorLabel:t="nexSys4 adapter listener failed"}={})=>{const a=new Map,normalizeEventName=e=>String(e||"").trim(),on=(t,n)=>{const s=normalizeEventName(t);if(!s||"function"!=typeof n)return()=>{};let i=a.get(s);return i||(i=new Set,a.set(s,i)),i.add(n),e("on",{event:s,listenerCount:i.size}),()=>off(s,n)},off=(t,n)=>{const s=normalizeEventName(t),i=a.get(s);if(!s||!i)return!1;const o=i.delete(n);return i.size||a.delete(s),e("off",{event:s,removed:o,listenerCount:i.size}),o};return{emit:(n,s)=>{const i=normalizeEventName(n),o=a.get(i);if(!i||!o?.size)return i&&e("emit",{event:i,listenerCount:0,payload:s}),0;const l=[...o];return e("emit",{event:i,listenerCount:l.length,payload:s}),l.forEach(e=>{if(a.get(i)?.has(e))try{e(s)}catch(n){console.error(t,{event:i,error:n})}}),l.length},on,off,clear(){a.clear()}}},createAdapterLifecycle=({eventBus:e,triggerApi:t,pushTrace:a=()=>{},clearListeners:n=()=>{}}={})=>{const s=[],i=[],o=[],destroy=()=>{const l=o.length,c=s.length,u=[...i];o.splice(0).forEach(e=>{try{e()}catch(t){console.error("nexSys4 adapter cleanup failed",{error:t})}}),e?.removeListener&&s.forEach(({eventName:t,id:a})=>{e.removeListener(t,a)}),t?.triggers?.remove&&i.forEach(e=>t.triggers.remove(e)),a("destroy",{eventRegistrations:c,triggerIds:u,internalCleanupCount:l}),n()};return{eventRegistrations:s,triggerIds:i,registerCleanup:e=>"function"==typeof e?(o.push(e),e):()=>{},destroy}},summarizePromptContext=(e={})=>({source:e.source||"",hasLine:Boolean(e.line)}),createAdapterPromptSink=({emit:e,pushTrace:t})=>{const renderPrompt=(a,n={})=>{const s=String(a??""),i=n?.line;return i?.parsed_line&&"object"==typeof i.parsed_line&&(i.parsed_line.formatted=()=>s),e("PromptRendered",{prompt:s,context:n}),t("renderPrompt",{promptLength:s.length,context:summarizePromptContext(n)}),s};return{renderPrompt}},normalizeOutboundCommands=e=>Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[],normalizeGmcpRequests=e=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],shouldPreventExpansion=e=>"boolean"==typeof e?e:Boolean(e?.preventExpansion),createAdapterTransport=({client:e,emit:t,pushTrace:a,resolveSeparator:n}={})=>({send(s=[],i={}){const o=normalizeOutboundCommands(s);if(!o.length)return[];const l=o.join(n()||"|");return e?.send_commands&&e.send_commands(l,shouldPreventExpansion(i)),a("send",{commands:o,payload:l,context:i}),t("OutboundCommandsEvent",{commands:o,payload:l,context:i}),o},sendGmcp(n=[],s={}){const i="function"==typeof e?.datahandler?e.datahandler():null;if("function"!=typeof i?.send_GMCP)return[];const o=normalizeGmcpRequests(n);if(!o.length)return[];const l=[];return o.forEach(e=>{try{i.send_GMCP(e),l.push(e)}catch(t){console.error("nexSys4 GMCP request failed",{request:e,error:t})}}),l.length&&(a("sendGmcp",{requests:l,context:s}),t("AdapterGmcpRequest",{requests:l,context:s})),l},getVariable(t){if(!e?.variables)return;const a=e.variables();return"function"==typeof a?.get?a.get(t):a?.vars?.[t]},setVariable(t,a){if(!e?.variables)return a;const n=e.variables();return"function"==typeof n?.set?(n.set(t,a),a):n?.vars?(n.vars[t]=a,a):a}}),createNexusAdapter=(e={})=>{const t=e.nexusclient||globalThis.nexusclient,monotonicNowMs=()=>globalThis.performance?.now?globalThis.performance.now():Date.now();let a=null;const resolveSeparator=()=>a||"",n=e.eventStream||globalThis.eventStream,s=e.nexAction||globalThis.nexAction,getGMCP=()=>e.GMCP||globalThis.GMCP,getNexSkills=()=>e.nexSkills||globalThis.nexSkills,{pushTrace:i,triggerSessions:o,registerTriggerGroupActivity:l,setDebugEnabled:c,isDebugEnabled:u,snapshotTriggerGroups:d,snapshotTriggerSessions:m,snapshotRecentTrace:p}=createAdapterDebugState({debug:e.debug,traceLimit:e.traceLimit}),{emit:g,on:h,off:b,clear:y}=createAdapterEventHub({pushTrace:i}),{eventRegistrations:v,triggerIds:S,registerCleanup:x,destroy:k}=createAdapterLifecycle({eventBus:n,triggerApi:s,pushTrace:i,clearListeners:y}),{send:C,sendGmcp:A,getVariable:E,setVariable:w}=createAdapterTransport({client:t,emit:g,pushTrace:i,resolveSeparator}),normalizeEventName=e=>String(e||"").trim(),{notice:_}=createNoticeTransport({client:t,emit:g,pushTrace:i}),{renderPrompt:T}=createAdapterPromptSink({emit:g,pushTrace:i}),emitLocal=(e,t)=>{const a=normalizeEventName(e);return!!a&&(g(a,t),i("emit:local",{event:a,payload:t}),!0)},raiseToEventStream=(e,t)=>{const a=normalizeEventName(e);return!(!a||!n?.raiseEvent)&&(n.raiseEvent(a,t),i("emit:eventstream",{topic:a,payload:t}),!0)};s?.triggers?.remove&&s.triggers.remove(["nexsys4"]),n?.removeByTag&&n.removeByTag(["nexsys4"]),registerEventStreamBindings({eventBus:n,emit:g,pushTrace:i,eventRegistrations:v}),registerSkillEventBindings({eventBus:n,emit:g,pushTrace:i,eventRegistrations:v,getNexSkills,triggerApi:s,roomObserverCatalog:e.roomObserverCatalog}),registerTextTriggers({triggerApi:s,client:t,getCommandSeparator:resolveSeparator,getGMCP,roomObserverCatalog:e.roomObserverCatalog,emit:g,onLocalEvent:h,pushTrace:i,triggerIds:S,registerCleanup:x,registerTriggerGroupActivity:l,triggerSessions:o}),!1!==e.startupGag&®isterStartupGag({onLocalEvent:h,client:t,notice:_,isDebugEnabled:u});const addOnceTrigger=({id:e,regex:a,action:n})=>s?.triggers?.add?(s.triggers.add({id:e,regex:a,enabled:!0,once:!0,tags:["nexsys4","probe",`probe:${e}`],action:e=>n({args:e,client:t,emit:g,pushTrace:i})}),S.push(e),i("probe-trigger:add",{id:e,regex:a instanceof RegExp?a.source:String(a)}),()=>{s?.triggers?.remove&&s.triggers.remove(e),i("probe-trigger:remove",{id:e})}):()=>{};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send:C,sendGmcp:A,on:h,off:b,notice:_,getCommandSeparator:()=>resolveSeparator(),setSeparator(e){a=normalizeCommandSeparator(e)||null},addOnceTrigger,now:monotonicNowMs,setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),renderPrompt:T,getVariable:E,setVariable:w,emitLocal,raiseToEventStream,destroy:k,getGMCP,setDebugEnabled:c,isDebugEnabled:u,debugInfo:()=>({debugEnabled:u(),startupGagEnabled:!1!==e.startupGag,separator:resolveSeparator(),eventRegistrations:v.map(e=>({...e})),triggerIds:[...S],triggerGroups:d(),triggerSessions:m(),hasEventStream:Boolean(n?.registerEvent),hasNexActionTriggers:Boolean(s?.triggers?.add),recentTrace:p()})}},createMockAdapter=(e={})=>{const t=new Map,a=new Map,n=new Map;let s=normalizeCommandSeparator(e.separator??"|");const i=[],o=[],l=[],c=[],u=[],d=[];let m=Boolean(e.debug);const p=Math.max(1,Number(e.traceLimit||200)),g=[],pushTrace=(e,t={})=>{const a={at:nowMs(),type:e,detail:t};g.push(a),g.length>p&&g.splice(0,g.length-p),m&&console.log(`[nexSys4.mockAdapter] ${e}`,t)},normalizeEventName=e=>String(e||"").trim(),emit=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s?.size)return n&&pushTrace("emit",{event:n,listenerCount:0,payload:a}),0;const i=[...s];return pushTrace("emit",{event:n,listenerCount:i.length,payload:a}),i.forEach(e=>{if(t.get(n)?.has(e))try{e(a)}catch(s){console.error("nexSys4 mock adapter listener failed",{event:n,error:s})}}),i.length},on=(e,a)=>{const n=normalizeEventName(e);if(!n||"function"!=typeof a)return()=>{};let s=t.get(n);return s||(s=new Set,t.set(n,s)),s.add(a),pushTrace("on",{event:n,listenerCount:s.size}),()=>off(n,a)},off=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s)return!1;const i=s.delete(a);return s.size||t.delete(n),pushTrace("off",{event:n,removed:i,listenerCount:s.size}),i},removeOnceTrigger=e=>{const t=String(e||"").trim();if(!t)return!1;const a=n.delete(t);return pushTrace("probe-trigger:remove",{id:t,removed:a}),a},addOnceTrigger=({id:e,regex:t,action:a}={})=>{const s=String(e||"").trim();return s&&t instanceof RegExp&&"function"==typeof a?(n.set(s,{regex:t,action:a}),pushTrace("probe-trigger:add",{id:s,regex:t.source}),()=>removeOnceTrigger(s)):()=>{}},fireText=(e,t={})=>{const a=String(e??"");pushTrace("fireText",{text:a,detail:t,triggerCount:n.size});const s=[];return[...n.entries()].forEach(([e,i])=>{i.regex.lastIndex=0;const o=i.regex.exec(a);o&&(n.delete(e),s.push(e),i.action({args:{raw:a,line:a,text:a,groups:o.groups||{},matches:[...o]},detail:t}))}),s};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send(e=[],t={}){const a=Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[];return a.length?(i.push({commands:a,context:t}),pushTrace("send",{commands:a,context:t}),emit("OutboundCommandsEvent",{commands:a,context:t}),a):[]},sendGmcp(e=[],t={}){const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)];return a.length?(u.push(...a),pushTrace("sendGmcp",{requests:a,context:t}),emit("AdapterGmcpRequest",{requests:a,context:t}),a):[]},on,off,emit,notice(e,t={}){o.push({message:String(e),context:t}),pushTrace("notice",{message:String(e),context:t})},getCommandSeparator:()=>s,setSeparator:e=>(s=normalizeCommandSeparator(e),pushTrace("setSeparator",{separator:s}),s),addOnceTrigger,fireText,now:()=>"function"==typeof e.now?e.now():nowMs(),setTimeout:(e,t)=>setTimeout(e,t),clearTimeout(e){clearTimeout(e)},renderPrompt(e,t={}){const a=String(e??""),n={prompt:a,context:t};return d.push(n),pushTrace("renderPrompt",{promptLength:a.length,source:t.source||"",hasLine:Boolean(t.line)}),emit("PromptRendered",n),a},getVariable:e=>a.get(e),setVariable:(e,t)=>(a.set(e,t),t),emitLocal(e,t){const a=String(e||"").trim();if(!a)return!1;const n={event:a,payload:t};return l.push(n),pushTrace("emit:local",n),emit(a,t),!0},raiseToEventStream(e,t){const a=String(e||"").trim();if(!a)return!1;const n={topic:a,payload:t};return c.push(n),pushTrace("emit:eventstream",n),!0},destroy(){t.clear(),n.clear()},getSentBatches:()=>i,getNotices:()=>o,getLocalEvents:()=>l,getEventStreamEvents:()=>c,getGmcpRequests:()=>u,getRenderedPrompts:()=>d,getGMCP:()=>e.gmcp||{},setDebugEnabled(e){m=Boolean(e),pushTrace("debug",{enabled:m})},isDebugEnabled:()=>m,debugInfo:()=>({debugEnabled:m,separator:s,recentTrace:[...g],sentBatchCount:i.length,gmcpRequests:[...u],renderedPromptCount:d.length})}},defineStringPrototypeHelper=(e,t)=>"function"!=typeof String.prototype[e]&&(Object.defineProperty(String.prototype,e,{configurable:!0,writable:!0,value:t}),!0),installStringPrototypeHelpers=()=>({toProperCase:defineStringPrototypeHelper("toProperCase",function toProperCase(){return this.replace(/\w\S*/g,function formatWord(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}),capitalize:defineStringPrototypeHelper("capitalize",function capitalize(){return this.charAt(0).toUpperCase()+this.slice(1)})}),re={list:["accentato","addiction","aeon","agoraphobia","airfisted","amnesia","anorexia","asphyxiating","asthma","betrayal","blackout","blindness","blistered","bloodfire","bound","breathless","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","bruisedribs","burning","cadmuscurse","calcifiedskull","calcifiedtorso","claustrophobia","clumsiness","coldfate","concussion","condemned","conflagration","confusion","constricted","convergence","corruption","crackedribs","cremated","crescendo","crushedthroat","daeggerimpale","damagedhead","damagedleftarm","damagedleftleg","damagedrightarm","damagedrightleg","darkshade","dazed","dazzled","deadening","deafness","death","deathsickness","deepsleep","degenerate","dehydrated","dementia","demonstain","depression","deteriorate","diminished","disloyalty","disrupted","dissonance","dizziness","earworm","empoweredmannaz","empoweredloshre","enlightenment","enmesh","ensorcelled","entangled","epilepsy","fear","flamefisted","flushings","fratricide","frostbite","frozen","fulminated","generosity","grievouswounds","guilt","hamstrung","haemophilia","hallucinations","hatred","healthleech","heartseed","hecatecurse","hellsight","hindered","homunculusmercury","horror","hypersomnia","hypochondria","hypothermia","icebound","icefisted","impaled","impatience","indifference","inquisition","insomnia","internalbleeding","isolation","itching","justice","kaisurge","kkractlebrand","laceratedthroat","lapsingconsciousness","latched","lethargy","lightbind","loneliness","lovers","lovestruck","lullaby","manaleech","masochism","mildtrauma","mangledleftarm","mangledleftleg","mangledrightarm","mangledrightleg","mangledhead","mindclamp","mindravaged","muddled","mycalium","nausea","numbedleftarm","numbedrightarm","pacified","palpatarfeed","paralysis","paranoia","parasite","peace","penitence","petrified","phlogisticated","pinshot","pressure","prone","pyramides","pyre","rebbies","recklessness","reeling","retribution","revealed","sandfever","scalded","scrambledbrains","scytherus","selarnia","sensitivity","serioustrauma","shadowmadness","shivering","shyness","silenced","silver","skullfractures","slashedthroat","sleeping","slickness","slimeobscure","snared","solarburn","speechless","spiritburn","stridulating","stun","stupidity","stuttering","succumbed","temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine","tenderskin","tension","timeflux","timeloop","tonguetied","torntendons","transfixation","trueblind","unweavingbody","unweavingmind","unweavingspirit","vertigo","vinewreathed","vitiated","vitrified","voidfisted","voyria","waterbonds","weakenedmind","weariness","webbed","woeconstrained","whisperingmadness","wristfractures","unconsciousness","harmonic","bop","spiritwrack","bedevil","loki","moon","evileye","dragoncurse","swiftcurse"],prios:{aeon:4,concussion:4,crushedthroat:4,paralysis:4,peace:4,sleeping:5,grievouswounds:5,latched:5,dazzled:5,unweavingbody:5,unweavingmind:5,unweavingspirit:5,weariness:5,prone:5,timeloop:5,spiritburn:6,heartseed:6,guilt:6,tenderskin:6,pyramides:6,parasite:6,hypochondria:6,pacified:6,depression:6,confusion:6,mindravaged:6,retribution:6,shadowmadness:6,whisperingmadness:6,hellsight:6,anorexia:7,scalded:7,mycalium:7,frostbite:7,flushings:7,rebbies:7,sandfever:7,asthma:7,healthleech:7,fulminated:5,impatience:8,itching:8,fratricide:8,scytherus:8,clumsiness:8,kkractlebrand:8,damagedleftleg:8,darkshade:8,slickness:8,recklessness:8,dementia:8,icebound:8,bound:9,daeggerimpale:9,entangled:9,sensitivity:9,transfixation:9,webbed:9,tonguetied:9,haemophilia:9,lethargy:9,manaleech:9,dissonance:9,pyre:9,skullfractures:10,damagedrightleg:10,hypersomnia:10,earworm:10,crescendo:10,diminished:10,torntendons:11,brokenleftleg:11,brokenrightleg:11,hallucinations:11,calcifiedskull:12,calcifiedtorso:12,mangledleftleg:12,mangledrightleg:12,disrupted:12,mangledhead:12,voyria:12,crackedribs:12,hypothermia:13,impaled:13,brokenleftarm:13,brokenrightarm:13,indifference:13,addiction:13,nausea:13,deadening:13,frozen:13,shivering:13,mildtrauma:13,internalbleeding:13,stupidity:14,wristfractures:14,damagedleftarm:14,disloyalty:14,tension:15,damagedhead:15,dazed:15,burning:15,lovers:16,pressure:16,damagedrightarm:16,temperedcholeric:16,temperedmelancholic:16,temperedphlegmatic:16,temperedsanguine:16,mangledleftarm:17,mangledrightarm:17,agoraphobia:18,claustrophobia:18,generosity:18,justice:18,loneliness:18,vertigo:18,paranoia:19,serioustrauma:20,epilepsy:20,laceratedthroat:22,slashedthroat:22,stuttering:22,selarnia:23,fear:23,masochism:23,dizziness:25,shyness:25,stridulating:25,horror:26,bleeding:30,amnesia:30,blackout:30,insomnia:30,deafness:30,blindness:30,harmonic:100,bop:100,spiritwrack:100,bedevil:100,loki:100,moon:100,evileye:100,dragoncurse:100,swiftcurse:100},types:{countable:{pressure:{min:0,max:5},crescendo:{min:0,max:5},unweavingbody:{min:0,max:5},unweavingspirit:{min:0,max:5},unweavingmind:{min:0,max:5},burning:{min:0,max:5},horror:{min:0,max:5},pyre:{min:0,max:3},temperedcholeric:{min:0,max:8},temperedmelancholic:{min:0,max:8},temperedphlegmatic:{min:0,max:8},temperedsanguine:{min:0,max:8},torntendons:{min:0,max:6},crackedribs:{min:0,max:6},skullfractures:{min:0,max:7},wristfractures:{min:0,max:7}},nonServerside:{accentato:0,airfisted:0,asphyxiating:0,blistered:0,bloodfire:0,bruisedribs:0,cadmuscurse:0,coldfate:0,condemned:0,conflagration:0,constricted:0,convergence:0,corruption:0,cremated:0,death:0,deathsickness:0,deepsleep:0,degenerate:0,dehydrated:0,demonstain:0,deteriorate:0,empoweredloshre:0,empoweredmannaz:0,enlightenment:0,enmesh:0,ensorcelled:0,flamefisted:0,hamstrung:0,hatred:0,hecatecurse:0,hindered:0,homunculusmercury:0,icefisted:0,inquisition:0,isolation:0,kaisurge:0,lightbind:0,lullaby:0,mindclamp:0,muddled:0,numbedleftarm:0,numbedrightarm:0,palpatarfeed:0,petrified:0,phlogisticated:0,pinshot:0,revealed:0,scrambledbrains:0,silenced:0,silver:0,slimeobscure:0,solarburn:0,stun:0,timeflux:0,trueblind:0,vinewreathed:0,vitiated:0,vitrified:0,voidfisted:0,waterbonds:0,weakenedmind:0,unconsciousness:0},timed:{accentato:{length:20},aeon:{length:25},airfisted:{length:16},betrayal:{length:15},blackout:{length:20},blistered:{length:20},breathless:{length:3},bruisedribs:{length:30},cadmuscurse:{length:20},condemned:{length:20},constricted:{length:30},corruption:{length:45},dazzled:{length:60},dehydrated:{length:60},demonstain:{length:120},empoweredloshre:{length:12},empoweredmannaz:{length:20},enmesh:{length:5},ensorcelled:{length:20},flamefisted:{length:30},hamstrung:{length:9},heartseed:{length:11},hecatecurse:{length:16},icefisted:{length:30},inquisition:{length:30},lightbind:{length:22},lovestruck:{length:5},muddled:{length:12},numbedleftarm:{length:7.5},numbedrightarm:{length:7.5},palpatarfeed:{length:20},phlogisticated:{length:45},pinshot:{length:18},reeling:{length:20},revealed:{length:60},scalded:{length:20},scrambledbrains:{length:60},silver:{length:180},slimeobscure:{length:60},solarburn:{length:5},snared:{length:20},speechless:{length:300},stridulating:{length:15},stun:{length:3},succumbed:{length:30},timeflux:{length:60},trueblind:{length:6},unconsciousness:{length:10},vinewreathed:{length:30},vitrified:{length:45},voidfisted:{length:5},waterbonds:{length:30},weakenedmind:{length:60},woeconstrained:{length:30}},unknown:{moon:["stupidity","confusion","epilepsy","masochism","hypersomnia","hallucinations"],loki:["stupidity","clumsiness","recklessness","asthma","shyness","darkshade","paralysis","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","sensitivity","disloyalty","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","selarnia","slickness","scytherus"],evileye:["confusion","dizziness"],dragoncurse:["recklessness","clumsiness","epilepsy","dizziness","pacified","nausea","addiction","anorexia","generosity","disloyalty","sensitivity","vertigo","paranoia","stupidity","hypochondria","lethargy","shivering","frozen","impatience","paralysis","asthma","agoraphobia"],harmonic:["stupidity","recklessness"],bop:["stupidity","recklessness"],swiftcurse:["stupidity","clumsiness","recklessness","asthma","paralysis","deafness","sensitivity","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","impatience","claustrophobia","vertigo","agoraphobia","masochism","epilepsy","manaleech","pacified","dementia","healthleech"],bedevil:["stupidity","recklessness"]},uncurable:{bloodfire:!0,cadmuscurse:!0,conflagration:!0,death:!0,deathsickness:!0,deepsleep:!0,enlightenment:!0,isolation:!0,lullaby:!0,mindclamp:!0,palpatarfeed:!0,penitence:!0,scalded:!0,stun:!0,weakenedmind:!0}}},buildAffIndex=e=>{const t=new Set(e.list),a={};for(const[n,s]of Object.entries(e.prios))a[s]||(a[s]=[]),a[s].push(n);return Object.freeze({affSet:t,prioArrays:Object.freeze(a)})},ae=(buildAffIndex(re),{herb:{length:1.6,aff_modifiers:{homunculusmercury:{multiplier:1,offset:.5}}},focus:{length:2.5,aff_modifiers:{weakenedmind:{multiplier:2,offset:.5},whisperingmadness:{multiplier:1.6,offset:0}}},sip:{length:4.5,aff_modifiers:{skullfractures:{multiplier:1,offset:1}}},moss:{length:6},tree:{length:15,aff_modifiers:{slimeobscure:{multiplier:1,offset:10}}},equilibrium:{length:20,aff_modifiers:{confusion:{multiplier:1.5,offset:0}}},balance:{length:20,aff_modifiers:{lethargy:{multiplier:1.25,offset:0}}},salve:{length:4,aff_modifiers:{timeflux:{multiplier:1.5,offset:0}}},immunity:{length:10},rebounding:{length:9},smoke:{length:1.5},dragonbreath:{length:1.5},deafness:{length:3},deaf:{length:6},blind:{length:6},speed:{length:6},wake:{length:20},sileris:{length:8},avoid:{length:30},free:{length:0},voice:{length:2.5},tremolo:{length:6},homunculus:{length:12},fitness:{length:10},bloodboil:{length:10},dragonheal:{length:20},rage:{length:10},salt:{length:10},shrugging:{length:10},alleviate:{length:10},slough:{length:10},fool:{length:40},writhe:{length:6},impalewrithe:{length:4},entity:{length:2.3},feed:{length:70},word:{length:5},anathema:{length:5},systemOutput:{length:1}}),ne=["itching","paralysis","fear","brokenrightarm","brokenleftarm","brokenrightleg","brokenleftleg","lapsingconsciousness","aeon","lovers","confusion","epilepsy","pacified","blackout","dazed","justice","slashedthroat","hellsight","peace","dazzled","shyness","dizziness","slickness","asthma","nausea","selarnia","weariness","scytherus","fratricide","haemophilia","clumsiness","hallucinations","healthleech","dementia","recklessness","anorexia","masochism","impatience","stupidity","generosity","addiction","deadening","manaleech","stuttering","paranoia","agoraphobia","loneliness","claustrophobia","vertigo","hypersomnia","shivering","frozen","burning","sensitivity","hypochondria","lethargy","disloyalty","darkshade","voyria","dissonance","phlogisticated","silver","spiritburn","tenderskin","guilt","skullfractures","wristfractures","crackedribs","torntendons","indifference","retribution","shadowmadness","parasite","depression","timeloop","crushedthroat","tension","unweavingspirit","grievouswounds","pyramides","flushings","rebbies","mycalium","sandfever","crescendo","fulminated","frostbite"],se={ferrum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ferrum",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"]},magnesium:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat magnesium",order:["paralysis","slickness","pyramides"]},aurum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat aurum",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"]},calamine:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat calamine",order:["deafness"],delay:2.5},argentum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat argentum",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"]},cuprum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat cuprum",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"]},antimony:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat antimony",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"]},arsenic:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat arsenic"},stannum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat stannum",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"]},plumbum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"],command:"eat plumbum"},calcite:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat calcite"},ginseng:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginseng",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"]},bloodroot:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bloodroot",order:["paralysis","slickness","pyramides"]},kelp:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat kelp",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"]},hawthorn:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat hawthorn",order:["deafness"],delay:2.5},lobelia:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat lobelia",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"]},bellwort:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bellwort",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"]},ginger:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginger",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"]},bayberry:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bayberry"},ash:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ash",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"]},goldenseal:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat goldenseal",order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"]},pear:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat pear"},smoke:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","disloyalty","hellsight","manaleech","slickness","deadening","tension","unweavingspirit","earworm","dazed"]},cinnabar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"]},malachite:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke malachite"},realgar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke realgar",order:["disloyalty","hellsight","manaleech","slickness"]},elm:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke elm",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"]},skullcap:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke skullcap"},valerian:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke valerian",order:["disloyalty","hellsight","manaleech","slickness"]},caloric:{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply caloric",order:["frozen","shivering","frostbite"]},"epidermal to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to body",order:["anorexia","itching"]},"epidermal to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to head",order:["blindness","scalded","deafness","stuttering"]},"epidermal to ears":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to ears",order:["deafness"]},"mending to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to head",order:["crushedthroat","dazzled"]},"mending to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to arms",order:["brokenleftarm","brokenrightarm"]},"mending to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to legs",order:["brokenleftleg","brokenrightleg"]},"mending to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to torso",order:["burning"]},"mending to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to body",order:["selarnia"]},"restoration to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to head",order:["mangledhead","damagedhead","calcifiedskull","concussion","tonguetied","slashedthroat","laceratedthroat"],delay:4},"restoration to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to torso",order:["hypothermia","heartseed","serioustrauma","mildtrauma","calcifiedtorso","internalbleeding"],delay:4},"restoration to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to arms",order:["mangledleftarm","mangledrightarm","damagedleftarm","damagedrightarm"],delay:4},"restoration to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to legs",order:["mangledleftleg","mangledrightleg","damagedleftleg","damagedrightleg"],delay:4},focus:{bals_req:["focus"],bals_used:["focus"],blocks:["death","impatience","sleeping"],command:"focus",order:["stupidity","epilepsy","dizziness","shyness","claustrophobia","paranoia","confusion","hallucinations","dementia","pacified","peace","lovers","generosity","masochism","loneliness","vertigo","recklessness","agoraphobia","anorexia","stuttering"]},"health to head":{bals_req:["sip"],bals_used:["sip"],command:"apply health to head",order:["skullfractures"]},"health to torso":{bals_req:["sip"],bals_used:["sip"],command:"apply health to torso",order:["crackedribs","grievouswounds"]},"health to arms":{bals_req:["sip"],bals_used:["sip"],command:"apply health to arms",order:["wristfractures"]},"health to legs":{bals_req:["sip"],bals_used:["sip"],command:"apply health to legs",order:["torntendons","latched","kkractlebrand"]},concentrate:{blocks:["death","sleeping","confusion"],command:"concentrate",order:["disrupted"]},immunity:{bals_req:["immunity"],bals_used:["immunity"],blocks:["death","sleeping","anorexia"],command:"sip immunity",order:["voyria"]},stand:{bals_req:["balance","equilibrium"],blocks:["death","sleeping","paralysis","brokenrightleg","brokenleftleg","damagedleftleg","damagedrightleg","mangledrightleg","mangledleftleg","entangled","transfixation","impaled","webbed","bound"],command:"stand",order:["prone"]},tree:{bals_used:["tree"],bals_req:["tree"],blocks:["death","sleeping","paralysis",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],command:"touch tree",order:ne},health:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip health"},mana:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip mana"},potash:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat potash"},moss:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat moss"},fitness:{serverside:!1,bals_req:["equilibrium","balance","fitness"],bals_used:["balance","fitness"],blocks:["death","weariness","sleeping"],skills:["Runewarden","Monk","Shikudo","Blademaster","Infernal","Paladin","Sentinel","Druid","Unnamable"],command:"fitness",order:["asthma"]},bloodboil:{serverside:!1,bals_req:["equilibrium","balance","bloodboil"],bals_used:["equilibrium","bloodboil"],blocks:["death","haemophilia","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Magi"],command:"cast bloodboil",order:ne},restore:{serverside:!1,bals_req:["balance","equilibrium"],bals_used:["equilibrium"],command:"restore",order:["brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","skullfractures","torntendons","wristfractures","crackedribs"]},dragonflex:{serverside:!1,bals_req:["balance"],bals_used:["balance"],command:"dragonflex",skills:["Dragon"],order:["webbed","entangled"]},dragonheal:{serverside:!1,bals_req:["balance","equilibrium","dragonheal"],bals_used:["equilibrium"],command:"dragonheal",skills:["Dragon"],blocks:["death","sleeping",["recklessness","weariness"]],order:ne},dwinnu:{serverside:!1,bals_req:["voice"],bals_used:["voice"],command:"chant dwinnu",skills:["Bard"],order:["webbed","entangled"]},rage:{serverside:!1,bals_req:["rage"],bals_used:["rage"],command:"rage",skills:["Runewarden"],order:["pacified","peace","lovers","generosity"]},"touch soul":{command:"touch soul",blocks:["death"],order:["amnesia"]},salt:{serverside:!1,bals_req:["equilibrium","salt"],bals_used:["salt","equilibrium"],blocks:["death","stupidity","sleeping"],skills:["Alchemist"],command:"educe salt",order:ne},shrugging:{serverside:!1,bals_req:["equilibrium","balance","shrugging"],bals_used:["shrugging"],blocks:["death","weariness","sleeping"],skills:["Serpent"],command:"shrugging",order:ne},slough:{serverside:!1,bals_req:["equilibrium","balance","slough"],bals_used:["slough","balance"],blocks:["death","weariness","sleeping"],skills:["Fire Elemental Lord"],command:"slough impurities",order:ne},fool:{serverside:!1,bals_req:["equilibrium","balance","fool"],bals_used:["fool","balance"],blocks:["death","prone","paralysis","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Occultist"],command:"fling fool at me",order:ne},alleviate:{serverside:!1,bals_req:["equilibrium","balance","alleviate"],bals_used:["alleviate","balance"],blocks:["death","paralysis","sleeping"],skills:["Blademaster"],command:"alleviate",order:ne}},normalizeCureCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],ie=Object.freeze(Object.fromEntries(Object.entries(se).map(([e,t])=>[e,Object.freeze({...t,serverside:!1!==t.serverside,command:Object.freeze(normalizeCureCommand(t.command))})]))),oe=Object.freeze(Object.entries(ie).reduce((e,[t,a])=>((Array.isArray(a.order)?a.order:[]).forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e),{})),le={acrobatics:{command:"acrobatics on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},airpocket:{command:["outr calcite","eat calcite"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},alertness:{static:!0,command:"alertness on",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},antiforce:{command:"intone gaiartha",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],serverside:!0},arctar:{command:"command orb",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Occultist"],serverside:!1,preempt:!0},astronomy:{static:!0,command:"astronomy empower me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},"avoid physical":{command:"avoid physical",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid aoe","avoid mental","avoid arcane"]},"avoid aoe":{command:"avoid aoe",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid mental","avoid arcane"]},"avoid mental":{command:"avoid mental",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid arcane"]},"avoid arcane":{command:"avoid arcane",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid mental"]},balancing:{command:"balancing on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},belltattoo:{command:"touch bell",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0,preempt:!0},blindness:{command:["outr arsenic","eat arsenic"],bals_req:["herb"],bals_used:["herb"],blocks:["death","sleeping","anorexia"],serverside:!0},blocking:{command:"block d",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","prone"],serverside:!1,preempt:!0},bloodshield:{command:"activate bloodshield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],serverside:!0,preempt:!0},bodyaugment:{command:"intone mainaas",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},bodyblock:{static:!0,command:"bdb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},boostedregeneration:{command:"boost regeneration",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},bulk:{command:"mutate bulk",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},cloak:{command:"touch cloak",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},chargeshield:{static:!0,command:"cast chargeshield at me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},coldresist:{command:"activate cold resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},compoundmask:{command:["wear mask","secure mask"],bals_req:["free"],bals_used:["free"],skills:["Alchemist"],serverside:!1},consciousness:{command:"consciousness on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},constitution:{static:!0,command:"constitution",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},curseward:{static:!0,command:"curseward",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],serverside:!0},deafness:{command:["outr calamine","eat calamine"],bals_req:["herb","deafness"],bals_used:["herb","deafness"],blocks:["death","sleeping","anorexia"],serverside:!0},deathsight:{static:!0,command:"deathsight",bals_req:["balance","equilibrium"],bals_used:["free"],serverside:!0,preempt:!0},deflect:{command:"deflect",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","prone","sleeping"],skills:["Runewarden","Paladin","Infernal","Unnamable"],serverside:!0,preempt:!0},density:{command:"wear shackle",bals_req:["salve"],bals_used:["salve"],blocks:["death","slickness","sleeping"],serverside:!0},devilmark:{static:!0,command:"devilmark",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},diamondskin:{static:!0,command:"cast diamondskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},distortedaura:{static:!0,command:"distortaura",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},dragonarmour:{static:!0,command:"dragonarmour",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Dragon"],serverside:!0},dragonbreath:{command:"summon ice",bals_req:["balance","equilibrium","dragonbreath"],bals_used:["free","dragonbreath"],blocks:["death","prone","sleeping"],skills:["Dragon"],preempt:!0,serverside:!0},durability:{command:"intone tsuura",bals_req:["balance","equilibrium"],skills:["Depthswalker"],blocks:["death","sleeping","prone"],bals_used:["word"],serverside:!0},electricresist:{command:"activate electric resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},endure:{command:"endure",stopCommand:"endure stop",bals_req:["balance","equilibrium"],bals_used:["free"],stopBals_req:["balance","equilibrium"],stopBals_used:["free"],blocks:["death","sleeping"],stopBlocks:["death","sleeping"],serverside:!0,preempt:!0},enhancedform:{command:["amalgamate enhancement","imbibe enhancement"],bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!1,preempt:!0},evadeblock:{command:"evb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},eyes:{command:"mutate eyes",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},fireresist:{command:"activate fire resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},fangbarrier:{command:"apply quicksilver",bals_req:["salve","sileris"],bals_used:["salve","sileris"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0},fireshroud:{command:"ignite shroud",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0,skills:["Fire Elemental Lord"]},fury:{command:"fury on",bals_req:["balance"],bals_used:["equilibrium"],skills:["Runewarden","Unnamable"],serverside:!0},flying:{serverside:!1,clientOnly:!0,trackOnly:!0},ghost:{static:!0,command:"conjure ghost",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},gripping:{command:"grip",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Unnamable","Shikudo","Bard","Blademaster","Jester","Shaman"],serverside:!0,preempt:!0},groundwatch:{command:"groundwatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},"guarding right leg":{command:"guard right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left leg":{command:"guard left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding right leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding right arm":{command:"guard right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right leg","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left arm":{command:"guard left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding right leg","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding head":{command:"guard head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding right leg","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding torso":{command:"guard torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding right leg","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},guidedstrike:{static:!0,command:"enact guidedstrike",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],serverside:!0},heldbreath:{command:"hold breath",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","asthma","sleeping"],preempt:!0,serverside:!0},hiding:{command:"hide",bals_req:["equilibrium","balance"],bals_used:["balance"],skills:["Serpent"],serverside:!0},hypersight:{command:"hypersight on",bals_req:["balance"],bals_used:["equilibrium"],serverside:!0},immunity:{command:"immunity",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},insomnia:{command:"insomnia",bals_req:["free"],bals_used:["free"],blocks:["death","hypersomnia","sleeping"],serverside:!0,preempt:!0},insulation:{command:"apply caloric",bals_req:["salve"],bals_used:["salve"],blocks:["death","sleeping","slickness","hypothermia"],serverside:!0},insufflate:{command:["get phial from pack","amalgamate insufflate potency 4 stability 1","imbibe insufflate"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},ironform:{static:!0,command:["get phial from pack","amalgamate petrifying potency 4 stability 1","imbibe petrifying"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},joints:{command:"mutate joints",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},kaiboost:{command:"kai boost",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],preempt:!0,serverside:!0},kaitrance:{command:"kai trance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},kola:{command:["outr quartz","eat quartz"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},levitating:{command:"sip levitation",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},lifevision:{static:!0,command:"lifevision",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},lipreading:{static:!0,command:"lipread",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},locketdeath:{command:"solicit locket for immortality",bals_req:["free"],bals_used:["free"],serverside:!1},magicresist:{command:"activate magic resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},blademastery:{command:"mastery on",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Unnamable"],preempt:!0,serverside:!0},meditate:{command:"meditate",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","impatience"],preempt:!1,serverside:!1},mercury:{static:!0,command:"educe mercury",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},metabolise:{serverside:!1,clientOnly:!0,trackOnly:!0},metawake:{command:"metawake on",stopCommand:"metawake off",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],stopBals_req:["free"],stopBals_used:["free"],blocks:["death","sleeping","lullaby"],stopBlocks:["death","sleeping"],serverside:!0,preempt:!0},mindcloak:{command:"mind cloak on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],preempt:!0,skills:["Monk","Shikudo"],serverside:!0},mindnet:{command:"mindnet on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},mindseye:{static:!0,command:"touch mindseye",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},morimbuul:{command:"ldeck draw morimbuul",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],serverside:!1,preempt:!1},mounted:{serverside:!1,clientOnly:!0,trackOnly:!0},mouths:{command:"mutate mouths",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},nightsight:{command:"nightsight",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},numbness:{command:"numb",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"]},"parrying right leg":{command:"parry right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","guarding right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left leg":{command:"parry left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","guarding right leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying right arm":{command:"parry right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","guarding right leg","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left arm":{command:"parry left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","guarding right leg","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying head":{command:"parry head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","guarding right leg","parrying left","parrying right","parrying centre"]},"parrying torso":{command:"parry torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","guarding right leg","parrying head","parrying left","parrying right","parrying centre"]},pinchblock:{command:"pnb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},projectiles:{command:"projectiles on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],blocks:["death","sleeping","mounted"],preempt:!0,serverside:!0},poisonresist:{command:"sip venom",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},precision:{command:"intone trusad",bals_req:["balance","equilibrium"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},prismatic:{command:"strum lyre",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],serverside:!1},psitranscend:{command:"psi transcend",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],blocks:["death","sleeping"],serverside:!0},rebounding:{command:"smoke malachite",bals_req:["smoke","rebounding"],bals_used:["smoke","rebounding"],blocks:["death","asthma","sleeping"],serverside:!0},regeneration:{command:"regeneration on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo"],blocks:["death","sleeping"],serverside:!0,preempt:!0},resistance:{command:"resistance",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Monk","Shikudo","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},scales:{static:!0,command:"scales",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0},secondsight:{static:!0,command:"secondsight",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},secondskin:{static:!0,command:"weave secondskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],serverside:!0},selfishness:{command:"selfishness",bals_req:["balance","equilibrium"],bals_used:["balance"],serverside:!0},shield:{command:"touch shield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},shintrance:{command:"shin trance",bals_req:["free"],bals_used:["free"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0,preempt:!0},shinclarity:{static:!0,command:"clarity",bals_req:["balance"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shinbinding:{static:!0,command:"shinbinding on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shipwarning:{command:"shipwarning on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0},shroud:{static:!0,command:"shroud",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Occultist","Serpent"],serverside:!0},softfocusing:{command:"softfocus on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0,preempt:!0},speed:{command:"sip speed",bals_req:["speed"],bals_used:["speed"],blocks:["death","anorexia","sleeping"],serverside:!0},splitmind:{command:"split mind",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},skysight:{command:"manifest skysight",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},skywatch:{command:"skywatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},stonefist:{static:!0,command:"cast stonefist",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},stoneskin:{static:!0,command:"cast stoneskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},sulphur:{static:!0,command:"educe sulphur",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},tekurastance:{command:"tekurastance",bals_req:["free"],bals_used:["balance"],skills:["Monk","Shikudo"]},telesense:{command:"telesense on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},temperance:{command:"sip frost",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},tempest:{command:"manifest tempest",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},mutatetentacles:{command:"mutate tentacles",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},thirdeye:{command:"thirdeye",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tin:{static:!0,command:"educe tin",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Alchemist"],serverside:!0},tentacles:{command:"tentacles",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Occultist"],serverside:!0},toughness:{command:"toughness",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},treewatch:{command:"treewatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tune:{command:"blade tune",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},twoartsstance:{command:"twoartsstance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Blademaster"]},vigilance:{command:"vigilance on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},vitality:{command:"vitality on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},weathering:{command:"weathering on",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Infernal","Paladin","Monk","Shikudo","Blademaster","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},weaving:{static:!0,command:"weaving on",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0}},normalizeDefCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefPriority=(e,t)=>{const a=Number(e);return Number.isFinite(a)?a<0?0:a>26?26:a:0},ce=Object.freeze(Object.fromEntries(Object.entries(le).map(([e,t])=>{const a=!1!==t.serverside;return[e,Object.freeze({...t,command:Object.freeze(normalizeDefCommand(t.command)),stopCommand:Object.freeze(normalizeDefCommand(t.stopCommand)),bals_req:Object.freeze(normalizeDefList(t.bals_req)),bals_used:Object.freeze(normalizeDefList(t.bals_used)),stopBals_req:Object.freeze(normalizeDefList(t.stopBals_req)),stopBals_used:Object.freeze(normalizeDefList(t.stopBals_used)),skills:Object.freeze(normalizeDefList(t.skills)),opps:Object.freeze(normalizeDefList(t.opps)),blocks:Object.freeze(t.blocks?[...t.blocks]:[]),stopBlocks:Object.freeze(t.stopBlocks?[...t.stopBlocks]:[]),serverside:a,preempt:!0===t.preempt,static:!0===t.static,clientOnly:!0===t.clientOnly,trackOnly:!0===t.trackOnly,defaultPriority:normalizeDefPriority(t.defaultPriority,a)})]}))),ue=Object.freeze(Object.keys(ce).reduce((e,t)=>(e[t]=Number(ce[t].defaultPriority),e),{})),buildDefBySkillIndex=()=>{const e=Object.entries(ce).reduce((e,[t,a])=>{const n=a.skills;return Array.isArray(n)&&n.forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e},{});return Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Object.freeze([...t])])))},de=(buildDefBySkillIndex(),Object.freeze({snapTrack:Object.freeze({label:"Snapped",durationMs:8e3})})),me=Object.freeze({icewall:Object.freeze({gmcpItemNames:Object.freeze([])}),stonewall:Object.freeze({gmcpItemNames:Object.freeze([])})}),pe=Object.freeze({CHAR_VITALS:"nexsys4.gmcp.char.vitals",CHAR_STATUS:"nexsys4.gmcp.char.status",CHAR_AFFLICTIONS_LIST:"nexsys4.gmcp.char.afflictions.list",CHAR_AFFLICTIONS_ADD:"nexsys4.gmcp.char.afflictions.add",CHAR_AFFLICTIONS_REMOVE:"nexsys4.gmcp.char.afflictions.remove",CHAR_DEFENCES_LIST:"nexsys4.gmcp.char.defences.list",CHAR_DEFENCES_ADD:"nexsys4.gmcp.char.defences.add",CHAR_DEFENCES_REMOVE:"nexsys4.gmcp.char.defences.remove",IRE_RIFT_LIST:"nexsys4.gmcp.ire.rift.list",IRE_RIFT_CHANGE:"nexsys4.gmcp.ire.rift.change",CHAR_ITEMS_LIST:"nexsys4.gmcp.char.items.list",CHAR_ITEMS_DELTA:"nexsys4.gmcp.char.items.delta",ROOM_INFO:"nexsys4.gmcp.room.info",TARGET_INFO:"nexsys4.gmcp.target.info"}),isRecord$4=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),normalizeLocation=e=>String(e??"inv").trim().toLowerCase()||"inv",mergeDefinedRecord=(...e)=>e.reduce((e,t)=>(Object.entries(isRecord$4(t)?t:{}).forEach(([t,a])=>{void 0!==a&&(e[t]=a)}),e),{}),mergeResourceStats=(e=[],t=[])=>{const a=new Map;return[...e,...t].forEach(e=>{const t=String(e?.key||"").trim().toLowerCase();t&&a.set(t,e)}),[...a.values()]},mergeBalancePatches=(e=[],t=[])=>[...Array.isArray(e)?e:[],...Array.isArray(t)?t:[]],mergeStatusPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,status:{...isRecord$4(a.status)?a.status:{},...isRecord$4(n.status)?n.status:{}}}},mergeVitalsPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{},s=isRecord$4(a.vitals)?a.vitals:{},i=isRecord$4(n.vitals)?n.vitals:{};return{...a,...n,vitals:{...s,...i,kind:i.kind||s.kind,vitals:mergeDefinedRecord(s.vitals,i.vitals),balances:mergeDefinedRecord(s.balances,i.balances),balancePatches:mergeBalancePatches(s.balancePatches,i.balancePatches),resourceStats:mergeResourceStats(Array.isArray(s.resourceStats)?s.resourceStats:[],Array.isArray(i.resourceStats)?i.resourceStats:[])}}},mergeTargetPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,target:mergeDefinedRecord(a.target,n.target)}},ge=new Map([[pe.CHAR_STATUS,{keyFor:()=>pe.CHAR_STATUS,merge:mergeStatusPayload}],[pe.CHAR_VITALS,{keyFor:()=>pe.CHAR_VITALS,merge:mergeVitalsPayload}],[pe.CHAR_AFFLICTIONS_LIST,{keyFor:()=>pe.CHAR_AFFLICTIONS_LIST,merge:(e,t)=>t}],[pe.CHAR_DEFENCES_LIST,{keyFor:()=>pe.CHAR_DEFENCES_LIST,merge:(e,t)=>t}],[pe.CHAR_ITEMS_LIST,{keyFor:({payload:e}={})=>`${pe.CHAR_ITEMS_LIST}:${normalizeLocation(e?.location)}`,merge:(e,t)=>t}],[pe.IRE_RIFT_LIST,{keyFor:()=>pe.IRE_RIFT_LIST,merge:(e,t)=>t}],[pe.TARGET_INFO,{keyFor:()=>pe.TARGET_INFO,merge:mergeTargetPayload}]]),fe=new Set([pe.CHAR_AFFLICTIONS_ADD,pe.CHAR_AFFLICTIONS_REMOVE,pe.CHAR_DEFENCES_ADD,pe.CHAR_DEFENCES_REMOVE,pe.CHAR_ITEMS_DELTA,pe.IRE_RIFT_CHANGE]),createGmcpBlockBuffer=({coalesce:e=!0}={})=>{const t=[];return{enqueue:(e={})=>{const a=String(e.topic||"").trim();a&&t.push({topic:a,payload:Object.prototype.hasOwnProperty.call(e,"payload")?e.payload:null})},flush:()=>{if(!e){const e=[...t];return t.length=0,e}const a=new Map,n=[],s=[];return t.forEach(e=>{const t=ge.get(e.topic);if(t){const n=t.keyFor(e),s=a.get(n);return void(s?a.set(n,{...s,payload:t.merge(s.payload,e.payload)}):a.set(n,e))}fe.has(e.topic)?s.push(e):n.push(e)}),t.length=0,[...a.values(),...n,...s]},size:()=>t.length}},createEventBus=({label:e="nexSys4.eventBus",debugEnabled:t=!1,traceLimit:a=200}={})=>{const n=new Map,s=new Set;let i=Boolean(t);const o=Math.max(1,Number(a||200)),l=[],pushTrace=(t,a={})=>{if(!i)return null;const n={at:Date.now(),type:t,detail:a};return l.push(n),l.length>o&&l.splice(0,l.length-o),console.log(`[${e}] ${t}`,a),n},on=(e,t)=>{const a=String(e||"").trim();if(!a||"function"!=typeof t)return()=>{};const s=n.get(a)||new Set;return s.add(t),n.set(a,s),pushTrace("on",{topic:a,listenerCount:s.size}),()=>off(a,t)},off=(e,t)=>{const a=String(e||"").trim(),s=n.get(a);if(!a||!s)return!1;const i=s.delete(t);return s.size||n.delete(a),pushTrace("off",{topic:a,removed:i,listenerCount:s.size}),i},onAny=e=>"function"!=typeof e?()=>{}:(s.add(e),pushTrace("onAny",{listenerCount:s.size}),()=>offAny(e)),offAny=e=>{const t=s.delete(e);return pushTrace("offAny",{removed:t,listenerCount:s.size}),t};return{on,off,onAny,offAny,emit:(e,t)=>{const a=String(e||"").trim();if(!a)return 0;const o=[...n.get(a)||[]],l=[...s];return i&&pushTrace("emit",{topic:a,listenerCount:o.length,anyListenerCount:l.length,payload:t}),o.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus handler failed",{topic:a,error:n})}}),l.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus global handler failed",{topic:a,error:n})}}),o.length+l.length},clear:()=>{n.clear(),s.clear()},setDebugEnabled(e){i=Boolean(e)},debugInfo:()=>({label:e,debugEnabled:i,topics:[...n.keys()],anyListenerCount:s.size,recentTrace:[...l]})}},he=Object.freeze({RUNTIME_STARTED:"nexsys4.runtime.started",RUNTIME_STOPPED:"nexsys4.runtime.stopped",RAW_GMCP:"nexsys4.raw.gmcp",SYSTEM_VITALS_CHANGED:"nexsys4.system.vitals.changed",SYSTEM_HEALTH_CHANGED:"nexsys4.system.health.changed",SYSTEM_MANA_CHANGED:"nexsys4.system.mana.changed",SYSTEM_RAGE_CHANGED:"nexsys4.system.rage.changed",SYSTEM_BLEED_CHANGED:"nexsys4.system.bleed.changed",SYSTEM_STATUS_CHANGED:"nexsys4.system.status.changed",SYSTEM_CLASS_CHANGED:"nexsys4.system.class.changed",SYSTEM_TARGET_CHANGED:"nexsys4.system.target.changed",ROOM_CHANGED:"nexsys4.room.changed",ROOM_FEATURES_CHANGED:"nexsys4.room.features.changed",SYSTEM_RUNTIME_CHANGED:"nexsys4.system.runtime.changed",SYSTEM_PAUSE_CHANGED:"nexsys4.system.pause.changed",SYSTEM_PAUSED:"nexsys4.system.paused",SYSTEM_UNPAUSED:"nexsys4.system.unpaused",SYSTEM_LOADED:"nexsys4.system.loaded",SYSTEM_SETTINGS_CHANGED:"nexsys4.system.settings.changed",SYSTEM_BASELINE_CHANGED:"nexsys4.system.baseline.changed",SYSTEM_DEATH_DETECTED:"nexsys4.system.death.detected",SYSTEM_MOUNT_CHANGED:"nexsys4.system.mount.changed",SYSTEM_WIELDED_CHANGED:"nexsys4.system.wielded.changed",UI_CONFIG_CHANGED:"nexsys4.ui.config.changed",AFF_GOT:"nexsys4.aff.got",AFF_LOST:"nexsys4.aff.lost",AFF_STACK_CHANGED:"nexsys4.aff.stack.changed",AFF_PRIORITY_CHANGED:"nexsys4.aff.priority.changed",DEF_GOT:"nexsys4.def.got",DEF_LOST:"nexsys4.def.lost",DEF_PRIORITY_CHANGED:"nexsys4.def.priority.changed",BALANCE_GOT:"nexsys4.balance.got",BALANCE_LOST:"nexsys4.balance.lost",BALANCE_RESET:"nexsys4.balance.reset",BALANCE_DURATION_OBSERVED:"nexsys4.balance.duration.observed",BALANCE_TIMER_RESTARTED:"nexsys4.balance.timer.restarted",EQBAL_GOT:"nexsys4.eqbal.got",LIMB_UPDATED:"nexsys4.limb.updated",CACHE_AMOUNT_CHANGED:"nexsys4.cache.amount.changed",CACHE_INVENTORY_LIST:"nexsys4.cache.inventory.list",CACHE_RIFT_LIST:"nexsys4.cache.rift.list",CACHE_PRECACHE_CHANGED:"nexsys4.cache.precache.changed",ITEM_ROOM_ADDED:"nexsys4.item.room.added",ITEM_ROOM_REMOVED:"nexsys4.item.room.removed",ITEM_ROOM_UPDATED:"nexsys4.item.room.updated",ITEM_ROOM_LIST:"nexsys4.item.room.list",ITEM_INV_ADDED:"nexsys4.item.inv.added",ITEM_INV_REMOVED:"nexsys4.item.inv.removed",ITEM_INV_UPDATED:"nexsys4.item.inv.updated",ITEM_INV_LIST:"nexsys4.item.inv.list",QUEUE_UPDATED:"nexsys4.queue.updated",QUEUE_FLUSHED:"nexsys4.queue.flushed",QUEUE_DEFERRED:"nexsys4.queue.deferred",QUEUE_CLEARED:"nexsys4.queue.cleared",QUEUE_SENT:"nexsys4.queue.sent",QUEUE_FIRED:"nexsys4.queue.fired",QUEUE_FIRED_ACK:"nexsys4.queue.fired.ack",SERVERSIDE_AFF_PRIORITY_SET:"nexsys4.serverside.aff.priority.set",SERVERSIDE_DEF_PRIORITY_SET:"nexsys4.serverside.def.priority.set",SERVERSIDE_DIRTY:"nexsys4.serverside.dirty",SERVERSIDE_EVALUATED:"nexsys4.serverside.evaluated",RULE_ADDED:"nexsys4.rule.added",RULE_REMOVED:"nexsys4.rule.removed",RULE_ENABLED:"nexsys4.rule.enabled",RULE_DISABLED:"nexsys4.rule.disabled",RULE_PACK_LOADED:"nexsys4.rule.pack.loaded",RULE_PACK_UNLOADED:"nexsys4.rule.pack.unloaded",RULE_ORDER_CHANGED:"nexsys4.rule.order.changed",RULE_ACTIVATED:"nexsys4.rule.activated",RULE_DEACTIVATED:"nexsys4.rule.deactivated"}),be=Object.freeze({IDLE:"IDLE",PROBING_SEPARATOR:"PROBING_SEPARATOR",BOOTING:"BOOTING",PROVISIONING_CURINGSET:"PROVISIONING_CURINGSET",AWAITING_SNAPSHOTS:"AWAITING_SNAPSHOTS",CAPTURING_SNAPSHOTS:"CAPTURING_SNAPSHOTS",RUNNING:"RUNNING",FAILED:"FAILED"}),isRuntimeReadyPhase=e=>e===be.RUNNING,ye=Object.freeze({OUTPUT_COMPLETE:"SystemOutputCompleteEvent",STARTUP_BEGIN:"CuringStartupBeginEvent",STARTUP_COMPLETE:"CuringStartupCompleteEvent",STARTUP_FINALIZED:"CuringStartupFinalizedEvent",CURINGSET_READY:"CuringSetReadyEvent"}),ve={loadOnLogin:!1,flushSafetyMs:250,maxSendPerChunk:20,queueWhilePaused:!1,overrideTab:!1,customPrompt:!0,debug:!1,notices:{affGot:!0,affLost:!0,defGot:!0,defLost:!0,balanceLost:!1,balanceRecovered:!1,trackableGot:!1,trackableLost:!1,priority:!0,output:!1},ss:{transmutation:!0,sipPriority:"health",sipHealthAt:80,sipManaAt:70,mossHealthAt:90,mossManaAt:80,focus:!0,focusOverHerbs:!0,focusWithGuilt:!1,focusWithFulminated:!1,tree:"on",clot:!0,clotAt:19,clotTo:0,fracturesAbove:35,manaThreshold:10,batch:!0}},Se={paused:!0,rulesSuspended:!1,slowMode:!1,aeonLocked:!1,phase:be.IDLE,startupFailureMessage:""},xe={name:"",class:"",race:"",color:"",hp:0,maxhp:0,mp:0,maxmp:0,ep:0,maxep:0,wp:0,maxwp:0,bleed:0,rage:0,dead:!1,mount:null,wielded:{left:null,right:null}},ke={id:"",text:"",isPlayer:null,hp:""},createSettingCommand=(e,t,{reportedInStatus:a=!0}={})=>Object.freeze({commandId:e,buildCommand:t,reportedInStatus:a}),Ce=Object.freeze({afflictions:createSettingCommand("curing-afflictions",e=>`curing afflictions ${boolWord(e)}`),defences:createSettingCommand("curing-defences",e=>`curing defences ${boolWord(e)}`),sipping:createSettingCommand("curing-sipping",e=>`curing sipping ${boolWord(e)}`),transmutation:createSettingCommand("curing-transmutation",e=>`curing transmutation ${boolWord(e)}`),sipHealthAt:createSettingCommand("curing-siphealth",e=>`curing siphealth ${e}`),sipManaAt:createSettingCommand("curing-sipmana",e=>`curing sipmana ${e}`),mossHealthAt:createSettingCommand("curing-mosshealth",e=>`curing mosshealth ${e}`),mossManaAt:createSettingCommand("curing-mossmana",e=>`curing mossmana ${e}`),sipPriority:createSettingCommand("curing-priority-mode",e=>`curing priority ${String(e||"health").toLowerCase()}`),focus:createSettingCommand("curing-focus-enabled",e=>`curing focus ${boolWord(e)}`),focusOverHerbs:createSettingCommand("curing-focus-priority-mode",e=>"curing focus "+(e?"first":"second")),focusWithGuilt:createSettingCommand("curing-focus-with-guilt",e=>"curing focus "+(e?"withguilt":"withoutguilt"),{reportedInStatus:!1}),focusWithFulminated:createSettingCommand("curing-focus-with-fulminated",e=>"curing focus "+(e?"withfulminated":"withoutfulminated"),{reportedInStatus:!1}),tree:createSettingCommand("curing-tree",e=>{const t=String(e||"on").toLowerCase();return["on","off","custom"].includes(t)?`curing tree ${t}`:null}),useVault:createSettingCommand("curing-usevault",e=>`curing usevault ${boolWord(e)}`),clot:createSettingCommand("curing-useclot",e=>`curing useclot ${boolWord(e)}`),clotAt:createSettingCommand("curing-clotat",e=>`curing clotat ${e}`),clotTo:createSettingCommand("curing-clotto",e=>`curing clotto ${e}`),fallback:createSettingCommand("curing-fallback",e=>`curing fallback ${boolWord(e)}`),kaidoTransmute:createSettingCommand("curing-kaidotransmute",e=>e?"curing kaidotransmute":null),batch:createSettingCommand("curing-batch",e=>`curing batch ${boolWord(e)}`),fracturesAbove:createSettingCommand("curing-healthaffsabove",e=>`curing healthaffsabove ${e}`),manaThreshold:createSettingCommand("curing-manathreshold",e=>`curing manathreshold ${e}`)}),buildInitialObservedSettings=(e={})=>Object.fromEntries(Object.entries(e).filter(([e])=>!1!==Ce[e]?.reportedInStatus)),Ae=Object.freeze(["IRE.Rift.Request","IRE.Time.Request","Char.Skills.Get","Char.Items.Inv","IRE.Time.Request","Comm.Channel.Players","IRE.Tasks.Request"]),buildStartupSnapshotCommands=(e=ve.ss)=>[`echo SystemEvent ${ye.STARTUP_BEGIN}`,"curing off",...Object.entries(Ce).filter(([,e])=>!e.reportedInStatus).map(([t,a])=>a.buildCommand(e[t]??ve.ss[t])),"score","date","curing status","curing priority list","curing queue list","curing predictions","curing priority defence list","def","curing on",`echo SystemEvent ${ye.STARTUP_COMPLETE}`],buildStartupSnapshotBurst=e=>({gmcpRequests:[...Ae],commands:buildStartupSnapshotCommands(e)}),Ee=Object.freeze(["status","affPriorities","defPriorities"]),normalizeTimeoutMs=(e,t=1e3)=>{const a=Number(e);return Number.isFinite(a)&&a>0?Math.floor(a):t},normalizeRetryCount=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)&&a>=0?Math.floor(a):t},createStartupCoordinator=({adapter:e,systemModel:t,serverside:a,persistence:n,seedBaselineFromObservedStartup:s=()=>{},noticeCenter:i,buildPersistenceSnapshot:o,startupTimeoutMs:l=1e3,maxStartupRetries:c=0,publishStartupPhase:u=()=>{},publishLoaded:d=()=>{},releaseStartupPause:m=()=>!1,setRuntimePhase:p=(e,a={})=>{t.setRuntime({phase:e,...a})}})=>{let g=!1,h=0,b=null,y=null;const v=normalizeTimeoutMs(l),S=normalizeRetryCount(c),clearConvergenceTimer=()=>{b&&(e.clearTimeout(b),b=null)},getMissingRequiredTopics=()=>{if("function"==typeof a.getMissingStartupFlags)return a.getMissingStartupFlags(Ee);const e=a.getStartupStatus();return Ee.filter(t=>!e.flags?.[t])},formatMissingRequiredTopics=(e=[])=>e.length?` Missing required captures: ${e.join(", ")}.`:"",startConvergenceTimer=()=>{clearConvergenceTimer(),b=e.setTimeout(()=>{if(g)return;const e=getMissingRequiredTopics();retryOrFail(e.length?`Startup snapshots did not converge within ${v}ms.`:`Startup closing fence did not arrive within ${v}ms.`,{phase:"snapshot-timeout-retry",source:"startup-timeout",missingRequired:e})},v)},complete=(e="startup-check")=>{clearConvergenceTimer(),p(be.RUNNING,{startupFailureMessage:""}),s(),n.save(o()),u("startup-complete"),m({source:"startup-complete"}),d({source:"startup-complete",topic:he.SYSTEM_LOADED}),i.publish("output","startup complete",{source:e})},fail=(e,{source:t="startup-failed",missingRequired:a=[]}={})=>{clearConvergenceTimer(),g=!0;const n=`${e}${formatMissingRequiredTopics(a)}`;return p(be.FAILED,{paused:!0,startupFailureMessage:n}),u("startup-failed"),i.publish("output",n,{force:!0,source:t,title:"startup failed: ",fg:"#fee2e2",bg:"#450a0a",titleFg:"#ffffff",titleBg:"#7f1d1d"}),!1},retryOrFail=(e,{phase:t,source:a,missingRequired:n=[]}={})=>!g&&(h>=S?fail(`${e} Exhausted ${S} startup retr${1===S?"y":"ies"}.`,{source:a,missingRequired:n}):(h+=1,requestSnapshots(y,t||"snapshot-retry",{source:a,retry:h,missingRequired:n}),!1)),requestSnapshots=(a,n="snapshot-request",s={})=>{if(y="function"==typeof a?a:y,"function"!=typeof y)return[];const i={source:"startup-snapshots",phase:n,attempt:h+1,retryCount:h,...s},{gmcpRequests:o,commands:l}=buildStartupSnapshotBurst(t.getBaselineIntent().ss);p(be.AWAITING_SNAPSHOTS),u(n),e.sendGmcp(o,i);const c=y(l,i);return startConvergenceTimer(),c};return{reset:()=>{g=!1,h=0,clearConvergenceTimer(),a.resetStartupStatus?.(),p(be.IDLE,{startupFailureMessage:""})},fail,requestSnapshots,handleFenceBegin:()=>!g&&(p(be.CAPTURING_SNAPSHOTS),u("snapshot-begin"),!0),handleFenceComplete:(e="snapshot:complete:text")=>{if(g)return!1;u("snapshot-complete");const t=a.getStartupStatus();t.flags.queue||a.updateObservedQueue([]),t.flags.predictions||a.updateObservedPredictions({});const n=getMissingRequiredTopics();return n.length?retryOrFail("Startup closing fence arrived before required snapshots converged.",{phase:"snapshot-retry",source:e,missingRequired:n}):(g=!0,complete(e),!0)},dispose(){clearConvergenceTimer()},isResolved:()=>g}},we="nexsys4-default",normalizeCommand=e=>String(e||"").trim().toLowerCase().replace(/\s+/g," "),isServersideCommand=e=>{const t=normalizeCommand(e);return t.startsWith("curing ")||t.startsWith("curingset ")},normalizeSetName=e=>String(e||"").trim().toLowerCase(),toNumberMaybe=e=>{if("number"==typeof e&&Number.isFinite(e))return e;const t=Number(e);return Number.isFinite(t)?t:e},normalizeBoolean=e=>{if("boolean"==typeof e)return e;const t=String(e||"").trim().toLowerCase();return!!["on","yes","true","activated","enabled"].includes(t)||!["off","no","false","disabled"].includes(t)&&Boolean(e)},normalizeStatusValue=(e,t)=>{switch(e){case"enabled":case"reporting":case"afflictions":case"defences":case"sipping":case"transmutation":case"focus":case"focusWithGuilt":case"focusWithFulminated":case"useVault":case"clot":case"fallback":case"kaidoTransmute":case"customAffPriority":case"customDefPriority":case"batch":case"insomnia":return normalizeBoolean(t);case"focusOverHerbs":{if("boolean"==typeof t)return t;const e=String(t||"").trim().toLowerCase();return!!["focus","first","yes","on","true"].includes(e)||!["herbs","second","no","off","false"].includes(e)&&Boolean(t)}case"tree":{if("custom"===t)return"custom";if("boolean"==typeof t)return t?"on":"off";const e=String(t||"").trim().toLowerCase();return["custom","on","off"].includes(e)?e:["yes","activated","enabled","true"].includes(e)?"on":["no","disabled","false"].includes(e)?"off":e||"off"}case"sipPriority":return"mana"===String(t||"").trim().toLowerCase()?"mana":"health";default:return toNumberMaybe(t)}},buildCountablePriorityDefaults=e=>"function"!=typeof e.getCountablePriorityNames?{}:e.getCountablePriorityNames().reduce((e,t)=>(e[t]=0,e),{}),normalizeServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26?t:0},isServersideAffPriorityNumber=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},canonicalAffPriority=e=>{const t=normalizeServersideAffPriority(e);return 26===t?0:t},buildBaselineAffPriorities=e=>({...e.list().reduce((t,a)=>(t[a]=normalizeServersideAffPriority(e.getPriority(a)),t),{}),...buildCountablePriorityDefaults(e)}),buildObservedAffPriorities=e=>({...e.list().reduce((e,t)=>(e[t]=0,e),{}),...buildCountablePriorityDefaults(e)}),buildBaselineDefPriorities=(e,t="")=>e.list().reduce((a,n)=>{const s=e.get(n);return!s?.serverside||s.static?a:e.isAvailableForClass(n,t)?(a[n]=e.getPriority(n),a):a},{}),buildObservedDefPriorities=(e,t="")=>e.list().reduce((a,n)=>e.get(n)?.serverside&&e.isAvailableForClass(n,t)?(a[n]=0,a):a,{}),mergeWithResets=(e,t={})=>{const a={...e};return Object.entries(t).forEach(([t,n])=>{a[t]="RESET"!==n?n:e[t]}),a},createInitialServersideState=({baselineSettings:e,affModel:t,defModel:a,systemModel:n})=>{const s=n?.getClass?.()||"",i=buildBaselineAffPriorities(t),o=buildBaselineDefPriorities(a,s);return{baseline:{settings:{...e},affPriorities:i,defPriorities:o},sessionBaseline:{settings:{...e},affPriorities:{...i},defPriorities:{...o}},desired:{},observed:{settings:buildInitialObservedSettings(e),affPriorities:buildObservedAffPriorities(t),defPriorities:buildObservedDefPriorities(a,s),prioAff:null,manualQueue:[],predictions:{},prioritySet:""},pending:new Map,capture:{affPriorities:null,defPriorities:null,prioritySet:""},transient:{prioAff:null,manualQueue:[],predictions:{},predictionCommands:[],predictionRequests:[],fullPriorityReset:!1},diagnostics:{lastCommands:[],lastReasons:[],desyncCounter:0,recoveryCounter:0,commandRepeatCounter:0},curingsets:{sets:[],activeSet:"",priorSet:"",used:0,limit:0},startup:{flags:{status:!1,affPriorities:!1,defPriorities:!1,queue:!1,predictions:!1,curingsets:!1}},lastDiffCommands:[],dirty:!0}},createCuringSetProvisioner=({adapter:e,serverside:t,dispatchCommands:a,setRuntimePhase:n=()=>{},publishStartupPhase:s=()=>{},options:i={}}={})=>{const o=`echo SystemEvent ${ye.CURINGSET_READY}`,l=Math.max(50,Number(i.curingSetProvisionTimeoutMs??i.startupTimeoutMs??1e3)),c=Math.max(1,Number(i.maxCuringSetProvisionAttempts??4));let u=!1,d=0,m=!1,p=null,g={onReady:()=>{},onAbort:()=>{}};const clearTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},settle=()=>{u=!1,clearTimer()},finishReady=()=>{const{onReady:e}=g;settle(),e({createdThisRun:m})},finishAbort=e=>{const{onAbort:t}=g;settle(),t(e)},sendProbe=(t,n)=>{clearTimer(),d+=1,a([...t,"curingset list",o],{source:"curingset-provision",reason:n,attempt:d}),p=e?.setTimeout?.(()=>{u&&finishAbort(`nexSys4 could not confirm its curing set within ${l}ms (no response from the game). Reload to retry.`)},l)},handleBarrier=()=>{if(!u)return;clearTimer();const e=t.getCuringSets?.()??{},a=(e.sets||[]).map(e=>normalizeSetName(e)),n=normalizeSetName(e.activeSet),s=Number(e.used||0),i=Number(e.limit||0),o=a.includes(we);"nexsys4-default"!==n?d>=c?finishAbort(`nexSys4 could not secure its curing set after ${c} attempts. Reload to retry.`):o?sendProbe([`curingset switch ${we}`],"switch"):i>0&&s>=i?finishAbort(`nexSys4 needs its own curing set but all ${i} slots are full. Delete a set or CURINGSET EXPAND (25cr), then reload.`):(m=!0,sendProbe([`curingset new ${we}`,`curingset switch ${we}`],"create")):finishReady()};return{start({onReady:e=()=>{},onAbort:t=()=>{}}={}){g={onReady:e,onAbort:t},u=!0,d=0,m=!1,n(be.PROVISIONING_CURINGSET),s("provision-curingset"),sendProbe([],"list")},handleBarrier,wasCreatedThisRun:()=>m,isActive:()=>u,dispose(){settle()}}},_e=Object.freeze({STARTED:"nexSys.start(): startup initiated.",ALREADY_STARTED:"nexSys.start(): runtime is already started.",STARTUP_PENDING:"nexSys.start(): runtime is already started; startup is still in progress.",STARTUP_FAILED:"nexSys.start(): runtime startup failed. Check the console and in-game notices.",SEPARATOR_PROBE:"nexSys.start(): command separator unknown; sending config to auto-detect. Startup will resume on capture."}),Te=Object.freeze(["config","more","more"]),createRuntimeStartupOrchestrator=({adapter:e,systemModel:t,persistenceApi:a,startup:n,curingSetProvisioner:s,noticeCenter:i,syncDebugMode:o,isStarted:l,markStarted:c,setRuntimePhase:u,publishStartupPhase:d,attachEventWiring:m,promptPresenter:p,publishRuntimeStarted:g,hydrateCacheFromAdapterGmcp:h,commandDispatcher:b,debugOverride:y})=>{let v=null;const continueStartup=()=>{c(),u(be.BOOTING,{startupFailureMessage:""}),d("init"),g(),m(),p.start(),h(),s.start({onReady:()=>{n.requestSnapshots(b.sendCommands)},onAbort:e=>{n.fail(e,{source:"curingset-provision"})}})};return{dispose(){v&&(v(),v=null),s?.dispose?.()},start(){if(l()){const e=t.getRuntime().phase;return e===be.FAILED?_e.STARTUP_FAILED:e===be.RUNNING?_e.ALREADY_STARTED:_e.STARTUP_PENDING}if(v)return _e.SEPARATOR_PROBE;t.setSettings({commandSeparator:void 0},{setBaseline:!0}),a.loadPersistence(),void 0!==y&&t.setSettings({debug:Boolean(y)},{setBaseline:!0}),n.reset();const s=normalizeCommandSeparator(t.getSettings().commandSeparator),c=normalizeCommandSeparator(e.getCommandSeparator()),m=s||c;return o(),m?(t.getSettings().commandSeparator!==m&&t.setSettings({commandSeparator:m},{setBaseline:!0}),c!==m&&e.setSeparator?.(m),continueStartup(),_e.STARTED):(u(be.PROBING_SEPARATOR),d("separator-probe"),i.publish("output","Command separator not configured. Sending config to auto-detect...",{source:"separator-probe"}),v=e.addOnceTrigger({id:"nexsys4-separator-probe",regex:/\bCommandSeparator\s+(?<sep>\S+)/,action:({args:a,client:n})=>{const s=normalizeCommandSeparator(String(a.groups?.sep||"").trim());s&&(n?.current_block?.forEach(e=>{e.gag=!0}),v=null,e.setSeparator(s),t.setSettings({commandSeparator:s},{setBaseline:!0}),continueStartup())}}),Te.forEach(t=>{e.send([t],{source:"separator-probe"})}),_e.SEPARATOR_PROBE)}}},Me=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],Pe="nexsys4.parsed_gmcp_vitals",hasOwn$5=(e,t)=>Boolean(e)&&Object.prototype.hasOwnProperty.call(e,t),Oe=Object.freeze({"voice balance":"voice","entity balance":"entity"}),parseNumericVital=(e,t)=>{if(!hasOwn$5(e,t))return;const a=toNumber(e[t],NaN);return Number.isFinite(a)?a:void 0},parseResourceStat=e=>{const[t,a]=String(e).split(":");if(!t||void 0===a)return null;const n=t.trim().toLowerCase(),s=Oe[n]||n,i=a.trim();if(!s)return null;const o=toNumber(i.endsWith("%")?i.slice(0,-1):i,NaN),l=toOptionalBooleanFromYesNo(i);return{key:s,value:Number.isFinite(o)?o:i,balanceState:Number.isFinite(o)?void 0:l}},toBalancePatches=(e={})=>Object.entries(e).filter(([,e])=>void 0!==e).map(([e,t])=>({id:e,have:t})),parseGmcpVitals=(e={})=>{const t=e&&"object"==typeof e&&!Array.isArray(e)?e:{},a=Me.reduce((e,a)=>({...e,[a]:parseNumericVital(t,a)}),{}),n={balance:toOptionalBooleanFromYesNo(t.bal),equilibrium:toOptionalBooleanFromYesNo(t.eq)};return{kind:Pe,vitals:a,balances:n,balancePatches:toBalancePatches(n),resourceStats:(Array.isArray(t.charstats)?t.charstats:[]).map(parseResourceStat).filter(Boolean)}},toParsedGmcpVitals=(e={})=>"nexsys4.parsed_gmcp_vitals"!==e?.kind?parseGmcpVitals(e):{...e,balancePatches:Array.isArray(e.balancePatches)?e.balancePatches:toBalancePatches(e.balances||{})},hasOwn$4=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),isRecord$3=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),readFirstDefined=(e,t=[])=>{for(const a of t)if(hasOwn$4(e,a)&&void 0!==e[a]&&null!==e[a])return e[a]},parseAffName=(e={})=>{if("string"==typeof e)return e.toLowerCase();if(Array.isArray(e)){const t=e[0];if("string"==typeof t)return t.toLowerCase();const a=t&&"object"==typeof t?t:{};return String(a.affliction||a.defence||a.name||a.aff||a.def||"").toLowerCase()}const t=e&&"object"==typeof e?e:{};return String(t.affliction||t.defence||t.name||t.aff||t.def||"").toLowerCase()},normalizeItemLocation$2=(e={},t=e?.item||e)=>String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),normalizeInventoryDeltaName=e=>"string"==typeof e?e:e?.name||e?.item||"",createInventoryDelta=(e,t={})=>{const a=t?.item||t,n=normalizeItemLocation$2(t,a);return{location:n,inventoryDelta:{id:a?.id??t?.id,location:n,name:normalizeInventoryDeltaName(a),icon:a?.icon??null,attrib:a?.attrib??null,amount:a?.amount??a?.count??a?.qty??t?.amount??t?.count,delta:a?.delta??t?.delta,action:e.split(".").pop(),direction:e.endsWith("remove")?"remove":e.endsWith("add")?"add":void 0},dirtyReason:`gmcp:${e}`}},hasInventoryIdentity=(e={})=>void 0!==e.id&&null!==e.id&&""!==e.id||Boolean(String(e.name||"").trim()),normalizeTargetRecord=(e={})=>{if(!isRecord$3(e))return{};const t={},a=readFirstDefined(e,["id","ID"]),n=readFirstDefined(e,["Text","text","short_desc"]),s=readFirstDefined(e,["HP","hp","hpperc"]);return void 0!==a&&(t.id=a),void 0!==n&&(t.text=n),void 0!==s&&(t.hp=s),t},createGmcpApplier=({emit:e=()=>{}}={})=>{const translate=(e={})=>{const t=[],emitTranslated=(e,a)=>{t.push({topic:e,payload:a})},a=normalizeTag(e.tag||e.rawTag||e.gmcp_method),n=e.payload;switch(a){case"char.vitals":emitTranslated(pe.CHAR_VITALS,{vitals:parseGmcpVitals(n||{})});break;case"char.status":emitTranslated(pe.CHAR_STATUS,{status:n||{}});break;case"char.afflictions.list":emitTranslated(pe.CHAR_AFFLICTIONS_LIST,{afflictions:Array.isArray(n)?n:[]});break;case"char.afflictions.add":{const e=parseAffName(n);e&&emitTranslated(pe.CHAR_AFFLICTIONS_ADD,{name:e});break}case"char.afflictions.remove":{const e=parseAffName(n);e&&emitTranslated(pe.CHAR_AFFLICTIONS_REMOVE,{name:e});break}case"char.defences.list":emitTranslated(pe.CHAR_DEFENCES_LIST,{defences:Array.isArray(n)?n:[]});break;case"char.defences.add":{const e=parseAffName(n);e&&emitTranslated(pe.CHAR_DEFENCES_ADD,{name:e});break}case"char.defences.remove":{const e=parseAffName(n);e&&emitTranslated(pe.CHAR_DEFENCES_REMOVE,{name:e});break}case"ire.rift.list":emitTranslated(pe.IRE_RIFT_LIST,{rift:n||{}});break;case"ire.rift.change":emitTranslated(pe.IRE_RIFT_CHANGE,{change:n||{}});break;case"char.items.list":emitTranslated(pe.CHAR_ITEMS_LIST,{location:normalizeItemLocation$2(n),items:Array.isArray(n?.items)?n.items:[],itemSnapshotAvailable:Array.isArray(n?.items)});break;case"char.items.add":case"char.items.remove":case"char.items.update":{const e=createInventoryDelta(a,n||{}),t=hasInventoryIdentity(e.inventoryDelta)?e.inventoryDelta:null;emitTranslated(pe.CHAR_ITEMS_DELTA,{inventoryDelta:t,dirtyReason:e.dirtyReason});break}case"room.info":emitTranslated(pe.ROOM_INFO,{room:{num:n?.num??null,name:String(n?.name??""),exits:{...n?.exits||{}}}});break;case"ire.target.info":emitTranslated(pe.TARGET_INFO,{target:normalizeTargetRecord(n||{})})}return t};return{translate,apply(t){translate(t).forEach(({topic:t,payload:a})=>{e(t,a)})}}},De=Object.freeze({inv:he.ITEM_INV_LIST,room:he.ITEM_ROOM_LIST}),Re=Object.freeze({inv:Object.freeze({add:he.ITEM_INV_ADDED,remove:he.ITEM_INV_REMOVED,update:he.ITEM_INV_UPDATED}),room:Object.freeze({add:he.ITEM_ROOM_ADDED,remove:he.ITEM_ROOM_REMOVED,update:he.ITEM_ROOM_UPDATED})}),normalizeItemLocation$1=e=>String(e||"").trim().toLowerCase()||"inv",createItemTopicNotifier=({publishPublic:e=()=>{}}={})=>{const notifyList=(t,a)=>{const n=De[normalizeItemLocation$1(t)];n&&e(n,{location:normalizeItemLocation$1(t),items:Array.isArray(a)?a:[]})},notifyDelta=t=>{const a=normalizeItemLocation$1(t.location),n=String(t.action||t.direction||"").trim().toLowerCase(),s=Re[a]?.[n];s&&e(s,t)};return{notify({topic:e,payload:t}={}){e!==pe.CHAR_ITEMS_DELTA?e===pe.CHAR_ITEMS_LIST&¬ifyList(t?.location,t?.items):t?.inventoryDelta&¬ifyDelta(t.inventoryDelta)}}},Ne=new Set([pe.ROOM_INFO]),createRoomIngress=({roomModel:e,readHostRoomId:t=()=>null})=>({apply:({topic:a,payload:n={}})=>a===pe.ROOM_INFO?e.observeInfo(n.room):a===pe.CHAR_ITEMS_LIST&&"room"===n.location&&e.observeItemList({roomId:!1===n.itemSnapshotAvailable?null:t()})}),je=Object.freeze(["physical","aoe","mental","arcane"]),Ie="avoid",avoidDefId=e=>`avoid ${e}`,normalizeType=e=>String(e||"").trim().toLowerCase(),applyAvoidPostureObserved=({defModel:e,type:t,source:a="text-avoid-observed"})=>{const n=normalizeType(t);if(!je.includes(n))return!1;const s=avoidDefId(n);return je.forEach(t=>{const n=avoidDefId(t);n!==s&&e.get(n)?.have&&e.setHave(n,!1,a)}),e.setHave(s,!0,a),!0},clearAvoidPosture=({defModel:e,source:t="gmcp-avoid-absent"})=>{let a=!1;return je.forEach(n=>{a=e.setHave(avoidDefId(n),!1,t)||a}),a},applyAvoidPostureShift=({defModel:e,balanceModel:t,type:a,source:n="text-avoid-shift"})=>{const s=normalizeType(a);return!!applyAvoidPostureObserved({defModel:e,type:s,source:n})&&(t.lose(Ie,`shift:${s}`),!0)},applyAvoidPostureRecovered=({balanceModel:e,source:t="posture-ready"})=>e.gain(Ie,t),applyAvoidPostureBlocked=({balanceModel:e,source:t="posture-blocked"})=>!!e.have(Ie)&&e.lose(Ie,t),fallbackClone=(e,t=new WeakMap)=>{if(null==e)return e;if("object"!=typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){const a=[];return t.set(e,a),e.forEach(e=>a.push(fallbackClone(e,t))),a}if(e instanceof Set){const a=new Set;return t.set(e,a),[...e].forEach(e=>a.add(fallbackClone(e,t))),a}if(e instanceof Map){const a=new Map;return t.set(e,a),[...e.entries()].forEach(([e,n])=>{a.set(fallbackClone(e,t),fallbackClone(n,t))}),a}const a={};return t.set(e,a),Object.entries(e).forEach(([e,n])=>{"function"!=typeof n&&(a[e]=fallbackClone(n,t))}),a},deepClone$1=e=>{if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return fallbackClone(e)}},deepMerge=(e,t)=>{const a=Array.isArray(e)?[...e]:{...e||{}};return Object.entries(t||{}).forEach(([e,t])=>{!t||"object"!=typeof t||Array.isArray(t)||!a[e]||"object"!=typeof a[e]||Array.isArray(a[e])?a[e]=t:a[e]=deepMerge(a[e],t)}),a},deepFreeze=e=>e&&"object"==typeof e?(Object.isFrozen(e)||(Object.freeze(e),Object.keys(e).forEach(t=>deepFreeze(e[t]))),e):e,createSnapshotCache=({getVersion:e=()=>0,buildSnapshot:t=()=>({})}={})=>{let a=NaN,n=null;return()=>{const s=e();return n&&a===s||(a=s,n=deepFreeze(t())),n}},Le=Object.freeze(["head","torso","leftarm","rightarm","leftleg","rightleg"]),qe=Object.freeze(["healthy","damaged","mangled"]),Be=Object.freeze({healthy:0,damaged:1,mangled:2}),$e=new Set(qe),ze=100,Fe=Object.freeze({head:"head",torso:"torso",leftarm:"leftarm",rightarm:"rightarm",leftleg:"leftleg",rightleg:"rightleg"}),Ge=Object.freeze({damagedhead:{limb:"head",stage:"damaged"},damagedleftarm:{limb:"leftarm",stage:"damaged"},damagedrightarm:{limb:"rightarm",stage:"damaged"},damagedleftleg:{limb:"leftleg",stage:"damaged"},damagedrightleg:{limb:"rightleg",stage:"damaged"},mangledhead:{limb:"head",stage:"mangled"},mangledleftarm:{limb:"leftarm",stage:"mangled"},mangledrightarm:{limb:"rightarm",stage:"mangled"},mangledleftleg:{limb:"leftleg",stage:"mangled"},mangledrightleg:{limb:"rightleg",stage:"mangled"},mildtrauma:{limb:"torso",stage:"damaged"},serioustrauma:{limb:"torso",stage:"mangled"}}),He=Object.freeze({brokenleftarm:"leftarm",brokenrightarm:"rightarm",brokenleftleg:"leftleg",brokenrightleg:"rightleg"}),Ue=new Set(Object.values(He)),Ve=Object.freeze(["percent","hits","stage","broken"]),normalizeLimbId=e=>{const t=String(e||"").trim().toLowerCase().replace(/\s+/g,"");return Fe[t]||t},normalizeAffName=e=>String(e||"").trim().toLowerCase(),deriveLimbAfflictionState=(e=[])=>{const t={},a={};return Le.forEach(e=>{t[e]="healthy",a[e]=!1}),e.forEach(e=>{const n=normalizeAffName(e),s=He[n];if(s)return void(a[s]=!0);const i=Ge[n];i&&Be[i.stage]>Be[t[i.limb]]&&(t[i.limb]=i.stage)}),{stages:t,broken:a}},createLimbModel=({now:e=Date.now}={})=>{const t=new Set;let a=0;const n=new Map,s=Le.reduce((t,a)=>(t[a]={id:a,percent:0,hits:0,stage:"healthy",broken:!1,lastDamageAt:null,updatedAt:e()},t),{}),buildEntrySnapshot=(e={})=>({id:e.id,percent:e.percent,hits:e.hits,stage:e.stage,broken:e.broken,lastDamageAt:e.lastDamageAt,updatedAt:e.updatedAt}),i=new Map,getEntrySnapshot=e=>s[e]?(i.has(e)||i.set(e,createSnapshotCache({getVersion:()=>n.get(e)??0,buildSnapshot:()=>buildEntrySnapshot(s[e])})),i.get(e)()):null,o=createSnapshotCache({getVersion:()=>a,buildSnapshot:()=>Le.reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),capture=e=>Ve.reduce((t,a)=>(t[a]=e[a],t),{}),commitLimbChange=(i,o,{source:l="manual",amount:c,at:u}={})=>{const d=s[i],m=Ve.filter(e=>d[e]!==o[e]);if(0===m.length)return!1;d.updatedAt=u??e(),a+=1,n.set(i,(n.get(i)??0)+1);const p={limb:i,changed:m,value:getEntrySnapshot(i),previous:o,source:l,at:d.updatedAt};return void 0!==c&&(p.amount=c),t.forEach(e=>e("LimbUpdated",p)),!0},zeroCounter=e=>{e.percent=0,e.hits=0,e.lastDamageAt=null},isCounterStale=(e,t)=>null!==e.lastDamageAt&&t-e.lastDamageAt>=18e4,expireStale=t=>{const a=Number(t),n=Number.isFinite(a)?a:e();return Le.reduce((e,t)=>{const a=s[t];if(!isCounterStale(a,n))return e;const i=capture(a);return zeroCounter(a),commitLimbChange(t,i,{source:"idle-expiry",at:n})||e},!1)};return{onChange:e=>(t.add(e),()=>t.delete(e)),list:()=>[...Le],snapshot:()=>o(),hit:(t,a,n="manual")=>{const i=normalizeLimbId(t),o=s[i],l=Number(a);if(!o||!Number.isFinite(l)||l<=0)return!1;if("mangled"===o.stage)return!1;const c=e(),u=capture(o);return isCounterStale(o,c)&&zeroCounter(o),o.percent=Math.min(ze,o.percent+l),o.hits+=1,o.lastDamageAt=c,"torso"===i&&o.percent>=ze&&(o.stage="healthy"===o.stage?"damaged":"mangled",zeroCounter(o)),commitLimbChange(i,u,{source:n,amount:l,at:c})},clearDamage:(e,t="manual")=>{const a=normalizeLimbId(e),n=s[a];if(!n)return!1;const i=capture(n);return zeroCounter(n),commitLimbChange(a,i,{source:t})},reset:(e,t="manual")=>{const a=normalizeLimbId(e),n=s[a];if(!n)return!1;const i=capture(n);return n.stage="healthy",n.broken=!1,zeroCounter(n),commitLimbChange(a,i,{source:t})},setStage:(e,t,a="manual")=>{const n=normalizeLimbId(e),i=s[n],o=String(t||"").trim().toLowerCase();if(!i||!$e.has(o)||i.stage===o)return!1;const l=capture(i);return i.stage=o,zeroCounter(i),commitLimbChange(n,l,{source:a})},setBroken:(e,t,a="manual")=>{const n=normalizeLimbId(e),i=s[n];if(!i)return!1;const o=Boolean(t)&&Ue.has(n);if(i.broken===o)return!1;const l=capture(i);return i.broken=o,commitLimbChange(n,l,{source:a})},syncFromAfflictions:(e=[],t="affliction-list")=>{const a=deriveLimbAfflictionState(e);return Le.reduce((e,n)=>{const i=s[n],o=a.stages[n],l=a.broken[n];if(i.stage===o&&i.broken===l)return e;const c=capture(i);return i.stage!==o&&(i.stage=o,zeroCounter(i)),i.broken=l,commitLimbChange(n,c,{source:t})||e},!1)},expireStale,get:e=>getEntrySnapshot(normalizeLimbId(e))}},buildLimbSnapshot=(e,t)=>{const a=e?.get?.(t);return a?{id:a.id,percent:a.percent,hits:a.hits,stage:a.stage,broken:a.broken}:null},didLimbChange=(e,t)=>Boolean(e&&t)&&(e.percent!==t.percent||e.hits!==t.hits||e.stage!==t.stage||e.broken!==t.broken),syncTorsoTrauma=({affModel:e,serverside:t,stage:a,source:n,at:s})=>{switch(a){case"damaged":return e?.lose?.("serioustrauma",{source:n,at:s}),e?.got?.("mildtrauma",{source:n,at:s}),t?.removePrediction?.("serioustrauma"),t?.addPrediction?.("mildtrauma"),!0;case"mangled":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.got?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.addPrediction?.("serioustrauma"),!0;case"healthy":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.lose?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.removePrediction?.("serioustrauma"),!0;default:return!1}},buildUnknownLimbResult=e=>({changed:!1,traumaSynced:!1,stageChanged:!1,limb:e,before:null,after:null}),buildObserveResult=(e,t,a,n)=>({changed:didLimbChange(t,a)||n,traumaSynced:n,stageChanged:t?.stage!==a?.stage,limb:e,before:t,after:a}),applyObservedLimbHit=({limbModel:e,affModel:t,serverside:a,limb:n,amount:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return buildUnknownLimbResult(l);e.hit(l,s,i);const u=buildLimbSnapshot(e,l);return buildObserveResult(l,c,u,"torso"===l&&c.stage!==u?.stage&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o}))},applyObservedLimbReset=({limbModel:e,limb:t,source:a="manual"})=>{const n=normalizeLimbId(t),s=buildLimbSnapshot(e,n);return s?(e.clearDamage(n,a),buildObserveResult(n,s,buildLimbSnapshot(e,n),!1)):buildUnknownLimbResult(n)},applyObservedLimbStage=({limbModel:e,affModel:t,serverside:a,limb:n,stage:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return buildUnknownLimbResult(l);e.setStage(l,s,i);const u=buildLimbSnapshot(e,l);return buildObserveResult(l,c,u,"torso"===l&&c.stage!==u?.stage&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o}))},applySkillBalanceObserved=({balanceModel:e,balanceId:t,durationMs:a,source:n="nexskill"})=>{const s=String(t||"").trim().toLowerCase(),i=Number(a);return!(!s||!Number.isFinite(i)||i<=0)&&e.observeDuration(s,{durationMs:i,source:n,serverDuration:!1})},Ye=new Set(["char.items.add","char.items.remove","char.items.update"]),registerAdapterEvents=({register:e,options:t,queueTranslatedGmcp:a,publishPublic:n,publishPublicScoped:s,markDirty:i,flushCycle:o,outputCycle:l,startup:c,curingSetProvisioner:u,curingSetGuard:d,curingMasterSwitch:m,queueController:p,serverside:g,balanceModel:h,defModel:b,adapter:y,systemModel:v,affModel:S,cacheModel:x,limbModel:k,roomModel:C,savePersistence:A})=>{e("GmcpEvent",e=>{a(e);const s=normalizeTag(e?.tag||e?.rawTag||e?.gmcp_method);!0===t.publishRawGmcp&&n(he.RAW_GMCP,{source:"adapter-gmcp",tag:s,payload:e?.payload??e?.gmcp_args??null}),Ye.has(s)||i("gmcp-buffered")}),e("PromptEvent",()=>{C.completeObservationBlock(),k?.expireStale?.(y?.now?.()??Date.now())&&i("limb-idle-expiry"),o("prompt")}),e("ForcePopulateEvent",()=>o("force"));for(const[E,w]of[["RoomDisplayTextEvent","observeDisplay"],["RoomWallObservedEvent","observeWall"],["RoomGroundObservedEvent","observeGround"]])e(E,e=>C[w](e));e("SystemOutputCompleteEvent",()=>{l.markComplete()&&o("output-complete")}),e(ye.CURINGSET_READY,()=>{u?.handleBarrier()}),e(ye.STARTUP_BEGIN,()=>{c.handleFenceBegin()}),e(ye.STARTUP_COMPLETE,()=>{c.handleFenceComplete("snapshot:complete:text")}),e("QueueFiredTextEvent",e=>{e?.queueName&&p.acknowledgeFired(e.queueName)}),e("QueueSentTextEvent",e=>{const t=e?.queueId||e?.queueName||e?.queueType;t&&p.acknowledgeSent(t,e)}),e("AllQueuesClearedTextEvent",()=>{p.listQueues().forEach(e=>{p.clear(e)})}),e("CommandSeparatorChangedTextEvent",({separator:e}={})=>{const t=normalizeCommandSeparator(e);t&&(y?.setSeparator(t),v?.setSettings({commandSeparator:t},{setBaseline:!0}),A?.())}),e("CharacterResourceTextEvent",(e={})=>{const t=String(e.key||"").trim().toLowerCase();t&&v?.updateResource?.(t,e.value,{numeric:!0,min:e.min,max:e.max,source:e.source||"text-trigger"})&&i(`text:resource:${t}`)}),e("BalanceStateTextEvent",e=>{const t=String(e?.id||"").trim().toLowerCase();if(!t)return;const a=String(e?.reason||e?.source||"text"),n=Number(e?.durationSeconds);if(!0!==e?.have){if(!1===e?.have){if(Number.isFinite(n)&&n>0)return void h.observeServerUse(t,n,{source:a});h.lose(t,a)}}else h.gain(t,a)}),e("SkillBalanceObservedEvent",(e={})=>{applySkillBalanceObserved({balanceModel:h,balanceId:e.id,durationMs:e.durationMs,source:e.reason||e.source||"nexskill"})}),e("AvoidPostureShiftedTextEvent",e=>{applyAvoidPostureShift({defModel:b,balanceModel:h,type:e?.type})&&i(`text:avoid:${String(e?.type||"").toLowerCase()}`)}),e("AvoidPostureObservedTextEvent",e=>{applyAvoidPostureObserved({defModel:b,type:e?.type,source:e?.reason||"text-avoid-observed"})&&i(`text:avoid-observed:${String(e?.type||"").toLowerCase()}`)}),e("AvoidPostureRecoveredTextEvent",()=>{applyAvoidPostureRecovered({balanceModel:h})}),e("AvoidPostureBlockedTextEvent",()=>{applyAvoidPostureBlocked({balanceModel:h})}),e("CacheRiftOutTextEvent",(e={})=>{const t=x?.observeRiftOutText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-out:${t.name}`)}),e("CacheRiftInTextEvent",(e={})=>{const t=x?.observeRiftInText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-in:${t.name}`)}),e("CacheRiftFullTextEvent",(e={})=>{const t=x?.invalidateRiftSnapshot?.({source:e.source||"text-trigger"});y?.sendGmcp?.(["IRE.Rift.Request"],{source:"cache-rift-full-text"}),t&&i("text:cache-rift-resync")}),e("CacheInventoryEmptyTextEvent",(e={})=>{const t=x?.observeInventoryEmptyText?.({item:e.item,source:e.source||"text-trigger"});t?.name&&(i(`text:cache-empty:${t.name}`),y?.sendGmcp?.(["Char.Items.Inv"],{source:"cache-inventory-empty-text",item:e.item||"",name:t.name}))}),e("CacheCurativeConsumedTextEvent",(e={})=>{const t=x?.observeCurativeConsumedText?.({item:e.item,amount:e.amount,source:e.source||"text-trigger"});t?.name&&i(`text:cache-consume:${t.name}`)}),e("CacheInventoryDeltaTextEvent",(e={})=>{const t=x?.observeInventoryDeltaText?.({item:e.item,amount:e.amount,delta:e.delta,source:e.source||"text-trigger"});t?.name&&i(`text:cache-${t.delta>0?"add":"remove"}:${t.name}`)}),e("LimbDamageTextEvent",e=>{const t=applyObservedLimbHit({limbModel:k,affModel:S,serverside:g,limb:e?.limb,amount:e?.amount,source:String(e?.source||"text-trigger"),at:e?.at});t.changed&&"torso"===t.limb&&t.stageChanged&&i(`text-limb-torso:${t.after?.stage||"unknown"}`)}),e("LimbResetTextEvent",e=>{const t=applyObservedLimbReset({limbModel:k,limb:e?.limb,source:String(e?.source||"text-trigger")});t.changed&&i(`text-limb-cleared:${t.limb}`)}),e("ServersideStatusTextEvent",(e={})=>{"enabled"!==String(e.key||"").trim().toLowerCase()?g.parseStatusLine(e):m?.observeConfirmation(Boolean(e.value))}),e("ServersideStatusSnapshotCompleteTextEvent",()=>{g.markStartupCaptured("status")}),e("ServersideAffPrioSnapshotOpenTextEvent",e=>{g.beginObservedAffPrioritySnapshot(e?.set||"")}),e("ServersideAffPrioSnapshotCompleteTextEvent",()=>{g.completeObservedAffPrioritySnapshot()}),e("ServersideDefPrioSnapshotOpenTextEvent",e=>{g.beginObservedDefPrioritySnapshot(e?.set||"")}),e("ServersideDefPrioSnapshotCompleteTextEvent",()=>{g.completeObservedDefPrioritySnapshot()}),e("ServersideAffPrioTextEvent",e=>{if(!e?.aff)return;const t=Number(e.prio),a=g.updateObservedAffPriority(e.aff,t);if("live-confirmation"===e.source){const n="function"==typeof S?.normalizePriorityName?S.normalizePriorityName(e.aff):String(e.aff||"").toLowerCase();s(he.SERVERSIDE_AFF_PRIORITY_SET,{id:n,priority:t,source:"live-confirmation",accepted:a},n)}}),e("ServersideDefPrioTextEvent",e=>{if(!e?.def)return;const t=String(e.def||"").toLowerCase(),a=Number(e.prio),n=g.updateObservedDefPriority(t,a);"live-confirmation"===e.source&&s(he.SERVERSIDE_DEF_PRIORITY_SET,{id:t,priority:a,source:"live-confirmation",accepted:n},t)}),e("ServersideQueueListTextEvent",e=>{g.updateObservedQueue(e?.queue||[])}),e("ServersidePredictionsTextEvent",e=>{g.updateObservedPredictions(e?.predictions||{})}),e("ServersidePredictionConfirmTextEvent",(e={})=>{g.confirmPrediction?.(e.aff)}),e("ServersideCuringSetsTextEvent",e=>{g.observeCuringSets({sets:e?.sets||[],activeSet:e?.activeSet||"",used:e?.used,limit:e?.limit})}),e("ServersideCuringSetSwitchedTextEvent",e=>{d?.handleSwitched({set:e?.set||""})})},Qe={short:{rl:"right leg",ll:"left leg",ra:"right arm",la:"left arm",h:"head",tt:"torso",c:"centre",l:"left",r:"right"},long:{"right leg":"rl","left leg":"ll","right arm":"ra","left arm":"la",head:"h",torso:"tt",centre:"c",left:"l",right:"r"}},We=["e","w","s","n","ne","se","sw","nw","in","out","d","u"],Ke={e:"east",w:"west",s:"south",n:"north",ne:"northeast",se:"southeast",sw:"southwest",nw:"northwest",in:"in",out:"out",down:"down",d:"down",u:"up",up:"up"},Xe={e:"west",w:"east",s:"north",n:"south",ne:"southwest",se:"northwest",sw:"northeast",nw:"southeast",in:"out",out:"in",down:"up",d:"up",u:"down",up:"down"},Je={east:"e",west:"w",south:"s",north:"n",northeast:"ne",northwest:"nw",southeast:"se",southwest:"sw",in:"in",out:"out",down:"d",up:"up"},Ze=["Alchemist","Apostate","Bard","Blademaster","Depthswalker","Dragon","Druid","Infernal","Jester","Magi","Monk","Shikudo","Occultist","Paladin","Pariah","Priest","Psion","Runewarden","Sentinel","Serpent","Shaman","Sylvan","Unnamable","Air Elemental Lord","Earth Elemental Lord","Fire Elemental Lord","Water Elemental Lord"],normalizeClassName=(e="")=>{const t=String(e||"").trim();return t?/\bdragon\b/i.test(t)?"Dragon":Ze.find(e=>e.toLowerCase()===t.toLowerCase())||t:""},classesMatch=(e="",t="")=>normalizeClassName(e).toLowerCase()===normalizeClassName(t).toLowerCase(),classListIncludes=(e=[],t="")=>{const a=Array.isArray(e)?e:e?[e]:[];if(!a.length)return!0;const n=normalizeClassName(t).toLowerCase();return a.some(e=>normalizeClassName(e).toLowerCase()===n)},hasOwn$3=(e,t)=>Object.prototype.hasOwnProperty.call(e||{},t),normalizeCommandList=e=>{if(Array.isArray(e))return e.map(e=>String(e||"").trim()).filter(Boolean);if(e){const t=String(e).trim();return t?[t]:[]}return[]},normalizeStringList=e=>{if(Array.isArray(e))return e.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean);if(e){const t=String(e).trim().toLowerCase();return t?[t]:[]}return[]},normalizePrioritySeed=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},normalizeDefenseConfig=(e={})=>{const t=!1!==e.serverside;return deepFreeze({...deepClone$1(e),command:normalizeCommandList(e.command),stopCommand:normalizeCommandList(e.stopCommand),bals_req:normalizeStringList(e.bals_req),bals_used:normalizeStringList(e.bals_used),stopBals_req:normalizeStringList(e.stopBals_req),stopBals_used:normalizeStringList(e.stopBals_used),blocks:deepClone$1(e.blocks||[]),stopBlocks:deepClone$1(e.stopBlocks||[]),skills:normalizeStringList(e.skills),opps:normalizeStringList(e.opps),serverside:t,preempt:!0===e.preempt,static:!0===e.static,clientOnly:!0===e.clientOnly,trackOnly:!0===e.trackOnly,defaultPriority:normalizePrioritySeed(e.defaultPriority)})},createDefEntry=(e,t,a,n)=>({id:e,have:!1,lastChangeAt:0,order:t,seedStatic:a.static,defaultPriority:n,priorityOverride:null,staticRequested:!1,command:a.command,stopCommand:a.stopCommand,bals_req:a.bals_req,bals_used:a.bals_used,stopBals_req:a.stopBals_req,stopBals_used:a.stopBals_used,blocks:a.blocks,stopBlocks:a.stopBlocks,skills:a.skills,opps:a.opps,serverside:a.serverside,preempt:a.preempt,static:a.static,clientOnly:a.clientOnly,trackOnly:a.trackOnly}),resolveDefensePriority=(e={})=>null===e.priorityOverride||void 0===e.priorityOverride?Number(e.defaultPriority??-1):Number(e.priorityOverride),matchesClass=(e=[],t="")=>!e||!e.length||(Array.isArray(t)?t.some(t=>classListIncludes(e,t)):classListIncludes(e,t)),isActiveStaticPriority=e=>{const t=Number(e);return Number.isFinite(t)&&t>0},isActiveDefensePriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=25},createInitialDefenseState=({defTable:e={},defPrios:t={}}={})=>{const a=Object.keys(e),n={},s={};return a.forEach((a,i)=>{const o=normalizeDefenseConfig(e[a]),l=hasOwn$3(t,a)?normalizePrioritySeed(t[a]):o.defaultPriority;s[a]=l,n[a]=createDefEntry(a,i,o,l)}),{list:a,state:n,defaultPrios:s}},normalizeObservedDefenseId=e=>("string"==typeof e?e:String(e?.name||e?.id||e||"")).toLowerCase().replace(/\s*\(([^)]+)\)/g," $1").trim(),normalizeItemLocation=e=>String(e||"").trim().toLowerCase()||"inv",registerGmcpBridges=({registerGmcpListener:e,systemModel:t,balanceModel:a,affModel:n,defModel:s,cacheModel:i,limbModel:o,serverside:l,markDirty:c})=>{const syncLimbsFromAfflictions=e=>{o.syncFromAfflictions(n.currentSorted(),e)};e(pe.CHAR_VITALS,({vitals:e}={})=>{t.updateVitals(e),a.applyVitals(e),c("gmcp:vitals")}),e(pe.CHAR_STATUS,({status:e}={})=>{t.updateStatus(e||{}),c("gmcp:status")}),e(pe.CHAR_AFFLICTIONS_LIST,({afflictions:e}={})=>{const t=Array.isArray(e)?e:[];n.applyList(t),syncLimbsFromAfflictions("gmcp-list"),c("gmcp:aff-list")}),e(pe.CHAR_AFFLICTIONS_ADD,({name:e}={})=>{e&&(n.got(e,{source:"gmcp-add"}),syncLimbsFromAfflictions("gmcp-add"),c(`gmcp:aff-add:${e}`))}),e(pe.CHAR_AFFLICTIONS_REMOVE,({name:e}={})=>{e&&(n.lose(e,{source:"gmcp-remove"}),syncLimbsFromAfflictions("gmcp-remove"),l.getTransientPrioAff()===e&&l.clearPrioAff(),c(`gmcp:aff-remove:${e}`))}),e(pe.CHAR_DEFENCES_LIST,({defences:e}={})=>{const t=Array.isArray(e)?e:[];s.applyList(t,"gmcp-list"),t.some(e=>"avoid"===normalizeObservedDefenseId(e))||clearAvoidPosture({defModel:s,source:"gmcp-avoid-list-absent"}),c("gmcp:def-list")}),e(pe.CHAR_DEFENCES_ADD,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);if(t){if(t.startsWith("parrying "))for(const e of s.list())e!==t&&e.startsWith("parrying ")&&s.get(e)?.have&&s.setHave(e,!1,"gmcp-parry-implied-remove");s.setHave(t,!0,"gmcp-add"),c(`gmcp:def-add:${t}`)}}),e(pe.CHAR_DEFENCES_REMOVE,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);t&&("avoid"===t?clearAvoidPosture({defModel:s,source:"gmcp-avoid-remove"}):s.setHave(t,!1,"gmcp-remove"),c(`gmcp:def-remove:${t}`))}),e(pe.IRE_RIFT_LIST,({rift:e}={})=>{i.observeRiftSnapshot?.(e||{}),c("gmcp:rift-list")}),e(pe.IRE_RIFT_CHANGE,({change:e}={})=>{const t=i.observeRiftChange?.(e||{});t?.name&&c(`gmcp:rift-change:${t.name}`)}),e(pe.CHAR_ITEMS_LIST,({items:e,location:a}={})=>{const n=normalizeItemLocation(a),s=Array.isArray(e)?e:[];if("inv"===n){i.observeInventorySnapshot?.(s);const toWieldedItem=e=>e?{id:e.id??null,name:String(e.name||""),icon:e.icon||null}:null;t.updateWielded("left",toWieldedItem(s.find(e=>"l"===e.attrib))),t.updateWielded("right",toWieldedItem(s.find(e=>"L"===e.attrib)))}c("gmcp:items-list")}),e(pe.CHAR_ITEMS_DELTA,({inventoryDelta:e}={})=>{if(e){const a=normalizeItemLocation(e.location),n="inv"===a||"room"===a?i.observeItemDelta?.(e):null;if(n?.changed&&n.name&&c(`gmcp:room-pickup:${n.name}`),"inv"===a&&"update"===e.action){const{id:a,name:n,icon:s,attrib:i}=e,o=t.getChar().wielded;o.left?.id===a&&"l"!==i&&t.updateWielded("left",null),o.right?.id===a&&"L"!==i&&t.updateWielded("right",null),"l"===i?t.updateWielded("left",{id:a,name:n,icon:s}):"L"===i&&t.updateWielded("right",{id:a,name:n,icon:s})}}}),e(pe.TARGET_INFO,({target:e}={})=>{t.updateTarget(e||{}),c("gmcp:target")})},normalizeBridgeSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),isSystemOutputBalance=(e={})=>"systemoutput"===normalizeBridgeSegment(e?.id),et=Object.freeze(["balance","equilibrium"]),getCounterpartEqbalBalance=e=>{const t=normalizeBridgeSegment(e);return et.includes(t)?"balance"===t?"equilibrium":"balance":null},buildEqbalRecoveredPayload=(e,t={})=>{const a=normalizeBridgeSegment(t?.id),n=getCounterpartEqbalBalance(a);return n&&e?.have?.(a)&&e.have(n)?{...t,id:"eqbal",have:!0,recoveredId:a,balances:{balance:Boolean(e.have("balance")),equilibrium:Boolean(e.have("equilibrium"))}}:null},getRecoveredBalanceSeconds=(e={})=>{const t=Number(e?.durationMs);if(Number.isFinite(t)&&t>0)return t/1e3;const a=Number(e?.lastLostAtMs),n=Number(e?.lastGotAtMs);return Number.isFinite(a)&&Number.isFinite(n)&&n>a?(n-a)/1e3:Number(e?.durationSeconds??e?.baseDurationSeconds)},formatBalanceNotice=(e={})=>{const t=String(e?.id||"").trim(),a=getRecoveredBalanceSeconds(e);return t?!Number.isFinite(a)||a<=0?t:`${t}(${a.toFixed(2)})`:""},isCountableAffliction=(e={})=>Number(e?.max)>1,formatAfflictionNotice=(e={})=>{const t=String(e?.name||"").trim();if(!t)return"";const a=Number(e?.count);return isCountableAffliction(e)&&Number.isFinite(a)?`${t}(${a})`:t},shouldEchoPriorityChange=(e={})=>["manual","public-api"].includes(String(e?.source||"").toLowerCase()),formatPriorityNotice=(e={},t)=>{const a=String(t||"").trim(),n=Number(e?.priority??e?.value),s=normalizeBridgeSegment(e?.domain),i=s&&"keepup"!==s?` (${s})`:!0===e?.static?" (static)":"";return a?Number.isFinite(n)?`${a} ${n}${i}`:`${a}${i}`:""},tt=Object.freeze({RuleAdded:he.RULE_ADDED,RuleRemoved:he.RULE_REMOVED,RuleEnabled:he.RULE_ENABLED,RuleDisabled:he.RULE_DISABLED,RulePackLoaded:he.RULE_PACK_LOADED,RulePackUnloaded:he.RULE_PACK_UNLOADED,RuleOrderChanged:he.RULE_ORDER_CHANGED}),rt=Object.freeze({hp:{topic:he.SYSTEM_HEALTH_CHANGED,maxKey:"maxhp"},mp:{topic:he.SYSTEM_MANA_CHANGED,maxKey:"maxmp"},rage:{topic:he.SYSTEM_RAGE_CHANGED},bleed:{topic:he.SYSTEM_BLEED_CHANGED}}),buildVitalResourcePayload=(e={},t,{maxKey:a}={})=>{const n=e.changedFields?.[t];if(!n)return null;const s=n.current,i=n.previous;return{max:a?e.current?.[a]:s,current:s,previous:i,diff:s-i}},publishVitalResourceTopics=(e,t={})=>{Object.entries(rt).forEach(([a,n])=>{const s=buildVitalResourcePayload(t,a,n);s&&e(n.topic,s)})},registerSystemModelBridge=({registerModelListener:e,publishPublic:t,syncDebugMode:a,systemModel:n,serverside:s,handleVitalsSideEffects:i})=>{e(n.onChange((e,n={})=>{switch(e){case"VitalsUpdated":t(he.SYSTEM_VITALS_CHANGED,n),publishVitalResourceTopics(t,n),i();break;case"StatusUpdated":t(he.SYSTEM_STATUS_CHANGED,n);break;case"ClassChanged":s.setBaselineFromRuntime(),t(he.SYSTEM_CLASS_CHANGED,n);break;case"TargetUpdated":t(he.SYSTEM_TARGET_CHANGED,n);break;case"RuntimeStateChanged":t(he.SYSTEM_RUNTIME_CHANGED,n);break;case"PauseStateChanged":t(he.SYSTEM_PAUSE_CHANGED,n),t(n.paused?he.SYSTEM_PAUSED:he.SYSTEM_UNPAUSED,n);break;case"SettingsChanged":n.changedKeys?.includes("debug")&&a(),t(he.SYSTEM_SETTINGS_CHANGED,n);break;case"BaselineIntentChanged":t(he.SYSTEM_BASELINE_CHANGED,n);break;case"WieldedUpdated":t(he.SYSTEM_WIELDED_CHANGED,n);break;case"MountUpdated":t(he.SYSTEM_MOUNT_CHANGED,n);break;case"DeathDetected":t(he.SYSTEM_DEATH_DETECTED,n)}}))},registerAfflictionModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:s,affModel:i,serverside:o,runtimeControl:l})=>{e(i.onChange((e,c={})=>{if(("AffGot"===e||"AffLost"===e)&&"aeon"===c?.name){const e=i.haveAff("aeon");s.setRuntime({aeonLocked:e}),l?.setSlowMode(e,{source:"aeon"})}switch(e){case"AffGot":a(he.AFF_GOT,c,c.name),n.publish("affGot",formatAfflictionNotice(c),{...c,action:"got"});break;case"AffLost":a(he.AFF_LOST,c,c.name),n.publish("affLost",c.name,{...c,action:"lost"}),o.getTransientPrioAff()===c.name&&o.clearPrioAff();break;case"AffStackChanged":{a(he.AFF_STACK_CHANGED,c,c.name);const e=Number(c.count),t=Number(c.previousCount);if(Number.isFinite(e)&&Number.isFinite(t)&&e>0&&t>0&&e!==t){const a=e>t,s=Math.max(e,t);n.publish(a?"affGot":"affLost",formatAfflictionNotice({...c,count:s}),{...c,action:a?"got":"lost"})}break}case"AffPriorityChanged":t(he.AFF_PRIORITY_CHANGED,c),shouldEchoPriorityChange(c)&&n.publish("priority",formatPriorityNotice(c,c.name),{...c,action:"set",subject:"aff"})}}))},registerDefenseModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:s})=>{e(s.onChange((e,s={})=>{switch(e){case"DefGot":a(he.DEF_GOT,s,s.id),n.publish("defGot",s.id,{...s,action:"got"});break;case"DefLost":a(he.DEF_LOST,s,s.id),n.publish("defLost",s.id,{...s,action:"lost"});break;case"DefPriorityChanged":t(he.DEF_PRIORITY_CHANGED,s),shouldEchoPriorityChange(s)&&n.publish("priority",formatPriorityNotice(s,s.id),{...s,action:"set",subject:"def"})}}))},registerBalanceModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:s})=>{e(s.onChange((e,i={})=>{switch(e){case"BalanceGot":a(he.BALANCE_GOT,i,i.id);{const e=buildEqbalRecoveredPayload(s,i);e&&t(he.EQBAL_GOT,e)}isSystemOutputBalance(i)||n.publish("balanceRecovered",formatBalanceNotice(i),{...i,action:"got"});break;case"BalanceLost":a(he.BALANCE_LOST,i,i.id),n.publish("balanceLost",i.id,{...i,action:"lost"});break;case"BalanceReset":a(he.BALANCE_RESET,i,i.id);break;case"BalanceDurationObserved":a(he.BALANCE_DURATION_OBSERVED,i,i.id);break;case"BalanceLossTimerRestarted":t(he.BALANCE_TIMER_RESTARTED,i)}}))},registerLimbModelBridge=({registerModelListener:e,publishPublicScoped:t,limbModel:a})=>{e(a.onChange((e,a={})=>{"LimbUpdated"===e&&t(he.LIMB_UPDATED,a,a.limb)}))},registerCacheModelBridge=({registerModelListener:e,publishPublic:t,cacheModel:a})=>{e(a.onChange((e,a={})=>{switch(e){case"CacheAmountChanged":t(he.CACHE_AMOUNT_CHANGED,a);break;case"CacheInventoryListApplied":t(he.CACHE_INVENTORY_LIST,a);break;case"CacheRiftListApplied":t(he.CACHE_RIFT_LIST,a);break;case"CacheDesiredPrecacheChanged":t(he.CACHE_PRECACHE_CHANGED,a)}}))},registerQueueModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:s})=>{e(s.onChange((e,i={})=>{switch(e){case"QueueFlushed":t(he.QUEUE_FLUSHED,i),n.publish("output",`Queue sent: ${i.queueId}`,i);break;case"QueueDeferred":t(he.QUEUE_DEFERRED,i);break;case"QueueUpdated":t(he.QUEUE_UPDATED,i);break;case"QueueCleared":t(he.QUEUE_CLEARED,i);break;case"QueueSentAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueName||i.queueId;a(he.QUEUE_SENT,{...i,queueName:e},e);break}case"QueueFiredAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueId;t(he.QUEUE_FIRED_ACK,i),a(he.QUEUE_FIRED,{...i,queueName:e},e);break}}}))},registerServersideModelBridge=({registerModelListener:e,publishPublic:t,serverside:a,onServersideDirty:n})=>{e(a.onChange((e,a={})=>{switch(e){case"ServersideDirty":n?.(a),t(he.SERVERSIDE_DIRTY,a);break;case"ServersideEvaluated":t(he.SERVERSIDE_EVALUATED,a)}}))},registerTrackableModelBridge=({registerModelListener:e,noticeCenter:t,trackableModel:a,onTrackableDirty:n})=>{"function"==typeof a?.onChange&&e(a.onChange((e,a={})=>{switch(e){case"TrackableGot":t.publish("trackableGot",a.label||a.name,{...a,action:"got"}),n?.(`trackable:${a.name||"unknown"}:got`);break;case"TrackableRefreshed":n?.(`trackable:${a.name||"unknown"}:refreshed`);break;case"TrackableLost":t.publish("trackableLost",a.label||a.name,{...a,action:"lost"}),n?.(`trackable:${a.name||"unknown"}:lost`)}}))},registerRulesModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,rules:n,runtimeControl:s,systemModel:i,onRulesDirty:o,onRulesRecheck:l})=>{let c=new Set;const syncRuleSuspendPause=(e=[])=>{c=new Set((e||[]).filter(Boolean).map(e=>String(e)));const t=c.size>0;i?.getRuntime?.().rulesSuspended!==t&&(i?.setRuntime?.({rulesSuspended:t}),s?.syncCuringState?.({source:"rule-suspend"}))},addRuleSuspend=e=>{e&&!c.has(String(e))&&syncRuleSuspendPause([...c,String(e)])},removeRuleSuspend=e=>{if(!e||!c.has(String(e)))return;const t=new Set(c);t.delete(String(e)),syncRuleSuspendPause([...t])};e(n.onChange((e,n={})=>{const s=tt[e];if(s)t(s,n);else switch(e){case"RulesDirty":o?.(n.reason||"rules-dirty");break;case"RulesEvaluated":syncRuleSuspendPause(n.suspendingRules||[],n.source),l?.(n.recheckInMs??null);break;case"RuleSuspendActivated":addRuleSuspend(n.id);break;case"RuleSuspendDeactivated":removeRuleSuspend(n.id);break;case"RuleActivated":n.suspendsCuring&&addRuleSuspend(n.id),a(he.RULE_ACTIVATED,n,n.id);break;case"RuleDeactivated":n.suspendsCuring&&removeRuleSuspend(n.id),a(he.RULE_DEACTIVATED,n,n.id)}}))},registerModelEventBridges=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,syncDebugMode:s,systemModel:i,affModel:o,defModel:l,balanceModel:c,cacheModel:u,limbModel:d,trackableModel:m,queueController:p,rules:g,serverside:h,runtimeControl:b,handleVitalsSideEffects:y,onServersideDirty:v,onRulesDirty:S,onRulesRecheck:x})=>{registerSystemModelBridge({registerModelListener:e,publishPublic:t,syncDebugMode:s,systemModel:i,serverside:h,handleVitalsSideEffects:y}),registerAfflictionModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:i,affModel:o,serverside:h,runtimeControl:b}),registerDefenseModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:l}),registerBalanceModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:c}),registerLimbModelBridge({registerModelListener:e,publishPublicScoped:a,limbModel:d}),registerCacheModelBridge({registerModelListener:e,publishPublic:t,cacheModel:u}),registerQueueModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:p}),registerServersideModelBridge({registerModelListener:e,publishPublic:t,serverside:h,onServersideDirty:v}),registerTrackableModelBridge({registerModelListener:e,noticeCenter:n,trackableModel:m,onTrackableDirty:S}),registerRulesModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,rules:g,runtimeControl:b,systemModel:i,onRulesDirty:S,onRulesRecheck:x})},at=new Set(["dragon","air elemental lord","earth elemental lord","fire elemental lord","water elemental lord"]),registerCrossModelBridges=({registerModelListener:e,systemModel:t,defModel:a})=>{e(t.onChange((e,t={})=>{"ClassChanged"===e&&at.has(String(t?.class||"").toLowerCase())&&a.setHave("mounted",!1,"class-change")}))},registerRoomModelBridge=({registerModelListener:e,roomModel:t,defModel:a,publishPublic:n,markDirty:s})=>{e(t.onChange((e,t)=>{"RoomUpdated"===e?(a.setHave("flying",t.current.name.startsWith("Flying above "),"room-info"),n(he.ROOM_CHANGED,t),s("room:identity")):"RoomFeaturesUpdated"===e&&(n(he.ROOM_FEATURES_CHANGED,t),s(`room:features:${t.source}`))}))},createRuleRecheckScheduler=({adapter:e,flushCycle:t})=>{let a=null;const clear=()=>{a&&(e.clearTimeout(a),a=null)};return{schedule(n){clear(),!Number.isFinite(n)||n<=0||(a=e.setTimeout(()=>{a=null,t("rule-recheck")},n))},clear}},createRuntimeEventWiring=({adapter:e,internalEvents:t,publicEvents:a})=>{let n=[];const addUnsubscriber=e=>{"function"==typeof e&&n.push(e)},dispose=()=>{n.forEach(e=>{try{e()}catch(t){console.error("nexSys4 unsubscribe failure",t)}}),n=[]};return{attach:({options:n,queueTranslatedGmcp:s,publishPublic:i,publishPublicScoped:o,noticeCenter:l,syncDebugMode:c,systemModel:u,affModel:d,defModel:m,balanceModel:p,cacheModel:g,limbModel:h,trackableModel:b,roomModel:y,queueController:v,rules:S,serverside:x,markDirty:k,invalidateOutput:C,flushCycle:A,outputCycle:E,startup:w,curingSetProvisioner:_,curingSetGuard:T,curingMasterSwitch:M,runtimeControl:P,savePersistence:O})=>{dispose();const register=(t,a)=>{addUnsubscriber(e.on(t,a))},registerModelListener=e=>{addUnsubscriber(e)},registerGmcpListener=(e,a)=>{registerModelListener(t.on(e,a))},registerPublicListener=(e,t)=>{registerModelListener(a.on(e,t))},registerInventoryResync=(t,a)=>{registerPublicListener(t,()=>{e?.sendGmcp?.(["Char.Items.Inv"],{source:a})})};registerInventoryResync(`${he.AFF_LOST}.blindness`,"cache-visibility-resync:blindness"),registerInventoryResync(`${he.AFF_LOST}.blackout`,"cache-visibility-resync:blackout"),registerInventoryResync(`${he.AFF_LOST}.addiction`,"cache-visibility-resync:addiction"),registerInventoryResync(`${he.DEF_GOT}.mindseye`,"cache-visibility-resync:mindseye"),registerInventoryResync(`${he.DEF_LOST}.blindness`,"cache-visibility-resync:blindness"),registerAdapterEvents({register,options:n,queueTranslatedGmcp:s,publishPublic:i,publishPublicScoped:o,markDirty:k,flushCycle:A,outputCycle:E,startup:w,curingSetProvisioner:_,curingSetGuard:T,curingMasterSwitch:M,runtimeControl:P,queueController:v,serverside:x,balanceModel:p,defModel:m,adapter:e,systemModel:u,affModel:d,cacheModel:g,limbModel:h,roomModel:y,savePersistence:O}),register("OutboundCommandsEvent",(e={})=>{if("output-cycle"!==e?.context?.source)return;const t=Array.isArray(e.commands)?e.commands.filter(Boolean).map(e=>String(e)):[];if(!t.length)return;const a=u.getSettings().commandSeparator||"|";l.publish("output",`(${t.join(a)})`,{action:"commands",commands:t,source:e?.context?.cycleSource||e?.context?.source||"output-cycle"})});const D=createRuleRecheckScheduler({adapter:e,flushCycle:A});addUnsubscriber(D.clear),registerGmcpBridges({registerGmcpListener,systemModel:u,balanceModel:p,affModel:d,defModel:m,cacheModel:g,limbModel:h,serverside:x,markDirty:k}),registerModelEventBridges({registerModelListener,publishPublic:i,publishPublicScoped:o,noticeCenter:l,syncDebugMode:c,systemModel:u,affModel:d,defModel:m,balanceModel:p,cacheModel:g,limbModel:h,trackableModel:b,queueController:v,rules:S,serverside:x,runtimeControl:P,handleVitalsSideEffects:P.handleVitalsSideEffects,onServersideDirty:C,onRulesDirty:k,onRulesRecheck:D.schedule}),registerCrossModelBridges({registerModelListener,systemModel:u,defModel:m}),registerRoomModelBridge({registerModelListener,roomModel:y,defModel:m,publishPublic:i,markDirty:k})},dispose}},createRuntimeControlApi=({systemModel:e,rules:t,queueController:a,noticeCenter:n,markDirty:s,onResume:i,dispatchCommands:o,curingMasterSwitch:l})=>{let c=!1;const u=new Set(e.getRuntime().slowMode?["manual"]:[]),buildSystemEventCommand=e=>e?`echo SystemEvent ${e}`:null,syncServersideCuring=(e,t={})=>{if("function"!=typeof o)return[];const a=e?"curing off":"curing on";if(e&&!1===l?.getObservedEnabled())return[];if(!e&&!0===l?.getObservedEnabled())return[];l?.markExpected(a);const n=buildSystemEventCommand(t.completionEvent);return o(n?[a,n]:[a],{source:t.source||(e?"runtime-pause":"runtime-unpause")})},syncCuringState=(t={})=>{const a=e.getRuntime();return syncServersideCuring(a.paused||a.rulesSuspended,t)},setPaused=(t,n={})=>{const o=Boolean(t),l=e.getRuntime();return l.paused===o?(n.forceCuringSync&&syncCuringState(n),!1):!(!o&&!isRuntimeReadyPhase(l.phase))&&(e.setRuntime({paused:o}),s(o?"paused":"unpaused"),syncCuringState(n),o||(a.flushDeferred(),i?.(n.source||"unpause")),!0)},ensureSlowModeRule=()=>{t.lifecycle.add({id:"runtime-slow-mode",pack:"runtime",evaluate:()=>e.getRuntime().slowMode?{settings:{sipHealthAt:30,sipManaAt:20,mossHealthAt:20,mossManaAt:20,batch:!1}}:null})};return{setPaused,syncCuringState,setSlowMode(t,a={}){const n=a.source||"manual";t?u.add(n):u.delete(n);const i=u.size>0;return e.getRuntime().slowMode!==i&&(e.setRuntime({slowMode:i}),ensureSlowModeRule(),s(i?"slow-on":"slow-off"),!0)},handleVitalsSideEffects(){const t=e.getChar().dead;t&&!c&&(setPaused(!0,{source:"death-detected"}),n.publish("output","Death detected. Pausing nexSys runtime.",{source:"death-detected"})),!t&&c&&(setPaused(!1,{source:"death-recover"}),n.publish("output","Resurrection detected. Resuming nexSys runtime.",{source:"death-recover"})),c=t}}},nt="curing on",st="curing off",createCuringMasterSwitch=({setPaused:e,noticeCenter:t})=>{let a=null,n=null;return{getObservedEnabled:()=>a,markExpected(e){const t=String(e||"").trim().toLowerCase();return(t===nt||t===st)&&(n=t,!0)},observeConfirmation(s){const i=Boolean(s);return a=i,n===(i?nt:st)?(n=null,{attributed:!0,enabled:i}):(n=null,i?e(!1,{source:"user-curing-on"}):(e(!0,{source:"user-curing-off"}),t.publish("output","Manual `curing off` detected. nexSys is paused and will not re-enable curing; send `curing on` to resume.",{source:"user-curing-off"})),{attributed:!1,enabled:i})}}},createCuringSetGuard=({serverside:e,systemModel:t,noticeCenter:a})=>{let n=!1,s=!1;const isRunningSession=()=>isRuntimeReadyPhase(t.getRuntime().phase),markNexsysSwitch=()=>{s=!0},unload=({remove:t=!0}={})=>{const a=e.getCuringSets?.()??{},s=(a.sets||[]).map(e=>normalizeSetName(e)).filter(Boolean),i=normalizeSetName(a.priorSet),o=i&&"nexsys4-default"!==i&&s.includes(i)?i:s.find(e=>e&&"nexsys4-default"!==e)||"",l=[];o&&(markNexsysSwitch(),e.switchCuringSet(o),l.push(`curingset switch ${o}`));const c=t||!o;return c&&(e.deleteCuringSet(we),l.push(`curingset delete ${we}`)),n=!1,{restoreTarget:o,removed:c,commands:l}};return{handleSwitched:({set:t}={})=>{const i=normalizeSetName(t);if(!i)return;const o=s;s=!1,e.observeActiveCuringSet?.(i),isRunningSession()&&("nexsys4-default"!==i?o||n||(n=!0,a.publish("output",`nexSys paused — curing set is now ${i}; nexSys operates only in ${we} and will resume when you switch back.`,{source:"curingset-foreign",force:!0})):n&&(n=!1,a.publish("output",`nexSys resumed — curing set is back to ${we}.`,{source:"curingset-foreign-resume",force:!0})))},markNexsysSwitch,unload,isForeignPaused:()=>n}},isRecord$2=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),isSupportedPersistenceSchemaVersion=e=>2===Number(e),createEmptyPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:{},affSettings:{defaults:{}},defSettings:{defaults:{},static:{}},cacheSettings:{precache:{}}}),it=t.z.record(t.z.string(),t.z.unknown()).catch(()=>({})),ot=t.z.object({schemaVersion:t.z.coerce.number().refine(isSupportedPersistenceSchemaVersion),systemSettings:it,affSettings:t.z.object({defaults:it}).catch(()=>({defaults:{}})),defSettings:t.z.object({defaults:it,static:it}).catch(()=>({defaults:{},static:{}})),cacheSettings:t.z.object({precache:it}).catch(()=>({precache:{}}))}),normalizePersistenceSnapshot=(e,{assumeCurrentVersion:t=!1}={})=>{const a=t&&isRecord$2(e)&&null==e.schemaVersion?{...e,schemaVersion:2}:e,n=ot.safeParse(a);return n.success?n.data:createEmptyPersistenceSnapshot()},createRuntimePersistenceApi=({persistence:e,systemModel:t,affModel:a,defModel:n,cacheModel:s,serverside:i,syncDebugMode:o,markDirty:l})=>{const c=0,u=26,d={hasStoredSnapshot:!1,sourceKey:e?.key||"nexSys4Settings"},sanitizeSystemSettings=(e={})=>{const{customPromptEnabled:t,prompt:a,...n}=e||{},s=normalizeCommandSeparator(n.commandSeparator);if(s?n.commandSeparator=s:delete n.commandSeparator,n.ss&&"object"==typeof n.ss){const{enabled:e,...t}=n.ss;n.ss=t}return n},normalizePersistedDefPriority=e=>{const t=Number(e);return Number.isInteger(t)?t<c?c:t>u?u:t:c},buildAffDefaultMap=()=>a.list().reduce((e,t)=>(e[t]=a.getDefaultPriority(t),e),{}),countablePriorityNameSet=()=>new Set(a.getCountablePriorityNames?.()||[]),buildDefDefaultMap=()=>Object.entries(n.getDefaultPriorities()).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),buildDefStaticOverrideMap=()=>({...n.getStaticOverrides?.()||{}}),buildCacheDefaultSnapshot=()=>s.getDesiredPrecache(),isValidServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},normalizeStoredAffDefaults=(e={})=>{const t=countablePriorityNameSet();return Object.entries(e).reduce((e,[n,s])=>{const i="function"==typeof a.normalizePriorityName?a.normalizePriorityName(n):String(n||"").trim().toLowerCase();if(!i)return e;if(t.has(i))return e;const o=a.getDefaultPriority(i);return isValidServersideAffPriority(o)&&!isValidServersideAffPriority(s)?(e[i]=o,e):(e[i]=s,e)},{})},normalizeStoredDefPriorities=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),normalizeStoredDefStatics=(e={})=>Object.entries(e).reduce((e,[t,a])=>(!0!==a&&!1!==a||(e[t]=a),e),{}),buildPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:sanitizeSystemSettings(t.getSettings()),affSettings:{defaults:buildAffDefaultMap()},defSettings:{defaults:buildDefDefaultMap(),static:buildDefStaticOverrideMap()},cacheSettings:{precache:buildCacheDefaultSnapshot()}}),applyStoredSnapshot=(e={})=>{const l=sanitizeSystemSettings(e.systemSettings||{});t.setSettings(l,{setBaseline:!0}),t.setBaselineIntent({ss:l.ss||{}});const c=e.affSettings?.defaults;c&&Object.entries(normalizeStoredAffDefaults(c)).forEach(([e,t])=>{a.setDefaultPriority(e,t,"persistence")});const u=normalizeStoredDefStatics(e.defSettings?.static);Object.entries(u).forEach(([e,t])=>{n.setStatic(e,t,"persistence")});const d=normalizeStoredDefPriorities(e.defSettings?.defaults);Object.entries(d).forEach(([e,t])=>{n.setDefaultPriority(e,t,"persistence")}),e.cacheSettings?.precache&&s.setDesiredPrecache(e.cacheSettings.precache),i.setBaselineFromRuntime(),o()},loadStoredSnapshot=()=>"function"==typeof e.read?e.read():{key:e?.key||"nexSys4Settings",exists:!1,snapshot:e.load()};return{buildPersistenceSnapshot,loadPersistence(){const{key:t,exists:a,snapshot:n}=loadStoredSnapshot();return d.hasStoredSnapshot=Boolean(a),d.sourceKey=t||e?.key||"nexSys4Settings",applyStoredSnapshot(n),{key:d.sourceKey,exists:d.hasStoredSnapshot,snapshot:n}},seedBaselineFromObservedStartup({skipObservedAdoption:e=!1}={}){if(d.hasStoredSnapshot)return!1;if(e)return!1;const s=i.getObserved?.()||{},l=sanitizeSystemSettings({ss:s.settings||{}});Object.keys(l).length&&t.setSettings(l,{setBaseline:!0});const c=countablePriorityNameSet();return Object.entries(s.affPriorities||{}).forEach(([e,t])=>{c.has(String(e||"").toLowerCase())||isValidServersideAffPriority(t)&&a.setDefaultPriority(e,t,"startup-observed-baseline")}),Object.entries(s.defPriorities||{}).forEach(([e,t])=>{n.get(e)&&n.setDefaultPriority(e,normalizePersistedDefPriority(t),"startup-observed-baseline")}),i.setBaselineFromRuntime(),o(),!0},savePersistence(){const t=buildPersistenceSnapshot();return e.save(t),i.setBaselineFromRuntime(),l("persistence-save"),t}}},evaluateBlockCondition=(e,t)=>Array.isArray(e)?e.every(e=>t(e)):t(e),isBlocked=(e=[],t)=>e.some(e=>evaluateBlockCondition(e,t)),normalizeDefensePriority=e=>{const t=Number(e);return Number.isInteger(t)?t<0?0:t>26?26:t:0},resolveEffectiveDefensePriority=({storedPriority:e,overlayValue:t})=>normalizeDefensePriority(void 0===t||"RESET"===t?e:t),resolveCureActions=(e={},t={})=>Object.keys({...e||{},...t||{}}).reduce((t,a)=>(t[a]=!0===e?.[a],t),{}),lt=new Set(["balance","equilibrium","free"]),hasRequiredSpecialBalances=(e,t)=>e.filter(e=>!lt.has(e)).every(e=>t.have(e)),createIntent=({entry:e,direction:t,priority:a,commands:n,balsReq:s,balsUsed:i})=>({source:"defense",id:e.id,defense:e.id,direction:t,priority:a,commands:[...n],bals_req:[...s],bals_used:[...i],tableOrder:e.order,static:e.static,serverside:e.serverside}),createDefensePlanner=({defModel:e,balanceModel:t,affModel:a,systemModel:n,getObservedServersidePriority:s=()=>0})=>{const i=new Set(t.list?.()||[]),haveValidBalanceMetadata=(e,t)=>e.length>0&&t.length>0&&e.every(e=>i.has(e))&&t.every(e=>i.has(e)),getEffectivePriority=(t,a)=>resolveEffectiveDefensePriority({storedPriority:e.getPriority(t.id),overlayValue:a?.overlay?.defPriorities?.[t.id]});return{plan:({ruleEvaluation:i}={})=>{const o=n.getClass(),l=e.list().map(t=>e.get(t)).filter(Boolean).map(e=>({entry:e,priority:getEffectivePriority(e,i)})).sort((e,t)=>e.priority!==t.priority?e.priority-t.priority:e.entry.order-t.entry.order);e.pruneStaticRequests?.((t,a)=>{const n=getEffectivePriority(a,i);return a.static&&!a.have&&isActiveDefensePriority(n)&&e.isAvailableForClass(t,o)},"automatic-planner");const c=new Set,u=[],d=[],m=[];return l.forEach(({entry:n,priority:i})=>{const reject=(e,t)=>m.push({source:"defense",id:n.id,direction:e,reason:t});!1===n.serverside&&!n.trackOnly&&n.command.length&&!n.have&&isActiveDefensePriority(i)&&(c.has(n.id)?reject("on","opposing-defense-selected"):e.isAvailableForClass(n.id,o)?n.static&&!n.staticRequested?reject("on","static-not-requested"):isBlocked(n.blocks,e=>a.haveAff(e))?reject("on","blocked"):haveValidBalanceMetadata(n.bals_req,n.bals_used)?hasRequiredSpecialBalances(n.bals_req,t)?(n.opps.forEach(e=>c.add(e)),u.push(createIntent({entry:n,direction:"on",priority:i,commands:n.command,balsReq:n.bals_req,balsUsed:n.bals_used}))):reject("on","special-balance-unavailable"):reject("on","invalid-balance-metadata"):reject("on","class-unavailable")),n.stopCommand.length&&n.have&&0===i&&(n.serverside&&0!==Number(s(n.id))?reject("off","serverside-priority-not-zero"):e.isAvailableForClass(n.id,o)?isBlocked(n.stopBlocks,e=>a.haveAff(e))?reject("off","blocked"):haveValidBalanceMetadata(n.stopBals_req,n.stopBals_used)?hasRequiredSpecialBalances(n.stopBals_req,t)?d.push(createIntent({entry:n,direction:"off",priority:0,commands:n.stopCommand,balsReq:n.stopBals_req,balsUsed:n.stopBals_used})):reject("off","special-balance-unavailable"):reject("off","invalid-balance-metadata"):reject("off","class-unavailable"))}),d.sort((e,t)=>e.tableOrder-t.tableOrder),{upkeep:u,tearDown:d,candidates:[...u,...d],trace:m}}}},ct=new Set(["balance","equilibrium","free"]),normalizeCommands$1=e=>{if(Array.isArray(e))return e.map(e=>String(e||"").trim()).filter(Boolean);const t=String(e||"").trim();return t?[t]:[]},normalizeBalances=e=>(Array.isArray(e)?e:[]).map(e=>String(e||"").trim().toLowerCase()).filter(Boolean),createCurePlanner=({cureTable:e={},affModel:t,balanceModel:a,systemModel:n})=>{const s=new Map(Object.keys(e).map((e,t)=>[e,t])),i=new Set(a.list?.()||[]),isAvailableForClass=e=>{const t=Array.isArray(e.skills)?e.skills:[];return!t.length||classListIncludes(t,n.getClass())},haveRequiredSpecialBalances=e=>e.filter(e=>!ct.has(e)).every(e=>a.have(e)),haveValidBalanceMetadata=e=>e.every(e=>i.has(e));return{plan:({ruleEvaluation:a}={})=>{const n=a?.policy?.cureActions||{},i=a?.provenance?.cureActions||{},o=[],l=[];return Object.entries(n).forEach(([a,n])=>{if(!n)return;const c=e[a],reject=e=>l.push({source:"cure",id:a,reason:e});if(!c)return void reject("unknown-cure");if(!1!==c.serverside)return void reject("serverside-managed");const u=normalizeCommands$1(c.command),d=normalizeBalances(c.bals_req),m=normalizeBalances(c.bals_used);if(!u.length||!d.length||!m.length)return void reject("invalid-action-metadata");if(!haveValidBalanceMetadata(d)||!haveValidBalanceMetadata(m))return void reject("unknown-balance");if(!isAvailableForClass(c))return void reject("class-unavailable");if(isBlocked(c.blocks,e=>t.haveAff(e)))return void reject("blocked");if(!haveRequiredSpecialBalances(d))return void reject("special-balance-unavailable");const p=i[a]||{};o.push({source:"cure",id:a,cure:a,commands:u,bals_req:d,bals_used:m,ruleId:p.ruleId||null,ruleOrder:Number.isInteger(p.ruleOrder)?p.ruleOrder:-1,tableOrder:s.get(a)??Number.MAX_SAFE_INTEGER})}),o.sort((e,t)=>e.ruleOrder!==t.ruleOrder?t.ruleOrder-e.ruleOrder:e.tableOrder-t.tableOrder),{candidates:o,trace:l}}}},isExactlyFree=(e=[])=>1===e.length&&"free"===e[0],usesMainBalance=(e=[])=>e.includes("balance")||e.includes("equilibrium"),usesDirectTransport=(e=[])=>!usesMainBalance(e),createAutomaticActionPlanner=()=>({plan({cureCandidates:e=[],defenseUpkeepCandidates:t=[],defenseTearDownCandidates:a=[],trace:n=[]}={}){const s=[...e,...t,...a],i=s.filter(e=>usesDirectTransport(e.bals_req)),o=s.filter(e=>!usesDirectTransport(e.bals_req)),l=o.filter(e=>isExactlyFree(e.bals_used)),c=o.filter(e=>!isExactlyFree(e.bals_used)&&!usesMainBalance(e.bals_used)),u=o.find(e=>usesMainBalance(e.bals_used)),d=[...l,...c,...u?[u]:[]];return{directActions:i,queuePlans:{freeQueue:d.flatMap(e=>e.commands)},selectedActions:[...i,...d],trace:[...n]}}}),dedupeCommandIntents=(e=[])=>{const t=new Map,a=[];return e.forEach(e=>{const n=e?.command,s=t.get(n);if(s)return void(!0===e?.requiresCompletion&&(s.requiresCompletion=!0));const i={...e};t.set(n,i),a.push(i)}),a},createOutputPlanner=({systemModel:e,rules:t,serverside:a,curePlanner:n,defensePlanner:s,automaticActionPlanner:i,precachePlanner:o,queueController:l})=>({plan({source:c="prompt",injectedCommands:u=[],suppressedServersideCommands:d=[]}={}){const m=e.getRuntime(),p=t.evaluate({source:c}),g=a.evaluate({emitCommands:!1,source:c,ruleEvaluation:p}),h=d.length?g.commands.filter(e=>!d.includes(e)):g.commands,b=[];let y;if("prompt"===c){if(e.getRuntime().rulesSuspended)y={directActions:[],queuePlans:{freeQueue:[]},selectedActions:[],trace:[]};else{const e=n.plan({ruleEvaluation:p}),t=s.plan({ruleEvaluation:p});y=i.plan({cureCandidates:e.candidates,defenseUpkeepCandidates:t.upkeep,defenseTearDownCandidates:t.tearDown,trace:[...e.trace,...t.trace]})}l.setPlannerCommands("freeQueue",y.queuePlans.freeQueue),y.directActions.forEach(e=>{e.commands.forEach(t=>{b.push({source:e.source,action:e,command:t})})})}m.slowMode||o.plan().forEach(e=>b.push(e)),h.forEach(e=>{b.push({source:"serverside",command:e,requiresCompletion:!0})}),u.forEach(e=>{b.push({source:"injected",command:e})});const v=dedupeCommandIntents(b);return{intents:v,commands:v.map(e=>e.command),serversideCommands:h,ruleEvaluation:p,automaticPlan:y}}}),createPrecachePlanner=({cacheModel:e})=>({plan:()=>e.getPrecacheCommands().map(e=>({source:"precache",command:e,requiresCompletion:!0}))}),createQueueState=()=>Object.entries(G).reduce((e,[t,a])=>(e[t]={...deepClone$1(a),id:t,items:[],prepend:[],plannerCommands:[],pending:!1,lastSignature:"",deferred:!1},e),{}),splitCommandValue=(e,t="|")=>{const a=String(t||"|")||"|";return String(e).split(a).map(e=>e.trim()).filter(Boolean)},normalizeCommands=(e,t="|")=>e?Array.isArray(e)?e.flatMap(e=>null==e?[]:splitCommandValue(e,t)).filter(Boolean):splitCommandValue(e,t):[],hasQueuedItems=e=>e.items.length>0||e.prepend.length>0||e.plannerCommands.length>0,buildLogicalCommands=e=>[`echo SystemEvent ${e.name}QueueFired`,...e.pre,...e.plannerCommands,...e.prepend,...e.items,...e.post].filter(Boolean),clearQueueState=e=>{e.items=[],e.prepend=[],e.plannerCommands=[],e.pending=!1,e.lastSignature="",e.deferred=!1},resolveQueueId=(e,t)=>{if(e[t])return t;const a=String(t||"").replace(/QueueFired$/i,"").toLowerCase();return Object.keys(e).find(t=>{const n=e[t];return n.name.toLowerCase()===a||n.type.toLowerCase()===a})||null},hasLocalQueueState=(e={})=>(e.items||[]).length>0||(e.prepend||[]).length>0||(e.plannerCommands||[]).length>0||e.pending||e.deferred||Boolean(e.lastSignature),clearLocalQueueState=e=>{if(!e)return!1;const t=hasLocalQueueState(e);return clearQueueState(e),t},markQueueDeferred=e=>{if(!e)return!1;const t=!e.deferred||!e.pending;return e.deferred=!0,e.pending=!0,t},markQueueAwaitingAck=(e,t)=>{if(!e)return!1;const a=e.lastSignature!==t||!0!==e.pending||!1!==e.deferred;return e.lastSignature=t,e.pending=!0,e.deferred=!1,a},createQueueMutationApi=({state:e,emit:t,flush:a,clearQueue:n,getSeparator:s,markStateChanged:i=()=>{}})=>{const resolveSeparator=()=>("function"==typeof s?s():"|")||"|",haveSameCommands=(e=[],t=[])=>e.length===t.length&&e.every((e,a)=>e===t[a]),clear=(a,n={})=>{const s=e[a];return!!s&&(!!clearLocalQueueState(s)&&(i(a),t("QueueCleared",{queueId:a,remote:Boolean(n.remote),command:n.command||null}),!0))};return{add(n,s,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(s,resolveSeparator());if(!c.length)return!1;const u=[];if(o.allowDuplicate)u.push(...c);else{const e=new Map;l.items.forEach(t=>{e.set(t,(e.get(t)||0)+1)}),c.forEach(t=>{const a=e.get(t)||0;a>0?e.set(t,a-1):u.push(t)})}return!!u.length&&(l.items.push(...u),i(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},addClear(n,s,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(s,resolveSeparator());return!(!c.length||haveSameCommands(l.items,c))&&(l.items=c,i(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},prepend(n,s,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(s,resolveSeparator());return!!c.length&&(!(!o.allowDuplicate&&c.every(e=>l.prepend.includes(e)))&&(l.prepend.unshift(...c),i(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0))},setPlannerCommands(s,o=[],l={}){const c=e[s];if(!c)return!1;const u=normalizeCommands(o,resolveSeparator());if(haveSameCommands(c.plannerCommands,u))return!1;const d=c.pending&&!c.deferred&&Boolean(c.lastSignature);return c.plannerCommands=u,i(s),t("QueueUpdated",{queueId:s,queue:deepClone$1(c)}),!1===l.autoFlush||(hasQueuedItems(c)?(a(s,{force:!0}),!0):d?(n(s),!0):((c.pending||c.deferred||c.lastSignature)&&(c.pending=!1,c.deferred=!1,c.lastSignature="",i(s)),!0))},clear,setPreCommands(a,n=[]){const s=e[a];if(!s)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(s.pre,o)&&(s.pre=o,i(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(s)}),!0)},setPostCommands(a,n=[]){const s=e[a];if(!s)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(s.post,o)&&(s.post=o,i(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(s)}),!0)}}},chunkCommands=(e=[],t=20)=>{const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],n=Math.max(1,Number(t||20)),s=[];for(let i=0;i<a.length;i+=n)s.push(a.slice(i,i+n));return s},chunkCommandsWithTrailing=(e=[],{maxEntries:t=20,trailing:a=[]}={})=>{const n=chunkCommands(e,t),s=chunkCommands(a,t).flat();if(!s.length)return n;if(!n.length)return chunkCommands(s,t);const i=n[n.length-1];return i.length+s.length<=Math.max(1,Number(t||20))?(i.push(...s),n):[...n,...chunkCommands(s,t)]},createQueueFlushApi=({state:e,emit:t,send:a,getRuntimeState:n,getSeparator:s,maxEntriesPerSubmission:i,onQueueFired:o,markStateChanged:l=()=>{}})=>{const buildRemoteClearCommand=e=>`clearqueue ${e.type}`,buildStackPlan=(e=[])=>({type:"stackPlan",commands:e.filter(Boolean).map(e=>String(e))}),markExcludedQueuesCleared=(t=[])=>{t.forEach(t=>{const a=e[t];a&&clearLocalQueueState(a)&&l(t)})},deferQueue=(e,a)=>(markQueueDeferred(a)&&l(e),t("QueueDeferred",{queueId:e,queue:deepClone$1(a)}),[]),flush=(o,c={})=>{const u=e[o];if(!u||!hasQueuedItems(u))return[];const d=n?n():{paused:!1,phase:be.RUNNING,settings:{}};if(!isRuntimeReadyPhase(d.phase))return deferQueue(o,u);const m=Boolean(d.settings?.queueWhilePaused);if((d.paused||d.rulesSuspended)&&!m)return deferQueue(o,u);const p=buildLogicalCommands(u),g=p.join("");if(!c.force&&g===u.lastSignature)return[];const h=[],b=[];u.exclusions.forEach(t=>{const a=e[t];a&&hasQueuedItems(a)&&(h.push(buildRemoteClearCommand(a)),b.push(t))});const y="function"==typeof s?s():"|",v=chunkCommands(p,Math.max(1,i-h.length)).map((e,t)=>buildStackPlan([`queue ${0===t?"addclear":"add"} ${u.type} ${e.join(y)}`])),S=[];return h.length>0&&S.push(buildStackPlan(h)),S.push(...v),markQueueAwaitingAck(u,g)&&l(o),markExcludedQueuesCleared(b),a(S,{source:"queue-controller",queueId:o,excludedIds:b}),t("QueueFlushed",{queueId:o,plans:S,signature:g}),S};return{flush,clearQueue:n=>{const s=e[n];if(!s)return!1;const i=buildRemoteClearCommand(s);clearLocalQueueState(s)&&l(n),t("QueueCleared",{queueId:n,remote:!0,command:i});const o=[buildStackPlan([i])];return a(o,{source:"queue-controller",queueId:n,remote:!0,action:"clear-queue"}),o},flushDeferred(){const t=[];return Object.keys(e).forEach(a=>{e[a].deferred&&flush(a,{force:!0}).length&&t.push(a)}),t},flushAll(){const t=[];return Object.keys(e).forEach(e=>{const a=flush(e);a.length&&t.push({queueId:e,plans:a})}),t},acknowledgeSent(a,n={}){const s=resolveQueueId(e,a);if(!s)return!1;const i=e[s];return t("QueueSentAcknowledged",{...n,queueId:s,queueType:i?.type||n.queueType||""}),!0},acknowledgeFired(a){const n=resolveQueueId(e,a);if(!n)return!1;const s=e[n],i=s?deepClone$1(s):null;return clearLocalQueueState(e[n])&&l(n),o?.({queueId:n,queue:i}),t("QueueFiredAcknowledged",{queueId:n}),!0}}},createQueueController=({send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n=20,onQueueFired:s}={})=>{const i=new Set,o=createQueueState();let l=0;const c=new Map,markStateChanged=e=>{l+=1,e&&c.set(e,(c.get(e)??0)+1)},emit=(e,t)=>{i.forEach(a=>a(e,t))},buildQueueSnapshot=(e={})=>({id:e.id,name:e.name,type:e.type,pre:[...e.pre||[]],post:[...e.post||[]],exclusions:[...e.exclusions||[]],items:[...e.items||[]],prepend:[...e.prepend||[]],plannerCommands:[...e.plannerCommands||[]],pending:Boolean(e.pending),lastSignature:e.lastSignature||"",deferred:Boolean(e.deferred)}),u=new Map,getQueueSnapshot=e=>o[e]?(u.has(e)||u.set(e,createSnapshotCache({getVersion:()=>c.get(e)??0,buildSnapshot:()=>buildQueueSnapshot(o[e])})),u.get(e)()):null,d=createSnapshotCache({getVersion:()=>l,buildSnapshot:()=>Object.keys(o).reduce((e,t)=>(e[t]=getQueueSnapshot(t),e),{})}),m=createQueueFlushApi({state:o,emit,send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n,onQueueFired:s,markStateChanged}),p=createQueueMutationApi({state:o,emit,flush:m.flush,clearQueue:m.clearQueue,getSeparator:a,markStateChanged});return{onChange:e=>(i.add(e),()=>i.delete(e)),listQueues:()=>Object.keys(o),getQueue:e=>getQueueSnapshot(e),snapshot:()=>d(),add:p.add,addClear:p.addClear,prepend:p.prepend,setPlannerCommands:p.setPlannerCommands,clear:p.clear,clearQueue:m.clearQueue,flush:m.flush,flushAll:m.flushAll,flushDeferred:m.flushDeferred,acknowledgeSent:m.acknowledgeSent,acknowledgeFired:m.acknowledgeFired,setPreCommands:p.setPreCommands,setPostCommands:p.setPostCommands}},sameArray=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},mapDiff=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]),toGamePriorityToken=e=>isServersideAffPriorityNumber(e)?String(Number(e)):String(26),createServersideDiffPlanner=({baseline:e={},getBaseline:t,getAffPriorityCommandName:a,getDefPriorityTokens:n}={})=>{const resolveBaseline=()=>"function"==typeof t?t()||{}:e,resolveAffPriorityCommandName=e=>{if("function"==typeof a){const t=a(e);if(t)return String(t)}return String(e)},resolveDefPriorityTokens=(e,t)=>{if(!isServersideAffPriorityNumber(t))return["reset"];if("function"==typeof n){const a=n(e,Number(t));if(Array.isArray(a)&&a.length)return a.map(e=>String(e));if(null!=a&&!1!==a)return[String(a)]}return[String(Number(t))]},normalizeDesiredDefPriority=e=>"RESET"===e||void 0===e?0:isServersideAffPriorityNumber(e)?Number(e):0;return{build:({desired:e={},observed:t={}}={})=>{const a=resolveBaseline(),n=a.settings||{},s=a.affPriorities||{},i=[],o=[],l=e.settings||{};mapDiff(l,t.settings||{}).sort().forEach(e=>{const t=Ce[e];if(!t)return;const a=t.buildCommand(l[e]);a&&(i.push(a),o.push(`settings:${e}`))});const c=e.affPriorities||{},u=t.affPriorities||{};!0===e.fullPriorityReset&&(i.push("curing priority reset"),o.push("aff-priority:reset-all"));const resolveDesiredAffPriority=e=>{const t=c[e];return"RESET"===t||void 0===t?s[e]??0:t},d=[...new Set([...Object.keys(c),...Object.keys(u)])].filter(e=>canonicalAffPriority(resolveDesiredAffPriority(e))!==canonicalAffPriority(u[e])).sort().map(e=>[e,toGamePriorityToken(resolveDesiredAffPriority(e))]);if(d.length){const e=d.flatMap(([e,t])=>[resolveAffPriorityCommandName(e),String(t)]);i.push(`curing priority ${e.join(" ")}`),d.forEach(([e])=>o.push(`aff-priority:${e}`))}const m=e.defPriorities||{},p=t.defPriorities||{},g=[...new Set([...Object.keys(m),...Object.keys(p)])].filter(e=>normalizeDesiredDefPriority(m[e])!==Number(p[e]??0)).sort().map(e=>{const t=m[e];return"RESET"===t||void 0===t?[e,["reset"],`def-priority-reset:${e}`]:isServersideAffPriorityNumber(t)?[e,resolveDefPriorityTokens(e,t),`def-priority:${e}`]:[e,["reset"],`def-priority-reset:${e}`]});if(g.length){const e=g.flatMap(([e,t])=>[e,...t]);i.push(`curing priority defence ${e.join(" ")}`),g.forEach(([,,e])=>o.push(e))}const h=e.prioAff;h!==t.prioAff&&(h?(i.push(`curing prioaff ${h}`),o.push(`prioaff:${h}`)):(i.push("curing prioaff none"),o.push("prioaff:clear")));const b=e.manualQueue||[];return sameArray(b,t.manualQueue||[])||(i.push("curing queue reset"),b.forEach((e,t)=>{i.push(`curing queue insert ${t+1} ${e}`)}),o.push("manual-queue:reconcile")),{commands:Array.from(new Set(i)),reasonCodes:o,baseSettings:n}},getBaseSettings:()=>resolveBaseline().settings||{},getBaseAff:()=>resolveBaseline().affPriorities||{},getBaseDef:()=>resolveBaseline().defPriorities||{}}},ut=Object.freeze(["status","affPriorities","defPriorities"]),dt=Object.freeze({reportingcommands:"reporting",afflictions:"afflictions",defences:"defences",sipping:"sipping",transmutation:"transmutation",siphealth:"sipHealthAt",siphealthat:"sipHealthAt",sipmana:"sipManaAt",sipmanaat:"sipManaAt",mosshealth:"mossHealthAt",mosshealthat:"mossHealthAt",mossmana:"mossManaAt",mossmanaat:"mossManaAt",priority:"sipPriority",sippriority:"sipPriority",focus:"focus",focusoverherbs:"focusOverHerbs",focuswithguilt:"focusWithGuilt",focuswithfulminated:"focusWithFulminated",tree:"tree",usevault:"useVault",useclot:"clot",clot:"clot",clotat:"clotAt",clotto:"clotTo",clotabove:"clotAbove",fallback:"fallback",kaidotransmute:"kaidoTransmute",customcuringpriority:"customAffPriority",customdefencepriority:"customDefPriority",batch:"batch",healthaffsabove:"fracturesAbove",fracturesabove:"fracturesAbove",manathreshold:"manaThreshold",insomnia:"insomnia"}),mt=Object.freeze(new Set(["status","enabled"])),createServersideObservationApi=({state:e,affModel:t,defModel:a,systemModel:n,emit:s,markDirty:i,replaceBucket:o,maybeResolveFullPriorityReset:l,getRuleEvaluation:c=()=>({overlay:{}}),normalizeAffPriorityName:u=e=>String(e||"").toLowerCase()})=>{const getRuleOverlay=()=>c()?.overlay||{},getMissingStartupFlags=(t=Object.keys(e.startup.flags))=>t.filter(t=>t in e.startup.flags&&!e.startup.flags[t]),d=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>({...e.startup.flags})}),m=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>{const e=d(),t=getMissingStartupFlags(ut);return{ready:Object.values(e).every(Boolean),requiredReady:0===t.length,missingRequired:t,flags:e}}}),markStartupCaptured=t=>t in e.startup.flags&&!e.startup.flags[t]&&(o("startup",{...e.startup,flags:{...e.startup.flags,[t]:!0}}),s("ServersideStartupSnapshotCaptured",{topic:t,flags:d()}),!0),updateObservedSetting=(t,a)=>{if(e.observed.settings[t]!==a){if(o("observed",{...e.observed,settings:{...e.observed.settings,[t]:a}}),e.startup.flags.status){const n=getRuleOverlay().settings?.[t];void 0!==n&&"RESET"!==n||o("sessionBaseline",{...e.sessionBaseline,settings:{...e.sessionBaseline.settings,[t]:a}})}i(`observed-setting:${t}`)}},normalizeCaptureSetName=e=>String(e||"").trim().toLowerCase(),isCaptureSetOwned=e=>{const t=e||"";return""===t||"nexsys4-default"===t},completeObservedAffPrioritySnapshot=()=>{const t=e.capture.affPriorities,a=e.capture.prioritySet||"";if(e.capture.affPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,affPriorities:t,prioritySet:a}),l(),i("observed-aff-priority-snapshot")}return markStartupCaptured("affPriorities"),!0},updateObservedAffPriority=(t,a)=>{const n=e.capture.affPriorities||e.observed.affPriorities,s=String(t||"").toLowerCase(),c=u(t);if(!c)return!1;if(!Object.prototype.hasOwnProperty.call(n,c))return!1;const d=normalizeServersideAffPriority(a);if(e.capture.affPriorities)return s&&s!==c&&delete n[s],n[c]=d,!0;const m={...e.observed.affPriorities};if(s&&s!==c&&delete m[s],m[c]=d,o("observed",{...e.observed,affPriorities:m}),l(),e.startup.flags.affPriorities){const t=getRuleOverlay().affPriorities?.[c];void 0!==t&&"RESET"!==t||o("sessionBaseline",{...e.sessionBaseline,affPriorities:{...e.sessionBaseline.affPriorities,[c]:d}})}return i(`observed-aff-priority:${c}`),!0},completeObservedDefPrioritySnapshot=()=>{const t=e.capture.defPriorities,a=e.capture.prioritySet||"";if(e.capture.defPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,defPriorities:t,prioritySet:a}),i("observed-def-priority-snapshot")}return markStartupCaptured("defPriorities"),!0},updateObservedQueue=(t=[])=>{const a=t||[],n=e.observed.manualQueue,s=a.length===n.length&&a.every((e,t)=>e===n[t]);markStartupCaptured("queue"),s||(o("observed",{...e.observed,manualQueue:[...a]}),i("observed-manual-queue"))},updateObservedPredictions=(t={})=>{const a=t||{},n=e.observed.predictions,s=Object.keys(a),l=s.length===Object.keys(n).length&&s.every(e=>a[e]===n[e]);markStartupCaptured("predictions"),l||(o("observed",{...e.observed,predictions:{...a}}),i("observed-predictions"))},parseStatusLine=({key:e,value:t})=>{const a=String(e||"").trim();if(mt.has(a.toLowerCase()))return;const n=dt[a.toLowerCase()]||a;updateObservedSetting(n,normalizeStatusValue(n,t))};return{markStartupCaptured,resetStartupStatus:()=>{const t=Object.keys(e.startup.flags).reduce((e,t)=>(e[t]=!1,e),{});return e.capture.affPriorities=null,e.capture.defPriorities=null,o("startup",{...e.startup,flags:t}),o("observed",{...e.observed,settings:buildInitialObservedSettings(e.observed.settings)}),s("ServersideStartupReset",{flags:d()}),!0},isStartupReady:()=>Object.values(e.startup.flags).every(Boolean),getStartupStatus:()=>m(),getMissingStartupFlags,beginObservedAffPrioritySnapshot:(a="")=>(e.capture.affPriorities=buildObservedAffPriorities(t),e.capture.prioritySet=normalizeCaptureSetName(a),!0),completeObservedAffPrioritySnapshot,updateObservedSetting,updateObservedAffPriority,beginObservedDefPrioritySnapshot:(t="")=>(e.capture.defPriorities=buildObservedDefPriorities(a,n.getClass()),e.capture.prioritySet=normalizeCaptureSetName(t),!0),completeObservedDefPrioritySnapshot,updateObservedDefPriority:(t,s)=>{const l=e.capture.defPriorities||e.observed.defPriorities,c=String(t||"").toLowerCase(),u=a.get(c);if(!u?.serverside)return!1;if(!a.isAvailableForClass(c,n.getClass()))return!1;const d="RESET"===String(s).toUpperCase()?0:Number(s);if(!Number.isFinite(d))return!1;if(e.capture.defPriorities)return l[c]=d,!0;if(o("observed",{...e.observed,defPriorities:{...e.observed.defPriorities,[c]:d}}),e.startup.flags.defPriorities){const t=getRuleOverlay().defPriorities?.[c];if(void 0===t||"RESET"===t){const t={...e.sessionBaseline.defPriorities};u.static?delete t[c]:t[c]=d,o("sessionBaseline",{...e.sessionBaseline,defPriorities:t})}}return i(`observed-def-priority:${c}`),!0},updateObservedQueue,updateObservedPredictions,parseStatusLine}},createServersideTransientApi=({state:e,markDirty:t,replaceBucket:a,normalizeAffName:n=e=>String(e||"").toLowerCase()})=>{const getPredictionCommands=()=>Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],getPredictionRequests=()=>Array.isArray(e.transient.predictionRequests)?e.transient.predictionRequests:[],normalizePredictionAff=e=>String(n(e)||"").trim().toLowerCase(),replaceTransient=t=>a("transient",{...e.transient,...t}),clearPredictionCommands=(e=new Set)=>{if(!e.size)return!1;const t=getPredictionCommands(),a=t.filter(t=>!e.has(normalizeCommand(t)));return a.length!==t.length&&replaceTransient({predictionCommands:a})},clearPredictionRequest=e=>{const t=getPredictionRequests();if(!t.length)return!1;const a=normalizePredictionAff(e),n=a?t.indexOf(a):0;if(n<0)return!1;const s=[...t];return s.splice(n,1),replaceTransient({predictionRequests:s})},queuePredictionCommand=e=>{const a=normalizePredictionAff(e);if(!a)return!1;const n=`curing predict ${a}`,s=normalizeCommand(n),i=getPredictionCommands(),o=getPredictionRequests();return!i.some(e=>normalizeCommand(e)===s)&&!o.includes(a)&&(replaceTransient({predictionCommands:[...i,n],predictionRequests:[...o,a]}),t(`prediction-request:${a}`),!0)};return{setPrioAff(s){const i=s?n(s):null;return e.transient.prioAff!==i&&(a("transient",{...e.transient,prioAff:i}),t("prioaff"),!0)},clearPrioAff:()=>!!e.transient.prioAff&&(a("transient",{...e.transient,prioAff:null}),t("prioaff-clear"),!0),requestPriorityReset:()=>!e.transient.fullPriorityReset&&(a("transient",{...e.transient,fullPriorityReset:!0}),t("priority-reset-request"),!0),addPrediction:e=>queuePredictionCommand(e),removePrediction(e){const a=normalizePredictionAff(e);if(!a)return!1;const n=clearPredictionCommands(new Set([normalizeCommand(`curing predict ${a}`)])),s=clearPredictionRequest(a);return n&&t(`prediction-cancel:${a}`),n||s},confirmPrediction:e=>clearPredictionRequest(e),manualQueueAdd(n){const s=String(n||"").toLowerCase();return!(!s||e.transient.manualQueue.includes(s))&&(a("transient",{...e.transient,manualQueue:[...e.transient.manualQueue,s]}),t("manual-queue-add"),!0)},manualQueueInsert(n,s){const i=String(s||"").toLowerCase(),o=Math.max(1,Math.min(20,Number(n||1)));if(!i||e.transient.manualQueue.includes(i))return!1;const l=[...e.transient.manualQueue];return l.splice(o-1,0,i),a("transient",{...e.transient,manualQueue:l}),t("manual-queue-insert"),!0},manualQueueRemove(n){const s=String(n||"").toLowerCase(),i=e.transient.manualQueue.indexOf(s);if(i<0)return!1;const o=[...e.transient.manualQueue];return o.splice(i,1),a("transient",{...e.transient,manualQueue:o}),t("manual-queue-remove"),!0},manualQueueReset:()=>!!e.transient.manualQueue.length&&(a("transient",{...e.transient,manualQueue:[]}),t("manual-queue-reset"),!0)}},shallowCopyDesired=e=>({settings:{...e.settings},affPriorities:{...e.affPriorities},defPriorities:{...e.defPriorities},manualQueue:[...e.manualQueue||[]],predictions:{...e.predictions},prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),predictionCommands:[...e.predictionCommands||[]],appliedRules:[...e.appliedRules||[]]}),areCommandSequencesEqual=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},createServersideEvaluationApi=({state:e,affModel:t,defModel:a,systemModel:n,diffPlanner:s,sendCommands:i,emit:o,markDirty:l,replaceBucket:c,getRuleEvaluation:u,now:d,options:m})=>{const clearResolvedPending=()=>{const t=m.pendingTimeoutMs||12e3,a=d();let n=e.pending;for(const[s,i]of e.pending.entries())a-i>t&&(n===e.pending&&(n=new Map(e.pending)),n.delete(s));return c("pending",n)},clearSentPredictionCommands=(t=[])=>{const a=new Set(t.map(e=>normalizeCommand(e)));if(!a.size)return!1;const n=Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],s=n.filter(e=>!a.has(normalizeCommand(e)));return s.length!==n.length&&c("transient",{...e.transient,predictionCommands:s})},markPendingCommands=(t=[],a={})=>{const n=t.map(e=>normalizeCommand(e)).filter(e=>e&&isServersideCommand(e));if(n.length){const t=d(),a=new Map(e.pending);n.forEach(e=>a.set(e,t)),c("pending",a)}return n.length&&(o("ServersidePendingUpdated",{commands:[...n],context:{...a}}),clearSentPredictionCommands(n)),n},buildEffectiveServersideDefPriorities=t=>{const s=n.getClass(),i=t.overlay.defPriorities||{},o=Object.entries(e.sessionBaseline.defPriorities).reduce((e,[t,n])=>{const o=a.get(t);return o?.serverside&&!o.static&&a.isAvailableForClass(t,s)?(e[t]=resolveEffectiveDefensePriority({storedPriority:n,overlayValue:i[t]}),e):e},{}),l=a.getStaticRequests?.()||{};return Object.keys(l).forEach(e=>{const t=a.get(e);if(!t?.serverside||!t.static||t.have||!a.isAvailableForClass(e,s))return;const n=resolveEffectiveDefensePriority({storedPriority:a.getPriority(e),overlayValue:i[e]});n>=1&&n<=25&&(o[e]=n)}),o},resolveDesired=t=>(c("desired",{settings:{...e.sessionBaseline.settings,...t.overlay.settings},affPriorities:mergeWithResets(e.sessionBaseline.affPriorities,t.overlay.affPriorities),defPriorities:buildEffectiveServersideDefPriorities(t),manualQueue:Array.isArray(t.overlay.manualQueue)?[...t.overlay.manualQueue]:[...e.transient.manualQueue],predictions:{},prioAff:null!==e.transient.prioAff&&void 0!==e.transient.prioAff?e.transient.prioAff:t.overlay.prioAff||null,fullPriorityReset:e.transient.fullPriorityReset,predictionCommands:[...e.transient.predictionCommands||[]],appliedRules:t.applied}),{desired:e.desired,evaluation:t});return{markPendingCommands,maybeResolveFullPriorityReset:()=>!!e.transient.fullPriorityReset&&(!!Object.keys(e.sessionBaseline.affPriorities).every(t=>(e.observed.affPriorities[t]??e.sessionBaseline.affPriorities[t])===e.sessionBaseline.affPriorities[t])&&(c("transient",{...e.transient,fullPriorityReset:!1}),o("ServersideFullPriorityResetResolved",{fullPriorityReset:!1}),!0)),evaluate({emitCommands:t=!0,source:a="prompt",ruleEvaluation:n=u()}={}){clearResolvedPending();const{desired:l}=resolveDesired(n),d=s.build({desired:l,observed:e.observed});let p=[...l.predictionCommands,...d.commands].filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));const g=Math.max(1,Number(m.maxCommandsPerCycle||40));let h=e.diagnostics.recoveryCounter;p.length>g&&(p=p.slice(0,g),h+=1);const b=(d.commands||[]).filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));let y=b.length&&areCommandSequencesEqual(e.lastDiffCommands||[],b)?e.diagnostics.commandRepeatCounter+1:0,v=e.diagnostics.desyncCounter;return y>=(m.desyncCommandRepeats||3)&&(v+=1,h+=1,p.push("curing status","curing priority list","curing priority defence list","curing queue list","curing predictions"),y=0),t&&p.length&&(i(p,{source:"serverside-reconcile",reasonCodes:d.reasonCodes,cycleSource:a}),markPendingCommands(p,{source:"serverside-reconcile",reasonCodes:d.reasonCodes,cycleSource:a})),e.lastDiffCommands=[...b],c("diagnostics",{...e.diagnostics,lastCommands:[...p],lastReasons:[...d.reasonCodes],desyncCounter:v,recoveryCounter:h,commandRepeatCounter:y}),e.dirty=!1,o("ServersideEvaluated",{source:a,desired:shallowCopyDesired(l),commands:[...p],reasons:[...d.reasonCodes]}),{desired:shallowCopyDesired(l),commands:p,reasons:d.reasonCodes}},setBaselineFromRuntime(){const{enabled:s,...i}=n.getBaselineIntent().ss||{},o=n.getClass(),u={...e.baseline,settings:{...e.baseline.settings,...i},affPriorities:buildBaselineAffPriorities(t),defPriorities:buildBaselineDefPriorities(a,o)};c("baseline",u);const d=buildObservedDefPriorities(a,o),m=Object.keys(d).reduce((t,a)=>(t[a]=e.observed.defPriorities[a]??d[a],t),{});c("observed",{...e.observed,defPriorities:m}),c("sessionBaseline",{settings:{...u.settings},affPriorities:{...u.affPriorities},defPriorities:{...u.defPriorities}}),l("baseline-refresh")},observeOutbound:(e=[])=>markPendingCommands(e,{source:"observe-outbound"})}},createServersideCuringSetApi=({state:e,sendCommands:t,markPendingCommands:a,markDirty:n,markStartupCaptured:s,replaceBucket:i})=>{const issueCuringSetCommand=(e,n)=>{const s=normalizeCommand(e);return!!s&&(t([s],{source:"serverside-curingset",reason:n}),a([s],{source:"serverside-curingset",reason:n}),!0)};return{switchCuringSet(t){const a=normalizeSetName(t);if(!a)return!1;const s=issueCuringSetCommand(`curingset switch ${a}`,"switch");return s&&(i("curingsets",{...e.curingsets,activeSet:a}),n("curingset-switch")),s},deleteCuringSet(e){const t=normalizeSetName(e);return!!t&&issueCuringSetCommand(`curingset delete ${t}`,"delete")},observeActiveCuringSet(t){const a=normalizeSetName(t);if(!a||a===normalizeSetName(e.curingsets.activeSet))return!1;const s=i("curingsets",{...e.curingsets,activeSet:a});return s&&n("curingset-active"),s},observeCuringSets({sets:t=[],activeSet:a="",used:o,limit:l}={}){const c=[...new Set((t||[]).map(e=>normalizeSetName(e)).filter(Boolean))],u=normalizeSetName(a),d=Number(o),m=Number(l),p=Number.isFinite(d)?d:e.curingsets.used,g=Number.isFinite(m)?m:e.curingsets.limit,h=e.curingsets.priorSet||(u&&"nexsys4-default"!==u?u:"");i("curingsets",{...e.curingsets,sets:c,activeSet:u,priorSet:h,used:p,limit:g}),s("curingsets"),n("curingset-observed")}}},pt=Object.freeze(["baseline","sessionBaseline","desired","observed","transient","pending","diagnostics","curingsets","startup"]),areBucketValuesEqual=(e,t)=>{if(Object.is(e,t))return!0;if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;if(e instanceof Date||t instanceof Date)return e instanceof Date&&t instanceof Date&&e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t))return!(!Array.isArray(e)||!Array.isArray(t))&&(e.length===t.length&&e.every((e,a)=>areBucketValuesEqual(e,t[a])));if(e instanceof Map||t instanceof Map){if(!(e instanceof Map&&t instanceof Map))return!1;if(e.size!==t.size)return!1;const a=[...e.entries()],n=[...t.entries()];for(let e=0;e<a.length;e+=1){const[t,s]=a[e],[i,o]=n[e];if(!Object.is(t,i)||!areBucketValuesEqual(s,o))return!1}return!0}const a=Object.keys(e),n=Object.keys(t);return a.length===n.length&&a.every(a=>Object.prototype.hasOwnProperty.call(t,a)&&areBucketValuesEqual(e[a],t[a]))},createServersideController=({adapter:e,dispatchCommands:t,affModel:a,defModel:n,systemModel:s,getRuleEvaluation:i=()=>({overlay:{settings:{},affPriorities:{},defPriorities:{},predictions:{}},applied:[]}),options:o={}}={})=>{if("function"!=typeof t)throw new Error("createServersideController requires a dispatchCommands function.");const now=()=>e.now(),l=t,{enabled:c,...u}=s.getBaselineIntent().ss||{},d=createInitialServersideState({baselineSettings:{afflictions:!0,defences:!0,sipping:!0,transmutation:!0,fallback:!0,kaidoTransmute:!1,...u},affModel:a,defModel:n,systemModel:s}),m=new Set,emit=(e,t)=>{m.forEach(a=>a(e,t))},markDirty=(e="state-change")=>{d.dirty=!0,emit("ServersideDirty",{reason:e})},replaceBucket=(e,t)=>!areBucketValuesEqual(d[e],t)&&(d[e]=t,!0),p=createServersideDiffPlanner({getBaseline:()=>d.baseline,getAffPriorityCommandName:"function"==typeof a?.formatPriorityCommandName?e=>a.formatPriorityCommandName(e):void 0,getDefPriorityTokens:(e,t)=>{const a=[String(Number(t))];return!0===n.get(e)?.preempt&&a.push("preempt"),a}}),g="function"==typeof a?.normalizeName?e=>a.normalizeName(e):e=>String(e||"").toLowerCase(),h="function"==typeof a?.normalizePriorityName?e=>a.normalizePriorityName(e):e=>String(e||"").toLowerCase(),b=createServersideEvaluationApi({state:d,affModel:a,defModel:n,systemModel:s,diffPlanner:p,sendCommands:l,emit,markDirty,replaceBucket,getRuleEvaluation:i,now,options:o}),y=createServersideObservationApi({state:d,affModel:a,defModel:n,systemModel:s,emit,markDirty,replaceBucket,maybeResolveFullPriorityReset:b.maybeResolveFullPriorityReset,getRuleEvaluation:i,normalizeAffPriorityName:h}),v=createServersideTransientApi({state:d,markDirty,replaceBucket,normalizeAffName:g}),S=createServersideCuringSetApi({state:d,sendCommands:l,markPendingCommands:b.markPendingCommands,markDirty,markStartupCaptured:y.markStartupCaptured,replaceBucket}),requestSnapshotSync=()=>l(["curing status","curing priority list","curing queue list","curing predictions","curingset list","curing priority defence list"],{source:"serverside-snapshot-sync"}),copyRecord=(e={})=>({...e||{}}),copyArray=(e=[])=>[...e||[]],copyDesiredSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),predictionCommands:copyArray(e.predictionCommands),appliedRules:copyArray(e.appliedRules)}),copyObservedSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioritySet:e.prioritySet||""}),copyTransientSnapshot=(e={})=>({prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),fullPriorityReset:Boolean(e.fullPriorityReset)}),copyDiagnosticsSnapshot=(e={})=>({lastCommands:copyArray(e.lastCommands),lastReasons:copyArray(e.lastReasons),desyncCounter:Number(e.desyncCounter||0),recoveryCounter:Number(e.recoveryCounter||0),commandRepeatCounter:Number(e.commandRepeatCounter||0)}),copyCuringSetSnapshot=(e={})=>({sets:copyArray(e.sets),activeSet:e.activeSet||"",priorSet:e.priorSet||"",used:Number(e.used||0),limit:Number(e.limit||0)}),x=createSnapshotCache({getVersion:()=>d.baseline,buildSnapshot:()=>({settings:copyRecord(d.baseline.settings),affPriorities:copyRecord(d.baseline.affPriorities),defPriorities:copyRecord(d.baseline.defPriorities)})}),k=createSnapshotCache({getVersion:()=>d.sessionBaseline,buildSnapshot:()=>({settings:copyRecord(d.sessionBaseline.settings),affPriorities:copyRecord(d.sessionBaseline.affPriorities),defPriorities:copyRecord(d.sessionBaseline.defPriorities)})}),C=createSnapshotCache({getVersion:()=>d.desired,buildSnapshot:()=>copyDesiredSnapshot(d.desired)}),A=createSnapshotCache({getVersion:()=>d.observed,buildSnapshot:()=>copyObservedSnapshot(d.observed)}),E=createSnapshotCache({getVersion:()=>d.transient,buildSnapshot:()=>copyTransientSnapshot(d.transient)}),w=createSnapshotCache({getVersion:()=>d.pending,buildSnapshot:()=>[...d.pending.entries()]}),_=createSnapshotCache({getVersion:()=>d.diagnostics,buildSnapshot:()=>copyDiagnosticsSnapshot(d.diagnostics)}),T=createSnapshotCache({getVersion:()=>d.curingsets,buildSnapshot:()=>copyCuringSetSnapshot(d.curingsets)}),M={baseline:x,sessionBaseline:k,desired:C,observed:A,transient:E,pending:w,diagnostics:_,curingsets:T,startup:createSnapshotCache({getVersion:()=>d.startup,buildSnapshot:()=>({flags:copyRecord(d.startup.flags)})})};let P=null;const getSnapshot=()=>{const e=pt.reduce((e,t)=>(e[t]=M[t](),e),{});return P&&pt.every(t=>P[t]===e[t])||(P=deepFreeze(e)),P},acknowledgeCommand=e=>acknowledgeCommands([e]),acknowledgeCommands=(e=[])=>{let t=d.pending;return e.forEach(e=>{const a=normalizeCommand(e);a&&t.has(a)&&(t===d.pending&&(t=new Map(d.pending)),t.delete(a))}),replaceBucket("pending",t)};return{onChange:e=>(m.add(e),()=>m.delete(e)),markDirty,evaluate:b.evaluate,isDirty:()=>d.dirty,getTransientPrioAff:()=>d.transient.prioAff,getObserved:()=>A(),getCuringSets:()=>T(),snapshot:()=>getSnapshot(),isStartupReady:y.isStartupReady,getStartupStatus:y.getStartupStatus,getMissingStartupFlags:y.getMissingStartupFlags,markStartupCaptured:y.markStartupCaptured,resetStartupStatus:y.resetStartupStatus,setBaselineFromRuntime:b.setBaselineFromRuntime,requestSnapshotSync,beginObservedAffPrioritySnapshot:y.beginObservedAffPrioritySnapshot,completeObservedAffPrioritySnapshot:y.completeObservedAffPrioritySnapshot,updateObservedSetting:y.updateObservedSetting,updateObservedAffPriority:y.updateObservedAffPriority,beginObservedDefPrioritySnapshot:y.beginObservedDefPrioritySnapshot,completeObservedDefPrioritySnapshot:y.completeObservedDefPrioritySnapshot,updateObservedDefPriority:y.updateObservedDefPriority,updateObservedQueue:y.updateObservedQueue,updateObservedPredictions:y.updateObservedPredictions,parseStatusLine:y.parseStatusLine,setPrioAff:v.setPrioAff,clearPrioAff:v.clearPrioAff,requestPriorityReset:v.requestPriorityReset,addPrediction:v.addPrediction,removePrediction:v.removePrediction,manualQueueAdd:v.manualQueueAdd,manualQueueInsert:v.manualQueueInsert,manualQueueRemove:v.manualQueueRemove,manualQueueReset:v.manualQueueReset,confirmPrediction:v.confirmPrediction,switchCuringSet:S.switchCuringSet,deleteCuringSet:S.deleteCuringSet,observeCuringSets:S.observeCuringSets,observeActiveCuringSet:S.observeActiveCuringSet,acknowledgeCommand,acknowledgeCommands,markPendingCommands:b.markPendingCommands,observeOutbound:b.observeOutbound}},gt=["addiction","haemophilia","nausea","lethargy"],ft=Object.fromEntries(gt.map(e=>[e,3])),latchGinsengCount=e=>gt.filter(t=>e.haveAff(t)).length,ht={id:"latch-ginseng-over-weariness",evaluate:e=>e.haveAff("weariness")&&latchGinsengCount(e)>=2?{affPriorities:ft}:null},haemophiliaBleedingRule=({bleedingAt:e})=>({id:"haemophilia-bleeding",evaluate:t=>t.haveAff("haemophilia")&&t.bleeding()>=e?{affPriorities:{haemophilia:3}}:null}),classPack=(e,t)=>t.map(t=>({...t,id:`vs.${e}.${t.id}`,pack:`vs.${e}`})),createClassRulePacks=()=>[...classPack("infernal",[haemophiliaBleedingRule({bleedingAt:200})]),...classPack("psion",[haemophiliaBleedingRule({bleedingAt:200})]),...classPack("shaman",[haemophiliaBleedingRule({bleedingAt:200})]),...classPack("waterlord",[ht,haemophiliaBleedingRule({bleedingAt:200})])],bt=Object.freeze({BALANCE:"balance",EQUILIBRIUM:"equilibrium",ENTITY:"entity",FOCUS:"focus",FREE:"free",WRITHE:"writhe"}),focusLocked=e=>!e.haveBal(bt.FOCUS)||e.haveAff("impatience"),lockCureCondition=(e,t)=>e.haveAffs(["asthma","slickness","anorexia"])&&focusLocked(e)||t.some(t=>e.haveAffs(["asthma","slickness",t])),yt=[bt.BALANCE,bt.EQUILIBRIUM],vt=1600,St=250,longWindowRemaining=e=>yt.reduce((t,a)=>{if(!e.isBalReported(a))return t;const n=e.balRemaining(a);return e.balElapsed(a)+n>vt?Math.max(t,n):t},0),cureActionRule=(e,t)=>({id:`automatic-cure.${e}`,pack:"general",evaluate:a=>t(a)?{cureActions:{[e]:!0}}:null}),createDefaultRulePack=()=>[{id:"aeon-threshold-and-priority",pack:"general",evaluate:e=>e.haveAff("aeon")?{settings:{sipHealthAt:30,sipManaAt:10,mossHealthAt:0,mossManaAt:0,batch:!1,clotAt:5e3},affPriorities:{asthma:1,weariness:4,anorexia:5,impatience:7,paralysis:8}}:null},{id:"nonfunctional-legs-paralysis",pack:"general",evaluate:e=>e.haveAnAff(["brokenleftleg","damagedleftleg","mangledleftleg"])&&e.haveAnAff(["brokenrightleg","damagedrightleg","mangledrightleg"])?{affPriorities:{paralysis:25}}:null},{id:"paralysis-long-balance",pack:"general",evaluate:e=>{const t=longWindowRemaining(e);return t<=St?null:(e.recheckIn(t-St),{affPriorities:{paralysis:24}})}},{id:"kelp-paralysis-slickness",pack:"general",evaluate:e=>1==e.cureAffCount("kelp")&&e.haveAffs(["paralysis","asthma","slickness"])?{affPriorities:{asthma:1}}:null},{id:"darkshade-lightwall",pack:"general",evaluate:e=>{if(!e.haveAff("darkshade")||!e.roomHasItem("a lightwall"))return null;const t=1e4-e.affElapsed("darkshade");return t>0?(e.recheckIn(t),null):{affPriorities:{darkshade:2}}}},cureActionRule("fitness",e=>e.canUseCure("fitness")&&e.haveAff("asthma")&&(e.haveAnAff(["slickness","hellsight"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity"])||e.haveAnAff(["damagedhead","mangledhead","damagedleftleg","damagedrightleg"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity","slickness","hellsight","disloyalty"]))),cureActionRule("bloodboil",e=>e.canUseCure("bloodboil")&&e.haveAffs(["asthma","slickness"])&&(e.haveAnAff(["hypochondria","paralysis"])||e.haveAff("anorexia")&&focusLocked(e))),cureActionRule("dwinnu",e=>e.canUseCure("dwinnu")&&(e.haveAffs(["webbed","entangled"])||e.haveAnAff(["webbed","entangled"])&&e.haveAff("transfixation"))),cureActionRule("salt",e=>e.canUseCure("salt")&&lockCureCondition(e,["hypochondria","paralysis"])),cureActionRule("shrugging",e=>e.canUseCure("shrugging")&&lockCureCondition(e,["hypochondria","paralysis"])),cureActionRule("fool",e=>e.canUseCure("fool")&&lockCureCondition(e,["hypochondria","impatience"])),cureActionRule("alleviate",e=>e.canUseCure("alleviate")&&lockCureCondition(e,["hypochondria","impatience"])),cureActionRule("dragonflex",e=>e.canUseCure("dragonflex")&&(e.haveAffs(["entangled","webbed"])||e.haveAnAff(["entangled","webbed"])&&(!e.haveBal(bt.WRITHE)||e.haveAff("transfixation")))),cureActionRule("dragonheal",e=>e.canUseCure("dragonheal")&&e.haveAffs(["asthma","slickness","anorexia"])&&focusLocked(e))],createRuleContext=({affModel:e,defModel:t,balanceModel:a,limbModel:n,systemModel:s,trackableModel:i,roomHasItem:o=()=>!1,cureTable:l={},requestRecheck:c=()=>{}})=>{let u=null;const d=new Map,getLimb=e=>n?.get?.(e)||null,isTarget=e=>Array.isArray(e)?e.some(e=>isTarget(e)):"function"==typeof s.isTarget&&s.isTarget(e);return{haveAff:t=>e.haveAff(t),haveAffs:(t=[])=>e.haveAffs(t),haveAnAff:(t=[])=>e.haveAnAff(t),affCount:t=>Number(e.get?.(t)?.count||0),cureAffCount:t=>{const a=String(t||"");if(d.has(a))return d.get(a);const n=l?.[a]?.order;let s=0;return Array.isArray(n)&&n.forEach(t=>{e.haveAff(t)&&(s+=1)}),d.set(a,s),s},canUseCure:e=>{const t=l?.[String(e||"").trim().toLowerCase()];if(!t||!1!==t.serverside||!t.command?.length)return!1;const a=Array.isArray(t.skills)?t.skills:[];return!a.length||classListIncludes(a,s.getClass())},getCuringSetting:e=>{if(!Object.hasOwn(Ce,e))return;const t=s.getBaselineIntent().ss?.[e];return["boolean","number","string"].includes(typeof t)?t:void 0},affElapsed:t=>e.elapsed(t),sortedActiveAffs:()=>(null===u&&(u="function"==typeof e.currentSorted?e.currentSorted():[]),u),haveDef:e=>t.haveDef(e),haveDefs:(e=[])=>e.every(e=>t.haveDef(e)),haveADef:(e=[])=>e.some(e=>t.haveDef(e)),haveBal:e=>a.have(e),haveBals:(e=[])=>e.every(e=>a.have(e)),haveABal:(e=[])=>e.some(e=>a.have(e)),balElapsed:e=>a.elapsed(e),balRemaining:e=>a.remainingMs(e),isBalReported:e=>a.isDurationReported(e),bleeding:()=>Number(s.getChar().bleed)||0,recheckIn:e=>c(e),suspendCuring:(e={})=>({...e&&"object"==typeof e?e:{},suspendCuring:!0}),limbDamage:e=>Number(getLimb(e)?.percent||0),limbStage:e=>getLimb(e)?.stage??"healthy",isLimbBroken:e=>!0===getLimb(e)?.broken,haveTrackable:e=>i?.have?.(e)??!1,trackableElapsed:e=>i?.elapsedMs?.(e)??Number.POSITIVE_INFINITY,trackableRemaining:e=>i?.remainingMs?.(e)??0,roomHasItem:o,isTarget,isClass:e=>s.isClass(e)}},xt=Object.freeze(["affPriorities","defPriorities","cureActions","settings","predictions"]),normalizeRule=(e,t="runtime")=>{if(!e?.id)throw new Error("Rule must include an id");if("function"!=typeof e.evaluate)throw new Error(`Rule "${e.id}" must expose evaluate(context)`);const a=Array.isArray(e.tags)?e.tags.map(e=>String(e).trim().toLowerCase()).filter(Boolean):[];return{id:String(e.id),enabled:!1!==e.enabled,terminal:!0===e.terminal,pack:e.pack||t,tags:a,meta:deepClone$1(e.meta||{}),evaluate:e.evaluate}},stripMasterSwitchSetting=(e={})=>{const{enabled:t,...a}=e||{};return a},createEmptyOverlay=()=>({affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0}),createEmptyProvenance=()=>({affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0}),createProvenanceEntry=(e,t)=>({ruleId:e.id,ruleOrder:t,pack:e.pack}),mergeOverlay=(e,t,a,n,s)=>{if(!a)return;const i=createProvenanceEntry(n,s);xt.forEach(n=>{if(!a[n]||"object"!=typeof a[n])return;const s="settings"===n?stripMasterSwitchSetting(a[n]):a[n];Object.entries(s).forEach(([a,s])=>{e[n][a]=s,t[n][a]=i})}),void 0!==a.prioAff&&(e.prioAff=a.prioAff,t.prioAff=i),Array.isArray(a.manualQueue)&&(e.manualQueue=[...a.manualQueue],t.manualQueue=i)},diffRuleActivity=(e,t)=>{const a=[];return e.forEach((e,n)=>{t.has(n)||a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{e.has(n)||a.push({...t,from:!1,to:!0})}),a},diffRuleSuspension=(e,t)=>{const a=[];return e.forEach((e,n)=>{e.suspendsCuring&&!t.get(n)?.suspendsCuring&&a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{t.suspendsCuring&&!e.get(n)?.suspendsCuring&&a.push({...t,from:!1,to:!0})}),a},createRuleRegistry=(e=[])=>{const t=[],a=new Set,n=new Map,emit=(e,t)=>{a.forEach(a=>{try{a(e,t)}catch(n){console.error("nexSys4 rule registry listener failed",{event:e,error:n})}})},findIndex=e=>t.findIndex(t=>t.id===e),synthesizeDeactivation=(e,t)=>{const a=String(e);if(!n.has(a))return!1;const s=n.get(a);return n.delete(a),emit("RuleDeactivated",{...s,source:t}),!0},addRule=(e,a={})=>{const n=normalizeRule(e,a.pack);return!(findIndex(n.id)>=0)&&(Number.isInteger(a.index)&&a.index>=0&&a.index<t.length?t.splice(a.index,0,n):t.push(n),emit("RuleAdded",{id:n.id,pack:n.pack}),!0)},removeRule=e=>{const a=findIndex(e);if(a<0)return!1;synthesizeDeactivation(e,"removed");const[n]=t.splice(a,1);return emit("RuleRemoved",{id:n.id,pack:n.pack}),!0},setEnabled=(e,a)=>{const n=findIndex(e);return!(n<0||t[n].enabled===a)&&(t[n].enabled=a,a||synthesizeDeactivation(e,"disabled"),emit(a?"RuleEnabled":"RuleDisabled",{id:e}),!0)},setPackEnabled=(e,a)=>{let n=!1;return t.forEach(t=>{t.pack===e&&(n=setEnabled(t.id,a)||n)}),n},loadPack=(e,t=[])=>{let a=!1;return t.forEach(t=>{a=addRule({...t,pack:e},{pack:e})||a}),a&&emit("RulePackLoaded",{packId:e}),a},unloadPack=e=>{const a=t.filter(t=>t.pack===e).map(e=>e.id);return!!a.length&&(a.forEach(e=>removeRule(e)),emit("RulePackUnloaded",{packId:e,count:a.length}),!0)},reorder=(e=[])=>{if(!Array.isArray(e)||!e.length)return!1;const a=new Set(t.map(e=>e.id)),n=new Set(e);if(e.length!==t.length||n.size!==t.length||[...a].some(e=>!n.has(e)))return!1;const s=new Map(t.map(e=>[e.id,e]));return t.length=0,e.forEach(e=>t.push(s.get(e))),emit("RuleOrderChanged",{order:[...e]}),!0},evaluate=(e={})=>{const a=createEmptyOverlay(),s=createEmptyProvenance(),i=[],o=new Map;for(let n=0;n<t.length;n+=1){const l=t[n];if(!l.enabled)continue;const c=l.evaluate(e);if(c&&(i.push(l.id),o.set(l.id,{id:l.id,pack:l.pack,meta:l.meta,ruleOrder:n,suspendsCuring:!0===c.suspendCuring}),mergeOverlay(a,s,c,l,n),l.terminal))break}const l=diffRuleActivity(n,o),c=diffRuleSuspension(n,o);return n.clear(),o.forEach((e,t)=>n.set(t,e)),{overlay:a,provenance:s,applied:i,transitions:l,suspendTransitions:c,suspendingRules:[...o.values()].filter(e=>e.suspendsCuring).map(e=>e.id)}};return e.forEach(e=>addRule(e,{pack:e.pack||"general"})),{onChange:e=>(a.add(e),()=>a.delete(e)),addRule,removeRule,enableRule:e=>setEnabled(e,!0),disableRule:e=>setEnabled(e,!1),enablePack:e=>setPackEnabled(e,!0),disablePack:e=>setPackEnabled(e,!1),loadPack,unloadPack,reorder,evaluate,list:()=>t.map((e,t)=>({id:e.id,ruleOrder:t,enabled:e.enabled,terminal:e.terminal,isActive:n.has(e.id),suspendsCuring:Boolean(n.get(e.id)?.suspendsCuring),pack:e.pack,tags:[...e.tags],meta:deepClone$1(e.meta)}))}},kt=new Set(["RuleAdded","RuleRemoved","RuleEnabled","RuleDisabled","RulePackLoaded","RulePackUnloaded","RuleOrderChanged"]),copyRecord=(e={})=>({...e||{}}),copyProvenanceRecord=(e={})=>Object.entries(e||{}).reduce((e,[t,a])=>(e[t]=a?{...a}:a,e),{}),copyOverlay=(e={})=>({affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),cureActions:copyRecord(e.cureActions),settings:copyRecord(e.settings),predictions:copyRecord(e.predictions),prioAff:e.prioAff,manualQueue:Array.isArray(e.manualQueue)?[...e.manualQueue]:void 0}),copyProvenance=(e={})=>({affPriorities:copyProvenanceRecord(e.affPriorities),defPriorities:copyProvenanceRecord(e.defPriorities),cureActions:copyProvenanceRecord(e.cureActions),settings:copyProvenanceRecord(e.settings),predictions:copyProvenanceRecord(e.predictions),prioAff:e.prioAff?{...e.prioAff}:void 0,manualQueue:e.manualQueue?{...e.manualQueue}:void 0}),copyRules=(e=[])=>e.map(e=>({...e,tags:[...e.tags||[]],meta:deepClone$1(e.meta||{})})),copyTransitionPayload=(e,t)=>({id:e.id,pack:e.pack,meta:e.meta,ruleOrder:e.ruleOrder,source:t,suspendsCuring:!0===e.suspendsCuring}),createRuleController=({affModel:e,defModel:t,balanceModel:a,limbModel:n,systemModel:s,trackableModel:i,roomHasItem:o=()=>!1,cureTable:l={},initialRules:c=[...createDefaultRulePack(),...createClassRulePacks()]}={})=>{const u=new Set,d=createRuleRegistry(c);let m=0,p={overlay:{affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0},provenance:{affPriorities:{},defPriorities:{},cureActions:{},settings:{},predictions:{},prioAff:void 0,manualQueue:void 0},policy:{cureActions:{}},applied:[],suspendingRules:[],source:"initial"};const emit=(e,t)=>{m+=1,u.forEach(a=>a(e,t))};d.onChange((e,t)=>{emit(e,t)});const emitTransitions=(e,t)=>{e.transitions.forEach(e=>{e.to||emit("RuleDeactivated",copyTransitionPayload(e,t))}),e.transitions.forEach(e=>{e.to&&emit("RuleActivated",copyTransitionPayload(e,t))}),e.suspendTransitions.forEach(e=>{emit(e.to?"RuleSuspendActivated":"RuleSuspendDeactivated",copyTransitionPayload(e,t))})},g=createSnapshotCache({getVersion:()=>m,buildSnapshot:()=>({overlay:copyOverlay(p.overlay),provenance:copyProvenance(p.provenance),policy:{cureActions:copyRecord(p.policy.cureActions)},applied:[...p.applied],suspendingRules:[...p.suspendingRules],source:p.source,registry:copyRules(d.list())})}),applyLifecycleChange=e=>(e&&emit("RulesDirty",{reason:"rule-lifecycle"}),e);return{onChange:e=>(u.add(e),()=>u.delete(e)),evaluate({source:c="prompt"}={}){let u=Number.POSITIVE_INFINITY;const m=createRuleContext({affModel:e,defModel:t,balanceModel:a,limbModel:n,systemModel:s,trackableModel:i,roomHasItem:o,cureTable:l,requestRecheck:e=>{const t=Number(e);t>0&&t<u&&(u=t)}}),g=d.evaluate(m);return p={...g,policy:{cureActions:resolveCureActions(g.overlay.cureActions,g.provenance.cureActions)},source:c},emitTransitions(g,c),emit("RulesEvaluated",{source:c,applied:[...g.applied],suspendingRules:[...g.suspendingRules],recheckInMs:Number.isFinite(u)?u:null}),p},snapshot:()=>g(),getEvaluation:()=>p,resolveDefensePriority:(e,t)=>resolveEffectiveDefensePriority({storedPriority:t,overlayValue:p.overlay.defPriorities?.[e]}),lifecycle:{add:(e,t)=>applyLifecycleChange(d.addRule(e,t)),remove:e=>applyLifecycleChange(d.removeRule(e)),enable:e=>applyLifecycleChange(d.enableRule(e)),disable:e=>applyLifecycleChange(d.disableRule(e)),enablePack:e=>applyLifecycleChange(d.enablePack(e)),disablePack:e=>applyLifecycleChange(d.disablePack(e)),load:(e,t)=>applyLifecycleChange(d.loadPack(e,t)),unload:e=>applyLifecycleChange(d.unloadPack(e)),reorder:e=>applyLifecycleChange(d.reorder(e)),list:()=>d.list()},isLifecycleEvent:e=>kt.has(e)}},createCommandDispatcher=({adapter:e}={})=>{const t=[],a=200,isDebugEnabled=()=>"function"==typeof e?.isDebugEnabled&&e.isDebugEnabled(),normalizeCommands=(e=[])=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],resolveSeparator=()=>("function"==typeof e?.getCommandSeparator?e.getCommandSeparator():"|")||"|",normalizeStackPlan=e=>{if(e&&"object"==typeof e&&!Array.isArray(e)){if("stackPlan"!==e.type)return null;const t=normalizeCommands(e.commands);return t.length?{type:"stackPlan",commands:t}:null}const t=normalizeCommands(e);return t.length?{type:"stackPlan",commands:t}:null},normalizeStackPlans=(e=[])=>{if(Array.isArray(e))return e.map(normalizeStackPlan).filter(Boolean);const t=normalizeStackPlan(e);return t?[t]:[]},serializeStackPlan=e=>e.commands.join(resolveSeparator()),recordDispatch=({mode:n,commands:s=[],context:i={},stackIndex:o=1,stackCount:l=1,stackPlan:c=null}={})=>{const u=normalizeCommands(s);if(!u.length)return[];const d={mode:n,commands:[...u],context:{...i},at:e.now(),stackIndex:o,stackCount:l,stackPlan:c?{type:c.type,commands:[...c.commands]}:null};return t.push(d),!isDebugEnabled()&&t.length>a&&t.splice(0,t.length-a),u},sendCommands=(t=[],a={})=>{const n=recordDispatch({mode:"commands",commands:t,context:a});return n.length?(e.send(n,a),n):[]};return{send:sendCommands,sendCommands,sendStackPlan:(t=[],a={})=>{const n=normalizeStackPlans(t);return n.length?(n.forEach((t,s)=>{const i={...a,stackIndex:s+1,stackCount:n.length};recordDispatch({mode:"stack-plan",commands:t.commands,context:i,stackIndex:s+1,stackCount:n.length,stackPlan:t}),e.send(serializeStackPlan(t),i)}),n.map(e=>({type:e.type,commands:[...e.commands]}))):[]},normalizeCommands,history:()=>t.map(e=>({mode:e.mode,commands:[...e.commands],context:{...e.context},at:e.at,stackIndex:e.stackIndex,stackCount:e.stackCount,stackPlan:e.stackPlan?{type:e.stackPlan.type,commands:[...e.stackPlan.commands]}:null}))}},Ct=Object.freeze({freeQueue:[{balanceId:bt.BALANCE,minDurationMs:250},{balanceId:bt.EQUILIBRIUM,minDurationMs:250}],fullQueue:[{balanceId:bt.BALANCE,minDurationMs:250},{balanceId:bt.EQUILIBRIUM,minDurationMs:250}],classQueue:[{balanceId:bt.ENTITY,minDurationMs:500}]}),createQueueFiredSideEffects=({balanceModel:e,now:t})=>({queueId:a})=>{const n=Ct[a]||[];if(!n.length)return[];const s=t();return n.filter(({balanceId:t,minDurationMs:a})=>!1===e.have(t)&&e.computeDurationMs(t)>Number(a||0)).map(({balanceId:t})=>(e.restartLossTimer(t,`queue-fired-resync:${a}`,s),t))},createDomainControllers=({adapter:e,seedData:t,options:a={},now:n,models:s})=>{const{systemModel:i,affModel:o,balanceModel:l,defModel:c,cacheModel:u,limbModel:d,trackableModel:m,roomModel:p}=s,g=createCommandDispatcher({adapter:e}),h=createQueueFiredSideEffects({balanceModel:l,now:n}),b=createQueueController({send:g.sendStackPlan,getRuntimeState:()=>{const e=i.getRuntime();return{paused:e.paused,rulesSuspended:e.rulesSuspended,phase:e.phase,settings:i.getSettings()}},getSeparator:()=>i.getSettings().commandSeparator,maxEntriesPerSubmission:Number(a.maxEntriesPerSubmission||20),onQueueFired:h}),y=createRuleController({affModel:o,defModel:c,balanceModel:l,limbModel:d,systemModel:i,trackableModel:m,cureTable:t.cureTable,roomHasItem:p.haveItem}),v=createServersideController({adapter:e,dispatchCommands:g.sendCommands,affModel:o,defModel:c,systemModel:i,getRuleEvaluation:y.getEvaluation,options:{maxCommandsPerCycle:Number(a.maxSsCommandsPerCycle||40)}}),S=createDefensePlanner({defModel:c,balanceModel:l,affModel:o,systemModel:i,getObservedServersidePriority:e=>v.getObserved().defPriorities?.[e]??0}),x=createCurePlanner({cureTable:t.cureTable,affModel:o,balanceModel:l,systemModel:i}),k=createAutomaticActionPlanner(),C=createPrecachePlanner({cacheModel:u});return{commandDispatcher:g,queueController:b,rules:y,serverside:v,curePlanner:x,defensePlanner:S,automaticActionPlanner:k,precachePlanner:C,outputPlanner:createOutputPlanner({systemModel:i,rules:y,serverside:v,curePlanner:x,defensePlanner:S,automaticActionPlanner:k,precachePlanner:C,queueController:b})}},secondsToMs$1=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds$1=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createBalanceState=(e={})=>{const t={};return Object.entries(e||{}).forEach(([e,a])=>{t[e]={id:e,have:!0,baseDurationMs:secondsToMs$1(a.length),config:deepFreeze(deepClone$1(a||{})),lastLostAtMs:0,lastGotAtMs:0,activeDurationMs:0,activeDurationReported:!1,expectedReadyAtMs:0,lastRecoveredDurationMs:0,lastServerDurationMs:0,callbacks:{},timer:null}}),t},createBalancePayload=(e,t={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,activeDurationReported:e.activeDurationReported,expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastServerDurationMs:e.lastServerDurationMs,...t}),createBalanceMutationApi=({state:e,emit:t,now:a,setTimeoutFn:n,clearTimeoutFn:s,computeDurationMs:i})=>{const clearTimer=e=>{e.timer&&(s?.(e.timer),e.timer=null)},normalizeDurationMs=(e={},t=0)=>Number.isFinite(Number(e.durationMs))?Math.max(0,Math.round(Number(e.durationMs))):Number.isFinite(Number(e.durationSeconds))?secondsToMs$1(e.durationSeconds):Math.max(0,Math.round(Number(t)||0)),o=1e3,scheduleRecovery=(e,t)=>{clearTimer(e),!n||e.have||e.expectedReadyAtMs<=0||(e.timer=n(()=>{gain(e.id,"timer",a())},Math.max(0,e.expectedReadyAtMs+o-t)))},applyServerDuration=(e,t)=>{e.lastServerDurationMs=t},emitDurationObserved=(e,a,n,s)=>{t("BalanceDurationObserved",createBalancePayload(e,{source:s,atMs:n,durationMs:a,durationSeconds:msToSeconds$1(a)}))},createTimingPayload=(e,t,a,n)=>createBalancePayload(e,{reason:t,atMs:a,durationMs:n,durationSeconds:msToSeconds$1(n)});function gain(n,s="manual",i=a()){const o=e[n];if(!o||o.have)return!1;const l=o.activeDurationMs;return o.have=!0,o.lastGotAtMs=i,o.lastRecoveredDurationMs=Math.max(0,i-o.lastLostAtMs),o.activeDurationMs=0,o.activeDurationReported=!1,o.expectedReadyAtMs=0,clearTimer(o),o.callbacks.onStop?.(o),t("BalanceGot",createTimingPayload(o,s,i,o.lastRecoveredDurationMs||l)),!0}const lose=(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||!c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.have=!1,c.lastLostAtMs=o,c.activeDurationMs=u,c.activeDurationReported=!0===l.serverDuration,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),c.callbacks.onStart?.(c),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLost",createTimingPayload(c,s,o,u)),!0},observeDuration=(t,n={})=>{const s=e[t],i=normalizeDurationMs(n,0);if(!s||i<=0)return!1;const o=n.atMs??n.at??a(),l=String(n.source||"observed-duration"),c=!0===n.serverDuration;if(s.have){const e=lose(t,l,o,{durationMs:i,serverDuration:c,autoRegain:n.autoRegain});return e&&emitDurationObserved(s,i,o,l),e}return c&&applyServerDuration(s,i),s.activeDurationMs=i,s.activeDurationReported=c,s.expectedReadyAtMs=s.lastLostAtMs+i,!1!==n.autoRegain?scheduleRecovery(s,o):clearTimer(s),emitDurationObserved(s,i,o,l),!0},observeServerUse=(e,t,a={})=>observeDuration(e,{...a,durationMs:secondsToMs$1(t),serverDuration:!0,source:a.source||"serverside-duration"});return{gain,lose,restartLossTimer:(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.lastLostAtMs=o,c.activeDurationMs=u,c.activeDurationReported=!0===l.serverDuration,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLossTimerRestarted",createTimingPayload(c,s,o,u)),!0},observeDuration,observeServerUse,reset(n,s="reset"){const i=e[n];return!!i&&(clearTimer(i),i.have=!0,i.lastGotAtMs=a(),i.activeDurationMs=0,i.activeDurationReported=!1,i.expectedReadyAtMs=0,i.callbacks.onReset?.(i),t("BalanceReset",createBalancePayload(i,{reason:s})),!0)},setCallback(t,a={}){const n=e[t];return!!n&&(n.callbacks={...n.callbacks,...a},!0)},applyVitals(t={}){const n=toParsedGmcpVitals(t);n.balancePatches.forEach(({id:e,have:t})=>{if(!e||void 0===t)return;const n=a();t?gain(e,"gmcp-vitals",n):lose(e,"gmcp-vitals",n)}),n.resourceStats.forEach(({key:t,balanceState:n})=>{e[t]&&void 0!==n&&(n?gain(t,"gmcp-charstat",a()):lose(t,"gmcp-charstat",a()))})},dispose(){Object.values(e).forEach(clearTimer)}}},createBalanceQueryApi=({state:e,now:t,haveAff:a,getVersion:n=()=>0,getEntryVersion:s=()=>n()})=>{const buildEntrySnapshot=(e={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,baseDurationSeconds:msToSeconds$1(e.baseDurationMs),config:e.config,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,activeDurationSeconds:msToSeconds$1(e.activeDurationMs),activeDurationReported:e.activeDurationReported,expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(e.lastRecoveredDurationMs),lastServerDurationMs:e.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(e.lastServerDurationMs)}),i=new Map,getEntrySnapshot=t=>e[t]?(i.has(t)||i.set(t,createSnapshotCache({getVersion:()=>s(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),i.get(t)()):null,o=createSnapshotCache({getVersion:n,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),computeDurationMs=t=>{const n=e[t];if(!n)return 0;let s=Number(n.baseDurationMs||0);const i=n.config.aff_modifiers||{};return Object.entries(i).forEach(([e,t])=>{if(!a(e))return;const n=Number(t.multiplier??1),i=secondsToMs$1(t.offset??0);s=Math.round(s*n+i)}),Math.max(0,s)},elapsedMs=(a,n=t())=>{const s=e[a];return s?s.have?Math.max(0,n-s.lastGotAtMs):Math.max(0,n-s.lastLostAtMs):0},remainingMs=(a,n=t())=>{const s=e[a];return!s||s.have?0:s.expectedReadyAtMs>0?Math.max(0,s.expectedReadyAtMs-n):Math.max(0,s.activeDurationMs-elapsedMs(a,n))},timing=(a,n=t())=>{const s=e[a];if(!s)return null;const i=elapsedMs(a,n),o=remainingMs(a,n),l=computeDurationMs(a);return{id:s.id,have:s.have,atMs:n,elapsedMs:i,elapsedSeconds:msToSeconds$1(i),remainingMs:o,remainingSeconds:msToSeconds$1(o),baseDurationMs:s.baseDurationMs,baseDurationSeconds:msToSeconds$1(s.baseDurationMs),computedDurationMs:l,computedDurationSeconds:msToSeconds$1(l),activeDurationMs:s.activeDurationMs,activeDurationSeconds:msToSeconds$1(s.activeDurationMs),activeDurationReported:s.activeDurationReported,expectedReadyAtMs:s.expectedReadyAtMs,lastLostAtMs:s.lastLostAtMs,lastGotAtMs:s.lastGotAtMs,lastRecoveredDurationMs:s.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(s.lastRecoveredDurationMs),lastServerDurationMs:s.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(s.lastServerDurationMs)}};return{list:()=>Object.keys(e),snapshot:()=>o(),get:e=>getEntrySnapshot(e),have:t=>Boolean(e[t]?.have),elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,a=t())=>msToSeconds$1(elapsedMs(e,a)),remaining:remainingMs,remainingMs,remainingSeconds:(e,a=t())=>msToSeconds$1(remainingMs(e,a)),isDurationReported:t=>!0===e[t]?.activeDurationReported,timing,computeDuration:computeDurationMs,computeDurationMs,computeDurationSeconds:e=>msToSeconds$1(computeDurationMs(e))}},createBalanceModel=({balanceTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n,haveAff:s=()=>!1}={})=>{const i=createBalanceState(e),o=new Set;let l=0;const c=new Map,emit=(e,t)=>{l+=1,t?.id&&c.set(t.id,(c.get(t.id)??0)+1),o.forEach(a=>a(e,t))},u=createBalanceQueryApi({state:i,now:t,haveAff:s,getVersion:()=>l,getEntryVersion:e=>c.get(e)??0}),d=createBalanceMutationApi({state:i,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n,computeDurationMs:u.computeDurationMs});return{onChange:e=>(o.add(e),()=>o.delete(e)),list:u.list,snapshot:u.snapshot,get:u.get,have:u.have,elapsed:u.elapsed,elapsedMs:u.elapsedMs,elapsedSeconds:u.elapsedSeconds,remaining:u.remaining,remainingMs:u.remainingMs,remainingSeconds:u.remainingSeconds,isDurationReported:u.isDurationReported,timing:u.timing,computeDuration:u.computeDuration,computeDurationMs:u.computeDurationMs,computeDurationSeconds:u.computeDurationSeconds,gain:d.gain,lose:d.lose,restartLossTimer:d.restartLossTimer,observeDuration:d.observeDuration,observeServerUse:d.observeServerUse,reset:d.reset,setCallback:d.setCallback,applyVitals:d.applyVitals,dispose:d.dispose}},asSet=(e={})=>Array.isArray(e)?new Set(e.map(e=>String(e).toLowerCase())):new Set(Object.keys(e).map(e=>String(e).toLowerCase())),At=0,Et=1,createAfflictionReference=(e,t={})=>{const a=String(e||"").trim().toLowerCase();if(!a)return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1};if(t[a])return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!0};const n=a.match(/^(.*?)(?:\s*\((\d+)\)|(\d+))$/),s=Number(n?.[2]??n?.[3]),i=n?.[1]?.trim();return n&&t[i]?{raw:a,name:i,count:s,hasExplicitCount:!0,isCountable:!0}:{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1}},normalizeAfflictionName=(e,t={})=>createAfflictionReference(e,t).name,normalizeAfflictionPriorityName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable&&a.hasExplicitCount&&Number(a.count)>1?`${a.name}${a.count}`:a.name},formatAfflictionPriorityCommandName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable?a.hasExplicitCount?`${a.name}${a.count}`:`${a.name}1`:a.name},createAffEntry=(e,t,a,n=null)=>({name:e,have:!1,count:0,min:Number(n?.min??At),max:Number(n?.max??Et),since:0,lastChangeAt:0,order:t,defaultPriority:a,priorityOverride:null,timer:null}),createInitialAfflictionState=(e={})=>{const t=e.types?.countable||{},a=[...e.list||[]].reduce((e,a)=>{const n=normalizeAfflictionName(a,t);return n&&!e.includes(n)&&e.push(n),e},[]),n=Object.entries(e.prios||{}).reduce((e,[a,n])=>{const s=normalizeAfflictionName(a,t);return s&&(e[s]=n),e},{}),s={};return a.forEach((e,a)=>{s[e]=createAffEntry(e,a,n[e]??100,t[e]||null)}),{list:a,defaultPrios:n,state:s,timedConfig:e.types?.timed||{},countableConfig:t,uncurableSet:asSet(e.types?.uncurable||{})}},ensureAffEntry=(e,t,a={},n)=>{const s=normalizeAfflictionName(n,a);return e[s]||(e[s]=createAffEntry(s,Object.keys(e).length,t[s]??100,a[s]||null)),e[s]},toPriorityNumber=e=>{const t=Number(e);return Number.isFinite(t)?t:null},getPriorityValue=e=>e?e.priorityOverride??e.defaultPriority:null,getDefaultPriorityValue=e=>e?.defaultPriority??null,setPriorityValue=(e,t)=>e.priorityOverride===t?{changed:!1,priority:t}:(e.priorityOverride=t,{changed:!0,priority:t}),resetPriorityValue=e=>{const t=e.defaultPriority;return null===e.priorityOverride||void 0===e.priorityOverride?{changed:!1,priority:t}:(e.priorityOverride=null,{changed:!0,priority:t})},setDefaultPriorityValue=(e,t,{shouldSyncCurrentPriorityToDefault:a=e=>null===e.priorityOverride||void 0===e.priorityOverride,syncCurrentPriorityToDefault:n=()=>{}}={})=>{const s=e.defaultPriority;if(s===t)return{changed:!1,currentChanged:!1,priority:t,previousDefaultPriority:s};const i=a(e);return e.defaultPriority=t,i&&n(e,t),{changed:!0,currentChanged:i,priority:t,previousDefaultPriority:s}},createAfflictionPriorityApi=({state:e,defaultPrios:t,countableConfig:a,emit:n})=>{const getEntry=(n,{ensure:s=!1}={})=>s?ensureAffEntry(e,t,a,n):e[normalizeAfflictionName(n,a)]||null;return{ensureAff:e=>getEntry(e,{ensure:!0}),getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):100},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):100},setPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setPriorityValue(i,s);return!!o.changed&&(n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority}),!0)},resetPriority(e,t="manual"){const a=getEntry(e,{ensure:!0}),s=resetPriorityValue(a);return!!s.changed&&(n("AffPriorityChanged",{name:a.name,source:t,priority:s.priority,defaultPriority:a.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setDefaultPriorityValue(i,s);return!!o.changed&&(n("AffDefaultPriorityChanged",{name:i.name,source:a,priority:o.priority,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority,defaultChanged:!0}),!0)}}},createAfflictionLifecycleApi=({state:e,defaultPrios:t,timedConfig:a,countableConfig:n,emit:s,now:i,setTimeoutFn:o,clearTimeoutFn:l})=>{const clearTimer=e=>{e.timer&&(l?.(e.timer),e.timer=null)},emitAffGot=(e,t,a)=>{s("AffGot",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitAffLost=(e,t,a)=>{s("AffLost",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitStackChanged=(e,t,a)=>{s("AffStackChanged",{name:e.name,count:e.count,previousCount:a,min:e.min,max:e.max,have:e.have,at:t})},clampCount=(e,t)=>{const a=Number(t);return Number.isFinite(a)?Math.max(e.min,Math.min(e.max,a)):e.count},scheduleTimedExpiry=e=>{const t=a[e.name];if(!t)return;clearTimer(e);const n=Math.round(1e3*Number(t.length||0));n<=0||!o||(e.timer=o(()=>{lose(e.name,{source:"timed-expiry",at:i()})},n))},applyCountableState=(e,t,a={})=>{const n=a.at??i(),s=a.source||"manual",o=e.have,l=e.count;return e.count=clampCount(e,t),e.have=e.count>0,e.have&&!o&&(e.since=n),e.lastChangeAt=n,emitStackChanged(e,n,l),!o&&e.have?emitAffGot(e,n,s):o&&!e.have&&emitAffLost(e,n,s),o},got=(a,s={})=>{const o=createAfflictionReference(a,n),l=ensureAffEntry(e,t,n,o.name),c=s.at??i(),u=s.source||"manual",d=l.have;if(n[l.name]){const e=Number(s.count);return applyCountableState(l,Number.isFinite(e)?e:o.hasExplicitCount?o.count:l.count+Number(s.countDelta??1),{at:c,source:u}),l.have?scheduleTimedExpiry(l):clearTimer(l),!0}return!d&&(l.have=!0,l.count=1,l.since=c,l.lastChangeAt=c,scheduleTimedExpiry(l),emitAffGot(l,c,u),!0)},lose=(a,s={})=>{const o=ensureAffEntry(e,t,n,createAfflictionReference(a,n).name),l=s.at??i(),c=s.source||"manual",u=o.have;if(n[o.name]){const e=Number(s.count);return applyCountableState(o,Number.isFinite(e)?e:Number.isFinite(Number(s.countDelta))?o.count-Math.abs(Number(s.countDelta)):0,{at:l,source:c}),clearTimer(o),!0}return!!u&&(o.have=!1,o.count=0,o.lastChangeAt=l,clearTimer(o),emitAffLost(o,l,c),!0)};return{got,lose,applyList(t=[]){const a=new Set,s=new Map,i=new Set;(t||[]).forEach(e=>{const t=createAfflictionReference("string"==typeof e?e:String(e?.name||e?.affliction||e||""),n);if(t.name){if(n[t.name])return t.hasExplicitCount?(i.add(t.name),void s.set(t.name,Math.max(s.get(t.name)??0,t.count))):void(i.has(t.name)||s.set(t.name,(s.get(t.name)??0)+1));a.add(t.name)}}),Object.keys(e).forEach(t=>{n[t]?s.has(t)?got(t,{source:"gmcp-list",count:s.get(t)}):(e[t].have||e[t].count>0)&&lose(t,{source:"gmcp-list"}):a.has(t)?got(t,{source:"gmcp-list"}):e[t].have&&lose(t,{source:"gmcp-list"})})},dispose(){Object.values(e).forEach(clearTimer)}}},secondsToMs=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createAfflictionQueryApi=({state:e,list:t,timedConfig:a,countableConfig:n,uncurableSet:s,getPriority:i,now:o,getVersion:l=()=>0,getEntryVersion:c=()=>l()})=>{const buildEntrySnapshot=(e={})=>({name:e.name,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride}),u=new Map,getEntrySnapshot=t=>e[t]?(u.has(t)||u.set(t,createSnapshotCache({getVersion:()=>c(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),u.get(t)()):null,d=createSnapshotCache({getVersion:l,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),elapsedMs=(t,a=o())=>{const s=e[normalizeAfflictionName(t,n)];return s?.have?Math.max(0,a-s.since):0},durationMs=e=>{const t=a[normalizeAfflictionName(e,n)];return t?secondsToMs(t.length):0},remainingMs=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s],l=durationMs(s);return!i?.have||l<=0?0:Math.max(0,l-elapsedMs(s,a))},timing=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s];if(!i)return null;const l=elapsedMs(s,a),c=durationMs(s),u=remainingMs(s,a);return{name:s,have:i.have,atMs:a,sinceMs:i.since,lastChangeAtMs:i.lastChangeAt,elapsedMs:l,elapsedSeconds:msToSeconds(l),timedDurationMs:c,timedDurationSeconds:msToSeconds(c),remainingMs:u,remainingSeconds:msToSeconds(u)}};return{snapshot:()=>d(),get:e=>getEntrySnapshot(normalizeAfflictionName(e,n)),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],getCountablePriorityNames:()=>Object.entries(n).flatMap(([e,t])=>{const a=Math.max(0,Number(t?.max??0)),n=[];for(let s=2;s<=a;s+=1)n.push(`${e}${s}`);return n}),normalizeName:e=>normalizeAfflictionName(e,n),normalizePriorityName:e=>normalizeAfflictionPriorityName(e,n),formatPriorityCommandName:e=>formatAfflictionPriorityCommandName(e,n),haveAff(t){const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)},haveAffs:(t=[])=>t.every(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),haveAnAff:(t=[])=>t.some(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),currentSorted:()=>Object.values(e).filter(e=>e.have).sort((e,t)=>{const a=i(e.name),n=i(t.name);return a!==n?a-n:e.order-t.order}).map(e=>e.name),isCountable(e){const t=normalizeAfflictionName(e,n);return Boolean(n[t])},isTimed(e){const t=normalizeAfflictionName(e,n);return Boolean(a[t])},isUncurable(e){const t=normalizeAfflictionName(e,n);return s.has(t)},elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,t=o())=>msToSeconds(elapsedMs(e,t)),remaining:remainingMs,remainingMs,remainingSeconds:(e,t=o())=>msToSeconds(remainingMs(e,t)),timing}},createAfflictionModel=({affTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n}={})=>{const{list:s,defaultPrios:i,state:o,timedConfig:l,countableConfig:c,uncurableSet:u}=createInitialAfflictionState(e),d=new Set;let m=0;const p=new Map,emit=(e,t)=>{m+=1,t?.name&&p.set(t.name,(p.get(t.name)??0)+1),d.forEach(a=>a(e,t))},getEntryVersion=e=>p.get(e)??0,g=createAfflictionPriorityApi({state:o,defaultPrios:i,countableConfig:c,emit}),h=createAfflictionLifecycleApi({state:o,defaultPrios:i,timedConfig:l,countableConfig:c,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n}),b=createAfflictionQueryApi({state:o,list:s,timedConfig:l,countableConfig:c,uncurableSet:u,getPriority:g.getPriority,now:t,getVersion:()=>m,getEntryVersion});return{onChange:e=>(d.add(e),()=>d.delete(e)),snapshot:b.snapshot,get:b.get,list:b.list,getCountablePriorityNames:b.getCountablePriorityNames,normalizeName:b.normalizeName,normalizePriorityName:b.normalizePriorityName,formatPriorityCommandName:b.formatPriorityCommandName,got:h.got,lose:h.lose,applyList:h.applyList,setPriority:g.setPriority,resetPriority:g.resetPriority,getPriority:g.getPriority,getDefaultPriority:g.getDefaultPriority,setDefaultPriority:g.setDefaultPriority,haveAff:b.haveAff,haveAffs:b.haveAffs,haveAnAff:b.haveAnAff,currentSorted:b.currentSorted,isCountable:b.isCountable,isTimed:b.isTimed,isUncurable:b.isUncurable,elapsed:b.elapsed,elapsedMs:b.elapsedMs,elapsedSeconds:b.elapsedSeconds,remaining:b.remaining,remainingMs:b.remainingMs,remainingSeconds:b.remainingSeconds,timing:b.timing,dispose:h.dispose}},createDefenseLifecycleApi=({state:e,emit:t})=>{const setStaticRequested=(a,n,s="manual")=>{const i=e[a];if(!i?.static)return!1;const o=Boolean(n);return i.staticRequested!==o&&(i.staticRequested=o,t("DefStaticRequestChanged",{id:a,requested:o,source:s}),!0)},consumeStaticPriority=(a,n="manual",s={})=>{const i=e[a];if(!i?.static)return!1;const o=isActiveStaticPriority(resolveDefensePriority(i)),l=setStaticRequested(a,!1,n);return o&&(i.priorityOverride=0,t("DefPriorityChanged",{id:a,value:0,source:n,consumed:!0,static:!0,defaultPriority:i.defaultPriority,...s})),o||l},setHave=(a,n,s="manual",i=Date.now())=>{const o=e[a];if(!o||o.have===n)return!1;o.have=n,o.lastChangeAt=i;const l={id:a,source:s,at:i,have:o.have,lastChangeAt:o.lastChangeAt,static:o.static,serverside:o.serverside,preempt:o.preempt};return t(n?"DefGot":"DefLost",l),n&&consumeStaticPriority(a,s,{triggeredByGain:!0}),!0},setStatic=(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=Boolean(n);if(i.static===o)return!1;const l=i.static,c=resolveDefensePriority(i);let u=!1,d=!1;return i.static=o,!o&&i.staticRequested&&(i.staticRequested=!1),o&&i.have&&isActiveStaticPriority(c)?(i.priorityOverride=0,d=!0,u=resolveDefensePriority(i)!==c):o||0!==i.priorityOverride||(i.priorityOverride=null,u=resolveDefensePriority(i)!==c),t("DefStaticChanged",{id:a,value:o,previousValue:l,source:s,have:i.have,static:i.static,seedStatic:i.seedStatic,defaultPriority:i.defaultPriority,currentPriority:resolveDefensePriority(i),serverside:i.serverside,preempt:i.preempt}),u&&t("DefPriorityChanged",{id:a,value:resolveDefensePriority(i),source:s,static:i.static,defaultPriority:i.defaultPriority,staticChanged:!0,consumed:d}),!0},setCommand=(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=normalizeCommandList(n);return i.command=o,t("DefCommandChanged",{id:a,value:o,source:s}),!0};return{consumeStaticPriority,requestStatic(e=[],t="manual"){let a=!1;return(e||[]).forEach(e=>{a=setStaticRequested(e,!0,t)||a}),a},clearStaticRequests(t,a="manual"){const n=Array.isArray(t)?t:Object.keys(e).filter(t=>e[t]?.staticRequested);let s=!1;return n.forEach(e=>{s=setStaticRequested(e,!1,a)||s}),s},pruneStaticRequests(t,a="planner"){let n=!1;return Object.keys(e).forEach(s=>{e[s]?.staticRequested&&!t(s,e[s])&&(n=setStaticRequested(s,!1,a)||n)}),n},setHave,setStatic,setCommand,applyList(t=[],a="gmcp-list"){const n=new Set;(t||[]).forEach(e=>{const t=normalizeObservedDefenseId(e);t&&n.add(t)}),Object.keys(e).forEach(t=>{n.has(t)?(setHave(t,!0,a),e[t].static&&consumeStaticPriority(t,a,{observedActive:!0})):e[t].have&&!e[t].clientOnly&&setHave(t,!1,a)})}}},toDefensePriorityNumber=e=>{const t=toPriorityNumber(e);return null===t?null:t<0?0:t>26?26:t},createDefensePriorityApi=({state:e,emit:t,consumeStaticPriority:a})=>{const getEntry=t=>e[t]||null,clearActiveOpps=(e,t,a)=>{isActiveDefensePriority(getPriorityValue(e))&&e.opps?.length&&e.opps.forEach(e=>{const n=getEntry(e);n&&isActiveDefensePriority(getPriorityValue(n))&&a(n,t)})};return{getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):-1},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):-1},setPriority(e,n,s="manual"){const i=toDefensePriorityNumber(n);if(null===i)return!1;const o=getEntry(e);if(!o)return!1;if(o.static&&!0===o.have&&isActiveStaticPriority(i))return a(e,s,{ignoredWhileActive:!0});const l=setPriorityValue(o,i);return!!l.changed&&(t("DefPriorityChanged",{id:o.id,value:l.priority,source:s,static:o.static,defaultPriority:o.defaultPriority}),clearActiveOpps(o,s,(e,a)=>{const n=setPriorityValue(e,0);n.changed&&t("DefPriorityChanged",{id:e.id,value:n.priority,source:a,static:e.static,defaultPriority:e.defaultPriority,clearedByOpp:o.id})}),!0)},resetPriority(e,n="manual"){const s=getEntry(e);if(!s)return!1;if(s.static&&!0===s.have)return a(e,n,{reset:!0,ignoredWhileActive:!0});const i=resetPriorityValue(s);return!!i.changed&&(t("DefPriorityChanged",{id:s.id,value:i.priority,source:n,static:s.static,defaultPriority:s.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,a,n="manual"){const s=toDefensePriorityNumber(a);if(null===s)return!1;const i=getEntry(e);if(!i)return!1;const o=setDefaultPriorityValue(i,s);return!!o.changed&&(t("DefDefaultPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&t("DefPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,defaultPriority:i.defaultPriority,defaultChanged:!0}),clearActiveOpps(i,n,(e,a)=>{const n=setDefaultPriorityValue(e,0);n.changed&&(t("DefDefaultPriorityChanged",{id:e.id,value:n.priority,source:a,static:e.static,previousDefaultPriority:n.previousDefaultPriority,currentPriority:getPriorityValue(e),clearedByOpp:i.id}),n.currentChanged&&t("DefPriorityChanged",{id:e.id,value:n.priority,source:a,static:e.static,defaultPriority:e.defaultPriority,defaultChanged:!0,clearedByOpp:i.id}))}),!0)}}},createDefenseQueryApi=({state:e,list:t,getVersion:a=()=>0,getEntryVersion:n=()=>a()})=>{const buildDefEntrySnapshot=(e={})=>({id:e.id,have:e.have,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride,priority:resolveDefensePriority(e),staticRequested:e.staticRequested,command:e.command,stopCommand:e.stopCommand,bals_req:e.bals_req,bals_used:e.bals_used,stopBals_req:e.stopBals_req,stopBals_used:e.stopBals_used,blocks:e.blocks,stopBlocks:e.stopBlocks,skills:e.skills,opps:e.opps,serverside:e.serverside,preempt:e.preempt,static:e.static,clientOnly:e.clientOnly,trackOnly:e.trackOnly}),s=new Map,getDefSnapshot=t=>e[t]?(s.has(t)||s.set(t,createSnapshotCache({getVersion:()=>n(t),buildSnapshot:()=>buildDefEntrySnapshot(e[t])})),s.get(t)()):null,i=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=resolveDefensePriority(e[a]),t),{})}),o=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Number(e[a].defaultPriority??-1),t),{})}),l=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Boolean(e[a]?.static),t),{})}),c=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(Boolean(e[a]?.static)!==Boolean(e[a]?.seedStatic)&&(t[a]=Boolean(e[a]?.static)),t),{})}),u=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(e[a]?.staticRequested&&(t[a]=!0),t),{})}),d=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getDefSnapshot(t),e),{})});return{snapshot:()=>d(),get:e=>getDefSnapshot(e),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],isAvailableForClass:(t,a="")=>matchesClass(e[t]?.skills,a),haveDef:t=>Boolean(e[t]?.have),getPriority(t){const a=e[t];return a?resolveDefensePriority(a):-1},getDefaultPriority:t=>Number(e[t]?.defaultPriority??-1),getPriorities:()=>i(),getDefaultPriorities:()=>o(),getStatics:()=>l(),getStaticOverrides:()=>c(),getStaticRequests:()=>u(),isStaticRequested:t=>Boolean(e[t]?.staticRequested),isStatic:t=>Boolean(e[t]?.static)}},createDefenseModel=({defTable:e={},defPrios:t={}}={})=>{const{state:a,list:n}=createInitialDefenseState({defTable:e,defPrios:t}),s=new Set;let i=0;const o=new Map,emit=(e,t)=>{i+=1,t?.id&&o.set(t.id,(o.get(t.id)??0)+1),s.forEach(a=>a(e,t))},getEntryVersion=e=>o.get(e)??0,l=createDefenseLifecycleApi({state:a,emit}),c=createDefensePriorityApi({state:a,emit,consumeStaticPriority:l.consumeStaticPriority}),u=createDefenseQueryApi({state:a,list:n,getVersion:()=>i,getEntryVersion});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:u.snapshot,get:u.get,list:u.list,isAvailableForClass:u.isAvailableForClass,haveDef:u.haveDef,isStatic:u.isStatic,setStatic:l.setStatic,setCommand:l.setCommand,setHave:l.setHave,applyList:l.applyList,requestStatic:l.requestStatic,clearStaticRequests:l.clearStaticRequests,pruneStaticRequests:l.pruneStaticRequests,setPriority:c.setPriority,setDefaultPriority:c.setDefaultPriority,resetPriority:c.resetPriority,getPriority:c.getPriority,getDefaultPriority:c.getDefaultPriority,getDefaultPriorities:u.getDefaultPriorities,getPriorities:u.getPriorities,getStatics:u.getStatics,getStaticOverrides:u.getStaticOverrides,getStaticRequests:u.getStaticRequests,isStaticRequested:u.isStaticRequested}},wt=1e4,_t=["brokenleftarm","damagedleftarm","mangledleftarm"],Tt=["brokenrightarm","damagedrightarm","mangledrightarm"],createCachePrecacheSupport=({state:e,haveAff:t=()=>!1,haveDef:a=()=>!1}={})=>{const isPrecacheBlocked=()=>{if(t("aeon")||a("prismatic"))return!0;const e=_t.some(e=>t(e)),n=Tt.some(e=>t(e));return!(!e||!n)},buildPrecacheCommands=()=>isPrecacheBlocked()?[]:e.hydration.inventoryKnown&&e.hydration.riftKnown?Object.entries(e.desiredPrecache).flatMap(([t,a])=>{const n=toNumber(e.inventory[t],0),s=toNumber(e.rift[t],0),i=Math.max(0,toNumber(e.riftCapacity,wt)),o=Math.max(0,toNumber(a,0)),l=Math.max(0,o-n),c=Math.max(0,n-o),u=Math.min(l,s),d=Math.max(0,i-s);return u>0?[`outr ${u} ${t}`]:c>0&&d>0?[`inr ${Math.min(c,d)} ${t}`]:[]}):[];return{getPrecacheCommands:()=>buildPrecacheCommands(),isPrecacheBlocked,isHydrated:()=>e.hydration.inventoryKnown&&e.hydration.riftKnown,getTotal:t=>toNumber(e.inventory[t],0)+toNumber(e.rift[t],0)}},findCaseInsensitiveKey=(e={},t="")=>{if(!e||"object"!=typeof e)return null;const a=String(t).toLowerCase();return Object.keys(e).find(e=>String(e).toLowerCase()===a)||null},createCacheNameNormalizer=({cacheTable:e={},cacheNames:t={}}={})=>{const a=t.herb_name_to_herb||{},n=new Set(Object.keys(e)),toCount=(e,t=1)=>Math.max(0,toNumber(e,t)),resolveName=e=>{if(!e)return"";const t=String(e).trim().toLowerCase();return a[t]||t},resolveCountedName=e=>{const t=resolveName(e);if(n.has(t)||!t.endsWith("s"))return t;const a=resolveName(t.slice(0,-1));return n.has(a)?a:t},parseNameAndAmount=(e,t)=>{const a=String(e||"").trim().toLowerCase();if(!a)return{name:"",amount:Math.max(0,toNumber(t,1))};const s=a.match(/^a group of\s+(\d+)\s+(.+)$/);if(s){const[,e,a]=s,i=resolveCountedName(a);if(n.has(i))return{name:i,amount:toCount(t,toNumber(e,1))}}const i=a.match(/^(\d+)\s+(.+)$/);if(i){const[,e,a]=i,s=resolveCountedName(a);if(n.has(s))return{name:s,amount:toCount(t,toNumber(e,1))}}return{name:resolveCountedName(a),amount:toCount(t,1)}};return{resolveName,parseNameAndAmount,normalizeName:e=>parseNameAndAmount(e).name}},readGmcpPath=(e={},t=[])=>{const a=findCaseInsensitiveKey(e,t.join("."));if(a)return e[a];let n=e;for(const s of t){if(!n||"object"!=typeof n)return;const e=findCaseInsensitiveKey(n,s);if(!e)return;n=n[e]}return n},createCacheStateSupport=({state:e,emit:t=()=>{},cacheTable:a={},cacheNames:n={}}={})=>{const{parseNameAndAmount:s,normalizeName:i}=createCacheNameNormalizer({cacheTable:a,cacheNames:n}),o={invAddsById:new Map,roomRemovesById:new Map,appliedIds:new Set},normalizeItemId=e=>null==e||""===e?"":String(e),adjustInventoryAmount=(a,n,s="inventory-delta")=>!(!a||!(a in e.inventory))&&(e.inventory[a]=Math.max(0,e.inventory[a]+toNumber(n,0)),t("CacheAmountChanged",{bucket:"inventory",name:a,amount:e.inventory[a],source:s}),!0),parseInventoryEntry=(e={})=>{const t=e?.item||e,a=s(t?.name||t?.item||t,t?.amount??t?.count??t?.qty??e?.amount??e?.count??e?.qty);return{id:normalizeItemId(t?.id??e?.id),location:String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),name:a.name,amount:a.amount,icon:t?.icon??e?.icon,attrib:t?.attrib??e?.attrib}},storeInventoryCurative=(t={})=>{if(!t.id||!t.name||!(t.name in e.inventory))return!1;const a={name:t.name,amount:t.amount,location:t.location||"inv"};return void 0!==t.icon&&null!==t.icon&&(a.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(a.attrib=t.attrib),e.inventoryCurativesById[t.id]=a,!0},deleteInventoryCurative=t=>{const a=normalizeItemId(t);return!(!a||!(a in e.inventoryCurativesById))&&(delete e.inventoryCurativesById[a],!0)},deleteInventoryCurativesByName=t=>{let a=!1;return Object.entries(e.inventoryCurativesById).forEach(([n,s])=>{s?.name===t&&(delete e.inventoryCurativesById[n],a=!0)}),a},emitInventoryIdentityChanged=()=>{t("CacheInventoryIdentityChanged",{...e.inventoryCurativesById})},buildResult=({changed:e=!1,identityChanged:t=!1,name:a="",amount:n=0,delta:s=0,source:i=""}={})=>({changed:e,identityChanged:t,name:a,amount:n,delta:s,source:i}),readInventorySnapshot=(e={})=>{const t=readGmcpPath(e,["Char","Items","List"]);if(void 0!==t)return t;const a=readGmcpPath(e,["Items","Inv"]);return void 0!==a?{location:"inv",items:a}:void 0},setAmount=(a,n,s,o="manual")=>{const l=i(n);if(!l||!(l in e[a]))return!1;const c=Math.max(0,toNumber(s,e[a][l]));return e[a][l]=c,t("CacheAmountChanged",{bucket:a,name:l,amount:c,source:o}),!0},setRiftCapacity=(a,n="manual")=>{const s=toNumber(e.riftCapacity,wt),i=Math.max(0,toNumber(a,s));return i!==e.riftCapacity&&(e.riftCapacity=i,t("CacheRiftCapacityChanged",{amount:i,source:n}),!0)},observeInventorySnapshot=(a=[])=>{const n={...e.inventory},s={};Object.keys(n).forEach(e=>{n[e]=0}),(a||[]).forEach(e=>{const t=parseInventoryEntry(e);if("inv"===t.location&&t.name&&t.name in n&&(n[t.name]+=t.amount,t.id)){const e={name:t.name,amount:t.amount,location:t.location};void 0!==t.icon&&null!==t.icon&&(e.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(e.attrib=t.attrib),s[t.id]=e}}),e.inventory=n,e.inventoryCurativesById=s,e.hydration.inventoryKnown=!0,t("CacheInventoryListApplied",{...e.inventory})},applyRoomPickupTransfer=t=>{if(!t||o.appliedIds.has(t))return null;const a=o.invAddsById.get(t),n=o.roomRemovesById.get(t);if(!a||!n)return null;const s=a.name&&a.name in e.inventory,i=Math.max(0,toNumber(a.amount,0)),l=n.name&&n.name in e.inventory,c=Math.max(0,toNumber(n.amount,0)),u=s&&i>0?a:l&&c>0?n:null;if(o.invAddsById.delete(t),o.roomRemovesById.delete(t),o.appliedIds.add(t),!u)return null;const d=Math.max(0,toNumber(u.amount,0));return!u.name||!(u.name in e.inventory)||d<=0?null:adjustInventoryAmount(u.name,d,"gmcp:room-pickup")?buildResult({changed:!0,name:u.name,amount:d,delta:d,source:"gmcp:room-pickup"}):null},observeRoomPickupCandidate=(e,t)=>{if(!e.id||o.appliedIds.has(e.id))return null;if("inv"===e.location&&"add"===t)o.invAddsById.set(e.id,e);else{if("room"!==e.location||"remove"!==t)return null;o.roomRemovesById.set(e.id,e)}return applyRoomPickupTransfer(e.id)},observeRiftSnapshot=(a={})=>{const n=a.items||a,i=Array.isArray(n)?n:Object.entries(n).map(([e,t])=>({name:e,amount:t})),o={...e.rift};Object.keys(o).forEach(e=>{o[e]=0}),i.forEach(e=>{const t=s(e.name||e.item||e,e.amount??e.count??e.qty??0);t.name&&t.name in o&&(o[t.name]=t.amount)}),e.rift=o,e.hydration.riftKnown=!0,t("CacheRiftListApplied",{...e.rift})},hydrateFromGmcp=(e={})=>{let t=!1;const a=readInventorySnapshot(e);void 0!==a&&(Array.isArray(a)?(observeInventorySnapshot(a),t=!0):"inv"===String(a?.location??a?.Location??"inv").toLowerCase()&&(observeInventorySnapshot(a?.items||[]),t=!0));const n=readGmcpPath(e,["IRE","Rift","List"]);return void 0!==n&&(observeRiftSnapshot(n||{}),t=!0),t};return{observeInventorySnapshot,observeItemDelta:(t={})=>{const a=parseInventoryEntry(t),n=String(t.action||"").toLowerCase(),s=String(t.direction||"").toLowerCase(),i=n||s;let o=!1;if("inv"===a.location){const t=a.id&&e.inventoryCurativesById[a.id]||null;"add"===i?a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):"remove"===i?(o=!!t&&deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):"update"===i?a.name&&a.name in e.inventory?(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):t&&(o=deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged())}const l=observeRoomPickupCandidate(a,i);return l?{...l,identityChanged:o}:buildResult({identityChanged:o})},observeRiftSnapshot,observeRiftChange:(t={})=>{const a=t.amount??t.count??t.qty;if(null==a||""===a)return!1;const n=s(t.name||t.item||t.desc||t,a);return!(!n.name||!(n.name in e.rift))&&(setAmount("rift",n.name,n.amount,"gmcp:rift-change"),{name:n.name,riftAmount:e.rift[n.name]})},observeRiftOutText:({item:t,name:a,amount:n=1,riftAmount:i}={})=>{const o=s(t||a,n);if(!o.name||!(o.name in e.inventory)||!(o.name in e.rift))return!1;const l=Math.max(0,toNumber(n,o.amount));return!(l<=0)&&(adjustInventoryAmount(o.name,l,"text:rift-out"),setAmount("rift",o.name,i,"text:rift-out"),{name:o.name,amount:l,riftAmount:e.rift[o.name]})},observeRiftInText:({item:t,name:a,amount:n=1,riftAmount:i,atCapacity:o=!1}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory)||!(l.name in e.rift))return!1;const c=Math.max(0,toNumber(n,l.amount));return!(c<=0)&&(adjustInventoryAmount(l.name,-c,"text:rift-in"),setAmount("rift",l.name,i,"text:rift-in"),o&&setRiftCapacity(i,"text:rift-in-max"),{name:l.name,amount:c,riftAmount:e.rift[l.name],riftCapacity:e.riftCapacity})},invalidateRiftSnapshot:({source:a="rift-resync"}={})=>!!e.hydration.riftKnown&&(e.hydration.riftKnown=!1,t("CacheRiftSnapshotInvalidated",{source:a}),!0),observeInventoryDeltaText:({item:t,name:a,amount:n,delta:i,source:o="text:inventory"}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory))return!1;const c=Math.max(0,toNumber(n,l.amount)),u=toNumber(i,0);if(c<=0||0===u)return!1;const d=u>0?c:-c;return adjustInventoryAmount(l.name,d,o),{name:l.name,amount:c,delta:d,inventoryAmount:e.inventory[l.name]}},observeInventoryEmptyText:({item:t,name:a,source:n="text:inventory-empty"}={})=>{const i=s(t||a,0);if(!i.name||!(i.name in e.inventory))return!1;const o=e.inventory[i.name],l=deleteInventoryCurativesByName(i.name);return l&&emitInventoryIdentityChanged(),setAmount("inventory",i.name,0,n),{changed:0!==o||l,identityChanged:l,name:i.name,amount:0,delta:-o,inventoryAmount:e.inventory[i.name],source:n}},observeCurativeConsumedText:({item:t,name:a,amount:n=1}={})=>{const i=s(t||a,n);if(!i.name||!(i.name in e.inventory))return!1;const o=Math.max(0,toNumber(n,i.amount));return!(o<=0)&&(adjustInventoryAmount(i.name,-o,"text:consume"),{name:i.name,amount:o,inventoryAmount:e.inventory[i.name]})},completeObservationBlock:()=>{o.invAddsById.clear(),o.roomRemovesById.clear(),o.appliedIds.clear()},hydrateFromGmcp,setDesiredPrecache:(a={})=>{Object.entries(a).forEach(([t,a])=>{t in e.desiredPrecache&&(e.desiredPrecache[t]=Math.max(0,toNumber(a,0)))}),t("CacheDesiredPrecacheChanged",{...e.desiredPrecache})}}},createCacheModel=({cacheTable:e={},cacheNames:t={},haveAff:a=()=>!1,haveDef:n=()=>!1}={})=>{const s=new Set;let i=0;const o={inventory:{...e},rift:{...e},riftCapacity:wt,inventoryCurativesById:{},desiredPrecache:Object.keys(e).reduce((e,t)=>(e[t]=0,e),{}),hydration:{inventoryKnown:!1,riftKnown:!1}},emit=(e,t)=>{i+=1,s.forEach(a=>a(e,t))},l=createSnapshotCache({getVersion:()=>i,buildSnapshot:()=>({inventory:{...o.inventory},rift:{...o.rift},riftCapacity:o.riftCapacity,inventoryCurativesById:Object.entries(o.inventoryCurativesById).reduce((e,[t,a])=>(e[t]={...a},e),{}),desiredPrecache:{...o.desiredPrecache},hydration:{...o.hydration}})});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:()=>l(),...createCacheStateSupport({state:o,emit,cacheTable:e,cacheNames:t}),...createCachePrecacheSupport({state:o,haveAff:a,haveDef:n}),getDesiredPrecache:()=>({...o.desiredPrecache})}},getChangedPatchKeys=(e={},t,a)=>Object.keys(e||{}).filter(e=>JSON.stringify(a[e])!==JSON.stringify(t[e])),createSystemConfigApi=({state:e,emit:t})=>({getRuntime:()=>e.runtime,getSettings:()=>e.settings,getBaselineIntent:()=>e.baselineIntent,setRuntime(a={}){const n=e.runtime,s=deepMerge(e.runtime,a),i=Object.keys(s).filter(e=>s[e]!==n[e]);if(!i.length)return!1;const o=n.paused;return e.runtime=s,e.runtime.paused!==o&&t("PauseStateChanged",{paused:e.runtime.paused}),t("RuntimeStateChanged",{current:e.runtime,changedKeys:i}),!0},setSettings(a={},n={}){const s=e.settings,i=deepMerge(e.settings,a),o=getChangedPatchKeys(a,s,i);return!!o.length&&(e.settings=i,n.setBaseline&&(e.baselineIntent=deepMerge(e.baselineIntent,a)),t("SettingsChanged",{current:e.settings,patch:a,changedKeys:o}),!0)},setBaselineIntent(a={}){const n=e.baselineIntent,s=deepMerge(e.baselineIntent,a),i=getChangedPatchKeys(a,n,s);return!!i.length&&(e.baselineIntent=s,t("BaselineIntentChanged",{current:e.baselineIntent,patch:a,changedKeys:i}),!0)}}),collectChangedFields=(e={})=>{const t={};return Object.entries(e).forEach(([e,[a,n]])=>{a!==n&&(t[e]={previous:a,current:n})}),t},Mt=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],normalizeResourceKey=e=>String(e||"").trim().toLowerCase(),hasOwn$2=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),normalizeResourceValue=(e,t={})=>{if(!t.numeric)return{valid:!0,value:e};const a=Number(e);if(!Number.isFinite(a))return{valid:!1,value:void 0};const n=Number(t.min),s=Number(t.max);let i=a;return Number.isFinite(n)&&i<n&&(i=n),Number.isFinite(s)&&i>s&&(i=s),{valid:!0,value:i}},isDragonClass=(e="")=>/\bdragon\b/i.test(String(e||"")),getDragonColor=(e="")=>{const t=String(e||"").trim().split(/\s+/).filter(Boolean),a=t.findIndex(e=>"dragon"===e.toLowerCase()),n=a>0?t[a-1]:"";return n?n[0].toUpperCase()+n.slice(1).toLowerCase():""},normalizeStatusClass=({className:e="",race:t="",classProvided:a=!1,raceProvided:n=!1}={})=>{const s=String(e||"").trim(),i=String(t||"").trim(),o=isDragonClass(s),l=isDragonClass(i);return o||!a&&n&&l?{className:"Dragon",color:getDragonColor(s)||getDragonColor(i)}:{className:normalizeClassName(s),color:""}},createSystemCharacterApi=({state:e,emit:t})=>{let a=new Set;return{updateVitals(n={}){const s=toParsedGmcpVitals(n),i=s.resourceStats.filter(({balanceState:e})=>void 0===e),o=new Set(i.map(({key:e})=>e)),l=[...a].filter(e=>!o.has(e)),c={dead:e.char.dead};Mt.forEach(t=>{c[t]=e.char[t]}),[...i.map(({key:e})=>e),...l].forEach(t=>{t in c||(c[t]=e.char[t])}),Mt.forEach(t=>{void 0!==s.vitals[t]&&(e.char[t]=s.vitals[t])}),i.forEach(({key:t,value:a})=>{e.char[t]=a}),l.forEach(t=>{delete e.char[t]}),a=o,e.char.dead=e.char.hp<=0;const u={dead:[c.dead,e.char.dead]};Mt.forEach(t=>{u[t]=[c[t],e.char[t]]}),i.forEach(({key:t})=>{u[t]=[c[t],e.char[t]]}),l.forEach(t=>{u[t]=[c[t],e.char[t]]});const d=collectChangedFields(u);return!!Object.keys(d).length&&(t("VitalsUpdated",{current:e.char,hpDiff:e.char.hp-c.hp,mpDiff:e.char.mp-c.mp,changedFields:d}),e.char.dead&&!c.dead&&t("DeathDetected",{hp:e.char.hp,previousHp:c.hp}),!0)},updateResource(a,n,s={}){const i=normalizeResourceKey(a);if(!i)return!1;const o=normalizeResourceValue(n,s);if(!o.valid)return!1;const l=e.char[i];return!Object.is(l,o.value)&&(e.char[i]=o.value,t("VitalsUpdated",{current:e.char,hpDiff:0,mpDiff:0,changedFields:{[i]:{previous:l,current:o.value}},source:String(s.source||"manual")}),!0)},updateStatus(a={}){const n={name:e.char.name,class:e.char.class,race:e.char.race,color:e.char.color};hasOwn$2(a,"name")&&(e.char.name=a.name??""),hasOwn$2(a,"race")&&(e.char.race=a.race??"");const s=hasOwn$2(a,"class"),i=hasOwn$2(a,"race");if(s||i){const t=normalizeStatusClass({className:s?a.class:e.char.class,race:e.char.race,classProvided:s,raceProvided:i});e.char.class=t.className,e.char.color=t.color}const o=collectChangedFields({name:[n.name,e.char.name],class:[n.class,e.char.class],race:[n.race,e.char.race],color:[n.color,e.char.color]});return!!Object.keys(o).length&&(n.class!==e.char.class&&t("ClassChanged",{class:e.char.class,previousClass:n.class}),t("StatusUpdated",{current:e.char,changedFields:o}),!0)},updateWielded(a,n){if("left"!==a&&"right"!==a)return!1;const s=e.char.wielded[a],i=n?{id:n.id??null,name:String(n.name||""),icon:n.icon||null}:null;return(null!==s||null!==i)&&((!s||!i||s.id!==i.id||s.name!==i.name)&&(e.char.wielded[a]=i,t("WieldedUpdated",{side:a,current:i,previous:s}),!0))},updateMount(a){const n=e.char.mount,s=a?{name:String(a.name||""),id:a.id??null}:null;return n!==s&&((!n||!s||n.name!==s.name||n.id!==s.id)&&(e.char.mount=s,t("MountUpdated",{current:s,previous:n}),!0))},getChar:()=>e.char,getClass:()=>e.char.class,checkClass:t=>classesMatch(e.char.class,t),isClass:t=>void 0===t||!!t&&(Array.isArray(t)?t.some(t=>classesMatch(e.char.class,t)):classesMatch(e.char.class,t))}},Pt=["Text","text","short_desc"],hasOwn$1=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),getProvidedValue=(e,t,a,n="")=>{for(const s of t)if(hasOwn$1(e,s))return e[s]??n;return a},deriveIsPlayer=e=>"-1"===String(e),createSystemTargetApi=({state:e,emit:t})=>({updateTarget(a={}){const n=e.target,s={id:getProvidedValue(a,["id","ID"],n.id),text:getProvidedValue(a,Pt,n.text),hp:getProvidedValue(a,["HP","hp","hpperc"],n.hp)};if(s.isPlayer=deriveIsPlayer(s.id),s.id===n.id&&s.text===n.text&&s.hp===n.hp&&s.isPlayer===n.isPlayer)return!1;e.target=s;const i=Pt.some(e=>hasOwn$1(a,e)),o=s.id!==n.id||s.text!==n.text;return!(!i||!o)&&(t("TargetUpdated",{current:e.target,changedFields:collectChangedFields({id:[n.id,s.id],text:[n.text,s.text],isPlayer:[n.isPlayer,s.isPlayer],hp:[n.hp,s.hp]})}),!0)},isTarget(t){if(null==t)return!1;const a=String(t).toLowerCase();return e.target.text.toLowerCase()===a||String(e.target.id).toLowerCase()===a}}),createSystemModel=(e={})=>{const t={settings:deepMerge(ve,e.settings||{}),baselineIntent:deepMerge(ve,e.baselineIntent||{}),runtime:deepMerge(Se,e.runtime||{}),char:deepMerge(xe,e.char||{}),target:deepMerge(ke,e.target||{})};t.runtime={...t.runtime};const a=new Set;let n=0;const emit=(e,t)=>{n+=1,a.forEach(a=>a(e,t))},s=createSystemConfigApi({state:t,emit}),i=createSystemCharacterApi({state:t,emit}),o=createSystemTargetApi({state:t,emit}),copySettingsBucket=(e={})=>({...e,notices:{...e.notices||{}},ss:{...e.ss||{}}}),copyCharSnapshot=(e={})=>({...e,mount:e.mount?{...e.mount}:null,wielded:{left:e.wielded?.left?{...e.wielded.left}:null,right:e.wielded?.right?{...e.wielded.right}:null}}),copyTargetSnapshot=(e={})=>({...e}),l=createSnapshotCache({getVersion:()=>n,buildSnapshot:()=>({settings:copySettingsBucket(t.settings),baselineIntent:copySettingsBucket(t.baselineIntent),runtime:{...t.runtime},char:copyCharSnapshot(t.char),target:copyTargetSnapshot(t.target)})});return{onChange:e=>(a.add(e),()=>a.delete(e)),snapshot:()=>l(),getRuntime:s.getRuntime,getSettings:s.getSettings,getBaselineIntent:s.getBaselineIntent,setRuntime:s.setRuntime,setSettings:s.setSettings,setBaselineIntent:s.setBaselineIntent,updateVitals:i.updateVitals,updateResource:i.updateResource,updateStatus:i.updateStatus,updateWielded:i.updateWielded,updateMount:i.updateMount,getChar:i.getChar,getClass:i.getClass,checkClass:i.checkClass,isClass:i.isClass,updateTarget:o.updateTarget,isTarget:o.isTarget}},normalizeTrackableId=e=>String(e??"").trim(),isValidTrackableDuration=e=>Number.isFinite(e)&&Number.isInteger(e)&&e>0,normalizeTrackableLabel=(e,t)=>("string"==typeof e?e.trim():"")||t,createTrackableEntry=(e,t)=>({id:e,label:t.label,have:!1,since:0,expiresAt:0,durationMs:t.durationMs,lastChangeAt:0,source:"",timer:null,generation:0}),createTrackableStateView=e=>({id:e.id,label:e.label,have:e.have,since:e.since,expiresAt:e.expiresAt,durationMs:e.durationMs,lastChangeAt:e.lastChangeAt,source:e.source}),Ot="manual",normalizeDefinition=(e,t)=>{const a=normalizeTrackableId(e);if(!a||a!==e||"string"!=typeof t?.label||!t.label.trim()||!isValidTrackableDuration(t?.durationMs))throw new Error(`Invalid trackable definition: ${String(e)}`);return{label:t.label.trim(),durationMs:t.durationMs}},normalizeSource=(e,t=Ot)=>("string"==typeof e?e.trim():"")||t,createTrackableModel=({definitions:e={},now:t=()=>Date.now(),setTimeoutFn:a=(e,t)=>setTimeout(e,t),clearTimeoutFn:n=e=>clearTimeout(e)}={})=>{const s={},i={},o=new Set,l=new Map;let c=0,u=!1;Object.entries(e||{}).forEach(([e,t])=>{const a=normalizeDefinition(e,t);s[e]=a,i[e]=createTrackableEntry(e,a),l.set(e,0)});const readNow=()=>{const e=Number(t());return Number.isFinite(e)?e:0},emit=(e,t)=>{c+=1,l.set(t.name,(l.get(t.name)??0)+1),o.forEach(a=>a(e,t))},clearEntryTimer=e=>{null!==e.timer&&(n(e.timer),e.timer=null)},nextGeneration=e=>(e.generation+=1,e.generation),isActiveAt=(e,t)=>Boolean(e?.have&&e.expiresAt>t),d=new Map,getEntrySnapshot=e=>i[e]?(d.has(e)||d.set(e,createSnapshotCache({getVersion:()=>l.get(e)??0,buildSnapshot:()=>createTrackableStateView(i[e])})),d.get(e)()):null,m=createSnapshotCache({getVersion:()=>c,buildSnapshot:()=>Object.keys(i).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),resolveAt=(e={})=>{if(void 0===e.at)return readNow();const t=Number(e.at);return Number.isFinite(t)?t:null},lose=(e,t={})=>{if(u)return!1;const a=normalizeTrackableId(e),n=i[a];if(!a||!n?.have)return!1;const s=void 0!==t.at,o=resolveAt(t);return!(null===o||s&&o<n.since)&&(clearEntryTimer(n),nextGeneration(n),n.have=!1,n.since=0,n.expiresAt=0,n.lastChangeAt=o,n.source=normalizeSource(t.source),emit("TrackableLost",{name:a,label:n.label,have:!1,at:o,since:0,expiresAt:0,durationMs:n.durationMs,source:n.source,reason:normalizeSource(t.reason,"observed")}),!0)},scheduleExpiry=e=>{const t=e.generation;e.timer=a(()=>{u||e.generation!==t||(e.timer=null,lose(e.id,{source:"timer",reason:"expired",at:readNow()}))},e.expiresAt-readNow())},got=(e,t={})=>{if(u)return!1;const a=normalizeTrackableId(e);if(!a)return!1;const n=s[a],o=n?.durationMs??Number(t.durationMs);if(!isValidTrackableDuration(o))return!1;const c=resolveAt(t);if(null===c)return!1;const d=readNow(),m=c+o;if(m<=d)return!1;let p=i[a];if(p&&c<p.lastChangeAt)return!1;const g=isActiveAt(p,d),h=p?.since??0,b=p?.expiresAt??0;p?clearEntryTimer(p):(p=createTrackableEntry(a,{label:normalizeTrackableLabel(t.label,a),durationMs:o}),i[a]=p,l.set(a,0)),nextGeneration(p),p.label=normalizeTrackableLabel(t.label,n?.label||p.label||a),p.have=!0,p.since=c,p.expiresAt=m,p.durationMs=o,p.lastChangeAt=c,p.source=normalizeSource(t.source);const y={name:a,label:p.label,have:!0,at:c,since:c,expiresAt:m,durationMs:o,source:p.source};return g?emit("TrackableRefreshed",{...y,previousSince:h,previousExpiresAt:b}):emit("TrackableGot",y),scheduleExpiry(p),!0},elapsedMs=(e,t=readNow())=>{const a=i[normalizeTrackableId(e)];return isActiveAt(a,t)?Math.max(0,t-a.since):Number.POSITIVE_INFINITY},remainingMs=(e,t=readNow())=>{const a=i[normalizeTrackableId(e)];return isActiveAt(a,t)?Math.max(0,a.expiresAt-t):0};return{onChange:e=>u||"function"!=typeof e?()=>{}:(o.add(e),()=>o.delete(e)),snapshot:()=>m(),get:e=>getEntrySnapshot(normalizeTrackableId(e)),list:()=>Object.keys(i),have:e=>isActiveAt(i[normalizeTrackableId(e)],readNow()),elapsedMs,remainingMs,timing(e){const t=normalizeTrackableId(e),a=i[t];if(!a)return null;const n=readNow();return{id:t,have:isActiveAt(a,n),atMs:n,sinceMs:a.since,expiresAtMs:a.expiresAt,lastChangeAtMs:a.lastChangeAt,durationMs:a.durationMs,elapsedMs:elapsedMs(t,n),remainingMs:remainingMs(t,n)}},got,lose,dispose(){u||(u=!0,Object.values(i).forEach(e=>{clearEntryTimer(e),nextGeneration(e)}),o.clear())}}},sameRecord=(e,t)=>Object.keys(e).length===Object.keys(t).length&&Object.keys(e).every(a=>Object.hasOwn(t,a)&&e[a]===t[a]),copyWalls=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Object.fromEntries(Object.keys(t).map(e=>[e,{type:e}]))])),sameWalls=(e,t)=>Object.keys(e).length===Object.keys(t).length&&Object.entries(e).every(([e,a])=>t[e]&&Object.keys(a).length===Object.keys(t[e]).length&&Object.keys(a).every(a=>Object.hasOwn(t[e],a))),createRoomModel=({wallTable:e={},readRoomItems:t=()=>null}={})=>{const a={id:null,name:"",exits:{},walls:{},frozenGround:!1,featuresKnown:!1},n=Object.keys(e),s=n.filter(t=>e[t].gmcpItemNames?.length),i=new Set;let o=0,l=!1;const identity=()=>({id:a.id,name:a.name,exits:{...a.exits}}),features=()=>({walls:copyWalls(a.walls),frozenGround:a.frozenGround,featuresKnown:a.featuresKnown}),c=createSnapshotCache({getVersion:()=>o,buildSnapshot:()=>({...identity(),...features()})}),emit=(e,t)=>i.forEach(a=>a(e,t)),changedFeatures=e=>{const t={};sameWalls(e.walls,a.walls)||(t.walls={previous:e.walls,current:copyWalls(a.walls)});for(const n of["frozenGround","featuresKnown"])e[n]!==a[n]&&(t[n]={previous:e[n],current:a[n]});return t},commitFeatures=(e,t)=>{const n=changedFeatures(e);return!!Object.keys(n).length&&(o+=1,emit("RoomFeaturesUpdated",{roomId:a.id,source:t,current:features(),changedFields:n}),!0)},acceptsRoom=e=>e&&"object"==typeof e&&null!==a.id&&(!Object.hasOwn(e,"roomId")||normalizeRoomId(e.roomId)===a.id),readTrustedItems=()=>{if(!l||null===a.id)return null;const e=t();return Array.isArray(e)?e:null},addWall=(e,t)=>{a.walls[e]??={},a.walls[e][t]={type:t}},removeWall=(e,t)=>{a.walls[e]?.[t]&&(delete a.walls[e][t],Object.keys(a.walls[e]).length||delete a.walls[e])};return{onChange:e=>(i.add(e),()=>i.delete(e)),snapshot:c,getWalls(e){const t=c().walls[normalizeRoomDirection(e)];return n.filter(e=>t?.[e]).map(e=>t[e])},listWalls:()=>w.flatMap(e=>n.filter(t=>a.walls[e]?.[t]).map(t=>({direction:e,type:t}))),haveWall(e,t){const n=a.walls[normalizeRoomDirection(e)];return void 0===t?Boolean(n&&Object.keys(n).length):Boolean(n&&Object.hasOwn(n,t))},isGroundFrozen:()=>a.frozenGround,isItemSnapshotKnown:()=>null!==readTrustedItems(),haveItem:e=>"string"==typeof e&&Boolean(readTrustedItems()?.some(t=>t?.name===e)),observeInfo(e={}){if(!e||"object"!=typeof e)return!1;const t=normalizeRoomId(e.num);if(null===t)return!1;const n=identity(),s=features(),i={};if(t!==a.id&&(a.id=t,a.walls={},a.frozenGround=!1,a.featuresKnown=!1,l=!1,i.id={previous:n.id,current:t}),Object.hasOwn(e,"name")&&(a.name=String(e.name??"")),Object.hasOwn(e,"exits")){const t=e.exits&&"object"==typeof e.exits&&!Array.isArray(e.exits)?e.exits:{};a.exits=Object.fromEntries(Object.entries(t).filter(([,e])=>"string"==typeof e||"number"==typeof e))}n.name!==a.name&&(i.name={previous:n.name,current:a.name}),sameRecord(n.exits,a.exits)||(i.exits={previous:n.exits,current:{...a.exits}});const c=changedFeatures(s);return!(!Object.keys(i).length&&!Object.keys(c).length)&&(o+=1,Object.keys(i).length&&emit("RoomUpdated",{current:identity(),changedFields:i}),Object.keys(c).length&&emit("RoomFeaturesUpdated",{roomId:a.id,source:"room-change",current:features(),changedFields:c}),!0)},observeItemList({roomId:e}={}){const t=null!==a.id&&normalizeRoomId(e)===a.id,n=l!==t;return l=t,n},observeDisplay(e={}){if(!e||"object"!=typeof e)return!1;if(normalizeRoomId(e.roomId)!==a.id||null===a.id)return!1;const t=features(),s=[];let i=!0===e.complete&&Array.isArray(e.walls)&&"boolean"==typeof e.frozenGround;for(const a of Array.isArray(e.walls)?e.walls:[]){const e=normalizeRoomDirection(a?.direction);e&&n.includes(a?.type)?s.push({direction:e,type:a.type}):i=!1}return i&&(a.walls={}),s.forEach(({direction:e,type:t})=>addWall(e,t)),(i||!0===e.frozenGround)&&(a.frozenGround=e.frozenGround),a.featuresKnown=i,commitFeatures(t,"display")},observeWall(e={}){if(!acceptsRoom(e)||!n.includes(e.type)||!["added","removed"].includes(e.change))return!1;const t=normalizeRoomDirection(e.direction);if(!t&&null!=e.direction)return!1;if(t&&Boolean(a.walls[t]?.[e.type])===("added"===e.change))return!1;const s=features();if(t)"added"===e.change?addWall(t,e.type):removeWall(t,e.type);else if("removed"===e.change){const t=w.filter(t=>a.walls[t]?.[e.type]);1===t.length?removeWall(t[0],e.type):a.featuresKnown=!1}else a.featuresKnown=!1;return commitFeatures(s,e.source||"public-observe")},observeGround(e={}){if(!acceptsRoom(e)||"boolean"!=typeof e.frozen)return!1;if(a.frozenGround===e.frozen)return!1;const t=features();return a.frozenGround=e.frozen,commitFeatures(t,e.source||"public-observe")},completeObservationBlock(){if(!s.length)return!1;const t=readTrustedItems();if(null===t)return!1;let n=null;for(const i of s){const s=e[i].gmcpItemNames,o=t.reduce((e,t)=>e+Number(s.includes(t?.name)),0),l=w.filter(e=>a.walls[e]?.[i]);0===o&&l.length?(n??=features(),l.forEach(e=>removeWall(e,i))):o!==l.length&&a.featuresKnown&&(n??=features(),a.featuresKnown=!1)}return!!n&&commitFeatures(n,"corroboration")}}},createModels=({adapter:e,seedData:t,options:a={},now:n})=>{const s=Boolean(a.debug),{gmcpSnapshot:i}=resolveAdapterCapabilities(e),o=createRoomModel({wallTable:t.roomWallTable,readRoomItems:()=>{const t=i?e.getGMCP()?.Items?.room:null;return Array.isArray(t)?t:null}}),l=createSystemModel({settings:{debug:s},baselineIntent:{debug:s}}),c=createAfflictionModel({affTable:t.affTable,now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),u=createBalanceModel({balanceTable:t.balanceTable,haveAff:e=>c.haveAff(e),now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),d=createDefenseModel({defTable:t.defTable,defPrios:t.defPrios});return{roomModel:o,systemModel:l,affModel:c,balanceModel:u,defModel:d,cacheModel:createCacheModel({cacheTable:t.cacheTable,cacheNames:t.cacheNames,haveAff:e=>c.haveAff(e),haveDef:e=>d.haveDef(e)}),limbModel:createLimbModel({now:n}),trackableModel:createTrackableModel({definitions:t.trackableTable,now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout})}},Dt="parry",Rt=25,resetParryPriorities=e=>{Object.keys(Qe.long).forEach(t=>{e.setDefaultPriority(`parrying ${t}`,0,Dt),e.get(`guarding ${t}`)&&e.setDefaultPriority(`guarding ${t}`,0,Dt)})},createCombatDomainService=({affModel:e,defModel:t,limbModel:a,systemModel:n,queueController:s,serverside:i})=>({observeLimbHit:({limb:t,amount:n,source:s="manual",at:o}={})=>applyObservedLimbHit({limbModel:a,affModel:e,serverside:i,limb:t,amount:n,source:s,at:o}),observeLimbReset:({limb:e,source:t="manual"}={})=>applyObservedLimbReset({limbModel:a,limb:e,source:t}),observeLimbStage:({limb:t,stage:n,source:s="manual",at:o}={})=>applyObservedLimbStage({limbModel:a,affModel:e,serverside:i,limb:t,stage:n,source:s,at:o}),parry(e){resetParryPriorities(t);const a=Qe.short[e]||e,i=t.get(`guarding ${a}`);let o;return i&&n.isClass(i.skills)?(t.setDefaultPriority(`guarding ${a}`,Rt,Dt),o=`guard ${a}`):(t.setDefaultPriority(`parrying ${a}`,Rt,Dt),n.isClass("Dragon")?(t.setCommand(`parrying ${a}`,`clawparry ${a}`,Dt),o=`clawparry ${a}`):(t.setCommand(`parrying ${a}`,`parry ${a}`,Dt),o=`parry ${a}`)),s.prepend("freeQueue",o),{limbName:a,command:o}}}),isRecordValue=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),hasSupportedSchemaVersion=e=>isRecordValue(e)&&isSupportedPersistenceSchemaVersion(e.schemaVersion),createPersistenceStore=({adapter:e,key:t="nexSys4Settings",noticeCenter:a}={})=>{let n=!1;const noticeSchemaResetIfNeeded=e=>{n||!isRecordValue(e)||null==e.schemaVersion||isSupportedPersistenceSchemaVersion(e.schemaVersion)||(n=!0,a?.publish?.("persistence","Saved nexSys4 settings were in an older format and have been reset to defaults.",{force:!0}))},read=()=>{const a=e.getVariable(t);return noticeSchemaResetIfNeeded(a),{key:t,exists:hasSupportedSchemaVersion(a),snapshot:deepClone$1(normalizePersistenceSnapshot(a))}},load=()=>read().snapshot,save=(a={})=>{const n=deepClone$1(normalizePersistenceSnapshot(a,{assumeCurrentVersion:!0}));return e.setVariable(t,n),deepClone$1(n)};return{key:t,read,load,save}},createNoticeCenter=({adapter:e,systemModel:t})=>({publish:(a,n,s={})=>{const i=t.getSettings().notices||{},{force:o=!1,...l}=s;(o||!1!==i[a])&&e.notice(String(n),{category:a,...l})}}),Nt=Object.freeze({PLANNED:"planned",SENT:"sent",AWAITING_COMPLETION:"awaiting-completion",COMPLETED:"completed",EXPIRED:"expired",RECOVERING:"recovering"}),createOutputCycle=({adapter:e,dispatchCommands:t,systemModel:a,serverside:n,outputPlanner:s,noticeCenter:i,options:o={}}={})=>{const now=()=>e?.now?.()??Date.now();let l=[],c="",u=1,d=null,m=null,p=null,g=[];const h=`echo SystemEvent ${ye.OUTPUT_COMPLETE}`,b=Math.max(50,Number(o.outputCompletionTimeoutMs||1e3)),y=Math.max(0,Number(o.maxOutputRecoveryAttempts??2)),clearCompletionTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},recordBatchState=(e,t,a={})=>{if(!e)return null;const n=now();return e.state=t,e.stateHistory.push({state:t,at:n}),Object.assign(e,a),e},snapshotBatch=e=>e?{id:e.id,source:e.source,state:e.state,stateHistory:e.stateHistory.map(e=>({...e})),completionRequired:e.completionRequired,recoveryAttempts:e.recoveryAttempts,maxRecoveryAttempts:e.maxRecoveryAttempts,commands:[...e.commands],dispatchedCommands:[...e.dispatchedCommands],serversideCommands:[...e.serversideCommands],batchCount:e.batchCount,createdAt:e.createdAt,sentAt:e.sentAt??null,completedAt:e.completedAt??null,expiredAt:e.expiredAt??null,lastRecoveryAt:e.lastRecoveryAt??null}:null,storeLastBatch=e=>{m=snapshotBatch(e)},createBatch=({source:e,intents:t=[],commands:a,serversideCommands:n,maxCommands:s})=>{const i=t.some(e=>!0===e?.requiresCompletion),o=i?a.filter(e=>e!==h):[...a],l=i?chunkCommandsWithTrailing(o,{maxEntries:s,trailing:[h]}):chunkCommands(o,s);return{id:u++,source:e,state:Nt.PLANNED,stateHistory:[{state:Nt.PLANNED,at:now()}],completionRequired:i,recoveryAttempts:0,maxRecoveryAttempts:y,commands:[...o],dispatchedCommands:i?[...o,h]:[...o],serversideCommands:[...n],batches:l,batchCount:l.length,createdAt:now(),observedOutbound:!1}},dispatchBatchBatches=(e,a,n={})=>{a.forEach((s,i)=>{t(s,{source:n.source||"output-cycle",cycleSource:e.source,batch:i+1,batchCount:a.length,outputBatchId:e.id,outputBatchState:e.state,recoveryAttempt:n.recoveryAttempt||0})})},scheduleCompletionTimeout=t=>{clearCompletionTimer(),p=e?.setTimeout?.(()=>{if(d&&d.id===t.id&&d.completionRequired){if(recordBatchState(d,Nt.EXPIRED,{expiredAt:now()}),c="",d.recoveryAttempts>=d.maxRecoveryAttempts)return i?.publish?.("output",`Output completion confirmation expired after ${d.maxRecoveryAttempts} recovery probe(s).`,{force:!0}),storeLastBatch(d),d=null,void clearCompletionTimer();d.recoveryAttempts+=1,recordBatchState(d,Nt.RECOVERING,{lastRecoveryAt:now()}),dispatchBatchBatches(d,[[h]],{source:"output-cycle-recovery",recoveryAttempt:d.recoveryAttempts}),scheduleCompletionTimeout(d)}},b)};return{planAndSend:({source:e="prompt"}={})=>{const t=a.getRuntime(),i=a.getSettings();if(t.paused||t.rulesSuspended)return t.rulesSuspended&&s.plan({source:"prompt"===e?"prompt":`${e}:rule-suspend-check`}),[];const o=n.getCuringSets?.().activeSet||"";if(o&&"nexsys4-default"!==o)return[];if(d)return[];const u="output-complete"===e?[...g]:[];g=[];const m=s.plan({source:e,injectedCommands:l,suppressedServersideCommands:u});if(a.getRuntime().paused||a.getRuntime().rulesSuspended)return l=[],[];if(!m.commands.length)return l=[],[];const p=Math.max(1,Number(i.maxSendPerChunk||20)),h=createBatch({source:e,intents:m.intents,commands:m.commands,serversideCommands:m.serversideCommands,maxCommands:p}),b=h.dispatchedCommands.join("");return b===c?[]:(h.serversideCommands.length&&!h.observedOutbound&&(n.observeOutbound(h.serversideCommands),h.observedOutbound=!0),recordBatchState(h,Nt.SENT,{sentAt:now()}),dispatchBatchBatches(h,h.batches),c=b,h.completionRequired?(d=h,recordBatchState(d,Nt.AWAITING_COMPLETION),scheduleCompletionTimeout(d)):(recordBatchState(h,Nt.COMPLETED,{completedAt:now()}),storeLastBatch(h)),l=[],m.commands)},markComplete:()=>!!d&&(clearCompletionTimer(),g=[...d.serversideCommands],d.serversideCommands.length&&n.acknowledgeCommands(d.serversideCommands),recordBatchState(d,Nt.COMPLETED,{completedAt:now()}),storeLastBatch(d),d=null,!0),isWaitingForCompletion:()=>d?.state===Nt.AWAITING_COMPLETION||d?.state===Nt.RECOVERING,isBlockingOutput:()=>Boolean(d),getLifecycleState:()=>({activeBatch:snapshotBatch(d),lastBatch:snapshotBatch(m)}),invalidate(){c=""},injectCommands(e=[]){l=[...l,...e.filter(Boolean)]},dispose(){clearCompletionTimer(),d=null,g=[]}}},jt="nexSysSettings",isRecord$1=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),mergeLegacyDefPriorities=(e={},t={})=>{const a={};return new Set([...Object.keys(e),...Object.keys(t)]).forEach(n=>{const s=Number(t[n])||0;a[n]=s>0?s:Number(e[n])||0}),a},It={customPrompt:"customPrompt",overrideTab:"overrideTab",loadOnLogin:"loadOnLogin",queueWhilePaused:"queueWhilePaused"},Lt={echoOutput:"output",echoAffGot:"affGot",echoAffLost:"affLost",echoDefGot:"defGot",echoDefLost:"defLost",echoBalanceGot:"balanceRecovered",echoBalanceLost:"balanceLost",echoTrackableGot:"trackableGot",echoTrackableLost:"trackableLost",echoPrioritySet:"priority"},qt={sipPriority:"sipPriority",sipHealthAt:"sipHealthAt",sipManaAt:"sipManaAt",mossHealthAt:"mossHealthAt",mossManaAt:"mossManaAt",focus:"focus",focusOverHerbs:"focusOverHerbs",tree:"tree",clot:"clot",clotAt:"clotAt",insomnia:"insomnia",fracturesAbove:"fracturesAbove",manaAbilitiesAbove:"manaThreshold",clotAbove:"clotAbove",batch:"batch"},transformSystemSettings=(e={})=>{const t={};Object.entries(It).forEach(([a,n])=>{void 0!==e[a]&&(t[n]=e[a])});const a={};Object.entries(Lt).forEach(([t,n])=>{void 0!==e[t]&&(a[n]=Boolean(e[t]))}),Object.keys(a).length&&(t.notices=a);const n={};return Object.entries(qt).forEach(([t,a])=>{void 0!==e[t]&&(n[a]=normalizeStatusValue(a,e[t]))}),void 0!==e.curingMethod&&(n.transmutation="Transmutation"===e.curingMethod),Object.keys(n).length&&(t.ss=n),t},transformLegacySettings=(e={})=>({systemSettings:transformSystemSettings(e.systemSettings||{}),defSettings:{defaults:mergeLegacyDefPriorities(e.defSettings?.keepup,e.defSettings?.static)},cacheSettings:{precache:{...e.cacheSettings||{}}}}),importLegacySettings=({adapter:e,persistence:t,noticeCenter:a,legacyKey:n=jt}={})=>{if(t.read().exists)return!1;const s=e.getVariable(n);return!!isRecord$1(s)&&(t.save(transformLegacySettings(s)),a?.publish?.("persistence","Imported curing, defence, and cache settings from your original nexSys installation.",{force:!0}),!0)},createRuntimeServices=({adapter:e,options:t={},models:a,controllers:n})=>{const{systemModel:s,affModel:i,defModel:o,limbModel:l}=a,{commandDispatcher:c,queueController:u,rules:d,serverside:m,curePlanner:p,defensePlanner:g,automaticActionPlanner:h,precachePlanner:b,outputPlanner:y}=n,v=createNoticeCenter({adapter:e,systemModel:s}),S=createPersistenceStore({adapter:e,key:t.persistenceKey||"nexSys4Settings",noticeCenter:v});return importLegacySettings({adapter:e,persistence:S,noticeCenter:v}),{persistence:S,combatService:createCombatDomainService({affModel:i,defModel:o,limbModel:l,systemModel:s,queueController:u,serverside:m}),noticeCenter:v,rules:d,curePlanner:p,defensePlanner:g,automaticActionPlanner:h,precachePlanner:b,outputCycle:createOutputCycle({adapter:e,dispatchCommands:c.sendCommands,systemModel:s,serverside:m,outputPlanner:y,noticeCenter:v,options:t})}},createRuntimeDependencies=({adapter:e,seedData:t,options:a={}})=>{const now=()=>e.now(),n=createModels({adapter:e,seedData:t,options:a,now}),s=createDomainControllers({adapter:e,seedData:t,options:a,now,models:n}),i=createRuntimeServices({adapter:e,options:a,models:n,controllers:s});return{now,...s,...n,...i}},createRuntimeFlushCoordinator=({adapter:e,systemModel:t,serverside:a,outputCycle:n,flushGmcpBuffer:s})=>{const now=()=>e?.now?.()??Date.now(),i={started:!1,safetyTimer:null,dirty:!1,flushing:!1,dirtyAt:null},clearSafetyTimer=()=>{i.safetyTimer&&(e.clearTimeout(i.safetyTimer),i.safetyTimer=null)},isRuntimeReady=()=>isRuntimeReadyPhase(t.getRuntime().phase),hasPendingSafetyWork=()=>{const e="function"!=typeof a.isDirty||a.isDirty();return i.dirty&&e},scheduleSafetyFlush=()=>{const a=t.getSettings(),n=Number(a.flushSafetyMs||120),s=Number(a.flushSafetyMaxWaitMs||500),o=now();i.dirtyAt||(i.dirtyAt=o),clearSafetyTimer();const l=o-i.dirtyAt,c=l>=s?0:Math.min(n,s-l);i.safetyTimer=e.setTimeout(()=>{i.safetyTimer=null,hasPendingSafetyWork()?(i.dirtyAt=null,flushCycle("safety-flush")):i.dirtyAt=null},c)},invalidateOutput=()=>{i.dirty=!0,n.invalidate?.()},markDirty=(e="dirty")=>{if(invalidateOutput(),a.markDirty(e),!isRuntimeReady())return clearSafetyTimer(),void(i.dirtyAt=null);i.flushing||n.isBlockingOutput?.()||scheduleSafetyFlush()},flushCycle=(e="prompt")=>{if(!i.started||i.flushing)return[];if(clearSafetyTimer(),!isRuntimeReady())return[];i.flushing=!0;try{if(s(),t.getRuntime().paused)return i.dirty=!1,[];const a=n.planAndSend({source:e});return i.dirty=n.isBlockingOutput()&&0===a.length,i.dirty||(i.dirtyAt=null),a}finally{i.flushing=!1}};return{start(){i.started=!0},stop(){i.started=!1,i.dirty=!1,i.flushing=!1,i.dirtyAt=null,clearSafetyTimer()},isStarted:()=>i.started,isFlushing:()=>i.flushing,invalidateOutput,markDirty,flushCycle}},cell=(e="",t="",a="")=>({text:e,fg:t,bg:a}),createDefaultCureColors=()=>({antimony:{fg:"olive",bg:""},argentum:{fg:"royalblue",bg:""},arsenic:{fg:"",bg:""},aurum:{fg:"ForestGreen",bg:""},azurite:{fg:"",bg:""},bisemutum:{fg:"",bg:""},calamine:{fg:"",bg:""},calcite:{fg:"slategray",bg:""},cinnabar:{fg:"greenyellow",bg:""},cuprum:{fg:"DeepSkyBlue",bg:""},ferrum:{fg:"DarkOrange",bg:""},gypsum:{fg:"",bg:""},magnesium:{fg:"Red",bg:""},plumbum:{fg:"Gold",bg:""},potash:{fg:"",bg:""},quartz:{fg:"",bg:""},quicksilver:{fg:"",bg:""},realgar:{fg:"firebrick",bg:""},stannum:{fg:"Tan",bg:""},caloric:{fg:"darkseagreen",bg:""},mending:{fg:"orchid",bg:""},epidermal:{fg:"sienna",bg:""},restoration:{fg:"darkviolet",bg:""},health:{fg:"lightpink",bg:""},writhe:{fg:"PaleGoldenRod",bg:"darkslategray"}}),createDefaultVars=()=>({blackout:!1,paused:cell("","red"),retard:cell("","blue"),aeon:cell("","red"),h:cell("0","green"),m:cell("0","green"),e:cell("0","green"),w:cell("0","green"),maxh:cell(""),maxm:cell(""),maxe:cell(""),maxw:cell(""),ph:cell("100%","green"),pm:cell("100%","green"),pe:cell("100%"),pw:cell("100%"),diffh:cell("","green"),diffm:cell("","green"),diffhp:cell("","green"),diffmp:cell("","green"),target:cell("","pink"),targetHP:cell("","green"),eq:cell(""),bal:cell(""),c:cell(""),k:cell(""),d:cell(""),b:cell(""),shield:cell("","cyan"),prismatic:cell("","magenta"),curseward:cell("","hotpink"),reflections:cell("","purple"),bloodshield:cell("","crimson"),rage:cell("","red"),karma:cell("","green"),transcendence:cell("","cyan"),essence:cell("","purple"),kai:cell("","blue")}),createDefaultAffs=(e=createDefaultCureColors())=>({addiction:{text:"add",...e.ferrum},aeon:{text:"ae",...e.cinnabar},agoraphobia:{text:"agor",...e.argentum},amnesia:{text:"amn",fg:"",bg:""},anorexia:{text:"ANO",...e.epidermal},asthma:{text:"AST",...e.aurum},blackout:{text:"bo",fg:"",bg:""},blindness:{text:"unb",...e.arsenic},bound:{text:"bnd",...e.writhe},brokenleftarm:{text:"la1",...e.mending},brokenleftleg:{text:"ll1",...e.mending},brokenrightarm:{text:"ra1",...e.mending},brokenrightleg:{text:"rl1",...e.mending},bruisedribs:{text:"ribs",fg:"",bg:""},burning:{text:"burn",...e.mending},calcifiedskull:{text:"calh",...e.restoration},calcifiedtorso:{text:"calt",...e.restoration},claustrophobia:{text:"clau",...e.stannum},clumsiness:{text:"clu",...e.aurum},concussion:{text:"conc",...e.restoration},confusion:{text:"con",...e.stannum},corruption:{text:"corr",fg:"",bg:""},crackedribs:{text:"cr",...e.health},crushedthroat:{text:"cru",...e.mending},daeggerimpale:{text:"daeg",...e.writhe},damage:{text:"dmg",fg:"tomato",bg:""},damagedleftarm:{text:"la2",...e.restoration},damagedleftleg:{text:"ll2",...e.restoration},damagedrightarm:{text:"ra2",...e.restoration},damagedrightleg:{text:"rl2",...e.restoration},damagedhead:{text:"hd2",...e.restoration},darkshade:{text:"dark",...e.ferrum},dazed:{text:"dzd",...e.cinnabar},dazzled:{text:"dzl",...e.mending},deadening:{text:"dea",...e.cinnabar},deafness:{text:"und",...e.calamine},dehydrated:{text:"deh",fg:"",bg:""},dementia:{text:"dem",...e.stannum},depression:{text:"dep",...e.plumbum},deteriorate:{text:"det",fg:"",bg:""},disloyalty:{text:"disl",...e.realgar},disrupted:{text:"disr",fg:"",bg:""},dissonance:{text:"disso",...e.plumbum},dizziness:{text:"diz",...e.plumbum},enscorcelled:{text:"ensor",fg:"",bg:""},entangled:{text:"entgl",...e.writhe},epilepsy:{text:"epi",...e.plumbum},fear:{text:"fear",fg:"",bg:""},flushings:{text:"flush",...e.ferrum},fratricide:{text:"frat",...e.argentum},frozen:{text:"frz",...e.caloric},generosity:{text:"gen",...e.cuprum},grievouswounds:{text:"grv",...e.health},guilt:{text:"gui",...e.argentum},haemophilia:{text:"haem",...e.ferrum},hallucinations:{text:"hall",...e.stannum},hamstrung:{text:"hms",fg:"",bg:""},healthleech:{text:"hthl",...e.aurum},heartseed:{text:"heart",...e.restoration},hellsight:{text:"hell",...e.realgar},horror:{text:"hor",...e.argentum},hypersomnia:{text:"hypers",...e.stannum},hypochondria:{text:"hypoch",...e.argentum},hypothermia:{text:"hypoth",...e.restoration},icefisted:{text:"ice",fg:"",bg:""},impaled:{text:"impl",...e.writhe},impatience:{text:"IMPAT",...e.plumbum},indifference:{text:"ind",...e.cuprum},insomnia:{text:"insomnia",fg:"",bg:""},itching:{text:"itch",...e.epidermal},justice:{text:"just",...e.cuprum},kkractlebrand:{text:"kkr",...e.health},laceratedthroat:{text:"lac2",...e.restoration},latched:{text:"latch",...e.health},lethargy:{text:"let",...e.ferrum},lightbind:{text:"light",fg:"",bg:""},loneliness:{text:"lon",...e.argentum},lovers:{text:"love",...e.cuprum},manaleech:{text:"man",...e.realgar},mangledleftarm:{text:"la3",...e.restoration},mangledleftleg:{text:"ll3",...e.restoration},mangledrightarm:{text:"ra3",...e.restoration},mangledrightleg:{text:"rl3",...e.restoration},mangledhead:{text:"hd3",...e.restoration},masochism:{text:"maso",...e.argentum},mildtrauma:{text:"tor1",...e.restoration},mycalium:{text:"myc",...e.plumbum},nausea:{text:"nau",...e.ferrum},numbedleftarm:{text:"nbla",fg:"",bg:""},numbedrightarm:{text:"nbra",fg:"",bg:""},pacified:{text:"pac",...e.cuprum},paralysis:{text:"PAR",...e.magnesium},paranoia:{text:"prn",...e.stannum},parasite:{text:"prs",...e.aurum},peace:{text:"pea",...e.cuprum},phlogisticated:{text:"phlog",fg:"",bg:""},pinshot:{text:"psh",fg:"",bg:""},pressure:{text:"pres",...e.calcite},prone:{text:"pr",fg:"",bg:""},pyramides:{text:"pyra",...e.magnesium},pyre:{text:"pyre",...e.cuprum},rebbies:{text:"reb",...e.aurum},recklessness:{text:"reck",...e.argentum},retardation:{text:"ret",fg:"",bg:""},retribution:{text:"retr",...e.cuprum},revealed:{text:"rev",fg:"",bg:""},sandfever:{text:"sand",...e.plumbum},scalded:{text:"scald",...e.epidermal},scytherus:{text:"scy",...e.ferrum},selarnia:{text:"sel",...e.mending},sensitivity:{text:"sen",...e.aurum},serioustrauma:{text:"tor2",...e.restoration},shadowmadness:{text:"shad",...e.plumbum},shivering:{text:"shiv",...e.caloric},shyness:{text:"shy",...e.plumbum},skullfractures:{text:"sf",...e.health},slashedthroat:{text:"lac1",...e.epidermal},sleeping:{text:"slp",fg:"",bg:""},slickness:{text:"SLI",...e.magnesium},slimeobscure:{text:"nkh",fg:"",bg:""},spiritburn:{text:"spirB",...e.argentum},spiritwrack:{text:"spirW",fg:"",bg:""},stupidity:{text:"st",...e.plumbum},stuttering:{text:"stut",...e.epidermal},homunculusmercury:{text:"merc",fg:"",bg:""},temperedcholeric:{text:"choH",...e.antimony},temperedmelancholic:{text:"melaH",...e.antimony},temperedphlegmatic:{text:"phleH",...e.antimony},temperedsanguine:{text:"sanH",...e.antimony},tenderskin:{text:"tend",...e.argentum},tension:{text:"tens",...e.cinnabar},timeflux:{text:"tmfx",fg:"",bg:""},timeloop:{text:"tmlp",...e.cuprum},tonguetied:{text:"tngt",...e.restoration},torntendons:{text:"tt",...e.health},transfixation:{text:"trfx",...e.writhe},unweavingbody:{text:"unwB",...e.ferrum},unweavingspirit:{text:"unwS",...e.cinnabar},unweavingmind:{text:"unwM",...e.plumbum},vertigo:{text:"vert",...e.argentum},vitrified:{text:"vitri",fg:"",bg:""},voidfisted:{text:"void",fg:"",bg:""},voyria:{text:"voy",fg:"",bg:""},weariness:{text:"wea",...e.aurum},webbed:{text:"web",...e.writhe},whisperingmadness:{text:"mad",...e.argentum},wristfractures:{text:"wf",...e.health}}),createDefaultPromptState=()=>{const e=createDefaultCureColors();return{vars:createDefaultVars(),affs:createDefaultAffs(e),cureColors:e}},Bt={"&":"&","<":"<",">":">",'"':""","'":"'"},escapeHtml=e=>String(e??"").replace(/[&<>"']/g,e=>Bt[e]),renderChunk=(e,t="",a="")=>{if(""===e||null==e)return"";const n=[];return t&&n.push(`color:${t}`),a&&n.push(`background-color:${a}`),`<span${n.length?` style="${n.join(";")}"`:""}>${escapeHtml(e)}</span>`},createPromptBuilder=({vars:e,affs:t,cureColors:a,renderAffsHtml:n,renderDiffHtml:s,renderTargetHtml:i,renderVarHtml:o,renderChunkHtml:l=renderChunk})=>{const c=[],u={vars:e,affs:t,cureColors:a,add(t,a,n){if(""===t||null==t)return u;const s="string"==typeof t?e[t]:null;return s&&"object"==typeof s&&"text"in s?c.push("function"==typeof o?o(t):l(s.text,s.fg,s.bg)):c.push(l(t,a,n)),u},addHTML:e=>(e&&c.push(String(e)),u),addAffs:()=>(c.push(n()),u),addDiff:()=>(c.push(s()),u),addTarget:()=>(c.push(i()),u),toHTML:()=>`<span class="nexsys-prompt">${c.join("")}</span>`};return u},$t=new Set(["diffh","diffm","diffhp","diffmp"]),zt=new Set(["target","targetHP"]),getCellSignature=(e={})=>`${String(e.text??"")}\0${String(e.fg??"")}\0${String(e.bg??"")}`,createPromptRenderer=({state:e,getComposer:t,getFallbackComposer:a,getSortedAffNames:n,getAffSnapshot:s,renderChunkHtml:i=renderChunk})=>{const o=new Map,l=new Map,c=new Map;let u="",d="",m="",p=!0,g=!0,h=!0,b=[];const markVarsDirty=(t=[])=>{Array.isArray(t)&&t.length&&t.forEach(t=>{const a=e.vars[t];a&&"object"==typeof a&&"text"in a&&l.delete(t),$t.has(t)&&(g=!0),zt.has(t)&&(h=!0)})},syncExternalVarMutations=()=>{const t=new Set;Object.keys(e.vars||{}).forEach(a=>{t.add(a);const n=e.vars[a];if(!n||"object"!=typeof n||!("text"in n))return void((l.has(a)||o.has(a))&&(l.delete(a),o.delete(a)));const s=getCellSignature(n);l.get(a)!==s&&(l.delete(a),o.delete(a),$t.has(a)&&(g=!0),zt.has(a)&&(h=!0))}),[...l.keys()].forEach(e=>{t.has(e)||(l.delete(e),o.delete(e),$t.has(e)&&(g=!0),zt.has(e)&&(h=!0))})},syncExternalAffMutations=()=>{if(p||!b.length)return;let t=!1;b.forEach(a=>{const n=getCellSignature(e.affs[a]||{});c.get(a)!==n&&(t=!0)}),t&&(p=!0)},renderVarHtml=t=>{const a=e.vars[t];if(!a||"object"!=typeof a||!("text"in a))return"";const n=getCellSignature(a);return l.get(t)===n&&o.has(t)||(o.set(t,i(a.text,a.fg,a.bg)),l.set(t,n)),o.get(t)||""},buildAffsHtml=()=>{const t=n()||[],{affs:a}=e;if(b=[...t],c.clear(),!t.length)return'<span class="nexsys-prompt-affs mono"></span>';const o=[i("[","brown")];for(let e=0;e<t.length;e+=1){const n=t[e],l=a[n]||{text:n,fg:"",bg:""},u="function"==typeof s&&s(n)||{},d=Number(u.max)>1&&Number.isFinite(Number(u.count))?`(${Number(u.count)})`:"";c.set(n,getCellSignature(a[n]||{}));const m=e<t.length-1?" ":"";o.push(i(`${l.text}${d}${m}`,l.fg,l.bg))}return o.push(i("]","brown")),`<span class="nexsys-prompt-affs mono">${o.join("")}</span>`},renderAffsHtml=()=>(p&&(u=buildAffsHtml(),p=!1),u),renderDiffHtml=()=>{if(g){const t=e.vars.diffh||{},a=e.vars.diffhp||{},n=e.vars.diffm||{},s=e.vars.diffmp||{},o=[];t.text&&(o.push(i(`${t.text}h`,t.fg,t.bg)),a.text&&o.push(i(`(${a.text})`,a.fg,a.bg))),n.text&&(o.length&&o.push(i(", ")),o.push(i(`${n.text}m`,n.fg,n.bg)),s.text&&o.push(i(`(${s.text})`,s.fg,s.bg))),d=o.join(""),g=!1}return d},renderTargetHtml=()=>{if(h){const t=e.vars.target||{},a=e.vars.targetHP||{},n=[];(t.text||a.text)&&(n.push(i(" [")),t.text&&n.push(renderVarHtml("target")),t.text&&a.text&&n.push(i(": ")),a.text&&n.push(renderVarHtml("targetHP")),n.push(i("] "))),m=n.join(""),h=!1}return m},resetTransients=()=>{const{vars:t}=e,a=["diffh","diffm","diffhp","diffmp"].filter(e=>{const a=t[e];return!(!a||""===a.text)&&(a.text="",!0)});a.length&&markVarsDirty(a)},composeHtml=t=>{const a=createPromptBuilder({vars:e.vars,affs:e.affs,cureColors:e.cureColors,renderAffsHtml,renderDiffHtml,renderTargetHtml,renderVarHtml,renderChunkHtml:i});return t(a),a.toHTML()};return{render(){const e=t(),n=a?.();syncExternalVarMutations(),syncExternalAffMutations();let s="";try{if("function"!=typeof e)throw new TypeError("Prompt composer must be a function");s=composeHtml(e)}catch(i){if(console.error(e===n?"nexSys4 default prompt compose error":"nexSys4 custom prompt compose error; using default prompt",i),"function"==typeof n&&n!==e)try{s=composeHtml(n)}catch(o){console.error("nexSys4 default prompt compose error",o)}}return resetTransients(),s},markAffsDirty(){p=!0},isAffDirty:()=>p,markDiffDirty(){g=!0},markTargetDirty(){h=!0},markVarsDirty}},defaultCompose=e=>{const{vars:t}=e;t.blackout?e.add("-"):(e.add("paused").add("aeon").add("retard"),t.prismatic.text&&e.add("[[",t.prismatic.fg,t.prismatic.bg),t.shield.text&&e.add("((",t.shield.fg,t.shield.bg),t.bloodshield.text&&e.add("|B|","red",""),e.add("h"),e.add(`(${t.ph.text}), `,t.h.fg,t.h.bg),e.add("m"),e.add(`(${t.pm.text}) `,t.m.fg,t.m.bg),t.karma.text&&e.add(`${t.karma.text}K `,t.karma.fg,t.karma.bg),Number(t.rage.text)>0&&e.add(`${t.rage.text}R `,t.rage.fg),e.add("eq").add("bal").add("|").add("c").add("k").add("d").add("b"),t.shield.text&&e.add("))",t.shield.fg,t.shield.bg),t.prismatic.text&&e.add("]]",t.prismatic.fg,t.prismatic.bg),t.bloodshield.text&&e.add("|B|","red",""),e.add(" ").addAffs().addDiff())},Ft=new Set(["diffh","diffm","diffhp","diffmp"]),Gt=new Set(["target","targetHP"]),Ht=Object.freeze(["deafness","blindness","insomnia"]),clampPct=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>100?100:t:0},colorGradation=e=>{const t=clampPct(e),a=t<75?50:Math.abs(t-100)/2+25;return`hsl(${(1.2*t).toFixed(0)}, 100%, ${a}%)`},colorPercentage=e=>{const t=Number(e)||0;return t>75?"green":t>=33?"yellow":"red"},createPromptPresenter=({publicEvents:e,affModel:t,defModel:a,balanceModel:n,systemModel:s,renderPrompt:i}={})=>{const o=createDefaultPromptState();let l=defaultCompose;const isPromptDefTracked=e=>"function"==typeof a?.get?Boolean(a.get(e)):"function"==typeof a?.haveDef,c=Ht.filter(isPromptDefTracked),u=new Set(c),haveDef=e=>Boolean(a?.haveDef?.(e)),d=createPromptRenderer({state:o,getComposer:()=>l,getFallbackComposer:()=>defaultCompose,getSortedAffNames:()=>{const e=t?.currentSorted&&t.currentSorted()||[],a=new Set,n=[];return e.forEach(e=>{u.has(e)||a.has(e)||(a.add(e),n.push(e))}),c.forEach(e=>{haveDef(e)||a.has(e)||(a.add(e),n.push(e))}),n},getAffSnapshot:e=>t?.get?.(e)||null}),isRecord=e=>e&&"object"==typeof e&&!Array.isArray(e),isCellLike=e=>isRecord(e)&&("text"in e||"fg"in e||"bg"in e),normalizeCellField=e=>null==e?"":String(e),getVarRegion=e=>Ft.has(e)?"diff":Gt.has(e)?"target":"",ensureVarCell=e=>{const t=o.vars[e];if(t&&"object"==typeof t&&"text"in t)return t;if(e in o.vars)return null;const a={text:"",fg:"",bg:""};return o.vars[e]=a,a},applyCell=(e,t={},a={})=>{const n=a.create?ensureVarCell(e):o.vars[e];if(!n||"object"!=typeof n||!("text"in n))return!1;let s=!1;if("text"in t){const e=normalizeCellField(t.text);n.text!==e&&(n.text=e,s=!0)}if("fg"in t){const e=normalizeCellField(t.fg);n.fg!==e&&(n.fg=e,s=!0)}if("bg"in t){const e=normalizeCellField(t.bg);n.bg!==e&&(n.bg=e,s=!0)}return!!s&&(d.markVarsDirty([e]),"diff"===a.region&&d.markDiffDirty(),"target"===a.region&&d.markTargetDirty(),!0)},applyFlag=(e,t)=>{const a=Boolean(t);return o.vars[e]!==a&&(o.vars[e]=a,!0)},updateVars=(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{const n=o.vars[e],s=getVarRegion(e);"boolean"!=typeof n?"boolean"!=typeof a||void 0!==n?t=applyCell(e,isCellLike(a)?a:{text:a},{create:!0,region:s})||t:o.vars[e]!==a&&(o.vars[e]=a,t=!0):t=applyFlag(e,a)||t}),t},updateAffs=(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.affs&&(delete o.affs[e],t=!0));const n=isCellLike(a)?a:{text:a},s=o.affs[e],i=s&&"object"==typeof s?s:o.affs[e]={text:"",fg:"",bg:""};["text","fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t&&d.markAffsDirty(),t},updateCureColors=(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.cureColors&&(delete o.cureColors[e],t=!0));const n=isRecord(a)?a:{fg:a},s=o.cureColors[e],i=s&&"object"==typeof s?s:o.cureColors[e]={fg:"",bg:""};["fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t},updateBalanceGlyphs=()=>{applyCell("eq",{text:n?.have?.(bt.EQUILIBRIUM)?"e":""}),applyCell("bal",{text:n?.have?.(bt.BALANCE)?"x":""})},updateDefGlyphs=()=>{applyCell("c",{text:haveDef("cloak")?"c":""}),applyCell("k",{text:haveDef("kola")?"k":""}),applyCell("d",{text:haveDef("deafness")?"d":""}),applyCell("b",{text:haveDef("blindness")?"b":""}),applyCell("shield",{text:haveDef("shield")?"(":""}),applyCell("prismatic",{text:haveDef("prismatic")?"[":""}),applyCell("curseward",{text:haveDef("curseward")?"{":""}),applyCell("reflections",{text:haveDef("reflections")?"<":""}),applyCell("bloodshield",{text:haveDef("bloodshield")?"{":""})},pctOf=(e,t)=>{const a=Number(e)||0,n=Number(t)||0;return n>0?100*a/n:0},onVitals=(e={})=>{const t=e.current||s?.snapshot?.().char||{},a=pctOf(t.hp,t.maxhp),n=pctOf(t.mp,t.maxmp),i=pctOf(t.ep,t.maxep),o=pctOf(t.wp,t.maxwp);applyCell("h",{text:t.hp??"",fg:colorGradation(a)}),applyCell("m",{text:t.mp??"",fg:colorGradation(n)}),applyCell("e",{text:t.ep??"",fg:colorGradation(i)}),applyCell("w",{text:t.wp??"",fg:colorGradation(o)}),applyCell("maxh",{text:t.maxhp??""}),applyCell("maxm",{text:t.maxmp??""}),applyCell("maxe",{text:t.maxep??""}),applyCell("maxw",{text:t.maxwp??""}),applyCell("ph",{text:`${a.toFixed(1)}%`}),applyCell("pm",{text:`${n.toFixed(1)}%`}),applyCell("pe",{text:`${i.toFixed(1)}%`}),applyCell("pw",{text:`${o.toFixed(1)}%`});const l=Number(e.hpDiff||0),c=Number(e.mpDiff||0),u=Number(t.maxhp)||0,d=Number(t.maxmp)||0;if(l){const e=l<0?"red":"green";applyCell("diffh",{text:`${l>0?"+":""}${l}`,fg:e},{region:"diff"}),applyCell("diffhp",{text:u?`${(l/u*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}if(c){const e=c<0?"red":"green";applyCell("diffm",{text:`${c>0?"+":""}${c}`,fg:e},{region:"diff"}),applyCell("diffmp",{text:d?`${(c/d*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}applyCell("karma",{text:t.karma??""}),applyCell("rage",{text:t.rage??""}),applyCell("transcendence",{text:t.transcendence??""}),applyCell("essence",{text:t.essence??""}),applyCell("kai",{text:t.kai??""}),applyFlag("blackout",t.dead)},onRuntimeChange=()=>{const e=s?.snapshot?.().runtime||{};applyCell("retard",{text:e.slowMode?"(r)":""}),applyCell("paused",{text:e.paused?"(p)":""}),applyCell("aeon",{text:e.aeonLocked?"(a)":""})},onTargetChange=()=>{const e=s?.snapshot?.().target||{};applyCell("target",{text:e.text||""},{region:"target"}),applyCell("targetHP",{text:e.hp||""},{region:"target"});const t=parseInt(e.hp,10);Number.isFinite(t)&&applyCell("targetHP",{fg:colorGradation(t)},{region:"target"})},onAffEvent=(e={})=>{"aeon"===e?.name&&applyCell("aeon",{text:t?.haveAff?.("aeon")?"(a)":""}),d.markAffsDirty()},onDefEvent=(e={})=>{updateDefGlyphs(),u.has(e?.id)&&d.markAffsDirty()},onBalanceEvent=()=>updateBalanceGlyphs(),m=[];let p=!1;const subscribe=(t,a)=>{if(!e||"function"!=typeof e.on)return;const n=e.on(t,a);"function"==typeof n&&m.push(n)};return{start:()=>{p||(p=!0,subscribe(he.SYSTEM_VITALS_CHANGED,onVitals),subscribe(he.SYSTEM_RUNTIME_CHANGED,onRuntimeChange),subscribe(he.SYSTEM_PAUSE_CHANGED,onRuntimeChange),subscribe(he.SYSTEM_TARGET_CHANGED,onTargetChange),subscribe(he.AFF_GOT,onAffEvent),subscribe(he.AFF_LOST,onAffEvent),subscribe(he.AFF_STACK_CHANGED,onAffEvent),subscribe(he.AFF_PRIORITY_CHANGED,()=>d.markAffsDirty()),subscribe(he.DEF_GOT,onDefEvent),subscribe(he.DEF_LOST,onDefEvent),subscribe(he.BALANCE_GOT,onBalanceEvent),subscribe(he.BALANCE_LOST,onBalanceEvent),subscribe(he.BALANCE_RESET,onBalanceEvent),subscribe(he.BALANCE_TIMER_RESTARTED,onBalanceEvent),updateDefGlyphs(),updateBalanceGlyphs(),onRuntimeChange())},stop:()=>{m.forEach(e=>{try{e()}catch(t){console.error("nexSys4 prompt presenter unsubscribe failed",t)}}),m.length=0,p=!1},render:(e={})=>{const t=d.render();return"function"==typeof i?i(t,e):t},set(e){if("function"!=typeof e)throw new TypeError("prompt.set requires a function");l=e},reset(){l=defaultCompose},updateVars,updateAffs,updateCureColors,colorGradation,colorPercentage,get vars(){return o.vars},get affs(){return o.affs},get cureColors(){return o.cureColors},_state:o,_onVitals:onVitals,_onAffEvent:onAffEvent,_onDefEvent:onDefEvent,_onBalanceEvent:onBalanceEvent,_onRuntimeChange:onRuntimeChange,_onTargetChange:onTargetChange}},Ut=Object.freeze({INTERNAL:"internal",JS:"js",EVENTSTREAM:"eventstream"}),Vt=Object.freeze({STABLE:"stable",EXPERIMENTAL:"experimental",DEPRECATED:"deprecated"}),Yt=/^nexsys4(\.[a-z0-9_-]+)+$/,Qt=Object.freeze(Object.values(Ut)),Wt=Object.freeze(Object.values(Vt)),Kt=Object.freeze({[Ut.INTERNAL]:Object.freeze([null,Ut.INTERNAL]),[Ut.JS]:Object.freeze([null,Ut.INTERNAL,Ut.JS]),[Ut.EVENTSTREAM]:Object.freeze([null,Ut.INTERNAL,Ut.JS,Ut.EVENTSTREAM])}),topicEntry=(e,t,a={})=>{const n=a.scopedAudience??null,s={audience:e,scopedAudience:n,stability:a.stability??Vt.STABLE,description:t};return null!=n&&a.scopedPayloadKey&&(s.scopedPayloadKey=a.scopedPayloadKey),Object.freeze(s)},eventStreamTopic=(e,t={})=>topicEntry(Ut.EVENTSTREAM,e,t),jsTopic=(e,t={})=>topicEntry(Ut.JS,e,t),scopedEventStreamTopic=(e,t)=>eventStreamTopic(e,{scopedAudience:Ut.EVENTSTREAM,scopedPayloadKey:t}),isScopedAudienceAllowed=(e,t)=>{const a=Kt[e];return Array.isArray(a)&&a.includes(t)},validateRegistryEntry=(e,t)=>{if(!Yt.test(e))throw new Error(`Invalid topic registry key "${e}": expected lowercase dotted nexsys4.* form.`);if(!t||"object"!=typeof t||Array.isArray(t))throw new Error(`Invalid registry entry for "${e}": expected an object.`);if(!Qt.includes(t.audience))throw new Error(`Invalid audience for "${e}": received "${t.audience}".`);if(!("scopedAudience"in t))throw new Error(`Missing scopedAudience metadata for "${e}".`);if(null!=t.scopedAudience&&!Qt.includes(t.scopedAudience))throw new Error(`Invalid scopedAudience for "${e}": received "${t.scopedAudience}".`);if(!isScopedAudienceAllowed(t.audience,t.scopedAudience??null))throw new Error(`Invalid scopedAudience for "${e}": "${t.scopedAudience}" exceeds base audience "${t.audience}".`);if(null!=t.scopedAudience&&("string"!=typeof t.scopedPayloadKey||!t.scopedPayloadKey.trim()))throw new Error(`Missing scopedPayloadKey for scoped topic "${e}".`);if(!Wt.includes(t.stability))throw new Error(`Invalid stability for "${e}": received "${t.stability}".`);if("string"!=typeof t.description||!t.description.trim())throw new Error(`Invalid description for "${e}": expected a non-empty string.`)},validateTopicRegistry=(e,t=Object.values(he))=>{if(!e||"object"!=typeof e||Array.isArray(e))throw new Error("Invalid topic registry: expected an object.");for(const a of t)if(!Object.prototype.hasOwnProperty.call(e,a))throw new Error(`Missing registry entry for "${a}".`);for(const a of Object.keys(e)){if(!t.includes(a))throw new Error(`Unexpected registry entry for "${a}".`);validateRegistryEntry(a,e[a])}return!0},Xt=Object.freeze({[he.RUNTIME_STARTED]:eventStreamTopic("Runtime startup completed."),[he.RUNTIME_STOPPED]:eventStreamTopic("Runtime shutdown completed."),[he.RAW_GMCP]:eventStreamTopic("Raw GMCP payload observed at the adapter boundary."),[he.SYSTEM_VITALS_CHANGED]:eventStreamTopic("Character vitals changed."),[he.SYSTEM_HEALTH_CHANGED]:eventStreamTopic("Health changed."),[he.SYSTEM_MANA_CHANGED]:eventStreamTopic("Mana changed."),[he.SYSTEM_RAGE_CHANGED]:eventStreamTopic("Rage changed."),[he.SYSTEM_BLEED_CHANGED]:eventStreamTopic("Bleed changed."),[he.SYSTEM_STATUS_CHANGED]:eventStreamTopic("Character status snapshot changed."),[he.SYSTEM_CLASS_CHANGED]:eventStreamTopic("Character class changed."),[he.SYSTEM_TARGET_CHANGED]:eventStreamTopic("Current target changed."),[he.ROOM_CHANGED]:eventStreamTopic("Current room identity changed synchronously at ingestion (id, name, exits)."),[he.ROOM_FEATURES_CHANGED]:eventStreamTopic("Current room walls, frozen ground, or catalog-relative completeness changed synchronously."),[he.SYSTEM_RUNTIME_CHANGED]:jsTopic("Runtime implementation state changed."),[he.SYSTEM_PAUSE_CHANGED]:eventStreamTopic("Runtime pause state changed."),[he.SYSTEM_PAUSED]:eventStreamTopic("Runtime paused."),[he.SYSTEM_UNPAUSED]:eventStreamTopic("Runtime unpaused."),[he.SYSTEM_LOADED]:eventStreamTopic("Startup game-state initialization completed."),[he.SYSTEM_SETTINGS_CHANGED]:jsTopic("Runtime settings changed."),[he.SYSTEM_BASELINE_CHANGED]:jsTopic("Baseline intent changed."),[he.SYSTEM_DEATH_DETECTED]:eventStreamTopic("Death was detected from character state."),[he.SYSTEM_MOUNT_CHANGED]:eventStreamTopic("Mounted state changed."),[he.SYSTEM_WIELDED_CHANGED]:eventStreamTopic("Wielded equipment changed."),[he.UI_CONFIG_CHANGED]:jsTopic("Configuration dialog open state changed."),[he.AFF_GOT]:scopedEventStreamTopic("Affliction became active.","name"),[he.AFF_LOST]:scopedEventStreamTopic("Affliction was cured or removed.","name"),[he.AFF_STACK_CHANGED]:scopedEventStreamTopic("Affliction stack count changed.","name"),[he.AFF_PRIORITY_CHANGED]:jsTopic("Affliction priority changed."),[he.DEF_GOT]:scopedEventStreamTopic("Defence became active.","id"),[he.DEF_LOST]:scopedEventStreamTopic("Defence expired or was removed.","id"),[he.DEF_PRIORITY_CHANGED]:jsTopic("Defence priority changed."),[he.BALANCE_GOT]:scopedEventStreamTopic("Balance became available.","id"),[he.BALANCE_LOST]:scopedEventStreamTopic("Balance was consumed or lost.","id"),[he.BALANCE_RESET]:scopedEventStreamTopic("Balance timing was reset.","id"),[he.BALANCE_DURATION_OBSERVED]:scopedEventStreamTopic("Observed balance recovery duration changed.","id"),[he.BALANCE_TIMER_RESTARTED]:jsTopic("Balance loss timer was restarted without a state flip."),[he.EQBAL_GOT]:eventStreamTopic("Balance and equilibrium are both available."),[he.LIMB_UPDATED]:scopedEventStreamTopic("Limb damage or break state changed.","limb"),[he.CACHE_AMOUNT_CHANGED]:eventStreamTopic("Cached item counts changed."),[he.CACHE_INVENTORY_LIST]:eventStreamTopic("Inventory cache snapshot applied."),[he.CACHE_RIFT_LIST]:eventStreamTopic("Rift cache snapshot applied."),[he.CACHE_PRECACHE_CHANGED]:jsTopic("Desired precache state changed."),[he.ITEM_ROOM_ADDED]:eventStreamTopic("An item appeared in the current room."),[he.ITEM_ROOM_REMOVED]:eventStreamTopic("An item left the current room."),[he.ITEM_ROOM_UPDATED]:eventStreamTopic("A current-room item changed."),[he.ITEM_ROOM_LIST]:eventStreamTopic("Current-room item list snapshot received."),[he.ITEM_INV_ADDED]:eventStreamTopic("An item was added to inventory."),[he.ITEM_INV_REMOVED]:eventStreamTopic("An item was removed from inventory."),[he.ITEM_INV_UPDATED]:eventStreamTopic("An inventory item changed."),[he.ITEM_INV_LIST]:eventStreamTopic("Inventory item list snapshot received."),[he.QUEUE_UPDATED]:jsTopic("Queue contents changed."),[he.QUEUE_FLUSHED]:jsTopic("Queue flush decision completed."),[he.QUEUE_DEFERRED]:jsTopic("Queue execution was deferred."),[he.QUEUE_CLEARED]:jsTopic("Queue contents were cleared."),[he.QUEUE_SENT]:scopedEventStreamTopic("A queue submission was accepted by the server.","queueName"),[he.QUEUE_FIRED]:scopedEventStreamTopic("A queue fire was acknowledged for a named queue.","queueName"),[he.QUEUE_FIRED_ACK]:eventStreamTopic("Queue fire acknowledgement was recorded."),[he.SERVERSIDE_AFF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside affliction priority confirmation was observed.","id"),[he.SERVERSIDE_DEF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside defence priority confirmation was observed.","id"),[he.SERVERSIDE_DIRTY]:jsTopic("Serverside reconciliation dirty flag changed."),[he.SERVERSIDE_EVALUATED]:jsTopic("Serverside evaluation completed."),[he.RULE_ADDED]:jsTopic("Declarative rule was added to the general rule registry."),[he.RULE_REMOVED]:jsTopic("Declarative rule was removed from the general rule registry."),[he.RULE_ENABLED]:jsTopic("Declarative rule was enabled."),[he.RULE_DISABLED]:jsTopic("Declarative rule was disabled."),[he.RULE_PACK_LOADED]:jsTopic("Declarative rule pack was loaded."),[he.RULE_PACK_UNLOADED]:jsTopic("Declarative rule pack was unloaded."),[he.RULE_ORDER_CHANGED]:jsTopic("General rule evaluation order changed."),[he.RULE_ACTIVATED]:scopedEventStreamTopic("Declarative rule became active.","id"),[he.RULE_DEACTIVATED]:scopedEventStreamTopic("Declarative rule stopped being active.","id")});validateTopicRegistry(Xt);var buildExactTopicSet=e=>new Set(Object.keys(e||{})),buildScopedBaseMap=e=>{const t=new Map;return Object.entries(e||{}).forEach(([e,a])=>{null!=a?.scopedAudience&&t.set(e,a.scopedAudience)}),t},createEventStreamPublisher=({adapter:e,registry:t,globallyEnabled:a,rawGmcpEnabled:n})=>{const s=buildExactTopicSet(t),i=buildScopedBaseMap(t),resolveAudience=e=>{const a=String(e||"").trim();if(!a)return null;if(s.has(a))return t[a].audience;const n=a.lastIndexOf(".");if(n<0)return null;const o=a.slice(0,n);return i.get(o)??null},isAllowed=(e,t)=>!!a&&(t===Ut.EVENTSTREAM&&!(e===he.RAW_GMCP&&!n)),evaluate=(t,a)=>{const n=String(t||"").trim();return!!isAllowed(n,resolveAudience(n))&&("function"==typeof e?.raiseToEventStream&&e.raiseToEventStream(n,a))};return{attach:e=>e&&"function"==typeof e.onAny?e.onAny((e,t)=>{evaluate(t,e)}):()=>{},evaluate,resolveAudience,debugInfo:()=>({globallyEnabled:Boolean(a),rawGmcpEnabled:Boolean(n),exactTopicCount:s.size,scopedBaseCount:i.size})}},normalizeScopedTopicSegment=e=>{const t=String(e||"").trim().toLowerCase();return t?t.replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""):""},normalizePublishedPayload=(e={})=>e&&"object"==typeof e&&!Array.isArray(e)?e:{value:e},normalizeMessage=(e,t={},a)=>{const n=normalizePublishedPayload(t);return{...n,topic:e,at:n.at??a()}},createRuntimeEventPorts=({adapter:e,internalEvents:t,publicEvents:a,now:n})=>{const publishPublic=(e,t={})=>{const s=normalizeMessage(e,t,n);return a.emit(e,s),s},publishPublicScoped=(e,t={},a)=>{const n=publishPublic(e,t),s=normalizeScopedTopicSegment(a);return s?(publishPublic(`${e}.${s}`,n),n):n};return{publishPublic,publishPublicScoped,publishInternal:(e,a={})=>{const s=normalizeMessage(e,a,n);return t.emit(e,s),s},publishAdapterLocal:(t,a={})=>("function"==typeof e?.emitLocal&&e.emitLocal(t,a),a)}},createRuntimeEngine=({adapter:e,seedData:t,options:a={}})=>{const n=resolveAdapterCapabilities(e),{now:s,commandDispatcher:i,systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m,trackableModel:p,roomModel:g,persistence:h,queueController:b,rules:y,serverside:v,combatService:S,noticeCenter:x,curePlanner:k,defensePlanner:C,automaticActionPlanner:A,precachePlanner:E,outputPlanner:w,outputCycle:_}=createRuntimeDependencies({adapter:e,seedData:t,options:a}),T=createGmcpBlockBuffer({coalesce:!1!==a.coalesceGmcp}),M=createEventBus({label:"nexSys4.internal"}),P=createEventBus({label:"nexSys4.public"}),O=createPromptPresenter({publicEvents:P,affModel:l,defModel:u,balanceModel:c,systemModel:o,renderPrompt:(t,a={})=>n.promptRender?e.renderPrompt(t,a):t}),D=createEventStreamPublisher({adapter:e,registry:Xt,globallyEnabled:!1!==a.publishToEventStream,rawGmcpEnabled:!0===a.publishRawGmcp}),R=createRuntimeEventPorts({adapter:e,internalEvents:M,publicEvents:P,now:s});D.attach(P);const setRuntimePhase=(e,t={})=>o.setRuntime({phase:e,...t}),syncDebugMode=()=>{const t=Boolean(o.getSettings().debug);return n.debugToggle&&e.setDebugEnabled(t),M.setDebugEnabled?.(t),P.setDebugEnabled?.(t),t},N=R.publishPublic,j=R.publishPublicScoped,I=R.publishAdapterLocal,publishStartupPhase=e=>I("StartupPhaseEvent",{phase:e});let L;const q=createCuringSetProvisioner({adapter:e,serverside:v,dispatchCommands:i.sendCommands,setRuntimePhase,publishStartupPhase,options:a}),B=createStartupCoordinator({adapter:e,systemModel:o,serverside:v,persistence:h,seedBaselineFromObservedStartup:()=>V.seedBaselineFromObservedStartup({skipObservedAdoption:q.wasCreatedThisRun()}),noticeCenter:x,buildPersistenceSnapshot:()=>V.buildPersistenceSnapshot(),startupTimeoutMs:a.startupTimeoutMs,maxStartupRetries:a.maxStartupRetries,startupFinalizeTimeoutMs:a.startupFinalizeTimeoutMs,maxStartupFinalizeRecoveryAttempts:a.maxStartupFinalizeRecoveryAttempts,publishStartupPhase,publishLoaded:e=>N(he.SYSTEM_LOADED,e),releaseStartupPause:e=>L.setPaused(!1,e),setRuntimePhase}),$=createGmcpApplier({emit:(e,t)=>M.emit(e,t)}),z=createItemTopicNotifier({publishPublic:N}),F=createRoomIngress({roomModel:g,readHostRoomId:()=>n.gmcpSnapshot?e.getGMCP()?.Room?.Info?.num:null}),queueTranslatedGmcp=e=>{$.translate(e).forEach(e=>{z.notify(e),F.apply(e),Ne.has(e.topic)||T.enqueue(e)})},hydrateCacheFromAdapterGmcp=()=>{if(!n.gmcpSnapshot)return!1;const t=e.getGMCP();return!(!t||"object"!=typeof t)&&(d.hydrateFromGmcp?.(t)??!1)},G=createRuntimeFlushCoordinator({adapter:e,systemModel:o,serverside:v,outputCycle:_,flushGmcpBuffer:()=>{T.flush().forEach(({topic:e,payload:t})=>{M.emit(e,t)}),d.completeObservationBlock?.({source:"runtime-flush"})}}),H=createCuringMasterSwitch({setPaused:(e,t)=>L.setPaused(e,t),noticeCenter:x,now:s,options:a});L=createRuntimeControlApi({systemModel:o,rules:y,serverside:v,queueController:b,noticeCenter:x,curingMasterSwitch:H,dispatchCommands:i.sendCommands,markDirty:G.markDirty,onResume:e=>{G.isFlushing()||G.flushCycle(e)}});const U=createCuringSetGuard({serverside:v,systemModel:o,runtimeControl:L,noticeCenter:x}),V=createRuntimePersistenceApi({persistence:h,systemModel:o,affModel:l,defModel:u,cacheModel:d,serverside:v,syncDebugMode,markDirty:G.markDirty}),Y=createRuntimeEventWiring({adapter:e,internalEvents:M,publicEvents:P}),Q=createRuntimeStartupOrchestrator({adapter:e,systemModel:o,persistenceApi:V,startup:B,curingSetProvisioner:q,noticeCenter:x,syncDebugMode,isStarted:G.isStarted,markStarted:G.start,setRuntimePhase,publishStartupPhase,attachEventWiring:()=>{Y.attach({options:a,queueTranslatedGmcp,publishPublic:N,publishPublicScoped:j,noticeCenter:x,syncDebugMode,systemModel:o,affModel:l,defModel:u,balanceModel:c,cacheModel:d,limbModel:m,trackableModel:p,roomModel:g,queueController:b,rules:y,serverside:v,markDirty:G.markDirty,invalidateOutput:G.invalidateOutput,flushCycle:G.flushCycle,outputCycle:_,startup:B,curingSetProvisioner:q,curingSetGuard:U,curingMasterSwitch:H,runtimeControl:L,savePersistence:V.savePersistence}),n.gmcpSnapshot&&g.observeInfo(e.getGMCP()?.Room?.Info)},promptPresenter:O,publishRuntimeStarted:()=>N(he.RUNTIME_STARTED,{source:"runtime-start"}),hydrateCacheFromAdapterGmcp,runtimeControl:L,commandDispatcher:i,debugOverride:a.bootstrapDebugOverride}),stop=()=>{Q.dispose(),p.dispose?.(),G.isStarted()&&(N(he.RUNTIME_STOPPED,{source:"runtime-stop"}),G.stop(),B.dispose?.(),_.dispose?.(),Y.dispose(),setRuntimePhase(be.IDLE,{paused:!0,startupFailureMessage:""}),O.stop(),l.dispose?.(),c.dispose?.(),M.clear(),P.clear(),D.attach(P),n.destroy&&e.destroy())};let W=null;const snapshot=()=>{const e=o.snapshot(),t=l.snapshot(),a=c.snapshot(),n=u.snapshot(),s=d.snapshot(),i=m.snapshot(),h=p.snapshot(),S=g.snapshot(),x=b.snapshot(),k=v.snapshot(),C=y.snapshot();return W&&W.system===e&&W.affs===t&&W.balances===a&&W.defs===n&&W.cache===s&&W.limbs===i&&W.trackables===h&&W.room===S&&W.queues===x&&W.rules===C&&W.serverside===k||(W={system:e,affs:t,balances:a,defs:n,cache:s,limbs:i,trackables:h,room:S,queues:x,rules:C,serverside:k}),W};return{start:Q.start,stop,flushCycle:G.flushCycle,savePersistence:V.savePersistence,setPaused:L.setPaused,setSlowMode:L.setSlowMode,setConfigOpen:(e,t="runtime-ui")=>N(he.UI_CONFIG_CHANGED,{open:Boolean(e),source:t}),get paused(){return o.getRuntime().paused},snapshot,adapter:e,models:{systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m,trackableModel:p,roomModel:g},services:{combat:S},planners:{curePlanner:k,defensePlanner:C,automaticActionPlanner:A,precachePlanner:E,outputPlanner:w,outputCycle:_},queueController:b,rules:y,serverside:v,curingSetGuard:U,noticeCenter:x,persistence:h,commandDispatcher:i,promptPresenter:O,topics:he,onEvent:(e,t)=>P.on(e,t),offEvent:(e,t)=>P.off(e,t),markDirty:G.markDirty,ingestGmcp(e,t){queueTranslatedGmcp({tag:e,payload:t}),!0===a.publishRawGmcp&&N(he.RAW_GMCP,{source:"manual-gmcp",tag:String(e||"").trim().toLowerCase(),payload:t}),G.markDirty(`manual-gmcp:${e}`)},evaluateNow:(e="manual")=>G.flushCycle(e),addOutputCommands(e=[]){_.injectCommands(Array.isArray(e)?e:[e]),G.markDirty("manual-output-inject")},dispatchCommands:i.sendCommands,debugInfo:()=>({adapter:e.debugInfo?.()??null,internalEvents:M.debugInfo?.()??null,publicEvents:P.debugInfo?.()??null,eventStreamPublisher:D.debugInfo?.()??null})}},toArray=e=>Array.isArray(e)?e:[e],normalizeQueueKey=e=>String(e||"").trim(),normalizeCommandContext=(e,t)=>"boolean"==typeof e?{...t,preventExpansion:e}:e&&"object"==typeof e&&!Array.isArray(e)?{...t,...e}:{...t},createPublicCommandApi=({runtime:e})=>{const t=e.queueController,a=t.listQueues().map(e=>({queueId:e,meta:t.getQueue(e)||{}})),n=new Map,s=new Map,resolveQueueId=e=>{const t=normalizeQueueKey(e);return s.get(t)||t},getQueueHandle=e=>{const t=resolveQueueId(e);return n.get(t)||null},inspectQueue=e=>t.getQueue(resolveQueueId(e)),addQueue=(e,a,n)=>t.add(resolveQueueId(e),a,n),addClearQueue=(e,a,n)=>t.addClear(resolveQueueId(e),a,n),prependQueue=(e,a,n)=>t.prepend(resolveQueueId(e),a,n),clearLocalQueue=e=>t.clear(resolveQueueId(e)),clearGameQueue=e=>t.clearQueue(resolveQueueId(e)),flushQueue=(e,a)=>t.flush(resolveQueueId(e),a),isQueued=(e,t)=>{if(!t)return!1;const a=inspectQueue(e);return!!a&&(a.items.includes(t)||a.prepend.includes(t)||a.plannerCommands.includes(t))};a.forEach(({queueId:e,meta:t})=>{n.set(e,{get id(){return e},get queueId(){return e},get name(){return inspectQueue(e)?.name||t.name||""},get type(){return inspectQueue(e)?.type||t.type||""},get exclusions(){return inspectQueue(e)?.exclusions||t.exclusions||[]},inspect:()=>inspectQueue(e),state:()=>inspectQueue(e),add:(t,a)=>addQueue(e,t,a),addClear:(t,a)=>addClearQueue(e,t,a),prepend:(t,a)=>prependQueue(e,t,a),clear:()=>clearLocalQueue(e),clearQueue:()=>clearGameQueue(e),flush:t=>flushQueue(e,t),isQueued:t=>isQueued(e,t)}),s.set(e,e),t.name&&s.set(t.name,e)});const i={listQueues:()=>t.listQueues(),inspect:e=>inspectQueue(e),get:e=>getQueueHandle(e),add:(e,t,a)=>addQueue(e,t,a),addClear:(e,t,a)=>addClearQueue(e,t,a),prepend:(e,t,a)=>prependQueue(e,t,a),clear:e=>clearLocalQueue(e),clearQueue:e=>clearGameQueue(e),flush:(e,t)=>flushQueue(e,t),flushAll:()=>t.flushAll(),isQueued:(e,t)=>isQueued(e,t)},o={listQueues:()=>i.listQueues(),inspect:e=>i.inspect(e),get:e=>i.get(e)},l={};return a.forEach(({queueId:e,meta:t})=>{const a=n.get(e);a&&(l[e]=a,o[e]=a,t.name&&(o[t.name]=a))}),{queue:i,queues:o,...l,sendCmd:(t,a={})=>e.dispatchCommands([t],normalizeCommandContext(a,{source:"public-api"})),setTarget(t){const a=String(t??"").trim();if(!a)return{target:"",dispatched:!1,dispatchResult:null};const n=e.dispatchCommands(["settarget "+a],{source:"set-target"});return{target:a,dispatched:Boolean(n),dispatchResult:n}},sendInline:(t=[],a={})=>e.dispatchCommands(toArray(t),normalizeCommandContext(a,{source:"public-api-inline"})),addOutput(t=[]){e.addOutputCommands(toArray(t))},evaluateNow:(t="public-api")=>e.evaluateNow(t)}},Jt="nexSys4",Zt="https://unpkg.com/nexsys4/dist/nexSys4.nxs",er="khaseem",tr=Object.freeze(["nexSys4.userSettings"]),rr=1e4,ar=Object.freeze({fg:"red"}),toLowerName=e=>String(e??"").trim().toLowerCase(),safeCall=e=>{try{return e()}catch{return null}},clonePackageItem=e=>{if(!e||"object"!=typeof e)return null;if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return e}},getReflexes=e=>safeCall(()=>e?.reflexes?.())??null,getPackageRegistry=e=>{const t=safeCall(()=>e?.packages?.());if("function"==typeof t?.get)return t;const a=safeCall(()=>getReflexes(e)?.packages?.());return"function"==typeof a?.get?a:null},getInstalledPackage=(e,t)=>safeCall(()=>getPackageRegistry(e)?.get(t))??null,findGroupByName=(e,t)=>{if(!Array.isArray(e))return null;const a=toLowerName(t);return e.find(e=>toLowerName(e?.name)===a)??null},capturePreservedGroups=(e,t)=>t.map(t=>{const a=findGroupByName(e?.items,t);return a?{name:t,data:clonePackageItem(a)}:null}).filter(Boolean),applyPreservedGroup=(e,t,a)=>{const n=findGroupByName(e?.items,t.name);n&&t.data&&("function"!=typeof n.apply?"object"==typeof n&&Object.assign(n,clonePackageItem(t.data)):n.apply(t.data,a))},enableShippedGroups=(e,t)=>{if(!Array.isArray(e?.items))return;const a=new Set(t.map(toLowerName));e.items.filter(e=>"group"===e?.type&&!a.has(toLowerName(e.name))).forEach(e=>{e.enabled=!0})},reportUpdateError=({adapter:e,consoleObj:t,message:a,nexusClient:n})=>{t.error(a),"function"!=typeof e?.notice?n?.display?.(a):e.notice(a,ar)},createAbortSignal=({AbortControllerCtor:e,setTimeoutFn:t,timeoutMs:a})=>{if(!e||a<=0)return{signal:void 0,timeout:null};const n=new e,s=t(()=>n.abort(),a);return{signal:n.signal,timeout:s}},updateNxs=async({adapter:e=null,clearTimeoutFn:t=clearTimeout,consoleObj:a=console,fetchFn:n=globalThis.fetch,nexusClient:s=globalThis.nexusclient,packageName:i=Jt,preservedGroupNames:o=tr,setTimeoutFn:l=setTimeout,skipCharacterName:c=er,timeoutMs:u=rr,url:d=Zt}={})=>{if(c&&toLowerName(s?.charname)===toLowerName(c))return null;let m=null;try{if("function"!=typeof n)throw new Error("fetch is not available.");const e=getInstalledPackage(s,i);if(!e||"function"!=typeof e.apply)throw new Error(`${i} package is not installed in Nexus.`);const t=capturePreservedGroups(e,o),{signal:a,timeout:c}=createAbortSignal({AbortControllerCtor:globalThis.AbortController,setTimeoutFn:l,timeoutMs:u});m=c;const p=await n(d,{cache:"no-store",...a?{signal:a}:{}});if(!p?.ok)throw new Error(`${i} update failed: ${p?.status??"unknown"} ${p?.statusText??""}`.trim());const g=await p.json(),h=getReflexes(s);e.apply(g,h);const b=getInstalledPackage(s,i)??e;return t.forEach(e=>applyPreservedGroup(b,e,h)),enableShippedGroups(b,o),g}catch(p){return reportUpdateError({adapter:e,consoleObj:a,message:"AbortError"===p?.name?`${i} update timed out. Check your connection.`:`${i} update error: ${p?.message??String(p)}`,nexusClient:s}),null}finally{null!==m&&t(m)}},createPublicControlApi=({runtime:e,getModels:t})=>{const applySettings=(a={})=>(t().systemModel.setSettings(a,{setBaseline:!0}),e.savePersistence());return{pause:()=>e.setPaused(!0),unpause:()=>e.setPaused(!1),pauseToggle:()=>e.setPaused(!e.paused),setSlowMode:t=>e.setSlowMode(t),slowOn:()=>e.setSlowMode(!0),slowOff:()=>e.setSlowMode(!1),applySettings,setDebug:e=>applySettings({debug:Boolean(e)}),debugOn:()=>applySettings({debug:!0}),debugOff:()=>applySettings({debug:!1}),debug:()=>({runtime:e.snapshot(),internals:e.debugInfo?.()??null}),start:e.start,stop:e.stop,updateNxs:(t={})=>updateNxs({adapter:e.adapter,...t})}},resolveAudienceFor=(e,t)=>{const a=String(e||"").trim();if(!a)return null;if(Object.prototype.hasOwnProperty.call(t,a))return t[a].audience;const n=a.lastIndexOf(".");return n<0?null:t[a.slice(0,n)]?.scopedAudience??null},isPublicAudience=e=>e===Ut.JS||e===Ut.EVENTSTREAM,defaultIsDevMode=()=>{try{const e=globalThis.process?.env?.NODE_ENV;return!!e&&"production"!==e}catch{return!1}},defaultWarn=e=>{console.warn(e)},createPublicEventApi=({runtime:e,registry:t=Xt,isDevMode:a=defaultIsDevMode,warn:n=defaultWarn})=>{const s={on(s,i){const o=String(s||"").trim();return o&&"function"==typeof i?isPublicAudience(resolveAudienceFor(o,t))?e.onEvent(o,i):(a()&&n(`[nexSys4] topic "${o}" is not a public topic`),()=>{}):()=>{}},off(t,a){const n=String(t||"").trim();return!!n&&e.offEvent(n,a)}};return{events:s,on:s.on,off:s.off}},createPublicMutationApi=({runtime:e,getModels:t})=>{const a=e.services.combat,normalizeServersidePriority=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},samePriorityMaps=(e={},t={})=>{const a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(const n of a)if(normalizeServersidePriority(e?.[n])!==normalizeServersidePriority(t?.[n]))return!1;return!0},resetPriorities=(e=[],t,a="public-api")=>{let n=!1;return e.forEach(e=>{t(e,a)&&(n=!0)}),n},buildAffPriorityTarget=e=>{const t=e.list().reduce((t,a)=>(t[a]=normalizeServersidePriority(e.getPriority?.(a)),t),{});return e.getCountablePriorityNames?.().forEach(e=>{t[e]=0}),t},buildDefPriorityTarget=(e,t)=>{const a=t.snapshot?.().char?.class||"";return e.list().reduce((t,n)=>{const s=e.get(n);return!s?.serverside||s.static?t:"function"!=typeof e.isAvailableForClass||e.isAvailableForClass(n,a)?(t[n]=normalizeServersidePriority(e.getPriority?.(n)),t):t},{})},restorePersistedPriorities=({restoreAffs:a=!1,restoreDefs:n=!1,reason:s})=>{const{affModel:i,defModel:o,systemModel:l}=t();let c=!1;a&&(c=resetPriorities(i.list(),(e,t)=>i.resetPriority(e,t))||c),n&&(c=resetPriorities(o.list(),(e,t)=>o.resetPriority(e,t))||c);const u=e.serverside.snapshot?.(),d=a?buildAffPriorityTarget(i):null,m=n?buildDefPriorityTarget(o,l):null,p=Boolean(u&&(a&&!samePriorityMaps(u.sessionBaseline?.affPriorities,d)||n&&!samePriorityMaps(u.sessionBaseline?.defPriorities,m)));return!(!c&&!p)&&(refreshServersideBaseline(),e.markDirty(s),!0)},refreshServersideBaseline=()=>{e.serverside.setBaselineFromRuntime?.()},applyMutation=(t,a)=>!!t&&(refreshServersideBaseline(),e.markDirty(a),!0),applyDirtyOnly=(t,a)=>!!t&&(e.markDirty(a),!0);return{updateAffPriority:(e,a)=>applyMutation(t().affModel.setPriority(e,a,"public-api"),"api-aff-priority"),updateAffDefault:(e,a)=>applyMutation(t().affModel.setDefaultPriority(e,a,"public-api"),"api-aff-default"),resetAffPriority:e=>applyMutation(t().affModel.resetPriority(e,"public-api"),"api-aff-priority-reset"),resetAllAffPriorities:()=>restorePersistedPriorities({restoreAffs:!0,reason:"api-aff-priority-reset-all"}),updateDefPriority:(e,a)=>applyMutation(t().defModel.setPriority(e,a,"public-api"),"api-def-priority"),updateDefDefault:(e,a)=>applyMutation(t().defModel.setDefaultPriority(e,a,"public-api"),"api-def-default"),updateDefStatic:(e,a)=>applyMutation(t().defModel.setStatic(e,a,"public-api"),"api-def-static"),updateDefCommand:(e,a)=>applyMutation(t().defModel.setCommand(e,a,"public-api"),"api-def-command"),resetDefPriority:e=>applyMutation(t().defModel.resetPriority(e,"public-api"),"api-def-priority-reset"),resetAllDefPriorities:()=>restorePersistedPriorities({restoreDefs:!0,reason:"api-def-priority-reset-all"}),resetAllPriorities:()=>restorePersistedPriorities({restoreAffs:!0,restoreDefs:!0,reason:"api-priority-reset-all"}),defup(){const a=t().defModel,n=[];let s=!1;for(const t of a.list()){const i=a.get(t);if(!i||i.have)continue;a.resetPriority(t,"defup")&&(s=!0);const o=a.get(t),l=normalizeServersidePriority(e.rules.resolveDefensePriority(t,a.getPriority(t)));o?.static&&l>=1&&l<=25&&n.push(t)}const i=a.requestStatic?.(n,"defup")??!1;return(s||i)&&(refreshServersideBaseline(),e.markDirty("api-defup")),s||i},defoff(){const a=t().defModel;let n=!1;for(const e of a.list())a.get(e)&&a.setPriority(e,0,"defoff")&&(n=!0);const s=a.clearStaticRequests?.(void 0,"defoff")??!1;return(n||s)&&(refreshServersideBaseline(),e.markDirty("api-defoff")),n||s},setPrecache:(a={})=>(t().cacheModel.setDesiredPrecache(a),e.markDirty("api-precache"),e.savePersistence()),prioAff:t=>applyDirtyOnly(e.serverside.setPrioAff(t),"api-prioaff"),clearPrioAff:()=>applyDirtyOnly(e.serverside.clearPrioAff(),"api-prioaff-clear"),parry(t){a.parry(t),refreshServersideBaseline(),e.markDirty("api-parry")}}},nr="public-observe",freezeHandles=(e=[],t)=>Object.freeze(e.reduce((e,a)=>(e[a]=Object.freeze(t(a)),e),{})),getObserveSource=(e={})=>String(e?.source||nr),getObserveAt=(e={})=>e?.atMs??e?.at,getAffSnapshotState=(e,t)=>({have:e.haveAff(t),count:e.get(t)?.count??0}),didAffStateChange=(e,t)=>e.have!==t.have||e.count!==t.count,createPublicObserveApi=({runtime:e,getModels:t})=>{const a=t(),n=a.affModel,s=a.defModel,i=a.balanceModel,o=a.limbModel,l=a.systemModel,c=a.trackableModel,u=a.roomModel,d=e.services.combat,syncLimbsFromAfflictions=()=>{o.syncFromAfflictions(n.currentSorted(),"affliction")},m=freezeHandles(n.list?.()||[],t=>({got(a={}){const s=getAffSnapshotState(n,t);return n.got(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&(syncLimbsFromAfflictions(),e.markDirty(`api-observe-aff-got:${t}`),!0)},lost(a={}){const s=getAffSnapshotState(n,t);return n.lose(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&(syncLimbsFromAfflictions(),e.markDirty(`api-observe-aff-lost:${t}`),!0)}})),p=freezeHandles(s.list?.()||[],t=>({got:(a={})=>!!s.setHave(t,!0,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-got:${t}`),!0),lost:(a={})=>!!s.setHave(t,!1,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-lost:${t}`),!0)})),g=freezeHandles(i.list?.()||[],t=>{const observeServerUse=(a,n={})=>{const s=i.observeServerUse(t,a,{...n,source:getObserveSource({...n,source:n.source||"server-duration-observe"})});return s&&e.markDirty(`api-observe-balance-used:${t}`),s};return{got(a={}){const n=i.gain(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-got:${t}`),n},lost(a={}){const n=i.lose(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-lost:${t}`),n},used:observeServerUse,serverUsed:observeServerUse,observeServerUse}}),createObservedLimbHit=(e,t={},a)=>d.observeLimbHit({limb:e,amount:a,source:getObserveSource(t),at:getObserveAt(t)}),createObservedLimbReset=(e,t={})=>d.observeLimbReset({limb:e,source:getObserveSource(t)}),createObservedLimbStage=(e,t,a={})=>d.observeLimbStage({limb:e,stage:t,source:getObserveSource(a),at:getObserveAt(a)}),markObservedLimbResult=t=>!!t.changed&&(e.markDirty("torso"===t.limb&&t.stageChanged?`api-observe-limb-torso:${t.after?.stage||"unknown"}`:`api-observe-limb:${t.limb}`),!0),h=freezeHandles(o?.list?.()||[],e=>({hit:(t,a={})=>markObservedLimbResult(createObservedLimbHit(e,a,t)),reset:(t={})=>markObservedLimbResult(createObservedLimbReset(e,t)),setStage:(t,a={})=>markObservedLimbResult(createObservedLimbStage(e,t,a))})),b=Object.freeze({...h,get(e){if(!e)return null;const t=o?.get?.(e);return t?.id&&h[t.id]||null},list:()=>Object.keys(h),hit:(e,t,a={})=>markObservedLimbResult(createObservedLimbHit(e,a,t)),reset:(e,t={})=>markObservedLimbResult(createObservedLimbReset(e,t)),setStage:(e,t,a={})=>markObservedLimbResult(createObservedLimbStage(e,t,a))}),y=Object.freeze({set(t={}){const a=l.updateMount({name:String(t.name||""),id:t.id??null});return a&&e.markDirty("api-observe-mount-set"),a},clear(){const t=l.updateMount(null);return t&&e.markDirty("api-observe-mount-clear"),t}}),normalizeTrackableOptions=(e={})=>{const{atMs:t,at:a,...n}=e||{},s=getObserveAt(e);return{...n,...void 0===s?{}:{at:s},source:getObserveSource(e)}},v=Object.freeze({got:(e,t={})=>c.got(e,normalizeTrackableOptions(t)),lost:(e,t={})=>c.lose(e,normalizeTrackableOptions(t))});return{observe:Object.freeze({affs:m,defs:p,balances:g,limbs:b,mount:y,trackables:v,room:Object.freeze({frozenGround:Object.freeze({got:(e={})=>u.observeGround({...e,frozen:!0,source:getObserveSource(e)}),lost:(e={})=>u.observeGround({...e,frozen:!1,source:getObserveSource(e)})}),walls:Object.freeze({got:(e,t,a={})=>null!=e&&u.observeWall({...a,direction:e,type:t,change:"added",source:getObserveSource(a)}),lost:(e,t,a={})=>u.observeWall({...a,direction:e,type:t,change:"removed",source:getObserveSource(a)})})})})}},createPublicPromptApi=({runtime:e,control:t})=>{const a=e?.promptPresenter;if(!a)return{prompt:null};const getSystemModel=()=>e?.models?.systemModel;let n=null;return n={colorGradation:a.colorGradation,colorPercentage:a.colorPercentage,render:e=>a.render(e),set:e=>(a.set(e),n),reset:()=>(a.reset(),n),updateVars:(e={})=>(a.updateVars?.(e),n),updateAffs:(e={})=>(a.updateAffs?.(e),n),updateCureColors:(e={})=>(a.updateCureColors?.(e),n),get vars(){return a.vars},get affs(){return a.affs},get cureColors(){return a.cureColors},get enabled(){const e=getSystemModel()?.snapshot?.().settings||{};return Boolean(e.customPrompt)},set enabled(e){t?.applySettings?.({customPrompt:Boolean(e)})}},{prompt:n}},createPublicLineApi=({lineUtils:e={}})=>({replace:e.replace,replaceHTML:e.replaceHTML,replaceWord:e.replaceWord,replaceWordHTML:e.replaceWordHTML,nextLine:e.nextLine,checkLine:e.checkLine,prevLine:e.prevLine,prependNotice:e.prependNotice,say:e.say}),normalizeScopedSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),createPublicRulesApi=({runtime:e})=>({add:(t,a)=>e.rules.lifecycle.add(t,a),remove:t=>e.rules.lifecycle.remove(t),enable:t=>e.rules.lifecycle.enable(t),disable:t=>e.rules.lifecycle.disable(t),enablePack:t=>e.rules.lifecycle.enablePack(t),disablePack:t=>e.rules.lifecycle.disablePack(t),load:(t,a)=>e.rules.lifecycle.load(t,a),unload:t=>e.rules.lifecycle.unload(t),reorder:t=>e.rules.lifecycle.reorder(t),list:()=>e.rules.lifecycle.list(),bindTransition(t,a={}){const n=normalizeScopedSegment(t);if(!n)return()=>{};const s=e.topics||{},i=[];return"function"==typeof a.onActivate&&i.push(e.onEvent(`${s.RULE_ACTIVATED||"nexsys4.rule.activated"}.${n}`,a.onActivate)),"function"==typeof a.onDeactivate&&i.push(e.onEvent(`${s.RULE_DEACTIVATED||"nexsys4.rule.deactivated"}.${n}`,a.onDeactivate)),()=>{i.forEach(e=>e?.())}}}),createPublicServersideApi=({runtime:e})=>({predictions:{add:t=>e.serverside.addPrediction(t),remove:t=>e.serverside.removePrediction(t)},ssQueue:{add:t=>e.serverside.manualQueueAdd(t),insert:(t,a)=>e.serverside.manualQueueInsert(t,a),remove:t=>e.serverside.manualQueueRemove(t),reset:()=>e.serverside.manualQueueReset()},ss:{syncSnapshots:()=>e.serverside.requestSnapshotSync(),startupStatus:()=>e.serverside.getStartupStatus(),unload:(t={})=>e.curingSetGuard.unload(t)}}),createPublicStateApi=({runtime:e,getModels:t})=>{const{systemModel:a,affModel:n,defModel:s,balanceModel:i,limbModel:o,trackableModel:l}=t();return{snapshot:e.snapshot,getTarget:()=>a.snapshot().target,topics:e.topics,haveAff:e=>n.haveAff(e),affElapsedMs:e=>n.elapsedMs(e),affElapsedSeconds:e=>n.elapsedSeconds(e),affRemainingMs:e=>n.remainingMs(e),affRemainingSeconds:e=>n.remainingSeconds(e),affTiming:e=>n.timing(e),haveAffs:e=>n.haveAffs(toArray(e)),haveAnAff:e=>n.haveAnAff(toArray(e)),haveDef:e=>s.haveDef(e),haveDefs:e=>toArray(e).every(e=>s.haveDef(e)),haveAnyDef:e=>toArray(e).some(e=>s.haveDef(e)),haveBal:e=>i.have(e),haveBals:e=>toArray(e).every(e=>i.have(e)),haveAnyBal:e=>toArray(e).some(e=>i.have(e)),balElapsedMs:e=>i.elapsedMs(e),balElapsedSeconds:e=>i.elapsedSeconds(e),balRemainingMs:e=>i.remainingMs(e),balRemainingSeconds:e=>i.remainingSeconds(e),balTiming:e=>i.timing(e),getTrackable:e=>l.get(e),listTrackables:()=>l.list(),haveTrackable:e=>l.have(e),trackableElapsedMs:e=>l.elapsedMs(e),trackableRemainingMs:e=>l.remainingMs(e),trackableTiming:e=>l.timing(e),getLimb:e=>o?.get?.(e)||null,listLimbs:()=>o?.list?.()||[],getClass:()=>a.getClass(),checkClass:e=>a.checkClass(e),isClass:e=>a.isClass(e),isTarget:e=>a.isTarget(e)}},createPublicRoomApi=({roomModel:e})=>Object.freeze({get:e.snapshot,isGroundFrozen:e.isGroundFrozen,walls:Object.freeze({get:t=>Object.freeze(e.getWalls(t)),list:()=>Object.freeze(e.listWalls().map(e=>Object.freeze(e))),have:e.haveWall}),items:Object.freeze({have:e.haveItem,isKnown:e.isItemSnapshotKnown})}),isRecord=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),cloneAndFreezeCells=(e={})=>{const t={};for(const[a,n]of Object.entries(e))t[a]=isRecord(n)?Object.freeze({...n}):n;return Object.freeze(t)},buildPromptSnapshot=e=>e?Object.freeze({vars:cloneAndFreezeCells(e.vars),affs:cloneAndFreezeCells(e.affs),cureColors:cloneAndFreezeCells(e.cureColors)}):null,createPublicApi=({runtime:e,lineUtils:t={}})=>{const getModels=()=>e.models,a=createPublicStateApi({runtime:e,getModels}),n=createPublicEventApi({runtime:e}),s=createPublicControlApi({runtime:e,getModels}),i=createPublicCommandApi({runtime:e}),o=createPublicMutationApi({runtime:e,getModels}),l=createPublicObserveApi({runtime:e,getModels}),c=createPublicRulesApi({runtime:e}),u=createPublicServersideApi({runtime:e}),d=createPublicPromptApi({runtime:e,control:s}),m=createPublicLineApi({lineUtils:t}),{systemModel:p,affModel:g,defModel:h,balanceModel:b,limbModel:y,cacheModel:v,trackableModel:S,roomModel:x}=getModels(),k=Object.freeze(Object.create(null,{system:{enumerable:!0,get:()=>p.snapshot()},room:{enumerable:!0,get:()=>x.snapshot()},target:{enumerable:!0,get:()=>p.snapshot().target},class:{enumerable:!0,get:()=>p.snapshot().char.class},affs:{enumerable:!0,get:()=>g.snapshot()},defs:{enumerable:!0,get:()=>h.snapshot()},balances:{enumerable:!0,get:()=>b.snapshot()},limbs:{enumerable:!0,get:()=>y.snapshot()},queue:{enumerable:!0,get:()=>e.queueController.snapshot()},cache:{enumerable:!0,get:()=>v.snapshot()},trackables:{enumerable:!0,get:()=>S.snapshot()},prompt:{enumerable:!0,get:()=>buildPromptSnapshot(e.promptPresenter)},serverside:{enumerable:!0,get:()=>e.serverside.snapshot()},rules:{enumerable:!0,get:()=>e.rules.snapshot()}})),C=Object.freeze({on:n.events.on,off:n.events.off,topics:e.topics}),A=Object.freeze({affs:l.observe.affs,defs:l.observe.defs,balances:l.observe.balances,limbs:l.observe.limbs,mount:Object.freeze({set:l.observe.mount.set,reset:l.observe.mount.clear}),trackables:l.observe.trackables,room:l.observe.room}),E=Object.freeze({openConfig:(t="api.ui.openConfig")=>e.setConfigOpen(!0,t),closeConfig:(t="api.ui.closeConfig")=>e.setConfigOpen(!1,t),setConfigOpen:(t,a="api.ui.setConfigOpen")=>e.setConfigOpen(Boolean(t),a)}),w={...i.queue,...i.queues,list:i.queue.listQueues};return{state:k,api:{room:createPublicRoomApi({roomModel:x}),affs:{have:a.haveAff,haveAll:a.haveAffs,haveAny:a.haveAnAff,elapsedMs:a.affElapsedMs,elapsedSeconds:a.affElapsedSeconds,remainingMs:a.affRemainingMs,remainingSeconds:a.affRemainingSeconds,timing:a.affTiming,setPriority:o.updateAffPriority,setDefaultPriority:o.updateAffDefault,resetPriority:o.resetAffPriority,resetAllPriorities:o.resetAllAffPriorities},defs:{have:a.haveDef,haveAll:a.haveDefs,haveAny:a.haveAnyDef,setPriority:o.updateDefPriority,setDefaultPriority:o.updateDefDefault,setStatic:o.updateDefStatic,setCommand:o.updateDefCommand,resetPriority:o.resetDefPriority,resetAllPriorities:o.resetAllDefPriorities,defup:o.defup,defoff:o.defoff,parry:o.parry},balances:{have:a.haveBal,haveAll:a.haveBals,haveAny:a.haveAnyBal,elapsedMs:a.balElapsedMs,elapsedSeconds:a.balElapsedSeconds,remainingMs:a.balRemainingMs,remainingSeconds:a.balRemainingSeconds,timing:a.balTiming},trackables:{get:a.getTrackable,list:a.listTrackables,have:a.haveTrackable,elapsedMs:a.trackableElapsedMs,remainingMs:a.trackableRemainingMs,timing:a.trackableTiming},limbs:{get:a.getLimb,list:a.listLimbs},target:{get:a.getTarget,set:i.setTarget,is:a.isTarget},class:{get:a.getClass,is:a.isClass,check:a.checkClass},command:{send:i.sendCmd,sendInline:i.sendInline,addOutput:i.addOutput,evaluateNow:i.evaluateNow},queue:w,rules:c,prompt:d.prompt,observe:A,ui:E,line:m,control:{...s},ss:{predictions:u.predictions,queue:{add:u.ssQueue.add,insert:u.ssQueue.insert,remove:u.ssQueue.remove,clear:u.ssQueue.reset},syncSnapshots:u.ss.syncSnapshots,startupStatus:u.ss.startupStatus,unload:u.ss.unload,precache:{set:o.setPrecache},prioAff:{set:o.prioAff,reset:o.clearPrioAff}}},events:C}},generateChunk=(e,t,a)=>{const n=document.createElement("span");return n.style.color=t,n.style.backgroundColor=a,n.textContent=e,n},cloneTrustedHtmlNodes=e=>{const t=document.createElement("template");return t.innerHTML=String(e??""),[...t.content.childNodes].map(e=>e.cloneNode(!0))},replaceWordNodes=(e,t,a)=>{const n=String(t??"");if(!n)return!1;const s=document.createTreeWalker(e,globalThis.NodeFilter?.SHOW_TEXT??4),i=[];for(;s.nextNode();)i.push(s.currentNode);let o=!1;return i.forEach(e=>{const t=e?.textContent||"";if(!e?.parentNode||!t.includes(n))return;const s=document.createDocumentFragment();let i=0;for(;i<t.length;){const e=t.indexOf(n,i);if(-1===e){s.append(t.slice(i));break}e>i&&s.append(t.slice(i,e)),a().forEach(e=>s.appendChild(e)),i=e+n.length,o=!0}e.replaceWith(s)}),o},updateCurrentFormattedLine=e=>{const t=document.createElement("span");t.innerHTML=globalThis.nexusclient.current_line.parsed_line.formatted();const a=e(t);return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.innerHTML,a},replace$1=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.outerHTML,!0},replaceHTML=e=>(globalThis.nexusclient.current_line.parsed_line.formatted=()=>e,!0),replaceWord=(e,t,a,n)=>updateCurrentFormattedLine(s=>replaceWordNodes(s,e,()=>[generateChunk(t,a,n)])),replaceWordHTML=(e,t)=>updateCurrentFormattedLine(a=>replaceWordNodes(a,e,()=>cloneTrustedHtmlNodes(t))),matchPattern=(e,t)=>"string"==typeof t?e.includes(t):t instanceof RegExp&&t.test(e),prevLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n<=0)&&matchPattern(t[n-1].parsed_line.text(),e)},nextLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n>=t.length-1)&&matchPattern(t[n+1].parsed_line.text(),e)},checkLine=(e,t)=>{const{current_block:a,current_line:n}=globalThis.nexusclient,s=a.indexOf(n)+t;return!(s<0||s>a.length-1)&&matchPattern(a[s].parsed_line.text(),e)},prependNotice=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexSys.prepend_line={timestamp:globalThis.nexusclient.current_block[1].timestamp,timestamp_ms:globalThis.nexusclient.current_block[1].timestamp_ms,parsed_line:{text:()=>t.outerHTML,formatted:()=>t.outerHTML}},t.outerHTML},say=e=>{const t=new SpeechSynthesisUtterance;t.voice=globalThis.speechSynthesis.getVoices().find(e=>"Google UK English Female"===e.voiceURI)||globalThis.speechSynthesis.getVoices().find(e=>"en-US"===e.lang),t.rate=1.1,t.pitch=1.3,t.text=e,globalThis.speechSynthesis.speaking&&globalThis.speechSynthesis.cancel(),setTimeout(()=>globalThis.speechSynthesis.speak(t),10)},sr={affTable:re,balanceTable:ae,cacheTable:I,cacheNames:{herb_name_to_herb:R,mineral_to_herb:N,herb_to_mineral:j,herb_names:O,herb_names_group:D,mineral_names:M,mineral_names_group:P},cureTable:ie,defTable:ce,defPrios:ue,trackableTable:de,roomWallTable:me},ir=Object.freeze({affCount:Array.isArray(re?.list)?re.list.length:0,cureCount:Object.keys(ie||{}).length,defCount:Object.keys(ce||{}).length,balanceCount:Object.keys(ae||{}).length,cacheCount:Object.keys(I||{}).length,trackableCount:Object.keys(de||{}).length}),createNexSys=({adapter:e,adapterType:t="nexus",options:a={}}={})=>{installStringPrototypeHelpers();const n={...a.adapterOptions||{}};void 0===n.debug&&(n.debug=a.debug??!1),void 0===n.startupGag&&(n.startupGag=a.startupGag??!0);const s=assertAdapterContract(e||("mock"===t?createMockAdapter(n):createNexusAdapter(n))),i=createRuntimeEngine({adapter:s,seedData:sr,options:a}),{state:o,api:l,events:c}=createPublicApi({runtime:i,lineUtils:{replace:replace$1,replaceHTML,replaceWord,replaceWordHTML,nextLine,checkLine,prependNotice,prevLine,say}});return{version:"1.4.1",seedMeta:ir,tables:{limbs:Qe,dirs:We,dirMap:Ke,oppdirs:Xe,shortDirs:Je,classList:Ze},adapter:s,runtime:i,state:o,api:l,events:c}},clearGlobalNexSys=()=>{if("undefined"==typeof globalThis)return;const e=globalThis.nexSys,t=e?.api?.control?.stop;if(e&&"function"==typeof t)try{t()}catch(a){console.error("nexSys4 failed to stop the existing global runtime during reinstall",a)}try{delete globalThis.nexSys}catch{globalThis.nexSys=void 0}},installGlobalNexSys=(e={})=>{clearGlobalNexSys();const t=createNexSys(e);return globalThis.nexSys=t,t.api.control.start(),t},or=Object.freeze({coalesceGmcp:!0,publishToEventStream:!0,publishRawGmcp:!1,debug:!1,startupTimeoutMs:5e3,maxStartupRetries:3,maxEntriesPerSubmission:20,pendingTimeoutMs:12e3,desyncCommandRepeats:3,maxSsCommandsPerCycle:40}),bootstrapNexus$1=(e={})=>{const{forceNew:t,...a}=e,n=Object.prototype.hasOwnProperty.call(a,"debug");return uninstallNexusClientOverrides(),installNexusClientOverrides(),installGlobalNexSys({adapterType:"nexus",options:{...or,...a,bootstrapDebugOverride:n?Boolean(a.debug):void 0}})},lr=Symbol.for("nexsys4.startup.installed"),cr="font_stacks_original",getNexusclient=()=>globalThis.nexusclient&&"object"==typeof globalThis.nexusclient?globalThis.nexusclient:null,mountGui=e=>{if(!globalThis.ReactDOM||!globalThis.React)return!1;document.getElementById("modal-root")||document.body.appendChild(Object.assign(document.createElement("div"),{id:"modal-root"})),document.getElementById("nexsys-modal")?.remove();const t=Object.assign(document.createElement("div"),{id:"nexsys-modal"});return document.getElementById("modal-root").appendChild(t),globalThis.ReactDOM.createRoot(t).render(globalThis.React.createElement(e.component,{nexSys:e})),!0},injectFonts=()=>{const e=document.getElementsByTagName("head")[0],t=document.createElement("link");t.rel="stylesheet",t.href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap",e.appendChild(t);const a=document.createElement("link");a.rel="stylesheet",a.href="https://fonts.googleapis.com/css?family=Roboto%20Mono:300,400,500,700&display=swap",e.appendChild(a)},patchFontStacks=e=>{const t=e.settings();if(void 0!==t[cr])return;const a=document.getElementsByTagName("head")[0],n=document.getElementById("nexSysCSS")||document.createElement("style");n.id="nexSysCSS",n.parentNode||a.appendChild(n),t[cr]=t.font_stacks,t.font_stacks=function(){return n.textContent=`.timestamp {font-family: ${t.font_stack}}`,[{name:"RobotoMono",stack:"Roboto Mono,Consolas,monospace"},{name:"Consolas",stack:"Consolas,RobotoMono,monospace"},{name:"Verdana",stack:"Verdana, Geneva, sans-serif"},{name:"Lucida",stack:"'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Geneva, Verdana, sans-serif"},{name:"Arial",stack:"Arial, 'Helvetica Neue', Helvetica, sans-serif"},{name:"Futura",stack:"Futura, 'Trebuchet MS', Arial, sans-serif"},{name:"Book Antiqua",stack:"'Book Antiqua', Palatino, 'Palatino Linotype', 'Palatino LT STD', Georgia, serif"},...t[cr]()]}},initializeSettings=e=>{void 0===e.variables().vars.nexSys4Settings&&(e.variables().vars.nexSys4Settings={})},startupNexus=()=>{const e=getNexusclient();return!!e&&(e[lr]||(injectFonts(),patchFontStacks(e),initializeSettings(e),e[lr]=!0),mountGui(globalThis.nexSys),!0)},ur=(0,b.createContext)(null);function useNexSys(){return(0,b.useContext)(ur)}var dr=__commonJSMin(e=>{var t=Symbol.for("react.transitional.element"),a=Symbol.for("react.fragment");function jsxProd(e,a,n){var s=null;if(void 0!==n&&(s=""+n),void 0!==a.key&&(s=""+a.key),"key"in a)for(var i in n={},a)"key"!==i&&(n[i]=a[i]);else n=a;return a=n.ref,{$$typeof:t,type:e,key:s,ref:void 0!==a?a:null,props:n}}e.Fragment=a,e.jsx=jsxProd,e.jsxs=jsxProd}),mr=__commonJSMin((e,t)=>{t.exports=dr()})();function NexSysProvider({nexSys:e,children:t}){return(0,mr.jsx)(ur.Provider,{value:e,children:t})}var pr={ink900:"#121310",ink800:"#191a16",ink700:"#20211b",ink600:"#26271f",textStrong:"#efe5ce",text:"#d4cbb6",textDim:"#a49b87",textFaint:"#7b7460",brassDeep:"#9a7433",brass:"#cba362",brassBright:"#e0c384",brassContrast:"#241a08",oxblood:"#c4776c",verdigris:"#7fa196"},gr="203, 163, 98",fr={border:`rgba(${gr}, 0.18)`,borderStrong:`rgba(${gr}, 0.34)`,selectFill:`rgba(${gr}, 0.13)`,shadow:"rgba(0, 0, 0, 0.42)",dragShadow:"rgba(0, 0, 0, 0.55)"},hr=(pr.ink900,pr.ink800,pr.ink700,pr.ink600,pr.textStrong,pr.text,pr.textDim,pr.textFaint,pr.brass,pr.brassBright,pr.brassDeep,pr.brassContrast,pr.verdigris,pr.oxblood,fr.border,fr.borderStrong,pr.brass,fr.selectFill,fr.shadow,fr.dragShadow,{radius:5}),br=(pr.ink900,pr.ink800,pr.ink700,pr.ink600,pr.textStrong,pr.text,pr.textDim,pr.textFaint,pr.brassDeep,pr.brass,pr.brassBright,pr.oxblood,pr.verdigris,fr.border,fr.borderStrong,fr.selectFill,fr.shadow,'"Roboto Mono", ui-monospace, "Cascadia Code", "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", monospace'),yr=(()=>(0,s.createTheme)({palette:{mode:"dark",primary:{main:pr.brass,light:pr.brassBright,dark:pr.brassDeep,contrastText:pr.brassContrast},secondary:{main:pr.verdigris},error:{main:pr.oxblood},success:{main:pr.verdigris},info:{main:pr.verdigris},warning:{main:pr.brassBright},divider:fr.border,background:{default:pr.ink900,paper:pr.ink700,deep:pr.ink900,surface:pr.ink800,panel:pr.ink700,raised:pr.ink600},text:{primary:pr.textStrong,secondary:pr.textDim,disabled:pr.textFaint},border:{main:fr.border,strong:fr.borderStrong},select:{line:pr.brass,fill:fr.selectFill},action:{hover:fr.selectFill,selected:fr.selectFill}},shape:{borderRadius:hr.radius},typography:{fontFamily:br,fontSize:13,button:{textTransform:"none",fontWeight:700},subtitle1:{fontWeight:700,letterSpacing:"0.01em"},subtitle2:{fontWeight:700,letterSpacing:"0.01em"},overline:{letterSpacing:"0.14em"}},components:{MuiTypography:{styleOverrides:{root:{fontFamily:br}}},MuiPaper:{styleOverrides:{root:{backgroundImage:"none"}}},MuiSwitch:{defaultProps:{size:"small"}},MuiSelect:{defaultProps:{size:"small"}},MuiTextField:{defaultProps:{size:"small"}},MuiPopover:{styleOverrides:{paper:{backgroundColor:pr.ink600,backgroundImage:"none",border:`1px solid ${fr.borderStrong}`}}},MuiTooltip:{styleOverrides:{tooltip:{backgroundColor:pr.ink600,color:pr.textStrong,border:`1px solid ${fr.borderStrong}`,fontFamily:br,fontSize:"0.72rem"},arrow:{color:pr.ink600}}},MuiLinearProgress:{styleOverrides:{determinate:{transition:"none",backgroundColor:fr.selectFill},bar:{transition:"none",backgroundColor:pr.brass}}},MuiDialog:{styleOverrides:{paper:({theme:e})=>({backgroundColor:e.palette.background.surface,backgroundImage:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius})}},MuiDialogTitle:{styleOverrides:{root:({theme:e})=>({"&&":{backgroundColor:e.palette.background.surface,color:e.palette.text.primary,borderBottom:`1px solid ${e.palette.divider}`}})}}}}))(),vr=!1;function useDialogOpen(e){const[t,a]=(0,b.useState)(vr);return(0,b.useEffect)(()=>e?.events?.on?.(he.UI_CONFIG_CHANGED,({open:e})=>{a(Boolean(e))})??void 0,[e]),[t,a]}var cloneSettings=(e={})=>(0,i.produce)(e,()=>{}),toFiniteNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toPriority=e=>toFiniteNumber(e,0),toConfigPriority=e=>Math.max(0,Math.min(26,toPriority(e))),toQuantity=e=>Math.max(0,toFiniteNumber(e,0)),isBlankInput=e=>""===e,toDraftConfigPriority=(e,t=0)=>{if(isBlankInput(e))return"";const a=Number(e);return Number.isFinite(a)?Math.max(0,Math.min(26,a)):t},isActiveDefPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=25},normalizePriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a),e),{}),buildAffPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toPriority(a?.defaultPriority),e),{}),buildDefPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a?.defaultPriority),e),{}),buildDefStaticDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Boolean(a?.static),e),{}),buildDefOppsMap=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Array.isArray(a?.opps)?a.opps:[],e),{}),buildPrecacheDraft=(e={})=>Object.entries(e?.desiredPrecache??{}).reduce((e,[t,a])=>(e[t]=toQuantity(a),e),{}),buildDraft=(e={})=>({settings:cloneSettings(e.system?.settings??{}),affPriorities:buildAffPriorityDraft(e.affs??{}),defPriorities:buildDefPriorityDraft(e.defs??{}),defStatics:buildDefStaticDraft(e.defs??{}),defOpps:buildDefOppsMap(e.defs??{}),desiredPrecache:buildPrecacheDraft(e.cache??{})}),keysChangedFrom=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]);function useSettingsForm(e){const[t]=(0,b.useState)(()=>buildDraft(e?.runtime?.snapshot?.()??{})),[a,n]=(0,b.useState)(()=>t.settings),[s,o]=(0,b.useState)(()=>t.affPriorities),[l,c]=(0,b.useState)(()=>t.defPriorities),[u,d]=(0,b.useState)(()=>t.defStatics),[m,p]=(0,b.useState)(()=>t.desiredPrecache);return{pending:a,set:(0,b.useCallback)((e,t)=>{n(a=>a?(0,i.produce)(a,a=>{const n=e.split(".");let s=a;for(let e=0;e<n.length-1;e+=1)s[n[e]]&&"object"==typeof s[n[e]]||(s[n[e]]={}),s=s[n[e]];s[n[n.length-1]]=t}):a)},[]),affPriorities:s,setAffPriority:(0,b.useCallback)((e,t)=>{o(a=>({...a,[e]:toConfigPriority(t)}))},[]),defPriorities:l,setDefPriority:(0,b.useCallback)((e,a)=>{c(n=>{const s=toDraftConfigPriority(a,n?.[e]??0),i={...n,[e]:s};return isActiveDefPriority(s)&&(t.defOpps[e]||[]).forEach(e=>{isActiveDefPriority(i[e])&&(i[e]=0)}),i})},[t]),defStatics:u,setDefStatic:(0,b.useCallback)((e,t)=>{d(a=>({...a,[e]:Boolean(t)}))},[]),desiredPrecache:m,setPrecache:(0,b.useCallback)((e,t)=>{p(a=>({...a,[e]:toQuantity(t)}))},[]),commit:(0,b.useCallback)(()=>{if(!e)return;const n=t;keysChangedFrom(s,n.affPriorities).forEach(t=>{e.api?.affs?.setDefaultPriority?.(t,s[t])});const i=normalizePriorityDraft(l);keysChangedFrom(i,n.defPriorities).forEach(t=>{e.api?.defs?.setDefaultPriority?.(t,i[t])}),keysChangedFrom(u,n.defStatics).forEach(t=>{e.api?.defs?.setStatic?.(t,u[t])});const o=keysChangedFrom(m,n.desiredPrecache).reduce((e,t)=>(e[t]=m[t]??0,e),{});Object.keys(o).length&&e.api?.ss?.precache?.set?.(o),a&&e.api?.control?.applySettings?.(a)},[a,s,l,u,m,t,e])}}function LabelledSwitch({label:e,checked:t,onChange:a}){return(0,mr.jsx)(n.FormControlLabel,{control:(0,mr.jsx)(n.Switch,{checked:Boolean(t),onChange:e=>a(e.target.checked),size:"small"}),label:e,sx:{ml:0,mr:0,gap:.5,alignItems:"center",userSelect:"none","& .MuiSwitch-root":{mr:.5},"& .MuiFormControlLabel-label":{fontSize:11,lineHeight:1.25}}})}function ThresholdSlider({label:e,value:t,onChange:a,min:s=0,max:i=100,step:o=5,unit:l="%"}){return(0,mr.jsxs)(n.Box,{sx:{mb:1},children:[(0,mr.jsxs)(n.Typography,{variant:"body2",sx:{mb:.5,fontSize:11,lineHeight:1.3},children:[e,": ",t,l]}),(0,mr.jsx)(n.Slider,{value:t,min:s,max:i,step:o,onChange:(e,t)=>a(t),size:"small",sx:{color:"primary.main"}})]})}var Sr="50px",xr={minWidth:95,height:25,px:1,fontSize:11,lineHeight:1};function SectionHeader({children:e}){return(0,mr.jsx)(n.Typography,{variant:"overline",sx:{display:"block",color:"primary.main",mt:2,mb:.5,fontWeight:700},children:e})}function SystemSettingsTab({pending:e,set:t}){return e?(0,mr.jsxs)(n.Box,{sx:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",columnGap:{xs:2,md:Sr},rowGap:2,pt:1},children:[(0,mr.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,mr.jsx)(SectionHeader,{children:"nexSys Config"}),(0,mr.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,mr.jsx)(LabelledSwitch,{label:"Load on login",checked:!!e.loadOnLogin,onChange:e=>t("loadOnLogin",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Queue while paused",checked:e.queueWhilePaused,onChange:e=>t("queueWhilePaused",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Override Tab target",checked:e.overrideTab,onChange:e=>t("overrideTab",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Custom Prompt",checked:e.customPrompt,onChange:e=>t("customPrompt",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Debug output",checked:e.debug,onChange:e=>t("debug",e)})]}),(0,mr.jsx)(SectionHeader,{children:"Notices (Echo)"}),(0,mr.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,mr.jsx)(LabelledSwitch,{label:"Affliction gained",checked:e.notices?.affGot,onChange:e=>t("notices.affGot",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Affliction lost",checked:e.notices?.affLost,onChange:e=>t("notices.affLost",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Defence gained",checked:e.notices?.defGot,onChange:e=>t("notices.defGot",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Defence lost",checked:e.notices?.defLost,onChange:e=>t("notices.defLost",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Balance lost",checked:e.notices?.balanceLost,onChange:e=>t("notices.balanceLost",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Balance recovered",checked:e.notices?.balanceRecovered,onChange:e=>t("notices.balanceRecovered",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Trackable gained",checked:e.notices?.trackableGot,onChange:e=>t("notices.trackableGot",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Trackable lost",checked:e.notices?.trackableLost,onChange:e=>t("notices.trackableLost",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Priority changes",checked:e.notices?.priority,onChange:e=>t("notices.priority",e)}),(0,mr.jsx)(LabelledSwitch,{label:"General output",checked:e.notices?.output,onChange:e=>t("notices.output",e)})]})]}),(0,mr.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:190},width:{xs:"100%",md:190},minWidth:0},children:[(0,mr.jsx)(SectionHeader,{children:"Curing Method"}),(0,mr.jsxs)(n.Box,{sx:{mb:1},children:[(0,mr.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Curing type"}),(0,mr.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.transmutation?"transmutation":"concoctions",onChange:(e,a)=>a&&t("ss.transmutation","transmutation"===a),sx:{"& .MuiToggleButton-root":xr},children:[(0,mr.jsx)(n.ToggleButton,{value:"transmutation",children:"Transmutation"}),(0,mr.jsx)(n.ToggleButton,{value:"concoctions",children:"Concoctions"})]})]}),(0,mr.jsxs)(n.Box,{sx:{mb:1},children:[(0,mr.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Sip priority"}),(0,mr.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.sipPriority??"health",onChange:(e,a)=>a&&t("ss.sipPriority",a),sx:{"& .MuiToggleButton-root":xr},children:[(0,mr.jsx)(n.ToggleButton,{value:"health",children:"Health"}),(0,mr.jsx)(n.ToggleButton,{value:"mana",children:"Mana"})]})]}),(0,mr.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column",mt:1},children:[(0,mr.jsx)(LabelledSwitch,{label:"Batching",checked:e.ss?.batch,onChange:e=>t("ss.batch",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Tree Tattoo",checked:"on"===e.ss?.tree,onChange:e=>t("ss.tree",e?"on":"off")}),(0,mr.jsx)(LabelledSwitch,{label:"Focus",checked:e.ss?.focus,onChange:e=>t("ss.focus",e)}),e.ss?.focus&&(0,mr.jsxs)(mr.Fragment,{children:[(0,mr.jsx)(LabelledSwitch,{label:"Focus over Herbs",checked:e.ss?.focusOverHerbs,onChange:e=>t("ss.focusOverHerbs",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Focus with Guilt",checked:e.ss?.focusWithGuilt,onChange:e=>t("ss.focusWithGuilt",e)}),(0,mr.jsx)(LabelledSwitch,{label:"Focus with Fulminated",checked:e.ss?.focusWithFulminated,onChange:e=>t("ss.focusWithFulminated",e)})]}),(0,mr.jsx)(LabelledSwitch,{label:"Blood clotting",checked:e.ss?.clot,onChange:e=>t("ss.clot",e)}),e.ss?.clot&&(0,mr.jsxs)(n.Box,{sx:{ml:1,mt:2,mb:.5,display:"flex",flexDirection:"column",gap:2},children:[(0,mr.jsx)(n.TextField,{label:"Clot above",value:e.ss?.clotAt??"",onChange:e=>t("ss.clotAt",Number(e.target.value)||0),type:"number",size:"small",sx:{width:100,maxWidth:"100%"},slotProps:{htmlInput:{min:0}}}),(0,mr.jsx)(n.TextField,{label:"Clot down to",value:e.ss?.clotTo??"",onChange:e=>t("ss.clotTo",Number(e.target.value)||0),type:"number",size:"small",sx:{width:100,maxWidth:"100%"},slotProps:{htmlInput:{min:0}}})]})]})]}),(0,mr.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,mr.jsx)(SectionHeader,{children:"Thresholds"}),(0,mr.jsx)(ThresholdSlider,{label:"Sip health at",value:e.ss?.sipHealthAt??0,onChange:e=>t("ss.sipHealthAt",e)}),(0,mr.jsx)(ThresholdSlider,{label:"Sip mana at",value:e.ss?.sipManaAt??0,onChange:e=>t("ss.sipManaAt",e)}),(0,mr.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,mr.jsx)(ThresholdSlider,{label:"Moss health at",value:e.ss?.mossHealthAt??0,onChange:e=>t("ss.mossHealthAt",e)}),(0,mr.jsx)(ThresholdSlider,{label:"Moss mana at",value:e.ss?.mossManaAt??0,onChange:e=>t("ss.mossManaAt",e)}),(0,mr.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,mr.jsx)(ThresholdSlider,{label:"Cure fractures above",value:e.ss?.fracturesAbove??0,onChange:e=>t("ss.fracturesAbove",e)}),(0,mr.jsx)(ThresholdSlider,{label:"Use mana abilities above",value:e.ss?.manaThreshold??0,onChange:e=>t("ss.manaThreshold",e)})]})]}):null}function useNexSysSnapshot(e){return(0,b.useSyncExternalStore)((0,b.useCallback)(t=>{const a=e.events.topics,n=[a.SYSTEM_SETTINGS_CHANGED,a.SYSTEM_STATUS_CHANGED,a.SYSTEM_CLASS_CHANGED,a.AFF_PRIORITY_CHANGED,a.DEF_PRIORITY_CHANGED,a.CACHE_PRECACHE_CHANGED,a.SYSTEM_RUNTIME_CHANGED];return n.forEach(a=>e.events.on(a,t)),()=>n.forEach(a=>e.events.off(a,t))},[e]),e.runtime.snapshot,e.runtime.snapshot)}var kr=Object.freeze({}),Cr=new Set(Object.keys(re?.types?.nonServerside??{}));function buildColumns(e,t={}){return(0,i.produce)({},a=>{for(let e=0;e<=25;e++)a[`col-${e}`]={id:`col-${e}`,label:0===e?"Ignored 26":`Prio ${e}`,priority:e,affs:[]};for(const[n,s]of Object.entries(e)){if(Cr.has(n))continue;const e=Number(t[n]??s.defaultPriority??0);!Number.isFinite(e)||e>26||a[`col-${Math.max(0,Math.min(25,26===e?0:e))}`].affs.push(n)}})}function findContainer(e,t){return t[e]?e:Object.keys(t).find(a=>t[a].affs.includes(e))??null}function useAffPriorities(e,t={}){const[a,n]=(0,b.useState)(null),[s,c]=(0,b.useState)(null),u=(0,b.useRef)(null),d=useNexSysSnapshot(e)?.affs??kr,{affPriorities:m=kr,setAffPriority:p}=t,g=(0,b.useMemo)(()=>buildColumns(d,m),[d,m]);return{columns:s??g,activeId:a,sensors:(0,o.useSensors)((0,o.useSensor)(o.PointerSensor,{activationConstraint:{distance:4}}),(0,o.useSensor)(o.KeyboardSensor,{coordinateGetter:l.sortableKeyboardCoordinates})),onDragStart:(0,b.useCallback)(({active:e})=>{n(String(e.id));const t=(0,i.produce)(g,()=>{});u.current=t,c(t)},[g]),onDragOver:(0,b.useCallback)(({active:e,over:t})=>{if(!t)return;const a=String(e.id),n=String(t.id),s=u.current;if(!s)return;const o=findContainer(a,s),d=findContainer(n,s);if(!o||!d)return;let m;if(o===d){const e=s[o].affs,t=e.indexOf(a),c=e.indexOf(n);if(-1===t||-1===c||t===c)return;m=(0,i.produce)(s,a=>{a[o].affs=(0,l.arrayMove)(e,t,c)})}else m=(0,i.produce)(s,e=>{const t=e[o].affs,s=e[d].affs;if(-1===t.indexOf(a))return;const i=s.indexOf(n),l=-1===i?s.length:i;e[o].affs=t.filter(e=>e!==a),e[d].affs=[...s.slice(0,l),a,...s.slice(l)]});u.current=m,c(m)},[]),onDragEnd:(0,b.useCallback)(({active:e,over:t})=>{n(null);const a=u.current;if(u.current=null,c(null),!t||!a)return;const s=String(e.id),i=findContainer(s,a);if(!i)return;const o=a[i]?.priority??0;o!==(g[findContainer(s,g)]?.priority??0)&&p?.(s,o)},[g,p]),onDragCancel:(0,b.useCallback)(()=>{n(null),u.current=null,c(null)},[])}}var Ar={antimony:"olive",argentum:"royalblue",aurum:"ForestGreen",calcite:"slategray",cinnabar:"greenyellow",cuprum:"DeepSkyBlue",ferrum:"DarkOrange",magnesium:"Red",plumbum:"Gold",realgar:"firebrick",stannum:"Tan",caloric:"darkseagreen",mending:"orchid",epidermal:"sienna",restoration:"darkviolet",health:"lightpink",writhe:"PaleGoldenRod"},Er={ginseng:"ferrum",bloodroot:"magnesium",kelp:"aurum",hawthorn:"calamine",lobelia:"argentum",bellwort:"cuprum",ginger:"antimony",bayberry:"arsenic",ash:"stannum",goldenseal:"plumbum",pear:"calcite",elm:"cinnabar",valerian:"realgar",skullcap:"azurite",moss:"potash",kola:"quartz",sileris:"quicksilver",cohosh:"gypsum"};function resolveCureColor(e){if(e in Ar)return Ar[e]??null;const t=Er[e];if(t)return Ar[t]??null;const a=e.match(/^(caloric|mending|epidermal|restoration|health)\b/);return a?Ar[a[1]]??null:null}var wr=["bound","daeggerimpale","entangled","impaled","transfixation","webbed","icebound"],_r={};for(const[ss,is]of Object.entries(oe))for(const e of is){const t=resolveCureColor(e);if(t){_r[ss]=t;break}}for(const ss of wr)_r[ss]||(_r[ss]=Ar.writhe);function getAffColor(e){return _r[e]??null}function AffChip({name:e,isDragging:t=!1}){const a=getAffColor(e);return(0,mr.jsx)(n.Chip,{label:e,size:"small",sx:{fontSize:13,height:22,mb:.25,padding:.5,opacity:t?.4:1,cursor:"grab",bgcolor:"background.deep",color:a??"text.secondary",border:"1px solid",borderColor:a??"divider","& .MuiChip-label":{px:.75},"&:active":{cursor:"grabbing"}}})}function SortableAffChip({name:e}){const{attributes:t,listeners:a,setNodeRef:s,transform:i,transition:o,isDragging:u}=(0,l.useSortable)({id:e});return(0,mr.jsx)(n.Box,{ref:s,...t,...a,sx:{transform:c.CSS.Transform.toString(i),transition:o,touchAction:"none"},children:(0,mr.jsx)(AffChip,{name:e,isDragging:u})})}function PriorityColumn({column:e}){const t=0===e.priority,{setNodeRef:a}=(0,o.useDroppable)({id:e.id});return(0,mr.jsxs)(n.Box,{sx:{minWidth:125,maxWidth:125,border:"1px solid",borderColor:t?"divider":"border.strong",borderRadius:1,p:.5,bgcolor:t?"background.deep":"select.fill",flexShrink:0},children:[(0,mr.jsx)(n.Typography,{variant:"caption",sx:{display:"block",textAlign:"center",fontWeight:700,color:t?"text.secondary":"primary.main",mb:.5,fontSize:13},children:e.label}),(0,mr.jsx)(l.SortableContext,{items:e.affs,strategy:l.verticalListSortingStrategy,children:(0,mr.jsx)(n.Box,{ref:a,sx:{minHeight:28,display:"flex",flexDirection:"column"},children:e.affs.map(e=>(0,mr.jsx)(SortableAffChip,{name:e},e))})})]})}function AffPrioritiesTab({settingsForm:e}){const{columns:t,activeId:a,sensors:s,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u}=useAffPriorities(useNexSys(),e);return(0,mr.jsx)(n.Box,{sx:{py:1},children:(0,mr.jsx)(n.Box,{sx:{display:"inline-flex",gap:.75,alignItems:"flex-start"},children:(0,mr.jsxs)(o.DndContext,{sensors:s,collisionDetection:o.closestCorners,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u,children:[Object.keys(t).map(e=>(0,mr.jsx)(PriorityColumn,{column:t[e]},e)),(0,mr.jsx)(o.DragOverlay,{children:a?(0,mr.jsx)(AffChip,{name:a}):null})]})})})}function r(e){var t,a,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(a=r(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function clsx(){for(var e,t,a=0,n="",s=arguments.length;a<s;a++)(e=arguments[a])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}function composeClasses(e,t,a=void 0){const n={};for(const s in e){const i=e[s];let o="",l=!0;for(let e=0;e<i.length;e+=1){const n=i[e];n&&(o+=(!0===l?"":" ")+t(n),l=!1,a&&a[n]&&(o+=" "+a[n]))}n[s]=o}return n}function formatMuiErrorMessage(e,...t){const a=new URL(`https://mui.com/production-error/?code=${e}`);return t.forEach(e=>a.searchParams.append("args[]",e)),`Minified MUI error #${e}; visit ${a} for the full message.`}function capitalize$1(e){if("string"!=typeof e)throw new Error(formatMuiErrorMessage(7));return e.charAt(0).toUpperCase()+e.slice(1)}var Tr=capitalize$1;function fastDeepAssign(e,t){const a=Array.isArray(t),n=Array.isArray(e);return isPrimitive(t)?t:isPrimitiveOrBuiltIn(e)?clone(t):a&&n?mergeArray(e,t):a!==n?clone(t):mergeObject(e,t)}function cloneArray(e){let t=0;const a=e.length,n=new Array(a);for(t=0;t<a;t+=1)n[t]=clone(e[t]);return n}function cloneObject(e){const t={};for(const a in e)t[a]=clone(e[a]);return t}function mergeArray(e,t){const a=e.length;for(let n=0;n<t.length;n+=1)e[a+n]=clone(t[n]);return e}function isMergeableObject(e){return!("object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date)}function isPrimitive(e){return"object"!=typeof e||null===e}function isPrimitiveOrBuiltIn(e){return"object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date}function clone(e){return isMergeableObject(e)?Array.isArray(e)?cloneArray(e):cloneObject(e):e}function mergeObject(e,t){for(const a in t)e[a]=a in e?fastDeepAssign(e[a],t[a]):clone(t[a]);return e}function isObjectEmpty(e){if(null==e)return!0;for(const t in e)return!1;return!0}var Mr=__commonJSMin(e=>{Symbol.for("react.transitional.element"),Symbol.for("react.portal");var t=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),n=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),i=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.suspense_list"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),m=(Symbol.for("react.view_transition"),Symbol.for("react.client.reference"));e.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===t||e===n||e===a||e===l||e===c||"object"==typeof e&&null!==e&&(e.$$typeof===d||e.$$typeof===u||e.$$typeof===i||e.$$typeof===s||e.$$typeof===o||e.$$typeof===m||void 0!==e.getModuleId)}}),Pr=__commonJSMin((e,t)=>{t.exports=Mr()})();function isPlainObject(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}function deepClone(e){if(b.isValidElement(e)||(0,Pr.isValidElementType)(e)||!isPlainObject(e))return e;const t={};return Object.keys(e).forEach(a=>{t[a]=deepClone(e[a])}),t}function deepmerge(e,t,a={clone:!0}){const n=a.clone?{...e}:e;return isPlainObject(e)&&isPlainObject(t)&&Object.keys(t).forEach(s=>{b.isValidElement(t[s])||(0,Pr.isValidElementType)(t[s])?n[s]=t[s]:isPlainObject(t[s])&&Object.prototype.hasOwnProperty.call(e,s)&&isPlainObject(e[s])?n[s]=deepmerge(e[s],t[s],a):a.clone?n[s]=isPlainObject(t[s])?deepClone(t[s]):t[s]:n[s]=t[s]}),n}var Or=/min-width:\s*([0-9.]+)/;function sortContainerQueries(e,t){if(!e.containerQueries||!hasContainerQuery(t))return t;const a=[];for(const s in t)s.startsWith("@container")&&a.push(s);a.sort((e,t)=>+(e.match(Or)?.[1]||0)-+(t.match(Or)?.[1]||0));const n=t;for(let s=0;s<a.length;s+=1){const e=a[s],t=n[e];delete n[e],n[e]=t}return n}function hasContainerQuery(e){for(const t in e)if(t.startsWith("@container"))return!0;return!1}function isCqShorthand(e,t){return"@"===t||t.startsWith("@")&&(e.some(e=>t.startsWith(`@${e}`))||!!t.match(/^@\d/))}function getContainerQuery(e,t){const a=t.match(/^@([^/]+)?\/?(.+)?$/);if(!a)return null;const[,n,s]=a,i=Number.isNaN(+n)?n||0:+n;return e.containerQueries(s).up(i)}function cssContainerQueries(e){const toContainerQuery=(e,t)=>e.replace("@media",t?`@container ${t}`:"@container");function attachCq(t,a){t.up=(...t)=>toContainerQuery(e.breakpoints.up(...t),a),t.down=(...t)=>toContainerQuery(e.breakpoints.down(...t),a),t.between=(...t)=>toContainerQuery(e.breakpoints.between(...t),a),t.only=(...t)=>toContainerQuery(e.breakpoints.only(...t),a),t.not=(...t)=>{const n=toContainerQuery(e.breakpoints.not(...t),a);return n.includes("not all and")?n.replace("not all and ","").replace("min-width:","width<").replace("max-width:","width>").replace("and","or"):n}}const t={},containerQueries=e=>(attachCq(t,e),t);return attachCq(containerQueries),{...e,containerQueries}}var sortBreakpointsValues=e=>{const t=Object.keys(e).map(t=>({key:t,val:e[t]}))||[];return t.sort((e,t)=>e.val-t.val),t.reduce((e,t)=>({...e,[t.key]:t.val}),{})};function createBreakpoints(e){const{values:t={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:a="px",step:n=5,...s}=e,i=sortBreakpointsValues(t),o=Object.keys(i);function up(e){return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a})`}function down(e){return`@media (max-width:${("number"==typeof t[e]?t[e]:e)-n/100}${a})`}function between(e,s){const i=o.indexOf(s);return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a}) and (max-width:${(-1!==i&&"number"==typeof t[o[i]]?t[o[i]]:s)-n/100}${a})`}function only(e){return o.indexOf(e)+1<o.length?between(e,o[o.indexOf(e)+1]):up(e)}function not(e){const t=o.indexOf(e);return 0===t?up(o[1]):t===o.length-1?down(o[t]):between(e,o[o.indexOf(e)+1]).replace("@media","@media not all and")}const l=[];for(let c=0;c<o.length;c+=1)l.push(up(o[c]));return{keys:o,values:i,up,down,between,only,not,unit:a,internal_mediaKeys:l,...s}}var Dr={},Rr={xs:0,sm:600,md:900,lg:1200,xl:1536},Nr=createBreakpoints({values:Rr}),jr={containerQueries:e=>({up:t=>{let a="number"==typeof t?t:Rr[t]||t;return"number"==typeof a&&(a=`${a}px`),e?`@container ${e} (min-width:${a})`:`@container (min-width:${a})`}})};function handleBreakpoints(e,t,a){const n={};return iterateBreakpoints(n,e.theme,t,(e,t,s)=>{const i=a(t,s);e?n[e]=i:fastDeepAssign(n,i)})}function iterateBreakpoints(e,t,a,n){if(t??=Dr,Array.isArray(a)){const s=t.breakpoints??Nr;for(let t=0;t<a.length;t+=1)buildBreakpoint(e,s.up(s.keys[t]),a[t],void 0,n);return e}if("object"==typeof a){const s=t.breakpoints??Nr,i=s.values??Rr;for(const o in a)if(isCqShorthand(s.keys,o)){const s=getContainerQuery(t.containerQueries?t:jr,o);s&&buildBreakpoint(e,s,a[o],o,n)}else if(o in i)buildBreakpoint(e,s.up(o),a[o],o,n);else{const t=o;e[t]=a[t]}return e}return n(void 0,a),e}function buildBreakpoint(e,t,a,n,s){e[t]??={},s(t,a,n)}function createEmptyBreakpointObject(e=Nr){const{internal_mediaKeys:t}=e,a={};for(let n=0;n<t.length;n+=1)a[t[n]]={};return a}function removeUnusedBreakpoints(e,t){const a=e.internal_mediaKeys;for(let n=0;n<a.length;n+=1){const e=a[n];isObjectEmpty(t[e])&&delete t[e]}return t}function hasBreakpoint(e,t){if(Array.isArray(t))return!0;if("object"==typeof t&&null!==t){for(let n=0;n<e.keys.length;n+=1)if(e.keys[n]in t)return!0;const a=Object.keys(t);for(let t=0;t<a.length;t+=1)if(isCqShorthand(e.keys,a[t]))return!0}return!1}function getStyleValue2(e,t,a,n){let s;return s="function"==typeof e?e(a):Array.isArray(e)?e[a]||a:"string"==typeof a&&getPath(e,a,!0,n)||a,t&&(s=t(s,a,e)),s}function getPath(e,t,a=!0,n=void 0){if(!e||!t)return null;const s=t.split(".");if(e.vars&&a){const t=getPathImpl(e.vars,s,n);if(null!=t)return t}return getPathImpl(e,s,n)}function getPathImpl(e,t,a=void 0){let n,s=e,i=0;for(;i<t.length;){if(null==s)return s;n=s,s=s[t[i]],i+=1}if(a&&void 0===s){const e=t[t.length-1],s=`${a}${"default"===e?"":capitalize$1(e)}`;return n?.[s]}return s}function style$1(e){const{prop:t,cssProperty:a=e.prop,themeKey:n,transform:s}=e,fn=e=>{if(null==e[t])return null;const i=e[t],o=getPath(e.theme,n)||{};return handleBreakpoints(e,i,e=>{const n=getStyleValue2(o,s,e,t);return!1===a?n:{[a]:n}})};return fn.propTypes={},fn.filterProps=[t],fn}var Ir={internal_cache:{}},Lr={m:"margin",p:"padding"},qr={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},Br={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},$r={};for(const ss in Lr)$r[ss]=[Lr[ss]];for(const ss in Lr)for(const e in qr){const t=Lr[ss],a=qr[e],n=Array.isArray(a)?a.map(e=>t+e):[t+a];$r[ss+e]=n}for(const ss in Br)$r[ss]=$r[Br[ss]];var zr=new Set(["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"]),Fr=new Set(["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"]),Gr=new Set([...zr,...Fr]);function createUnaryUnit(e,t,a,n){const s=getPath(e,t,!0)??a;return"number"==typeof s||"string"==typeof s?e=>"string"==typeof e?e:"string"==typeof s?s.startsWith("var(")&&0===e?0:s.startsWith("var(")&&1===e?s:`calc(${e} * ${s})`:s*e:Array.isArray(s)?e=>{if("string"==typeof e)return e;const t=s[Math.abs(e)];return e>=0?t:"number"==typeof t?-t:"string"==typeof t&&t.startsWith("var(")?`calc(-1 * ${t})`:`-${t}`}:"function"==typeof s?s:()=>{}}function createUnarySpacing(e){return createUnaryUnit(e,"spacing",8,"spacing")}function getValue(e,t){return"string"==typeof t||null==t?t:e(t)}var Hr=[""];function style(e,t){const a=e.theme??Ir,n=a?.internal_cache?.unarySpacing??createUnarySpacing(a),s={};for(const i in e){if(!t.has(i))continue;const a=$r[i]??(Hr[0]=i,Hr),o=e[i];iterateBreakpoints(s,e.theme,o,(e,t)=>{const i=e?s[e]:s;for(let s=0;s<a.length;s+=1)i[a[s]]=getValue(n,t)})}return s}function margin(e){return style(e,zr)}function padding(e){return style(e,Fr)}function spacing(e){return style(e,Gr)}function compose(...e){const t=e.reduce((e,t)=>(t.filterProps.forEach(a=>{e[a]=t}),e),{}),fn=e=>{const a={};for(const n in e)t[n]&&fastDeepAssign(a,t[n](e));return a};return fn.propTypes={},fn.filterProps=e.reduce((e,t)=>e.concat(t.filterProps),[]),fn}function borderTransform(e){return"number"!=typeof e?e:`${e}px solid`}function createBorderStyle(e,t){return style$1({prop:e,themeKey:"borders",transform:t})}margin.propTypes={},margin.filterProps=zr,padding.propTypes={},padding.filterProps=Fr,spacing.propTypes={},spacing.filterProps=Gr;var Ur=createBorderStyle("border",borderTransform),Vr=createBorderStyle("borderTop",borderTransform),Yr=createBorderStyle("borderRight",borderTransform),Qr=createBorderStyle("borderBottom",borderTransform),Wr=createBorderStyle("borderLeft",borderTransform),Kr=createBorderStyle("borderColor"),Xr=createBorderStyle("borderTopColor"),Jr=createBorderStyle("borderRightColor"),Zr=createBorderStyle("borderBottomColor"),ea=createBorderStyle("borderLeftColor"),ta=createBorderStyle("outline",borderTransform),ra=createBorderStyle("outlineColor"),borderRadius=e=>{if(void 0!==e.borderRadius&&null!==e.borderRadius){const t=createUnaryUnit(e.theme,"shape.borderRadius",4,"borderRadius"),styleFromPropValue=e=>({borderRadius:getValue(t,e)});return handleBreakpoints(e,e.borderRadius,styleFromPropValue)}return null};borderRadius.propTypes={},borderRadius.filterProps=["borderRadius"];compose(Ur,Vr,Yr,Qr,Wr,Kr,Xr,Jr,Zr,ea,borderRadius,ta,ra);var gap=e=>{if(void 0!==e.gap&&null!==e.gap){const t=createUnaryUnit(e.theme,"spacing",8,"gap"),styleFromPropValue=e=>({gap:getValue(t,e)});return handleBreakpoints(e,e.gap,styleFromPropValue)}return null};gap.propTypes={},gap.filterProps=["gap"];var columnGap=e=>{if(void 0!==e.columnGap&&null!==e.columnGap){const t=createUnaryUnit(e.theme,"spacing",8,"columnGap"),styleFromPropValue=e=>({columnGap:getValue(t,e)});return handleBreakpoints(e,e.columnGap,styleFromPropValue)}return null};columnGap.propTypes={},columnGap.filterProps=["columnGap"];var rowGap=e=>{if(void 0!==e.rowGap&&null!==e.rowGap){const t=createUnaryUnit(e.theme,"spacing",8,"rowGap"),styleFromPropValue=e=>({rowGap:getValue(t,e)});return handleBreakpoints(e,e.rowGap,styleFromPropValue)}return null};rowGap.propTypes={},rowGap.filterProps=["rowGap"];compose(gap,columnGap,rowGap,style$1({prop:"gridColumn"}),style$1({prop:"gridRow"}),style$1({prop:"gridAutoFlow"}),style$1({prop:"gridAutoColumns"}),style$1({prop:"gridAutoRows"}),style$1({prop:"gridTemplateColumns"}),style$1({prop:"gridTemplateRows"}),style$1({prop:"gridTemplateAreas"}),style$1({prop:"gridArea"}));function paletteTransform(e,t){return"grey"===t?t:e}compose(style$1({prop:"color",themeKey:"palette",transform:paletteTransform}),style$1({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:paletteTransform}),style$1({prop:"backgroundColor",themeKey:"palette",transform:paletteTransform}));function sizingTransform(e){return e<=1&&0!==e?100*e+"%":e}var aa=style$1({prop:"width",transform:sizingTransform}),maxWidth=e=>{if(void 0!==e.maxWidth&&null!==e.maxWidth){const styleFromPropValue=t=>{const a=e.theme?.breakpoints?.values?.[t]||Rr[t];return a?"px"!==e.theme?.breakpoints?.unit?{maxWidth:`${a}${e.theme.breakpoints.unit}`}:{maxWidth:a}:{maxWidth:sizingTransform(t)}};return handleBreakpoints(e,e.maxWidth,styleFromPropValue)}return null};maxWidth.filterProps=["maxWidth"];var na=style$1({prop:"minWidth",transform:sizingTransform}),sa=style$1({prop:"height",transform:sizingTransform}),ia=style$1({prop:"maxHeight",transform:sizingTransform}),oa=style$1({prop:"minHeight",transform:sizingTransform}),la=(style$1({prop:"size",cssProperty:"width",transform:sizingTransform}),style$1({prop:"size",cssProperty:"height",transform:sizingTransform}),compose(aa,maxWidth,na,sa,ia,oa,style$1({prop:"boxSizing"})),{border:{themeKey:"borders",transform:borderTransform},borderTop:{themeKey:"borders",transform:borderTransform},borderRight:{themeKey:"borders",transform:borderTransform},borderBottom:{themeKey:"borders",transform:borderTransform},borderLeft:{themeKey:"borders",transform:borderTransform},borderColor:{themeKey:"palette"},borderTopColor:{themeKey:"palette"},borderRightColor:{themeKey:"palette"},borderBottomColor:{themeKey:"palette"},borderLeftColor:{themeKey:"palette"},outline:{themeKey:"borders",transform:borderTransform},outlineColor:{themeKey:"palette"},borderRadius:{themeKey:"shape.borderRadius",style:borderRadius},color:{themeKey:"palette",transform:paletteTransform},bgcolor:{themeKey:"palette",cssProperty:"backgroundColor",transform:paletteTransform},backgroundColor:{themeKey:"palette",transform:paletteTransform},p:{style:padding},pt:{style:padding},pr:{style:padding},pb:{style:padding},pl:{style:padding},px:{style:padding},py:{style:padding},padding:{style:padding},paddingTop:{style:padding},paddingRight:{style:padding},paddingBottom:{style:padding},paddingLeft:{style:padding},paddingX:{style:padding},paddingY:{style:padding},paddingInline:{style:padding},paddingInlineStart:{style:padding},paddingInlineEnd:{style:padding},paddingBlock:{style:padding},paddingBlockStart:{style:padding},paddingBlockEnd:{style:padding},m:{style:margin},mt:{style:margin},mr:{style:margin},mb:{style:margin},ml:{style:margin},mx:{style:margin},my:{style:margin},margin:{style:margin},marginTop:{style:margin},marginRight:{style:margin},marginBottom:{style:margin},marginLeft:{style:margin},marginX:{style:margin},marginY:{style:margin},marginInline:{style:margin},marginInlineStart:{style:margin},marginInlineEnd:{style:margin},marginBlock:{style:margin},marginBlockStart:{style:margin},marginBlockEnd:{style:margin},displayPrint:{cssProperty:!1,transform:e=>({"@media print":{display:e}})},display:{},overflow:{},textOverflow:{},visibility:{},whiteSpace:{},flexBasis:{},flexDirection:{},flexWrap:{},justifyContent:{},alignItems:{},alignContent:{},order:{},flex:{},flexGrow:{},flexShrink:{},alignSelf:{},justifyItems:{},justifySelf:{},gap:{style:gap},rowGap:{style:rowGap},columnGap:{style:columnGap},gridColumn:{},gridRow:{},gridAutoFlow:{},gridAutoColumns:{},gridAutoRows:{},gridTemplateColumns:{},gridTemplateRows:{},gridTemplateAreas:{},gridArea:{},position:{},zIndex:{themeKey:"zIndex"},top:{},right:{},bottom:{},left:{},boxShadow:{themeKey:"shadows"},width:{transform:sizingTransform},maxWidth:{style:maxWidth},minWidth:{transform:sizingTransform},height:{transform:sizingTransform},maxHeight:{transform:sizingTransform},minHeight:{transform:sizingTransform},boxSizing:{},font:{themeKey:"font"},fontFamily:{themeKey:"typography"},fontSize:{themeKey:"typography"},fontStyle:{themeKey:"typography"},fontWeight:{themeKey:"typography"},letterSpacing:{},textTransform:{},lineHeight:{},textAlign:{},typography:{cssProperty:!1,themeKey:"typography"}}),ca={};function unstable_createStyleFunctionSx(){function styleFunctionSx(e){if(!e.sx)return null;const{sx:t,theme:a=ca,nested:n}=e,s=a.unstable_sxConfig??la,i={sx:null,theme:a,nested:!0};function process(t){let o=t;if("function"==typeof t)o=t(a);else if("object"!=typeof t)return t;if(!o)return null;const l=a.breakpoints??Nr,c=createEmptyBreakpointObject(l);for(const n in o){const t=callIfFn(o[n],a);null!=t&&("object"==typeof t?s[n]?setThemeValue(c,n,t,a,s):hasBreakpoint(l,t)?iterateBreakpoints(c,e.theme,t,(e,t)=>{c[e][n]=t}):(i.sx=t,c[n]=styleFunctionSx(i)):setThemeValue(c,n,t,a,s))}return!n&&a.modularCssLayers?{"@layer sx":sortContainerQueries(a,removeUnusedBreakpoints(l,c))}:sortContainerQueries(a,removeUnusedBreakpoints(l,c))}return Array.isArray(t)?t.map(process):process(t)}return styleFunctionSx.filterProps=["sx"],styleFunctionSx}var ua=unstable_createStyleFunctionSx();function setThemeValue(e,t,a,n,s){const i=s[t];if(!i)return void(e[t]=a);if(null==a)return;const{themeKey:o}=i;if("typography"===o&&"inherit"===a)return void(e[t]=a);const{style:l}=i;if(l)return void fastDeepAssign(e,l({[t]:a,theme:n}));const{cssProperty:c=t,transform:u}=i,d=getPath(n,o);iterateBreakpoints(e,n,a,(a,n)=>{const s=getStyleValue2(d,u,n,t);!1===c?fastDeepAssign(a?e[a]:e,s):a?e[a][c]=s:e[c]=s})}function callIfFn(e,t){return"function"==typeof e?e(t):e}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)({}).hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},_extends.apply(null,arguments)}var da=!1;function sheetForTag(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]}function createStyleElement(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}var ma=function(){function StyleSheet(e){var t=this;this._insertTag=function(e){var a;a=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,a),t.tags.push(e)},this.isSpeedy=void 0===e.speedy?!da:e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var e=StyleSheet.prototype;return e.hydrate=function hydrate(e){e.forEach(this._insertTag)},e.insert=function insert(e){this.ctr%(this.isSpeedy?65e3:1)==0&&this._insertTag(createStyleElement(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var a=sheetForTag(t);try{a.insertRule(e,a.cssRules.length)}catch(n){}}else t.appendChild(document.createTextNode(e));this.ctr++},e.flush=function flush(){this.tags.forEach(function(e){var t;return null==(t=e.parentNode)?void 0:t.removeChild(e)}),this.tags=[],this.ctr=0},StyleSheet}(),pa="-ms-",ga="-moz-",fa="-webkit-",ha="comm",ba="rule",ya="decl",va="@import",Sa="@keyframes",xa="@layer",ka=Math.abs,Ca=String.fromCharCode,Aa=Object.assign;function hash(e,t){return 45^charat(e,0)?(((t<<2^charat(e,0))<<2^charat(e,1))<<2^charat(e,2))<<2^charat(e,3):0}function trim(e){return e.trim()}function match(e,t){return(e=t.exec(e))?e[0]:e}function replace(e,t,a){return e.replace(t,a)}function indexof(e,t){return e.indexOf(t)}function charat(e,t){return 0|e.charCodeAt(t)}function substr(e,t,a){return e.slice(t,a)}function strlen(e){return e.length}function sizeof(e){return e.length}function append(e,t){return t.push(e),e}function combine(e,t){return e.map(t).join("")}var Ea=1,wa=1,_a=0,Ta=0,Ma=0,Pa="";function node(e,t,a,n,s,i,o){return{value:e,root:t,parent:a,type:n,props:s,children:i,line:Ea,column:wa,length:o,return:""}}function copy(e,t){return Aa(node("",null,null,"",null,null,0),e,{length:-e.length},t)}function char(){return Ma}function prev(){return Ma=Ta>0?charat(Pa,--Ta):0,wa--,10===Ma&&(wa=1,Ea--),Ma}function next(){return Ma=Ta<_a?charat(Pa,Ta++):0,wa++,10===Ma&&(wa=1,Ea++),Ma}function peek(){return charat(Pa,Ta)}function caret(){return Ta}function slice(e,t){return substr(Pa,e,t)}function token(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function alloc(e){return Ea=wa=1,_a=strlen(Pa=e),Ta=0,[]}function dealloc(e){return Pa="",e}function delimit(e){return trim(slice(Ta-1,delimiter(91===e?e+2:40===e?e+1:e)))}function whitespace(e){for(;(Ma=peek())&&Ma<33;)next();return token(e)>2||token(Ma)>3?"":" "}function escaping(e,t){for(;--t&&next()&&!(Ma<48||Ma>102||Ma>57&&Ma<65||Ma>70&&Ma<97););return slice(e,caret()+(t<6&&32==peek()&&32==next()))}function delimiter(e){for(;next();)switch(Ma){case e:return Ta;case 34:case 39:34!==e&&39!==e&&delimiter(Ma);break;case 40:41===e&&delimiter(e);break;case 92:next()}return Ta}function commenter(e,t){for(;next()&&e+Ma!==57&&(e+Ma!==84||47!==peek()););return"/*"+slice(t,Ta-1)+"*"+Ca(47===e?e:next())}function identifier(e){for(;!token(peek());)next();return slice(e,Ta)}function compile(e){return dealloc(parse("",null,null,null,[""],e=alloc(e),0,[0],e))}function parse(e,t,a,n,s,i,o,l,c){for(var u=0,d=0,m=o,p=0,g=0,h=0,b=1,y=1,v=1,S=0,x="",k=s,C=i,A=n,E=x;y;)switch(h=S,S=next()){case 40:if(108!=h&&58==charat(E,m-1)){-1!=indexof(E+=replace(delimit(S),"&","&\f"),"&\f")&&(v=-1);break}case 34:case 39:case 91:E+=delimit(S);break;case 9:case 10:case 13:case 32:E+=whitespace(h);break;case 92:E+=escaping(caret()-1,7);continue;case 47:switch(peek()){case 42:case 47:append(comment(commenter(next(),caret()),t,a),c);break;default:E+="/"}break;case 123*b:l[u++]=strlen(E)*v;case 125*b:case 59:case 0:switch(S){case 0:case 125:y=0;case 59+d:-1==v&&(E=replace(E,/\f/g,"")),g>0&&strlen(E)-m&&append(g>32?declaration(E+";",n,a,m-1):declaration(replace(E," ","")+";",n,a,m-2),c);break;case 59:E+=";";default:if(append(A=ruleset(E,t,a,u,d,s,l,x,k=[],C=[],m),i),123===S)if(0===d)parse(E,t,A,A,k,i,m,l,C);else switch(99===p&&110===charat(E,3)?100:p){case 100:case 108:case 109:case 115:parse(e,A,A,n&&append(ruleset(e,A,A,0,0,s,l,x,s,k=[],m),C),s,C,m,l,n?k:C);break;default:parse(E,A,A,A,[""],C,0,l,C)}}u=d=g=0,b=v=1,x=E="",m=o;break;case 58:m=1+strlen(E),g=h;default:if(b<1)if(123==S)--b;else if(125==S&&0==b++&&125==prev())continue;switch(E+=Ca(S),S*b){case 38:v=d>0?1:(E+="\f",-1);break;case 44:l[u++]=(strlen(E)-1)*v,v=1;break;case 64:45===peek()&&(E+=delimit(next())),p=peek(),d=m=strlen(x=E+=identifier(caret())),S++;break;case 45:45===h&&2==strlen(E)&&(b=0)}}return i}function ruleset(e,t,a,n,s,i,o,l,c,u,d){for(var m=s-1,p=0===s?i:[""],g=sizeof(p),h=0,b=0,y=0;h<n;++h)for(var v=0,S=substr(e,m+1,m=ka(b=o[h])),x=e;v<g;++v)(x=trim(b>0?p[v]+" "+S:replace(S,/&\f/g,p[v])))&&(c[y++]=x);return node(e,t,a,0===s?ba:l,c,u,d)}function comment(e,t,a){return node(e,t,a,ha,Ca(char()),substr(e,2,-2),0)}function declaration(e,t,a,n){return node(e,t,a,ya,substr(e,0,n),substr(e,n+1,-1),n)}function serialize(e,t){for(var a="",n=sizeof(e),s=0;s<n;s++)a+=t(e[s],s,e,t)||"";return a}function stringify(e,t,a,n){switch(e.type){case xa:if(e.children.length)break;case va:case ya:return e.return=e.return||e.value;case ha:return"";case Sa:return e.return=e.value+"{"+serialize(e.children,n)+"}";case ba:e.value=e.props.join(",")}return strlen(a=serialize(e.children,n))?e.return=e.value+"{"+a+"}":""}function middleware(e){var t=sizeof(e);return function(a,n,s,i){for(var o="",l=0;l<t;l++)o+=e[l](a,n,s,i)||"";return o}}function rulesheet(e){return function(t){t.root||(t=t.return)&&e(t)}}function memoize(e){var t=Object.create(null);return function(a){return void 0===t[a]&&(t[a]=e(a)),t[a]}}var Oa=function identifierWithPointTracking(e,t,a){for(var n=0,s=0;n=s,s=peek(),38===n&&12===s&&(t[a]=1),!token(s);)next();return slice(e,Ta)},Da=function toRules(e,t){var a=-1,n=44;do{switch(token(n)){case 0:38===n&&12===peek()&&(t[a]=1),e[a]+=Oa(Ta-1,t,a);break;case 2:e[a]+=delimit(n);break;case 4:if(44===n){e[++a]=58===peek()?"&\f":"",t[a]=e[a].length;break}default:e[a]+=Ca(n)}}while(n=next());return e},Ra=function getRules(e,t){return dealloc(Da(alloc(e),t))},Na=new WeakMap,ja=function compat(e){if("rule"===e.type&&e.parent&&!(e.length<1)){for(var t=e.value,a=e.parent,n=e.column===a.column&&e.line===a.line;"rule"!==a.type;)if(!(a=a.parent))return;if((1!==e.props.length||58===t.charCodeAt(0)||Na.get(a))&&!n){Na.set(e,!0);for(var s=[],i=Ra(t,s),o=a.props,l=0,c=0;l<i.length;l++)for(var u=0;u<o.length;u++,c++)e.props[c]=s[l]?i[l].replace(/&\f/g,o[u]):o[u]+" "+i[l]}}},Ia=function removeLabel(e){if("decl"===e.type){var t=e.value;108===t.charCodeAt(0)&&98===t.charCodeAt(2)&&(e.return="",e.value="")}};function prefix(e,t){switch(hash(e,t)){case 5103:return fa+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return fa+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return fa+e+ga+e+pa+e+e;case 6828:case 4268:return fa+e+pa+e+e;case 6165:return fa+e+pa+"flex-"+e+e;case 5187:return fa+e+replace(e,/(\w+).+(:[^]+)/,fa+"box-$1$2"+pa+"flex-$1$2")+e;case 5443:return fa+e+pa+"flex-item-"+replace(e,/flex-|-self/,"")+e;case 4675:return fa+e+pa+"flex-line-pack"+replace(e,/align-content|flex-|-self/,"")+e;case 5548:return fa+e+pa+replace(e,"shrink","negative")+e;case 5292:return fa+e+pa+replace(e,"basis","preferred-size")+e;case 6060:return fa+"box-"+replace(e,"-grow","")+fa+e+pa+replace(e,"grow","positive")+e;case 4554:return fa+replace(e,/([^-])(transform)/g,"$1"+fa+"$2")+e;case 6187:return replace(replace(replace(e,/(zoom-|grab)/,fa+"$1"),/(image-set)/,fa+"$1"),e,"")+e;case 5495:case 3959:return replace(e,/(image-set\([^]*)/,fa+"$1$`$1");case 4968:return replace(replace(e,/(.+:)(flex-)?(.*)/,fa+"box-pack:$3"+pa+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+fa+e+e;case 4095:case 3583:case 4068:case 2532:return replace(e,/(.+)-inline(.+)/,fa+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(strlen(e)-1-t>6)switch(charat(e,t+1)){case 109:if(45!==charat(e,t+4))break;case 102:return replace(e,/(.+:)(.+)-([^]+)/,"$1"+fa+"$2-$3$1"+ga+(108==charat(e,t+3)?"$3":"$2-$3"))+e;case 115:return~indexof(e,"stretch")?prefix(replace(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(115!==charat(e,t+1))break;case 6444:switch(charat(e,strlen(e)-3-(~indexof(e,"!important")&&10))){case 107:return replace(e,":",":"+fa)+e;case 101:return replace(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+fa+(45===charat(e,14)?"inline-":"")+"box$3$1"+fa+"$2$3$1"+pa+"$2box$3")+e}break;case 5936:switch(charat(e,t+11)){case 114:return fa+e+pa+replace(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return fa+e+pa+replace(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return fa+e+pa+replace(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return fa+e+pa+e+e}return e}var La=[function prefixer(e,t,a,n){if(e.length>-1&&!e.return)switch(e.type){case ya:e.return=prefix(e.value,e.length);break;case Sa:return serialize([copy(e,{value:replace(e.value,"@","@"+fa)})],n);case ba:if(e.length)return combine(e.props,function(t){switch(match(t,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return serialize([copy(e,{props:[replace(t,/:(read-\w+)/,":"+ga+"$1")]})],n);case"::placeholder":return serialize([copy(e,{props:[replace(t,/:(plac\w+)/,":"+fa+"input-$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,":"+ga+"$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,pa+"input-$1")]})],n)}return""})}}],qa=function createCache(e){var t=e.key;if("css"===t){var a=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(a,function(e){-1!==e.getAttribute("data-emotion").indexOf(" ")&&(document.head.appendChild(e),e.setAttribute("data-s",""))})}var n,s,i=e.stylisPlugins||La,o={},l=[];n=e.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+t+' "]'),function(e){for(var t=e.getAttribute("data-emotion").split(" "),a=1;a<t.length;a++)o[t[a]]=!0;l.push(e)});var c,u=[ja,Ia],d=[stringify,rulesheet(function(e){c.insert(e)})],m=middleware(u.concat(i,d)),p=function stylis(e){return serialize(compile(e),m)};s=function insert(e,t,a,n){c=a,p(e?e+"{"+t.styles+"}":t.styles),n&&(g.inserted[t.name]=!0)};var g={key:t,sheet:new ma({key:t,container:n,nonce:e.nonce,speedy:e.speedy,prepend:e.prepend,insertionPoint:e.insertionPoint}),nonce:e.nonce,inserted:o,registered:{},insert:s};return g.sheet.hydrate(l),g},Ba=!0;function getRegisteredStyles(e,t,a){var n="";return a.split(" ").forEach(function(a){void 0!==e[a]?t.push(e[a]+";"):a&&(n+=a+" ")}),n}var $a=function registerStyles(e,t,a){var n=e.key+"-"+t.name;!1!==a&&!1!==Ba||void 0!==e.registered[n]||(e.registered[n]=t.styles)},za=function insertStyles(e,t,a){$a(e,t,a);var n=e.key+"-"+t.name;if(void 0===e.inserted[t.name]){var s=t;do{e.insert(t===s?"."+n:"",s,e.sheet,!0),s=s.next}while(void 0!==s)}};function murmur2(e){for(var t,a=0,n=0,s=e.length;s>=4;++n,s-=4)t=1540483477*(65535&(t=255&e.charCodeAt(n)|(255&e.charCodeAt(++n))<<8|(255&e.charCodeAt(++n))<<16|(255&e.charCodeAt(++n))<<24))+(59797*(t>>>16)<<16),a=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&a)+(59797*(a>>>16)<<16);switch(s){case 3:a^=(255&e.charCodeAt(n+2))<<16;case 2:a^=(255&e.charCodeAt(n+1))<<8;case 1:a=1540483477*(65535&(a^=255&e.charCodeAt(n)))+(59797*(a>>>16)<<16)}return(((a=1540483477*(65535&(a^=a>>>13))+(59797*(a>>>16)<<16))^a>>>15)>>>0).toString(36)}var Fa={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,scale:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Ga=!1,Ha=/[A-Z]|^ms/g,Ua=/_EMO_([^_]+?)_([^]*?)_EMO_/g,Va=function isCustomProperty(e){return 45===e.charCodeAt(1)},Ya=function isProcessableValue(e){return null!=e&&"boolean"!=typeof e},Qa=memoize(function(e){return Va(e)?e:e.replace(Ha,"-$&").toLowerCase()}),Wa=function processStyleValue(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(Ua,function(e,t,a){return Xa={name:t,styles:a,next:Xa},t})}return 1===Fa[e]||Va(e)||"number"!=typeof t||0===t?t:t+"px"},Ka="Component selectors can only be used in conjunction with @emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware compiler transform.";function handleInterpolation(e,t,a){if(null==a)return"";var n=a;if(void 0!==n.__emotion_styles)return n;switch(typeof a){case"boolean":return"";case"object":var s=a;if(1===s.anim)return Xa={name:s.name,styles:s.styles,next:Xa},s.name;var i=a;if(void 0!==i.styles){var o=i.next;if(void 0!==o)for(;void 0!==o;)Xa={name:o.name,styles:o.styles,next:Xa},o=o.next;return i.styles+";"}return createStringFromObject(e,t,a);case"function":if(void 0!==e){var l=Xa,c=a(e);return Xa=l,handleInterpolation(e,t,c)}}var u=a;if(null==t)return u;var d=t[u];return void 0!==d?d:u}function createStringFromObject(e,t,a){var n="";if(Array.isArray(a))for(var s=0;s<a.length;s++)n+=handleInterpolation(e,t,a[s])+";";else for(var i in a){var o=a[i];if("object"!=typeof o){var l=o;null!=t&&void 0!==t[l]?n+=i+"{"+t[l]+"}":Ya(l)&&(n+=Qa(i)+":"+Wa(i,l)+";")}else{if("NO_COMPONENT_SELECTOR"===i&&Ga)throw new Error(Ka);if(!Array.isArray(o)||"string"!=typeof o[0]||null!=t&&void 0!==t[o[0]]){var c=handleInterpolation(e,t,o);switch(i){case"animation":case"animationName":n+=Qa(i)+":"+c+";";break;default:n+=i+"{"+c+"}"}}else for(var u=0;u<o.length;u++)Ya(o[u])&&(n+=Qa(i)+":"+Wa(i,o[u])+";")}}return n}var Xa,Ja=/label:\s*([^\s;{]+)\s*(;|$)/g;function serializeStyles(e,t,a){if(1===e.length&&"object"==typeof e[0]&&null!==e[0]&&void 0!==e[0].styles)return e[0];var n=!0,s="";Xa=void 0;var i=e[0];null==i||void 0===i.raw?(n=!1,s+=handleInterpolation(a,t,i)):s+=i[0];for(var o=1;o<e.length;o++)s+=handleInterpolation(a,t,e[o]),n&&(s+=i[o]);Ja.lastIndex=0;for(var l,c="";null!==(l=Ja.exec(s));)c+="-"+l[1];return{name:murmur2(s)+c,styles:s,next:Xa}}var Za=function syncFallback(e){return e()},en=!!a.useInsertionEffect&&a.useInsertionEffect,tn=en||Za,rn=(en||a.useLayoutEffect,a.createContext("undefined"!=typeof HTMLElement?qa({key:"css"}):null)),an=(rn.Provider,function withEmotionCache(e){return(0,a.forwardRef)(function(t,n){return e(t,(0,a.useContext)(rn),n)})}),nn=a.createContext({}),sn=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,ln=!1,cn=memoize(function(e){return sn.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91}),un=function testOmitPropsOnComponent(e){return"theme"!==e},dn=function getDefaultShouldForwardProp(e){return"string"==typeof e&&e.charCodeAt(0)>96?cn:un},mn=function composeShouldForwardProps(e,t,a){var n;if(t){var s=t.shouldForwardProp;n=e.__emotion_forwardProp&&s?function(t){return e.__emotion_forwardProp(t)&&s(t)}:s}return"function"!=typeof n&&a&&(n=e.__emotion_forwardProp),n},pn=function Insertion(e){var t=e.cache,a=e.serialized,n=e.isStringTag;return $a(t,a,n),tn(function(){return za(t,a,n)}),null},gn=function createStyled(e,t){var n,s,i=e.__emotion_real===e,o=i&&e.__emotion_base||e;void 0!==t&&(n=t.label,s=t.target);var l=mn(e,t,i),c=l||dn(o),u=!c("as");return function(){var d=arguments,m=i&&void 0!==e.__emotion_styles?e.__emotion_styles.slice(0):[];if(void 0!==n&&m.push("label:"+n+";"),null==d[0]||void 0===d[0].raw)m.push.apply(m,d);else{var p=d[0];m.push(p[0]);for(var g=d.length,h=1;h<g;h++)m.push(d[h],p[h])}var b=an(function(e,t,n){var i=u&&e.as||o,d="",p=[],g=e;if(null==e.theme){for(var h in g={},e)g[h]=e[h];g.theme=a.useContext(nn)}"string"==typeof e.className?d=getRegisteredStyles(t.registered,p,e.className):null!=e.className&&(d=e.className+" ");var b=serializeStyles(m.concat(p),t.registered,g);d+=t.key+"-"+b.name,void 0!==s&&(d+=" "+s);var y=u&&void 0===l?dn(i):c,v={};for(var S in e)u&&"as"===S||y(S)&&(v[S]=e[S]);return v.className=d,n&&(v.ref=n),a.createElement(a.Fragment,null,a.createElement(pn,{cache:t,serialized:b,isStringTag:"string"==typeof i}),a.createElement(i,v))});return b.displayName=void 0!==n?n:"Styled("+("string"==typeof o?o:o.displayName||o.name||"Component")+")",b.defaultProps=e.defaultProps,b.__emotion_real=b,b.__emotion_base=o,b.__emotion_styles=m,b.__emotion_forwardProp=l,Object.defineProperty(b,"toString",{value:function value(){return void 0===s&&ln?"NO_COMPONENT_SELECTOR":"."+s}}),b.withComponent=function(e,a){return createStyled(e,_extends({},t,a,{shouldForwardProp:mn(b,a,!0)})).apply(void 0,m)},b}},hn=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"],bn=gn.bind(null);function styled$1(e,t){return bn(e,t)}function internal_mutateStyles(e,t){Array.isArray(e.__emotion_styles)&&(e.__emotion_styles=t(e.__emotion_styles))}hn.forEach(function(e){bn[e]=bn(e)});var yn=[];function internal_serializeStyles(e){return yn[0]=e,serializeStyles(yn)}var vn={borderRadius:4};function createSpacing(e=8,t=createUnarySpacing({spacing:e})){if(e.mui)return e;const spacing=(...e)=>(0===e.length?[1]:e).map(e=>{const a=t(e);return"number"==typeof a?`${a}px`:a}).join(" ");return spacing.mui=!0,spacing}function applyStyles(e,t){const a=this;if(a.vars){if(!a.colorSchemes?.[e]||"function"!=typeof a.getColorSchemeSelector)return{};let n=a.getColorSchemeSelector(e);return"&"===n?t:((n.includes("data-")||n.includes("."))&&(n=`*:where(${n.replace(/\s*&$/,"")}) &`),{[n]:t})}return a.palette.mode===e?t:{}}function createTheme$1(e={},...t){const{breakpoints:a={},palette:n={},spacing:s,shape:i={},...o}=e;let l=deepmerge({breakpoints:createBreakpoints(a),direction:"ltr",components:{},palette:{mode:"light",...n},spacing:createSpacing(s),shape:{...vn,...i}},o);return l=cssContainerQueries(l),l.applyStyles=applyStyles,l=t.reduce((e,t)=>deepmerge(e,t),l),l.unstable_sxConfig={...la,...o?.unstable_sxConfig},l.unstable_sx=function sx(e){return ua({sx:e,theme:this})},l.internal_cache={},l}var defaultGenerator=e=>e,Sn=(()=>{let e=defaultGenerator;return{configure(t){e=t},generate:t=>e(t),reset(){e=defaultGenerator}}})(),xn={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",open:"open",readOnly:"readOnly",required:"required",selected:"selected"};function generateUtilityClass(e,t,a="Mui"){const n=xn[t];return n?`${a}-${n}`:`${Sn.generate(e)}-${t}`}function generateUtilityClasses(e,t,a="Mui"){const n={};return t.forEach(t=>{n[t]=generateUtilityClass(e,t,a)}),n}function preprocessStyles(e){const{variants:t,...a}=e,n={variants:t,style:internal_serializeStyles(a),isProcessed:!0};return n.style===a||t&&t.forEach(e=>{"function"!=typeof e.style&&(e.style=internal_serializeStyles(e.style))}),n}var kn=createTheme$1();function shouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}function shallowLayer(e,t){return t&&e&&"object"==typeof e&&e.styles&&!e.styles.startsWith("@layer")&&(e.styles=`@layer ${t}{${String(e.styles)}}`),e}function defaultOverridesResolver(e){return e?(t,a)=>a[e]:null}function attachTheme(e,t,a){e.theme=isObjectEmpty(e.theme)?a:e.theme[t]||e.theme}function processStyle(e,t,a){const n="function"==typeof t?t(e):t;if(Array.isArray(n))return n.flatMap(t=>processStyle(e,t,a));if(Array.isArray(n?.variants)){let t;if(n.isProcessed)t=a?shallowLayer(n.style,a):n.style;else{const{variants:e,...s}=n;t=a?shallowLayer(internal_serializeStyles(s),a):s}return processStyleVariants(e,n.variants,[t],a)}return n?.isProcessed?a?shallowLayer(internal_serializeStyles(n.style),a):n.style:a?shallowLayer(internal_serializeStyles(n),a):n}function processStyleVariants(e,t,a=[],n=void 0){let s;e:for(let i=0;i<t.length;i+=1){const o=t[i];if("function"==typeof o.props){if(s??={...e,...e.ownerState,ownerState:e.ownerState},!o.props(s))continue}else for(const t in o.props)if(e[t]!==o.props[t]&&e.ownerState?.[t]!==o.props[t])continue e;"function"==typeof o.style?(s??={...e,...e.ownerState,ownerState:e.ownerState},a.push(n?shallowLayer(internal_serializeStyles(o.style(s)),n):o.style(s))):a.push(n?shallowLayer(internal_serializeStyles(o.style),n):o.style)}return a}function createStyled(e={}){const{themeId:t,defaultTheme:a=kn,rootShouldForwardProp:n=shouldForwardProp,slotShouldForwardProp:s=shouldForwardProp}=e;function styleAttachTheme(e){attachTheme(e,t,a)}const styled=(e,t={})=>{internal_mutateStyles(e,e=>e.filter(e=>e!==ua));const{name:a,slot:i,skipVariantsResolver:o,skipSx:l,overridesResolver:c=defaultOverridesResolver(lowercaseFirstLetter(i)),...u}=t,d=a&&a.startsWith("Mui")||i?"components":"custom",m=void 0!==o?o:i&&"Root"!==i&&"root"!==i||!1,p=l||!1;let g=shouldForwardProp;"Root"===i||"root"===i?g=n:i?g=s:isStringTag(e)&&(g=void 0);const h=styled$1(e,{shouldForwardProp:g,label:generateStyledLabel(a,i),...u}),transformStyle=e=>{if(e.__emotion_real===e)return e;if("function"==typeof e)return function styleFunctionProcessor(t){return processStyle(t,e,t.theme.modularCssLayers?d:void 0)};if(isPlainObject(e)){const t=preprocessStyles(e);return function styleObjectProcessor(e){return t.variants?processStyle(e,t,e.theme.modularCssLayers?d:void 0):e.theme.modularCssLayers?shallowLayer(t.style,d):t.style}}return e},muiStyledResolver=(...t)=>{const n=[],s=t.map(transformStyle),i=[];if(n.push(styleAttachTheme),a&&c&&i.push(function styleThemeOverrides(e){const t=e.theme.components?.[a]?.styleOverrides;if(!t)return null;const n={};for(const a in t)n[a]=processStyle(e,t[a],e.theme.modularCssLayers?"theme":void 0);return c(e,n)}),a&&!m&&i.push(function styleThemeVariants(e){const t=e.theme?.components?.[a]?.variants;return t?processStyleVariants(e,t,[],e.theme.modularCssLayers?"theme":void 0):null}),p||i.push(ua),Array.isArray(s[0])){const e=s.shift(),t=new Array(n.length).fill(""),a=new Array(i.length).fill("");let o;o=[...t,...e,...a],o.raw=[...t,...e.raw,...a],n.unshift(o)}const o=h(...n,...s,...i);return e.muiName&&(o.muiName=e.muiName),o};return h.withConfig&&(muiStyledResolver.withConfig=h.withConfig),muiStyledResolver};return styled}function generateStyledLabel(e,t){let a;return a}function isStringTag(e){return"string"==typeof e&&e.charCodeAt(0)>96}function lowercaseFirstLetter(e){return e?e.charAt(0).toLowerCase()+e.slice(1):e}function resolveProps(e,t,a=!1){const n={...t};for(const s in e)if(Object.prototype.hasOwnProperty.call(e,s)){const i=s;if("components"===i||"slots"===i)n[i]={...e[i],...n[i]};else if("componentsProps"===i||"slotProps"===i){const s=e[i],o=t[i];if(o)if(s){n[i]={...o};for(const e in s)if(Object.prototype.hasOwnProperty.call(s,e)){const t=e;n[i][t]=resolveProps(s[t],o[t],a)}}else n[i]=o;else n[i]=s||{}}else"className"===i&&a&&void 0!==t.className?n.className=clsx(e?.className,t?.className):"style"===i&&a&&t.style?n.style={...e?.style,...t?.style}:void 0===n[i]&&(n[i]=e[i])}return n}function clamp(e,t=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER){return Math.max(t,Math.min(e,a))}function clampWrapper(e,t=0,a=1){return clamp(e,t,a)}function hexToRgb(e){e=e.slice(1);const t=new RegExp(`.{1,${e.length>=6?2:1}}`,"g");let a=e.match(t);return a&&1===a[0].length&&(a=a.map(e=>e+e)),a?`rgb${4===a.length?"a":""}(${a.map((e,t)=>t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3).join(", ")})`:""}function decomposeColor(e){if(e.type)return e;if("#"===e.charAt(0))return decomposeColor(hexToRgb(e));const t=e.indexOf("("),a=e.substring(0,t);if(!["rgb","rgba","hsl","hsla","color"].includes(a))throw new Error(formatMuiErrorMessage(9,e));let n,s=e.substring(t+1,e.length-1);if("color"===a){if(s=s.split(" "),n=s.shift(),4===s.length&&"/"===s[3].charAt(0)&&(s[3]=s[3].slice(1)),!["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].includes(n))throw new Error(formatMuiErrorMessage(10,n))}else s=s.split(",");return s=s.map(e=>parseFloat(e)),{type:a,values:s,colorSpace:n}}var colorChannel=e=>{const t=decomposeColor(e);return t.values.slice(0,3).map((e,a)=>t.type.includes("hsl")&&0!==a?`${e}%`:e).join(" ")},private_safeColorChannel=(e,t)=>{try{return colorChannel(e)}catch(a){return e}};function recomposeColor(e){const{type:t,colorSpace:a}=e;let{values:n}=e;return t.includes("rgb")?n=n.map((e,t)=>t<3?parseInt(e,10):e):t.includes("hsl")&&(n[1]=`${n[1]}%`,n[2]=`${n[2]}%`),n=t.includes("color")?`${a} ${n.join(" ")}`:`${n.join(", ")}`,`${t}(${n})`}function hslToRgb(e){e=decomposeColor(e);const{values:t}=e,a=t[0],n=t[1]/100,s=t[2]/100,i=n*Math.min(s,1-s),f=(e,t=(e+a/30)%12)=>s-i*Math.max(Math.min(t-3,9-t,1),-1);let o="rgb";const l=[Math.round(255*f(0)),Math.round(255*f(8)),Math.round(255*f(4))];return"hsla"===e.type&&(o+="a",l.push(t[3])),recomposeColor({type:o,values:l})}function getLuminance(e){let t="hsl"===(e=decomposeColor(e)).type||"hsla"===e.type?decomposeColor(hslToRgb(e)).values:e.values;return t=t.map(t=>("color"!==e.type&&(t/=255),t<=.03928?t/12.92:((t+.055)/1.055)**2.4)),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function getContrastRatio(e,t){const a=getLuminance(e),n=getLuminance(t);return(Math.max(a,n)+.05)/(Math.min(a,n)+.05)}function alpha(e,t){return e=decomposeColor(e),t=clampWrapper(t),"rgb"!==e.type&&"hsl"!==e.type||(e.type+="a"),"color"===e.type?e.values[3]=`/${t}`:e.values[3]=t,recomposeColor(e)}function private_safeAlpha(e,t,a){try{return alpha(e,t)}catch(n){return e}}function darken(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]*=1-t;else if(e.type.includes("rgb")||e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]*=1-t;return recomposeColor(e)}function private_safeDarken(e,t,a){try{return darken(e,t)}catch(n){return e}}function lighten(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]+=(100-e.values[2])*t;else if(e.type.includes("rgb"))for(let a=0;a<3;a+=1)e.values[a]+=(255-e.values[a])*t;else if(e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]+=(1-e.values[a])*t;return recomposeColor(e)}function private_safeLighten(e,t,a){try{return lighten(e,t)}catch(n){return e}}function emphasize(e,t=.15){return getLuminance(e)>.5?darken(e,t):lighten(e,t)}function private_safeEmphasize(e,t,a){try{return emphasize(e,t)}catch(n){return e}}var Cn=b.createContext(void 0);function getThemeProps(e){const{theme:t,name:a,props:n}=e;if(!t||!t.components||!t.components[a])return n;const s=t.components[a];return s.defaultProps?resolveProps(s.defaultProps,n,t.components.mergeClassNameAndStyle):s.styleOverrides||s.variants?n:resolveProps(s,n,t.components.mergeClassNameAndStyle)}function useDefaultProps$1({props:e,name:t}){return getThemeProps({props:e,name:t,theme:{components:b.useContext(Cn)}})}var An={theme:void 0};function unstable_memoTheme(e){let t,a;return function styleMemoized(n){let s=t;return void 0!==s&&n.theme===a||(An.theme=n.theme,s=preprocessStyles(e(An)),t=s,a=n.theme),s}}function createGetCssVar$1(e=""){function appendVar(...t){if(!t.length)return"";const a=t[0];return"string"!=typeof a||a.match(/(#|\(|\)|(-?(\d*\.)?\d+)(px|em|%|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc))|^(-?(\d*\.)?\d+)$|(\d+ \d+ \d+)/)?`, ${a}`:`, var(--${e?`${e}-`:""}${a}${appendVar(...t.slice(1))})`}return(t,...a)=>`var(--${e?`${e}-`:""}${t}${appendVar(...a)})`}var assignNestedKeys=(e,t,a,n=[])=>{let s=e;t.forEach((e,i)=>{i===t.length-1?Array.isArray(s)?s[Number(e)]=a:s&&"object"==typeof s&&(s[e]=a):s&&"object"==typeof s&&(s[e]||(s[e]=n.includes(e)?[]:{}),s=s[e])})},walkObjectDeep=(e,t,a)=>{function recurse(e,n=[],s=[]){Object.entries(e).forEach(([e,i])=>{(!a||a&&!a([...n,e]))&&null!=i&&("object"==typeof i&&Object.keys(i).length>0?recurse(i,[...n,e],Array.isArray(i)?[...s,e]:s):t([...n,e],i,s))})}recurse(e)},getCssValue=(e,t)=>"number"==typeof t?["lineHeight","fontWeight","opacity","zIndex"].some(t=>e.includes(t))||e[e.length-1].toLowerCase().includes("opacity")?t:`${t}px`:t;function cssVarsParser(e,t){const{prefix:a,shouldSkipGeneratingVar:n}=t||{},s={},i={},o={};return walkObjectDeep(e,(e,t,l)=>{if(!("string"!=typeof t&&"number"!=typeof t||n&&n(e,t))){const n=`--${a?`${a}-`:""}${e.join("-")}`,c=getCssValue(e,t);Object.assign(s,{[n]:c}),assignNestedKeys(i,e,`var(${n})`,l),assignNestedKeys(o,e,`var(${n}, ${c})`,l)}},e=>"vars"===e[0]),{css:s,vars:i,varsWithDefaults:o}}function prepareCssVars(e,t={}){const{getSelector:a=defaultGetSelector,disableCssColorScheme:n,colorSchemeSelector:s,enableContrastVars:i}=t,{colorSchemes:o={},components:l,defaultColorScheme:c="light",...u}=e,{vars:d,css:m,varsWithDefaults:p}=cssVarsParser(u,t);let g=p;const h={},{[c]:b,...y}=o;if(Object.entries(y||{}).forEach(([e,a])=>{const{vars:n,css:s,varsWithDefaults:i}=cssVarsParser(a,t);g=deepmerge(g,i),h[e]={css:s,vars:n}}),b){const{css:e,vars:a,varsWithDefaults:n}=cssVarsParser(b,t);g=deepmerge(g,n),h[c]={css:e,vars:a}}function defaultGetSelector(t,a){let n=s;if("class"===s&&(n=".%s"),"data"===s&&(n="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(n=`[${s}="%s"]`),t){if("media"===n)return e.defaultColorScheme===t?":root":{[`@media (prefers-color-scheme: ${o[t]?.palette?.mode||t})`]:{":root":a}};if(n)return e.defaultColorScheme===t?`:root, ${n.replace("%s",String(t))}`:n.replace("%s",String(t))}return":root"}return{vars:g,generateThemeVars:()=>{let e={...d};return Object.entries(h).forEach(([,{vars:t}])=>{e=deepmerge(e,t)}),e},generateStyleSheets:()=>{const t=[],s=e.defaultColorScheme||"light";function insertStyleSheet(e,a){Object.keys(a).length&&t.push("string"==typeof e?{[e]:{...a}}:e)}insertStyleSheet(a(void 0,{...m}),m);const{[s]:l,...c}=h;if(l){const{css:e}=l,t=o[s]?.palette?.mode,i=!n&&t?{colorScheme:t,...e}:{...e};insertStyleSheet(a(s,{...i}),i)}return Object.entries(c).forEach(([e,{css:t}])=>{const s=o[e]?.palette?.mode,i=!n&&s?{colorScheme:s,...t}:{...t};insertStyleSheet(a(e,{...i}),i)}),i&&t.push({":root":{"--__l-threshold":"0.7","--__l":"clamp(0, (l / var(--__l-threshold) - 1) * -infinity, 1)","--__a":"clamp(0.87, (l / var(--__l-threshold) - 1) * -infinity, 1)"}}),t}}}function createGetColorSchemeSelector(e){return function getColorSchemeSelector(t){return"media"===e?`@media (prefers-color-scheme: ${t})`:e?e.startsWith("data-")&&!e.includes("%s")?`[${e}="${t}"] &`:"class"===e?`.${t} &`:"data"===e?`[data-${t}] &`:`${e.replace("%s",t)} &`:"&"}}var En={black:"#000",white:"#fff"},wn={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},_n={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},Tn={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},Mn={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},Pn={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},On={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},Dn={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"};function getLight(){return{text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:En.white,default:En.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}}}var Rn=getLight();function getDark(){return{text:{primary:En.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:En.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}}}var Nn=getDark();function addLightOrDark(e,t,a,n){const s=n.light||n,i=n.dark||1.5*n;e[t]||(e.hasOwnProperty(a)?e[t]=e[a]:"light"===t?e.light=lighten(e.main,s):"dark"===t&&(e.dark=darken(e.main,i)))}function mixLightOrDark(e,t,a,n,s){const i=s.light||s,o=s.dark||1.5*s;t[a]||(t.hasOwnProperty(n)?t[a]=t[n]:"light"===a?t.light=`color-mix(in ${e}, ${t.main}, #fff ${(100*i).toFixed(0)}%)`:"dark"===a&&(t.dark=`color-mix(in ${e}, ${t.main}, #000 ${(100*o).toFixed(0)}%)`))}function getDefaultPrimary(e="light"){return"dark"===e?{main:Pn[200],light:Pn[50],dark:Pn[400]}:{main:Pn[700],light:Pn[400],dark:Pn[800]}}function getDefaultSecondary(e="light"){return"dark"===e?{main:_n[200],light:_n[50],dark:_n[400]}:{main:_n[500],light:_n[300],dark:_n[700]}}function getDefaultError(e="light"){return"dark"===e?{main:Tn[500],light:Tn[300],dark:Tn[700]}:{main:Tn[700],light:Tn[400],dark:Tn[800]}}function getDefaultInfo(e="light"){return"dark"===e?{main:On[400],light:On[300],dark:On[700]}:{main:On[700],light:On[500],dark:On[900]}}function getDefaultSuccess(e="light"){return"dark"===e?{main:Dn[400],light:Dn[300],dark:Dn[700]}:{main:Dn[800],light:Dn[500],dark:Dn[900]}}function getDefaultWarning(e="light"){return"dark"===e?{main:Mn[400],light:Mn[300],dark:Mn[700]}:{main:"#ed6c02",light:Mn[500],dark:Mn[900]}}function contrastColor(e){return`oklch(from ${e} var(--__l) 0 h / var(--__a))`}function createPalette(e){const{mode:t="light",contrastThreshold:a=3,tonalOffset:n=.2,colorSpace:s,...i}=e,o=e.primary||getDefaultPrimary(t),l=e.secondary||getDefaultSecondary(t),c=e.error||getDefaultError(t),u=e.info||getDefaultInfo(t),d=e.success||getDefaultSuccess(t),m=e.warning||getDefaultWarning(t);function getContrastText(e){return s?contrastColor(e):getContrastRatio(e,Nn.text.primary)>=a?Nn.text.primary:Rn.text.primary}const augmentColor=({color:e,name:t,mainShade:a=500,lightShade:i=300,darkShade:o=700})=>{if(!(e={...e}).main&&e[a]&&(e.main=e[a]),!e.hasOwnProperty("main"))throw new Error(formatMuiErrorMessage(11,t?` (${t})`:"",a));if("string"!=typeof e.main)throw new Error(formatMuiErrorMessage(12,t?` (${t})`:"",JSON.stringify(e.main)));return s?(mixLightOrDark(s,e,"light",i,n),mixLightOrDark(s,e,"dark",o,n)):(addLightOrDark(e,"light",i,n),addLightOrDark(e,"dark",o,n)),e.contrastText||(e.contrastText=getContrastText(e.main)),e};let p;return"light"===t?p=getLight():"dark"===t&&(p=getDark()),deepmerge({common:{...En},mode:t,primary:augmentColor({color:o,name:"primary"}),secondary:augmentColor({color:l,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:augmentColor({color:c,name:"error"}),warning:augmentColor({color:m,name:"warning"}),info:augmentColor({color:u,name:"info"}),success:augmentColor({color:d,name:"success"}),grey:wn,contrastThreshold:a,getContrastText,augmentColor,tonalOffset:n,...p},i)}function prepareTypographyVars(e){const t={};return Object.entries(e).forEach(e=>{const[a,n]=e;"object"==typeof n&&(t[a]=`${n.fontStyle?`${n.fontStyle} `:""}${n.fontVariant?`${n.fontVariant} `:""}${n.fontWeight?`${n.fontWeight} `:""}${n.fontStretch?`${n.fontStretch} `:""}${n.fontSize||""}${n.lineHeight?`/${n.lineHeight} `:""}${n.fontFamily||""}`)}),t}function createMixins(e,t){return{toolbar:{minHeight:56,[e.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[e.up("sm")]:{minHeight:64}},...t}}function round(e){return Math.round(1e5*e)/1e5}var jn={textTransform:"uppercase"},In='"Roboto", "Helvetica", "Arial", sans-serif';function createTypography(e,t){const{fontFamily:a=In,fontSize:n=14,fontWeightLight:s=300,fontWeightRegular:i=400,fontWeightMedium:o=500,fontWeightBold:l=700,htmlFontSize:c=16,allVariants:u,pxToRem:d,...m}="function"==typeof t?t(e):t,p=n/14,g=d||(e=>e/c*p+"rem"),buildVariant=(e,t,n,s,i)=>({fontFamily:a,fontWeight:e,fontSize:g(t),lineHeight:n,...a===In?{letterSpacing:`${round(s/t)}em`}:{},...i,...u});return deepmerge({htmlFontSize:c,pxToRem:g,fontFamily:a,fontSize:n,fontWeightLight:s,fontWeightRegular:i,fontWeightMedium:o,fontWeightBold:l,h1:buildVariant(s,96,1.167,-1.5),h2:buildVariant(s,60,1.2,-.5),h3:buildVariant(i,48,1.167,0),h4:buildVariant(i,34,1.235,.25),h5:buildVariant(i,24,1.334,0),h6:buildVariant(o,20,1.6,.15),subtitle1:buildVariant(i,16,1.75,.15),subtitle2:buildVariant(o,14,1.57,.1),body1:buildVariant(i,16,1.5,.15),body2:buildVariant(i,14,1.43,.15),button:buildVariant(o,14,1.75,.4,jn),caption:buildVariant(i,12,1.66,.4),overline:buildVariant(i,12,2.66,1,jn),inherit:{fontFamily:"inherit",fontWeight:"inherit",fontSize:"inherit",lineHeight:"inherit",letterSpacing:"inherit"}},m,{clone:!1})}var Ln=.2,qn=.14,Bn=.12;function createShadow(...e){return[`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,${Ln})`,`${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,${qn})`,`${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,${Bn})`].join(",")}var $n=["none",createShadow(0,2,1,-1,0,1,1,0,0,1,3,0),createShadow(0,3,1,-2,0,2,2,0,0,1,5,0),createShadow(0,3,3,-2,0,3,4,0,0,1,8,0),createShadow(0,2,4,-1,0,4,5,0,0,1,10,0),createShadow(0,3,5,-1,0,5,8,0,0,1,14,0),createShadow(0,3,5,-1,0,6,10,0,0,1,18,0),createShadow(0,4,5,-2,0,7,10,1,0,2,16,1),createShadow(0,5,5,-3,0,8,10,1,0,3,14,2),createShadow(0,5,6,-3,0,9,12,1,0,3,16,2),createShadow(0,6,6,-3,0,10,14,1,0,4,18,3),createShadow(0,6,7,-4,0,11,15,1,0,4,20,3),createShadow(0,7,8,-4,0,12,17,2,0,5,22,4),createShadow(0,7,8,-4,0,13,19,2,0,5,24,4),createShadow(0,7,9,-4,0,14,21,2,0,5,26,4),createShadow(0,8,9,-5,0,15,22,2,0,6,28,5),createShadow(0,8,10,-5,0,16,24,2,0,6,30,5),createShadow(0,8,11,-5,0,17,26,2,0,6,32,5),createShadow(0,9,11,-5,0,18,28,2,0,7,34,6),createShadow(0,9,12,-6,0,19,29,2,0,7,36,6),createShadow(0,10,13,-6,0,20,31,3,0,8,38,7),createShadow(0,10,13,-6,0,21,33,3,0,8,40,7),createShadow(0,10,14,-6,0,22,35,3,0,8,42,7),createShadow(0,11,14,-7,0,23,36,3,0,9,44,8),createShadow(0,11,15,-7,0,24,38,3,0,9,46,8)],zn={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},Fn={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function formatMs(e){return`${Math.round(e)}ms`}function getAutoHeightDuration(e){if(!e)return 0;const t=e/36;return Math.min(Math.round(10*(4+15*t**.25+t/5)),3e3)}function createTransitions(e){const t={...zn,...e.easing},a={...Fn,...e.duration};return{getAutoHeightDuration,create:(e=["all"],n={})=>{const{duration:s=a.standard,easing:i=t.easeInOut,delay:o=0,...l}=n;return(Array.isArray(e)?e:[e]).map(e=>`${e} ${"string"==typeof s?s:formatMs(s)} ${i} ${"string"==typeof o?o:formatMs(o)}`).join(",")},...e,easing:t,duration:a}}var Gn={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500};function isSerializable(e){return isPlainObject(e)||void 0===e||"string"==typeof e||"boolean"==typeof e||"number"==typeof e||Array.isArray(e)}function stringifyTheme(e={}){const t={...e};function serializeTheme(e){const t=Object.entries(e);for(let a=0;a<t.length;a++){const[n,s]=t[a];!isSerializable(s)||n.startsWith("unstable_")||n.startsWith("internal_")?delete e[n]:isPlainObject(s)&&(e[n]={...s},serializeTheme(e[n]))}}return serializeTheme(t),`import { unstable_createBreakpoints as createBreakpoints, createTransitions } from '@mui/material/styles';\n\nconst theme = ${JSON.stringify(t,null,2)};\n\ntheme.breakpoints = createBreakpoints(theme.breakpoints || {});\ntheme.transitions = createTransitions(theme.transitions || {});\n\nexport default theme;`}function coefficientToPercentage(e){return"number"==typeof e?`${(100*e).toFixed(0)}%`:`calc((${e}) * 100%)`}var parseAddition=e=>{if(!Number.isNaN(+e))return+e;const t=e.match(/\d*\.?\d+/g);if(!t)return 0;let a=0;for(let n=0;n<t.length;n+=1)a+=+t[n];return a};function attachColorManipulators(e){Object.assign(e,{alpha(t,a){const n=this||e;return n.colorSpace?`oklch(from ${t} l c h / ${"string"==typeof a?`calc(${a})`:a})`:n.vars?`rgba(${t.replace(/var\(--([^,\s)]+)(?:,[^)]+)?\)+/g,"var(--$1Channel)")} / ${"string"==typeof a?`calc(${a})`:a})`:alpha(t,parseAddition(a))},lighten(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #fff ${coefficientToPercentage(a)})`:lighten(t,a)},darken(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #000 ${coefficientToPercentage(a)})`:darken(t,a)}})}function createThemeNoVars(e={},...t){const{breakpoints:a,mixins:n={},spacing:s,palette:i={},transitions:o={},typography:l={},shape:c,colorSpace:u,...d}=e;if(e.vars&&void 0===e.generateThemeVars)throw new Error(formatMuiErrorMessage(22));const m=createPalette({...i,colorSpace:u}),p=createTheme$1(e);let g=deepmerge(p,{mixins:createMixins(p.breakpoints,n),palette:m,shadows:$n.slice(),typography:createTypography(m,l),transitions:createTransitions(o),zIndex:{...Gn}});return g=deepmerge(g,d),g=t.reduce((e,t)=>deepmerge(e,t),g),g.unstable_sxConfig={...la,...d?.unstable_sxConfig},g.unstable_sx=function sx(e){return ua({sx:e,theme:this})},g.toRuntimeSource=stringifyTheme,attachColorManipulators(g),g}function getOverlayAlpha(e){let t;return t=e<1?5.11916*e**2:4.5*Math.log(e+1)+2,Math.round(10*t)/1e3}var Hn=[...Array(25)].map((e,t)=>{if(0===t)return"none";const a=getOverlayAlpha(t);return`linear-gradient(rgba(255 255 255 / ${a}), rgba(255 255 255 / ${a}))`});function getOpacity(e){return{inputPlaceholder:"dark"===e?.5:.42,inputUnderline:"dark"===e?.7:.42,switchTrackDisabled:"dark"===e?.2:.12,switchTrack:"dark"===e?.3:.38}}function getOverlays(e){return"dark"===e?Hn:[]}function createColorScheme(e){const{palette:t={mode:"light"},opacity:a,overlays:n,colorSpace:s,...i}=e,o=createPalette({...t,colorSpace:s});return{palette:o,opacity:{...getOpacity(o.mode),...a},overlays:n||getOverlays(o.mode),...i}}function shouldSkipGeneratingVar(e){return!!e[0].match(/(cssVarPrefix|colorSchemeSelector|modularCssLayers|rootSelector|typography|mixins|breakpoints|direction|transitions)/)||!!e[0].match(/sxConfig$/)||"palette"===e[0]&&!!e[1]?.match(/(mode|contrastThreshold|tonalOffset)/)}var excludeVariablesFromRoot=e=>[...[...Array(25)].map((t,a)=>`--${e?`${e}-`:""}overlays-${a}`),`--${e?`${e}-`:""}palette-AppBar-darkBg`,`--${e?`${e}-`:""}palette-AppBar-darkColor`],createGetSelector_default=e=>(t,a)=>{const n=e.rootSelector||":root",s=e.colorSchemeSelector;let i=s;if("class"===s&&(i=".%s"),"data"===s&&(i="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(i=`[${s}="%s"]`),e.defaultColorScheme===t){if("dark"===t){const s={};return excludeVariablesFromRoot(e.cssVarPrefix).forEach(e=>{s[e]=a[e],delete a[e]}),"media"===i?{[n]:a,"@media (prefers-color-scheme: dark)":{[n]:s}}:i?{[i.replace("%s",t)]:s,[`${n}, ${i.replace("%s",t)}`]:a}:{[n]:{...a,...s}}}if(i&&"media"!==i)return`${n}, ${i.replace("%s",String(t))}`}else if(t){if("media"===i)return{[`@media (prefers-color-scheme: ${String(t)})`]:{[n]:a}};if(i)return i.replace("%s",String(t))}return n};function assignNode(e,t){t.forEach(t=>{e[t]||(e[t]={})})}function setColor(e,t,a){!e[t]&&a&&(e[t]=a)}function toRgb(e){return"string"==typeof e&&e.startsWith("hsl")?hslToRgb(e):e}function setColorChannel(e,t){`${t}Channel`in e||(e[`${t}Channel`]=private_safeColorChannel(toRgb(e[t]),`MUI: Can't create \`palette.${t}Channel\` because \`palette.${t}\` is not one of these formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().\nTo suppress this warning, you need to explicitly provide the \`palette.${t}Channel\` as a string (in rgb format, for example "12 12 12") or undefined if you want to remove the channel token.`))}function getSpacingVal(e){return"number"==typeof e?`${e}px`:"string"==typeof e||"function"==typeof e||Array.isArray(e)?e:"8px"}var silent=e=>{try{return e()}catch(t){}},createGetCssVar=(e="mui")=>createGetCssVar$1(e);function attachColorScheme$1(e,t,a,n,s){if(!a)return;a=!0===a?{}:a;const i="dark"===s?"dark":"light";if(!n)return void(t[s]=createColorScheme({...a,palette:{mode:i,...a?.palette},colorSpace:e}));const{palette:o,...l}=createThemeNoVars({...n,palette:{mode:i,...a?.palette},colorSpace:e});return t[s]={...a,palette:o,opacity:{...getOpacity(i),...a?.opacity},overlays:a?.overlays||getOverlays(i)},l}function createThemeWithVars(e={},...t){const{colorSchemes:a={light:!0},defaultColorScheme:n,disableCssColorScheme:s=!1,cssVarPrefix:i="mui",nativeColor:o=!1,shouldSkipGeneratingVar:l=shouldSkipGeneratingVar,colorSchemeSelector:c=(a.light&&a.dark?"media":void 0),rootSelector:u=":root",...d}=e,m=Object.keys(a)[0],p=n||(a.light&&"light"!==m?"light":m),g=createGetCssVar(i),{[p]:h,light:b,dark:y,...v}=a,S={...v};let x,k=h;if(("dark"===p&&!("dark"in a)||"light"===p&&!("light"in a))&&(k=!0),!k)throw new Error(formatMuiErrorMessage(21,p));o&&(x="oklch");const C=attachColorScheme$1(x,S,k,d,p);b&&!S.light&&attachColorScheme$1(x,S,b,void 0,"light"),y&&!S.dark&&attachColorScheme$1(x,S,y,void 0,"dark");let A={defaultColorScheme:p,...C,cssVarPrefix:i,colorSchemeSelector:c,rootSelector:u,getCssVar:g,colorSchemes:S,font:{...prepareTypographyVars(C.typography),...C.font},spacing:getSpacingVal(d.spacing)};Object.keys(A.colorSchemes).forEach(e=>{const t=A.colorSchemes[e].palette,setCssVarColor=e=>{const a=e.split("-"),n=a[1],s=a[2];return g(e,t[n][s])};function colorMix(e,t,a){if(x){let n;return e===private_safeAlpha&&(n=`transparent ${(100*(1-a)).toFixed(0)}%`),e===private_safeDarken&&(n=`#000 ${(100*a).toFixed(0)}%`),e===private_safeLighten&&(n=`#fff ${(100*a).toFixed(0)}%`),`color-mix(in ${x}, ${t}, ${n})`}return e(t,a)}if("light"===t.mode&&(setColor(t.common,"background","#fff"),setColor(t.common,"onBackground","#000")),"dark"===t.mode&&(setColor(t.common,"background","#000"),setColor(t.common,"onBackground","#fff")),assignNode(t,["Alert","AppBar","Avatar","Button","Chip","FilledInput","LinearProgress","Skeleton","Slider","SnackbarContent","SpeedDialAction","StepConnector","StepContent","Switch","TableCell","Tooltip"]),"light"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-main")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-main")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.main))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.main))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.main))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.main))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-100")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-400")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-300")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-A100")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-400")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-700")),setColor(t.FilledInput,"bg","rgba(0, 0, 0, 0.06)"),setColor(t.FilledInput,"hoverBg","rgba(0, 0, 0, 0.09)"),setColor(t.FilledInput,"disabledBg","rgba(0, 0, 0, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.LinearProgress,"successBg",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.main,.62)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.11):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.11)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Slider,"errorTrack",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Slider,"infoTrack",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Slider,"successTrack",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Slider,"warningTrack",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62));const e=x?colorMix(private_safeDarken,o?g("palette-background-default"):t.background.default,.6825):private_safeEmphasize(t.background.default,.8);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?Nn.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-400")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-400")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-common-white")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-100")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62)),setColor(t.TableCell,"border",colorMix(private_safeLighten,private_safeAlpha(o?g("palette-divider"):t.divider,1),.88)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}if("dark"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-dark")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-dark")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-dark")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-dark")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.dark))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.dark))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.dark))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.dark))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-900")),setColor(t.AppBar,"darkBg",setCssVarColor("palette-background-paper")),setColor(t.AppBar,"darkColor",setCssVarColor("palette-text-primary")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-600")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-800")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-300")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-300")),setColor(t.FilledInput,"bg","rgba(255, 255, 255, 0.09)"),setColor(t.FilledInput,"hoverBg","rgba(255, 255, 255, 0.13)"),setColor(t.FilledInput,"disabledBg","rgba(255, 255, 255, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.LinearProgress,"successBg",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeDarken,o?g("palette-warning-main"):t.warning.main,.5)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.13):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.13)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.Slider,"errorTrack",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.Slider,"infoTrack",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.Slider,"successTrack",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.Slider,"warningTrack",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.5));const e=x?colorMix(private_safeLighten,o?g("palette-background-default"):t.background.default,.985):private_safeEmphasize(t.background.default,.98);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?Rn.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-600")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-600")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-grey-300")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-600")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.55)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.55)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.55)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.55)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.55)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.55)),setColor(t.TableCell,"border",colorMix(private_safeDarken,private_safeAlpha(o?g("palette-divider"):t.divider,1),.68)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}o||(setColorChannel(t.background,"default"),setColorChannel(t.background,"paper"),setColorChannel(t.common,"background"),setColorChannel(t.common,"onBackground"),setColorChannel(t,"divider")),Object.keys(t).forEach(e=>{const a=t[e];"tonalOffset"!==e&&!o&&a&&"object"==typeof a&&(a.main&&setColor(t[e],"mainChannel",private_safeColorChannel(toRgb(a.main))),a.light&&setColor(t[e],"lightChannel",private_safeColorChannel(toRgb(a.light))),a.dark&&setColor(t[e],"darkChannel",private_safeColorChannel(toRgb(a.dark))),a.contrastText&&setColor(t[e],"contrastTextChannel",private_safeColorChannel(toRgb(a.contrastText))),"text"===e&&(setColorChannel(t[e],"primary"),setColorChannel(t[e],"secondary")),"action"===e&&(a.active&&setColorChannel(t[e],"active"),a.selected&&setColorChannel(t[e],"selected")))})}),A=t.reduce((e,t)=>deepmerge(e,t),A);const E={prefix:i,disableCssColorScheme:s,shouldSkipGeneratingVar:l,getSelector:createGetSelector_default(A),enableContrastVars:o},{vars:w,generateThemeVars:_,generateStyleSheets:T}=prepareCssVars(A,E);return A.vars=w,Object.entries(A.colorSchemes[A.defaultColorScheme]).forEach(([e,t])=>{A[e]=t}),A.generateThemeVars=_,A.generateStyleSheets=T,A.generateSpacing=function generateSpacing(){return createSpacing(d.spacing,createUnarySpacing(this))},A.getColorSchemeSelector=createGetColorSchemeSelector(c),A.spacing=A.generateSpacing(),A.shouldSkipGeneratingVar=l,A.unstable_sxConfig={...la,...d?.unstable_sxConfig},A.unstable_sx=function sx(e){return ua({sx:e,theme:this})},A.internal_cache={},A.toRuntimeSource=stringifyTheme,A}function attachColorScheme(e,t,a){e.colorSchemes&&a&&(e.colorSchemes[t]={...!0!==a&&a,palette:createPalette({...!0===a?{}:a.palette,mode:t})})}function createTheme(e={},...t){const{palette:a,cssVariables:n=!1,colorSchemes:s=(a?void 0:{light:!0}),defaultColorScheme:i=a?.mode,...o}=e,l=i||"light",c=s?.[l],u={...s,...a?{[l]:{..."boolean"!=typeof c&&c,palette:a}}:void 0};if(!1===n){if(!("colorSchemes"in e))return createThemeNoVars(e,...t);let n=a;"palette"in e||u[l]&&(!0!==u[l]?n=u[l].palette:"dark"===l&&(n={mode:"dark"}));const s=createThemeNoVars({...e,palette:n},...t);return s.defaultColorScheme=l,s.colorSchemes=u,"light"===s.palette.mode&&(s.colorSchemes.light={...!0!==u.light&&u.light,palette:s.palette},attachColorScheme(s,"dark",u.dark)),"dark"===s.palette.mode&&(s.colorSchemes.dark={...!0!==u.dark&&u.dark,palette:s.palette},attachColorScheme(s,"light",u.light)),s}return a||"light"in u||"light"!==l||(u.light=!0),createThemeWithVars({...o,colorSchemes:u,defaultColorScheme:l,..."boolean"!=typeof n&&n},...t)}function slotShouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}var Un=createStyled({themeId:"$$material",defaultTheme:createTheme(),rootShouldForwardProp:e=>slotShouldForwardProp(e)&&"classes"!==e}),Vn=unstable_memoTheme;function useDefaultProps(e){return useDefaultProps$1(e)}function getSvgIconUtilityClass(e){return generateUtilityClass("MuiSvgIcon",e)}generateUtilityClasses("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);var useUtilityClasses=e=>{const{color:t,fontSize:a,classes:n}=e;return composeClasses({root:["root","inherit"!==t&&`color${Tr(t)}`,`fontSize${Tr(a)}`]},getSvgIconUtilityClass,n)},Yn=Un("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,"inherit"!==a.color&&t[`color${Tr(a.color)}`],t[`fontSize${Tr(a.fontSize)}`]]}})(Vn(({theme:e})=>({userSelect:"none",width:"1em",height:"1em",display:"inline-block",flexShrink:0,transition:e.transitions?.create?.("fill",{duration:(e.vars??e).transitions?.duration?.shorter}),variants:[{props:e=>!e.hasSvgAsChild,style:{fill:"currentColor"}},{props:{fontSize:"inherit"},style:{fontSize:"inherit"}},{props:{fontSize:"small"},style:{fontSize:e.typography?.pxToRem?.(20)||"1.25rem"}},{props:{fontSize:"medium"},style:{fontSize:e.typography?.pxToRem?.(24)||"1.5rem"}},{props:{fontSize:"large"},style:{fontSize:e.typography?.pxToRem?.(35)||"2.1875rem"}},...Object.entries((e.vars??e).palette).filter(([,e])=>e&&e.main).map(([t])=>({props:{color:t},style:{color:(e.vars??e).palette?.[t]?.main}})),{props:{color:"action"},style:{color:(e.vars??e).palette?.action?.active}},{props:{color:"disabled"},style:{color:(e.vars??e).palette?.action?.disabled}},{props:{color:"inherit"},style:{color:void 0}}]}))),Qn=b.forwardRef(function SvgIcon(e,t){const a=useDefaultProps({props:e,name:"MuiSvgIcon"}),{children:n,className:s,color:i="inherit",component:o="svg",fontSize:l="medium",htmlColor:c,inheritViewBox:u=!1,titleAccess:d,viewBox:m="0 0 24 24",...p}=a,g=b.isValidElement(n)&&"svg"===n.type,h={...a,color:i,component:o,fontSize:l,instanceFontSize:e.fontSize,inheritViewBox:u,viewBox:m,hasSvgAsChild:g},y={};return u||(y.viewBox=m),(0,mr.jsxs)(Yn,{as:o,className:clsx(useUtilityClasses(h).root,s),focusable:"false",color:c,"aria-hidden":!d||void 0,role:d?"img":void 0,ref:t,...y,...p,...g&&n.props,ownerState:h,children:[g?n.props.children:n,d?(0,mr.jsx)("title",{children:d}):null]})});function createSvgIcon(e,t){function Component(t,a){return(0,mr.jsx)(Qn,{"data-testid":void 0,ref:a,...t,children:e})}return Component.muiName=Qn.muiName,b.memo(b.forwardRef(Component))}Qn.muiName="SvgIcon";var Wn=createSvgIcon((0,mr.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25"}),"HelpOutlined"),Kn=Object.freeze({}),Xn=Object.freeze({}),getDefaultClassFilter=(e="")=>{const t=normalizeClassName(e);return Ze.includes(t)?t:"all"};function useDefPriorities(e,t={}){const a=useNexSysSnapshot(e)??Kn,n=a.defs??Xn,s=a.system?.char?.class??"",{defPriorities:i=Xn,defStatics:o=Xn,setDefPriority:l,setDefStatic:c}=t,u=(0,b.useMemo)(()=>getDefaultClassFilter(s),[s]),[d,m]=(0,b.useState)(null),p=d??u,g=(0,b.useMemo)(()=>["all",...Ze],[]),h=(0,b.useMemo)(()=>Object.entries(n).reduce((e,[t,a])=>(e[t]={...a,defaultPriority:i[t]??a.defaultPriority,static:o[t]??a.static},e),{}),[n,i,o]),y=(0,b.useMemo)(()=>Object.entries(h).filter(([,e])=>!e.trackOnly&&e.command?.length>0),[h]),v=(0,b.useMemo)(()=>"all"===p?y.map(([e])=>e):y.filter(([,e])=>classListIncludes(e.skills,p)).map(([e])=>e),[y,p]),S=(0,b.useCallback)((e,t)=>{c?.(e,t)},[c]),x=(0,b.useCallback)((e,t)=>{l?.(e,t)},[l]);return{defList:v,defsState:h,classFilter:p,setClassFilter:(0,b.useCallback)(e=>{m(e)},[]),classOptions:g,updateStatic:S,updatePriority:x}}function defNameColor(e){const t=e?.bals_used??[],a=e?.bals_req??[],n=["balance","equilibrium"];return t.some(e=>n.includes(e))?"error.main":a.some(e=>n.includes(e))?"warning.main":"success.main"}var Jn=(0,mr.jsxs)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:[(0,mr.jsxs)(n.Box,{children:[(0,mr.jsx)(n.Box,{component:"span",sx:{color:"error.main",fontWeight:700},children:"Consumes balance"}),": These skills use eq or bal to activate and should have the lowest priority."]}),(0,mr.jsxs)(n.Box,{children:[(0,mr.jsx)(n.Box,{component:"span",sx:{color:"warning.main",fontWeight:700},children:"Requires balance"}),": These skills are free to use but require eq or bal to activate and should have the middle priority."]}),(0,mr.jsxs)(n.Box,{children:[(0,mr.jsx)(n.Box,{component:"span",sx:{color:"success.main",fontWeight:700},children:"Free action"}),": These skills are free to use and should likely have the highest priority."]})]}),Zn=(0,mr.jsx)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:"Checked defences are player-controlled and only raised by the manual defence-up action. Unchecked defences are kept up automatically by nexSys (via server-side curing, or by nexSys issuing the command directly for client-planned defences)."}),es={py:.25,px:.75,border:"none"},ts={py:.5,px:.75,border:"none",borderBottom:"1px solid",borderColor:"divider",bgcolor:"background.panel",color:"text.primary",fontWeight:700,fontSize:13,whiteSpace:"nowrap"};function HelpIcon(){return(0,mr.jsx)(Wn,{sx:{fontSize:14,verticalAlign:"middle",ml:.25,opacity:.7}})}function DefRow({name:e,def:t,updateStatic:a,updatePriority:s}){const i=defNameColor(t);return(0,mr.jsxs)(n.TableRow,{sx:{"& td":es},children:[(0,mr.jsx)(n.TableCell,{padding:"checkbox",sx:{...es,width:36},children:(0,mr.jsx)(n.Checkbox,{size:"small",checked:Boolean(t?.static),onChange:t=>a(e,t.target.checked),sx:{p:.25}})}),(0,mr.jsx)(n.TableCell,{sx:{width:100},children:(0,mr.jsx)(n.Typography,{variant:"body2",sx:{color:i,fontSize:13},children:e})}),(0,mr.jsx)(n.TableCell,{sx:{width:50},children:(0,mr.jsx)(n.TextField,{value:t?.defaultPriority??0,onChange:t=>s(e,t.target.value),type:"number",size:"small",sx:{width:56},slotProps:{htmlInput:{min:0,max:26,style:{padding:"2px 6px",fontSize:13}}}})})]})}function DefHalfTable({defNames:e,defsState:t,updateStatic:a,updatePriority:s}){return(0,mr.jsx)(n.TableContainer,{sx:{flex:1},children:(0,mr.jsxs)(n.Table,{size:"small",stickyHeader:!0,sx:{tableLayout:"fixed"},children:[(0,mr.jsx)(n.TableHead,{children:(0,mr.jsxs)(n.TableRow,{children:[(0,mr.jsx)(n.TableCell,{padding:"checkbox",sx:{...ts,width:36},children:(0,mr.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:Zn,children:(0,mr.jsxs)("span",{children:["Defup",(0,mr.jsx)(HelpIcon,{})]})})}),(0,mr.jsx)(n.TableCell,{sx:{...ts,width:100},children:(0,mr.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:Jn,children:(0,mr.jsxs)("span",{children:["Name ",(0,mr.jsx)(HelpIcon,{})]})})}),(0,mr.jsx)(n.TableCell,{sx:{...ts,width:70},children:"Priority"})]})}),(0,mr.jsx)(n.TableBody,{children:e.map(e=>(0,mr.jsx)(DefRow,{name:e,def:t[e],updateStatic:a,updatePriority:s},e))})]})})}function DefPrioritiesTab({settingsForm:e}){const{defList:t,defsState:a,classFilter:s,setClassFilter:i,classOptions:o,updateStatic:l,updatePriority:c}=useDefPriorities(useNexSys(),e),[u,d]=(0,b.useMemo)(()=>{const e=Math.ceil(t.length/2);return[t.slice(0,e),t.slice(e)]},[t]);return(0,mr.jsxs)(n.Box,{sx:{pt:1},children:[(0,mr.jsxs)(n.FormControl,{size:"small",sx:{mb:1.5,minWidth:180},children:[(0,mr.jsx)(n.InputLabel,{children:"Class"}),(0,mr.jsx)(n.Select,{value:s,label:"Class",onChange:e=>i(e.target.value),children:o.map(e=>(0,mr.jsx)(n.MenuItem,{value:e,children:"all"===e?"All Classes":e},e))})]}),(0,mr.jsxs)(n.Box,{sx:{display:"flex",gap:1,alignItems:"flex-start"},children:[(0,mr.jsx)(DefHalfTable,{defNames:u,defsState:a,updateStatic:l,updatePriority:c}),d.length>0&&(0,mr.jsx)(DefHalfTable,{defNames:d,defsState:a,updateStatic:l,updatePriority:c})]})]})}var rs=Object.freeze({}),as=O.map(e=>R[e]).filter(Boolean).map(e=>({herb:e,mineral:j[e]??null}));function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function usePrecache(e,t={}){const a=useNexSysSnapshot(e),{desiredPrecache:n,setPrecache:s}=t,i=n??a?.cache?.desiredPrecache??rs;return{pairs:(0,b.useMemo)(()=>as.map(({herb:e,mineral:t})=>({herb:e,herbLabel:capitalize(e),herbQty:i[e]??0,mineral:t,mineralLabel:t?capitalize(t):null,mineralQty:t?i[t]??0:0})),[i]),update:(0,b.useCallback)((e,t)=>{s?.(e,Math.max(0,t))},[s])}}function QuantityControl({label:e,value:t,onIncrement:a,onDecrement:s,compact:i=!1}){return(0,mr.jsxs)(n.Box,{sx:{display:"flex",alignItems:"center",gap:1,mb:i?0:.5},children:[(0,mr.jsxs)(n.ButtonGroup,{size:"small",variant:"outlined",children:[(0,mr.jsx)(n.Button,{onClick:s,disabled:t<=0,sx:{minWidth:28,px:.5,fontSize:12},children:"−"}),(0,mr.jsx)(n.Button,{disableRipple:!0,disableFocusRipple:!0,sx:{minWidth:36,px:.5,cursor:"default",pointerEvents:"none",fontSize:12,color:"text.primary",borderColor:"divider"},children:t}),(0,mr.jsx)(n.Button,{onClick:a,sx:{minWidth:28,px:.5,fontSize:12},children:"+"})]}),(0,mr.jsx)(n.Typography,{variant:"body2",children:e})]})}function PairRow({pair:e,update:t}){return(0,mr.jsxs)(n.Box,{sx:{display:"flex",gap:.5},children:[(0,mr.jsx)(n.Box,{sx:{flex:1},children:(0,mr.jsx)(QuantityControl,{compact:!0,label:e.herbLabel,value:e.herbQty,onIncrement:()=>t(e.herb,e.herbQty+1),onDecrement:()=>t(e.herb,e.herbQty-1)})}),(0,mr.jsx)(n.Box,{sx:{flex:1},children:e.mineral?(0,mr.jsx)(QuantityControl,{compact:!0,label:e.mineralLabel,value:e.mineralQty,onIncrement:()=>t(e.mineral,e.mineralQty+1),onDecrement:()=>t(e.mineral,e.mineralQty-1)}):(0,mr.jsx)(n.Box,{sx:{height:28}})})]})}function PrecacheTab({settingsForm:e}){const{pairs:t,update:a}=usePrecache(useNexSys(),e);return(0,mr.jsxs)(n.Box,{sx:{pt:1},children:[(0,mr.jsxs)(n.Box,{sx:{display:"flex",gap:.5,mb:.25},children:[(0,mr.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Herb"}),(0,mr.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Mineral"})]}),t.map(e=>(0,mr.jsx)(PairRow,{pair:e,update:a},e.herb))]})}function ColorSettingsTab(){return(0,mr.jsx)(n.Box,{sx:{pt:2},children:(0,mr.jsx)(n.Typography,{variant:"body2",color:"text.secondary",children:"Color settings are not yet implemented."})})}var ns=["System","Aff Priorities","Defences","Precache","Colors"];function ConfigTabs({settingsForm:e}){const[t,a]=(0,b.useState)(0),{pending:s,set:i}=e;return(0,mr.jsxs)(n.Box,{sx:{width:"100%"},children:[(0,mr.jsx)(n.Tabs,{value:t,onChange:(e,t)=>a(t),variant:"scrollable",scrollButtons:"auto",sx:{borderBottom:"1px solid",borderColor:"divider",mb:1,"& .MuiTab-root":{fontSize:11,minHeight:36,py:.5}},children:ns.map(e=>(0,mr.jsx)(n.Tab,{label:e},e))}),(0,mr.jsxs)(n.Box,{sx:{overflowX:"auto",overflowY:"visible"},children:[0===t&&(0,mr.jsx)(SystemSettingsTab,{pending:s,set:i}),1===t&&(0,mr.jsx)(AffPrioritiesTab,{settingsForm:e}),2===t&&(0,mr.jsx)(DefPrioritiesTab,{settingsForm:e}),3===t&&(0,mr.jsx)(PrecacheTab,{settingsForm:e}),4===t&&(0,mr.jsx)(ColorSettingsTab,{})]})]})}function ConfigDialogContent({nexSys:e,onClose:t}){const a=useSettingsForm(e),handleSave=()=>{a.commit(),e?.api?.ui?.closeConfig("ui.save"),t()},handleCancel=()=>{e?.api?.ui?.closeConfig("ui.cancel"),t()};return(0,mr.jsxs)(n.Dialog,{open:!0,onClose:handleCancel,maxWidth:"md",slotProps:{paper:{sx:{width:{xs:"calc(100% - 24px)",md:900},maxWidth:"calc(100% - 24px)",bgcolor:"background.surface",color:"text.primary",backgroundImage:"none",border:"1px solid",borderColor:"divider"}}},children:[(0,mr.jsxs)(n.DialogTitle,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",bgcolor:"background.surface",color:"text.primary",pb:.5,borderBottom:"1px solid",borderColor:"divider"},children:[(0,mr.jsx)(n.Typography,{component:"span",variant:"h6",sx:{fontSize:14,color:"primary.main",fontWeight:700},children:"nexSys4 Configuration"}),(0,mr.jsx)(n.Typography,{component:"span",variant:"caption",sx:{color:"text.secondary"},children:"v1.0.4"})]}),(0,mr.jsx)(n.DialogContent,{sx:{"&.MuiDialogContent-root":{p:0,overflowY:"auto",overflowX:"hidden"}},children:(0,mr.jsx)(n.Box,{sx:{px:2,pt:2,pb:0},children:(0,mr.jsx)(ConfigTabs,{settingsForm:a})})}),(0,mr.jsxs)(n.DialogActions,{sx:{borderTop:"1px solid",borderColor:"divider",px:2,py:1},children:[(0,mr.jsx)(n.Button,{onClick:handleCancel,size:"small",sx:{fontSize:11},children:"Cancel"}),(0,mr.jsx)(n.Button,{onClick:handleSave,variant:"contained",size:"small",sx:{fontSize:11},children:"Save"})]})]})}function ConfigDialog(){const e=useNexSys(),[t,a]=useDialogOpen(e);return(0,mr.jsx)(s.ThemeProvider,{theme:yr,children:t?(0,mr.jsx)(ConfigDialogContent,{nexSys:e,onClose:()=>a(!1)}):null})}function NexSysGuiApp({nexSys:e}){return(0,mr.jsx)(NexSysProvider,{nexSys:e,children:(0,mr.jsx)(ConfigDialog,{})})}var bootstrapNexus=(e={})=>{const t=bootstrapNexus$1(e);return t.component=NexSysGuiApp,startupNexus(),t.api.control.updateNxs(),t};e.bootstrapNexus=bootstrapNexus}(globalThis.nexSys=globalThis.nexSys||{},nexRuntime.zod,React,nexRuntime.mui,nexRuntime.muiStyles,nexRuntime.immer,nexRuntime.dndCore,nexRuntime.dndSortable,nexRuntime.dndUtilities);
|